@valtimo/dashboard 12.0.0 → 12.1.1

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 (210) hide show
  1. package/esm2022/lib/components/widget-dashboard/widget-dashboard.component.mjs +7 -7
  2. package/esm2022/lib/components/widget-dashboard-content/widget-dashboard-content.component.mjs +57 -15
  3. package/esm2022/lib/constants/data-features.constants.mjs +2 -1
  4. package/esm2022/lib/data-sources/case-count/case-count.specification.mjs +4 -4
  5. package/esm2022/lib/data-sources/case-count/components/case-count-configuration/case-count-configuration.component.mjs +4 -4
  6. package/esm2022/lib/data-sources/case-count/models/case-count.model.mjs +2 -11
  7. package/esm2022/lib/data-sources/case-counts/case-counts.module.mjs +76 -0
  8. package/esm2022/lib/data-sources/case-counts/case-counts.specification.mjs +77 -0
  9. package/esm2022/lib/data-sources/case-counts/components/case-counts-configuration/case-counts-configuration.component.mjs +202 -0
  10. package/esm2022/lib/data-sources/case-counts/components/case-counts-configuration/index.mjs +17 -0
  11. package/esm2022/lib/data-sources/case-counts/components/index.mjs +17 -0
  12. package/esm2022/lib/data-sources/case-counts/index.mjs +20 -0
  13. package/esm2022/lib/data-sources/case-counts/models/case-counts.model.mjs +17 -0
  14. package/esm2022/lib/data-sources/case-counts/models/index.mjs +17 -0
  15. package/esm2022/lib/data-sources/case-group-by/case-group-by.module.mjs +61 -0
  16. package/esm2022/lib/data-sources/case-group-by/case-group-by.specification.mjs +89 -0
  17. package/esm2022/lib/data-sources/case-group-by/components/case-group-by-configuration/case-group-by-configuration.component.mjs +206 -0
  18. package/esm2022/lib/data-sources/case-group-by/components/case-group-by-configuration/index.mjs +17 -0
  19. package/esm2022/lib/{display-types/bar-chart → data-sources/case-group-by/components}/index.mjs +2 -5
  20. package/esm2022/lib/data-sources/case-group-by/index.mjs +20 -0
  21. package/esm2022/lib/data-sources/case-group-by/models/case-group-by.model.mjs +17 -0
  22. package/esm2022/lib/data-sources/case-group-by/models/index.mjs +17 -0
  23. package/esm2022/lib/data-sources/index.mjs +3 -2
  24. package/esm2022/lib/display-types/big-number/components/big-number-configuration/big-number-configuration.component.mjs +1 -1
  25. package/esm2022/lib/display-types/big-number/components/big-number-display/big-number-display.component.mjs +2 -2
  26. package/esm2022/lib/display-types/donut/components/donut-configuration/donut-configuration.component.mjs +89 -0
  27. package/esm2022/lib/display-types/donut/components/donut-configuration/index.mjs +17 -0
  28. package/esm2022/lib/display-types/donut/components/donut-display/donut-display.component.mjs +72 -0
  29. package/esm2022/lib/display-types/donut/components/donut-display/index.mjs +17 -0
  30. package/esm2022/lib/display-types/donut/components/index.mjs +18 -0
  31. package/esm2022/lib/display-types/donut/donut.module.mjs +68 -0
  32. package/esm2022/lib/display-types/donut/donut.specification.mjs +55 -0
  33. package/esm2022/lib/display-types/donut/index.mjs +20 -0
  34. package/esm2022/lib/display-types/donut/models/donut.model.mjs +17 -0
  35. package/esm2022/lib/display-types/donut/models/index.mjs +17 -0
  36. package/esm2022/lib/display-types/gauge/components/gauge-configuration/gauge-configuration.component.mjs +89 -0
  37. package/esm2022/lib/display-types/gauge/components/gauge-configuration/index.mjs +17 -0
  38. package/esm2022/lib/display-types/gauge/components/gauge-display/gauge-display.component.mjs +86 -0
  39. package/esm2022/lib/display-types/gauge/components/gauge-display/index.mjs +17 -0
  40. package/esm2022/lib/display-types/gauge/components/index.mjs +18 -0
  41. package/esm2022/lib/display-types/gauge/gauge.module.mjs +60 -0
  42. package/esm2022/lib/display-types/gauge/gauge.specification.mjs +55 -0
  43. package/esm2022/lib/display-types/gauge/index.mjs +20 -0
  44. package/esm2022/lib/display-types/gauge/models/gauge.model.mjs +17 -0
  45. package/esm2022/lib/display-types/gauge/models/index.mjs +17 -0
  46. package/esm2022/lib/display-types/index.mjs +3 -2
  47. package/esm2022/lib/display-types/meter/components/index.mjs +2 -1
  48. package/esm2022/lib/display-types/meter/components/meter-configuration/index.mjs +17 -0
  49. package/esm2022/lib/display-types/meter/components/meter-configuration/meter-configuration.component.mjs +83 -0
  50. package/esm2022/lib/display-types/meter/components/meter-display/meter-display.component.mjs +44 -5
  51. package/esm2022/lib/display-types/meter/index.mjs +2 -2
  52. package/esm2022/lib/display-types/meter/meter.module.mjs +38 -6
  53. package/esm2022/lib/display-types/meter/meter.specification.mjs +23 -3
  54. package/esm2022/lib/display-types/meter/models/meter.model.mjs +1 -1
  55. package/esm2022/lib/models/configuration.model.mjs +1 -1
  56. package/esm2022/lib/models/data-source.model.mjs +11 -2
  57. package/esm2022/lib/services/widget-layout.service.mjs +28 -82
  58. package/fesm2022/valtimo-dashboard.mjs +1783 -489
  59. package/fesm2022/valtimo-dashboard.mjs.map +1 -1
  60. package/lib/components/widget-dashboard/widget-dashboard.component.d.ts +1 -0
  61. package/lib/components/widget-dashboard/widget-dashboard.component.d.ts.map +1 -1
  62. package/lib/components/widget-dashboard-content/widget-dashboard-content.component.d.ts +9 -3
  63. package/lib/components/widget-dashboard-content/widget-dashboard-content.component.d.ts.map +1 -1
  64. package/lib/constants/data-features.constants.d.ts +1 -0
  65. package/lib/constants/data-features.constants.d.ts.map +1 -1
  66. package/lib/data-sources/case-count/components/case-count-configuration/case-count-configuration.component.d.ts +1 -1
  67. package/lib/data-sources/case-count/components/case-count-configuration/case-count-configuration.component.d.ts.map +1 -1
  68. package/lib/data-sources/case-count/models/case-count.model.d.ts +3 -15
  69. package/lib/data-sources/case-count/models/case-count.model.d.ts.map +1 -1
  70. package/lib/data-sources/case-counts/case-counts.module.d.ts +13 -0
  71. package/lib/data-sources/case-counts/case-counts.module.d.ts.map +1 -0
  72. package/lib/data-sources/case-counts/case-counts.specification.d.ts +3 -0
  73. package/lib/data-sources/case-counts/case-counts.specification.d.ts.map +1 -0
  74. package/lib/data-sources/case-counts/components/case-counts-configuration/case-counts-configuration.component.d.ts +52 -0
  75. package/lib/data-sources/case-counts/components/case-counts-configuration/case-counts-configuration.component.d.ts.map +1 -0
  76. package/lib/data-sources/case-counts/components/case-counts-configuration/index.d.ts +2 -0
  77. package/lib/data-sources/{test/components/test-configuration → case-counts/components/case-counts-configuration}/index.d.ts.map +1 -1
  78. package/lib/data-sources/case-counts/components/index.d.ts +2 -0
  79. package/lib/data-sources/case-counts/components/index.d.ts.map +1 -0
  80. package/lib/data-sources/case-counts/index.d.ts +5 -0
  81. package/lib/data-sources/case-counts/index.d.ts.map +1 -0
  82. package/lib/data-sources/case-counts/models/case-counts.model.d.ts +16 -0
  83. package/lib/data-sources/case-counts/models/case-counts.model.d.ts.map +1 -0
  84. package/lib/data-sources/case-counts/models/index.d.ts +2 -0
  85. package/lib/data-sources/{test/components → case-counts/models}/index.d.ts.map +1 -1
  86. package/lib/data-sources/case-group-by/case-group-by.module.d.ts +13 -0
  87. package/lib/data-sources/case-group-by/case-group-by.module.d.ts.map +1 -0
  88. package/lib/data-sources/case-group-by/case-group-by.specification.d.ts +3 -0
  89. package/lib/data-sources/case-group-by/case-group-by.specification.d.ts.map +1 -0
  90. package/lib/data-sources/case-group-by/components/case-group-by-configuration/case-group-by-configuration.component.d.ts +54 -0
  91. package/lib/data-sources/case-group-by/components/case-group-by-configuration/case-group-by-configuration.component.d.ts.map +1 -0
  92. package/lib/data-sources/case-group-by/components/case-group-by-configuration/index.d.ts +2 -0
  93. package/lib/data-sources/case-group-by/components/case-group-by-configuration/index.d.ts.map +1 -0
  94. package/lib/data-sources/case-group-by/components/index.d.ts +2 -0
  95. package/lib/data-sources/case-group-by/components/index.d.ts.map +1 -0
  96. package/lib/data-sources/case-group-by/index.d.ts +5 -0
  97. package/lib/data-sources/case-group-by/index.d.ts.map +1 -0
  98. package/lib/data-sources/case-group-by/models/case-group-by.model.d.ts +19 -0
  99. package/lib/data-sources/case-group-by/models/case-group-by.model.d.ts.map +1 -0
  100. package/lib/data-sources/case-group-by/models/index.d.ts +2 -0
  101. package/lib/data-sources/{test → case-group-by}/models/index.d.ts.map +1 -1
  102. package/lib/data-sources/index.d.ts +2 -1
  103. package/lib/data-sources/index.d.ts.map +1 -1
  104. package/lib/display-types/big-number/components/big-number-configuration/big-number-configuration.component.d.ts +10 -10
  105. package/lib/display-types/big-number/components/big-number-configuration/big-number-configuration.component.d.ts.map +1 -1
  106. package/lib/display-types/donut/components/donut-configuration/donut-configuration.component.d.ts +29 -0
  107. package/lib/display-types/donut/components/donut-configuration/donut-configuration.component.d.ts.map +1 -0
  108. package/lib/display-types/donut/components/donut-configuration/index.d.ts +2 -0
  109. package/lib/display-types/{bar-chart/components/bar-chart-display → donut/components/donut-configuration}/index.d.ts.map +1 -1
  110. package/lib/display-types/donut/components/donut-display/donut-display.component.d.ts +19 -0
  111. package/lib/display-types/donut/components/donut-display/donut-display.component.d.ts.map +1 -0
  112. package/lib/display-types/donut/components/donut-display/index.d.ts +2 -0
  113. package/lib/display-types/donut/components/donut-display/index.d.ts.map +1 -0
  114. package/lib/display-types/donut/components/index.d.ts +3 -0
  115. package/lib/display-types/donut/components/index.d.ts.map +1 -0
  116. package/lib/display-types/donut/donut.module.d.ts +16 -0
  117. package/lib/display-types/donut/donut.module.d.ts.map +1 -0
  118. package/lib/display-types/donut/donut.specification.d.ts +3 -0
  119. package/lib/display-types/donut/donut.specification.d.ts.map +1 -0
  120. package/lib/display-types/donut/index.d.ts +5 -0
  121. package/lib/display-types/donut/index.d.ts.map +1 -0
  122. package/lib/display-types/donut/models/donut.model.d.ts +14 -0
  123. package/lib/display-types/donut/models/donut.model.d.ts.map +1 -0
  124. package/lib/display-types/donut/models/index.d.ts +2 -0
  125. package/lib/display-types/{bar-chart → donut}/models/index.d.ts.map +1 -1
  126. package/lib/display-types/gauge/components/gauge-configuration/gauge-configuration.component.d.ts +29 -0
  127. package/lib/display-types/gauge/components/gauge-configuration/gauge-configuration.component.d.ts.map +1 -0
  128. package/lib/display-types/gauge/components/gauge-configuration/index.d.ts +2 -0
  129. package/lib/display-types/gauge/components/gauge-configuration/index.d.ts.map +1 -0
  130. package/lib/display-types/gauge/components/gauge-display/gauge-display.component.d.ts +24 -0
  131. package/lib/display-types/gauge/components/gauge-display/gauge-display.component.d.ts.map +1 -0
  132. package/lib/display-types/gauge/components/gauge-display/index.d.ts +2 -0
  133. package/lib/display-types/gauge/components/gauge-display/index.d.ts.map +1 -0
  134. package/lib/display-types/gauge/components/index.d.ts +3 -0
  135. package/lib/display-types/gauge/components/index.d.ts.map +1 -0
  136. package/lib/display-types/gauge/gauge.module.d.ts +14 -0
  137. package/lib/display-types/gauge/gauge.module.d.ts.map +1 -0
  138. package/lib/display-types/gauge/gauge.specification.d.ts +3 -0
  139. package/lib/display-types/gauge/gauge.specification.d.ts.map +1 -0
  140. package/lib/display-types/gauge/index.d.ts +5 -0
  141. package/lib/display-types/gauge/index.d.ts.map +1 -0
  142. package/lib/display-types/gauge/models/gauge.model.d.ts +11 -0
  143. package/lib/display-types/gauge/models/gauge.model.d.ts.map +1 -0
  144. package/lib/display-types/gauge/models/index.d.ts +2 -0
  145. package/lib/display-types/{bar-chart/components → gauge/models}/index.d.ts.map +1 -1
  146. package/lib/display-types/index.d.ts +2 -1
  147. package/lib/display-types/index.d.ts.map +1 -1
  148. package/lib/display-types/meter/components/index.d.ts +1 -0
  149. package/lib/display-types/meter/components/index.d.ts.map +1 -1
  150. package/lib/display-types/meter/components/meter-configuration/index.d.ts +2 -0
  151. package/lib/display-types/meter/components/meter-configuration/index.d.ts.map +1 -0
  152. package/lib/display-types/meter/components/meter-configuration/meter-configuration.component.d.ts +26 -0
  153. package/lib/display-types/meter/components/meter-configuration/meter-configuration.component.d.ts.map +1 -0
  154. package/lib/display-types/meter/components/meter-display/meter-display.component.d.ts +11 -3
  155. package/lib/display-types/meter/components/meter-display/meter-display.component.d.ts.map +1 -1
  156. package/lib/display-types/meter/index.d.ts +1 -1
  157. package/lib/display-types/meter/index.d.ts.map +1 -1
  158. package/lib/display-types/meter/meter.module.d.ts +9 -2
  159. package/lib/display-types/meter/meter.module.d.ts.map +1 -1
  160. package/lib/display-types/meter/meter.specification.d.ts.map +1 -1
  161. package/lib/display-types/meter/models/meter.model.d.ts +7 -2
  162. package/lib/display-types/meter/models/meter.model.d.ts.map +1 -1
  163. package/lib/models/configuration.model.d.ts +2 -2
  164. package/lib/models/configuration.model.d.ts.map +1 -1
  165. package/lib/models/data-source.model.d.ts +14 -1
  166. package/lib/models/data-source.model.d.ts.map +1 -1
  167. package/lib/services/widget-layout.service.d.ts +13 -18
  168. package/lib/services/widget-layout.service.d.ts.map +1 -1
  169. package/package.json +7 -3
  170. package/esm2022/lib/data-sources/test/components/index.mjs +0 -17
  171. package/esm2022/lib/data-sources/test/components/test-configuration/index.mjs +0 -17
  172. package/esm2022/lib/data-sources/test/components/test-configuration/test-configuration.component.mjs +0 -80
  173. package/esm2022/lib/data-sources/test/index.mjs +0 -20
  174. package/esm2022/lib/data-sources/test/models/index.mjs +0 -17
  175. package/esm2022/lib/data-sources/test/models/test.model.mjs +0 -17
  176. package/esm2022/lib/data-sources/test/test.module.mjs +0 -39
  177. package/esm2022/lib/data-sources/test/test.specification.mjs +0 -44
  178. package/esm2022/lib/display-types/bar-chart/bar-chart.module.mjs +0 -36
  179. package/esm2022/lib/display-types/bar-chart/bar-chart.specification.mjs +0 -35
  180. package/esm2022/lib/display-types/bar-chart/components/bar-chart-display/bar-chart-display.component.mjs +0 -32
  181. package/esm2022/lib/display-types/bar-chart/components/bar-chart-display/index.mjs +0 -17
  182. package/esm2022/lib/display-types/bar-chart/components/index.mjs +0 -17
  183. package/esm2022/lib/display-types/bar-chart/models/bar-chart.model.mjs +0 -17
  184. package/esm2022/lib/display-types/bar-chart/models/index.mjs +0 -17
  185. package/lib/data-sources/test/components/index.d.ts +0 -2
  186. package/lib/data-sources/test/components/test-configuration/index.d.ts +0 -2
  187. package/lib/data-sources/test/components/test-configuration/test-configuration.component.d.ts +0 -26
  188. package/lib/data-sources/test/components/test-configuration/test-configuration.component.d.ts.map +0 -1
  189. package/lib/data-sources/test/index.d.ts +0 -5
  190. package/lib/data-sources/test/index.d.ts.map +0 -1
  191. package/lib/data-sources/test/models/index.d.ts +0 -2
  192. package/lib/data-sources/test/models/test.model.d.ts +0 -6
  193. package/lib/data-sources/test/models/test.model.d.ts.map +0 -1
  194. package/lib/data-sources/test/test.module.d.ts +0 -12
  195. package/lib/data-sources/test/test.module.d.ts.map +0 -1
  196. package/lib/data-sources/test/test.specification.d.ts +0 -3
  197. package/lib/data-sources/test/test.specification.d.ts.map +0 -1
  198. package/lib/display-types/bar-chart/bar-chart.module.d.ts +0 -9
  199. package/lib/display-types/bar-chart/bar-chart.module.d.ts.map +0 -1
  200. package/lib/display-types/bar-chart/bar-chart.specification.d.ts +0 -3
  201. package/lib/display-types/bar-chart/bar-chart.specification.d.ts.map +0 -1
  202. package/lib/display-types/bar-chart/components/bar-chart-display/bar-chart-display.component.d.ts +0 -11
  203. package/lib/display-types/bar-chart/components/bar-chart-display/bar-chart-display.component.d.ts.map +0 -1
  204. package/lib/display-types/bar-chart/components/bar-chart-display/index.d.ts +0 -2
  205. package/lib/display-types/bar-chart/components/index.d.ts +0 -2
  206. package/lib/display-types/bar-chart/index.d.ts +0 -5
  207. package/lib/display-types/bar-chart/index.d.ts.map +0 -1
  208. package/lib/display-types/bar-chart/models/bar-chart.model.d.ts +0 -8
  209. package/lib/display-types/bar-chart/models/bar-chart.model.d.ts.map +0 -1
  210. package/lib/display-types/bar-chart/models/index.d.ts +0 -2
@@ -1,30 +1,34 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Component, ViewChild, InjectionToken, Injectable, Inject, ViewContainerRef, ViewChildren, Input, ViewEncapsulation, NgModule, Pipe, EventEmitter, ChangeDetectionStrategy, Output } from '@angular/core';
3
3
  import moment from 'moment';
4
- import { BehaviorSubject, filter, combineLatest, map, Subscription, tap, take as take$1, startWith } from 'rxjs';
5
- import { take, map as map$1 } from 'rxjs/operators';
4
+ import { BehaviorSubject, filter, map, Subject, Subscription, combineLatest, debounceTime, tap, startWith, distinctUntilChanged } from 'rxjs';
5
+ import { take, map as map$1, delay } from 'rxjs/operators';
6
6
  import * as i1 from '@valtimo/task';
7
7
  import { TaskModule } from '@valtimo/task';
8
8
  import * as i2 from '@angular/router';
9
9
  import { RouterModule } from '@angular/router';
10
10
  import * as i3 from '@angular/common';
11
11
  import { CommonModule } from '@angular/common';
12
- import * as i4 from '@valtimo/components';
13
- import { WidgetModule, ListModule, BpmnJsDiagramModule, AlertModule, SpinnerModule, CarbonListModule, CarbonMultiInputModule } from '@valtimo/components';
14
- import * as i1$1 from '@ngx-translate/core';
12
+ import * as i1$1 from '@valtimo/components';
13
+ import { WidgetModule, ListModule, BpmnJsDiagramModule, AlertModule, SpinnerModule, CarbonListModule, CarbonMultiInputModule, InputModule as InputModule$1 } from '@valtimo/components';
14
+ import * as i3$1 from '@ngx-translate/core';
15
15
  import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
16
- import pack from 'bin-pack-with-constraints';
16
+ import Muuri from 'muuri';
17
17
  import * as i1$2 from '@angular/common/http';
18
18
  import { HttpClient } from '@angular/common/http';
19
19
  import * as i2$1 from '@valtimo/config';
20
20
  import { ROLE_USER } from '@valtimo/config';
21
- import * as i4$1 from 'carbon-components-angular';
22
- import { TabsModule, ThemeModule, LoadingModule, InputModule, DropdownModule, CheckboxModule } from 'carbon-components-angular';
21
+ import * as i5 from 'carbon-components-angular';
22
+ import { TabsModule, ThemeModule, LoadingModule, InputModule, DropdownModule, ButtonModule, TilesModule, LayerModule, IconModule, CheckboxModule } from 'carbon-components-angular';
23
23
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
24
24
  import { AuthGuardService } from '@valtimo/security';
25
25
  import * as i1$3 from '@angular/forms';
26
26
  import { Validators, ReactiveFormsModule } from '@angular/forms';
27
27
  import * as i2$2 from '@valtimo/document';
28
+ import { isEqual } from 'lodash';
29
+ import { Add16, TrashCan16 } from '@carbon/icons';
30
+ import * as i3$2 from '@carbon/charts-angular';
31
+ import { ChartsModule } from '@carbon/charts-angular';
28
32
 
29
33
  /*
30
34
  * Copyright 2015-2024 Ritense BV, the Netherlands.
@@ -91,7 +95,7 @@ class DashboardComponent {
91
95
  });
92
96
  }
93
97
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: DashboardComponent, deps: [{ token: i1.TaskService }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
94
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: DashboardComponent, selector: "valtimo-dashboard", viewQueries: [{ propertyName: "taskDetail", first: true, predicate: ["taskDetail"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"main-content container-fluid\" *ngIf=\"{loading: loading$ | async} as obs\">\n <h4 class=\"title\">\n {{ 'dashboard.openTasks.title' | translate }}\n <sup *ngIf=\"obs.loading === false\" class=\"ml-1 badge badge-pill badge-primary\">{{\n openTasks?.length\n }}</sup>\n </h4>\n <ng-container *ngIf=\"obs.loading === false; else loading\">\n <valtimo-widget>\n <valtimo-list\n [items]=\"openTasks\"\n [fields]=\"openTaskFields\"\n (rowClicked)=\"rowOpenTaskClick($event)\"\n ></valtimo-list>\n </valtimo-widget>\n </ng-container>\n <valtimo-task-detail-modal\n #taskDetail\n (formSubmit)=\"getOpenTasks()\"\n (assignmentOfTaskChanged)=\"getOpenTasks()\"\n ></valtimo-task-detail-modal>\n</div>\n\n<ng-template #loading>\n <valtimo-spinner></valtimo-spinner>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.WidgetComponent, selector: "valtimo-widget", inputs: ["type", "name", "icon", "contrast", "divider", "title", "subtitle", "collapseAble", "collapse", "additionalClasses"] }, { kind: "component", type: i4.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState", "lastColumnTemplate"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { kind: "component", type: i1.TaskDetailModalComponent, selector: "valtimo-task-detail-modal", outputs: ["formSubmit", "assignmentOfTaskChanged"] }, { kind: "component", type: i4.SpinnerComponent, selector: "valtimo-spinner", inputs: ["useBootstrapSpinner", "name", "type", "size", "color", "bdColor", "fullScreen", "noMarginTop"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
98
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: DashboardComponent, selector: "valtimo-dashboard", viewQueries: [{ propertyName: "taskDetail", first: true, predicate: ["taskDetail"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"main-content container-fluid\" *ngIf=\"{loading: loading$ | async} as obs\">\n <h4 class=\"title\">\n {{ 'dashboard.openTasks.title' | translate }}\n <sup *ngIf=\"obs.loading === false\" class=\"ml-1 badge badge-pill badge-primary\">{{\n openTasks?.length\n }}</sup>\n </h4>\n <ng-container *ngIf=\"obs.loading === false; else loading\">\n <valtimo-widget>\n <valtimo-list\n [items]=\"openTasks\"\n [fields]=\"openTaskFields\"\n (rowClicked)=\"rowOpenTaskClick($event)\"\n ></valtimo-list>\n </valtimo-widget>\n </ng-container>\n <valtimo-task-detail-modal\n #taskDetail\n (formSubmit)=\"getOpenTasks()\"\n (assignmentOfTaskChanged)=\"getOpenTasks()\"\n ></valtimo-task-detail-modal>\n</div>\n\n<ng-template #loading>\n <valtimo-spinner></valtimo-spinner>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1$1.WidgetComponent, selector: "valtimo-widget", inputs: ["type", "name", "icon", "contrast", "divider", "title", "subtitle", "collapseAble", "collapse", "additionalClasses"] }, { kind: "component", type: i1$1.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState", "lastColumnTemplate"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { kind: "component", type: i1.TaskDetailModalComponent, selector: "valtimo-task-detail-modal", outputs: ["formSubmit", "assignmentOfTaskChanged"] }, { kind: "component", type: i1$1.SpinnerComponent, selector: "valtimo-spinner", inputs: ["useBootstrapSpinner", "name", "type", "size", "color", "bdColor", "fullScreen", "noMarginTop"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }] }); }
95
99
  }
96
100
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: DashboardComponent, decorators: [{
97
101
  type: Component,
@@ -119,6 +123,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
119
123
  const DATA_FEATURES = {
120
124
  NUMBER: 'number',
121
125
  TOTAL: 'total',
126
+ NUMBERS: 'numbers',
122
127
  };
123
128
 
124
129
  /*
@@ -173,64 +178,6 @@ const WIDGET_1X_MIN_WIDTH = 275;
173
178
  * limitations under the License.
174
179
  */
