@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.14.2 → 4.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dpr/all.mjs +2 -0
- package/dpr/all.scss +4 -0
- package/dpr/components/_catalogue/catalogue-list/utils.test.ts +1 -1
- package/dpr/components/_charts/chart/clientClass.mjs +4 -3
- package/dpr/components/_charts/chart/heatmap/Heatmap.js +2 -0
- package/dpr/components/_charts/chart/heatmap/Heatmap.js.map +7 -0
- package/dpr/components/_charts/chart/heatmap/Heatmap.ts +278 -0
- package/dpr/components/_charts/chart/heatmap/clientClass.mjs +175 -0
- package/dpr/components/_charts/chart/styles.scss +4 -0
- package/dpr/components/_charts/utils.js +1 -1
- package/dpr/components/_charts/utils.js.map +3 -3
- package/dpr/components/_charts/utils.test.ts +4 -1
- package/dpr/components/_charts/utils.ts +73 -27
- package/dpr/components/_dashboards/dashboard/types.js +1 -1
- package/dpr/components/_dashboards/dashboard/types.js.map +2 -2
- package/dpr/components/_dashboards/dashboard/types.ts +21 -1
- package/dpr/components/_dashboards/dashboard-list/utils.js +1 -1
- package/dpr/components/_dashboards/dashboard-list/utils.js.map +3 -3
- package/dpr/components/_dashboards/dashboard-list/utils.test.ts +1 -0
- package/dpr/components/_dashboards/dashboard-list/utils.ts +5 -1
- package/dpr/components/_filters/types.d.js.map +1 -1
- package/dpr/components/_filters/types.d.ts +12 -8
- package/dpr/components/_filters/utils.js +1 -1
- package/dpr/components/_filters/utils.js.map +3 -3
- package/dpr/components/_filters/utils.ts +24 -2
- package/dpr/components/user-reports/utils.js +1 -1
- package/dpr/components/user-reports/utils.js.map +3 -3
- package/dpr/components/user-reports/utils.ts +13 -3
- package/dpr/data/dashboardClient.js +1 -1
- package/dpr/data/dashboardClient.js.map +2 -2
- package/dpr/data/dashboardClient.ts +1 -1
- package/dpr/routes/journeys/request-report/filters/controller.js +1 -1
- package/dpr/routes/journeys/request-report/filters/controller.js.map +3 -3
- package/dpr/routes/journeys/request-report/filters/controller.ts +6 -2
- package/dpr/routes/journeys/request-report/filters/utils.js +1 -1
- package/dpr/routes/journeys/request-report/filters/utils.js.map +2 -2
- package/dpr/routes/journeys/request-report/filters/utils.ts +9 -3
- package/dpr/routes/journeys/view-report/async/dashboard/utils.js +1 -1
- package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +3 -3
- package/dpr/routes/journeys/view-report/async/dashboard/utils.ts +12 -3
- package/dpr/routes/journeys/view-report/async/report/tests.cy.js +1 -1
- package/dpr/routes/journeys/view-report/async/report/tests.cy.js.map +2 -2
- package/dpr/routes/journeys/view-report/async/report/tests.cy.ts +44 -8
- package/dpr/routes/journeys/view-report/utils.js +1 -1
- package/dpr/routes/journeys/view-report/utils.js.map +3 -3
- package/dpr/routes/journeys/view-report/utils.ts +6 -1
- package/dpr/services/dashboardService.js +1 -1
- package/dpr/services/dashboardService.js.map +2 -2
- package/dpr/services/dashboardService.ts +1 -1
- package/dpr/types/Charts.js +1 -1
- package/dpr/types/Charts.js.map +1 -1
- package/dpr/types/Charts.ts +10 -3
- package/dpr/types/ExecutionData.d.js +1 -1
- package/dpr/types/ExecutionData.d.js.map +1 -1
- package/dpr/types/ExecutionData.d.ts +1 -0
- package/dpr/utils/DataTableBuilder/DataTableBuilder.js +1 -1
- package/dpr/utils/DataTableBuilder/DataTableBuilder.js.map +2 -2
- package/dpr/utils/DataTableBuilder/DataTableBuilder.ts +37 -19
- package/dpr/utils/DateMapper/DateMapper.js +1 -1
- package/dpr/utils/DateMapper/DateMapper.js.map +2 -2
- package/dpr/utils/DateMapper/DateMapper.ts +4 -0
- package/dpr/utils/UserStoreItemBuilder.js +1 -1
- package/dpr/utils/UserStoreItemBuilder.js.map +3 -3
- package/dpr/utils/UserStoreItemBuilder.ts +6 -4
- package/dpr/utils/requestStatusHelper.js +1 -1
- package/dpr/utils/requestStatusHelper.js.map +2 -2
- package/dpr/utils/requestStatusHelper.ts +1 -1
- package/package.json +5 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/dpr/components/_charts/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n ChartData,\n MoJTable,\n ChartCardData,\n ChartDataset,\n ChartType,\n ChartDetails,\n ChartMetaData,\n} from '../../types/Charts'\nimport { DashboardDataResponse } from '../../types/Metrics'\nimport {\n BarChartVisualisationColumn,\n DashboardVisualisation,\n DashboardVisualisationColumns,\n DashboardVisualisationType,\n} from '../_dashboards/dashboard/types'\nimport DatasetHelper from '../../utils/datasetHelper'\nimport DashboardListUtils from '../_dashboards/dashboard-list/utils'\n\nexport const createChart = (\n chartDefinition: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n): ChartCardData => {\n const timeseriesChartTypes = [DashboardVisualisationType.BAR_TIMESERIES, DashboardVisualisationType.LINE_TIMESERIES]\n const { type } = chartDefinition\n\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\n\n if (timeseriesChartTypes.includes(type)) {\n const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = createTimeseriesChart(chartDefinition, timeseriesData)\n table = createTimeseriesTable(chartDefinition, timeseriesData)\n details = getChartDetails(chartDefinition, latestData, true)\n }\n } else {\n const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = createSnapshotChart(chartDefinition, snapshotData)\n table = createSnapshotTable(chartDefinition, dataSetRows)\n details = getChartDetails(chartDefinition, dataSetRows)\n }\n }\n\n return {\n details,\n table,\n chart,\n }\n}\n\nexport default {\n createChart,\n}\n\nconst getDataForSnapshotCharts = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\n const data = DatasetHelper.getLastestDataset(rawData)\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 = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\n const latestData = DatasetHelper.getLastestDataset(rawData)\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: DashboardVisualisation,\n data: DashboardDataResponse[],\n timeseries = false,\n): ChartDetails => {\n const meta: ChartMetaData[] = []\n const headlines: ChartMetaData[] = createHeadlines(chartDefinition, data, timeseries)\n\n if (data[0]?.ts) {\n meta.push({\n label: 'Values for:',\n value: data[0]?.ts.raw,\n })\n }\n\n return {\n meta,\n headlines,\n }\n}\n\nconst createHeadlines = (\n chartDefinition: DashboardVisualisation,\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n let headline: ChartMetaData\n\n let headlineColumn: BarChartVisualisationColumn\n let value: number\n let label: string\n\n if (timeseries) {\n headlineColumn = <BarChartVisualisationColumn>measures.find((col) => col.id !== 'ts')\n if (headlineColumn) {\n label = `${data[0].ts.raw}`\n value = +data[0][headlineColumn.id].raw\n\n headline = {\n label,\n value,\n }\n }\n } else {\n headlineColumn = !isListChart\n ? <BarChartVisualisationColumn>measures[0]\n : measures.find((col: BarChartVisualisationColumn) => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n label = `Total ${headlineColumn.display.toLowerCase()}`\n value = data.reduce((acc: number, d: DashboardDataResponse) => acc + +d[headlineColumn.id].raw, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n headlines.push(headline)\n\n return headlines\n}\n\nconst createSnapshotChart = (\n chartDefinition: DashboardVisualisation,\n snapshotData: DashboardDataResponse[],\n): ChartData => {\n const { type, columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n\n let labels: string[]\n let unit\n let datasets: ChartDataset[]\n\n if (!isListChart) {\n ;({ labels, unit, datasets } = buildChart(columns, snapshotData))\n } else {\n ;({ labels, unit, datasets } = buildChartFromListData(columns, snapshotData))\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst buildChart = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { keys, measures } = columns\n const labels = measures.map((col) => col.display)\n const labelId = keys[keys.length - 1]?.id as keyof DashboardDataResponse\n const unit = measures[0].unit ? measures[0].unit : undefined\n\n const datasets = rawData.map((row) => {\n const label = row[labelId] ? `${row[labelId].raw}` : 'All'\n const data = measures.map((c) => {\n const rowId = c.id as keyof DashboardDataResponse\n return row[rowId] ? +row[rowId].raw : 0\n })\n const total = data.reduce((acc: number, val: number) => acc + val, 0)\n return { label, data, total } as ChartDataset\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst buildChartFromListData = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { measures, keys } = columns\n\n const xAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'x')\n const yAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'y')\n\n const unit = yAxisColumn?.unit || undefined\n const groupKey = DatasetHelper.getGroupKey(keys, rawData)\n const groupsData = groupKey ? DatasetHelper.groupRowsByKey(rawData, groupKey.id) : [rawData]\n\n const labels = groupsData[0]?.map((row) => {\n return `${row[xAxisColumn.id].raw}`\n })\n\n const datasets: ChartDataset[] = groupsData.map((groupData) => {\n const data = groupData.map((row) => +row[yAxisColumn.id].raw)\n return {\n label: groupKey ? `${groupData[0][groupKey.id].raw}` : yAxisColumn.display,\n data,\n total: data.reduce((acc: number, val: number) => acc + val, 0),\n }\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst createSnapshotTable = (chartDefinition: DashboardVisualisation, data: DashboardDataResponse[]): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const headerColumns = [...keys, ...measures]\n const head = headerColumns.map((column) => {\n return { text: column.display }\n })\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\nconst createTimeseriesChart = (\n chartDefinition: DashboardVisualisation,\n timeseriesData: DashboardDataResponse[],\n): ChartData => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const unit = measures[0].unit ? measures[0].unit : undefined\n\n const type = chartDefinition.type === DashboardVisualisationType.BAR_TIMESERIES ? 'bar' : 'line'\n\n const groupKey = DatasetHelper.getGroupKey(keys, timeseriesData)\n const labelId = groupKey.id as keyof DashboardDataResponse\n\n const timeBlockData = DatasetHelper.groupRowsByTimestamp(timeseriesData)\n const labels = timeBlockData.map((d: DashboardDataResponse[]) => d[0].ts.raw as unknown as string)\n const datasetCount = timeBlockData[0].length\n\n const datasets: ChartDataset[] = []\n for (let index = 0; index < datasetCount; index += 1) {\n const data = timeBlockData.map((timeperiod) => {\n return +timeperiod[index][measures[1].id].raw\n })\n const total = data.reduce((a, c) => a + c, 0)\n const label = timeBlockData[0][index][labelId].raw as string\n\n datasets.push({\n data,\n label,\n total,\n })\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n timeseries: true,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst createTimeseriesTable = (\n chartDefinition: DashboardVisualisation,\n timeseriesData: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n let flatTimeseriesData = timeseriesData.flat()\n const hasMultipleRowsPerTimePeriod = timeseriesData.length > 1\n let headerColumns = [...measures]\n\n if (hasMultipleRowsPerTimePeriod) {\n const timestampIndex = headerColumns.findIndex((m) => m.id === 'ts')\n const timestampCol = headerColumns[timestampIndex]\n\n headerColumns.splice(timestampIndex, 1)\n headerColumns = [...keys, ...headerColumns]\n headerColumns.unshift(timestampCol)\n } else {\n flatTimeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, flatTimeseriesData)\n }\n\n const head = headerColumns.map((column) => {\n return { text: column.display }\n })\n\n const rows = DashboardListUtils.createTableRows(flatTimeseriesData)\n\n return {\n head,\n rows,\n } as MoJTable\n}\n"],
|
|
5
|
-
"mappings": "6iBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,EAAA,YAAAC,IAAA,eAAAC,
|
|
6
|
-
"names": ["utils_exports", "__export", "createChart", "utils_default", "__toCommonJS", "
|
|
4
|
+
"sourcesContent": ["import dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport {\n ChartData,\n MoJTable,\n ChartCardData,\n ChartDataset,\n ChartType,\n ChartDetails,\n ChartMetaData,\n} from '../../types/Charts'\nimport { DashboardDataResponse } from '../../types/Metrics'\nimport {\n BarChartVisualisationColumn,\n DashboardVisualisation,\n DashboardVisualisationColumns,\n} from '../_dashboards/dashboard/types'\nimport DatasetHelper from '../../utils/datasetHelper'\nimport DashboardListUtils from '../_dashboards/dashboard-list/utils'\nimport { Granularity } from '../_inputs/granular-date-range/types'\nimport HeatmapChart from './chart/heatmap/Heatmap'\n\ndayjs.extend(weekOfYear)\n\nexport const createChart = (\n chartDefinition: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n): ChartCardData => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\n\n const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = createSnapshotChart(chartDefinition, snapshotData)\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: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n): ChartCardData => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\n\n const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = createTimeseriesChart(chartDefinition, timeseriesData)\n table = createTimeseriesTable(chartDefinition, timeseriesData)\n details = getChartDetails(chartDefinition, latestData, true)\n }\n return {\n details,\n table,\n chart,\n }\n}\n\nexport const createMatrixChart = (\n chartDefinition: DashboardVisualisation,\n rawData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n) => {\n let table: MoJTable\n let chart: ChartData\n let details: ChartDetails\n let granularity: Granularity = Granularity.DAILY\n\n Object.keys(query).forEach((key) => {\n if (key.includes('granularity')) {\n granularity = <Granularity>query[key]\n }\n })\n\n const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n chart = new HeatmapChart(timeseriesData, granularity, chartDefinition).build()\n table = createTimeseriesTable(chartDefinition, timeseriesData)\n details = getChartDetails(chartDefinition, latestData, true)\n }\n return {\n details,\n table,\n chart,\n }\n}\n\nconst getDataForSnapshotCharts = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\n const data = DatasetHelper.getLastestDataset(rawData)\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 = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {\n const latestData = DatasetHelper.getLastestDataset(rawData)\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: DashboardVisualisation,\n data: DashboardDataResponse[],\n timeseries = false,\n): ChartDetails => {\n const meta: ChartMetaData[] = []\n const headlines: ChartMetaData[] = createHeadlines(chartDefinition, data, timeseries)\n\n if (data[0]?.ts) {\n meta.push({\n label: 'Values for:',\n value: data[0]?.ts.raw,\n })\n }\n\n return {\n meta,\n headlines,\n }\n}\n\nconst createHeadlines = (\n chartDefinition: DashboardVisualisation,\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n let headline: ChartMetaData\n\n let headlineColumn: BarChartVisualisationColumn\n let value: number\n let label: string\n\n if (timeseries) {\n headlineColumn = <BarChartVisualisationColumn>measures.find((col) => col.id !== 'ts')\n if (headlineColumn) {\n label = `${data[0].ts.raw}`\n value = +data[0][headlineColumn.id].raw\n\n headline = {\n label,\n value,\n }\n }\n } else {\n headlineColumn = !isListChart\n ? <BarChartVisualisationColumn>measures[0]\n : measures.find((col: BarChartVisualisationColumn) => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n label = `Total ${headlineColumn.display.toLowerCase()}`\n value = data.reduce((acc: number, d: DashboardDataResponse) => acc + +d[headlineColumn.id].raw, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n headlines.push(headline)\n\n return headlines\n}\n\nconst createSnapshotChart = (\n chartDefinition: DashboardVisualisation,\n snapshotData: DashboardDataResponse[],\n): ChartData => {\n const { type, columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!(<BarChartVisualisationColumn[]>measures).find((col) => col.axis)\n\n let labels: string[]\n let unit\n let datasets: ChartDataset[]\n\n if (!isListChart) {\n ;({ labels, unit, datasets } = buildChart(columns, snapshotData))\n } else {\n ;({ labels, unit, datasets } = buildChartFromListData(columns, snapshotData))\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst buildChart = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { keys, measures } = columns\n const labels = measures.map((col) => col.display)\n const labelId = keys[keys.length - 1]?.id as keyof DashboardDataResponse\n const unit = measures[0].unit ? measures[0].unit : undefined\n\n const datasets = rawData.map((row) => {\n const label = row[labelId] ? `${row[labelId].raw}` : 'All'\n const data = measures.map((c) => {\n const rowId = c.id as keyof DashboardDataResponse\n return row[rowId] ? +row[rowId].raw : 0\n })\n const total = data.reduce((acc: number, val: number) => acc + val, 0)\n return { label, data, total } as ChartDataset\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst buildChartFromListData = (columns: DashboardVisualisationColumns, rawData: DashboardDataResponse[]) => {\n const { measures, keys } = columns\n\n const xAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'x')\n const yAxisColumn = (<BarChartVisualisationColumn[]>measures).find((col) => col.axis === 'y')\n\n const unit = yAxisColumn?.unit || undefined\n const groupKey = DatasetHelper.getGroupKey(keys, rawData)\n const groupsData = groupKey ? DatasetHelper.groupRowsByKey(rawData, groupKey.id) : [rawData]\n\n const labels = groupsData[0]?.map((row) => {\n return `${row[xAxisColumn.id].raw}`\n })\n\n const datasets: ChartDataset[] = groupsData.map((groupData) => {\n const data = groupData.map((row) => +row[yAxisColumn.id].raw)\n return {\n label: groupKey ? `${groupData[0][groupKey.id].raw}` : yAxisColumn.display,\n data,\n total: data.reduce((acc: number, val: number) => acc + val, 0),\n }\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst createSnapshotTable = (chartDefinition: DashboardVisualisation, data: DashboardDataResponse[]): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const headerColumns = [...keys, ...measures]\n const head = headerColumns.map((column) => {\n return { text: column.display }\n })\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\nconst createTimeseriesChart = (\n chartDefinition: DashboardVisualisation,\n timeseriesData: DashboardDataResponse[],\n): ChartData => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const unit = measures[0].unit ? measures[0].unit : undefined\n const type = chartDefinition.type.split('-')[0]\n const groupKey = DatasetHelper.getGroupKey(keys, timeseriesData)\n const labelId = groupKey.id as keyof DashboardDataResponse\n\n const timeBlockData = DatasetHelper.groupRowsByTimestamp(timeseriesData)\n const labels = timeBlockData.map((d: DashboardDataResponse[]) => d[0].ts.raw as unknown as string)\n const datasetCount = timeBlockData[0].length\n\n const datasets: ChartDataset[] = []\n for (let index = 0; index < datasetCount; index += 1) {\n const data = timeBlockData.map((timeperiod) => {\n return +timeperiod[index][measures[1].id].raw\n })\n const total = data.reduce((a, c) => a + c, 0)\n const label = timeBlockData[0][index][labelId].raw as string\n\n datasets.push({\n data,\n label,\n total,\n })\n }\n\n return {\n type: type as unknown as ChartType,\n unit,\n timeseries: true,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst createTimeseriesTable = (\n chartDefinition: DashboardVisualisation,\n timeseriesData: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n let flatTimeseriesData = timeseriesData.flat()\n let headerColumns = [...measures]\n\n if (timeseriesData.length > 1) {\n // Add keys as columns as well as measures, and put TS first:\n // Get TS column an remove it from headings\n const timestampIndex = headerColumns.findIndex((m) => m.id === 'ts')\n const timestampCol = headerColumns[timestampIndex]\n headerColumns.splice(timestampIndex, 1)\n // Remove duplicate TS from keys if present and add keys to headings\n const keysWithoutTs = keys.filter((k) => k.id !== 'ts')\n headerColumns = [...keysWithoutTs, ...headerColumns]\n // Add TS column to the start\n headerColumns.unshift(timestampCol)\n } else {\n flatTimeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, flatTimeseriesData)\n }\n\n const head = headerColumns.map((column) => {\n return { text: column.display }\n })\n\n const rows = DashboardListUtils.createTableRows(flatTimeseriesData)\n\n return {\n head,\n rows,\n } as MoJTable\n}\n\nexport default {\n createChart,\n createTimeseriesCharts,\n createMatrixChart,\n}\n"],
|
|
5
|
+
"mappings": "6iBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,EAAA,sBAAAC,EAAA,2BAAAC,EAAA,YAAAC,IAAA,eAAAC,EAAAN,GAAA,IAAAO,EAAkB,oBAClBC,EAAuB,sCAgBvBC,EAA0B,wCAC1BC,EAA+B,kDAC/BC,EAA4B,gDAC5BC,EAAyB,sCAEzB,EAAAC,QAAM,OAAO,EAAAC,OAAU,EAEhB,MAAMZ,EAAc,CACzBa,EACAC,IACkB,CAClB,IAAIC,EACAC,EACAC,EAEJ,KAAM,CAAE,YAAAC,EAAa,aAAAC,CAAa,EAAIC,EAAyBP,EAAiBC,CAAO,EACvF,OAAII,EAAY,SACdF,EAAQK,EAAoBR,EAAiBM,CAAY,EACzDJ,EAAQO,EAAoBT,EAAiBK,CAAW,EACxDD,EAAUM,EAAgBV,EAAiBK,CAAW,GAGjD,CACL,QAAAD,EACA,MAAAF,EACA,MAAAC,CACF,CACF,EAEad,EAAyB,CACpCW,EACAC,IACkB,CAClB,IAAIC,EACAC,EACAC,EAEJ,KAAM,CAAE,WAAAO,EAAY,YAAAN,EAAa,eAAAO,CAAe,EAAIC,EAA2Bb,EAAiBC,CAAO,EACvG,OAAII,EAAY,SACdF,EAAQW,EAAsBd,EAAiBY,CAAc,EAC7DV,EAAQa,EAAsBf,EAAiBY,CAAc,EAC7DR,EAAUM,EAAgBV,EAAiBW,EAAY,EAAI,GAEtD,CACL,QAAAP,EACA,MAAAF,EACA,MAAAC,CACF,CACF,EAEaf,EAAoB,CAC/BY,EACAC,EACAe,IACG,CACH,IAAId,EACAC,EACAC,EACAa,EAA2B,cAAY,MAE3C,OAAO,KAAKD,CAAK,EAAE,QAASE,GAAQ,CAC9BA,EAAI,SAAS,aAAa,IAC5BD,EAA2BD,EAAME,CAAG,EAExC,CAAC,EAED,KAAM,CAAE,WAAAP,EAAY,YAAAN,EAAa,eAAAO,CAAe,EAAIC,EAA2Bb,EAAiBC,CAAO,EACvG,OAAII,EAAY,SACdF,EAAQ,IAAI,EAAAgB,QAAaP,EAAgBK,EAAajB,CAAe,EAAE,MAAM,EAC7EE,EAAQa,EAAsBf,EAAiBY,CAAc,EAC7DR,EAAUM,EAAgBV,EAAiBW,EAAY,EAAI,GAEtD,CACL,QAAAP,EACA,MAAAF,EACA,MAAAC,CACF,CACF,EAEMI,EAA2B,CAACP,EAAyCC,IAAqC,CAC9G,MAAMmB,EAAO,EAAAC,QAAc,kBAAkBpB,CAAO,EAC9CI,EAAc,EAAAgB,QAAc,eAAerB,EAAiBoB,CAAI,EAChEd,EAAe,EAAAe,QAAc,2BAA2BrB,EAAiBK,EAAa,EAAI,EAEhG,MAAO,CACL,YAAAA,EACA,aAAAC,CACF,CACF,EAEMO,EAA6B,CAACb,EAAyCC,IAAqC,CAChH,MAAMU,EAAa,EAAAU,QAAc,kBAAkBpB,CAAO,EACpDI,EAAc,EAAAgB,QAAc,eAAerB,EAAiBC,CAAO,EACnEW,EAAiB,EAAAS,QAAc,2BAA2BrB,EAAiBK,EAAa,EAAI,EAElG,MAAO,CACL,WAAAM,EACA,YAAAN,EACA,eAAAO,CACF,CACF,EAEMF,EAAkB,CACtBV,EACAoB,EACAE,EAAa,KACI,CACjB,MAAMC,EAAwB,CAAC,EACzBC,EAA6BC,EAAgBzB,EAAiBoB,EAAME,CAAU,EAEpF,OAAIF,EAAK,CAAC,GAAG,IACXG,EAAK,KAAK,CACR,MAAO,cACP,MAAOH,EAAK,CAAC,GAAG,GAAG,GACrB,CAAC,EAGI,CACL,KAAAG,EACA,UAAAC,CACF,CACF,EAEMC,EAAkB,CACtBzB,EACAoB,EACAE,EAAa,KACV,CACH,MAAME,EAA6B,CAAC,EAC9B,CAAE,QAAAE,CAAQ,EAAI1B,EACd,CAAE,SAAA2B,CAAS,EAAID,EACfE,EAAc,CAAC,CAAiCD,EAAU,KAAME,GAAQA,EAAI,IAAI,EACtF,IAAIC,EAEAC,EACAC,EACAC,EAEJ,OAAIX,GACFS,EAA8CJ,EAAS,KAAME,GAAQA,EAAI,KAAO,IAAI,EAChFE,IACFE,EAAQ,GAAGb,EAAK,CAAC,EAAE,GAAG,GAAG,GACzBY,EAAQ,CAACZ,EAAK,CAAC,EAAEW,EAAe,EAAE,EAAE,IAEpCD,EAAW,CACT,MAAAG,EACA,MAAAD,CACF,KAGFD,EAAkBH,EAEdD,EAAS,KAAME,GAAqCA,EAAI,MAAQA,EAAI,OAAS,GAAG,EADnDF,EAAS,CAAC,EAGvCI,IACFE,EAAQ,SAASF,EAAe,QAAQ,YAAY,CAAC,GACrDC,EAAQZ,EAAK,OAAO,CAACc,EAAaC,IAA6BD,GAAM,CAACC,EAAEJ,EAAe,EAAE,EAAE,IAAK,CAAC,EAEjGD,EAAW,CACT,MAAAG,EACA,MAAAD,CACF,IAIJR,EAAU,KAAKM,CAAQ,EAEhBN,CACT,EAEMhB,EAAsB,CAC1BR,EACAM,IACc,CACd,KAAM,CAAE,KAAA8B,EAAM,QAAAV,CAAQ,EAAI1B,EACpB,CAAE,SAAA2B,CAAS,EAAID,EACfE,EAAc,CAAC,CAAiCD,EAAU,KAAME,GAAQA,EAAI,IAAI,EAEtF,IAAIQ,EACAC,EACAC,EAEJ,OAAKX,EAGD,CAAE,OAAAS,EAAQ,KAAAC,EAAM,SAAAC,CAAS,EAAIC,EAAuBd,EAASpB,CAAY,EAFzE,CAAE,OAAA+B,EAAQ,KAAAC,EAAM,SAAAC,CAAS,EAAIE,EAAWf,EAASpB,CAAY,EAK1D,CACL,KAAM8B,EACN,KAAAE,EACA,KAAM,CACJ,OAAAD,EACA,SAAAE,CACF,CACF,CACF,EAEME,EAAa,CAACf,EAAwCzB,IAAqC,CAC/F,KAAM,CAAE,KAAAyC,EAAM,SAAAf,CAAS,EAAID,EACrBW,EAASV,EAAS,IAAKE,GAAQA,EAAI,OAAO,EAC1Cc,EAAUD,EAAKA,EAAK,OAAS,CAAC,GAAG,GACjCJ,EAAOX,EAAS,CAAC,EAAE,KAAOA,EAAS,CAAC,EAAE,KAAO,OAE7CY,EAAWtC,EAAQ,IAAK2C,GAAQ,CACpC,MAAMX,EAAQW,EAAID,CAAO,EAAI,GAAGC,EAAID,CAAO,EAAE,GAAG,GAAK,MAC/CvB,EAAOO,EAAS,IAAK,GAAM,CAC/B,MAAMkB,EAAQ,EAAE,GAChB,OAAOD,EAAIC,CAAK,EAAI,CAACD,EAAIC,CAAK,EAAE,IAAM,CACxC,CAAC,EACKC,EAAQ1B,EAAK,OAAO,CAACc,EAAaa,IAAgBb,EAAMa,EAAK,CAAC,EACpE,MAAO,CAAE,MAAAd,EAAO,KAAAb,EAAM,MAAA0B,CAAM,CAC9B,CAAC,EAED,MAAO,CACL,OAAAT,EACA,KAAAC,EACA,SAAAC,CACF,CACF,EAEMC,EAAyB,CAACd,EAAwCzB,IAAqC,CAC3G,KAAM,CAAE,SAAA0B,EAAU,KAAAe,CAAK,EAAIhB,EAErBsB,EAA8CrB,EAAU,KAAME,GAAQA,EAAI,OAAS,GAAG,EACtFoB,EAA8CtB,EAAU,KAAME,GAAQA,EAAI,OAAS,GAAG,EAEtFS,EAAOW,GAAa,MAAQ,OAC5BC,EAAW,EAAA7B,QAAc,YAAYqB,EAAMzC,CAAO,EAClDkD,EAAaD,EAAW,EAAA7B,QAAc,eAAepB,EAASiD,EAAS,EAAE,EAAI,CAACjD,CAAO,EAErFoC,EAASc,EAAW,CAAC,GAAG,IAAKP,GAC1B,GAAGA,EAAII,EAAY,EAAE,EAAE,GAAG,EAClC,EAEKT,EAA2BY,EAAW,IAAKC,GAAc,CAC7D,MAAMhC,EAAOgC,EAAU,IAAKR,GAAQ,CAACA,EAAIK,EAAY,EAAE,EAAE,GAAG,EAC5D,MAAO,CACL,MAAOC,EAAW,GAAGE,EAAU,CAAC,EAAEF,EAAS,EAAE,EAAE,GAAG,GAAKD,EAAY,QACnE,KAAA7B,EACA,MAAOA,EAAK,OAAO,CAACc,EAAaa,IAAgBb,EAAMa,EAAK,CAAC,CAC/D,CACF,CAAC,EAED,MAAO,CACL,OAAAV,EACA,KAAAC,EACA,SAAAC,CACF,CACF,EAEM9B,EAAsB,CAACT,EAAyCoB,IAA4C,CAChH,KAAM,CAAE,QAAAM,CAAQ,EAAI1B,EACd,CAAE,KAAA0C,EAAM,SAAAf,CAAS,EAAID,EAGrB2B,EADgB,CAAC,GAAGX,EAAM,GAAGf,CAAQ,EAChB,IAAK2B,IACvB,CAAE,KAAMA,EAAO,OAAQ,EAC/B,EAEKC,EAAkB,EAAAlC,QAAc,2BAA2BrB,EAAiBoB,EAAM,EAAI,EACtFoC,EAAO,EAAAC,QAAmB,gBAAgBF,CAAe,EAE/D,MAAO,CACL,KAAAF,EACA,KAAAG,CACF,CACF,EAEM1C,EAAwB,CAC5Bd,EACAY,IACc,CACd,KAAM,CAAE,QAAAc,CAAQ,EAAI1B,EACd,CAAE,KAAA0C,EAAM,SAAAf,CAAS,EAAID,EAErBY,EAAOX,EAAS,CAAC,EAAE,KAAOA,EAAS,CAAC,EAAE,KAAO,OAC7CS,EAAOpC,EAAgB,KAAK,MAAM,GAAG,EAAE,CAAC,EAExC2C,EADW,EAAAtB,QAAc,YAAYqB,EAAM9B,CAAc,EACtC,GAEnB8C,EAAgB,EAAArC,QAAc,qBAAqBT,CAAc,EACjEyB,EAASqB,EAAc,IAAKvB,GAA+BA,EAAE,CAAC,EAAE,GAAG,GAAwB,EAC3FwB,EAAeD,EAAc,CAAC,EAAE,OAEhCnB,EAA2B,CAAC,EAClC,QAASqB,EAAQ,EAAGA,EAAQD,EAAcC,GAAS,EAAG,CACpD,MAAMxC,EAAOsC,EAAc,IAAKG,GACvB,CAACA,EAAWD,CAAK,EAAEjC,EAAS,CAAC,EAAE,EAAE,EAAE,GAC3C,EACKmB,EAAQ1B,EAAK,OAAO,CAAC0C,EAAGC,IAAMD,EAAIC,EAAG,CAAC,EACtC9B,EAAQyB,EAAc,CAAC,EAAEE,CAAK,EAAEjB,CAAO,EAAE,IAE/CJ,EAAS,KAAK,CACZ,KAAAnB,EACA,MAAAa,EACA,MAAAa,CACF,CAAC,CACH,CAEA,MAAO,CACL,KAAMV,EACN,KAAAE,EACA,WAAY,GACZ,KAAM,CACJ,OAAAD,EACA,SAAAE,CACF,CACF,CACF,EAEMxB,EAAwB,CAC5Bf,EACAY,IACa,CACb,KAAM,CAAE,QAAAc,CAAQ,EAAI1B,EACd,CAAE,KAAA0C,EAAM,SAAAf,CAAS,EAAID,EAE3B,IAAIsC,EAAqBpD,EAAe,KAAK,EACzCqD,EAAgB,CAAC,GAAGtC,CAAQ,EAEhC,GAAIf,EAAe,OAAS,EAAG,CAG7B,MAAMsD,EAAiBD,EAAc,UAAWE,GAAMA,EAAE,KAAO,IAAI,EAC7DC,EAAeH,EAAcC,CAAc,EACjDD,EAAc,OAAOC,EAAgB,CAAC,EAGtCD,EAAgB,CAAC,GADKvB,EAAK,OAAQ2B,GAAMA,EAAE,KAAO,IAAI,EACnB,GAAGJ,CAAa,EAEnDA,EAAc,QAAQG,CAAY,CACpC,MACEJ,EAAqB,EAAA3C,QAAc,2BAA2BrB,EAAiBgE,CAAkB,EAGnG,MAAMX,EAAOY,EAAc,IAAKX,IACvB,CAAE,KAAMA,EAAO,OAAQ,EAC/B,EAEKE,EAAO,EAAAC,QAAmB,gBAAgBO,CAAkB,EAElE,MAAO,CACL,KAAAX,EACA,KAAAG,CACF,CACF,EAEA,IAAOlE,EAAQ,CACb,YAAAH,EACA,uBAAAE,EACA,kBAAAD,CACF",
|
|
6
|
+
"names": ["utils_exports", "__export", "createChart", "createMatrixChart", "createTimeseriesCharts", "utils_default", "__toCommonJS", "import_dayjs", "import_weekOfYear", "import_datasetHelper", "import_utils", "import_types", "import_Heatmap", "dayjs", "weekOfYear", "chartDefinition", "rawData", "table", "chart", "details", "dataSetRows", "snapshotData", "getDataForSnapshotCharts", "createSnapshotChart", "createSnapshotTable", "getChartDetails", "latestData", "timeseriesData", "getDataForTimeseriesCharts", "createTimeseriesChart", "createTimeseriesTable", "query", "granularity", "key", "HeatmapChart", "data", "DatasetHelper", "timeseries", "meta", "headlines", "createHeadlines", "columns", "measures", "isListChart", "col", "headline", "headlineColumn", "value", "label", "acc", "d", "type", "labels", "unit", "datasets", "buildChartFromListData", "buildChart", "keys", "labelId", "row", "rowId", "total", "val", "xAxisColumn", "yAxisColumn", "groupKey", "groupsData", "groupData", "head", "column", "filteredRowData", "rows", "DashboardListUtils", "timeBlockData", "datasetCount", "index", "timeperiod", "a", "c", "flatTimeseriesData", "headerColumns", "timestampIndex", "m", "timestampCol", "k"]
|
|
7
7
|
}
|
|
@@ -52,7 +52,10 @@ describe('ChartCard Utils', () => {
|
|
|
52
52
|
|
|
53
53
|
it('should get the timeseries chart data', async () => {
|
|
54
54
|
const expectedResult = dataQualityTimeseriesLine
|
|
55
|
-
const result = ChartCardUtils.
|
|
55
|
+
const result = ChartCardUtils.createTimeseriesCharts(
|
|
56
|
+
timeseriesVisualisationDefinition,
|
|
57
|
+
dashboardMetricsData.flat(),
|
|
58
|
+
)
|
|
56
59
|
expect(result).toEqual(expectedResult)
|
|
57
60
|
})
|
|
58
61
|
})
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import dayjs from 'dayjs'
|
|
2
|
+
import weekOfYear from 'dayjs/plugin/weekOfYear'
|
|
1
3
|
import {
|
|
2
4
|
ChartData,
|
|
3
5
|
MoJTable,
|
|
@@ -12,36 +14,27 @@ import {
|
|
|
12
14
|
BarChartVisualisationColumn,
|
|
13
15
|
DashboardVisualisation,
|
|
14
16
|
DashboardVisualisationColumns,
|
|
15
|
-
DashboardVisualisationType,
|
|
16
17
|
} from '../_dashboards/dashboard/types'
|
|
17
18
|
import DatasetHelper from '../../utils/datasetHelper'
|
|
18
19
|
import DashboardListUtils from '../_dashboards/dashboard-list/utils'
|
|
20
|
+
import { Granularity } from '../_inputs/granular-date-range/types'
|
|
21
|
+
import HeatmapChart from './chart/heatmap/Heatmap'
|
|
22
|
+
|
|
23
|
+
dayjs.extend(weekOfYear)
|
|
19
24
|
|
|
20
25
|
export const createChart = (
|
|
21
26
|
chartDefinition: DashboardVisualisation,
|
|
22
27
|
rawData: DashboardDataResponse[],
|
|
23
28
|
): ChartCardData => {
|
|
24
|
-
const timeseriesChartTypes = [DashboardVisualisationType.BAR_TIMESERIES, DashboardVisualisationType.LINE_TIMESERIES]
|
|
25
|
-
const { type } = chartDefinition
|
|
26
|
-
|
|
27
29
|
let table: MoJTable
|
|
28
30
|
let chart: ChartData
|
|
29
31
|
let details: ChartDetails
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
details = getChartDetails(chartDefinition, latestData, true)
|
|
37
|
-
}
|
|
38
|
-
} else {
|
|
39
|
-
const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)
|
|
40
|
-
if (dataSetRows.length) {
|
|
41
|
-
chart = createSnapshotChart(chartDefinition, snapshotData)
|
|
42
|
-
table = createSnapshotTable(chartDefinition, dataSetRows)
|
|
43
|
-
details = getChartDetails(chartDefinition, dataSetRows)
|
|
44
|
-
}
|
|
33
|
+
const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)
|
|
34
|
+
if (dataSetRows.length) {
|
|
35
|
+
chart = createSnapshotChart(chartDefinition, snapshotData)
|
|
36
|
+
table = createSnapshotTable(chartDefinition, dataSetRows)
|
|
37
|
+
details = getChartDetails(chartDefinition, dataSetRows)
|
|
45
38
|
}
|
|
46
39
|
|
|
47
40
|
return {
|
|
@@ -51,8 +44,54 @@ export const createChart = (
|
|
|
51
44
|
}
|
|
52
45
|
}
|
|
53
46
|
|
|
54
|
-
export
|
|
55
|
-
|
|
47
|
+
export const createTimeseriesCharts = (
|
|
48
|
+
chartDefinition: DashboardVisualisation,
|
|
49
|
+
rawData: DashboardDataResponse[],
|
|
50
|
+
): ChartCardData => {
|
|
51
|
+
let table: MoJTable
|
|
52
|
+
let chart: ChartData
|
|
53
|
+
let details: ChartDetails
|
|
54
|
+
|
|
55
|
+
const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)
|
|
56
|
+
if (dataSetRows.length) {
|
|
57
|
+
chart = createTimeseriesChart(chartDefinition, timeseriesData)
|
|
58
|
+
table = createTimeseriesTable(chartDefinition, timeseriesData)
|
|
59
|
+
details = getChartDetails(chartDefinition, latestData, true)
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
details,
|
|
63
|
+
table,
|
|
64
|
+
chart,
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export const createMatrixChart = (
|
|
69
|
+
chartDefinition: DashboardVisualisation,
|
|
70
|
+
rawData: DashboardDataResponse[],
|
|
71
|
+
query: Record<string, string | string[]>,
|
|
72
|
+
) => {
|
|
73
|
+
let table: MoJTable
|
|
74
|
+
let chart: ChartData
|
|
75
|
+
let details: ChartDetails
|
|
76
|
+
let granularity: Granularity = Granularity.DAILY
|
|
77
|
+
|
|
78
|
+
Object.keys(query).forEach((key) => {
|
|
79
|
+
if (key.includes('granularity')) {
|
|
80
|
+
granularity = <Granularity>query[key]
|
|
81
|
+
}
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)
|
|
85
|
+
if (dataSetRows.length) {
|
|
86
|
+
chart = new HeatmapChart(timeseriesData, granularity, chartDefinition).build()
|
|
87
|
+
table = createTimeseriesTable(chartDefinition, timeseriesData)
|
|
88
|
+
details = getChartDetails(chartDefinition, latestData, true)
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
details,
|
|
92
|
+
table,
|
|
93
|
+
chart,
|
|
94
|
+
}
|
|
56
95
|
}
|
|
57
96
|
|
|
58
97
|
const getDataForSnapshotCharts = (chartDefinition: DashboardVisualisation, rawData: DashboardDataResponse[]) => {
|
|
@@ -253,9 +292,7 @@ const createTimeseriesChart = (
|
|
|
253
292
|
const { keys, measures } = columns
|
|
254
293
|
|
|
255
294
|
const unit = measures[0].unit ? measures[0].unit : undefined
|
|
256
|
-
|
|
257
|
-
const type = chartDefinition.type === DashboardVisualisationType.BAR_TIMESERIES ? 'bar' : 'line'
|
|
258
|
-
|
|
295
|
+
const type = chartDefinition.type.split('-')[0]
|
|
259
296
|
const groupKey = DatasetHelper.getGroupKey(keys, timeseriesData)
|
|
260
297
|
const labelId = groupKey.id as keyof DashboardDataResponse
|
|
261
298
|
|
|
@@ -297,15 +334,18 @@ const createTimeseriesTable = (
|
|
|
297
334
|
const { keys, measures } = columns
|
|
298
335
|
|
|
299
336
|
let flatTimeseriesData = timeseriesData.flat()
|
|
300
|
-
const hasMultipleRowsPerTimePeriod = timeseriesData.length > 1
|
|
301
337
|
let headerColumns = [...measures]
|
|
302
338
|
|
|
303
|
-
if (
|
|
339
|
+
if (timeseriesData.length > 1) {
|
|
340
|
+
// Add keys as columns as well as measures, and put TS first:
|
|
341
|
+
// Get TS column an remove it from headings
|
|
304
342
|
const timestampIndex = headerColumns.findIndex((m) => m.id === 'ts')
|
|
305
343
|
const timestampCol = headerColumns[timestampIndex]
|
|
306
|
-
|
|
307
344
|
headerColumns.splice(timestampIndex, 1)
|
|
308
|
-
|
|
345
|
+
// Remove duplicate TS from keys if present and add keys to headings
|
|
346
|
+
const keysWithoutTs = keys.filter((k) => k.id !== 'ts')
|
|
347
|
+
headerColumns = [...keysWithoutTs, ...headerColumns]
|
|
348
|
+
// Add TS column to the start
|
|
309
349
|
headerColumns.unshift(timestampCol)
|
|
310
350
|
} else {
|
|
311
351
|
flatTimeseriesData = DatasetHelper.filterRowsByDisplayColumns(chartDefinition, flatTimeseriesData)
|
|
@@ -322,3 +362,9 @@ const createTimeseriesTable = (
|
|
|
322
362
|
rows,
|
|
323
363
|
} as MoJTable
|
|
324
364
|
}
|
|
365
|
+
|
|
366
|
+
export default {
|
|
367
|
+
createChart,
|
|
368
|
+
createTimeseriesCharts,
|
|
369
|
+
createMatrixChart,
|
|
370
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var e=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var p=(s,a)=>{for(var t in a)e(s,t,{get:a[t],enumerable:!0})},b=(s,a,t,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let o of d(a))!c.call(s,o)&&o!==t&&e(s,o,{get:()=>a[o],enumerable:!(r=u(a,o))||r.enumerable});return s};var m=s=>b(e({},"__esModule",{value:!0}),s);var x={};p(x,{AggregateType:()=>l,DashboardVisualisationType:()=>n});module.exports=m(x);var n=(i=>(i.LIST="list",i.DONUT="doughnut",i.BAR="bar",i.LINE="line",i.MATRIX="matrix",i.MATRIX_TIMESERIES="matrix-timeseries",i.BAR_TIMESERIES="bar-timeseries",i.LINE_TIMESERIES="line-timeseries",i.SCORECARD="scorecard",i.SCORECARD_GROUP="scorecard-group",i))(n||{}),l=(t=>(t.SUM="sum",t.AVG="average",t))(l||{});0&&(module.exports={AggregateType,DashboardVisualisationType});
|
|
2
2
|
//# sourceMappingURL=types.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/dpr/components/_dashboards/dashboard/types.ts"],
|
|
4
|
-
"sourcesContent": ["import { components } from '../../../types/api'\nimport { ChartCardData, MoJTable, UnitType } from '../../../types/Charts'\nimport { Scorecard, ScorecardGroup } from '../scorecard/types'\n\nexport interface DashboardDefinition {\n id: string\n name: string\n description?: string\n sections: DashboardSection[]\n isMissing?: boolean\n filterFields: components['schemas']['FieldDefinition'][]\n}\n\nexport interface DashboardSection {\n id: string\n display?: string\n description?: string\n visualisations: DashboardVisualisation[]\n}\n\nexport interface DashboardUISection {\n id: string\n title?: string\n description?: string\n visualisations?: DashboardUIVisualisation[]\n}\n\nexport interface DashboardUIVisualisation {\n id: string\n type: DashboardVisualisationType\n title?: string\n description?: string\n data: Scorecard | Scorecard[] | ScorecardGroup[] | ChartCardData | { table: MoJTable; ts: string }\n}\n\nexport interface DashboardVisualisation {\n id: string\n type: DashboardVisualisationType\n display?: string\n description?: string\n columns: DashboardVisualisationColumns\n showLatest?: boolean\n}\n\nexport interface ListVisualisation extends DashboardVisualisation {\n type: DashboardVisualisationType.LIST\n
|
|
5
|
-
"mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,EAAA,+BAAAC,IAAA,eAAAC,EAAAJ,
|
|
4
|
+
"sourcesContent": ["import { components } from '../../../types/api'\nimport { ChartCardData, MoJTable, UnitType } from '../../../types/Charts'\nimport { Scorecard, ScorecardGroup } from '../scorecard/types'\n\nexport interface DashboardDefinition {\n id: string\n name: string\n description?: string\n sections: DashboardSection[]\n isMissing?: boolean\n filterFields: components['schemas']['FieldDefinition'][]\n}\n\nexport interface DashboardSection {\n id: string\n display?: string\n description?: string\n visualisations: DashboardVisualisation[]\n}\n\nexport interface DashboardUISection {\n id: string\n title?: string\n description?: string\n visualisations?: DashboardUIVisualisation[]\n}\n\nexport interface DashboardUIVisualisation {\n id: string\n type: DashboardVisualisationType\n title?: string\n description?: string\n data: Scorecard | Scorecard[] | ScorecardGroup[] | ChartCardData | { table: MoJTable; ts: string }\n}\n\nexport interface DashboardVisualisation {\n id: string\n type: DashboardVisualisationType\n display?: string\n description?: string\n columns: DashboardVisualisationColumns\n options: DashboardVisualisationOptions\n}\n\nexport type DashboardVisualisationOptions = ListDashboardVisualisationOptions | MatrixDashboardVisualisationOptions\n\nexport interface ListDashboardVisualisationOptions {\n showLatest?: boolean\n columnsAsList?: boolean\n}\n\nexport interface MatrixDashboardVisualisationOptions {\n useRagColours?: boolean\n buckets?: MatrixDashboardVisualisationBucket[]\n baseColour?: string\n}\n\nexport interface MatrixDashboardVisualisationBucket {\n min?: number\n max?: number\n hexColour?: string\n}\n\nexport interface ListVisualisation extends DashboardVisualisation {\n type: DashboardVisualisationType.LIST\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 interface DashboardVisualisationColumns {\n keys?: DashboardVisualisationColumnKey[]\n measures: DashboardVisualisationColumnMeasure[]\n filters?: DashboardVisualisationColumnFilter[]\n expectNulls: boolean\n}\n\nexport interface DashboardVisualisationColumn {\n id: string\n display?: string\n}\n\nexport interface DashboardVisualisationColumnKey extends DashboardVisualisationColumn {\n optional?: boolean\n}\n\nexport interface DashboardVisualisationColumnMeasure extends DashboardVisualisationColumn {\n aggregate?: AggregateType\n displayValue?: boolean\n unit?: UnitType\n axis?: 'x' | 'y'\n}\n\nexport interface DashboardVisualisationColumnFilter {\n id: string\n equals: string | number\n}\n\nexport interface BarChartVisualisationColumn extends DashboardVisualisationColumnMeasure {\n axis?: 'x' | 'y'\n}\n\nexport interface ScorecardVisualisationColumn extends DashboardVisualisationColumn {\n displayValue: boolean\n}\n\nexport enum AggregateType {\n SUM = 'sum',\n AVG = 'average',\n}\n"],
|
|
5
|
+
"mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,EAAA,+BAAAC,IAAA,eAAAC,EAAAJ,GAmEO,IAAKG,OACVA,EAAA,KAAO,OACPA,EAAA,MAAQ,WACRA,EAAA,IAAM,MACNA,EAAA,KAAO,OACPA,EAAA,OAAS,SACTA,EAAA,kBAAoB,oBACpBA,EAAA,eAAiB,iBACjBA,EAAA,gBAAkB,kBAClBA,EAAA,UAAY,YACZA,EAAA,gBAAkB,kBAVRA,OAAA,IAiDAD,OACVA,EAAA,IAAM,MACNA,EAAA,IAAM,UAFIA,OAAA",
|
|
6
6
|
"names": ["types_exports", "__export", "AggregateType", "DashboardVisualisationType", "__toCommonJS"]
|
|
7
7
|
}
|
|
@@ -39,12 +39,30 @@ export interface DashboardVisualisation {
|
|
|
39
39
|
display?: string
|
|
40
40
|
description?: string
|
|
41
41
|
columns: DashboardVisualisationColumns
|
|
42
|
+
options: DashboardVisualisationOptions
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type DashboardVisualisationOptions = ListDashboardVisualisationOptions | MatrixDashboardVisualisationOptions
|
|
46
|
+
|
|
47
|
+
export interface ListDashboardVisualisationOptions {
|
|
42
48
|
showLatest?: boolean
|
|
49
|
+
columnsAsList?: boolean
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface MatrixDashboardVisualisationOptions {
|
|
53
|
+
useRagColours?: boolean
|
|
54
|
+
buckets?: MatrixDashboardVisualisationBucket[]
|
|
55
|
+
baseColour?: string
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface MatrixDashboardVisualisationBucket {
|
|
59
|
+
min?: number
|
|
60
|
+
max?: number
|
|
61
|
+
hexColour?: string
|
|
43
62
|
}
|
|
44
63
|
|
|
45
64
|
export interface ListVisualisation extends DashboardVisualisation {
|
|
46
65
|
type: DashboardVisualisationType.LIST
|
|
47
|
-
columnsAsList: boolean
|
|
48
66
|
}
|
|
49
67
|
|
|
50
68
|
export enum DashboardVisualisationType {
|
|
@@ -52,6 +70,8 @@ export enum DashboardVisualisationType {
|
|
|
52
70
|
DONUT = 'doughnut',
|
|
53
71
|
BAR = 'bar',
|
|
54
72
|
LINE = 'line',
|
|
73
|
+
MATRIX = 'matrix',
|
|
74
|
+
MATRIX_TIMESERIES = 'matrix-timeseries',
|
|
55
75
|
BAR_TIMESERIES = 'bar-timeseries',
|
|
56
76
|
LINE_TIMESERIES = 'line-timeseries',
|
|
57
77
|
SCORECARD = 'scorecard',
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var D=Object.create;var w=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var M=(t,s)=>{for(var e in s)w(t,e,{get:s[e],enumerable:!0})},g=(t,s,e,a)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of x(s))!y.call(t,o)&&o!==e&&w(t,o,{get:()=>s[o],enumerable:!(a=f(s,o))||a.enumerable});return t};var T=(t,s,e)=>(e=t!=null?D(L(t)):{},g(s||!t||!t.__esModule?w(e,"default",{value:t,enumerable:!0}):e,t)),J=t=>g(w({},"__esModule",{value:!0}),t);var $={};M($,{createList:()=>R,createTableRows:()=>d,default:()=>A});module.exports=J($);var p=T(require("../../../utils/datasetHelper"));const R=(t,s)=>{const{columns:e,options:a}=t,o=a,c=o?.showLatest!==void 0?o.showLatest:!0,r=o?.columnsAsList,{measures:l,keys:n}=e,h=!l&&!n||!l.length&&!n;let i=[...s];c&&(i=p.default.getLastestDataset(i));let m,u,b;return h?{head:m,rows:u,ts:b}=E(i):r?{head:m,rows:u,ts:b}=V(t,i):{head:m,rows:u,ts:b}=C(t,i),u.length&&l&&(u=O(u,l)),{table:{head:m,rows:u},ts:b}},V=(t,s)=>{const{columns:e}=t,{keys:a,measures:o}=e,c=p.default.getGroupKey(a||[],s),r=s[0]?.ts?.raw,l=r?`${r}`:"",n=[];n.push({text:""}),s.forEach(i=>{n.push({text:c?i[c.id].raw:""})});const h=[];return o.forEach(i=>{h.push([{text:i.display}])}),o.forEach((i,m)=>{s.forEach(u=>{h[m].push({text:`${u[i.id].raw}`})})}),{rows:h,head:n,ts:l}},d=(t,s)=>t.map(e=>{const a=s?.length?Array(s.length):Array(Object.keys(t[0]).length);return Object.keys(e).forEach((o,c)=>{const r=s?.length?s.findIndex(n=>n.id===o):c,l=e[o].raw;a.splice(r,1,{text:l})}),a}),C=(t,s)=>{const{measures:e}=t.columns,a=e.map(h=>({text:h.display})),o=p.default.getDatasetRows(t,s),c=p.default.filterRowsByDisplayColumns(t,o),r=d(c,e),l=o[0]?.ts?.raw,n=l?`${l}`:"";return{head:a,rows:r,ts:n}},E=t=>{const s=Object.keys(t[0]).map(r=>({text:r})),e=d(t),o=p.default.getLastestDataset(t)[0]?.ts?.raw,c=o?`${o}`:"";return{head:s,rows:e,ts:c}},O=(t,s)=>{const e=s.flatMap((a,o)=>a.aggregate?[o]:[]);if(e.length){const a=[{html:"<strong>Total<strong>"}];for(let o=1;o<s.length;o+=1)a[o]={text:""};t.push(a),e.forEach(o=>{const c=t.reduce((r,l)=>{const n=l[o];return n&&n.text&&(r+=Number(n.text)),r},0);t[t.length-1][o]={html:`<strong>${c}<strong>`}})}return t};var A={createList:R,createTableRows:d};0&&(module.exports={createList,createTableRows});
|
|
2
2
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/dpr/components/_dashboards/dashboard-list/utils.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable no-param-reassign */\nimport { MoJTable, MoJTableRow } from '../../../types/Charts'\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n DashboardVisualisationColumn,\n DashboardVisualisationColumnMeasure,\n ListVisualisation,\n} from '../dashboard/types'\nimport DatasetHelper from '../../../utils/datasetHelper'\n\nexport const createList = (\n listDefinition: ListVisualisation,\n dashboardData: DashboardDataResponse[],\n): { table: MoJTable; ts: string } => {\n const { columns, showLatest = true
|
|
5
|
-
"mappings": "6iBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,EAAA,oBAAAC,EAAA,YAAAC,IAAA,eAAAC,EAAAL,
|
|
6
|
-
"names": ["utils_exports", "__export", "createList", "createTableRows", "utils_default", "__toCommonJS", "import_datasetHelper", "listDefinition", "dashboardData", "columns", "showLatest", "columnsAsList", "measures", "keys", "showAllData", "datasetData", "DatasetHelper", "head", "rows", "ts", "createFullList", "createListFromColumns", "creatListFromRows", "sumColumns", "groupKey", "timestampData", "row", "measure", "index", "data", "dataRow", "key", "headIndex", "m", "text", "column", "dataSetRows", "displayRows", "rowsData", "sumColumnIndexes", "col", "idx", "sumRow", "total", "acc", "rowIndex"]
|
|
4
|
+
"sourcesContent": ["/* eslint-disable no-param-reassign */\nimport { MoJTable, MoJTableRow } from '../../../types/Charts'\nimport { DashboardDataResponse } from '../../../types/Metrics'\nimport {\n DashboardVisualisationColumn,\n DashboardVisualisationColumnMeasure,\n ListDashboardVisualisationOptions,\n ListVisualisation,\n} from '../dashboard/types'\nimport DatasetHelper from '../../../utils/datasetHelper'\n\nexport const createList = (\n listDefinition: ListVisualisation,\n dashboardData: DashboardDataResponse[],\n): { table: MoJTable; ts: string } => {\n const { columns, options } = listDefinition\n const listOptions = <ListDashboardVisualisationOptions>options\n const showLatest = listOptions?.showLatest !== undefined ? listOptions.showLatest : true\n const columnsAsList = listOptions?.columnsAsList\n const { measures, keys } = columns\n const showAllData = (!measures && !keys) || (!measures.length && !keys)\n\n let datasetData: DashboardDataResponse[] = [...dashboardData]\n if (showLatest) {\n datasetData = DatasetHelper.getLastestDataset(datasetData)\n }\n\n let head\n let rows\n let ts\n\n if (showAllData) {\n ;({ head, rows, ts } = createFullList(datasetData))\n } else if (columnsAsList) {\n ;({ head, rows, ts } = createListFromColumns(listDefinition, datasetData))\n } else {\n ;({ head, rows, ts } = creatListFromRows(listDefinition, datasetData))\n }\n\n if (rows.length && measures) rows = sumColumns(rows, measures)\n\n return {\n table: {\n head,\n rows,\n },\n ts,\n }\n}\n\nconst createListFromColumns = (listDefinition: ListVisualisation, dashboardData: DashboardDataResponse[]) => {\n const { columns } = listDefinition\n const { keys, measures } = columns\n const groupKey = DatasetHelper.getGroupKey(keys || [], dashboardData)\n\n const timestampData = dashboardData[0]?.ts?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n const head = []\n head.push({ text: '' })\n dashboardData.forEach((row) => {\n head.push({\n text: groupKey ? row[groupKey.id].raw : '',\n })\n })\n\n const rows: MoJTableRow[][] = []\n measures.forEach((measure) => {\n rows.push([{ text: measure.display }] as MoJTableRow[])\n })\n\n measures.forEach((measure, index) => {\n dashboardData.forEach((row) => {\n rows[index].push({ text: `${row[measure.id].raw}` })\n })\n })\n\n return {\n rows,\n head,\n ts,\n }\n}\n\nexport const createTableRows = (\n data: DashboardDataResponse[],\n measures?: DashboardVisualisationColumn[],\n): MoJTableRow[][] => {\n return data.map((dataRow) => {\n const row: MoJTableRow[] = measures?.length ? Array(measures.length) : Array(Object.keys(data[0]).length)\n Object.keys(dataRow).forEach((key, index) => {\n const headIndex = measures?.length ? measures.findIndex((m) => m.id === key) : index\n const text = dataRow[key].raw\n row.splice(headIndex, 1, { text } as MoJTableRow)\n })\n\n return row\n })\n}\n\nconst creatListFromRows = (listDefinition: ListVisualisation, dashboardData: DashboardDataResponse[]) => {\n const { measures } = listDefinition.columns\n\n const head = measures.map((column) => {\n return { text: column.display }\n })\n\n const dataSetRows = DatasetHelper.getDatasetRows(listDefinition, dashboardData)\n const displayRows = DatasetHelper.filterRowsByDisplayColumns(listDefinition, dataSetRows)\n const rows = createTableRows(displayRows, measures)\n\n const timestampData = dataSetRows[0]?.ts?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst createFullList = (dashboardData: DashboardDataResponse[]) => {\n const head = Object.keys(dashboardData[0]).map((key) => {\n return { text: key }\n })\n const rows = createTableRows(dashboardData)\n\n const latestData = DatasetHelper.getLastestDataset(dashboardData)\n const timestampData = latestData[0]?.ts?.raw\n const ts = timestampData ? `${timestampData}` : ''\n\n return {\n head,\n rows,\n ts,\n }\n}\n\nconst sumColumns = (rowsData: MoJTableRow[][], measures: DashboardVisualisationColumnMeasure[]) => {\n const sumColumnIndexes: number[] = measures.flatMap((col, idx) => (col.aggregate ? [idx] : []))\n\n if (sumColumnIndexes.length) {\n const sumRow: MoJTableRow[] = [{ html: `<strong>Total<strong>` }]\n for (let index = 1; index < measures.length; index += 1) {\n sumRow[index] = { text: '' }\n }\n\n rowsData.push(sumRow)\n sumColumnIndexes.forEach((index) => {\n const total = rowsData.reduce((acc, row) => {\n const rowIndex = row[index]\n if (rowIndex && rowIndex.text) {\n acc += Number(rowIndex.text)\n }\n return acc\n }, 0)\n rowsData[rowsData.length - 1][index] = {\n html: `<strong>${total}<strong>`,\n }\n })\n }\n\n return rowsData\n}\n\nexport default {\n createList,\n createTableRows,\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["utils_exports", "__export", "createList", "createTableRows", "utils_default", "__toCommonJS", "import_datasetHelper", "listDefinition", "dashboardData", "columns", "options", "listOptions", "showLatest", "columnsAsList", "measures", "keys", "showAllData", "datasetData", "DatasetHelper", "head", "rows", "ts", "createFullList", "createListFromColumns", "creatListFromRows", "sumColumns", "groupKey", "timestampData", "row", "measure", "index", "data", "dataRow", "key", "headIndex", "m", "text", "column", "dataSetRows", "displayRows", "rowsData", "sumColumnIndexes", "col", "idx", "sumRow", "total", "acc", "rowIndex"]
|
|
7
7
|
}
|
|
@@ -31,6 +31,7 @@ describe('DashboardListUtils', () => {
|
|
|
31
31
|
it('should create the list data from data columns', () => {
|
|
32
32
|
const visDefinition = dataQualityColsToList as unknown as ListVisualisation
|
|
33
33
|
const result = DashboardListUtils.createList(visDefinition, mockTimeSeriesDataLastSixMonths.flat())
|
|
34
|
+
|
|
34
35
|
const expectedResult = {
|
|
35
36
|
table: {
|
|
36
37
|
head: [{ text: '' }, { text: 'MDI' }, { text: 'SLI' }, { text: 'DAI' }],
|
|
@@ -4,6 +4,7 @@ import { DashboardDataResponse } from '../../../types/Metrics'
|
|
|
4
4
|
import {
|
|
5
5
|
DashboardVisualisationColumn,
|
|
6
6
|
DashboardVisualisationColumnMeasure,
|
|
7
|
+
ListDashboardVisualisationOptions,
|
|
7
8
|
ListVisualisation,
|
|
8
9
|
} from '../dashboard/types'
|
|
9
10
|
import DatasetHelper from '../../../utils/datasetHelper'
|
|
@@ -12,7 +13,10 @@ export const createList = (
|
|
|
12
13
|
listDefinition: ListVisualisation,
|
|
13
14
|
dashboardData: DashboardDataResponse[],
|
|
14
15
|
): { table: MoJTable; ts: string } => {
|
|
15
|
-
const { columns,
|
|
16
|
+
const { columns, options } = listDefinition
|
|
17
|
+
const listOptions = <ListDashboardVisualisationOptions>options
|
|
18
|
+
const showLatest = listOptions?.showLatest !== undefined ? listOptions.showLatest : true
|
|
19
|
+
const columnsAsList = listOptions?.columnsAsList
|
|
16
20
|
const { measures, keys } = columns
|
|
17
21
|
const showAllData = (!measures && !keys) || (!measures.length && !keys)
|
|
18
22
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/dpr/components/_filters/types.d.ts"],
|
|
4
|
-
"sourcesContent": ["import { Granularity, QuickFilters } from '../_inputs/granular-date-range/types'\nimport { FilterType } from './filter-input/enum'\nimport RelativeDateRange from '../_inputs/date-range/types'\n\nexport interface FilterOption {\n value: string\n text: string\n disabled?: boolean\n selected?: boolean\n sortedAsc?: boolean\n}\n\nexport type FilterValue =\n | TextFilterValue\n | FilterValueWithOptions\n | MultiselectFilterValue\n | DateFilterValue\n | DateRangeFilterValue\n | GranularDateRangeFilterValue\n\nexport type FilterValueType = string | DateRange | GranularDateRange | null\nexport interface BaseFilterValue {\n text: string\n name: string\n type: FilterType\n value: FilterValueType\n mandatory?: boolean\n}\n\nexport interface TextFilterValue extends BaseFilterValue {\n minimumLength?: number\n pattern?: string\n}\n\nexport interface FilterValueWithOptions extends BaseFilterValue {\n options: Array<FilterOption>\n staticOptionNameValue?: string\n dynamicResourceEndpoint?: string\n}\n\nexport interface MultiselectFilterValue extends Omit<BaseFilterValue, 'value'>, FilterValueWithOptions {\n value: string | null\n values: string[]\n}\n\nexport interface DateFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: string | null\n min?: string\n max?: string\n}\n\nexport interface DateRangeFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: DateRange\n min?: string\n max?: string\n relativeOptions?: { value: string; text: string; disabled?: boolean }[]\n}\n\nexport interface GranularDateRangeFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: GranularDateRange\n min?: string\n max?: string\n relativeOptions?: { value: string; text: string; disabled?: boolean }[]\n quickFilterOptions?: { value: string; text: string; disabled?: boolean }[]\n granularityOptions?: { value: string; text: string }[]\n}\n\nexport interface SelectedFilter {\n text: string\n href: string\n classes: string\n}\n\nexport interface DateRange {\n start: string\n end: string\n relative?: RelativeDateRange\n}\n\nexport interface GranularDateRange extends DateRange {\n granularity: {\n
|
|
4
|
+
"sourcesContent": ["import { Granularity, QuickFilters } from '../_inputs/granular-date-range/types'\nimport { FilterType } from './filter-input/enum'\nimport RelativeDateRange from '../_inputs/date-range/types'\n\nexport interface FilterOption {\n value: string\n text: string\n disabled?: boolean\n selected?: boolean\n sortedAsc?: boolean\n}\n\nexport type FilterValue =\n | TextFilterValue\n | FilterValueWithOptions\n | MultiselectFilterValue\n | DateFilterValue\n | DateRangeFilterValue\n | GranularDateRangeFilterValue\n\nexport type FilterValueType = string | DateRange | GranularDateRange | null\nexport interface BaseFilterValue {\n text: string\n name: string\n type: FilterType\n value: FilterValueType\n mandatory?: boolean\n}\n\nexport interface TextFilterValue extends BaseFilterValue {\n minimumLength?: number\n pattern?: string\n}\n\nexport interface FilterValueWithOptions extends BaseFilterValue {\n options: Array<FilterOption>\n staticOptionNameValue?: string\n dynamicResourceEndpoint?: string\n}\n\nexport interface MultiselectFilterValue extends Omit<BaseFilterValue, 'value'>, FilterValueWithOptions {\n value: string | null\n values: string[]\n}\n\nexport interface DateFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: string | null\n min?: string\n max?: string\n}\n\nexport interface DateRangeFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: DateRange\n min?: string\n max?: string\n relativeOptions?: { value: string; text: string; disabled?: boolean }[]\n}\n\nexport interface GranularDateRangeFilterValue extends Omit<BaseFilterValue, 'value'> {\n value: GranularDateRange\n min?: string\n max?: string\n relativeOptions?: { value: string; text: string; disabled?: boolean }[]\n quickFilterOptions?: { value: string; text: string; disabled?: boolean }[]\n granularityOptions?: { value: string; text: string }[]\n}\n\nexport interface SelectedFilter {\n text: string\n href: string\n classes: string\n}\n\nexport interface DateRange {\n start: string\n end: string\n relative?: RelativeDateRange\n}\n\nexport interface GranularDateRange extends DateRange {\n granularity: GranularDateRangeGranularityValue\n quickFilter?: GranularDateRangeQuickFilterValue\n partialDate?: {\n start: boolean\n end: boolean\n }\n}\n\ninterface GranularDateRangeGranularityValue {\n value: Granularity\n display: string\n}\n\nexport interface GranularDateRangeQuickFilterValue {\n value: QuickFilters\n display: string\n}\n\nexport interface FilterOptions {\n filters: Array<FilterValue>\n selectedFilters: Array<SelectedFilter>\n urlWithNoFilters: string\n}\n"],
|
|
5
5
|
"mappings": "kWAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
6
|
"names": ["types_d_exports", "__toCommonJS"]
|
|
7
7
|
}
|
|
@@ -78,20 +78,24 @@ export interface DateRange {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
export interface GranularDateRange extends DateRange {
|
|
81
|
-
granularity:
|
|
82
|
-
|
|
83
|
-
display: string
|
|
84
|
-
}
|
|
85
|
-
quickFilter?: {
|
|
86
|
-
value: QuickFilters
|
|
87
|
-
display: string
|
|
88
|
-
}
|
|
81
|
+
granularity: GranularDateRangeGranularityValue
|
|
82
|
+
quickFilter?: GranularDateRangeQuickFilterValue
|
|
89
83
|
partialDate?: {
|
|
90
84
|
start: boolean
|
|
91
85
|
end: boolean
|
|
92
86
|
}
|
|
93
87
|
}
|
|
94
88
|
|
|
89
|
+
interface GranularDateRangeGranularityValue {
|
|
90
|
+
value: Granularity
|
|
91
|
+
display: string
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface GranularDateRangeQuickFilterValue {
|
|
95
|
+
value: QuickFilters
|
|
96
|
+
display: string
|
|
97
|
+
}
|
|
98
|
+
|
|
95
99
|
export interface FilterOptions {
|
|
96
100
|
filters: Array<FilterValue>
|
|
97
101
|
selectedFilters: Array<SelectedFilter>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var E=Object.create;var D=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var M=(i,a)=>{for(var e in a)D(i,e,{get:a[e],enumerable:!0})},$=(i,a,e,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of P(a))!N.call(i,t)&&t!==e&&D(i,t,{get:()=>a[t],enumerable:!(r=I(a,t))||r.enumerable});return i};var d=(i,a,e)=>(e=i!=null?E(j(i)):{},$(a||!i||!i.__esModule?D(e,"default",{value:i,enumerable:!0}):e,i)),A=i=>$(D({},"__esModule",{value:!0}),i);var _={};M(_,{default:()=>W,getFilters:()=>U,getFiltersFromDefinition:()=>w,getPersonalisedFilters:()=>k,redirectWithDefaultFilters:()=>O,setFilterQueryFromFilterDefinition:()=>S,setFilterValuesFromRequest:()=>b,setRequestQueryFromFilterValues:()=>x});module.exports=A(_);var u=require("./filter-input/enum"),F=require("../../types/ReportQuery"),C=d(require("./filters-selected/utils")),g=d(require("../_inputs/date-range/utils")),R=d(require("../_inputs/date-input/utils")),V=d(require("../_inputs/granular-date-range/utils")),h=d(require("../_inputs/multi-select/utils")),Q=d(require("../../utils/Personalisation/personalisationUtils")),G=d(require("../../utils/urlHelper")),q=require("./filtersTypeEnum"),T=d(require("../../utils/localsHelper"));const b=(i,a,e="filters.")=>{const{preventDefault:r}=a.query;return Object.keys(a.query).every(t=>!t.includes(e))&&!r?i:i.map(t=>{let s,l;switch(t.type.toLowerCase()){case u.FilterType.dateRange.toLowerCase():s=g.default.setValueFromRequest(t,a,e);break;case u.FilterType.granularDateRange.toLowerCase():s=V.default.setValueFromRequest(t,a,e);break;case u.FilterType.date.toLowerCase():s=R.default.setValueFromRequest(t,a,e);break;case u.FilterType.multiselect.toLowerCase():({requestfilterValue:s,requestfilterValues:l}=h.default.setValueFromRequest(t,a,e));break;default:s=a.query[`${e}${t.name}`];break}let o=null;return s?o=s:r&&(o=""),{...t,value:o,...l&&{values:l}}})},S=(i,a)=>{let e=i.filter(r=>r.filter);return a&&(e=e.filter(r=>r.filter.interactive)),e.filter(r=>r.filter!==void 0).filter(r=>r.filter.defaultValue!==void 0).map(r=>{const t=r.filter;switch(t.type.toLocaleLowerCase()){case u.FilterType.dateRange.toLowerCase():return g.default.getQueryFromDefinition(t,r.name,F.DEFAULT_FILTERS_PREFIX);case u.FilterType.multiselect.toLowerCase():return h.default.getQueryFromDefinition(t,r.name,F.DEFAULT_FILTERS_PREFIX);case u.FilterType.granularDateRange.toLowerCase():{const l=g.default.getQueryFromDefinition(t,r.name,F.DEFAULT_FILTERS_PREFIX);return V.default.getQueryFromDefinition(t,r.name,F.DEFAULT_FILTERS_PREFIX,l)}default:return`${F.DEFAULT_FILTERS_PREFIX}${r.name}=${t.defaultValue}`}}).join("&")},w=(i,a)=>i.filter(e=>e.filter).filter(e=>{if(a!==void 0){const r=e.filter.interactive;return r===void 0?!a:a===r}return!0}).map(e=>{const{display:r,name:t}=e,s=e.filter,{type:l,staticOptions:f,dynamicOptions:o,defaultValue:n,mandatory:p,pattern:y}=s,m=f?f.map(v=>({value:v.name,text:v.display})):[];let c={text:r,name:t,type:l,value:n||null,minimumLength:o?.minimumLength,mandatory:p||!1,pattern:y};const L={value:"no-filter",text:"None",disabled:!1};switch(l){case u.FilterType.autocomplete.toLowerCase():c={...c,options:m};break;case u.FilterType.radio:p||m.unshift(L),c={...c,options:m};break;case u.FilterType.select:{p||m.unshift(L),m.unshift({value:"",text:"Select your option",disabled:!0,selected:!0}),c={...c,options:m};break}case u.FilterType.multiselect.toLowerCase():c={...c,options:m,values:n?n.split(","):[]};break;case u.FilterType.dateRange.toLowerCase():c=g.default.getFilterFromDefinition(s,c);break;case u.FilterType.date.toLowerCase():c=R.default.getFilterFromDefinition(s,c);break;case u.FilterType.granularDateRange.toLocaleLowerCase():{c=V.default.getFilterFromDefinition(s,c);break}default:break}return c}),x=i=>i.filter(e=>e.value).reduce((e,r)=>{const{value:t,name:s}=r,l=`filters.${s}`;switch(r.type){case u.FilterType.granularDateRange.toLowerCase():{const f=t;Object.keys(f).forEach(o=>{let n=f[o];o.includes("partialDate")?e={...e}:((o.includes("granularity")||o.includes("quickFilter"))&&(n=n.value),e={...e,[`${l}.${o}`]:n})})}break;case u.FilterType.dateRange.toLowerCase():Object.keys(t).forEach(f=>{e={...e,[`${l}.${f}`]:t[f]}});break;case u.FilterType.multiselect.toLowerCase():e={...e,[`${l}`]:t.split(",")};break;default:e={...e,[`${l}`]:t};break}return e},{}),O=(i,a,e,r)=>{const t={},{specification:s}=a,l=s?s.fields:[],{preventDefault:f}=r.query;if(Object.keys(i.filters).length===0&&!f&&l.filter(n=>n.filter&&n.filter.defaultValue).forEach(n=>{const{filter:p}=n;if(p)if(p.type.toLowerCase()===u.FilterType.dateRange.toLowerCase()){const{defaultValue:y}=p,m=y?y.split(" - "):"";m.length>=1&&(t[`${F.DEFAULT_FILTERS_PREFIX}${n.name}.start`]=m[0],m.length>=2&&(t[`${F.DEFAULT_FILTERS_PREFIX}${n.name}.end`]=m[1]))}else t[`${F.DEFAULT_FILTERS_PREFIX}${n.name}`]=p.defaultValue||""}),Object.keys(t).length>0){const n=(0,G.default)(i.toRecordWithFilterPrefix(),t,l);return e.redirect(`${r.baseUrl}${r.path}${n}`),!0}return!1},k=async(i,a,e,r,t)=>{const{reportId:s,id:l}=a.params,{dprUser:f}=T.default.getValues(e),o=await r.defaultFilterValuesService.get(f.id,s,l,t);let n=i;return o&&(n=Q.default.setFilterValuesFromSavedDefaults(i,[],o).filters),{filters:n,defaultFilterValues:o}},U=async({fields:i,req:a,res:e,prefix:r="filters.",services:t,filtersType:s})=>{let l=await w(i,s===q.FiltersType.INTERACTIVE),f,o=!1;if(t){const{filters:p,defaultFilterValues:y}=await k(l,a,e,t,s);l=p,f=y?.length>0,o=!0}a.query&&(l=b(l,a));const n=C.default.getSelectedFilters(l,r);return{filters:l,selectedFilters:n,hasDefaults:f,canSaveDefaults:o}};var W={getFiltersFromDefinition:w,setFilterValuesFromRequest:b,getFilters:U,setFilterQueryFromFilterDefinition:S,redirectWithDefaultFilters:O,setRequestQueryFromFilterValues:x,getPersonalisedFilters:k};0&&(module.exports={getFilters,getFiltersFromDefinition,getPersonalisedFilters,redirectWithDefaultFilters,setFilterQueryFromFilterDefinition,setFilterValuesFromRequest,setRequestQueryFromFilterValues});
|
|
2
2
|
//# sourceMappingURL=utils.js.map
|