@testgorilla/tgo-ui 8.19.0 → 9.0.0

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 (205) hide show
  1. package/components/accordion/index.d.ts +7 -7
  2. package/components/ai-audio-circle/index.d.ts +3 -3
  3. package/components/ai-caveat/index.d.ts +5 -5
  4. package/components/ai-feedback/index.d.ts +14 -14
  5. package/components/alert-banner/index.d.ts +8 -8
  6. package/components/autocomplete/index.d.ts +15 -16
  7. package/components/autocomplete-v2/index.d.ts +36 -32
  8. package/components/avatar/index.d.ts +7 -7
  9. package/components/badge/index.d.ts +6 -6
  10. package/components/breadcrumb/index.d.ts +11 -11
  11. package/components/button/index.d.ts +23 -13
  12. package/components/card/index.d.ts +4 -4
  13. package/components/checkbox/index.d.ts +24 -24
  14. package/components/core/index.d.ts +39 -31
  15. package/components/datepicker/index.d.ts +18 -18
  16. package/components/dialog/index.d.ts +29 -21
  17. package/components/divider/index.d.ts +4 -4
  18. package/components/donut-chart/index.d.ts +3 -3
  19. package/components/dropdown/index.d.ts +37 -33
  20. package/components/elevation-shadow/index.d.ts +3 -3
  21. package/components/empty-state/index.d.ts +7 -7
  22. package/components/field/index.d.ts +33 -44
  23. package/components/file-upload/index.d.ts +14 -13
  24. package/components/filter-button/index.d.ts +19 -19
  25. package/components/gaussian-chart/index.d.ts +8 -8
  26. package/components/icon/index.d.ts +20 -16
  27. package/components/icon-label/index.d.ts +5 -5
  28. package/components/inline-field/index.d.ts +20 -24
  29. package/components/logo/index.d.ts +2 -3
  30. package/components/media-dialog/index.d.ts +3 -3
  31. package/components/multi-input/index.d.ts +25 -16
  32. package/components/navbar/index.d.ts +30 -30
  33. package/components/overflow-menu/index.d.ts +20 -19
  34. package/components/page-header/index.d.ts +5 -5
  35. package/components/paginator/index.d.ts +4 -4
  36. package/components/password-criteria/index.d.ts +13 -12
  37. package/components/password-strength/index.d.ts +6 -6
  38. package/components/phone-input/index.d.ts +28 -30
  39. package/components/progress-bar/index.d.ts +5 -5
  40. package/components/prompt/index.d.ts +25 -25
  41. package/components/radial-progress/index.d.ts +5 -5
  42. package/components/radio-button/index.d.ts +28 -29
  43. package/components/rating/index.d.ts +5 -5
  44. package/components/scale/index.d.ts +4 -4
  45. package/components/segmented-bar/index.d.ts +8 -8
  46. package/components/segmented-button/index.d.ts +17 -16
  47. package/components/selectable-card/index.d.ts +6 -6
  48. package/components/side-navigation/index.d.ts +14 -14
  49. package/components/side-panel/index.d.ts +8 -8
  50. package/components/side-sheet/index.d.ts +19 -17
  51. package/components/snackbar/index.d.ts +16 -15
  52. package/components/spider-chart/index.d.ts +12 -12
  53. package/components/spinner/index.d.ts +5 -5
  54. package/components/stepper/index.d.ts +35 -35
  55. package/components/table/index.d.ts +36 -34
  56. package/components/tabs/index.d.ts +18 -17
  57. package/components/tag/index.d.ts +10 -10
  58. package/components/toggle/index.d.ts +10 -9
  59. package/components/tooltip/index.d.ts +16 -18
  60. package/components/universal-skills/index.d.ts +16 -16
  61. package/components/validation-error/index.d.ts +22 -10
  62. package/components/write-with-ai/index.d.ts +1 -1
  63. package/fesm2022/testgorilla-tgo-ui-components-accordion.mjs +36 -15
  64. package/fesm2022/testgorilla-tgo-ui-components-accordion.mjs.map +1 -1
  65. package/fesm2022/testgorilla-tgo-ui-components-ai-audio-circle.mjs +9 -12
  66. package/fesm2022/testgorilla-tgo-ui-components-ai-audio-circle.mjs.map +1 -1
  67. package/fesm2022/testgorilla-tgo-ui-components-ai-caveat.mjs +7 -10
  68. package/fesm2022/testgorilla-tgo-ui-components-ai-caveat.mjs.map +1 -1
  69. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs +39 -27
  70. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs.map +1 -1
  71. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs +25 -14
  72. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs.map +1 -1
  73. package/fesm2022/testgorilla-tgo-ui-components-audio-waveform.mjs +4 -2
  74. package/fesm2022/testgorilla-tgo-ui-components-audio-waveform.mjs.map +1 -1
  75. package/fesm2022/testgorilla-tgo-ui-components-autocomplete-v2.mjs +134 -117
  76. package/fesm2022/testgorilla-tgo-ui-components-autocomplete-v2.mjs.map +1 -1
  77. package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs +47 -48
  78. package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs.map +1 -1
  79. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs +30 -18
  80. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs.map +1 -1
  81. package/fesm2022/testgorilla-tgo-ui-components-badge.mjs +9 -12
  82. package/fesm2022/testgorilla-tgo-ui-components-badge.mjs.map +1 -1
  83. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs +25 -18
  84. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs.map +1 -1
  85. package/fesm2022/testgorilla-tgo-ui-components-button.mjs +155 -120
  86. package/fesm2022/testgorilla-tgo-ui-components-button.mjs.map +1 -1
  87. package/fesm2022/testgorilla-tgo-ui-components-card.mjs +7 -9
  88. package/fesm2022/testgorilla-tgo-ui-components-card.mjs.map +1 -1
  89. package/fesm2022/testgorilla-tgo-ui-components-checkbox.mjs +51 -47
  90. package/fesm2022/testgorilla-tgo-ui-components-checkbox.mjs.map +1 -1
  91. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs +1 -1
  92. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs.map +1 -1
  93. package/fesm2022/testgorilla-tgo-ui-components-core.mjs +2232 -2210
  94. package/fesm2022/testgorilla-tgo-ui-components-core.mjs.map +1 -1
  95. package/fesm2022/testgorilla-tgo-ui-components-datepicker.mjs +44 -25
  96. package/fesm2022/testgorilla-tgo-ui-components-datepicker.mjs.map +1 -1
  97. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs +55 -31
  98. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs.map +1 -1
  99. package/fesm2022/testgorilla-tgo-ui-components-divider.mjs +8 -11
  100. package/fesm2022/testgorilla-tgo-ui-components-divider.mjs.map +1 -1
  101. package/fesm2022/testgorilla-tgo-ui-components-donut-chart.mjs +8 -10
  102. package/fesm2022/testgorilla-tgo-ui-components-donut-chart.mjs.map +1 -1
  103. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs +105 -90
  104. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs.map +1 -1
  105. package/fesm2022/testgorilla-tgo-ui-components-elevation-shadow.mjs +5 -7
  106. package/fesm2022/testgorilla-tgo-ui-components-elevation-shadow.mjs.map +1 -1
  107. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs +24 -13
  108. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs.map +1 -1
  109. package/fesm2022/testgorilla-tgo-ui-components-field.mjs +65 -57
  110. package/fesm2022/testgorilla-tgo-ui-components-field.mjs.map +1 -1
  111. package/fesm2022/testgorilla-tgo-ui-components-file-upload.mjs +35 -23
  112. package/fesm2022/testgorilla-tgo-ui-components-file-upload.mjs.map +1 -1
  113. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs +34 -27
  114. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs.map +1 -1
  115. package/fesm2022/testgorilla-tgo-ui-components-gaussian-chart.mjs +26 -16
  116. package/fesm2022/testgorilla-tgo-ui-components-gaussian-chart.mjs.map +1 -1
  117. package/fesm2022/testgorilla-tgo-ui-components-icon-label.mjs +6 -7
  118. package/fesm2022/testgorilla-tgo-ui-components-icon-label.mjs.map +1 -1
  119. package/fesm2022/testgorilla-tgo-ui-components-icon.mjs +112 -81
  120. package/fesm2022/testgorilla-tgo-ui-components-icon.mjs.map +1 -1
  121. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs +24 -24
  122. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs.map +1 -1
  123. package/fesm2022/testgorilla-tgo-ui-components-logo.mjs +6 -6
  124. package/fesm2022/testgorilla-tgo-ui-components-logo.mjs.map +1 -1
  125. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs +6 -6
  126. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs.map +1 -1
  127. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs +4 -4
  128. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs.map +1 -1
  129. package/fesm2022/testgorilla-tgo-ui-components-multi-input.mjs +42 -21
  130. package/fesm2022/testgorilla-tgo-ui-components-multi-input.mjs.map +1 -1
  131. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs +44 -32
  132. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs.map +1 -1
  133. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs +39 -21
  134. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs.map +1 -1
  135. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs +10 -14
  136. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs.map +1 -1
  137. package/fesm2022/testgorilla-tgo-ui-components-paginator.mjs +7 -9
  138. package/fesm2022/testgorilla-tgo-ui-components-paginator.mjs.map +1 -1
  139. package/fesm2022/testgorilla-tgo-ui-components-password-criteria.mjs +33 -20
  140. package/fesm2022/testgorilla-tgo-ui-components-password-criteria.mjs.map +1 -1
  141. package/fesm2022/testgorilla-tgo-ui-components-password-strength.mjs +9 -12
  142. package/fesm2022/testgorilla-tgo-ui-components-password-strength.mjs.map +1 -1
  143. package/fesm2022/testgorilla-tgo-ui-components-phone-input.mjs +82 -73
  144. package/fesm2022/testgorilla-tgo-ui-components-phone-input.mjs.map +1 -1
  145. package/fesm2022/testgorilla-tgo-ui-components-popover.mjs.map +1 -1
  146. package/fesm2022/testgorilla-tgo-ui-components-progress-bar.mjs +8 -11
  147. package/fesm2022/testgorilla-tgo-ui-components-progress-bar.mjs.map +1 -1
  148. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs +47 -40
  149. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs.map +1 -1
  150. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs +7 -10
  151. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs.map +1 -1
  152. package/fesm2022/testgorilla-tgo-ui-components-radio-button.mjs +43 -48
  153. package/fesm2022/testgorilla-tgo-ui-components-radio-button.mjs.map +1 -1
  154. package/fesm2022/testgorilla-tgo-ui-components-rating.mjs +7 -12
  155. package/fesm2022/testgorilla-tgo-ui-components-rating.mjs.map +1 -1
  156. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs +1 -1
  157. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs.map +1 -1
  158. package/fesm2022/testgorilla-tgo-ui-components-scale.mjs +6 -10
  159. package/fesm2022/testgorilla-tgo-ui-components-scale.mjs.map +1 -1
  160. package/fesm2022/testgorilla-tgo-ui-components-segmented-bar.mjs +30 -16
  161. package/fesm2022/testgorilla-tgo-ui-components-segmented-bar.mjs.map +1 -1
  162. package/fesm2022/testgorilla-tgo-ui-components-segmented-button.mjs +15 -14
  163. package/fesm2022/testgorilla-tgo-ui-components-segmented-button.mjs.map +1 -1
  164. package/fesm2022/testgorilla-tgo-ui-components-segmented-toggle.mjs.map +1 -1
  165. package/fesm2022/testgorilla-tgo-ui-components-selectable-card.mjs +8 -11
  166. package/fesm2022/testgorilla-tgo-ui-components-selectable-card.mjs.map +1 -1
  167. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs +27 -21
  168. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs.map +1 -1
  169. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs +5 -2
  170. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs.map +1 -1
  171. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs +34 -26
  172. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs.map +1 -1
  173. package/fesm2022/testgorilla-tgo-ui-components-skeleton.mjs +5 -5
  174. package/fesm2022/testgorilla-tgo-ui-components-skeleton.mjs.map +1 -1
  175. package/fesm2022/testgorilla-tgo-ui-components-slider.mjs +10 -10
  176. package/fesm2022/testgorilla-tgo-ui-components-slider.mjs.map +1 -1
  177. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs +31 -20
  178. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs.map +1 -1
  179. package/fesm2022/testgorilla-tgo-ui-components-spider-chart.mjs +28 -23
  180. package/fesm2022/testgorilla-tgo-ui-components-spider-chart.mjs.map +1 -1
  181. package/fesm2022/testgorilla-tgo-ui-components-spinner.mjs +9 -12
  182. package/fesm2022/testgorilla-tgo-ui-components-spinner.mjs.map +1 -1
  183. package/fesm2022/testgorilla-tgo-ui-components-stepper.mjs +85 -79
  184. package/fesm2022/testgorilla-tgo-ui-components-stepper.mjs.map +1 -1
  185. package/fesm2022/testgorilla-tgo-ui-components-table.mjs +74 -51
  186. package/fesm2022/testgorilla-tgo-ui-components-table.mjs.map +1 -1
  187. package/fesm2022/testgorilla-tgo-ui-components-tabs.mjs +57 -25
  188. package/fesm2022/testgorilla-tgo-ui-components-tabs.mjs.map +1 -1
  189. package/fesm2022/testgorilla-tgo-ui-components-tag.mjs +16 -17
  190. package/fesm2022/testgorilla-tgo-ui-components-tag.mjs.map +1 -1
  191. package/fesm2022/testgorilla-tgo-ui-components-toggle.mjs +25 -17
  192. package/fesm2022/testgorilla-tgo-ui-components-toggle.mjs.map +1 -1
  193. package/fesm2022/testgorilla-tgo-ui-components-tooltip.mjs +44 -28
  194. package/fesm2022/testgorilla-tgo-ui-components-tooltip.mjs.map +1 -1
  195. package/fesm2022/testgorilla-tgo-ui-components-universal-skills.mjs +34 -27
  196. package/fesm2022/testgorilla-tgo-ui-components-universal-skills.mjs.map +1 -1
  197. package/fesm2022/testgorilla-tgo-ui-components-validation-error.mjs +30 -14
  198. package/fesm2022/testgorilla-tgo-ui-components-validation-error.mjs.map +1 -1
  199. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs +13 -11
  200. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs.map +1 -1
  201. package/fesm2022/testgorilla-tgo-ui.mjs +6 -8
  202. package/fesm2022/testgorilla-tgo-ui.mjs.map +1 -1
  203. package/index.d.ts +4 -4
  204. package/mcp/catalog.json +1 -1
  205. package/package.json +1 -2
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-snackbar.mjs","sources":["../../../components/snackbar/snackbar.component.ts","../../../components/snackbar/snackbar.component.html","../../../components/snackbar/snackbar.service.ts","../../../components/snackbar/snackbar.component.module.ts","../../../components/snackbar/testgorilla-tgo-ui-components-snackbar.ts"],"sourcesContent":["import { animate, style, transition, trigger } from '@angular/animations';\nimport { Component, Inject, Input, OnInit, Optional } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\nimport { IconName } from '@testgorilla/tgo-ui/components/icon';\nimport { SnackbarLink, SnackbarType, SnackbarVariant } from './snackbar.model';\nimport { alertBarsUtil } from '@testgorilla/tgo-ui/components/core';\nimport { ApplicationTheme } from '@testgorilla/tgo-ui/components/core';\nimport { LinkTargetType } from '@testgorilla/tgo-ui/components/alert-banner';\n\n@Component({\n selector: 'ui-snackbar',\n templateUrl: './snackbar.component.html',\n styleUrls: ['./snackbar.component.scss'],\n animations: [\n trigger('openClose', [\n transition(':enter', [\n style({ bottom: '-55px', opacity: 0 }),\n animate('0.2s ease-out', style({ opacity: 1, bottom: '10px' })),\n ]),\n transition(':leave', [\n style({ bottom: '10px', opacity: 1 }),\n animate('0.2s ease-in', style({ bottom: '-55px', opacity: 0 })),\n ]),\n ]),\n ],\n standalone: false,\n})\nexport class SnackbarComponent implements OnInit {\n /**\n * Background color of the button while in active state\n *\n * @type {SnackbarType}\n * @memberof SnackbarComponent\n */\n @Input() snackbarType: SnackbarType = 'success';\n\n /**\n * Snackbar message\n *\n * @memberof SnackbarComponent\n */\n @Input() message = '';\n\n /**\n * Snackbar message from html\n *\n * @memberof SnackbarComponent\n */\n @Input() set html(value: string) {\n if (value) {\n this.safeHtml = value;\n }\n }\n\n /**\n * Set the time that the snackbar will be visible\n *\n * @memberof SnackbarComponent\n */\n @Input() seconds = 5;\n\n /**\n * Include dismmiss button\n *\n * @memberof SnackbarComponent\n */\n @Input() includeDismissButton = true;\n\n /**\n * Static or fixed position\n *\n * @memberof SnackbarComponent\n */\n @Input() fixed = true;\n\n /**\n * Link text that will appended at the end of message\n *\n * @memberof AlertBannerComponent\n */\n @Input() linkText? = '';\n\n /**\n * Link url\n *\n * @memberof AlertBannerComponent\n */\n @Input() linkUrl?: string;\n\n /**\n * Link target\n *\n * @type {@type {LinkTargetType}}\n * @memberof AlertBannerComponent\n */\n @Input() linkTarget?: LinkTargetType = '_blank';\n\n /**\n * The variant to be used\n *\n * @type {SnackbarVariant}\n * @memberof SnackbarComponent\n */\n @Input() variant: SnackbarVariant = 'desktop';\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof SnackbarComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * Close button tooltip\n *\n * @type {string}\n * @memberof SnackbarComponent\n */\n @Input() closeButtonTooltip = '';\n\n /**\n * A string representing the ARIA requirement for accessibility.\n * This attribute is used to indicate whether an input field is required for form submission.\n * @type {string}\n * @memberof SnackbarComponent\n */\n @Input() ariaDescribedby = '';\n\n iconName: IconName;\n showSnackbar = true;\n milisenconds: number;\n visible = false;\n timer?: number;\n timerStartedAt = 0;\n timerPausedAt = 0;\n position: string;\n safeHtml: string;\n\n translationContext = 'SNACKBAR.';\n protected readonly maxCharacters = 70;\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme,\n @Inject(MAT_SNACK_BAR_DATA)\n private data: {\n snackbarType: SnackbarType;\n message: string;\n link?: SnackbarLink;\n applicationTheme?: ApplicationTheme;\n html?: string;\n seconds?: number;\n },\n private snackbarRef: MatSnackBarRef<SnackbarComponent>\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n\n this.snackbarType = data.snackbarType ?? 'success';\n this.message = data.message ?? '';\n this.safeHtml = data.html ?? '';\n this.linkText = data.link?.text ?? '';\n this.linkUrl = data.link?.url ?? '';\n this.seconds = data.seconds ?? 5;\n }\n\n ngOnInit(): void {\n this.milisenconds = this.seconds * 1000;\n this.iconName = alertBarsUtil.setIcon(this.snackbarType) as IconName;\n this.show();\n this.position = alertBarsUtil.setPosition(this.fixed);\n }\n\n //Show snackbar\n show() {\n this.timerStartedAt = Date.now();\n this.visible = true;\n this.timer = window.setTimeout(() => this.hide(), this.milisenconds);\n }\n\n //Hide snackbar\n hide() {\n this.visible = false;\n this.timerPausedAt = 0;\n this.timerStartedAt = 0;\n clearTimeout(this.timer);\n this.timer = undefined;\n this.dismissSnackbar();\n }\n\n //Pause timer when mouse enter\n onMouseEnter() {\n this.visible = true;\n this.timerPausedAt = Date.now();\n clearTimeout(this.timer);\n }\n\n //Continue timer when mouse leave\n onMouseLeave() {\n const diff = this.timerPausedAt - this.timerStartedAt;\n if (diff <= 0) {\n return this.hide();\n }\n this.timer = window.setTimeout(() => this.hide(), this.milisenconds - diff);\n }\n\n //Hide snackbar when dismiss button is clicked\n dismissClick() {\n this.visible = false;\n this.dismissSnackbar();\n }\n\n onLinkClick(event: Event): void {\n event?.preventDefault();\n\n if (this.data.link?.action) {\n this.data.link?.action();\n } else if (this.data.link?.url) {\n window.open(this.data.link?.url, '_blank');\n }\n }\n\n private dismissSnackbar(): void {\n if (Object.keys(this.snackbarRef).length > 0) {\n this.snackbarRef.dismiss();\n }\n }\n}\n","<ng-container>\n @if (visible) {\n <div\n [ngClass]=\"snackbarType + ' ' + position\"\n [@openClose]\n class=\"snackbar-container\"\n [attr.theme]=\"applicationTheme\"\n [class.mobile]=\"variant === 'mobile'\"\n [class.desktop]=\"variant === 'desktop'\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n data-testid=\"snackbar-wrapper\"\n [attr.data-test-snackbar-type]=\"snackbarType\"\n [attr.aria-describedby]=\"'describedby'\"\n role=\"alert\"\n [attr.aria-labelledby]=\"'labelledby'\"\n >\n <span style=\"position: absolute; left: -9999px\" id=\"labelledby\">{{\n 'ALERT_BANNER.' + (snackbarType | uppercase) | uiTranslate | async\n }}</span>\n <span style=\"position: absolute; left: -9999px\"\n >{{ message }}\n @if (!!linkText) {\n <a [target]=\"linkTarget\" [href]=\"linkUrl\" (click)=\"onLinkClick($event)\">{{ linkText }}</a>\n }\n </span>\n <span [style.display]=\"'none'\" id=\"describedby\">{{ ariaDescribedby }}</span>\n <div\n aria-hidden=\"true\"\n class=\"snackbar-text\"\n [matTooltip]=\"message.length > maxCharacters ? message : ''\"\n data-testid=\"snackbar-content\"\n >\n @if (applicationTheme === 'classic') {\n <ui-icon [name]=\"iconName\" size=\"24\"></ui-icon>\n }\n {{ message.length > maxCharacters ? (message | slice: 0 : maxCharacters) + '..' : message }}\n @if (safeHtml) {\n <div [innerHTML]=\"safeHtml\"></div>\n }\n @if (!!linkText) {\n <a [target]=\"linkTarget\" [href]=\"linkUrl\" (click)=\"onLinkClick($event)\">{{ linkText }}</a>\n }\n </div>\n @if (includeDismissButton && applicationTheme === 'classic') {\n <ui-button\n variant=\"text\"\n [label]=\"(translationContext + 'DISMISS' | uiTranslate | async)!\"\n [applicationTheme]=\"applicationTheme !== 'classic' ? 'light' : 'classic'\"\n (buttonClickEvent)=\"dismissClick()\"\n data-testid=\"snackbar-dismiss-button\"\n ></ui-button>\n }\n @if (includeDismissButton && applicationTheme !== 'classic') {\n <ui-button\n [variant]=\"'icon-button'\"\n [applicationTheme]=\"'light'\"\n [iconName]=\"'Close-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"(closeButtonTooltip || ('COMMON.CLOSE' | uiTranslate | async))!\"\n (click)=\"dismissClick()\"\n data-testid=\"snackbar-dismiss-button\"\n ></ui-button>\n }\n </div>\n }\n</ng-container>\n","import { Injectable } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { SnackbarComponent } from './snackbar.component';\nimport { ApplicationTheme } from '@testgorilla/tgo-ui/components/core';\nimport { SnackbarLink, SnackbarType } from './snackbar.model';\n\n@Injectable()\nexport class SnackbarService {\n constructor(private snackBar: MatSnackBar) {}\n\n error(message: string, applicationTheme?: ApplicationTheme, html?: string, link?: SnackbarLink, seconds?: number) {\n return this.show('error', message, applicationTheme, html, link, seconds);\n }\n\n success(message: string, applicationTheme?: ApplicationTheme, html?: string, link?: SnackbarLink, seconds?: number) {\n return this.show('success', message, applicationTheme, html, link, seconds);\n }\n\n info(message: string, applicationTheme?: ApplicationTheme, html?: string, link?: SnackbarLink, seconds?: number) {\n return this.show('info', message, applicationTheme, html, link, seconds);\n }\n\n warning(message: string, applicationTheme?: ApplicationTheme, html?: string, link?: SnackbarLink, seconds?: number) {\n return this.show('warning', message, applicationTheme, html, link, seconds);\n }\n\n show(\n snackbarType: SnackbarType,\n message: string,\n applicationTheme?: ApplicationTheme,\n html?: string,\n link?: SnackbarLink,\n seconds?: number\n ) {\n const componentRef = this.snackBar.openFromComponent(SnackbarComponent, {\n data: {\n snackbarType,\n message,\n link,\n html,\n seconds,\n },\n });\n if (applicationTheme) {\n componentRef.instance.applicationTheme = applicationTheme;\n }\n return componentRef;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\nimport { SnackbarComponent } from './snackbar.component';\nimport { SnackbarService } from './snackbar.service';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n@NgModule({\n declarations: [SnackbarComponent],\n imports: [\n CommonModule,\n ButtonComponentModule,\n IconComponentModule,\n UiTranslatePipe,\n MatSnackBarModule,\n MatTooltipModule,\n ],\n exports: [SnackbarComponent],\n providers: [SnackbarService],\n})\nexport class SnackbarComponentModule {}\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":"testgorilla-tgo-ui-components-snackbar.mjs","sources":["../../../components/snackbar/snackbar.component.ts","../../../components/snackbar/snackbar.component.html","../../../components/snackbar/snackbar.service.ts","../../../components/snackbar/snackbar.component.module.ts","../../../components/snackbar/testgorilla-tgo-ui-components-snackbar.ts"],"sourcesContent":["import { animate, style, transition, trigger } from '@angular/animations';\nimport { NgClass, AsyncPipe, UpperCasePipe, SlicePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, OnInit, Optional } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { LinkTargetType } from '@testgorilla/tgo-ui/components/alert-banner';\nimport { ButtonComponent } from '@testgorilla/tgo-ui/components/button';\nimport { alertBarsUtil, ApplicationTheme, UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconName, IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\nimport { SnackbarLink, SnackbarType, SnackbarVariant } from './snackbar.model';\n\n@Component({\n selector: 'ui-snackbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './snackbar.component.html',\n styleUrls: ['./snackbar.component.scss'],\n /* eslint-disable @typescript-eslint/no-deprecated -- the @angular/animations trigger/state/style/animate/transition DSL is deprecated in 20.2 in favor of template-level animate.enter/animate.leave; migrating every Material/component animation is out of scope for this lint pass */\n animations: [\n trigger('openClose', [\n transition(':enter', [\n style({ bottom: '-55px', opacity: 0 }),\n animate('0.2s ease-out', style({ opacity: 1, bottom: '10px' })),\n ]),\n transition(':leave', [\n style({ bottom: '10px', opacity: 1 }),\n animate('0.2s ease-in', style({ bottom: '-55px', opacity: 0 })),\n ]),\n ]),\n ],\n imports: [\n NgClass,\n MatTooltip,\n IconComponentModule,\n ButtonComponent,\n AsyncPipe,\n UpperCasePipe,\n SlicePipe,\n UiTranslatePipe,\n ],\n})\nexport class SnackbarComponent implements OnInit {\n /**\n * Background color of the button while in active state\n *\n * @type {SnackbarType}\n * @memberof SnackbarComponent\n */\n @Input() snackbarType: SnackbarType = 'success';\n\n /**\n * Snackbar message\n *\n * @memberof SnackbarComponent\n */\n @Input() message = '';\n\n /**\n * Snackbar message from html\n *\n * @memberof SnackbarComponent\n */\n @Input() set html(value: string) {\n if (value) {\n this.safeHtml = value;\n }\n }\n\n /**\n * Set the time that the snackbar will be visible\n *\n * @memberof SnackbarComponent\n */\n @Input() seconds = 5;\n\n /**\n * Include dismmiss button\n *\n * @memberof SnackbarComponent\n */\n @Input() includeDismissButton = true;\n\n /**\n * Static or fixed position\n *\n * @memberof SnackbarComponent\n */\n @Input() fixed = true;\n\n /**\n * Link text that will appended at the end of message\n *\n * @memberof AlertBannerComponent\n */\n @Input() linkText? = '';\n\n /**\n * Link url\n *\n * @memberof AlertBannerComponent\n */\n @Input() linkUrl?: string;\n\n /**\n * Link target\n *\n * @type {@type {LinkTargetType}}\n * @memberof AlertBannerComponent\n */\n @Input() linkTarget?: LinkTargetType = '_blank';\n\n /**\n * The variant to be used\n *\n * @type {SnackbarVariant}\n * @memberof SnackbarComponent\n */\n @Input() variant: SnackbarVariant = 'desktop';\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof SnackbarComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n /**\n * Close button tooltip\n *\n * @type {string}\n * @memberof SnackbarComponent\n */\n @Input() closeButtonTooltip = '';\n\n /**\n * A string representing the ARIA requirement for accessibility.\n * This attribute is used to indicate whether an input field is required for form submission.\n * @type {string}\n * @memberof SnackbarComponent\n */\n @Input() ariaDescribedby = '';\n\n iconName: IconName;\n showSnackbar = true;\n milisenconds: number;\n visible = false;\n timer?: number;\n timerStartedAt = 0;\n timerPausedAt = 0;\n position: string;\n safeHtml: string;\n\n translationContext = 'SNACKBAR.';\n protected readonly maxCharacters = 70;\n\n constructor(\n @Optional() @Inject('CANOPYUI_DEFAULT_APPLICATION_THEME') private readonly defaultAppTheme: ApplicationTheme,\n @Inject(MAT_SNACK_BAR_DATA)\n private readonly data: {\n snackbarType: SnackbarType;\n message: string;\n link?: SnackbarLink;\n applicationTheme?: ApplicationTheme;\n html?: string;\n seconds?: number;\n },\n private readonly snackbarRef: MatSnackBarRef<SnackbarComponent>,\n private readonly cdr: ChangeDetectorRef\n ) {\n if (defaultAppTheme) {\n this.applicationTheme = defaultAppTheme;\n }\n\n this.snackbarType = data.snackbarType ?? 'success';\n this.message = data.message ?? '';\n this.safeHtml = data.html ?? '';\n this.linkText = data.link?.text ?? '';\n this.linkUrl = data.link?.url ?? '';\n this.seconds = data.seconds ?? 5;\n }\n\n ngOnInit(): void {\n this.milisenconds = this.seconds * 1000;\n this.iconName = alertBarsUtil.setIcon(this.snackbarType) as IconName;\n this.show();\n this.position = alertBarsUtil.setPosition(this.fixed);\n }\n\n //Show snackbar\n show() {\n this.timerStartedAt = Date.now();\n this.visible = true;\n this.timer = window.setTimeout(() => this.hide(), this.milisenconds);\n }\n\n //Hide snackbar\n hide() {\n this.visible = false;\n this.timerPausedAt = 0;\n this.timerStartedAt = 0;\n clearTimeout(this.timer);\n this.timer = undefined;\n this.dismissSnackbar();\n // `visible` gates the template and this runs from setTimeout.\n this.cdr.markForCheck();\n }\n\n //Pause timer when mouse enter\n onMouseEnter() {\n this.visible = true;\n this.timerPausedAt = Date.now();\n clearTimeout(this.timer);\n }\n\n //Continue timer when mouse leave\n onMouseLeave() {\n const diff = this.timerPausedAt - this.timerStartedAt;\n if (diff <= 0) {\n return this.hide();\n }\n this.timer = window.setTimeout(() => this.hide(), this.milisenconds - diff);\n }\n\n //Hide snackbar when dismiss button is clicked\n dismissClick() {\n this.visible = false;\n this.dismissSnackbar();\n }\n\n onLinkClick(event: Event): void {\n event?.preventDefault();\n\n if (this.data.link?.action) {\n this.data.link?.action();\n } else if (this.data.link?.url) {\n window.open(this.data.link?.url, '_blank');\n }\n }\n\n private dismissSnackbar(): void {\n if (Object.keys(this.snackbarRef).length > 0) {\n this.snackbarRef.dismiss();\n }\n }\n}\n","<ng-container>\n @if (visible) {\n <div\n [ngClass]=\"snackbarType + ' ' + position\"\n [@openClose]\n class=\"snackbar-container\"\n [attr.theme]=\"applicationTheme\"\n [class.mobile]=\"variant === 'mobile'\"\n [class.desktop]=\"variant === 'desktop'\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n data-testid=\"snackbar-wrapper\"\n [attr.data-test-snackbar-type]=\"snackbarType\"\n [attr.aria-describedby]=\"'describedby'\"\n role=\"alert\"\n [attr.aria-labelledby]=\"'labelledby'\"\n >\n <span style=\"position: absolute; left: -9999px\" id=\"labelledby\">{{\n 'ALERT_BANNER.' + (snackbarType | uppercase) | uiTranslate | async\n }}</span>\n <span style=\"position: absolute; left: -9999px\"\n >{{ message }}\n @if (!!linkText) {\n <a [target]=\"linkTarget\" [href]=\"linkUrl\" (click)=\"onLinkClick($event)\">{{ linkText }}</a>\n }\n </span>\n <span [style.display]=\"'none'\" id=\"describedby\">{{ ariaDescribedby }}</span>\n <div\n aria-hidden=\"true\"\n class=\"snackbar-text\"\n [matTooltip]=\"message.length > maxCharacters ? message : ''\"\n data-testid=\"snackbar-content\"\n >\n @if (applicationTheme === 'classic') {\n <ui-icon [name]=\"iconName\" size=\"24\"></ui-icon>\n }\n {{ message.length > maxCharacters ? (message | slice: 0 : maxCharacters) + '..' : message }}\n @if (safeHtml) {\n <div [innerHTML]=\"safeHtml\"></div>\n }\n @if (!!linkText) {\n <a [target]=\"linkTarget\" [href]=\"linkUrl\" (click)=\"onLinkClick($event)\">{{ linkText }}</a>\n }\n </div>\n @if (includeDismissButton && applicationTheme === 'classic') {\n <ui-button\n variant=\"text\"\n [label]=\"(translationContext + 'DISMISS' | uiTranslate | async)!\"\n [applicationTheme]=\"applicationTheme !== 'classic' ? 'light' : 'classic'\"\n (buttonClickEvent)=\"dismissClick()\"\n data-testid=\"snackbar-dismiss-button\"\n ></ui-button>\n }\n @if (includeDismissButton && applicationTheme !== 'classic') {\n <ui-button\n [variant]=\"'icon-button'\"\n [applicationTheme]=\"'light'\"\n [iconName]=\"'Close-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"(closeButtonTooltip || ('COMMON.CLOSE' | uiTranslate | async))!\"\n (click)=\"dismissClick()\"\n data-testid=\"snackbar-dismiss-button\"\n ></ui-button>\n }\n </div>\n }\n</ng-container>\n","import { Injectable } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { ApplicationTheme } from '@testgorilla/tgo-ui/components/core';\n\nimport { SnackbarComponent } from './snackbar.component';\nimport { SnackbarLink, SnackbarType } from './snackbar.model';\n\n@Injectable()\nexport class SnackbarService {\n constructor(private readonly snackBar: MatSnackBar) {}\n\n error(message: string, applicationTheme?: ApplicationTheme, html?: string, link?: SnackbarLink, seconds?: number) {\n return this.show('error', message, applicationTheme, html, link, seconds);\n }\n\n success(message: string, applicationTheme?: ApplicationTheme, html?: string, link?: SnackbarLink, seconds?: number) {\n return this.show('success', message, applicationTheme, html, link, seconds);\n }\n\n info(message: string, applicationTheme?: ApplicationTheme, html?: string, link?: SnackbarLink, seconds?: number) {\n return this.show('info', message, applicationTheme, html, link, seconds);\n }\n\n warning(message: string, applicationTheme?: ApplicationTheme, html?: string, link?: SnackbarLink, seconds?: number) {\n return this.show('warning', message, applicationTheme, html, link, seconds);\n }\n\n // eslint-disable-next-line max-params -- public method signature; options-object refactor is breaking, deferred to the breaking-change MAJOR (see plan)\n show(\n snackbarType: SnackbarType,\n message: string,\n applicationTheme?: ApplicationTheme,\n html?: string,\n link?: SnackbarLink,\n seconds?: number\n ) {\n const componentRef = this.snackBar.openFromComponent(SnackbarComponent, {\n data: {\n snackbarType,\n message,\n link,\n html,\n seconds,\n },\n });\n if (applicationTheme) {\n componentRef.instance.applicationTheme = applicationTheme;\n }\n return componentRef;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\nimport { SnackbarComponent } from './snackbar.component';\nimport { SnackbarService } from './snackbar.service';\n\n@NgModule({\n imports: [\n CommonModule,\n ButtonComponentModule,\n IconComponentModule,\n UiTranslatePipe,\n MatSnackBarModule,\n MatTooltipModule,\n SnackbarComponent,\n ],\n exports: [SnackbarComponent],\n providers: [SnackbarService],\n})\nexport class SnackbarComponentModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,15 +1,10 @@
1
+ import { NgClass, AsyncPipe, CommonModule } from '@angular/common';
1
2
  import * as i0 from '@angular/core';
