@ministryofjustice/hmpps-digital-prison-reporting-frontend 7.1.0 → 7.1.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.
Files changed (48) hide show
  1. package/_networkMocks/dashboard/definitions/visualisations/complete-dataset/bar/vis-definitions/cols-as-labels.d.ts +2 -0
  2. package/cjs/dpr/components/_charts/utils.js.map +1 -1
  3. package/cjs/dpr/components/_dashboards/dashboard-section/utils.js +55 -0
  4. package/cjs/dpr/components/_dashboards/dashboard-section/utils.js.map +1 -1
  5. package/cjs/dpr/components/_dashboards/dashboard-visualisation/types.js.map +1 -1
  6. package/cjs/dpr/components/my-reports/utils.js +2 -1
  7. package/cjs/dpr/components/my-reports/utils.js.map +1 -1
  8. package/cjs/dpr/components/truncate/utils.js +5 -3
  9. package/cjs/dpr/components/truncate/utils.js.map +1 -1
  10. package/cjs/dpr/routes/journeys/request-report/filters/utils.js +133 -47
  11. package/cjs/dpr/routes/journeys/request-report/filters/utils.js.map +1 -1
  12. package/cjs/dpr/routes/journeys/view-report/async/dashboard/validate.js.map +1 -1
  13. package/cjs/dpr/setUpNunjucksFilters.js +2 -28
  14. package/cjs/dpr/setUpNunjucksFilters.js.map +1 -1
  15. package/cjs/dpr/utils/sanitizeHtml.js +36 -0
  16. package/cjs/dpr/utils/sanitizeHtml.js.map +1 -0
  17. package/dpr/components/_charts/utils.js.map +1 -1
  18. package/dpr/components/_dashboards/dashboard-section/utils.js +54 -1
  19. package/dpr/components/_dashboards/dashboard-section/utils.js.map +1 -1
  20. package/dpr/components/_dashboards/dashboard-visualisation/types.js.map +1 -1
  21. package/dpr/components/my-reports/my-reports-list-item/my-reports-list-item-description/view.njk +1 -1
  22. package/dpr/components/my-reports/utils.js +2 -1
  23. package/dpr/components/my-reports/utils.js.map +1 -1
  24. package/dpr/components/truncate/utils.js +5 -3
  25. package/dpr/components/truncate/utils.js.map +1 -1
  26. package/dpr/routes/journeys/request-report/filters/utils.js +133 -47
  27. package/dpr/routes/journeys/request-report/filters/utils.js.map +1 -1
  28. package/dpr/routes/journeys/view-report/async/dashboard/validate.js.map +1 -1
  29. package/dpr/setUpNunjucksFilters.js +2 -28
  30. package/dpr/setUpNunjucksFilters.js.map +1 -1
  31. package/dpr/utils/sanitizeHtml.js +34 -0
  32. package/dpr/utils/sanitizeHtml.js.map +1 -0
  33. package/package.json +1 -1
  34. package/src/dpr/components/_charts/utils.d.ts +3 -3
  35. package/src/dpr/components/_dashboards/dashboard-section/utils.d.ts +16 -1
  36. package/src/dpr/components/_dashboards/dashboard-visualisation/types.d.ts +11 -8
  37. package/src/dpr/utils/sanitizeHtml.d.ts +1 -0
  38. package/test-app/mocks/mockClients/dashboards/dashboard-definitions.d.ts +22 -0
  39. package/test-app/mocks/mockClients/dashboards/definitions/examples/bar/bar-chart-stacked-dashboard.d.ts +47 -0
  40. package/test-app/mocks/mockClients/dashboards/definitions/examples/bar/index.d.ts +2 -1
  41. package/test-app/mocks/mockClients/dashboards/definitions/examples/visualisations/bar.d.ts +58 -0
  42. package/test-app/mocks/mockClients/dashboards/definitions/parent-child/child-dashboard-1.d.ts +20 -0
  43. package/test-app/mocks/mockClients/dashboards/definitions/parent-child/child-dashboard-2.d.ts +20 -0
  44. package/test-app/mocks/mockClients/dashboards/definitions/parent-child/index.d.ts +23 -0
  45. package/test-app/mocks/mockClients/dashboards/definitions/parent-child/parent-dashboard.d.ts +42 -0
  46. package/test-app/mocks/mockClients/dashboards/mock-client.d.ts +42 -0
  47. package/test-app/mocks/mockClients/reports/mockReportDefinition.d.ts +28 -0
  48. package/test-app/mocks/mockClients/reports/mockReportingClient.d.ts +56 -0
@@ -7,3 +7,5 @@ export declare const dataQualityAllBar: components['schemas']['DashboardVisualis
7
7
  export declare const dataQualityAllBarHorizontal: components['schemas']['DashboardVisualisationDefinition'];
8
8
  export declare const dataQualityAllBarWithUnit: components['schemas']['DashboardVisualisationDefinition'];
9
9
  export declare const dataQualityAllBarWithUnitHorizontal: components['schemas']['DashboardVisualisationDefinition'];
10
+ export declare const verticalStackedBarChart: components['schemas']['DashboardVisualisationDefinition'];
11
+ export declare const horizontalStackedBarChart: components['schemas']['DashboardVisualisationDefinition'];
@@ -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 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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"}
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 getDateValue,\n getTimestampColumn,\n getTimestampMeasure,\n} from '../../utils/Dashboards/VisualisationDatasetHelper'\nimport { mapUnitToSymbol } from '../../utils/Dashboards/VisualisationUnitHelper'\nimport DashboardListUtils from '../_dashboards/dashboard-list/utils'\nimport {\n DashboardVisualisationCardData,\n DashboardVisualisationData,\n DashboardVisualisationType,\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): DashboardVisualisationCardData | 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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"}
@@ -55,6 +55,61 @@ const createDashboardSections = (dashboardDefinition, dashboardData, query, dash
55
55
  return { id, title: title || '', description: description || '', visualisations };
56
56
  });
57
57
  };