175
180
 
176
- /*
177
- * Copyright 2015-2024 Ritense BV, the Netherlands.
178
- *
179
- * Licensed under EUPL, Version 1.2 (the "License");
180
- * you may not use this file except in compliance with the License.
181
- * You may obtain a copy of the License at
182
- *
183
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
184
- *
185
- * Unless required by applicable law or agreed to in writing, software
186
- * distributed under the License is distributed on an "AS IS" basis,
187
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
188
- * See the License for the specific language governing permissions and
189
- * limitations under the License.
190
- */
191
- class WidgetService {
192
- get supportedDisplayTypes$() {
193
- return this._supportedDisplayTypes$.pipe(filter(specifications => !!specifications));
194
- }
195
- get supportedDataSources$() {
196
- return this._supportedDataSources$.pipe(filter(specifications => !!specifications));
197
- }
198
- get supportedDisplayTypes() {
199
- return this._supportedDisplayTypes$.getValue() || [];
200
- }
201
- get supportedDataSources() {
202
- return this._supportedDataSources$.getValue() || [];
203
- }
204
- constructor(supportedDisplayTypesFromToken, supportedDataSourcesFromToken) {
205
- this.supportedDisplayTypesFromToken = supportedDisplayTypesFromToken;
206
- this.supportedDataSourcesFromToken = supportedDataSourcesFromToken;
207
- this._supportedDisplayTypes$ = new BehaviorSubject(null);
208
- this._supportedDataSources$ = new BehaviorSubject(null);
209
- this.setSupportedDisplayTypes(supportedDisplayTypesFromToken);
210
- this.setSupportedDataSources(supportedDataSourcesFromToken);
211
- }
212
- setSupportedDisplayTypes(supportedDisplayTypes) {
213
- this._supportedDisplayTypes$.next(supportedDisplayTypes.filter(displayType => !!displayType));
214
- }
215
- setSupportedDataSources(supportedDataSources) {
216
- this._supportedDataSources$.next(supportedDataSources.filter(dataSource => !!dataSource));
217
- }
218
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetService, deps: [{ token: DISPLAY_TYPE_TOKEN }, { token: DATA_SOURCE_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
219
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetService, providedIn: 'root' }); }
220
- }
221
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetService, decorators: [{
222
- type: Injectable,
223
- args: [{
224
- providedIn: 'root',
225
- }]
226
- }], ctorParameters: () => [{ type: Array, decorators: [{
227
- type: Inject,
228
- args: [DISPLAY_TYPE_TOKEN]
229
- }] }, { type: Array, decorators: [{
230
- type: Inject,
231
- args: [DATA_SOURCE_TOKEN]
232
- }] }] });
233
-
234
181
  /*
235
182
  * Copyright 2015-2024 Ritense BV, the Netherlands.
236
183
  *
@@ -247,34 +194,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
247
194
  * limitations under the License.
248
195
  */
249
196
  class WidgetLayoutService {
250
- get widgetPackResult$() {
251
- return this._widgetPackResult$.asObservable().pipe(filter(result => !!result));
197
+ get muuri$() {
198
+ return this._muuriSubject$.pipe(filter(muuri => !!muuri));
199
+ }
200
+ get muuriSubject$() {
201
+ return this._muuriSubject$.asObservable();
252
202
  }
253
203
  get widgetContainerWidth$() {
254
204
  return this._widgetContainerWidth$.asObservable().pipe(filter(width => !!width));
255
205
  }
256
- get widgetConfigurationBins$() {
257
- return combineLatest([
258
- this.widgetService.supportedDisplayTypes$,
259
- this._widgetConfigurations$,
260
- ]).pipe(map(([displayTypes, configurations]) => configurations.map(configuration => {
261
- const specification = displayTypes.find(type => type.displayTypeKey === configuration.displayType);
262
- return {
263
- configurationKey: configuration.key,
264
- width: specification.width,
265
- height: specification.height,
266
- };
267
- })));
206
+ get amountOfColumns$() {
207
+ return this.widgetContainerWidth$.pipe(map(containerWidth => Math.floor(containerWidth / WIDGET_1X_MIN_WIDTH)));
268
208
  }
269
- constructor(widgetService) {
270
- this.widgetService = widgetService;
209
+ constructor() {
271
210
  this._widgetContainerWidth$ = new BehaviorSubject(null);
272
211
  this._widgetConfigurations$ = new BehaviorSubject([]);
273
- this._widgetPackResult$ = new BehaviorSubject(null);
274
- this.openLayoutSubscription();
275
- }
276
- ngOnDestroy() {
277
- this._layoutSubscription?.unsubscribe();
212
+ this._muuriSubject$ = new BehaviorSubject(null);
213
+ this._triggerMuuriLayout$ = new Subject();
214
+ this._subscriptions = new Subscription();
215
+ this.openMuuriSubscription();
278
216
  }
279
217
  setWidgetContainerWidth(width) {
280
218
  this._widgetContainerWidth$.next(width);
@@ -282,69 +220,26 @@ class WidgetLayoutService {
282
220
  setWidgetConfigurations(configurations) {
283
221
  this._widgetConfigurations$.next(configurations);
284
222
  }
285
- openLayoutSubscription() {
286
- this._layoutSubscription = combineLatest([
287
- this.widgetContainerWidth$,
288
- this.widgetConfigurationBins$,
289
- ]).subscribe(([widgetContainerWidth, configurationBins]) => {
290
- const amountOfMinWidthColumns = this.getAmountOfMinWidthColumns(widgetContainerWidth);
291
- const widget1xWidth = this.getWidget1xWidth(widgetContainerWidth, amountOfMinWidthColumns);
292
- const binsToFit = configurationBins.map(configurationBin => ({
293
- ...configurationBin,
294
- width: configurationBin.width * widget1xWidth,
295
- height: configurationBin.height * WIDGET_1X_HEIGHT,
296
- }));
297
- const heightConstraint = this.getHeightConstraint(configurationBins, amountOfMinWidthColumns);
298
- const resultWithoutHeightConstraint = this.getPackResult(binsToFit, widgetContainerWidth);
299
- const resultWithHeightConstraint = this.getPackResult(binsToFit, widgetContainerWidth, heightConstraint);
300
- const resultWithHeightConstraintExceedsBoundary = this.checkIfPackResultExceedsBoundary(resultWithHeightConstraint, widgetContainerWidth);
301
- const resultToUse = resultWithHeightConstraintExceedsBoundary
302
- ? resultWithoutHeightConstraint
303
- : resultWithHeightConstraint;
304
- const resultWithMaxWidth = this.getResultWithMaxWidth(resultToUse, widgetContainerWidth);
305
- this._widgetPackResult$.next(resultWithMaxWidth);
306
- });
307
- }
308
- getPackResult(binsToFit, maxWidth, maxHeight) {
309
- return pack(binsToFit, {
310
- maxWidth,
311
- ...(maxHeight && { maxHeight }),
312
- });
313
- }
314
- checkIfPackResultExceedsBoundary(result, maxWidth) {
315
- return !!result.items.find(item => item.width + item.x > maxWidth);
316
- }
317
- getAmountOfMinWidthColumns(containerWidth) {
318
- return Math.floor(containerWidth / WIDGET_1X_MIN_WIDTH);
319
- }
320
- getWidget1xWidth(containerWidth, amountOfMinWidthColumns) {
321
- const widget1xWidth = Math.floor(containerWidth / (amountOfMinWidthColumns || 1));
322
- return widget1xWidth;
223
+ setMuuri(muuri) {
224
+ this._muuriSubject$.next(muuri);
323
225
  }
324
- getResultWithMaxWidth(result, containerWidth) {
325
- return {
326
- ...result,
327
- items: result.items.map(item => ({
328
- ...item,
329
- width: item.width > containerWidth ? containerWidth : item.width,
330
- })),
331
- };
226
+ triggerMuuriLayout() {
227
+ this._triggerMuuriLayout$.next(null);
332
228
  }
333
- getHeightConstraint(binsToFit, amountOfMinWidthColumns) {
334
- const amountOfSpacesNeeded = binsToFit.reduce((acc, curr) => acc + curr.height * curr.width, 0);
335
- const minAmountOfRowsNeeded = Math.ceil(amountOfSpacesNeeded / amountOfMinWidthColumns);
336
- const tallestWidgetHeightSpace = binsToFit.reduce((acc, curr) => (curr.height > acc ? curr.height : acc), 0);
337
- const amountOfRowsNeeded = minAmountOfRowsNeeded < tallestWidgetHeightSpace
338
- ? tallestWidgetHeightSpace
339
- : minAmountOfRowsNeeded;
340
- return amountOfRowsNeeded * WIDGET_1X_HEIGHT;
229
+ openMuuriSubscription() {
230
+ this._subscriptions.add(combineLatest([this.muuri$, this._triggerMuuriLayout$])
231
+ .pipe(debounceTime(150))
232
+ .subscribe(([muuri]) => {
233
+ muuri.refreshItems();
234
+ muuri.layout();
235
+ }));
341
236
  }
342
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetLayoutService, deps: [{ token: WidgetService }], target: i0.ɵɵFactoryTarget.Injectable }); }
237
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetLayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
343
238
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetLayoutService }); }
344
239
  }
345
240
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetLayoutService, decorators: [{
346
241
  type: Injectable
347
- }], ctorParameters: () => [{ type: WidgetService }] });
242
+ }], ctorParameters: () => [] });
348
243
 
349
244
  /*
350
245
  * Copyright 2015-2024 Ritense BV, the Netherlands.
@@ -380,6 +275,64 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
380
275
  }]
381
276
  }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: i2$1.ConfigService }] });
382
277
 
278
+ /*
279
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
280
+ *
281
+ * Licensed under EUPL, Version 1.2 (the "License");
282
+ * you may not use this file except in compliance with the License.
283
+ * You may obtain a copy of the License at
284
+ *
285
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
286
+ *
287
+ * Unless required by applicable law or agreed to in writing, software
288
+ * distributed under the License is distributed on an "AS IS" basis,
289
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
290
+ * See the License for the specific language governing permissions and
291
+ * limitations under the License.
292
+ */
293
+ class WidgetService {
294
+ get supportedDisplayTypes$() {
295
+ return this._supportedDisplayTypes$.pipe(filter(specifications => !!specifications));
296
+ }
297
+ get supportedDataSources$() {
298
+ return this._supportedDataSources$.pipe(filter(specifications => !!specifications));
299
+ }
300
+ get supportedDisplayTypes() {
301
+ return this._supportedDisplayTypes$.getValue() || [];
302
+ }
303
+ get supportedDataSources() {
304
+ return this._supportedDataSources$.getValue() || [];
305
+ }
306
+ constructor(supportedDisplayTypesFromToken, supportedDataSourcesFromToken) {
307
+ this.supportedDisplayTypesFromToken = supportedDisplayTypesFromToken;
308
+ this.supportedDataSourcesFromToken = supportedDataSourcesFromToken;
309
+ this._supportedDisplayTypes$ = new BehaviorSubject(null);
310
+ this._supportedDataSources$ = new BehaviorSubject(null);
311
+ this.setSupportedDisplayTypes(supportedDisplayTypesFromToken);
312
+ this.setSupportedDataSources(supportedDataSourcesFromToken);
313
+ }
314
+ setSupportedDisplayTypes(supportedDisplayTypes) {
315
+ this._supportedDisplayTypes$.next(supportedDisplayTypes.filter(displayType => !!displayType));
316
+ }
317
+ setSupportedDataSources(supportedDataSources) {
318
+ this._supportedDataSources$.next(supportedDataSources.filter(dataSource => !!dataSource));
319
+ }
320
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetService, deps: [{ token: DISPLAY_TYPE_TOKEN }, { token: DATA_SOURCE_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
321
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetService, providedIn: 'root' }); }
322
+ }
323
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetService, decorators: [{
324
+ type: Injectable,
325
+ args: [{
326
+ providedIn: 'root',
327
+ }]
328
+ }], ctorParameters: () => [{ type: Array, decorators: [{
329
+ type: Inject,
330
+ args: [DISPLAY_TYPE_TOKEN]
331
+ }] }, { type: Array, decorators: [{
332
+ type: Inject,
333
+ args: [DATA_SOURCE_TOKEN]
334
+ }] }] });
335
+
383
336
  /*
384
337
  * Copyright 2015-2024 Ritense BV, the Netherlands.
385
338
  *
@@ -425,7 +378,7 @@ class WidgetTranslationService {
425
378
  }
426
379
  return translation || `${key}.${translateKey}`;
427
380
  }
428
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetTranslationService, deps: [{ token: i1$1.TranslateService }, { token: WidgetService }], target: i0.ɵɵFactoryTarget.Injectable }); }
381
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetTranslationService, deps: [{ token: i3$1.TranslateService }, { token: WidgetService }], target: i0.ɵɵFactoryTarget.Injectable }); }
429
382
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetTranslationService, providedIn: 'root' }); }
430
383
  }
431
384
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetTranslationService, decorators: [{
@@ -433,7 +386,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
433
386
  args: [{
434
387
  providedIn: 'root',
435
388
  }]
436
- }], ctorParameters: () => [{ type: i1$1.TranslateService }, { type: WidgetService }] });
389
+ }], ctorParameters: () => [{ type: i3$1.TranslateService }, { type: WidgetService }] });
437
390
 
438
391
  /*
439
392
  * Copyright 2015-2024 Ritense BV, the Netherlands.
@@ -468,27 +421,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
468
421
  */