2
- import { inject, ChangeDetectorRef, ViewChildren, ViewChild, Input, Component, NgModule } from '@angular/core';
3
- import * as i5 from '@testgorilla/tgo-ui/components/core';
4
- import { Color, UiTranslatePipe, MemoizeFuncPipe } from '@testgorilla/tgo-ui/components/core';
5
- import * as i2 from 'ng2-charts';
3
+ import { inject, ChangeDetectorRef, ViewChildren, ViewChild, Input, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
4
+ import { MatTooltip, MatTooltipModule } from '@angular/material/tooltip';
6
5
  import { BaseChartDirective } from 'ng2-charts';
7
- import * as i1 from '@angular/common';
8
- import { NgClass, CommonModule } from '@angular/common';
9
- import * as i3 from '@angular/material/tooltip';
10
- import { MatTooltipModule } from '@angular/material/tooltip';
11
- import * as i4 from '@testgorilla/tgo-ui/components/spinner';
12
- import { SpinnerComponentModule } from '@testgorilla/tgo-ui/components/spinner';
6
+ import { Color, UiTranslatePipe, MemoizeFuncPipe } from '@testgorilla/tgo-ui/components/core';
7
+ import { SpinnerComponent, SpinnerComponentModule } from '@testgorilla/tgo-ui/components/spinner';
13
8
  import { Chart, registerables } from 'chart.js';
14
9
 
15
10
  // These are the sizes of the canvas, not the chart itself. It includes 40px of padding on all sides.
@@ -220,6 +215,11 @@ class SpiderChartComponent {
220
215
  ngAfterViewInit() {
221
216
  if (this.chart?.chart && !this.loading) {
222
217
  this.logCornerCoordinates(this.chart.chart);
218
+ // Under OnPush nothing re-checks this view between AfterViewInit and the
219
+ // measurement timeout, so render the (still hidden) label containers now —
220
+ // otherwise the `@if (labelPositionsVisible)` block hasn't been created yet
221
+ // and cacheLabelStyles() measures an empty ViewChildren list.
222
+ this.cdr.detectChanges();
223
223
  // Cache label styles after positions are calculated and DOM is rendered.
224
224
  // We deliberately use setTimeout(0) instead of afterNextRender here: the
225
225
  // callback must fire after the browser has fully painted (fonts swapped,
@@ -230,8 +230,9 @@ class SpiderChartComponent {
230
230
  }
231
231
  }
232
232
  cacheLabelStyles() {
233
- if (!this.labelContainers)
233
+ if (!this.labelContainers) {
234
234
  return;
235
+ }
235
236
  this.labelContainers.forEach((ref, index) => {
236
237
  const label = this.spiderChartData.labels[index];
237
238
  const el = ref.nativeElement;
@@ -383,8 +384,9 @@ class SpiderChartComponent {
383
384
  }
384
385
  showTooltipForDataPoint(index, isSecondary = false) {
385
386
  const chartInstance = this.chart?.chart;
386
- if (!chartInstance)
387
+ if (!chartInstance) {
387
388
  return;
389
+ }
388
390
  const activeElement = [{ datasetIndex: isSecondary ? 1 : 0, index }];
389
391
  const meta = chartInstance.getDatasetMeta(isSecondary ? 1 : 0);
390
392
  const dataPoint = meta.data[index];
@@ -400,24 +402,27 @@ class SpiderChartComponent {
400
402
  }
401
403
  resetActiveElement() {
402
404
  const chartInstance = this.chart?.chart;
403
- if (!chartInstance)
405
+ if (!chartInstance) {
404
406
  return;
407
+ }
405
408
  // Clear the active elements to hide the tooltip
406
409
  chartInstance.tooltip?.setActiveElements([], { x: 0, y: 0 });
407
410
  chartInstance.update();
408
411
  }
409
412
  toggleDatasetVisibility(datasetIndex) {
410
413
  const chartInstance = this.chart?.chart;
411
- if (!chartInstance)
414
+ if (!chartInstance) {
412
415
  return;
416
+ }
413
417
  const dataset = chartInstance.data.datasets[datasetIndex];
414
418
  dataset.hidden = !dataset.hidden;
415
419
  chartInstance.update();
416
420
  }
417
421
  isDatasetVisible(datasetIndex) {
418
422
  const chartInstance = this.chart?.chart;
419
- if (!chartInstance)
423
+ if (!chartInstance) {
420
424
  return;
425
+ }
421
426
  return !chartInstance.data.datasets[datasetIndex].hidden;
422
427
  }
423
428
  getFirstLine(label) {
@@ -438,11 +443,11 @@ class SpiderChartComponent {
438
443
  return label.substring(firstLine.length).trim();
439
444
  }
440
445
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SpiderChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
441
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SpiderChartComponent, isStandalone: false, selector: "ui-spider-chart", inputs: { size: "size", spiderChartData: "spiderChartData", stepSize: "stepSize", ariaLabel: "ariaLabel", loading: "loading", applicationTheme: "applicationTheme" }, viewQueries: [{ propertyName: "chart", first: true, predicate: BaseChartDirective, descendants: true }, { propertyName: "labelContainers", predicate: ["labelContainer"], descendants: true }, { propertyName: "fakeDataPoints", predicate: ["fakeDataPoints"], descendants: true }, { propertyName: "fakeDataPointsSecondary", predicate: ["fakeDataPointsSecondary"], descendants: true }, { propertyName: "legendItems", predicate: ["legendItem"], descendants: true }], ngImport: i0, template: "<div class=\"spider-chart-container\" tabindex=\"0\" [attr.aria-label]=\"ariaLabel\">\n <div\n class=\"spacing-container\"\n [ngClass]=\"{ 'small-spacing': radarChartData.labels && radarChartData.labels.length % 2 === 1 && !loading }\"\n >\n <div\n class=\"chart-container\"\n [style.width]=\"size === 'large' ? '280px' : '200px'\"\n [style.height]=\"size === 'large' ? '280px' : '200px'\"\n >\n @if (!loading) {\n <canvas baseChart [data]=\"radarChartData\" [options]=\"radarChartOptions\" type=\"radar\" class=\"chart\"> </canvas>\n } @else {\n <canvas baseChart [data]=\"loadingChartData\" [options]=\"loadingChartOptions\" type=\"radar\" class=\"chart\">\n </canvas>\n <ui-spinner></ui-spinner>\n }\n\n @if (labelPositionsVisible) {\n <div class=\"overlay-container\" [style.visibility]=\"labelStylesCached ? 'visible' : 'hidden'\">\n @for (label of spiderChartData.labels; track label) {\n <div\n class=\"label-container\"\n #labelContainer\n [matTooltip]=\"spiderChartData.labelDescription[$index]\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n (keydown)=\"onLabelKeyDown($event, $index)\"\n [attr.aria-label]=\"spiderChartData.labelDescription[$index]\"\n [style.left]=\"labelStyles[label]?.left\"\n [style.bottom]=\"labelStyles[label]?.bottom\"\n >\n @if (!(label.length > 20 && size === 'large' && spiderChartData.labels.length < 9)) {\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label }}\n </div>\n } @else {\n <div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getFirstLine }}\n </div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getSecondLine : this }}\n </div>\n </div>\n }\n <span class=\"value\">{{ spiderChartData.plotData[0].data[$index] }}</span>\n </div>\n <span\n class=\"fake-data-points\"\n #fakeDataPoints\n [tabindex]=\"focusedLabelIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedLabelIndex ? showTooltipForDataPoint($index) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index)\"\n >\n </span>\n @if (radarChartData.datasets.length > 1) {\n <span\n class=\"fake-data-points-secondary\"\n #fakeDataPointsSecondary\n [tabindex]=\"focusedFakeDataPointIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedFakeDataPointIndex ? showTooltipForDataPoint($index, true) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index, true)\"\n >\n </span>\n }\n }\n </div>\n }\n </div>\n </div>\n @if (radarChartData.datasets.length > 0) {\n <div class=\"legend-container\">\n @for (dataset of radarChartData.datasets; track dataset.label) {\n <div\n class=\"legend-item\"\n (click)=\"toggleDatasetVisibility($index)\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n role=\"button\"\n [attr.aria-pressed]=\"isDatasetVisible($index) ? false : true\"\n [attr.aria-label]=\"\n isDatasetVisible($index)\n ? (translationContext + 'DATASET_VISIBLE' | uiTranslate: { dataset: dataset.label } | async)\n : (translationContext + 'DATASET_HIDDEN' | uiTranslate: { dataset: dataset.label } | async)\n \"\n (keydown)=\"onLegendItemKeyDown($event, $index)\"\n #legendItem\n >\n <span class=\"legend-line\" [ngClass]=\"{ 'solid-line': $index === 0, 'dashed-line': $index === 1 }\"></span>\n <span class=\"legend-label\" [style.text-decoration]=\"isDatasetVisible($index) ? 'none' : 'line-through'\">\n {{ dataset.label }}\n </span>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.spider-chart-container{display:flex;flex-direction:column;align-items:center}.spider-chart-container .spacing-container{padding:40px 140px}.spider-chart-container .spacing-container.small-spacing{padding:0 80px}.spider-chart-container .spacing-container .chart-container{position:relative}.spider-chart-container .spacing-container .chart-container .overlay-container{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container{display:flex;gap:4px;position:absolute;pointer-events:all;cursor:pointer}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .fake-data-points{visibility:hidden}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container:focus{outline:none}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .label{font-size:12px;border-bottom:1px dashed #d3d3d3;white-space:nowrap;overflow:hidden;width:fit-content;text-overflow:ellipsis}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .value{font-weight:700}.spider-chart-container .legend-container{display:flex;gap:16px;cursor:pointer}.spider-chart-container .legend-container .legend-item{display:flex;align-items:center;gap:8px}.spider-chart-container .legend-container .legend-item .legend-line{display:inline-block;width:11px;height:4px}.spider-chart-container .legend-container .legend-item .solid-line{background-color:#d410aa}.spider-chart-container .legend-container .legend-item .dashed-line{border-top:2px dashed #242424}:host ::ng-deep .spider-chart-container .spinner-container.loader{position:absolute}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.BaseChartDirective, selector: "canvas[baseChart]", inputs: ["type", "legend", "data", "options", "plugins", "labels", "datasets"], outputs: ["chartClick", "chartHover"], exportAs: ["base-chart"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i4.SpinnerComponent, selector: "ui-spinner", inputs: ["size", "isLoader", "text", "applicationTheme", "iconName", "iconSize"] }, { kind: "pipe", type: i5.UiTranslatePipe, name: "uiTranslate" }, { kind: "pipe", type: i5.MemoizeFuncPipe, name: "memoizeFunc" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] }); }
446
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SpiderChartComponent, isStandalone: true, selector: "ui-spider-chart", inputs: { size: "size", spiderChartData: "spiderChartData", stepSize: "stepSize", ariaLabel: "ariaLabel", loading: "loading", applicationTheme: "applicationTheme" }, viewQueries: [{ propertyName: "chart", first: true, predicate: BaseChartDirective, descendants: true }, { propertyName: "labelContainers", predicate: ["labelContainer"], descendants: true }, { propertyName: "fakeDataPoints", predicate: ["fakeDataPoints"], descendants: true }, { propertyName: "fakeDataPointsSecondary", predicate: ["fakeDataPointsSecondary"], descendants: true }, { propertyName: "legendItems", predicate: ["legendItem"], descendants: true }], ngImport: i0, template: "<div class=\"spider-chart-container\" tabindex=\"0\" [attr.aria-label]=\"ariaLabel\">\n <div\n class=\"spacing-container\"\n [ngClass]=\"{ 'small-spacing': radarChartData.labels && radarChartData.labels.length % 2 === 1 && !loading }\"\n >\n <div\n class=\"chart-container\"\n [style.width]=\"size === 'large' ? '280px' : '200px'\"\n [style.height]=\"size === 'large' ? '280px' : '200px'\"\n >\n @if (!loading) {\n <canvas baseChart [data]=\"radarChartData\" [options]=\"radarChartOptions\" type=\"radar\" class=\"chart\"> </canvas>\n } @else {\n <canvas baseChart [data]=\"loadingChartData\" [options]=\"loadingChartOptions\" type=\"radar\" class=\"chart\">\n </canvas>\n <ui-spinner></ui-spinner>\n }\n\n @if (labelPositionsVisible) {\n <div class=\"overlay-container\" [style.visibility]=\"labelStylesCached ? 'visible' : 'hidden'\">\n @for (label of spiderChartData.labels; track label) {\n <div\n class=\"label-container\"\n #labelContainer\n [matTooltip]=\"spiderChartData.labelDescription[$index]\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n (keydown)=\"onLabelKeyDown($event, $index)\"\n [attr.aria-label]=\"spiderChartData.labelDescription[$index]\"\n [style.left]=\"labelStyles[label]?.left\"\n [style.bottom]=\"labelStyles[label]?.bottom\"\n >\n @if (!(label.length > 20 && size === 'large' && spiderChartData.labels.length < 9)) {\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label }}\n </div>\n } @else {\n <div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getFirstLine }}\n </div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getSecondLine : this }}\n </div>\n </div>\n }\n <span class=\"value\">{{ spiderChartData.plotData[0].data[$index] }}</span>\n </div>\n <span\n class=\"fake-data-points\"\n #fakeDataPoints\n [tabindex]=\"focusedLabelIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedLabelIndex ? showTooltipForDataPoint($index) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index)\"\n >\n </span>\n @if (radarChartData.datasets.length > 1) {\n <span\n class=\"fake-data-points-secondary\"\n #fakeDataPointsSecondary\n [tabindex]=\"focusedFakeDataPointIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedFakeDataPointIndex ? showTooltipForDataPoint($index, true) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index, true)\"\n >\n </span>\n }\n }\n </div>\n }\n </div>\n </div>\n @if (radarChartData.datasets.length > 0) {\n <div class=\"legend-container\">\n @for (dataset of radarChartData.datasets; track dataset.label) {\n <div\n class=\"legend-item\"\n (click)=\"toggleDatasetVisibility($index)\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n role=\"button\"\n [attr.aria-pressed]=\"isDatasetVisible($index) ? false : true\"\n [attr.aria-label]=\"\n isDatasetVisible($index)\n ? (translationContext + 'DATASET_VISIBLE' | uiTranslate: { dataset: dataset.label } | async)\n : (translationContext + 'DATASET_HIDDEN' | uiTranslate: { dataset: dataset.label } | async)\n \"\n (keydown)=\"onLegendItemKeyDown($event, $index)\"\n #legendItem\n >\n <span class=\"legend-line\" [ngClass]=\"{ 'solid-line': $index === 0, 'dashed-line': $index === 1 }\"></span>\n <span class=\"legend-label\" [style.text-decoration]=\"isDatasetVisible($index) ? 'none' : 'line-through'\">\n {{ dataset.label }}\n </span>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.spider-chart-container{display:flex;flex-direction:column;align-items:center}.spider-chart-container .spacing-container{padding:40px 140px}.spider-chart-container .spacing-container.small-spacing{padding:0 80px}.spider-chart-container .spacing-container .chart-container{position:relative}.spider-chart-container .spacing-container .chart-container .overlay-container{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container{display:flex;gap:4px;position:absolute;pointer-events:all;cursor:pointer}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .fake-data-points{visibility:hidden}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container:focus{outline:none}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .label{font-size:12px;border-bottom:1px dashed #d3d3d3;white-space:nowrap;overflow:hidden;width:fit-content;text-overflow:ellipsis}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .value{font-weight:700}.spider-chart-container .legend-container{display:flex;gap:16px;cursor:pointer}.spider-chart-container .legend-container .legend-item{display:flex;align-items:center;gap:8px}.spider-chart-container .legend-container .legend-item .legend-line{display:inline-block;width:11px;height:4px}.spider-chart-container .legend-container .legend-item .solid-line{background-color:#d410aa}.spider-chart-container .legend-container .legend-item .dashed-line{border-top:2px dashed #242424}:host ::ng-deep .spider-chart-container .spinner-container.loader{position:absolute}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: BaseChartDirective, selector: "canvas[baseChart]", inputs: ["type", "legend", "data", "options", "plugins", "labels", "datasets"], outputs: ["chartClick", "chartHover"], exportAs: ["base-chart"] }, { kind: "component", type: SpinnerComponent, selector: "ui-spinner", inputs: ["size", "isLoader", "text", "applicationTheme", "iconName", "iconSize"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: UiTranslatePipe, name: "uiTranslate" }, { kind: "pipe", type: MemoizeFuncPipe, name: "memoizeFunc" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
442
447
  }
443
448
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SpiderChartComponent, decorators: [{
444
449
  type: Component,
445
- args: [{ selector: 'ui-spider-chart', standalone: false, template: "<div class=\"spider-chart-container\" tabindex=\"0\" [attr.aria-label]=\"ariaLabel\">\n <div\n class=\"spacing-container\"\n [ngClass]=\"{ 'small-spacing': radarChartData.labels && radarChartData.labels.length % 2 === 1 && !loading }\"\n >\n <div\n class=\"chart-container\"\n [style.width]=\"size === 'large' ? '280px' : '200px'\"\n [style.height]=\"size === 'large' ? '280px' : '200px'\"\n >\n @if (!loading) {\n <canvas baseChart [data]=\"radarChartData\" [options]=\"radarChartOptions\" type=\"radar\" class=\"chart\"> </canvas>\n } @else {\n <canvas baseChart [data]=\"loadingChartData\" [options]=\"loadingChartOptions\" type=\"radar\" class=\"chart\">\n </canvas>\n <ui-spinner></ui-spinner>\n }\n\n @if (labelPositionsVisible) {\n <div class=\"overlay-container\" [style.visibility]=\"labelStylesCached ? 'visible' : 'hidden'\">\n @for (label of spiderChartData.labels; track label) {\n <div\n class=\"label-container\"\n #labelContainer\n [matTooltip]=\"spiderChartData.labelDescription[$index]\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n (keydown)=\"onLabelKeyDown($event, $index)\"\n [attr.aria-label]=\"spiderChartData.labelDescription[$index]\"\n [style.left]=\"labelStyles[label]?.left\"\n [style.bottom]=\"labelStyles[label]?.bottom\"\n >\n @if (!(label.length > 20 && size === 'large' && spiderChartData.labels.length < 9)) {\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label }}\n </div>\n } @else {\n <div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getFirstLine }}\n </div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getSecondLine : this }}\n </div>\n </div>\n }\n <span class=\"value\">{{ spiderChartData.plotData[0].data[$index] }}</span>\n </div>\n <span\n class=\"fake-data-points\"\n #fakeDataPoints\n [tabindex]=\"focusedLabelIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedLabelIndex ? showTooltipForDataPoint($index) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index)\"\n >\n </span>\n @if (radarChartData.datasets.length > 1) {\n <span\n class=\"fake-data-points-secondary\"\n #fakeDataPointsSecondary\n [tabindex]=\"focusedFakeDataPointIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedFakeDataPointIndex ? showTooltipForDataPoint($index, true) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index, true)\"\n >\n </span>\n }\n }\n </div>\n }\n </div>\n </div>\n @if (radarChartData.datasets.length > 0) {\n <div class=\"legend-container\">\n @for (dataset of radarChartData.datasets; track dataset.label) {\n <div\n class=\"legend-item\"\n (click)=\"toggleDatasetVisibility($index)\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n role=\"button\"\n [attr.aria-pressed]=\"isDatasetVisible($index) ? false : true\"\n [attr.aria-label]=\"\n isDatasetVisible($index)\n ? (translationContext + 'DATASET_VISIBLE' | uiTranslate: { dataset: dataset.label } | async)\n : (translationContext + 'DATASET_HIDDEN' | uiTranslate: { dataset: dataset.label } | async)\n \"\n (keydown)=\"onLegendItemKeyDown($event, $index)\"\n #legendItem\n >\n <span class=\"legend-line\" [ngClass]=\"{ 'solid-line': $index === 0, 'dashed-line': $index === 1 }\"></span>\n <span class=\"legend-label\" [style.text-decoration]=\"isDatasetVisible($index) ? 'none' : 'line-through'\">\n {{ dataset.label }}\n </span>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.spider-chart-container{display:flex;flex-direction:column;align-items:center}.spider-chart-container .spacing-container{padding:40px 140px}.spider-chart-container .spacing-container.small-spacing{padding:0 80px}.spider-chart-container .spacing-container .chart-container{position:relative}.spider-chart-container .spacing-container .chart-container .overlay-container{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container{display:flex;gap:4px;position:absolute;pointer-events:all;cursor:pointer}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .fake-data-points{visibility:hidden}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container:focus{outline:none}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .label{font-size:12px;border-bottom:1px dashed #d3d3d3;white-space:nowrap;overflow:hidden;width:fit-content;text-overflow:ellipsis}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .value{font-weight:700}.spider-chart-container .legend-container{display:flex;gap:16px;cursor:pointer}.spider-chart-container .legend-container .legend-item{display:flex;align-items:center;gap:8px}.spider-chart-container .legend-container .legend-item .legend-line{display:inline-block;width:11px;height:4px}.spider-chart-container .legend-container .legend-item .solid-line{background-color:#d410aa}.spider-chart-container .legend-container .legend-item .dashed-line{border-top:2px dashed #242424}:host ::ng-deep .spider-chart-container .spinner-container.loader{position:absolute}\n"] }]
450
+ args: [{ selector: 'ui-spider-chart', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgClass, BaseChartDirective, SpinnerComponent, MatTooltip, UiTranslatePipe, MemoizeFuncPipe, AsyncPipe], template: "<div class=\"spider-chart-container\" tabindex=\"0\" [attr.aria-label]=\"ariaLabel\">\n <div\n class=\"spacing-container\"\n [ngClass]=\"{ 'small-spacing': radarChartData.labels && radarChartData.labels.length % 2 === 1 && !loading }\"\n >\n <div\n class=\"chart-container\"\n [style.width]=\"size === 'large' ? '280px' : '200px'\"\n [style.height]=\"size === 'large' ? '280px' : '200px'\"\n >\n @if (!loading) {\n <canvas baseChart [data]=\"radarChartData\" [options]=\"radarChartOptions\" type=\"radar\" class=\"chart\"> </canvas>\n } @else {\n <canvas baseChart [data]=\"loadingChartData\" [options]=\"loadingChartOptions\" type=\"radar\" class=\"chart\">\n </canvas>\n <ui-spinner></ui-spinner>\n }\n\n @if (labelPositionsVisible) {\n <div class=\"overlay-container\" [style.visibility]=\"labelStylesCached ? 'visible' : 'hidden'\">\n @for (label of spiderChartData.labels; track label) {\n <div\n class=\"label-container\"\n #labelContainer\n [matTooltip]=\"spiderChartData.labelDescription[$index]\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n (keydown)=\"onLabelKeyDown($event, $index)\"\n [attr.aria-label]=\"spiderChartData.labelDescription[$index]\"\n [style.left]=\"labelStyles[label]?.left\"\n [style.bottom]=\"labelStyles[label]?.bottom\"\n >\n @if (!(label.length > 20 && size === 'large' && spiderChartData.labels.length < 9)) {\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label }}\n </div>\n } @else {\n <div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getFirstLine }}\n </div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getSecondLine : this }}\n </div>\n </div>\n }\n <span class=\"value\">{{ spiderChartData.plotData[0].data[$index] }}</span>\n </div>\n <span\n class=\"fake-data-points\"\n #fakeDataPoints\n [tabindex]=\"focusedLabelIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedLabelIndex ? showTooltipForDataPoint($index) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index)\"\n >\n </span>\n @if (radarChartData.datasets.length > 1) {\n <span\n class=\"fake-data-points-secondary\"\n #fakeDataPointsSecondary\n [tabindex]=\"focusedFakeDataPointIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedFakeDataPointIndex ? showTooltipForDataPoint($index, true) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index, true)\"\n >\n </span>\n }\n }\n </div>\n }\n </div>\n </div>\n @if (radarChartData.datasets.length > 0) {\n <div class=\"legend-container\">\n @for (dataset of radarChartData.datasets; track dataset.label) {\n <div\n class=\"legend-item\"\n (click)=\"toggleDatasetVisibility($index)\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n role=\"button\"\n [attr.aria-pressed]=\"isDatasetVisible($index) ? false : true\"\n [attr.aria-label]=\"\n isDatasetVisible($index)\n ? (translationContext + 'DATASET_VISIBLE' | uiTranslate: { dataset: dataset.label } | async)\n : (translationContext + 'DATASET_HIDDEN' | uiTranslate: { dataset: dataset.label } | async)\n \"\n (keydown)=\"onLegendItemKeyDown($event, $index)\"\n #legendItem\n >\n <span class=\"legend-line\" [ngClass]=\"{ 'solid-line': $index === 0, 'dashed-line': $index === 1 }\"></span>\n <span class=\"legend-label\" [style.text-decoration]=\"isDatasetVisible($index) ? 'none' : 'line-through'\">\n {{ dataset.label }}\n </span>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.spider-chart-container{display:flex;flex-direction:column;align-items:center}.spider-chart-container .spacing-container{padding:40px 140px}.spider-chart-container .spacing-container.small-spacing{padding:0 80px}.spider-chart-container .spacing-container .chart-container{position:relative}.spider-chart-container .spacing-container .chart-container .overlay-container{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container{display:flex;gap:4px;position:absolute;pointer-events:all;cursor:pointer}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .fake-data-points{visibility:hidden}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container:focus{outline:none}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .label{font-size:12px;border-bottom:1px dashed #d3d3d3;white-space:nowrap;overflow:hidden;width:fit-content;text-overflow:ellipsis}.spider-chart-container .spacing-container .chart-container .overlay-container .label-container .value{font-weight:700}.spider-chart-container .legend-container{display:flex;gap:16px;cursor:pointer}.spider-chart-container .legend-container .legend-item{display:flex;align-items:center;gap:8px}.spider-chart-container .legend-container .legend-item .legend-line{display:inline-block;width:11px;height:4px}.spider-chart-container .legend-container .legend-item .solid-line{background-color:#d410aa}.spider-chart-container .legend-container .legend-item .dashed-line{border-top:2px dashed #242424}:host ::ng-deep .spider-chart-container .spinner-container.loader{position:absolute}\n"] }]
446
451
  }], propDecorators: { size: [{
447
452
  type: Input
448
453
  }], spiderChartData: [{
@@ -475,32 +480,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
475
480
  Chart.register(...registerables);
476
481
  class SpiderChartComponentModule {
477
482
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SpiderChartComponentModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
478
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: SpiderChartComponentModule, declarations: [SpiderChartComponent], imports: [NgClass,
483
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: SpiderChartComponentModule, imports: [NgClass,
479
484
  UiTranslatePipe,
480
485
  BaseChartDirective,
481
486
  MatTooltipModule,
482
- UiTranslatePipe,
483
487
  MemoizeFuncPipe,
484
488
  SpinnerComponentModule,
485
- CommonModule], exports: [SpiderChartComponent] }); }
489
+ CommonModule,
490
+ SpiderChartComponent], exports: [SpiderChartComponent] }); }
486
491
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SpiderChartComponentModule, imports: [MatTooltipModule,
487
492
  SpinnerComponentModule,
488
- CommonModule] }); }
493
+ CommonModule,
494
+ SpiderChartComponent] }); }
489
495
  }