58
+ /**
59
+ * Add variant ID to section
60
+ *
61
+ * @param {components['schemas']['DashboardSectionDefinition']} section
62
+ * @param {string} variantId
63
+ * @return {*} {components['schemas']['DashboardSectionDefinition']}
64
+ */
65
+ const addVariantIdToSection = (section, variantId) => ({
66
+ ...section,
67
+ visualisations: section.visualisations.map(visualisation => ({
68
+ ...visualisation,
69
+ variantId,
70
+ })),
71
+ });
72
+ /**
73
+ * Builds a master section collection from a parent dashboard and its child variants.
74
+ *
75
+ * @param {DashboardDefintion} definition
76
+ * @return {*} {components['schemas']['DashboardSectionDefinition'][]}
77
+ */
78
+ const buildMasterSections = (definition) => {
79
+ const parentSections = definition.sections.map(section => addVariantIdToSection(section, definition.id));
80
+ return definition.childVariants.reduce((sections, childVariant) => childVariant.sections
81
+ .map(section => addVariantIdToSection(section, childVariant.id))
82
+ .reduce(mergeSection, sections), parentSections);
83
+ };
84
+ /**
85
+ * Merges the sections
86
+ *
87
+ * Rules:
88
+ * - Parent sections are added first and retain their original order.
89
+ * - Child variants are processed in array order.
90
+ * - Child sections are processed in section order within each variant.
91
+ * - If a child section ID matches an existing section ID, its visualisations are appended to that section.
92
+ * - If a child section ID does not exist, the section is appended to the end of the collection.
93
+ * - Visualisation order is preserved as defined in the source section
94
+ *
95
+ * @param {components['schemas']['DashboardSectionDefinition'][]} sections
96
+ * @param {components['schemas']['DashboardSectionDefinition']} section
97
+ * @return {*}
98
+ */
99
+ const mergeSection = (sections, section) => {
100
+ const existingIndex = sections.findIndex(existing => existing.id === section.id);
101
+ if (existingIndex === -1) {
102
+ return [...sections, section];
103
+ }
104
+ return sections.map((existing, index) => index === existingIndex
105
+ ? {
106
+ ...existing,
107
+ visualisations: [...existing.visualisations, ...section.visualisations],
108
+ }
109
+ : existing);
110
+ };
58
111
 
112
+ exports.addVariantIdToSection = addVariantIdToSection;
113
+ exports.buildMasterSections = buildMasterSections;
59
114
  exports.createDashboardSections = createDashboardSections;
