@hmcts/opal-frontend-common 0.0.44 → 0.0.45

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 (179) hide show
  1. package/components/abstract/abstract-form-parent-base/index.d.ts +1 -1
  2. package/fesm2022/{hmcts-opal-frontend-common-access-denied.component-BxdRViEF.mjs → hmcts-opal-frontend-common-access-denied.component-C4LElGHn.mjs} +4 -4
  3. package/fesm2022/{hmcts-opal-frontend-common-access-denied.component-BxdRViEF.mjs.map → hmcts-opal-frontend-common-access-denied.component-C4LElGHn.mjs.map} +1 -1
  4. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-form-alias-base.mjs +3 -3
  5. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-form-alias-base.mjs.map +1 -1
  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-form-base.mjs.map +1 -1
  10. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-form-parent-base.mjs +3 -1
  11. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-form-parent-base.mjs.map +1 -1
  12. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-nested-form-base.mjs +3 -3
  13. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table-pagination.mjs +3 -3
  14. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table.mjs +3 -3
  15. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table.mjs.map +1 -1
  16. package/fesm2022/hmcts-opal-frontend-common-components-abstract-abstract-table-filter.mjs +3 -3
  17. package/fesm2022/hmcts-opal-frontend-common-components-alphagov-alphagov-accessible-autocomplete.mjs +3 -3
  18. package/fesm2022/hmcts-opal-frontend-common-components-alphagov-alphagov-accessible-autocomplete.mjs.map +1 -1
  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-label.mjs.map +1 -1
  21. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information-custom-account-information-item-custom-account-information-item-value.mjs +3 -3
  22. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information-custom-account-information-item-custom-account-information-item-value.mjs.map +1 -1
  23. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information-custom-account-information-item.mjs +3 -3
  24. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information-custom-account-information-item.mjs.map +1 -1
  25. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-account-information.mjs +3 -3
  26. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-action-links.mjs +3 -3
  27. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-action-links.mjs.map +1 -1
  28. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-horizontal-scroll-pane.mjs +3 -3
  29. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-page-header.mjs +3 -3
  30. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-scrollable-panes-custom-scrollable-panes-inner-pane.mjs +3 -3
  31. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-scrollable-panes-custom-scrollable-panes-inner-pane.mjs.map +1 -1
  32. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-scrollable-panes.mjs +3 -3
  33. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-scrollable-panes.mjs.map +1 -1
  34. 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
  35. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-summary-metric-bar-custom-summary-metric-bar-item-custom-summary-metric-bar-item-label.mjs.map +1 -1
  36. 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
  37. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-summary-metric-bar-custom-summary-metric-bar-item-custom-summary-metric-bar-item-value.mjs.map +1 -1
  38. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-summary-metric-bar-custom-summary-metric-bar-item.mjs +3 -3
  39. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-summary-metric-bar-custom-summary-metric-bar-item.mjs.map +1 -1
  40. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-summary-metric-bar.mjs +3 -3
  41. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-vertical-scroll-pane-custom-vertical-scroll-pane-inner-pane.mjs +3 -3
  42. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-vertical-scroll-pane-custom-vertical-scroll-pane-inner-pane.mjs.map +1 -1
  43. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-vertical-scroll-pane-custom-vertical-scroll-pane-outer-pane.mjs +3 -3
  44. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-vertical-scroll-pane-custom-vertical-scroll-pane-outer-pane.mjs.map +1 -1
  45. package/fesm2022/hmcts-opal-frontend-common-components-custom-custom-vertical-scroll-pane.mjs +3 -3
  46. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-accordion.mjs +3 -3
  47. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-back-link.mjs +3 -3
  48. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-back-link.mjs.map +1 -1
  49. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-button.mjs +3 -3
  50. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-button.mjs.map +1 -1
  51. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-cancel-link.mjs +3 -3
  52. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-cancel-link.mjs.map +1 -1
  53. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-checkboxes.mjs +12 -12
  54. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-checkboxes.mjs.map +1 -1
  55. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-date-input.mjs +3 -3
  56. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-date-input.mjs.map +1 -1
  57. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-details.mjs +3 -3
  58. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-details.mjs.map +1 -1
  59. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-error-summary.mjs +3 -3
  60. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-error-summary.mjs.map +1 -1
  61. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-footer.mjs +3 -3
  62. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-footer.mjs.map +1 -1
  63. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-header.mjs +6 -6
  64. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-header.mjs.map +1 -1
  65. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-heading-with-caption.mjs +3 -3
  66. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-heading-with-caption.mjs.map +1 -1
  67. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-inset-text.mjs +3 -3
  68. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-inset-text.mjs.map +1 -1
  69. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-list-govuk-list-link.mjs +3 -3
  70. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-list-govuk-list-link.mjs.map +1 -1
  71. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-list.mjs +3 -3
  72. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-notification-banner.mjs +3 -3
  73. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-notification-banner.mjs.map +1 -1
  74. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-pagination.mjs +3 -3
  75. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-pagination.mjs.map +1 -1
  76. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-panel.mjs +3 -3
  77. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-panel.mjs.map +1 -1
  78. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-radio.mjs +12 -12
  79. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-radio.mjs.map +1 -1
  80. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-select.mjs +3 -3
  81. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-select.mjs.map +1 -1
  82. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-summary-card-list.mjs +6 -6
  83. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-summary-card-list.mjs.map +1 -1
  84. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-summary-list.mjs +12 -12
  85. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-summary-list.mjs.map +1 -1
  86. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-table.mjs +12 -12
  87. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-table.mjs.map +1 -1
  88. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tabs-govuk-tabs-list-item.mjs +3 -3
  89. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tabs-govuk-tabs-list-item.mjs.map +1 -1
  90. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tabs-govuk-tabs-panel.mjs +3 -3
  91. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tabs.mjs +3 -3
  92. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tabs.mjs.map +1 -1
  93. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tag.mjs +3 -3
  94. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-tag.mjs.map +1 -1
  95. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-task-list.mjs +6 -6
  96. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-task-list.mjs.map +1 -1
  97. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-area.mjs +3 -3
  98. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-area.mjs.map +1 -1
  99. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-input-prefix-suffix.mjs +3 -3
  100. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-input-prefix-suffix.mjs.map +1 -1
  101. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-input.mjs +3 -3
  102. package/fesm2022/hmcts-opal-frontend-common-components-govuk-govuk-text-input.mjs.map +1 -1
  103. package/fesm2022/hmcts-opal-frontend-common-components-hod-hod-loading-spinner.mjs +3 -3
  104. package/fesm2022/hmcts-opal-frontend-common-components-hod-hod-loading-spinner.mjs.map +1 -1
  105. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-alert.mjs +21 -21
  106. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-alert.mjs.map +1 -1
  107. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-badge.mjs +3 -3
  108. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-badge.mjs.map +1 -1
  109. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-button-menu-moj-button-menu-item.mjs +3 -3
  110. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-button-menu-moj-button-menu-item.mjs.map +1 -1
  111. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-button-menu.mjs +3 -3
  112. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-button-menu.mjs.map +1 -1
  113. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-date-picker.mjs +3 -3
  114. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-date-picker.mjs.map +1 -1
  115. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-header.mjs +3 -3
  116. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-header.mjs.map +1 -1
  117. 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
  118. 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.map +1 -1
  119. 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
  120. 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.map +1 -1
  121. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-option.mjs +3 -3
  122. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-option.mjs.map +1 -1
  123. 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
  124. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-selected-moj-filter-panel-selected-tag.mjs.map +1 -1
  125. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-selected.mjs +3 -3
  126. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel-moj-filter-panel-selected.mjs.map +1 -1
  127. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter-moj-filter-panel.mjs +3 -3
  128. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter.mjs +3 -3
  129. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-filter.mjs.map +1 -1
  130. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-header.mjs +6 -6
  131. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-header.mjs.map +1 -1
  132. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-notification-badge.mjs +3 -3
  133. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-notification-badge.mjs.map +1 -1
  134. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-page-header.mjs +3 -3
  135. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-page-header.mjs.map +1 -1
  136. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-pagination.mjs +3 -3
  137. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-pagination.mjs.map +1 -1
  138. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-primary-navigation.mjs +6 -6
  139. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-primary-navigation.mjs.map +1 -1
  140. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-sortable-table.mjs +18 -18
  141. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-sortable-table.mjs.map +1 -1
  142. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-sub-navigation.mjs +6 -6
  143. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-sub-navigation.mjs.map +1 -1
  144. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-ticket-panel.mjs +3 -3
  145. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-ticket-panel.mjs.map +1 -1
  146. package/fesm2022/hmcts-opal-frontend-common-components-moj-moj-timeline.mjs +6 -6
  147. package/fesm2022/hmcts-opal-frontend-common-directives-capitalisation.mjs +3 -3
  148. package/fesm2022/hmcts-opal-frontend-common-directives-capitalisation.mjs.map +1 -1
  149. package/fesm2022/hmcts-opal-frontend-common-directives-govuk-button.mjs +3 -3
  150. package/fesm2022/hmcts-opal-frontend-common-directives-govuk-button.mjs.map +1 -1
  151. package/fesm2022/{hmcts-opal-frontend-common-pages-access-denied.component-BxdRViEF.mjs → hmcts-opal-frontend-common-pages-access-denied.component-C4LElGHn.mjs} +4 -4
  152. package/fesm2022/{hmcts-opal-frontend-common-pages-access-denied.component-BxdRViEF.mjs.map → hmcts-opal-frontend-common-pages-access-denied.component-C4LElGHn.mjs.map} +1 -1
  153. package/fesm2022/{hmcts-opal-frontend-common-pages-sign-in-stub.component-Bg7bNbIE.mjs → hmcts-opal-frontend-common-pages-sign-in-stub.component-X0DpymsU.mjs} +4 -4
  154. package/fesm2022/{hmcts-opal-frontend-common-pages-sign-in-stub.component-Bg7bNbIE.mjs.map → hmcts-opal-frontend-common-pages-sign-in-stub.component-X0DpymsU.mjs.map} +1 -1
  155. package/fesm2022/{hmcts-opal-frontend-common-pages-sign-in.component-DU2HqW5c.mjs → hmcts-opal-frontend-common-pages-sign-in.component-B8WpVEYN.mjs} +4 -4
  156. package/fesm2022/{hmcts-opal-frontend-common-pages-sign-in.component-DU2HqW5c.mjs.map → hmcts-opal-frontend-common-pages-sign-in.component-B8WpVEYN.mjs.map} +1 -1
  157. package/fesm2022/hmcts-opal-frontend-common-pages.mjs +2 -2
  158. package/fesm2022/hmcts-opal-frontend-common-pipes-date-format.mjs +3 -3
  159. package/fesm2022/hmcts-opal-frontend-common-pipes-days-ago.mjs +3 -3
  160. package/fesm2022/hmcts-opal-frontend-common-pipes-national-insurance.mjs +3 -3
  161. package/fesm2022/hmcts-opal-frontend-common-resolvers-title.mjs +3 -3
  162. package/fesm2022/hmcts-opal-frontend-common-services-app-initializer-service.mjs +3 -3
  163. package/fesm2022/hmcts-opal-frontend-common-services-app-insights-service.mjs +3 -3
  164. package/fesm2022/hmcts-opal-frontend-common-services-auth-service.mjs +3 -3
  165. package/fesm2022/hmcts-opal-frontend-common-services-date-service.mjs +3 -3
  166. package/fesm2022/hmcts-opal-frontend-common-services-launch-darkly-service.mjs +3 -3
  167. package/fesm2022/hmcts-opal-frontend-common-services-opal-user-service.mjs +3 -3
  168. package/fesm2022/hmcts-opal-frontend-common-services-permissions-service.mjs +3 -3
  169. package/fesm2022/hmcts-opal-frontend-common-services-session-service.mjs +3 -3
  170. package/fesm2022/hmcts-opal-frontend-common-services-sort-service.mjs +3 -3
  171. package/fesm2022/hmcts-opal-frontend-common-services-transfer-state-service.mjs +3 -3
  172. package/fesm2022/hmcts-opal-frontend-common-services-transformation-service.mjs +3 -3
  173. package/fesm2022/hmcts-opal-frontend-common-services-utils-service.mjs +3 -3
  174. package/fesm2022/{hmcts-opal-frontend-common-sign-in-stub.component-Bg7bNbIE.mjs → hmcts-opal-frontend-common-sign-in-stub.component-X0DpymsU.mjs} +4 -4
  175. package/fesm2022/{hmcts-opal-frontend-common-sign-in-stub.component-Bg7bNbIE.mjs.map → hmcts-opal-frontend-common-sign-in-stub.component-X0DpymsU.mjs.map} +1 -1
  176. package/fesm2022/{hmcts-opal-frontend-common-sign-in.component-CR6qmUmi.mjs → hmcts-opal-frontend-common-sign-in.component-keH2kx9e.mjs} +4 -4
  177. package/fesm2022/{hmcts-opal-frontend-common-sign-in.component-CR6qmUmi.mjs.map → hmcts-opal-frontend-common-sign-in.component-keH2kx9e.mjs.map} +1 -1
  178. package/fesm2022/hmcts-opal-frontend-common.mjs +2 -2
  179. package/package.json +1 -1
