@hmcts/opal-frontend-common 0.0.90 → 0.0.92

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 (132) 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-report-instances-table-base.mjs +30 -0
  11. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-constants.mjs +26 -0
  12. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-interfaces.mjs +4 -0
  13. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-types.mjs +4 -0
  14. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base.mjs +282 -0
  15. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table-pagination.mjs +13 -4
  16. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table.mjs +3 -3
  17. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-table-filter.mjs +3 -3
  18. package/fesm2022/hmcts-opal-frontend-common-components-alphagov-alphagov-accessible-autocomplete.mjs +3 -3
  19. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information-custom-account-information-item-custom-account-information-item-label.mjs +3 -3
  20. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information-custom-account-information-item-custom-account-information-item-value.mjs +3 -3
  21. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information-custom-account-information-item.mjs +3 -3
  22. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information.mjs +3 -3
  23. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-action-links.mjs +3 -3
  24. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-horizontal-scroll-pane.mjs +3 -3
  25. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-page-header.mjs +3 -3
  26. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-scrollable-panes-custom-scrollable-panes-inner-pane.mjs +3 -3
  27. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-scrollable-panes.mjs +3 -3
  28. 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
  29. 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
  30. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-summary-metric-bar-custom-summary-metric-bar-item.mjs +3 -3
  31. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-summary-metric-bar.mjs +3 -3
  32. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-vertical-scroll-pane-custom-vertical-scroll-pane-inner-pane.mjs +3 -3
  33. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-vertical-scroll-pane-custom-vertical-scroll-pane-outer-pane.mjs +3 -3
  34. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-vertical-scroll-pane.mjs +3 -3
  35. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-accordion.mjs +3 -3
  36. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-back-link.mjs +3 -3
  37. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-button.mjs +3 -3
  38. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-cancel-link.mjs +3 -3
  39. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-checkboxes.mjs +12 -12
  40. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-date-input.mjs +3 -3
  41. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-details.mjs +3 -3
  42. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-error-summary.mjs +3 -3
  43. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-footer.mjs +3 -3
  44. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-header.mjs +6 -6
  45. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-heading-with-caption.mjs +3 -3
  46. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-inset-text.mjs +3 -3
  47. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-list-govuk-list-link.mjs +3 -3
  48. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-list.mjs +3 -3
  49. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-notification-banner.mjs +3 -3
  50. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-pagination.mjs +3 -3
  51. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-panel.mjs +3 -3
  52. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-radio.mjs +12 -12
  53. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-select.mjs +3 -3
  54. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-summary-card-list.mjs +6 -6
  55. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-summary-list.mjs +12 -12
  56. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-table.mjs +12 -12
  57. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tabs-govuk-tabs-list-item.mjs +3 -3
  58. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tabs-govuk-tabs-panel.mjs +3 -3
  59. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tabs.mjs +3 -3
  60. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tag.mjs +3 -3
  61. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-task-list.mjs +6 -6
  62. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-area.mjs +3 -3
  63. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-input-prefix-suffix.mjs +3 -3
  64. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-input.mjs +3 -3
  65. package/fesm2022/hmcts-opal-frontend-common-components-hod-hod-loading-spinner.mjs +3 -3
  66. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-alert.mjs +21 -21
  67. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-badge.mjs +3 -3
  68. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-button-menu-moj-button-menu-item.mjs +3 -3
  69. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-button-menu.mjs +3 -3
  70. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-date-picker.mjs +3 -3
  71. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-header.mjs +3 -3
  72. 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
  73. 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
  74. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-option.mjs +3 -3
  75. 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
  76. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-selected.mjs +3 -3
  77. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel.mjs +3 -3
  78. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter.mjs +3 -3
  79. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-header.mjs +6 -6
  80. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-inset-text.mjs +3 -3
  81. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-notification-badge.mjs +3 -3
  82. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-page-header.mjs +3 -3
  83. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-pagination.mjs +3 -3
  84. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-primary-navigation.mjs +6 -6
  85. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-sortable-table.mjs +18 -18
  86. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-sub-navigation.mjs +6 -6
  87. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-ticket-panel.mjs +3 -3
  88. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-timeline.mjs +6 -6
  89. package/fesm2022/{hmcts-opal-frontend-common-concurrency-failure.component-UnC_Qex5.mjs → hmcts-opal-frontend-common-concurrency-failure.component-CdkYMvv-.mjs} +4 -4
  90. package/fesm2022/hmcts-opal-frontend-common-directives-capitalisation.mjs +3 -3
  91. package/fesm2022/hmcts-opal-frontend-common-directives-govuk-button.mjs +3 -3
  92. package/fesm2022/hmcts-opal-frontend-common-directives-moj-multi-select.mjs +6 -6
  93. 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
  94. package/fesm2022/{hmcts-opal-frontend-common-pages-access-denied.component-DNNxndx-.mjs → hmcts-opal-frontend-common-pages-access-denied.component-BCLRLZqh.mjs} +4 -4
  95. package/fesm2022/{hmcts-opal-frontend-common-pages-account-created.component-3MER1dhS.mjs → hmcts-opal-frontend-common-pages-account-created.component-D0g9FjWl.mjs} +4 -4
  96. 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
  97. package/fesm2022/hmcts-opal-frontend-common-pages-dashboard-page.mjs +3 -3
  98. 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
  99. package/fesm2022/{hmcts-opal-frontend-common-pages-permission-denied.component-ClXrjyA5.mjs → hmcts-opal-frontend-common-pages-permission-denied.component-BPb5CZQD.mjs} +4 -4
  100. 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
  101. package/fesm2022/{hmcts-opal-frontend-common-pages-sign-in.component-dBd0gJTr.mjs → hmcts-opal-frontend-common-pages-sign-in.component-DWLTU9wd.mjs} +4 -4
  102. package/fesm2022/hmcts-opal-frontend-common-pages.mjs +6 -6
  103. package/fesm2022/{hmcts-opal-frontend-common-permission-denied.component-ClXrjyA5.mjs → hmcts-opal-frontend-common-permission-denied.component-BPb5CZQD.mjs} +4 -4
  104. package/fesm2022/hmcts-opal-frontend-common-pipes-date-format.mjs +3 -3
  105. package/fesm2022/hmcts-opal-frontend-common-pipes-days-ago.mjs +3 -3
  106. package/fesm2022/hmcts-opal-frontend-common-pipes-monetary.mjs +3 -3
  107. package/fesm2022/hmcts-opal-frontend-common-pipes-national-insurance.mjs +3 -3
  108. package/fesm2022/hmcts-opal-frontend-common-resolvers-title.mjs +3 -3
  109. package/fesm2022/hmcts-opal-frontend-common-services-app-initializer-service.mjs +3 -3
  110. package/fesm2022/hmcts-opal-frontend-common-services-app-insights-service.mjs +3 -3
  111. package/fesm2022/hmcts-opal-frontend-common-services-auth-service.mjs +3 -3
  112. package/fesm2022/hmcts-opal-frontend-common-services-date-service.mjs +3 -3
  113. package/fesm2022/hmcts-opal-frontend-common-services-history-transformation-service.mjs +3 -3
  114. package/fesm2022/hmcts-opal-frontend-common-services-launch-darkly-service.mjs +3 -3
  115. package/fesm2022/hmcts-opal-frontend-common-services-opal-user-service.mjs +119 -10
  116. package/fesm2022/hmcts-opal-frontend-common-services-permissions-service.mjs +3 -3
  117. package/fesm2022/hmcts-opal-frontend-common-services-session-service.mjs +3 -3
  118. package/fesm2022/hmcts-opal-frontend-common-services-sort-service.mjs +3 -3
  119. package/fesm2022/hmcts-opal-frontend-common-services-transfer-state-service.mjs +3 -3
  120. package/fesm2022/hmcts-opal-frontend-common-services-transformation-service.mjs +3 -3
  121. package/fesm2022/hmcts-opal-frontend-common-services-utils-service.mjs +3 -3
  122. 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
  123. package/fesm2022/{hmcts-opal-frontend-common-sign-in.component-jf34_3Vv.mjs → hmcts-opal-frontend-common-sign-in.component-DIZlLA6t.mjs} +4 -4
  124. package/fesm2022/hmcts-opal-frontend-common.mjs +6 -6
  125. package/package.json +27 -2
  126. package/types/hmcts-opal-frontend-common-components-abstract-abstract-report-instances-table-base.d.ts +13 -0
  127. package/types/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-constants.d.ts +21 -0
  128. package/types/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-interfaces.d.ts +34 -0
  129. package/types/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-types.d.ts +3 -0
  130. package/types/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base.d.ts +198 -0
  131. package/types/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table-pagination.d.ts +4 -0
  132. package/types/hmcts-opal-frontend-common-services-opal-user-service.d.ts +56 -4