60
115
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-section/utils.ts"],"sourcesContent":["import { DashboardDataResponse } from '../../../types/Metrics'\nimport { components } from '../../../types/api'\nimport { PartialDate } from '../../_filters/types'\nimport { DashboardSection, DashboardVisualisation, DashboardVisualisationType } from '../dashboard-visualisation/types'\nimport ScorecardsUtils from '../scorecard/utils'\nimport ScorecardVisualisation from '../scorecard/Scorecard'\nimport ScorecardGroupVisualisation from '../scorecard-group/ScorecardGroup'\nimport DashboardListUtils from '../dashboard-list/utils'\nimport ChartUtils from '../../_charts/utils'\nimport { getFeatureFlagVisTypeMap } from '../dashboard-visualisation/utils'\n\nexport const createDashboardSections = (\n dashboardDefinition: components['schemas']['DashboardDefinition'],\n dashboardData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n dashboardFeatureFlags: Record<string, boolean>,\n partialDate?: PartialDate,\n): DashboardSection[] => {\n return dashboardDefinition.sections.map((section: components['schemas']['DashboardSectionDefinition']) => {\n const { id, display: title, description } = section\n const featureFlagVisTypeMap = getFeatureFlagVisTypeMap(dashboardFeatureFlags)\n\n let hasScorecard = false\n const visualisations: DashboardVisualisation[] = section.visualisations.map(\n (visDefinition: components['schemas']['DashboardVisualisationDefinition']) => {\n const { type, display, description: visDescription, id: visId } = visDefinition\n const isEnabled = featureFlagVisTypeMap[type]\n\n let data: DashboardVisualisation['data'] | undefined\n\n switch (type) {\n case DashboardVisualisationType.LIST:\n data = DashboardListUtils.createList(visDefinition, dashboardData)\n break\n\n case DashboardVisualisationType.SCORECARD:\n hasScorecard = true\n data = new ScorecardVisualisation().withDefinition(visDefinition).withData(dashboardData).build()\n break\n\n case DashboardVisualisationType.SCORECARD_GROUP:\n data = new ScorecardGroupVisualisation().withDefinition(visDefinition).withData(dashboardData).build()\n break\n\n case DashboardVisualisationType.BAR:\n case DashboardVisualisationType.LINE:\n case DashboardVisualisationType.DONUT: {\n data = ChartUtils.createChart(visDefinition, dashboardData, type)\n break\n }\n case DashboardVisualisationType.MATRIX_TIMESERIES:\n case DashboardVisualisationType.BAR_TIMESERIES:\n case DashboardVisualisationType.LINE_TIMESERIES: {\n data = ChartUtils.createTimeseriesCharts(visDefinition, dashboardData, type, query, partialDate)\n break\n }\n default:\n break\n }\n\n return {\n id: visId,\n title: display || '',\n description: visDescription || '',\n type,\n data,\n isEnabled: isEnabled ?? true,\n }\n },\n )\n\n if (hasScorecard)\n ScorecardsUtils.mergeScorecardsIntoGroup(\n visualisations,\n featureFlagVisTypeMap[DashboardVisualisationType.SCORECARD_GROUP],\n )\n\n return { id, title: title || '', description: description || '', visualisations }\n })\n}\n"],"names":["getFeatureFlagVisTypeMap","DashboardVisualisationType","DashboardListUtils","ScorecardVisualisation","ScorecardGroupVisualisation","ChartUtils","ScorecardsUtils"],"mappings":";;;;;;;;;;AAWO,MAAM,uBAAuB,GAAG,CACrC,mBAAiE,EACjE,aAAsC,EACtC,KAAwC,EACxC,qBAA8C,EAC9C,WAAyB,KACH;IACtB,OAAO,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAA4D,KAAI;QACvG,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO;AACnD,QAAA,MAAM,qBAAqB,GAAGA,8BAAwB,CAAC,qBAAqB,CAAC;QAE7E,IAAI,YAAY,GAAG,KAAK;QACxB,MAAM,cAAc,GAA6B,OAAO,CAAC,cAAc,CAAC,GAAG,CACzE,CAAC,aAAwE,KAAI;AAC3E,YAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,aAAa;AAC/E,YAAA,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC;AAE7C,YAAA,IAAI,IAAgD;YAEpD,QAAQ,IAAI;gBACV,KAAKC,gCAA0B,CAAC,IAAI;oBAClC,IAAI,GAAGC,eAAkB,CAAC,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC;oBAClE;gBAEF,KAAKD,gCAA0B,CAAC,SAAS;oBACvC,YAAY,GAAG,IAAI;AACnB,oBAAA,IAAI,GAAG,IAAIE,gCAAsB,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE;oBACjG;gBAEF,KAAKF,gCAA0B,CAAC,eAAe;AAC7C,oBAAA,IAAI,GAAG,IAAIG,0CAA2B,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE;oBACtG;gBAEF,KAAKH,gCAA0B,CAAC,GAAG;gBACnC,KAAKA,gCAA0B,CAAC,IAAI;AACpC,gBAAA,KAAKA,gCAA0B,CAAC,KAAK,EAAE;oBACrC,IAAI,GAAGI,eAAU,CAAC,WAAW,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;oBACjE;gBACF;gBACA,KAAKJ,gCAA0B,CAAC,iBAAiB;gBACjD,KAAKA,gCAA0B,CAAC,cAAc;AAC9C,gBAAA,KAAKA,gCAA0B,CAAC,eAAe,EAAE;AAC/C,oBAAA,IAAI,GAAGI,eAAU,CAAC,sBAAsB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC;oBAChG;gBACF;;YAKF,OAAO;AACL,gBAAA,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,OAAO,IAAI,EAAE;gBACpB,WAAW,EAAE,cAAc,IAAI,EAAE;gBACjC,IAAI;gBACJ,IAAI;gBACJ,SAAS,EAAE,SAAS,IAAI,IAAI;aAC7B;AACH,QAAA,CAAC,CACF;AAED,QAAA,IAAI,YAAY;AACd,YAAAC,eAAe,CAAC,wBAAwB,CACtC,cAAc,EACd,qBAAqB,CAACL,gCAA0B,CAAC,eAAe,CAAC,CAClE;AAEH,QAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE,WAAW,IAAI,EAAE,EAAE,cAAc,EAAE;AACnF,IAAA,CAAC,CAAC;AACJ;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-section/utils.ts"],"sourcesContent":["import { DashboardDataResponse } from '../../../types/Metrics'\nimport { components } from '../../../types/api'\nimport { PartialDate } from '../../_filters/types'\nimport {\n DashboardDefintion,\n DashboardSection,\n DashboardVisualisation,\n DashboardVisualisationType,\n} from '../dashboard-visualisation/types'\nimport ScorecardsUtils from '../scorecard/utils'\nimport ScorecardVisualisation from '../scorecard/Scorecard'\nimport ScorecardGroupVisualisation from '../scorecard-group/ScorecardGroup'\nimport DashboardListUtils from '../dashboard-list/utils'\nimport ChartUtils from '../../_charts/utils'\nimport { getFeatureFlagVisTypeMap } from '../dashboard-visualisation/utils'\n\nexport const createDashboardSections = (\n dashboardDefinition: components['schemas']['DashboardDefinition'],\n dashboardData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n dashboardFeatureFlags: Record<string, boolean>,\n partialDate?: PartialDate,\n): DashboardSection[] => {\n return dashboardDefinition.sections.map((section: components['schemas']['DashboardSectionDefinition']) => {\n const { id, display: title, description } = section\n const featureFlagVisTypeMap = getFeatureFlagVisTypeMap(dashboardFeatureFlags)\n\n let hasScorecard = false\n const visualisations: DashboardVisualisation[] = section.visualisations.map(\n (visDefinition: components['schemas']['DashboardVisualisationDefinition']) => {\n const { type, display, description: visDescription, id: visId } = visDefinition\n const isEnabled = featureFlagVisTypeMap[type]\n\n let data: DashboardVisualisation['data'] | undefined\n\n switch (type) {\n case DashboardVisualisationType.LIST:\n data = DashboardListUtils.createList(visDefinition, dashboardData)\n break\n\n case DashboardVisualisationType.SCORECARD:\n hasScorecard = true\n data = new ScorecardVisualisation().withDefinition(visDefinition).withData(dashboardData).build()\n break\n\n case DashboardVisualisationType.SCORECARD_GROUP:\n data = new ScorecardGroupVisualisation().withDefinition(visDefinition).withData(dashboardData).build()\n break\n\n case DashboardVisualisationType.BAR:\n case DashboardVisualisationType.LINE:\n case DashboardVisualisationType.DONUT: {\n data = ChartUtils.createChart(visDefinition, dashboardData, type)\n break\n }\n case DashboardVisualisationType.MATRIX_TIMESERIES:\n case DashboardVisualisationType.BAR_TIMESERIES:\n case DashboardVisualisationType.LINE_TIMESERIES: {\n data = ChartUtils.createTimeseriesCharts(visDefinition, dashboardData, type, query, partialDate)\n break\n }\n default:\n break\n }\n\n return {\n id: visId,\n title: display || '',\n description: visDescription || '',\n type,\n data,\n isEnabled: isEnabled ?? true,\n }\n },\n )\n\n if (hasScorecard)\n ScorecardsUtils.mergeScorecardsIntoGroup(\n visualisations,\n featureFlagVisTypeMap[DashboardVisualisationType.SCORECARD_GROUP],\n )\n\n return { id, title: title || '', description: description || '', visualisations }\n })\n}\n\n/**\n * Add variant ID to section\n *\n * @param {components['schemas']['DashboardSectionDefinition']} section\n * @param {string} variantId\n * @return {*} {components['schemas']['DashboardSectionDefinition']}\n */\nexport const addVariantIdToSection = (\n section: components['schemas']['DashboardSectionDefinition'],\n variantId: string,\n): components['schemas']['DashboardSectionDefinition'] => ({\n ...section,\n visualisations: section.visualisations.map(visualisation => ({\n ...visualisation,\n variantId,\n })),\n})\n\n/**\n * Builds a master section collection from a parent dashboard and its child variants.\n *\n * @param {DashboardDefintion} definition\n * @return {*} {components['schemas']['DashboardSectionDefinition'][]}\n */\nexport const buildMasterSections = (\n definition: DashboardDefintion, // TODO: Update this type to components['schemas']['DashboardDefinition'] when `childVariants` field is present\n): components['schemas']['DashboardSectionDefinition'][] => {\n const parentSections = definition.sections.map(section => addVariantIdToSection(section, definition.id))\n\n return definition.childVariants.reduce(\n (sections, childVariant) =>\n childVariant.sections\n .map(section => addVariantIdToSection(section, childVariant.id))\n .reduce(mergeSection, sections),\n parentSections,\n )\n}\n\n/**\n * Merges the sections\n *\n * Rules:\n * - Parent sections are added first and retain their original order.\n * - Child variants are processed in array order.\n * - Child sections are processed in section order within each variant.\n * - If a child section ID matches an existing section ID, its visualisations are appended to that section.\n * - If a child section ID does not exist, the section is appended to the end of the collection.\n * - Visualisation order is preserved as defined in the source section\n *\n * @param {components['schemas']['DashboardSectionDefinition'][]} sections\n * @param {components['schemas']['DashboardSectionDefinition']} section\n * @return {*}\n */\nconst mergeSection = (\n sections: components['schemas']['DashboardSectionDefinition'][],\n section: components['schemas']['DashboardSectionDefinition'],\n) => {\n const existingIndex = sections.findIndex(existing => existing.id === section.id)\n\n if (existingIndex === -1) {\n return [...sections, section]\n }\n\n return sections.map((existing, index) =>\n index === existingIndex\n ? {\n ...existing,\n visualisations: [...existing.visualisations, ...section.visualisations],\n }\n : existing,\n )\n}\n"],"names":["getFeatureFlagVisTypeMap","DashboardVisualisationType","DashboardListUtils","ScorecardVisualisation","ScorecardGroupVisualisation","ChartUtils","ScorecardsUtils"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-visualisation/types.ts"],"sourcesContent":["import z from 'zod'\nimport { components } from '../../../types/api'\nimport { Scorecard, ScorecardGroup } from '../scorecard/types'\nimport { MatrixChartData } from '../../_charts/chart/heatmap/types'\nimport { ChartDetails } from '../../../types/Charts'\nimport DashboardVisualisationSchemas from './Validate'\nimport { BarDefinitionMeasure } from '../../_charts/chart/bar/types'\nimport { DoughnutDefinitionMeasure } from '../../_charts/chart/doughnut/types'\nimport { LineDefinitionMeasure } from '../../_charts/chart/line/types'\nimport { LineTimeseriesDefinitionMeasure } from '../../_charts/chart/line-timeseries/types'\nimport { BarTimeseriesDefinitionMeasure } from '../../_charts/chart/bar-timeseries/types'\nimport { ChartOptionsType } from '../../_charts/chart/chart-config'\nimport { PartialDate } from '../../_filters/types'\n\nexport interface DashboardSection {\n id: string\n title?: string\n description?: string\n visualisations?: DashboardVisualisation[]\n}\n\nexport interface DashboardVisualisation {\n id: string\n type: components['schemas']['DashboardVisualisationDefinition']['type']\n title?: string | undefined\n description?: string | undefined\n isEnabled: boolean\n data:\n | Scorecard\n | Scorecard[]\n | ScorecardGroup[]\n | DashboardVisualisatonCardData\n | DashboardVisualisationTable\n | undefined\n}\n\nexport interface DashboardVisualisatonCardData {\n chart?: DashboardVisualisationData | undefined\n table?: MoJTable | undefined\n details?: ChartDetails | undefined\n}\n\nexport interface DashboardVisualisationData {\n type: DashboardVisualisationType\n options?: DashboardVisualisationDataOptions\n data: DashboardVisualisationDataValues\n}\n\ninterface DashboardVisualisationDataOptions {\n height?: number\n unit?: components['schemas']['DashboardVisualisationColumnDefinition']['unit']\n timeseries?: boolean\n}\n\nexport interface DashboardVisualisationDataValues {\n labels?: string[]\n datasets: DashboardVisualisationDataSet[]\n axis?: 'x' | 'y'\n config: ChartOptionsType\n partialDate?: PartialDate | undefined\n}\n\nexport interface DashboardVisualisationDataSet {\n label: string\n data: number[] | MatrixChartData[]\n total?: number\n}\n\nexport interface DashboardVisualisationTable {\n table: MoJTable\n ts?: string\n}\n\nexport interface MoJTable {\n head: MoJTableHead[]\n rows: MoJTableRow[][]\n}\n\nexport interface MoJTableRow {\n text?: string\n html?: string\n}\n\nexport interface MoJTableHead {\n text?: string\n html?: string\n classes?: string\n attributes?: Record<string, string>\n}\n\nexport enum DashboardVisualisationType {\n LIST = 'list',\n DONUT = 'doughnut',\n BAR = 'bar',\n LINE = 'line',\n MATRIX = 'matrix',\n MATRIX_TIMESERIES = 'matrix-timeseries',\n BAR_TIMESERIES = 'bar-timeseries',\n LINE_TIMESERIES = 'line-timeseries',\n SCORECARD = 'scorecard',\n SCORECARD_GROUP = 'scorecard-group',\n}\n\nexport type DashboardVisualisationOptions = ListDashboardVisualisationOptions | BucketDashboardVisualisationOptions\n\nexport interface ListDashboardVisualisationOptions {\n showLatest?: boolean\n columnsAsList?: boolean\n}\n\nexport interface BucketDashboardVisualisationOptions {\n useRagColour?: boolean\n buckets?: DashboardVisualisationBucket[]\n baseColour?: string\n}\n\nexport interface DashboardVisualisationBucket {\n min?: number | undefined\n max?: number | undefined\n hexColour?: string | undefined\n}\n\nexport type VisualisationDefinitionType = z.infer<typeof DashboardVisualisationSchemas.DashboardVisualisationSchema>\nexport type VisualisationDefinitionKey = z.infer<typeof DashboardVisualisationSchemas.DashboardVisualisationKeySchema>\nexport type VisualisationDefinitionMeasure = z.infer<\n typeof DashboardVisualisationSchemas.DashboardVisualisationMeasureSchema\n>\n\nexport type ChartMeasure =\n | BarDefinitionMeasure\n | DoughnutDefinitionMeasure\n | LineDefinitionMeasure\n | VisualisationDefinitionMeasure\n\nexport type TimeseriesChartMeasure = LineTimeseriesDefinitionMeasure[] | BarTimeseriesDefinitionMeasure[]\n"],"names":["DashboardVisualisationType"],"mappings":";;AA0FYA;AAAZ,CAAA,UAAY,0BAA0B,EAAA;AACpC,IAAA,0BAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,0BAAA,CAAA,OAAA,CAAA,GAAA,UAAkB;AAClB,IAAA,0BAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,0BAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,0BAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,0BAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,0BAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,0BAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC;AACnC,IAAA,0BAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,0BAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC;AACrC,CAAC,EAXWA,kCAA0B,KAA1BA,kCAA0B,GAAA,EAAA,CAAA,CAAA;;"}
1
+ {"version":3,"file":"types.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-visualisation/types.ts"],"sourcesContent":["import z from 'zod'\nimport { components } from '../../../types/api'\nimport { ChartDetails } from '../../../types/Charts'\nimport { BarTimeseriesDefinitionMeasure } from '../../_charts/chart/bar-timeseries/types'\nimport { BarDefinitionMeasure } from '../../_charts/chart/bar/types'\nimport { ChartOptionsType } from '../../_charts/chart/chart-config'\nimport { DoughnutDefinitionMeasure } from '../../_charts/chart/doughnut/types'\nimport { MatrixChartData } from '../../_charts/chart/heatmap/types'\nimport { LineTimeseriesDefinitionMeasure } from '../../_charts/chart/line-timeseries/types'\nimport { LineDefinitionMeasure } from '../../_charts/chart/line/types'\nimport { PartialDate } from '../../_filters/types'\nimport { Scorecard, ScorecardGroup } from '../scorecard/types'\nimport DashboardVisualisationSchemas from './Validate'\n\nexport interface DashboardSection {\n id: string\n title?: string\n description?: string\n visualisations?: DashboardVisualisation[]\n}\n\nexport interface DashboardVisualisation {\n id: string\n type: components['schemas']['DashboardVisualisationDefinition']['type']\n title?: string | undefined\n description?: string | undefined\n isEnabled: boolean\n data:\n | Scorecard\n | Scorecard[]\n | ScorecardGroup[]\n | DashboardVisualisationCardData\n | DashboardVisualisationTable\n | undefined\n}\n\nexport interface DashboardVisualisationCardData {\n chart?: DashboardVisualisationData | undefined\n table?: MoJTable | undefined\n details?: ChartDetails | undefined\n}\n\nexport interface DashboardVisualisationData {\n type: DashboardVisualisationType\n options?: DashboardVisualisationDataOptions\n data: DashboardVisualisationDataValues\n}\n\ninterface DashboardVisualisationDataOptions {\n height?: number\n unit?: components['schemas']['DashboardVisualisationColumnDefinition']['unit']\n timeseries?: boolean\n}\n\nexport interface DashboardVisualisationDataValues {\n labels?: string[]\n datasets: DashboardVisualisationDataSet[]\n axis?: 'x' | 'y'\n config: ChartOptionsType\n partialDate?: PartialDate | undefined\n}\n\nexport interface DashboardVisualisationDataSet {\n label: string\n data: number[] | MatrixChartData[]\n total?: number\n}\n\nexport interface DashboardVisualisationTable {\n table: MoJTable\n ts?: string\n}\n\nexport interface MoJTable {\n head: MoJTableHead[]\n rows: MoJTableRow[][]\n}\n\nexport interface MoJTableRow {\n text?: string\n html?: string\n}\n\nexport interface MoJTableHead {\n text?: string\n html?: string\n classes?: string\n attributes?: Record<string, string>\n}\n\nexport enum DashboardVisualisationType {\n LIST = 'list',\n DONUT = 'doughnut',\n BAR = 'bar',\n LINE = 'line',\n MATRIX = 'matrix',\n MATRIX_TIMESERIES = 'matrix-timeseries',\n BAR_TIMESERIES = 'bar-timeseries',\n LINE_TIMESERIES = 'line-timeseries',\n SCORECARD = 'scorecard',\n SCORECARD_GROUP = 'scorecard-group',\n}\n\nexport type DashboardVisualisationOptions = ListDashboardVisualisationOptions | BucketDashboardVisualisationOptions\n\nexport interface ListDashboardVisualisationOptions {\n showLatest?: boolean\n columnsAsList?: boolean\n}\n\nexport interface BucketDashboardVisualisationOptions {\n useRagColour?: boolean\n buckets?: DashboardVisualisationBucket[]\n baseColour?: string\n}\n\nexport interface DashboardVisualisationBucket {\n min?: number | undefined\n max?: number | undefined\n hexColour?: string | undefined\n}\n\nexport type VisualisationDefinitionType = z.infer<typeof DashboardVisualisationSchemas.DashboardVisualisationSchema>\nexport type VisualisationDefinitionKey = z.infer<typeof DashboardVisualisationSchemas.DashboardVisualisationKeySchema>\nexport type VisualisationDefinitionMeasure = z.infer<\n typeof DashboardVisualisationSchemas.DashboardVisualisationMeasureSchema\n>\n\nexport type ChartMeasure =\n | BarDefinitionMeasure\n | DoughnutDefinitionMeasure\n | LineDefinitionMeasure\n | VisualisationDefinitionMeasure\n\nexport type TimeseriesChartMeasure = LineTimeseriesDefinitionMeasure[] | BarTimeseriesDefinitionMeasure[]\n\n// NOTE: This is a temporary type while to mock the new field which will be added the the schema in ticket https://dsdmoj.atlassian.net/browse/DPR2-2981\n// TODO: Remove this type and update all references to it when the components['schemas']['DashboardDefinition'] type is up to date\nexport type DashboardDefintion = components['schemas']['DashboardDefinition'] & {\n childVariants: components['schemas']['DashboardDefinition'][]\n}\n"],"names":["DashboardVisualisationType"],"mappings":";;AA0FYA;AAAZ,CAAA,UAAY,0BAA0B,EAAA;AACpC,IAAA,0BAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,0BAAA,CAAA,OAAA,CAAA,GAAA,UAAkB;AAClB,IAAA,0BAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,0BAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,0BAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,0BAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,0BAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,0BAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC;AACnC,IAAA,0BAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,0BAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC;AACrC,CAAC,EAXWA,kCAA0B,KAA1BA,kCAA0B,GAAA,EAAA,CAAA,CAAA;;"}
@@ -9,6 +9,7 @@ var utils$1 = require('./my-reports-list-item/utils.js');
9
9
  var logger = require('../../utils/logger.js');