469
422
  class WidgetDashboardContentComponent {
470
423
  set widgetData(value) {
471
- this.isLoading$.next(value.loading);
424
+ this._isLoading$.next(value.loading);
472
425
  this._widgetData$.next(value.data);
473
426
  }
474
427
  set dashboard(value) {
475
428
  this.setWidgetConfigurations(value);
476
429
  }
430
+ get _muuriInitialized$() {
431
+ return this._muuri$.pipe(map$1(muuri => !!muuri));
432
+ }
477
433
  constructor(layoutService, widgetService, renderer) {
478
434
  this.layoutService = layoutService;
479
435
  this.widgetService = widgetService;
480
436
  this.renderer = renderer;
481
- this.isLoading$ = new BehaviorSubject(true);
437
+ this._isLoading$ = new BehaviorSubject(true);
482
438
  this._widgetData$ = new BehaviorSubject([]);
483
439
  this.widgetConfigurations$ = new BehaviorSubject(null);
484
440
  this._subscriptions = new Subscription();
441
+ this._muuri$ = this.layoutService.muuriSubject$;
442
+ this._creatingMuuri = false;
443
+ this._noResults$ = new BehaviorSubject(false);
444
+ this.loaded$ = combineLatest([
445
+ this._isLoading$,
446
+ this._muuriInitialized$,
447
+ this._noResults$,
448
+ ]).pipe(map$1(([isLoading, muuriInitialized, noResults]) => !isLoading && (muuriInitialized || noResults)), delay(400));
485
449
  }
486
450
  ngAfterViewInit() {
487
451
  this._observer = new ResizeObserver(event => {
488
452
  this.observerMutation(event);
489
453
  });
490
454
  this._observer.observe(this._widgetContainerRef.nativeElement);
491
- this.openPackResultSubscription();
455
+ this.openWidgetSizeSubscription();
492
456
  this.renderWidgets();
493
457
  }
494
458
  ngOnDestroy() {
@@ -508,17 +472,34 @@ class WidgetDashboardContentComponent {
508
472
  this.layoutService.setWidgetContainerWidth(widgetContainerWidth);
509
473
  }
510
474
  }
511
- openPackResultSubscription() {
512
- this._subscriptions.add(this.layoutService.widgetPackResult$.subscribe(packResult => {
513
- this.renderer.setStyle(this._widgetContainerRef.nativeElement, 'height', `${packResult.height}px`);
475
+ openWidgetSizeSubscription() {
476
+ this._subscriptions.add(combineLatest([
477
+ this.layoutService.amountOfColumns$,
478
+ this.widgetConfigurations$,
479
+ this.widgetService.supportedDisplayTypes$,
480
+ this._muuri$,
481
+ ]).subscribe(([amountOfColumns, widgetConfigurations, supportedDisplayTypes, muuri]) => {
514
482
  this._widgetConfigurationRefs.toArray().forEach(widgetConfigurationRef => {
515
483
  const nativeElement = widgetConfigurationRef.nativeElement;
516
- const configPackResult = packResult.items.find(result => result.item.configurationKey === nativeElement.id);
517
- this.renderer.setStyle(nativeElement, 'height', `${configPackResult?.height}px`);
518
- this.renderer.setStyle(nativeElement, 'width', `${configPackResult?.width}px`);
519
- this.renderer.setStyle(nativeElement, 'left', `${configPackResult?.x}px`);
520
- this.renderer.setStyle(nativeElement, 'top', `${configPackResult?.y}px`);
484
+ const widgetConfiguration = widgetConfigurations.find(config => config.key === nativeElement.id);
485
+ const specification = supportedDisplayTypes.find(type => type.displayTypeKey === widgetConfiguration.displayType);
486
+ const widthPercentage = specification.width > amountOfColumns
487
+ ? 100
488
+ : (specification.width / amountOfColumns) * 100;
489
+ this.renderer.setStyle(nativeElement, 'height', `${WIDGET_1X_HEIGHT * specification.height}px`);
490
+ this.renderer.setStyle(nativeElement, 'width', `${widthPercentage}%`);
521
491
  });
492
+ if (widgetConfigurations.length > 0) {
493
+ if (!muuri) {
494
+ this.initMuuri();
495
+ }
496
+ else {
497
+ this.layoutService.triggerMuuriLayout();
498
+ }
499
+ }
500
+ else {
501
+ this._noResults$.next(true);
502
+ }
522
503
  }));
523
504
  }
524
505
  renderWidgets() {
@@ -542,12 +523,24 @@ class WidgetDashboardContentComponent {
542
523
  });
543
524
  }));
544
525
  }
526
+ initMuuri() {
527
+ if (!this._widgetContainerRef || this._creatingMuuri)
528
+ return;
529
+ this._creatingMuuri = true;
530
+ this.layoutService.setMuuri(new Muuri(this._widgetContainerRef.nativeElement, {
531
+ layout: {
532
+ fillGaps: true,
533
+ },
534
+ layoutOnResize: false,
535
+ }));
536
+ this._creatingMuuri = false;
537
+ }
545
538
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetDashboardContentComponent, deps: [{ token: WidgetLayoutService }, { token: WidgetService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
546
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: WidgetDashboardContentComponent, selector: "valtimo-widget-dashboard-content", inputs: { widgetData: "widgetData", dashboard: "dashboard" }, providers: [WidgetLayoutService], viewQueries: [{ propertyName: "_widgetContainerRef", first: true, predicate: ["widgetContainer"], descendants: true }, { propertyName: "_widgetConfigurationRefs", predicate: ["widgetConfiguration"], descendants: true }, { propertyName: "_widgetConfigurationContentVcRefs", predicate: ["widgetConfigurationContent"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div #widgetContainer [class.loading]=\"isLoading$ | async\" class=\"widget-container\">\n <ng-container *ngIf=\"widgetConfigurations$ | async as widgetConfigurations\">\n <ng-container *ngFor=\"let config of widgetConfigurations\">\n <div #widgetConfiguration [id]=\"config.key\" class=\"widget-configuration\">\n <div class=\"widget-configuration-content\">\n <ng-container #widgetConfigurationContent></ng-container>\n </div>\n </div>\n </ng-container>\n\n <valtimo-no-results\n *ngIf=\"!widgetConfigurations.length\"\n [title]=\"'dashboard.noWidgets' | translate\"\n [description]=\"'dashboard.noWidgetsDescription' | translate\"\n illustration=\"valtimo-layout/img/no-widgets.svg\"\n ></valtimo-no-results>\n </ng-container>\n</div>\n\n<cds-loading *ngIf=\"isLoading$ | async\" class=\"widget-loader\"></cds-loading>\n", styles: [".widget-container{margin-top:16px;width:calc(100% + 16px);margin-left:-8px;position:relative}.widget-configuration{position:absolute;display:flex;justify-content:center;align-items:center}.widget-configuration-content{width:calc(100% - 16px);height:calc(100% - 16px);background-color:#fff}.widget-loader{display:flex;justify-content:center;padding-top:32px}.loading{display:none}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4$1.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i4.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
539
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: WidgetDashboardContentComponent, selector: "valtimo-widget-dashboard-content", inputs: { widgetData: "widgetData", dashboard: "dashboard" }, providers: [WidgetLayoutService], viewQueries: [{ propertyName: "_widgetContainerRef", first: true, predicate: ["widgetContainer"], descendants: true }, { propertyName: "_widgetConfigurationRefs", predicate: ["widgetConfiguration"], descendants: true }, { propertyName: "_widgetConfigurationContentVcRefs", predicate: ["widgetConfigurationContent"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"{loaded: loaded$ | async} as obs\">\n <div *ngIf=\"!obs.loaded\" class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-container>\n\n<div\n #widgetContainer\n class=\"widget-container\"\n [ngClass]=\"{'widget-container__visible': loaded$ | async}\"\n>\n <ng-container *ngIf=\"widgetConfigurations$ | async as widgetConfigurations\">\n <ng-container *ngFor=\"let config of widgetConfigurations\">\n <div #widgetConfiguration [id]=\"config.key\" class=\"widget-configuration\">\n <div class=\"widget-configuration-content\">\n <ng-container #widgetConfigurationContent></ng-container>\n </div>\n </div>\n </ng-container>\n\n <valtimo-no-results\n *ngIf=\"!widgetConfigurations.length\"\n [title]=\"'dashboard.noWidgets' | translate\"\n [description]=\"'dashboard.noWidgetsDescription' | translate\"\n illustration=\"valtimo-layout/img/no-widgets.svg\"\n ></valtimo-no-results>\n </ng-container>\n</div>\n", styles: [":host{position:relative}.widget-container{margin-top:16px;width:calc(100% + 16px);margin-left:-8px;position:relative;visibility:hidden}.widget-container__visible{visibility:visible}.widget-configuration{position:absolute;display:flex;justify-content:center;align-items:center}.widget-configuration-content{width:calc(100% - 16px);height:calc(100% - 16px);background-color:#fff}.loading-container{padding-top:32px;position:absolute;top:0;display:flex;width:100%;justify-content:center}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i1$1.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }] }); }
547
540
  }
548
541
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetDashboardContentComponent, decorators: [{
549
542
  type: Component,
550
- args: [{ selector: 'valtimo-widget-dashboard-content', providers: [WidgetLayoutService], template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div #widgetContainer [class.loading]=\"isLoading$ | async\" class=\"widget-container\">\n <ng-container *ngIf=\"widgetConfigurations$ | async as widgetConfigurations\">\n <ng-container *ngFor=\"let config of widgetConfigurations\">\n <div #widgetConfiguration [id]=\"config.key\" class=\"widget-configuration\">\n <div class=\"widget-configuration-content\">\n <ng-container #widgetConfigurationContent></ng-container>\n </div>\n </div>\n </ng-container>\n\n <valtimo-no-results\n *ngIf=\"!widgetConfigurations.length\"\n [title]=\"'dashboard.noWidgets' | translate\"\n [description]=\"'dashboard.noWidgetsDescription' | translate\"\n illustration=\"valtimo-layout/img/no-widgets.svg\"\n ></valtimo-no-results>\n </ng-container>\n</div>\n\n<cds-loading *ngIf=\"isLoading$ | async\" class=\"widget-loader\"></cds-loading>\n", styles: [".widget-container{margin-top:16px;width:calc(100% + 16px);margin-left:-8px;position:relative}.widget-configuration{position:absolute;display:flex;justify-content:center;align-items:center}.widget-configuration-content{width:calc(100% - 16px);height:calc(100% - 16px);background-color:#fff}.widget-loader{display:flex;justify-content:center;padding-top:32px}.loading{display:none}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
543
+ args: [{ selector: 'valtimo-widget-dashboard-content', providers: [WidgetLayoutService], template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"{loaded: loaded$ | async} as obs\">\n <div *ngIf=\"!obs.loaded\" class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-container>\n\n<div\n #widgetContainer\n class=\"widget-container\"\n [ngClass]=\"{'widget-container__visible': loaded$ | async}\"\n>\n <ng-container *ngIf=\"widgetConfigurations$ | async as widgetConfigurations\">\n <ng-container *ngFor=\"let config of widgetConfigurations\">\n <div #widgetConfiguration [id]=\"config.key\" class=\"widget-configuration\">\n <div class=\"widget-configuration-content\">\n <ng-container #widgetConfigurationContent></ng-container>\n </div>\n </div>\n </ng-container>\n\n <valtimo-no-results\n *ngIf=\"!widgetConfigurations.length\"\n [title]=\"'dashboard.noWidgets' | translate\"\n [description]=\"'dashboard.noWidgetsDescription' | translate\"\n illustration=\"valtimo-layout/img/no-widgets.svg\"\n ></valtimo-no-results>\n </ng-container>\n</div>\n", styles: [":host{position:relative}.widget-container{margin-top:16px;width:calc(100% + 16px);margin-left:-8px;position:relative;visibility:hidden}.widget-container__visible{visibility:visible}.widget-configuration{position:absolute;display:flex;justify-content:center;align-items:center}.widget-configuration-content{width:calc(100% - 16px);height:calc(100% - 16px);background-color:#fff}.loading-container{padding-top:32px;position:absolute;top:0;display:flex;width:100%;justify-content:center}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
551
544
  }], ctorParameters: () => [{ type: WidgetLayoutService }, { type: WidgetService }, { type: i0.Renderer2 }], propDecorators: { _widgetConfigurationRefs: [{
552
545
  type: ViewChildren,
553
546
  args: ['widgetConfiguration']
@@ -625,24 +618,24 @@ class WidgetDashboardComponent {
625
618
  data: [],
626
619
  loading: true,
627
620
  });
621
+ this.selectedDashboardKey$ = new BehaviorSubject('');
628
622
  }
629
623
  onTabSelected(dashboardKey) {
624
+ this.selectedDashboardKey$.next(dashboardKey);
625
+ this.activeWidgetData$.next({ data: [], loading: true });
630
626
  this.widgetApiService
631
627
  .getWidgetData(dashboardKey)
632
- .pipe(tap(() => {
633
- this.activeWidgetData$.next({ data: [], loading: true });
634
- }), take$1(1))
635
628
  .subscribe((data) => this.activeWidgetData$.next({ data, loading: false }));
636
629
  }
637
630
  trackByIndex(index) {
638
631
  return index;
639
632
  }
640
633
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetDashboardComponent, deps: [{ token: DashboardService }, { token: WidgetApiService }], target: i0.ɵɵFactoryTarget.Component }); }
641
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: WidgetDashboardComponent, selector: "valtimo-widget-dashboard", ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div *ngIf=\"dashboards$ | async as dashboards\" class=\"dashboards-container\">\n <valtimo-no-results\n *ngIf=\"!dashboards.length\"\n [title]=\"'dashboard.noDashboards' | translate\"\n [description]=\"'dashboard.noDashboardsDescription' | translate\"\n illustration=\"valtimo-layout/img/no-dashboards.svg\"\n ></valtimo-no-results>\n\n <div *ngIf=\"dashboards.length === 1\">\n <h4>{{ dashboards[0].title }}</h4>\n\n <valtimo-widget-dashboard-content\n [dashboard]=\"dashboards[0]\"\n [widgetData]=\"activeWidgetData$ | async\"\n ></valtimo-widget-dashboard-content>\n </div>\n\n <div *ngIf=\"dashboards.length > 1\">\n <cds-tabs>\n <cds-tab\n *ngFor=\"let dashboard of dashboards; trackBy: trackByIndex\"\n [heading]=\"dashboard.title\"\n (selected)=\"onTabSelected(dashboard.key)\"\n >\n <valtimo-widget-dashboard-content\n [dashboard]=\"dashboard\"\n [widgetData]=\"activeWidgetData$ | async\"\n ></valtimo-widget-dashboard-content>\n </cds-tab>\n </cds-tabs>\n </div>\n</div>\n", styles: [".dashboards-container .cds--tab-content{outline:0;padding:0}.dashboards-container .valtimo-no-results,.widget-container .valtimo-no-results{flex-wrap:wrap;align-items:flex-start;align-content:center;flex-direction:column;gap:16px!important}.dashboards-container .valtimo-no-results__content,.widget-container .valtimo-no-results__content{gap:16px!important;max-width:500px;line-height:20px}.dashboards-container .valtimo-no-results img,.widget-container .valtimo-no-results img{padding-left:0!important}.dashboards-container .valtimo-no-results span,.dashboards-container .valtimo-no-results h4,.widget-container .valtimo-no-results span,.widget-container .valtimo-no-results h4{width:100%!important}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4$1.Tabs, selector: "cds-tabs, ibm-tabs", inputs: ["position", "cacheActive", "followFocus", "isNavigation", "ariaLabel", "ariaLabelledby", "type", "theme", "skeleton"] }, { kind: "component", type: i4$1.Tab, selector: "cds-tab, ibm-tab", inputs: ["heading", "title", "context", "active", "disabled", "tabIndex", "id", "cacheActive"], outputs: ["selected"] }, { kind: "component", type: i4.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title"] }, { kind: "component", type: WidgetDashboardContentComponent, selector: "valtimo-widget-dashboard-content", inputs: ["widgetData", "dashboard"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
634
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: WidgetDashboardComponent, selector: "valtimo-widget-dashboard", ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div *ngIf=\"dashboards$ | async as dashboards\" class=\"dashboards-container\">\n <valtimo-no-results\n *ngIf=\"!dashboards.length\"\n [title]=\"'dashboard.noDashboards' | translate\"\n [description]=\"'dashboard.noDashboardsDescription' | translate\"\n illustration=\"valtimo-layout/img/no-dashboards.svg\"\n ></valtimo-no-results>\n\n <div *ngIf=\"dashboards.length === 1\">\n <h4>{{ dashboards[0].title }}</h4>\n\n <valtimo-widget-dashboard-content\n [dashboard]=\"dashboards[0]\"\n [widgetData]=\"activeWidgetData$ | async\"\n ></valtimo-widget-dashboard-content>\n </div>\n\n <div *ngIf=\"dashboards.length > 1\">\n <cds-tabs>\n <cds-tab\n *ngFor=\"let dashboard of dashboards; trackBy: trackByIndex\"\n [heading]=\"dashboard.title\"\n (selected)=\"onTabSelected(dashboard.key)\"\n >\n <valtimo-widget-dashboard-content\n *ngIf=\"(selectedDashboardKey$ | async) === dashboard.key\"\n [dashboard]=\"dashboard\"\n [widgetData]=\"activeWidgetData$ | async\"\n ></valtimo-widget-dashboard-content>\n </cds-tab>\n </cds-tabs>\n </div>\n</div>\n", styles: [".dashboards-container .cds--tab-content{outline:0;padding:0}.dashboards-container .valtimo-no-results,.widget-container .valtimo-no-results{flex-wrap:wrap;align-items:flex-start;align-content:center;flex-direction:column;gap:16px!important}.dashboards-container .valtimo-no-results__content,.widget-container .valtimo-no-results__content{gap:16px!important;max-width:500px;line-height:20px}.dashboards-container .valtimo-no-results img,.widget-container .valtimo-no-results img{padding-left:0!important}.dashboards-container .valtimo-no-results span,.dashboards-container .valtimo-no-results h4,.widget-container .valtimo-no-results span,.widget-container .valtimo-no-results h4{width:100%!important}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.Tabs, selector: "cds-tabs, ibm-tabs", inputs: ["position", "cacheActive", "followFocus", "isNavigation", "ariaLabel", "ariaLabelledby", "type", "theme", "skeleton"] }, { kind: "component", type: i5.Tab, selector: "cds-tab, ibm-tab", inputs: ["heading", "title", "context", "active", "disabled", "tabIndex", "id", "cacheActive"], outputs: ["selected"] }, { kind: "component", type: i1$1.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "component", type: WidgetDashboardContentComponent, selector: "valtimo-widget-dashboard-content", inputs: ["widgetData", "dashboard"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
642
635
  }
643
636
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WidgetDashboardComponent, decorators: [{
644
637
  type: Component,
645
- args: [{ selector: 'valtimo-widget-dashboard', encapsulation: ViewEncapsulation.None, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div *ngIf=\"dashboards$ | async as dashboards\" class=\"dashboards-container\">\n <valtimo-no-results\n *ngIf=\"!dashboards.length\"\n [title]=\"'dashboard.noDashboards' | translate\"\n [description]=\"'dashboard.noDashboardsDescription' | translate\"\n illustration=\"valtimo-layout/img/no-dashboards.svg\"\n ></valtimo-no-results>\n\n <div *ngIf=\"dashboards.length === 1\">\n <h4>{{ dashboards[0].title }}</h4>\n\n <valtimo-widget-dashboard-content\n [dashboard]=\"dashboards[0]\"\n [widgetData]=\"activeWidgetData$ | async\"\n ></valtimo-widget-dashboard-content>\n </div>\n\n <div *ngIf=\"dashboards.length > 1\">\n <cds-tabs>\n <cds-tab\n *ngFor=\"let dashboard of dashboards; trackBy: trackByIndex\"\n [heading]=\"dashboard.title\"\n (selected)=\"onTabSelected(dashboard.key)\"\n >\n <valtimo-widget-dashboard-content\n [dashboard]=\"dashboard\"\n [widgetData]=\"activeWidgetData$ | async\"\n ></valtimo-widget-dashboard-content>\n </cds-tab>\n </cds-tabs>\n </div>\n</div>\n", styles: [".dashboards-container .cds--tab-content{outline:0;padding:0}.dashboards-container .valtimo-no-results,.widget-container .valtimo-no-results{flex-wrap:wrap;align-items:flex-start;align-content:center;flex-direction:column;gap:16px!important}.dashboards-container .valtimo-no-results__content,.widget-container .valtimo-no-results__content{gap:16px!important;max-width:500px;line-height:20px}.dashboards-container .valtimo-no-results img,.widget-container .valtimo-no-results img{padding-left:0!important}.dashboards-container .valtimo-no-results span,.dashboards-container .valtimo-no-results h4,.widget-container .valtimo-no-results span,.widget-container .valtimo-no-results h4{width:100%!important}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
638
+ args: [{ selector: 'valtimo-widget-dashboard', encapsulation: ViewEncapsulation.None, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div *ngIf=\"dashboards$ | async as dashboards\" class=\"dashboards-container\">\n <valtimo-no-results\n *ngIf=\"!dashboards.length\"\n [title]=\"'dashboard.noDashboards' | translate\"\n [description]=\"'dashboard.noDashboardsDescription' | translate\"\n illustration=\"valtimo-layout/img/no-dashboards.svg\"\n ></valtimo-no-results>\n\n <div *ngIf=\"dashboards.length === 1\">\n <h4>{{ dashboards[0].title }}</h4>\n\n <valtimo-widget-dashboard-content\n [dashboard]=\"dashboards[0]\"\n [widgetData]=\"activeWidgetData$ | async\"\n ></valtimo-widget-dashboard-content>\n </div>\n\n <div *ngIf=\"dashboards.length > 1\">\n <cds-tabs>\n <cds-tab\n *ngFor=\"let dashboard of dashboards; trackBy: trackByIndex\"\n [heading]=\"dashboard.title\"\n (selected)=\"onTabSelected(dashboard.key)\"\n >\n <valtimo-widget-dashboard-content\n *ngIf=\"(selectedDashboardKey$ | async) === dashboard.key\"\n [dashboard]=\"dashboard\"\n [widgetData]=\"activeWidgetData$ | async\"\n ></valtimo-widget-dashboard-content>\n </cds-tab>\n </cds-tabs>\n </div>\n</div>\n", styles: [".dashboards-container .cds--tab-content{outline:0;padding:0}.dashboards-container .valtimo-no-results,.widget-container .valtimo-no-results{flex-wrap:wrap;align-items:flex-start;align-content:center;flex-direction:column;gap:16px!important}.dashboards-container .valtimo-no-results__content,.widget-container .valtimo-no-results__content{gap:16px!important;max-width:500px;line-height:20px}.dashboards-container .valtimo-no-results img,.widget-container .valtimo-no-results img{padding-left:0!important}.dashboards-container .valtimo-no-results span,.dashboards-container .valtimo-no-results h4,.widget-container .valtimo-no-results span,.widget-container .valtimo-no-results h4{width:100%!important}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
646
639
  }], ctorParameters: () => [{ type: DashboardService }, { type: WidgetApiService }] });
647
640
 
648
641
  /*
@@ -800,7 +793,7 @@ class DashboardModule {
800
793
  DashboardRoutingModule,
801
794
  WidgetModule,
802
795
  ListModule,
803
- BpmnJsDiagramModule, i1$1.TranslateModule, AlertModule,
796
+ BpmnJsDiagramModule, i3$1.TranslateModule, AlertModule,
804
797
  TaskModule,
805
798
  SpinnerModule,
806
799
  TabsModule,
@@ -866,78 +859,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
866
859
  }]
867
860
  }] });
868
861
 
869
- /*
870
- * Copyright 2015-2024 Ritense BV, the Netherlands.
871
- *
872
- * Licensed under EUPL, Version 1.2 (the "License");
873
- * you may not use this file except in compliance with the License.
874
- * You may obtain a copy of the License at
875
- *
876
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
877
- *
878
- * Unless required by applicable law or agreed to in writing, software
879
- * distributed under the License is distributed on an "AS IS" basis,
880
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
881
- * See the License for the specific language governing permissions and
882
- * limitations under the License.
883
- */
884
- class TestConfigurationComponent {
885
- set disabled(disabledValue) {
886
- if (disabledValue) {
887
- this.form.disable();
888
- }
889
- else {
890
- this.form.enable();
891
- }
892
- }
893
- get value() {
894
- return this.form.get('value');
895
- }
896
- get total() {
897
- return this.form.get('total');
898
- }
899
- set prefillConfiguration(configurationValue) {
900
- if (configurationValue) {
901
- this.value.setValue(configurationValue.value);
902
- this.total.setValue(configurationValue.total);
903
- }
904
- }
905
- constructor(fb) {
906
- this.fb = fb;
907
- this.form = this.fb.group({
908
- value: this.fb.control(null, [Validators.required]),
909
- total: this.fb.control(null, [Validators.required]),
910
- });
911
- this.configurationEvent = new EventEmitter();
912
- this._subscriptions = new Subscription();
913
- }
914
- ngOnInit() {
915
- this.openFormSubscription();
916
- }
917
- ngOnDestroy() {
918
- this._subscriptions.unsubscribe();
919
- }
920
- openFormSubscription() {
921
- this._subscriptions.add(this.form.valueChanges.pipe(startWith(this.form.value)).subscribe(formValue => {
922
- this.configurationEvent.emit({ valid: this.form.valid, data: formValue });
923
- }));
924
- }
925
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TestConfigurationComponent, deps: [{ token: i1$3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
926
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: TestConfigurationComponent, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'valueHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'valueHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"value.dirty && value.invalid\"\n >\n {{ 'value' | widgetTranslate: dataSourceKey | async }}\n\n <input\n cdsText\n formControlName=\"value\"\n [invalid]=\"value.dirty && value.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'totalHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'totalHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"total.dirty && total.invalid\"\n >\n {{ 'total' | widgetTranslate: dataSourceKey | async }}\n\n <input\n cdsText\n formControlName=\"total\"\n [invalid]=\"total.dirty && total.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n</form>\n", styles: ["/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4$1.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i4$1.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
927
- }
928
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TestConfigurationComponent, decorators: [{
929
- type: Component,
930
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'valueHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'valueHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"value.dirty && value.invalid\"\n >\n {{ 'value' | widgetTranslate: dataSourceKey | async }}\n\n <input\n cdsText\n formControlName=\"value\"\n [invalid]=\"value.dirty && value.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'totalHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'totalHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"total.dirty && total.invalid\"\n >\n {{ 'total' | widgetTranslate: dataSourceKey | async }}\n\n <input\n cdsText\n formControlName=\"total\"\n [invalid]=\"total.dirty && total.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n</form>\n", styles: ["/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
931
- }], ctorParameters: () => [{ type: i1$3.FormBuilder }], propDecorators: { dataSourceKey: [{
932
- type: Input
933
- }], disabled: [{
934
- type: Input
935
- }], prefillConfiguration: [{
936
- type: Input
937
- }], configurationEvent: [{
938
- type: Output
939
- }] } });
940
-
941
862
  /*
942
863
  * Copyright 2015-2024 Ritense BV, the Netherlands.
943
864
  *
@@ -985,6 +906,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
985
906
  * See the License for the specific language governing permissions and
986
907
  * limitations under the License.
987
908
  */
909
+ var Operator;
910
+ (function (Operator) {
911
+ Operator["NOT_EQUAL_TO"] = "!=";
912
+ Operator["EQUAL_TO"] = "==";
913
+ Operator["GREATER_THAN"] = ">";
914
+ Operator["GREATER_THAN_OR_EQUAL_TO"] = ">=";
915
+ Operator["LESS_THAN"] = "<";
916
+ Operator["LESS_THAN_OR_EQUAL_TO"] = "<=";
917
+ })(Operator || (Operator = {}));
988
918
 
989
919
  /*
990
920
  * Copyright 2015-2024 Ritense BV, the Netherlands.
@@ -1017,33 +947,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1017
947
  * See the License for the specific language governing permissions and
1018
948
  * limitations under the License.
1019
949
  */
1020
- const testDataSourceSpecification = {
1021
- dataSourceKey: 'test',
1022
- configurationComponent: TestConfigurationComponent,
1023
- translations: {
1024
- de: {
1025
- title: 'Test-Datenquelle',
1026
- value: 'Wert (erforderlich)',
1027
- valueHelperText: 'Der im Widget angezeigte Wert',
1028
- total: 'Gesamtwert (erforderlich)',
1029
- totalHelperText: 'Der im Widget angezeigte Gesamtwert',
1030
- },
1031
- en: {
1032
- title: 'Test data source',
1033
- value: 'Value (required)',
1034
- valueHelperText: 'The value displayed in the widget',
1035
- total: 'Total value (required)',
1036
- totalHelperText: 'The total value displayed in the widget',
1037
- },
1038
- nl: {
1039
- title: 'Testdatabron',
1040
- value: 'Waarde (vereist)',
1041
- valueHelperText: 'De waarde die wordt weergegeven in de widget',
1042
- total: 'Totaalwaarde (vereist)',
1043
- totalHelperText: 'De totaalwaarde die wordt weergegeven in de widget',
1044
- },
1045
- },
1046
- };
1047
950
 
1048
951
  /*
1049
952
  * Copyright 2015-2024 Ritense BV, the Netherlands.
@@ -1060,20 +963,6 @@ const testDataSourceSpecification = {
1060
963
  * See the License for the specific language governing permissions and
1061
964
  * limitations under the License.
1062
965
  */
1063
- class TestDataSourceModule {
1064
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TestDataSourceModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1065
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.3", ngImport: i0, type: TestDataSourceModule, declarations: [TestConfigurationComponent], imports: [CommonModule, ReactiveFormsModule, WidgetTranslatePipeModule, InputModule], exports: [TestConfigurationComponent] }); }
1066
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TestDataSourceModule, providers: [{ provide: DATA_SOURCE_TOKEN, useValue: testDataSourceSpecification, multi: true }], imports: [CommonModule, ReactiveFormsModule, WidgetTranslatePipeModule, InputModule] }); }
1067
- }
1068
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TestDataSourceModule, decorators: [{
1069
- type: NgModule,
1070
- args: [{
1071
- declarations: [TestConfigurationComponent],
1072
- imports: [CommonModule, ReactiveFormsModule, WidgetTranslatePipeModule, InputModule],
1073
- exports: [TestConfigurationComponent],
1074
- providers: [{ provide: DATA_SOURCE_TOKEN, useValue: testDataSourceSpecification, multi: true }],
1075
- }]
1076
- }] });
1077
966
 
1078
967
  /*
1079
968
  * Copyright 2015-2024 Ritense BV, the Netherlands.
@@ -1090,31 +979,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1090
979
  * See the License for the specific language governing permissions and
1091
980
  * limitations under the License.
1092
981
  */
1093
-
1094
- /*
1095
- * Copyright 2015-2024 Ritense BV, the Netherlands.
1096
- *
1097
- * Licensed under EUPL, Version 1.2 (the "License");
1098
- * you may not use this file except in compliance with the License.
1099
- * You may obtain a copy of the License at
1100
- *
1101
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
1102
- *
1103
- * Unless required by applicable law or agreed to in writing, software
1104
- * distributed under the License is distributed on an "AS IS" basis,
1105
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1106
- * See the License for the specific language governing permissions and
1107
- * limitations under the License.
1108
- */
1109
- var Operator;
1110
- (function (Operator) {
1111
- Operator["NOT_EQUAL_TO"] = "!=";
1112
- Operator["EQUAL_TO"] = "==";
1113
- Operator["GREATER_THAN"] = ">";
1114
- Operator["GREATER_THAN_OR_EQUAL_TO"] = ">=";
1115
- Operator["LESS_THAN"] = "<";
1116
- Operator["LESS_THAN_OR_EQUAL_TO"] = "<=";
1117
- })(Operator || (Operator = {}));
982
+ var WidgetSeverity;
983
+ (function (WidgetSeverity) {
984
+ WidgetSeverity["BLACK"] = "valtimo-severity__black";
985
+ WidgetSeverity["GREEN"] = "valtimo-severity__green";
986
+ WidgetSeverity["YELLOW"] = "valtimo-severity__yellow";
987
+ WidgetSeverity["ORANGE"] = "valtimo-severity__orange";
988
+ WidgetSeverity["RED"] = "valtimo-severity__red";
989
+ })(WidgetSeverity || (WidgetSeverity = {}));
1118
990
 
1119
991
  /*
1120
992
  * Copyright 2015-2024 Ritense BV, the Netherlands.
@@ -1252,13 +1124,13 @@ class CaseCountConfigurationComponent {
1252
1124
  });
1253
1125
  }));
1254
1126
  }
1255
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseCountConfigurationComponent, deps: [{ token: i1$3.FormBuilder }, { token: i2$2.DocumentService }, { token: i1$1.TranslateService }, { token: WidgetTranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
1256
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: CaseCountConfigurationComponent, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-count-configuration-form\"\n *ngIf=\"{documentItems: documentItems$ | async, operatorItems: operatorItems$} as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"defaultConditionValues$ | async\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n type=\"keyDropdownValue\"\n (allValuesValidEvent)=\"onAllConditionsValid($event)\"\n (valueChange)=\"conditionsValueChange($event)\"\n carbonTheme=\"white\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .case-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .case-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4$1.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "component", type: i4$1.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i4$1.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i4.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["name", "title", "titleTranslationKey", "type", "arbitraryValueAmount", "arbitraryAmountTitles", "initialAmountOfRows", "minimumAmountOfRows", "maxRows", "addRowText", "addRowTranslationKey", "deleteRowText", "deleteRowTranslationKey", "disabled", "defaultValues", "margin", "tooltip", "required", "keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "hideDeleteButton", "hideAddButton", "dropdownItems", "dropdownWidth", "fullWidth", "carbonTheme"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1127
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseCountConfigurationComponent, deps: [{ token: i1$3.FormBuilder }, { token: i2$2.DocumentService }, { token: i3$1.TranslateService }, { token: WidgetTranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
1128
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: CaseCountConfigurationComponent, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-count-configuration-form\"\n *ngIf=\"{documentItems: documentItems$ | async, operatorItems: operatorItems$} as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"defaultConditionValues$ | async\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n type=\"keyDropdownValue\"\n (allValuesValidEvent)=\"onAllConditionsValid($event)\"\n (valueChange)=\"conditionsValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .case-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .case-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "component", type: i5.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i1$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["name", "title", "titleTranslationKey", "type", "arbitraryValueAmount", "arbitraryAmountTitles", "initialAmountOfRows", "minimumAmountOfRows", "maxRows", "addRowText", "addRowTranslationKey", "deleteRowText", "deleteRowTranslationKey", "disabled", "defaultValues", "margin", "tooltip", "required", "keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "hideDeleteButton", "hideAddButton", "dropdownItems", "dropdownWidth", "fullWidth", "carbonTheme"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1257
1129
  }
1258
1130
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseCountConfigurationComponent, decorators: [{
1259
1131
  type: Component,
1260
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-count-configuration-form\"\n *ngIf=\"{documentItems: documentItems$ | async, operatorItems: operatorItems$} as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"defaultConditionValues$ | async\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n type=\"keyDropdownValue\"\n (allValuesValidEvent)=\"onAllConditionsValid($event)\"\n (valueChange)=\"conditionsValueChange($event)\"\n carbonTheme=\"white\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .case-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .case-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1261
- }], ctorParameters: () => [{ type: i1$3.FormBuilder }, { type: i2$2.DocumentService }, { type: i1$1.TranslateService }, { type: WidgetTranslationService }], propDecorators: { dataSourceKey: [{
1132
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-count-configuration-form\"\n *ngIf=\"{documentItems: documentItems$ | async, operatorItems: operatorItems$} as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"defaultConditionValues$ | async\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n type=\"keyDropdownValue\"\n (allValuesValidEvent)=\"onAllConditionsValid($event)\"\n (valueChange)=\"conditionsValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .case-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .case-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1133
+ }], ctorParameters: () => [{ type: i1$3.FormBuilder }, { type: i2$2.DocumentService }, { type: i3$1.TranslateService }, { type: WidgetTranslationService }], propDecorators: { dataSourceKey: [{
1262
1134
  type: Input
1263
1135
  }], disabled: [{
1264
1136
  type: Input
@@ -1300,6 +1172,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1300
1172
  * limitations under the License.
1301
1173
  */
1302
1174
 
1175
+ /*
1176
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
1177
+ *
1178
+ * Licensed under EUPL, Version 1.2 (the "License");
1179
+ * you may not use this file except in compliance with the License.
1180
+ * You may obtain a copy of the License at
1181
+ *
1182
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
1183
+ *
1184
+ * Unless required by applicable law or agreed to in writing, software
1185
+ * distributed under the License is distributed on an "AS IS" basis,
1186
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1187
+ * See the License for the specific language governing permissions and
1188
+ * limitations under the License.
1189
+ */
1190
+
1191
+ /*
1192
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
1193
+ *
1194
+ * Licensed under EUPL, Version 1.2 (the "License");
1195
+ * you may not use this file except in compliance with the License.
1196
+ * You may obtain a copy of the License at
1197
+ *
1198
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
1199
+ *
1200
+ * Unless required by applicable law or agreed to in writing, software
1201
+ * distributed under the License is distributed on an "AS IS" basis,
1202
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1203
+ * See the License for the specific language governing permissions and
1204
+ * limitations under the License.
1205
+ */
1206
+
1303
1207
  /*
1304
1208
  * Copyright 2015-2024 Ritense BV, the Netherlands.
1305
1209
  *
@@ -1333,7 +1237,7 @@ const caseCountDataSourceSpecification = {
1333
1237
  operator: 'Operator',
1334
1238
  value: 'Wert',
1335
1239
  conditions: 'Bedingungen',
1336
- conditionsHelperText: "Geben Sie optionale Bedingungen zum Abrufen der Anzahl der Fälle für den ausgewählten Falltyp an. Zum Beispiel: 'case:createdBy', 'Gleich', 'test@test.com'.",
1240
+ conditionsHelperText: "Geben Sie optionale Bedingungen zum Abrufen der Anzahl der Fälle für den ausgewählten Falltyp an. Zum Beispiel: 'case:createdBy', 'Gleich', 'test@test.com'. Zum Vergleichen mit leeren Werten kann als Wert '${null}' eingegeben werden. Zum Vergleichen mit dem aktuellen Datum kann als Wert '${localDateTimeNow}' eingegeben werden. Damit wird beispielsweise auch folgende Logik unterstützt: '${localDateTimeNow.minusWeeks(2)}'.",
1337
1241
  addCondition: 'Bedingung hinzufügen',
1338
1242
  },
1339
1243
  en: {
@@ -1350,7 +1254,7 @@ const caseCountDataSourceSpecification = {
1350
1254
  operator: 'Operator',
1351
1255
  value: 'Value',
1352
1256
  conditions: 'Conditions',
1353
- conditionsHelperText: "Specify optional conditions for retrieving the number of cases for the selected case type. For example: 'case:createdBy', 'Equal to', 'test@test.com'.",
1257
+ conditionsHelperText: "Specify optional conditions for retrieving the number of cases for the selected case type. For example: 'case:createdBy', 'Equal to', 'test@test.com'. To compare with empty values, '${null}' can be entered as a value. To compare with the current date, '${localDateTimeNow}' can be entered as a value. This also supports, for example, the following logic: '${localDateTimeNow.minusWeeks(2)}'.",
1354
1258
  addCondition: 'Add condition',
1355
1259
  },
1356
1260
  nl: {
@@ -1367,7 +1271,7 @@ const caseCountDataSourceSpecification = {
1367
1271
  operator: 'Operator',
1368
1272
  value: 'Waarde',
1369
1273
  conditions: 'Condities',
1370
- conditionsHelperText: "Geef optionele condities op voor het ophalen van het aantal zaken voor het geselecteerde zaaktype. Bijvoorbeeld: 'case:createdBy', 'Gelijk aan', 'test@test.com'.",
1274
+ conditionsHelperText: "Geef optionele condities op voor het ophalen van het aantal zaken voor het geselecteerde zaaktype. Bijvoorbeeld: 'case:createdBy', 'Gelijk aan', 'test@test.com'. Voor het vergelijken met lege waardes kan '${null}' ingevuld worden als waarde. Voor het vergelijken met de huidige datum kan '${localDateTimeNow}' ingevuld worden als waarde. Deze ondersteunt ook bijvoorbeeld de volgende logica: '${localDateTimeNow.minusWeeks(2)}'.",
1371
1275
  addCondition: 'Conditie toevoegen',
1372
1276
  },
1373
1277
  },
@@ -1455,6 +1359,177 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1455
1359
  * See the License for the specific language governing permissions and
1456
1360
  * limitations under the License.
1457
1361
  */
1362
+ class CaseCountsConfigurationComponent {
1363
+ set disabled(disabledValue) {
1364
+ if (disabledValue) {
1365
+ this.form.disable();
1366
+ }
1367
+ else {
1368
+ this.form.enable();
1369
+ }
1370
+ }
1371
+ get queryItems() {
1372
+ return this.form.get('queryItems');
1373
+ }
1374
+ get queryItemsValue$() {
1375
+ return this.queryItems.valueChanges.pipe(startWith(this.queryItems.value || []));
1376
+ }
1377
+ get queryItemsList$() {
1378
+ return this.queryItemsValue$.pipe(map(queryItemsValue => queryItemsValue.map(() => null)), distinctUntilChanged((previous, current) => isEqual(previous, current)));
1379
+ }
1380
+ get documentDefinition() {
1381
+ return this.form.get('documentDefinition');
1382
+ }
1383
+ get formDisabled() {
1384
+ return this.form.disabled;
1385
+ }
1386
+ set prefillConfiguration(configurationValue) {
1387
+ if (!configurationValue)
1388
+ return;
1389
+ this.documentDefinitionSelected({
1390
+ item: {
1391
+ content: configurationValue.documentDefinition,
1392
+ },
1393
+ });
1394
+ this.documentDefinition.patchValue(configurationValue.documentDefinition);
1395
+ this.queryItems.patchValue(this.queryItemsToMultiInputValues(configurationValue.queryItems));
1396
+ }
1397
+ constructor(fb, documentService, translateService, widgetTranslationService, iconService) {
1398
+ this.fb = fb;
1399
+ this.documentService = documentService;
1400
+ this.translateService = translateService;
1401
+ this.widgetTranslationService = widgetTranslationService;
1402
+ this.iconService = iconService;
1403
+ this._EMPTY_QUERY_ITEM_VALUE = {
1404
+ label: '',
1405
+ queryConditions: [{ key: '', value: '', dropdown: '' }],
1406
+ };
1407
+ this.form = this.fb.group({
1408
+ documentDefinition: this.fb.control(null, [Validators.required]),
1409
+ queryItems: this.fb.control([this._EMPTY_QUERY_ITEM_VALUE, this._EMPTY_QUERY_ITEM_VALUE], [this.queryItemsValidator()]),
1410
+ });
1411
+ this.configurationEvent = new EventEmitter();
1412
+ this._selectedDocumentDefinition$ = new BehaviorSubject('');
1413
+ this.documentItems$ = combineLatest([
1414
+ this.documentService.getAllDefinitions(),
1415
+ this._selectedDocumentDefinition$,
1416
+ ]).pipe(map(([documentDefinitions, selectedDocumentDefintion]) => documentDefinitions.content.map(definition => ({
1417
+ content: definition.id.name,
1418
+ selected: definition.id.name === selectedDocumentDefintion,
1419
+ }))));
1420
+ this._OPERATORS = [
1421
+ Operator.NOT_EQUAL_TO,
1422
+ Operator.EQUAL_TO,
1423
+ Operator.GREATER_THAN,
1424
+ Operator.GREATER_THAN_OR_EQUAL_TO,
1425
+ Operator.LESS_THAN,
1426
+ Operator.LESS_THAN_OR_EQUAL_TO,
1427
+ ];
1428
+ this.operatorItems$ = this.translateService
1429
+ .stream('key')
1430
+ .pipe(map(() => this._OPERATORS.map(operator => ({
1431
+ id: operator,
1432
+ content: this.widgetTranslationService.instant(operator, this.dataSourceKey),
1433
+ selected: false,
1434
+ }))));
1435
+ this._subscriptions = new Subscription();
1436
+ this.iconService.registerAll([Add16, TrashCan16]);
1437
+ }
1438
+ ngOnInit() {
1439
+ this.openFormSubscription();
1440
+ }
1441
+ ngOnDestroy() {
1442
+ this._subscriptions.unsubscribe();
1443
+ }
1444
+ documentDefinitionSelected(documentDefinitionItem) {
1445
+ if (!documentDefinitionItem) {
1446
+ return;
1447
+ }
1448
+ this._selectedDocumentDefinition$.next(documentDefinitionItem?.item?.content);
1449
+ }
1450
+ conditionsValueChange(index, values) {
1451
+ const currentQueryItemsValues = this.queryItems.value;
1452
+ if (isEqual(currentQueryItemsValues[index].queryConditions, values))
1453
+ return;
1454
+ this.queryItems.patchValue(currentQueryItemsValues.map((item, itemIndex) => itemIndex === index ? { ...item, queryConditions: values } : item));
1455
+ }
1456
+ labelValueChange(index, value) {
1457
+ const currentQueryItemsValues = this.queryItems.value;
1458
+ if (currentQueryItemsValues[index].label === value)
1459
+ return;
1460
+ this.queryItems.patchValue(currentQueryItemsValues.map((item, itemIndex) => itemIndex === index ? { ...item, label: value } : item));
1461
+ }
1462
+ addQueryItem() {
1463
+ const currentQueryItems = this.queryItems.value;
1464
+ this.queryItems.patchValue([...currentQueryItems, this._EMPTY_QUERY_ITEM_VALUE]);
1465
+ }
1466
+ deleteCount(i) {
1467
+ const currentQueryItems = this.queryItems.value;
1468
+ this.queryItems.patchValue(currentQueryItems.filter((_, index) => index !== i));
1469
+ }
1470
+ openFormSubscription() {
1471
+ this._subscriptions.add(this.form.valueChanges.pipe(startWith(this.form.value)).subscribe(formValue => {
1472
+ this.configurationEvent.emit({
1473
+ valid: this.form.valid,
1474
+ data: {
1475
+ ...formValue,
1476
+ queryItems: this.multiInputValuesToQueryItems(formValue.queryItems),
1477
+ },
1478
+ });
1479
+ }));
1480
+ }
1481
+ queryItemsToMultiInputValues(queryItems) {
1482
+ return queryItems.map(queryItem => ({
1483
+ ...queryItem,
1484
+ queryConditions: queryItem.queryConditions.map(condition => ({
1485
+ key: condition.queryPath,
1486
+ dropdown: condition.queryOperator,
1487
+ value: condition.queryValue,
1488
+ })),
1489
+ }));
1490
+ }
1491
+ multiInputValuesToQueryItems(multiInputValues) {
1492
+ return multiInputValues.map(queryItem => ({
1493
+ ...queryItem,
1494
+ queryConditions: queryItem.queryConditions.map(condition => ({
1495
+ queryPath: condition.key,
1496
+ queryOperator: condition.dropdown,
1497
+ queryValue: condition.value,
1498
+ })),
1499
+ }));
1500
+ }
1501
+ queryItemsValidator() {
1502
+ return (control) => {
1503
+ const queryItems = control.value;
1504
+ const validQueryItems = queryItems.filter(item => {
1505
+ const validLabel = !!item.label;
1506
+ const validConditions = item.queryConditions.filter(condition => !!condition.value && !!condition.key && !!condition.dropdown);
1507
+ return (validLabel &&
1508
+ validConditions.length > 0 &&
1509
+ item.queryConditions.length === validConditions.length);
1510
+ });
1511
+ return validQueryItems.length > 1 && validQueryItems.length === queryItems.length
1512
+ ? null
1513
+ : {
1514
+ invalidQueryItems: 'invalid',
1515
+ };
1516
+ };
1517
+ }
1518
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseCountsConfigurationComponent, deps: [{ token: i1$3.FormBuilder }, { token: i2$2.DocumentService }, { token: i3$1.TranslateService }, { token: WidgetTranslationService }, { token: i5.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
1519
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: CaseCountsConfigurationComponent, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-counts-configuration-form\"\n *ngIf=\"{\n documentItems: documentItems$ | async,\n operatorItems: operatorItems$,\n queryItemsValue: queryItemsValue$ | async\n } as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <cds-label class=\"conditions__label\">{{\n 'counts' | widgetTranslate: dataSourceKey | async\n }}</cds-label>\n\n <p class=\"conditions__helper-text cds--form__helper-text\">\n {{ 'countsHelperText' | widgetTranslate: dataSourceKey | async }}\n </p>\n\n @for (_ of queryItemsList$ | async; track $index; let i = $index) {\n <cds-tile class=\"count-tile\" cdsLayer=\"1\">\n <div class=\"count-tile__input\">\n <v-input\n [title]=\"'countTitle' | widgetTranslate: dataSourceKey | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.queryItemsValue[i]?.label\"\n [disabled]=\"formDisabled\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"labelValueChange(i, $event)\"\n >\n </v-input>\n\n <valtimo-carbon-multi-input\n [disabled]=\"formDisabled\"\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.queryItemsValue[i]?.queryConditions\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"1\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"1\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n type=\"keyDropdownValue\"\n (valueChange)=\"conditionsValueChange(i, $event)\"\n ></valtimo-carbon-multi-input>\n </div>\n\n <div class=\"count-tile__delete-button\">\n <cds-icon-button\n [disabled]=\"formDisabled || i < 2\"\n (click)=\"deleteCount(i)\"\n kind=\"danger\"\n size=\"sm\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </cds-icon-button>\n </div>\n </cds-tile>\n }\n\n <button\n class=\"add-count-button\"\n cdsButton=\"primary\"\n [disabled]=\"formDisabled\"\n (click)=\"addQueryItem()\"\n >\n {{ 'Aantal toevoegen' }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</form>\n", styles: ["::ng-deep .case-counts-configuration-form .conditions__label{display:flex;margin-bottom:8px}::ng-deep .case-counts-configuration-form .conditions__helper-text{font-style:italic;display:flex;margin-bottom:16px}::ng-deep .case-counts-configuration-form .count-tile{display:flex;flex-direction:row;gap:32px;justify-content:space-between;margin-bottom:16px}::ng-deep .case-counts-configuration-form .count-tile__input{width:100%}::ng-deep .case-counts-configuration-form .add-count-button{margin-bottom:16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1$1.InputComponent, selector: "v-input", inputs: ["name", "type", "title", "titleTranslationKey", "defaultValue", "widthPx", "fullWidth", "margin", "smallMargin", "disabled", "step", "min", "maxLength", "tooltip", "required", "hideNumberSpinBox", "smallLabel", "rows", "clear$", "carbonTheme", "placeholder"], outputs: ["valueChange"] }, { kind: "component", type: i5.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i1$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["name", "title", "titleTranslationKey", "type", "arbitraryValueAmount", "arbitraryAmountTitles", "initialAmountOfRows", "minimumAmountOfRows", "maxRows", "addRowText", "addRowTranslationKey", "deleteRowText", "deleteRowTranslationKey", "disabled", "defaultValues", "margin", "tooltip", "required", "keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "hideDeleteButton", "hideAddButton", "dropdownItems", "dropdownWidth", "fullWidth", "carbonTheme"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "directive", type: i5.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i5.IconButton, selector: "cds-icon-button, ibm-icon-button", inputs: ["buttonNgClass", "buttonAttributes", "buttonId", "kind", "size", "type", "isExpressive", "disabled", "description"], outputs: ["click", "focus", "blur", "tooltipClick"] }, { kind: "component", type: i5.Tile, selector: "cds-tile, ibm-tile", inputs: ["theme"] }, { kind: "directive", type: i5.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "directive", type: i5.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1520
+ }
1521
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseCountsConfigurationComponent, decorators: [{
1522
+ type: Component,
1523
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-counts-configuration-form\"\n *ngIf=\"{\n documentItems: documentItems$ | async,\n operatorItems: operatorItems$,\n queryItemsValue: queryItemsValue$ | async\n } as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <cds-label class=\"conditions__label\">{{\n 'counts' | widgetTranslate: dataSourceKey | async\n }}</cds-label>\n\n <p class=\"conditions__helper-text cds--form__helper-text\">\n {{ 'countsHelperText' | widgetTranslate: dataSourceKey | async }}\n </p>\n\n @for (_ of queryItemsList$ | async; track $index; let i = $index) {\n <cds-tile class=\"count-tile\" cdsLayer=\"1\">\n <div class=\"count-tile__input\">\n <v-input\n [title]=\"'countTitle' | widgetTranslate: dataSourceKey | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.queryItemsValue[i]?.label\"\n [disabled]=\"formDisabled\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"labelValueChange(i, $event)\"\n >\n </v-input>\n\n <valtimo-carbon-multi-input\n [disabled]=\"formDisabled\"\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.queryItemsValue[i]?.queryConditions\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"1\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"1\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n type=\"keyDropdownValue\"\n (valueChange)=\"conditionsValueChange(i, $event)\"\n ></valtimo-carbon-multi-input>\n </div>\n\n <div class=\"count-tile__delete-button\">\n <cds-icon-button\n [disabled]=\"formDisabled || i < 2\"\n (click)=\"deleteCount(i)\"\n kind=\"danger\"\n size=\"sm\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </cds-icon-button>\n </div>\n </cds-tile>\n }\n\n <button\n class=\"add-count-button\"\n cdsButton=\"primary\"\n [disabled]=\"formDisabled\"\n (click)=\"addQueryItem()\"\n >\n {{ 'Aantal toevoegen' }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</form>\n", styles: ["::ng-deep .case-counts-configuration-form .conditions__label{display:flex;margin-bottom:8px}::ng-deep .case-counts-configuration-form .conditions__helper-text{font-style:italic;display:flex;margin-bottom:16px}::ng-deep .case-counts-configuration-form .count-tile{display:flex;flex-direction:row;gap:32px;justify-content:space-between;margin-bottom:16px}::ng-deep .case-counts-configuration-form .count-tile__input{width:100%}::ng-deep .case-counts-configuration-form .add-count-button{margin-bottom:16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1524
+ }], ctorParameters: () => [{ type: i1$3.FormBuilder }, { type: i2$2.DocumentService }, { type: i3$1.TranslateService }, { type: WidgetTranslationService }, { type: i5.IconService }], propDecorators: { dataSourceKey: [{
1525
+ type: Input
1526
+ }], disabled: [{
1527
+ type: Input
1528
+ }], prefillConfiguration: [{
1529
+ type: Input
1530
+ }], configurationEvent: [{
1531
+ type: Output
1532
+ }] } });
1458
1533
 
1459
1534
  /*
1460
1535
  * Copyright 2015-2024 Ritense BV, the Netherlands.
@@ -1488,36 +1563,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1488
1563
  * limitations under the License.
1489
1564
  */
1490
1565
 
1491
- /*
1492
- * Copyright 2015-2024 Ritense BV, the Netherlands.
1493
- *
1494
- * Licensed under EUPL, Version 1.2 (the "License");
1495
- * you may not use this file except in compliance with the License.
1496
- * You may obtain a copy of the License at
1497
- *
1498
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
1499
- *
1500
- * Unless required by applicable law or agreed to in writing, software
1501
- * distributed under the License is distributed on an "AS IS" basis,
1502
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1503
- * See the License for the specific language governing permissions and
1504
- * limitations under the License.
1505
- */
1506
- class BarChartDisplayComponent {
1507
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BarChartDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1508
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: BarChartDisplayComponent, selector: "valtimo-bar-chart-display", inputs: { displayTypeKey: "displayTypeKey", data: "data", displayTypeProperties: "displayTypeProperties" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\nbar chart works\n", styles: [":host{display:flex;padding:20px;width:100%;height:100%}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1509
- }
1510
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BarChartDisplayComponent, decorators: [{
1511
- type: Component,
1512
- args: [{ selector: 'valtimo-bar-chart-display', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\nbar chart works\n", styles: [":host{display:flex;padding:20px;width:100%;height:100%}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1513
- }], propDecorators: { displayTypeKey: [{
1514
- type: Input
1515
- }], data: [{
1516
- type: Input
1517
- }], displayTypeProperties: [{
1518
- type: Input
1519
- }] } });
1520
-
1521
1566
  /*
1522
1567
  * Copyright 2015-2024 Ritense BV, the Netherlands.
1523
1568
  *
@@ -1565,23 +1610,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1565
1610
  * See the License for the specific language governing permissions and
1566
1611
  * limitations under the License.
1567
1612
  */
1568
- const barChartSpecification = {
1569
- displayTypeKey: 'bar-chart',
1570
- displayComponent: BarChartDisplayComponent,
1571
- width: 1,
1572
- height: 2,
1613
+ const caseCountsDataSourceSpecification = {
1614
+ dataSourceKey: 'case-counts',
1615
+ configurationComponent: CaseCountsConfigurationComponent,
1573
1616
  translations: {
1574
- nl: {
1575
- title: 'Staafdiagram',
1617
+ de: {
1618
+ title: 'Mehrere Fallanzahllen',
1619
+ documentDefinition: 'Falltyp (erforderlich)',
1620
+ documentDefinitionHelperText: 'Der Falltyp, für den die Anzahllen abgeruft wirden',
1621
+ '!=': 'Nicht gleichzusetzen mit',
1622
+ '==': 'Gleich',
1623
+ '>': 'Größer als',
1624
+ '>=': 'Größer als oder gleich wie',
1625
+ '<': 'Weniger als',
1626
+ '<=': 'Gleich oder kleiner als',
1627
+ path: 'Pfad',
1628
+ operator: 'Operator',
1629
+ value: 'Wert',
1630
+ counts: 'Anzahllen',
1631
+ countsHelperText: "Geben Sie eine oder mehrere Bedingungen für mindestens zwei Anzahllen an. Zum Beispiel: 'case:createdBy', 'Gleich', 'test@test.com'. Zum Vergleichen mit leeren Werten kann als Wert '${null}' eingegeben werden. Zum Vergleichen mit dem aktuellen Datum kann als Wert '${localDateTimeNow}' eingegeben werden. Damit wird beispielsweise auch folgende Logik unterstützt: '${localDateTimeNow.minusWeeks(2)}'.",
1632
+ addCondition: 'Bedingung hinzufügen',
1633
+ countTitle: 'Anzahltitel',
1576
1634
  },
1577
1635
  en: {
1578
- title: 'Bar chart',
1636
+ title: 'Multiple case counts',
1637
+ documentDefinition: 'Case type (required)',
1638
+ documentDefinitionHelperText: 'The case type for which the counts are retrieved',
1639
+ '!=': 'Not equal to',
1640
+ '==': 'Equal to',
1641
+ '>': 'Greater than',
1642
+ '>=': 'Greater than or equal to',
1643
+ '<': 'Less than',
1644
+ '<=': 'Less than or equal to',
1645
+ path: 'Path (required)',
1646
+ operator: 'Operator',
1647
+ value: 'Value',
1648
+ counts: 'Counts',
1649
+ countsHelperText: "Specify one or more conditions for each count that should be displayed. For example: 'case:createdBy', 'Equal to', 'test@test.com'. Configure at least two counts and at least one condition per count.",
1650
+ addCondition: 'Add condition',
1651
+ countTitle: 'Count title',
1579
1652
  },
1580
- de: {
1581
- title: 'Balkendiagramm',
1653
+ nl: {
1654
+ title: 'Meerdere dossieraantallen',
1655
+ documentDefinition: 'Dossiertype (vereist)',
1656
+ documentDefinitionHelperText: 'Het dossiertype waarvoor de aantallen worden opgehaald',
1657
+ '!=': 'Niet gelijk aan',
1658
+ '==': 'Gelijk aan',
1659
+ '>': 'Groter dan',
1660
+ '>=': 'Groter dan of gelijk aan',
1661
+ '<': 'Minder dan',
1662
+ '<=': 'Minder dan of gelijk aan',
1663
+ path: 'Pad',
1664
+ operator: 'Operator',
1665
+ value: 'Waarde',
1666
+ counts: 'Aantallen',
1667
+ countsHelperText: "Geef een of meer condities op voor een minimum van twee aantallen. Bijvoorbeeld: 'case:createdBy', 'Gelijk aan', 'test@test.com'. Voor het vergelijken met lege waardes kan '${null}' ingevuld worden als waarde. Voor het vergelijken met de huidige datum kan '${localDateTimeNow}' ingevuld worden als waarde. Deze ondersteunt ook bijvoorbeeld de volgende logica: '${localDateTimeNow.minusWeeks(2)}'.",
1668
+ addCondition: 'Conditie toevoegen',
1669
+ countTitle: 'Aantaltitel',
1582
1670
  },
1583
1671
  },
1584
- requiredDataFeatures: [],
1585
1672
  };
1586
1673
 
1587
1674
  /*
@@ -1599,18 +1686,54 @@ const barChartSpecification = {
1599
1686
  * See the License for the specific language governing permissions and
1600
1687
  * limitations under the License.
1601
1688
  */
1602
- class BarChartModule {
1603
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BarChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1604
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.3", ngImport: i0, type: BarChartModule, declarations: [BarChartDisplayComponent], imports: [CommonModule], exports: [BarChartDisplayComponent] }); }
1605
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BarChartModule, providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: barChartSpecification, multi: true }], imports: [CommonModule] }); }
1689
+ class CaseCountsDataSourceModule {
1690
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseCountsDataSourceModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1691
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.3", ngImport: i0, type: CaseCountsDataSourceModule, declarations: [CaseCountsConfigurationComponent], imports: [CommonModule,
1692
+ ReactiveFormsModule,
1693
+ WidgetTranslatePipeModule,
1694
+ InputModule$1,
1695
+ DropdownModule,
1696
+ CarbonMultiInputModule,
1697
+ InputModule$1,
1698
+ ButtonModule,
1699
+ TilesModule,
1700
+ LayerModule,
1701
+ IconModule], exports: [CaseCountsConfigurationComponent] }); }
1702
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseCountsDataSourceModule, providers: [
1703
+ { provide: DATA_SOURCE_TOKEN, useValue: caseCountsDataSourceSpecification, multi: true },
1704
+ ], imports: [CommonModule,
1705
+ ReactiveFormsModule,
1706
+ WidgetTranslatePipeModule,
1707
+ InputModule$1,
1708
+ DropdownModule,
1709
+ CarbonMultiInputModule,
1710
+ InputModule$1,
1711
+ ButtonModule,
1712
+ TilesModule,
1713
+ LayerModule,
1714
+ IconModule] }); }
1606
1715
  }
1607
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BarChartModule, decorators: [{
1716
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseCountsDataSourceModule, decorators: [{
1608
1717
  type: NgModule,
1609
1718
  args: [{
1610
- declarations: [BarChartDisplayComponent],
1611
- imports: [CommonModule],
1612
- exports: [BarChartDisplayComponent],
1613
- providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: barChartSpecification, multi: true }],
1719
+ declarations: [CaseCountsConfigurationComponent],
1720
+ imports: [
1721
+ CommonModule,
1722
+ ReactiveFormsModule,
1723
+ WidgetTranslatePipeModule,
1724
+ InputModule$1,
1725
+ DropdownModule,
1726
+ CarbonMultiInputModule,
1727
+ InputModule$1,
1728
+ ButtonModule,
1729
+ TilesModule,
1730
+ LayerModule,
1731
+ IconModule,
1732
+ ],
1733
+ exports: [CaseCountsConfigurationComponent],
1734
+ providers: [
1735
+ { provide: DATA_SOURCE_TOKEN, useValue: caseCountsDataSourceSpecification, multi: true },
1736
+ ],
1614
1737
  }]
1615
1738
  }] });
1616
1739
 
@@ -1645,7 +1768,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1645
1768
  * See the License for the specific language governing permissions and
1646
1769
  * limitations under the License.
1647
1770
  */
1648
- class BigNumberConfigurationComponent {
1771
+ class CaseGroupByConfigurationComponent {
1772
+ get documentDefinition() {
1773
+ return this.form.get('documentDefinition');
1774
+ }
1775
+ get path() {
1776
+ return this.form.get('path');
1777
+ }
1778
+ get queryConditions() {
1779
+ return this.form.get('queryConditions');
1780
+ }
1781
+ get enum() {
1782
+ return this.form.get('enum');
1783
+ }
1784
+ get formDisabled() {
1785
+ return this.form.disabled;
1786
+ }
1787
+ get formValue$() {
1788
+ return this.form.valueChanges.pipe(startWith(this.form.value));
1789
+ }
1649
1790
  set disabled(disabledValue) {
1650
1791
  if (disabledValue) {
1651
1792
  this.form.disable();
@@ -1654,35 +1795,444 @@ class BigNumberConfigurationComponent {
1654
1795
  this.form.enable();
1655
1796
  }
1656
1797
  }
1657
- get title() {
1658
- return this.form.get('title');
1659
- }
1660
- get subtitle() {
1661
- return this.form.get('subtitle');
1662
- }
1663
- get label() {
1664
- return this.form.get('label');
1665
- }
1666
- get useKPI() {
1667
- return this.form.get('useKPI');
1668
- }
1669
- get lowSeverityThreshold() {
1670
- return this.form.get('lowSeverityThreshold');
1671
- }
1672
- get mediumSeverityThreshold() {
1673
- return this.form.get('mediumSeverityThreshold');
1674
- }
1675
- get highSeverityThreshold() {
1676
- return this.form.get('highSeverityThreshold');
1677
- }
1678
1798
  set prefillConfiguration(configurationValue) {
1679
- if (configurationValue) {
1680
- this.title.setValue(configurationValue.title || '');
1681
- this.subtitle.setValue(configurationValue.subtitle || '');
1682
- this.label.setValue(configurationValue.label || '');
1683
- this.useKPI.setValue(configurationValue.useKPI || false);
1684
- this.lowSeverityThreshold.setValue(configurationValue.lowSeverityThreshold || null);
1685
- this.mediumSeverityThreshold.setValue(configurationValue.mediumSeverityThreshold || null);
1799
+ if (!configurationValue)
1800
+ return;
1801
+ this.documentDefinitionSelected({
1802
+ item: {
1803
+ content: configurationValue.documentDefinition,
1804
+ },
1805
+ });
1806
+ this.queryConditions.patchValue(this.queryConditionsToMultiInputValues(configurationValue.queryConditions));
1807
+ this.enum.patchValue(this.enumToMultiInputValues(configurationValue.enum));
1808
+ this.path.patchValue(configurationValue.path);
1809
+ }
1810
+ constructor(fb, documentService, translateService, widgetTranslationService) {
1811
+ this.fb = fb;
1812
+ this.documentService = documentService;
1813
+ this.translateService = translateService;
1814
+ this.widgetTranslationService = widgetTranslationService;
1815
+ this.form = this.fb.group({
1816
+ documentDefinition: this.fb.control(null, [Validators.required]),
1817
+ path: this.fb.control(null, [Validators.required]),
1818
+ queryConditions: this.fb.control([], [this.queryConditionsValidator()]),
1819
+ enum: this.fb.control([], [this.enumValidator()]),
1820
+ });
1821
+ this._selectedDocumentDefinition$ = new BehaviorSubject('');
1822
+ this.documentItems$ = combineLatest([
1823
+ this.documentService.getAllDefinitions(),
1824
+ this._selectedDocumentDefinition$,
1825
+ ]).pipe(map(([documentDefinitions, selectedDocumentDefintion]) => documentDefinitions.content.map(definition => ({
1826
+ content: definition.id.name,
1827
+ selected: definition.id.name === selectedDocumentDefintion,
1828
+ }))));
1829
+ this._OPERATORS = [
1830
+ Operator.NOT_EQUAL_TO,
1831
+ Operator.EQUAL_TO,
1832
+ Operator.GREATER_THAN,
1833
+ Operator.GREATER_THAN_OR_EQUAL_TO,
1834
+ Operator.LESS_THAN,
1835
+ Operator.LESS_THAN_OR_EQUAL_TO,
1836
+ ];
1837
+ this.operatorItems$ = this.translateService
1838
+ .stream('key')
1839
+ .pipe(map(() => this._OPERATORS.map(operator => ({
1840
+ id: operator,
1841
+ content: this.widgetTranslationService.instant(operator, this.dataSourceKey),
1842
+ selected: false,
1843
+ }))));
1844
+ this.configurationEvent = new EventEmitter();
1845
+ this._subscriptions = new Subscription();
1846
+ }
1847
+ ngOnInit() {
1848
+ this.openFormSubscription();
1849
+ }
1850
+ ngOnDestroy() {
1851
+ this._subscriptions.unsubscribe();
1852
+ }
1853
+ documentDefinitionSelected(documentDefinitionItem) {
1854
+ if (!documentDefinitionItem) {
1855
+ return;
1856
+ }
1857
+ this._selectedDocumentDefinition$.next(documentDefinitionItem?.item?.content);
1858
+ this.documentDefinition.setValue(documentDefinitionItem?.item?.content);
1859
+ }
1860
+ conditionsValueChange(values) {
1861
+ if (!values)
1862
+ return;
1863
+ const currentValue = this.queryConditions.value;
1864
+ if (isEqual(values, currentValue))
1865
+ return;
1866
+ this.queryConditions.patchValue(values);
1867
+ }
1868
+ enumValueChange(values) {
1869
+ if (!values)
1870
+ return;
1871
+ const currentValue = this.enum.value;
1872
+ if (isEqual(values, currentValue))
1873
+ return;
1874
+ this.enum.patchValue(values);
1875
+ }
1876
+ openFormSubscription() {
1877
+ this._subscriptions.add(this.form.valueChanges.pipe(startWith(this.form.value)).subscribe(formValue => {
1878
+ this.configurationEvent.emit({
1879
+ valid: this.form.valid,
1880
+ data: {
1881
+ ...formValue,
1882
+ queryConditions: this.multiInputValuesToQueryConditions(formValue.queryConditions),
1883
+ enum: this.multiInputValuesToEnum(formValue.enum),
1884
+ },
1885
+ });
1886
+ }));
1887
+ }
1888
+ queryConditionsValidator() {
1889
+ return (control) => {
1890
+ const queryConditions = control.value;
1891
+ const validConditions = queryConditions.filter(condition => !!condition.value && !!condition.key && !!condition.dropdown);
1892
+ return validConditions.length === queryConditions.length
1893
+ ? null
1894
+ : {
1895
+ invalidQueryItems: 'invalid',
1896
+ };
1897
+ };
1898
+ }
1899
+ enumValidator() {
1900
+ return (control) => {
1901
+ const enumeration = control.value || [];
1902
+ const enumLength = enumeration.length;
1903
+ const validEnumKeysLength = enumeration.filter(entry => !!entry.key).length;
1904
+ const validEnumValuesLength = enumeration.filter(entry => !!entry.value).length;
1905
+ return enumLength === validEnumKeysLength && enumLength === validEnumValuesLength
1906
+ ? null
1907
+ : {
1908
+ invalidEnum: 'invalid',
1909
+ };
1910
+ };
1911
+ }
1912
+ enumToMultiInputValues(enumeration) {
1913
+ return Object.keys(enumeration || {}).reduce((acc, key) => [...acc, { key, value: enumeration[key] }], []);
1914
+ }
1915
+ multiInputValuesToEnum(values) {
1916
+ return (values || []).reduce((acc, curr) => ({ ...acc, [curr.key]: curr.value }), {});
1917
+ }
1918
+ queryConditionsToMultiInputValues(queryConditions) {
1919
+ return (queryConditions || []).map(condition => ({
1920
+ key: condition.queryPath,
1921
+ dropdown: condition.queryOperator,
1922
+ value: condition.queryValue,
1923
+ }));
1924
+ }
1925
+ multiInputValuesToQueryConditions(values) {
1926
+ return (values || []).map(condition => ({
1927
+ queryPath: condition.key,
1928
+ queryOperator: condition.dropdown,
1929
+ queryValue: condition.value,
1930
+ }));
1931
+ }
1932
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseGroupByConfigurationComponent, deps: [{ token: i1$3.FormBuilder }, { token: i2$2.DocumentService }, { token: i3$1.TranslateService }, { token: WidgetTranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
1933
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: CaseGroupByConfigurationComponent, selector: "ng-component", inputs: { dataSourceKey: "dataSourceKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-count-configuration-form\"\n *ngIf=\"{\n documentItems: documentItems$ | async,\n operatorItems: operatorItems$,\n formValue: formValue$ | async\n } as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'pathHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'pathHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"path.dirty && path.invalid\"\n >\n {{ 'path' | widgetTranslate: dataSourceKey | async }}\n\n <input cdsText formControlName=\"path\" [invalid]=\"path.dirty && path.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.formValue?.queryConditions\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n type=\"keyDropdownValue\"\n (valueChange)=\"conditionsValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'enumHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'enum' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addDisplay' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.formValue?.enum\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'displayValue' | widgetTranslate: dataSourceKey | async\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .case-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .case-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i5.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "component", type: i5.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i5.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i1$1.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["name", "title", "titleTranslationKey", "type", "arbitraryValueAmount", "arbitraryAmountTitles", "initialAmountOfRows", "minimumAmountOfRows", "maxRows", "addRowText", "addRowTranslationKey", "deleteRowText", "deleteRowTranslationKey", "disabled", "defaultValues", "margin", "tooltip", "required", "keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "hideDeleteButton", "hideAddButton", "dropdownItems", "dropdownWidth", "fullWidth", "carbonTheme"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1934
+ }
1935
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseGroupByConfigurationComponent, decorators: [{
1936
+ type: Component,
1937
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form\n class=\"case-count-configuration-form\"\n *ngIf=\"{\n documentItems: documentItems$ | async,\n operatorItems: operatorItems$,\n formValue: formValue$ | async\n } as obs\"\n [formGroup]=\"form\"\n>\n <div class=\"form__element\">\n <cds-dropdown\n [appendInline]=\"true\"\n formControlName=\"documentDefinition\"\n [helperText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'documentDefinitionHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"documentDefinition.dirty && documentDefinition.invalid\"\n [label]=\"'documentDefinition' | widgetTranslate: dataSourceKey | async\"\n (selected)=\"documentDefinitionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"obs?.documentItems || []\" type=\"multi\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'pathHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalidText]=\"'pathHelperText' | widgetTranslate: dataSourceKey | async\"\n [invalid]=\"path.dirty && path.invalid\"\n >\n {{ 'path' | widgetTranslate: dataSourceKey | async }}\n\n <input cdsText formControlName=\"path\" [invalid]=\"path.dirty && path.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'conditionsHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'conditions' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addCondition' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.formValue?.queryConditions\"\n [dropdownColumnTitle]=\"'operator' | widgetTranslate: dataSourceKey | async\"\n [dropdownItems]=\"operatorItems$ | async\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'path' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n type=\"keyDropdownValue\"\n (valueChange)=\"conditionsValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n\n <div class=\"form__element conditions-multi-input\">\n <cds-label\n [helperText]=\"'enumHelperText' | widgetTranslate: dataSourceKey | async\"\n class=\"conditions-label\"\n >{{ 'enum' | widgetTranslate: dataSourceKey | async }}</cds-label\n >\n <valtimo-carbon-multi-input\n [addRowText]=\"'addDisplay' | widgetTranslate: dataSourceKey | async\"\n [defaultValues]=\"obs.formValue?.enum\"\n [fullWidth]=\"true\"\n [initialAmountOfRows]=\"0\"\n [keyColumnTitle]=\"'value' | widgetTranslate: dataSourceKey | async\"\n [minimumAmountOfRows]=\"0\"\n [valueColumnTitle]=\"'displayValue' | widgetTranslate: dataSourceKey | async\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n ></valtimo-carbon-multi-input>\n </div>\n</form>\n", styles: ["::ng-deep .case-count-configuration-form .conditions-label{margin-bottom:16px}::ng-deep .case-count-configuration-form .conditions-multi-input .cds--form__helper-text{font-style:italic}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1938
+ }], ctorParameters: () => [{ type: i1$3.FormBuilder }, { type: i2$2.DocumentService }, { type: i3$1.TranslateService }, { type: WidgetTranslationService }], propDecorators: { dataSourceKey: [{
1939
+ type: Input
1940
+ }], disabled: [{
1941
+ type: Input
1942
+ }], prefillConfiguration: [{
1943
+ type: Input
1944
+ }], configurationEvent: [{
1945
+ type: Output
1946
+ }] } });
1947
+
1948
+ /*
1949
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
1950
+ *
1951
+ * Licensed under EUPL, Version 1.2 (the "License");
1952
+ * you may not use this file except in compliance with the License.
1953
+ * You may obtain a copy of the License at
1954
+ *
1955
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
1956
+ *
1957
+ * Unless required by applicable law or agreed to in writing, software
1958
+ * distributed under the License is distributed on an "AS IS" basis,
1959
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1960
+ * See the License for the specific language governing permissions and
1961
+ * limitations under the License.
1962
+ */
1963
+
1964
+ /*
1965
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
1966
+ *
1967
+ * Licensed under EUPL, Version 1.2 (the "License");
1968
+ * you may not use this file except in compliance with the License.
1969
+ * You may obtain a copy of the License at
1970
+ *
1971
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
1972
+ *
1973
+ * Unless required by applicable law or agreed to in writing, software
1974
+ * distributed under the License is distributed on an "AS IS" basis,
1975
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1976
+ * See the License for the specific language governing permissions and
1977
+ * limitations under the License.
1978
+ */
1979
+
1980
+ /*
1981
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
1982
+ *
1983
+ * Licensed under EUPL, Version 1.2 (the "License");
1984
+ * you may not use this file except in compliance with the License.
1985
+ * You may obtain a copy of the License at
1986
+ *
1987
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
1988
+ *
1989
+ * Unless required by applicable law or agreed to in writing, software
1990
+ * distributed under the License is distributed on an "AS IS" basis,
1991
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1992
+ * See the License for the specific language governing permissions and
1993
+ * limitations under the License.
1994
+ */
1995
+
1996
+ /*
1997
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
1998
+ *
1999
+ * Licensed under EUPL, Version 1.2 (the "License");
2000
+ * you may not use this file except in compliance with the License.
2001
+ * You may obtain a copy of the License at
2002
+ *
2003
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2004
+ *
2005
+ * Unless required by applicable law or agreed to in writing, software
2006
+ * distributed under the License is distributed on an "AS IS" basis,
2007
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2008
+ * See the License for the specific language governing permissions and
2009
+ * limitations under the License.
2010
+ */
2011
+
2012
+ /*
2013
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2014
+ *
2015
+ * Licensed under EUPL, Version 1.2 (the "License");
2016
+ * you may not use this file except in compliance with the License.
2017
+ * You may obtain a copy of the License at
2018
+ *
2019
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2020
+ *
2021
+ * Unless required by applicable law or agreed to in writing, software
2022
+ * distributed under the License is distributed on an "AS IS" basis,
2023
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2024
+ * See the License for the specific language governing permissions and
2025
+ * limitations under the License.
2026
+ */
2027
+ const caseGroupByDataSourceSpecification = {
2028
+ dataSourceKey: 'case-group-by',
2029
+ configurationComponent: CaseGroupByConfigurationComponent,
2030
+ translations: {
2031
+ de: {
2032
+ title: 'Gruppe',
2033
+ documentDefinition: 'Falltyp (erforderlich)',
2034
+ documentDefinitionHelperText: 'Der Falltyp, für den die Anzahl abgerufen wird',
2035
+ '!=': 'Nicht gleichzusetzen mit',
2036
+ '==': 'Gleich',
2037
+ '>': 'Größer als',
2038
+ '>=': 'Größer als oder gleich wie',
2039
+ '<': 'Weniger als',
2040
+ '<=': 'Gleich oder kleiner als',
2041
+ path: 'Pfad',
2042
+ pathHelperText: 'Der Pfad innerhalb der Fall, deren Werte gruppiert werden sollen',
2043
+ operator: 'Operator',
2044
+ value: 'Wert',
2045
+ conditions: 'Bedingungen',
2046
+ conditionsHelperText: "Geben Sie optionale Bedingungen zum Abrufen der Gruppierung für den ausgewählten Falltyp an. Zum Beispiel: 'case:createdBy', 'Nicht gleichzusetzen mit', 'test@test.com'.",
2047
+ addCondition: 'Bedingung hinzufügen',
2048
+ enum: 'Anzeige der Werte',
2049
+ enumHelperText: "Einige Werte aus der Datenbank sind für den Endbenutzer nicht lesbar. Geben Sie hier an, wie die Werte angezeigt werden sollen. Beispiel: Wert: 'anfrage-gesendet', Anzeige: 'Anfrage gesendet'.",
2050
+ displayValue: 'Anzeige',
2051
+ addDisplay: 'Ansicht hinzufügen',
2052
+ },
2053
+ en: {
2054
+ title: 'Group by',
2055
+ documentDefinition: 'Case type (required)',
2056
+ documentDefinitionHelperText: 'The case type for which the count is retrieved',
2057
+ '!=': 'Not equal to',
2058
+ '==': 'Equal to',
2059
+ '>': 'Greater than',
2060
+ '>=': 'Greater than or equal to',
2061
+ '<': 'Less than',
2062
+ '<=': 'Less than or equal to',
2063
+ path: 'Path (required)',
2064
+ pathHelperText: 'The path within the case of which the values should be grouped',
2065
+ operator: 'Operator',
2066
+ value: 'Value',
2067
+ conditions: 'Conditions',
2068
+ conditionsHelperText: "Specify optional conditions for retrieving the grouping for the selected case type. For example: 'case:createdBy', 'Not equal to', 'test@test.com'. To compare with empty values, '${null}' can be entered as a value. To compare with the current date, '${localDateTimeNow}' can be entered as a value. This also supports, for example, the following logic: '${localDateTimeNow.minusWeeks(2)}'.",
2069
+ addCondition: 'Add condition',
2070
+ enum: 'Display of values',
2071
+ enumHelperText: "Some values from the database will not be readable by the end user. Specify here how the values should be displayed. For example: Value: 'request-sent', Display: 'Request sent'.",
2072
+ displayValue: 'Display',
2073
+ addDisplay: 'Add display',
2074
+ },
2075
+ nl: {
2076
+ title: 'Groepering',
2077
+ documentDefinition: 'Dossiertype (vereist)',
2078
+ documentDefinitionHelperText: 'Het dossiertype waarvoor de telling wordt opgehaald',
2079
+ '!=': 'Niet gelijk aan',
2080
+ '==': 'Gelijk aan',
2081
+ '>': 'Groter dan',
2082
+ '>=': 'Groter dan of gelijk aan',
2083
+ '<': 'Minder dan',
2084
+ '<=': 'Minder dan of gelijk aan',
2085
+ path: 'Pad',
2086
+ pathHelperText: 'Het pad binnen het dossier waarvan de waardes gegroepeerd moeten worden',
2087
+ operator: 'Operator',
2088
+ value: 'Waarde',
2089
+ conditions: 'Condities',
2090
+ conditionsHelperText: "Geef optionele condities op voor het ophalen van de groepering voor het geselecteerde dossiertype. Bijvoorbeeld: 'case:createdBy', 'Niet gelijk aan', 'test@test.com'. Voor het vergelijken met lege waardes kan '${null}' ingevuld worden als waarde. Voor het vergelijken met de huidige datum kan '${localDateTimeNow}' ingevuld worden als waarde. Deze ondersteunt ook bijvoorbeeld de volgende logica: '${localDateTimeNow.minusWeeks(2)}'.",
2091
+ addCondition: 'Conditie toevoegen',
2092
+ enum: 'Weergave van waardes',
2093
+ enumHelperText: "Sommige waardes uit de database zullen niet leesbaar zijn voor de eindgebruiker. Geef hier op hoe de waardes weergegeven moeten worden. Bijvoorbeeld: Waarde: 'aanvraag-verzonden', Weergave: 'Aanvraag verzonden'.",
2094
+ displayValue: 'Weergave',
2095
+ addDisplay: 'Weergave toevoegen',
2096
+ },
2097
+ },
2098
+ };
2099
+
2100
+ /*
2101
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2102
+ *
2103
+ * Licensed under EUPL, Version 1.2 (the "License");
2104
+ * you may not use this file except in compliance with the License.
2105
+ * You may obtain a copy of the License at
2106
+ *
2107
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2108
+ *
2109
+ * Unless required by applicable law or agreed to in writing, software
2110
+ * distributed under the License is distributed on an "AS IS" basis,
2111
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2112
+ * See the License for the specific language governing permissions and
2113
+ * limitations under the License.
2114
+ */
2115
+ class CaseGroupByDataSourceModule {
2116
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseGroupByDataSourceModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2117
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.3", ngImport: i0, type: CaseGroupByDataSourceModule, declarations: [CaseGroupByConfigurationComponent], imports: [CommonModule,
2118
+ ReactiveFormsModule,
2119
+ WidgetTranslatePipeModule,
2120
+ InputModule,
2121
+ DropdownModule,
2122
+ CarbonMultiInputModule], exports: [CaseGroupByConfigurationComponent] }); }
2123
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseGroupByDataSourceModule, providers: [
2124
+ { provide: DATA_SOURCE_TOKEN, useValue: caseGroupByDataSourceSpecification, multi: true },
2125
+ ], imports: [CommonModule,
2126
+ ReactiveFormsModule,
2127
+ WidgetTranslatePipeModule,
2128
+ InputModule,
2129
+ DropdownModule,
2130
+ CarbonMultiInputModule] }); }
2131
+ }
2132
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CaseGroupByDataSourceModule, decorators: [{
2133
+ type: NgModule,
2134
+ args: [{
2135
+ declarations: [CaseGroupByConfigurationComponent],
2136
+ imports: [
2137
+ CommonModule,
2138
+ ReactiveFormsModule,
2139
+ WidgetTranslatePipeModule,
2140
+ InputModule,
2141
+ DropdownModule,
2142
+ CarbonMultiInputModule,
2143
+ ],
2144
+ exports: [CaseGroupByConfigurationComponent],
2145
+ providers: [
2146
+ { provide: DATA_SOURCE_TOKEN, useValue: caseGroupByDataSourceSpecification, multi: true },
2147
+ ],
2148
+ }]
2149
+ }] });
2150
+
2151
+ /*
2152
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2153
+ *
2154
+ * Licensed under EUPL, Version 1.2 (the "License");
2155
+ * you may not use this file except in compliance with the License.
2156
+ * You may obtain a copy of the License at
2157
+ *
2158
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2159
+ *
2160
+ * Unless required by applicable law or agreed to in writing, software
2161
+ * distributed under the License is distributed on an "AS IS" basis,
2162
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2163
+ * See the License for the specific language governing permissions and
2164
+ * limitations under the License.
2165
+ */
2166
+
2167
+ /*
2168
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2169
+ *
2170
+ * Licensed under EUPL, Version 1.2 (the "License");
2171
+ * you may not use this file except in compliance with the License.
2172
+ * You may obtain a copy of the License at
2173
+ *
2174
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2175
+ *
2176
+ * Unless required by applicable law or agreed to in writing, software
2177
+ * distributed under the License is distributed on an "AS IS" basis,
2178
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2179
+ * See the License for the specific language governing permissions and
2180
+ * limitations under the License.
2181
+ */
2182
+
2183
+ /*
2184
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2185
+ *
2186
+ * Licensed under EUPL, Version 1.2 (the "License");
2187
+ * you may not use this file except in compliance with the License.
2188
+ * You may obtain a copy of the License at
2189
+ *
2190
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2191
+ *
2192
+ * Unless required by applicable law or agreed to in writing, software
2193
+ * distributed under the License is distributed on an "AS IS" basis,
2194
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2195
+ * See the License for the specific language governing permissions and
2196
+ * limitations under the License.
2197
+ */
2198
+ class BigNumberConfigurationComponent {
2199
+ set disabled(disabledValue) {
2200
+ if (disabledValue) {
2201
+ this.form.disable();
2202
+ }
2203
+ else {
2204
+ this.form.enable();
2205
+ }
2206
+ }
2207
+ get title() {
2208
+ return this.form.get('title');
2209
+ }
2210
+ get subtitle() {
2211
+ return this.form.get('subtitle');
2212
+ }
2213
+ get label() {
2214
+ return this.form.get('label');
2215
+ }
2216
+ get useKPI() {
2217
+ return this.form.get('useKPI');
2218
+ }
2219
+ get lowSeverityThreshold() {
2220
+ return this.form.get('lowSeverityThreshold');
2221
+ }
2222
+ get mediumSeverityThreshold() {
2223
+ return this.form.get('mediumSeverityThreshold');
2224
+ }
2225
+ get highSeverityThreshold() {
2226
+ return this.form.get('highSeverityThreshold');
2227
+ }
2228
+ set prefillConfiguration(configurationValue) {
2229
+ if (configurationValue) {
2230
+ this.title.setValue(configurationValue.title || '');
2231
+ this.subtitle.setValue(configurationValue.subtitle || '');
2232
+ this.label.setValue(configurationValue.label || '');
2233
+ this.useKPI.setValue(configurationValue.useKPI || false);
2234
+ this.lowSeverityThreshold.setValue(configurationValue.lowSeverityThreshold || null);
2235
+ this.mediumSeverityThreshold.setValue(configurationValue.mediumSeverityThreshold || null);
1686
2236
  this.highSeverityThreshold.setValue(configurationValue.highSeverityThreshold || null);
1687
2237
  }
1688
2238
  }
@@ -1693,49 +2243,387 @@ class BigNumberConfigurationComponent {
1693
2243
  subtitle: this.fb.control(''),
1694
2244
  label: this.fb.control(''),
1695
2245
  useKPI: this.fb.control(false, [Validators.required]),
1696
- lowSeverityThreshold: this.fb.control(null),
1697
- mediumSeverityThreshold: this.fb.control(null),
1698
- highSeverityThreshold: this.fb.control(null),
2246
+ lowSeverityThreshold: this.fb.control(null),
2247
+ mediumSeverityThreshold: this.fb.control(null),
2248
+ highSeverityThreshold: this.fb.control(null),
2249
+ });
2250
+ this.configurationEvent = new EventEmitter();
2251
+ this._subscriptions = new Subscription();
2252
+ }
2253
+ ngOnInit() {
2254
+ this.openFormSubscription();
2255
+ this.openKPISubscription();
2256
+ }
2257
+ ngOnDestroy() {
2258
+ this._subscriptions.unsubscribe();
2259
+ }
2260
+ openFormSubscription() {
2261
+ this._subscriptions.add(this.form.valueChanges.pipe(startWith(this.form.value)).subscribe(formValue => {
2262
+ this.configurationEvent.emit({ valid: this.form.valid, data: formValue });
2263
+ }));
2264
+ }
2265
+ openKPISubscription() {
2266
+ this._subscriptions.add(this.useKPI.valueChanges.pipe(startWith(this.useKPI.value)).subscribe(useKpi => {
2267
+ const validators = [Validators.required];
2268
+ if (useKpi) {
2269
+ this.lowSeverityThreshold.setValidators(validators);
2270
+ this.mediumSeverityThreshold.setValidators(validators);
2271
+ this.highSeverityThreshold.setValidators(validators);
2272
+ }
2273
+ else {
2274
+ this.lowSeverityThreshold.clearValidators();
2275
+ this.mediumSeverityThreshold.clearValidators();
2276
+ this.highSeverityThreshold.clearValidators();
2277
+ }
2278
+ this.lowSeverityThreshold.updateValueAndValidity();
2279
+ this.mediumSeverityThreshold.updateValueAndValidity();
2280
+ this.highSeverityThreshold.updateValueAndValidity();
2281
+ }));
2282
+ }
2283
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberConfigurationComponent, deps: [{ token: i1$3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
2284
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: BigNumberConfigurationComponent, selector: "ng-component", inputs: { displayTypeKey: "displayTypeKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"title.dirty && title.invalid\"\n >\n {{ 'formTitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"title\" [invalid]=\"title.dirty && title.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"subtitle.dirty && subtitle.invalid\"\n >\n {{ 'subtitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"subtitle\" [invalid]=\"subtitle.dirty && subtitle.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"label.dirty && label.invalid\"\n >\n {{ 'label' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"label\" [invalid]=\"label.dirty && label.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-checkbox formControlName=\"useKPI\">\n {{ 'useKPI' | widgetTranslate: displayTypeKey | async }}\n </cds-checkbox>\n </div>\n\n <div class=\"form__row\" *ngIf=\"useKPI.value\">\n <div class=\"form__element\">\n <cds-label [invalid]=\"lowSeverityThreshold.dirty && lowSeverityThreshold.invalid\">\n {{ 'lowSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n [invalid]=\"lowSeverityThreshold.dirty && lowSeverityThreshold.invalid\"\n formControlName=\"lowSeverityThreshold\"\n type=\"number\"\n />\n </cds-label>\n </div>\n\n <div class=\"form__spacer\"></div>\n\n <div class=\"form__element\">\n <cds-label [invalid]=\"mediumSeverityThreshold.dirty && mediumSeverityThreshold.invalid\">\n {{ 'mediumSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n formControlName=\"mediumSeverityThreshold\"\n [invalid]=\"mediumSeverityThreshold.dirty && mediumSeverityThreshold.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n\n <div class=\"form__spacer\"></div>\n\n <div class=\"form__element\">\n <cds-label [invalid]=\"highSeverityThreshold.dirty && highSeverityThreshold.invalid\">\n {{ 'highSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n formControlName=\"highSeverityThreshold\"\n [invalid]=\"highSeverityThreshold.dirty && highSeverityThreshold.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i5.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "component", type: i5.Checkbox, selector: "cds-checkbox, ibm-checkbox", inputs: ["disabled", "skeleton", "hideLabel", "name", "id", "required", "value", "ariaLabel", "ariaLabelledby", "indeterminate", "checked"], outputs: ["click", "checkedChange", "indeterminateChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2285
+ }
2286
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberConfigurationComponent, decorators: [{
2287
+ type: Component,
2288
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"title.dirty && title.invalid\"\n >\n {{ 'formTitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"title\" [invalid]=\"title.dirty && title.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"subtitle.dirty && subtitle.invalid\"\n >\n {{ 'subtitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"subtitle\" [invalid]=\"subtitle.dirty && subtitle.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"label.dirty && label.invalid\"\n >\n {{ 'label' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"label\" [invalid]=\"label.dirty && label.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-checkbox formControlName=\"useKPI\">\n {{ 'useKPI' | widgetTranslate: displayTypeKey | async }}\n </cds-checkbox>\n </div>\n\n <div class=\"form__row\" *ngIf=\"useKPI.value\">\n <div class=\"form__element\">\n <cds-label [invalid]=\"lowSeverityThreshold.dirty && lowSeverityThreshold.invalid\">\n {{ 'lowSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n [invalid]=\"lowSeverityThreshold.dirty && lowSeverityThreshold.invalid\"\n formControlName=\"lowSeverityThreshold\"\n type=\"number\"\n />\n </cds-label>\n </div>\n\n <div class=\"form__spacer\"></div>\n\n <div class=\"form__element\">\n <cds-label [invalid]=\"mediumSeverityThreshold.dirty && mediumSeverityThreshold.invalid\">\n {{ 'mediumSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n formControlName=\"mediumSeverityThreshold\"\n [invalid]=\"mediumSeverityThreshold.dirty && mediumSeverityThreshold.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n\n <div class=\"form__spacer\"></div>\n\n <div class=\"form__element\">\n <cds-label [invalid]=\"highSeverityThreshold.dirty && highSeverityThreshold.invalid\">\n {{ 'highSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n formControlName=\"highSeverityThreshold\"\n [invalid]=\"highSeverityThreshold.dirty && highSeverityThreshold.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n </div>\n</form>\n" }]
2289
+ }], ctorParameters: () => [{ type: i1$3.FormBuilder }], propDecorators: { displayTypeKey: [{
2290
+ type: Input
2291
+ }], disabled: [{
2292
+ type: Input
2293
+ }], prefillConfiguration: [{
2294
+ type: Input
2295
+ }], configurationEvent: [{
2296
+ type: Output
2297
+ }] } });
2298
+
2299
+ /*
2300
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2301
+ *
2302
+ * Licensed under EUPL, Version 1.2 (the "License");
2303
+ * you may not use this file except in compliance with the License.
2304
+ * You may obtain a copy of the License at
2305
+ *
2306
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2307
+ *
2308
+ * Unless required by applicable law or agreed to in writing, software
2309
+ * distributed under the License is distributed on an "AS IS" basis,
2310
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2311
+ * See the License for the specific language governing permissions and
2312
+ * limitations under the License.
2313
+ */
2314
+
2315
+ /*
2316
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2317
+ *
2318
+ * Licensed under EUPL, Version 1.2 (the "License");
2319
+ * you may not use this file except in compliance with the License.
2320
+ * You may obtain a copy of the License at
2321
+ *
2322
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2323
+ *
2324
+ * Unless required by applicable law or agreed to in writing, software
2325
+ * distributed under the License is distributed on an "AS IS" basis,
2326
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2327
+ * See the License for the specific language governing permissions and
2328
+ * limitations under the License.
2329
+ */
2330
+ class BigNumberDisplayComponent {
2331
+ get severityClass() {
2332
+ if (!this.displayTypeProperties.useKPI) {
2333
+ return WidgetSeverity.BLACK;
2334
+ }
2335
+ const value = this.data?.value;
2336
+ if (value < this.displayTypeProperties.lowSeverityThreshold) {
2337
+ return WidgetSeverity.GREEN;
2338
+ }
2339
+ else if (value < this.displayTypeProperties.mediumSeverityThreshold) {
2340
+ return WidgetSeverity.YELLOW;
2341
+ }
2342
+ else if (value < this.displayTypeProperties.highSeverityThreshold) {
2343
+ return WidgetSeverity.ORANGE;
2344
+ }
2345
+ return WidgetSeverity.RED;
2346
+ }
2347
+ get numberFontSize() {
2348
+ if (!this.data) {
2349
+ return 122;
2350
+ }
2351
+ return Math.floor(122 / this.data.value.toString().length) + 20;
2352
+ }
2353
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2354
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: BigNumberDisplayComponent, selector: "valtimo-big-number-display", inputs: { displayTypeKey: "displayTypeKey", data: "data", displayTypeProperties: "displayTypeProperties" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<section class=\"valtimo-big-number-widget__header\">\n <h3 class=\"valtimo-big-number-widget__title\">{{ displayTypeProperties.title }}</h3>\n\n <span *ngIf=\"displayTypeProperties.subtitle\" class=\"valtimo-big-number-widget__subtitle\">\n {{ displayTypeProperties.subtitle }}\n </span>\n</section>\n\n<section class=\"valtimo-big-number-widget__content\">\n <span\n [class]=\"['valtimo-big-number-widget__number', severityClass]\"\n [style.fontSize.px]=\"numberFontSize\"\n >{{ data?.value }}</span\n >\n\n <span *ngIf=\"displayTypeProperties.label\" class=\"valtimo-big-number-widget__label\">\n {{ displayTypeProperties.label }}\n </span>\n</section>\n", styles: [":host{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;padding:20px}.valtimo-big-number-widget__title,.valtimo-big-number-widget__subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.valtimo-big-number-widget__title{font-size:20px;margin-bottom:12px}.valtimo-big-number-widget__subtitle{font-size:14px}.valtimo-big-number-widget__number{font-weight:lighter;font-size:122px;line-height:.75em}.valtimo-big-number-widget__label{font-size:12px;margin-left:12px;margin-bottom:-1px}.valtimo-big-number-widget__content{display:flex;align-items:flex-end}.valtimo-severity__black{color:#000}.valtimo-severity__green{color:#42be65}.valtimo-severity__yellow{color:#f1c21b}.valtimo-severity__orange{color:#ff832b}.valtimo-severity__red{color:#da1e28}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2355
+ }
2356
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberDisplayComponent, decorators: [{
2357
+ type: Component,
2358
+ args: [{ selector: 'valtimo-big-number-display', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<section class=\"valtimo-big-number-widget__header\">\n <h3 class=\"valtimo-big-number-widget__title\">{{ displayTypeProperties.title }}</h3>\n\n <span *ngIf=\"displayTypeProperties.subtitle\" class=\"valtimo-big-number-widget__subtitle\">\n {{ displayTypeProperties.subtitle }}\n </span>\n</section>\n\n<section class=\"valtimo-big-number-widget__content\">\n <span\n [class]=\"['valtimo-big-number-widget__number', severityClass]\"\n [style.fontSize.px]=\"numberFontSize\"\n >{{ data?.value }}</span\n >\n\n <span *ngIf=\"displayTypeProperties.label\" class=\"valtimo-big-number-widget__label\">\n {{ displayTypeProperties.label }}\n </span>\n</section>\n", styles: [":host{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;padding:20px}.valtimo-big-number-widget__title,.valtimo-big-number-widget__subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.valtimo-big-number-widget__title{font-size:20px;margin-bottom:12px}.valtimo-big-number-widget__subtitle{font-size:14px}.valtimo-big-number-widget__number{font-weight:lighter;font-size:122px;line-height:.75em}.valtimo-big-number-widget__label{font-size:12px;margin-left:12px;margin-bottom:-1px}.valtimo-big-number-widget__content{display:flex;align-items:flex-end}.valtimo-severity__black{color:#000}.valtimo-severity__green{color:#42be65}.valtimo-severity__yellow{color:#f1c21b}.valtimo-severity__orange{color:#ff832b}.valtimo-severity__red{color:#da1e28}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2359
+ }], propDecorators: { displayTypeKey: [{
2360
+ type: Input
2361
+ }], data: [{
2362
+ type: Input
2363
+ }], displayTypeProperties: [{
2364
+ type: Input
2365
+ }] } });
2366
+
2367
+ /*
2368
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2369
+ *
2370
+ * Licensed under EUPL, Version 1.2 (the "License");
2371
+ * you may not use this file except in compliance with the License.
2372
+ * You may obtain a copy of the License at
2373
+ *
2374
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2375
+ *
2376
+ * Unless required by applicable law or agreed to in writing, software
2377
+ * distributed under the License is distributed on an "AS IS" basis,
2378
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2379
+ * See the License for the specific language governing permissions and
2380
+ * limitations under the License.
2381
+ */
2382
+
2383
+ /*
2384
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2385
+ *
2386
+ * Licensed under EUPL, Version 1.2 (the "License");
2387
+ * you may not use this file except in compliance with the License.
2388
+ * You may obtain a copy of the License at
2389
+ *
2390
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2391
+ *
2392
+ * Unless required by applicable law or agreed to in writing, software
2393
+ * distributed under the License is distributed on an "AS IS" basis,
2394
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2395
+ * See the License for the specific language governing permissions and
2396
+ * limitations under the License.
2397
+ */
2398
+
2399
+ /*
2400
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2401
+ *
2402
+ * Licensed under EUPL, Version 1.2 (the "License");
2403
+ * you may not use this file except in compliance with the License.
2404
+ * You may obtain a copy of the License at
2405
+ *
2406
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2407
+ *
2408
+ * Unless required by applicable law or agreed to in writing, software
2409
+ * distributed under the License is distributed on an "AS IS" basis,
2410
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2411
+ * See the License for the specific language governing permissions and
2412
+ * limitations under the License.
2413
+ */
2414
+ const bigNumberSpecification = {
2415
+ displayTypeKey: 'number',
2416
+ displayComponent: BigNumberDisplayComponent,
2417
+ configurationComponent: BigNumberConfigurationComponent,
2418
+ width: 1,
2419
+ height: 1,
2420
+ translations: {
2421
+ nl: {
2422
+ title: 'Groot getal',
2423
+ formTitle: 'Titel (vereist)',
2424
+ formTitleHelperText: 'De titel die wordt weergegeven in de widget',
2425
+ subtitle: 'Ondertitel',
2426
+ subtitleHelperText: 'De ondertitel weergegeven in de widget',
2427
+ label: 'Label',
2428
+ labelHelperText: 'Het label dat wordt weergegeven in de widget',
2429
+ useKPI: 'KPI gebruiken',
2430
+ lowSeverityThreshold: 'Lage ernstdrempel (vereist)',
2431
+ mediumSeverityThreshold: 'Middelmatige ernstdrempel (vereist)',
2432
+ highSeverityThreshold: 'Hoge ernstdrempel (vereist)',
2433
+ },
2434
+ en: {
2435
+ title: 'Big number',
2436
+ formTitle: 'Title (required)',
2437
+ formTitleHelperText: 'The title displayed in the widget',
2438
+ subtitle: 'Subtitle',
2439
+ subtitleHelperText: 'The subtitle displayed in the widget',
2440
+ label: 'Label',
2441
+ labelHelperText: 'The label displayed in the widget',
2442
+ useKPI: 'Use KPI',
2443
+ lowSeverityThreshold: 'Low severity threshold (required)',
2444
+ mediumSeverityThreshold: 'Medium severity threshold (required)',
2445
+ highSeverityThreshold: 'High severity threshold (required)',
2446
+ },
2447
+ de: {
2448
+ title: 'Große Nummer',
2449
+ formTitle: 'Titel (erforderlich)',
2450
+ formTitleHelperText: 'Der im Widget angezeigte Titel',
2451
+ subtitle: 'Untertitel',
2452
+ subtitleHelperText: 'Der im Widget angezeigte Untertitel',
2453
+ label: 'Beschriftung',
2454
+ labelHelperText: 'Die im Widget angezeigte Beschriftung',
2455
+ useKPI: 'Verwenden Sie KPI',
2456
+ lowSeverityThreshold: 'Niedriger Schweregradschwellenwert (erforderlich)',
2457
+ mediumSeverityThreshold: 'Mittlerer Schweregradschwellenwert (erforderlich)',
2458
+ highSeverityThreshold: 'Hoher Schweregradschwellenwert (erforderlich)',
2459
+ },
2460
+ },
2461
+ requiredDataFeatures: [DATA_FEATURES.NUMBER],
2462
+ };
2463
+
2464
+ /*
2465
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2466
+ *
2467
+ * Licensed under EUPL, Version 1.2 (the "License");
2468
+ * you may not use this file except in compliance with the License.
2469
+ * You may obtain a copy of the License at
2470
+ *
2471
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2472
+ *
2473
+ * Unless required by applicable law or agreed to in writing, software
2474
+ * distributed under the License is distributed on an "AS IS" basis,
2475
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2476
+ * See the License for the specific language governing permissions and
2477
+ * limitations under the License.
2478
+ */
2479
+ class BigNumberModule {
2480
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2481
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.3", ngImport: i0, type: BigNumberModule, declarations: [BigNumberDisplayComponent, BigNumberConfigurationComponent], imports: [CommonModule,
2482
+ ReactiveFormsModule,
2483
+ WidgetTranslatePipeModule,
2484
+ InputModule,
2485
+ CheckboxModule], exports: [BigNumberDisplayComponent] }); }
2486
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberModule, providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: bigNumberSpecification, multi: true }], imports: [CommonModule,
2487
+ ReactiveFormsModule,
2488
+ WidgetTranslatePipeModule,
2489
+ InputModule,
2490
+ CheckboxModule] }); }
2491
+ }
2492
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberModule, decorators: [{
2493
+ type: NgModule,
2494
+ args: [{
2495
+ declarations: [BigNumberDisplayComponent, BigNumberConfigurationComponent],
2496
+ imports: [
2497
+ CommonModule,
2498
+ ReactiveFormsModule,
2499
+ WidgetTranslatePipeModule,
2500
+ InputModule,
2501
+ CheckboxModule,
2502
+ ],
2503
+ exports: [BigNumberDisplayComponent],
2504
+ providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: bigNumberSpecification, multi: true }],
2505
+ }]
2506
+ }] });
2507
+
2508
+ /*
2509
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2510
+ *
2511
+ * Licensed under EUPL, Version 1.2 (the "License");
2512
+ * you may not use this file except in compliance with the License.
2513
+ * You may obtain a copy of the License at
2514
+ *
2515
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2516
+ *
2517
+ * Unless required by applicable law or agreed to in writing, software
2518
+ * distributed under the License is distributed on an "AS IS" basis,
2519
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2520
+ * See the License for the specific language governing permissions and
2521
+ * limitations under the License.
2522
+ */
2523
+
2524
+ /*
2525
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2526
+ *
2527
+ * Licensed under EUPL, Version 1.2 (the "License");
2528
+ * you may not use this file except in compliance with the License.
2529
+ * You may obtain a copy of the License at
2530
+ *
2531
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2532
+ *
2533
+ * Unless required by applicable law or agreed to in writing, software
2534
+ * distributed under the License is distributed on an "AS IS" basis,
2535
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2536
+ * See the License for the specific language governing permissions and
2537
+ * limitations under the License.
2538
+ */
2539
+
2540
+ /*
2541
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2542
+ *
2543
+ * Licensed under EUPL, Version 1.2 (the "License");
2544
+ * you may not use this file except in compliance with the License.
2545
+ * You may obtain a copy of the License at
2546
+ *
2547
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2548
+ *
2549
+ * Unless required by applicable law or agreed to in writing, software
2550
+ * distributed under the License is distributed on an "AS IS" basis,
2551
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2552
+ * See the License for the specific language governing permissions and
2553
+ * limitations under the License.
2554
+ */
2555
+
2556
+ /*
2557
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2558
+ *
2559
+ * Licensed under EUPL, Version 1.2 (the "License");
2560
+ * you may not use this file except in compliance with the License.
2561
+ * You may obtain a copy of the License at
2562
+ *
2563
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2564
+ *
2565
+ * Unless required by applicable law or agreed to in writing, software
2566
+ * distributed under the License is distributed on an "AS IS" basis,
2567
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2568
+ * See the License for the specific language governing permissions and
2569
+ * limitations under the License.
2570
+ */
2571
+ class DonutConfigurationComponent {
2572
+ set disabled(disabledValue) {
2573
+ if (disabledValue) {
2574
+ this.form.disable();
2575
+ }
2576
+ else {
2577
+ this.form.enable();
2578
+ }
2579
+ }
2580
+ get title() {
2581
+ return this.form.get('title');
2582
+ }
2583
+ get subtitle() {
2584
+ return this.form.get('subtitle');
2585
+ }
2586
+ get label() {
2587
+ return this.form.get('label');
2588
+ }
2589
+ set prefillConfiguration(configurationValue) {
2590
+ if (configurationValue) {
2591
+ this.title.setValue(configurationValue.title || '');
2592
+ this.subtitle.setValue(configurationValue.subtitle || '');
2593
+ this.label.setValue(configurationValue.label || '');
2594
+ }
2595
+ }
2596
+ constructor(fb) {
2597
+ this.fb = fb;
2598
+ this.form = this.fb.group({
2599
+ title: this.fb.control('', [Validators.required]),
2600
+ subtitle: this.fb.control(''),
2601
+ label: this.fb.control(''),
2602
+ useKPI: this.fb.control(false, [Validators.required]),
1699
2603
  });
1700
2604
  this.configurationEvent = new EventEmitter();
1701
2605
  this._subscriptions = new Subscription();
1702
2606
  }
1703
2607
  ngOnInit() {
1704
2608
  this.openFormSubscription();
1705
- this.openKPISubscription();
1706
2609
  }
1707
2610
  ngOnDestroy() {
1708
2611
  this._subscriptions.unsubscribe();
1709
2612
  }
1710
2613
  openFormSubscription() {
1711
2614
  this._subscriptions.add(this.form.valueChanges.pipe(startWith(this.form.value)).subscribe(formValue => {
1712
- this.configurationEvent.emit({ valid: this.form.valid, data: formValue });
1713
- }));
1714
- }
1715
- openKPISubscription() {
1716
- this._subscriptions.add(this.useKPI.valueChanges.pipe(startWith(this.useKPI.value)).subscribe(useKpi => {
1717
- const validators = [Validators.required];
1718
- if (useKpi) {
1719
- this.lowSeverityThreshold.setValidators(validators);
1720
- this.mediumSeverityThreshold.setValidators(validators);
1721
- this.highSeverityThreshold.setValidators(validators);
1722
- }
1723
- else {
1724
- this.lowSeverityThreshold.clearValidators();
1725
- this.mediumSeverityThreshold.clearValidators();
1726
- this.highSeverityThreshold.clearValidators();
1727
- }
1728
- this.lowSeverityThreshold.updateValueAndValidity();
1729
- this.mediumSeverityThreshold.updateValueAndValidity();
1730
- this.highSeverityThreshold.updateValueAndValidity();
2615
+ this.configurationEvent.emit({
2616
+ valid: this.form.valid,
2617
+ data: formValue,
2618
+ });
1731
2619
  }));
1732
2620
  }
1733
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberConfigurationComponent, deps: [{ token: i1$3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
1734
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: BigNumberConfigurationComponent, selector: "ng-component", inputs: { displayTypeKey: "displayTypeKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"title.dirty && title.invalid\"\n >\n {{ 'formTitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"title\" [invalid]=\"title.dirty && title.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"subtitle.dirty && subtitle.invalid\"\n >\n {{ 'subtitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"subtitle\" [invalid]=\"subtitle.dirty && subtitle.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"label.dirty && label.invalid\"\n >\n {{ 'label' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"label\" [invalid]=\"label.dirty && label.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-checkbox formControlName=\"useKPI\">\n {{ 'useKPI' | widgetTranslate: displayTypeKey | async }}\n </cds-checkbox>\n </div>\n\n <div class=\"form__row\" *ngIf=\"useKPI.value\">\n <div class=\"form__element\">\n <cds-label [invalid]=\"lowSeverityThreshold.dirty && lowSeverityThreshold.invalid\">\n {{ 'lowSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n [invalid]=\"lowSeverityThreshold.dirty && lowSeverityThreshold.invalid\"\n formControlName=\"lowSeverityThreshold\"\n type=\"number\"\n />\n </cds-label>\n </div>\n\n <div class=\"form__spacer\"></div>\n\n <div class=\"form__element\">\n <cds-label [invalid]=\"mediumSeverityThreshold.dirty && mediumSeverityThreshold.invalid\">\n {{ 'mediumSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n formControlName=\"mediumSeverityThreshold\"\n [invalid]=\"mediumSeverityThreshold.dirty && mediumSeverityThreshold.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n\n <div class=\"form__spacer\"></div>\n\n <div class=\"form__element\">\n <cds-label [invalid]=\"highSeverityThreshold.dirty && highSeverityThreshold.invalid\">\n {{ 'highSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n formControlName=\"highSeverityThreshold\"\n [invalid]=\"highSeverityThreshold.dirty && highSeverityThreshold.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4$1.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i4$1.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "component", type: i4$1.Checkbox, selector: "cds-checkbox, ibm-checkbox", inputs: ["disabled", "skeleton", "hideLabel", "name", "id", "required", "value", "ariaLabel", "ariaLabelledby", "indeterminate", "checked"], outputs: ["click", "checkedChange", "indeterminateChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2621
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: DonutConfigurationComponent, deps: [{ token: i1$3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
2622
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: DonutConfigurationComponent, selector: "ng-component", inputs: { displayTypeKey: "displayTypeKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"title.dirty && title.invalid\"\n >\n {{ 'formTitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"title\" [invalid]=\"title.dirty && title.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"subtitle.dirty && subtitle.invalid\"\n >\n {{ 'subtitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"subtitle\" [invalid]=\"subtitle.dirty && subtitle.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"label.dirty && label.invalid\"\n >\n {{ 'label' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"label\" [invalid]=\"label.dirty && label.invalid\" />\n </cds-label>\n </div>\n\n</form>\n", dependencies: [{ kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i5.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1735
2623
  }
1736
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberConfigurationComponent, decorators: [{
2624
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: DonutConfigurationComponent, decorators: [{
1737
2625
  type: Component,
1738
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"title.dirty && title.invalid\"\n >\n {{ 'formTitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"title\" [invalid]=\"title.dirty && title.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"subtitle.dirty && subtitle.invalid\"\n >\n {{ 'subtitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"subtitle\" [invalid]=\"subtitle.dirty && subtitle.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"label.dirty && label.invalid\"\n >\n {{ 'label' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"label\" [invalid]=\"label.dirty && label.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-checkbox formControlName=\"useKPI\">\n {{ 'useKPI' | widgetTranslate: displayTypeKey | async }}\n </cds-checkbox>\n </div>\n\n <div class=\"form__row\" *ngIf=\"useKPI.value\">\n <div class=\"form__element\">\n <cds-label [invalid]=\"lowSeverityThreshold.dirty && lowSeverityThreshold.invalid\">\n {{ 'lowSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n [invalid]=\"lowSeverityThreshold.dirty && lowSeverityThreshold.invalid\"\n formControlName=\"lowSeverityThreshold\"\n type=\"number\"\n />\n </cds-label>\n </div>\n\n <div class=\"form__spacer\"></div>\n\n <div class=\"form__element\">\n <cds-label [invalid]=\"mediumSeverityThreshold.dirty && mediumSeverityThreshold.invalid\">\n {{ 'mediumSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n formControlName=\"mediumSeverityThreshold\"\n [invalid]=\"mediumSeverityThreshold.dirty && mediumSeverityThreshold.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n\n <div class=\"form__spacer\"></div>\n\n <div class=\"form__element\">\n <cds-label [invalid]=\"highSeverityThreshold.dirty && highSeverityThreshold.invalid\">\n {{ 'highSeverityThreshold' | widgetTranslate: displayTypeKey | async }}\n\n <input\n cdsText\n formControlName=\"highSeverityThreshold\"\n [invalid]=\"highSeverityThreshold.dirty && highSeverityThreshold.invalid\"\n type=\"number\"\n />\n </cds-label>\n </div>\n </div>\n</form>\n" }]
2626
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"title.dirty && title.invalid\"\n >\n {{ 'formTitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"title\" [invalid]=\"title.dirty && title.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"subtitle.dirty && subtitle.invalid\"\n >\n {{ 'subtitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"subtitle\" [invalid]=\"subtitle.dirty && subtitle.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"label.dirty && label.invalid\"\n >\n {{ 'label' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"label\" [invalid]=\"label.dirty && label.invalid\" />\n </cds-label>\n </div>\n\n</form>\n" }]
1739
2627
  }], ctorParameters: () => [{ type: i1$3.FormBuilder }], propDecorators: { displayTypeKey: [{
1740
2628
  type: Input
1741
2629
  }], disabled: [{
@@ -1762,6 +2650,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1762
2650
  * limitations under the License.
1763
2651
  */
1764
2652
 
2653
+ /*
2654
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2655
+ *
2656
+ * Licensed under EUPL, Version 1.2 (the "License");
2657
+ * you may not use this file except in compliance with the License.
2658
+ * You may obtain a copy of the License at
2659
+ *
2660
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2661
+ *
2662
+ * Unless required by applicable law or agreed to in writing, software
2663
+ * distributed under the License is distributed on an "AS IS" basis,
2664
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2665
+ * See the License for the specific language governing permissions and
2666
+ * limitations under the License.
2667
+ */
2668
+ class DonutDisplayComponent {
2669
+ set data(value) {
2670
+ if (!value)
2671
+ return;
2672
+ this._data$.next(value);
2673
+ }
2674
+ constructor(themeService) {
2675
+ this.themeService = themeService;
2676
+ this._data$ = new BehaviorSubject(null);
2677
+ this.donutData$ = this._data$.pipe(filter(data => !!data), map(data => data?.values.map(dataValue => ({
2678
+ group: dataValue.label,
2679
+ value: dataValue.value,
2680
+ })) || []));
2681
+ this.donutChartOptions$ = this.themeService.currentTheme$.pipe(map(currentTheme => ({
2682
+ resizable: true,
2683
+ toolbar: { enabled: false },
2684
+ height: '300px',
2685
+ theme: currentTheme,
2686
+ donut: {
2687
+ alignment: 'center',
2688
+ center: {
2689
+ label: this.displayTypeProperties.label,
2690
+ },
2691
+ },
2692
+ pie: {
2693
+ labels: {
2694
+ enabled: false,
2695
+ },
2696
+ },
2697
+ legend: {
2698
+ truncation: {
2699
+ numCharacter: 28,
2700
+ },
2701
+ },
2702
+ })));
2703
+ }
2704
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: DonutDisplayComponent, deps: [{ token: i1$1.CdsThemeService }], target: i0.ɵɵFactoryTarget.Component }); }
2705
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: DonutDisplayComponent, selector: "valtimo-donut-display", inputs: { displayTypeKey: "displayTypeKey", data: "data", displayTypeProperties: "displayTypeProperties" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<section class=\"valtimo-donut-widget__header\">\n <h3 class=\"valtimo-donut-widget__title\">{{ displayTypeProperties.title }}</h3>\n\n <span *ngIf=\"displayTypeProperties.subtitle\" class=\"valtimo-donut-widget__subtitle\">\n {{ displayTypeProperties.subtitle }}\n </span>\n</section>\n\n<section class=\"valtimo-donut-widget__content\">\n <ng-container *ngIf=\"donutData$ | async as donutData\">\n @if (donutData.length > 0) {\n <ibm-donut-chart\n type=\"donut\"\n class=\"n-chart\"\n [data]=\"donutData\"\n [options]=\"donutChartOptions$ | async\"\n ></ibm-donut-chart>\n } @else {\n <valtimo-no-results\n [collapseVertically]=\"true\"\n [description]=\"'dossier.widgets.noData' | translate\"\n [smallPadding]=\"true\"\n ></valtimo-no-results>\n }\n </ng-container>\n</section>\n", styles: [":host{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;padding:20px}.valtimo-donut-widget__title,.valtimo-donut-widget__subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.valtimo-donut-widget__title{font-size:20px;margin-bottom:12px}.valtimo-donut-widget__subtitle{font-size:14px}.valtimo-donut-widget__label{font-size:12px;margin-left:12px;margin-bottom:-1px}.valtimo-donut-widget__content{display:flex;align-items:flex-end;justify-content:center;margin-bottom:12px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$2.DonutChartComponent, selector: "ibm-donut-chart" }, { kind: "component", type: i1$1.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2706
+ }
2707
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: DonutDisplayComponent, decorators: [{
2708
+ type: Component,
2709
+ args: [{ selector: 'valtimo-donut-display', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<section class=\"valtimo-donut-widget__header\">\n <h3 class=\"valtimo-donut-widget__title\">{{ displayTypeProperties.title }}</h3>\n\n <span *ngIf=\"displayTypeProperties.subtitle\" class=\"valtimo-donut-widget__subtitle\">\n {{ displayTypeProperties.subtitle }}\n </span>\n</section>\n\n<section class=\"valtimo-donut-widget__content\">\n <ng-container *ngIf=\"donutData$ | async as donutData\">\n @if (donutData.length > 0) {\n <ibm-donut-chart\n type=\"donut\"\n class=\"n-chart\"\n [data]=\"donutData\"\n [options]=\"donutChartOptions$ | async\"\n ></ibm-donut-chart>\n } @else {\n <valtimo-no-results\n [collapseVertically]=\"true\"\n [description]=\"'dossier.widgets.noData' | translate\"\n [smallPadding]=\"true\"\n ></valtimo-no-results>\n }\n </ng-container>\n</section>\n", styles: [":host{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;padding:20px}.valtimo-donut-widget__title,.valtimo-donut-widget__subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.valtimo-donut-widget__title{font-size:20px;margin-bottom:12px}.valtimo-donut-widget__subtitle{font-size:14px}.valtimo-donut-widget__label{font-size:12px;margin-left:12px;margin-bottom:-1px}.valtimo-donut-widget__content{display:flex;align-items:flex-end;justify-content:center;margin-bottom:12px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2710
+ }], ctorParameters: () => [{ type: i1$1.CdsThemeService }], propDecorators: { displayTypeKey: [{
2711
+ type: Input
2712
+ }], data: [{
2713
+ type: Input
2714
+ }], displayTypeProperties: [{
2715
+ type: Input
2716
+ }] } });
2717
+
1765
2718
  /*
1766
2719
  * Copyright 2015-2024 Ritense BV, the Netherlands.
1767
2720
  *
@@ -1809,6 +2762,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1809
2762
  * See the License for the specific language governing permissions and
1810
2763
  * limitations under the License.
1811
2764
  */
2765
+ const donutSpecification = {
2766
+ displayTypeKey: 'donut',
2767
+ displayComponent: DonutDisplayComponent,
2768
+ configurationComponent: DonutConfigurationComponent,
2769
+ width: 1,
2770
+ height: 2,
2771
+ translations: {
2772
+ nl: {
2773
+ title: 'Donut-diagram',
2774
+ formTitle: 'Titel (vereist)',
2775
+ formTitleHelperText: 'De titel die wordt weergegeven in de widget',
2776
+ subtitle: 'Ondertitel',
2777
+ subtitleHelperText: 'De ondertitel weergegeven in de widget',
2778
+ label: 'Label',
2779
+ labelHelperText: 'Het label dat wordt weergegeven in de widget',
2780
+ },
2781
+ en: {
2782
+ title: 'Donut chart',
2783
+ formTitle: 'Title (required)',
2784
+ formTitleHelperText: 'The title displayed in the widget',
2785
+ subtitle: 'Subtitle',
2786
+ subtitleHelperText: 'The subtitle displayed in the widget',
2787
+ label: 'Label',
2788
+ labelHelperText: 'The label displayed in the widget',
2789
+ },
2790
+ de: {
2791
+ title: 'Donut-Diagramm',
2792
+ formTitle: 'Titel (erforderlich)',
2793
+ formTitleHelperText: 'Der im Widget angezeigte Titel',
2794
+ subtitle: 'Untertitel',
2795
+ subtitleHelperText: 'Der im Widget angezeigte Untertitel',
2796
+ label: 'Beschriftung',
2797
+ labelHelperText: 'Die im Widget angezeigte Beschriftung',
2798
+ },
2799
+ },
2800
+ requiredDataFeatures: [DATA_FEATURES.NUMBERS],
2801
+ };
1812
2802
 
1813
2803
  /*
1814
2804
  * Copyright 2015-2024 Ritense BV, the Netherlands.
@@ -1825,6 +2815,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1825
2815
  * See the License for the specific language governing permissions and
1826
2816
  * limitations under the License.
1827
2817
  */
2818
+ class DonutModule {
2819
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: DonutModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2820
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.3", ngImport: i0, type: DonutModule, declarations: [DonutDisplayComponent, DonutConfigurationComponent], imports: [CommonModule,
2821
+ ReactiveFormsModule,
2822
+ WidgetTranslatePipeModule,
2823
+ InputModule,
2824
+ CheckboxModule,
2825
+ CommonModule,
2826
+ ChartsModule,
2827
+ CarbonListModule,
2828
+ TranslateModule], exports: [DonutDisplayComponent] }); }
2829
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: DonutModule, providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: donutSpecification, multi: true }], imports: [CommonModule,
2830
+ ReactiveFormsModule,
2831
+ WidgetTranslatePipeModule,
2832
+ InputModule,
2833
+ CheckboxModule,
2834
+ CommonModule,
2835
+ ChartsModule,
2836
+ CarbonListModule,
2837
+ TranslateModule] }); }
2838
+ }
2839
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: DonutModule, decorators: [{
2840
+ type: NgModule,
2841
+ args: [{
2842
+ declarations: [DonutDisplayComponent, DonutConfigurationComponent],
2843
+ imports: [
2844
+ CommonModule,
2845
+ ReactiveFormsModule,
2846
+ WidgetTranslatePipeModule,
2847
+ InputModule,
2848
+ CheckboxModule,
2849
+ CommonModule,
2850
+ ChartsModule,
2851
+ CarbonListModule,
2852
+ TranslateModule,
2853
+ ],
2854
+ exports: [DonutDisplayComponent],
2855
+ providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: donutSpecification, multi: true }],
2856
+ }]
2857
+ }] });
1828
2858
 
