@ministryofjustice/hmpps-digital-prison-reporting-frontend 7.0.0 → 7.0.2
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/cjs/dpr/components/_charts/chart/Chart.js +6 -1
- package/cjs/dpr/components/_charts/chart/Chart.js.map +1 -1
- package/cjs/dpr/components/_charts/chart/ChartTimeseries.js +7 -3
- package/cjs/dpr/components/_charts/chart/ChartTimeseries.js.map +1 -1
- package/cjs/dpr/components/_charts/utils.js +3 -2
- package/cjs/dpr/components/_charts/utils.js.map +1 -1
- package/cjs/dpr/components/my-reports/utils.js +5 -1
- package/cjs/dpr/components/my-reports/utils.js.map +1 -1
- package/cjs/dpr/controllers/reportPolling/createReportPollingHandler.js +17 -2
- package/cjs/dpr/controllers/reportPolling/createReportPollingHandler.js.map +1 -1
- package/cjs/dpr/routes/journeys/my-reports/utils.js +29 -3
- package/cjs/dpr/routes/journeys/my-reports/utils.js.map +1 -1
- package/cjs/dpr/routes/journeys/request-missing-report/form/controller.js +1 -1
- package/cjs/dpr/routes/journeys/request-missing-report/form/controller.js.map +1 -1
- package/cjs/dpr/routes/journeys/request-report/status/controller.js +2 -1
- package/cjs/dpr/routes/journeys/request-report/status/controller.js.map +1 -1
- package/cjs/dpr/services/featureFlagService.js +3 -3
- package/cjs/dpr/services/featureFlagService.js.map +1 -1
- package/cjs/dpr/utils/captureError.js +38 -6
- package/cjs/dpr/utils/captureError.js.map +1 -1
- package/dpr/components/_charts/chart/Chart.js +6 -1
- package/dpr/components/_charts/chart/Chart.js.map +1 -1
- package/dpr/components/_charts/chart/ChartTimeseries.js +7 -3
- package/dpr/components/_charts/chart/ChartTimeseries.js.map +1 -1
- package/dpr/components/_charts/utils.js +3 -2
- package/dpr/components/_charts/utils.js.map +1 -1
- package/dpr/components/my-reports/utils.js +5 -1
- package/dpr/components/my-reports/utils.js.map +1 -1
- package/dpr/controllers/reportPolling/createReportPollingHandler.js +17 -2
- package/dpr/controllers/reportPolling/createReportPollingHandler.js.map +1 -1
- package/dpr/routes/journeys/my-reports/utils.js +30 -4
- package/dpr/routes/journeys/my-reports/utils.js.map +1 -1
- package/dpr/routes/journeys/request-missing-report/form/controller.js +1 -1
- package/dpr/routes/journeys/request-missing-report/form/controller.js.map +1 -1
- package/dpr/routes/journeys/request-report/status/controller.js +2 -1
- package/dpr/routes/journeys/request-report/status/controller.js.map +1 -1
- package/dpr/utils/captureError.js +20 -7
- package/dpr/utils/captureError.js.map +1 -1
- package/package.json +1 -1
- package/src/dpr/utils/captureError.d.ts +7 -1
|
@@ -103,7 +103,12 @@ class Chart {
|
|
|
103
103
|
createDatasetValues = (measures, row) => {
|
|
104
104
|
return measures.map(column => {
|
|
105
105
|
const rowId = column.id;
|
|
106
|
-
|
|
106
|
+
const value = row[rowId]?.raw;
|
|
107
|
+
if (!rowId || !value) {
|
|
108
|
+
return 0;
|
|
109
|
+
}
|
|
110
|
+
const numericValue = Number(value);
|
|
111
|
+
return Number.isNaN(numericValue) ? 0 : numericValue;
|
|
107
112
|
});
|
|
108
113
|
};
|
|
109
114
|
// -----------------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chart.js","sources":["../../../../../../../../../../../src/dpr/components/_charts/chart/Chart.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n DashboardVisualisationDataSet,\n VisualisationDefinitionKey,\n ChartMeasure,\n} from '../../_dashboards/dashboard-visualisation/types'\nimport { UnitType } from '../../_dashboards/dashboard-visualisation/Validate'\nimport ChartColoursHelper from './ChartColours'\nimport ChartLabelsHelper from './ChartLabels'\nimport { BarDefinitionMeasure } from './bar/types'\nimport ChartConfig from './chart-config'\nimport { LineDefinitionMeasure } from './line/types'\nimport DatasetHelper from '../../../utils/Dashboards/VisualisationDatasetHelper'\nimport { mapUnitToSymbol } from '../../../utils/Dashboards/VisualisationUnitHelper'\n\nclass Chart {\n labels: string[] = []\n\n datasets: DashboardVisualisationDataSet[] = []\n\n unit: UnitType | undefined\n\n responseData: DashboardDataResponse[] = []\n\n backgroundColor: string[][] = []\n\n borderWidth: number[] = [0, 0]\n\n borderColor: string[][] = []\n\n hexColours: string[] = []\n\n config = ChartConfig\n\n private xAxisColumn: BarDefinitionMeasure | LineDefinitionMeasure | undefined\n\n private yAxisColumn: BarDefinitionMeasure | LineDefinitionMeasure | undefined\n\n private groupedData: DashboardDataResponse[][] = []\n\n chartColoursHelper!: ChartColoursHelper\n\n chartLabelsHelper!: ChartLabelsHelper\n\n withData = (responseData: DashboardDataResponse[]) => {\n this.responseData = responseData\n this.initHelpers()\n return this\n }\n\n initUnit = (measures: ChartMeasure[]) => {\n this.unit = measures.find(m => m.unit)?.unit\n }\n\n initHelpers = () => {\n this.chartColoursHelper = new ChartColoursHelper()\n this.chartLabelsHelper = new ChartLabelsHelper()\n }\n\n // -----------------------------------------------------------------------------\n // Datasets\n // ----------------------------------------------------------------------------\n\n /**\n * Creates chart.js datasets where:\n * - where each row is a dataset\n * - each column name is an x axis label\n *\n * @param {ChartMeasure[]} measures\n * @param {VisualisationDefinitionKey[]} keys\n * @memberof Chart\n */\n createDatasets = (measures: ChartMeasure[], keys: VisualisationDefinitionKey[]) => {\n this.datasets = this.responseData.map((row, datasetIndex) => {\n const label = this.chartLabelsHelper.getDatasetLabel(keys, row)\n const data = this.createDatasetValues(measures, row)\n const total = data.reduce((acc: number, val: number) => acc + val, 0)\n\n return {\n label,\n data,\n total,\n ...this.setStyles(datasetIndex),\n }\n })\n this.labels = this.chartLabelsHelper.getLabels(measures)\n }\n\n /**\n * Creates chart.js datasets where:\n * - ecah column is a dataset\n * - each value in a column is an x axis label\n *\n * @param {ChartMeasure[]} measures\n * @param {VisualisationDefinitionKey[]} keys\n * @memberof Chart\n */\n createListDatasets = (measures: ChartMeasure[], keys: VisualisationDefinitionKey[]) => {\n this.xAxisColumn = measures.find((col: BarDefinitionMeasure | LineDefinitionMeasure) => col.axis === 'x')\n this.yAxisColumn = measures.find((col: BarDefinitionMeasure | LineDefinitionMeasure) => col.axis === 'y')\n const yId = this.yAxisColumn?.id || ''\n const xId = this.xAxisColumn?.id || ''\n const keyIds = keys.map(key => key.id)\n this.groupedData = keyIds.length ? DatasetHelper.groupRowsBy(this.responseData, keyIds) : [this.responseData]\n this.labels = this.chartLabelsHelper.getListLabels(this.groupedData, xId)\n\n this.datasets = this.groupedData.map((groupData, groupIndex) => {\n const data = Array(this.labels.length)\n groupData.forEach(row => {\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\n if (dataIndex !== -1) {\n data[dataIndex] = Number(raw)\n }\n })\n\n const label = this.chartLabelsHelper.getDatasetLabel(keys, groupData[0])\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 const unitSymbol = mapUnitToSymbol(this.yAxisColumn?.unit)\n this.labels = this.chartLabelsHelper.getListLabels(this.groupedData, xId, unitSymbol)\n }\n\n private createDatasetValues = (measures: ChartMeasure[], row: DashboardDataResponse) => {\n return measures.map(column => {\n const rowId = column.id\n return row[rowId] && row[rowId].raw ? Number(row[rowId].raw) : 0\n })\n }\n\n // -----------------------------------------------------------------------------\n // Styles\n // ----------------------------------------------------------------------------\n\n private setStyles = (datasetIndex: number) => {\n return this.chartColoursHelper.setColourStyles(datasetIndex)\n }\n\n // -----------------------------------------------------------------------------\n // Scales\n // ----------------------------------------------------------------------------\n\n setScales = (args?: { label?: string; horizontal?: boolean | undefined }) => {\n const labelText = args?.label || 'Total'\n const unitSymbol = mapUnitToSymbol(this.unit)\n const text = unitSymbol ? `${labelText} (${unitSymbol})` : labelText\n const title = {\n display: true,\n text,\n }\n\n const scales = {\n x: {\n ...(args?.horizontal && { title }),\n },\n y: {\n ...(!args?.horizontal && { title }),\n },\n }\n\n this.config = {\n ...this.config,\n scales,\n }\n }\n}\n\nexport { Chart }\nexport default Chart\n"],"names":["ChartConfig","ChartColoursHelper","ChartLabelsHelper","DatasetHelper","mapUnitToSymbol"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Chart.js","sources":["../../../../../../../../../../../src/dpr/components/_charts/chart/Chart.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n DashboardVisualisationDataSet,\n VisualisationDefinitionKey,\n ChartMeasure,\n} from '../../_dashboards/dashboard-visualisation/types'\nimport { UnitType } from '../../_dashboards/dashboard-visualisation/Validate'\nimport ChartColoursHelper from './ChartColours'\nimport ChartLabelsHelper from './ChartLabels'\nimport { BarDefinitionMeasure } from './bar/types'\nimport ChartConfig from './chart-config'\nimport { LineDefinitionMeasure } from './line/types'\nimport DatasetHelper from '../../../utils/Dashboards/VisualisationDatasetHelper'\nimport { mapUnitToSymbol } from '../../../utils/Dashboards/VisualisationUnitHelper'\n\nclass Chart {\n labels: string[] = []\n\n datasets: DashboardVisualisationDataSet[] = []\n\n unit: UnitType | undefined\n\n responseData: DashboardDataResponse[] = []\n\n backgroundColor: string[][] = []\n\n borderWidth: number[] = [0, 0]\n\n borderColor: string[][] = []\n\n hexColours: string[] = []\n\n config = ChartConfig\n\n private xAxisColumn: BarDefinitionMeasure | LineDefinitionMeasure | undefined\n\n private yAxisColumn: BarDefinitionMeasure | LineDefinitionMeasure | undefined\n\n private groupedData: DashboardDataResponse[][] = []\n\n chartColoursHelper!: ChartColoursHelper\n\n chartLabelsHelper!: ChartLabelsHelper\n\n withData = (responseData: DashboardDataResponse[]) => {\n this.responseData = responseData\n this.initHelpers()\n return this\n }\n\n initUnit = (measures: ChartMeasure[]) => {\n this.unit = measures.find(m => m.unit)?.unit\n }\n\n initHelpers = () => {\n this.chartColoursHelper = new ChartColoursHelper()\n this.chartLabelsHelper = new ChartLabelsHelper()\n }\n\n // -----------------------------------------------------------------------------\n // Datasets\n // ----------------------------------------------------------------------------\n\n /**\n * Creates chart.js datasets where:\n * - where each row is a dataset\n * - each column name is an x axis label\n *\n * @param {ChartMeasure[]} measures\n * @param {VisualisationDefinitionKey[]} keys\n * @memberof Chart\n */\n createDatasets = (measures: ChartMeasure[], keys: VisualisationDefinitionKey[]) => {\n this.datasets = this.responseData.map((row, datasetIndex) => {\n const label = this.chartLabelsHelper.getDatasetLabel(keys, row)\n const data = this.createDatasetValues(measures, row)\n const total = data.reduce((acc: number, val: number) => acc + val, 0)\n\n return {\n label,\n data,\n total,\n ...this.setStyles(datasetIndex),\n }\n })\n this.labels = this.chartLabelsHelper.getLabels(measures)\n }\n\n /**\n * Creates chart.js datasets where:\n * - ecah column is a dataset\n * - each value in a column is an x axis label\n *\n * @param {ChartMeasure[]} measures\n * @param {VisualisationDefinitionKey[]} keys\n * @memberof Chart\n */\n createListDatasets = (measures: ChartMeasure[], keys: VisualisationDefinitionKey[]) => {\n this.xAxisColumn = measures.find((col: BarDefinitionMeasure | LineDefinitionMeasure) => col.axis === 'x')\n this.yAxisColumn = measures.find((col: BarDefinitionMeasure | LineDefinitionMeasure) => col.axis === 'y')\n const yId = this.yAxisColumn?.id || ''\n const xId = this.xAxisColumn?.id || ''\n const keyIds = keys.map(key => key.id)\n this.groupedData = keyIds.length ? DatasetHelper.groupRowsBy(this.responseData, keyIds) : [this.responseData]\n this.labels = this.chartLabelsHelper.getListLabels(this.groupedData, xId)\n\n this.datasets = this.groupedData.map((groupData, groupIndex) => {\n const data = Array(this.labels.length)\n groupData.forEach(row => {\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\n if (dataIndex !== -1) {\n data[dataIndex] = Number(raw)\n }\n })\n\n const label = this.chartLabelsHelper.getDatasetLabel(keys, groupData[0])\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 const unitSymbol = mapUnitToSymbol(this.yAxisColumn?.unit)\n this.labels = this.chartLabelsHelper.getListLabels(this.groupedData, xId, unitSymbol)\n }\n\n private createDatasetValues = (measures: ChartMeasure[], row: DashboardDataResponse) => {\n return measures.map(column => {\n const rowId = column.id\n const value = row[rowId]?.raw\n\n if (!rowId || !value) {\n return 0\n }\n\n const numericValue = Number(value)\n return Number.isNaN(numericValue) ? 0 : numericValue\n })\n }\n\n // -----------------------------------------------------------------------------\n // Styles\n // ----------------------------------------------------------------------------\n\n private setStyles = (datasetIndex: number) => {\n return this.chartColoursHelper.setColourStyles(datasetIndex)\n }\n\n // -----------------------------------------------------------------------------\n // Scales\n // ----------------------------------------------------------------------------\n\n setScales = (args?: { label?: string; horizontal?: boolean | undefined }) => {\n const labelText = args?.label || 'Total'\n const unitSymbol = mapUnitToSymbol(this.unit)\n const text = unitSymbol ? `${labelText} (${unitSymbol})` : labelText\n const title = {\n display: true,\n text,\n }\n\n const scales = {\n x: {\n ...(args?.horizontal && { title }),\n },\n y: {\n ...(!args?.horizontal && { title }),\n },\n }\n\n this.config = {\n ...this.config,\n scales,\n }\n }\n}\n\nexport { Chart }\nexport default Chart\n"],"names":["ChartConfig","ChartColoursHelper","ChartLabelsHelper","DatasetHelper","mapUnitToSymbol"],"mappings":"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"}
|
|
@@ -60,9 +60,13 @@ class TimeseriesChart {
|
|
|
60
60
|
this.chartColoursHelper = new ChartColours();
|
|
61
61
|
for (let index = 0; index < this.datasetCount; index += 1) {
|
|
62
62
|
const data = this.timeBlockData.map(timeperiod => {
|
|
63
|
-
const valueId = this.measures[1]
|
|
64
|
-
const
|
|
65
|
-
|
|
63
|
+
const valueId = this.measures[1]?.id;
|
|
64
|
+
const value = timeperiod[index]?.[valueId]?.raw;
|
|
65
|
+
if (value == null || valueId == null) {
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
const numericValue = Number(value);
|
|
69
|
+
return Number.isNaN(numericValue) ? 0 : numericValue;
|
|
66
70
|
});
|
|
67
71
|
const total = data.reduce((a, c) => a + c, 0);
|
|
68
72
|
const label = this.chartLabelsHelper.getDatasetLabel(this.keys, this.timeBlockData[0][index]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartTimeseries.js","sources":["../../../../../../../../../../../src/dpr/components/_charts/chart/ChartTimeseries.ts"],"sourcesContent":["import logger from 'src/dpr/utils/logger'\nimport { components } from '../../../types/api'\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n DashboardVisualisationDataSet,\n TimeseriesChartMeasure,\n VisualisationDefinitionKey,\n} from '../../_dashboards/dashboard-visualisation/types'\nimport DatasetHelper, { getTimestampMeasure, getDateValue } from '../../../utils/Dashboards/VisualisationDatasetHelper'\nimport { BarTimeseriesDefinitionMeasure, BarTimeseriesDefinitionType } from './bar-timeseries/types'\nimport { LineTimeseriesDefinitionMeasure, LineTimeseriesDefinitionType } from './line-timeseries/types'\nimport ChartColoursHelper from './ChartColours'\nimport ChartConfig from './chart-config'\nimport { PartialDate } from '../../_filters/types'\nimport ChartLabelsHelper from './ChartLabels'\n\nclass TimeseriesChart {\n id!: string\n\n labels: string[] = []\n\n datasets: DashboardVisualisationDataSet[] = []\n\n unit: 'NUMBER' | 'PERCENTAGE' | undefined\n\n responseData: DashboardDataResponse[] = []\n\n measures: TimeseriesChartMeasure = []\n\n keys: VisualisationDefinitionKey[] = []\n\n timeBlockData: DashboardDataResponse[][] = []\n\n groupKey: LineTimeseriesDefinitionMeasure | BarTimeseriesDefinitionMeasure | undefined\n\n datasetCount = 0\n\n hexColours: string[] = []\n\n config = ChartConfig\n\n partialDate: PartialDate | undefined\n\n chartColoursHelper!: ChartColoursHelper\n\n chartLabelsHelper!: ChartLabelsHelper\n\n withData = (responseData: DashboardDataResponse[]) => {\n this.responseData = responseData\n this.initHelpers()\n this.initFromData()\n return this\n }\n\n initHelpers = () => {\n this.chartColoursHelper = new ChartColoursHelper()\n this.chartLabelsHelper = new ChartLabelsHelper()\n }\n\n initFromDefinition = (definition: BarTimeseriesDefinitionType | LineTimeseriesDefinitionType) => {\n logger.debug('Building Dashboard Visualisation: ', JSON.stringify(definition))\n\n this.id = definition.id\n this.measures = definition.columns.measures\n this.keys = definition.columns.keys || []\n this.unit = this.measures.find(m => m.unit)?.unit\n }\n\n withPartialDate = (partialDate?: PartialDate) => {\n this.partialDate = partialDate\n return this\n }\n\n initFromData = () => {\n this.groupKey = DatasetHelper.getGroupKey(\n this.responseData,\n <Array<components['schemas']['DashboardVisualisationColumnDefinition']>>this.keys,\n ) as LineTimeseriesDefinitionMeasure | BarTimeseriesDefinitionMeasure | undefined\n const dateMeasure = DatasetHelper.getTimestampMeasure(\n <components['schemas']['DashboardVisualisationColumnDefinition'][]>this.measures,\n )\n\n if (!dateMeasure) {\n logger.debug(this.id, JSON.stringify(this.measures))\n throw new Error(`${this.id}: No timestamp field in definition`)\n }\n\n this.timeBlockData = DatasetHelper.groupRowsByTimestamp(this.responseData, dateMeasure)\n this.labels = this.getLabels()\n this.datasetCount = this.timeBlockData[0]?.length\n }\n\n buildDatasets = () => {\n this.chartColoursHelper = new ChartColoursHelper()\n for (let index = 0; index < this.datasetCount; index += 1) {\n const data = this.timeBlockData.map(timeperiod => {\n const valueId = this.measures[1]
|
|
1
|
+
{"version":3,"file":"ChartTimeseries.js","sources":["../../../../../../../../../../../src/dpr/components/_charts/chart/ChartTimeseries.ts"],"sourcesContent":["import logger from 'src/dpr/utils/logger'\nimport { components } from '../../../types/api'\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n DashboardVisualisationDataSet,\n TimeseriesChartMeasure,\n VisualisationDefinitionKey,\n} from '../../_dashboards/dashboard-visualisation/types'\nimport DatasetHelper, { getTimestampMeasure, getDateValue } from '../../../utils/Dashboards/VisualisationDatasetHelper'\nimport { BarTimeseriesDefinitionMeasure, BarTimeseriesDefinitionType } from './bar-timeseries/types'\nimport { LineTimeseriesDefinitionMeasure, LineTimeseriesDefinitionType } from './line-timeseries/types'\nimport ChartColoursHelper from './ChartColours'\nimport ChartConfig from './chart-config'\nimport { PartialDate } from '../../_filters/types'\nimport ChartLabelsHelper from './ChartLabels'\n\nclass TimeseriesChart {\n id!: string\n\n labels: string[] = []\n\n datasets: DashboardVisualisationDataSet[] = []\n\n unit: 'NUMBER' | 'PERCENTAGE' | undefined\n\n responseData: DashboardDataResponse[] = []\n\n measures: TimeseriesChartMeasure = []\n\n keys: VisualisationDefinitionKey[] = []\n\n timeBlockData: DashboardDataResponse[][] = []\n\n groupKey: LineTimeseriesDefinitionMeasure | BarTimeseriesDefinitionMeasure | undefined\n\n datasetCount = 0\n\n hexColours: string[] = []\n\n config = ChartConfig\n\n partialDate: PartialDate | undefined\n\n chartColoursHelper!: ChartColoursHelper\n\n chartLabelsHelper!: ChartLabelsHelper\n\n withData = (responseData: DashboardDataResponse[]) => {\n this.responseData = responseData\n this.initHelpers()\n this.initFromData()\n return this\n }\n\n initHelpers = () => {\n this.chartColoursHelper = new ChartColoursHelper()\n this.chartLabelsHelper = new ChartLabelsHelper()\n }\n\n initFromDefinition = (definition: BarTimeseriesDefinitionType | LineTimeseriesDefinitionType) => {\n logger.debug('Building Dashboard Visualisation: ', JSON.stringify(definition))\n\n this.id = definition.id\n this.measures = definition.columns.measures\n this.keys = definition.columns.keys || []\n this.unit = this.measures.find(m => m.unit)?.unit\n }\n\n withPartialDate = (partialDate?: PartialDate) => {\n this.partialDate = partialDate\n return this\n }\n\n initFromData = () => {\n this.groupKey = DatasetHelper.getGroupKey(\n this.responseData,\n <Array<components['schemas']['DashboardVisualisationColumnDefinition']>>this.keys,\n ) as LineTimeseriesDefinitionMeasure | BarTimeseriesDefinitionMeasure | undefined\n const dateMeasure = DatasetHelper.getTimestampMeasure(\n <components['schemas']['DashboardVisualisationColumnDefinition'][]>this.measures,\n )\n\n if (!dateMeasure) {\n logger.debug(this.id, JSON.stringify(this.measures))\n throw new Error(`${this.id}: No timestamp field in definition`)\n }\n\n this.timeBlockData = DatasetHelper.groupRowsByTimestamp(this.responseData, dateMeasure)\n this.labels = this.getLabels()\n this.datasetCount = this.timeBlockData[0]?.length\n }\n\n buildDatasets = () => {\n this.chartColoursHelper = new ChartColoursHelper()\n\n for (let index = 0; index < this.datasetCount; index += 1) {\n const data = this.timeBlockData.map(timeperiod => {\n const valueId = this.measures[1]?.id\n const value = timeperiod[index]?.[valueId]?.raw\n\n if (value == null || valueId == null) {\n return 0\n }\n\n const numericValue = Number(value)\n return Number.isNaN(numericValue) ? 0 : numericValue\n })\n\n const total = data.reduce((a, c) => a + c, 0)\n const label = this.chartLabelsHelper.getDatasetLabel(this.keys, this.timeBlockData[0][index])\n\n this.datasets.push({\n data,\n label,\n total,\n })\n }\n }\n\n private getLabels = () => {\n return this.timeBlockData\n .map((data: DashboardDataResponse[]) => {\n const dateColumn = getTimestampMeasure(\n <components['schemas']['DashboardVisualisationColumnDefinition'][]>this.measures,\n )\n const dateData = getDateValue(data, dateColumn)\n\n if (!dateData) return undefined\n\n return dateData.value\n })\n .filter((v): v is string => Boolean(v))\n }\n}\n\nexport { TimeseriesChart }\nexport default TimeseriesChart\n"],"names":["ChartConfig","ChartColoursHelper","ChartLabelsHelper","logger","DatasetHelper","getTimestampMeasure","getDateValue"],"mappings":"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"}
|
|
@@ -142,13 +142,14 @@ const createHeadlines = (chartDefinition, data, timeseries = false) => {
|
|
|
142
142
|
headlineColumn = measures.find(col => col.type !== 'timestamp');
|
|
143
143
|
if (headlineColumn) {
|
|
144
144
|
const { id } = headlineColumn;
|
|
145
|
-
const
|
|
145
|
+
const rawValue = data[0][id]?.raw;
|
|
146
146
|
const dateColumn = VisualisationDatasetHelper.getTimestampMeasure(measures);
|
|
147
147
|
const dateData = VisualisationDatasetHelper.getDateValue(data, dateColumn);
|
|
148
148
|
if (dateData) {
|
|
149
149
|
label = dateData.value;
|
|
150
150
|
}
|
|
151
|
-
|
|
151
|
+
const numericValue = Number(rawValue);
|
|
152
|
+
value = Number.isNaN(numericValue) ? undefined : numericValue;
|
|
152
153
|
if (value) {
|
|
153
154
|
headline = {
|
|
154
155
|
label,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../../../../../../../src/dpr/components/_charts/utils.ts"],"sourcesContent":["import dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport { components } from '../../types/api'\nimport { ChartDetails, ChartMetaData } from '../../types/Charts'\nimport { DashboardDataResponse } from '../../types/Metrics'\nimport DatasetHelper, {\n getTimestampColumn,\n getTimestampMeasure,\n getDateValue,\n} from '../../utils/Dashboards/VisualisationDatasetHelper'\nimport { mapUnitToSymbol } from '../../utils/Dashboards/VisualisationUnitHelper'\nimport DashboardListUtils from '../_dashboards/dashboard-list/utils'\nimport {\n DashboardVisualisationData,\n DashboardVisualisationType,\n DashboardVisualisatonCardData,\n MoJTable,\n} from '../_dashboards/dashboard-visualisation/types'\nimport { UnitType } from '../_dashboards/dashboard-visualisation/Validate'\nimport { PartialDate } from '../_filters/types'\nimport { Granularity } from '../_inputs/granular-date-range/types'\nimport BarTimeseriesChart from './chart/bar-timeseries/BarTimeseriesChart'\nimport BarChart from './chart/bar/BarChart'\nimport DoughnutChart from './chart/doughnut/DoughnutChart'\nimport HeatmapChart from './chart/heatmap/HeatmapChart'\nimport LineTimeseriesChart from './chart/line-timeseries/LineTimeseriesChart'\nimport LineChart from './chart/line/LineChart'\n\ndayjs.extend(weekOfYear)\n\nexport const createChart = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n type: components['schemas']['DashboardVisualisationDefinition']['type'],\n): DashboardVisualisatonCardData | undefined => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\n\n const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n switch (type) {\n case DashboardVisualisationType.BAR:\n chart = new BarChart().withDefinition(chartDefinition).withData(snapshotData).build()\n break\n case DashboardVisualisationType.DONUT:\n chart = new DoughnutChart().withDefinition(chartDefinition).withData(snapshotData).build()\n break\n case DashboardVisualisationType.LINE:\n chart = new LineChart().withDefinition(chartDefinition).withData(snapshotData).build()\n break\n default:\n break\n }\n\n table = createSnapshotTable(chartDefinition, dataSetRows)\n details = getChartDetails(chartDefinition, dataSetRows)\n }\n\n return {\n details,\n table,\n chart,\n }\n}\n\nexport const createTimeseriesCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n type: components['schemas']['DashboardVisualisationDefinition']['type'],\n query: Record<string, string | string[]>,\n partialDate?: PartialDate,\n) => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\n let granularity: Granularity = Granularity.DAILY\n\n if (query) {\n Object.keys(query).forEach(key => {\n if (key.includes('granularity')) {\n granularity = <Granularity>query[key]\n }\n })\n }\n\n const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)\n\n if (dataSetRows.length) {\n switch (type) {\n case DashboardVisualisationType.MATRIX_TIMESERIES:\n chart = new HeatmapChart()\n .withDefinition(chartDefinition)\n .withGranularity(granularity)\n .withData(timeseriesData)\n .build()\n break\n case DashboardVisualisationType.LINE_TIMESERIES:\n chart = new LineTimeseriesChart()\n .withDefinition(chartDefinition)\n .withData(timeseriesData)\n .withPartialDate(partialDate)\n .build()\n break\n case DashboardVisualisationType.BAR_TIMESERIES:\n chart = new BarTimeseriesChart()\n .withDefinition(chartDefinition)\n .withData(timeseriesData)\n .withPartialDate(partialDate)\n .build()\n break\n default:\n break\n }\n\n table = createTimeseriesTable(chartDefinition, timeseriesData)\n details = getChartDetails(chartDefinition, latestData, true)\n }\n\n return {\n details,\n table,\n chart,\n }\n}\n\nconst getDataForSnapshotCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const { columns } = chartDefinition\n const dateColumn = DatasetHelper.getTimestampColumn(columns)\n\n const data = DatasetHelper.getLastestDataset(rawData, dateColumn)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, data)\n const snapshotData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n dataSetRows,\n snapshotData,\n }\n}\n\nconst getDataForTimeseriesCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const dateMeasure = DatasetHelper.getTimestampMeasure(chartDefinition.columns.measures)\n const latestData = DatasetHelper.getLastestDataset(rawData, dateMeasure)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, rawData)\n const timeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n latestData,\n dataSetRows,\n timeseriesData,\n }\n}\n\nconst getChartDetails = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n timeseries = false,\n): ChartDetails => {\n const { columns } = chartDefinition\n const meta: ChartMetaData[] = []\n const headlines: ChartMetaData[] = createHeadlines(chartDefinition, data, timeseries)\n\n const dateColumn = getTimestampColumn(columns)\n const dateData = getDateValue(data, dateColumn)\n\n if (dateData) {\n const { value } = dateData\n meta.push({\n label: 'Values for:',\n value,\n })\n }\n\n return {\n meta,\n headlines,\n }\n}\n\nconst createHeadlines = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!measures.find(col => col.axis)\n let headline: ChartMetaData | undefined\n let headlineColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n let value: number | undefined\n let label: string = ''\n\n if (timeseries) {\n headlineColumn = measures.find(col => col.type !== 'timestamp')\n\n if (headlineColumn) {\n const { id } = headlineColumn\n const { raw } = data[0][id]\n\n const dateColumn = getTimestampMeasure(measures)\n const dateData = getDateValue(data, dateColumn)\n\n if (dateData) {\n label = dateData.value\n }\n\n value = raw ? Number(raw) : undefined\n\n if (value) {\n headline = {\n label,\n value,\n }\n }\n }\n } else {\n headlineColumn = !isListChart ? measures[0] : measures.find(col => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n const display = headlineColumn.display?.toLowerCase()\n label = display ? `Total ${display}` : 'Total'\n value = data.reduce((acc: number, d: DashboardDataResponse) => {\n if (headlineColumn) {\n const { id } = headlineColumn\n const { raw } = d[id]\n if (raw) {\n return acc + Number(raw)\n }\n }\n return acc\n }, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n if (headline) headlines.push(headline)\n\n return headlines\n}\n\nconst mapTableHead = (headerColumns: components['schemas']['DashboardVisualisationColumnDefinition'][]) => {\n return headerColumns.map(column => {\n const unitSymbol = mapUnitToSymbol(column.unit as UnitType)\n const headText = unitSymbol ? `${column.display} (${unitSymbol})` : column.display\n return { text: headText || '' }\n })\n}\n\nconst createSnapshotTable = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { measures } = columns\n const keys = columns.keys || []\n const head = mapTableHead([...keys, ...measures])\n\n const filteredRowData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, data, true)\n const rows = DashboardListUtils.createTableRows(filteredRowData)\n\n return {\n head,\n rows,\n }\n}\n\n/**\n * Creates the a table representation for a timeseries chart\n * - ensures the Date column is always at index 0 when there are multiple rows\n *\n * @param {components['schemas']['DashboardVisualisationDefinition']} chartDefinition\n * @param {DashboardDataResponse[]} timeseriesData\n * @return {*} {MoJTable}\n */\nconst createTimeseriesTable = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n timeseriesData: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures = [] } = columns\n\n const safeKeys = keys ?? []\n let flatTimeseriesData = timeseriesData.flat()\n\n let tableColumns: components['schemas']['DashboardVisualisationColumnDefinition'][]\n\n if (timeseriesData.length > 1) {\n const tsMeasures = measures.filter(m => m.type === 'timestamp')\n\n if (tsMeasures.length !== 1) {\n throw new Error('Multi-timeseries tables require exactly one date measure')\n }\n\n const [tsColumn] = tsMeasures\n const valueColumns = measures.filter(m => m.id !== tsColumn.id)\n\n tableColumns = [tsColumn, ...safeKeys, ...valueColumns]\n } else {\n flatTimeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, flatTimeseriesData)\n tableColumns = measures\n }\n\n const head = mapTableHead(tableColumns)\n const rows = DashboardListUtils.createTableRows(flatTimeseriesData, tableColumns)\n\n return { head, rows }\n}\n\nexport type GetDateValueResponse = {\n measure: components['schemas']['DashboardVisualisationColumnDefinition']\n value: string\n}\n\nexport default {\n createChart,\n createTimeseriesCharts,\n}\n"],"names":["DashboardVisualisationType","BarChart","DoughnutChart","LineChart","Granularity","HeatmapChart","LineTimeseriesChart","BarTimeseriesChart","DatasetHelper","getTimestampColumn","getDateValue","getTimestampMeasure","mapUnitToSymbol","DashboardListUtils"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../../../../../../../src/dpr/components/_charts/utils.ts"],"sourcesContent":["import dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport { components } from '../../types/api'\nimport { ChartDetails, ChartMetaData } from '../../types/Charts'\nimport { DashboardDataResponse } from '../../types/Metrics'\nimport DatasetHelper, {\n getTimestampColumn,\n getTimestampMeasure,\n getDateValue,\n} from '../../utils/Dashboards/VisualisationDatasetHelper'\nimport { mapUnitToSymbol } from '../../utils/Dashboards/VisualisationUnitHelper'\nimport DashboardListUtils from '../_dashboards/dashboard-list/utils'\nimport {\n DashboardVisualisationData,\n DashboardVisualisationType,\n DashboardVisualisatonCardData,\n MoJTable,\n} from '../_dashboards/dashboard-visualisation/types'\nimport { UnitType } from '../_dashboards/dashboard-visualisation/Validate'\nimport { PartialDate } from '../_filters/types'\nimport { Granularity } from '../_inputs/granular-date-range/types'\nimport BarTimeseriesChart from './chart/bar-timeseries/BarTimeseriesChart'\nimport BarChart from './chart/bar/BarChart'\nimport DoughnutChart from './chart/doughnut/DoughnutChart'\nimport HeatmapChart from './chart/heatmap/HeatmapChart'\nimport LineTimeseriesChart from './chart/line-timeseries/LineTimeseriesChart'\nimport LineChart from './chart/line/LineChart'\n\ndayjs.extend(weekOfYear)\n\nexport const createChart = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n type: components['schemas']['DashboardVisualisationDefinition']['type'],\n): DashboardVisualisatonCardData | undefined => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\n\n const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n switch (type) {\n case DashboardVisualisationType.BAR:\n chart = new BarChart().withDefinition(chartDefinition).withData(snapshotData).build()\n break\n case DashboardVisualisationType.DONUT:\n chart = new DoughnutChart().withDefinition(chartDefinition).withData(snapshotData).build()\n break\n case DashboardVisualisationType.LINE:\n chart = new LineChart().withDefinition(chartDefinition).withData(snapshotData).build()\n break\n default:\n break\n }\n\n table = createSnapshotTable(chartDefinition, dataSetRows)\n details = getChartDetails(chartDefinition, dataSetRows)\n }\n\n return {\n details,\n table,\n chart,\n }\n}\n\nexport const createTimeseriesCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n type: components['schemas']['DashboardVisualisationDefinition']['type'],\n query: Record<string, string | string[]>,\n partialDate?: PartialDate,\n) => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\n let granularity: Granularity = Granularity.DAILY\n\n if (query) {\n Object.keys(query).forEach(key => {\n if (key.includes('granularity')) {\n granularity = <Granularity>query[key]\n }\n })\n }\n\n const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)\n\n if (dataSetRows.length) {\n switch (type) {\n case DashboardVisualisationType.MATRIX_TIMESERIES:\n chart = new HeatmapChart()\n .withDefinition(chartDefinition)\n .withGranularity(granularity)\n .withData(timeseriesData)\n .build()\n break\n case DashboardVisualisationType.LINE_TIMESERIES:\n chart = new LineTimeseriesChart()\n .withDefinition(chartDefinition)\n .withData(timeseriesData)\n .withPartialDate(partialDate)\n .build()\n break\n case DashboardVisualisationType.BAR_TIMESERIES:\n chart = new BarTimeseriesChart()\n .withDefinition(chartDefinition)\n .withData(timeseriesData)\n .withPartialDate(partialDate)\n .build()\n break\n default:\n break\n }\n\n table = createTimeseriesTable(chartDefinition, timeseriesData)\n details = getChartDetails(chartDefinition, latestData, true)\n }\n\n return {\n details,\n table,\n chart,\n }\n}\n\nconst getDataForSnapshotCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const { columns } = chartDefinition\n const dateColumn = DatasetHelper.getTimestampColumn(columns)\n\n const data = DatasetHelper.getLastestDataset(rawData, dateColumn)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, data)\n const snapshotData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n dataSetRows,\n snapshotData,\n }\n}\n\nconst getDataForTimeseriesCharts = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const dateMeasure = DatasetHelper.getTimestampMeasure(chartDefinition.columns.measures)\n const latestData = DatasetHelper.getLastestDataset(rawData, dateMeasure)\n const dataSetRows = DatasetHelper.getDatasetRows(chartDefinition, rawData)\n const timeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, dataSetRows, true)\n\n return {\n latestData,\n dataSetRows,\n timeseriesData,\n }\n}\n\nconst getChartDetails = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n timeseries = false,\n): ChartDetails => {\n const { columns } = chartDefinition\n const meta: ChartMetaData[] = []\n const headlines: ChartMetaData[] = createHeadlines(chartDefinition, data, timeseries)\n\n const dateColumn = getTimestampColumn(columns)\n const dateData = getDateValue(data, dateColumn)\n\n if (dateData) {\n const { value } = dateData\n meta.push({\n label: 'Values for:',\n value,\n })\n }\n\n return {\n meta,\n headlines,\n }\n}\n\nconst createHeadlines = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!measures.find(col => col.axis)\n let headline: ChartMetaData | undefined\n let headlineColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n let value: number | undefined\n let label: string = ''\n\n if (timeseries) {\n headlineColumn = measures.find(col => col.type !== 'timestamp')\n\n if (headlineColumn) {\n const { id } = headlineColumn\n const rawValue = data[0][id]?.raw\n\n const dateColumn = getTimestampMeasure(measures)\n const dateData = getDateValue(data, dateColumn)\n\n if (dateData) {\n label = dateData.value\n }\n\n const numericValue = Number(rawValue)\n value = Number.isNaN(numericValue) ? undefined : numericValue\n\n if (value) {\n headline = {\n label,\n value,\n }\n }\n }\n } else {\n headlineColumn = !isListChart ? measures[0] : measures.find(col => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n const display = headlineColumn.display?.toLowerCase()\n label = display ? `Total ${display}` : 'Total'\n value = data.reduce((acc: number, d: DashboardDataResponse) => {\n if (headlineColumn) {\n const { id } = headlineColumn\n const { raw } = d[id]\n if (raw) {\n return acc + Number(raw)\n }\n }\n return acc\n }, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n if (headline) headlines.push(headline)\n\n return headlines\n}\n\nconst mapTableHead = (headerColumns: components['schemas']['DashboardVisualisationColumnDefinition'][]) => {\n return headerColumns.map(column => {\n const unitSymbol = mapUnitToSymbol(column.unit as UnitType)\n const headText = unitSymbol ? `${column.display} (${unitSymbol})` : column.display\n return { text: headText || '' }\n })\n}\n\nconst createSnapshotTable = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { measures } = columns\n const keys = columns.keys || []\n const head = mapTableHead([...keys, ...measures])\n\n const filteredRowData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, data, true)\n const rows = DashboardListUtils.createTableRows(filteredRowData)\n\n return {\n head,\n rows,\n }\n}\n\n/**\n * Creates the a table representation for a timeseries chart\n * - ensures the Date column is always at index 0 when there are multiple rows\n *\n * @param {components['schemas']['DashboardVisualisationDefinition']} chartDefinition\n * @param {DashboardDataResponse[]} timeseriesData\n * @return {*} {MoJTable}\n */\nconst createTimeseriesTable = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n timeseriesData: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures = [] } = columns\n\n const safeKeys = keys ?? []\n let flatTimeseriesData = timeseriesData.flat()\n\n let tableColumns: components['schemas']['DashboardVisualisationColumnDefinition'][]\n\n if (timeseriesData.length > 1) {\n const tsMeasures = measures.filter(m => m.type === 'timestamp')\n\n if (tsMeasures.length !== 1) {\n throw new Error('Multi-timeseries tables require exactly one date measure')\n }\n\n const [tsColumn] = tsMeasures\n const valueColumns = measures.filter(m => m.id !== tsColumn.id)\n\n tableColumns = [tsColumn, ...safeKeys, ...valueColumns]\n } else {\n flatTimeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, flatTimeseriesData)\n tableColumns = measures\n }\n\n const head = mapTableHead(tableColumns)\n const rows = DashboardListUtils.createTableRows(flatTimeseriesData, tableColumns)\n\n return { head, rows }\n}\n\nexport type GetDateValueResponse = {\n measure: components['schemas']['DashboardVisualisationColumnDefinition']\n value: string\n}\n\nexport default {\n createChart,\n createTimeseriesCharts,\n}\n"],"names":["DashboardVisualisationType","BarChart","DoughnutChart","LineChart","Granularity","HeatmapChart","LineTimeseriesChart","BarTimeseriesChart","DatasetHelper","getTimestampColumn","getDateValue","getTimestampMeasure","mapUnitToSymbol","DashboardListUtils"],"mappings":"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"}
|
|
@@ -233,7 +233,11 @@ const mapBookmarks = async (bookmarks, services, res) => {
|
|
|
233
233
|
};
|
|
234
234
|
}
|
|
235
235
|
catch (error) {
|
|
236
|
-
|
|
236
|
+
const meta = {
|
|
237
|
+
reportId: bm.reportId,
|
|
238
|
+
id: bm.variantId || bm.id,
|
|
239
|
+
};
|
|
240
|
+
captureError.captureDprError(error, `Unable to get info for bookmark`, meta);
|
|
237
241
|
return null;
|
|
238
242
|
}
|
|
239
243
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../../../../../../../src/dpr/components/my-reports/utils.ts"],"sourcesContent":["import { Request, Response } from 'express'\nimport { Services } from '../../types/Services'\nimport {\n DprMyReport,\n DprMyReportActionBookmark,\n DprMyReportActions,\n DprMyReportHeading,\n DprMyReportItem,\n DprMyReportListConfig,\n HeadingConfig,\n ListType,\n MappedBookmarks,\n MyReportsListTotals,\n MyReportsOptions,\n ViewAction,\n} from './types'\nimport LocalsHelper, { getRouteLocals } from '../../utils/localsHelper'\nimport { BookmarkStoreData } from '../../types/Bookmark'\nimport { LoadType, ReportType, RequestStatus, StoredReportData } from '../../types/UserReports'\nimport { buildMyReportListRow } from './my-reports-list-item/utils'\nimport logger from '../../utils/logger'\nimport {\n expireFinishedReports,\n recordExpiryCheck,\n shouldRunExpiryCheck,\n} from '../../utils/ReportStatus/getReportStatus'\nimport { captureDprError } from '../../utils/captureError'\n\n/**\n * Initialises the \"My Reports\" component data\n *\n * @param {Request} req\n * @param {Response} res\n * @param {Services} services\n * @return {*} {DprMyReport}\n */\nexport const initMyReports = async (\n req: Request,\n res: Response,\n services: Services,\n options?: MyReportsOptions | undefined,\n): Promise<DprMyReport | undefined> => {\n const { bookmarkingEnabled } = LocalsHelper.getValues(res)\n await checkExpiredAndGetReports(res, services)\n\n return {\n ...(bookmarkingEnabled && { bookmarks: await initBookmarks(res, services) }),\n requested: await initRequested(req, res, options),\n viewed: await initViewed(req, res, options),\n removedReports: res.locals['removedReports'],\n }\n}\n\nconst checkExpiredAndGetReports = async (res: Response, services: Services) => {\n const { requestedReports, recentlyViewedReports } = LocalsHelper.getValues(res)\n\n if (shouldRunExpiryCheck(res.req.session)) {\n try {\n const refreshedReports = await expireFinishedReports({\n requestedReports,\n recentlyViewedReports,\n services,\n res,\n })\n\n res.locals['requestedReports'] = refreshedReports.requestedReports\n res.locals['recentlyViewedReports'] = refreshedReports.recentlyViewedReports\n\n recordExpiryCheck(res.req.session)\n } catch (error) {\n logger.error(error)\n }\n }\n\n return {\n requestedReports,\n recentlyViewedReports,\n }\n}\n\n/**\n * Init bookmarks list\n *\n * @param {Request} req\n * @param {Response} res\n * @param {Services} services\n * @return {*} {DprMyReportListConfig}\n */\nconst initBookmarks = async (\n res: Response,\n services: Services,\n options?: MyReportsOptions | undefined,\n): Promise<DprMyReportListConfig> => {\n const totalItems = await buildBookmarkListItems(res, services)\n const totals = buildTotals(res, totalItems, ListType.BOOKMARKS, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Bookmarks',\n listType: ListType.BOOKMARKS,\n headings: buildHeadings(ListType.BOOKMARKS),\n items,\n totals,\n }\n}\n\n/**\n * Init Requested Reports list\n *\n * @param {Request} req\n * @param {Response} res\n * @return {*}\n */\nexport const initRequested = async (req: Request, res: Response, options?: MyReportsOptions | undefined) => {\n const { csrfToken } = LocalsHelper.getValues(res)\n const totalItems = await buildListItems(req, res, ListType.REQUESTED)\n const totals = buildTotals(res, totalItems, ListType.REQUESTED, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Requested reports',\n listType: ListType.REQUESTED,\n csrfToken,\n headings: buildHeadings(ListType.REQUESTED),\n items,\n totals,\n }\n}\n\n/**\n * Init Viewed reports list\n *\n * @param {Request} req\n * @param {Response} res\n * @return {*}\n */\nexport const initViewed = async (req: Request, res: Response, options?: MyReportsOptions | undefined) => {\n const { csrfToken } = LocalsHelper.getValues(res)\n const totalItems = await buildListItems(req, res, ListType.VIEWED)\n const totals = buildTotals(res, totalItems, ListType.VIEWED, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Recently viewed',\n listType: ListType.VIEWED,\n csrfToken,\n headings: buildHeadings(ListType.VIEWED),\n items,\n totals,\n }\n}\n\n// ----------------------------------------------\n// LIST ITEMS\n// -----------------------------------------------\n\n/**\n * Builds the requested & views list items\n *\n * @param {Request} req\n * @param {Response} res\n * @param {ListType} listType\n * @return {*} {DprMyReportItem[]}\n */\nconst buildListItems = async (req: Request, res: Response, listType: ListType): Promise<DprMyReportItem[]> => {\n const listData = await getDataForList(res, listType)\n if (!listData) {\n return []\n }\n\n return listData.map((data: StoredReportData) => {\n const status = data.status as RequestStatus\n return buildMyReportListRow(data, status, req, res, listType)\n })\n}\n\nconst cutItemsToSize = (items: DprMyReportItem[], options?: MyReportsOptions | undefined) => {\n return options?.maxRows ? items.slice(0, options.maxRows) : items\n}\n\n/**\n * Builds the list totals\n *\n * @param {Response} res\n * @param {DprMyReportItem[]} items\n * @param {ListType} listType\n * @param {(MyReportsOptions | undefined)} [options]\n * @return {*} {MyReportsListTotals}\n */\nconst buildTotals = (\n res: Response,\n items: DprMyReportItem[],\n listType: ListType,\n options?: MyReportsOptions | undefined,\n): MyReportsListTotals => {\n if (!options?.maxRows) {\n return {\n total: items.length,\n shown: items.length,\n }\n }\n\n const { maxRows } = options\n\n const total = items.length\n const shown = items.length > maxRows ? maxRows : items.length\n\n let href\n if (maxRows < total) {\n const { requestedListPath, recentlyViewedListPath, bookmarkListPath } = getRouteLocals(res)\n switch (listType) {\n case ListType.BOOKMARKS:\n href = `${bookmarkListPath}/list`\n break\n case ListType.REQUESTED:\n href = `${requestedListPath}/list`\n break\n case ListType.VIEWED:\n href = `${recentlyViewedListPath}/list`\n break\n default:\n href = `${requestedListPath}/list`\n break\n }\n }\n return {\n total: items.length,\n shown,\n href,\n maxRows,\n }\n}\n\n/**\n * Builds the bookmark list items\n *\n * @param {Response} res\n * @param {Services} services\n * @return {*} {Promise<DprMyReportItem[]>}\n */\nconst buildBookmarkListItems = async (res: Response, services: Services): Promise<DprMyReportItem[]> => {\n const { bookmarks } = LocalsHelper.getValues(res)\n\n // loop it\n if (!bookmarks) {\n return []\n }\n\n // gather data for loop.\n const mappedBookmarks: MappedBookmarks[] = await mapBookmarks(bookmarks, services, res)\n\n return mappedBookmarks.map(bookmark => {\n const { name, reportName, reportType, description } = bookmark\n return {\n title: {\n productName: name,\n reportName,\n reportType,\n },\n description,\n actions: buildBookmarkActionsCell(bookmark, res),\n }\n })\n}\n\n/**\n * Map bookmarks to display data\n *\n * @param {BookmarkStoreData[]} bookmarks\n * @param {Services} services\n * @param {Response} res\n * @return {*}\n */\nconst mapBookmarks = async (\n bookmarks: BookmarkStoreData[],\n services: Services,\n res: Response,\n): Promise<MappedBookmarks[]> => {\n const { token, definitionsPath } = LocalsHelper.getValues(res)\n\n const mapped = await Promise.all(\n bookmarks.map(async bm => {\n try {\n const resolved = await resolveBookmarkDefinition(bm, services, token, definitionsPath)\n\n return {\n id: resolved.sourceId,\n reportId: bm.reportId,\n name: resolved.name,\n reportName: resolved.reportName,\n reportType: resolved.reportType,\n description: resolved.description,\n loadType: resolved.loadType,\n }\n } catch (error) {\n captureDprError(error, `Unable to get info for bookmark: ${bm.reportId} - ${bm.variantId || bm.id}`)\n\n return null\n }\n }),\n )\n\n return mapped.filter((bm): bm is MappedBookmarks => bm !== null)\n}\n\n/**\n * Resolves the bookmark definition for the bookmark\n *\n * @param {BookmarkStoreData} bm\n * @param {Services} services\n * @param {string} token\n * @param {string} definitionsPath\n * @return {*}\n */\nconst resolveBookmarkDefinition = async (\n bm: BookmarkStoreData,\n services: Services,\n token: string,\n definitionsPath: string,\n) => {\n const { id, reportId, type, variantId } = bm\n const sourceId = variantId || id\n\n const summary = await services.reportingService.getDefinitionSummary(token, reportId, definitionsPath)\n\n if (!type || type === ReportType.REPORT) {\n const definition = await services.reportingService.getDefinition(token, reportId, sourceId, definitionsPath)\n const defSummary = summary.variants.find(v => v.id === sourceId)\n\n return {\n sourceId,\n reportType: ReportType.REPORT,\n reportName: definition.variant.name,\n name: definition.name,\n description: definition.variant.description || definition.description || '',\n loadType: defSummary?.loadType ? (defSummary.loadType as LoadType) : LoadType.ASYNC,\n }\n }\n\n const definition = await services.dashboardService.getDefinition(token, reportId, sourceId, definitionsPath)\n const defSummary = summary.dashboards?.find(d => d.id === sourceId)\n\n return {\n sourceId,\n reportType: type,\n reportName: definition?.name || '',\n name: summary?.name || '',\n description: definition?.description || summary?.description || '',\n loadType: defSummary?.loadType ? (defSummary.loadType as LoadType) : LoadType.ASYNC,\n }\n}\n\n/**\n * Builds the bookmark actions cell\n *\n * @param {*} data\n * @param {Response} res\n * @return {*} {DprMyReportActions}\n */\nconst buildBookmarkActionsCell = (data: MappedBookmarks, res: Response): DprMyReportActions => {\n const { load, request } = buildLoadRequestAction(res, data)\n const bookmark = buildBookmarkRemoveAction(res, data)\n\n return {\n ...(load && { load }),\n ...(request && { request }),\n bookmark,\n }\n}\n\n/**\n * Build the load/request links config\n *\n * @param {Response} res\n * @param {MappedBookmarks} data\n * @return {*}\n */\nconst buildLoadRequestAction = (res: Response, data: MappedBookmarks) => {\n const { loadType, reportType, reportId, id } = data\n const { requestReportPath, viewReportPath } = getRouteLocals(res)\n\n let load: ViewAction | undefined\n let request: ViewAction | undefined\n\n if (loadType === LoadType.SYNC) {\n const href = `${viewReportPath}/sync/${reportId}/${id}`\n load = {\n href,\n reportType,\n }\n } else {\n const href = `${requestReportPath}/${reportType}/${reportId}/${id}/filters`\n request = {\n href,\n reportType,\n }\n }\n\n return {\n load,\n request,\n }\n}\n\n/**\n * Build the bookmark link config\n *\n * @param {Response} res\n * @param {MappedBookmarks} data\n * @return {*}\n */\nconst buildBookmarkRemoveAction = (res: Response, data: MappedBookmarks): DprMyReportActionBookmark => {\n const { reportId, id, reportType } = data\n const { csrfToken } = LocalsHelper.getValues(res)\n const { bookmarkActionEndpoint } = LocalsHelper.getRouteLocals(res)\n\n return {\n reportId,\n id,\n reportType,\n csrfToken,\n bookmarkActionEndpoint,\n linkType: 'remove',\n linkText: 'Remove bookmark',\n }\n}\n\n/**\n * Gets the relevant data to build the list\n *\n * @param {Response} res\n * @param {ListType} listType\n * @return {*} {(StoredReportData[] | undefined)}\n */\nconst getDataForList = async (res: Response, listType: ListType): Promise<StoredReportData[] | undefined> => {\n const { requestedReports, recentlyViewedReports } = LocalsHelper.getValues(res)\n\n switch (listType) {\n case ListType.REQUESTED:\n // Only show reports in the list that have not been viewed\n return requestedReports.filter(report => {\n return report.timestamp ? !report.timestamp.lastViewed : false\n })\n case ListType.VIEWED:\n // Only show READY or EXPIRED reports\n return recentlyViewedReports.filter(report => {\n return Boolean(\n report.status === RequestStatus.READY ||\n Boolean(report.executionId?.length && report.status === RequestStatus.EXPIRED),\n )\n })\n default:\n return undefined\n }\n}\n\n// ----------------------------------------------\n// HEADINGS\n// -----------------------------------------------\n\n/**\n * Builds the headings\n *\n * @param {ListType} listType\n * @return {*} {DprMyReportHeading[]}\n */\nconst buildHeadings = (listType: ListType): DprMyReportHeading[] => {\n return ALL_HEADINGS.filter(heading => heading.showIn.includes(listType))\n}\n\nconst ALL_HEADINGS: HeadingConfig[] = [\n {\n key: 'title',\n name: 'Product',\n classes: 'dpr-my-reports__cell--title',\n showIn: [ListType.BOOKMARKS, ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'description',\n name: 'Description',\n classes: 'dpr-my-reports__cell--description',\n showIn: [ListType.BOOKMARKS],\n },\n {\n key: 'filters',\n name: 'Filters',\n classes: 'dpr-my-reports__cell--filters',\n showIn: [ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'status',\n name: 'Status',\n classes: 'dpr-my-reports__cell--status',\n showIn: [ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'actions',\n name: 'Actions',\n classes: 'dpr-my-reports__cell--actions',\n showIn: [ListType.BOOKMARKS, ListType.REQUESTED, ListType.VIEWED],\n },\n]\n\nexport default {\n initMyReports,\n}\n"],"names":["LocalsHelper","shouldRunExpiryCheck","expireFinishedReports","recordExpiryCheck","logger","ListType","buildMyReportListRow","getRouteLocals","captureDprError","ReportType","LoadType","RequestStatus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../../../../../../../src/dpr/components/my-reports/utils.ts"],"sourcesContent":["import { Request, Response } from 'express'\nimport { Services } from '../../types/Services'\nimport {\n DprMyReport,\n DprMyReportActionBookmark,\n DprMyReportActions,\n DprMyReportHeading,\n DprMyReportItem,\n DprMyReportListConfig,\n HeadingConfig,\n ListType,\n MappedBookmarks,\n MyReportsListTotals,\n MyReportsOptions,\n ViewAction,\n} from './types'\nimport LocalsHelper, { getRouteLocals } from '../../utils/localsHelper'\nimport { BookmarkStoreData } from '../../types/Bookmark'\nimport { LoadType, ReportType, RequestStatus, StoredReportData } from '../../types/UserReports'\nimport { buildMyReportListRow } from './my-reports-list-item/utils'\nimport logger from '../../utils/logger'\nimport {\n expireFinishedReports,\n recordExpiryCheck,\n shouldRunExpiryCheck,\n} from '../../utils/ReportStatus/getReportStatus'\nimport { captureDprError } from '../../utils/captureError'\n\n/**\n * Initialises the \"My Reports\" component data\n *\n * @param {Request} req\n * @param {Response} res\n * @param {Services} services\n * @return {*} {DprMyReport}\n */\nexport const initMyReports = async (\n req: Request,\n res: Response,\n services: Services,\n options?: MyReportsOptions | undefined,\n): Promise<DprMyReport | undefined> => {\n const { bookmarkingEnabled } = LocalsHelper.getValues(res)\n await checkExpiredAndGetReports(res, services)\n\n return {\n ...(bookmarkingEnabled && { bookmarks: await initBookmarks(res, services) }),\n requested: await initRequested(req, res, options),\n viewed: await initViewed(req, res, options),\n removedReports: res.locals['removedReports'],\n }\n}\n\nconst checkExpiredAndGetReports = async (res: Response, services: Services) => {\n const { requestedReports, recentlyViewedReports } = LocalsHelper.getValues(res)\n\n if (shouldRunExpiryCheck(res.req.session)) {\n try {\n const refreshedReports = await expireFinishedReports({\n requestedReports,\n recentlyViewedReports,\n services,\n res,\n })\n\n res.locals['requestedReports'] = refreshedReports.requestedReports\n res.locals['recentlyViewedReports'] = refreshedReports.recentlyViewedReports\n\n recordExpiryCheck(res.req.session)\n } catch (error) {\n logger.error(error)\n }\n }\n\n return {\n requestedReports,\n recentlyViewedReports,\n }\n}\n\n/**\n * Init bookmarks list\n *\n * @param {Request} req\n * @param {Response} res\n * @param {Services} services\n * @return {*} {DprMyReportListConfig}\n */\nconst initBookmarks = async (\n res: Response,\n services: Services,\n options?: MyReportsOptions | undefined,\n): Promise<DprMyReportListConfig> => {\n const totalItems = await buildBookmarkListItems(res, services)\n const totals = buildTotals(res, totalItems, ListType.BOOKMARKS, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Bookmarks',\n listType: ListType.BOOKMARKS,\n headings: buildHeadings(ListType.BOOKMARKS),\n items,\n totals,\n }\n}\n\n/**\n * Init Requested Reports list\n *\n * @param {Request} req\n * @param {Response} res\n * @return {*}\n */\nexport const initRequested = async (req: Request, res: Response, options?: MyReportsOptions | undefined) => {\n const { csrfToken } = LocalsHelper.getValues(res)\n const totalItems = await buildListItems(req, res, ListType.REQUESTED)\n const totals = buildTotals(res, totalItems, ListType.REQUESTED, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Requested reports',\n listType: ListType.REQUESTED,\n csrfToken,\n headings: buildHeadings(ListType.REQUESTED),\n items,\n totals,\n }\n}\n\n/**\n * Init Viewed reports list\n *\n * @param {Request} req\n * @param {Response} res\n * @return {*}\n */\nexport const initViewed = async (req: Request, res: Response, options?: MyReportsOptions | undefined) => {\n const { csrfToken } = LocalsHelper.getValues(res)\n const totalItems = await buildListItems(req, res, ListType.VIEWED)\n const totals = buildTotals(res, totalItems, ListType.VIEWED, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Recently viewed',\n listType: ListType.VIEWED,\n csrfToken,\n headings: buildHeadings(ListType.VIEWED),\n items,\n totals,\n }\n}\n\n// ----------------------------------------------\n// LIST ITEMS\n// -----------------------------------------------\n\n/**\n * Builds the requested & views list items\n *\n * @param {Request} req\n * @param {Response} res\n * @param {ListType} listType\n * @return {*} {DprMyReportItem[]}\n */\nconst buildListItems = async (req: Request, res: Response, listType: ListType): Promise<DprMyReportItem[]> => {\n const listData = await getDataForList(res, listType)\n if (!listData) {\n return []\n }\n\n return listData.map((data: StoredReportData) => {\n const status = data.status as RequestStatus\n return buildMyReportListRow(data, status, req, res, listType)\n })\n}\n\nconst cutItemsToSize = (items: DprMyReportItem[], options?: MyReportsOptions | undefined) => {\n return options?.maxRows ? items.slice(0, options.maxRows) : items\n}\n\n/**\n * Builds the list totals\n *\n * @param {Response} res\n * @param {DprMyReportItem[]} items\n * @param {ListType} listType\n * @param {(MyReportsOptions | undefined)} [options]\n * @return {*} {MyReportsListTotals}\n */\nconst buildTotals = (\n res: Response,\n items: DprMyReportItem[],\n listType: ListType,\n options?: MyReportsOptions | undefined,\n): MyReportsListTotals => {\n if (!options?.maxRows) {\n return {\n total: items.length,\n shown: items.length,\n }\n }\n\n const { maxRows } = options\n\n const total = items.length\n const shown = items.length > maxRows ? maxRows : items.length\n\n let href\n if (maxRows < total) {\n const { requestedListPath, recentlyViewedListPath, bookmarkListPath } = getRouteLocals(res)\n switch (listType) {\n case ListType.BOOKMARKS:\n href = `${bookmarkListPath}/list`\n break\n case ListType.REQUESTED:\n href = `${requestedListPath}/list`\n break\n case ListType.VIEWED:\n href = `${recentlyViewedListPath}/list`\n break\n default:\n href = `${requestedListPath}/list`\n break\n }\n }\n return {\n total: items.length,\n shown,\n href,\n maxRows,\n }\n}\n\n/**\n * Builds the bookmark list items\n *\n * @param {Response} res\n * @param {Services} services\n * @return {*} {Promise<DprMyReportItem[]>}\n */\nconst buildBookmarkListItems = async (res: Response, services: Services): Promise<DprMyReportItem[]> => {\n const { bookmarks } = LocalsHelper.getValues(res)\n\n // loop it\n if (!bookmarks) {\n return []\n }\n\n // gather data for loop.\n const mappedBookmarks: MappedBookmarks[] = await mapBookmarks(bookmarks, services, res)\n\n return mappedBookmarks.map(bookmark => {\n const { name, reportName, reportType, description } = bookmark\n return {\n title: {\n productName: name,\n reportName,\n reportType,\n },\n description,\n actions: buildBookmarkActionsCell(bookmark, res),\n }\n })\n}\n\n/**\n * Map bookmarks to display data\n *\n * @param {BookmarkStoreData[]} bookmarks\n * @param {Services} services\n * @param {Response} res\n * @return {*}\n */\nconst mapBookmarks = async (\n bookmarks: BookmarkStoreData[],\n services: Services,\n res: Response,\n): Promise<MappedBookmarks[]> => {\n const { token, definitionsPath } = LocalsHelper.getValues(res)\n\n const mapped = await Promise.all(\n bookmarks.map(async bm => {\n try {\n const resolved = await resolveBookmarkDefinition(bm, services, token, definitionsPath)\n\n return {\n id: resolved.sourceId,\n reportId: bm.reportId,\n name: resolved.name,\n reportName: resolved.reportName,\n reportType: resolved.reportType,\n description: resolved.description,\n loadType: resolved.loadType,\n }\n } catch (error) {\n const meta = {\n reportId: bm.reportId,\n id: bm.variantId || bm.id,\n }\n captureDprError(error, `Unable to get info for bookmark`, meta)\n\n return null\n }\n }),\n )\n\n return mapped.filter((bm): bm is MappedBookmarks => bm !== null)\n}\n\n/**\n * Resolves the bookmark definition for the bookmark\n *\n * @param {BookmarkStoreData} bm\n * @param {Services} services\n * @param {string} token\n * @param {string} definitionsPath\n * @return {*}\n */\nconst resolveBookmarkDefinition = async (\n bm: BookmarkStoreData,\n services: Services,\n token: string,\n definitionsPath: string,\n) => {\n const { id, reportId, type, variantId } = bm\n const sourceId = variantId || id\n\n const summary = await services.reportingService.getDefinitionSummary(token, reportId, definitionsPath)\n\n if (!type || type === ReportType.REPORT) {\n const definition = await services.reportingService.getDefinition(token, reportId, sourceId, definitionsPath)\n const defSummary = summary.variants.find(v => v.id === sourceId)\n\n return {\n sourceId,\n reportType: ReportType.REPORT,\n reportName: definition.variant.name,\n name: definition.name,\n description: definition.variant.description || definition.description || '',\n loadType: defSummary?.loadType ? (defSummary.loadType as LoadType) : LoadType.ASYNC,\n }\n }\n\n const definition = await services.dashboardService.getDefinition(token, reportId, sourceId, definitionsPath)\n const defSummary = summary.dashboards?.find(d => d.id === sourceId)\n\n return {\n sourceId,\n reportType: type,\n reportName: definition?.name || '',\n name: summary?.name || '',\n description: definition?.description || summary?.description || '',\n loadType: defSummary?.loadType ? (defSummary.loadType as LoadType) : LoadType.ASYNC,\n }\n}\n\n/**\n * Builds the bookmark actions cell\n *\n * @param {*} data\n * @param {Response} res\n * @return {*} {DprMyReportActions}\n */\nconst buildBookmarkActionsCell = (data: MappedBookmarks, res: Response): DprMyReportActions => {\n const { load, request } = buildLoadRequestAction(res, data)\n const bookmark = buildBookmarkRemoveAction(res, data)\n\n return {\n ...(load && { load }),\n ...(request && { request }),\n bookmark,\n }\n}\n\n/**\n * Build the load/request links config\n *\n * @param {Response} res\n * @param {MappedBookmarks} data\n * @return {*}\n */\nconst buildLoadRequestAction = (res: Response, data: MappedBookmarks) => {\n const { loadType, reportType, reportId, id } = data\n const { requestReportPath, viewReportPath } = getRouteLocals(res)\n\n let load: ViewAction | undefined\n let request: ViewAction | undefined\n\n if (loadType === LoadType.SYNC) {\n const href = `${viewReportPath}/sync/${reportId}/${id}`\n load = {\n href,\n reportType,\n }\n } else {\n const href = `${requestReportPath}/${reportType}/${reportId}/${id}/filters`\n request = {\n href,\n reportType,\n }\n }\n\n return {\n load,\n request,\n }\n}\n\n/**\n * Build the bookmark link config\n *\n * @param {Response} res\n * @param {MappedBookmarks} data\n * @return {*}\n */\nconst buildBookmarkRemoveAction = (res: Response, data: MappedBookmarks): DprMyReportActionBookmark => {\n const { reportId, id, reportType } = data\n const { csrfToken } = LocalsHelper.getValues(res)\n const { bookmarkActionEndpoint } = LocalsHelper.getRouteLocals(res)\n\n return {\n reportId,\n id,\n reportType,\n csrfToken,\n bookmarkActionEndpoint,\n linkType: 'remove',\n linkText: 'Remove bookmark',\n }\n}\n\n/**\n * Gets the relevant data to build the list\n *\n * @param {Response} res\n * @param {ListType} listType\n * @return {*} {(StoredReportData[] | undefined)}\n */\nconst getDataForList = async (res: Response, listType: ListType): Promise<StoredReportData[] | undefined> => {\n const { requestedReports, recentlyViewedReports } = LocalsHelper.getValues(res)\n\n switch (listType) {\n case ListType.REQUESTED:\n // Only show reports in the list that have not been viewed\n return requestedReports.filter(report => {\n return report.timestamp ? !report.timestamp.lastViewed : false\n })\n case ListType.VIEWED:\n // Only show READY or EXPIRED reports\n return recentlyViewedReports.filter(report => {\n return Boolean(\n report.status === RequestStatus.READY ||\n Boolean(report.executionId?.length && report.status === RequestStatus.EXPIRED),\n )\n })\n default:\n return undefined\n }\n}\n\n// ----------------------------------------------\n// HEADINGS\n// -----------------------------------------------\n\n/**\n * Builds the headings\n *\n * @param {ListType} listType\n * @return {*} {DprMyReportHeading[]}\n */\nconst buildHeadings = (listType: ListType): DprMyReportHeading[] => {\n return ALL_HEADINGS.filter(heading => heading.showIn.includes(listType))\n}\n\nconst ALL_HEADINGS: HeadingConfig[] = [\n {\n key: 'title',\n name: 'Product',\n classes: 'dpr-my-reports__cell--title',\n showIn: [ListType.BOOKMARKS, ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'description',\n name: 'Description',\n classes: 'dpr-my-reports__cell--description',\n showIn: [ListType.BOOKMARKS],\n },\n {\n key: 'filters',\n name: 'Filters',\n classes: 'dpr-my-reports__cell--filters',\n showIn: [ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'status',\n name: 'Status',\n classes: 'dpr-my-reports__cell--status',\n showIn: [ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'actions',\n name: 'Actions',\n classes: 'dpr-my-reports__cell--actions',\n showIn: [ListType.BOOKMARKS, ListType.REQUESTED, ListType.VIEWED],\n },\n]\n\nexport default {\n initMyReports,\n}\n"],"names":["LocalsHelper","shouldRunExpiryCheck","expireFinishedReports","recordExpiryCheck","logger","ListType","buildMyReportListRow","getRouteLocals","captureDprError","ReportType","LoadType","RequestStatus"],"mappings":"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"}
|
|
@@ -6,10 +6,11 @@ var localsHelper = require('../../utils/localsHelper.js');
|
|
|
6
6
|
var getReportStatus = require('../../utils/ReportStatus/getReportStatus.js');
|
|
7
7
|
|
|
8
8
|
const createReportPollingHandler = (services, renderFn) => async (req, res, _next) => {
|
|
9
|
+
let requestedReport;
|
|
9
10
|
try {
|
|
10
11
|
const { executionId } = req.params;
|
|
11
12
|
const { token, dprUser } = localsHelper.getValues(res);
|
|
12
|
-
|
|
13
|
+
requestedReport = await utils.getMyReport({ executionId }, 'requestedReports', services, dprUser.id);
|
|
13
14
|
if (!requestedReport) {
|
|
14
15
|
return res.sendStatus(404);
|
|
15
16
|
}
|
|
@@ -30,7 +31,21 @@ const createReportPollingHandler = (services, renderFn) => async (req, res, _nex
|
|
|
30
31
|
});
|
|
31
32
|
}
|
|
32
33
|
catch (error) {
|
|
33
|
-
|
|
34
|
+
const message = 'Polling error';
|
|
35
|
+
const { executionId, reportId, id } = req.params;
|
|
36
|
+
const meta = {
|
|
37
|
+
reportId,
|
|
38
|
+
id,
|
|
39
|
+
executionId,
|
|
40
|
+
...(requestedReport
|
|
41
|
+
? {
|
|
42
|
+
type: requestedReport.type,
|
|
43
|
+
reportName: requestedReport.reportName,
|
|
44
|
+
loadType: requestedReport.loadType,
|
|
45
|
+
}
|
|
46
|
+
: {}),
|
|
47
|
+
};
|
|
48
|
+
captureError.captureDprError(error, message, meta);
|
|
34
49
|
return res.sendStatus(500);
|
|
35
50
|
}
|
|
36
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createReportPollingHandler.js","sources":["../../../../../../../../../../src/dpr/controllers/reportPolling/createReportPollingHandler.ts"],"sourcesContent":["import { RequestHandler, Request, Response } from 'express'\nimport { getMyReport } from 'src/dpr/routes/journeys/my-reports/utils'\nimport { Services } from 'src/dpr/types/Services'\nimport { captureDprError } from 'src/dpr/utils/captureError'\nimport { getValues } from 'src/dpr/utils/localsHelper'\nimport { evaluateAndUpdateReportStatus } from 'src/dpr/utils/ReportStatus/getReportStatus'\n\ntype RenderFn<T, R> = (\n updated: T,\n resolution: R,\n req: Request,\n res: Response,\n) => {\n template: string\n data: Record<string, unknown>\n}\n\nexport const createReportPollingHandler =\n <T, R>(services: Services, renderFn: RenderFn<T, R>): RequestHandler =>\n async (req, res, _next) => {\n try {\n const { executionId } = req.params as { executionId: string }\n\n const { token, dprUser } = getValues(res)\n\n
|
|
1
|
+
{"version":3,"file":"createReportPollingHandler.js","sources":["../../../../../../../../../../src/dpr/controllers/reportPolling/createReportPollingHandler.ts"],"sourcesContent":["import { RequestHandler, Request, Response } from 'express'\nimport { getMyReport } from 'src/dpr/routes/journeys/my-reports/utils'\nimport { Services } from 'src/dpr/types/Services'\nimport { RecentlyViewedReport, RequestedReport } from 'src/dpr/types/UserReports'\nimport { captureDprError } from 'src/dpr/utils/captureError'\nimport { getValues } from 'src/dpr/utils/localsHelper'\nimport { evaluateAndUpdateReportStatus } from 'src/dpr/utils/ReportStatus/getReportStatus'\n\ntype RenderFn<T, R> = (\n updated: T,\n resolution: R,\n req: Request,\n res: Response,\n) => {\n template: string\n data: Record<string, unknown>\n}\n\nexport const createReportPollingHandler =\n <T, R>(services: Services, renderFn: RenderFn<T, R>): RequestHandler =>\n async (req, res, _next) => {\n let requestedReport: RequestedReport | RecentlyViewedReport | undefined\n\n try {\n const { executionId } = req.params as { executionId: string }\n\n const { token, dprUser } = getValues(res)\n\n requestedReport = await getMyReport({ executionId }, 'requestedReports', services, dprUser.id)\n\n if (!requestedReport) {\n return res.sendStatus(404)\n }\n\n const { resolution, updated } = await evaluateAndUpdateReportStatus({\n stored: requestedReport,\n services,\n token,\n res,\n })\n\n if (resolution.type === 'NO_CHANGE' || !updated) {\n return res.sendStatus(204)\n }\n\n const { template, data } = renderFn(updated as T, resolution as R, req, res)\n\n return res.render(template, data, (err, html) => {\n if (err) return res.sendStatus(500)\n return res.type('text/html').send(html)\n })\n } catch (error) {\n const message = 'Polling error'\n\n const { executionId, reportId, id } = req.params as { executionId: string; reportId: string; id: string }\n const meta = {\n reportId,\n id,\n executionId,\n ...(requestedReport\n ? {\n type: requestedReport.type,\n reportName: requestedReport.reportName,\n loadType: requestedReport.loadType as string,\n }\n : {}),\n }\n\n captureDprError(error, message, meta)\n\n return res.sendStatus(500)\n }\n }\n"],"names":["getValues","getMyReport","evaluateAndUpdateReportStatus","captureDprError"],"mappings":";;;;;;;AAkBO,MAAM,0BAA0B,GACrC,CAAO,QAAkB,EAAE,QAAwB,KACnD,OAAO,GAAG,EAAE,GAAG,EAAE,KAAK,KAAI;AACxB,IAAA,IAAI,eAAmE;AAEvE,IAAA,IAAI;AACF,QAAA,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAiC;QAE7D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAGA,sBAAS,CAAC,GAAG,CAAC;AAEzC,QAAA,eAAe,GAAG,MAAMC,iBAAW,CAAC,EAAE,WAAW,EAAE,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QAE9F,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAC5B;QAEA,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAMC,6CAA6B,CAAC;AAClE,YAAA,MAAM,EAAE,eAAe;YACvB,QAAQ;YACR,KAAK;YACL,GAAG;AACJ,SAAA,CAAC;QAEF,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,OAAO,EAAE;AAC/C,YAAA,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAC5B;AAEA,QAAA,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAY,EAAE,UAAe,EAAE,GAAG,EAAE,GAAG,CAAC;AAE5E,QAAA,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,KAAI;AAC9C,YAAA,IAAI,GAAG;AAAE,gBAAA,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YACnC,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACzC,QAAA,CAAC,CAAC;IACJ;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,OAAO,GAAG,eAAe;QAE/B,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAA+D;AACzG,QAAA,MAAM,IAAI,GAAG;YACX,QAAQ;YACR,EAAE;YACF,WAAW;AACX,YAAA,IAAI;AACF,kBAAE;oBACE,IAAI,EAAE,eAAe,CAAC,IAAI;oBAC1B,UAAU,EAAE,eAAe,CAAC,UAAU;oBACtC,QAAQ,EAAE,eAAe,CAAC,QAAkB;AAC7C;kBACD,EAAE,CAAC;SACR;AAED,QAAAC,4BAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;AAErC,QAAA,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;IAC5B;AACF;;;;"}
|
|
@@ -27,7 +27,16 @@ const getMyReport = async (reportData, type, services, userId) => {
|
|
|
27
27
|
await removeMyReport(type, reportData, services, userId);
|
|
28
28
|
}
|
|
29
29
|
catch (cleanupError) {
|
|
30
|
-
|
|
30
|
+
const meta = rawReport
|
|
31
|
+
? {
|
|
32
|
+
id: rawReport.id ?? 'unknown',
|
|
33
|
+
reportId: rawReport.reportId ?? 'unknown',
|
|
34
|
+
tableId: rawReport.tableId ?? 'unknown',
|
|
35
|
+
executionId: rawReport.executionId ?? 'unknown',
|
|
36
|
+
loadType: rawReport.loadType,
|
|
37
|
+
}
|
|
38
|
+
: {};
|
|
39
|
+
captureError.captureDprError(cleanupError, 'Failed to remove invalid report', meta);
|
|
31
40
|
}
|
|
32
41
|
return undefined;
|
|
33
42
|
}
|
|
@@ -59,7 +68,15 @@ const getAllMyReports = async (type, services, userId) => {
|
|
|
59
68
|
if (result.success) {
|
|
60
69
|
return result.data;
|
|
61
70
|
}
|
|
62
|
-
|
|
71
|
+
const { id, reportName, reportId, loadType } = rawReport;
|
|
72
|
+
const errorMeta = {
|
|
73
|
+
id,
|
|
74
|
+
type,
|
|
75
|
+
reportName,
|
|
76
|
+
reportId,
|
|
77
|
+
loadType: loadType,
|
|
78
|
+
};
|
|
79
|
+
captureError.captureDprError(result.error, 'Invalid Redis payload', errorMeta, captureError.LoggerErrorType.WARN);
|
|
63
80
|
try {
|
|
64
81
|
const report = rawReport;
|
|
65
82
|
await removeMyReport(type, {
|
|
@@ -70,7 +87,16 @@ const getAllMyReports = async (type, services, userId) => {
|
|
|
70
87
|
}, services, userId);
|
|
71
88
|
}
|
|
72
89
|
catch (cleanupError) {
|
|
73
|
-
|
|
90
|
+
const meta = rawReport
|
|
91
|
+
? {
|
|
92
|
+
id: rawReport.id ?? 'unknown',
|
|
93
|
+
reportId: rawReport.reportId ?? 'unknown',
|
|
94
|
+
tableId: rawReport.tableId ?? 'unknown',
|
|
95
|
+
executionId: rawReport.executionId ?? 'unknown',
|
|
96
|
+
loadType: rawReport.loadType,
|
|
97
|
+
}
|
|
98
|
+
: {};
|
|
99
|
+
captureError.captureDprError(cleanupError, 'Failed to remove invalid report (list)', meta);
|
|
74
100
|
}
|
|
75
101
|
return null;
|
|
76
102
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/routes/journeys/my-reports/utils.ts"],"sourcesContent":["import { Services } from 'src/dpr/types/Services'\nimport { RecentlyViewedReport, RequestedReport } from 'src/dpr/types/UserReports'\nimport { captureDprError } from 'src/dpr/utils/captureError'\nimport { RequestedReportSchema } from './requested-reports/validation'\nimport { ViewedReportSchema } from './recently-viewed/validation'\n\ninterface GetRemoveMyReportData {\n reportId?: string | undefined\n id?: string | undefined\n executionId?: string | undefined\n tableId?: string | undefined\n}\n\n/**\n * Get a single report from My reports\n * - validates the report and removes if invalid\n *\n * @param {GetRemoveMyReportData} reportData\n * @param {('requested' | 'viewed')} type\n * @param {Services} services\n * @param {string} userId\n * @return {*} {(Promise<RequestedReport | RecentlyViewedReport | undefined>)}\n */\nexport const getMyReport = async (\n reportData: GetRemoveMyReportData,\n type: 'requestedReports' | 'recentlyViewedReports',\n services: Services,\n userId: string,\n): Promise<RequestedReport | RecentlyViewedReport | undefined> => {\n const rawReport = await fetchReport(type, reportData, services, userId)\n\n if (!rawReport) {\n return undefined\n }\n\n const schema = type === 'requestedReports' ? RequestedReportSchema : ViewedReportSchema\n\n const result = schema.safeParse(rawReport)\n\n if (!result.success) {\n captureDprError(result.error, 'Invalid Redis payload')\n try {\n await removeMyReport(type, reportData, services, userId)\n } catch (cleanupError) {\n captureDprError(cleanupError, 'Failed to remove invalid report')\n }\n\n return undefined\n }\n\n return result.data\n}\n\n/**\n * Gets all My Reports for a particular type\n * - validats the list and removes invalid ones\n *\n * @param {('requested' | 'viewed')} type\n * @param {Services} services\n * @param {string} userId\n * @return {*} {(Promise<(RequestedReport | RecentlyViewedReport)[]>)}\n */\nexport const getAllMyReports = async (\n type: 'requestedReports' | 'recentlyViewedReports',\n services: Services,\n userId: string,\n): Promise<(RequestedReport | RecentlyViewedReport)[]> => {\n const serviceMap = {\n requestedReports: services.requestedReportService,\n recentlyViewedReports: services.recentlyViewedService,\n } as const\n\n const schemaMap = {\n requestedReports: RequestedReportSchema,\n recentlyViewedReports: ViewedReportSchema,\n } as const\n\n const service = serviceMap[type]\n const schema = schemaMap[type]\n\n const reports: unknown[] =\n type === 'requestedReports' ? await service.getAllReports(userId) : await service.getAllReports(userId)\n\n const results = await Promise.all(\n reports.map(async rawReport => {\n const result = schema.safeParse(rawReport)\n\n if (result.success) {\n return result.data\n }\n\n captureDprError(result.error, 'Invalid Redis payload (list)')\n\n try {\n const report = rawReport as Partial<GetRemoveMyReportData>\n\n await removeMyReport(\n type,\n {\n reportId: report.reportId,\n id: report.id,\n executionId: report.executionId,\n tableId: report.tableId,\n },\n services,\n userId,\n )\n } catch (cleanupError) {\n captureDprError(cleanupError, 'Failed to remove invalid report (list)')\n }\n\n return null\n }),\n )\n\n const res = results.filter(Boolean) as (RequestedReport | RecentlyViewedReport)[]\n\n return res\n}\n\n/**\n * Add a report to my report\n * - validates the incoming report data before addition\n *\n * @param {('requested' | 'viewed')} type\n * @param {(RequestedReport | RecentlyViewedReport)} reportData\n * @param {Services} services\n * @param {string} userId\n */\nexport const addMyReport = async (\n type: 'requestedReports' | 'recentlyViewedReports',\n reportData: RequestedReport | RecentlyViewedReport,\n services: Services,\n userId: string,\n) => {\n const schema = type === 'requestedReports' ? RequestedReportSchema : ViewedReportSchema\n\n const result = schema.safeParse(reportData)\n\n if (!result.success) {\n captureDprError(result.error, 'Unable to add report - Invalid report data')\n\n return\n }\n\n switch (type) {\n case 'requestedReports':\n await services.requestedReportService.addReport(userId, result.data)\n break\n\n case 'recentlyViewedReports':\n await services.recentlyViewedService.setRecentlyViewed(result.data, userId)\n break\n\n default:\n break\n }\n}\n\n/**\n * Removes a report from My Reports\n *\n * @param {('requested' | 'viewed')} type\n * @param {GetRemoveMyReportData} reportData\n * @param {Services} services\n * @param {string} userId\n * @return {*} {Promise<void>}\n */\nexport const removeMyReport = async (\n type: 'requestedReports' | 'recentlyViewedReports',\n reportData: GetRemoveMyReportData,\n services: Services,\n userId: string,\n): Promise<void> => {\n const { executionId, tableId, reportId, id } = reportData\n\n if (executionId && type === 'requestedReports') {\n return services.requestedReportService.removeReport(executionId, userId)\n }\n\n if (type === 'recentlyViewedReports') {\n return services.recentlyViewedService.removeReport(userId, reportId, id, tableId)\n }\n\n return undefined\n}\n\n/**\n * Fetches the reports from My reports\n *\n * @param {('requested' | 'viewed')} type\n * @param {GetRemoveMyReportData} reportData\n * @param {Services} services\n * @param {string} userId\n * @return {*} {Promise<RequestedReport | RecentlyViewedReport | undefined>}\n */\nconst fetchReport = async (\n type: 'requestedReports' | 'recentlyViewedReports',\n reportData: GetRemoveMyReportData,\n services: Services,\n userId: string,\n): Promise<RequestedReport | RecentlyViewedReport | undefined> => {\n const { executionId, tableId } = reportData\n\n const serviceMap = {\n requestedReports: services.requestedReportService,\n recentlyViewedReports: services.recentlyViewedService,\n } as const\n\n if (executionId) {\n return serviceMap[type].getReportByExecutionId(executionId, userId)\n }\n\n if (tableId) {\n return serviceMap[type].getReportByTableId(tableId, userId)\n }\n\n return undefined\n}\n"],"names":["RequestedReportSchema","ViewedReportSchema","captureDprError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/routes/journeys/my-reports/utils.ts"],"sourcesContent":["import { Services } from 'src/dpr/types/Services'\nimport { RecentlyViewedReport, RequestedReport, StoredReportData } from 'src/dpr/types/UserReports'\nimport { captureDprError, LoggerErrorType } from 'src/dpr/utils/captureError'\nimport { RequestedReportSchema } from './requested-reports/validation'\nimport { ViewedReportSchema } from './recently-viewed/validation'\n\ninterface GetRemoveMyReportData {\n reportId?: string | undefined\n id?: string | undefined\n executionId?: string | undefined\n tableId?: string | undefined\n}\n\n/**\n * Get a single report from My reports\n * - validates the report and removes if invalid\n *\n * @param {GetRemoveMyReportData} reportData\n * @param {('requested' | 'viewed')} type\n * @param {Services} services\n * @param {string} userId\n * @return {*} {(Promise<RequestedReport | RecentlyViewedReport | undefined>)}\n */\nexport const getMyReport = async (\n reportData: GetRemoveMyReportData,\n type: 'requestedReports' | 'recentlyViewedReports',\n services: Services,\n userId: string,\n): Promise<RequestedReport | RecentlyViewedReport | undefined> => {\n const rawReport = await fetchReport(type, reportData, services, userId)\n\n if (!rawReport) {\n return undefined\n }\n\n const schema = type === 'requestedReports' ? RequestedReportSchema : ViewedReportSchema\n\n const result = schema.safeParse(rawReport)\n\n if (!result.success) {\n captureDprError(result.error, 'Invalid Redis payload')\n try {\n await removeMyReport(type, reportData, services, userId)\n } catch (cleanupError) {\n const meta = rawReport\n ? {\n id: rawReport.id ?? 'unknown',\n reportId: rawReport.reportId ?? 'unknown',\n tableId: rawReport.tableId ?? 'unknown',\n executionId: rawReport.executionId ?? 'unknown',\n loadType: rawReport.loadType as string,\n }\n : {}\n captureDprError(cleanupError, 'Failed to remove invalid report', meta)\n }\n\n return undefined\n }\n\n return result.data\n}\n\n/**\n * Gets all My Reports for a particular type\n * - validats the list and removes invalid ones\n *\n * @param {('requested' | 'viewed')} type\n * @param {Services} services\n * @param {string} userId\n * @return {*} {(Promise<(RequestedReport | RecentlyViewedReport)[]>)}\n */\nexport const getAllMyReports = async (\n type: 'requestedReports' | 'recentlyViewedReports',\n services: Services,\n userId: string,\n): Promise<(RequestedReport | RecentlyViewedReport)[]> => {\n const serviceMap = {\n requestedReports: services.requestedReportService,\n recentlyViewedReports: services.recentlyViewedService,\n } as const\n\n const schemaMap = {\n requestedReports: RequestedReportSchema,\n recentlyViewedReports: ViewedReportSchema,\n } as const\n\n const service = serviceMap[type]\n const schema = schemaMap[type]\n\n const reports: StoredReportData[] =\n type === 'requestedReports' ? await service.getAllReports(userId) : await service.getAllReports(userId)\n\n const results = await Promise.all(\n reports.map(async rawReport => {\n const result = schema.safeParse(rawReport)\n\n if (result.success) {\n return result.data\n }\n\n const { id, reportName, reportId, loadType } = rawReport\n const errorMeta = {\n id,\n type,\n reportName,\n reportId,\n loadType: loadType as string,\n }\n\n captureDprError(result.error, 'Invalid Redis payload', errorMeta, LoggerErrorType.WARN)\n\n try {\n const report = rawReport as Partial<GetRemoveMyReportData>\n\n await removeMyReport(\n type,\n {\n reportId: report.reportId,\n id: report.id,\n executionId: report.executionId,\n tableId: report.tableId,\n },\n services,\n userId,\n )\n } catch (cleanupError) {\n const meta = rawReport\n ? {\n id: rawReport.id ?? 'unknown',\n reportId: rawReport.reportId ?? 'unknown',\n tableId: rawReport.tableId ?? 'unknown',\n executionId: rawReport.executionId ?? 'unknown',\n loadType: rawReport.loadType as string,\n }\n : {}\n captureDprError(cleanupError, 'Failed to remove invalid report (list)', meta)\n }\n\n return null\n }),\n )\n\n const res = results.filter(Boolean) as (RequestedReport | RecentlyViewedReport)[]\n\n return res\n}\n\n/**\n * Add a report to my report\n * - validates the incoming report data before addition\n *\n * @param {('requested' | 'viewed')} type\n * @param {(RequestedReport | RecentlyViewedReport)} reportData\n * @param {Services} services\n * @param {string} userId\n */\nexport const addMyReport = async (\n type: 'requestedReports' | 'recentlyViewedReports',\n reportData: RequestedReport | RecentlyViewedReport,\n services: Services,\n userId: string,\n) => {\n const schema = type === 'requestedReports' ? RequestedReportSchema : ViewedReportSchema\n\n const result = schema.safeParse(reportData)\n\n if (!result.success) {\n captureDprError(result.error, 'Unable to add report - Invalid report data')\n\n return\n }\n\n switch (type) {\n case 'requestedReports':\n await services.requestedReportService.addReport(userId, result.data)\n break\n\n case 'recentlyViewedReports':\n await services.recentlyViewedService.setRecentlyViewed(result.data, userId)\n break\n\n default:\n break\n }\n}\n\n/**\n * Removes a report from My Reports\n *\n * @param {('requested' | 'viewed')} type\n * @param {GetRemoveMyReportData} reportData\n * @param {Services} services\n * @param {string} userId\n * @return {*} {Promise<void>}\n */\nexport const removeMyReport = async (\n type: 'requestedReports' | 'recentlyViewedReports',\n reportData: GetRemoveMyReportData,\n services: Services,\n userId: string,\n): Promise<void> => {\n const { executionId, tableId, reportId, id } = reportData\n\n if (executionId && type === 'requestedReports') {\n return services.requestedReportService.removeReport(executionId, userId)\n }\n\n if (type === 'recentlyViewedReports') {\n return services.recentlyViewedService.removeReport(userId, reportId, id, tableId)\n }\n\n return undefined\n}\n\n/**\n * Fetches the reports from My reports\n *\n * @param {('requested' | 'viewed')} type\n * @param {GetRemoveMyReportData} reportData\n * @param {Services} services\n * @param {string} userId\n * @return {*} {Promise<RequestedReport | RecentlyViewedReport | undefined>}\n */\nconst fetchReport = async (\n type: 'requestedReports' | 'recentlyViewedReports',\n reportData: GetRemoveMyReportData,\n services: Services,\n userId: string,\n): Promise<RequestedReport | RecentlyViewedReport | undefined> => {\n const { executionId, tableId } = reportData\n\n const serviceMap = {\n requestedReports: services.requestedReportService,\n recentlyViewedReports: services.recentlyViewedService,\n } as const\n\n if (executionId) {\n return serviceMap[type].getReportByExecutionId(executionId, userId)\n }\n\n if (tableId) {\n return serviceMap[type].getReportByTableId(tableId, userId)\n }\n\n return undefined\n}\n"],"names":["RequestedReportSchema","ViewedReportSchema","captureDprError","LoggerErrorType"],"mappings":"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"}
|
|
@@ -51,7 +51,7 @@ class MissingReportFormController {
|
|
|
51
51
|
const redirect = `./submitted?${queryParams}`;
|
|
52
52
|
res.redirect(redirect);
|
|
53
53
|
}, err => {
|
|
54
|
-
captureError.captureDprError(err);
|
|
54
|
+
captureError.captureDprError(err, 'Submit missing report entry error', { reportId, variantId, requestDetails });
|
|
55
55
|
next(err);
|
|
56
56
|
});
|
|
57
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sources":["../../../../../../../../../../../../src/dpr/routes/journeys/request-missing-report/form/controller.ts"],"sourcesContent":["import { RequestHandler } from 'express'\nimport LocalsHelper from '../../../../utils/localsHelper'\nimport { components } from '../../../../types/api'\nimport { Services } from '../../../../types/Services'\nimport MissingReportService from '../../../../services/missingReport/missingReportService'\nimport { ReportingService } from '../../../../services'\nimport { captureDprError } from '../../../../utils/captureError'\n\nclass MissingReportFormController {\n layoutPath: string\n\n missingReportService: MissingReportService\n\n reportingService: ReportingService\n\n constructor(layoutPath: string, services: Services) {\n this.layoutPath = layoutPath\n this.missingReportService = services.missingReportService\n this.reportingService = services.reportingService\n }\n\n GET: RequestHandler = async (req, res, next) => {\n const { token, csrfToken, definitionsPath, dprUser } = LocalsHelper.getValues(res)\n const { reportId, variantId } = req.params\n\n const reportDefinition: components['schemas']['SingleVariantReportDefinition'] =\n await this.reportingService.getDefinition(\n token,\n reportId as string,\n variantId as string,\n definitionsPath ?? 'definitions/prisons/missing',\n )\n\n const { variant, name } = reportDefinition\n\n try {\n res.render(`dpr/routes/journeys/request-missing-report/form/view`, {\n title: 'This report is not available',\n report: {\n reportId,\n variantId,\n reportName: name,\n name: variant.name,\n description: variant.description || reportDefinition.description,\n },\n user: dprUser,\n csrfToken,\n layoutPath: this.layoutPath,\n postEndpoint: `/dpr/request-missing-report/${reportId}/${variantId}/form/submit`,\n })\n } catch (error) {\n next(error)\n }\n }\n\n POST: RequestHandler = async (req, res, next) => {\n const { body } = req\n const { reportId, variantId, reportName, variantName, 'more-detail': requestDetails } = body\n\n const { token } = LocalsHelper.getValues(res)\n\n try {\n const submission = this.missingReportService.submitMissingReportEntry(token, reportId, variantId, requestDetails)\n if (submission) {\n submission.then(\n () => {\n const queryParams = `reportName=${reportName}&name=${variantName}&reportId=${reportId}&variantId=${variantId}`\n const redirect = `./submitted?${queryParams}`\n\n res.redirect(redirect)\n },\n err => {\n captureDprError(err)\n next(err)\n },\n )\n }\n } catch (error) {\n captureDprError(error)\n next(error)\n }\n }\n}\n\nexport { MissingReportFormController }\nexport default MissingReportFormController\n"],"names":["LocalsHelper","captureDprError"],"mappings":";;;;;;;AAQA,MAAM,2BAA2B,CAAA;AAC/B,IAAA,UAAU;AAEV,IAAA,oBAAoB;AAEpB,IAAA,gBAAgB;IAEhB,WAAA,CAAY,UAAkB,EAAE,QAAkB,EAAA;AAChD,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,QAAA,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,oBAAoB;AACzD,QAAA,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB;IACnD;IAEA,GAAG,GAAmB,OAAO,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;AAC7C,QAAA,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,GAAGA,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;QAClF,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM;AAE1C,QAAA,MAAM,gBAAgB,GACpB,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CACvC,KAAK,EACL,QAAkB,EAClB,SAAmB,EACnB,eAAe,IAAI,6BAA6B,CACjD;AAEH,QAAA,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,gBAAgB;AAE1C,QAAA,IAAI;AACF,YAAA,GAAG,CAAC,MAAM,CAAC,CAAA,oDAAA,CAAsD,EAAE;AACjE,gBAAA,KAAK,EAAE,8BAA8B;AACrC,gBAAA,MAAM,EAAE;oBACN,QAAQ;oBACR,SAAS;AACT,oBAAA,UAAU,EAAE,IAAI;oBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;AAClB,oBAAA,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,gBAAgB,CAAC,WAAW;AACjE,iBAAA;AACD,gBAAA,IAAI,EAAE,OAAO;gBACb,SAAS;gBACT,UAAU,EAAE,IAAI,CAAC,UAAU;AAC3B,gBAAA,YAAY,EAAE,CAAA,4BAAA,EAA+B,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,YAAA,CAAc;AACjF,aAAA,CAAC;QACJ;QAAE,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,KAAK,CAAC;QACb;AACF,IAAA,CAAC;IAED,IAAI,GAAmB,OAAO,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;AAC9C,QAAA,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG;AACpB,QAAA,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI;QAE5F,MAAM,EAAE,KAAK,EAAE,GAAGA,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;AAE7C,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC;YACjH,IAAI,UAAU,EAAE;AACd,gBAAA,UAAU,CAAC,IAAI,CACb,MAAK;oBACH,MAAM,WAAW,GAAG,CAAA,WAAA,EAAc,UAAU,CAAA,MAAA,EAAS,WAAW,CAAA,UAAA,EAAa,QAAQ,CAAA,WAAA,EAAc,SAAS,CAAA,CAAE;AAC9G,oBAAA,MAAM,QAAQ,GAAG,CAAA,YAAA,EAAe,WAAW,EAAE;AAE7C,oBAAA,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACxB,CAAC,EACD,GAAG,IAAG;
|
|
1
|
+
{"version":3,"file":"controller.js","sources":["../../../../../../../../../../../../src/dpr/routes/journeys/request-missing-report/form/controller.ts"],"sourcesContent":["import { RequestHandler } from 'express'\nimport LocalsHelper from '../../../../utils/localsHelper'\nimport { components } from '../../../../types/api'\nimport { Services } from '../../../../types/Services'\nimport MissingReportService from '../../../../services/missingReport/missingReportService'\nimport { ReportingService } from '../../../../services'\nimport { captureDprError } from '../../../../utils/captureError'\n\nclass MissingReportFormController {\n layoutPath: string\n\n missingReportService: MissingReportService\n\n reportingService: ReportingService\n\n constructor(layoutPath: string, services: Services) {\n this.layoutPath = layoutPath\n this.missingReportService = services.missingReportService\n this.reportingService = services.reportingService\n }\n\n GET: RequestHandler = async (req, res, next) => {\n const { token, csrfToken, definitionsPath, dprUser } = LocalsHelper.getValues(res)\n const { reportId, variantId } = req.params\n\n const reportDefinition: components['schemas']['SingleVariantReportDefinition'] =\n await this.reportingService.getDefinition(\n token,\n reportId as string,\n variantId as string,\n definitionsPath ?? 'definitions/prisons/missing',\n )\n\n const { variant, name } = reportDefinition\n\n try {\n res.render(`dpr/routes/journeys/request-missing-report/form/view`, {\n title: 'This report is not available',\n report: {\n reportId,\n variantId,\n reportName: name,\n name: variant.name,\n description: variant.description || reportDefinition.description,\n },\n user: dprUser,\n csrfToken,\n layoutPath: this.layoutPath,\n postEndpoint: `/dpr/request-missing-report/${reportId}/${variantId}/form/submit`,\n })\n } catch (error) {\n next(error)\n }\n }\n\n POST: RequestHandler = async (req, res, next) => {\n const { body } = req\n const { reportId, variantId, reportName, variantName, 'more-detail': requestDetails } = body\n\n const { token } = LocalsHelper.getValues(res)\n\n try {\n const submission = this.missingReportService.submitMissingReportEntry(token, reportId, variantId, requestDetails)\n if (submission) {\n submission.then(\n () => {\n const queryParams = `reportName=${reportName}&name=${variantName}&reportId=${reportId}&variantId=${variantId}`\n const redirect = `./submitted?${queryParams}`\n\n res.redirect(redirect)\n },\n err => {\n captureDprError(err, 'Submit missing report entry error', { reportId, variantId, requestDetails })\n next(err)\n },\n )\n }\n } catch (error) {\n captureDprError(error)\n next(error)\n }\n }\n}\n\nexport { MissingReportFormController }\nexport default MissingReportFormController\n"],"names":["LocalsHelper","captureDprError"],"mappings":";;;;;;;AAQA,MAAM,2BAA2B,CAAA;AAC/B,IAAA,UAAU;AAEV,IAAA,oBAAoB;AAEpB,IAAA,gBAAgB;IAEhB,WAAA,CAAY,UAAkB,EAAE,QAAkB,EAAA;AAChD,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,QAAA,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,oBAAoB;AACzD,QAAA,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB;IACnD;IAEA,GAAG,GAAmB,OAAO,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;AAC7C,QAAA,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,GAAGA,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;QAClF,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM;AAE1C,QAAA,MAAM,gBAAgB,GACpB,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CACvC,KAAK,EACL,QAAkB,EAClB,SAAmB,EACnB,eAAe,IAAI,6BAA6B,CACjD;AAEH,QAAA,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,gBAAgB;AAE1C,QAAA,IAAI;AACF,YAAA,GAAG,CAAC,MAAM,CAAC,CAAA,oDAAA,CAAsD,EAAE;AACjE,gBAAA,KAAK,EAAE,8BAA8B;AACrC,gBAAA,MAAM,EAAE;oBACN,QAAQ;oBACR,SAAS;AACT,oBAAA,UAAU,EAAE,IAAI;oBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;AAClB,oBAAA,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,gBAAgB,CAAC,WAAW;AACjE,iBAAA;AACD,gBAAA,IAAI,EAAE,OAAO;gBACb,SAAS;gBACT,UAAU,EAAE,IAAI,CAAC,UAAU;AAC3B,gBAAA,YAAY,EAAE,CAAA,4BAAA,EAA+B,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,YAAA,CAAc;AACjF,aAAA,CAAC;QACJ;QAAE,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,KAAK,CAAC;QACb;AACF,IAAA,CAAC;IAED,IAAI,GAAmB,OAAO,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;AAC9C,QAAA,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG;AACpB,QAAA,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI;QAE5F,MAAM,EAAE,KAAK,EAAE,GAAGA,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;AAE7C,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC;YACjH,IAAI,UAAU,EAAE;AACd,gBAAA,UAAU,CAAC,IAAI,CACb,MAAK;oBACH,MAAM,WAAW,GAAG,CAAA,WAAA,EAAc,UAAU,CAAA,MAAA,EAAS,WAAW,CAAA,UAAA,EAAa,QAAQ,CAAA,WAAA,EAAc,SAAS,CAAA,CAAE;AAC9G,oBAAA,MAAM,QAAQ,GAAG,CAAA,YAAA,EAAe,WAAW,EAAE;AAE7C,oBAAA,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACxB,CAAC,EACD,GAAG,IAAG;AACJ,oBAAAC,4BAAe,CAAC,GAAG,EAAE,mCAAmC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;oBAClG,IAAI,CAAC,GAAG,CAAC;AACX,gBAAA,CAAC,CACF;YACH;QACF;QAAE,OAAO,KAAK,EAAE;YACdA,4BAAe,CAAC,KAAK,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC;QACb;AACF,IAAA,CAAC;AACF;;;;;"}
|
|
@@ -40,7 +40,8 @@ class RequestStatusController {
|
|
|
40
40
|
}
|
|
41
41
|
catch (error) {
|
|
42
42
|
const message = 'Failed to retrieve report status';
|
|
43
|
-
|
|
43
|
+
const { reportId, executionId, id, type } = req.params;
|
|
44
|
+
captureError.captureDprError(error, message, { reportId, executionId, id, type });
|
|
44
45
|
req.body ??= {};
|
|
45
46
|
req.body.title = message;
|
|
46
47
|
req.body.errorDescription = 'We were unable to retrieve the report status:';
|