@@ -13,7 +13,7 @@ declare abstract class AbstractFormParentBaseComponent {
13
13
  * @param event - (Optional) The event object, typically from a click event, to prevent its default behavior.
14
14
  * @param routeData - (Optional) Additional data to pass to the target route's state.
15
15
  */
16
- protected routerNavigate(route: string, nonRelative?: boolean, event?: Event, routeData?: any): void;
16
+ protected routerNavigate(route: string, nonRelative?: boolean, event?: Event, routeData?: any, fragment?: string): void;
17
17
  /**
18
18
  * Checks if an object has any non-empty values.
19
19
  *
@@ -9,13 +9,13 @@ class AccessDeniedComponent {
9
9
  // For now, test page will act as our 'Dashboard' page
10
10
  this.router.navigate(['/']);
11
11
  }
12
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AccessDeniedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: AccessDeniedComponent, isStandalone: true, selector: "opal-lib-access-denied", ngImport: i0, template: "<div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">Access Denied</h1>\n <p class=\"govuk-body\">You do not have the appropriate permissions to access this page.</p>\n <p class=\"govuk-body\">\n <opal-lib-govuk-button\n buttonClasses=\"govuk-button--secondary\"\n buttonId=\"go-back\"\n (buttonClickEvent)=\"handleGoBackButtonClick()\"\n >\n Back to dashboard</opal-lib-govuk-button\n >\n </p>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: GovukButtonComponent, selector: "opal-lib-govuk-button", inputs: ["buttonId", "type", "buttonClasses"], outputs: ["buttonClickEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AccessDeniedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: AccessDeniedComponent, isStandalone: true, selector: "opal-lib-access-denied", ngImport: i0, template: "<div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">Access Denied</h1>\n <p class=\"govuk-body\">You do not have the appropriate permissions to access this page.</p>\n <p class=\"govuk-body\">\n <opal-lib-govuk-button\n buttonClasses=\"govuk-button--secondary\"\n buttonId=\"go-back\"\n (buttonClickEvent)=\"handleGoBackButtonClick()\"\n >\n Back to dashboard</opal-lib-govuk-button\n >\n </p>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: GovukButtonComponent, selector: "opal-lib-govuk-button", inputs: ["buttonId", "type", "buttonClasses"], outputs: ["buttonClickEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14
14
  }
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AccessDeniedComponent, decorators: [{
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AccessDeniedComponent, decorators: [{
16
16
  type: Component,
17
17
  args: [{ selector: 'opal-lib-access-denied', imports: [GovukButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">Access Denied</h1>\n <p class=\"govuk-body\">You do not have the appropriate permissions to access this page.</p>\n <p class=\"govuk-body\">\n <opal-lib-govuk-button\n buttonClasses=\"govuk-button--secondary\"\n buttonId=\"go-back\"\n (buttonClickEvent)=\"handleGoBackButtonClick()\"\n >\n Back to dashboard</opal-lib-govuk-button\n >\n </p>\n </div>\n</div>\n" }]
18
18
  }] });
19
19
 
20
20
  export { AccessDeniedComponent };
21
- //# sourceMappingURL=hmcts-opal-frontend-common-access-denied.component-BxdRViEF.mjs.map
21
+ //# sourceMappingURL=hmcts-opal-frontend-common-access-denied.component-C4LElGHn.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"hmcts-opal-frontend-common-access-denied.component-BxdRViEF.mjs","sources":["../../../projects/opal-frontend-common/pages/access-denied/access-denied.component.ts","../../../projects/opal-frontend-common/pages/access-denied/access-denied.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { GovukButtonComponent } from '@hmcts/opal-frontend-common/components/govuk/govuk-button';\n\n@Component({\n selector: 'opal-lib-access-denied',\n imports: [GovukButtonComponent],\n templateUrl: './access-denied.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccessDeniedComponent {\n private readonly router = inject(Router);\n\n public handleGoBackButtonClick(): void {\n // For now, test page will act as our 'Dashboard' page\n this.router.navigate(['/']);\n }\n}\n","<div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">Access Denied</h1>\n <p class=\"govuk-body\">You do not have the appropriate permissions to access this page.</p>\n <p class=\"govuk-body\">\n <opal-lib-govuk-button\n buttonClasses=\"govuk-button--secondary\"\n buttonId=\"go-back\"\n (buttonClickEvent)=\"handleGoBackButtonClick()\"\n >\n Back to dashboard</opal-lib-govuk-button\n >\n </p>\n </div>\n</div>\n"],"names":[],"mappings":";;;;;MAUa,qBAAqB,CAAA;AACf,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAEjC,uBAAuB,GAAA;;QAE5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7B;uGANW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECVlC,ihBAeA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDTY,oBAAoB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAInB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,WACzB,CAAC,oBAAoB,CAAC,EAAA,eAAA,EAEd,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ihBAAA,EAAA;;;;;"}
1
+ {"version":3,"file":"hmcts-opal-frontend-common-access-denied.component-C4LElGHn.mjs","sources":["../../../projects/opal-frontend-common/pages/access-denied/access-denied.component.ts","../../../projects/opal-frontend-common/pages/access-denied/access-denied.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { GovukButtonComponent } from '@hmcts/opal-frontend-common/components/govuk/govuk-button';\n\n@Component({\n selector: 'opal-lib-access-denied',\n imports: [GovukButtonComponent],\n templateUrl: './access-denied.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccessDeniedComponent {\n private readonly router = inject(Router);\n\n public handleGoBackButtonClick(): void {\n // For now, test page will act as our 'Dashboard' page\n this.router.navigate(['/']);\n }\n}\n","<div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-l\">Access Denied</h1>\n <p class=\"govuk-body\">You do not have the appropriate permissions to access this page.</p>\n <p class=\"govuk-body\">\n <opal-lib-govuk-button\n buttonClasses=\"govuk-button--secondary\"\n buttonId=\"go-back\"\n (buttonClickEvent)=\"handleGoBackButtonClick()\"\n >\n Back to dashboard</opal-lib-govuk-button\n >\n </p>\n </div>\n</div>\n"],"names":[],"mappings":";;;;;MAUa,qBAAqB,CAAA;AACf,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAEjC,uBAAuB,GAAA;;QAE5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7B;uGANW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECVlC,ihBAeA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDTY,oBAAoB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAInB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,WACzB,CAAC,oBAAoB,CAAC,EAAA,eAAA,EAEd,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ihBAAA,EAAA;;;;;"}
@@ -211,10 +211,10 @@ class AbstractFormAliasBaseComponent extends AbstractFormBaseComponent {
211
211
  this['ngUnsubscribe'].complete();
212
212
  super.ngOnDestroy();
213
213
  }
214
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractFormAliasBaseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
215
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: AbstractFormAliasBaseComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "aliasFirstField", predicate: ["aliasFirstField"], descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
214
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractFormAliasBaseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
215
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: AbstractFormAliasBaseComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "aliasFirstField", predicate: ["aliasFirstField"], descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
216
216
  }
217
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractFormAliasBaseComponent, decorators: [{
217
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractFormAliasBaseComponent, decorators: [{
218
218
  type: Component,
219
219
  args: [{
220
220
  template: '',
@@ -1 +1 @@
1
- {"version":3,"file":"hmcts-opal-frontend-common-components-abstract-abstract-form-alias-base.mjs","sources":["../../../projects/opal-frontend-common/components/abstract/abstract-form-alias-base/abstract-form-alias-base.component.ts","../../../projects/opal-frontend-common/components/abstract/abstract-form-alias-base/hmcts-opal-frontend-common-components-abstract-abstract-form-alias-base.ts"],"sourcesContent":["import { FormArray, FormControl, FormGroup, ValidatorFn } from '@angular/forms';\nimport { takeUntil } from 'rxjs';\nimport { Component, OnDestroy, OnInit, QueryList, ViewChildren } from '@angular/core';\nimport { IAbstractFormAliasBaseAliasControls } from '@hmcts/opal-frontend-common/components/abstract/abstract-form-alias-base/interfaces';\nimport { AbstractFormBaseComponent } from '@hmcts/opal-frontend-common/components/abstract/abstract-form-base';\nimport {\n IAbstractFormArrayControlValidation,\n IAbstractFormArrayControls,\n IAbstractFormArrayControl,\n} from '@hmcts/opal-frontend-common/components/abstract/interfaces';\nimport { GovukTextInputComponent } from '@hmcts/opal-frontend-common/components/govuk/govuk-text-input';\n\n@Component({\n template: '',\n})\nexport abstract class AbstractFormAliasBaseComponent extends AbstractFormBaseComponent implements OnInit, OnDestroy {\n @ViewChildren('aliasFirstField') aliasFirstField!: QueryList<GovukTextInputComponent>;\n public aliasControls: IAbstractFormAliasBaseAliasControls[] = [];\n public aliasControlsValidation: IAbstractFormArrayControlValidation[] = [];\n public aliasFields: string[] = [];\n\n /**\n * Builds an array of form controls for the given form array.\n *\n * @param formControlCount - An array of numbers representing the number of form controls to create.\n * @param formArrayName - The name of the form array.\n * @param fieldNames - An array of field names.\n * @param controlValidation - An array of control validation objects.\n * @returns An array of form controls for the given form array.\n */\n private buildFormAliasControls(\n formControlCount: number[],\n formArrayName: string,\n fieldNames: string[],\n controlValidation: IAbstractFormArrayControlValidation[],\n ): IAbstractFormArrayControls[] {\n // Directly map each index to a control\n return formControlCount.map((_element, index) =>\n this.addAliasControls(index, formArrayName, fieldNames, controlValidation),\n );\n }\n\n /**\n * Adds alias controls to the form array.\n *\n * @param index - The index of the form array.\n * @param formArrayName - The name of the form array.\n * @param fieldNames - The names of the fields for the alias controls.\n * @param controlValidation - The validation rules for the alias controls.\n * @returns An object containing the form controls.\n */\n private addAliasControls(\n index: number,\n formArrayName: string,\n fieldNames: string[],\n controlValidation: IAbstractFormArrayControlValidation[],\n ): { [key: string]: IAbstractFormArrayControl } {\n const formAliases = this.form.get(formArrayName) as FormArray;\n const formAliasesFormGroup = new FormGroup({});\n\n // Create the form controls...\n const controls = this.createAliasControls(fieldNames, index);\n\n // Add the controls to the form group...\n this.addControlsToFormGroup(formAliasesFormGroup, controlValidation, index);\n\n // Add the form group to the form array...\n formAliases.push(formAliasesFormGroup);\n\n // Return the form controls...\n return controls;\n }\n\n /**\n * Removes all form alias controls from a FormArray and clears any associated error messages.\n *\n * @param formArrayControls - An array of form array controls.\n * @param formArrayName - The name of the FormArray.\n * @param fieldNames - An array of field names associated with the form array controls.\n * @returns An empty array of form array controls.\n */\n private removeAllFormAliasControls(\n formArrayControls: IAbstractFormArrayControls[],\n formArrayName: string,\n fieldNames: string[],\n ): [] {\n const control = this.form.get(formArrayName) as FormArray;\n\n // Clear the error messages...\n for (const [index] of formArrayControls.entries()) {\n this.removeFormAliasControlsErrors(index, formArrayControls, fieldNames);\n }\n\n // Reset the form array controls...\n control.clear();\n\n // Return en empty array of form array controls...\n return [];\n }\n\n /**\n * Creates a FormArray with the specified validators and controls.\n *\n * @param validators - An array of validators to apply to the FormArray.\n * @param controls - An optional array of initial FormControl instances to add to the FormArray.\n * @returns A new FormArray instance.\n */\n protected createFormAlias(validators: ValidatorFn[], controls: FormControl[] = []): FormArray {\n return new FormArray(controls, { validators: [...validators] });\n }\n\n /**\n * Removes a form alias control at the specified index from the given form array controls.\n *\n * @param index - The index of the form alias control to remove.\n * @param formArrayControls - The array of form array controls.\n * @returns The updated array of form array controls after removing the specified control.\n */\n protected removeFormAliasControl(\n index: number,\n formArrayControls: IAbstractFormArrayControls[],\n ): IAbstractFormArrayControls[] {\n formArrayControls.splice(index, 1);\n return formArrayControls;\n }\n\n /**\n * Sets up the alias form controls based on the provided alias count array and form array name.\n * If there are any aliases, the alias controls will be re-populated.\n *\n * @param aliasCountArray - An array containing the count of aliases.\n * @param formArrayName - The name of the form array.\n */\n protected setupAliasFormControls(aliasCountArray: number[], formArrayName: string): void {\n // Re-populate the alias controls if there are any aliases\n if (aliasCountArray.length) {\n this.aliasControls = this.buildFormAliasControls(\n aliasCountArray,\n formArrayName,\n this.aliasFields,\n this.aliasControlsValidation,\n );\n }\n }\n\n /**\n * Removes the form alias controls errors for a specific index in a form array.\n *\n * @param index - The index of the form array control.\n * @param formArrayControls - An array of form array controls.\n * @param fieldNames - An array of field names to remove errors from.\n */\n protected removeFormAliasControlsErrors(\n index: number,\n formArrayControls: IAbstractFormArrayControls[],\n fieldNames: string[],\n ): void {\n const formArrayControl = formArrayControls[index];\n\n if (formArrayControl) {\n for (const field of fieldNames) {\n delete this.formControlErrorMessages?.[formArrayControl[field].controlName];\n }\n }\n }\n\n /**\n * Creates alias controls for the given fields and index.\n * @param fields - The list of fields for which alias controls need to be created.\n * @param index - The index value used to generate unique identifiers for the controls.\n * @returns An object containing the alias controls.\n */\n protected createAliasControls(fields: string[], index: number): { [key: string]: IAbstractFormArrayControl } {\n return fields.reduce(\n (controls, field) => ({\n ...controls,\n [field]: {\n inputId: `${field}_${index}`,\n inputName: `${field}_${index}`,\n controlName: `${field}_${index}`,\n },\n }),\n {},\n );\n }\n\n /**\n * Sets up the alias checkbox listener.\n *\n * @param formCheckboxName - The name of the checkbox control in the form.\n * @param formArrayName - The name of the form array control in the form.\n */\n protected setUpAliasCheckboxListener(formCheckboxName: string, formArrayName: string): void {\n // Ensure any existing subscription is cleared to avoid memory leaks\n this['ngUnsubscribe'].next();\n this['ngUnsubscribe'].complete();\n\n const addAliasControl = this.form.get(formCheckboxName);\n if (!addAliasControl) {\n return;\n }\n\n addAliasControl.valueChanges.pipe(takeUntil(this['ngUnsubscribe'])).subscribe((shouldAddAlias) => {\n if (shouldAddAlias) {\n this.aliasControls = this.buildFormAliasControls(\n [0],\n formArrayName,\n this.aliasFields,\n this.aliasControlsValidation,\n );\n this.focusFirstAliasField();\n } else {\n this.aliasControls = this.removeAllFormAliasControls(this.aliasControls, formArrayName, this.aliasFields);\n }\n });\n }\n\n /**\n * Sets focus to the first input field of a newly added alias row.\n */\n public focusFirstAliasField(): void {\n this['changeDetectorRef'].detectChanges();\n setTimeout(() => {\n const index = this.aliasControls.length - 1;\n const inputId = this.aliasFirstField.get(index)?.inputId;\n if (inputId) {\n const el = document.getElementById(inputId);\n el?.focus();\n }\n }, 0);\n }\n\n /**\n * Removes a form alias control from a form array and updates the list of form array controls.\n * @param index - The index of the form alias control to be removed.\n * @param formArrayName - The name of the form array.\n * @param formArrayControls - The list of form array controls.\n * @param fieldNames - The names of the fields associated with the form array controls.\n * @returns The updated list of form array controls after removing the specified control.\n */\n public removeFormAliasControls(\n index: number,\n formArrayName: string,\n formArrayControls: IAbstractFormArrayControls[],\n fieldNames: string[],\n ): IAbstractFormArrayControls[] {\n // Get the form array...\n const control = this.form.get(formArrayName) as FormArray;\n\n // Remove the form array control based on index\n control.removeAt(index);\n\n // Then remove the form array controls errors...\n this.removeFormAliasControlsErrors(index, formArrayControls, fieldNames);\n\n // Return the new list of form array controls...\n return this.removeFormAliasControl(index, formArrayControls);\n }\n\n /**\n * Adds an alias to the specified index of the form array.\n * Sets user focus to the first field of the newly added alias.\n *\n * @param index - The index at which to add the alias.\n * @param formArrayName - The name of the form array.\n */\n public addAlias(index: number, formArrayName: string): void {\n this.aliasControls.push(\n this.addAliasControls(index, formArrayName, this.aliasFields, this.aliasControlsValidation),\n );\n this.focusFirstAliasField();\n }\n\n /**\n * Removes an alias from the form array.\n *\n * @param index - The index of the alias to remove.\n * @param formArrayName - The name of the form array.\n */\n public removeAlias(index: number, formArrayName: string): void {\n this.aliasControls = this.removeFormAliasControls(index, formArrayName, this.aliasControls, this.aliasFields);\n }\n\n public override ngOnInit(): void {\n super.ngOnInit();\n }\n\n public override ngOnDestroy(): void {\n this['ngUnsubscribe'].next();\n this['ngUnsubscribe'].complete();\n super.ngOnDestroy();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hmcts-opal-frontend-common-components-abstract-abstract-form-alias-base.mjs","sources":["../../../projects/opal-frontend-common/components/abstract/abstract-form-alias-base/abstract-form-alias-base.component.ts","../../../projects/opal-frontend-common/components/abstract/abstract-form-alias-base/hmcts-opal-frontend-common-components-abstract-abstract-form-alias-base.ts"],"sourcesContent":["import { FormArray, FormControl, FormGroup, ValidatorFn } from '@angular/forms';\nimport { takeUntil } from 'rxjs';\nimport { Component, OnDestroy, OnInit, QueryList, ViewChildren } from '@angular/core';\nimport { IAbstractFormAliasBaseAliasControls } from '@hmcts/opal-frontend-common/components/abstract/abstract-form-alias-base/interfaces';\nimport { AbstractFormBaseComponent } from '@hmcts/opal-frontend-common/components/abstract/abstract-form-base';\nimport {\n IAbstractFormArrayControlValidation,\n IAbstractFormArrayControls,\n IAbstractFormArrayControl,\n} from '@hmcts/opal-frontend-common/components/abstract/interfaces';\nimport { GovukTextInputComponent } from '@hmcts/opal-frontend-common/components/govuk/govuk-text-input';\n\n@Component({\n template: '',\n})\nexport abstract class AbstractFormAliasBaseComponent extends AbstractFormBaseComponent implements OnInit, OnDestroy {\n @ViewChildren('aliasFirstField') aliasFirstField!: QueryList<GovukTextInputComponent>;\n public aliasControls: IAbstractFormAliasBaseAliasControls[] = [];\n public aliasControlsValidation: IAbstractFormArrayControlValidation[] = [];\n public aliasFields: string[] = [];\n\n /**\n * Builds an array of form controls for the given form array.\n *\n * @param formControlCount - An array of numbers representing the number of form controls to create.\n * @param formArrayName - The name of the form array.\n * @param fieldNames - An array of field names.\n * @param controlValidation - An array of control validation objects.\n * @returns An array of form controls for the given form array.\n */\n private buildFormAliasControls(\n formControlCount: number[],\n formArrayName: string,\n fieldNames: string[],\n controlValidation: IAbstractFormArrayControlValidation[],\n ): IAbstractFormArrayControls[] {\n // Directly map each index to a control\n return formControlCount.map((_element, index) =>\n this.addAliasControls(index, formArrayName, fieldNames, controlValidation),\n );\n }\n\n /**\n * Adds alias controls to the form array.\n *\n * @param index - The index of the form array.\n * @param formArrayName - The name of the form array.\n * @param fieldNames - The names of the fields for the alias controls.\n * @param controlValidation - The validation rules for the alias controls.\n * @returns An object containing the form controls.\n */\n private addAliasControls(\n index: number,\n formArrayName: string,\n fieldNames: string[],\n controlValidation: IAbstractFormArrayControlValidation[],\n ): { [key: string]: IAbstractFormArrayControl } {\n const formAliases = this.form.get(formArrayName) as FormArray;\n const formAliasesFormGroup = new FormGroup({});\n\n // Create the form controls...\n const controls = this.createAliasControls(fieldNames, index);\n\n // Add the controls to the form group...\n this.addControlsToFormGroup(formAliasesFormGroup, controlValidation, index);\n\n // Add the form group to the form array...\n formAliases.push(formAliasesFormGroup);\n\n // Return the form controls...\n return controls;\n }\n\n /**\n * Removes all form alias controls from a FormArray and clears any associated error messages.\n *\n * @param formArrayControls - An array of form array controls.\n * @param formArrayName - The name of the FormArray.\n * @param fieldNames - An array of field names associated with the form array controls.\n * @returns An empty array of form array controls.\n */\n private removeAllFormAliasControls(\n formArrayControls: IAbstractFormArrayControls[],\n formArrayName: string,\n fieldNames: string[],\n ): [] {\n const control = this.form.get(formArrayName) as FormArray;\n\n // Clear the error messages...\n for (const [index] of formArrayControls.entries()) {\n this.removeFormAliasControlsErrors(index, formArrayControls, fieldNames);\n }\n\n // Reset the form array controls...\n control.clear();\n\n // Return en empty array of form array controls...\n return [];\n }\n\n /**\n * Creates a FormArray with the specified validators and controls.\n *\n * @param validators - An array of validators to apply to the FormArray.\n * @param controls - An optional array of initial FormControl instances to add to the FormArray.\n * @returns A new FormArray instance.\n */\n protected createFormAlias(validators: ValidatorFn[], controls: FormControl[] = []): FormArray {\n return new FormArray(controls, { validators: [...validators] });\n }\n\n /**\n * Removes a form alias control at the specified index from the given form array controls.\n *\n * @param index - The index of the form alias control to remove.\n * @param formArrayControls - The array of form array controls.\n * @returns The updated array of form array controls after removing the specified control.\n */\n protected removeFormAliasControl(\n index: number,\n formArrayControls: IAbstractFormArrayControls[],\n ): IAbstractFormArrayControls[] {\n formArrayControls.splice(index, 1);\n return formArrayControls;\n }\n\n /**\n * Sets up the alias form controls based on the provided alias count array and form array name.\n * If there are any aliases, the alias controls will be re-populated.\n *\n * @param aliasCountArray - An array containing the count of aliases.\n * @param formArrayName - The name of the form array.\n */\n protected setupAliasFormControls(aliasCountArray: number[], formArrayName: string): void {\n // Re-populate the alias controls if there are any aliases\n if (aliasCountArray.length) {\n this.aliasControls = this.buildFormAliasControls(\n aliasCountArray,\n formArrayName,\n this.aliasFields,\n this.aliasControlsValidation,\n );\n }\n }\n\n /**\n * Removes the form alias controls errors for a specific index in a form array.\n *\n * @param index - The index of the form array control.\n * @param formArrayControls - An array of form array controls.\n * @param fieldNames - An array of field names to remove errors from.\n */\n protected removeFormAliasControlsErrors(\n index: number,\n formArrayControls: IAbstractFormArrayControls[],\n fieldNames: string[],\n ): void {\n const formArrayControl = formArrayControls[index];\n\n if (formArrayControl) {\n for (const field of fieldNames) {\n delete this.formControlErrorMessages?.[formArrayControl[field].controlName];\n }\n }\n }\n\n /**\n * Creates alias controls for the given fields and index.\n * @param fields - The list of fields for which alias controls need to be created.\n * @param index - The index value used to generate unique identifiers for the controls.\n * @returns An object containing the alias controls.\n */\n protected createAliasControls(fields: string[], index: number): { [key: string]: IAbstractFormArrayControl } {\n return fields.reduce(\n (controls, field) => ({\n ...controls,\n [field]: {\n inputId: `${field}_${index}`,\n inputName: `${field}_${index}`,\n controlName: `${field}_${index}`,\n },\n }),\n {},\n );\n }\n\n /**\n * Sets up the alias checkbox listener.\n *\n * @param formCheckboxName - The name of the checkbox control in the form.\n * @param formArrayName - The name of the form array control in the form.\n */\n protected setUpAliasCheckboxListener(formCheckboxName: string, formArrayName: string): void {\n // Ensure any existing subscription is cleared to avoid memory leaks\n this['ngUnsubscribe'].next();\n this['ngUnsubscribe'].complete();\n\n const addAliasControl = this.form.get(formCheckboxName);\n if (!addAliasControl) {\n return;\n }\n\n addAliasControl.valueChanges.pipe(takeUntil(this['ngUnsubscribe'])).subscribe((shouldAddAlias) => {\n if (shouldAddAlias) {\n this.aliasControls = this.buildFormAliasControls(\n [0],\n formArrayName,\n this.aliasFields,\n this.aliasControlsValidation,\n );\n this.focusFirstAliasField();\n } else {\n this.aliasControls = this.removeAllFormAliasControls(this.aliasControls, formArrayName, this.aliasFields);\n }\n });\n }\n\n /**\n * Sets focus to the first input field of a newly added alias row.\n */\n public focusFirstAliasField(): void {\n this['changeDetectorRef'].detectChanges();\n setTimeout(() => {\n const index = this.aliasControls.length - 1;\n const inputId = this.aliasFirstField.get(index)?.inputId;\n if (inputId) {\n const el = document.getElementById(inputId);\n el?.focus();\n }\n }, 0);\n }\n\n /**\n * Removes a form alias control from a form array and updates the list of form array controls.\n * @param index - The index of the form alias control to be removed.\n * @param formArrayName - The name of the form array.\n * @param formArrayControls - The list of form array controls.\n * @param fieldNames - The names of the fields associated with the form array controls.\n * @returns The updated list of form array controls after removing the specified control.\n */\n public removeFormAliasControls(\n index: number,\n formArrayName: string,\n formArrayControls: IAbstractFormArrayControls[],\n fieldNames: string[],\n ): IAbstractFormArrayControls[] {\n // Get the form array...\n const control = this.form.get(formArrayName) as FormArray;\n\n // Remove the form array control based on index\n control.removeAt(index);\n\n // Then remove the form array controls errors...\n this.removeFormAliasControlsErrors(index, formArrayControls, fieldNames);\n\n // Return the new list of form array controls...\n return this.removeFormAliasControl(index, formArrayControls);\n }\n\n /**\n * Adds an alias to the specified index of the form array.\n * Sets user focus to the first field of the newly added alias.\n *\n * @param index - The index at which to add the alias.\n * @param formArrayName - The name of the form array.\n */\n public addAlias(index: number, formArrayName: string): void {\n this.aliasControls.push(\n this.addAliasControls(index, formArrayName, this.aliasFields, this.aliasControlsValidation),\n );\n this.focusFirstAliasField();\n }\n\n /**\n * Removes an alias from the form array.\n *\n * @param index - The index of the alias to remove.\n * @param formArrayName - The name of the form array.\n */\n public removeAlias(index: number, formArrayName: string): void {\n this.aliasControls = this.removeFormAliasControls(index, formArrayName, this.aliasControls, this.aliasFields);\n }\n\n public override ngOnInit(): void {\n super.ngOnInit();\n }\n\n public override ngOnDestroy(): void {\n this['ngUnsubscribe'].next();\n this['ngUnsubscribe'].complete();\n super.ngOnDestroy();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -234,10 +234,10 @@ class AbstractFormArrayBaseComponent extends AbstractFormBaseComponent {
234
234
  this.ngUnsubscribe.complete();
235
235
  super.ngOnDestroy();
236
236
  }
237
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractFormArrayBaseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
238
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: AbstractFormArrayBaseComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
237
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractFormArrayBaseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
238
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: AbstractFormArrayBaseComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
239
239
  }