1829
2859
  /*
1830
2860
  * Copyright 2015-2024 Ritense BV, the Netherlands.
@@ -1873,14 +2903,87 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1873
2903
  * See the License for the specific language governing permissions and
1874
2904
  * limitations under the License.
1875
2905
  */
1876
- var WidgetSeverity;
1877
- (function (WidgetSeverity) {
1878
- WidgetSeverity["BLACK"] = "valtimo-severity__black";
1879
- WidgetSeverity["GREEN"] = "valtimo-severity__green";
1880
- WidgetSeverity["YELLOW"] = "valtimo-severity__yellow";
1881
- WidgetSeverity["ORANGE"] = "valtimo-severity__orange";
1882
- WidgetSeverity["RED"] = "valtimo-severity__red";
1883
- })(WidgetSeverity || (WidgetSeverity = {}));
2906
+
2907
+ /*
2908
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
2909
+ *
2910
+ * Licensed under EUPL, Version 1.2 (the "License");
2911
+ * you may not use this file except in compliance with the License.
2912
+ * You may obtain a copy of the License at
2913
+ *
2914
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
2915
+ *
2916
+ * Unless required by applicable law or agreed to in writing, software
2917
+ * distributed under the License is distributed on an "AS IS" basis,
2918
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2919
+ * See the License for the specific language governing permissions and
2920
+ * limitations under the License.
2921
+ */
2922
+ class GaugeConfigurationComponent {
2923
+ set disabled(disabledValue) {
2924
+ if (disabledValue) {
2925
+ this.form.disable();
2926
+ }
2927
+ else {
2928
+ this.form.enable();
2929
+ }
2930
+ }
2931
+ get title() {
2932
+ return this.form.get('title');
2933
+ }
2934
+ get subtitle() {
2935
+ return this.form.get('subtitle');
2936
+ }
2937
+ get label() {
2938
+ return this.form.get('label');
2939
+ }
2940
+ set prefillConfiguration(configurationValue) {
2941
+ if (configurationValue) {
2942
+ this.title.setValue(configurationValue.title || '');
2943
+ this.subtitle.setValue(configurationValue.subtitle || '');
2944
+ this.label.setValue(configurationValue.label || '');
2945
+ }
2946
+ }
2947
+ constructor(fb) {
2948
+ this.fb = fb;
2949
+ this.form = this.fb.group({
2950
+ title: this.fb.control('', [Validators.required]),
2951
+ subtitle: this.fb.control(''),
2952
+ label: this.fb.control(''),
2953
+ useKPI: this.fb.control(false, [Validators.required]),
2954
+ });
2955
+ this.configurationEvent = new EventEmitter();
2956
+ this._subscriptions = new Subscription();
2957
+ }
2958
+ ngOnInit() {
2959
+ this.openFormSubscription();
2960
+ }
2961
+ ngOnDestroy() {
2962
+ this._subscriptions.unsubscribe();
2963
+ }
2964
+ openFormSubscription() {
2965
+ this._subscriptions.add(this.form.valueChanges.pipe(startWith(this.form.value)).subscribe(formValue => {
2966
+ this.configurationEvent.emit({
2967
+ valid: this.form.valid,
2968
+ data: formValue,
2969
+ });
2970
+ }));
2971
+ }
2972
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: GaugeConfigurationComponent, deps: [{ token: i1$3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
2973
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: GaugeConfigurationComponent, selector: "ng-component", inputs: { displayTypeKey: "displayTypeKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"title.dirty && title.invalid\"\n >\n {{ 'formTitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"title\" [invalid]=\"title.dirty && title.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"subtitle.dirty && subtitle.invalid\"\n >\n {{ 'subtitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"subtitle\" [invalid]=\"subtitle.dirty && subtitle.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"label.dirty && label.invalid\"\n >\n {{ 'label' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"label\" [invalid]=\"label.dirty && label.invalid\" />\n </cds-label>\n </div>\n\n</form>\n", dependencies: [{ kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i5.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2974
+ }
2975
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: GaugeConfigurationComponent, decorators: [{
2976
+ type: Component,
2977
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"title.dirty && title.invalid\"\n >\n {{ 'formTitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"title\" [invalid]=\"title.dirty && title.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"subtitle.dirty && subtitle.invalid\"\n >\n {{ 'subtitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"subtitle\" [invalid]=\"subtitle.dirty && subtitle.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'labelHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"label.dirty && label.invalid\"\n >\n {{ 'label' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"label\" [invalid]=\"label.dirty && label.invalid\" />\n </cds-label>\n </div>\n\n</form>\n" }]
2978
+ }], ctorParameters: () => [{ type: i1$3.FormBuilder }], propDecorators: { displayTypeKey: [{
2979
+ type: Input
2980
+ }], disabled: [{
2981
+ type: Input
2982
+ }], prefillConfiguration: [{
2983
+ type: Input
2984
+ }], configurationEvent: [{
2985
+ type: Output
2986
+ }] } });
1884
2987
 
1885
2988
  /*
1886
2989
  * Copyright 2015-2024 Ritense BV, the Netherlands.
@@ -1913,36 +3016,63 @@ var WidgetSeverity;
1913
3016
  * See the License for the specific language governing permissions and
1914
3017
  * limitations under the License.
1915
3018
  */
1916
- class BigNumberDisplayComponent {
1917
- get severityClass() {
1918
- if (!this.displayTypeProperties.useKPI) {
1919
- return WidgetSeverity.BLACK;
1920
- }
1921
- const value = this.data?.value;
1922
- if (value < this.displayTypeProperties.lowSeverityThreshold) {
1923
- return WidgetSeverity.GREEN;
1924
- }
1925
- else if (value < this.displayTypeProperties.mediumSeverityThreshold) {
1926
- return WidgetSeverity.YELLOW;
1927
- }
1928
- else if (value < this.displayTypeProperties.highSeverityThreshold) {
1929
- return WidgetSeverity.ORANGE;
1930
- }
1931
- return WidgetSeverity.RED;
3019
+ class GaugeDisplayComponent {
3020
+ set data(value) {
3021
+ if (!value)
3022
+ return;
3023
+ this._data$.next(value);
1932
3024
  }
1933
- get numberFontSize() {
1934
- if (!this.data) {
1935
- return 122;
3025
+ constructor(themeService, translateService) {
3026
+ this.themeService = themeService;
3027
+ this.translateService = translateService;
3028
+ this._DELTA = -1.0;
3029
+ this._data$ = new BehaviorSubject(null);
3030
+ this.chartData$ = this._data$.pipe(filter(data => !!data), map(data => [
3031
+ {
3032
+ group: 'value',
3033
+ value: this.calculatePercentage(data?.value || 0, data?.total || 0),
3034
+ },
3035
+ {
3036
+ group: 'delta',
3037
+ value: this._DELTA,
3038
+ },
3039
+ ]));
3040
+ this.gaugeChartOptions$ = combineLatest([
3041
+ this.themeService.currentTheme$,
3042
+ this.translateService.stream('key'),
3043
+ ]).pipe(map(([currentTheme]) => ({
3044
+ resizable: true,
3045
+ toolbar: { enabled: false },
3046
+ height: '110px',
3047
+ theme: currentTheme == 'g10' ? 'white' : 'g100',
3048
+ gauge: {
3049
+ alignment: 'center',
3050
+ numberFormatter: value => this.numberFormatter(this, value),
3051
+ deltaArrow: {
3052
+ enabled: false,
3053
+ },
3054
+ showPercentageSymbol: false,
3055
+ type: 'semi',
3056
+ },
3057
+ })));
3058
+ }
3059
+ calculatePercentage(value, total) {
3060
+ return (value * 100.0) / (total || 100.0);
3061
+ }
3062
+ numberFormatter(scope, value) {
3063
+ const scopeData = scope._data$.getValue();
3064
+ if (value == scope._DELTA) {
3065
+ return `${this.translateService.instant('dashboard.of')} ${scopeData?.total || 0} ${scope.displayTypeProperties.label} `;
1936
3066
  }
1937
- return Math.floor(122 / this.data.value.toString().length) + 20;
3067
+ return Math.round(value * (scopeData?.total || 0)) / 100.0 + '';
1938
3068
  }
1939
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1940
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: BigNumberDisplayComponent, selector: "valtimo-big-number-display", inputs: { displayTypeKey: "displayTypeKey", data: "data", displayTypeProperties: "displayTypeProperties" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<section class=\"valtimo-big-number-widget__header\">\n <h3 class=\"valtimo-big-number-widget__title\">{{ displayTypeProperties.title }}</h3>\n\n <span *ngIf=\"displayTypeProperties.subtitle\" class=\"valtimo-big-number-widget__subtitle\">\n {{ displayTypeProperties.subtitle }}\n </span>\n</section>\n\n<section class=\"valtimo-big-number-widget__content\">\n <span\n [class]=\"['valtimo-big-number-widget__number', severityClass]\"\n [style.fontSize.px]=\"numberFontSize\"\n >{{ data?.value }}</span\n >\n\n <span *ngIf=\"displayTypeProperties.label\" class=\"valtimo-big-number-widget__label\">\n {{ displayTypeProperties.label }}\n </span>\n</section>\n", styles: [":host{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;padding:20px}.valtimo-big-number-widget__title{font-size:20px;margin-bottom:12px}.valtimo-big-number-widget__subtitle{font-size:14px}.valtimo-big-number-widget__number{font-weight:lighter;font-size:122px;line-height:.75em}.valtimo-big-number-widget__label{font-size:12px;margin-left:12px;margin-bottom:-1px}.valtimo-big-number-widget__content{display:flex;align-items:flex-end}.valtimo-severity__black{color:#000}.valtimo-severity__green{color:#42be65}.valtimo-severity__yellow{color:#f1c21b}.valtimo-severity__orange{color:#ff832b}.valtimo-severity__red{color:#da1e28}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3069
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: GaugeDisplayComponent, deps: [{ token: i1$1.CdsThemeService }, { token: i3$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
3070
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: GaugeDisplayComponent, selector: "valtimo-gauge-display", inputs: { displayTypeKey: "displayTypeKey", data: "data", displayTypeProperties: "displayTypeProperties" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<section class=\"valtimo-gauge-widget__header\">\n <h3 class=\"valtimo-gauge-widget__title\">{{ displayTypeProperties.title }}</h3>\n\n <span *ngIf=\"displayTypeProperties.subtitle\" class=\"valtimo-gauge-widget__subtitle\">\n {{ displayTypeProperties.subtitle }}\n </span>\n</section>\n\n<section class=\"valtimo-gauge-widget__content\">\n <ibm-gauge-chart\n *ngIf=\"chartData$ | async as chartData\"\n type=\"gauge\"\n class=\"n-chart\"\n [data]=\"chartData\"\n [options]=\"gaugeChartOptions$ | async\"\n ></ibm-gauge-chart>\n</section>\n", styles: [":host{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;padding:20px}.valtimo-gauge-widget__title,.valtimo-gauge-widget__subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.valtimo-gauge-widget__title{font-size:20px;margin-bottom:12px}.valtimo-gauge-widget__subtitle{font-size:14px}.valtimo-gauge-widget__label{font-size:12px;margin-left:12px;margin-bottom:-1px}.valtimo-gauge-widget__content{display:flex;align-items:flex-end;margin-bottom:12px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$2.GaugeChartComponent, selector: "ibm-gauge-chart" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1941
3071
  }
1942
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberDisplayComponent, decorators: [{
3072
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: GaugeDisplayComponent, decorators: [{
1943
3073
  type: Component,
1944
- args: [{ selector: 'valtimo-big-number-display', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<section class=\"valtimo-big-number-widget__header\">\n <h3 class=\"valtimo-big-number-widget__title\">{{ displayTypeProperties.title }}</h3>\n\n <span *ngIf=\"displayTypeProperties.subtitle\" class=\"valtimo-big-number-widget__subtitle\">\n {{ displayTypeProperties.subtitle }}\n </span>\n</section>\n\n<section class=\"valtimo-big-number-widget__content\">\n <span\n [class]=\"['valtimo-big-number-widget__number', severityClass]\"\n [style.fontSize.px]=\"numberFontSize\"\n >{{ data?.value }}</span\n >\n\n <span *ngIf=\"displayTypeProperties.label\" class=\"valtimo-big-number-widget__label\">\n {{ displayTypeProperties.label }}\n </span>\n</section>\n", styles: [":host{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;padding:20px}.valtimo-big-number-widget__title{font-size:20px;margin-bottom:12px}.valtimo-big-number-widget__subtitle{font-size:14px}.valtimo-big-number-widget__number{font-weight:lighter;font-size:122px;line-height:.75em}.valtimo-big-number-widget__label{font-size:12px;margin-left:12px;margin-bottom:-1px}.valtimo-big-number-widget__content{display:flex;align-items:flex-end}.valtimo-severity__black{color:#000}.valtimo-severity__green{color:#42be65}.valtimo-severity__yellow{color:#f1c21b}.valtimo-severity__orange{color:#ff832b}.valtimo-severity__red{color:#da1e28}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1945
- }], propDecorators: { displayTypeKey: [{
3074
+ args: [{ selector: 'valtimo-gauge-display', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<section class=\"valtimo-gauge-widget__header\">\n <h3 class=\"valtimo-gauge-widget__title\">{{ displayTypeProperties.title }}</h3>\n\n <span *ngIf=\"displayTypeProperties.subtitle\" class=\"valtimo-gauge-widget__subtitle\">\n {{ displayTypeProperties.subtitle }}\n </span>\n</section>\n\n<section class=\"valtimo-gauge-widget__content\">\n <ibm-gauge-chart\n *ngIf=\"chartData$ | async as chartData\"\n type=\"gauge\"\n class=\"n-chart\"\n [data]=\"chartData\"\n [options]=\"gaugeChartOptions$ | async\"\n ></ibm-gauge-chart>\n</section>\n", styles: [":host{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;padding:20px}.valtimo-gauge-widget__title,.valtimo-gauge-widget__subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.valtimo-gauge-widget__title{font-size:20px;margin-bottom:12px}.valtimo-gauge-widget__subtitle{font-size:14px}.valtimo-gauge-widget__label{font-size:12px;margin-left:12px;margin-bottom:-1px}.valtimo-gauge-widget__content{display:flex;align-items:flex-end;margin-bottom:12px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
3075
+ }], ctorParameters: () => [{ type: i1$1.CdsThemeService }, { type: i3$1.TranslateService }], propDecorators: { displayTypeKey: [{
1946
3076
  type: Input
1947
3077
  }], data: [{
1948
3078
  type: Input
@@ -1997,54 +3127,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
1997
3127
  * See the License for the specific language governing permissions and
1998
3128
  * limitations under the License.
1999
3129
  */
2000
- const bigNumberSpecification = {
2001
- displayTypeKey: 'number',
2002
- displayComponent: BigNumberDisplayComponent,
2003
- configurationComponent: BigNumberConfigurationComponent,
3130
+ const gaugeSpecification = {
3131
+ displayTypeKey: 'gauge',
3132
+ displayComponent: GaugeDisplayComponent,
3133
+ configurationComponent: GaugeConfigurationComponent,
2004
3134
  width: 1,
2005
3135
  height: 1,
2006
3136
  translations: {
2007
3137
  nl: {
2008
- title: 'Groot getal',
3138
+ title: 'Graadmeter',
2009
3139
  formTitle: 'Titel (vereist)',
2010
3140
  formTitleHelperText: 'De titel die wordt weergegeven in de widget',
2011
3141
  subtitle: 'Ondertitel',
2012
3142
  subtitleHelperText: 'De ondertitel weergegeven in de widget',
2013
3143
  label: 'Label',
2014
3144
  labelHelperText: 'Het label dat wordt weergegeven in de widget',
2015
- useKPI: 'KPI gebruiken',
2016
- lowSeverityThreshold: 'Lage ernstdrempel (vereist)',
2017
- mediumSeverityThreshold: 'Middelmatige ernstdrempel (vereist)',
2018
- highSeverityThreshold: 'Hoge ernstdrempel (vereist)',
2019
3145
  },
2020
3146
  en: {
2021
- title: 'Big number',
3147
+ title: 'Gauge',
2022
3148
  formTitle: 'Title (required)',
2023
3149
  formTitleHelperText: 'The title displayed in the widget',
2024
3150
  subtitle: 'Subtitle',
2025
3151
  subtitleHelperText: 'The subtitle displayed in the widget',
2026
3152
  label: 'Label',
2027
3153
  labelHelperText: 'The label displayed in the widget',
2028
- useKPI: 'Use KPI',
2029
- lowSeverityThreshold: 'Low severity threshold (required)',
2030
- mediumSeverityThreshold: 'Medium severity threshold (required)',
2031
- highSeverityThreshold: 'High severity threshold (required)',
2032
3154
  },
2033
3155
  de: {
2034
- title: 'Große Nummer',
3156
+ title: 'Messgerät',
2035
3157
  formTitle: 'Titel (erforderlich)',
2036
3158
  formTitleHelperText: 'Der im Widget angezeigte Titel',
2037
3159
  subtitle: 'Untertitel',
2038
3160
  subtitleHelperText: 'Der im Widget angezeigte Untertitel',
2039
3161
  label: 'Beschriftung',
2040
3162
  labelHelperText: 'Die im Widget angezeigte Beschriftung',
2041
- useKPI: 'Verwenden Sie KPI',
2042
- lowSeverityThreshold: 'Niedriger Schweregradschwellenwert (erforderlich)',
2043
- mediumSeverityThreshold: 'Mittlerer Schweregradschwellenwert (erforderlich)',
2044
- highSeverityThreshold: 'Hoher Schweregradschwellenwert (erforderlich)',
2045
3163
  },
2046
3164
  },
2047
- requiredDataFeatures: [DATA_FEATURES.NUMBER],
3165
+ requiredDataFeatures: [DATA_FEATURES.NUMBER, DATA_FEATURES.TOTAL],
2048
3166
  };
2049
3167
 
2050
3168
  /*
@@ -2062,32 +3180,38 @@ const bigNumberSpecification = {
2062
3180
  * See the License for the specific language governing permissions and
2063
3181
  * limitations under the License.
2064
3182
  */
2065
- class BigNumberModule {
2066
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2067
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.3", ngImport: i0, type: BigNumberModule, declarations: [BigNumberDisplayComponent, BigNumberConfigurationComponent], imports: [CommonModule,
3183
+ class GaugeModule {
3184
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: GaugeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3185
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.3", ngImport: i0, type: GaugeModule, declarations: [GaugeDisplayComponent, GaugeConfigurationComponent], imports: [CommonModule,
2068
3186
  ReactiveFormsModule,
2069
3187
  WidgetTranslatePipeModule,
2070
3188
  InputModule,
2071
- CheckboxModule], exports: [BigNumberDisplayComponent] }); }
2072
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberModule, providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: bigNumberSpecification, multi: true }], imports: [CommonModule,
3189
+ CheckboxModule,
3190
+ CommonModule,
3191
+ ChartsModule], exports: [GaugeDisplayComponent] }); }
3192
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: GaugeModule, providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: gaugeSpecification, multi: true }], imports: [CommonModule,
2073
3193
  ReactiveFormsModule,
2074
3194
  WidgetTranslatePipeModule,
2075
3195
  InputModule,
2076
- CheckboxModule] }); }
3196
+ CheckboxModule,
3197
+ CommonModule,
3198
+ ChartsModule] }); }
2077
3199
  }
2078
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BigNumberModule, decorators: [{
3200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: GaugeModule, decorators: [{
2079
3201
  type: NgModule,
2080
3202
  args: [{
2081
- declarations: [BigNumberDisplayComponent, BigNumberConfigurationComponent],
3203
+ declarations: [GaugeDisplayComponent, GaugeConfigurationComponent],
2082
3204
  imports: [
2083
3205
  CommonModule,
2084
3206
  ReactiveFormsModule,
2085
3207
  WidgetTranslatePipeModule,
2086
3208
  InputModule,
2087
3209
  CheckboxModule,
3210
+ CommonModule,
3211
+ ChartsModule,
2088
3212
  ],
2089
- exports: [BigNumberDisplayComponent],
2090
- providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: bigNumberSpecification, multi: true }],
3213
+ exports: [GaugeDisplayComponent],
3214
+ providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: gaugeSpecification, multi: true }],
2091
3215
  }]
2092
3216
  }] });
2093
3217
 
@@ -2139,6 +3263,97 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
2139
3263
  * limitations under the License.
2140
3264
  */
2141
3265
 
3266
+ /*
3267
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
3268
+ *
3269
+ * Licensed under EUPL, Version 1.2 (the "License");
3270
+ * you may not use this file except in compliance with the License.
3271
+ * You may obtain a copy of the License at
3272
+ *
3273
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
3274
+ *
3275
+ * Unless required by applicable law or agreed to in writing, software
3276
+ * distributed under the License is distributed on an "AS IS" basis,
3277
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3278
+ * See the License for the specific language governing permissions and
3279
+ * limitations under the License.
3280
+ */
3281
+ class MeterConfigurationComponent {
3282
+ set disabled(disabledValue) {
3283
+ if (disabledValue) {
3284
+ this.form.disable();
3285
+ }
3286
+ else {
3287
+ this.form.enable();
3288
+ }
3289
+ }
3290
+ get title() {
3291
+ return this.form.get('title');
3292
+ }
3293
+ get subtitle() {
3294
+ return this.form.get('subtitle');
3295
+ }
3296
+ set prefillConfiguration(configurationValue) {
3297
+ if (configurationValue) {
3298
+ this.title.setValue(configurationValue.title || '');
3299
+ this.subtitle.setValue(configurationValue.subtitle || '');
3300
+ }
3301
+ }
3302
+ constructor(fb) {
3303
+ this.fb = fb;
3304
+ this.form = this.fb.group({
3305
+ title: this.fb.control('', [Validators.required]),
3306
+ subtitle: this.fb.control(''),
3307
+ });
3308
+ this.configurationEvent = new EventEmitter();
3309
+ this._subscriptions = new Subscription();
3310
+ }
3311
+ ngOnInit() {
3312
+ this.openFormSubscription();
3313
+ }
3314
+ ngOnDestroy() {
3315
+ this._subscriptions.unsubscribe();
3316
+ }
3317
+ openFormSubscription() {
3318
+ this._subscriptions.add(this.form.valueChanges.pipe(startWith(this.form.value)).subscribe(formValue => {
3319
+ this.configurationEvent.emit({
3320
+ valid: this.form.valid,
3321
+ data: formValue,
3322
+ });
3323
+ }));
3324
+ }
3325
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: MeterConfigurationComponent, deps: [{ token: i1$3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
3326
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: MeterConfigurationComponent, selector: "ng-component", inputs: { displayTypeKey: "displayTypeKey", disabled: "disabled", prefillConfiguration: "prefillConfiguration" }, outputs: { configurationEvent: "configurationEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"title.dirty && title.invalid\"\n >\n {{ 'formTitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"title\" [invalid]=\"title.dirty && title.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"subtitle.dirty && subtitle.invalid\"\n >\n {{ 'subtitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"subtitle\" [invalid]=\"subtitle.dirty && subtitle.invalid\" />\n </cds-label>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i5.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: WidgetTranslatePipe, name: "widgetTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3327
+ }
3328
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: MeterConfigurationComponent, decorators: [{
3329
+ type: Component,
3330
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<form [formGroup]=\"form\">\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'formTitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"title.dirty && title.invalid\"\n >\n {{ 'formTitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"title\" [invalid]=\"title.dirty && title.invalid\" />\n </cds-label>\n </div>\n\n <div class=\"form__element\">\n <cds-label\n [helperText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalidText]=\"'subtitleHelperText' | widgetTranslate: displayTypeKey | async\"\n [invalid]=\"subtitle.dirty && subtitle.invalid\"\n >\n {{ 'subtitle' | widgetTranslate: displayTypeKey | async }}\n\n <input cdsText formControlName=\"subtitle\" [invalid]=\"subtitle.dirty && subtitle.invalid\" />\n </cds-label>\n </div>\n</form>\n" }]
3331
+ }], ctorParameters: () => [{ type: i1$3.FormBuilder }], propDecorators: { displayTypeKey: [{
3332
+ type: Input
3333
+ }], disabled: [{
3334
+ type: Input
3335
+ }], prefillConfiguration: [{
3336
+ type: Input
3337
+ }], configurationEvent: [{
3338
+ type: Output
3339
+ }] } });
3340
+
3341
+ /*
3342
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
3343
+ *
3344
+ * Licensed under EUPL, Version 1.2 (the "License");
3345
+ * you may not use this file except in compliance with the License.
3346
+ * You may obtain a copy of the License at
3347
+ *
3348
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
3349
+ *
3350
+ * Unless required by applicable law or agreed to in writing, software
3351
+ * distributed under the License is distributed on an "AS IS" basis,
3352
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3353
+ * See the License for the specific language governing permissions and
3354
+ * limitations under the License.
3355
+ */
3356
+
2142
3357
  /*
2143
3358
  * Copyright 2015-2024 Ritense BV, the Netherlands.
2144
3359
  *
@@ -2155,13 +3370,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
2155
3370
  * limitations under the License.
2156
3371
  */
2157
3372
  class MeterDisplayComponent {
2158
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: MeterDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2159
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: MeterDisplayComponent, selector: "valtimo-meter-display", inputs: { displayTypeKey: "displayTypeKey", data: "data", displayTypeProperties: "displayTypeProperties" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\nmeter works\n", styles: [":host{display:flex;padding:20px;width:100%;height:100%}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3373
+ set data(value) {
3374
+ if (!value)
3375
+ return;
3376
+ this._data$.next(value);
3377
+ }
3378
+ constructor(themeService) {
3379
+ this.themeService = themeService;
3380
+ this._data$ = new BehaviorSubject(null);
3381
+ this.meterData$ = this._data$.pipe(filter(data => !!data), map(data => data?.values.map(dataValue => ({
3382
+ group: dataValue.label,
3383
+ value: dataValue.value,
3384
+ })) || []));
3385
+ this.meterChartOptions$ = combineLatest([
3386
+ this.themeService.currentTheme$,
3387
+ this.meterData$,
3388
+ ]).pipe(map(([currentTheme, meterData]) => ({
3389
+ resizable: true,
3390
+ toolbar: { enabled: false },
3391
+ theme: currentTheme,
3392
+ height: '60px',
3393
+ meter: {
3394
+ height: 60,
3395
+ showLabels: false,
3396
+ title: {
3397
+ percentageIndicator: {
3398
+ enabled: false,
3399
+ },
3400
+ },
3401
+ proportional: {
3402
+ total: meterData.reduce((acc, curr) => acc + curr.value, 0),
3403
+ },
3404
+ },
3405
+ })));
3406
+ }
3407
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: MeterDisplayComponent, deps: [{ token: i1$1.CdsThemeService }], target: i0.ɵɵFactoryTarget.Component }); }
3408
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: MeterDisplayComponent, selector: "valtimo-meter-display", inputs: { displayTypeKey: "displayTypeKey", data: "data", displayTypeProperties: "displayTypeProperties" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<section class=\"valtimo-donut-widget__header\">\n <h3 class=\"valtimo-donut-widget__title\">{{ displayTypeProperties.title }}</h3>\n\n <span *ngIf=\"displayTypeProperties.subtitle\" class=\"valtimo-donut-widget__subtitle\">\n {{ displayTypeProperties.subtitle }}\n </span>\n</section>\n\n<section class=\"valtimo-donut-widget__content\">\n <ng-container *ngIf=\"meterData$ | async as meterData\">\n @if (meterData.length > 0) {\n <ibm-meter-chart [data]=\"meterData\" [options]=\"meterChartOptions$ | async\"></ibm-meter-chart>\n } @else {\n <valtimo-no-results\n [collapseVertically]=\"true\"\n [description]=\"'dossier.widgets.noData' | translate\"\n [smallPadding]=\"true\"\n ></valtimo-no-results>\n }\n </ng-container>\n</section>\n", styles: [":host{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;padding:20px}.valtimo-donut-widget__title,.valtimo-donut-widget__subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.valtimo-donut-widget__title{font-size:20px;margin-bottom:12px}.valtimo-donut-widget__subtitle{font-size:14px}.valtimo-donut-widget__label{font-size:12px;margin-left:12px;margin-bottom:-1px}.valtimo-donut-widget__content{display:flex;align-items:flex-end;justify-content:center;margin-bottom:12px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$2.MeterChartComponent, selector: "ibm-meter-chart" }, { kind: "component", type: i1$1.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2160
3409
  }
2161
3410
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: MeterDisplayComponent, decorators: [{
2162
3411
  type: Component,
2163
- args: [{ selector: 'valtimo-meter-display', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\nmeter works\n", styles: [":host{display:flex;padding:20px;width:100%;height:100%}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2164
- }], propDecorators: { displayTypeKey: [{
3412
+ args: [{ selector: 'valtimo-meter-display', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<section class=\"valtimo-donut-widget__header\">\n <h3 class=\"valtimo-donut-widget__title\">{{ displayTypeProperties.title }}</h3>\n\n <span *ngIf=\"displayTypeProperties.subtitle\" class=\"valtimo-donut-widget__subtitle\">\n {{ displayTypeProperties.subtitle }}\n </span>\n</section>\n\n<section class=\"valtimo-donut-widget__content\">\n <ng-container *ngIf=\"meterData$ | async as meterData\">\n @if (meterData.length > 0) {\n <ibm-meter-chart [data]=\"meterData\" [options]=\"meterChartOptions$ | async\"></ibm-meter-chart>\n } @else {\n <valtimo-no-results\n [collapseVertically]=\"true\"\n [description]=\"'dossier.widgets.noData' | translate\"\n [smallPadding]=\"true\"\n ></valtimo-no-results>\n }\n </ng-container>\n</section>\n", styles: [":host{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;padding:20px}.valtimo-donut-widget__title,.valtimo-donut-widget__subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.valtimo-donut-widget__title{font-size:20px;margin-bottom:12px}.valtimo-donut-widget__subtitle{font-size:14px}.valtimo-donut-widget__label{font-size:12px;margin-left:12px;margin-bottom:-1px}.valtimo-donut-widget__content{display:flex;align-items:flex-end;justify-content:center;margin-bottom:12px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
3413
+ }], ctorParameters: () => [{ type: i1$1.CdsThemeService }], propDecorators: { displayTypeKey: [{
2165
3414
  type: Input
2166
3415
  }], data: [{
2167
3416
  type: Input
@@ -2219,20 +3468,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
2219
3468
  const meterSpecification = {
2220
3469
  displayTypeKey: 'meter',
2221
3470
  displayComponent: MeterDisplayComponent,
3471
+ configurationComponent: MeterConfigurationComponent,
2222
3472
  width: 2,
2223
3473
  height: 1,
2224
3474
  translations: {
2225
3475
  nl: {
2226
3476
  title: 'Meter',
3477
+ formTitle: 'Titel (vereist)',
3478
+ formTitleHelperText: 'De titel die wordt weergegeven in de widget',
3479
+ subtitle: 'Ondertitel',
3480
+ subtitleHelperText: 'De ondertitel weergegeven in de widget',
3481
+ label: 'Label',
3482
+ labelHelperText: 'Het label dat wordt weergegeven in de widget',
2227
3483
  },
2228
3484
  en: {
2229
3485
  title: 'Meter',
3486
+ formTitle: 'Title (required)',
3487
+ formTitleHelperText: 'The title displayed in the widget',
3488
+ subtitle: 'Subtitle',
3489
+ subtitleHelperText: 'The subtitle displayed in the widget',
3490
+ label: 'Label',
3491
+ labelHelperText: 'The label displayed in the widget',
2230
3492
  },
2231
3493
  de: {
2232
3494
  title: 'Meter',
3495
+ formTitle: 'Titel (erforderlich)',
3496
+ formTitleHelperText: 'Der im Widget angezeigte Titel',
3497
+ subtitle: 'Untertitel',
3498
+ subtitleHelperText: 'Der im Widget angezeigte Untertitel',
3499
+ label: 'Beschriftung',
3500
+ labelHelperText: 'Die im Widget angezeigte Beschriftung',
2233
3501
  },
2234
3502
  },
2235
- requiredDataFeatures: [],
3503
+ requiredDataFeatures: [DATA_FEATURES.NUMBERS],
2236
3504
  };
2237
3505
 
2238
3506
  /*
@@ -2252,14 +3520,40 @@ const meterSpecification = {
2252
3520
  */
2253
3521
  class MeterModule {
2254
3522
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: MeterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2255
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.3", ngImport: i0, type: MeterModule, declarations: [MeterDisplayComponent], imports: [CommonModule], exports: [MeterDisplayComponent] }); }
2256
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: MeterModule, providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: meterSpecification, multi: true }], imports: [CommonModule] }); }
3523
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.3", ngImport: i0, type: MeterModule, declarations: [MeterDisplayComponent, MeterConfigurationComponent], imports: [CommonModule,
3524
+ ReactiveFormsModule,
3525
+ WidgetTranslatePipeModule,
3526
+ InputModule,
3527
+ CheckboxModule,
3528
+ CommonModule,
3529
+ ChartsModule,
3530
+ CarbonListModule,
3531
+ TranslateModule], exports: [MeterDisplayComponent] }); }
3532
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: MeterModule, providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: meterSpecification, multi: true }], imports: [CommonModule,
3533
+ ReactiveFormsModule,
3534
+ WidgetTranslatePipeModule,
3535
+ InputModule,
3536
+ CheckboxModule,
3537
+ CommonModule,
3538
+ ChartsModule,
3539
+ CarbonListModule,
3540
+ TranslateModule] }); }
2257
3541
  }
