@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.18.2 → 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/components/_dashboards/dashboard-filters/view.njk +2 -1
- package/dpr/routes/journeys/view-report/async/report/utils.js +1 -1
- package/dpr/routes/journeys/view-report/async/report/utils.js.map +2 -2
- package/dpr/routes/journeys/view-report/async/report/utils.ts +1 -1
- 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 = ''
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var M=Object.create;var v=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var Z=(t,e)=>{for(var o in e)v(t,o,{get:e[o],enumerable:!0})},E=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of J(e))!X.call(t,n)&&n!==o&&v(t,n,{get:()=>e[n],enumerable:!(r=G(e,n))||r.enumerable});return t};var R=(t,e,o)=>(o=t!=null?M(K(t)):{},E(e||!t||!t.__esModule?v(o,"default",{value:t,enumerable:!0}):o,t)),$=t=>E(v({},"__esModule",{value:!0}),t);var ut={};Z(ut,{default:()=>pt,getChildData:()=>Y,getData:()=>O,getSummariesData:()=>W,renderReport:()=>_});module.exports=$(ut);var V=R(require("parseurl")),C=require("../../../../../types/UserReports"),T=R(require("../../../../../types/ReportQuery")),x=require("../../../../../components/_filters/filtersTypeEnum"),A=R(require("../../../../../utils/definitionUtils")),k=R(require("../../../../../components/_reports/report-pagination/utils")),F=R(require("../../../../../components/_reports/report-totals/utils")),q=R(require("../../../../../components/_filters/utils")),Q=R(require("../../../../../components/_reports/report-columns-form/utils")),N=R(require("../../../../../components/_reports/report-actions/utils")),B=R(require("../../../../../components/user-reports/utils")),D=R(require("../../../../../utils/localsHelper")),L=R(require("../../../../../components/_reports/report-data-table/utils")),z=R(require("../../../../../utils/CollatedSummaryBuilder/CollatedSummaryBuilder"));const O=async({res:t,req:e,services:o,token:r,userId:n})=>{const{definitionsPath:i}=D.default.getValues(t),{reportId:a,variantId:l,id:
|
|
1
|
+
"use strict";var M=Object.create;var v=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var Z=(t,e)=>{for(var o in e)v(t,o,{get:e[o],enumerable:!0})},E=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of J(e))!X.call(t,n)&&n!==o&&v(t,n,{get:()=>e[n],enumerable:!(r=G(e,n))||r.enumerable});return t};var R=(t,e,o)=>(o=t!=null?M(K(t)):{},E(e||!t||!t.__esModule?v(o,"default",{value:t,enumerable:!0}):o,t)),$=t=>E(v({},"__esModule",{value:!0}),t);var ut={};Z(ut,{default:()=>pt,getChildData:()=>Y,getData:()=>O,getSummariesData:()=>W,renderReport:()=>_});module.exports=$(ut);var V=R(require("parseurl")),C=require("../../../../../types/UserReports"),T=R(require("../../../../../types/ReportQuery")),x=require("../../../../../components/_filters/filtersTypeEnum"),A=R(require("../../../../../utils/definitionUtils")),k=R(require("../../../../../components/_reports/report-pagination/utils")),F=R(require("../../../../../components/_reports/report-totals/utils")),q=R(require("../../../../../components/_filters/utils")),Q=R(require("../../../../../components/_reports/report-columns-form/utils")),N=R(require("../../../../../components/_reports/report-actions/utils")),B=R(require("../../../../../components/user-reports/utils")),D=R(require("../../../../../utils/localsHelper")),L=R(require("../../../../../components/_reports/report-data-table/utils")),z=R(require("../../../../../utils/CollatedSummaryBuilder/CollatedSummaryBuilder"));const O=async({res:t,req:e,services:o,token:r,userId:n})=>{const{definitionsPath:i}=D.default.getValues(t),{reportId:a,variantId:l,id:c,tableId:d}=e.params,p=l||c,s=await o.requestedReportService.getReportByTableId(d,n),f=s?.query?.data,m=await o.reportingService.getDefinition(r,a,p,i,f),{variant:y}=m,{specification:g}=y;if(!g)throw new Error("No specification found in variant definition");const S=Q.default.getColumns(g,e),w=await tt(m,S,t,e,o,s),U=await et({definition:m,services:o,token:r,req:e,res:t,reportQuery:w}),{summaries:h}=m.variant,I=h?await W(h,o,r,e,t):[],{childVariants:P}=m.variant,b=P?await Y(P,o,r,e,t,s):[];return{definition:m,requestData:s,reportData:U,summariesData:I,childData:b,reportQuery:w,columns:S}},tt=async(t,e,o,r,n,i)=>{const{definitionsPath:a}=D.default.getValues(o),l=A.default.getFields(t),c=A.default.getTemplate(t),d=await q.default.getFilters({fields:l,req:r,filtersType:x.FiltersType.INTERACTIVE,res:o,services:n}),p=r.query?.sortColumn||i?.query?.data?.sortColumn,u=r.query?.sortedAsc||i?.query?.data?.sortedAsc,s=r.query?.selectedPage,f=r.query?.pageSize,m=q.default.setRequestQueryFromFilterValues(d.filters),y={...p&&{sortColumn:p},...u&&{sortedAsc:u},...m,...f&&{pageSize:f},...s&&{selectedPage:s},...e&&{columns:e.value}};return new T.default({fields:l,template:c,queryParams:y,definitionsPath:a})},et=async t=>{const{services:e,token:o,req:r,reportQuery:n}=t,{reportId:i,variantId:a,id:l,tableId:c}=r.params,d=a||l;return e.reportingService.getAsyncReport(o,i,d,c,n.toRecordWithFilterPrefix(!0))},W=async(t,e,o,r,n)=>{const{reportId:i,variantId:a,id:l,tableId:c}=r.params,{definitionsPath:d}=D.default.getValues(n),p=a||l;return Promise.all(t.map(async u=>{const s=await e.reportingService.getAsyncSummaryReport(o,i,p,c,u.id,{dataProductDefinitionsPath:d});return{...u,data:s}}))},Y=async(t,e,o,r,n,i)=>{const{definitionsPath:a}=D.default.getValues(n),{reportId:l}=r.params,c=i?.childExecutionData;if(!c)throw new Error("getChildData: No execution data found for child variants");return Promise.all(t.map(async d=>{const{specification:p}=d;if(!p)throw new Error("getChildData: No specification found in child variant definition");const u=new T.default({fields:p?.fields||[],template:p.template,queryParams:r.query,definitionsPath:a}).toRecordWithFilterPrefix(!0),s=c.find(y=>y.variantId===d.id);if(!s||!s.tableId)throw new Error("getChildData: No matching child execution data found");const{tableId:f}=s,m=await e.reportingService.getAsyncReport(o,l,d.id,f,u);return{id:d.id,data:m}}))},_=async({req:t,res:e,services:o})=>{const{token:r,dprUser:n}=D.default.getValues(e),{definition:i,requestData:a,reportData:l,childData:c,summariesData:d,reportQuery:p,columns:u}=await O({req:t,res:e,services:o,token:r,userId:n.id}),s=L.default.createDataTable(i,u,l,c,d,p),f=await ot(t,e,o,i,d,s,u,p,a),m={...f,dataTable:s};return a&&Object.keys(a).length&&B.default.updateLastViewed({req:t,services:o,reportStateData:a,userId:n.id,filters:f.filterData.filters}),{renderData:m}},ot=async(t,e,o,r,n,i,a,l,c)=>{const{nestedBaseUrl:d}=D.default.getValues(e),p=(0,V.default)(t);if(!p)throw new Error("Unable to set url data from request");const u=p?nt(p,t):void 0,s=ct(r),{fields:f,specification:m}=s,y=c?lt(c):void 0,g=await st(r,o,e,t,l),S=await q.default.getFilters({fields:f,req:t,res:e,services:o,filtersType:x.FiltersType.INTERACTIVE}),w=await it(o,e,t,a,s,y,u),U=at(e,t);let h;n.length&&(h=new z.default(m,n).collatePageSummaries());let I,P;if(s.template==="list"){I=k.default.getPaginationData(p,g,t);const{pageSize:b,currentPage:j,totalRows:H}=I;P=F.default.getTotals(b,j,H,i[0].rowCount)}return{...rt(m)&&{columns:a},filterData:S,count:g,nestedBaseUrl:d,...U,...w,...s,...y,...u,...I&&{pagination:I},...P&&{totals:P},...h&&{reportSummaries:h}}},rt=t=>{const{template:e}=t;return!["row-section","row-section-child","summary","summary-section"].includes(e)},at=(t,e)=>{const{csrfToken:o}=D.default.getValues(t),{tableId:r,reportId:n,id:i}=e.params;return{csrfToken:o,loadType:C.LoadType.ASYNC,type:C.ReportType.REPORT,tableId:r,reportId:n,id:i}},nt=(t,e)=>{const{search:o}=t,r=o?encodeURIComponent(o):void 0,n=o?e.originalUrl.split(o)[0]:e.originalUrl;return{reportUrl:n.replace("/download-disabled","").replace("/download-disabled?",""),reportSearch:o||void 0,encodedSearch:r,pathname:n}},it=async(t,e,o,r,n,i,a)=>{const{csrfToken:l,dprUser:c,bookmarkingEnabled:d,downloadingEnabled:p}=D.default.getValues(e),{reportId:u,id:s}=o.params,{downloadPermissionService:f,bookmarkService:m}=t;let y=!1;p&&(y=await f.downloadEnabledForReport(c.id,u,s));let g;return d&&(g=await m.isBookmarked(s,u,c.id)),{actions:dt(l,r,y,e,o,n,i,a),canDownload:y,bookmarked:g}},st=async(t,e,o,r,n)=>{const{token:i}=D.default.getValues(o),{tableId:a,reportId:l,id:c}=r.params;return t.variant.interactive?e.reportingService.getAsyncInteractiveCount(i,a,l,c,n):e.reportingService.getAsyncCount(i,a)},ct=t=>{const{variant:e,name:o,description:r}=t,{classification:n,printable:i,specification:a,name:l,description:c}=e;if(!a)throw new Error("No specification found in variant definition");const{template:d,fields:p}=a;return{reportName:o,name:l,description:c||r,classification:n,printable:!!i,specification:a,template:d,fields:p}},lt=t=>{const{query:e,url:o,timestamp:r}=t;return{executionId:t.executionId,requestedTimestamp:r.requested?new Date(r.requested).toLocaleString():void 0,querySummary:e?.summary||[],queryData:e?.data,requestUrl:o?.request,defaultQuery:o?.report?.default,dataProductDefinitionsPath:t.dataProductDefinitionsPath}},dt=(t,e,o,r,n,i,a,l)=>{const{reportName:c,name:d,printable:p}=i,{tableId:u,id:s,reportId:f}=n.params,{nestedBaseUrl:m,definitionsPath:y,downloadingEnabled:g}=D.default.getValues(r);let S;l&&g&&(S={enabled:g,name:d,reportName:c,csrfToken:t,reportId:f,id:s,tableId:u,columns:e.value,definitionPath:y,loadType:C.LoadType.ASYNC,nestedBaseUrl:m,canDownload:o,currentUrl:l.pathname,currentQueryParams:l.reportSearch,...a?.queryData&&{sortColumn:a.queryData.sortColumn,sortedAsc:a.queryData.sortedAsc}});let w,U;a?.requestUrl?.fullUrl&&(w={reportName:c,name:d,url:a.requestUrl.fullUrl},U={url:a.requestUrl.fullUrl});let h;return a?.executionId&&a?.requestUrl?.fullUrl&&(h={url:a.requestUrl.fullUrl,executionId:a.executionId}),N.default.getActions({...S&&{download:S},...w&&{share:w},...h&&{refresh:h},...U&&{copy:U},print:{enabled:p}})};var pt={renderReport:_};0&&(module.exports={getChildData,getData,getSummariesData,renderReport});
|
|
2
2
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/dpr/routes/journeys/view-report/async/report/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import parseUrl from 'parseurl'\nimport { Url } from 'url'\nimport { Request, Response } from 'express'\n\n// Types\nimport type { Columns } from '../../../../../components/_reports/report-columns-form/types'\nimport type { AsyncReportUtilsParams } from '../../../../../types/AsyncReportUtils'\nimport type { DataTable } from '../../../../../utils/DataTableBuilder/types'\nimport type { components } from '../../../../../types/api'\nimport type { AsyncSummary, RequestedReport } from '../../../../../types/UserReports'\nimport { LoadType, ReportType } from '../../../../../types/UserReports'\nimport ReportQuery from '../../../../../types/ReportQuery'\nimport type { ChildData } from '../../../../../utils/ParentChildDataTableBuilder/types'\nimport type { ExtractedDefinitionData, ExtractedRequestData, ReportUrls } from './types'\nimport type { DownloadActionParams } from '../../../../../components/_reports/report-actions/types'\nimport { FiltersType } from '../../../../../components/_filters/filtersTypeEnum'\nimport type { Services } from '../../../../../types/Services'\n\n// Utils\nimport definitionUtils from '../../../../../utils/definitionUtils'\nimport PaginationUtils from '../../../../../components/_reports/report-pagination/utils'\nimport TotalsUtils from '../../../../../components/_reports/report-totals/utils'\nimport ReportFiltersUtils from '../../../../../components/_filters/utils'\nimport ColumnUtils from '../../../../../components/_reports/report-columns-form/utils'\nimport ReportActionsUtils from '../../../../../components/_reports/report-actions/utils'\nimport UserReportsUtils from '../../../../../components/user-reports/utils'\nimport LocalsHelper from '../../../../../utils/localsHelper'\nimport DataTableUtils from '../../../../../components/_reports/report-data-table/utils'\nimport RequestedReportService from '../../../my-reports/requested-reports/service'\n\nimport CollatedSummaryBuilder from '../../../../../utils/CollatedSummaryBuilder/CollatedSummaryBuilder'\n\nexport const getData = async ({\n res,\n req,\n services,\n token,\n userId,\n}: AsyncReportUtilsParams & { token: string; userId: string }) => {\n const { definitionsPath: definitionPath } = LocalsHelper.getValues(res)\n const { reportId, variantId, id, tableId } = req.params\n const reportVariantId = variantId || id\n\n // Get the request data\n const requestedReportService = <RequestedReportService>services.requestedReportService\n const requestData: RequestedReport | undefined = await requestedReportService.getReportByTableId(tableId, userId)\n const queryData = requestData?.query?.data\n\n // Get the definition\n const definition: components['schemas']['SingleVariantReportDefinition'] =\n await services.reportingService.getDefinition(token, reportId, reportVariantId, definitionPath, queryData)\n const { variant } = definition\n const { specification } = variant\n\n if (!specification) {\n throw new Error('No specification found in variant definition')\n }\n\n // Get the columns\n const columns = ColumnUtils.getColumns(specification, req)\n\n // initialise report query\n const reportQuery = await initReportQuery(definition, columns, res, req, services, requestData)\n\n // Get the reportData\n const reportData = await getReportData({ definition, services, token, req, res, reportQuery })\n\n // Get the summary data, if applicable\n const { summaries } = definition.variant\n const summariesData = !summaries ? [] : await getSummariesData(summaries, services, token, req, res)\n\n // Get the child data, if applicable\n const { childVariants } = definition.variant\n const childData: ChildData[] = !childVariants\n ? []\n : await getChildData(childVariants, services, token, req, res, requestData)\n\n return {\n definition,\n requestData,\n reportData,\n summariesData,\n childData,\n reportQuery,\n columns,\n }\n}\n\nconst initReportQuery = async (\n definition: components['schemas']['SingleVariantReportDefinition'],\n columns: Columns,\n res: Response,\n req: Request,\n services: Services,\n requestData?: RequestedReport,\n) => {\n const { definitionsPath } = LocalsHelper.getValues(res)\n const fields = definitionUtils.getFields(definition)\n const template = definitionUtils.getTemplate(definition)\n\n const filtersData = await ReportFiltersUtils.getFilters({\n fields,\n req,\n filtersType: FiltersType.INTERACTIVE,\n res,\n services,\n })\n\n // Sort\n const sortColumn = req.query?.['sortColumn'] || requestData?.query?.data?.['sortColumn']\n const sortedAsc = req.query?.['sortedAsc'] || requestData?.query?.data?.['sortedAsc']\n\n // Pagination\n const selectedPage = req.query?.['selectedPage']\n const pageSize = req.query?.['pageSize']\n\n // Filters\n const filtersQuery = ReportFiltersUtils.setRequestQueryFromFilterValues(filtersData.filters)\n\n const queryParams = {\n ...(sortColumn && { sortColumn }),\n ...(sortedAsc && { sortedAsc }),\n ...filtersQuery,\n ...(pageSize && { pageSize }),\n ...(selectedPage && { pageSize }),\n ...(columns && { columns: columns.value }),\n }\n\n return new ReportQuery({\n fields,\n template,\n queryParams,\n definitionsPath,\n })\n}\n\nconst getReportData = async (args: {\n definition: components['schemas']['SingleVariantReportDefinition']\n services: Services\n token: string\n req: Request\n res: Response\n reportQuery: ReportQuery\n}) => {\n const { services, token, req, reportQuery } = args\n const { reportId, variantId, id, tableId } = req.params\n const reportVariantId = variantId || id\n\n return services.reportingService.getAsyncReport(\n token,\n reportId,\n reportVariantId,\n tableId,\n reportQuery.toRecordWithFilterPrefix(true),\n )\n}\n\nexport const getSummariesData = async (\n summaries: components['schemas']['ReportSummary'][],\n services: Services,\n token: string,\n req: Request,\n res: Response,\n): Promise<AsyncSummary[]> => {\n const { reportId, variantId, id, tableId } = req.params\n const { definitionsPath: dataProductDefinitionsPath } = LocalsHelper.getValues(res)\n const reportVariantId = variantId || id\n\n return Promise.all(\n summaries.map(async (summary) => {\n const summaryReport = await services.reportingService.getAsyncSummaryReport(\n token,\n reportId,\n reportVariantId,\n tableId,\n summary.id,\n {\n dataProductDefinitionsPath,\n },\n )\n\n return {\n ...summary,\n data: summaryReport,\n }\n }),\n )\n}\n\nexport const getChildData = async (\n childVariants: components['schemas']['ChildVariantDefinition'][],\n services: Services,\n token: string,\n req: Request,\n res: Response,\n requestData?: RequestedReport,\n): Promise<ChildData[]> => {\n const { definitionsPath: dataProductDefinitionsPath } = LocalsHelper.getValues(res)\n const { reportId } = req.params\n const childExecutionData = requestData?.childExecutionData\n if (!childExecutionData) {\n throw new Error('getChildData: No execution data found for child variants')\n }\n return Promise.all(\n childVariants.map(async (childVariant) => {\n const { specification } = childVariant\n if (!specification) {\n throw new Error('getChildData: No specification found in child variant definition')\n }\n\n const query = new ReportQuery({\n fields: specification?.fields || [],\n template: specification.template,\n queryParams: req.query,\n definitionsPath: dataProductDefinitionsPath,\n }).toRecordWithFilterPrefix(true)\n\n const childData = childExecutionData.find((e) => e.variantId === childVariant.id)\n if (!childData || !childData.tableId) {\n throw new Error('getChildData: No matching child execution data found')\n }\n const { tableId: childTableId } = childData\n\n const childReport = await services.reportingService.getAsyncReport(\n token,\n reportId,\n childVariant.id,\n childTableId,\n query,\n )\n\n return {\n id: childVariant.id,\n data: childReport,\n }\n }),\n )\n}\n\n/**\n * Entry point function to render the report\n *\n * @param {AsyncReportUtilsParams} { req, res, services }\n * @return {*}\n */\nexport const renderReport = async ({ req, res, services }: AsyncReportUtilsParams) => {\n const { token, dprUser } = LocalsHelper.getValues(res)\n\n // Get the report data\n const { definition, requestData, reportData, childData, summariesData, reportQuery, columns } = await getData({\n req,\n res,\n services,\n token,\n userId: dprUser.id,\n })\n\n // Get the data table\n const dataTable: DataTable[] = DataTableUtils.createDataTable(\n definition,\n columns,\n reportData,\n childData,\n summariesData,\n reportQuery,\n )\n\n // Get the template data\n const templateData = await getTemplateData(\n req,\n res,\n services,\n definition,\n summariesData,\n dataTable,\n columns,\n reportQuery,\n requestData,\n )\n\n const renderData = {\n ...templateData,\n dataTable,\n }\n\n if (requestData && Object.keys(requestData).length) {\n UserReportsUtils.updateLastViewed({\n req,\n services,\n reportStateData: requestData,\n userId: dprUser.id,\n filters: templateData.filterData.filters,\n })\n }\n\n return { renderData }\n}\n\nconst getTemplateData = async (\n req: Request,\n res: Response,\n services: Services,\n definition: components['schemas']['SingleVariantReportDefinition'],\n summariesData: AsyncSummary[],\n dataTable: DataTable[],\n columns: Columns,\n reportQuery: ReportQuery,\n requestData?: RequestedReport,\n) => {\n const { nestedBaseUrl } = LocalsHelper.getValues(res)\n\n // get url data\n const url = parseUrl(req)\n if (!url) {\n throw new Error('Unable to set url data from request')\n }\n\n const urls = url ? setUrls(url, req) : undefined\n\n // get from definition\n const definitionData = extractDataFromDefinition(definition)\n const { fields, specification } = definitionData\n\n // get from requestedData\n const requestedData = requestData ? extractDataFromRequest(requestData) : undefined\n\n // Get the count\n const count = await getCount(definition, services, res, req, reportQuery)\n\n // Get the filters\n const filterData = await ReportFiltersUtils.getFilters({\n fields,\n req,\n res,\n services,\n filtersType: FiltersType.INTERACTIVE,\n })\n\n // Set the features\n const features = await setFeatures(services, res, req, columns, definitionData, requestedData, urls)\n\n // Set the extra meta data\n const meta = setMetaData(res, req)\n\n let reportSummaries\n if (summariesData.length) {\n const collatedSummaryBuilder = new CollatedSummaryBuilder(specification, summariesData)\n reportSummaries = collatedSummaryBuilder.collatePageSummaries()\n }\n\n let pagination\n let totals\n if (definitionData.template === 'list') {\n pagination = PaginationUtils.getPaginationData(url, count, req)\n const { pageSize, currentPage, totalRows } = pagination\n totals = TotalsUtils.getTotals(pageSize, currentPage, totalRows, dataTable[0].rowCount)\n }\n\n return {\n ...(showColumns(specification) && { columns }),\n filterData,\n count,\n nestedBaseUrl,\n ...meta,\n ...features,\n ...definitionData,\n ...requestedData,\n ...urls,\n ...(pagination && { pagination }),\n ...(totals && { totals }),\n ...(reportSummaries && { reportSummaries }),\n }\n}\n\nconst showColumns = (specification: components['schemas']['Specification']) => {\n const { template } = specification\n\n return !['row-section', 'row-section-child', 'summary', 'summary-section'].includes(template)\n}\n\nconst setMetaData = (res: Response, req: Request) => {\n const { csrfToken } = LocalsHelper.getValues(res)\n const { tableId, reportId, id } = req.params\n\n return {\n csrfToken,\n loadType: LoadType.ASYNC,\n type: ReportType.REPORT,\n tableId,\n reportId,\n id,\n }\n}\n\nconst setUrls = (url: Url, req: Request): ReportUrls => {\n const { search } = url\n const encodedSearch = search ? encodeURIComponent(search) : undefined\n const pathname = search ? req.originalUrl.split(search)[0] : req.originalUrl\n const reportUrl = pathname.replace('/download-disabled', '').replace('/download-disabled?', '')\n\n return {\n reportUrl,\n reportSearch: search || undefined,\n encodedSearch,\n pathname,\n }\n}\n\nconst setFeatures = async (\n services: Services,\n res: Response,\n req: Request,\n columns: Columns,\n definitionData: ExtractedDefinitionData,\n requestData?: ExtractedRequestData,\n urls?: ReportUrls,\n) => {\n const { csrfToken, dprUser, bookmarkingEnabled, downloadingEnabled } = LocalsHelper.getValues(res)\n const { reportId, id } = req.params\n const { downloadPermissionService, bookmarkService } = services\n\n let canDownload = false\n if (downloadingEnabled) {\n canDownload = await downloadPermissionService.downloadEnabledForReport(dprUser.id, reportId, id)\n }\n\n let bookmarked\n if (bookmarkingEnabled) {\n bookmarked = await bookmarkService.isBookmarked(id, reportId, dprUser.id)\n }\n\n const actions = setActions(csrfToken, columns, canDownload, res, req, definitionData, requestData, urls)\n\n return {\n actions,\n canDownload,\n bookmarked,\n }\n}\n\nconst getCount = async (\n definition: components['schemas']['SingleVariantReportDefinition'],\n services: Services,\n res: Response,\n req: Request,\n reportQuery: ReportQuery,\n) => {\n const { token } = LocalsHelper.getValues(res)\n const { tableId, reportId, id } = req.params\n\n return !definition.variant.interactive\n ? services.reportingService.getAsyncCount(token, tableId)\n : services.reportingService.getAsyncInteractiveCount(token, tableId, reportId, id, reportQuery)\n}\n\nconst extractDataFromDefinition = (\n definition: components['schemas']['SingleVariantReportDefinition'],\n): ExtractedDefinitionData => {\n const { variant, name: reportName, description: reportDescription } = definition\n const { classification, printable, specification, name, description } = variant\n if (!specification) {\n throw new Error('No specification found in variant definition')\n }\n const { template, fields } = specification\n\n return {\n reportName,\n name,\n description: description || reportDescription,\n classification,\n printable: Boolean(printable),\n specification,\n template,\n fields,\n }\n}\n\nconst extractDataFromRequest = (requestData: RequestedReport): ExtractedRequestData => {\n const { query, url, timestamp } = requestData\n\n return {\n executionId: requestData.executionId,\n requestedTimestamp: timestamp.requested ? new Date(timestamp.requested).toLocaleString() : undefined,\n querySummary: query?.summary || [],\n queryData: query?.data,\n requestUrl: url?.request,\n defaultQuery: url?.report?.default,\n dataProductDefinitionsPath: requestData.dataProductDefinitionsPath,\n }\n}\n\nconst setActions = (\n csrfToken: string,\n columns: Columns,\n canDownload: boolean,\n res: Response,\n req: Request,\n definitionData: ExtractedDefinitionData,\n requestData?: ExtractedRequestData,\n urls?: ReportUrls,\n) => {\n const { reportName, name, printable } = definitionData\n const { tableId, id, reportId } = req.params\n const { nestedBaseUrl, definitionsPath, downloadingEnabled } = LocalsHelper.getValues(res)\n\n // DownloadActionParams\n let downloadConfig: DownloadActionParams | undefined\n if (urls && downloadingEnabled) {\n downloadConfig = {\n enabled: downloadingEnabled,\n name,\n reportName,\n csrfToken,\n reportId,\n id,\n tableId,\n columns: columns.value,\n definitionPath: definitionsPath,\n loadType: LoadType.ASYNC,\n nestedBaseUrl,\n canDownload,\n currentUrl: urls.pathname,\n currentQueryParams: urls.reportSearch,\n ...(requestData?.queryData && {\n sortColumn: <string>requestData.queryData['sortColumn'],\n sortedAsc: <string>requestData.queryData['sortedAsc'],\n }),\n }\n }\n\n let shareConfig\n let copyConfig\n if (requestData?.requestUrl?.fullUrl) {\n shareConfig = {\n reportName,\n name,\n url: requestData.requestUrl.fullUrl,\n }\n copyConfig = {\n url: requestData.requestUrl.fullUrl,\n }\n }\n\n let refreshConfig\n if (requestData?.executionId && requestData?.requestUrl?.fullUrl) {\n refreshConfig = {\n url: requestData.requestUrl.fullUrl,\n executionId: requestData.executionId,\n }\n }\n\n return ReportActionsUtils.getActions({\n ...(downloadConfig && { download: downloadConfig }),\n ...(shareConfig && { share: shareConfig }),\n ...(refreshConfig && { refresh: refreshConfig }),\n ...(copyConfig && { copy: copyConfig }),\n print: { enabled: printable },\n })\n}\n\nexport default {\n renderReport,\n}\n"],
|
|
5
|
-
"mappings": "0jBAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,aAAAE,GAAA,iBAAAC,EAAA,YAAAC,EAAA,qBAAAC,EAAA,iBAAAC,IAAA,eAAAC,EAAAP,IAAA,IAAAQ,EAAqB,uBAUrBC,EAAqC,4CACrCC,EAAwB,+CAIxBC,EAA4B,8DAI5BC,EAA4B,mDAC5BC,EAA4B,yEAC5BA,EAAwB,qEACxBA,EAA+B,uDAC/BA,EAAwB,2EACxBA,EAA+B,sEAC/BA,EAA6B,2DAC7BC,EAAyB,gDACzBD,EAA2B,yEAG3BE,EAAmC,iFAE5B,MAAMX,EAAU,MAAO,CAC5B,IAAAY,EACA,IAAAC,EACA,SAAAC,EACA,MAAAC,EACA,OAAAC,CACF,IAAkE,CAChE,KAAM,CAAE,gBAAiBC,CAAe,EAAI,EAAAC,QAAa,UAAUN,CAAG,EAChE,CAAE,SAAAO,EAAU,UAAAC,EAAW,GAAAC,EAAI,QAAAC,CAAQ,EAAIT,EAAI,OAC3CU,EAAkBH,GAAaC,EAI/BG,EAA2C,MADMV,EAAS,uBACc,mBAAmBQ,EAASN,CAAM,EAC1GS,EAAYD,GAAa,OAAO,KAGhCE,EACJ,MAAMZ,EAAS,iBAAiB,cAAcC,EAAOI,EAAUI,EAAiBN,EAAgBQ,CAAS,EACrG,CAAE,QAAAE,CAAQ,EAAID,EACd,CAAE,cAAAE,CAAc,EAAID,EAE1B,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,8CAA8C,EAIhE,MAAMC,EAAU,EAAAC,QAAY,WAAWF,EAAef,CAAG,EAGnDkB,EAAc,MAAMC,GAAgBN,EAAYG,EAASjB,EAAKC,EAAKC,EAAUU,CAAW,EAGxFS,EAAa,MAAMC,GAAc,CAAE,WAAAR,EAAY,SAAAZ,EAAU,MAAAC,EAAO,IAAAF,EAAK,IAAAD,EAAK,YAAAmB,CAAY,CAAC,EAGvF,CAAE,UAAAI,CAAU,EAAIT,EAAW,QAC3BU,EAAiBD,EAAiB,MAAMlC,EAAiBkC,EAAWrB,EAAUC,EAAOF,EAAKD,CAAG,EAAhE,CAAC,EAG9B,CAAE,cAAAyB,CAAc,EAAIX,EAAW,QAC/BY,EAA0BD,EAE5B,MAAMtC,EAAasC,EAAevB,EAAUC,EAAOF,EAAKD,EAAKY,CAAW,EADxE,CAAC,EAGL,MAAO,CACL,WAAAE,EACA,YAAAF,EACA,WAAAS,EACA,cAAAG,EACA,UAAAE,EACA,YAAAP,EACA,QAAAF,CACF,CACF,EAEMG,GAAkB,MACtBN,EACAG,EACAjB,EACAC,EACAC,EACAU,IACG,CACH,KAAM,CAAE,gBAAAe,CAAgB,EAAI,EAAArB,QAAa,UAAUN,CAAG,EAChD4B,EAAS,EAAAC,QAAgB,UAAUf,CAAU,EAC7CgB,EAAW,EAAAD,QAAgB,YAAYf,CAAU,EAEjDiB,EAAc,MAAM,EAAAC,QAAmB,WAAW,CACtD,OAAAJ,EACA,IAAA3B,EACA,YAAa,cAAY,YACzB,IAAAD,EACA,SAAAE,CACF,CAAC,EAGK+B,EAAahC,EAAI,OAAQ,YAAiBW,GAAa,OAAO,MAAO,WACrEsB,EAAYjC,EAAI,OAAQ,WAAgBW,GAAa,OAAO,MAAO,UAGnEuB,EAAelC,EAAI,OAAQ,aAC3BmC,EAAWnC,EAAI,OAAQ,SAGvBoC,EAAe,EAAAL,QAAmB,gCAAgCD,EAAY,OAAO,EAErFO,EAAc,CAClB,GAAIL,GAAc,CAAE,WAAAA,CAAW,EAC/B,GAAIC,GAAa,CAAE,UAAAA,CAAU,EAC7B,GAAGG,EACH,GAAID,GAAY,CAAE,SAAAA,CAAS,EAC3B,GAAID,GAAgB,CAAE,
|
|
4
|
+
"sourcesContent": ["import parseUrl from 'parseurl'\nimport { Url } from 'url'\nimport { Request, Response } from 'express'\n\n// Types\nimport type { Columns } from '../../../../../components/_reports/report-columns-form/types'\nimport type { AsyncReportUtilsParams } from '../../../../../types/AsyncReportUtils'\nimport type { DataTable } from '../../../../../utils/DataTableBuilder/types'\nimport type { components } from '../../../../../types/api'\nimport type { AsyncSummary, RequestedReport } from '../../../../../types/UserReports'\nimport { LoadType, ReportType } from '../../../../../types/UserReports'\nimport ReportQuery from '../../../../../types/ReportQuery'\nimport type { ChildData } from '../../../../../utils/ParentChildDataTableBuilder/types'\nimport type { ExtractedDefinitionData, ExtractedRequestData, ReportUrls } from './types'\nimport type { DownloadActionParams } from '../../../../../components/_reports/report-actions/types'\nimport { FiltersType } from '../../../../../components/_filters/filtersTypeEnum'\nimport type { Services } from '../../../../../types/Services'\n\n// Utils\nimport definitionUtils from '../../../../../utils/definitionUtils'\nimport PaginationUtils from '../../../../../components/_reports/report-pagination/utils'\nimport TotalsUtils from '../../../../../components/_reports/report-totals/utils'\nimport ReportFiltersUtils from '../../../../../components/_filters/utils'\nimport ColumnUtils from '../../../../../components/_reports/report-columns-form/utils'\nimport ReportActionsUtils from '../../../../../components/_reports/report-actions/utils'\nimport UserReportsUtils from '../../../../../components/user-reports/utils'\nimport LocalsHelper from '../../../../../utils/localsHelper'\nimport DataTableUtils from '../../../../../components/_reports/report-data-table/utils'\nimport RequestedReportService from '../../../my-reports/requested-reports/service'\n\nimport CollatedSummaryBuilder from '../../../../../utils/CollatedSummaryBuilder/CollatedSummaryBuilder'\n\nexport const getData = async ({\n res,\n req,\n services,\n token,\n userId,\n}: AsyncReportUtilsParams & { token: string; userId: string }) => {\n const { definitionsPath: definitionPath } = LocalsHelper.getValues(res)\n const { reportId, variantId, id, tableId } = req.params\n const reportVariantId = variantId || id\n\n // Get the request data\n const requestedReportService = <RequestedReportService>services.requestedReportService\n const requestData: RequestedReport | undefined = await requestedReportService.getReportByTableId(tableId, userId)\n const queryData = requestData?.query?.data\n\n // Get the definition\n const definition: components['schemas']['SingleVariantReportDefinition'] =\n await services.reportingService.getDefinition(token, reportId, reportVariantId, definitionPath, queryData)\n const { variant } = definition\n const { specification } = variant\n\n if (!specification) {\n throw new Error('No specification found in variant definition')\n }\n\n // Get the columns\n const columns = ColumnUtils.getColumns(specification, req)\n\n // initialise report query\n const reportQuery = await initReportQuery(definition, columns, res, req, services, requestData)\n\n // Get the reportData\n const reportData = await getReportData({ definition, services, token, req, res, reportQuery })\n\n // Get the summary data, if applicable\n const { summaries } = definition.variant\n const summariesData = !summaries ? [] : await getSummariesData(summaries, services, token, req, res)\n\n // Get the child data, if applicable\n const { childVariants } = definition.variant\n const childData: ChildData[] = !childVariants\n ? []\n : await getChildData(childVariants, services, token, req, res, requestData)\n\n return {\n definition,\n requestData,\n reportData,\n summariesData,\n childData,\n reportQuery,\n columns,\n }\n}\n\nconst initReportQuery = async (\n definition: components['schemas']['SingleVariantReportDefinition'],\n columns: Columns,\n res: Response,\n req: Request,\n services: Services,\n requestData?: RequestedReport,\n) => {\n const { definitionsPath } = LocalsHelper.getValues(res)\n const fields = definitionUtils.getFields(definition)\n const template = definitionUtils.getTemplate(definition)\n\n const filtersData = await ReportFiltersUtils.getFilters({\n fields,\n req,\n filtersType: FiltersType.INTERACTIVE,\n res,\n services,\n })\n\n // Sort\n const sortColumn = req.query?.['sortColumn'] || requestData?.query?.data?.['sortColumn']\n const sortedAsc = req.query?.['sortedAsc'] || requestData?.query?.data?.['sortedAsc']\n\n // Pagination\n const selectedPage = req.query?.['selectedPage']\n const pageSize = req.query?.['pageSize']\n\n // Filters\n const filtersQuery = ReportFiltersUtils.setRequestQueryFromFilterValues(filtersData.filters)\n\n const queryParams = {\n ...(sortColumn && { sortColumn }),\n ...(sortedAsc && { sortedAsc }),\n ...filtersQuery,\n ...(pageSize && { pageSize }),\n ...(selectedPage && { selectedPage }),\n ...(columns && { columns: columns.value }),\n }\n\n return new ReportQuery({\n fields,\n template,\n queryParams,\n definitionsPath,\n })\n}\n\nconst getReportData = async (args: {\n definition: components['schemas']['SingleVariantReportDefinition']\n services: Services\n token: string\n req: Request\n res: Response\n reportQuery: ReportQuery\n}) => {\n const { services, token, req, reportQuery } = args\n const { reportId, variantId, id, tableId } = req.params\n const reportVariantId = variantId || id\n\n return services.reportingService.getAsyncReport(\n token,\n reportId,\n reportVariantId,\n tableId,\n reportQuery.toRecordWithFilterPrefix(true),\n )\n}\n\nexport const getSummariesData = async (\n summaries: components['schemas']['ReportSummary'][],\n services: Services,\n token: string,\n req: Request,\n res: Response,\n): Promise<AsyncSummary[]> => {\n const { reportId, variantId, id, tableId } = req.params\n const { definitionsPath: dataProductDefinitionsPath } = LocalsHelper.getValues(res)\n const reportVariantId = variantId || id\n\n return Promise.all(\n summaries.map(async (summary) => {\n const summaryReport = await services.reportingService.getAsyncSummaryReport(\n token,\n reportId,\n reportVariantId,\n tableId,\n summary.id,\n {\n dataProductDefinitionsPath,\n },\n )\n\n return {\n ...summary,\n data: summaryReport,\n }\n }),\n )\n}\n\nexport const getChildData = async (\n childVariants: components['schemas']['ChildVariantDefinition'][],\n services: Services,\n token: string,\n req: Request,\n res: Response,\n requestData?: RequestedReport,\n): Promise<ChildData[]> => {\n const { definitionsPath: dataProductDefinitionsPath } = LocalsHelper.getValues(res)\n const { reportId } = req.params\n const childExecutionData = requestData?.childExecutionData\n if (!childExecutionData) {\n throw new Error('getChildData: No execution data found for child variants')\n }\n return Promise.all(\n childVariants.map(async (childVariant) => {\n const { specification } = childVariant\n if (!specification) {\n throw new Error('getChildData: No specification found in child variant definition')\n }\n\n const query = new ReportQuery({\n fields: specification?.fields || [],\n template: specification.template,\n queryParams: req.query,\n definitionsPath: dataProductDefinitionsPath,\n }).toRecordWithFilterPrefix(true)\n\n const childData = childExecutionData.find((e) => e.variantId === childVariant.id)\n if (!childData || !childData.tableId) {\n throw new Error('getChildData: No matching child execution data found')\n }\n const { tableId: childTableId } = childData\n\n const childReport = await services.reportingService.getAsyncReport(\n token,\n reportId,\n childVariant.id,\n childTableId,\n query,\n )\n\n return {\n id: childVariant.id,\n data: childReport,\n }\n }),\n )\n}\n\n/**\n * Entry point function to render the report\n *\n * @param {AsyncReportUtilsParams} { req, res, services }\n * @return {*}\n */\nexport const renderReport = async ({ req, res, services }: AsyncReportUtilsParams) => {\n const { token, dprUser } = LocalsHelper.getValues(res)\n\n // Get the report data\n const { definition, requestData, reportData, childData, summariesData, reportQuery, columns } = await getData({\n req,\n res,\n services,\n token,\n userId: dprUser.id,\n })\n\n // Get the data table\n const dataTable: DataTable[] = DataTableUtils.createDataTable(\n definition,\n columns,\n reportData,\n childData,\n summariesData,\n reportQuery,\n )\n\n // Get the template data\n const templateData = await getTemplateData(\n req,\n res,\n services,\n definition,\n summariesData,\n dataTable,\n columns,\n reportQuery,\n requestData,\n )\n\n const renderData = {\n ...templateData,\n dataTable,\n }\n\n if (requestData && Object.keys(requestData).length) {\n UserReportsUtils.updateLastViewed({\n req,\n services,\n reportStateData: requestData,\n userId: dprUser.id,\n filters: templateData.filterData.filters,\n })\n }\n\n return { renderData }\n}\n\nconst getTemplateData = async (\n req: Request,\n res: Response,\n services: Services,\n definition: components['schemas']['SingleVariantReportDefinition'],\n summariesData: AsyncSummary[],\n dataTable: DataTable[],\n columns: Columns,\n reportQuery: ReportQuery,\n requestData?: RequestedReport,\n) => {\n const { nestedBaseUrl } = LocalsHelper.getValues(res)\n\n // get url data\n const url = parseUrl(req)\n if (!url) {\n throw new Error('Unable to set url data from request')\n }\n\n const urls = url ? setUrls(url, req) : undefined\n\n // get from definition\n const definitionData = extractDataFromDefinition(definition)\n const { fields, specification } = definitionData\n\n // get from requestedData\n const requestedData = requestData ? extractDataFromRequest(requestData) : undefined\n\n // Get the count\n const count = await getCount(definition, services, res, req, reportQuery)\n\n // Get the filters\n const filterData = await ReportFiltersUtils.getFilters({\n fields,\n req,\n res,\n services,\n filtersType: FiltersType.INTERACTIVE,\n })\n\n // Set the features\n const features = await setFeatures(services, res, req, columns, definitionData, requestedData, urls)\n\n // Set the extra meta data\n const meta = setMetaData(res, req)\n\n let reportSummaries\n if (summariesData.length) {\n const collatedSummaryBuilder = new CollatedSummaryBuilder(specification, summariesData)\n reportSummaries = collatedSummaryBuilder.collatePageSummaries()\n }\n\n let pagination\n let totals\n if (definitionData.template === 'list') {\n pagination = PaginationUtils.getPaginationData(url, count, req)\n const { pageSize, currentPage, totalRows } = pagination\n totals = TotalsUtils.getTotals(pageSize, currentPage, totalRows, dataTable[0].rowCount)\n }\n\n return {\n ...(showColumns(specification) && { columns }),\n filterData,\n count,\n nestedBaseUrl,\n ...meta,\n ...features,\n ...definitionData,\n ...requestedData,\n ...urls,\n ...(pagination && { pagination }),\n ...(totals && { totals }),\n ...(reportSummaries && { reportSummaries }),\n }\n}\n\nconst showColumns = (specification: components['schemas']['Specification']) => {\n const { template } = specification\n\n return !['row-section', 'row-section-child', 'summary', 'summary-section'].includes(template)\n}\n\nconst setMetaData = (res: Response, req: Request) => {\n const { csrfToken } = LocalsHelper.getValues(res)\n const { tableId, reportId, id } = req.params\n\n return {\n csrfToken,\n loadType: LoadType.ASYNC,\n type: ReportType.REPORT,\n tableId,\n reportId,\n id,\n }\n}\n\nconst setUrls = (url: Url, req: Request): ReportUrls => {\n const { search } = url\n const encodedSearch = search ? encodeURIComponent(search) : undefined\n const pathname = search ? req.originalUrl.split(search)[0] : req.originalUrl\n const reportUrl = pathname.replace('/download-disabled', '').replace('/download-disabled?', '')\n\n return {\n reportUrl,\n reportSearch: search || undefined,\n encodedSearch,\n pathname,\n }\n}\n\nconst setFeatures = async (\n services: Services,\n res: Response,\n req: Request,\n columns: Columns,\n definitionData: ExtractedDefinitionData,\n requestData?: ExtractedRequestData,\n urls?: ReportUrls,\n) => {\n const { csrfToken, dprUser, bookmarkingEnabled, downloadingEnabled } = LocalsHelper.getValues(res)\n const { reportId, id } = req.params\n const { downloadPermissionService, bookmarkService } = services\n\n let canDownload = false\n if (downloadingEnabled) {\n canDownload = await downloadPermissionService.downloadEnabledForReport(dprUser.id, reportId, id)\n }\n\n let bookmarked\n if (bookmarkingEnabled) {\n bookmarked = await bookmarkService.isBookmarked(id, reportId, dprUser.id)\n }\n\n const actions = setActions(csrfToken, columns, canDownload, res, req, definitionData, requestData, urls)\n\n return {\n actions,\n canDownload,\n bookmarked,\n }\n}\n\nconst getCount = async (\n definition: components['schemas']['SingleVariantReportDefinition'],\n services: Services,\n res: Response,\n req: Request,\n reportQuery: ReportQuery,\n) => {\n const { token } = LocalsHelper.getValues(res)\n const { tableId, reportId, id } = req.params\n\n return !definition.variant.interactive\n ? services.reportingService.getAsyncCount(token, tableId)\n : services.reportingService.getAsyncInteractiveCount(token, tableId, reportId, id, reportQuery)\n}\n\nconst extractDataFromDefinition = (\n definition: components['schemas']['SingleVariantReportDefinition'],\n): ExtractedDefinitionData => {\n const { variant, name: reportName, description: reportDescription } = definition\n const { classification, printable, specification, name, description } = variant\n if (!specification) {\n throw new Error('No specification found in variant definition')\n }\n const { template, fields } = specification\n\n return {\n reportName,\n name,\n description: description || reportDescription,\n classification,\n printable: Boolean(printable),\n specification,\n template,\n fields,\n }\n}\n\nconst extractDataFromRequest = (requestData: RequestedReport): ExtractedRequestData => {\n const { query, url, timestamp } = requestData\n\n return {\n executionId: requestData.executionId,\n requestedTimestamp: timestamp.requested ? new Date(timestamp.requested).toLocaleString() : undefined,\n querySummary: query?.summary || [],\n queryData: query?.data,\n requestUrl: url?.request,\n defaultQuery: url?.report?.default,\n dataProductDefinitionsPath: requestData.dataProductDefinitionsPath,\n }\n}\n\nconst setActions = (\n csrfToken: string,\n columns: Columns,\n canDownload: boolean,\n res: Response,\n req: Request,\n definitionData: ExtractedDefinitionData,\n requestData?: ExtractedRequestData,\n urls?: ReportUrls,\n) => {\n const { reportName, name, printable } = definitionData\n const { tableId, id, reportId } = req.params\n const { nestedBaseUrl, definitionsPath, downloadingEnabled } = LocalsHelper.getValues(res)\n\n // DownloadActionParams\n let downloadConfig: DownloadActionParams | undefined\n if (urls && downloadingEnabled) {\n downloadConfig = {\n enabled: downloadingEnabled,\n name,\n reportName,\n csrfToken,\n reportId,\n id,\n tableId,\n columns: columns.value,\n definitionPath: definitionsPath,\n loadType: LoadType.ASYNC,\n nestedBaseUrl,\n canDownload,\n currentUrl: urls.pathname,\n currentQueryParams: urls.reportSearch,\n ...(requestData?.queryData && {\n sortColumn: <string>requestData.queryData['sortColumn'],\n sortedAsc: <string>requestData.queryData['sortedAsc'],\n }),\n }\n }\n\n let shareConfig\n let copyConfig\n if (requestData?.requestUrl?.fullUrl) {\n shareConfig = {\n reportName,\n name,\n url: requestData.requestUrl.fullUrl,\n }\n copyConfig = {\n url: requestData.requestUrl.fullUrl,\n }\n }\n\n let refreshConfig\n if (requestData?.executionId && requestData?.requestUrl?.fullUrl) {\n refreshConfig = {\n url: requestData.requestUrl.fullUrl,\n executionId: requestData.executionId,\n }\n }\n\n return ReportActionsUtils.getActions({\n ...(downloadConfig && { download: downloadConfig }),\n ...(shareConfig && { share: shareConfig }),\n ...(refreshConfig && { refresh: refreshConfig }),\n ...(copyConfig && { copy: copyConfig }),\n print: { enabled: printable },\n })\n}\n\nexport default {\n renderReport,\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["utils_exports", "__export", "utils_default", "getChildData", "getData", "getSummariesData", "renderReport", "__toCommonJS", "import_parseurl", "import_UserReports", "import_ReportQuery", "import_filtersTypeEnum", "import_definitionUtils", "import_utils", "import_localsHelper", "import_CollatedSummaryBuilder", "res", "req", "services", "token", "userId", "definitionPath", "LocalsHelper", "reportId", "variantId", "id", "tableId", "reportVariantId", "requestData", "queryData", "definition", "variant", "specification", "columns", "ColumnUtils", "reportQuery", "initReportQuery", "reportData", "getReportData", "summaries", "summariesData", "childVariants", "childData", "definitionsPath", "fields", "definitionUtils", "template", "filtersData", "ReportFiltersUtils", "sortColumn", "sortedAsc", "selectedPage", "pageSize", "filtersQuery", "queryParams", "ReportQuery", "args", "dataProductDefinitionsPath", "summary", "summaryReport", "childExecutionData", "childVariant", "query", "e", "childTableId", "childReport", "dprUser", "dataTable", "DataTableUtils", "templateData", "getTemplateData", "renderData", "UserReportsUtils", "nestedBaseUrl", "url", "parseUrl", "urls", "setUrls", "definitionData", "extractDataFromDefinition", "requestedData", "extractDataFromRequest", "count", "getCount", "filterData", "features", "setFeatures", "meta", "setMetaData", "reportSummaries", "CollatedSummaryBuilder", "pagination", "totals", "PaginationUtils", "currentPage", "totalRows", "TotalsUtils", "showColumns", "csrfToken", "search", "encodedSearch", "pathname", "bookmarkingEnabled", "downloadingEnabled", "downloadPermissionService", "bookmarkService", "canDownload", "bookmarked", "setActions", "reportName", "reportDescription", "classification", "printable", "name", "description", "timestamp", "downloadConfig", "shareConfig", "copyConfig", "refreshConfig", "ReportActionsUtils"]
|
|
7
7
|
}
|
|
@@ -122,7 +122,7 @@ const initReportQuery = async (
|
|
|
122
122
|
...(sortedAsc && { sortedAsc }),
|
|
123
123
|
...filtersQuery,
|
|
124
124
|
...(pageSize && { pageSize }),
|
|
125
|
-
...(selectedPage && {
|
|
125
|
+
...(selectedPage && { selectedPage }),
|
|
126
126
|
...(columns && { columns: columns.value }),
|
|
127
127
|
}
|
|
128
128
|
|
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": {
|