@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.
Files changed (68) hide show
  1. package/dpr/all.mjs +2 -0
  2. package/dpr/all.scss +4 -0
  3. package/dpr/components/_catalogue/catalogue-list/utils.test.ts +1 -1
  4. package/dpr/components/_charts/chart/clientClass.mjs +4 -3
  5. package/dpr/components/_charts/chart/heatmap/Heatmap.js +2 -0
  6. package/dpr/components/_charts/chart/heatmap/Heatmap.js.map +7 -0
  7. package/dpr/components/_charts/chart/heatmap/Heatmap.ts +278 -0
  8. package/dpr/components/_charts/chart/heatmap/clientClass.mjs +175 -0
  9. package/dpr/components/_charts/chart/styles.scss +4 -0
  10. package/dpr/components/_charts/utils.js +1 -1
  11. package/dpr/components/_charts/utils.js.map +3 -3
  12. package/dpr/components/_charts/utils.test.ts +4 -1
  13. package/dpr/components/_charts/utils.ts +73 -27
  14. package/dpr/components/_dashboards/dashboard/types.js +1 -1
  15. package/dpr/components/_dashboards/dashboard/types.js.map +2 -2
  16. package/dpr/components/_dashboards/dashboard/types.ts +21 -1
  17. package/dpr/components/_dashboards/dashboard-list/utils.js +1 -1
  18. package/dpr/components/_dashboards/dashboard-list/utils.js.map +3 -3
  19. package/dpr/components/_dashboards/dashboard-list/utils.test.ts +1 -0
  20. package/dpr/components/_dashboards/dashboard-list/utils.ts +5 -1
  21. package/dpr/components/_filters/types.d.js.map +1 -1
  22. package/dpr/components/_filters/types.d.ts +12 -8
  23. package/dpr/components/_filters/utils.js +1 -1
  24. package/dpr/components/_filters/utils.js.map +3 -3
  25. package/dpr/components/_filters/utils.ts +24 -2
  26. package/dpr/components/user-reports/utils.js +1 -1
  27. package/dpr/components/user-reports/utils.js.map +3 -3
  28. package/dpr/components/user-reports/utils.ts +13 -3
  29. package/dpr/data/dashboardClient.js +1 -1
  30. package/dpr/data/dashboardClient.js.map +2 -2
  31. package/dpr/data/dashboardClient.ts +1 -1
  32. package/dpr/routes/journeys/request-report/filters/controller.js +1 -1
  33. package/dpr/routes/journeys/request-report/filters/controller.js.map +3 -3
  34. package/dpr/routes/journeys/request-report/filters/controller.ts +6 -2
  35. package/dpr/routes/journeys/request-report/filters/utils.js +1 -1
  36. package/dpr/routes/journeys/request-report/filters/utils.js.map +2 -2
  37. package/dpr/routes/journeys/request-report/filters/utils.ts +9 -3
  38. package/dpr/routes/journeys/view-report/async/dashboard/utils.js +1 -1
  39. package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +3 -3
  40. package/dpr/routes/journeys/view-report/async/dashboard/utils.ts +12 -3
  41. package/dpr/routes/journeys/view-report/async/report/tests.cy.js +1 -1
  42. package/dpr/routes/journeys/view-report/async/report/tests.cy.js.map +2 -2
  43. package/dpr/routes/journeys/view-report/async/report/tests.cy.ts +44 -8
  44. package/dpr/routes/journeys/view-report/utils.js +1 -1
  45. package/dpr/routes/journeys/view-report/utils.js.map +3 -3
  46. package/dpr/routes/journeys/view-report/utils.ts +6 -1
  47. package/dpr/services/dashboardService.js +1 -1
  48. package/dpr/services/dashboardService.js.map +2 -2
  49. package/dpr/services/dashboardService.ts +1 -1
  50. package/dpr/types/Charts.js +1 -1
  51. package/dpr/types/Charts.js.map +1 -1
  52. package/dpr/types/Charts.ts +10 -3
  53. package/dpr/types/ExecutionData.d.js +1 -1
  54. package/dpr/types/ExecutionData.d.js.map +1 -1
  55. package/dpr/types/ExecutionData.d.ts +1 -0
  56. package/dpr/utils/DataTableBuilder/DataTableBuilder.js +1 -1
  57. package/dpr/utils/DataTableBuilder/DataTableBuilder.js.map +2 -2
  58. package/dpr/utils/DataTableBuilder/DataTableBuilder.ts +37 -19
  59. package/dpr/utils/DateMapper/DateMapper.js +1 -1
  60. package/dpr/utils/DateMapper/DateMapper.js.map +2 -2
  61. package/dpr/utils/DateMapper/DateMapper.ts +4 -0
  62. package/dpr/utils/UserStoreItemBuilder.js +1 -1
  63. package/dpr/utils/UserStoreItemBuilder.js.map +3 -3
  64. package/dpr/utils/UserStoreItemBuilder.ts +6 -4
  65. package/dpr/utils/requestStatusHelper.js +1 -1
  66. package/dpr/utils/requestStatusHelper.js.map +2 -2
  67. package/dpr/utils/requestStatusHelper.ts +1 -1
  68. 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,EAAAJ,GAUA,IAAAK,EAKO,0CACPC,EAA0B,wCAC1BC,EAA+B,kDAExB,MAAML,EAAc,CACzBM,EACAC,IACkB,CAClB,MAAMC,EAAuB,CAAC,6BAA2B,eAAgB,6BAA2B,eAAe,EAC7G,CAAE,KAAAC,CAAK,EAAIH,EAEjB,IAAII,EACAC,EACAC,EAEJ,GAAIJ,EAAqB,SAASC,CAAI,EAAG,CACvC,KAAM,CAAE,WAAAI,EAAY,YAAAC,EAAa,eAAAC,CAAe,EAAIC,EAA2BV,EAAiBC,CAAO,EACnGO,EAAY,SACdH,EAAQM,EAAsBX,EAAiBS,CAAc,EAC7DL,EAAQQ,EAAsBZ,EAAiBS,CAAc,EAC7DH,EAAUO,EAAgBb,EAAiBO,EAAY,EAAI,EAE/D,KAAO,CACL,KAAM,CAAE,YAAAC,EAAa,aAAAM,CAAa,EAAIC,EAAyBf,EAAiBC,CAAO,EACnFO,EAAY,SACdH,EAAQW,EAAoBhB,EAAiBc,CAAY,EACzDV,EAAQa,EAAoBjB,EAAiBQ,CAAW,EACxDF,EAAUO,EAAgBb,EAAiBQ,CAAW,EAE1D,CAEA,MAAO,CACL,QAAAF,EACA,MAAAF,EACA,MAAAC,CACF,CACF,EAEA,IAAOV,EAAQ,CACb,YAAAD,CACF,EAEA,MAAMqB,EAA2B,CAACf,EAAyCC,IAAqC,CAC9G,MAAMiB,EAAO,EAAAC,QAAc,kBAAkBlB,CAAO,EAC9CO,EAAc,EAAAW,QAAc,eAAenB,EAAiBkB,CAAI,EAChEJ,EAAe,EAAAK,QAAc,2BAA2BnB,EAAiBQ,EAAa,EAAI,EAEhG,MAAO,CACL,YAAAA,EACA,aAAAM,CACF,CACF,EAEMJ,EAA6B,CAACV,EAAyCC,IAAqC,CAChH,MAAMM,EAAa,EAAAY,QAAc,kBAAkBlB,CAAO,EACpDO,EAAc,EAAAW,QAAc,eAAenB,EAAiBC,CAAO,EACnEQ,EAAiB,EAAAU,QAAc,2BAA2BnB,EAAiBQ,EAAa,EAAI,EAElG,MAAO,CACL,WAAAD,EACA,YAAAC,EACA,eAAAC,CACF,CACF,EAEMI,EAAkB,CACtBb,EACAkB,EACAE,EAAa,KACI,CACjB,MAAMC,EAAwB,CAAC,EACzBC,EAA6BC,EAAgBvB,EAAiBkB,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,CACtBvB,EACAkB,EACAE,EAAa,KACV,CACH,MAAME,EAA6B,CAAC,EAC9B,CAAE,QAAAE,CAAQ,EAAIxB,EACd,CAAE,SAAAyB,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,EAEMN,EAAsB,CAC1BhB,EACAc,IACc,CACd,KAAM,CAAE,KAAAX,EAAM,QAAAqB,CAAQ,EAAIxB,EACpB,CAAE,SAAAyB,CAAS,EAAID,EACfE,EAAc,CAAC,CAAiCD,EAAU,KAAME,GAAQA,EAAI,IAAI,EAEtF,IAAIO,EACAC,EACAC,EAEJ,OAAKV,EAGD,CAAE,OAAAQ,EAAQ,KAAAC,EAAM,SAAAC,CAAS,EAAIC,EAAuBb,EAASV,CAAY,EAFzE,CAAE,OAAAoB,EAAQ,KAAAC,EAAM,SAAAC,CAAS,EAAIE,EAAWd,EAASV,CAAY,EAK1D,CACL,KAAMX,EACN,KAAAgC,EACA,KAAM,CACJ,OAAAD,EACA,SAAAE,CACF,CACF,CACF,EAEME,EAAa,CAACd,EAAwCvB,IAAqC,CAC/F,KAAM,CAAE,KAAAsC,EAAM,SAAAd,CAAS,EAAID,EACrBU,EAAST,EAAS,IAAKE,GAAQA,EAAI,OAAO,EAC1Ca,EAAUD,EAAKA,EAAK,OAAS,CAAC,GAAG,GACjCJ,EAAOV,EAAS,CAAC,EAAE,KAAOA,EAAS,CAAC,EAAE,KAAO,OAE7CW,EAAWnC,EAAQ,IAAKwC,GAAQ,CACpC,MAAMV,EAAQU,EAAID,CAAO,EAAI,GAAGC,EAAID,CAAO,EAAE,GAAG,GAAK,MAC/CtB,EAAOO,EAAS,IAAKiB,GAAM,CAC/B,MAAMC,EAAQD,EAAE,GAChB,OAAOD,EAAIE,CAAK,EAAI,CAACF,EAAIE,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,OAAAV,EACA,KAAAC,EACA,SAAAC,CACF,CACF,EAEMC,EAAyB,CAACb,EAAwCvB,IAAqC,CAC3G,KAAM,CAAE,SAAAwB,EAAU,KAAAc,CAAK,EAAIf,EAErBsB,EAA8CrB,EAAU,KAAME,GAAQA,EAAI,OAAS,GAAG,EACtFoB,EAA8CtB,EAAU,KAAME,GAAQA,EAAI,OAAS,GAAG,EAEtFQ,EAAOY,GAAa,MAAQ,OAC5BC,EAAW,EAAA7B,QAAc,YAAYoB,EAAMtC,CAAO,EAClDgD,EAAaD,EAAW,EAAA7B,QAAc,eAAelB,EAAS+C,EAAS,EAAE,EAAI,CAAC/C,CAAO,EAErFiC,EAASe,EAAW,CAAC,GAAG,IAAKR,GAC1B,GAAGA,EAAIK,EAAY,EAAE,EAAE,GAAG,EAClC,EAEKV,EAA2Ba,EAAW,IAAKC,GAAc,CAC7D,MAAMhC,EAAOgC,EAAU,IAAKT,GAAQ,CAACA,EAAIM,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,OAAAX,EACA,KAAAC,EACA,SAAAC,CACF,CACF,EAEMnB,EAAsB,CAACjB,EAAyCkB,IAA4C,CAChH,KAAM,CAAE,QAAAM,CAAQ,EAAIxB,EACd,CAAE,KAAAuC,EAAM,SAAAd,CAAS,EAAID,EAGrB2B,EADgB,CAAC,GAAGZ,EAAM,GAAGd,CAAQ,EAChB,IAAK2B,IACvB,CAAE,KAAMA,EAAO,OAAQ,EAC/B,EAEKC,EAAkB,EAAAlC,QAAc,2BAA2BnB,EAAiBkB,EAAM,EAAI,EACtFoC,EAAO,EAAAC,QAAmB,gBAAgBF,CAAe,EAE/D,MAAO,CACL,KAAAF,EACA,KAAAG,CACF,CACF,EAEM3C,EAAwB,CAC5BX,EACAS,IACc,CACd,KAAM,CAAE,QAAAe,CAAQ,EAAIxB,EACd,CAAE,KAAAuC,EAAM,SAAAd,CAAS,EAAID,EAErBW,EAAOV,EAAS,CAAC,EAAE,KAAOA,EAAS,CAAC,EAAE,KAAO,OAE7CtB,EAAOH,EAAgB,OAAS,6BAA2B,eAAiB,MAAQ,OAGpFwC,EADW,EAAArB,QAAc,YAAYoB,EAAM9B,CAAc,EACtC,GAEnB+C,EAAgB,EAAArC,QAAc,qBAAqBV,CAAc,EACjEyB,EAASsB,EAAc,IAAKvB,GAA+BA,EAAE,CAAC,EAAE,GAAG,GAAwB,EAC3FwB,EAAeD,EAAc,CAAC,EAAE,OAEhCpB,EAA2B,CAAC,EAClC,QAASsB,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,EAAGlB,IAAMkB,EAAIlB,EAAG,CAAC,EACtCX,EAAQyB,EAAc,CAAC,EAAEE,CAAK,EAAElB,CAAO,EAAE,IAE/CJ,EAAS,KAAK,CACZ,KAAAlB,EACA,MAAAa,EACA,MAAAa,CACF,CAAC,CACH,CAEA,MAAO,CACL,KAAMzC,EACN,KAAAgC,EACA,WAAY,GACZ,KAAM,CACJ,OAAAD,EACA,SAAAE,CACF,CACF,CACF,EAEMxB,EAAwB,CAC5BZ,EACAS,IACa,CACb,KAAM,CAAE,QAAAe,CAAQ,EAAIxB,EACd,CAAE,KAAAuC,EAAM,SAAAd,CAAS,EAAID,EAE3B,IAAIqC,EAAqBpD,EAAe,KAAK,EAC7C,MAAMqD,EAA+BrD,EAAe,OAAS,EAC7D,IAAIsD,EAAgB,CAAC,GAAGtC,CAAQ,EAEhC,GAAIqC,EAA8B,CAChC,MAAME,EAAiBD,EAAc,UAAW,GAAM,EAAE,KAAO,IAAI,EAC7DE,EAAeF,EAAcC,CAAc,EAEjDD,EAAc,OAAOC,EAAgB,CAAC,EACtCD,EAAgB,CAAC,GAAGxB,EAAM,GAAGwB,CAAa,EAC1CA,EAAc,QAAQE,CAAY,CACpC,MACEJ,EAAqB,EAAA1C,QAAc,2BAA2BnB,EAAiB6D,CAAkB,EAGnG,MAAMV,EAAOY,EAAc,IAAKX,IACvB,CAAE,KAAMA,EAAO,OAAQ,EAC/B,EAEKE,EAAO,EAAAC,QAAmB,gBAAgBM,CAAkB,EAElE,MAAO,CACL,KAAAV,EACA,KAAAG,CACF,CACF",
