@ministryofjustice/hmpps-digital-prison-reporting-frontend 5.2.2 → 5.2.3

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 (50) hide show
  1. package/_networkMocks/dashboard/data/complete-data/data.d.ts +6 -6
  2. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/bar/vis-definitions/cols-as-labels.d.ts +4 -4
  3. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/doughnut/vis-definitions/definitions.d.ts +12 -12
  4. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/line-timeseries/vis-definitions/defintitions.d.ts +6 -6
  5. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/vis-definitions/historic.d.ts +3 -3
  6. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/vis-definitions/rows-as-list.d.ts +3 -3
  7. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/matrix/vis-definitions/definitions.d.ts +1 -1
  8. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/scorecard/vis-definitions/definitions-buckets.d.ts +6 -6
  9. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/scorecard/vis-definitions/definitions.d.ts +7 -7
  10. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/scorecardGroup/vis-definitions/definitions.d.ts +6 -6
  11. package/_networkMocks/dashboard/definitions/visualisations/partial-dataset/line-timeseries/vis-definitions/definitions.d.ts +5 -5
  12. package/_networkMocks/dashboard/definitions/visualisations/partial-dataset/list/vis-definitions/historic.d.ts +4 -4
  13. package/_networkMocks/dashboard/definitions/visualisations/partial-dataset/matrix/vis-definitions/definitions.d.ts +1 -1
  14. package/cjs/dpr/components/_charts/chart/bar/BarChart.js +24 -14
  15. package/cjs/dpr/components/_charts/chart/bar/BarChart.js.map +1 -1
  16. package/cjs/dpr/services/featureFlagService.js +2 -0
  17. package/cjs/dpr/services/featureFlagService.js.map +1 -1
  18. package/cjs/dpr/utils/datasetHelper.js +13 -0
  19. package/cjs/dpr/utils/datasetHelper.js.map +1 -1
  20. package/dpr/components/_charts/chart/bar/BarChart.js +24 -14
  21. package/dpr/components/_charts/chart/bar/BarChart.js.map +1 -1
  22. package/dpr/components/_charts/chart-card/view.njk +1 -0
  23. package/dpr/routes/journeys/download-report/request-download/form/form.njk +1 -1
  24. package/dpr/services/featureFlagService.js +2 -0
  25. package/dpr/services/featureFlagService.js.map +1 -1
  26. package/dpr/utils/datasetHelper.js +13 -1
  27. package/dpr/utils/datasetHelper.js.map +1 -1
  28. package/package.json +1 -1
  29. package/src/dpr/components/_charts/chart/bar/BarChart.d.ts +1 -0
  30. package/src/dpr/utils/datasetHelper.d.ts +2 -0
  31. package/test-app/mocks/mockClients/dashboards/data/age-breakdown/data.d.ts +8 -8
  32. package/test-app/mocks/mockClients/dashboards/data/data-quality-metrics/data.d.ts +6 -6
  33. package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/chart-definitions.d.ts +2 -2
  34. package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/index.d.ts +10 -10
  35. package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/list-definitions-1.d.ts +4 -4
  36. package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/list-definitions.d.ts +7 -7
  37. package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/scorecard-definitions.d.ts +1 -1
  38. package/test-app/mocks/mockClients/dashboards/definitions/data-quality/chart-data.d.ts +2 -2
  39. package/test-app/mocks/mockClients/dashboards/definitions/data-quality/visualisations/chart-definitions.d.ts +8 -8
  40. package/test-app/mocks/mockClients/dashboards/definitions/data-quality/visualisations/index.d.ts +15 -15
  41. package/test-app/mocks/mockClients/dashboards/definitions/data-quality/visualisations/scorecard-definitions.d.ts +7 -7
  42. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/bar.d.ts +3 -3
  43. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/charts.d.ts +19 -19
  44. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/doughnut.d.ts +4 -4
  45. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/line.d.ts +2 -2
  46. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/lists.d.ts +11 -11
  47. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/scorecard.d.ts +13 -13
  48. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/scorecards.d.ts +6 -6
  49. package/src/dpr/components/card-group/utils.d.ts +0 -24
  50. package/src/dpr/components/card-group/utils.test.d.ts +0 -1