@@ -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',
@@ -25,10 +25,10 @@ class SessionService {
25
25
  }), shareReplay(1));
26
26
  return this.tokenExpiryCache$;
27
27
  }
28
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SessionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
29
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SessionService, providedIn: 'root' });
28
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SessionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
29
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SessionService, providedIn: 'root' });
30
30
  }
31
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SessionService, decorators: [{
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SessionService, decorators: [{
32
32
  type: Injectable,
33
33
  args: [{ providedIn: 'root' }]
34
34
  }] });
@@ -79,10 +79,10 @@ class SortService {
79
79
  arraySortDesc(array) {
80
80
  return sort(array).desc();
81
81
  }
82
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SortService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
83
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SortService, providedIn: 'root' });
82
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SortService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
83
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SortService, providedIn: 'root' });
84
84
  }
85
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SortService, decorators: [{
85
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: SortService, decorators: [{
86
86
  type: Injectable,
87
87
  args: [{
88
88
  providedIn: 'root',
@@ -82,10 +82,10 @@ class TransferStateService {
82
82
  this.globalStore.setFeatureFlags(featureFlagConfig.releases);
83
83
  }
84
84
  }
85
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TransferStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
86
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TransferStateService, providedIn: 'root' });
85
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TransferStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
86
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TransferStateService, providedIn: 'root' });
87
87
  }