10
10
  var getReportStatus = require('../../utils/ReportStatus/getReportStatus.js');
11
11
  var captureError = require('../../utils/captureError.js');
12
+ var utils$2 = require('../truncate/utils.js');
12
13
 
13
14
  /**
14
15
  * Initialises the "My Reports" component data
@@ -204,7 +205,7 @@ const buildBookmarkListItems = async (res, services) => {
204
205
  reportName,
205
206
  reportType,
206
207
  },
207
- description,
208
+ description: utils$2.renderTruncateAsHtml({ stringValue: description, classes: 'govuk-body-s', charLength: 50 }),
208
209
  actions: buildBookmarkActionsCell(bookmark, res),
209
210
  };
210
211
  });
@@ -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 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":";;;;;;;;;;;;AA4BA;;;;;;;AAOG;AACI,MAAM,aAAa,GAAG,OAC3B,GAAY,EACZ,GAAa,EACb,QAAkB,EAClB,OAAsC,KACF;IACpC,MAAM,EAAE,kBAAkB,EAAE,GAAGA,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;AAC1D,IAAA,MAAM,yBAAyB,CAAC,GAAG,EAAE,QAAQ,CAAC;IAE9C,OAAO;AACL,QAAA,IAAI,kBAAkB,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC5E,SAAS,EAAE,MAAM,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC;QACjD,MAAM,EAAE,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC;AAC3C,QAAA,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC;KAC7C;AACH;AAEA,MAAM,yBAAyB,GAAG,OAAO,GAAa,EAAE,QAAkB,KAAI;AAC5E,IAAA,MAAM,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,GAAGA,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;IAE/E,IAAIC,oCAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AACzC,QAAA,IAAI;AACF,YAAA,MAAM,gBAAgB,GAAG,MAAMC,qCAAqB,CAAC;gBACnD,gBAAgB;gBAChB,qBAAqB;gBACrB,QAAQ;gBACR,GAAG;AACJ,aAAA,CAAC;YAEF,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,gBAAgB,CAAC,gBAAgB;YAClE,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAAC,qBAAqB;AAE5E,YAAAC,iCAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;QACpC;QAAE,OAAO,KAAK,EAAE;AACd,YAAAC,cAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QACrB;IACF;IAEA,OAAO;QACL,gBAAgB;QAChB,qBAAqB;KACtB;AACH,CAAC;AAED;;;;;;;AAOG;AACH,MAAM,aAAa,GAAG,OACpB,GAAa,EACb,QAAkB,EAClB,OAAsC,KACJ;IAClC,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC;AAC9D,IAAA,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,UAAU,EAAEC,cAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IACxE,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC;IAEjD,OAAO;AACL,QAAA,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAEA,cAAQ,CAAC,SAAS;AAC5B,QAAA,QAAQ,EAAE,aAAa,CAACA,cAAQ,CAAC,SAAS,CAAC;QAC3C,KAAK;QACL,MAAM;KACP;AACH,CAAC;AAED;;;;;;AAMG;AACI,MAAM,aAAa,GAAG,OAAO,GAAY,EAAE,GAAa,EAAE,OAAsC,KAAI;IACzG,MAAM,EAAE,SAAS,EAAE,GAAGL,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;AACjD,IAAA,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAEK,cAAQ,CAAC,SAAS,CAAC;AACrE,IAAA,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,UAAU,EAAEA,cAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IACxE,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC;IAEjD,OAAO;AACL,QAAA,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAEA,cAAQ,CAAC,SAAS;QAC5B,SAAS;AACT,QAAA,QAAQ,EAAE,aAAa,CAACA,cAAQ,CAAC,SAAS,CAAC;QAC3C,KAAK;QACL,MAAM;KACP;AACH;AAEA;;;;;;AAMG;AACI,MAAM,UAAU,GAAG,OAAO,GAAY,EAAE,GAAa,EAAE,OAAsC,KAAI;IACtG,MAAM,EAAE,SAAS,EAAE,GAAGL,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;AACjD,IAAA,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAEK,cAAQ,CAAC,MAAM,CAAC;AAClE,IAAA,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,UAAU,EAAEA,cAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACrE,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC;IAEjD,OAAO;AACL,QAAA,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAEA,cAAQ,CAAC,MAAM;QACzB,SAAS;AACT,QAAA,QAAQ,EAAE,aAAa,CAACA,cAAQ,CAAC,MAAM,CAAC;QACxC,KAAK;QACL,MAAM;KACP;AACH;AAEA;AACA;AACA;AAEA;;;;;;;AAOG;AACH,MAAM,cAAc,GAAG,OAAO,GAAY,EAAE,GAAa,EAAE,QAAkB,KAAgC;IAC3G,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC;IACpD,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAsB,KAAI;AAC7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAuB;AAC3C,QAAA,OAAOC,4BAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC;AAC/D,IAAA,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,KAAwB,EAAE,OAAsC,KAAI;IAC1F,OAAO,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK;AACnE,CAAC;AAED;;;;;;;;AAQG;AACH,MAAM,WAAW,GAAG,CAClB,GAAa,EACb,KAAwB,EACxB,QAAkB,EAClB,OAAsC,KACf;AACvB,IAAA,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;QACrB,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,KAAK,EAAE,KAAK,CAAC,MAAM;SACpB;IACH;AAEA,IAAA,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO;AAE3B,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM;AAC1B,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC,MAAM;AAE7D,IAAA,IAAI,IAAI;AACR,IAAA,IAAI,OAAO,GAAG,KAAK,EAAE;AACnB,QAAA,MAAM,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,GAAGC,2BAAc,CAAC,GAAG,CAAC;QAC3F,QAAQ,QAAQ;YACd,KAAKF,cAAQ,CAAC,SAAS;AACrB,gBAAA,IAAI,GAAG,CAAA,EAAG,gBAAgB,CAAA,KAAA,CAAO;gBACjC;YACF,KAAKA,cAAQ,CAAC,SAAS;AACrB,gBAAA,IAAI,GAAG,CAAA,EAAG,iBAAiB,CAAA,KAAA,CAAO;gBAClC;YACF,KAAKA,cAAQ,CAAC,MAAM;AAClB,gBAAA,IAAI,GAAG,CAAA,EAAG,sBAAsB,CAAA,KAAA,CAAO;gBACvC;AACF,YAAA;AACE,gBAAA,IAAI,GAAG,CAAA,EAAG,iBAAiB,CAAA,KAAA,CAAO;gBAClC;;IAEN;IACA,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,KAAK;QACL,IAAI;QACJ,OAAO;KACR;AACH,CAAC;AAED;;;;;;AAMG;AACH,MAAM,sBAAsB,GAAG,OAAO,GAAa,EAAE,QAAkB,KAAgC;IACrG,MAAM,EAAE,SAAS,EAAE,GAAGL,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;;IAGjD,IAAI,CAAC,SAAS,EAAE;AACd,QAAA,OAAO,EAAE;IACX;;IAGA,MAAM,eAAe,GAAsB,MAAM,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC;AAEvF,IAAA,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,IAAG;QACpC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,QAAQ;QAC9D,OAAO;AACL,YAAA,KAAK,EAAE;AACL,gBAAA,WAAW,EAAE,IAAI;gBACjB,UAAU;gBACV,UAAU;AACX,aAAA;YACD,WAAW;AACX,YAAA,OAAO,EAAE,wBAAwB,CAAC,QAAQ,EAAE,GAAG,CAAC;SACjD;AACH,IAAA,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;AAOG;AACH,MAAM,YAAY,GAAG,OACnB,SAA8B,EAC9B,QAAkB,EAClB,GAAa,KACiB;AAC9B,IAAA,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAGA,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;AAE9D,IAAA,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,SAAS,CAAC,GAAG,CAAC,OAAM,EAAE,KAAG;AACvB,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC;YAEtF,OAAO;gBACL,EAAE,EAAE,QAAQ,CAAC,QAAQ;gBACrB,QAAQ,EAAE,EAAE,CAAC,QAAQ;gBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,IAAI,GAAG;gBACX,QAAQ,EAAE,EAAE,CAAC,QAAQ;AACrB,gBAAA,EAAE,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE;aAC1B;AACD,YAAAQ,4BAAe,CAAC,KAAK,EAAE,iCAAiC,EAAE,IAAI,CAAC;AAE/D,YAAA,OAAO,IAAI;QACb;IACF,CAAC,CAAC,CACH;AAED,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAA4B,EAAE,KAAK,IAAI,CAAC;AAClE,CAAC;AAED;;;;;;;;AAQG;AACH,MAAM,yBAAyB,GAAG,OAChC,EAAqB,EACrB,QAAkB,EAClB,KAAa,EACb,eAAuB,KACrB;IACF,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;AAC5C,IAAA,MAAM,QAAQ,GAAG,SAAS,IAAI,EAAE;AAEhC,IAAA,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,eAAe,CAAC;IAEtG,IAAI,CAAC,IAAI,IAAI,IAAI,KAAKC,sBAAU,CAAC,MAAM,EAAE;AACvC,QAAA,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC;AAC5G,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;QAEhE,OAAO;YACL,QAAQ;YACR,UAAU,EAAEA,sBAAU,CAAC,MAAM;AAC7B,YAAA,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI;YACnC,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,IAAI,EAAE;AAC3E,YAAA,QAAQ,EAAE,UAAU,EAAE,QAAQ,GAAI,UAAU,CAAC,QAAqB,GAAGC,oBAAQ,CAAC,KAAK;SACpF;IACH;AAEA,IAAA,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC;AAC5G,IAAA,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;IAEnE,OAAO;QACL,QAAQ;AACR,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,UAAU,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE;AAClC,QAAA,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE;QACzB,WAAW,EAAE,UAAU,EAAE,WAAW,IAAI,OAAO,EAAE,WAAW,IAAI,EAAE;AAClE,QAAA,QAAQ,EAAE,UAAU,EAAE,QAAQ,GAAI,UAAU,CAAC,QAAqB,GAAGA,oBAAQ,CAAC,KAAK;KACpF;AACH,CAAC;AAED;;;;;;AAMG;AACH,MAAM,wBAAwB,GAAG,CAAC,IAAqB,EAAE,GAAa,KAAwB;AAC5F,IAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC;IAC3D,MAAM,QAAQ,GAAG,yBAAyB,CAAC,GAAG,EAAE,IAAI,CAAC;IAErD,OAAO;AACL,QAAA,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;AACrB,QAAA,IAAI,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,QAAQ;KACT;AACH,CAAC;AAED;;;;;;AAMG;AACH,MAAM,sBAAsB,GAAG,CAAC,GAAa,EAAE,IAAqB,KAAI;IACtE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,IAAI;IACnD,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAGH,2BAAc,CAAC,GAAG,CAAC;AAEjE,IAAA,IAAI,IAA4B;AAChC,IAAA,IAAI,OAA+B;AAEnC,IAAA,IAAI,QAAQ,KAAKG,oBAAQ,CAAC,IAAI,EAAE;QAC9B,MAAM,IAAI,GAAG,CAAA,EAAG,cAAc,SAAS,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE;AACvD,QAAA,IAAI,GAAG;YACL,IAAI;YACJ,UAAU;SACX;IACH;SAAO;QACL,MAAM,IAAI,GAAG,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,QAAA,CAAU;AAC3E,QAAA,OAAO,GAAG;YACR,IAAI;YACJ,UAAU;SACX;IACH;IAEA,OAAO;QACL,IAAI;QACJ,OAAO;KACR;AACH,CAAC;AAED;;;;;;AAMG;AACH,MAAM,yBAAyB,GAAG,CAAC,GAAa,EAAE,IAAqB,KAA+B;IACpG,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,IAAI;IACzC,MAAM,EAAE,SAAS,EAAE,GAAGV,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;IACjD,MAAM,EAAE,sBAAsB,EAAE,GAAGA,oBAAY,CAAC,cAAc,CAAC,GAAG,CAAC;IAEnE,OAAO;QACL,QAAQ;QACR,EAAE;QACF,UAAU;QACV,SAAS;QACT,sBAAsB;AACtB,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,QAAQ,EAAE,iBAAiB;KAC5B;AACH,CAAC;AAED;;;;;;AAMG;AACH,MAAM,cAAc,GAAG,OAAO,GAAa,EAAE,QAAkB,KAA6C;AAC1G,IAAA,MAAM,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,GAAGA,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;IAE/E,QAAQ,QAAQ;QACd,KAAKK,cAAQ,CAAC,SAAS;;AAErB,YAAA,OAAO,gBAAgB,CAAC,MAAM,CAAC,MAAM,IAAG;AACtC,gBAAA,OAAO,MAAM,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,GAAG,KAAK;AAChE,YAAA,CAAC,CAAC;QACJ,KAAKA,cAAQ,CAAC,MAAM;;AAElB,YAAA,OAAO,qBAAqB,CAAC,MAAM,CAAC,MAAM,IAAG;gBAC3C,OAAO,OAAO,CACZ,MAAM,CAAC,MAAM,KAAKM,yBAAa,CAAC,KAAK;AACrC,oBAAA,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,KAAKA,yBAAa,CAAC,OAAO,CAAC,CAC/E;AACH,YAAA,CAAC,CAAC;AACJ,QAAA;AACE,YAAA,OAAO,SAAS;;AAEtB,CAAC;AAED;AACA;AACA;AAEA;;;;;AAKG;AACH,MAAM,aAAa,GAAG,CAAC,QAAkB,KAA0B;AACjE,IAAA,OAAO,YAAY,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,YAAY,GAAoB;AACpC,IAAA;AACE,QAAA,GAAG,EAAE,OAAO;AACZ,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,OAAO,EAAE,6BAA6B;AACtC,QAAA,MAAM,EAAE,CAACN,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,MAAM,CAAC;AAClE,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,aAAa;AAClB,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,OAAO,EAAE,mCAAmC;AAC5C,QAAA,MAAM,EAAE,CAACA,cAAQ,CAAC,SAAS,CAAC;AAC7B,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,OAAO,EAAE,+BAA+B;QACxC,MAAM,EAAE,CAACA,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,MAAM,CAAC;AAC9C,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,QAAQ;AACb,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,OAAO,EAAE,8BAA8B;QACvC,MAAM,EAAE,CAACA,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,MAAM,CAAC;AAC9C,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,OAAO,EAAE,+BAA+B;AACxC,QAAA,MAAM,EAAE,CAACA,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,MAAM,CAAC;AAClE,KAAA;CACF;AAED,YAAe;IACb,aAAa;CACd;;;;;;;"}
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'\nimport { renderTruncateAsHtml } from '../truncate/utils'\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: renderTruncateAsHtml({ stringValue: description, classes: 'govuk-body-s', charLength: 50 }),\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","renderTruncateAsHtml","captureDprError","ReportType","LoadType","RequestStatus"],"mappings":"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"}
@@ -2,14 +2,16 @@
2
2
 
3
3
  var truncate = require('truncate-html');
4
4
  var nunjucks = require('nunjucks');
5
+ var sanitizeHtml = require('../../utils/sanitizeHtml.js');
5
6
 
6
7
  const initialiseTruncation = ({ stringValue, charLength = 80, showMore = true, classes, }) => {
7
- const truncatedHtml = truncate(stringValue, {
8
+ const sanitizedHtml = sanitizeHtml.sanitiseHtml(stringValue);
9
+ const truncatedHtml = truncate(sanitizedHtml, {
8
10
  length: charLength,
9
11
  });
10
- const isTruncated = truncatedHtml !== stringValue;
12
+ const isTruncated = truncatedHtml !== sanitizedHtml;
11
13
  return {
12
- fullHtml: stringValue,
14
+ fullHtml: sanitizedHtml,
13
15
  truncatedHtml,
14
16
  showMore,
15
17
  isTruncated,
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../../../../../../src/dpr/components/truncate/utils.ts"],"sourcesContent":["import truncate from 'truncate-html'\nimport nunjucks from 'nunjucks'\n\nexport interface TruncationOptions {\n stringValue: string\n charLength?: number\n showMore?: boolean\n classes?: string\n}\n\nexport interface TruncationModel {\n fullHtml: string\n truncatedHtml: string\n showMore: boolean\n isTruncated: boolean\n classes?: string | undefined\n}\n\nexport const initialiseTruncation = ({\n stringValue,\n charLength = 80,\n showMore = true,\n classes,\n}: TruncationOptions): TruncationModel => {\n const truncatedHtml = truncate(stringValue, {\n length: charLength,\n })\n\n const isTruncated = truncatedHtml !== stringValue\n\n return {\n fullHtml: stringValue,\n truncatedHtml,\n showMore,\n isTruncated,\n classes,\n }\n}\n\nexport const renderTruncateAsHtml = (options: TruncationOptions): string => {\n const params = initialiseTruncation(options)\n\n return nunjucks.render('dpr/components/truncate/render.njk', {\n params,\n })\n}\n"],"names":[],"mappings":";;;;;AAkBO,MAAM,oBAAoB,GAAG,CAAC,EACnC,WAAW,EACX,UAAU,GAAG,EAAE,EACf,QAAQ,GAAG,IAAI,EACf,OAAO,GACW,KAAqB;AACvC,IAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE;AAC1C,QAAA,MAAM,EAAE,UAAU;AACnB,KAAA,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,aAAa,KAAK,WAAW;IAEjD,OAAO;AACL,QAAA,QAAQ,EAAE,WAAW;QACrB,aAAa;QACb,QAAQ;QACR,WAAW;QACX,OAAO;KACR;AACH;AAEO,MAAM,oBAAoB,GAAG,CAAC,OAA0B,KAAY;AACzE,IAAA,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC;AAE5C,IAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,oCAAoC,EAAE;QAC3D,MAAM;AACP,KAAA,CAAC;AACJ;;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../../../../../src/dpr/components/truncate/utils.ts"],"sourcesContent":["import truncate from 'truncate-html'\nimport nunjucks from 'nunjucks'\nimport { sanitiseHtml } from 'src/dpr/utils/sanitizeHtml'\n\nexport interface TruncationOptions {\n stringValue: string\n charLength?: number\n showMore?: boolean\n classes?: string\n}\n\nexport interface TruncationModel {\n fullHtml: string\n truncatedHtml: string\n showMore: boolean\n isTruncated: boolean\n classes?: string | undefined\n}\n\nexport const initialiseTruncation = ({\n stringValue,\n charLength = 80,\n showMore = true,\n classes,\n}: TruncationOptions): TruncationModel => {\n const sanitizedHtml = sanitiseHtml(stringValue)\n\n const truncatedHtml = truncate(sanitizedHtml, {\n length: charLength,\n })\n\n const isTruncated = truncatedHtml !== sanitizedHtml\n\n return {\n fullHtml: sanitizedHtml,\n truncatedHtml,\n showMore,\n isTruncated,\n classes,\n }\n}\n\nexport const renderTruncateAsHtml = (options: TruncationOptions): string => {\n const params = initialiseTruncation(options)\n\n return nunjucks.render('dpr/components/truncate/render.njk', {\n params,\n })\n}\n"],"names":["sanitiseHtml"],"mappings":";;;;;;AAmBO,MAAM,oBAAoB,GAAG,CAAC,EACnC,WAAW,EACX,UAAU,GAAG,EAAE,EACf,QAAQ,GAAG,IAAI,EACf,OAAO,GACW,KAAqB;AACvC,IAAA,MAAM,aAAa,GAAGA,yBAAY,CAAC,WAAW,CAAC;AAE/C,IAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE;AAC5C,QAAA,MAAM,EAAE,UAAU;AACnB,KAAA,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,aAAa,KAAK,aAAa;IAEnD,OAAO;AACL,QAAA,QAAQ,EAAE,aAAa;QACvB,aAAa;QACb,QAAQ;QACR,WAAW;QACX,OAAO;KACR;AACH;AAEO,MAAM,oBAAoB,GAAG,CAAC,OAA0B,KAAY;AACzE,IAAA,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC;AAE5C,IAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,oCAAoC,EAAE;QAC3D,MAAM;AACP,KAAA,CAAC;AACJ;;;;;"}