6
- "names": ["utils_exports", "__export", "createChart", "utils_default", "__toCommonJS", "import_types", "import_datasetHelper", "import_utils", "chartDefinition", "rawData", "timeseriesChartTypes", "type", "table", "chart", "details", "latestData", "dataSetRows", "timeseriesData", "getDataForTimeseriesCharts", "createTimeseriesChart", "createTimeseriesTable", "getChartDetails", "snapshotData", "getDataForSnapshotCharts", "createSnapshotChart", "createSnapshotTable", "data", "DatasetHelper", "timeseries", "meta", "headlines", "createHeadlines", "columns", "measures", "isListChart", "col", "headline", "headlineColumn", "value", "label", "acc", "d", "labels", "unit", "datasets", "buildChartFromListData", "buildChart", "keys", "labelId", "row", "c", "rowId", "total", "val", "xAxisColumn", "yAxisColumn", "groupKey", "groupsData", "groupData", "head", "column", "filteredRowData", "rows", "DashboardListUtils", "timeBlockData", "datasetCount", "index", "timeperiod", "a", "flatTimeseriesData", "hasMultipleRowsPerTimePeriod", "headerColumns", "timestampIndex", "timestampCol"]
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": "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",
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.createChart(timeseriesVisualisationDefinition, dashboardMetricsData.flat())
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
- if (timeseriesChartTypes.includes(type)) {
32
- const { latestData, dataSetRows, timeseriesData } = getDataForTimeseriesCharts(chartDefinition, rawData)
33
- if (dataSetRows.length) {
34
- chart = createTimeseriesChart(chartDefinition, timeseriesData)
35
- table = createTimeseriesTable(chartDefinition, timeseriesData)
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 default {
55
- createChart,
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 (hasMultipleRowsPerTimePeriod) {
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
- headerColumns = [...keys, ...headerColumns]
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 t=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var m=(s,i)=>{for(var e in i)t(s,e,{get:i[e],enumerable:!0})},p=(s,i,e,r)=>{if(i&&typeof i=="object"||typeof i=="function")for(let o of u(i))!c.call(s,o)&&o!==e&&t(s,o,{get:()=>i[o],enumerable:!(r=d(i,o))||r.enumerable});return s};var b=s=>p(t({},"__esModule",{value:!0}),s);var x={};m(x,{AggregateType:()=>l,DashboardVisualisationType:()=>n});module.exports=b(x);var n=(a=>(a.LIST="list",a.DONUT="doughnut",a.BAR="bar",a.LINE="line",a.BAR_TIMESERIES="bar-timeseries",a.LINE_TIMESERIES="line-timeseries",a.SCORECARD="scorecard",a.SCORECARD_GROUP="scorecard-group",a))(n||{}),l=(e=>(e.SUM="sum",e.AVG="average",e))(l||{});0&&(module.exports={AggregateType,DashboardVisualisationType});
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 columnsAsList: boolean\n}\n\nexport enum DashboardVisualisationType {\n LIST = 'list',\n DONUT = 'doughnut',\n BAR = 'bar',\n LINE = 'line',\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,GAiDO,IAAKG,OACVA,EAAA,KAAO,OACPA,EAAA,MAAQ,WACRA,EAAA,IAAM,MACNA,EAAA,KAAO,OACPA,EAAA,eAAiB,iBACjBA,EAAA,gBAAkB,kBAClBA,EAAA,UAAY,YACZA,EAAA,gBAAkB,kBARRA,OAAA,IA+CAD,OACVA,EAAA,IAAM,MACNA,EAAA,IAAM,UAFIA,OAAA",
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 d=Object.create;var p=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var M=(t,s)=>{for(var o in s)p(t,o,{get:s[o],enumerable:!0})},w=(t,s,o,a)=>{if(s&&typeof s=="object"||typeof s=="function")for(let e of x(s))!y.call(t,e)&&e!==o&&p(t,e,{get:()=>s[e],enumerable:!(a=f(s,e))||a.enumerable});return t};var L=(t,s,o)=>(o=t!=null?d(D(t)):{},w(s||!t||!t.__esModule?p(o,"default",{value:t,enumerable:!0}):o,t)),T=t=>w(p({},"__esModule",{value:!0}),t);var k={};M(k,{createList:()=>g,createTableRows:()=>b,default:()=>$});module.exports=T(k);var h=L(require("../../../utils/datasetHelper"));const g=(t,s)=>{const{columns:o,showLatest:a=!0,columnsAsList:e}=t,{measures:r,keys:l}=o,u=!r&&!l||!r.length&&!l;let n=[...s];a&&(n=h.default.getLastestDataset(n));let i,c,m;return u?{head:i,rows:c,ts:m}=V(n):e?{head:i,rows:c,ts:m}=J(t,n):{head:i,rows:c,ts:m}=C(t,n),c.length&&r&&(c=E(c,r)),{table:{head:i,rows:c},ts:m}},J=(t,s)=>{const{columns:o}=t,{keys:a,measures:e}=o,r=h.default.getGroupKey(a||[],s),l=s[0]?.ts?.raw,u=l?`${l}`:"",n=[];n.push({text:""}),s.forEach(c=>{n.push({text:r?c[r.id].raw:""})});const i=[];return e.forEach(c=>{i.push([{text:c.display}])}),e.forEach((c,m)=>{s.forEach(R=>{i[m].push({text:`${R[c.id].raw}`})})}),{rows:i,head:n,ts:u}},b=(t,s)=>t.map(o=>{const a=s?.length?Array(s.length):Array(Object.keys(t[0]).length);return Object.keys(o).forEach((e,r)=>{const l=s?.length?s.findIndex(n=>n.id===e):r,u=o[e].raw;a.splice(l,1,{text:u})}),a}),C=(t,s)=>{const{measures:o}=t.columns,a=o.map(i=>({text:i.display})),e=h.default.getDatasetRows(t,s),r=h.default.filterRowsByDisplayColumns(t,e),l=b(r,o),u=e[0]?.ts?.raw,n=u?`${u}`:"";return{head:a,rows:l,ts:n}},V=t=>{const s=Object.keys(t[0]).map(l=>({text:l})),o=b(t),e=h.default.getLastestDataset(t)[0]?.ts?.raw,r=e?`${e}`:"";return{head:s,rows:o,ts:r}},E=(t,s)=>{const o=s.flatMap((a,e)=>a.aggregate?[e]:[]);if(o.length){const a=[{html:"<strong>Total<strong>"}];for(let e=1;e<s.length;e+=1)a[e]={text:""};t.push(a),o.forEach(e=>{const r=t.reduce((l,u)=>{const n=u[e];return n&&n.text&&(l+=Number(n.text)),l},0);t[t.length-1][e]={html:`<strong>${r}<strong>`}})}return t};var $={createList:g,createTableRows:b};0&&(module.exports={createList,createTableRows});
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, columnsAsList } = listDefinition\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", "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, showLatest = true, columnsAsList } = listDefinition
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 value: Granularity\n display: string\n }\n quickFilter?: {\n value: QuickFilters\n display: string\n }\n partialDate?: {\n start: boolean\n end: boolean\n }\n}\n\nexport interface FilterOptions {\n filters: Array<FilterValue>\n selectedFilters: Array<SelectedFilter>\n urlWithNoFilters: string\n}\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
- value: Granularity
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 I=Object.create;var D=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var M=(a,i)=>{for(var e in i)D(a,e,{get:i[e],enumerable:!0})},C=(a,i,e,r)=>{if(i&&typeof i=="object"||typeof i=="function")for(let t of G(i))!N.call(a,t)&&t!==e&&D(a,t,{get:()=>i[t],enumerable:!(r=P(i,t))||r.enumerable});return a};var d=(a,i,e)=>(e=a!=null?I(j(a)):{},C(i||!a||!a.__esModule?D(e,"default",{value:a,enumerable:!0}):e,a)),A=a=>C(D({},"__esModule",{value:!0}),a);var _={};M(_,{default:()=>W,getFilters:()=>E,getFiltersFromDefinition:()=>L,getPersonalisedFilters:()=>k,redirectWithDefaultFilters:()=>O,setFilterQueryFromFilterDefinition:()=>x,setFilterValuesFromRequest:()=>w,setRequestQueryFromFilterValues:()=>U});module.exports=A(_);var n=require("./filter-input/enum"),F=require("../../types/ReportQuery"),$=d(require("./filters-selected/utils")),g=d(require("../_inputs/date-range/utils")),h=d(require("../_inputs/date-input/utils")),R=d(require("../_inputs/granular-date-range/utils")),b=d(require("../_inputs/multi-select/utils")),Q=d(require("../../utils/Personalisation/personalisationUtils")),T=d(require("../../utils/urlHelper")),q=require("./filtersTypeEnum"),S=d(require("../../utils/localsHelper"));const w=(a,i,e="filters.")=>{const{preventDefault:r}=i.query;return Object.keys(i.query).every(t=>!t.includes(e))&&!r?a:a.map(t=>{let l,s;switch(t.type.toLowerCase()){case n.FilterType.dateRange.toLowerCase():l=g.default.setValueFromRequest(t,i,e);break;case n.FilterType.granularDateRange.toLowerCase():l=R.default.setValueFromRequest(t,i,e);break;case n.FilterType.date.toLowerCase():l=h.default.setValueFromRequest(t,i,e);break;case n.FilterType.multiselect.toLowerCase():({requestfilterValue:l,requestfilterValues:s}=b.default.setValueFromRequest(t,i,e));break;default:l=i.query[`${e}${t.name}`];break}let f=null;return l?f=l:r&&(f=""),{...t,value:f,...s&&{values:s}}})},x=(a,i)=>{let e=a.filter(r=>r.filter);return i&&(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 n.FilterType.dateRange.toLowerCase():return g.default.getQueryFromDefinition(t,r.name,F.DEFAULT_FILTERS_PREFIX);case n.FilterType.multiselect.toLowerCase():return b.default.getQueryFromDefinition(t,r.name,F.DEFAULT_FILTERS_PREFIX);case n.FilterType.granularDateRange.toLowerCase():{const s=g.default.getQueryFromDefinition(t,r.name,F.DEFAULT_FILTERS_PREFIX);return R.default.getQueryFromDefinition(t,r.name,F.DEFAULT_FILTERS_PREFIX,s)}default:return`${F.DEFAULT_FILTERS_PREFIX}${r.name}=${t.defaultValue}`}}).join("&")},L=(a,i)=>a.filter(e=>e.filter).filter(e=>{if(i!==void 0){const r=e.filter.interactive;return r===void 0?!i:i===r}return!0}).map(e=>{const{display:r,name:t}=e,l=e.filter,{type:s,staticOptions:c,dynamicOptions:f,defaultValue:o,mandatory:p,pattern:y}=l,m=c?c.map(V=>({value:V.name,text:V.display})):[];let u={text:r,name:t,type:s,value:o||null,minimumLength:f?.minimumLength,mandatory:p||!1,pattern:y};const v={value:"no-filter",text:"None",disabled:!1};switch(s){case n.FilterType.autocomplete.toLowerCase():u={...u,options:m};break;case n.FilterType.radio:p||m.unshift(v),u={...u,options:m};break;case n.FilterType.select:{p||m.unshift(v),m.unshift({value:"",text:"Select your option",disabled:!0,selected:!0}),u={...u,options:m};break}case n.FilterType.multiselect.toLowerCase():u={...u,options:m,values:o?o.split(","):[]};break;case n.FilterType.dateRange.toLowerCase():u=g.default.getFilterFromDefinition(l,u);break;case n.FilterType.date.toLowerCase():u=h.default.getFilterFromDefinition(l,u);break;case n.FilterType.granularDateRange.toLocaleLowerCase():{const V=l;u=R.default.getFilterFromDefinition(V,u);break}default:break}return u}),U=a=>a.filter(e=>e.value).reduce((e,r)=>{const{value:t,name:l}=r,s=`filters.${l}`;switch(r.type){case n.FilterType.granularDateRange.toLowerCase():case n.FilterType.dateRange.toLowerCase():Object.keys(t).forEach(c=>{e={...e,[`${s}.${c}`]:t[c]}});break;case n.FilterType.multiselect.toLowerCase():e={...e,[`${s}`]:t.split(",")};break;default:e={...e,[`${s}`]:t};break}return e},{}),O=(a,i,e,r)=>{const t={},{specification:l}=i,s=l?l.fields:[],{preventDefault:c}=r.query;if(Object.keys(a.filters).length===0&&!c&&s.filter(o=>o.filter&&o.filter.defaultValue).forEach(o=>{const{filter:p}=o;if(p)if(p.type.toLowerCase()===n.FilterType.dateRange.toLowerCase()){const{defaultValue:y}=p,m=y?y.split(" - "):"";m.length>=1&&(t[`${F.DEFAULT_FILTERS_PREFIX}${o.name}.start`]=m[0],m.length>=2&&(t[`${F.DEFAULT_FILTERS_PREFIX}${o.name}.end`]=m[1]))}else t[`${F.DEFAULT_FILTERS_PREFIX}${o.name}`]=p.defaultValue||""}),Object.keys(t).length>0){const o=(0,T.default)(a.toRecordWithFilterPrefix(),t,s);return e.redirect(`${r.baseUrl}${r.path}${o}`),!0}return!1},k=async(a,i,e,r,t)=>{const{reportId:l,id:s}=i.params,{dprUser:c}=S.default.getValues(e),f=await r.defaultFilterValuesService.get(c.id,l,s,t);let o=a;return f&&(o=Q.default.setFilterValuesFromSavedDefaults(a,[],f).filters),{filters:o,defaultFilterValues:f}},E=async({fields:a,req:i,res:e,prefix:r="filters.",services:t,filtersType:l})=>{let s=await L(a,l===q.FiltersType.INTERACTIVE),c,f=!1;if(t){const{filters:p,defaultFilterValues:y}=await k(s,i,e,t,l);s=p,c=y?.length>0,f=!0}i.query&&(s=w(s,i));const o=$.default.getSelectedFilters(s,r);return{filters:s,selectedFilters:o,hasDefaults:c,canSaveDefaults:f}};var W={getFiltersFromDefinition:L,setFilterValuesFromRequest:w,getFilters:E,setFilterQueryFromFilterDefinition:x,redirectWithDefaultFilters:O,setRequestQueryFromFilterValues:U,getPersonalisedFilters:k};0&&(module.exports={getFilters,getFiltersFromDefinition,getPersonalisedFilters,redirectWithDefaultFilters,setFilterQueryFromFilterDefinition,setFilterValuesFromRequest,setRequestQueryFromFilterValues});
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