@@ -12,22 +12,22 @@ export declare const completeDataSet: {
12
12
  establishment_id: {
13
13
  raw: string;
14
14
  };
15
- has_ethnicity: {
15
+ has_metric_one: {
16
16
  raw: number;
17
17
  };
18
- ethnicity_is_missing: {
18
+ metric_one_is_missing: {
19
19
  raw: number;
20
20
  };
21
- has_nationality: {
21
+ has_metric_two: {
22
22
  raw: number;
23
23
  };
24
- nationality_is_missing: {
24
+ metric_two_is_missing: {
25
25
  raw: number;
26
26
  };
27
- has_religion: {
27
+ has_metric_three: {
28
28
  raw: number;
29
29
  };
30
- religion_is_missing: {
30
+ metric_three_is_missing: {
31
31
  raw: number;
32
32
  };
33
33
  }[][];
@@ -1,7 +1,7 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityEthnicityBar: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const dataQualityEthnicityBarHorizontal: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dataQualityReligionBar: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const dataQualityNationalityBar: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityMetricOneBar: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const dataQualityMetricOneBarHorizontal: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dataQualityMetricThreeBar: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const dataQualityMetricTwoBar: components['schemas']['DashboardVisualisationDefinition'];
6
6
  export declare const dataQualityAllBar: components['schemas']['DashboardVisualisationDefinition'];
7
7
  export declare const dataQualityAllBarHorizontal: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,13 +1,13 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityEthnicityDoughnut: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const dataQualityReligionDoughnut: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dataQualityNationalityDoughnut: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const dataQualityNationalityReligionDoughnut: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const dataQualityEthnicityDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const dataQualityReligionDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
8
- export declare const dataQualityNationalityDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
9
- export declare const dataQualityNationalityReligionDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
10
- export declare const dataQualityEthnicityDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
11
- export declare const dataQualityReligionDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
12
- export declare const dataQualityNationalityDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
13
- export declare const dataQualityNationalityReligionDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityMetricOneDoughnut: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const dataQualityMetricThreeDoughnut: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dataQualityMetricTwoDoughnut: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const dataQualityMetricTwoMetricThreeDoughnut: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const dataQualityMetricOneDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const dataQualityMetricThreeDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
8
+ export declare const dataQualityMetricTwoDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
9
+ export declare const dataQualityMetricTwoMetricThreeDoughnutTwoEst: components['schemas']['DashboardVisualisationDefinition'];
10
+ export declare const dataQualityMetricOneDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
11
+ export declare const dataQualityMetricThreeDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
12
+ export declare const dataQualityMetricTwoDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
13
+ export declare const dataQualityMetricTwoMetricThreeDoughnutAllEst: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,7 +1,7 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const mockEthnicityLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const mockNationalityLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const mockReligionLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const mockEthnicityLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const mockNationalityLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const mockReligionLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const mockMetricOneLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const mockMetricTwoLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const mockMetricThreeLineChartTimeseries: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const mockMetricOneLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const mockMetricTwoLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const mockMetricThreeLineChartTimeseriesAllEst: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,4 +1,4 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityEthnicityHistoric: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const dataQualityReligionHistoric: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dataQualityNationalityHistoric: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityMetricOneHistoric: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const dataQualityMetricThreeHistoric: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dataQualityMetricTwoHistoric: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,4 +1,4 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityEthnicity: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const dataQualityReligion: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dataQualityNationality: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityMetricOne: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const dataQualityMetricThree: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dataQualityMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,2 +1,2 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityHasNationalityOvertime: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityHasMetricTwoOvertime: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,7 +1,7 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const simpleScorecardCustomBucketsNationality: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const simpleScorecardCustomBucketsEthnicity: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const simpleScorecardCustomBucketsReligion: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const simpleScorecardCustomBucketsBoundariesReligion: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const simpleScorecardCustomBucketsBoundariesNationality: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const simpleScorecardCustomBucketsBoundariesEthnicity: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const simpleScorecardCustomBucketsMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const simpleScorecardCustomBucketsMetricOne: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const simpleScorecardCustomBucketsMetricThree: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const simpleScorecardCustomBucketsBoundariesMetricThree: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const simpleScorecardCustomBucketsBoundariesMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const simpleScorecardCustomBucketsBoundariesMetricOne: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,8 +1,8 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const simpleScorecardNationality: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const simpleScorecardNationalityFilter: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const simpleScorecardReligion: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const simpleScorecardEthnicity: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const simpleScorecardRagColoursNationality: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const simpleScorecardRagColoursReligion: components['schemas']['DashboardVisualisationDefinition'];
8
- export declare const simpleScorecardRagColoursEthnicity: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const simpleScorecardMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const simpleScorecardMetricTwoFilter: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const simpleScorecardMetricThree: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const simpleScorecardMetricOne: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const simpleScorecardRagColoursMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const simpleScorecardRagColoursMetricThree: components['schemas']['DashboardVisualisationDefinition'];
8
+ export declare const simpleScorecardRagColoursMetricOne: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,8 +1,8 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dataQualityAllEstablishmentsEthnicity: components['schemas']['DashboardVisualisationDefinition'];
3
- export declare const dataQualityAllEstablishmentsNoEthnicity: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dataQualityAllEstablishmentsReligion: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const dataQualityAllEstablishmentsNoReligion: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const dataQualityAllEstablishmentsNationality: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const dataQualityAllEstablishmentsNoNationality: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dataQualityAllEstablishmentsMetricOne: components['schemas']['DashboardVisualisationDefinition'];
3
+ export declare const dataQualityAllEstablishmentsNoMetricOne: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dataQualityAllEstablishmentsMetricThree: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const dataQualityAllEstablishmentsNoMetricThree: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const dataQualityAllEstablishmentsMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const dataQualityAllEstablishmentsNoMetricTwo: components['schemas']['DashboardVisualisationDefinition'];
8
8
  export declare const dataQualityAllCols: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,8 +1,8 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
2
  export declare const dietTotalsOverTime: components['schemas']['DashboardVisualisationDefinition'];
3
3
  export declare const dietTotalsByEstablishmentOverTime: components['schemas']['DashboardVisualisationDefinition'];
4
- export declare const dietTotalsVegetarianOvertime: components['schemas']['DashboardVisualisationDefinition'];
5
- export declare const dietTotalsVeganOvertime: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const dietTotalsVegetarianOvertimeByEstLine: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const dietTotalsVegetarianOvertimeByEstByWingLine: components['schemas']['DashboardVisualisationDefinition'];
8
- export declare const dietTotalsVegetarianOvertimeByEstByWingAndCellLine: components['schemas']['DashboardVisualisationDefinition'];
4
+ export declare const dietTotalsDietOneOvertime: components['schemas']['DashboardVisualisationDefinition'];
5
+ export declare const dietTotalsDietThreeOvertime: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const dietTotalsDietOneOvertimeByEstLine: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const dietTotalsDietOneOvertimeByEstByWingLine: components['schemas']['DashboardVisualisationDefinition'];
8
+ export declare const dietTotalsDietOneOvertimeByEstByWingAndCellLine: components['schemas']['DashboardVisualisationDefinition'];
@@ -3,9 +3,9 @@ export declare const dietTotalsOverTime: components['schemas']['DashboardVisuali
3
3
  export declare const dietTotalsByEstablishmentOverTime: components['schemas']['DashboardVisualisationDefinition'];
4
4
  export declare const dietTotalsByEstablishmentByWingOverTime: components['schemas']['DashboardVisualisationDefinition'];
5
5
  export declare const dietTotalsByEstablishmentByWingOverTimeOptional: components['schemas']['DashboardVisualisationDefinition'];
6
- export declare const dietTotalsVegetarianOvertime: components['schemas']['DashboardVisualisationDefinition'];
7
- export declare const dietTotalsVegetarianOvertimeByEst: components['schemas']['DashboardVisualisationDefinition'];
8
- export declare const dietTotalsVegetarianOvertimeByEstByWing: components['schemas']['DashboardVisualisationDefinition'];
9
- export declare const dietTotalsVeganOvertime: components['schemas']['DashboardVisualisationDefinition'];
6
+ export declare const dietTotalsDietOneOvertime: components['schemas']['DashboardVisualisationDefinition'];
7
+ export declare const dietTotalsDietOneOvertimeByEst: components['schemas']['DashboardVisualisationDefinition'];
8
+ export declare const dietTotalsDietOneOvertimeByEstByWing: components['schemas']['DashboardVisualisationDefinition'];
9
+ export declare const dietTotalsDietThreeOvertime: components['schemas']['DashboardVisualisationDefinition'];
10
10
  export declare const dietTotalsAllDietOvertime: components['schemas']['DashboardVisualisationDefinition'];
11
11
  export declare const dietTotalsAllDietOvertimeByEst: components['schemas']['DashboardVisualisationDefinition'];
@@ -1,2 +1,2 @@
1
1
  import { components } from '../../../../../../../src/dpr/types/api';
2
- export declare const dietTotalsVegetarianOvertime: components['schemas']['DashboardVisualisationDefinition'];
2
+ export declare const dietTotalsDietOneOvertime: components['schemas']['DashboardVisualisationDefinition'];
@@ -113,10 +113,11 @@ class BarChart extends Chart.Chart {
113
113
  initListData = () => {
114
114
  this.xAxisColumn = this.measures.find((col) => col.axis === 'x');
115
115
  this.yAxisColumn = this.measures.find((col) => col.axis === 'y');
116
- this.groupKey = (datasetHelper.default.getGroupKey(this.responseData, this.keys));
117
- this.groupsData = this.groupKey
118
- ? datasetHelper.default.groupRowsByKey(this.responseData, this.groupKey.id)
119
- : [this.responseData];
116
+ this.groupKey = this.keys.map((key) => key.id);
117
+ this.groupsData =
118
+ this.groupKey && this.groupKey.length
119
+ ? datasetHelper.default.groupRowsBy(this.responseData, this.groupKey)
120
+ : [this.responseData];
120
121
  };
121
122
  createListDatasets = () => {
122
123
  this.hexColours = new ChartColours.ChartColours().getHexPallette();
@@ -134,15 +135,7 @@ class BarChart extends Chart.Chart {
134
135
  data[dataIndex] = Number(raw);
135
136
  }
136
137
  });
137
- let label = '';
138
- if (this.groupKey) {
139
- const groupKeyId = this.groupKey.id;
140
- const groupRow = groupData[0];
141
- label = groupRow && groupRow[groupKeyId] ? `${groupRow[groupKeyId].raw}` : '';
142
- }
143
- else {
144
- label = this.yAxisColumn?.display || label;
145
- }
138
+ const label = this.createGroupLabel(groupData);
146
139
  return {
147
140
  label,
148
141
  data,
@@ -151,14 +144,31 @@ class BarChart extends Chart.Chart {
151
144
  };
152
145
  });
153
146
  };
147
+ createGroupLabel = (group) => {
148
+ if (this.groupKey && this.groupKey.length) {
149
+ const firstRow = group[0];
150
+ return this.groupKey
151
+ ? this.groupKey
152
+ .map((id) => {
153
+ const key = this.keys.find((k) => k.id === 'id');
154
+ const label = key && key.display ? `${key.display}:` : '';
155
+ const value = firstRow[id]?.raw ?? '';
156
+ return `${label}${value}`;
157
+ })
158
+ .join(' - ')
159
+ : '';
160
+ }
161
+ return this.yAxisColumn?.display || '';
162
+ };
154
163
  createListLabels = () => {
155
- this.labels = this.groupsData.flatMap((gd) => {
164
+ const allLabels = this.groupsData.flatMap((gd) => {
156
165
  const id = this.xAxisColumn?.id || '';
157
166
  return gd.map((row) => {
158
167
  const field = row[id];
159
168
  return field ? `${field.raw}` : '';
160
169
  });
161
170
  });
171
+ this.labels = Array.from(new Set(allLabels));
162
172
  };
163
173
  }
164
174
 
@@ -1 +1 @@
1
- {"version":3,"file":"BarChart.js","sources":["../../../../../../../../../../../../src/dpr/components/_charts/chart/bar/BarChart.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\nimport { DashboardDataResponse } from '../../../../types/Metrics'\nimport {\n DashboardVisualisationType,\n DashboardVisualisationData,\n DashboardVisualisationDataSet,\n VisualisationDefinitionKey,\n} from '../../../_dashboards/dashboard-visualisation/types'\nimport { components } from '../../../../types/api'\nimport DatasetHelper from '../../../../utils/datasetHelper'\nimport Chart from '../Chart'\nimport BarChartSchemas from './validate'\nimport { BarDefinitionMeasure, BarDefinitionOptions, BarDefinitionType } from './types'\nimport { ChartColours } from '../ChartColours'\n\nclass BarChart extends Chart {\n private definition!: BarDefinitionType\n\n private measures!: BarDefinitionMeasure[]\n\n private keys!: VisualisationDefinitionKey[]\n\n private options: BarDefinitionOptions | undefined\n\n override responseData: DashboardDataResponse[] = []\n\n private isList = false\n\n override datasets: DashboardVisualisationDataSet[] = []\n\n private groupsData: DashboardDataResponse[][] = []\n\n private groupKey: BarDefinitionMeasure | undefined\n\n private xAxisColumn: BarDefinitionMeasure | undefined\n\n private yAxisColumn: BarDefinitionMeasure | undefined\n\n private barCount = 0\n\n withDefinition = (definition: components['schemas']['DashboardVisualisationDefinition']) => {\n this.definition = BarChartSchemas.BarSchema.parse(definition)\n this.initFromDefinitionData()\n\n return this\n }\n\n override withData = (responseData: DashboardDataResponse[]) => {\n this.responseData = responseData\n if (this.isList) this.initListData()\n return this\n }\n\n getCanvasHeight = () => {\n this.barCount = this.datasets.length * this.datasets[0].data.length\n return this.options?.horizontal ? this.barCount : 5\n }\n\n build = (): DashboardVisualisationData => {\n if (!this.isList) {\n this.getBarChartData()\n } else {\n this.getListBarChartData()\n }\n const height = this.getCanvasHeight()\n\n return {\n type: DashboardVisualisationType.BAR,\n options: {\n height,\n unit: this.unit,\n timeseries: false,\n },\n data: {\n labels: this.labels,\n datasets: this.datasets,\n config: this.config,\n },\n }\n }\n\n augmentDataset = (datasets: DashboardVisualisationDataSet[]) => {\n return datasets.map((set) => {\n return {\n ...set,\n borderWidth: [0, 0],\n datalabels: {\n align: 'center',\n anchor: 'bottom',\n },\n }\n })\n }\n\n setBespokeOptions = () => {\n let indexAxis = 'x'\n let scales\n\n if (this.options) {\n const { horizontal, xStacked, yStacked } = this.options\n indexAxis = horizontal ? 'y' : indexAxis\n if (xStacked || yStacked) {\n scales = {\n ...(xStacked && { x: { stacked: xStacked } }),\n ...(yStacked && { y: { stacked: yStacked } }),\n }\n }\n }\n\n return {\n ...this.config,\n indexAxis,\n ...(scales && { scales }),\n }\n }\n\n private getBarChartData = () => {\n this.createDatasets(this.measures, this.responseData)\n this.datasets = this.augmentDataset(this.datasets)\n this.config = this.setBespokeOptions()\n this.createLabels(this.measures)\n }\n\n private getListBarChartData = () => {\n this.createListLabels()\n this.createListDatasets()\n this.datasets = this.augmentDataset(this.datasets)\n this.config = this.setBespokeOptions()\n }\n\n private initFromDefinitionData = () => {\n this.measures = this.definition.columns.measures\n this.options = this.definition.options\n this.keys = this.definition.columns.keys || []\n this.isList = !!this.measures.find((col) => col.axis)\n this.initUnit(this.measures)\n\n if (!this.isList) this.getLabelId(this.keys)\n }\n\n private initListData = () => {\n this.xAxisColumn = this.measures.find((col) => col.axis === 'x')\n this.yAxisColumn = this.measures.find((col) => col.axis === 'y')\n this.groupKey = <BarDefinitionMeasure>(\n DatasetHelper.getGroupKey(\n this.responseData,\n <Array<components['schemas']['DashboardVisualisationColumnDefinition']>>this.keys,\n )\n )\n this.groupsData = this.groupKey\n ? DatasetHelper.groupRowsByKey(this.responseData, this.groupKey.id)\n : [this.responseData]\n }\n\n private createListDatasets = () => {\n this.hexColours = new ChartColours().getHexPallette()\n this.datasets = this.groupsData.map((groupData, groupIndex) => {\n const data = Array(this.labels.length)\n groupData.forEach((row) => {\n // Validation will ensure these columns exist\n const yId = this.yAxisColumn?.id || ''\n const xId = this.xAxisColumn?.id || ''\n\n const labelField = row[xId]\n const valueField = row[yId]\n\n const raw = valueField && valueField.raw ? Number(valueField.raw) : 0\n const dataIndex = this.labels.findIndex((l) => l === labelField.raw)\n if (dataIndex !== -1) {\n data[dataIndex] = Number(raw)\n }\n })\n\n let label = ''\n if (this.groupKey) {\n const groupKeyId = this.groupKey.id\n const groupRow = groupData[0]\n label = groupRow && groupRow[groupKeyId] ? `${groupRow[groupKeyId].raw}` : ''\n } else {\n label = this.yAxisColumn?.display || label\n }\n\n return {\n label,\n data,\n total: data.reduce((acc: number, val: number) => acc + val, 0),\n ...this.setStyles(groupIndex),\n }\n })\n }\n\n private createListLabels = () => {\n this.labels = this.groupsData.flatMap((gd) => {\n const id = this.xAxisColumn?.id || ''\n return gd.map((row) => {\n const field = row[id]\n return field ? `${field.raw}` : ''\n })\n })\n }\n}\n\nexport { BarChart }\nexport default BarChart\n"],"names":["Chart","BarChartSchemas","DashboardVisualisationType","DatasetHelper","ChartColours"],"mappings":"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"}
1
+ {"version":3,"file":"BarChart.js","sources":["../../../../../../../../../../../../src/dpr/components/_charts/chart/bar/BarChart.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\nimport { DashboardDataResponse } from '../../../../types/Metrics'\nimport {\n DashboardVisualisationType,\n DashboardVisualisationData,\n DashboardVisualisationDataSet,\n VisualisationDefinitionKey,\n} from '../../../_dashboards/dashboard-visualisation/types'\nimport { components } from '../../../../types/api'\nimport DatasetHelper from '../../../../utils/datasetHelper'\nimport Chart from '../Chart'\nimport BarChartSchemas from './validate'\nimport { BarDefinitionMeasure, BarDefinitionOptions, BarDefinitionType } from './types'\nimport { ChartColours } from '../ChartColours'\n\nclass BarChart extends Chart {\n private definition!: BarDefinitionType\n\n private measures!: BarDefinitionMeasure[]\n\n private keys!: VisualisationDefinitionKey[]\n\n private options: BarDefinitionOptions | undefined\n\n override responseData: DashboardDataResponse[] = []\n\n private isList = false\n\n override datasets: DashboardVisualisationDataSet[] = []\n\n private groupsData: DashboardDataResponse[][] = []\n\n private groupKey: string[] | undefined\n\n private xAxisColumn: BarDefinitionMeasure | undefined\n\n private yAxisColumn: BarDefinitionMeasure | undefined\n\n private barCount = 0\n\n withDefinition = (definition: components['schemas']['DashboardVisualisationDefinition']) => {\n this.definition = BarChartSchemas.BarSchema.parse(definition)\n this.initFromDefinitionData()\n\n return this\n }\n\n override withData = (responseData: DashboardDataResponse[]) => {\n this.responseData = responseData\n if (this.isList) this.initListData()\n return this\n }\n\n getCanvasHeight = () => {\n this.barCount = this.datasets.length * this.datasets[0].data.length\n return this.options?.horizontal ? this.barCount : 5\n }\n\n build = (): DashboardVisualisationData => {\n if (!this.isList) {\n this.getBarChartData()\n } else {\n this.getListBarChartData()\n }\n const height = this.getCanvasHeight()\n\n return {\n type: DashboardVisualisationType.BAR,\n options: {\n height,\n unit: this.unit,\n timeseries: false,\n },\n data: {\n labels: this.labels,\n datasets: this.datasets,\n config: this.config,\n },\n }\n }\n\n augmentDataset = (datasets: DashboardVisualisationDataSet[]) => {\n return datasets.map((set) => {\n return {\n ...set,\n borderWidth: [0, 0],\n datalabels: {\n align: 'center',\n anchor: 'bottom',\n },\n }\n })\n }\n\n setBespokeOptions = () => {\n let indexAxis = 'x'\n let scales\n\n if (this.options) {\n const { horizontal, xStacked, yStacked } = this.options\n indexAxis = horizontal ? 'y' : indexAxis\n if (xStacked || yStacked) {\n scales = {\n ...(xStacked && { x: { stacked: xStacked } }),\n ...(yStacked && { y: { stacked: yStacked } }),\n }\n }\n }\n\n return {\n ...this.config,\n indexAxis,\n ...(scales && { scales }),\n }\n }\n\n private getBarChartData = () => {\n this.createDatasets(this.measures, this.responseData)\n this.datasets = this.augmentDataset(this.datasets)\n this.config = this.setBespokeOptions()\n this.createLabels(this.measures)\n }\n\n private getListBarChartData = () => {\n this.createListLabels()\n this.createListDatasets()\n this.datasets = this.augmentDataset(this.datasets)\n this.config = this.setBespokeOptions()\n }\n\n private initFromDefinitionData = () => {\n this.measures = this.definition.columns.measures\n this.options = this.definition.options\n this.keys = this.definition.columns.keys || []\n this.isList = !!this.measures.find((col) => col.axis)\n this.initUnit(this.measures)\n\n if (!this.isList) this.getLabelId(this.keys)\n }\n\n private initListData = () => {\n this.xAxisColumn = this.measures.find((col) => col.axis === 'x')\n this.yAxisColumn = this.measures.find((col) => col.axis === 'y')\n this.groupKey = this.keys.map((key) => key.id)\n this.groupsData =\n this.groupKey && this.groupKey.length\n ? DatasetHelper.groupRowsBy(this.responseData, this.groupKey)\n : [this.responseData]\n }\n\n private createListDatasets = () => {\n this.hexColours = new ChartColours().getHexPallette()\n this.datasets = this.groupsData.map((groupData, groupIndex) => {\n const data = Array(this.labels.length)\n groupData.forEach((row) => {\n // Validation will ensure these columns exist\n const yId = this.yAxisColumn?.id || ''\n const xId = this.xAxisColumn?.id || ''\n\n const labelField = row[xId]\n const valueField = row[yId]\n\n const raw = valueField && valueField.raw ? Number(valueField.raw) : 0\n const dataIndex = this.labels.findIndex((l) => l === labelField.raw)\n if (dataIndex !== -1) {\n data[dataIndex] = Number(raw)\n }\n })\n\n const label = this.createGroupLabel(groupData)\n\n return {\n label,\n data,\n total: data.reduce((acc: number, val: number) => acc + val, 0),\n ...this.setStyles(groupIndex),\n }\n })\n }\n\n private createGroupLabel = (group: DashboardDataResponse[]): string => {\n if (this.groupKey && this.groupKey.length) {\n const firstRow = group[0]\n return this.groupKey\n ? this.groupKey\n .map((id) => {\n const key = this.keys.find((k) => k.id === 'id')\n const label = key && key.display ? `${key.display}:` : ''\n const value = firstRow[id]?.raw ?? ''\n return `${label}${value}`\n })\n .join(' - ')\n : ''\n }\n return this.yAxisColumn?.display || ''\n }\n\n private createListLabels = () => {\n const allLabels = this.groupsData.flatMap((gd) => {\n const id = this.xAxisColumn?.id || ''\n return gd.map((row) => {\n const field = row[id]\n return field ? `${field.raw}` : ''\n })\n })\n\n this.labels = Array.from(new Set(allLabels))\n }\n}\n\nexport { BarChart }\nexport default BarChart\n"],"names":["Chart","BarChartSchemas","DashboardVisualisationType","DatasetHelper","ChartColours"],"mappings":";;;;;;;;;;AAeA,MAAM,QAAS,SAAQA,WAAK,CAAA;AAClB,IAAA,UAAU;AAEV,IAAA,QAAQ;AAER,IAAA,IAAI;AAEJ,IAAA,OAAO;IAEN,YAAY,GAA4B,EAAE;IAE3C,MAAM,GAAG,KAAK;IAEb,QAAQ,GAAoC,EAAE;IAE/C,UAAU,GAA8B,EAAE;AAE1C,IAAA,QAAQ;AAER,IAAA,WAAW;AAEX,IAAA,WAAW;IAEX,QAAQ,GAAG,CAAC;AAEpB,IAAA,cAAc,GAAG,CAAC,UAAqE,KAAI;QACzF,IAAI,CAAC,UAAU,GAAGC,QAAe,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC;QAC7D,IAAI,CAAC,sBAAsB,EAAE;AAE7B,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AAEQ,IAAA,QAAQ,GAAG,CAAC,YAAqC,KAAI;AAC5D,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;QAChC,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,YAAY,EAAE;AACpC,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;IAED,eAAe,GAAG,MAAK;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;AACnE,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC;AACrD,IAAA,CAAC;IAED,KAAK,GAAG,MAAiC;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,eAAe,EAAE;QACxB;aAAO;YACL,IAAI,CAAC,mBAAmB,EAAE;QAC5B;AACA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE;QAErC,OAAO;YACL,IAAI,EAAEC,gCAA0B,CAAC,GAAG;AACpC,YAAA,OAAO,EAAE;gBACP,MAAM;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,UAAU,EAAE,KAAK;AAClB,aAAA;AACD,YAAA,IAAI,EAAE;gBACJ,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,aAAA;SACF;AACH,IAAA,CAAC;AAED,IAAA,cAAc,GAAG,CAAC,QAAyC,KAAI;AAC7D,QAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;YAC1B,OAAO;AACL,gBAAA,GAAG,GAAG;AACN,gBAAA,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AACnB,gBAAA,UAAU,EAAE;AACV,oBAAA,KAAK,EAAE,QAAQ;AACf,oBAAA,MAAM,EAAE,QAAQ;AACjB,iBAAA;aACF;AACH,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,iBAAiB,GAAG,MAAK;QACvB,IAAI,SAAS,GAAG,GAAG;AACnB,QAAA,IAAI,MAAM;AAEV,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,OAAO;YACvD,SAAS,GAAG,UAAU,GAAG,GAAG,GAAG,SAAS;AACxC,YAAA,IAAI,QAAQ,IAAI,QAAQ,EAAE;AACxB,gBAAA,MAAM,GAAG;AACP,oBAAA,IAAI,QAAQ,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC7C,oBAAA,IAAI,QAAQ,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC;iBAC9C;YACH;QACF;QAEA,OAAO;YACL,GAAG,IAAI,CAAC,MAAM;YACd,SAAS;AACT,YAAA,IAAI,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;SAC1B;AACH,IAAA,CAAC;IAEO,eAAe,GAAG,MAAK;QAC7B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AAClD,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACtC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;AAClC,IAAA,CAAC;IAEO,mBAAmB,GAAG,MAAK;QACjC,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AAClD,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACxC,IAAA,CAAC;IAEO,sBAAsB,GAAG,MAAK;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO;AACtC,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE;QAC9C,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC;AACrD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QAE5B,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9C,IAAA,CAAC;IAEO,YAAY,GAAG,MAAK;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;QAChE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;AAChE,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;AAC9C,QAAA,IAAI,CAAC,UAAU;AACb,YAAA,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;AAC7B,kBAAEC,qBAAa,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ;AAC5D,kBAAE,CAAC,IAAI,CAAC,YAAY,CAAC;AAC3B,IAAA,CAAC;IAEO,kBAAkB,GAAG,MAAK;QAChC,IAAI,CAAC,UAAU,GAAG,IAAIC,yBAAY,EAAE,CAAC,cAAc,EAAE;AACrD,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,KAAI;YAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AACtC,YAAA,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;;gBAExB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE;gBACtC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE;AAEtC,gBAAA,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC;AAC3B,gBAAA,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC;gBAE3B,MAAM,GAAG,GAAG,UAAU,IAAI,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;AACrE,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,GAAG,CAAC;AACpE,gBAAA,IAAI,SAAS,KAAK,EAAE,EAAE;oBACpB,IAAI,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC/B;AACF,YAAA,CAAC,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;YAE9C,OAAO;gBACL,KAAK;gBACL,IAAI;AACJ,gBAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,GAAW,KAAK,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;AAC9D,gBAAA,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;aAC9B;AACH,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAEO,IAAA,gBAAgB,GAAG,CAAC,KAA8B,KAAY;QACpE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACzC,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;kBACR,IAAI,CAAC;AACF,qBAAA,GAAG,CAAC,CAAC,EAAE,KAAI;AACV,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAChD,oBAAA,MAAM,KAAK,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,GAAG,CAAA,EAAG,GAAG,CAAC,OAAO,CAAA,CAAA,CAAG,GAAG,EAAE;oBACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE;AACrC,oBAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,KAAK,EAAE;AAC3B,gBAAA,CAAC;qBACA,IAAI,CAAC,KAAK;kBACb,EAAE;QACR;AACA,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI,EAAE;AACxC,IAAA,CAAC;IAEO,gBAAgB,GAAG,MAAK;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;YAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE;AACrC,YAAA,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AACpB,gBAAA,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC;AACrB,gBAAA,OAAO,KAAK,GAAG,CAAA,EAAG,KAAK,CAAC,GAAG,CAAA,CAAE,GAAG,EAAE;AACpC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;AAC9C,IAAA,CAAC;AACF;;;;;"}
@@ -12,12 +12,14 @@ class FeatureFlagService {
12
12
  if (!token || !url) {
13
13
  return;
14
14
  }
15
+ const updateInterval = (typeof config.updateInterval === 'number' && config.updateInterval) || 120;
15
16
  this.clientConfig = {
16
17
  url,
17
18
  namespace: featureFlagsHelper.FEATURE_FLAG_NAMESPACE,
18
19
  authentication: {
19
20
  clientToken: token,
20
21
  },
22
+ updateInterval,
21
23
  };
22
24
  }
23
25
  async getClient() {
@@ -1 +1 @@
1
- {"version":3,"file":"featureFlagService.js","sources":["../../../../../../../../../src/dpr/services/featureFlagService.ts"],"sourcesContent":["import { FliptClient, type ClientOptions, type EvaluationRequest } from '@flipt-io/flipt-client-js/node'\nimport { Application } from 'express'\nimport { captureException } from '@sentry/node'\nimport { FeatureFlagConfig } from '../data/types'\nimport {\n FEATURE_FLAG_NAMESPACE,\n getFeatureFlagFallbackState,\n type FeatureFlagEvaluationSubject,\n type FeatureFlagKey,\n} from '../utils/featureFlagsHelper'\n\nexport class FeatureFlagService {\n private readonly clientConfig: ClientOptions | undefined\n\n private clientPromise: Promise<FliptClient> | undefined\n\n constructor(config: FeatureFlagConfig | Record<string, unknown> = {}) {\n const { token, url } = config && (config as FeatureFlagConfig)\n if (!token || !url) {\n return\n }\n\n this.clientConfig = {\n url,\n namespace: FEATURE_FLAG_NAMESPACE,\n authentication: {\n clientToken: token,\n },\n }\n }\n\n private async getClient(): Promise<FliptClient | undefined> {\n if (!this.clientConfig) {\n return undefined\n }\n\n if (!this.clientPromise) {\n this.clientPromise = FliptClient.init(this.clientConfig).catch((error) => {\n this.clientPromise = undefined\n throw error\n })\n }\n\n return this.clientPromise\n }\n\n async refresh() {\n const client = await this.getClient()\n await client?.refresh()\n }\n\n async evaluateBooleanFlag(flagKey: FeatureFlagKey, subject: FeatureFlagEvaluationSubject): Promise<boolean> {\n const evaluation = await this.evaluateBooleanFlags([flagKey], subject)\n return evaluation[flagKey]\n }\n\n async evaluateBooleanFlags<TFlag extends FeatureFlagKey>(\n flagKeys: readonly TFlag[],\n subject: FeatureFlagEvaluationSubject,\n ): Promise<Record<TFlag, boolean>> {\n const results = Object.fromEntries(\n flagKeys.map((flagKey) => [flagKey, getFeatureFlagFallbackState(flagKey)]),\n ) as Record<TFlag, boolean>\n\n if (flagKeys.length === 0) {\n return results\n }\n\n const client = await this.getClient().catch((error) => {\n captureException(error)\n return undefined\n })\n if (!client) {\n return results\n }\n\n const requests: EvaluationRequest[] = flagKeys.map((flagKey) => ({\n flagKey,\n entityId: subject.entityId,\n context: subject.context,\n }))\n\n try {\n const batchResponse = client.evaluateBatch(requests)\n\n batchResponse.responses\n .filter((response) => response.type === 'BOOLEAN_EVALUATION_RESPONSE_TYPE')\n .forEach((response) => {\n const flagKey = response.booleanEvaluationResponse?.flagKey as TFlag | undefined\n const enabled = response.booleanEvaluationResponse?.enabled\n\n if (flagKey && enabled !== undefined && flagKey in results) {\n results[flagKey] = enabled\n }\n })\n } catch (error) {\n captureException(error)\n return results\n }\n\n return results\n }\n}\n\nconst resolveFlag = (app: Application, flagName: string) => {\n return app.locals['featureFlags']?.flags?.[flagName]\n}\n\nexport const isBooleanFlagEnabledOrMissing = (flagName: string, app: Application): boolean => {\n const flag = resolveFlag(app, flagName)\n return flag !== false\n}\n"],"names":["FEATURE_FLAG_NAMESPACE","FliptClient","getFeatureFlagFallbackState","captureException"],"mappings":";;;;;;MAWa,kBAAkB,CAAA;AACZ,IAAA,YAAY;AAErB,IAAA,aAAa;AAErB,IAAA,WAAA,CAAY,SAAsD,EAAE,EAAA;QAClE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,IAAK,MAA4B;AAC9D,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE;YAClB;QACF;QAEA,IAAI,CAAC,YAAY,GAAG;YAClB,GAAG;AACH,YAAA,SAAS,EAAEA,yCAAsB;AACjC,YAAA,cAAc,EAAE;AACd,gBAAA,WAAW,EAAE,KAAK;AACnB,aAAA;SACF;IACH;AAEQ,IAAA,MAAM,SAAS,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvB,YAAA,IAAI,CAAC,aAAa,GAAGC,iBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;AACvE,gBAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAC9B,gBAAA,MAAM,KAAK;AACb,YAAA,CAAC,CAAC;QACJ;QAEA,OAAO,IAAI,CAAC,aAAa;IAC3B;AAEA,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE;AACrC,QAAA,MAAM,MAAM,EAAE,OAAO,EAAE;IACzB;AAEA,IAAA,MAAM,mBAAmB,CAAC,OAAuB,EAAE,OAAqC,EAAA;AACtF,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;AACtE,QAAA,OAAO,UAAU,CAAC,OAAO,CAAC;IAC5B;AAEA,IAAA,MAAM,oBAAoB,CACxB,QAA0B,EAC1B,OAAqC,EAAA;QAErC,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAChC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,EAAEC,8CAA2B,CAAC,OAAO,CAAC,CAAC,CAAC,CACjD;AAE3B,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;YACpDC,qBAAgB,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,SAAS;AAClB,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,OAAO;QAChB;QAEA,MAAM,QAAQ,GAAwB,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,MAAM;YAC/D,OAAO;YACP,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;AACzB,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI;YACF,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;AAEpD,YAAA,aAAa,CAAC;iBACX,MAAM,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,KAAK,kCAAkC;AACzE,iBAAA,OAAO,CAAC,CAAC,QAAQ,KAAI;AACpB,gBAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,yBAAyB,EAAE,OAA4B;AAChF,gBAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,yBAAyB,EAAE,OAAO;gBAE3D,IAAI,OAAO,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,OAAO,EAAE;AAC1D,oBAAA,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO;gBAC5B;AACF,YAAA,CAAC,CAAC;QACN;QAAE,OAAO,KAAK,EAAE;YACdA,qBAAgB,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,OAAO,OAAO;IAChB;AACD;AAED,MAAM,WAAW,GAAG,CAAC,GAAgB,EAAE,QAAgB,KAAI;AACzD,IAAA,OAAO,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;AACtD,CAAC;MAEY,6BAA6B,GAAG,CAAC,QAAgB,EAAE,GAAgB,KAAa;IAC3F,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvC,OAAO,IAAI,KAAK,KAAK;AACvB;;;;;"}
1
+ {"version":3,"file":"featureFlagService.js","sources":["../../../../../../../../../src/dpr/services/featureFlagService.ts"],"sourcesContent":["import { FliptClient, type ClientOptions, type EvaluationRequest } from '@flipt-io/flipt-client-js/node'\nimport { Application } from 'express'\nimport { captureException } from '@sentry/node'\nimport { FeatureFlagConfig } from '../data/types'\nimport {\n FEATURE_FLAG_NAMESPACE,\n getFeatureFlagFallbackState,\n type FeatureFlagEvaluationSubject,\n type FeatureFlagKey,\n} from '../utils/featureFlagsHelper'\n\nexport class FeatureFlagService {\n private readonly clientConfig: ClientOptions | undefined\n\n private clientPromise: Promise<FliptClient> | undefined\n\n constructor(config: FeatureFlagConfig | Record<string, unknown> = {}) {\n const { token, url } = config && (config as FeatureFlagConfig)\n if (!token || !url) {\n return\n }\n\n const updateInterval = (typeof config.updateInterval === 'number' && config.updateInterval) || 120\n\n this.clientConfig = {\n url,\n namespace: FEATURE_FLAG_NAMESPACE,\n authentication: {\n clientToken: token,\n },\n updateInterval,\n }\n }\n\n private async getClient(): Promise<FliptClient | undefined> {\n if (!this.clientConfig) {\n return undefined\n }\n\n if (!this.clientPromise) {\n this.clientPromise = FliptClient.init(this.clientConfig).catch((error) => {\n this.clientPromise = undefined\n throw error\n })\n }\n\n return this.clientPromise\n }\n\n async refresh() {\n const client = await this.getClient()\n await client?.refresh()\n }\n\n async evaluateBooleanFlag(flagKey: FeatureFlagKey, subject: FeatureFlagEvaluationSubject): Promise<boolean> {\n const evaluation = await this.evaluateBooleanFlags([flagKey], subject)\n return evaluation[flagKey]\n }\n\n async evaluateBooleanFlags<TFlag extends FeatureFlagKey>(\n flagKeys: readonly TFlag[],\n subject: FeatureFlagEvaluationSubject,\n ): Promise<Record<TFlag, boolean>> {\n const results = Object.fromEntries(\n flagKeys.map((flagKey) => [flagKey, getFeatureFlagFallbackState(flagKey)]),\n ) as Record<TFlag, boolean>\n\n if (flagKeys.length === 0) {\n return results\n }\n\n const client = await this.getClient().catch((error) => {\n captureException(error)\n return undefined\n })\n if (!client) {\n return results\n }\n\n const requests: EvaluationRequest[] = flagKeys.map((flagKey) => ({\n flagKey,\n entityId: subject.entityId,\n context: subject.context,\n }))\n\n try {\n const batchResponse = client.evaluateBatch(requests)\n\n batchResponse.responses\n .filter((response) => response.type === 'BOOLEAN_EVALUATION_RESPONSE_TYPE')\n .forEach((response) => {\n const flagKey = response.booleanEvaluationResponse?.flagKey as TFlag | undefined\n const enabled = response.booleanEvaluationResponse?.enabled\n\n if (flagKey && enabled !== undefined && flagKey in results) {\n results[flagKey] = enabled\n }\n })\n } catch (error) {\n captureException(error)\n return results\n }\n\n return results\n }\n}\n\nconst resolveFlag = (app: Application, flagName: string) => {\n return app.locals['featureFlags']?.flags?.[flagName]\n}\n\nexport const isBooleanFlagEnabledOrMissing = (flagName: string, app: Application): boolean => {\n const flag = resolveFlag(app, flagName)\n return flag !== false\n}\n"],"names":["FEATURE_FLAG_NAMESPACE","FliptClient","getFeatureFlagFallbackState","captureException"],"mappings":";;;;;;MAWa,kBAAkB,CAAA;AACZ,IAAA,YAAY;AAErB,IAAA,aAAa;AAErB,IAAA,WAAA,CAAY,SAAsD,EAAE,EAAA;QAClE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,IAAK,MAA4B;AAC9D,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE;YAClB;QACF;AAEA,QAAA,MAAM,cAAc,GAAG,CAAC,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,cAAc,KAAK,GAAG;QAElG,IAAI,CAAC,YAAY,GAAG;YAClB,GAAG;AACH,YAAA,SAAS,EAAEA,yCAAsB;AACjC,YAAA,cAAc,EAAE;AACd,gBAAA,WAAW,EAAE,KAAK;AACnB,aAAA;YACD,cAAc;SACf;IACH;AAEQ,IAAA,MAAM,SAAS,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvB,YAAA,IAAI,CAAC,aAAa,GAAGC,iBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;AACvE,gBAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAC9B,gBAAA,MAAM,KAAK;AACb,YAAA,CAAC,CAAC;QACJ;QAEA,OAAO,IAAI,CAAC,aAAa;IAC3B;AAEA,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE;AACrC,QAAA,MAAM,MAAM,EAAE,OAAO,EAAE;IACzB;AAEA,IAAA,MAAM,mBAAmB,CAAC,OAAuB,EAAE,OAAqC,EAAA;AACtF,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;AACtE,QAAA,OAAO,UAAU,CAAC,OAAO,CAAC;IAC5B;AAEA,IAAA,MAAM,oBAAoB,CACxB,QAA0B,EAC1B,OAAqC,EAAA;QAErC,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAChC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,EAAEC,8CAA2B,CAAC,OAAO,CAAC,CAAC,CAAC,CACjD;AAE3B,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;YACpDC,qBAAgB,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,SAAS;AAClB,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,OAAO;QAChB;QAEA,MAAM,QAAQ,GAAwB,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,MAAM;YAC/D,OAAO;YACP,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;AACzB,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI;YACF,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;AAEpD,YAAA,aAAa,CAAC;iBACX,MAAM,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,KAAK,kCAAkC;AACzE,iBAAA,OAAO,CAAC,CAAC,QAAQ,KAAI;AACpB,gBAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,yBAAyB,EAAE,OAA4B;AAChF,gBAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,yBAAyB,EAAE,OAAO;gBAE3D,IAAI,OAAO,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,OAAO,EAAE;AAC1D,oBAAA,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO;gBAC5B;AACF,YAAA,CAAC,CAAC;QACN;QAAE,OAAO,KAAK,EAAE;YACdA,qBAAgB,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,OAAO,OAAO;IAChB;AACD;AAED,MAAM,WAAW,GAAG,CAAC,GAAgB,EAAE,QAAgB,KAAI;AACzD,IAAA,OAAO,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;AACtD,CAAC;MAEY,6BAA6B,GAAG,CAAC,QAAgB,EAAE,GAAgB,KAAa;IAC3F,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvC,OAAO,IAAI,KAAK,KAAK;AACvB;;;;;"}
@@ -145,6 +145,17 @@ const groupRowsByKey = (dashboardData, key) => {
145
145
  return dashboardData.filter((d) => d[key].raw === keyValue);
146
146
  });
147
147
  };
148
+ const groupRowsBy = (dashboardData, groupIds) => {
149
+ const grouped = dashboardData.reduce((acc, row) => {
150
+ // Create a unique composite key from the grouping fields
151
+ const key = groupIds.map((id) => row[id]?.raw ?? '').join('|');
152
+ // Build or append to the group
153
+ acc[key] = acc[key] ? [...acc[key], row] : [row];
154
+ return acc;
155
+ }, {});
156
+ // Return the groups as an array of arrays
157
+ return Object.values(grouped);
158
+ };
148
159
  const getGroupKey = (rawData, keys) => {
149
160
  if (!keys || !keys.length || !rawData.length) {
150
161
  return undefined;
@@ -187,6 +198,7 @@ var DatasetHelper = {
187
198
  filterRowsByDisplayColumns,
188
199
  groupRowsByTimestamp,
189
200
  groupRowsByKey,
201
+ groupRowsBy,
190
202
  getGroupKey,
191
203
  getKeyVariations,
192
204
  getKeyIds,
@@ -202,6 +214,7 @@ exports.getGroupKey = getGroupKey;
202
214
  exports.getKeyIds = getKeyIds;
203
215
  exports.getKeyVariations = getKeyVariations;
204
216
  exports.getLastestDataset = getLastestDataset;
217
+ exports.groupRowsBy = groupRowsBy;
205
218
  exports.groupRowsByKey = groupRowsByKey;
206
219
  exports.groupRowsByTimestamp = groupRowsByTimestamp;
207
220
  //# sourceMappingURL=datasetHelper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"datasetHelper.js","sources":["../../../../../../../../../src/dpr/utils/datasetHelper.ts"],"sourcesContent":["import { DashboardDataResponse } from '../types/Metrics'\nimport { components } from '../types/api'\nimport logger from './logger'\n\nexport const getDatasetRows = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { measures, filters, expectNulls } = listDefinition.columns\n logger.info('DEBUG: Dashboard vis filterValues:', filters)\n const keys = <Array<components['schemas']['DashboardVisualisationColumnDefinition']>>listDefinition.columns.keys\n\n const displayColumnsIds = measures.map((col) => col.id)\n const keyColumnsIds = keys?.map((col) => col.id) || []\n let filterColIds = filters?.map((col) => col.id) || []\n filterColIds = [...new Set(filterColIds)]\n const hasOptionalKeys = keys?.some((key) => key.optional)\n\n if (dashboardData.length && dashboardData[0]['ts']) keyColumnsIds.unshift('ts')\n\n const filtered = dashboardData.filter((datasetRow: DashboardDataResponse) => {\n const validRow: boolean[] = []\n\n Object.keys(datasetRow).forEach((fieldId) => {\n const value = datasetRow[fieldId].raw\n // All rows are valid until proven otherwise\n let valid = true\n\n // 1. check if the column value is equal to a defined column value\n if (filterColIds.includes(fieldId) && filters) {\n const filterValues = filters ? filters.filter((f) => f.id === fieldId).map((f) => f.equals) : []\n const validFilters: boolean[] = []\n filterValues.forEach((filterValue) => {\n if (filterValue === null) {\n validFilters.push(value === '' || value === undefined || value === null)\n } else {\n validFilters.push(filterValue === value)\n }\n })\n valid = validFilters.some(Boolean)\n\n // 3. check keys exist in the defined columns\n } else if (keyColumnsIds.includes(fieldId) && hasOptionalKeys) {\n valid = true\n\n // 3. check keys exist in the defined columns\n } else if (keyColumnsIds.includes(fieldId) && !hasOptionalKeys) {\n valid = value !== '' && value !== undefined && value !== null\n\n // 2. check values exist in the defined columns\n } else if (displayColumnsIds.includes(fieldId)) {\n valid = value !== '' && value !== undefined && value !== null\n\n // 3. check that all remaining columns are null.\n } else if (expectNulls) {\n valid = value === '' || value === undefined || value === null\n }\n\n validRow.push(valid)\n })\n\n return validRow.every((val) => val)\n })\n\n if (hasOptionalKeys) {\n return filterKeys(filtered, keys || [])\n }\n\n return filtered\n}\n\nexport const getKeyVariations = (keys: Array<components['schemas']['DashboardVisualisationColumnDefinition']>) => {\n const colIdVariations: string[][] = []\n const keyColumnsIds = keys.map((col) => col.id)\n const allOptional = keys.every((key) => key.optional)\n const colIdCopy = [...keyColumnsIds]\n\n keyColumnsIds.reverse().forEach((id) => {\n const key = keys.find((k) => k.id === id)\n colIdVariations.push([...colIdCopy])\n if (key && key.optional) {\n colIdCopy.pop()\n }\n })\n\n if (allOptional) colIdVariations.push([])\n return colIdVariations\n}\n\nexport const getKeyIds = (dashboardData: DashboardDataResponse[], colIdVariations: string[][]) => {\n let validHeadIds: string[] = []\n colIdVariations.every((ids: string[]) => {\n const validRows = []\n\n dashboardData.forEach((datasetRow: DashboardDataResponse) => {\n const validRow: boolean[] = []\n\n Object.keys(datasetRow).forEach((datasetField) => {\n const value = datasetRow[datasetField].raw\n let valid = true\n if (ids.includes(datasetField)) {\n valid = value !== '' && value !== undefined && value !== null\n }\n validRow.push(valid)\n })\n\n if (validRow.every((val) => val)) {\n validRows.push(datasetRow)\n }\n })\n\n if (validRows.length > 0) {\n validHeadIds = ids\n return false\n }\n validHeadIds = ids\n return true\n })\n\n return validHeadIds\n}\n\nexport const filterKeys = (\n dashboardData: DashboardDataResponse[],\n keys: Array<components['schemas']['DashboardVisualisationColumnDefinition']>,\n) => {\n const colIdVariations = getKeyVariations(keys)\n const validHeadIds = getKeyIds(dashboardData, colIdVariations)\n\n return dashboardData.filter((datasetRow: DashboardDataResponse) => {\n const validRow: boolean[] = []\n Object.keys(datasetRow).forEach((datasetField) => {\n const value = datasetRow[datasetField].raw\n let valid = true\n if (validHeadIds.includes(datasetField)) {\n valid = value !== '' && value !== undefined && value !== null\n }\n validRow.push(valid)\n })\n\n return validRow.every((val) => val)\n })\n}\n\nexport const getLastestDataset = (dashboardData: DashboardDataResponse[]): DashboardDataResponse[] => {\n const latestTimestamp = dashboardData[dashboardData.length - 1]?.['ts']?.raw\n if (latestTimestamp) {\n return dashboardData.filter((data) => data['ts'].raw === latestTimestamp)\n }\n return dashboardData\n}\n\nexport const getEarliestDataset = (dashboardData: DashboardDataResponse[]): DashboardDataResponse[] => {\n const latestTimestamp = dashboardData[0]?.['ts']?.raw\n if (latestTimestamp) {\n return dashboardData.filter((data) => data['ts'].raw === latestTimestamp)\n }\n return dashboardData\n}\n\nexport const groupRowsByTimestamp = (dashboardData: DashboardDataResponse[]): DashboardDataResponse[][] => {\n const uniqueTimestamps = [...new Set(dashboardData.map((item) => item['ts'].raw))]\n return uniqueTimestamps.map((ts) => {\n return dashboardData.filter((d) => d['ts'].raw === ts)\n })\n}\n\nexport const groupRowsByKey = (dashboardData: DashboardDataResponse[], key: string): DashboardDataResponse[][] => {\n const uniqueKeyValues = [...new Set(dashboardData.map((item) => item[key].raw))]\n return uniqueKeyValues.map((keyValue) => {\n return dashboardData.filter((d) => d[key].raw === keyValue)\n })\n}\n\nexport const getGroupKey = (\n rawData: DashboardDataResponse[],\n keys?: Array<components['schemas']['DashboardVisualisationColumnDefinition']>,\n) => {\n if (!keys || !keys.length || !rawData.length) {\n return undefined\n }\n\n const data = rawData[0]\n let index = keys.length - 1\n let keyFound = false\n while (!keyFound) {\n const k = `${keys[index]?.id}`\n if (k && index !== -1 && (!data[k] || !data[k].raw || data[k].raw === '' || data[k].raw === null)) {\n index -= 1\n } else {\n keyFound = true\n }\n }\n\n return index !== -1 ? keys[index] : undefined\n}\n\nexport const filterRowsByDisplayColumns = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n includeKeys = false,\n) => {\n const { keys: keyCols, measures } = listDefinition.columns\n const keys = keyCols || []\n let displayColumns = [...measures]\n if (includeKeys) {\n displayColumns = [...keys, ...measures]\n }\n const displayColumnsIds = displayColumns.map((col) => col.id)\n\n return dashboardData.map((datasetRow: DashboardDataResponse) => {\n return Object.keys(datasetRow)\n .filter((key) => displayColumnsIds.includes(key))\n .reduce(\n (acc, key) => {\n acc[key] = datasetRow[key]\n return acc\n },\n {} as unknown as DashboardDataResponse,\n )\n })\n}\n\nexport default {\n getDatasetRows,\n getLastestDataset,\n getEarliestDataset,\n filterRowsByDisplayColumns,\n groupRowsByTimestamp,\n groupRowsByKey,\n getGroupKey,\n getKeyVariations,\n getKeyIds,\n filterKeys,\n}\n"],"names":["logger"],"mappings":";;;;;;MAIa,cAAc,GAAG,CAC5B,cAAyE,EACzE,aAAsC,KACpC;IACF,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,OAAO;AACjE,IAAAA,cAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,OAAO,CAAC;AAC1D,IAAA,MAAM,IAAI,GAA2E,cAAc,CAAC,OAAO,CAAC,IAAI;AAEhH,IAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;AACvD,IAAA,MAAM,aAAa,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;AACtD,IAAA,IAAI,YAAY,GAAG,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;IACtD,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;AACzC,IAAA,MAAM,eAAe,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC;IAEzD,IAAI,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAAE,QAAA,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;IAE/E,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,UAAiC,KAAI;QAC1E,MAAM,QAAQ,GAAc,EAAE;QAE9B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG;;YAErC,IAAI,KAAK,GAAG,IAAI;;YAGhB,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE;AAC7C,gBAAA,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;gBAChG,MAAM,YAAY,GAAc,EAAE;AAClC,gBAAA,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AACnC,oBAAA,IAAI,WAAW,KAAK,IAAI,EAAE;AACxB,wBAAA,YAAY,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;oBAC1E;yBAAO;AACL,wBAAA,YAAY,CAAC,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC;oBAC1C;AACF,gBAAA,CAAC,CAAC;AACF,gBAAA,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;;YAGpC;iBAAO,IAAI,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,eAAe,EAAE;gBAC7D,KAAK,GAAG,IAAI;;YAGd;iBAAO,IAAI,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE;AAC9D,gBAAA,KAAK,GAAG,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;;YAG/D;AAAO,iBAAA,IAAI,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC9C,gBAAA,KAAK,GAAG,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;;YAG/D;iBAAO,IAAI,WAAW,EAAE;AACtB,gBAAA,KAAK,GAAG,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAC/D;AAEA,YAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACtB,QAAA,CAAC,CAAC;QAEF,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AACrC,IAAA,CAAC,CAAC;IAEF,IAAI,eAAe,EAAE;QACnB,OAAO,UAAU,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;IACzC;AAEA,IAAA,OAAO,QAAQ;AACjB;AAEO,MAAM,gBAAgB,GAAG,CAAC,IAA4E,KAAI;IAC/G,MAAM,eAAe,GAAe,EAAE;AACtC,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;AAC/C,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC;AACrD,IAAA,MAAM,SAAS,GAAG,CAAC,GAAG,aAAa,CAAC;IAEpC,aAAa,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;AACrC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;AACpC,QAAA,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE;YACvB,SAAS,CAAC,GAAG,EAAE;QACjB;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,IAAI,WAAW;AAAE,QAAA,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;AACzC,IAAA,OAAO,eAAe;AACxB;MAEa,SAAS,GAAG,CAAC,aAAsC,EAAE,eAA2B,KAAI;IAC/F,IAAI,YAAY,GAAa,EAAE;AAC/B,IAAA,eAAe,CAAC,KAAK,CAAC,CAAC,GAAa,KAAI;QACtC,MAAM,SAAS,GAAG,EAAE;AAEpB,QAAA,aAAa,CAAC,OAAO,CAAC,CAAC,UAAiC,KAAI;YAC1D,MAAM,QAAQ,GAAc,EAAE;YAE9B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,KAAI;gBAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG;gBAC1C,IAAI,KAAK,GAAG,IAAI;AAChB,gBAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AAC9B,oBAAA,KAAK,GAAG,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;gBAC/D;AACA,gBAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACtB,YAAA,CAAC,CAAC;AAEF,YAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE;AAChC,gBAAA,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACxB,YAAY,GAAG,GAAG;AAClB,YAAA,OAAO,KAAK;QACd;QACA,YAAY,GAAG,GAAG;AAClB,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,YAAY;AACrB;MAEa,UAAU,GAAG,CACxB,aAAsC,EACtC,IAA4E,KAC1E;AACF,IAAA,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC;IAC9C,MAAM,YAAY,GAAG,SAAS,CAAC,aAAa,EAAE,eAAe,CAAC;AAE9D,IAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,UAAiC,KAAI;QAChE,MAAM,QAAQ,GAAc,EAAE;QAC9B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,KAAI;YAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG;YAC1C,IAAI,KAAK,GAAG,IAAI;AAChB,YAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AACvC,gBAAA,KAAK,GAAG,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAC/D;AACA,YAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACtB,QAAA,CAAC,CAAC;QAEF,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AACrC,IAAA,CAAC,CAAC;AACJ;AAEO,MAAM,iBAAiB,GAAG,CAAC,aAAsC,KAA6B;AACnG,IAAA,MAAM,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG;IAC5E,IAAI,eAAe,EAAE;AACnB,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC;IAC3E;AACA,IAAA,OAAO,aAAa;AACtB;AAEO,MAAM,kBAAkB,GAAG,CAAC,aAAsC,KAA6B;AACpG,IAAA,MAAM,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG;IACrD,IAAI,eAAe,EAAE;AACnB,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC;IAC3E;AACA,IAAA,OAAO,aAAa;AACtB;AAEO,MAAM,oBAAoB,GAAG,CAAC,aAAsC,KAA+B;IACxG,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAClF,IAAA,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,KAAI;AACjC,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;AACxD,IAAA,CAAC,CAAC;AACJ;MAEa,cAAc,GAAG,CAAC,aAAsC,EAAE,GAAW,KAA+B;IAC/G,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChF,IAAA,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAI;AACtC,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC;AAC7D,IAAA,CAAC,CAAC;AACJ;MAEa,WAAW,GAAG,CACzB,OAAgC,EAChC,IAA6E,KAC3E;AACF,IAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AAC5C,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;AACvB,IAAA,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;IAC3B,IAAI,QAAQ,GAAG,KAAK;IACpB,OAAO,CAAC,QAAQ,EAAE;QAChB,MAAM,CAAC,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAA,CAAE;AAC9B,QAAA,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,EAAE;YACjG,KAAK,IAAI,CAAC;QACZ;aAAO;YACL,QAAQ,GAAG,IAAI;QACjB;IACF;AAEA,IAAA,OAAO,KAAK,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS;AAC/C;AAEO,MAAM,0BAA0B,GAAG,CACxC,cAAyE,EACzE,aAAsC,EACtC,WAAW,GAAG,KAAK,KACjB;IACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,OAAO;AAC1D,IAAA,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE;AAC1B,IAAA,IAAI,cAAc,GAAG,CAAC,GAAG,QAAQ,CAAC;IAClC,IAAI,WAAW,EAAE;QACf,cAAc,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IACzC;AACA,IAAA,MAAM,iBAAiB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;AAE7D,IAAA,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,UAAiC,KAAI;AAC7D,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU;AAC1B,aAAA,MAAM,CAAC,CAAC,GAAG,KAAK,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC/C,aAAA,MAAM,CACL,CAAC,GAAG,EAAE,GAAG,KAAI;YACX,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC;AAC1B,YAAA,OAAO,GAAG;QACZ,CAAC,EACD,EAAsC,CACvC;AACL,IAAA,CAAC,CAAC;AACJ;AAEA,oBAAe;IACb,cAAc;IACd,iBAAiB;IACjB,kBAAkB;IAClB,0BAA0B;IAC1B,oBAAoB;IACpB,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,SAAS;IACT,UAAU;CACX;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"datasetHelper.js","sources":["../../../../../../../../../src/dpr/utils/datasetHelper.ts"],"sourcesContent":["import { DashboardDataResponse } from '../types/Metrics'\nimport { components } from '../types/api'\nimport logger from './logger'\n\nexport const getDatasetRows = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { measures, filters, expectNulls } = listDefinition.columns\n logger.info('DEBUG: Dashboard vis filterValues:', filters)\n const keys = <Array<components['schemas']['DashboardVisualisationColumnDefinition']>>listDefinition.columns.keys\n\n const displayColumnsIds = measures.map((col) => col.id)\n const keyColumnsIds = keys?.map((col) => col.id) || []\n let filterColIds = filters?.map((col) => col.id) || []\n filterColIds = [...new Set(filterColIds)]\n const hasOptionalKeys = keys?.some((key) => key.optional)\n\n if (dashboardData.length && dashboardData[0]['ts']) keyColumnsIds.unshift('ts')\n\n const filtered = dashboardData.filter((datasetRow: DashboardDataResponse) => {\n const validRow: boolean[] = []\n\n Object.keys(datasetRow).forEach((fieldId) => {\n const value = datasetRow[fieldId].raw\n // All rows are valid until proven otherwise\n let valid = true\n\n // 1. check if the column value is equal to a defined column value\n if (filterColIds.includes(fieldId) && filters) {\n const filterValues = filters ? filters.filter((f) => f.id === fieldId).map((f) => f.equals) : []\n const validFilters: boolean[] = []\n filterValues.forEach((filterValue) => {\n if (filterValue === null) {\n validFilters.push(value === '' || value === undefined || value === null)\n } else {\n validFilters.push(filterValue === value)\n }\n })\n valid = validFilters.some(Boolean)\n\n // 3. check keys exist in the defined columns\n } else if (keyColumnsIds.includes(fieldId) && hasOptionalKeys) {\n valid = true\n\n // 3. check keys exist in the defined columns\n } else if (keyColumnsIds.includes(fieldId) && !hasOptionalKeys) {\n valid = value !== '' && value !== undefined && value !== null\n\n // 2. check values exist in the defined columns\n } else if (displayColumnsIds.includes(fieldId)) {\n valid = value !== '' && value !== undefined && value !== null\n\n // 3. check that all remaining columns are null.\n } else if (expectNulls) {\n valid = value === '' || value === undefined || value === null\n }\n\n validRow.push(valid)\n })\n\n return validRow.every((val) => val)\n })\n\n if (hasOptionalKeys) {\n return filterKeys(filtered, keys || [])\n }\n\n return filtered\n}\n\nexport const getKeyVariations = (keys: Array<components['schemas']['DashboardVisualisationColumnDefinition']>) => {\n const colIdVariations: string[][] = []\n const keyColumnsIds = keys.map((col) => col.id)\n const allOptional = keys.every((key) => key.optional)\n const colIdCopy = [...keyColumnsIds]\n\n keyColumnsIds.reverse().forEach((id) => {\n const key = keys.find((k) => k.id === id)\n colIdVariations.push([...colIdCopy])\n if (key && key.optional) {\n colIdCopy.pop()\n }\n })\n\n if (allOptional) colIdVariations.push([])\n return colIdVariations\n}\n\nexport const getKeyIds = (dashboardData: DashboardDataResponse[], colIdVariations: string[][]) => {\n let validHeadIds: string[] = []\n colIdVariations.every((ids: string[]) => {\n const validRows = []\n\n dashboardData.forEach((datasetRow: DashboardDataResponse) => {\n const validRow: boolean[] = []\n\n Object.keys(datasetRow).forEach((datasetField) => {\n const value = datasetRow[datasetField].raw\n let valid = true\n if (ids.includes(datasetField)) {\n valid = value !== '' && value !== undefined && value !== null\n }\n validRow.push(valid)\n })\n\n if (validRow.every((val) => val)) {\n validRows.push(datasetRow)\n }\n })\n\n if (validRows.length > 0) {\n validHeadIds = ids\n return false\n }\n validHeadIds = ids\n return true\n })\n\n return validHeadIds\n}\n\nexport const filterKeys = (\n dashboardData: DashboardDataResponse[],\n keys: Array<components['schemas']['DashboardVisualisationColumnDefinition']>,\n) => {\n const colIdVariations = getKeyVariations(keys)\n const validHeadIds = getKeyIds(dashboardData, colIdVariations)\n\n return dashboardData.filter((datasetRow: DashboardDataResponse) => {\n const validRow: boolean[] = []\n Object.keys(datasetRow).forEach((datasetField) => {\n const value = datasetRow[datasetField].raw\n let valid = true\n if (validHeadIds.includes(datasetField)) {\n valid = value !== '' && value !== undefined && value !== null\n }\n validRow.push(valid)\n })\n\n return validRow.every((val) => val)\n })\n}\n\nexport const getLastestDataset = (dashboardData: DashboardDataResponse[]): DashboardDataResponse[] => {\n const latestTimestamp = dashboardData[dashboardData.length - 1]?.['ts']?.raw\n if (latestTimestamp) {\n return dashboardData.filter((data) => data['ts'].raw === latestTimestamp)\n }\n return dashboardData\n}\n\nexport const getEarliestDataset = (dashboardData: DashboardDataResponse[]): DashboardDataResponse[] => {\n const latestTimestamp = dashboardData[0]?.['ts']?.raw\n if (latestTimestamp) {\n return dashboardData.filter((data) => data['ts'].raw === latestTimestamp)\n }\n return dashboardData\n}\n\nexport const groupRowsByTimestamp = (dashboardData: DashboardDataResponse[]): DashboardDataResponse[][] => {\n const uniqueTimestamps = [...new Set(dashboardData.map((item) => item['ts'].raw))]\n return uniqueTimestamps.map((ts) => {\n return dashboardData.filter((d) => d['ts'].raw === ts)\n })\n}\n\nexport const groupRowsByKey = (dashboardData: DashboardDataResponse[], key: string): DashboardDataResponse[][] => {\n const uniqueKeyValues = [...new Set(dashboardData.map((item) => item[key].raw))]\n return uniqueKeyValues.map((keyValue) => {\n return dashboardData.filter((d) => d[key].raw === keyValue)\n })\n}\n\nexport const groupRowsBy = (dashboardData: DashboardDataResponse[], groupIds: string[]): DashboardDataResponse[][] => {\n const grouped = dashboardData.reduce<Record<string, DashboardDataResponse[]>>((acc, row) => {\n // Create a unique composite key from the grouping fields\n const key = groupIds.map((id) => row[id]?.raw ?? '').join('|')\n\n // Build or append to the group\n acc[key] = acc[key] ? [...acc[key], row] : [row]\n\n return acc\n }, {})\n\n // Return the groups as an array of arrays\n return Object.values(grouped)\n}\n\nexport const getGroupKey = (\n rawData: DashboardDataResponse[],\n keys?: Array<components['schemas']['DashboardVisualisationColumnDefinition']>,\n) => {\n if (!keys || !keys.length || !rawData.length) {\n return undefined\n }\n\n const data = rawData[0]\n let index = keys.length - 1\n let keyFound = false\n while (!keyFound) {\n const k = `${keys[index]?.id}`\n if (k && index !== -1 && (!data[k] || !data[k].raw || data[k].raw === '' || data[k].raw === null)) {\n index -= 1\n } else {\n keyFound = true\n }\n }\n\n return index !== -1 ? keys[index] : undefined\n}\n\nexport const filterRowsByDisplayColumns = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n includeKeys = false,\n) => {\n const { keys: keyCols, measures } = listDefinition.columns\n const keys = keyCols || []\n let displayColumns = [...measures]\n if (includeKeys) {\n displayColumns = [...keys, ...measures]\n }\n const displayColumnsIds = displayColumns.map((col) => col.id)\n\n return dashboardData.map((datasetRow: DashboardDataResponse) => {\n return Object.keys(datasetRow)\n .filter((key) => displayColumnsIds.includes(key))\n .reduce(\n (acc, key) => {\n acc[key] = datasetRow[key]\n return acc\n },\n {} as unknown as DashboardDataResponse,\n )\n })\n}\n\nexport default {\n getDatasetRows,\n getLastestDataset,\n getEarliestDataset,\n filterRowsByDisplayColumns,\n groupRowsByTimestamp,\n groupRowsByKey,\n groupRowsBy,\n getGroupKey,\n getKeyVariations,\n getKeyIds,\n filterKeys,\n}\n"],"names":["logger"],"mappings":";;;;;;MAIa,cAAc,GAAG,CAC5B,cAAyE,EACzE,aAAsC,KACpC;IACF,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,OAAO;AACjE,IAAAA,cAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,OAAO,CAAC;AAC1D,IAAA,MAAM,IAAI,GAA2E,cAAc,CAAC,OAAO,CAAC,IAAI;AAEhH,IAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;AACvD,IAAA,MAAM,aAAa,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;AACtD,IAAA,IAAI,YAAY,GAAG,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;IACtD,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;AACzC,IAAA,MAAM,eAAe,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC;IAEzD,IAAI,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAAE,QAAA,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;IAE/E,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,UAAiC,KAAI;QAC1E,MAAM,QAAQ,GAAc,EAAE;QAE9B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG;;YAErC,IAAI,KAAK,GAAG,IAAI;;YAGhB,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE;AAC7C,gBAAA,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE;gBAChG,MAAM,YAAY,GAAc,EAAE;AAClC,gBAAA,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AACnC,oBAAA,IAAI,WAAW,KAAK,IAAI,EAAE;AACxB,wBAAA,YAAY,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;oBAC1E;yBAAO;AACL,wBAAA,YAAY,CAAC,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC;oBAC1C;AACF,gBAAA,CAAC,CAAC;AACF,gBAAA,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;;YAGpC;iBAAO,IAAI,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,eAAe,EAAE;gBAC7D,KAAK,GAAG,IAAI;;YAGd;iBAAO,IAAI,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE;AAC9D,gBAAA,KAAK,GAAG,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;;YAG/D;AAAO,iBAAA,IAAI,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC9C,gBAAA,KAAK,GAAG,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;;YAG/D;iBAAO,IAAI,WAAW,EAAE;AACtB,gBAAA,KAAK,GAAG,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAC/D;AAEA,YAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACtB,QAAA,CAAC,CAAC;QAEF,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AACrC,IAAA,CAAC,CAAC;IAEF,IAAI,eAAe,EAAE;QACnB,OAAO,UAAU,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;IACzC;AAEA,IAAA,OAAO,QAAQ;AACjB;AAEO,MAAM,gBAAgB,GAAG,CAAC,IAA4E,KAAI;IAC/G,MAAM,eAAe,GAAe,EAAE;AACtC,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;AAC/C,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC;AACrD,IAAA,MAAM,SAAS,GAAG,CAAC,GAAG,aAAa,CAAC;IAEpC,aAAa,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;AACrC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;AACpC,QAAA,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE;YACvB,SAAS,CAAC,GAAG,EAAE;QACjB;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,IAAI,WAAW;AAAE,QAAA,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;AACzC,IAAA,OAAO,eAAe;AACxB;MAEa,SAAS,GAAG,CAAC,aAAsC,EAAE,eAA2B,KAAI;IAC/F,IAAI,YAAY,GAAa,EAAE;AAC/B,IAAA,eAAe,CAAC,KAAK,CAAC,CAAC,GAAa,KAAI;QACtC,MAAM,SAAS,GAAG,EAAE;AAEpB,QAAA,aAAa,CAAC,OAAO,CAAC,CAAC,UAAiC,KAAI;YAC1D,MAAM,QAAQ,GAAc,EAAE;YAE9B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,KAAI;gBAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG;gBAC1C,IAAI,KAAK,GAAG,IAAI;AAChB,gBAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AAC9B,oBAAA,KAAK,GAAG,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;gBAC/D;AACA,gBAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACtB,YAAA,CAAC,CAAC;AAEF,YAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE;AAChC,gBAAA,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACxB,YAAY,GAAG,GAAG;AAClB,YAAA,OAAO,KAAK;QACd;QACA,YAAY,GAAG,GAAG;AAClB,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,YAAY;AACrB;MAEa,UAAU,GAAG,CACxB,aAAsC,EACtC,IAA4E,KAC1E;AACF,IAAA,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC;IAC9C,MAAM,YAAY,GAAG,SAAS,CAAC,aAAa,EAAE,eAAe,CAAC;AAE9D,IAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,UAAiC,KAAI;QAChE,MAAM,QAAQ,GAAc,EAAE;QAC9B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,KAAI;YAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG;YAC1C,IAAI,KAAK,GAAG,IAAI;AAChB,YAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AACvC,gBAAA,KAAK,GAAG,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAC/D;AACA,YAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACtB,QAAA,CAAC,CAAC;QAEF,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AACrC,IAAA,CAAC,CAAC;AACJ;AAEO,MAAM,iBAAiB,GAAG,CAAC,aAAsC,KAA6B;AACnG,IAAA,MAAM,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG;IAC5E,IAAI,eAAe,EAAE;AACnB,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC;IAC3E;AACA,IAAA,OAAO,aAAa;AACtB;AAEO,MAAM,kBAAkB,GAAG,CAAC,aAAsC,KAA6B;AACpG,IAAA,MAAM,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG;IACrD,IAAI,eAAe,EAAE;AACnB,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC;IAC3E;AACA,IAAA,OAAO,aAAa;AACtB;AAEO,MAAM,oBAAoB,GAAG,CAAC,aAAsC,KAA+B;IACxG,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAClF,IAAA,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,KAAI;AACjC,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;AACxD,IAAA,CAAC,CAAC;AACJ;MAEa,cAAc,GAAG,CAAC,aAAsC,EAAE,GAAW,KAA+B;IAC/G,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChF,IAAA,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAI;AACtC,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC;AAC7D,IAAA,CAAC,CAAC;AACJ;MAEa,WAAW,GAAG,CAAC,aAAsC,EAAE,QAAkB,KAA+B;IACnH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAA0C,CAAC,GAAG,EAAE,GAAG,KAAI;;QAEzF,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;QAG9D,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAEhD,QAAA,OAAO,GAAG;IACZ,CAAC,EAAE,EAAE,CAAC;;AAGN,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;AAC/B;MAEa,WAAW,GAAG,CACzB,OAAgC,EAChC,IAA6E,KAC3E;AACF,IAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AAC5C,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;AACvB,IAAA,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;IAC3B,IAAI,QAAQ,GAAG,KAAK;IACpB,OAAO,CAAC,QAAQ,EAAE;QAChB,MAAM,CAAC,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAA,CAAE;AAC9B,QAAA,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,EAAE;YACjG,KAAK,IAAI,CAAC;QACZ;aAAO;YACL,QAAQ,GAAG,IAAI;QACjB;IACF;AAEA,IAAA,OAAO,KAAK,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS;AAC/C;AAEO,MAAM,0BAA0B,GAAG,CACxC,cAAyE,EACzE,aAAsC,EACtC,WAAW,GAAG,KAAK,KACjB;IACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,OAAO;AAC1D,IAAA,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE;AAC1B,IAAA,IAAI,cAAc,GAAG,CAAC,GAAG,QAAQ,CAAC;IAClC,IAAI,WAAW,EAAE;QACf,cAAc,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IACzC;AACA,IAAA,MAAM,iBAAiB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;AAE7D,IAAA,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,UAAiC,KAAI;AAC7D,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU;AAC1B,aAAA,MAAM,CAAC,CAAC,GAAG,KAAK,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC/C,aAAA,MAAM,CACL,CAAC,GAAG,EAAE,GAAG,KAAI;YACX,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC;AAC1B,YAAA,OAAO,GAAG;QACZ,CAAC,EACD,EAAsC,CACvC;AACL,IAAA,CAAC,CAAC;AACJ;AAEA,oBAAe;IACb,cAAc;IACd,iBAAiB;IACjB,kBAAkB;IAClB,0BAA0B;IAC1B,oBAAoB;IACpB,cAAc;IACd,WAAW;IACX,WAAW;IACX,gBAAgB;IAChB,SAAS;IACT,UAAU;CACX;;;;;;;;;;;;;;;"}
@@ -109,10 +109,11 @@ class BarChart extends Chart {
109
109
  initListData = () => {
110
110
  this.xAxisColumn = this.measures.find((col) => col.axis === 'x');
111
111
  this.yAxisColumn = this.measures.find((col) => col.axis === 'y');
112
- this.groupKey = (DatasetHelper.getGroupKey(this.responseData, this.keys));
113
- this.groupsData = this.groupKey
114
- ? DatasetHelper.groupRowsByKey(this.responseData, this.groupKey.id)
115
- : [this.responseData];
112
+ this.groupKey = this.keys.map((key) => key.id);
113
+ this.groupsData =
114
+ this.groupKey && this.groupKey.length
115
+ ? DatasetHelper.groupRowsBy(this.responseData, this.groupKey)
116
+ : [this.responseData];
116
117
  };
117
118
  createListDatasets = () => {
118
119
  this.hexColours = new ChartColours().getHexPallette();
@@ -130,15 +131,7 @@ class BarChart extends Chart {
130
131
  data[dataIndex] = Number(raw);
131
132
  }
132
133
  });
133
- let label = '';
134
- if (this.groupKey) {
135
- const groupKeyId = this.groupKey.id;
136
- const groupRow = groupData[0];
137
- label = groupRow && groupRow[groupKeyId] ? `${groupRow[groupKeyId].raw}` : '';
138
- }
139
- else {
140
- label = this.yAxisColumn?.display || label;
141
- }
134
+ const label = this.createGroupLabel(groupData);
142
135
  return {
143
136
  label,
144
137
  data,
@@ -147,14 +140,31 @@ class BarChart extends Chart {
147
140
  };
148
141
  });
149
142
  };
143
+ createGroupLabel = (group) => {
144
+ if (this.groupKey && this.groupKey.length) {
145
+ const firstRow = group[0];
146
+ return this.groupKey
147
+ ? this.groupKey
148
+ .map((id) => {
149
+ const key = this.keys.find((k) => k.id === 'id');
150
+ const label = key && key.display ? `${key.display}:` : '';
151
+ const value = firstRow[id]?.raw ?? '';
152
+ return `${label}${value}`;
153
+ })
154
+ .join(' - ')
155
+ : '';
156
+ }
157
+ return this.yAxisColumn?.display || '';
158
+ };
150
159
  createListLabels = () => {
151
- this.labels = this.groupsData.flatMap((gd) => {
160
+ const allLabels = this.groupsData.flatMap((gd) => {
152
161
  const id = this.xAxisColumn?.id || '';
153
162
  return gd.map((row) => {
154
163
  const field = row[id];
155
164
  return field ? `${field.raw}` : '';
156
165
  });
157
166
  });
167
+ this.labels = Array.from(new Set(allLabels));
158
168
  };
159
169
  }
160
170