@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.18.3 → 4.19.0
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/components/_async/async-filters-form/view.njk +1 -1
- package/dpr/components/_charts/utils.js +1 -1
- package/dpr/components/_charts/utils.js.map +3 -3
- package/dpr/components/_charts/utils.ts +17 -9
- package/dpr/types/ReportQuery.js +1 -1
- package/dpr/types/ReportQuery.js.map +2 -2
- package/dpr/types/ReportQuery.ts +1 -1
- package/dpr/utils/datasetHelper.js +1 -1
- package/dpr/utils/datasetHelper.js.map +3 -3
- package/dpr/utils/datasetHelper.ts +18 -9
- package/package.json +1 -1
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
{% endif %}
|
|
101
101
|
|
|
102
102
|
{# SORT OPTIONS #}
|
|
103
|
-
{% if sortBy.length > 0 and not interactive %}
|
|
103
|
+
{% if sortBy.length > 0 and not interactive and type !== 'dashboard' %}
|
|
104
104
|
<div class="dpr-async-request-filters__section">
|
|
105
105
|
<div class="dpr-async-request-filters__section--heading">
|
|
106
106
|
<h2 class="govuk-heading-m govuk-!-margin-bottom-0">Sort</strong></h2>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var G=Object.create;var w=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var E=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var Y=(a,s)=>{for(var t in s)w(a,t,{get:s[t],enumerable:!0})},k=(a,s,t,e)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of v(s))!H.call(a,o)&&o!==t&&w(a,o,{get:()=>s[o],enumerable:!(e=$(s,o))||e.enumerable});return a};var C=(a,s,t)=>(t=a!=null?G(E(a)):{},k(s||!a||!a.__esModule?w(t,"default",{value:a,enumerable:!0}):t,a)),j=a=>k(w({},"__esModule",{value:!0}),a);var _={};Y(_,{createChart:()=>K,createMatrixChart:()=>A,createTimeseriesCharts:()=>N,default:()=>Z});module.exports=j(_);var I=C(require("dayjs")),L=C(require("dayjs/plugin/weekOfYear")),p=C(require("../../utils/datasetHelper")),x=C(require("../_dashboards/dashboard-list/utils")),B=require("../_inputs/granular-date-range/types"),J=C(require("./chart/heatmap/HeatmapChart"));I.default.extend(L.default);const K=(a,s)=>{let t,e,o;const{dataSetRows:i,snapshotData:l}=O(a,s);return i.length&&(e=U(a,l),t=P(a,i),o=V(a,i)),{details:o,table:t,chart:e}},N=(a,s)=>{let t,e,o;const{latestData:i,dataSetRows:l,timeseriesData:d}=M(a,s);return l.length&&(e=Q(a,d),t=S(a,d),o=V(a,i,!0)),{details:o,table:t,chart:e}},A=(a,s,t)=>{let e,o,i,l=B.Granularity.DAILY;Object.keys(t).forEach(D=>{D.includes("granularity")&&(l=t[D])});const{latestData:d,dataSetRows:r,timeseriesData:n}=M(a,s);return r.length&&(o=new J.default(n,l,a).build(),e=S(a,n),i=V(a,d,!0)),{details:i,table:e,chart:o}},O=(a,s)=>{const t=p.default.getLastestDataset(s),e=p.default.getDatasetRows(a,t),o=p.default.filterRowsByDisplayColumns(a,e,!0);return{dataSetRows:e,snapshotData:o}},M=(a,s)=>{const t=p.default.getLastestDataset(s),e=p.default.getDatasetRows(a,s),o=p.default.filterRowsByDisplayColumns(a,e,!0);return{latestData:t,dataSetRows:e,timeseriesData:o}},V=(a,s,t=!1)=>{const e=[],o=W(a,s,t);return s[0]?.ts?.raw&&e.push({label:"Values for:",value:s[0]?.ts.raw}),{meta:e,headlines:o}},W=(a,s,t=!1)=>{const e=[],{columns:o}=a,{measures:i}=o,l=!!i.find(u=>u.axis);let d,r,n,D;if(t){if(r=i.find(u=>u.id!=="ts"),r){const{id:u}=r,{raw:c}=s[0][u];D=`${s[0].ts.raw}`,n=c?Number(c):void 0,n&&(d={label:D,value:n})}}else if(r=l?i.find(u=>u.axis&&u.axis==="y"):i[0],r){const u=r.display?.toLowerCase();D=u?`Total ${u}`:"Total",n=s.reduce((c,m)=>{if(r){const{id:h}=r,{raw:b}=m[h];if(b)return c+Number(b)}return c},0),d={label:D,value:n}}return d&&e.push(d),e},U=(a,s)=>{const{type:t,columns:e}=a,{measures:o}=e,i=!!o.find(n=>n.axis);let l,d,r;if(i)({labels:l,unit:d,datasets:r}=z(e,s));else{const n=X(e,s);l=n.labels,d=n.unit,r=n.datasets}return{type:t,unit:d,data:{labels:l,datasets:r}}},X=(a,s)=>{const{keys:t,measures:e}=a,o=e.map(r=>r.display||""),i=t?t[t.length-1]?.id:void 0,l=e[0].unit?e[0].unit:void 0,d=s.map(r=>{const n=i&&r[i]?`${r[i].raw}`:"All",D=e.map(c=>{const m=c.id;return r[m]&&r[m].raw?Number(r[m].raw):0}),u=D.reduce((c,m)=>c+m,0);return{label:n,data:D,total:u}});return{labels:o,unit:l,datasets:d}},z=(a,s)=>{const{measures:t,keys:e}=a,o=t.find(u=>u.axis==="x")||t[0],i=t.find(u=>u.axis==="y")||t[1];if(!o||!i)throw new Error("No X of Y Axis found in definition");const l=i?.unit||void 0,d=p.default.getGroupKey(s,e),r=d?p.default.groupRowsByKey(s,d.id):[s],n=r.flatMap(u=>u.map(c=>{const{id:m}=o,h=c[m];return h?`${h.raw}`:""})),D=r.map(u=>{const c=Array(n.length);u.forEach(h=>{const{id:b}=i,{id:R}=o,g=h[R],f=h[b],y=f&&f.raw?Number(f.raw):0,T=n.findIndex(F=>F===g.raw);T!==-1&&(c[T]=Number(y))});let m="";if(d){const h=d.id,b=u[0];m=b&&b[h]?`${b[h].raw}`:""}else m=i.display||m;return{label:m,data:c,total:c.reduce((h,b)=>h+b,0)}});return{labels:n,unit:l,datasets:D}},P=(a,s)=>{const{columns:t}=a,{measures:e}=t,l=[...t.keys||[],...e].map(n=>({text:n.display||""})),d=p.default.filterRowsByDisplayColumns(a,s,!0),r=x.default.createTableRows(d);return{head:l,rows:r}},Q=(a,s)=>{const{columns:t}=a,{keys:e,measures:o}=t,i=o[0].unit?o[0].unit:void 0,l=a.type.split("-")[0],r=p.default.getGroupKey(s,e)?.id,n=p.default.groupRowsByTimestamp(s),D=n.map(m=>m[0].ts.raw),u=n[0].length,c=[];for(let m=0;m<u;m+=1){const h=n.map(f=>{const{raw:y}=f[m][o[1].id];return y?Number(y):0}),b=h.reduce((f,y)=>f+y,0),R=n[0][m][r].raw,g=R||"";c.push({data:h,label:g,total:b})}return{type:l,unit:i,timeseries:!0,data:{labels:D,datasets:c}}},S=(a,s)=>{const{columns:t}=a,{keys:e,measures:o}=t;let i=s.flat(),l=[...o];if(s.length>1){const n=l.findIndex(c=>c.id==="ts"),D=l[n];l.splice(n,1),l=[...e?e.filter(c=>c.id!=="ts"):[],...l],l.unshift(D)}else i=p.default.filterRowsByDisplayColumns(a,i);const d=l.map(n=>({text:n.display})),r=x.default.createTableRows(i);return{head:d,rows:r}};var Z={createChart:K,createTimeseriesCharts:N,createMatrixChart:A};0&&(module.exports={createChart,createMatrixChart,createTimeseriesCharts});
|
|
2
2
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/dpr/components/_charts/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport { ChartDetails, ChartMetaData } from '../../types/Charts'\nimport { DashboardDataResponse } from '../../types/Metrics'\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/HeatmapChart'\nimport { components } from '../../types/api'\nimport {\n DashboardVisualisationData,\n DashboardVisualisationDataSet,\n DashboardVisualisatonCardData,\n MoJTable,\n} from '../_dashboards/dashboard-visualisation/types'\n\ndayjs.extend(weekOfYear)\n\nexport const createChart = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n): DashboardVisualisatonCardData | undefined => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\n\n const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n 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: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n): DashboardVisualisatonCardData => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\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: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n) => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\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 = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\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 = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\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: components['schemas']['DashboardVisualisationDefinition'],\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'].raw) {\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: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!measures.find((col) => col.axis)\n let headline: ChartMetaData | undefined\n\n let headlineColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n let value: number | undefined\n let label: string\n\n if (timeseries) {\n headlineColumn = measures.find((col) => col.id !== 'ts')\n if (headlineColumn) {\n const { id } = headlineColumn\n const { raw } = data[0][id]\n label = `${data[0]['ts'].raw}`\n value = raw ? Number(raw) : undefined\n\n if (value) {\n headline = {\n label,\n value,\n }\n }\n }\n } else {\n headlineColumn = !isListChart ? measures[0] : measures.find((col) => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n const display = headlineColumn.display?.toLowerCase()\n label = display ? `Total ${display}` : 'Total'\n value = data.reduce((acc: number, d: DashboardDataResponse) => {\n if (headlineColumn) {\n const { id } = headlineColumn\n const { raw } = d[id]\n if (raw) {\n return acc + Number(raw)\n }\n }\n return acc\n }, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n if (headline) headlines.push(headline)\n\n return headlines\n}\n\nconst createSnapshotChart = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n snapshotData: DashboardDataResponse[],\n): DashboardVisualisationData => {\n const { type, columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!measures.find((col) => col.axis)\n\n let labels: string[]\n let unit\n let datasets: DashboardVisualisationDataSet[]\n\n if (!isListChart) {\n const chart = buildChart(columns, snapshotData)\n labels = chart.labels\n unit = chart.unit\n datasets = chart.datasets\n } else {\n ;({ labels, unit, datasets } = buildChartFromListData(columns, snapshotData))\n }\n\n return {\n type,\n unit,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst buildChart = (\n columns: components['schemas']['DashboardVisualisationColumnsDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const { keys, measures } = columns\n const labels = measures.map((col) => col.display || '')\n const labelId = keys ? (keys[keys.length - 1]?.id as keyof DashboardDataResponse) : undefined\n const unit = measures[0].unit ? measures[0].unit : undefined\n\n const datasets = rawData.map((row) => {\n const label = labelId && 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 ? Number(row[rowId].raw) : 0\n })\n const total = data.reduce((acc: number, val: number) => acc + val, 0)\n return { label, data, total } as DashboardVisualisationDataSet\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst buildChartFromListData = (\n columns: components['schemas']['DashboardVisualisationColumnsDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const { measures, keys } = columns\n\n const xAxisColumn = measures.find((col) => col.axis === 'x') || measures[0]\n const yAxisColumn = measures.find((col) => col.axis === 'y') || measures[1]\n\n if (!xAxisColumn || !yAxisColumn) {\n throw new Error('No X of Y Axis found in definition')\n }\n\n const unit = yAxisColumn?.unit || undefined\n const groupKey = DatasetHelper.getGroupKey(rawData, keys)\n const groupsData = groupKey ? DatasetHelper.groupRowsByKey(rawData, groupKey.id) : [rawData]\n\n const labels = groupsData[0]?.map((row) => {\n const { id: xId } = xAxisColumn\n const field = row[xId]\n return field ? `${field.raw}` : ''\n })\n\n const datasets: DashboardVisualisationDataSet[] = groupsData.map((groupData) => {\n const data = groupData.map((row) => {\n const { id: yId } = yAxisColumn\n const field = row[yId]\n const raw = field && field.raw ? Number(field.raw) : 0\n return Number(raw)\n })\n\n let label = ''\n if (groupKey) {\n const groupKeyId = groupKey.id\n const groupRow = groupData[0]\n label = groupRow && groupRow[groupKeyId] ? `${groupRow[groupKeyId].raw}` : ''\n } else {\n label = yAxisColumn.display || label\n }\n\n return {\n label,\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 = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { measures } = columns\n const keys = columns.keys || []\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: components['schemas']['DashboardVisualisationDefinition'],\n timeseriesData: DashboardDataResponse[],\n): DashboardVisualisationData => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const unit = measures[0].unit ? measures[0].unit : undefined\n const type = <components['schemas']['DashboardVisualisationDefinition']['type']>chartDefinition.type.split('-')[0]\n const groupKey = DatasetHelper.getGroupKey(timeseriesData, keys)\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: DashboardVisualisationDataSet[] = []\n for (let index = 0; index < datasetCount; index += 1) {\n const data = timeBlockData.map((timeperiod) => {\n const { raw } = timeperiod[index][measures[1].id]\n return raw ? Number(raw) : 0\n })\n const total = data.reduce((a, c) => a + c, 0)\n const rawValue = timeBlockData[0][index][labelId].raw\n const label = rawValue ? <string>rawValue : ''\n\n datasets.push({\n data,\n label,\n total,\n })\n }\n\n return {\n type,\n unit,\n timeseries: true,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst createTimeseriesTable = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\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 ? 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": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,EAAA,sBAAAC,EAAA,2BAAAC,EAAA,YAAAC,IAAA,eAAAC,EAAAN,GAAA,IAAAO,EAAkB,oBAClBC,EAAuB,sCAGvBC,EAA0B,wCAC1BC,EAA+B,kDAC/BC,EAA4B,gDAC5BC,EAAyB,2CASzB,EAAAC,QAAM,OAAO,EAAAC,OAAU,EAEhB,MAAMZ,EAAc,CACzBa,EACAC,IAC8C,CAC9C,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,IACkC,CAClC,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,CAC/BP,EACAC,IACG,CACH,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,CACjCb,EACAC,IACG,CACH,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,GAAI,
|
|
6
|
-
"names": ["utils_exports", "__export", "createChart", "createMatrixChart", "createTimeseriesCharts", "utils_default", "__toCommonJS", "import_dayjs", "import_weekOfYear", "import_datasetHelper", "import_utils", "import_types", "import_HeatmapChart", "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", "id", "raw", "display", "acc", "d", "type", "labels", "unit", "datasets", "buildChartFromListData", "buildChart", "keys", "labelId", "row", "
|
|
4
|
+
"sourcesContent": ["import dayjs from 'dayjs'\nimport weekOfYear from 'dayjs/plugin/weekOfYear'\nimport { ChartDetails, ChartMetaData } from '../../types/Charts'\nimport { DashboardDataResponse } from '../../types/Metrics'\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/HeatmapChart'\nimport { components } from '../../types/api'\nimport {\n DashboardVisualisationData,\n DashboardVisualisationDataSet,\n DashboardVisualisatonCardData,\n MoJTable,\n} from '../_dashboards/dashboard-visualisation/types'\n\ndayjs.extend(weekOfYear)\n\nexport const createChart = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n): DashboardVisualisatonCardData | undefined => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\n\n const { dataSetRows, snapshotData } = getDataForSnapshotCharts(chartDefinition, rawData)\n if (dataSetRows.length) {\n 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: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n): DashboardVisualisatonCardData => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\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: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n) => {\n let table: MoJTable | undefined\n let chart: DashboardVisualisationData | undefined\n let details: ChartDetails | undefined\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 = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\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 = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n rawData: DashboardDataResponse[],\n) => {\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: components['schemas']['DashboardVisualisationDefinition'],\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']?.raw) {\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: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n timeseries = false,\n) => {\n const headlines: ChartMetaData[] = []\n const { columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!measures.find((col) => col.axis)\n let headline: ChartMetaData | undefined\n\n let headlineColumn: components['schemas']['DashboardVisualisationColumnDefinition'] | undefined\n let value: number | undefined\n let label: string\n\n if (timeseries) {\n headlineColumn = measures.find((col) => col.id !== 'ts')\n if (headlineColumn) {\n const { id } = headlineColumn\n const { raw } = data[0][id]\n label = `${data[0]['ts'].raw}`\n value = raw ? Number(raw) : undefined\n\n if (value) {\n headline = {\n label,\n value,\n }\n }\n }\n } else {\n headlineColumn = !isListChart ? measures[0] : measures.find((col) => col.axis && col.axis === 'y')\n\n if (headlineColumn) {\n const display = headlineColumn.display?.toLowerCase()\n label = display ? `Total ${display}` : 'Total'\n value = data.reduce((acc: number, d: DashboardDataResponse) => {\n if (headlineColumn) {\n const { id } = headlineColumn\n const { raw } = d[id]\n if (raw) {\n return acc + Number(raw)\n }\n }\n return acc\n }, 0)\n\n headline = {\n label,\n value,\n }\n }\n }\n\n if (headline) headlines.push(headline)\n\n return headlines\n}\n\nconst createSnapshotChart = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n snapshotData: DashboardDataResponse[],\n): DashboardVisualisationData => {\n const { type, columns } = chartDefinition\n const { measures } = columns\n const isListChart = !!measures.find((col) => col.axis)\n\n let labels: string[]\n let unit\n let datasets: DashboardVisualisationDataSet[]\n\n if (!isListChart) {\n const chart = buildChart(columns, snapshotData)\n labels = chart.labels\n unit = chart.unit\n datasets = chart.datasets\n } else {\n ;({ labels, unit, datasets } = buildChartFromListData(columns, snapshotData))\n }\n\n return {\n type,\n unit,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst buildChart = (\n columns: components['schemas']['DashboardVisualisationColumnsDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const { keys, measures } = columns\n const labels = measures.map((col) => col.display || '')\n const labelId = keys ? (keys[keys.length - 1]?.id as keyof DashboardDataResponse) : undefined\n const unit = measures[0].unit ? measures[0].unit : undefined\n\n const datasets = rawData.map((row) => {\n const label = labelId && 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 ? Number(row[rowId].raw) : 0\n })\n const total = data.reduce((acc: number, val: number) => acc + val, 0)\n return { label, data, total } as DashboardVisualisationDataSet\n })\n\n return {\n labels,\n unit,\n datasets,\n }\n}\n\nconst buildChartFromListData = (\n columns: components['schemas']['DashboardVisualisationColumnsDefinition'],\n rawData: DashboardDataResponse[],\n) => {\n const { measures, keys } = columns\n\n const xAxisColumn = measures.find((col) => col.axis === 'x') || measures[0]\n const yAxisColumn = measures.find((col) => col.axis === 'y') || measures[1]\n\n if (!xAxisColumn || !yAxisColumn) {\n throw new Error('No X of Y Axis found in definition')\n }\n\n const unit = yAxisColumn?.unit || undefined\n const groupKey = DatasetHelper.getGroupKey(rawData, keys)\n const groupsData = groupKey ? DatasetHelper.groupRowsByKey(rawData, groupKey.id) : [rawData]\n\n const labels = groupsData.flatMap((gd) => {\n return gd.map((row) => {\n const { id: xId } = xAxisColumn\n const field = row[xId]\n return field ? `${field.raw}` : ''\n })\n })\n\n const datasets: DashboardVisualisationDataSet[] = groupsData.map((groupData) => {\n const data = Array(labels.length)\n groupData.forEach((row) => {\n const { id: yId } = yAxisColumn\n const { id: xId } = xAxisColumn\n const labelField = row[xId]\n const valueField = row[yId]\n const raw = valueField && valueField.raw ? Number(valueField.raw) : 0\n const dataIndex = labels.findIndex((l) => l === labelField.raw)\n if (dataIndex !== -1) {\n data[dataIndex] = Number(raw)\n }\n })\n\n let label = ''\n if (groupKey) {\n const groupKeyId = groupKey.id\n const groupRow = groupData[0]\n label = groupRow && groupRow[groupKeyId] ? `${groupRow[groupKeyId].raw}` : ''\n } else {\n label = yAxisColumn.display || label\n }\n\n return {\n label,\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 = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\n data: DashboardDataResponse[],\n): MoJTable => {\n const { columns } = chartDefinition\n const { measures } = columns\n const keys = columns.keys || []\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: components['schemas']['DashboardVisualisationDefinition'],\n timeseriesData: DashboardDataResponse[],\n): DashboardVisualisationData => {\n const { columns } = chartDefinition\n const { keys, measures } = columns\n\n const unit = measures[0].unit ? measures[0].unit : undefined\n const type = <components['schemas']['DashboardVisualisationDefinition']['type']>chartDefinition.type.split('-')[0]\n const groupKey = DatasetHelper.getGroupKey(timeseriesData, keys)\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: DashboardVisualisationDataSet[] = []\n for (let index = 0; index < datasetCount; index += 1) {\n const data = timeBlockData.map((timeperiod) => {\n const { raw } = timeperiod[index][measures[1].id]\n return raw ? Number(raw) : 0\n })\n const total = data.reduce((a, c) => a + c, 0)\n const rawValue = timeBlockData[0][index][labelId].raw\n const label = rawValue ? <string>rawValue : ''\n\n datasets.push({\n data,\n label,\n total,\n })\n }\n\n return {\n type,\n unit,\n timeseries: true,\n data: {\n labels,\n datasets,\n },\n }\n}\n\nconst createTimeseriesTable = (\n chartDefinition: components['schemas']['DashboardVisualisationDefinition'],\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 ? 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_HeatmapChart", "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", "id", "raw", "display", "acc", "d", "type", "labels", "unit", "datasets", "buildChartFromListData", "buildChart", "keys", "labelId", "row", "rowId", "total", "val", "xAxisColumn", "yAxisColumn", "groupKey", "groupsData", "gd", "xId", "field", "groupData", "yId", "labelField", "valueField", "dataIndex", "l", "groupKeyId", "groupRow", "head", "column", "filteredRowData", "rows", "DashboardListUtils", "timeBlockData", "datasetCount", "index", "timeperiod", "a", "c", "rawValue", "flatTimeseriesData", "headerColumns", "timestampIndex", "m", "timestampCol", "k"]
|
|
7
7
|
}
|
|
@@ -125,7 +125,7 @@ const getChartDetails = (
|
|
|
125
125
|
const meta: ChartMetaData[] = []
|
|
126
126
|
const headlines: ChartMetaData[] = createHeadlines(chartDefinition, data, timeseries)
|
|
127
127
|
|
|
128
|
-
if (data[0]?.['ts']
|
|
128
|
+
if (data[0]?.['ts']?.raw) {
|
|
129
129
|
meta.push({
|
|
130
130
|
label: 'Values for:',
|
|
131
131
|
value: data[0]?.['ts'].raw,
|
|
@@ -271,18 +271,26 @@ const buildChartFromListData = (
|
|
|
271
271
|
const groupKey = DatasetHelper.getGroupKey(rawData, keys)
|
|
272
272
|
const groupsData = groupKey ? DatasetHelper.groupRowsByKey(rawData, groupKey.id) : [rawData]
|
|
273
273
|
|
|
274
|
-
const labels = groupsData
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
274
|
+
const labels = groupsData.flatMap((gd) => {
|
|
275
|
+
return gd.map((row) => {
|
|
276
|
+
const { id: xId } = xAxisColumn
|
|
277
|
+
const field = row[xId]
|
|
278
|
+
return field ? `${field.raw}` : ''
|
|
279
|
+
})
|
|
278
280
|
})
|
|
279
281
|
|
|
280
282
|
const datasets: DashboardVisualisationDataSet[] = groupsData.map((groupData) => {
|
|
281
|
-
const data =
|
|
283
|
+
const data = Array(labels.length)
|
|
284
|
+
groupData.forEach((row) => {
|
|
282
285
|
const { id: yId } = yAxisColumn
|
|
283
|
-
const
|
|
284
|
-
const
|
|
285
|
-
|
|
286
|
+
const { id: xId } = xAxisColumn
|
|
287
|
+
const labelField = row[xId]
|
|
288
|
+
const valueField = row[yId]
|
|
289
|
+
const raw = valueField && valueField.raw ? Number(valueField.raw) : 0
|
|
290
|
+
const dataIndex = labels.findIndex((l) => l === labelField.raw)
|
|
291
|
+
if (dataIndex !== -1) {
|
|
292
|
+
data[dataIndex] = Number(raw)
|
|
293
|
+
}
|
|
286
294
|
})
|
|
287
295
|
|
|
288
296
|
let label = ''
|
package/dpr/types/ReportQuery.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var b=Object.create;var d=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var T=(n,i)=>{for(var s in i)d(n,s,{get:i[s],enumerable:!0})},g=(n,i,s,t)=>{if(i&&typeof i=="object"||typeof i=="function")for(let r of z(i))!F.call(n,r)&&r!==s&&d(n,r,{get:()=>i[r],enumerable:!(t=R(i,r))||t.enumerable});return n};var A=(n,i,s)=>(s=n!=null?b(C(n)):{},g(i||!n||!n.__esModule?d(s,"default",{value:n,enumerable:!0}):s,n)),O=n=>g(d({},"__esModule",{value:!0}),n);var v={};T(v,{DEFAULT_FILTERS_PREFIX:()=>D,ReportQuery:()=>m,default:()=>j});module.exports=O(v);var h=require("../utils/urlHelper"),p=A(require("../components/_reports/report-columns-form/utils")),S=require("./UserReports");const D="filters.";class m{constructor({fields:i,template:s,queryParams:t,definitionsPath:r,filtersPrefix:P=D,reportType:x}){if(this.selectedPage=t.selectedPage?Number(t.selectedPage):1,this.pageSize=this.getPageSize(t,s,x),this.sortColumn=t.sortColumn?t.sortColumn.toString():this.getDefaultSortColumn(i),this.sortedAsc=t.sortedAsc!=="false",this.dataProductDefinitionsPath=r??(t.dataProductDefinitionsPath?t.dataProductDefinitionsPath.toString():void 0),this.filtersPrefix=P,t.columns){const e=typeof t.columns=="string"?t.columns.split(","):t.columns;this.columns=p.default.ensureMandatoryColumns(i,e)}else this.columns=i.filter(e=>e.visible).map(e=>e.name);const o=i.find(e=>e.type==="date"&&e.filter&&e.filter.type==="daterange"||e.type==="date"&&e.filter&&e.filter.type==="date");let l,f;o&&o.filter&&(l=o.filter.min,f=o.filter.max),this.filters={},Object.keys(t).filter(e=>e.startsWith(this.filtersPrefix)).filter(e=>t[e]).forEach(e=>{const a=e.replace(this.filtersPrefix,""),u=t[e];let c=u?u.toString():"";a.includes(".start")&&l&&new Date(c)<new Date(l)&&(c=l),a.includes(".end")&&f&&new Date(c)>new Date(f)&&(c=f),c!=="no-filter"&&(this.filters[a]=c)}),o&&o.filter&&o.filter.type==="daterange"&&(l&&Object.keys(t).some(e=>e.includes(this.filtersPrefix))&&Object.keys(t).every(e=>!e.includes(".start"))&&(this.filters[`${o.name}.start`]=l),f&&Object.keys(t).some(e=>e.includes(this.filtersPrefix))&&Object.keys(t).every(e=>!e.includes(".end"))&&(this.filters[`${o.name}.end`]=f)),o&&o.filter&&o.filter.type==="date"&&l&&Object.keys(t).some(e=>e.includes(this.filtersPrefix))&&Object.keys(t).every(e=>!e.includes(o.name))&&(this.filters[`${o.name}.start`]=l)}getDefaultSortColumn(i){const s=i.find(t=>t.defaultsort);return s?s.name:i.find(t=>t.sortable)?.name}getPageSize(i,s,t){let r=
|
|
1
|
+
"use strict";var b=Object.create;var d=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var T=(n,i)=>{for(var s in i)d(n,s,{get:i[s],enumerable:!0})},g=(n,i,s,t)=>{if(i&&typeof i=="object"||typeof i=="function")for(let r of z(i))!F.call(n,r)&&r!==s&&d(n,r,{get:()=>i[r],enumerable:!(t=R(i,r))||t.enumerable});return n};var A=(n,i,s)=>(s=n!=null?b(C(n)):{},g(i||!n||!n.__esModule?d(s,"default",{value:n,enumerable:!0}):s,n)),O=n=>g(d({},"__esModule",{value:!0}),n);var v={};T(v,{DEFAULT_FILTERS_PREFIX:()=>D,ReportQuery:()=>m,default:()=>j});module.exports=O(v);var h=require("../utils/urlHelper"),p=A(require("../components/_reports/report-columns-form/utils")),S=require("./UserReports");const D="filters.";class m{constructor({fields:i,template:s,queryParams:t,definitionsPath:r,filtersPrefix:P=D,reportType:x}){if(this.selectedPage=t.selectedPage?Number(t.selectedPage):1,this.pageSize=this.getPageSize(t,s,x),this.sortColumn=t.sortColumn?t.sortColumn.toString():this.getDefaultSortColumn(i),this.sortedAsc=t.sortedAsc!=="false",this.dataProductDefinitionsPath=r??(t.dataProductDefinitionsPath?t.dataProductDefinitionsPath.toString():void 0),this.filtersPrefix=P,t.columns){const e=typeof t.columns=="string"?t.columns.split(","):t.columns;this.columns=p.default.ensureMandatoryColumns(i,e)}else this.columns=i.filter(e=>e.visible).map(e=>e.name);const o=i.find(e=>e.type==="date"&&e.filter&&e.filter.type==="daterange"||e.type==="date"&&e.filter&&e.filter.type==="date");let l,f;o&&o.filter&&(l=o.filter.min,f=o.filter.max),this.filters={},Object.keys(t).filter(e=>e.startsWith(this.filtersPrefix)).filter(e=>t[e]).forEach(e=>{const a=e.replace(this.filtersPrefix,""),u=t[e];let c=u?u.toString():"";a.includes(".start")&&l&&new Date(c)<new Date(l)&&(c=l),a.includes(".end")&&f&&new Date(c)>new Date(f)&&(c=f),c!=="no-filter"&&(this.filters[a]=c)}),o&&o.filter&&o.filter.type==="daterange"&&(l&&Object.keys(t).some(e=>e.includes(this.filtersPrefix))&&Object.keys(t).every(e=>!e.includes(".start"))&&(this.filters[`${o.name}.start`]=l),f&&Object.keys(t).some(e=>e.includes(this.filtersPrefix))&&Object.keys(t).every(e=>!e.includes(".end"))&&(this.filters[`${o.name}.end`]=f)),o&&o.filter&&o.filter.type==="date"&&l&&Object.keys(t).some(e=>e.includes(this.filtersPrefix))&&Object.keys(t).every(e=>!e.includes(o.name))&&(this.filters[`${o.name}.start`]=l)}getDefaultSortColumn(i){const s=i.find(t=>t.defaultsort);return s?s.name:i.find(t=>t.sortable)?.name}getPageSize(i,s,t){let r=5e6;return(!t||t===S.ReportType.REPORT)&&(i.pageSize?r=Number(i.pageSize):s&&(r=this.getDefaultPageSize(s))),r}toRecordWithFilterPrefix(i=!1){const s={selectedPage:this.selectedPage.toString(),...this.pageSize&&{pageSize:this.pageSize.toString()},...this.sortColumn&&{sortColumn:this.sortColumn},sortedAsc:this.sortedAsc.toString(),columns:this.columns};return this.dataProductDefinitionsPath&&(s.dataProductDefinitionsPath=this.dataProductDefinitionsPath),Object.keys(this.filters).forEach(t=>{const r=this.filters[t];(r&&!i||r!==h.clearFilterValue)&&(s[`${this.filtersPrefix}${t}`]=r)}),s}getDefaultPageSize(i){switch(i){case"list-section":case"summary-section":case"row-section-child":case"parent-child":case"parent-child-section":return 5e5;default:return 20}}}var j=m;0&&(module.exports={DEFAULT_FILTERS_PREFIX,ReportQuery});
|
|
2
2
|
//# sourceMappingURL=ReportQuery.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/dpr/types/ReportQuery.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ParsedQs } from 'qs'\nimport { FilteredListRequest } from './index'\nimport Dict = NodeJS.Dict\nimport { components } from './api'\nimport { clearFilterValue } from '../utils/urlHelper'\nimport ColumnUtils from '../components/_reports/report-columns-form/utils'\nimport { Template } from './Templates'\nimport { ReportType } from './UserReports'\n\nexport const DEFAULT_FILTERS_PREFIX = 'filters.'\n\nclass ReportQuery implements FilteredListRequest {\n selectedPage: number\n\n pageSize: number\n\n sortColumn?: string | undefined\n\n columns: Array<string>\n\n sortedAsc: boolean\n\n filters: Dict<string>\n\n filtersPrefix: string\n\n dataProductDefinitionsPath?: string | undefined\n\n constructor({\n fields,\n template,\n queryParams,\n definitionsPath,\n filtersPrefix = DEFAULT_FILTERS_PREFIX,\n reportType,\n }: {\n fields: components['schemas']['FieldDefinition'][]\n template?: Template\n queryParams: ParsedQs\n definitionsPath?: string\n filtersPrefix?: string\n reportType?: ReportType\n }) {\n this.selectedPage = queryParams['selectedPage'] ? Number(queryParams['selectedPage']) : 1\n this.pageSize = this.getPageSize(queryParams, template, reportType)\n this.sortColumn = queryParams['sortColumn']\n ? queryParams['sortColumn'].toString()\n : this.getDefaultSortColumn(fields)\n this.sortedAsc = queryParams['sortedAsc'] !== 'false'\n this.dataProductDefinitionsPath =\n definitionsPath ??\n (queryParams['dataProductDefinitionsPath'] ? queryParams['dataProductDefinitionsPath'].toString() : undefined)\n this.filtersPrefix = filtersPrefix\n\n if (queryParams['columns']) {\n const columns =\n typeof queryParams['columns'] === 'string'\n ? queryParams['columns'].split(',')\n : (queryParams['columns'] as string[])\n this.columns = ColumnUtils.ensureMandatoryColumns(fields, columns)\n } else {\n this.columns = fields.filter((f) => f.visible).map((f) => f.name)\n }\n\n const dateField: components['schemas']['FieldDefinition'] | undefined = fields.find((f) => {\n return (\n (f.type === 'date' && f.filter && f.filter.type === 'daterange') ||\n (f.type === 'date' && f.filter && f.filter.type === 'date')\n )\n })\n\n let min: string | undefined\n let max: string | undefined\n if (dateField && dateField.filter) {\n min = dateField.filter.min\n max = dateField.filter.max\n }\n\n this.filters = {}\n\n Object.keys(queryParams)\n .filter((key) => key.startsWith(this.filtersPrefix))\n .filter((key) => queryParams[key])\n .forEach((key) => {\n const filter = key.replace(this.filtersPrefix, '')\n const p = queryParams[key]\n let value = p ? p.toString() : ''\n if (filter.includes('.start') && min) {\n if (new Date(value) < new Date(min)) value = min\n }\n if (filter.includes('.end') && max) {\n if (new Date(value) > new Date(max)) value = max\n }\n if (value !== 'no-filter') {\n this.filters[filter] = value\n }\n })\n\n if (dateField && dateField.filter && dateField.filter.type === 'daterange') {\n if (\n min &&\n Object.keys(queryParams).some((key) => key.includes(this.filtersPrefix)) &&\n Object.keys(queryParams).every((key) => !key.includes('.start'))\n ) {\n this.filters[`${dateField.name}.start`] = min\n }\n\n if (\n max &&\n Object.keys(queryParams).some((key) => key.includes(this.filtersPrefix)) &&\n Object.keys(queryParams).every((key) => !key.includes('.end'))\n ) {\n this.filters[`${dateField.name}.end`] = max\n }\n }\n\n if (dateField && dateField.filter && dateField.filter.type === 'date') {\n if (\n min &&\n Object.keys(queryParams).some((key) => key.includes(this.filtersPrefix)) &&\n Object.keys(queryParams).every((key) => !key.includes(dateField.name))\n ) {\n this.filters[`${dateField.name}.start`] = min\n }\n }\n }\n\n private getDefaultSortColumn(fields: components['schemas']['FieldDefinition'][]) {\n const defaultSortColumn = fields.find((f) => f.defaultsort)\n return defaultSortColumn ? defaultSortColumn.name : fields.find((f) => f.sortable)?.name\n }\n\n getPageSize(queryParams: ParsedQs, template?: Template, reportType?: ReportType): number {\n let pageSize =
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import type { ParsedQs } from 'qs'\nimport { FilteredListRequest } from './index'\nimport Dict = NodeJS.Dict\nimport { components } from './api'\nimport { clearFilterValue } from '../utils/urlHelper'\nimport ColumnUtils from '../components/_reports/report-columns-form/utils'\nimport { Template } from './Templates'\nimport { ReportType } from './UserReports'\n\nexport const DEFAULT_FILTERS_PREFIX = 'filters.'\n\nclass ReportQuery implements FilteredListRequest {\n selectedPage: number\n\n pageSize: number\n\n sortColumn?: string | undefined\n\n columns: Array<string>\n\n sortedAsc: boolean\n\n filters: Dict<string>\n\n filtersPrefix: string\n\n dataProductDefinitionsPath?: string | undefined\n\n constructor({\n fields,\n template,\n queryParams,\n definitionsPath,\n filtersPrefix = DEFAULT_FILTERS_PREFIX,\n reportType,\n }: {\n fields: components['schemas']['FieldDefinition'][]\n template?: Template\n queryParams: ParsedQs\n definitionsPath?: string\n filtersPrefix?: string\n reportType?: ReportType\n }) {\n this.selectedPage = queryParams['selectedPage'] ? Number(queryParams['selectedPage']) : 1\n this.pageSize = this.getPageSize(queryParams, template, reportType)\n this.sortColumn = queryParams['sortColumn']\n ? queryParams['sortColumn'].toString()\n : this.getDefaultSortColumn(fields)\n this.sortedAsc = queryParams['sortedAsc'] !== 'false'\n this.dataProductDefinitionsPath =\n definitionsPath ??\n (queryParams['dataProductDefinitionsPath'] ? queryParams['dataProductDefinitionsPath'].toString() : undefined)\n this.filtersPrefix = filtersPrefix\n\n if (queryParams['columns']) {\n const columns =\n typeof queryParams['columns'] === 'string'\n ? queryParams['columns'].split(',')\n : (queryParams['columns'] as string[])\n this.columns = ColumnUtils.ensureMandatoryColumns(fields, columns)\n } else {\n this.columns = fields.filter((f) => f.visible).map((f) => f.name)\n }\n\n const dateField: components['schemas']['FieldDefinition'] | undefined = fields.find((f) => {\n return (\n (f.type === 'date' && f.filter && f.filter.type === 'daterange') ||\n (f.type === 'date' && f.filter && f.filter.type === 'date')\n )\n })\n\n let min: string | undefined\n let max: string | undefined\n if (dateField && dateField.filter) {\n min = dateField.filter.min\n max = dateField.filter.max\n }\n\n this.filters = {}\n\n Object.keys(queryParams)\n .filter((key) => key.startsWith(this.filtersPrefix))\n .filter((key) => queryParams[key])\n .forEach((key) => {\n const filter = key.replace(this.filtersPrefix, '')\n const p = queryParams[key]\n let value = p ? p.toString() : ''\n if (filter.includes('.start') && min) {\n if (new Date(value) < new Date(min)) value = min\n }\n if (filter.includes('.end') && max) {\n if (new Date(value) > new Date(max)) value = max\n }\n if (value !== 'no-filter') {\n this.filters[filter] = value\n }\n })\n\n if (dateField && dateField.filter && dateField.filter.type === 'daterange') {\n if (\n min &&\n Object.keys(queryParams).some((key) => key.includes(this.filtersPrefix)) &&\n Object.keys(queryParams).every((key) => !key.includes('.start'))\n ) {\n this.filters[`${dateField.name}.start`] = min\n }\n\n if (\n max &&\n Object.keys(queryParams).some((key) => key.includes(this.filtersPrefix)) &&\n Object.keys(queryParams).every((key) => !key.includes('.end'))\n ) {\n this.filters[`${dateField.name}.end`] = max\n }\n }\n\n if (dateField && dateField.filter && dateField.filter.type === 'date') {\n if (\n min &&\n Object.keys(queryParams).some((key) => key.includes(this.filtersPrefix)) &&\n Object.keys(queryParams).every((key) => !key.includes(dateField.name))\n ) {\n this.filters[`${dateField.name}.start`] = min\n }\n }\n }\n\n private getDefaultSortColumn(fields: components['schemas']['FieldDefinition'][]) {\n const defaultSortColumn = fields.find((f) => f.defaultsort)\n return defaultSortColumn ? defaultSortColumn.name : fields.find((f) => f.sortable)?.name\n }\n\n getPageSize(queryParams: ParsedQs, template?: Template, reportType?: ReportType): number {\n let pageSize = 5000000\n if (!reportType || reportType === ReportType.REPORT) {\n if (queryParams['pageSize']) {\n pageSize = Number(queryParams['pageSize'])\n } else if (template) {\n pageSize = this.getDefaultPageSize(template)\n }\n }\n return pageSize\n }\n\n toRecordWithFilterPrefix(removeClearedFilters = false): Record<string, string | Array<string>> {\n const record: Record<string, string | Array<string>> = {\n selectedPage: this.selectedPage.toString(),\n ...(this.pageSize && { pageSize: this.pageSize.toString() }),\n ...(this.sortColumn && { sortColumn: this.sortColumn }),\n sortedAsc: this.sortedAsc.toString(),\n columns: this.columns,\n }\n\n if (this.dataProductDefinitionsPath) {\n record['dataProductDefinitionsPath'] = this.dataProductDefinitionsPath\n }\n\n Object.keys(this.filters).forEach((filterName) => {\n const value = this.filters[filterName]\n if ((value && !removeClearedFilters) || value !== clearFilterValue) {\n record[`${this.filtersPrefix}${filterName}`] = <string>value\n }\n })\n\n return record\n }\n\n private getDefaultPageSize(template: Template) {\n const maxResultsSize = 500000\n const standardPage = 20\n\n switch (template) {\n case 'list-section':\n case 'summary-section':\n case 'row-section-child':\n case 'parent-child':\n case 'parent-child-section':\n return maxResultsSize\n\n default:\n return standardPage\n }\n }\n}\n\nexport { ReportQuery }\nexport default ReportQuery\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["ReportQuery_exports", "__export", "DEFAULT_FILTERS_PREFIX", "ReportQuery", "ReportQuery_default", "__toCommonJS", "import_urlHelper", "import_utils", "import_UserReports", "fields", "template", "queryParams", "definitionsPath", "filtersPrefix", "reportType", "columns", "ColumnUtils", "f", "dateField", "min", "max", "key", "filter", "p", "value", "defaultSortColumn", "pageSize", "removeClearedFilters", "record", "filterName"]
|
|
7
7
|
}
|
package/dpr/types/ReportQuery.ts
CHANGED
|
@@ -131,7 +131,7 @@ class ReportQuery implements FilteredListRequest {
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
getPageSize(queryParams: ParsedQs, template?: Template, reportType?: ReportType): number {
|
|
134
|
-
let pageSize =
|
|
134
|
+
let pageSize = 5000000
|
|
135
135
|
if (!reportType || reportType === ReportType.REPORT) {
|
|
136
136
|
if (queryParams['pageSize']) {
|
|
137
137
|
pageSize = Number(queryParams['pageSize'])
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var y=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var j=(e,s)=>{for(var n in s)y(e,n,{get:s[n],enumerable:!0})},A=(e,s,n,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of q(s))!T.call(e,o)&&o!==n&&y(e,o,{get:()=>s[o],enumerable:!(t=O(s,o))||t.enumerable});return e};var B=e=>A(y({},"__esModule",{value:!0}),e);var H={};j(H,{default:()=>S,filterKeys:()=>w,filterRowsByDisplayColumns:()=>E,getDatasetRows:()=>v,getEarliestDataset:()=>C,getGroupKey:()=>k,getKeyIds:()=>R,getKeyVariations:()=>b,getLastestDataset:()=>x,groupRowsByKey:()=>K,groupRowsByTimestamp:()=>V});module.exports=B(H);const v=(e,s)=>{const{measures:n,filters:t,expectNulls:o}=e.columns,a=e.columns.keys,i=n.map(c=>c.id),r=a?.map(c=>c.id)||[];let l=t?.map(c=>c.id)||[];l=[...new Set(l)];const p=a?.some(c=>c.optional);s.length&&s[0].ts&&r.unshift("ts");const h=s.filter(c=>{const g=[];return Object.keys(c).forEach(m=>{const u=c[m].raw;let f=!0;if(l.includes(m)&&t){const I=t?t.filter(d=>d.id===m).map(d=>d.equals):[],D=[];I.forEach(d=>{d===null?D.push(u===""||u===void 0||u===null):D.push(d===u)}),f=D.some(Boolean)}else r.includes(m)&&p?f=!0:r.includes(m)&&!p||i.includes(m)?f=u!==""&&u!==void 0&&u!==null:o&&(f=u===""||u===void 0||u===null);g.push(f)}),g.every(m=>m)});return p?w(h,a||[]):h},b=e=>{const s=[],n=e.map(a=>a.id),t=e.every(a=>a.optional),o=[...n];return n.reverse().forEach(a=>{const i=e.find(r=>r.id===a);s.push([...o]),i&&i.optional&&o.pop()}),t&&s.push([]),s},R=(e,s)=>{let n=[];return s.every(t=>{const o=[];return e.forEach(a=>{const i=[];Object.keys(a).forEach(r=>{const l=a[r].raw;let p=!0;t.includes(r)&&(p=l!==""&&l!==void 0&&l!==null),i.push(p)}),i.every(r=>r)&&o.push(a)}),o.length>0?(n=t,!1):(n=t,!0)}),n},w=(e,s)=>{const n=b(s),t=R(e,n);return e.filter(o=>{const a=[];return Object.keys(o).forEach(i=>{const r=o[i].raw;let l=!0;t.includes(i)&&(l=r!==""&&r!==void 0&&r!==null),a.push(l)}),a.every(i=>i)})},x=e=>{const s=e[e.length-1]?.ts?.raw;return s?e.filter(n=>n.ts.raw===s):e},C=e=>{const s=e[0]?.ts?.raw;return s?e.filter(n=>n.ts.raw===s):e},V=e=>[...new Set(e.map(n=>n.ts.raw))].map(n=>e.filter(t=>t.ts.raw===n)),K=(e,s)=>[...new Set(e.map(t=>t[s].raw))].map(t=>e.filter(o=>o[s].raw===t)),k=(e,s)=>{if(!s||!s.length||!e.length)return;const n=e[0];let t=s.length-1,o=!1;for(;!o;){const a=`${s[t]?.id}`;a&&t!==-1&&(!n[a]||!n[a].raw||n[a].raw===""||n[a].raw===null)?t-=1:o=!0}return t!==-1?s[t]:void 0},E=(e,s,n=!1)=>{const{keys:t,measures:o}=e.columns,a=t||[];let i=[...o];n&&(i=[...a,...o]);const r=i.map(l=>l.id);return s.map(l=>Object.keys(l).filter(p=>r.includes(p)).reduce((p,h)=>(p[h]=l[h],p),{}))};var S={getDatasetRows:v,getLastestDataset:x,getEarliestDataset:C,filterRowsByDisplayColumns:E,groupRowsByTimestamp:V,groupRowsByKey:K,getGroupKey:k,getKeyVariations:b,getKeyIds:R,filterKeys:w};0&&(module.exports={filterKeys,filterRowsByDisplayColumns,getDatasetRows,getEarliestDataset,getGroupKey,getKeyIds,getKeyVariations,getLastestDataset,groupRowsByKey,groupRowsByTimestamp});
|
|
2
2
|
//# sourceMappingURL=datasetHelper.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/dpr/utils/datasetHelper.ts"],
|
|
4
|
-
"sourcesContent": ["import { DashboardDataResponse } from '../types/Metrics'\nimport { components } from '../types/api'\n\nexport const getDatasetRows = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { measures, filters, expectNulls } = listDefinition.columns\n const keys = <Array<components['schemas']['DashboardVisualisationColumnDefinition']>>listDefinition.columns.keys\n\n const displayColumnsIds = measures.map((col) => col.id)\n const keyColumnsIds = keys?.map((col) => col.id) || []\n
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,eAAAC,EAAA,+BAAAC,EAAA,mBAAAC,EAAA,uBAAAC,EAAA,gBAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,sBAAAC,EAAA,mBAAAC,EAAA,yBAAAC,IAAA,eAAAC,EAAAb,GAGO,MAAMK,EAAiB,CAC5BS,EACAC,IACG,CACH,KAAM,CAAE,SAAAC,EAAU,QAAAC,EAAS,YAAAC,CAAY,EAAIJ,EAAe,QACpDK,EAA+EL,EAAe,QAAQ,KAEtGM,EAAoBJ,EAAS,IAAKK,GAAQA,EAAI,EAAE,EAChDC,EAAgBH,GAAM,IAAKE,GAAQA,EAAI,EAAE,GAAK,CAAC,
|
|
6
|
-
"names": ["datasetHelper_exports", "__export", "datasetHelper_default", "filterKeys", "filterRowsByDisplayColumns", "getDatasetRows", "getEarliestDataset", "getGroupKey", "getKeyIds", "getKeyVariations", "getLastestDataset", "groupRowsByKey", "groupRowsByTimestamp", "__toCommonJS", "listDefinition", "dashboardData", "measures", "filters", "expectNulls", "keys", "displayColumnsIds", "col", "keyColumnsIds", "filterColIds", "hasOptionalKeys", "key", "filtered", "datasetRow", "validRow", "
|
|
4
|
+
"sourcesContent": ["import { DashboardDataResponse } from '../types/Metrics'\nimport { components } from '../types/api'\n\nexport const getDatasetRows = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { measures, filters, expectNulls } = listDefinition.columns\n const keys = <Array<components['schemas']['DashboardVisualisationColumnDefinition']>>listDefinition.columns.keys\n\n const displayColumnsIds = measures.map((col) => col.id)\n const keyColumnsIds = keys?.map((col) => col.id) || []\n let filterColIds = filters?.map((col) => col.id) || []\n filterColIds = [...new Set(filterColIds)]\n const hasOptionalKeys = keys?.some((key) => key.optional)\n\n if (dashboardData.length && dashboardData[0]['ts']) keyColumnsIds.unshift('ts')\n\n const filtered = dashboardData.filter((datasetRow: DashboardDataResponse) => {\n const validRow: boolean[] = []\n\n Object.keys(datasetRow).forEach((fieldId) => {\n const value = datasetRow[fieldId].raw\n // All rows are valid until proven otherwise\n let valid = true\n\n // 1. check if the column value is equal to a defined column value\n if (filterColIds.includes(fieldId) && filters) {\n const filterValues = filters ? filters.filter((f) => f.id === fieldId).map((f) => f.equals) : []\n const validFilters: boolean[] = []\n filterValues.forEach((filterValue) => {\n if (filterValue === null) {\n validFilters.push(value === '' || value === undefined || value === null)\n } else {\n validFilters.push(filterValue === value)\n }\n })\n valid = validFilters.some(Boolean)\n\n // 3. check keys exist in the defined columns\n } else if (keyColumnsIds.includes(fieldId) && hasOptionalKeys) {\n valid = true\n\n // 3. check keys exist in the defined columns\n } else if (keyColumnsIds.includes(fieldId) && !hasOptionalKeys) {\n valid = value !== '' && value !== undefined && value !== null\n\n // 2. check values exist in the defined columns\n } else if (displayColumnsIds.includes(fieldId)) {\n valid = value !== '' && value !== undefined && value !== null\n\n // 3. check that all remaining columns are null.\n } else if (expectNulls) {\n valid = value === '' || value === undefined || value === null\n }\n\n validRow.push(valid)\n })\n\n return validRow.every((val) => val)\n })\n\n if (hasOptionalKeys) {\n return filterKeys(filtered, keys || [])\n }\n\n return filtered\n}\n\nexport const getKeyVariations = (keys: Array<components['schemas']['DashboardVisualisationColumnDefinition']>) => {\n const colIdVariations: string[][] = []\n const keyColumnsIds = keys.map((col) => col.id)\n const allOptional = keys.every((key) => key.optional)\n const colIdCopy = [...keyColumnsIds]\n\n keyColumnsIds.reverse().forEach((id) => {\n const key = keys.find((k) => k.id === id)\n colIdVariations.push([...colIdCopy])\n if (key && key.optional) {\n colIdCopy.pop()\n }\n })\n\n if (allOptional) colIdVariations.push([])\n return colIdVariations\n}\n\nexport const getKeyIds = (dashboardData: DashboardDataResponse[], colIdVariations: string[][]) => {\n let validHeadIds: string[] = []\n colIdVariations.every((ids: string[]) => {\n const validRows = []\n\n dashboardData.forEach((datasetRow: DashboardDataResponse) => {\n const validRow: boolean[] = []\n\n Object.keys(datasetRow).forEach((datasetField) => {\n const value = datasetRow[datasetField].raw\n let valid = true\n if (ids.includes(datasetField)) {\n valid = value !== '' && value !== undefined && value !== null\n }\n validRow.push(valid)\n })\n\n if (validRow.every((val) => val)) {\n validRows.push(datasetRow)\n }\n })\n\n if (validRows.length > 0) {\n validHeadIds = ids\n return false\n }\n validHeadIds = ids\n return true\n })\n\n return validHeadIds\n}\n\nexport const filterKeys = (\n dashboardData: DashboardDataResponse[],\n keys: Array<components['schemas']['DashboardVisualisationColumnDefinition']>,\n) => {\n const colIdVariations = getKeyVariations(keys)\n const validHeadIds = getKeyIds(dashboardData, colIdVariations)\n\n return dashboardData.filter((datasetRow: DashboardDataResponse) => {\n const validRow: boolean[] = []\n Object.keys(datasetRow).forEach((datasetField) => {\n const value = datasetRow[datasetField].raw\n let valid = true\n if (validHeadIds.includes(datasetField)) {\n valid = value !== '' && value !== undefined && value !== null\n }\n validRow.push(valid)\n })\n\n return validRow.every((val) => val)\n })\n}\n\nexport const getLastestDataset = (dashboardData: DashboardDataResponse[]): DashboardDataResponse[] => {\n const latestTimestamp = dashboardData[dashboardData.length - 1]?.['ts']?.raw\n if (latestTimestamp) {\n return dashboardData.filter((data) => data['ts'].raw === latestTimestamp)\n }\n return dashboardData\n}\n\nexport const getEarliestDataset = (dashboardData: DashboardDataResponse[]): DashboardDataResponse[] => {\n const latestTimestamp = dashboardData[0]?.['ts']?.raw\n if (latestTimestamp) {\n return dashboardData.filter((data) => data['ts'].raw === latestTimestamp)\n }\n return dashboardData\n}\n\nexport const groupRowsByTimestamp = (dashboardData: DashboardDataResponse[]): DashboardDataResponse[][] => {\n const uniqueTimestamps = [...new Set(dashboardData.map((item) => item['ts'].raw))]\n return uniqueTimestamps.map((ts) => {\n return dashboardData.filter((d) => d['ts'].raw === ts)\n })\n}\n\nexport const groupRowsByKey = (dashboardData: DashboardDataResponse[], key: string): DashboardDataResponse[][] => {\n const uniqueKeyValues = [...new Set(dashboardData.map((item) => item[key].raw))]\n return uniqueKeyValues.map((keyValue) => {\n return dashboardData.filter((d) => d[key].raw === keyValue)\n })\n}\n\nexport const getGroupKey = (\n rawData: DashboardDataResponse[],\n keys?: Array<components['schemas']['DashboardVisualisationColumnDefinition']>,\n) => {\n if (!keys || !keys.length || !rawData.length) {\n return undefined\n }\n\n const data = rawData[0]\n let index = keys.length - 1\n let keyFound = false\n while (!keyFound) {\n const k = `${keys[index]?.id}`\n if (k && index !== -1 && (!data[k] || !data[k].raw || data[k].raw === '' || data[k].raw === null)) {\n index -= 1\n } else {\n keyFound = true\n }\n }\n\n return index !== -1 ? keys[index] : undefined\n}\n\nexport const filterRowsByDisplayColumns = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n includeKeys = false,\n) => {\n const { keys: keyCols, measures } = listDefinition.columns\n const keys = keyCols || []\n let displayColumns = [...measures]\n if (includeKeys) {\n displayColumns = [...keys, ...measures]\n }\n const displayColumnsIds = displayColumns.map((col) => col.id)\n\n return dashboardData.map((datasetRow: DashboardDataResponse) => {\n return Object.keys(datasetRow)\n .filter((key) => displayColumnsIds.includes(key))\n .reduce((acc, key) => {\n acc[key] = datasetRow[key]\n return acc\n }, {} as unknown as DashboardDataResponse)\n })\n}\n\nexport default {\n getDatasetRows,\n getLastestDataset,\n getEarliestDataset,\n filterRowsByDisplayColumns,\n groupRowsByTimestamp,\n groupRowsByKey,\n getGroupKey,\n getKeyVariations,\n getKeyIds,\n filterKeys,\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,eAAAC,EAAA,+BAAAC,EAAA,mBAAAC,EAAA,uBAAAC,EAAA,gBAAAC,EAAA,cAAAC,EAAA,qBAAAC,EAAA,sBAAAC,EAAA,mBAAAC,EAAA,yBAAAC,IAAA,eAAAC,EAAAb,GAGO,MAAMK,EAAiB,CAC5BS,EACAC,IACG,CACH,KAAM,CAAE,SAAAC,EAAU,QAAAC,EAAS,YAAAC,CAAY,EAAIJ,EAAe,QACpDK,EAA+EL,EAAe,QAAQ,KAEtGM,EAAoBJ,EAAS,IAAKK,GAAQA,EAAI,EAAE,EAChDC,EAAgBH,GAAM,IAAKE,GAAQA,EAAI,EAAE,GAAK,CAAC,EACrD,IAAIE,EAAeN,GAAS,IAAKI,GAAQA,EAAI,EAAE,GAAK,CAAC,EACrDE,EAAe,CAAC,GAAG,IAAI,IAAIA,CAAY,CAAC,EACxC,MAAMC,EAAkBL,GAAM,KAAMM,GAAQA,EAAI,QAAQ,EAEpDV,EAAc,QAAUA,EAAc,CAAC,EAAE,IAAOO,EAAc,QAAQ,IAAI,EAE9E,MAAMI,EAAWX,EAAc,OAAQY,GAAsC,CAC3E,MAAMC,EAAsB,CAAC,EAE7B,cAAO,KAAKD,CAAU,EAAE,QAASE,GAAY,CAC3C,MAAMC,EAAQH,EAAWE,CAAO,EAAE,IAElC,IAAIE,EAAQ,GAGZ,GAAIR,EAAa,SAASM,CAAO,GAAKZ,EAAS,CAC7C,MAAMe,EAAef,EAAUA,EAAQ,OAAQgB,GAAMA,EAAE,KAAOJ,CAAO,EAAE,IAAKI,GAAMA,EAAE,MAAM,EAAI,CAAC,EACzFC,EAA0B,CAAC,EACjCF,EAAa,QAASG,GAAgB,CAChCA,IAAgB,KAClBD,EAAa,KAAKJ,IAAU,IAAMA,IAAU,QAAaA,IAAU,IAAI,EAEvEI,EAAa,KAAKC,IAAgBL,CAAK,CAE3C,CAAC,EACDC,EAAQG,EAAa,KAAK,OAAO,CAGnC,MAAWZ,EAAc,SAASO,CAAO,GAAKL,EAC5CO,EAAQ,GAGCT,EAAc,SAASO,CAAO,GAAK,CAACL,GAIpCJ,EAAkB,SAASS,CAAO,EAH3CE,EAAQD,IAAU,IAAMA,IAAU,QAAaA,IAAU,KAOhDZ,IACTa,EAAQD,IAAU,IAAMA,IAAU,QAAaA,IAAU,MAG3DF,EAAS,KAAKG,CAAK,CACrB,CAAC,EAEMH,EAAS,MAAOQ,GAAQA,CAAG,CACpC,CAAC,EAED,OAAIZ,EACKrB,EAAWuB,EAAUP,GAAQ,CAAC,CAAC,EAGjCO,CACT,EAEajB,EAAoBU,GAAiF,CAChH,MAAMkB,EAA8B,CAAC,EAC/Bf,EAAgBH,EAAK,IAAKE,GAAQA,EAAI,EAAE,EACxCiB,EAAcnB,EAAK,MAAOM,GAAQA,EAAI,QAAQ,EAC9Cc,EAAY,CAAC,GAAGjB,CAAa,EAEnC,OAAAA,EAAc,QAAQ,EAAE,QAASkB,GAAO,CACtC,MAAMf,EAAMN,EAAK,KAAMsB,GAAMA,EAAE,KAAOD,CAAE,EACxCH,EAAgB,KAAK,CAAC,GAAGE,CAAS,CAAC,EAC/Bd,GAAOA,EAAI,UACbc,EAAU,IAAI,CAElB,CAAC,EAEGD,GAAaD,EAAgB,KAAK,CAAC,CAAC,EACjCA,CACT,EAEa7B,EAAY,CAACO,EAAwCsB,IAAgC,CAChG,IAAIK,EAAyB,CAAC,EAC9B,OAAAL,EAAgB,MAAOM,GAAkB,CACvC,MAAMC,EAAY,CAAC,EAmBnB,OAjBA7B,EAAc,QAASY,GAAsC,CAC3D,MAAMC,EAAsB,CAAC,EAE7B,OAAO,KAAKD,CAAU,EAAE,QAASkB,GAAiB,CAChD,MAAMf,EAAQH,EAAWkB,CAAY,EAAE,IACvC,IAAId,EAAQ,GACRY,EAAI,SAASE,CAAY,IAC3Bd,EAAQD,IAAU,IAAMA,IAAU,QAAaA,IAAU,MAE3DF,EAAS,KAAKG,CAAK,CACrB,CAAC,EAEGH,EAAS,MAAOQ,GAAQA,CAAG,GAC7BQ,EAAU,KAAKjB,CAAU,CAE7B,CAAC,EAEGiB,EAAU,OAAS,GACrBF,EAAeC,EACR,KAETD,EAAeC,EACR,GACT,CAAC,EAEMD,CACT,EAEavC,EAAa,CACxBY,EACAI,IACG,CACH,MAAMkB,EAAkB5B,EAAiBU,CAAI,EACvCuB,EAAelC,EAAUO,EAAesB,CAAe,EAE7D,OAAOtB,EAAc,OAAQY,GAAsC,CACjE,MAAMC,EAAsB,CAAC,EAC7B,cAAO,KAAKD,CAAU,EAAE,QAASkB,GAAiB,CAChD,MAAMf,EAAQH,EAAWkB,CAAY,EAAE,IACvC,IAAId,EAAQ,GACRW,EAAa,SAASG,CAAY,IACpCd,EAAQD,IAAU,IAAMA,IAAU,QAAaA,IAAU,MAE3DF,EAAS,KAAKG,CAAK,CACrB,CAAC,EAEMH,EAAS,MAAOQ,GAAQA,CAAG,CACpC,CAAC,CACH,EAEa1B,EAAqBK,GAAoE,CACpG,MAAM+B,EAAkB/B,EAAcA,EAAc,OAAS,CAAC,GAAI,IAAO,IACzE,OAAI+B,EACK/B,EAAc,OAAQgC,GAASA,EAAK,GAAM,MAAQD,CAAe,EAEnE/B,CACT,EAEaT,EAAsBS,GAAoE,CACrG,MAAM+B,EAAkB/B,EAAc,CAAC,GAAI,IAAO,IAClD,OAAI+B,EACK/B,EAAc,OAAQgC,GAASA,EAAK,GAAM,MAAQD,CAAe,EAEnE/B,CACT,EAEaH,EAAwBG,GACV,CAAC,GAAG,IAAI,IAAIA,EAAc,IAAKiC,GAASA,EAAK,GAAM,GAAG,CAAC,CAAC,EACzD,IAAKC,GACpBlC,EAAc,OAAQmC,GAAMA,EAAE,GAAM,MAAQD,CAAE,CACtD,EAGUtC,EAAiB,CAACI,EAAwCU,IAC7C,CAAC,GAAG,IAAI,IAAIV,EAAc,IAAKiC,GAASA,EAAKvB,CAAG,EAAE,GAAG,CAAC,CAAC,EACxD,IAAK0B,GACnBpC,EAAc,OAAQmC,GAAMA,EAAEzB,CAAG,EAAE,MAAQ0B,CAAQ,CAC3D,EAGU5C,EAAc,CACzB6C,EACAjC,IACG,CACH,GAAI,CAACA,GAAQ,CAACA,EAAK,QAAU,CAACiC,EAAQ,OACpC,OAGF,MAAML,EAAOK,EAAQ,CAAC,EACtB,IAAIC,EAAQlC,EAAK,OAAS,EACtBmC,EAAW,GACf,KAAO,CAACA,GAAU,CAChB,MAAMb,EAAI,GAAGtB,EAAKkC,CAAK,GAAG,EAAE,GACxBZ,GAAKY,IAAU,KAAO,CAACN,EAAKN,CAAC,GAAK,CAACM,EAAKN,CAAC,EAAE,KAAOM,EAAKN,CAAC,EAAE,MAAQ,IAAMM,EAAKN,CAAC,EAAE,MAAQ,MAC1FY,GAAS,EAETC,EAAW,EAEf,CAEA,OAAOD,IAAU,GAAKlC,EAAKkC,CAAK,EAAI,MACtC,EAEajD,EAA6B,CACxCU,EACAC,EACAwC,EAAc,KACX,CACH,KAAM,CAAE,KAAMC,EAAS,SAAAxC,CAAS,EAAIF,EAAe,QAC7CK,EAAOqC,GAAW,CAAC,EACzB,IAAIC,EAAiB,CAAC,GAAGzC,CAAQ,EAC7BuC,IACFE,EAAiB,CAAC,GAAGtC,EAAM,GAAGH,CAAQ,GAExC,MAAMI,EAAoBqC,EAAe,IAAKpC,GAAQA,EAAI,EAAE,EAE5D,OAAON,EAAc,IAAKY,GACjB,OAAO,KAAKA,CAAU,EAC1B,OAAQF,GAAQL,EAAkB,SAASK,CAAG,CAAC,EAC/C,OAAO,CAACiC,EAAKjC,KACZiC,EAAIjC,CAAG,EAAIE,EAAWF,CAAG,EAClBiC,GACN,CAAC,CAAqC,CAC5C,CACH,EAEA,IAAOxD,EAAQ,CACb,eAAAG,EACA,kBAAAK,EACA,mBAAAJ,EACA,2BAAAF,EACA,qBAAAQ,EACA,eAAAD,EACA,YAAAJ,EACA,iBAAAE,EACA,UAAAD,EACA,WAAAL,CACF",
|
|
6
|
+
"names": ["datasetHelper_exports", "__export", "datasetHelper_default", "filterKeys", "filterRowsByDisplayColumns", "getDatasetRows", "getEarliestDataset", "getGroupKey", "getKeyIds", "getKeyVariations", "getLastestDataset", "groupRowsByKey", "groupRowsByTimestamp", "__toCommonJS", "listDefinition", "dashboardData", "measures", "filters", "expectNulls", "keys", "displayColumnsIds", "col", "keyColumnsIds", "filterColIds", "hasOptionalKeys", "key", "filtered", "datasetRow", "validRow", "fieldId", "value", "valid", "filterValues", "f", "validFilters", "filterValue", "val", "colIdVariations", "allOptional", "colIdCopy", "id", "k", "validHeadIds", "ids", "validRows", "datasetField", "latestTimestamp", "data", "item", "ts", "d", "keyValue", "rawData", "index", "keyFound", "includeKeys", "keyCols", "displayColumns", "acc"]
|
|
7
7
|
}
|
|
@@ -10,7 +10,8 @@ export const getDatasetRows = (
|
|
|
10
10
|
|
|
11
11
|
const displayColumnsIds = measures.map((col) => col.id)
|
|
12
12
|
const keyColumnsIds = keys?.map((col) => col.id) || []
|
|
13
|
-
|
|
13
|
+
let filterColIds = filters?.map((col) => col.id) || []
|
|
14
|
+
filterColIds = [...new Set(filterColIds)]
|
|
14
15
|
const hasOptionalKeys = keys?.some((key) => key.optional)
|
|
15
16
|
|
|
16
17
|
if (dashboardData.length && dashboardData[0]['ts']) keyColumnsIds.unshift('ts')
|
|
@@ -18,26 +19,34 @@ export const getDatasetRows = (
|
|
|
18
19
|
const filtered = dashboardData.filter((datasetRow: DashboardDataResponse) => {
|
|
19
20
|
const validRow: boolean[] = []
|
|
20
21
|
|
|
21
|
-
Object.keys(datasetRow).forEach((
|
|
22
|
-
const value = datasetRow[
|
|
22
|
+
Object.keys(datasetRow).forEach((fieldId) => {
|
|
23
|
+
const value = datasetRow[fieldId].raw
|
|
23
24
|
// All rows are valid until proven otherwise
|
|
24
25
|
let valid = true
|
|
25
26
|
|
|
26
27
|
// 1. check if the column value is equal to a defined column value
|
|
27
|
-
if (filterColIds.includes(
|
|
28
|
-
const filterValues = filters ? filters.filter((f) => f.id ===
|
|
29
|
-
|
|
28
|
+
if (filterColIds.includes(fieldId) && filters) {
|
|
29
|
+
const filterValues = filters ? filters.filter((f) => f.id === fieldId).map((f) => f.equals) : []
|
|
30
|
+
const validFilters: boolean[] = []
|
|
31
|
+
filterValues.forEach((filterValue) => {
|
|
32
|
+
if (filterValue === null) {
|
|
33
|
+
validFilters.push(value === '' || value === undefined || value === null)
|
|
34
|
+
} else {
|
|
35
|
+
validFilters.push(filterValue === value)
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
valid = validFilters.some(Boolean)
|
|
30
39
|
|
|
31
40
|
// 3. check keys exist in the defined columns
|
|
32
|
-
} else if (keyColumnsIds.includes(
|
|
41
|
+
} else if (keyColumnsIds.includes(fieldId) && hasOptionalKeys) {
|
|
33
42
|
valid = true
|
|
34
43
|
|
|
35
44
|
// 3. check keys exist in the defined columns
|
|
36
|
-
} else if (keyColumnsIds.includes(
|
|
45
|
+
} else if (keyColumnsIds.includes(fieldId) && !hasOptionalKeys) {
|
|
37
46
|
valid = value !== '' && value !== undefined && value !== null
|
|
38
47
|
|
|
39
48
|
// 2. check values exist in the defined columns
|
|
40
|
-
} else if (displayColumnsIds.includes(
|
|
49
|
+
} else if (displayColumnsIds.includes(fieldId)) {
|
|
41
50
|
valid = value !== '' && value !== undefined && value !== null
|
|
42
51
|
|
|
43
52
|
// 3. check that all remaining columns are null.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ministryofjustice/hmpps-digital-prison-reporting-frontend",
|
|
3
3
|
"description": "The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.19.0",
|
|
5
5
|
"main": "dpr/all.mjs",
|
|
6
6
|
"sass": "dpr/all.scss",
|
|
7
7
|
"engines": {
|