2258
3542
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: MeterModule, decorators: [{
2259
3543
  type: NgModule,
2260
3544
  args: [{
2261
- declarations: [MeterDisplayComponent],
2262
- imports: [CommonModule],
3545
+ declarations: [MeterDisplayComponent, MeterConfigurationComponent],
3546
+ imports: [
3547
+ CommonModule,
3548
+ ReactiveFormsModule,
3549
+ WidgetTranslatePipeModule,
3550
+ InputModule,
3551
+ CheckboxModule,
3552
+ CommonModule,
3553
+ ChartsModule,
3554
+ CarbonListModule,
3555
+ TranslateModule,
3556
+ ],
2263
3557
  exports: [MeterDisplayComponent],
2264
3558
  providers: [{ provide: DISPLAY_TYPE_TOKEN, useValue: meterSpecification, multi: true }],
2265
3559
  }]
@@ -2352,5 +3646,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
2352
3646
  * Generated bundle index. Do not edit.
2353
3647
  */
2354
3648
 
2355
- export { BarChartDisplayComponent, BarChartModule, BigNumberConfigurationComponent, BigNumberDisplayComponent, BigNumberModule, CaseCountConfigurationComponent, CaseCountDataSourceModule, DATA_FEATURES, DATA_SOURCE_TOKEN, DISPLAY_TYPE_TOKEN, DashboardComponent, DashboardModule, DashboardService, HttpLoaderFactory, MeterDisplayComponent, MeterModule, Operator, TestConfigurationComponent, TestDataSourceModule, WIDGET_1X_HEIGHT, WIDGET_1X_MIN_WIDTH, WidgetDashboardComponent, WidgetDashboardContentComponent, WidgetService, WidgetSeverity, WidgetTranslatePipe, WidgetTranslatePipeModule, WidgetTranslationService, barChartSpecification, bigNumberSpecification, caseCountDataSourceSpecification, meterSpecification, testDataSourceSpecification };
3649
+ export { BigNumberConfigurationComponent, BigNumberDisplayComponent, BigNumberModule, CaseCountConfigurationComponent, CaseCountDataSourceModule, CaseCountsConfigurationComponent, CaseCountsDataSourceModule, CaseGroupByConfigurationComponent, CaseGroupByDataSourceModule, DATA_FEATURES, DATA_SOURCE_TOKEN, DISPLAY_TYPE_TOKEN, DashboardComponent, DashboardModule, DashboardService, DonutConfigurationComponent, DonutDisplayComponent, DonutModule, GaugeConfigurationComponent, GaugeDisplayComponent, GaugeModule, HttpLoaderFactory, MeterConfigurationComponent, MeterDisplayComponent, MeterModule, Operator, WIDGET_1X_HEIGHT, WIDGET_1X_MIN_WIDTH, WidgetDashboardComponent, WidgetDashboardContentComponent, WidgetService, WidgetSeverity, WidgetTranslatePipe, WidgetTranslatePipeModule, WidgetTranslationService, bigNumberSpecification, caseCountDataSourceSpecification, caseCountsDataSourceSpecification, caseGroupByDataSourceSpecification, donutSpecification, gaugeSpecification, meterSpecification };
2356
3650
  //# sourceMappingURL=valtimo-dashboard.mjs.map