88
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TransferStateService, decorators: [{
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TransferStateService, decorators: [{
89
89
  type: Injectable,
90
90
  args: [{
91
91
  providedIn: 'root',
@@ -89,10 +89,10 @@ class TransformationService {
89
89
  }
90
90
  return result;
91
91
  }
92
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TransformationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
93
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TransformationService, providedIn: 'root' });
92
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TransformationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
93
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TransformationService, providedIn: 'root' });
94
94
  }
95
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TransformationService, decorators: [{
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TransformationService, decorators: [{
96
96
  type: Injectable,
97
97
  args: [{
98
98
  providedIn: 'root',
@@ -153,10 +153,10 @@ class UtilsService {
153
153
  hasSetProperty(value) {
154
154
  return Object.values(value ?? {}).some((v) => (typeof v === 'boolean' ? v === true : v !== null && v !== ''));
155
155
  }
156
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: UtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
157
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: UtilsService, providedIn: 'root' });
156
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: UtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
157
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: UtilsService, providedIn: 'root' });
158
158
  }
159
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: UtilsService, decorators: [{
159
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: UtilsService, decorators: [{
160
160
  type: Injectable,
161
161
  args: [{
162
162
  providedIn: 'root',
@@ -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-sign-in-stub.component-Cxvc5NV2.mjs.map
42
+ //# sourceMappingURL=hmcts-opal-frontend-common-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-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-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-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-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-sign-in.component-jf34_3Vv.mjs.map
28
+ //# sourceMappingURL=hmcts-opal-frontend-common-sign-in.component-DIZlLA6t.mjs.map
@@ -35,39 +35,39 @@ const routing = [
35
35
  { path: '', redirectTo: 'dashboard', pathMatch: 'full' },
36
36
  {
37
37
  path: PAGES_ROUTING_PATHS.children.accessDenied,
38
- loadComponent: () => import('./hmcts-opal-frontend-common-access-denied.component-DNNxndx-.mjs').then((c) => c.AccessDeniedComponent),
38
+ loadComponent: () => import('./hmcts-opal-frontend-common-access-denied.component-BCLRLZqh.mjs').then((c) => c.AccessDeniedComponent),
39
39
  canActivate: [authGuard, accountGuard],
40
40
  data: { title: PAGES_ROUTING_TITLES.children.accessDenied },
41
41
  resolve: { title: TitleResolver },
42
42
  },
43
43
  {
44
44
  path: PAGES_ROUTING_PATHS.children.concurrencyFailure,
45
- loadComponent: () => import('./hmcts-opal-frontend-common-concurrency-failure.component-UnC_Qex5.mjs').then((c) => c.ConcurrencyFailureComponent),
45
+ loadComponent: () => import('./hmcts-opal-frontend-common-concurrency-failure.component-CdkYMvv-.mjs').then((c) => c.ConcurrencyFailureComponent),
46
46
  data: { title: PAGES_ROUTING_TITLES.children.concurrencyFailure },
47
47
  resolve: { title: TitleResolver },
48
48
  },
49
49
  {
50
50
  path: PAGES_ROUTING_PATHS.children.permissionDenied,
51
- loadComponent: () => import('./hmcts-opal-frontend-common-permission-denied.component-ClXrjyA5.mjs').then((c) => c.PermissionDeniedComponent),
51
+ loadComponent: () => import('./hmcts-opal-frontend-common-permission-denied.component-BPb5CZQD.mjs').then((c) => c.PermissionDeniedComponent),
52
52
  data: { title: PAGES_ROUTING_TITLES.children.permissionDenied },
53
53
  resolve: { title: TitleResolver },
54
54
  },
55
55
  {
56
56
  path: PAGES_ROUTING_PATHS.children.internalServerError,
57
- loadComponent: () => import('./hmcts-opal-frontend-common-internal-server-error.component-Cj-ueGWj.mjs').then((c) => c.InternalServerErrorComponent),
57
+ loadComponent: () => import('./hmcts-opal-frontend-common-internal-server-error.component-CinCBLVo.mjs').then((c) => c.InternalServerErrorComponent),
58
58
  data: { title: PAGES_ROUTING_TITLES.children.internalServerError },
59
59
  resolve: { title: TitleResolver },
60
60
  },
61
61
  {
62
62
  path: PAGES_ROUTING_PATHS.children.signIn,
63
- loadComponent: () => import('./hmcts-opal-frontend-common-sign-in.component-jf34_3Vv.mjs').then((c) => c.SignInComponent),
63
+ loadComponent: () => import('./hmcts-opal-frontend-common-sign-in.component-DIZlLA6t.mjs').then((c) => c.SignInComponent),
64
64
  canActivate: [signedInGuard],
65
65
  data: { title: PAGES_ROUTING_TITLES.children.signIn },
66
66
  resolve: { title: TitleResolver },
67
67
  },
68
68
  {
69
69
  path: PAGES_ROUTING_PATHS.children.accountCreated,
70
- loadComponent: () => import('./hmcts-opal-frontend-common-account-created.component-3MER1dhS.mjs').then((c) => c.AccountCreated),
70
+ loadComponent: () => import('./hmcts-opal-frontend-common-account-created.component-D0g9FjWl.mjs').then((c) => c.AccountCreated),
71
71
  canActivate: [authGuard],
72
72
  data: { title: PAGES_ROUTING_TITLES.children.accountCreated },
73
73
  resolve: { title: TitleResolver },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hmcts/opal-frontend-common",
3
- "version": "0.0.90",
3
+ "version": "0.0.92",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@microsoft/applicationinsights-web": "^3.3.6",
29
- "@ministryofjustice/frontend": "^9.0.0",
29
+ "@ministryofjustice/frontend": "^10.0.0",
30
30
  "accessible-autocomplete": "^3.0.1",
31
31
  "fast-sort": "^3.4.1",
32
32
  "govuk-frontend": "^6.0.0",
@@ -126,6 +126,31 @@
126
126
  "types": "./types/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table-pagination.d.ts",
127
127
  "default": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table-pagination.mjs"
128
128
  },
129
+ "./components/abstract/abstract-report-instances-table-base": {
130
+ "import": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-instances-table-base.mjs",
131
+ "types": "./types/hmcts-opal-frontend-common-components-abstract-abstract-report-instances-table-base.d.ts",
132
+ "default": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-instances-table-base.mjs"
133
+ },
134
+ "./components/abstract/abstract-report-summary-list-base": {
135
+ "import": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base.mjs",
136
+ "types": "./types/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base.d.ts",
137
+ "default": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base.mjs"
138
+ },
139
+ "./components/abstract/abstract-report-summary-list-base/constants": {
140
+ "import": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-constants.mjs",
141
+ "types": "./types/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-constants.d.ts",
142
+ "default": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-constants.mjs"
143
+ },
144
+ "./components/abstract/abstract-report-summary-list-base/interfaces": {
145
+ "import": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-interfaces.mjs",
146
+ "types": "./types/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-interfaces.d.ts",
147
+ "default": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-interfaces.mjs"
148
+ },
149
+ "./components/abstract/abstract-report-summary-list-base/types": {
150
+ "import": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-types.mjs",
151
+ "types": "./types/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-types.d.ts",
152
+ "default": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-report-summary-list-base-types.mjs"
153
+ },
129
154
  "./components/abstract/abstract-tab-data": {
130
155
  "import": "./fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-tab-data.mjs",
131
156
  "types": "./types/hmcts-opal-frontend-common-components-abstract-abstract-tab-data.d.ts",
@@ -0,0 +1,13 @@
1
+ import * as i0 from '@angular/core';
2
+ import { IAbstractTableData } from '@hmcts/opal-frontend-common/components/abstract/abstract-sortable-table/interfaces';
3
+ import { SortableValuesType } from '@hmcts/opal-frontend-common/components/abstract/abstract-sortable-table/types';
4
+ import { AbstractSortableTablePaginationComponent } from '@hmcts/opal-frontend-common/components/abstract/abstract-sortable-table-pagination';
5
+
6
+ declare abstract class AbstractReportInstancesTableBaseComponent<TTableData extends IAbstractTableData<SortableValuesType>> extends AbstractSortableTablePaginationComponent {
7
+ set tableData(tableData: TTableData[]);
8
+ paginatedTableDataComputed: i0.Signal<TTableData[]>;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<AbstractReportInstancesTableBaseComponent<any>, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<AbstractReportInstancesTableBaseComponent<any>, "ng-component", never, { "tableData": { "alias": "tableData"; "required": true; }; }, {}, never, never, true, never>;
11
+ }
12
+
13
+ export { AbstractReportInstancesTableBaseComponent };
@@ -0,0 +1,21 @@
1
+ declare const ABSTRACT_REPORT_SUMMARY_LIST_LAST_7_DAYS = "last7Days";
2
+ declare const ABSTRACT_REPORT_SUMMARY_LIST_CUSTOM_DAYS = "customDays";
3
+ declare const ABSTRACT_REPORT_SUMMARY_LIST_DATE_RANGE = "dateRange";
4
+ declare const ABSTRACT_REPORT_SUMMARY_LIST_FILTER_STATE: {
5
+ readonly dateFilter: "last7Days";
6
+ readonly days: "";
7
+ readonly dateFrom: "";
8
+ readonly dateTo: "";
9
+ };
10
+
11
+ declare const ABSTRACT_REPORT_SUMMARY_LIST_STATUS: {
12
+ readonly requested: "REQUESTED";
13
+ readonly ready: "READY";
14
+ readonly inProgress: "IN_PROGRESS";
15
+ };
16
+ declare const ABSTRACT_REPORT_SUMMARY_LIST_STATUS_DISPLAY: {
17
+ readonly inProgress: "In progress";
18
+ readonly noContent: "No content";
19
+ };
20
+
21
+ export { ABSTRACT_REPORT_SUMMARY_LIST_CUSTOM_DAYS, ABSTRACT_REPORT_SUMMARY_LIST_DATE_RANGE, ABSTRACT_REPORT_SUMMARY_LIST_FILTER_STATE, ABSTRACT_REPORT_SUMMARY_LIST_LAST_7_DAYS, ABSTRACT_REPORT_SUMMARY_LIST_STATUS, ABSTRACT_REPORT_SUMMARY_LIST_STATUS_DISPLAY };
@@ -0,0 +1,34 @@
1
+ import { AbstractReportSummaryListDateFilter } from '@hmcts/opal-frontend-common/components/abstract/abstract-report-summary-list-base/types';
2
+
3
+ interface IAbstractReportSummaryListDateFieldIds {
4
+ days: string;
5
+ dateFrom: string;
6
+ dateTo: string;
7
+ }
8
+
9
+ interface IAbstractReportSummaryListDateFormats {
10
+ input: string;
11
+ output: string;
12
+ }
13
+
14
+ interface IAbstractReportSummaryListDateValidationMessages {
15
+ customDaysRequired: string;
16
+ dateRangeRequired: string;
17
+ invalidDate: string;
18
+ futureDate: string;
19
+ dateFromAfterDateTo: string;
20
+ }
21
+
22
+ interface IAbstractReportSummaryListFilterState {
23
+ dateFilter: AbstractReportSummaryListDateFilter;
24
+ days: string;
25
+ dateFrom: string;
26
+ dateTo: string;
27
+ }
28
+
29
+ interface IAbstractReportSummaryListQueryState {
30
+ fromDate: string | null;
31
+ toDate: string | null;
32
+ }
33
+
34
+ export type { IAbstractReportSummaryListDateFieldIds, IAbstractReportSummaryListDateFormats, IAbstractReportSummaryListDateValidationMessages, IAbstractReportSummaryListFilterState, IAbstractReportSummaryListQueryState };
@@ -0,0 +1,3 @@
1
+ type AbstractReportSummaryListDateFilter = 'last7Days' | 'customDays' | 'dateRange';
2
+
3
+ export type { AbstractReportSummaryListDateFilter };