240
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractFormArrayBaseComponent, decorators: [{
240
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractFormArrayBaseComponent, decorators: [{
241
241
  type: Component,
242
242
  args: [{
243
243
  template: '',
@@ -77,10 +77,10 @@ class AbstractFormArrayRemovalComponent {
77
77
  this.router.navigate([route], { relativeTo: this.activatedRoute.parent });
78
78
  }
79
79
  }
80
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractFormArrayRemovalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
81
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: AbstractFormArrayRemovalComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: '', isInline: true });
80
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractFormArrayRemovalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
81
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: AbstractFormArrayRemovalComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: '', isInline: true });
82
82
  }
83
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractFormArrayRemovalComponent, decorators: [{
83
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractFormArrayRemovalComponent, decorators: [{
84
84
  type: Component,
85
85
  args: [{
86
86
  template: '',
@@ -594,10 +594,10 @@ class AbstractFormBaseComponent {
594
594
  this.ngUnsubscribe.next();
595
595
  this.ngUnsubscribe.complete();
596
596
  }
597
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractFormBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
598
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: AbstractFormBaseComponent, isStandalone: true, selector: "ng-component", outputs: { unsavedChanges: "unsavedChanges", formSubmit: "formSubmit" }, ngImport: i0, template: '', isInline: true });
597
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractFormBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
598
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: AbstractFormBaseComponent, isStandalone: true, selector: "ng-component", outputs: { unsavedChanges: "unsavedChanges", formSubmit: "formSubmit" }, ngImport: i0, template: '', isInline: true });
599
599
  }
600
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractFormBaseComponent, decorators: [{
600
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractFormBaseComponent, decorators: [{
601
601
  type: Component,
602
602
  args: [{
603
603
  template: '',
@@ -1 +1 @@
1
- {"version":3,"file":"hmcts-opal-frontend-common-components-abstract-abstract-form-base.mjs","sources":["../../../projects/opal-frontend-common/components/abstract/abstract-form-base/abstract-form-base.component.ts","../../../projects/opal-frontend-common/components/abstract/abstract-form-base/hmcts-opal-frontend-common-components-abstract-abstract-form-base.ts"],"sourcesContent":["import { ChangeDetectorRef, Component, EventEmitter, OnDestroy, OnInit, Output, inject } from '@angular/core';\nimport { FormArray, FormControl, FormGroup, FormRecord, ValidatorFn } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Subject, takeUntil } from 'rxjs';\nimport { IAbstractFormBaseFieldError } from './interfaces/abstract-form-base-field-error.interface';\nimport { IAbstractFormBaseFieldErrors } from './interfaces/abstract-form-base-field-errors.interface';\nimport { IAbstractFormBaseFormError } from './interfaces/abstract-form-base-form-error.interface';\nimport {\n IAbstractFormBaseFormErrorSummaryMessage,\n IAbstractFormControlErrorMessage,\n IAbstractFormArrayControlValidation,\n} from '@hmcts/opal-frontend-common/components/abstract/interfaces';\nimport { IAbstractFormBaseHighPriorityFormError } from './interfaces/abstract-form-base-high-priority-form-error.interface';\nimport { IAbstractFormBaseForm } from './interfaces/abstract-form-base-form.interface';\nimport { UtilsService } from '@hmcts/opal-frontend-common/services/utils-service';\n\n@Component({\n template: '',\n})\nexport abstract class AbstractFormBaseComponent implements OnInit, OnDestroy {\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n private readonly router = inject(Router);\n private readonly activatedRoute = inject(ActivatedRoute);\n\n @Output() protected unsavedChanges = new EventEmitter<boolean>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n @Output() protected formSubmit = new EventEmitter<IAbstractFormBaseForm<any>>();\n protected readonly utilsService = inject(UtilsService);\n protected fieldErrors!: IAbstractFormBaseFieldErrors;\n protected formSubmitted = false;\n protected readonly ngUnsubscribe = new Subject<void>();\n\n public form!: FormGroup;\n public formControlErrorMessages!: IAbstractFormControlErrorMessage;\n public formErrorSummaryMessage!: IAbstractFormBaseFormErrorSummaryMessage[];\n public formErrors!: IAbstractFormBaseFormError[];\n\n constructor() {}\n\n /**\n * Scrolls to a specific form field and attempts to focus on it.\n *\n * This method locates the target field or its associated label/legend\n * based on the provided `fieldId`. It ensures that the field or its\n * nested focusable element is brought into view and focused, if possible.\n *\n * The scrolling behavior is smooth, and the method prioritizes the following\n * elements in order:\n * 1. A label associated with an autocomplete field (`label[for=\"${fieldId}-autocomplete\"]`).\n * 2. A regular label associated with the field (`label[for=\"${fieldId}\"]`).\n * 3. A legend within a fieldset associated with the field (`[id=\"${fieldId}\"] .govuk-fieldset__legend`).\n * 4. The field itself or its nested focusable element.\n *\n * @param fieldId - The ID of the form field to scroll to and focus on.\n */\n private scroll(fieldId: string): void {\n const autocompleteLabel = document.querySelector<HTMLElement>(`label[for=\"${fieldId}-autocomplete\"]`);\n const regularLabel = document.querySelector<HTMLElement>(`label[for=\"${fieldId}\"]`);\n const fieldsetLegend = document.querySelector<HTMLElement>(`[id=\"${fieldId}\"] .govuk-fieldset__legend`);\n\n const labelTarget = autocompleteLabel ?? regularLabel ?? fieldsetLegend ?? null;\n const focusableSelector = 'input:not([type=\"hidden\"]), select, textarea, button, [tabindex]:not([tabindex=\"-1\"])';\n\n let fieldElement = document.getElementById(`${fieldId}-autocomplete`) ?? document.getElementById(fieldId);\n\n if (fieldElement && !this.canReceiveFocus(fieldElement)) {\n const nestedFocusable = fieldElement.querySelector<HTMLElement>(focusableSelector);\n if (nestedFocusable) {\n fieldElement = nestedFocusable;\n }\n }\n\n fieldElement ??= document.querySelector<HTMLElement>(`[id=\"${fieldId}\"] ${focusableSelector}`);\n\n if (labelTarget) {\n labelTarget.scrollIntoView({ behavior: 'smooth' });\n } else if (fieldElement) {\n fieldElement.scrollIntoView({ behavior: 'smooth' });\n }\n\n fieldElement?.focus();\n }\n\n /**\n * Determines whether a given HTML element can receive focus.\n *\n * An element is considered focusable if:\n * - It has a `tabIndex` greater than or equal to 0 and does not have the `disabled` attribute.\n * - It is an anchor (`<a>`) element with a valid `href` attribute.\n * - It is one of the following tags: `INPUT`, `SELECT`, `TEXTAREA`, or `BUTTON`,\n * and it is not disabled.\n *\n * @param element - The HTML element to check for focusability.\n * @returns `true` if the element can receive focus, otherwise `false`.\n */\n private canReceiveFocus(element: HTMLElement): boolean {\n if (element.tabIndex >= 0 && !element.hasAttribute('disabled')) {\n return true;\n }\n\n if (element instanceof HTMLAnchorElement && element.hasAttribute('href') && element.href) {\n return !!element.href;\n }\n\n const focusableTags = ['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'];\n if (focusableTags.includes(element.tagName)) {\n return !(element as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | HTMLButtonElement).disabled;\n }\n\n return false;\n }\n\n /**\n * Returns the highest priority form error from the given error keys and field errors.\n * @param errorKeys - An array of error keys.\n * @param fieldErrors - An object containing field errors.\n * @returns The highest priority form error or null if no errors are found.\n */\n private getHighestPriorityError(\n errorKeys: string[] = [],\n fieldErrors: IAbstractFormBaseFieldError = {},\n ): IAbstractFormBaseHighPriorityFormError | null {\n if (errorKeys.length && Object.keys(fieldErrors).length) {\n const errors = errorKeys.map((errorType: string) => {\n return {\n ...fieldErrors[errorType],\n type: errorType,\n };\n });\n\n const sortedErrors = [...errors].sort((a, b) => a.priority - b.priority);\n\n return sortedErrors[0];\n }\n return null;\n }\n\n /**\n * Retrieves the details of the highest priority form error for a given control path.\n * @param controlPath - The path to the control in the form.\n * @returns The details of the highest priority form error, or null if there are no errors.\n */\n private getFieldErrorDetails(controlPath: (string | number)[]): IAbstractFormBaseHighPriorityFormError | null {\n // Get the control\n const control = this.form.get(controlPath);\n\n // If we have errors\n const controlErrors = control?.errors;\n\n if (controlErrors) {\n /// Get all the error keys\n // Use Array.prototype.at for clarity when accessing the last segment of the control path\n const controlKey = controlPath.at(-1);\n const errorKeys = Object.keys(controlErrors) || [];\n const fieldErrors = controlKey === undefined ? {} : this.fieldErrors[controlKey] || {};\n\n if (errorKeys.length && Object.keys(fieldErrors).length) {\n return this.getHighestPriorityError(errorKeys, fieldErrors);\n }\n }\n return null;\n }\n\n /**\n * Retrieves all form errors from the provided form and its nested form groups.\n *\n * @param form - The form group to retrieve errors from.\n * @param controlPath - An optional array representing the path to the current control within the form group.\n * @returns An array of form errors, each containing the field ID, error message, priority, and type.\n */\n private getFormErrors(form: FormGroup, controlPath: (string | number)[] = []): IAbstractFormBaseFormError[] {\n // recursively get all errors from all controls in the form including nested form group controls\n const formControls = form.controls;\n\n const errorSummary = Object.keys(formControls)\n .filter((controlName) => formControls[controlName].invalid)\n .flatMap((controlName) => {\n const control = formControls[controlName];\n\n if (control instanceof FormRecord) {\n // We only support FormControls in FormRecords\n const recordFieldErrorDetails = this.getFieldErrorDetails([...controlPath, controlName]);\n\n return {\n fieldId: controlName,\n message: recordFieldErrorDetails?.message ?? null,\n priority: recordFieldErrorDetails?.priority ?? 999999999,\n type: recordFieldErrorDetails?.type ?? null,\n };\n }\n\n if (control instanceof FormGroup) {\n return this.getFormErrors(control, [...controlPath, controlName]);\n }\n\n if (control instanceof FormArray) {\n return control.controls.flatMap((controlItem, index) => {\n // We only support FormGroups in FormArrays\n if (controlItem instanceof FormGroup) {\n return this.getFormErrors(controlItem, [...controlPath, controlName, index]);\n }\n return [];\n });\n }\n\n const getFieldErrorDetails = this.getFieldErrorDetails([...controlPath, controlName]);\n\n // Return the error summary entry\n // If we don't have the error details, return a null message\n return {\n fieldId: controlName,\n message: getFieldErrorDetails?.message ?? null,\n priority: getFieldErrorDetails?.priority ?? 999999999,\n type: getFieldErrorDetails?.type ?? null,\n };\n });\n\n // Remove any null errors\n return errorSummary.filter((item) => item?.message !== null);\n }\n\n /**\n * Sets the error messages for the form controls and error summary based on the provided form errors.\n * @param formErrors - An array of form errors containing field IDs and error messages.\n */\n private setErrorMessages(formErrors: IAbstractFormBaseFormError[]) {\n // Reset the form error messages\n this.formControlErrorMessages = {};\n this.formErrorSummaryMessage = [];\n\n // Set the form error messages based on the error summary entries\n for (const entry of formErrors) {\n this.formControlErrorMessages[entry.fieldId] = entry.message;\n this.formErrorSummaryMessage.push({ fieldId: entry.fieldId, message: entry.message });\n }\n }\n\n /**\n * Gets the indexes of the date fields to remove based on the form error summary message.\n * @returns An array of indexes representing the date fields to remove.\n */\n private getDateFieldsToRemoveIndexes(): number[] {\n const indexesToRemove: number[] = [];\n // The order of the field ids is important\n // this is the order in which we want to remove them\n const foundIndexes = this.getFormErrorSummaryIndex(\n ['dayOfMonth', 'monthOfYear', 'year'],\n this.formErrorSummaryMessage,\n );\n\n // Determine which indexes to remove based on the found fields\n switch (foundIndexes.length) {\n case 3:\n // All three date fields are present\n indexesToRemove.push(foundIndexes[1], foundIndexes[2]);\n break;\n case 2:\n // Two date fields are present\n indexesToRemove.push(foundIndexes[1]);\n break;\n }\n\n return indexesToRemove;\n }\n\n /**\n * Returns an array of indices corresponding to the positions of the given field IDs in the form error summary message array.\n *\n * @param fieldIds - An array of field IDs to search for in the form error summary message array.\n * @param formErrorSummaryMessage - An array of form error summary messages.\n * @returns An array of indices corresponding to the positions of the field IDs in the form error summary message array.\n */\n private getFormErrorSummaryIndex(\n fieldIds: string[],\n formErrorSummaryMessage: IAbstractFormBaseFormErrorSummaryMessage[],\n ): number[] {\n return fieldIds.reduce((acc: number[], field) => {\n const index = formErrorSummaryMessage.findIndex((error) => error.fieldId === field);\n if (index === -1) {\n return acc;\n }\n return [...acc, index];\n }, []);\n }\n\n /**\n * Removes error summary messages from the given array based on the specified indexes.\n *\n * @param formErrorSummaryMessage - The array of error summary messages.\n * @param indexes - The indexes of the error summary messages to be removed.\n * @returns The updated array of error summary messages.\n */\n private removeErrorSummaryMessages(\n formErrorSummaryMessage: IAbstractFormBaseFormErrorSummaryMessage[],\n indexes: number[],\n ): IAbstractFormBaseFormErrorSummaryMessage[] {\n return formErrorSummaryMessage.filter((_, index) => !indexes.includes(index));\n }\n\n /**\n * Splits the form errors into two arrays based on the provided field IDs.\n * Errors with field IDs included in the fieldIds array will be moved to the removedFormErrors array,\n * while the remaining errors will be moved to the cleanFormErrors array.\n *\n * @param fieldIds - An array of field IDs to filter the form errors.\n * @param formErrors - An array of form errors to be split.\n * @returns An array containing two arrays: cleanFormErrors and removedFormErrors.\n */\n private splitFormErrors(\n fieldIds: string[],\n formErrors: IAbstractFormBaseFormError[],\n ): IAbstractFormBaseFormError[][] {\n const cleanFormErrors: IAbstractFormBaseFormError[] = [];\n const removedFormErrors: IAbstractFormBaseFormError[] = [];\n\n for (const error of formErrors) {\n if (fieldIds.includes(error.fieldId)) {\n removedFormErrors.push(error);\n } else {\n cleanFormErrors.push(error);\n }\n }\n\n return [cleanFormErrors, removedFormErrors];\n }\n\n /**\n * Manipulates the error message for specific fields in the formErrors array.\n * @param fields - An array of field IDs to target for error message manipulation.\n * @param messageOverride - The new error message to be used for the targeted fields.\n * @param errorType - The type of error to match for the targeted fields.\n * @param formErrors - An array of IFormError objects representing the form errors.\n * @returns An array of IFormError objects with the manipulated error messages.\n */\n private manipulateFormErrorMessage(\n fields: string[],\n messageOverride: string,\n errorType: string,\n formErrors: IAbstractFormBaseFormError[],\n ): IAbstractFormBaseFormError[] {\n const manipulatedFields: IAbstractFormBaseFormError[] = [];\n for (const field of formErrors) {\n if (fields.includes(field.fieldId)) {\n if (field.type === errorType) {\n manipulatedFields.push({ ...field, message: messageOverride });\n } else {\n manipulatedFields.push(field);\n }\n continue;\n }\n manipulatedFields.push(field);\n }\n\n return manipulatedFields;\n }\n\n /**\n * Retrieves the form errors with the highest priority.\n *\n * @param formErrors - An array of form errors.\n * @returns An array of form errors with the highest priority.\n */\n private getHighPriorityFormErrors(formErrors: IAbstractFormBaseFormError[]): IAbstractFormBaseFormError[] {\n // Get the lowest priority (1 is the highest priority, 3 is the lowest priority)\n const lowestPriority = Math.min(...formErrors.map((item) => item.priority));\n return formErrors.filter((item) => item.priority === lowestPriority);\n }\n\n /**\n * Focuses on the error summary element and scrolls to the top of the page.\n *\n * This method first triggers change detection to ensure the view is up-to-date.\n * It then selects the error summary element with the class 'govuk-error-summary'.\n * If the error summary element is found, it sets focus on it without scrolling the page.\n * Finally, it calls a utility service to scroll to the top of the page.\n *\n * @private\n */\n private focusAndScrollToErrorSummary(): void {\n this.changeDetectorRef.detectChanges();\n\n const errorSummary = document.querySelector('.govuk-error-summary') as HTMLElement;\n if (errorSummary) {\n errorSummary.focus({ preventScroll: true });\n this.utilsService.scrollToTop();\n }\n }\n\n /**\n * Setup listener for the form value changes and to emit hasUnsavedChanges\n */\n private setupListener(): void {\n this.form.valueChanges.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {\n this.unsavedChanges.emit(this.hasUnsavedChanges());\n });\n }\n\n /**\n * Adds controls to a form group.\n *\n * @param formGroup - The form group to add controls to.\n * @param controls - An array of form array control validations.\n * @param index - The index of the form array control.\n */\n protected addControlsToFormGroup(\n formGroup: FormGroup,\n controls: IAbstractFormArrayControlValidation[],\n index: number,\n ): void {\n for (const { controlName, validators } of controls) {\n formGroup.addControl(`${controlName}_${index}`, new FormControl(null, validators));\n }\n }\n\n /**\n * Creates a form control with the specified validators and initial value.\n *\n * @param validators - An array of validator functions.\n * @param initialValue - The initial value for the form control. Defaults to null.\n * @returns The created form control.\n */\n protected createFormControl(validators: ValidatorFn[], initialValue: string | null = null): FormControl {\n return new FormControl(initialValue, { validators: [...validators] });\n }\n\n /**\n * Handles the error messages and populates the relevant variables\n */\n protected handleErrorMessages(): void {\n this.formErrors = this.getFormErrors(this.form);\n\n this.setErrorMessages(this.formErrors);\n\n this.formErrorSummaryMessage = this.removeErrorSummaryMessages(\n this.formErrorSummaryMessage,\n this.getDateFieldsToRemoveIndexes(),\n );\n }\n\n /**\n * Checks whether the form has been touched and submitted\n *\n * @returns boolean\n */\n protected hasUnsavedChanges(): boolean {\n return this.form.dirty && !this.formSubmitted;\n }\n\n /**\n * Sets the value of a form control specified by its path and marks it as touched.\n *\n * @param value - The value to set for the form control.\n * @param controlPath - The dot-delimited path to the form control within the form group.\n */\n protected setInputValue(value: string, controlPath: string): void {\n const control = this.form.get(controlPath);\n if (control) {\n control.patchValue(value);\n control.markAsTouched();\n }\n }\n\n /**\n * Handles the form errors for the date input fields.\n * @param formErrors - An array of form errors.\n * @returns An array of form errors with the manipulated error messages.\n */\n protected handleDateInputFormErrors() {\n const dateInputFields = ['dayOfMonth', 'monthOfYear', 'year'];\n const splitFormErrors = this.splitFormErrors(dateInputFields, this.formErrors);\n const highPriorityDateControlErrors = this.getHighPriorityFormErrors(splitFormErrors[1]);\n let manipulatedFormErrors: IAbstractFormBaseFormError[] = highPriorityDateControlErrors;\n\n // If we have more than one error then we want to manipulate the error message\n if (highPriorityDateControlErrors.length > 1) {\n manipulatedFormErrors = this.manipulateFormErrorMessage(\n dateInputFields,\n 'Please enter a DOB',\n 'required',\n manipulatedFormErrors,\n );\n }\n\n return [...splitFormErrors[0], ...manipulatedFormErrors];\n }\n\n /**\n * Sets the initial error messages for the form controls.\n *\n * @param form - The FormGroup instance.\n */\n protected setInitialErrorMessages(): void {\n const formControls = this.form.controls;\n const initialFormControlErrorMessages: IAbstractFormControlErrorMessage = {};\n\n for (const controlName of Object.keys(formControls)) {\n initialFormControlErrorMessages[controlName] = null;\n }\n\n this.formControlErrorMessages = initialFormControlErrorMessages;\n this.formErrorSummaryMessage = [];\n }\n\n /**\n * Repopulates the search form with the data from the account enquiry search.\n * @param state - The state object containing the search form data.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected rePopulateForm(state: any): void {\n this.form.patchValue(state);\n }\n\n /**\n * Adds a new form control to the form group.\n *\n * @param controlName - The name of the control to add.\n * @param validators - An array of validators to apply to the control.\n */\n protected createControl(controlName: string, validators: ValidatorFn[]): void {\n this.form.addControl(controlName, new FormControl(null, validators));\n }\n\n /**\n * Updates the validators of an existing form control.\n *\n * @param controlName - The name of the control to update.\n * @param validators - An array of validators to apply to the control.\n */\n protected updateControl(controlName: string, validators: ValidatorFn[]): void {\n const control = this.form.get(controlName);\n if (control) {\n control.setValidators(validators);\n control.updateValueAndValidity();\n } else {\n this.createControl(controlName, validators);\n }\n }\n\n /**\n * Removes a control from the form.\n *\n * @param controlName - The name of the control to remove.\n */\n protected removeControl(controlName: string): void {\n if (this.formControlErrorMessages[controlName]) {\n this.removeControlErrors(controlName);\n }\n this.form.removeControl(controlName);\n }\n\n /**\n * Removes the error message associated with the specified control name from the formControlErrorMessages object.\n *\n * @param controlName - The name of the control for which to remove the error message.\n */\n protected removeControlErrors(controlName: string): void {\n delete this.formControlErrorMessages[controlName];\n }\n\n /**\n * Clears all error messages from the form.\n */\n protected clearAllErrorMessages(): void {\n this.formControlErrorMessages = {};\n this.formErrorSummaryMessage = [];\n this.formErrors = [];\n this.form.updateValueAndValidity({ onlySelf: false, emitEvent: false });\n }\n\n /**\n * Create a plain object from a FormRecord of FormControls.\n *\n * What it does: copies each control's current value onto a plain object.\n * When to use: when you need the raw values from a FormRecord (e.g. to send to an API).\n *\n * Example\n * -------\n * // record: FormRecord<FormControl<string | null>> with a single control 'firstName'\n * const out = this.objectFromFormRecord(record, {\n * mapKey: k => k, // optional (defaults to identity)\n * mapValue: v => v ?? '' // turn null/undefined into ''\n * });\n * // out -> { firstName: '' }\n *\n * @typeParam T - Control value type.\n * @typeParam U - Output value type (defaults to T).\n * @typeParam K - Output key type (defaults to string). Control names are strings; provide `mapKey` if you need numbers.\n */\n protected objectFromFormRecord<T, U = T, K extends string | number = string>(\n controlRecord: FormRecord<FormControl<T | null | undefined>>,\n options?: {\n mapKey?: (key: string) => K;\n mapValue?: (value: T | null | undefined) => U;\n },\n ): Record<K, U> {\n const mapKey = options?.mapKey ?? ((k: string) => k as unknown as K);\n const mapValue = options?.mapValue ?? ((v: T | null | undefined) => v as unknown as U);\n\n const result = {} as Record<K, U>;\n\n for (const [name, control] of Object.entries(controlRecord.controls)) {\n result[mapKey(name)] = mapValue(control.value);\n }\n\n return result;\n }\n\n /**\n * Patch a FormRecord of FormControls from a plain object.\n *\n * What it does: for each entry in `values`, finds the matching control by name\n * (optionally mapped via `mapKey`) and sets its value **only if** it changes.\n * When to use: when you need to patch many controls at once, without\n * triggering extra updates for unchanged values.\n *\n * Example\n * -------\n * // controlRecord: FormRecord<FormControl<string>> with controls 'firstName', 'lastName'\n * this.patchFormRecordFromObject(controlRecord, { firstName: 'Ada', lastName: 'Lovelace' }, {\n * emitEvent: true,\n * isEqual: (a, b) => a === b,\n * // mapKey: k => `ctrl_${k as string}` // optional: map incoming keys to control names\n * });\n *\n * @typeParam T - Control value type.\n * @typeParam K - Keys present in the `values` object (string or number).\n */\n protected patchFormRecordFromObject<T, K extends string | number = string>(\n controlRecord: FormRecord<FormControl<T>>,\n values: Record<K, T>,\n options?: {\n emitEvent?: boolean;\n /** How provided keys map to control names (defaults to String(key)). */\n mapKey?: (key: K) => string;\n /** Equality check used to avoid unnecessary writes (defaults to Object.is). */\n isEqual?: (a: T, b: T) => boolean;\n },\n ): void {\n const emitEvent = options?.emitEvent ?? false;\n const mapKey = options?.mapKey ?? String;\n const isEqual = options?.isEqual ?? Object.is;\n\n for (const [k, v] of Object.entries(values) as [K, T][]) {\n const controlName = mapKey(k);\n const ctrl = controlRecord.get(controlName) as FormControl<T> | null;\n if (!ctrl) {\n // If the control isn't present, skip silently. Callers can validate separately.\n continue;\n }\n if (!isEqual(ctrl.value, v)) {\n ctrl.setValue(v, { emitEvent });\n }\n }\n }\n\n /**\n * Clears the search form.\n */\n public handleClearForm(): void {\n this.form.reset();\n }\n\n /**\n * Handles the scroll of the component error from the summary\n *\n * @param fieldId - Field id of the component\n */\n public scrollTo(fieldId: string): void {\n this['scroll'](fieldId);\n }\n\n /**\n * Handles route with the supplied route\n *\n * @param route string of route\n * @param nonRelative boolean indicating if route is relative to the parent\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public handleRoute(route: string, nonRelative: boolean = false, event?: Event, routeData?: any): void {\n if (event) {\n event.preventDefault();\n }\n\n this.unsavedChanges.emit(this.hasUnsavedChanges());\n\n const navigationExtras = {\n ...(nonRelative ? {} : { relativeTo: this.activatedRoute.parent }),\n ...(routeData === undefined ? {} : { state: routeData }),\n };\n\n this.router.navigate([route], navigationExtras);\n }\n\n /**\n * Handles the form submission event.\n *\n * @param event - The form submission event.\n * @returns void\n */\n public handleFormSubmit(event: SubmitEvent): void {\n this.handleErrorMessages();\n\n if (this.form.valid) {\n this.formSubmitted = true;\n const nestedFlow = event.submitter ? event.submitter.className.includes('nested-flow') : false;\n this.unsavedChanges.emit(this.hasUnsavedChanges());\n this.formSubmit.emit({ formData: this.form.value, nestedFlow: nestedFlow });\n } else {\n this.focusAndScrollToErrorSummary();\n }\n }\n\n /**\n * Handles the input event to convert all letters in the input value to uppercase.\n * This method is triggered by an input event and modifies the input value directly.\n *\n * @param event - The input event triggered by the user.\n */\n public handleUppercaseInputMask(event: Event): void {\n const input = event.target as HTMLInputElement;\n input.value = this.utilsService.upperCaseAllLetters(input.value);\n }\n\n public ngOnInit(): void {\n if (this.form) {\n this.setupListener();\n }\n }\n\n public ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hmcts-opal-frontend-common-components-abstract-abstract-form-base.mjs","sources":["../../../projects/opal-frontend-common/components/abstract/abstract-form-base/abstract-form-base.component.ts","../../../projects/opal-frontend-common/components/abstract/abstract-form-base/hmcts-opal-frontend-common-components-abstract-abstract-form-base.ts"],"sourcesContent":["import { ChangeDetectorRef, Component, EventEmitter, OnDestroy, OnInit, Output, inject } from '@angular/core';\nimport { FormArray, FormControl, FormGroup, FormRecord, ValidatorFn } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Subject, takeUntil } from 'rxjs';\nimport { IAbstractFormBaseFieldError } from './interfaces/abstract-form-base-field-error.interface';\nimport { IAbstractFormBaseFieldErrors } from './interfaces/abstract-form-base-field-errors.interface';\nimport { IAbstractFormBaseFormError } from './interfaces/abstract-form-base-form-error.interface';\nimport {\n IAbstractFormBaseFormErrorSummaryMessage,\n IAbstractFormControlErrorMessage,\n IAbstractFormArrayControlValidation,\n} from '@hmcts/opal-frontend-common/components/abstract/interfaces';\nimport { IAbstractFormBaseHighPriorityFormError } from './interfaces/abstract-form-base-high-priority-form-error.interface';\nimport { IAbstractFormBaseForm } from './interfaces/abstract-form-base-form.interface';\nimport { UtilsService } from '@hmcts/opal-frontend-common/services/utils-service';\n\n@Component({\n template: '',\n})\nexport abstract class AbstractFormBaseComponent implements OnInit, OnDestroy {\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n private readonly router = inject(Router);\n private readonly activatedRoute = inject(ActivatedRoute);\n\n @Output() protected unsavedChanges = new EventEmitter<boolean>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n @Output() protected formSubmit = new EventEmitter<IAbstractFormBaseForm<any>>();\n protected readonly utilsService = inject(UtilsService);\n protected fieldErrors!: IAbstractFormBaseFieldErrors;\n protected formSubmitted = false;\n protected readonly ngUnsubscribe = new Subject<void>();\n\n public form!: FormGroup;\n public formControlErrorMessages!: IAbstractFormControlErrorMessage;\n public formErrorSummaryMessage!: IAbstractFormBaseFormErrorSummaryMessage[];\n public formErrors!: IAbstractFormBaseFormError[];\n\n constructor() {}\n\n /**\n * Scrolls to a specific form field and attempts to focus on it.\n *\n * This method locates the target field or its associated label/legend\n * based on the provided `fieldId`. It ensures that the field or its\n * nested focusable element is brought into view and focused, if possible.\n *\n * The scrolling behavior is smooth, and the method prioritizes the following\n * elements in order:\n * 1. A label associated with an autocomplete field (`label[for=\"${fieldId}-autocomplete\"]`).\n * 2. A regular label associated with the field (`label[for=\"${fieldId}\"]`).\n * 3. A legend within a fieldset associated with the field (`[id=\"${fieldId}\"] .govuk-fieldset__legend`).\n * 4. The field itself or its nested focusable element.\n *\n * @param fieldId - The ID of the form field to scroll to and focus on.\n */\n private scroll(fieldId: string): void {\n const autocompleteLabel = document.querySelector<HTMLElement>(`label[for=\"${fieldId}-autocomplete\"]`);\n const regularLabel = document.querySelector<HTMLElement>(`label[for=\"${fieldId}\"]`);\n const fieldsetLegend = document.querySelector<HTMLElement>(`[id=\"${fieldId}\"] .govuk-fieldset__legend`);\n\n const labelTarget = autocompleteLabel ?? regularLabel ?? fieldsetLegend ?? null;\n const focusableSelector = 'input:not([type=\"hidden\"]), select, textarea, button, [tabindex]:not([tabindex=\"-1\"])';\n\n let fieldElement = document.getElementById(`${fieldId}-autocomplete`) ?? document.getElementById(fieldId);\n\n if (fieldElement && !this.canReceiveFocus(fieldElement)) {\n const nestedFocusable = fieldElement.querySelector<HTMLElement>(focusableSelector);\n if (nestedFocusable) {\n fieldElement = nestedFocusable;\n }\n }\n\n fieldElement ??= document.querySelector<HTMLElement>(`[id=\"${fieldId}\"] ${focusableSelector}`);\n\n if (labelTarget) {\n labelTarget.scrollIntoView({ behavior: 'smooth' });\n } else if (fieldElement) {\n fieldElement.scrollIntoView({ behavior: 'smooth' });\n }\n\n fieldElement?.focus();\n }\n\n /**\n * Determines whether a given HTML element can receive focus.\n *\n * An element is considered focusable if:\n * - It has a `tabIndex` greater than or equal to 0 and does not have the `disabled` attribute.\n * - It is an anchor (`<a>`) element with a valid `href` attribute.\n * - It is one of the following tags: `INPUT`, `SELECT`, `TEXTAREA`, or `BUTTON`,\n * and it is not disabled.\n *\n * @param element - The HTML element to check for focusability.\n * @returns `true` if the element can receive focus, otherwise `false`.\n */\n private canReceiveFocus(element: HTMLElement): boolean {\n if (element.tabIndex >= 0 && !element.hasAttribute('disabled')) {\n return true;\n }\n\n if (element instanceof HTMLAnchorElement && element.hasAttribute('href') && element.href) {\n return !!element.href;\n }\n\n const focusableTags = ['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'];\n if (focusableTags.includes(element.tagName)) {\n return !(element as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | HTMLButtonElement).disabled;\n }\n\n return false;\n }\n\n /**\n * Returns the highest priority form error from the given error keys and field errors.\n * @param errorKeys - An array of error keys.\n * @param fieldErrors - An object containing field errors.\n * @returns The highest priority form error or null if no errors are found.\n */\n private getHighestPriorityError(\n errorKeys: string[] = [],\n fieldErrors: IAbstractFormBaseFieldError = {},\n ): IAbstractFormBaseHighPriorityFormError | null {\n if (errorKeys.length && Object.keys(fieldErrors).length) {\n const errors = errorKeys.map((errorType: string) => {\n return {\n ...fieldErrors[errorType],\n type: errorType,\n };\n });\n\n const sortedErrors = [...errors].sort((a, b) => a.priority - b.priority);\n\n return sortedErrors[0];\n }\n return null;\n }\n\n /**\n * Retrieves the details of the highest priority form error for a given control path.\n * @param controlPath - The path to the control in the form.\n * @returns The details of the highest priority form error, or null if there are no errors.\n */\n private getFieldErrorDetails(controlPath: (string | number)[]): IAbstractFormBaseHighPriorityFormError | null {\n // Get the control\n const control = this.form.get(controlPath);\n\n // If we have errors\n const controlErrors = control?.errors;\n\n if (controlErrors) {\n /// Get all the error keys\n // Use Array.prototype.at for clarity when accessing the last segment of the control path\n const controlKey = controlPath.at(-1);\n const errorKeys = Object.keys(controlErrors) || [];\n const fieldErrors = controlKey === undefined ? {} : this.fieldErrors[controlKey] || {};\n\n if (errorKeys.length && Object.keys(fieldErrors).length) {\n return this.getHighestPriorityError(errorKeys, fieldErrors);\n }\n }\n return null;\n }\n\n /**\n * Retrieves all form errors from the provided form and its nested form groups.\n *\n * @param form - The form group to retrieve errors from.\n * @param controlPath - An optional array representing the path to the current control within the form group.\n * @returns An array of form errors, each containing the field ID, error message, priority, and type.\n */\n private getFormErrors(form: FormGroup, controlPath: (string | number)[] = []): IAbstractFormBaseFormError[] {\n // recursively get all errors from all controls in the form including nested form group controls\n const formControls = form.controls;\n\n const errorSummary = Object.keys(formControls)\n .filter((controlName) => formControls[controlName].invalid)\n .flatMap((controlName) => {\n const control = formControls[controlName];\n\n if (control instanceof FormRecord) {\n // We only support FormControls in FormRecords\n const recordFieldErrorDetails = this.getFieldErrorDetails([...controlPath, controlName]);\n\n return {\n fieldId: controlName,\n message: recordFieldErrorDetails?.message ?? null,\n priority: recordFieldErrorDetails?.priority ?? 999999999,\n type: recordFieldErrorDetails?.type ?? null,\n };\n }\n\n if (control instanceof FormGroup) {\n return this.getFormErrors(control, [...controlPath, controlName]);\n }\n\n if (control instanceof FormArray) {\n return control.controls.flatMap((controlItem, index) => {\n // We only support FormGroups in FormArrays\n if (controlItem instanceof FormGroup) {\n return this.getFormErrors(controlItem, [...controlPath, controlName, index]);\n }\n return [];\n });\n }\n\n const getFieldErrorDetails = this.getFieldErrorDetails([...controlPath, controlName]);\n\n // Return the error summary entry\n // If we don't have the error details, return a null message\n return {\n fieldId: controlName,\n message: getFieldErrorDetails?.message ?? null,\n priority: getFieldErrorDetails?.priority ?? 999999999,\n type: getFieldErrorDetails?.type ?? null,\n };\n });\n\n // Remove any null errors\n return errorSummary.filter((item) => item?.message !== null);\n }\n\n /**\n * Sets the error messages for the form controls and error summary based on the provided form errors.\n * @param formErrors - An array of form errors containing field IDs and error messages.\n */\n private setErrorMessages(formErrors: IAbstractFormBaseFormError[]) {\n // Reset the form error messages\n this.formControlErrorMessages = {};\n this.formErrorSummaryMessage = [];\n\n // Set the form error messages based on the error summary entries\n for (const entry of formErrors) {\n this.formControlErrorMessages[entry.fieldId] = entry.message;\n this.formErrorSummaryMessage.push({ fieldId: entry.fieldId, message: entry.message });\n }\n }\n\n /**\n * Gets the indexes of the date fields to remove based on the form error summary message.\n * @returns An array of indexes representing the date fields to remove.\n */\n private getDateFieldsToRemoveIndexes(): number[] {\n const indexesToRemove: number[] = [];\n // The order of the field ids is important\n // this is the order in which we want to remove them\n const foundIndexes = this.getFormErrorSummaryIndex(\n ['dayOfMonth', 'monthOfYear', 'year'],\n this.formErrorSummaryMessage,\n );\n\n // Determine which indexes to remove based on the found fields\n switch (foundIndexes.length) {\n case 3:\n // All three date fields are present\n indexesToRemove.push(foundIndexes[1], foundIndexes[2]);\n break;\n case 2:\n // Two date fields are present\n indexesToRemove.push(foundIndexes[1]);\n break;\n }\n\n return indexesToRemove;\n }\n\n /**\n * Returns an array of indices corresponding to the positions of the given field IDs in the form error summary message array.\n *\n * @param fieldIds - An array of field IDs to search for in the form error summary message array.\n * @param formErrorSummaryMessage - An array of form error summary messages.\n * @returns An array of indices corresponding to the positions of the field IDs in the form error summary message array.\n */\n private getFormErrorSummaryIndex(\n fieldIds: string[],\n formErrorSummaryMessage: IAbstractFormBaseFormErrorSummaryMessage[],\n ): number[] {\n return fieldIds.reduce((acc: number[], field) => {\n const index = formErrorSummaryMessage.findIndex((error) => error.fieldId === field);\n if (index === -1) {\n return acc;\n }\n return [...acc, index];\n }, []);\n }\n\n /**\n * Removes error summary messages from the given array based on the specified indexes.\n *\n * @param formErrorSummaryMessage - The array of error summary messages.\n * @param indexes - The indexes of the error summary messages to be removed.\n * @returns The updated array of error summary messages.\n */\n private removeErrorSummaryMessages(\n formErrorSummaryMessage: IAbstractFormBaseFormErrorSummaryMessage[],\n indexes: number[],\n ): IAbstractFormBaseFormErrorSummaryMessage[] {\n return formErrorSummaryMessage.filter((_, index) => !indexes.includes(index));\n }\n\n /**\n * Splits the form errors into two arrays based on the provided field IDs.\n * Errors with field IDs included in the fieldIds array will be moved to the removedFormErrors array,\n * while the remaining errors will be moved to the cleanFormErrors array.\n *\n * @param fieldIds - An array of field IDs to filter the form errors.\n * @param formErrors - An array of form errors to be split.\n * @returns An array containing two arrays: cleanFormErrors and removedFormErrors.\n */\n private splitFormErrors(\n fieldIds: string[],\n formErrors: IAbstractFormBaseFormError[],\n ): IAbstractFormBaseFormError[][] {\n const cleanFormErrors: IAbstractFormBaseFormError[] = [];\n const removedFormErrors: IAbstractFormBaseFormError[] = [];\n\n for (const error of formErrors) {\n if (fieldIds.includes(error.fieldId)) {\n removedFormErrors.push(error);\n } else {\n cleanFormErrors.push(error);\n }\n }\n\n return [cleanFormErrors, removedFormErrors];\n }\n\n /**\n * Manipulates the error message for specific fields in the formErrors array.\n * @param fields - An array of field IDs to target for error message manipulation.\n * @param messageOverride - The new error message to be used for the targeted fields.\n * @param errorType - The type of error to match for the targeted fields.\n * @param formErrors - An array of IFormError objects representing the form errors.\n * @returns An array of IFormError objects with the manipulated error messages.\n */\n private manipulateFormErrorMessage(\n fields: string[],\n messageOverride: string,\n errorType: string,\n formErrors: IAbstractFormBaseFormError[],\n ): IAbstractFormBaseFormError[] {\n const manipulatedFields: IAbstractFormBaseFormError[] = [];\n for (const field of formErrors) {\n if (fields.includes(field.fieldId)) {\n if (field.type === errorType) {\n manipulatedFields.push({ ...field, message: messageOverride });\n } else {\n manipulatedFields.push(field);\n }\n continue;\n }\n manipulatedFields.push(field);\n }\n\n return manipulatedFields;\n }\n\n /**\n * Retrieves the form errors with the highest priority.\n *\n * @param formErrors - An array of form errors.\n * @returns An array of form errors with the highest priority.\n */\n private getHighPriorityFormErrors(formErrors: IAbstractFormBaseFormError[]): IAbstractFormBaseFormError[] {\n // Get the lowest priority (1 is the highest priority, 3 is the lowest priority)\n const lowestPriority = Math.min(...formErrors.map((item) => item.priority));\n return formErrors.filter((item) => item.priority === lowestPriority);\n }\n\n /**\n * Focuses on the error summary element and scrolls to the top of the page.\n *\n * This method first triggers change detection to ensure the view is up-to-date.\n * It then selects the error summary element with the class 'govuk-error-summary'.\n * If the error summary element is found, it sets focus on it without scrolling the page.\n * Finally, it calls a utility service to scroll to the top of the page.\n *\n * @private\n */\n private focusAndScrollToErrorSummary(): void {\n this.changeDetectorRef.detectChanges();\n\n const errorSummary = document.querySelector('.govuk-error-summary') as HTMLElement;\n if (errorSummary) {\n errorSummary.focus({ preventScroll: true });\n this.utilsService.scrollToTop();\n }\n }\n\n /**\n * Setup listener for the form value changes and to emit hasUnsavedChanges\n */\n private setupListener(): void {\n this.form.valueChanges.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {\n this.unsavedChanges.emit(this.hasUnsavedChanges());\n });\n }\n\n /**\n * Adds controls to a form group.\n *\n * @param formGroup - The form group to add controls to.\n * @param controls - An array of form array control validations.\n * @param index - The index of the form array control.\n */\n protected addControlsToFormGroup(\n formGroup: FormGroup,\n controls: IAbstractFormArrayControlValidation[],\n index: number,\n ): void {\n for (const { controlName, validators } of controls) {\n formGroup.addControl(`${controlName}_${index}`, new FormControl(null, validators));\n }\n }\n\n /**\n * Creates a form control with the specified validators and initial value.\n *\n * @param validators - An array of validator functions.\n * @param initialValue - The initial value for the form control. Defaults to null.\n * @returns The created form control.\n */\n protected createFormControl(validators: ValidatorFn[], initialValue: string | null = null): FormControl {\n return new FormControl(initialValue, { validators: [...validators] });\n }\n\n /**\n * Handles the error messages and populates the relevant variables\n */\n protected handleErrorMessages(): void {\n this.formErrors = this.getFormErrors(this.form);\n\n this.setErrorMessages(this.formErrors);\n\n this.formErrorSummaryMessage = this.removeErrorSummaryMessages(\n this.formErrorSummaryMessage,\n this.getDateFieldsToRemoveIndexes(),\n );\n }\n\n /**\n * Checks whether the form has been touched and submitted\n *\n * @returns boolean\n */\n protected hasUnsavedChanges(): boolean {\n return this.form.dirty && !this.formSubmitted;\n }\n\n /**\n * Sets the value of a form control specified by its path and marks it as touched.\n *\n * @param value - The value to set for the form control.\n * @param controlPath - The dot-delimited path to the form control within the form group.\n */\n protected setInputValue(value: string, controlPath: string): void {\n const control = this.form.get(controlPath);\n if (control) {\n control.patchValue(value);\n control.markAsTouched();\n }\n }\n\n /**\n * Handles the form errors for the date input fields.\n * @param formErrors - An array of form errors.\n * @returns An array of form errors with the manipulated error messages.\n */\n protected handleDateInputFormErrors() {\n const dateInputFields = ['dayOfMonth', 'monthOfYear', 'year'];\n const splitFormErrors = this.splitFormErrors(dateInputFields, this.formErrors);\n const highPriorityDateControlErrors = this.getHighPriorityFormErrors(splitFormErrors[1]);\n let manipulatedFormErrors: IAbstractFormBaseFormError[] = highPriorityDateControlErrors;\n\n // If we have more than one error then we want to manipulate the error message\n if (highPriorityDateControlErrors.length > 1) {\n manipulatedFormErrors = this.manipulateFormErrorMessage(\n dateInputFields,\n 'Please enter a DOB',\n 'required',\n manipulatedFormErrors,\n );\n }\n\n return [...splitFormErrors[0], ...manipulatedFormErrors];\n }\n\n /**\n * Sets the initial error messages for the form controls.\n *\n * @param form - The FormGroup instance.\n */\n protected setInitialErrorMessages(): void {\n const formControls = this.form.controls;\n const initialFormControlErrorMessages: IAbstractFormControlErrorMessage = {};\n\n for (const controlName of Object.keys(formControls)) {\n initialFormControlErrorMessages[controlName] = null;\n }\n\n this.formControlErrorMessages = initialFormControlErrorMessages;\n this.formErrorSummaryMessage = [];\n }\n\n /**\n * Repopulates the search form with the data from the account enquiry search.\n * @param state - The state object containing the search form data.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected rePopulateForm(state: any): void {\n this.form.patchValue(state);\n }\n\n /**\n * Adds a new form control to the form group.\n *\n * @param controlName - The name of the control to add.\n * @param validators - An array of validators to apply to the control.\n */\n protected createControl(controlName: string, validators: ValidatorFn[]): void {\n this.form.addControl(controlName, new FormControl(null, validators));\n }\n\n /**\n * Updates the validators of an existing form control.\n *\n * @param controlName - The name of the control to update.\n * @param validators - An array of validators to apply to the control.\n */\n protected updateControl(controlName: string, validators: ValidatorFn[]): void {\n const control = this.form.get(controlName);\n if (control) {\n control.setValidators(validators);\n control.updateValueAndValidity();\n } else {\n this.createControl(controlName, validators);\n }\n }\n\n /**\n * Removes a control from the form.\n *\n * @param controlName - The name of the control to remove.\n */\n protected removeControl(controlName: string): void {\n if (this.formControlErrorMessages[controlName]) {\n this.removeControlErrors(controlName);\n }\n this.form.removeControl(controlName);\n }\n\n /**\n * Removes the error message associated with the specified control name from the formControlErrorMessages object.\n *\n * @param controlName - The name of the control for which to remove the error message.\n */\n protected removeControlErrors(controlName: string): void {\n delete this.formControlErrorMessages[controlName];\n }\n\n /**\n * Clears all error messages from the form.\n */\n protected clearAllErrorMessages(): void {\n this.formControlErrorMessages = {};\n this.formErrorSummaryMessage = [];\n this.formErrors = [];\n this.form.updateValueAndValidity({ onlySelf: false, emitEvent: false });\n }\n\n /**\n * Create a plain object from a FormRecord of FormControls.\n *\n * What it does: copies each control's current value onto a plain object.\n * When to use: when you need the raw values from a FormRecord (e.g. to send to an API).\n *\n * Example\n * -------\n * // record: FormRecord<FormControl<string | null>> with a single control 'firstName'\n * const out = this.objectFromFormRecord(record, {\n * mapKey: k => k, // optional (defaults to identity)\n * mapValue: v => v ?? '' // turn null/undefined into ''\n * });\n * // out -> { firstName: '' }\n *\n * @typeParam T - Control value type.\n * @typeParam U - Output value type (defaults to T).\n * @typeParam K - Output key type (defaults to string). Control names are strings; provide `mapKey` if you need numbers.\n */\n protected objectFromFormRecord<T, U = T, K extends string | number = string>(\n controlRecord: FormRecord<FormControl<T | null | undefined>>,\n options?: {\n mapKey?: (key: string) => K;\n mapValue?: (value: T | null | undefined) => U;\n },\n ): Record<K, U> {\n const mapKey = options?.mapKey ?? ((k: string) => k as unknown as K);\n const mapValue = options?.mapValue ?? ((v: T | null | undefined) => v as unknown as U);\n\n const result = {} as Record<K, U>;\n\n for (const [name, control] of Object.entries(controlRecord.controls)) {\n result[mapKey(name)] = mapValue(control.value);\n }\n\n return result;\n }\n\n /**\n * Patch a FormRecord of FormControls from a plain object.\n *\n * What it does: for each entry in `values`, finds the matching control by name\n * (optionally mapped via `mapKey`) and sets its value **only if** it changes.\n * When to use: when you need to patch many controls at once, without\n * triggering extra updates for unchanged values.\n *\n * Example\n * -------\n * // controlRecord: FormRecord<FormControl<string>> with controls 'firstName', 'lastName'\n * this.patchFormRecordFromObject(controlRecord, { firstName: 'Ada', lastName: 'Lovelace' }, {\n * emitEvent: true,\n * isEqual: (a, b) => a === b,\n * // mapKey: k => `ctrl_${k as string}` // optional: map incoming keys to control names\n * });\n *\n * @typeParam T - Control value type.\n * @typeParam K - Keys present in the `values` object (string or number).\n */\n protected patchFormRecordFromObject<T, K extends string | number = string>(\n controlRecord: FormRecord<FormControl<T>>,\n values: Record<K, T>,\n options?: {\n emitEvent?: boolean;\n /** How provided keys map to control names (defaults to String(key)). */\n mapKey?: (key: K) => string;\n /** Equality check used to avoid unnecessary writes (defaults to Object.is). */\n isEqual?: (a: T, b: T) => boolean;\n },\n ): void {\n const emitEvent = options?.emitEvent ?? false;\n const mapKey = options?.mapKey ?? String;\n const isEqual = options?.isEqual ?? Object.is;\n\n for (const [k, v] of Object.entries(values) as [K, T][]) {\n const controlName = mapKey(k);\n const ctrl = controlRecord.get(controlName) as FormControl<T> | null;\n if (!ctrl) {\n // If the control isn't present, skip silently. Callers can validate separately.\n continue;\n }\n if (!isEqual(ctrl.value, v)) {\n ctrl.setValue(v, { emitEvent });\n }\n }\n }\n\n /**\n * Clears the search form.\n */\n public handleClearForm(): void {\n this.form.reset();\n }\n\n /**\n * Handles the scroll of the component error from the summary\n *\n * @param fieldId - Field id of the component\n */\n public scrollTo(fieldId: string): void {\n this['scroll'](fieldId);\n }\n\n /**\n * Handles route with the supplied route\n *\n * @param route string of route\n * @param nonRelative boolean indicating if route is relative to the parent\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public handleRoute(route: string, nonRelative: boolean = false, event?: Event, routeData?: any): void {\n if (event) {\n event.preventDefault();\n }\n\n this.unsavedChanges.emit(this.hasUnsavedChanges());\n\n const navigationExtras = {\n ...(nonRelative ? {} : { relativeTo: this.activatedRoute.parent }),\n ...(routeData === undefined ? {} : { state: routeData }),\n };\n\n this.router.navigate([route], navigationExtras);\n }\n\n /**\n * Handles the form submission event.\n *\n * @param event - The form submission event.\n * @returns void\n */\n public handleFormSubmit(event: SubmitEvent): void {\n this.handleErrorMessages();\n\n if (this.form.valid) {\n this.formSubmitted = true;\n const nestedFlow = event.submitter ? event.submitter.className.includes('nested-flow') : false;\n this.unsavedChanges.emit(this.hasUnsavedChanges());\n this.formSubmit.emit({ formData: this.form.value, nestedFlow: nestedFlow });\n } else {\n this.focusAndScrollToErrorSummary();\n }\n }\n\n /**\n * Handles the input event to convert all letters in the input value to uppercase.\n * This method is triggered by an input event and modifies the input value directly.\n *\n * @param event - The input event triggered by the user.\n */\n public handleUppercaseInputMask(event: Event): void {\n const input = event.target as HTMLInputElement;\n input.value = this.utilsService.upperCaseAllLetters(input.value);\n }\n\n public ngOnInit(): void {\n if (this.form) {\n this.setupListener();\n }\n }\n\n public ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -14,14 +14,16 @@ class AbstractFormParentBaseComponent {
14
14
  * @param event - (Optional) The event object, typically from a click event, to prevent its default behavior.
15
15
  * @param routeData - (Optional) Additional data to pass to the target route's state.
16
16
  */
17
+ routerNavigate(route, nonRelative = false, event,
17
18
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
- routerNavigate(route, nonRelative = false, event, routeData) {
19
+ routeData, fragment) {
19
20
  if (event) {
20
21
  event.preventDefault();
21
22
  }
22
23
  const navigationExtras = {
23
24
  ...(nonRelative ? {} : { relativeTo: this.activatedRoute.parent }),
24
25
  ...(routeData ? { state: routeData } : {}),
26
+ ...(fragment ? { fragment } : {}),
25
27
  };
26
28
  this.router.navigate([route], navigationExtras);
27
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hmcts-opal-frontend-common-components-abstract-abstract-form-parent-base.mjs","sources":["../../../projects/opal-frontend-common/components/abstract/abstract-form-parent-base/abstract-form-parent-base.component.ts","../../../projects/opal-frontend-common/components/abstract/abstract-form-parent-base/hmcts-opal-frontend-common-components-abstract-abstract-form-parent-base.ts"],"sourcesContent":["import { inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { CanDeactivateTypes } from '@hmcts/opal-frontend-common/guards/can-deactivate/types';\n\nexport abstract class AbstractFormParentBaseComponent {\n private readonly router = inject(Router);\n private readonly activatedRoute = inject(ActivatedRoute);\n\n public stateUnsavedChanges!: boolean;\n\n /**\n * Navigates to a specified route using the Angular Router.\n *\n * @param route - The target route to navigate to.\n * @param nonRelative - A boolean indicating whether the navigation should be absolute (true)\n * or relative to the current route (false). Defaults to false.\n * @param event - (Optional) The event object, typically from a click event, to prevent its default behavior.\n * @param routeData - (Optional) Additional data to pass to the target route's state.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected routerNavigate(route: string, nonRelative: boolean = false, event?: Event, routeData?: any): void {\n if (event) {\n event.preventDefault();\n }\n\n const navigationExtras = {\n ...(nonRelative ? {} : { relativeTo: this.activatedRoute.parent }),\n ...(routeData ? { state: routeData } : {}),\n };\n\n this.router.navigate([route], navigationExtras);\n }\n\n /**\n * Checks if an object has any non-empty values.\n *\n * @param form - The object representing form data with key-value pairs.\n * @returns A boolean indicating whether the object has any non-empty values.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected hasFormValues(form: { [key: string]: any }): boolean {\n return Object.values(form).some(Boolean);\n }\n\n /**\n * If the user navigates externally from the site or closes the tab\n * Check if there is unsaved changes form state -> warning message\n * Otherwise -> no warning message\n *\n * @returns boolean\n */\n protected canDeactivate(): CanDeactivateTypes {\n if (this.stateUnsavedChanges) {\n return false;\n } else {\n return true;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MAIsB,+BAA+B,CAAA;AAClC,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAEjD,IAAA,mBAAmB;AAE1B;;;;;;;;AAQG;;IAEO,cAAc,CAAC,KAAa,EAAE,WAAA,GAAuB,KAAK,EAAE,KAAa,EAAE,SAAe,EAAA;QAClG,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,cAAc,EAAE;QACxB;AAEA,QAAA,MAAM,gBAAgB,GAAG;AACvB,YAAA,IAAI,WAAW,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;AAClE,YAAA,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;SAC3C;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACjD;AAEA;;;;;AAKG;;AAEO,IAAA,aAAa,CAAC,IAA4B,EAAA;QAClD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IAC1C;AAEA;;;;;;AAMG;IACO,aAAa,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,OAAO,KAAK;QACd;aAAO;AACL,YAAA,OAAO,IAAI;QACb;IACF;AACD;;AC1DD;;AAEG;;;;"}
1
+ {"version":3,"file":"hmcts-opal-frontend-common-components-abstract-abstract-form-parent-base.mjs","sources":["../../../projects/opal-frontend-common/components/abstract/abstract-form-parent-base/abstract-form-parent-base.component.ts","../../../projects/opal-frontend-common/components/abstract/abstract-form-parent-base/hmcts-opal-frontend-common-components-abstract-abstract-form-parent-base.ts"],"sourcesContent":["import { inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { CanDeactivateTypes } from '@hmcts/opal-frontend-common/guards/can-deactivate/types';\n\nexport abstract class AbstractFormParentBaseComponent {\n private readonly router = inject(Router);\n private readonly activatedRoute = inject(ActivatedRoute);\n\n public stateUnsavedChanges!: boolean;\n\n /**\n * Navigates to a specified route using the Angular Router.\n *\n * @param route - The target route to navigate to.\n * @param nonRelative - A boolean indicating whether the navigation should be absolute (true)\n * or relative to the current route (false). Defaults to false.\n * @param event - (Optional) The event object, typically from a click event, to prevent its default behavior.\n * @param routeData - (Optional) Additional data to pass to the target route's state.\n */\n protected routerNavigate(\n route: string,\n nonRelative: boolean = false,\n event?: Event,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n routeData?: any,\n fragment?: string,\n ): void {\n if (event) {\n event.preventDefault();\n }\n\n const navigationExtras = {\n ...(nonRelative ? {} : { relativeTo: this.activatedRoute.parent }),\n ...(routeData ? { state: routeData } : {}),\n ...(fragment ? { fragment } : {}),\n };\n\n this.router.navigate([route], navigationExtras);\n }\n\n /**\n * Checks if an object has any non-empty values.\n *\n * @param form - The object representing form data with key-value pairs.\n * @returns A boolean indicating whether the object has any non-empty values.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected hasFormValues(form: { [key: string]: any }): boolean {\n return Object.values(form).some(Boolean);\n }\n\n /**\n * If the user navigates externally from the site or closes the tab\n * Check if there is unsaved changes form state -> warning message\n * Otherwise -> no warning message\n *\n * @returns boolean\n */\n protected canDeactivate(): CanDeactivateTypes {\n if (this.stateUnsavedChanges) {\n return false;\n } else {\n return true;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MAIsB,+BAA+B,CAAA;AAClC,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAEjD,IAAA,mBAAmB;AAE1B;;;;;;;;AAQG;AACO,IAAA,cAAc,CACtB,KAAa,EACb,WAAA,GAAuB,KAAK,EAC5B,KAAa;;AAEb,IAAA,SAAe,EACf,QAAiB,EAAA;QAEjB,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,cAAc,EAAE;QACxB;AAEA,QAAA,MAAM,gBAAgB,GAAG;AACvB,YAAA,IAAI,WAAW,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;AAClE,YAAA,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAC1C,YAAA,IAAI,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;SAClC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACjD;AAEA;;;;;AAKG;;AAEO,IAAA,aAAa,CAAC,IAA4B,EAAA;QAClD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IAC1C;AAEA;;;;;;AAMG;IACO,aAAa,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,OAAO,KAAK;QACd;aAAO;AACL,YAAA,OAAO,IAAI;QACb;IACF;AACD;;ACjED;;AAEG;;;;"}
@@ -125,10 +125,10 @@ class AbstractNestedFormBaseComponent extends AbstractFormBaseComponent {
125
125
  }
126
126
  super.ngOnDestroy();
127
127
  }
128
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractNestedFormBaseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
129
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: AbstractNestedFormBaseComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
128
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractNestedFormBaseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
129
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: AbstractNestedFormBaseComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
130
130
  }
131
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractNestedFormBaseComponent, decorators: [{
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractNestedFormBaseComponent, decorators: [{
132
132
  type: Component,
133
133
  args: [{
134
134
  template: '',
@@ -61,10 +61,10 @@ class AbstractSortableTablePaginationComponent extends AbstractSortableTableComp
61
61
  const totalPages = Math.ceil(this.displayTableDataSignal().length / this.itemsPerPageSignal());
62
62
  this.currentPageSignal.set(Math.max(1, Math.min(newPage, totalPages)));
63
63
  }
64
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractSortableTablePaginationComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
65
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: AbstractSortableTablePaginationComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
64
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractSortableTablePaginationComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
65
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: AbstractSortableTablePaginationComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
66
66
  }
67
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractSortableTablePaginationComponent, decorators: [{
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractSortableTablePaginationComponent, decorators: [{
68
68
  type: Component,
69
69
  args: [{
70
70
  template: '',
@@ -185,10 +185,10 @@ class AbstractSortableTableComponent extends AbstractTableFilterComponent {
185
185
  this.onSortChange({ key, sortType });
186
186
  }
187
187
  }
188
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractSortableTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
189
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: AbstractSortableTableComponent, isStandalone: true, selector: "ng-component", outputs: { abstractSortState: "abstractSortState" }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
188
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractSortableTableComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
189
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: AbstractSortableTableComponent, isStandalone: true, selector: "ng-component", outputs: { abstractSortState: "abstractSortState" }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
190
190
  }
191
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractSortableTableComponent, decorators: [{
191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractSortableTableComponent, decorators: [{
192
192
  type: Component,
193
193
  args: [{
194
194
  template: '',
@@ -1 +1 @@
1
- {"version":3,"file":"hmcts-opal-frontend-common-components-abstract-abstract-sortable-table.mjs","sources":["../../../projects/opal-frontend-common/components/abstract/abstract-sortable-table/abstract-sortable-table.component.ts","../../../projects/opal-frontend-common/components/abstract/abstract-sortable-table/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table.ts"],"sourcesContent":["import { Component, EventEmitter, OnInit, Output, effect, inject, signal } from '@angular/core';\nimport {\n IAbstractSortState,\n IAbstractTableData,\n} from '@hmcts/opal-frontend-common/components/abstract/abstract-sortable-table/interfaces';\nimport { SortService } from '@hmcts/opal-frontend-common/services/sort-service';\nimport {\n SortableValuesType,\n SortDirectionType,\n} from '@hmcts/opal-frontend-common/components/abstract/abstract-sortable-table/types';\nimport { AbstractTableFilterComponent } from '@hmcts/opal-frontend-common/components/abstract/abstract-table-filter';\n\n@Component({\n template: '',\n})\nexport abstract class AbstractSortableTableComponent extends AbstractTableFilterComponent implements OnInit {\n private readonly sortService = inject(SortService);\n\n /**\n * Synchronizes the sorted table data with the current filter and sort state.\n *\n * This effect observes changes to the filtered table data and the sort state signals.\n * If no active sort key is found (i.e., no sorting is applied), it sets the sorted table data\n * to a shallow copy of the filtered data. Otherwise, sorting logic should be applied elsewhere.\n *\n * @protected\n */\n protected syncSortedDataEffect = effect(() => {\n const filtered = this.filteredTableDataSignal();\n const currentSort = this.sortStateSignal();\n\n const activeSortKey = Object.keys(currentSort).find((k) => currentSort[k] !== 'none');\n\n if (!activeSortKey) {\n // No sort applied – use filtered data directly\n this.sortedTableDataSignal.set([...filtered]);\n }\n });\n\n public override displayTableDataSignal = signal<IAbstractTableData<SortableValuesType>[]>([]);\n public override filteredTableDataSignal = signal<IAbstractTableData<SortableValuesType>[]>([]);\n public sortedTableDataSignal = signal<IAbstractTableData<SortableValuesType>[]>([]);\n public abstractExistingSortState: IAbstractSortState | null = null;\n public sortStateSignal = signal<IAbstractSortState>({});\n public sortedColumnTitleSignal = signal<string>('');\n public sortedColumnDirectionSignal = signal<SortDirectionType>('none');\n\n @Output() abstractSortState = new EventEmitter<IAbstractSortState>();\n\n /**\n * Creates an initial sort state for a table based on the provided table data.\n *\n * @param tableData - Array of table data objects representing table rows.\n * @returns Initial sort state object with column names as keys and 'none' as values.\n */\n private createSortState(tableData: IAbstractTableData<SortableValuesType>[] | null): IAbstractSortState {\n return tableData?.length\n ? Object.keys(tableData[0]).reduce<IAbstractSortState>((state, key) => {\n state[key] = 'none';\n return state;\n }, {})\n : {};\n }\n /**\n * Initializes the sort state for the sortable table component.\n *\n * This method sets the initial sort state based on the existing sort state or creates a new one\n * if none exists. It then updates the sort state signal with the initial sort state.\n *\n * If an existing sort state is found, it iterates over each entry and triggers the sort change\n * for each key that has a sort type other than 'none'.\n *\n * @private\n * @returns {void}\n */\n private initialiseSortState(): void {\n const existingSortState = this.abstractExistingSortState;\n const initialSortState = existingSortState || this.createSortState(this.displayTableDataSignal());\n this.applyFilterState();\n\n this.sortStateSignal.set(initialSortState);\n\n if (existingSortState) {\n for (const [key, sortType] of Object.entries(existingSortState)) {\n if (sortType !== 'none') {\n this.onSortChange({ key, sortType });\n }\n }\n }\n this.getSortedColumn();\n }\n\n /**\n * Updates the sort state for a given column key and sort type.\n * Resets the sort state for all other columns to 'none'.\n *\n * @param key - The column to sort by.\n * @param sortType - Sorting order ('ascending' or 'descending').\n */\n private updateSortState(key: string, sortType: 'ascending' | 'descending'): void {\n this.sortStateSignal.set(\n Object.keys(this.sortStateSignal()).reduce<IAbstractSortState>((state, columnKey) => {\n state[columnKey] = columnKey === key ? sortType : 'none';\n return state;\n }, {}),\n );\n }\n\n /**\n * Retrieves the sorted table data based on the specified key and sort type.\n *\n * @param key - The key of the property to sort by.\n * @param sortType - The type of sorting to apply, either 'ascending' or 'descending'.\n * @returns An array of sorted table data objects.\n */\n private getSortedTableData(\n key: string,\n sortType: 'ascending' | 'descending',\n ): IAbstractTableData<SortableValuesType>[] {\n return sortType === 'ascending'\n ? (this.sortService.sortObjectArrayAsc(\n this.filteredTableDataSignal(),\n key,\n ) as IAbstractTableData<SortableValuesType>[])\n : (this.sortService.sortObjectArrayDesc(\n this.filteredTableDataSignal(),\n key,\n ) as IAbstractTableData<SortableValuesType>[]);\n }\n\n /**\n * Determines the first column with a sort state other than 'none' and updates the sorted column signals accordingly.\n *\n * - If a sorted column is found, updates the `sortedColumnTitleSignal` and `sortedColumnDirectionSignal` with the column key and state.\n * - If no sorted column is found, sets the `sortedColumnTitleSignal` to an empty string and `sortedColumnDirectionSignal` to 'none'.\n *\n * @private\n * @returns {void}\n */\n private getSortedColumn(): void {\n // Find the first column that has a sort state other than 'none'\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const sortedColumn = Object.entries(this.sortStateSignal()).find(([_, state]) => state !== 'none');\n\n // If a sorted column is found, set the signal to the sorted column key and state\n if (sortedColumn) {\n const [columnKey, state] = sortedColumn;\n this.sortedColumnTitleSignal.set(columnKey);\n this.sortedColumnDirectionSignal.set(state);\n } else {\n // Otherwise, set the signal to null\n this.sortedColumnTitleSignal.set('');\n this.sortedColumnDirectionSignal.set('none');\n }\n }\n\n /**\n * Handles the change in sorting for the table.\n *\n * @param event - An object containing the key to sort by and the sort type.\n * @param event.key - The key of the column to sort.\n * @param event.sortType - The type of sorting to apply ('ascending' or 'descending').\n *\n * This method updates the sort state, sorts the table data based on the provided key and sort type,\n * updates the table data signal, and emits the updated sort state.\n */\n protected onSortChange(event: { key: string; sortType: 'ascending' | 'descending' }): void {\n const { key, sortType } = event;\n\n this.updateSortState(key, sortType);\n this.getSortedColumn();\n const sortedData = this.getSortedTableData(key, sortType);\n\n // Update the table data signal\n this.sortedTableDataSignal.set(sortedData);\n\n // Emit the updated sort state\n this.abstractSortState.emit(this.sortStateSignal());\n }\n\n /**\n * Lifecycle hook to initialise the sort state.\n */\n public ngOnInit(): void {\n this.initialiseSortState();\n }\n /**\n * Applies the current filters to the table data and updates the sorted data accordingly.\n *\n * This method overrides the parent implementation to additionally handle sorting.\n * If there is an active sort key, it applies the corresponding sort to the filtered data.\n * If no sort key is active, it simply updates the sorted data to match the filtered data.\n *\n * @override\n */\n public override onApplyFilters(): void {\n super.onApplyFilters();\n\n const key = this.sortedColumnTitleSignal();\n const sortType = this.sortedColumnDirectionSignal();\n\n if (!key || sortType === 'none') {\n this.sortedTableDataSignal.set([...this.filteredTableDataSignal()]);\n } else {\n this.onSortChange({ key, sortType });\n }\n }\n\n /**\n * Clears all filters applied to the table and restores the data to its unfiltered state.\n * If a sort is currently active, re-applies the sort after clearing filters.\n * Otherwise, resets the sorted table data to match the filtered data.\n *\n * @override\n */\n public override clearAllFilters(): void {\n super.clearAllFilters();\n\n const key = this.sortedColumnTitleSignal();\n const sortType = this.sortedColumnDirectionSignal();\n\n if (!key || sortType === 'none') {\n this.sortedTableDataSignal.set([...this.filteredTableDataSignal()]);\n } else {\n this.onSortChange({ key, sortType });\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hmcts-opal-frontend-common-components-abstract-abstract-sortable-table.mjs","sources":["../../../projects/opal-frontend-common/components/abstract/abstract-sortable-table/abstract-sortable-table.component.ts","../../../projects/opal-frontend-common/components/abstract/abstract-sortable-table/hmcts-opal-frontend-common-components-abstract-abstract-sortable-table.ts"],"sourcesContent":["import { Component, EventEmitter, OnInit, Output, effect, inject, signal } from '@angular/core';\nimport {\n IAbstractSortState,\n IAbstractTableData,\n} from '@hmcts/opal-frontend-common/components/abstract/abstract-sortable-table/interfaces';\nimport { SortService } from '@hmcts/opal-frontend-common/services/sort-service';\nimport {\n SortableValuesType,\n SortDirectionType,\n} from '@hmcts/opal-frontend-common/components/abstract/abstract-sortable-table/types';\nimport { AbstractTableFilterComponent } from '@hmcts/opal-frontend-common/components/abstract/abstract-table-filter';\n\n@Component({\n template: '',\n})\nexport abstract class AbstractSortableTableComponent extends AbstractTableFilterComponent implements OnInit {\n private readonly sortService = inject(SortService);\n\n /**\n * Synchronizes the sorted table data with the current filter and sort state.\n *\n * This effect observes changes to the filtered table data and the sort state signals.\n * If no active sort key is found (i.e., no sorting is applied), it sets the sorted table data\n * to a shallow copy of the filtered data. Otherwise, sorting logic should be applied elsewhere.\n *\n * @protected\n */\n protected syncSortedDataEffect = effect(() => {\n const filtered = this.filteredTableDataSignal();\n const currentSort = this.sortStateSignal();\n\n const activeSortKey = Object.keys(currentSort).find((k) => currentSort[k] !== 'none');\n\n if (!activeSortKey) {\n // No sort applied – use filtered data directly\n this.sortedTableDataSignal.set([...filtered]);\n }\n });\n\n public override displayTableDataSignal = signal<IAbstractTableData<SortableValuesType>[]>([]);\n public override filteredTableDataSignal = signal<IAbstractTableData<SortableValuesType>[]>([]);\n public sortedTableDataSignal = signal<IAbstractTableData<SortableValuesType>[]>([]);\n public abstractExistingSortState: IAbstractSortState | null = null;\n public sortStateSignal = signal<IAbstractSortState>({});\n public sortedColumnTitleSignal = signal<string>('');\n public sortedColumnDirectionSignal = signal<SortDirectionType>('none');\n\n @Output() abstractSortState = new EventEmitter<IAbstractSortState>();\n\n /**\n * Creates an initial sort state for a table based on the provided table data.\n *\n * @param tableData - Array of table data objects representing table rows.\n * @returns Initial sort state object with column names as keys and 'none' as values.\n */\n private createSortState(tableData: IAbstractTableData<SortableValuesType>[] | null): IAbstractSortState {\n return tableData?.length\n ? Object.keys(tableData[0]).reduce<IAbstractSortState>((state, key) => {\n state[key] = 'none';\n return state;\n }, {})\n : {};\n }\n /**\n * Initializes the sort state for the sortable table component.\n *\n * This method sets the initial sort state based on the existing sort state or creates a new one\n * if none exists. It then updates the sort state signal with the initial sort state.\n *\n * If an existing sort state is found, it iterates over each entry and triggers the sort change\n * for each key that has a sort type other than 'none'.\n *\n * @private\n * @returns {void}\n */\n private initialiseSortState(): void {\n const existingSortState = this.abstractExistingSortState;\n const initialSortState = existingSortState || this.createSortState(this.displayTableDataSignal());\n this.applyFilterState();\n\n this.sortStateSignal.set(initialSortState);\n\n if (existingSortState) {\n for (const [key, sortType] of Object.entries(existingSortState)) {\n if (sortType !== 'none') {\n this.onSortChange({ key, sortType });\n }\n }\n }\n this.getSortedColumn();\n }\n\n /**\n * Updates the sort state for a given column key and sort type.\n * Resets the sort state for all other columns to 'none'.\n *\n * @param key - The column to sort by.\n * @param sortType - Sorting order ('ascending' or 'descending').\n */\n private updateSortState(key: string, sortType: 'ascending' | 'descending'): void {\n this.sortStateSignal.set(\n Object.keys(this.sortStateSignal()).reduce<IAbstractSortState>((state, columnKey) => {\n state[columnKey] = columnKey === key ? sortType : 'none';\n return state;\n }, {}),\n );\n }\n\n /**\n * Retrieves the sorted table data based on the specified key and sort type.\n *\n * @param key - The key of the property to sort by.\n * @param sortType - The type of sorting to apply, either 'ascending' or 'descending'.\n * @returns An array of sorted table data objects.\n */\n private getSortedTableData(\n key: string,\n sortType: 'ascending' | 'descending',\n ): IAbstractTableData<SortableValuesType>[] {\n return sortType === 'ascending'\n ? (this.sortService.sortObjectArrayAsc(\n this.filteredTableDataSignal(),\n key,\n ) as IAbstractTableData<SortableValuesType>[])\n : (this.sortService.sortObjectArrayDesc(\n this.filteredTableDataSignal(),\n key,\n ) as IAbstractTableData<SortableValuesType>[]);\n }\n\n /**\n * Determines the first column with a sort state other than 'none' and updates the sorted column signals accordingly.\n *\n * - If a sorted column is found, updates the `sortedColumnTitleSignal` and `sortedColumnDirectionSignal` with the column key and state.\n * - If no sorted column is found, sets the `sortedColumnTitleSignal` to an empty string and `sortedColumnDirectionSignal` to 'none'.\n *\n * @private\n * @returns {void}\n */\n private getSortedColumn(): void {\n // Find the first column that has a sort state other than 'none'\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const sortedColumn = Object.entries(this.sortStateSignal()).find(([_, state]) => state !== 'none');\n\n // If a sorted column is found, set the signal to the sorted column key and state\n if (sortedColumn) {\n const [columnKey, state] = sortedColumn;\n this.sortedColumnTitleSignal.set(columnKey);\n this.sortedColumnDirectionSignal.set(state);\n } else {\n // Otherwise, set the signal to null\n this.sortedColumnTitleSignal.set('');\n this.sortedColumnDirectionSignal.set('none');\n }\n }\n\n /**\n * Handles the change in sorting for the table.\n *\n * @param event - An object containing the key to sort by and the sort type.\n * @param event.key - The key of the column to sort.\n * @param event.sortType - The type of sorting to apply ('ascending' or 'descending').\n *\n * This method updates the sort state, sorts the table data based on the provided key and sort type,\n * updates the table data signal, and emits the updated sort state.\n */\n protected onSortChange(event: { key: string; sortType: 'ascending' | 'descending' }): void {\n const { key, sortType } = event;\n\n this.updateSortState(key, sortType);\n this.getSortedColumn();\n const sortedData = this.getSortedTableData(key, sortType);\n\n // Update the table data signal\n this.sortedTableDataSignal.set(sortedData);\n\n // Emit the updated sort state\n this.abstractSortState.emit(this.sortStateSignal());\n }\n\n /**\n * Lifecycle hook to initialise the sort state.\n */\n public ngOnInit(): void {\n this.initialiseSortState();\n }\n /**\n * Applies the current filters to the table data and updates the sorted data accordingly.\n *\n * This method overrides the parent implementation to additionally handle sorting.\n * If there is an active sort key, it applies the corresponding sort to the filtered data.\n * If no sort key is active, it simply updates the sorted data to match the filtered data.\n *\n * @override\n */\n public override onApplyFilters(): void {\n super.onApplyFilters();\n\n const key = this.sortedColumnTitleSignal();\n const sortType = this.sortedColumnDirectionSignal();\n\n if (!key || sortType === 'none') {\n this.sortedTableDataSignal.set([...this.filteredTableDataSignal()]);\n } else {\n this.onSortChange({ key, sortType });\n }\n }\n\n /**\n * Clears all filters applied to the table and restores the data to its unfiltered state.\n * If a sort is currently active, re-applies the sort after clearing filters.\n * Otherwise, resets the sorted table data to match the filtered data.\n *\n * @override\n */\n public override clearAllFilters(): void {\n super.clearAllFilters();\n\n const key = this.sortedColumnTitleSignal();\n const sortType = this.sortedColumnDirectionSignal();\n\n if (!key || sortType === 'none') {\n this.sortedTableDataSignal.set([...this.filteredTableDataSignal()]);\n } else {\n this.onSortChange({ key, sortType });\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -168,10 +168,10 @@ class AbstractTableFilterComponent {
168
168
  this.appliedKeyword.set(keyword);
169
169
  this.applyFilterState();
170
170
  }
171
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractTableFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
172
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: AbstractTableFilterComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: '', isInline: true });
171
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractTableFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
172
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: AbstractTableFilterComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: '', isInline: true });
173
173
  }
174
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: AbstractTableFilterComponent, decorators: [{
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AbstractTableFilterComponent, decorators: [{
175
175
  type: Component,
176
176
  args: [{ template: '' }]
177
177
  }] });