@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.
- package/_networkMocks/dashboard/data/complete-data/data.d.ts +6 -6
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/bar/vis-definitions/cols-as-labels.d.ts +4 -4
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/doughnut/vis-definitions/definitions.d.ts +12 -12
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/line-timeseries/vis-definitions/defintitions.d.ts +6 -6
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/vis-definitions/historic.d.ts +3 -3
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/list/vis-definitions/rows-as-list.d.ts +3 -3
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/matrix/vis-definitions/definitions.d.ts +1 -1
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/scorecard/vis-definitions/definitions-buckets.d.ts +6 -6
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/scorecard/vis-definitions/definitions.d.ts +7 -7
- package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/scorecardGroup/vis-definitions/definitions.d.ts +6 -6
- package/_networkMocks/dashboard/definitions/visualisations/partial-dataset/line-timeseries/vis-definitions/definitions.d.ts +5 -5
- package/_networkMocks/dashboard/definitions/visualisations/partial-dataset/list/vis-definitions/historic.d.ts +4 -4
- package/_networkMocks/dashboard/definitions/visualisations/partial-dataset/matrix/vis-definitions/definitions.d.ts +1 -1
- package/cjs/dpr/components/_charts/chart/bar/BarChart.js +24 -14
- package/cjs/dpr/components/_charts/chart/bar/BarChart.js.map +1 -1
- package/cjs/dpr/services/featureFlagService.js +2 -0
- package/cjs/dpr/services/featureFlagService.js.map +1 -1
- package/cjs/dpr/utils/datasetHelper.js +13 -0
- package/cjs/dpr/utils/datasetHelper.js.map +1 -1
- package/dpr/components/_charts/chart/bar/BarChart.js +24 -14
- package/dpr/components/_charts/chart/bar/BarChart.js.map +1 -1
- package/dpr/components/_charts/chart-card/view.njk +1 -0
- package/dpr/routes/journeys/download-report/request-download/form/form.njk +1 -1
- package/dpr/services/featureFlagService.js +2 -0
- package/dpr/services/featureFlagService.js.map +1 -1
- package/dpr/utils/datasetHelper.js +13 -1
- package/dpr/utils/datasetHelper.js.map +1 -1
- package/package.json +1 -1
- package/src/dpr/components/_charts/chart/bar/BarChart.d.ts +1 -0
- package/src/dpr/utils/datasetHelper.d.ts +2 -0
- package/test-app/mocks/mockClients/dashboards/data/age-breakdown/data.d.ts +8 -8
- package/test-app/mocks/mockClients/dashboards/data/data-quality-metrics/data.d.ts +6 -6
- package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/chart-definitions.d.ts +2 -2
- package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/index.d.ts +10 -10
- package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/list-definitions-1.d.ts +4 -4
- package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/list-definitions.d.ts +7 -7
- package/test-app/mocks/mockClients/dashboards/definitions/age-breakdown/visualisations/scorecard-definitions.d.ts +1 -1
- package/test-app/mocks/mockClients/dashboards/definitions/data-quality/chart-data.d.ts +2 -2
- package/test-app/mocks/mockClients/dashboards/definitions/data-quality/visualisations/chart-definitions.d.ts +8 -8
- package/test-app/mocks/mockClients/dashboards/definitions/data-quality/visualisations/index.d.ts +15 -15
- package/test-app/mocks/mockClients/dashboards/definitions/data-quality/visualisations/scorecard-definitions.d.ts +7 -7
- package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/bar.d.ts +3 -3
- package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/charts.d.ts +19 -19
- package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/doughnut.d.ts +4 -4
- package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/line.d.ts +2 -2
- package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/lists.d.ts +11 -11
- package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/scorecard.d.ts +13 -13
- package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/scorecards.d.ts +6 -6
- package/src/dpr/components/card-group/utils.d.ts +0 -24
- 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
|
-
|
|
15
|
+
has_metric_one: {
|
|
16
16
|
raw: number;
|
|
17
17
|
};
|
|
18
|
-
|
|
18
|
+
metric_one_is_missing: {
|
|
19
19
|
raw: number;
|
|
20
20
|
};
|
|
21
|
-
|
|
21
|
+
has_metric_two: {
|
|
22
22
|
raw: number;
|
|
23
23
|
};
|
|
24
|
-
|
|
24
|
+
metric_two_is_missing: {
|
|
25
25
|
raw: number;
|
|
26
26
|
};
|
|
27
|
-
|
|
27
|
+
has_metric_three: {
|
|
28
28
|
raw: number;
|
|
29
29
|
};
|
|
30
|
-
|
|
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
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
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
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
8
|
-
export declare const
|
|
9
|
-
export declare const
|
|
10
|
-
export declare const
|
|
11
|
-
export declare const
|
|
12
|
-
export declare const
|
|
13
|
-
export declare const
|
|
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
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
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
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
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
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
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
|
|
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
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
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
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
8
|
-
export declare const
|
|
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
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
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
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
8
|
-
export declare const
|
|
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
|
|
7
|
-
export declare const
|
|
8
|
-
export declare const
|
|
9
|
-
export declare const
|
|
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
|
|
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 =
|
|
117
|
-
this.groupsData =
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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":"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"}
|
|
@@ -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":"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"}
|
|
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":"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"}
|
|
@@ -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 =
|
|
113
|
-
this.groupsData =
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|