490
496
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SpiderChartComponentModule, decorators: [{
491
497
  type: NgModule,
492
498
  args: [{
493
- declarations: [SpiderChartComponent],
494
499
  exports: [SpiderChartComponent],
495
500
  imports: [
496
501
  NgClass,
497
502
  UiTranslatePipe,
498
503
  BaseChartDirective,
499
504
  MatTooltipModule,
500
- UiTranslatePipe,
501
505
  MemoizeFuncPipe,
502
506
  SpinnerComponentModule,
503
507
  CommonModule,
508
+ SpiderChartComponent,
504
509
  ],
505
510
  }]
506
511
  }] });
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-spider-chart.mjs","sources":["../../../components/spider-chart/spider-chart.model.ts","../../../components/spider-chart/spider-chart.component.ts","../../../components/spider-chart/spider-chart.component.html","../../../components/spider-chart/spider-chart.module.ts","../../../components/spider-chart/testgorilla-tgo-ui-components-spider-chart.ts"],"sourcesContent":["export type SpiderChartSize = 'large' | 'small';\n// These are the sizes of the canvas, not the chart itself. It includes 40px of padding on all sides.\nexport const SmallSpiderChartSize = 200;\nexport const LargeSpiderChartSize = 280;\nexport type SpiderChartData = {\n labels: string[];\n labelDescription: string[];\n plotData: [PlotData, PlotData] | [PlotData]; // Current implementation supports max 2 datasets.\n};\nexport type PlotData = {\n databaseLabel: string;\n data: number[];\n};\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n Input,\n OnInit,\n QueryList,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { LargeSpiderChartSize, SmallSpiderChartSize, SpiderChartData, SpiderChartSize } from './spider-chart.model';\nimport { ApplicationTheme, Color } from '@testgorilla/tgo-ui/components/core';\nimport { Chart, ChartData, ChartOptions } from 'chart.js';\nimport { BaseChartDirective } from 'ng2-charts';\n\n@Component({\n selector: 'ui-spider-chart',\n templateUrl: './spider-chart.component.html',\n styleUrls: ['./spider-chart.component.scss'],\n standalone: false,\n})\nexport class SpiderChartComponent implements OnInit, AfterViewInit {\n /**\n * The size of the spider chart.\n * @type {SpiderChartSize}\n * @memberof SpiderChartComponent\n */\n @Input() size: SpiderChartSize = 'large';\n\n /**\n * The data to be used for the spider chart.\n * @type {SpiderChartData}\n * @memberof SpiderChartComponent\n */\n @Input() spiderChartData: SpiderChartData;\n\n /**\n * The step size for the spider chart.\n * @type {number}\n * @memberof SpiderChartComponent\n */\n @Input() stepSize = 20;\n\n /**\n * The aria label for the spider chart.\n * @type {string}\n * @memberof SpiderChartComponent\n */\n @Input() ariaLabel = 'Radar chart. Press tab to navigate through the chart.';\n\n /**\n * Whether the spider chart is loading.\n * @type {boolean}\n * @memberof SpiderChartComponent\n */\n @Input() loading = false;\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof SpinnerComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n @ViewChild(BaseChartDirective) chart: BaseChartDirective;\n @ViewChildren('labelContainer') labelContainers: QueryList<ElementRef>;\n @ViewChildren('fakeDataPoints') fakeDataPoints: QueryList<ElementRef>;\n @ViewChildren('fakeDataPointsSecondary') fakeDataPointsSecondary: QueryList<ElementRef>;\n @ViewChildren('legendItem') legendItems: QueryList<ElementRef>;\n\n radarChartData: ChartData<'radar'> = {\n labels: [],\n datasets: [],\n };\n radarChartOptions: ChartOptions<'radar'>;\n labelPositions: { [key: string]: { x: number; y: number } } = {};\n labelStyles: { [key: string]: { left: string; bottom: string } } = {};\n labelPositionsVisible = false;\n labelStylesCached = false;\n focusedLabelIndex = 0;\n focusedFakeDataPointIndex = 0;\n loadingChartData: ChartData<'radar'> = {\n labels: [1, 2, 3, 4, 5, 6],\n datasets: [],\n };\n loadingChartOptions: ChartOptions<'radar'> = {\n responsive: true,\n layout: {\n padding: {\n left: 40,\n right: 40,\n top: 40,\n bottom: 40,\n },\n },\n scales: {\n r: {\n angleLines: {\n display: true,\n color: Color.GRAYSCALE_30,\n },\n grid: {\n color: () => Color.GRAYSCALE_30,\n },\n pointLabels: {\n display: false,\n },\n suggestedMin: 0,\n suggestedMax: 100,\n ticks: {\n stepSize: this.stepSize,\n display: false,\n },\n },\n },\n };\n protected readonly translationContext = 'CHARTS.SPIDER.';\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n ngOnInit(): void {\n if (!this.loading) {\n this.handleInputErrors();\n this.setChartData();\n this.setChartOptions();\n }\n }\n\n private handleInputErrors() {\n if (!this.spiderChartData.labels || this.spiderChartData.labels.length === 0) {\n throw new Error('The \"labels\" input is required and cannot be empty.');\n }\n if (!this.spiderChartData.labelDescription || this.spiderChartData.labelDescription.length === 0) {\n throw new Error('The \"labelDescription\" input is required and cannot be empty.');\n }\n if (\n this.spiderChartData.labelDescription &&\n this.spiderChartData.labelDescription.length !== this.spiderChartData.labels.length\n ) {\n throw new Error('The \"labelDescription\" input must have the same length as \"labels\".');\n }\n if (!this.spiderChartData.plotData[0].databaseLabel) {\n throw new Error('The \"plotData.databaseLabel\" input is required.');\n }\n if (!this.spiderChartData.plotData[0].data || this.spiderChartData.plotData[0].data.length === 0) {\n throw new Error('The \"plotData.data\" input is required and cannot be empty.');\n }\n if (this.spiderChartData.plotData[0].data.length !== this.spiderChartData.labels.length) {\n throw new Error('The \"plotData.data\" input must have the same length as \"labels\".');\n }\n if (\n this.spiderChartData.plotData.length === 2 &&\n this.spiderChartData.labels.length > 0 &&\n this.spiderChartData.plotData[1].data &&\n this.spiderChartData.plotData[1].data.length !== this.spiderChartData.labels.length\n ) {\n throw new Error('The \"plotData.data\" input must have the same length as \"labels\".');\n }\n }\n\n private setChartData() {\n const datasets = [];\n datasets.push({\n label: this.spiderChartData.plotData[0].databaseLabel,\n data: this.spiderChartData.plotData[0].data,\n fill: true,\n backgroundColor: 'rgba(212, 16, 170, 0.2)',\n borderColor: Color.BRAND_50,\n pointBackgroundColor: Color.BRAND_50,\n pointBorderColor: Color.TGO_WHITE,\n pointHoverBackgroundColor: Color.TGO_WHITE,\n pointHoverBorderColor: Color.BRAND_50,\n });\n if (this.spiderChartData.plotData.length === 2) {\n datasets.push({\n label: this.spiderChartData.plotData[1].databaseLabel,\n data: this.spiderChartData.plotData[1].data,\n fill: false,\n borderColor: Color.BLACK,\n borderDash: [5, 5],\n borderWidth: 1,\n pointBackgroundColor: Color.BLACK,\n pointBorderColor: Color.TGO_WHITE,\n pointHoverBackgroundColor: Color.TGO_WHITE,\n pointHoverBorderColor: Color.BLACK,\n });\n }\n this.radarChartData = {\n labels: this.spiderChartData.labels,\n datasets,\n };\n }\n\n private setChartOptions() {\n this.radarChartOptions = {\n responsive: true,\n elements: {\n line: {\n borderWidth: 3,\n },\n },\n layout: {\n padding: {\n left: 40,\n right: 40,\n top: 40,\n bottom: 40,\n },\n },\n scales: {\n r: {\n angleLines: {\n display: true,\n color: Color.BLACK,\n },\n grid: {\n color: context => {\n if (context.tick.value === 100) {\n return Color.BLACK;\n }\n return Color.GRAYSCALE_30;\n },\n },\n pointLabels: {\n color: 'black',\n font: {\n family: 'Arial',\n size: 14,\n },\n display: false,\n },\n suggestedMin: 0,\n suggestedMax: 100,\n ticks: {\n stepSize: this.stepSize,\n display: false,\n },\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n },\n };\n }\n\n ngAfterViewInit(): void {\n if (this.chart?.chart && !this.loading) {\n this.logCornerCoordinates(this.chart.chart);\n // Cache label styles after positions are calculated and DOM is rendered.\n // We deliberately use setTimeout(0) instead of afterNextRender here: the\n // callback must fire after the browser has fully painted (fonts swapped,\n // chart.js canvas drawn) so that offsetWidth/offsetHeight measurements\n // are sub-pixel stable. afterNextRender fires earlier (pre-paint) and\n // produced label-position drift in visual tests.\n setTimeout(() => this.cacheLabelStyles());\n }\n }\n\n private cacheLabelStyles(): void {\n if (!this.labelContainers) return;\n this.labelContainers.forEach((ref, index) => {\n const label = this.spiderChartData.labels[index];\n const el = ref.nativeElement as HTMLElement;\n this.labelStyles[label] = {\n left: this.getCenteredLabelLeftPosition(label, el.offsetWidth),\n bottom: this.getCenteredLabelBottomPosition(label, el.offsetHeight),\n };\n });\n this.labelStylesCached = true;\n this.cdr.detectChanges();\n }\n\n private logCornerCoordinates(chart: Chart) {\n const scale = chart.scales['r'] as any;\n const canvasWidth = this.size === 'large' ? LargeSpiderChartSize : SmallSpiderChartSize;\n const canvasHeight = this.size === 'large' ? LargeSpiderChartSize : SmallSpiderChartSize;\n\n // Loop through the labels and calculate the percentage coordinates\n this.spiderChartData.labels.forEach((label, index) => {\n const position = scale.getPointPositionForValue(index, scale.max);\n\n // Calculate percentage values relative to the canvas size\n const xPercent = (position.x / canvasWidth) * 100;\n const yPercent = ((canvasHeight - position.y) / canvasHeight) * 100; // Inverting the Y-axis\n\n this.labelPositions[label] = { x: Number(xPercent.toFixed(2)), y: Number(yPercent.toFixed(2)) };\n });\n this.labelPositionsVisible = true;\n }\n\n getCenteredLabelBottomPosition(label: string, height: number) {\n const position = this.labelPositions[label];\n const padding = 7;\n if (position.x > 50 || position.x < 50) {\n return `calc(${position.y}% - ${height / 2}px)`;\n } else if (position.y < 50) {\n return `calc(${position.y}% - ${height}px - ${padding}px)`;\n } else {\n return `calc(${position.y}% + ${padding}px)`;\n }\n }\n\n getCenteredLabelLeftPosition(label: string, width: number) {\n const position = this.labelPositions[label];\n const padding = 15;\n if (position.x === 50) {\n return `calc(${position.x}% - ${width / 2}px)`;\n } else if (position.x < 50) {\n return `calc(${position.x}% - ${width}px - ${padding}px)`;\n } else {\n return `calc(${position.x}% + ${padding}px)`;\n }\n }\n\n onLabelKeyDown(event: KeyboardEvent, index: number) {\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n this.focusNextLabel(index);\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n this.focusPreviousLabel(index);\n }\n }\n\n private focusNextLabel(index: number) {\n const nextIndex = index + 1;\n if (nextIndex < this.labelContainers.length) {\n this.labelContainers.get(nextIndex)?.nativeElement.focus();\n } else {\n this.labelContainers.first?.nativeElement.focus();\n }\n this.focusedLabelIndex = nextIndex;\n }\n\n private focusPreviousLabel(index: number) {\n const previousIndex = index - 1;\n if (previousIndex >= 0) {\n this.labelContainers.get(previousIndex)?.nativeElement.focus();\n } else {\n this.labelContainers.last?.nativeElement.focus();\n }\n this.focusedLabelIndex = previousIndex;\n }\n\n onLegendItemKeyDown(event: KeyboardEvent, index: number) {\n if (event.key === 'Enter') {\n this.toggleDatasetVisibility(index);\n } else if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n this.focusNextLegendItem(index);\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n this.focusPreviousLegendItem(index);\n }\n }\n\n private focusNextLegendItem(index: number) {\n const nextIndex = index + 1;\n if (nextIndex < this.legendItems.length) {\n this.legendItems.get(nextIndex)?.nativeElement.focus();\n } else {\n this.legendItems.first?.nativeElement.focus();\n }\n }\n\n private focusPreviousLegendItem(index: number) {\n const previousIndex = index - 1;\n if (previousIndex >= 0) {\n this.legendItems.get(previousIndex)?.nativeElement.focus();\n } else {\n this.legendItems.last?.nativeElement.focus();\n }\n }\n\n onFakeDataPointsKeyDown(event: KeyboardEvent, index: number, isSecondary: boolean = false) {\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n this.focusNextFakeDataPoint(index, isSecondary);\n this.showTooltipForDataPoint(index + 1 > this.spiderChartData.labels.length ? 0 : index + 1, isSecondary);\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n this.focusPreviousFakeDataPoint(index, isSecondary);\n this.showTooltipForDataPoint(index - 1 < 0 ? this.spiderChartData.labels.length - 1 : index - 1, isSecondary);\n } else if (event.key === 'Tab') {\n this.resetActiveElement();\n }\n }\n\n private focusNextFakeDataPoint(index: number, isSecondary: boolean = false) {\n const nextIndex = index + 1;\n if (nextIndex < this.fakeDataPoints.length) {\n const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;\n fakeDataPoints.get(nextIndex)?.nativeElement.focus();\n } else {\n const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;\n fakeDataPoints.first?.nativeElement.focus();\n }\n if (!isSecondary) {\n this.focusedFakeDataPointIndex = nextIndex;\n }\n }\n\n private focusPreviousFakeDataPoint(index: number, isSecondary: boolean = false) {\n const previousIndex = index - 1;\n if (previousIndex >= 0) {\n const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;\n fakeDataPoints.get(previousIndex)?.nativeElement.focus();\n } else {\n const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;\n fakeDataPoints.last?.nativeElement.focus();\n }\n if (!isSecondary) {\n this.focusedFakeDataPointIndex = previousIndex;\n }\n }\n\n showTooltipForDataPoint(index: number, isSecondary: boolean = false) {\n const chartInstance = this.chart?.chart;\n if (!chartInstance) return;\n const activeElement = [{ datasetIndex: isSecondary ? 1 : 0, index }];\n const meta = chartInstance.getDatasetMeta(isSecondary ? 1 : 0);\n const dataPoint = meta.data[index];\n const eventPosition = {\n x: dataPoint.x,\n y: dataPoint.y,\n };\n if (!isSecondary) {\n this.focusedFakeDataPointIndex = index;\n }\n\n chartInstance.tooltip?.setActiveElements(activeElement, eventPosition);\n\n chartInstance.update();\n }\n\n private resetActiveElement() {\n const chartInstance = this.chart?.chart;\n if (!chartInstance) return;\n\n // Clear the active elements to hide the tooltip\n chartInstance.tooltip?.setActiveElements([], { x: 0, y: 0 });\n\n chartInstance.update();\n }\n\n toggleDatasetVisibility(datasetIndex: number) {\n const chartInstance = this.chart?.chart;\n if (!chartInstance) return;\n\n const dataset = chartInstance.data.datasets[datasetIndex];\n dataset.hidden = !dataset.hidden;\n chartInstance.update();\n }\n\n isDatasetVisible(datasetIndex: number) {\n const chartInstance = this.chart?.chart;\n if (!chartInstance) return;\n return !chartInstance.data.datasets[datasetIndex].hidden;\n }\n\n getFirstLine(label: string): string {\n const words = label.split(' ');\n let firstLine = '';\n for (const word of words) {\n if ((firstLine + word).length <= 20) {\n firstLine += (firstLine ? ' ' : '') + word;\n } else {\n break;\n }\n }\n return firstLine;\n }\n\n getSecondLine(label: string): string {\n const firstLine = this.getFirstLine(label);\n return label.substring(firstLine.length).trim();\n }\n}\n","<div class=\"spider-chart-container\" tabindex=\"0\" [attr.aria-label]=\"ariaLabel\">\n <div\n class=\"spacing-container\"\n [ngClass]=\"{ 'small-spacing': radarChartData.labels && radarChartData.labels.length % 2 === 1 && !loading }\"\n >\n <div\n class=\"chart-container\"\n [style.width]=\"size === 'large' ? '280px' : '200px'\"\n [style.height]=\"size === 'large' ? '280px' : '200px'\"\n >\n @if (!loading) {\n <canvas baseChart [data]=\"radarChartData\" [options]=\"radarChartOptions\" type=\"radar\" class=\"chart\"> </canvas>\n } @else {\n <canvas baseChart [data]=\"loadingChartData\" [options]=\"loadingChartOptions\" type=\"radar\" class=\"chart\">\n </canvas>\n <ui-spinner></ui-spinner>\n }\n\n @if (labelPositionsVisible) {\n <div class=\"overlay-container\" [style.visibility]=\"labelStylesCached ? 'visible' : 'hidden'\">\n @for (label of spiderChartData.labels; track label) {\n <div\n class=\"label-container\"\n #labelContainer\n [matTooltip]=\"spiderChartData.labelDescription[$index]\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n (keydown)=\"onLabelKeyDown($event, $index)\"\n [attr.aria-label]=\"spiderChartData.labelDescription[$index]\"\n [style.left]=\"labelStyles[label]?.left\"\n [style.bottom]=\"labelStyles[label]?.bottom\"\n >\n @if (!(label.length > 20 && size === 'large' && spiderChartData.labels.length < 9)) {\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label }}\n </div>\n } @else {\n <div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getFirstLine }}\n </div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getSecondLine : this }}\n </div>\n </div>\n }\n <span class=\"value\">{{ spiderChartData.plotData[0].data[$index] }}</span>\n </div>\n <span\n class=\"fake-data-points\"\n #fakeDataPoints\n [tabindex]=\"focusedLabelIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedLabelIndex ? showTooltipForDataPoint($index) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index)\"\n >\n </span>\n @if (radarChartData.datasets.length > 1) {\n <span\n class=\"fake-data-points-secondary\"\n #fakeDataPointsSecondary\n [tabindex]=\"focusedFakeDataPointIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedFakeDataPointIndex ? showTooltipForDataPoint($index, true) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index, true)\"\n >\n </span>\n }\n }\n </div>\n }\n </div>\n </div>\n @if (radarChartData.datasets.length > 0) {\n <div class=\"legend-container\">\n @for (dataset of radarChartData.datasets; track dataset.label) {\n <div\n class=\"legend-item\"\n (click)=\"toggleDatasetVisibility($index)\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n role=\"button\"\n [attr.aria-pressed]=\"isDatasetVisible($index) ? false : true\"\n [attr.aria-label]=\"\n isDatasetVisible($index)\n ? (translationContext + 'DATASET_VISIBLE' | uiTranslate: { dataset: dataset.label } | async)\n : (translationContext + 'DATASET_HIDDEN' | uiTranslate: { dataset: dataset.label } | async)\n \"\n (keydown)=\"onLegendItemKeyDown($event, $index)\"\n #legendItem\n >\n <span class=\"legend-line\" [ngClass]=\"{ 'solid-line': $index === 0, 'dashed-line': $index === 1 }\"></span>\n <span class=\"legend-label\" [style.text-decoration]=\"isDatasetVisible($index) ? 'none' : 'line-through'\">\n {{ dataset.label }}\n </span>\n </div>\n }\n </div>\n }\n</div>\n","import { NgModule } from '@angular/core';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { SpiderChartComponent } from './spider-chart.component';\nimport { BaseChartDirective } from 'ng2-charts';\nimport { Chart, registerables } from 'chart.js';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CommonModule, NgClass } from '@angular/common';\nimport { SpinnerComponentModule } from '@testgorilla/tgo-ui/components/spinner';\nimport { MemoizeFuncPipe } from '@testgorilla/tgo-ui/components/core';\n\nChart.register(...registerables);\n\n@NgModule({\n declarations: [SpiderChartComponent],\n exports: [SpiderChartComponent],\n imports: [\n NgClass,\n UiTranslatePipe,\n BaseChartDirective,\n MatTooltipModule,\n UiTranslatePipe,\n MemoizeFuncPipe,\n SpinnerComponentModule,\n CommonModule,\n ],\n})\nexport class SpiderChartComponentModule {}\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":"testgorilla-tgo-ui-components-spider-chart.mjs","sources":["../../../components/spider-chart/spider-chart.model.ts","../../../components/spider-chart/spider-chart.component.ts","../../../components/spider-chart/spider-chart.component.html","../../../components/spider-chart/spider-chart.module.ts","../../../components/spider-chart/testgorilla-tgo-ui-components-spider-chart.ts"],"sourcesContent":["export type SpiderChartSize = 'large' | 'small';\n// These are the sizes of the canvas, not the chart itself. It includes 40px of padding on all sides.\nexport const SmallSpiderChartSize = 200;\nexport const LargeSpiderChartSize = 280;\nexport type SpiderChartData = {\n labels: string[];\n labelDescription: string[];\n plotData: [PlotData, PlotData] | [PlotData]; // Current implementation supports max 2 datasets.\n};\nexport type PlotData = {\n databaseLabel: string;\n data: number[];\n};\n","import { NgClass, AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n Input,\n OnInit,\n QueryList,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { Chart, ChartData, ChartOptions, RadialLinearScale } from 'chart.js';\nimport { BaseChartDirective } from 'ng2-charts';\n\nimport { ApplicationTheme, Color, UiTranslatePipe, MemoizeFuncPipe } from '@testgorilla/tgo-ui/components/core';\nimport { SpinnerComponent } from '@testgorilla/tgo-ui/components/spinner';\n\nimport { LargeSpiderChartSize, SmallSpiderChartSize, SpiderChartData, SpiderChartSize } from './spider-chart.model';\n\n@Component({\n selector: 'ui-spider-chart',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './spider-chart.component.html',\n styleUrls: ['./spider-chart.component.scss'],\n imports: [NgClass, BaseChartDirective, SpinnerComponent, MatTooltip, UiTranslatePipe, MemoizeFuncPipe, AsyncPipe],\n})\nexport class SpiderChartComponent implements OnInit, AfterViewInit {\n /**\n * The size of the spider chart.\n * @type {SpiderChartSize}\n * @memberof SpiderChartComponent\n */\n @Input() size: SpiderChartSize = 'large';\n\n /**\n * The data to be used for the spider chart.\n * @type {SpiderChartData}\n * @memberof SpiderChartComponent\n */\n @Input() spiderChartData: SpiderChartData;\n\n /**\n * The step size for the spider chart.\n * @type {number}\n * @memberof SpiderChartComponent\n */\n @Input() stepSize = 20;\n\n /**\n * The aria label for the spider chart.\n * @type {string}\n * @memberof SpiderChartComponent\n */\n @Input() ariaLabel = 'Radar chart. Press tab to navigate through the chart.';\n\n /**\n * Whether the spider chart is loading.\n * @type {boolean}\n * @memberof SpiderChartComponent\n */\n @Input() loading = false;\n\n /**\n *\n * Defines the application theme\n *\n * @type {ApplicationTheme}\n * @memberof SpinnerComponent\n */\n @Input() applicationTheme: ApplicationTheme = 'light';\n\n @ViewChild(BaseChartDirective) chart: BaseChartDirective;\n @ViewChildren('labelContainer') labelContainers: QueryList<ElementRef<HTMLElement>>;\n @ViewChildren('fakeDataPoints') fakeDataPoints: QueryList<ElementRef<HTMLElement>>;\n @ViewChildren('fakeDataPointsSecondary') fakeDataPointsSecondary: QueryList<ElementRef<HTMLElement>>;\n @ViewChildren('legendItem') legendItems: QueryList<ElementRef<HTMLElement>>;\n\n radarChartData: ChartData<'radar'> = {\n labels: [],\n datasets: [],\n };\n radarChartOptions: ChartOptions<'radar'>;\n labelPositions: { [key: string]: { x: number; y: number } } = {};\n labelStyles: { [key: string]: { left: string; bottom: string } } = {};\n labelPositionsVisible = false;\n labelStylesCached = false;\n focusedLabelIndex = 0;\n focusedFakeDataPointIndex = 0;\n loadingChartData: ChartData<'radar'> = {\n labels: [1, 2, 3, 4, 5, 6],\n datasets: [],\n };\n loadingChartOptions: ChartOptions<'radar'> = {\n responsive: true,\n layout: {\n padding: {\n left: 40,\n right: 40,\n top: 40,\n bottom: 40,\n },\n },\n scales: {\n r: {\n angleLines: {\n display: true,\n color: Color.GRAYSCALE_30,\n },\n grid: {\n color: () => Color.GRAYSCALE_30,\n },\n pointLabels: {\n display: false,\n },\n suggestedMin: 0,\n suggestedMax: 100,\n ticks: {\n stepSize: this.stepSize,\n display: false,\n },\n },\n },\n };\n protected readonly translationContext = 'CHARTS.SPIDER.';\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n ngOnInit(): void {\n if (!this.loading) {\n this.handleInputErrors();\n this.setChartData();\n this.setChartOptions();\n }\n }\n\n private handleInputErrors() {\n if (!this.spiderChartData.labels || this.spiderChartData.labels.length === 0) {\n throw new Error('The \"labels\" input is required and cannot be empty.');\n }\n if (!this.spiderChartData.labelDescription || this.spiderChartData.labelDescription.length === 0) {\n throw new Error('The \"labelDescription\" input is required and cannot be empty.');\n }\n if (\n this.spiderChartData.labelDescription &&\n this.spiderChartData.labelDescription.length !== this.spiderChartData.labels.length\n ) {\n throw new Error('The \"labelDescription\" input must have the same length as \"labels\".');\n }\n if (!this.spiderChartData.plotData[0].databaseLabel) {\n throw new Error('The \"plotData.databaseLabel\" input is required.');\n }\n if (!this.spiderChartData.plotData[0].data || this.spiderChartData.plotData[0].data.length === 0) {\n throw new Error('The \"plotData.data\" input is required and cannot be empty.');\n }\n if (this.spiderChartData.plotData[0].data.length !== this.spiderChartData.labels.length) {\n throw new Error('The \"plotData.data\" input must have the same length as \"labels\".');\n }\n if (\n this.spiderChartData.plotData.length === 2 &&\n this.spiderChartData.labels.length > 0 &&\n this.spiderChartData.plotData[1].data &&\n this.spiderChartData.plotData[1].data.length !== this.spiderChartData.labels.length\n ) {\n throw new Error('The \"plotData.data\" input must have the same length as \"labels\".');\n }\n }\n\n private setChartData() {\n const datasets = [];\n datasets.push({\n label: this.spiderChartData.plotData[0].databaseLabel,\n data: this.spiderChartData.plotData[0].data,\n fill: true,\n backgroundColor: 'rgba(212, 16, 170, 0.2)',\n borderColor: Color.BRAND_50,\n pointBackgroundColor: Color.BRAND_50,\n pointBorderColor: Color.TGO_WHITE,\n pointHoverBackgroundColor: Color.TGO_WHITE,\n pointHoverBorderColor: Color.BRAND_50,\n });\n if (this.spiderChartData.plotData.length === 2) {\n datasets.push({\n label: this.spiderChartData.plotData[1].databaseLabel,\n data: this.spiderChartData.plotData[1].data,\n fill: false,\n borderColor: Color.BLACK,\n borderDash: [5, 5],\n borderWidth: 1,\n pointBackgroundColor: Color.BLACK,\n pointBorderColor: Color.TGO_WHITE,\n pointHoverBackgroundColor: Color.TGO_WHITE,\n pointHoverBorderColor: Color.BLACK,\n });\n }\n this.radarChartData = {\n labels: this.spiderChartData.labels,\n datasets,\n };\n }\n\n private setChartOptions() {\n this.radarChartOptions = {\n responsive: true,\n elements: {\n line: {\n borderWidth: 3,\n },\n },\n layout: {\n padding: {\n left: 40,\n right: 40,\n top: 40,\n bottom: 40,\n },\n },\n scales: {\n r: {\n angleLines: {\n display: true,\n color: Color.BLACK,\n },\n grid: {\n color: context => {\n if (context.tick.value === 100) {\n return Color.BLACK;\n }\n return Color.GRAYSCALE_30;\n },\n },\n pointLabels: {\n color: 'black',\n font: {\n family: 'Arial',\n size: 14,\n },\n display: false,\n },\n suggestedMin: 0,\n suggestedMax: 100,\n ticks: {\n stepSize: this.stepSize,\n display: false,\n },\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n },\n };\n }\n\n ngAfterViewInit(): void {\n if (this.chart?.chart && !this.loading) {\n this.logCornerCoordinates(this.chart.chart);\n // Under OnPush nothing re-checks this view between AfterViewInit and the\n // measurement timeout, so render the (still hidden) label containers now —\n // otherwise the `@if (labelPositionsVisible)` block hasn't been created yet\n // and cacheLabelStyles() measures an empty ViewChildren list.\n this.cdr.detectChanges();\n // Cache label styles after positions are calculated and DOM is rendered.\n // We deliberately use setTimeout(0) instead of afterNextRender here: the\n // callback must fire after the browser has fully painted (fonts swapped,\n // chart.js canvas drawn) so that offsetWidth/offsetHeight measurements\n // are sub-pixel stable. afterNextRender fires earlier (pre-paint) and\n // produced label-position drift in visual tests.\n setTimeout(() => this.cacheLabelStyles());\n }\n }\n\n private cacheLabelStyles(): void {\n if (!this.labelContainers) {\n return;\n }\n this.labelContainers.forEach((ref, index) => {\n const label = this.spiderChartData.labels[index];\n const el = ref.nativeElement;\n this.labelStyles[label] = {\n left: this.getCenteredLabelLeftPosition(label, el.offsetWidth),\n bottom: this.getCenteredLabelBottomPosition(label, el.offsetHeight),\n };\n });\n this.labelStylesCached = true;\n this.cdr.detectChanges();\n }\n\n private logCornerCoordinates(chart: Chart) {\n const scale = chart.scales['r'] as RadialLinearScale;\n const canvasWidth = this.size === 'large' ? LargeSpiderChartSize : SmallSpiderChartSize;\n const canvasHeight = this.size === 'large' ? LargeSpiderChartSize : SmallSpiderChartSize;\n\n // Loop through the labels and calculate the percentage coordinates\n this.spiderChartData.labels.forEach((label, index) => {\n const position = scale.getPointPositionForValue(index, scale.max);\n\n // Calculate percentage values relative to the canvas size\n const xPercent = (position.x / canvasWidth) * 100;\n const yPercent = ((canvasHeight - position.y) / canvasHeight) * 100; // Inverting the Y-axis\n\n this.labelPositions[label] = { x: Number(xPercent.toFixed(2)), y: Number(yPercent.toFixed(2)) };\n });\n this.labelPositionsVisible = true;\n }\n\n getCenteredLabelBottomPosition(label: string, height: number) {\n const position = this.labelPositions[label];\n const padding = 7;\n if (position.x > 50 || position.x < 50) {\n return `calc(${position.y}% - ${height / 2}px)`;\n } else if (position.y < 50) {\n return `calc(${position.y}% - ${height}px - ${padding}px)`;\n } else {\n return `calc(${position.y}% + ${padding}px)`;\n }\n }\n\n getCenteredLabelLeftPosition(label: string, width: number) {\n const position = this.labelPositions[label];\n const padding = 15;\n if (position.x === 50) {\n return `calc(${position.x}% - ${width / 2}px)`;\n } else if (position.x < 50) {\n return `calc(${position.x}% - ${width}px - ${padding}px)`;\n } else {\n return `calc(${position.x}% + ${padding}px)`;\n }\n }\n\n onLabelKeyDown(event: KeyboardEvent, index: number) {\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n this.focusNextLabel(index);\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n this.focusPreviousLabel(index);\n }\n }\n\n private focusNextLabel(index: number) {\n const nextIndex = index + 1;\n if (nextIndex < this.labelContainers.length) {\n this.labelContainers.get(nextIndex)?.nativeElement.focus();\n } else {\n this.labelContainers.first?.nativeElement.focus();\n }\n this.focusedLabelIndex = nextIndex;\n }\n\n private focusPreviousLabel(index: number) {\n const previousIndex = index - 1;\n if (previousIndex >= 0) {\n this.labelContainers.get(previousIndex)?.nativeElement.focus();\n } else {\n this.labelContainers.last?.nativeElement.focus();\n }\n this.focusedLabelIndex = previousIndex;\n }\n\n onLegendItemKeyDown(event: KeyboardEvent, index: number) {\n if (event.key === 'Enter') {\n this.toggleDatasetVisibility(index);\n } else if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n this.focusNextLegendItem(index);\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n this.focusPreviousLegendItem(index);\n }\n }\n\n private focusNextLegendItem(index: number) {\n const nextIndex = index + 1;\n if (nextIndex < this.legendItems.length) {\n this.legendItems.get(nextIndex)?.nativeElement.focus();\n } else {\n this.legendItems.first?.nativeElement.focus();\n }\n }\n\n private focusPreviousLegendItem(index: number) {\n const previousIndex = index - 1;\n if (previousIndex >= 0) {\n this.legendItems.get(previousIndex)?.nativeElement.focus();\n } else {\n this.legendItems.last?.nativeElement.focus();\n }\n }\n\n onFakeDataPointsKeyDown(event: KeyboardEvent, index: number, isSecondary: boolean = false) {\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n this.focusNextFakeDataPoint(index, isSecondary);\n this.showTooltipForDataPoint(index + 1 > this.spiderChartData.labels.length ? 0 : index + 1, isSecondary);\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n this.focusPreviousFakeDataPoint(index, isSecondary);\n this.showTooltipForDataPoint(index - 1 < 0 ? this.spiderChartData.labels.length - 1 : index - 1, isSecondary);\n } else if (event.key === 'Tab') {\n this.resetActiveElement();\n }\n }\n\n private focusNextFakeDataPoint(index: number, isSecondary: boolean = false) {\n const nextIndex = index + 1;\n if (nextIndex < this.fakeDataPoints.length) {\n const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;\n fakeDataPoints.get(nextIndex)?.nativeElement.focus();\n } else {\n const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;\n fakeDataPoints.first?.nativeElement.focus();\n }\n if (!isSecondary) {\n this.focusedFakeDataPointIndex = nextIndex;\n }\n }\n\n private focusPreviousFakeDataPoint(index: number, isSecondary: boolean = false) {\n const previousIndex = index - 1;\n if (previousIndex >= 0) {\n const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;\n fakeDataPoints.get(previousIndex)?.nativeElement.focus();\n } else {\n const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;\n fakeDataPoints.last?.nativeElement.focus();\n }\n if (!isSecondary) {\n this.focusedFakeDataPointIndex = previousIndex;\n }\n }\n\n showTooltipForDataPoint(index: number, isSecondary: boolean = false) {\n const chartInstance = this.chart?.chart;\n if (!chartInstance) {\n return;\n }\n const activeElement = [{ datasetIndex: isSecondary ? 1 : 0, index }];\n const meta = chartInstance.getDatasetMeta(isSecondary ? 1 : 0);\n const dataPoint = meta.data[index];\n const eventPosition = {\n x: dataPoint.x,\n y: dataPoint.y,\n };\n if (!isSecondary) {\n this.focusedFakeDataPointIndex = index;\n }\n\n chartInstance.tooltip?.setActiveElements(activeElement, eventPosition);\n\n chartInstance.update();\n }\n\n private resetActiveElement() {\n const chartInstance = this.chart?.chart;\n if (!chartInstance) {\n return;\n }\n\n // Clear the active elements to hide the tooltip\n chartInstance.tooltip?.setActiveElements([], { x: 0, y: 0 });\n\n chartInstance.update();\n }\n\n toggleDatasetVisibility(datasetIndex: number) {\n const chartInstance = this.chart?.chart;\n if (!chartInstance) {\n return;\n }\n\n const dataset = chartInstance.data.datasets[datasetIndex];\n dataset.hidden = !dataset.hidden;\n chartInstance.update();\n }\n\n isDatasetVisible(datasetIndex: number) {\n const chartInstance = this.chart?.chart;\n if (!chartInstance) {\n return;\n }\n return !chartInstance.data.datasets[datasetIndex].hidden;\n }\n\n getFirstLine(label: string): string {\n const words = label.split(' ');\n let firstLine = '';\n for (const word of words) {\n if ((firstLine + word).length <= 20) {\n firstLine += (firstLine ? ' ' : '') + word;\n } else {\n break;\n }\n }\n return firstLine;\n }\n\n getSecondLine(label: string): string {\n const firstLine = this.getFirstLine(label);\n return label.substring(firstLine.length).trim();\n }\n}\n","<div class=\"spider-chart-container\" tabindex=\"0\" [attr.aria-label]=\"ariaLabel\">\n <div\n class=\"spacing-container\"\n [ngClass]=\"{ 'small-spacing': radarChartData.labels && radarChartData.labels.length % 2 === 1 && !loading }\"\n >\n <div\n class=\"chart-container\"\n [style.width]=\"size === 'large' ? '280px' : '200px'\"\n [style.height]=\"size === 'large' ? '280px' : '200px'\"\n >\n @if (!loading) {\n <canvas baseChart [data]=\"radarChartData\" [options]=\"radarChartOptions\" type=\"radar\" class=\"chart\"> </canvas>\n } @else {\n <canvas baseChart [data]=\"loadingChartData\" [options]=\"loadingChartOptions\" type=\"radar\" class=\"chart\">\n </canvas>\n <ui-spinner></ui-spinner>\n }\n\n @if (labelPositionsVisible) {\n <div class=\"overlay-container\" [style.visibility]=\"labelStylesCached ? 'visible' : 'hidden'\">\n @for (label of spiderChartData.labels; track label) {\n <div\n class=\"label-container\"\n #labelContainer\n [matTooltip]=\"spiderChartData.labelDescription[$index]\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n (keydown)=\"onLabelKeyDown($event, $index)\"\n [attr.aria-label]=\"spiderChartData.labelDescription[$index]\"\n [style.left]=\"labelStyles[label]?.left\"\n [style.bottom]=\"labelStyles[label]?.bottom\"\n >\n @if (!(label.length > 20 && size === 'large' && spiderChartData.labels.length < 9)) {\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label }}\n </div>\n } @else {\n <div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getFirstLine }}\n </div>\n <div class=\"label\" [style.max-width]=\"size === 'large' ? '135px' : '100px'\">\n {{ label | memoizeFunc: getSecondLine : this }}\n </div>\n </div>\n }\n <span class=\"value\">{{ spiderChartData.plotData[0].data[$index] }}</span>\n </div>\n <span\n class=\"fake-data-points\"\n #fakeDataPoints\n [tabindex]=\"focusedLabelIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedLabelIndex ? showTooltipForDataPoint($index) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index)\"\n >\n </span>\n @if (radarChartData.datasets.length > 1) {\n <span\n class=\"fake-data-points-secondary\"\n #fakeDataPointsSecondary\n [tabindex]=\"focusedFakeDataPointIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedFakeDataPointIndex ? showTooltipForDataPoint($index, true) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index, true)\"\n >\n </span>\n }\n }\n </div>\n }\n </div>\n </div>\n @if (radarChartData.datasets.length > 0) {\n <div class=\"legend-container\">\n @for (dataset of radarChartData.datasets; track dataset.label) {\n <div\n class=\"legend-item\"\n (click)=\"toggleDatasetVisibility($index)\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n role=\"button\"\n [attr.aria-pressed]=\"isDatasetVisible($index) ? false : true\"\n [attr.aria-label]=\"\n isDatasetVisible($index)\n ? (translationContext + 'DATASET_VISIBLE' | uiTranslate: { dataset: dataset.label } | async)\n : (translationContext + 'DATASET_HIDDEN' | uiTranslate: { dataset: dataset.label } | async)\n \"\n (keydown)=\"onLegendItemKeyDown($event, $index)\"\n #legendItem\n >\n <span class=\"legend-line\" [ngClass]=\"{ 'solid-line': $index === 0, 'dashed-line': $index === 1 }\"></span>\n <span class=\"legend-label\" [style.text-decoration]=\"isDatasetVisible($index) ? 'none' : 'line-through'\">\n {{ dataset.label }}\n </span>\n </div>\n }\n </div>\n }\n</div>\n","import { CommonModule, NgClass } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Chart, registerables } from 'chart.js';\nimport { BaseChartDirective } from 'ng2-charts';\n\nimport { UiTranslatePipe, MemoizeFuncPipe } from '@testgorilla/tgo-ui/components/core';\nimport { SpinnerComponentModule } from '@testgorilla/tgo-ui/components/spinner';\n\nimport { SpiderChartComponent } from './spider-chart.component';\n\nChart.register(...registerables);\n\n@NgModule({\n exports: [SpiderChartComponent],\n imports: [\n NgClass,\n UiTranslatePipe,\n BaseChartDirective,\n MatTooltipModule,\n MemoizeFuncPipe,\n SpinnerComponentModule,\n CommonModule,\n SpiderChartComponent,\n ],\n})\nexport class SpiderChartComponentModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}