@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.26.0 → 4.26.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -150,6 +150,8 @@ class DprQueryParamClass extends DprClientClass {
150
150
  this.queryParams.delete('preventDefault')
151
151
  }
152
152
  })
153
+
154
+ this.queryParams.set('selectedPage', 1)
153
155
  window.history.replaceState(null, null, `?${this.queryParams.toString()}`)
154
156
  }
155
157
 
package/dpr/all.scss CHANGED
@@ -861,7 +861,6 @@ ul.dpr-card-group__item__filters-list {
861
861
 
862
862
  .dpr-table-container {
863
863
  position: relative;
864
- // overflow: scroll;
865
864
 
866
865
  td {
867
866
  padding: govuk-spacing(2);
@@ -1058,7 +1057,12 @@ ul.dpr-card-group__item__filters-list {
1058
1057
  }
1059
1058
 
1060
1059
  .dpr-table-wrapper {
1061
- overflow: scroll;
1060
+ overflow-x: scroll;
1061
+ transform: rotateX(180deg);
1062
+
1063
+ .dpr-table-content {
1064
+ transform: rotateX(180deg);
1065
+ }
1062
1066
  }
1063
1067
 
1064
1068
  .table-row-count {
@@ -1855,7 +1859,7 @@ ul.dpr-card-group__item__filters-list {
1855
1859
  background-color: govuk-colour("dark-blue")
1856
1860
  }
1857
1861
 
1858
- @for $i from 1 through 50 {
1862
+ @for $i from 1 through 200 {
1859
1863
  .dpr-chart-height-#{$i} {
1860
1864
  height: $i * 80px !important;
1861
1865
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/dpr/components/_async/async-filters-form/types.d.ts"],
4
- "sourcesContent": ["import { FilterValue } from '../../_filters/types'\n\nexport interface requestAsyncReportParams {\n apiTimeout: number\n apiUrl: string\n token: string\n reportId: string\n reportVariantId: string\n query: Query\n}\n\n// todo update to correct type\ninterface Query {\n sortColumn: string\n sortedAsc: boolean\n filters: filter[]\n dataProductDefinitionsPath: string\n}\n\ninterface filter {\n [filterId: string]: string\n}\n\nexport interface SortByDefaults {\n options: { text: string; value: string }[]\n value: string\n}\n\nexport interface RenderFiltersReturnValue {\n filters: FilterValue[]\n sortBy?: FilterValue[]\n}\n\nexport interface SetQueryFromFiltersResult {\n query: Record<string, string>\n filterData: Record<string, string>\n querySummary: Array<Record<string, string>>\n sortData: Record<string, string>\n}\n"],
4
+ "sourcesContent": ["import { FilterValue } from '../../_filters/types'\n\nexport interface requestAsyncReportParams {\n apiTimeout: number\n apiUrl: string\n token: string\n reportId: string\n reportVariantId: string\n query: Query\n}\n\n// todo update to correct type\ninterface Query {\n sortColumn: string\n sortedAsc: boolean\n filters: filter[]\n dataProductDefinitionsPath: string\n}\n\ninterface filter {\n [filterId: string]: string\n}\n\nexport interface SortByDefaults {\n options: { text: string; value: string }[]\n value: string\n}\n\nexport interface RenderFiltersReturnValue {\n filters: FilterValue[]\n sortBy?: FilterValue[]\n}\n\nexport interface SetQueryFromFiltersResult {\n query: Record<string, string>\n filterData: Record<string, string>\n querySummary: Array<Record<string, string>>\n sortData?: Record<string, string>\n}\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["types_d_exports", "__toCommonJS"]
7
7
  }
@@ -35,5 +35,5 @@ export interface SetQueryFromFiltersResult {
35
35
  query: Record<string, string>
36
36
  filterData: Record<string, string>
37
37
  querySummary: Array<Record<string, string>>
38
- sortData: Record<string, string>
38
+ sortData?: Record<string, string>
39
39
  }
@@ -22,7 +22,7 @@
22
22
  background-color: govuk-colour("dark-blue")
23
23
  }
24
24
 
25
- @for $i from 1 through 50 {
25
+ @for $i from 1 through 200 {
26
26
  .dpr-chart-height-#{$i} {
27
27
  height: $i * 80px !important;
28
28
  }
@@ -43,6 +43,7 @@ class SelectedFilters extends DprFiltersFormClass {
43
43
  }
44
44
  })
45
45
 
46
+ this.updateQueryParam('selectedPage', 1)
46
47
  this.updateQueryParam('preventDefault', true)
47
48
  window.location.reload()
48
49
  })
@@ -2,7 +2,6 @@
2
2
 
3
3
  .dpr-table-container {
4
4
  position: relative;
5
- // overflow: scroll;
6
5
 
7
6
  td {
8
7
  padding: govuk-spacing(2);
@@ -199,7 +198,12 @@
199
198
  }
200
199
 
201
200
  .dpr-table-wrapper {
202
- overflow: scroll;
201
+ overflow-x: scroll;
202
+ transform: rotateX(180deg);
203
+
204
+ .dpr-table-content {
205
+ transform: rotateX(180deg);
206
+ }
203
207
  }
204
208
 
205
209
  .table-row-count {
@@ -8,15 +8,17 @@
8
8
  <div id="table-container" class='dpr-table-container' data-dpr-module="data-table" aria-labelledby="dpr-report-name">
9
9
  <div class="dpr-overflow-gradient" id="dpr-overflow-gradient"></div>
10
10
  <div class="dpr-table-wrapper" id="dpr-table-wrapper">
11
- {{ govukTable({
12
- head: head,
13
- rows: rows,
14
- attributes: {
15
- 'id': 'dpr-data-table',
16
- 'data-classification': classification,
17
- 'data-col-length': colCount
18
- }
19
- }) }}
11
+ <div class="dpr-table-content">
12
+ {{ govukTable({
13
+ head: head,
14
+ rows: rows,
15
+ attributes: {
16
+ 'id': 'dpr-data-table',
17
+ 'data-classification': classification,
18
+ 'data-col-length': colCount
19
+ }
20
+ }) }}
21
+ </div>
20
22
  </div>
21
23
  </div>
22
24
  {% endmacro %}
@@ -1,2 +1,2 @@
1
- "use strict";var $=Object.create;var g=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var G=(e,t)=>{for(var r in t)g(e,r,{get:t[r],enumerable:!0})},T=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of J(t))!z.call(e,i)&&i!==r&&g(e,i,{get:()=>t[i],enumerable:!(s=j(t,i))||s.enumerable});return e};var h=(e,t,r)=>(r=e!=null?$(L(e)):{},T(t||!e||!e.__esModule?g(r,"default",{value:e,enumerable:!0}):r,e)),K=e=>T(g({},"__esModule",{value:!0}),e);var re={};G(re,{cancelRequest:()=>N,default:()=>te,getDefintionByType:()=>Q,getFiltersFromReqBody:()=>H,renderRequest:()=>k,request:()=>B,updateStore:()=>O});module.exports=K(re);var x=h(require("../../../../components/_async/async-filters-form/utils")),D=h(require("../../../../utils/localsHelper")),U=h(require("../../../../components/_filters/utils")),q=require("../../../../utils/reportStoreHelper"),E=h(require("../../../../utils/UserStoreItemBuilder")),f=require("../../../../types/UserReports"),w=h(require("../../../../utils/Personalisation/personalisationUtils")),C=require("../../../../components/_filters/filtersTypeEnum");const O=async({req:e,res:t,services:r,queryData:s,executionData:i,childExecutionData:o})=>{const{search:l,id:d,type:a}=e.body,{dprUser:n,definitionsPath:c,dpdPathFromQuery:u}=D.default.getValues(t);await(0,q.removeDuplicates)({storeService:r.requestedReportService,userId:n.id,id:d,search:l}),await(0,q.removeDuplicates)({storeService:r.recentlyViewedService,userId:n.id,id:d,search:l});const p=e.body,R={type:p.type,reportId:p.reportId,reportName:p.reportName,description:p.description,id:p.id,name:p.name};let m;switch(a){case f.ReportType.REPORT:m=new E.default(R,p).addExecutionData(i).addChildExecutionData(o).addFilters(s?.filterData).addSortData(s?.sortData).addDefinitionsPath(c,u).addRequestUrls(e).addQuery(s).addStatus(f.RequestStatus.SUBMITTED).addTimestamp().build();break;case f.ReportType.DASHBOARD:{m=new E.default(R,p).addExecutionData(i).addChildExecutionData(o).addFilters(s?.filterData).addDefinitionsPath(c,u).addRequestUrls(e).addQuery(s).addStatus(f.RequestStatus.SUBMITTED).addTimestamp().addMetrics(JSON.parse(e.body.sections)).build();break}default:break}m&&await r.requestedReportService.addReport(n.id,m)};async function W(e,t,r,s,i,o){return Promise.all(e.map(l=>t.requestAsyncReport(r,s,l.id,{...i&&i.query,...o&&{dataProductDefinitionsPath:o}}).then(d=>{const{executionId:a,tableId:n}=d;if(!a||!n)throw new Error("requestChildReports: No execution of tableId in response");return{executionId:a,tableId:n,variantId:l.id}})))}const X=async({req:e,res:t,token:r,dashboardService:s,reportingService:i})=>{const{definitionsPath:o,dpdPathFromQuery:l}=D.default.getValues(t),{reportId:d,id:a,type:n}=e.body;let c,u,p,R,m,y=[];n===f.ReportType.REPORT&&(m=await i.getDefinition(r,d,a,o),c=m?.variant.specification?.fields||[],u=x.default.setQueryFromFilters(e,c),{executionId:p,tableId:R}=await i.requestAsyncReport(r,d,a,{...u.query,dataProductDefinitionsPath:o}),y=m.variant.childVariants??[]),n===f.ReportType.DASHBOARD&&(m=await s.getDefinition(r,d,a,o),c=m?.filterFields||[],u=x.default.setQueryFromFilters(e,c),{executionId:p,tableId:R}=await s.requestAsyncDashboard(r,d,a,{...u.query,dataProductDefinitionsPath:o}));const S=await W(y,i,r,d,u,o);return{executionData:{executionId:p,tableId:R,...l&&{dataProductDefinitionsPath:o}},childExecutionData:S,queryData:u}},Y=async({token:e,reportId:t,definitionPath:r,services:s,definition:i})=>{const d=(await s.reportingService.getDefinitions(e,r)).find(p=>p.id===t)?.name,{name:a,description:n,sections:c,filterFields:u}=i;return{reportName:d,name:a,description:n,sections:c||[],fields:u||[]}},Z=async e=>({definition:e,reportName:e.name,name:e.variant.name,description:e.variant.description||e.description,template:e.variant.specification,fields:e?.variant?.specification?.fields||[],interactive:e?.variant?.interactive}),Q=async(e,t,r,s)=>{const{token:i,definitionsPath:o}=D.default.getValues(t),{reportId:l,id:d,variantId:a,type:n}=e.params;return await(n===f.ReportType.REPORT?s.reportingService:s.dashboardService).getDefinition(i,l,a||d,o)},ee=async(e,t,r,s,i,o)=>{const{reportId:l,id:d}=e.params;let a=await x.default.renderFilters(r,s);a.filters=w.default.setUserContextDefaults(t,a.filters);let n;return t.locals.saveDefaultsEnabled&&(n=await i.defaultFilterValuesService.get(o,l,d,C.FiltersType.REQUEST)),n&&(a=w.default.setFilterValuesFromSavedDefaults(a.filters,a.sortBy||[],n)),a.filters=U.default.setFilterValuesFromRequest(a.filters,e),{filtersData:a,defaultFilterValues:n}},B=async({req:e,res:t,services:r})=>{const{token:s}=D.default.getValues(t),i={req:e,res:t,token:s},{executionData:o,queryData:l,childExecutionData:d}=await X({...i,dashboardService:r.dashboardService,reportingService:r.reportingService});if(o.executionId&&o.tableId)await O({req:e,res:t,services:r,queryData:l,executionData:o,childExecutionData:d});else throw new Error("No execution data returned");return o},N=async({req:e,res:t,services:r})=>{const{token:s,dprUser:i,definitionsPath:o}=D.default.getValues(t),{reportId:l,id:d,executionId:a,type:n}=e.params;let c=r.reportingService;n===f.ReportType.REPORT&&(c=r.reportingService),n===f.ReportType.DASHBOARD&&(c=r.dashboardService);const u=await c.cancelAsyncRequest(s,l,d,a,o);u&&u.cancellationSucceeded&&await r.requestedReportService.updateStatus(a,i.id,f.RequestStatus.ABORTED)},k=async({req:e,res:t,services:r,next:s})=>{try{const{token:i,csrfToken:o,definitionsPath:l,dpdPathFromQuery:d,dprUser:a}=D.default.getValues(t),{reportId:n,type:c,id:u}=e.params,{definition:p}=t.locals,R=e.query.defaultsSaved,m={token:i,reportId:n,definitionPath:l,services:r};let y,S,v,M,F=[],P,A,I,b=[];if(c===f.ReportType.REPORT&&({name:y,reportName:S,description:v,fields:F,interactive:A}=await Z(p)),c===f.ReportType.DASHBOARD&&({name:y,reportName:S,description:v,sections:P,fields:F}=await Y({...m,definition:p})),F){const V=await ee(e,t,F,A||!1,r,a.id);b=V.defaultFilterValues||b,I=V.filtersData}const _={reportName:S,name:y,description:v,reportId:n,id:u,...d&&{definitionPath:l},csrfToken:o,template:M,sections:P,hasDefaults:b?.length>0,defaultsSaved:R,type:c,saveDefaultsEnabled:t.locals.saveDefaultsEnabled};return{title:`Request ${c}`,filtersDescription:`Customise your ${c} using the filters below and submit your request.`,filtersData:I,reportData:_}}catch(i){return s(i),!1}},H=e=>Object.keys(e.body).filter(t=>t.includes("filters.")).filter(t=>!!e.body[t]).map(t=>({name:t,value:e.body[t]}));var te={request:B,cancelRequest:N,renderRequest:k,getFiltersFromReqBody:H,getDefintionByType:Q};0&&(module.exports={cancelRequest,getDefintionByType,getFiltersFromReqBody,renderRequest,request,updateStore});
1
+ "use strict";var $=Object.create;var g=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var G=(e,t)=>{for(var r in t)g(e,r,{get:t[r],enumerable:!0})},T=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of J(t))!z.call(e,i)&&i!==r&&g(e,i,{get:()=>t[i],enumerable:!(a=j(t,i))||a.enumerable});return e};var h=(e,t,r)=>(r=e!=null?$(L(e)):{},T(t||!e||!e.__esModule?g(r,"default",{value:e,enumerable:!0}):r,e)),K=e=>T(g({},"__esModule",{value:!0}),e);var re={};G(re,{cancelRequest:()=>N,default:()=>te,getDefintionByType:()=>Q,getFiltersFromReqBody:()=>H,renderRequest:()=>k,request:()=>B,updateStore:()=>O});module.exports=K(re);var x=h(require("../../../../components/_async/async-filters-form/utils")),D=h(require("../../../../utils/localsHelper")),U=h(require("../../../../components/_filters/utils")),q=require("../../../../utils/reportStoreHelper"),E=h(require("../../../../utils/UserStoreItemBuilder")),f=require("../../../../types/UserReports"),w=h(require("../../../../utils/Personalisation/personalisationUtils")),C=require("../../../../components/_filters/filtersTypeEnum");const O=async({req:e,res:t,services:r,queryData:a,executionData:i,childExecutionData:s})=>{const{search:l,id:d,type:o}=e.body,{dprUser:n,definitionsPath:c,dpdPathFromQuery:u}=D.default.getValues(t);await(0,q.removeDuplicates)({storeService:r.requestedReportService,userId:n.id,id:d,search:l}),await(0,q.removeDuplicates)({storeService:r.recentlyViewedService,userId:n.id,id:d,search:l});const p=e.body,R={type:p.type,reportId:p.reportId,reportName:p.reportName,description:p.description,id:p.id,name:p.name};let m;switch(o){case f.ReportType.REPORT:m=new E.default(R,p).addExecutionData(i).addChildExecutionData(s).addFilters(a?.filterData).addSortData(a?.sortData).addDefinitionsPath(c,u).addRequestUrls(e).addQuery(a).addStatus(f.RequestStatus.SUBMITTED).addTimestamp().build();break;case f.ReportType.DASHBOARD:{m=new E.default(R,p).addExecutionData(i).addChildExecutionData(s).addFilters(a?.filterData).addDefinitionsPath(c,u).addRequestUrls(e).addQuery(a).addStatus(f.RequestStatus.SUBMITTED).addTimestamp().addMetrics(JSON.parse(e.body.sections)).build();break}default:break}m&&await r.requestedReportService.addReport(n.id,m)};async function W(e,t,r,a,i,s){let l;return i&&(l=i.query,delete l.sortColumn,delete l.sortedAsc),Promise.all(e.map(d=>t.requestAsyncReport(r,a,d.id,{...l&&l,...s&&{dataProductDefinitionsPath:s}}).then(o=>{const{executionId:n,tableId:c}=o;if(!n||!c)throw new Error("requestChildReports: No execution of tableId in response");return{executionId:n,tableId:c,variantId:d.id}})))}const X=async({req:e,res:t,token:r,dashboardService:a,reportingService:i})=>{const{definitionsPath:s,dpdPathFromQuery:l}=D.default.getValues(t),{reportId:d,id:o,type:n}=e.body;let c,u,p,R,m,y=[];n===f.ReportType.REPORT&&(m=await i.getDefinition(r,d,o,s),c=m?.variant.specification?.fields||[],u=x.default.setQueryFromFilters(e,c),{executionId:p,tableId:R}=await i.requestAsyncReport(r,d,o,{...u.query,dataProductDefinitionsPath:s}),y=m.variant.childVariants??[]),n===f.ReportType.DASHBOARD&&(m=await a.getDefinition(r,d,o,s),c=m?.filterFields||[],u=x.default.setQueryFromFilters(e,c),{executionId:p,tableId:R}=await a.requestAsyncDashboard(r,d,o,{...u.query,dataProductDefinitionsPath:s}));const S=await W(y,i,r,d,u,s);return{executionData:{executionId:p,tableId:R,...l&&{dataProductDefinitionsPath:s}},childExecutionData:S,queryData:u}},Y=async({token:e,reportId:t,definitionPath:r,services:a,definition:i})=>{const d=(await a.reportingService.getDefinitions(e,r)).find(p=>p.id===t)?.name,{name:o,description:n,sections:c,filterFields:u}=i;return{reportName:d,name:o,description:n,sections:c||[],fields:u||[]}},Z=async e=>({definition:e,reportName:e.name,name:e.variant.name,description:e.variant.description||e.description,template:e.variant.specification,fields:e?.variant?.specification?.fields||[],interactive:e?.variant?.interactive}),Q=async(e,t,r,a)=>{const{token:i,definitionsPath:s}=D.default.getValues(t),{reportId:l,id:d,variantId:o,type:n}=e.params;return await(n===f.ReportType.REPORT?a.reportingService:a.dashboardService).getDefinition(i,l,o||d,s)},ee=async(e,t,r,a,i,s)=>{const{reportId:l,id:d}=e.params;let o=await x.default.renderFilters(r,a);o.filters=w.default.setUserContextDefaults(t,o.filters);let n;return t.locals.saveDefaultsEnabled&&(n=await i.defaultFilterValuesService.get(s,l,d,C.FiltersType.REQUEST)),n&&(o=w.default.setFilterValuesFromSavedDefaults(o.filters,o.sortBy||[],n)),o.filters=U.default.setFilterValuesFromRequest(o.filters,e),{filtersData:o,defaultFilterValues:n}},B=async({req:e,res:t,services:r})=>{const{token:a}=D.default.getValues(t),i={req:e,res:t,token:a},{executionData:s,queryData:l,childExecutionData:d}=await X({...i,dashboardService:r.dashboardService,reportingService:r.reportingService});if(s.executionId&&s.tableId)await O({req:e,res:t,services:r,queryData:l,executionData:s,childExecutionData:d});else throw new Error("No execution data returned");return s},N=async({req:e,res:t,services:r})=>{const{token:a,dprUser:i,definitionsPath:s}=D.default.getValues(t),{reportId:l,id:d,executionId:o,type:n}=e.params;let c=r.reportingService;n===f.ReportType.REPORT&&(c=r.reportingService),n===f.ReportType.DASHBOARD&&(c=r.dashboardService);const u=await c.cancelAsyncRequest(a,l,d,o,s);u&&u.cancellationSucceeded&&await r.requestedReportService.updateStatus(o,i.id,f.RequestStatus.ABORTED)},k=async({req:e,res:t,services:r,next:a})=>{try{const{token:i,csrfToken:s,definitionsPath:l,dpdPathFromQuery:d,dprUser:o}=D.default.getValues(t),{reportId:n,type:c,id:u}=e.params,{definition:p}=t.locals,R=e.query.defaultsSaved,m={token:i,reportId:n,definitionPath:l,services:r};let y,S,v,M,F=[],P,A,I,b=[];if(c===f.ReportType.REPORT&&({name:y,reportName:S,description:v,fields:F,interactive:A}=await Z(p)),c===f.ReportType.DASHBOARD&&({name:y,reportName:S,description:v,sections:P,fields:F}=await Y({...m,definition:p})),F){const V=await ee(e,t,F,A||!1,r,o.id);b=V.defaultFilterValues||b,I=V.filtersData}const _={reportName:S,name:y,description:v,reportId:n,id:u,...d&&{definitionPath:l},csrfToken:s,template:M,sections:P,hasDefaults:b?.length>0,defaultsSaved:R,type:c,saveDefaultsEnabled:t.locals.saveDefaultsEnabled};return{title:`Request ${c}`,filtersDescription:`Customise your ${c} using the filters below and submit your request.`,filtersData:I,reportData:_}}catch(i){return a(i),!1}},H=e=>Object.keys(e.body).filter(t=>t.includes("filters.")).filter(t=>!!e.body[t]).map(t=>({name:t,value:e.body[t]}));var te={request:B,cancelRequest:N,renderRequest:k,getFiltersFromReqBody:H,getDefintionByType:Q};0&&(module.exports={cancelRequest,getDefintionByType,getFiltersFromReqBody,renderRequest,request,updateStore});
2
2
  //# sourceMappingURL=utils.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/dpr/routes/journeys/request-report/filters/utils.ts"],
4
- "sourcesContent": ["/* eslint-disable no-param-reassign */\nimport { Request, Response, NextFunction } from 'express'\n\n// Utils\nimport { defaultFilterValue } from '../../../../utils/Personalisation/types'\nimport FiltersFormUtils from '../../../../components/_async/async-filters-form/utils'\nimport LocalsHelper from '../../../../utils/localsHelper'\nimport FiltersUtils from '../../../../components/_filters/utils'\nimport { removeDuplicates } from '../../../../utils/reportStoreHelper'\nimport UserStoreItemBuilder from '../../../../utils/UserStoreItemBuilder'\n\n// Types\nimport type ReportingService from '../../../../services/reportingService'\nimport { ReportType, RequestFormData, RequestStatus } from '../../../../types/UserReports'\nimport type { ExecutionData, ChildReportExecutionData } from '../../../../types/ExecutionData'\nimport type { AsyncReportUtilsParams, RequestDataResult, RequestReportData } from '../../../../types/AsyncReportUtils'\nimport type {\n RenderFiltersReturnValue,\n SetQueryFromFiltersResult,\n} from '../../../../components/_async/async-filters-form/types'\nimport type { components } from '../../../../types/api'\nimport type { Services } from '../../../../types/Services'\nimport type DashboardService from '../../../../services/dashboardService'\nimport PersonalistionUtils from '../../../../utils/Personalisation/personalisationUtils'\nimport { FiltersType } from '../../../../components/_filters/filtersTypeEnum'\n\n/**\n * Updates the store with the request details\n *\n * @param {Request} req\n * @param {Response} res\n * @param {Services} services\n * @param {SetQueryFromFiltersResult} querySummaryData\n * @param {string} executionData\n * @return {*} {Promise<string>}\n */\nexport const updateStore = async ({\n req,\n res,\n services,\n queryData,\n executionData,\n childExecutionData,\n}: {\n req: Request\n res: Response\n services: Services\n queryData?: SetQueryFromFiltersResult | undefined\n executionData: ExecutionData\n childExecutionData: Array<ChildReportExecutionData>\n}): Promise<void> => {\n const { search, id, type } = req.body\n const { dprUser, definitionsPath, dpdPathFromQuery } = LocalsHelper.getValues(res)\n\n await removeDuplicates({ storeService: services.requestedReportService, userId: dprUser.id, id, search })\n await removeDuplicates({ storeService: services.recentlyViewedService, userId: dprUser.id, id, search })\n\n const requestFormData: RequestFormData = req.body\n const reportData = {\n type: requestFormData.type as ReportType,\n reportId: requestFormData.reportId,\n reportName: requestFormData.reportName,\n description: requestFormData.description,\n id: requestFormData.id,\n name: requestFormData.name,\n }\n\n let requestedReportData\n switch (type) {\n case ReportType.REPORT:\n requestedReportData = new UserStoreItemBuilder(reportData, requestFormData)\n .addExecutionData(executionData)\n .addChildExecutionData(childExecutionData)\n .addFilters(queryData?.filterData)\n .addSortData(queryData?.sortData)\n .addDefinitionsPath(definitionsPath, dpdPathFromQuery)\n .addRequestUrls(req)\n .addQuery(queryData)\n .addStatus(RequestStatus.SUBMITTED)\n .addTimestamp()\n .build()\n break\n case ReportType.DASHBOARD: {\n requestedReportData = new UserStoreItemBuilder(reportData, requestFormData)\n .addExecutionData(executionData)\n .addChildExecutionData(childExecutionData)\n .addFilters(queryData?.filterData)\n .addDefinitionsPath(definitionsPath, dpdPathFromQuery)\n .addRequestUrls(req)\n .addQuery(queryData)\n .addStatus(RequestStatus.SUBMITTED)\n .addTimestamp()\n .addMetrics(JSON.parse(req.body.sections))\n .build()\n break\n }\n default:\n break\n }\n\n if (requestedReportData) await services.requestedReportService.addReport(dprUser.id, requestedReportData)\n}\n\nasync function requestChildReports(\n childVariants: Array<components['schemas']['ChildVariantDefinition']>,\n reportingService: ReportingService,\n token: string,\n reportId: string,\n queryData?: SetQueryFromFiltersResult,\n dataProductDefinitionsPath?: string,\n): Promise<Array<ChildReportExecutionData>> {\n return Promise.all(\n childVariants.map((childVariant) =>\n reportingService\n .requestAsyncReport(token, reportId, childVariant.id, {\n ...(queryData && queryData.query),\n ...(dataProductDefinitionsPath && { dataProductDefinitionsPath }),\n })\n .then((response) => {\n const { executionId, tableId } = response\n if (!executionId || !tableId) {\n throw new Error('requestChildReports: No execution of tableId in response')\n }\n return { executionId, tableId, variantId: childVariant.id }\n }),\n ),\n )\n}\n\nconst requestProduct = async ({\n req,\n res,\n token,\n dashboardService,\n reportingService,\n}: {\n req: Request\n res: Response\n token: string\n dashboardService: DashboardService\n reportingService: ReportingService\n}): Promise<{\n executionData: ExecutionData\n childExecutionData: Array<ChildReportExecutionData>\n queryData?: SetQueryFromFiltersResult | undefined\n}> => {\n const { definitionsPath: dataProductDefinitionsPath, dpdPathFromQuery } = LocalsHelper.getValues(res)\n const { reportId, id, type } = req.body\n\n let fields: components['schemas']['FieldDefinition'][]\n let queryData\n let executionId\n let tableId\n let definition\n let childVariants: components['schemas']['ChildVariantDefinition'][] = []\n\n if (type === ReportType.REPORT) {\n definition = await reportingService.getDefinition(token, reportId, id, dataProductDefinitionsPath)\n\n fields = definition?.variant.specification?.fields || []\n queryData = FiltersFormUtils.setQueryFromFilters(req, fields)\n ;({ executionId, tableId } = await reportingService.requestAsyncReport(token, reportId, id, {\n ...queryData.query,\n dataProductDefinitionsPath,\n }))\n childVariants = definition.variant.childVariants ?? []\n }\n\n if (type === ReportType.DASHBOARD) {\n definition = await dashboardService.getDefinition(token, reportId, id, dataProductDefinitionsPath)\n\n fields = definition?.filterFields || []\n queryData = FiltersFormUtils.setQueryFromFilters(req, fields)\n ;({ executionId, tableId } = await dashboardService.requestAsyncDashboard(token, reportId, id, {\n ...queryData.query,\n dataProductDefinitionsPath,\n }))\n }\n\n const childExecutionData = await requestChildReports(\n childVariants,\n reportingService,\n token,\n reportId,\n queryData,\n dataProductDefinitionsPath,\n )\n\n const executionData = {\n executionId,\n tableId,\n ...(dpdPathFromQuery && { dataProductDefinitionsPath }),\n }\n\n return {\n executionData,\n childExecutionData,\n queryData,\n }\n}\n\nconst renderDashboardRequestData = async ({\n token,\n reportId,\n definitionPath,\n services,\n definition,\n}: {\n token: string\n reportId: string\n definitionPath: string\n services: Services\n definition: components['schemas']['DashboardDefinition']\n}) => {\n const productDefinitions = await services.reportingService.getDefinitions(token, definitionPath)\n const productDefinition = productDefinitions.find(\n (def: components['schemas']['ReportDefinitionSummary']) => def.id === reportId,\n )\n const reportName = productDefinition?.name\n const { name, description, sections, filterFields: fields } = definition\n\n return {\n reportName,\n name,\n description,\n sections: sections || [],\n fields: fields || [],\n }\n}\n\nconst renderReportRequestData = async (definition: components['schemas']['SingleVariantReportDefinition']) => {\n return {\n definition,\n reportName: definition.name,\n name: definition.variant.name,\n description: definition.variant.description || definition.description,\n template: definition.variant.specification,\n fields: definition?.variant?.specification?.fields || [],\n interactive: definition?.variant?.interactive,\n }\n}\n\nexport const getDefintionByType = async (req: Request, res: Response, _next: NextFunction, services: Services) => {\n const { token, definitionsPath } = LocalsHelper.getValues(res)\n const { reportId, id, variantId, type } = req.params\n\n const service = type === ReportType.REPORT ? services.reportingService : services.dashboardService\n const definition = await service.getDefinition(token, reportId, variantId || id, definitionsPath)\n\n return definition\n}\n\nconst getFilterData = async (\n req: Request,\n res: Response,\n fields: components['schemas']['FieldDefinition'][],\n interactive: boolean,\n services: Services,\n userId: string,\n) => {\n const { reportId, id } = req.params\n\n // 1. Get filters from definition with default values\n let filtersData = <RenderFiltersReturnValue>await FiltersFormUtils.renderFilters(fields, interactive)\n\n // 2. Update filter values with user context values. eg. establishmnent code\n filtersData.filters = PersonalistionUtils.setUserContextDefaults(res, filtersData.filters)\n\n // 3. Update filter values with saved defaults\n let defaultFilterValues\n if (res.locals['saveDefaultsEnabled']) {\n defaultFilterValues = await services.defaultFilterValuesService.get(userId, reportId, id, FiltersType.REQUEST)\n }\n if (defaultFilterValues) {\n filtersData = PersonalistionUtils.setFilterValuesFromSavedDefaults(\n filtersData.filters,\n filtersData.sortBy || [],\n defaultFilterValues,\n )\n }\n\n // 4. Overwrite filter values with query param values\n filtersData.filters = FiltersUtils.setFilterValuesFromRequest(filtersData.filters, req)\n\n return { filtersData, defaultFilterValues }\n}\n\n/**\n * Sends the request for the async report\n *\n * @param {AsyncReportUtilsParams} { req, res, services }\n * @return {*}\n */\nexport const request = async ({ req, res, services }: AsyncReportUtilsParams) => {\n const { token } = LocalsHelper.getValues(res)\n const requestArgs = { req, res, token }\n\n const { executionData, queryData, childExecutionData } = await requestProduct({\n ...requestArgs,\n dashboardService: services.dashboardService,\n reportingService: services.reportingService,\n })\n\n if (executionData.executionId && executionData.tableId) {\n await updateStore({\n req,\n res,\n services,\n queryData,\n executionData,\n childExecutionData,\n })\n } else {\n throw new Error('No execution data returned')\n }\n\n return executionData\n}\n\nexport const cancelRequest = async ({ req, res, services }: AsyncReportUtilsParams) => {\n const { token, dprUser, definitionsPath } = LocalsHelper.getValues(res)\n const { reportId, id, executionId, type } = req.params\n\n let service: ReportingService | DashboardService = services.reportingService\n if (type === ReportType.REPORT) service = services.reportingService\n if (type === ReportType.DASHBOARD) service = services.dashboardService\n\n const response = await service.cancelAsyncRequest(token, reportId, id, executionId, definitionsPath)\n\n if (response && response['cancellationSucceeded']) {\n await services.requestedReportService.updateStatus(executionId, dprUser.id, RequestStatus.ABORTED)\n }\n}\n\n/**\n * Returns the data required for rendering the async filters component\n *\n * @param {AsyncReportUtilsParams} { req, res, dataSources }\n * @return {*}\n */\nexport const renderRequest = async ({\n req,\n res,\n services,\n next,\n}: {\n req: Request\n res: Response\n next: NextFunction\n services: Services\n}): Promise<RequestDataResult | boolean> => {\n try {\n const { token, csrfToken, definitionsPath: definitionPath, dpdPathFromQuery, dprUser } = LocalsHelper.getValues(res)\n const { reportId, type, id } = req.params\n const { definition } = res.locals\n const defaultsSaved = <string>req.query['defaultsSaved']\n\n const definitionApiArgs = { token, reportId, definitionPath, services }\n\n let name\n let reportName\n let description\n let template\n let fields: components['schemas']['FieldDefinition'][] = []\n let sections\n let interactive\n let filtersData\n let defaultFilterValues: defaultFilterValue[] = []\n\n if (type === ReportType.REPORT) {\n ;({ name, reportName, description, fields, interactive } = await renderReportRequestData(definition))\n }\n\n if (type === ReportType.DASHBOARD) {\n ;({ name, reportName, description, sections, fields } = await renderDashboardRequestData({\n ...definitionApiArgs,\n definition,\n }))\n }\n\n if (fields) {\n const filterData = await getFilterData(req, res, fields, interactive || false, services, dprUser.id)\n defaultFilterValues = filterData.defaultFilterValues || defaultFilterValues\n filtersData = filterData.filtersData\n }\n\n const reportData: RequestReportData = {\n reportName,\n name,\n description,\n reportId,\n id,\n ...(dpdPathFromQuery && { definitionPath }),\n csrfToken,\n template,\n sections,\n hasDefaults: defaultFilterValues?.length > 0,\n defaultsSaved,\n type: type as ReportType,\n saveDefaultsEnabled: res.locals['saveDefaultsEnabled'],\n }\n\n return {\n title: `Request ${type}`,\n filtersDescription: `Customise your ${type} using the filters below and submit your request.`,\n filtersData,\n reportData,\n }\n } catch (error) {\n next(error)\n return false\n }\n}\n\nexport const getFiltersFromReqBody = (req: Request) => {\n return Object.keys(req.body)\n .filter((attr) => attr.includes('filters.'))\n .filter((attr) => !!req.body[attr])\n .map((attr) => {\n return { name: attr, value: req.body[attr] }\n })\n}\n\nexport default {\n request,\n cancelRequest,\n renderRequest,\n getFiltersFromReqBody,\n getDefintionByType,\n}\n"],
5
- "mappings": "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",
6
- "names": ["utils_exports", "__export", "cancelRequest", "utils_default", "getDefintionByType", "getFiltersFromReqBody", "renderRequest", "request", "updateStore", "__toCommonJS", "import_utils", "import_localsHelper", "import_reportStoreHelper", "import_UserStoreItemBuilder", "import_UserReports", "import_personalisationUtils", "import_filtersTypeEnum", "req", "res", "services", "queryData", "executionData", "childExecutionData", "search", "id", "type", "dprUser", "definitionsPath", "dpdPathFromQuery", "LocalsHelper", "requestFormData", "reportData", "requestedReportData", "UserStoreItemBuilder", "requestChildReports", "childVariants", "reportingService", "token", "reportId", "dataProductDefinitionsPath", "childVariant", "response", "executionId", "tableId", "requestProduct", "dashboardService", "fields", "definition", "FiltersFormUtils", "renderDashboardRequestData", "definitionPath", "reportName", "def", "name", "description", "sections", "renderReportRequestData", "_next", "variantId", "getFilterData", "interactive", "userId", "filtersData", "PersonalistionUtils", "defaultFilterValues", "FiltersUtils", "requestArgs", "service", "next", "csrfToken", "defaultsSaved", "definitionApiArgs", "template", "filterData", "error", "attr"]
4
+ "sourcesContent": ["/* eslint-disable no-param-reassign */\nimport { Request, Response, NextFunction } from 'express'\n\n// Utils\nimport { defaultFilterValue } from '../../../../utils/Personalisation/types'\nimport FiltersFormUtils from '../../../../components/_async/async-filters-form/utils'\nimport LocalsHelper from '../../../../utils/localsHelper'\nimport FiltersUtils from '../../../../components/_filters/utils'\nimport { removeDuplicates } from '../../../../utils/reportStoreHelper'\nimport UserStoreItemBuilder from '../../../../utils/UserStoreItemBuilder'\n\n// Types\nimport type ReportingService from '../../../../services/reportingService'\nimport { ReportType, RequestFormData, RequestStatus } from '../../../../types/UserReports'\nimport type { ExecutionData, ChildReportExecutionData } from '../../../../types/ExecutionData'\nimport type { AsyncReportUtilsParams, RequestDataResult, RequestReportData } from '../../../../types/AsyncReportUtils'\nimport type {\n RenderFiltersReturnValue,\n SetQueryFromFiltersResult,\n} from '../../../../components/_async/async-filters-form/types'\nimport type { components } from '../../../../types/api'\nimport type { Services } from '../../../../types/Services'\nimport type DashboardService from '../../../../services/dashboardService'\nimport PersonalistionUtils from '../../../../utils/Personalisation/personalisationUtils'\nimport { FiltersType } from '../../../../components/_filters/filtersTypeEnum'\n\n/**\n * Updates the store with the request details\n *\n * @param {Request} req\n * @param {Response} res\n * @param {Services} services\n * @param {SetQueryFromFiltersResult} querySummaryData\n * @param {string} executionData\n * @return {*} {Promise<string>}\n */\nexport const updateStore = async ({\n req,\n res,\n services,\n queryData,\n executionData,\n childExecutionData,\n}: {\n req: Request\n res: Response\n services: Services\n queryData?: SetQueryFromFiltersResult | undefined\n executionData: ExecutionData\n childExecutionData: Array<ChildReportExecutionData>\n}): Promise<void> => {\n const { search, id, type } = req.body\n const { dprUser, definitionsPath, dpdPathFromQuery } = LocalsHelper.getValues(res)\n\n await removeDuplicates({ storeService: services.requestedReportService, userId: dprUser.id, id, search })\n await removeDuplicates({ storeService: services.recentlyViewedService, userId: dprUser.id, id, search })\n\n const requestFormData: RequestFormData = req.body\n const reportData = {\n type: requestFormData.type as ReportType,\n reportId: requestFormData.reportId,\n reportName: requestFormData.reportName,\n description: requestFormData.description,\n id: requestFormData.id,\n name: requestFormData.name,\n }\n\n let requestedReportData\n switch (type) {\n case ReportType.REPORT:\n requestedReportData = new UserStoreItemBuilder(reportData, requestFormData)\n .addExecutionData(executionData)\n .addChildExecutionData(childExecutionData)\n .addFilters(queryData?.filterData)\n .addSortData(queryData?.sortData)\n .addDefinitionsPath(definitionsPath, dpdPathFromQuery)\n .addRequestUrls(req)\n .addQuery(queryData)\n .addStatus(RequestStatus.SUBMITTED)\n .addTimestamp()\n .build()\n break\n case ReportType.DASHBOARD: {\n requestedReportData = new UserStoreItemBuilder(reportData, requestFormData)\n .addExecutionData(executionData)\n .addChildExecutionData(childExecutionData)\n .addFilters(queryData?.filterData)\n .addDefinitionsPath(definitionsPath, dpdPathFromQuery)\n .addRequestUrls(req)\n .addQuery(queryData)\n .addStatus(RequestStatus.SUBMITTED)\n .addTimestamp()\n .addMetrics(JSON.parse(req.body.sections))\n .build()\n break\n }\n default:\n break\n }\n\n if (requestedReportData) await services.requestedReportService.addReport(dprUser.id, requestedReportData)\n}\n\nasync function requestChildReports(\n childVariants: Array<components['schemas']['ChildVariantDefinition']>,\n reportingService: ReportingService,\n token: string,\n reportId: string,\n queryData?: SetQueryFromFiltersResult,\n dataProductDefinitionsPath?: string,\n): Promise<Array<ChildReportExecutionData>> {\n let query: Record<string, string>\n if (queryData) {\n query = queryData.query\n delete query['sortColumn']\n delete query['sortedAsc']\n }\n\n return Promise.all(\n childVariants.map((childVariant) =>\n reportingService\n .requestAsyncReport(token, reportId, childVariant.id, {\n ...(query && query),\n ...(dataProductDefinitionsPath && { dataProductDefinitionsPath }),\n })\n .then((response) => {\n const { executionId, tableId } = response\n if (!executionId || !tableId) {\n throw new Error('requestChildReports: No execution of tableId in response')\n }\n return { executionId, tableId, variantId: childVariant.id }\n }),\n ),\n )\n}\n\nconst requestProduct = async ({\n req,\n res,\n token,\n dashboardService,\n reportingService,\n}: {\n req: Request\n res: Response\n token: string\n dashboardService: DashboardService\n reportingService: ReportingService\n}): Promise<{\n executionData: ExecutionData\n childExecutionData: Array<ChildReportExecutionData>\n queryData?: SetQueryFromFiltersResult | undefined\n}> => {\n const { definitionsPath: dataProductDefinitionsPath, dpdPathFromQuery } = LocalsHelper.getValues(res)\n const { reportId, id, type } = req.body\n\n let fields: components['schemas']['FieldDefinition'][]\n let queryData\n let executionId\n let tableId\n let definition\n let childVariants: components['schemas']['ChildVariantDefinition'][] = []\n\n if (type === ReportType.REPORT) {\n definition = await reportingService.getDefinition(token, reportId, id, dataProductDefinitionsPath)\n\n fields = definition?.variant.specification?.fields || []\n queryData = FiltersFormUtils.setQueryFromFilters(req, fields)\n ;({ executionId, tableId } = await reportingService.requestAsyncReport(token, reportId, id, {\n ...queryData.query,\n dataProductDefinitionsPath,\n }))\n childVariants = definition.variant.childVariants ?? []\n }\n\n if (type === ReportType.DASHBOARD) {\n definition = await dashboardService.getDefinition(token, reportId, id, dataProductDefinitionsPath)\n\n fields = definition?.filterFields || []\n queryData = FiltersFormUtils.setQueryFromFilters(req, fields)\n ;({ executionId, tableId } = await dashboardService.requestAsyncDashboard(token, reportId, id, {\n ...queryData.query,\n dataProductDefinitionsPath,\n }))\n }\n\n const childExecutionData = await requestChildReports(\n childVariants,\n reportingService,\n token,\n reportId,\n queryData,\n dataProductDefinitionsPath,\n )\n\n const executionData = {\n executionId,\n tableId,\n ...(dpdPathFromQuery && { dataProductDefinitionsPath }),\n }\n\n return {\n executionData,\n childExecutionData,\n queryData,\n }\n}\n\nconst renderDashboardRequestData = async ({\n token,\n reportId,\n definitionPath,\n services,\n definition,\n}: {\n token: string\n reportId: string\n definitionPath: string\n services: Services\n definition: components['schemas']['DashboardDefinition']\n}) => {\n const productDefinitions = await services.reportingService.getDefinitions(token, definitionPath)\n const productDefinition = productDefinitions.find(\n (def: components['schemas']['ReportDefinitionSummary']) => def.id === reportId,\n )\n const reportName = productDefinition?.name\n const { name, description, sections, filterFields: fields } = definition\n\n return {\n reportName,\n name,\n description,\n sections: sections || [],\n fields: fields || [],\n }\n}\n\nconst renderReportRequestData = async (definition: components['schemas']['SingleVariantReportDefinition']) => {\n return {\n definition,\n reportName: definition.name,\n name: definition.variant.name,\n description: definition.variant.description || definition.description,\n template: definition.variant.specification,\n fields: definition?.variant?.specification?.fields || [],\n interactive: definition?.variant?.interactive,\n }\n}\n\nexport const getDefintionByType = async (req: Request, res: Response, _next: NextFunction, services: Services) => {\n const { token, definitionsPath } = LocalsHelper.getValues(res)\n const { reportId, id, variantId, type } = req.params\n\n const service = type === ReportType.REPORT ? services.reportingService : services.dashboardService\n const definition = await service.getDefinition(token, reportId, variantId || id, definitionsPath)\n\n return definition\n}\n\nconst getFilterData = async (\n req: Request,\n res: Response,\n fields: components['schemas']['FieldDefinition'][],\n interactive: boolean,\n services: Services,\n userId: string,\n) => {\n const { reportId, id } = req.params\n\n // 1. Get filters from definition with default values\n let filtersData = <RenderFiltersReturnValue>await FiltersFormUtils.renderFilters(fields, interactive)\n\n // 2. Update filter values with user context values. eg. establishmnent code\n filtersData.filters = PersonalistionUtils.setUserContextDefaults(res, filtersData.filters)\n\n // 3. Update filter values with saved defaults\n let defaultFilterValues\n if (res.locals['saveDefaultsEnabled']) {\n defaultFilterValues = await services.defaultFilterValuesService.get(userId, reportId, id, FiltersType.REQUEST)\n }\n if (defaultFilterValues) {\n filtersData = PersonalistionUtils.setFilterValuesFromSavedDefaults(\n filtersData.filters,\n filtersData.sortBy || [],\n defaultFilterValues,\n )\n }\n\n // 4. Overwrite filter values with query param values\n filtersData.filters = FiltersUtils.setFilterValuesFromRequest(filtersData.filters, req)\n\n return { filtersData, defaultFilterValues }\n}\n\n/**\n * Sends the request for the async report\n *\n * @param {AsyncReportUtilsParams} { req, res, services }\n * @return {*}\n */\nexport const request = async ({ req, res, services }: AsyncReportUtilsParams) => {\n const { token } = LocalsHelper.getValues(res)\n const requestArgs = { req, res, token }\n\n const { executionData, queryData, childExecutionData } = await requestProduct({\n ...requestArgs,\n dashboardService: services.dashboardService,\n reportingService: services.reportingService,\n })\n\n if (executionData.executionId && executionData.tableId) {\n await updateStore({\n req,\n res,\n services,\n queryData,\n executionData,\n childExecutionData,\n })\n } else {\n throw new Error('No execution data returned')\n }\n\n return executionData\n}\n\nexport const cancelRequest = async ({ req, res, services }: AsyncReportUtilsParams) => {\n const { token, dprUser, definitionsPath } = LocalsHelper.getValues(res)\n const { reportId, id, executionId, type } = req.params\n\n let service: ReportingService | DashboardService = services.reportingService\n if (type === ReportType.REPORT) service = services.reportingService\n if (type === ReportType.DASHBOARD) service = services.dashboardService\n\n const response = await service.cancelAsyncRequest(token, reportId, id, executionId, definitionsPath)\n\n if (response && response['cancellationSucceeded']) {\n await services.requestedReportService.updateStatus(executionId, dprUser.id, RequestStatus.ABORTED)\n }\n}\n\n/**\n * Returns the data required for rendering the async filters component\n *\n * @param {AsyncReportUtilsParams} { req, res, dataSources }\n * @return {*}\n */\nexport const renderRequest = async ({\n req,\n res,\n services,\n next,\n}: {\n req: Request\n res: Response\n next: NextFunction\n services: Services\n}): Promise<RequestDataResult | boolean> => {\n try {\n const { token, csrfToken, definitionsPath: definitionPath, dpdPathFromQuery, dprUser } = LocalsHelper.getValues(res)\n const { reportId, type, id } = req.params\n const { definition } = res.locals\n const defaultsSaved = <string>req.query['defaultsSaved']\n\n const definitionApiArgs = { token, reportId, definitionPath, services }\n\n let name\n let reportName\n let description\n let template\n let fields: components['schemas']['FieldDefinition'][] = []\n let sections\n let interactive\n let filtersData\n let defaultFilterValues: defaultFilterValue[] = []\n\n if (type === ReportType.REPORT) {\n ;({ name, reportName, description, fields, interactive } = await renderReportRequestData(definition))\n }\n\n if (type === ReportType.DASHBOARD) {\n ;({ name, reportName, description, sections, fields } = await renderDashboardRequestData({\n ...definitionApiArgs,\n definition,\n }))\n }\n\n if (fields) {\n const filterData = await getFilterData(req, res, fields, interactive || false, services, dprUser.id)\n defaultFilterValues = filterData.defaultFilterValues || defaultFilterValues\n filtersData = filterData.filtersData\n }\n\n const reportData: RequestReportData = {\n reportName,\n name,\n description,\n reportId,\n id,\n ...(dpdPathFromQuery && { definitionPath }),\n csrfToken,\n template,\n sections,\n hasDefaults: defaultFilterValues?.length > 0,\n defaultsSaved,\n type: type as ReportType,\n saveDefaultsEnabled: res.locals['saveDefaultsEnabled'],\n }\n\n return {\n title: `Request ${type}`,\n filtersDescription: `Customise your ${type} using the filters below and submit your request.`,\n filtersData,\n reportData,\n }\n } catch (error) {\n next(error)\n return false\n }\n}\n\nexport const getFiltersFromReqBody = (req: Request) => {\n return Object.keys(req.body)\n .filter((attr) => attr.includes('filters.'))\n .filter((attr) => !!req.body[attr])\n .map((attr) => {\n return { name: attr, value: req.body[attr] }\n })\n}\n\nexport default {\n request,\n cancelRequest,\n renderRequest,\n getFiltersFromReqBody,\n getDefintionByType,\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["utils_exports", "__export", "cancelRequest", "utils_default", "getDefintionByType", "getFiltersFromReqBody", "renderRequest", "request", "updateStore", "__toCommonJS", "import_utils", "import_localsHelper", "import_reportStoreHelper", "import_UserStoreItemBuilder", "import_UserReports", "import_personalisationUtils", "import_filtersTypeEnum", "req", "res", "services", "queryData", "executionData", "childExecutionData", "search", "id", "type", "dprUser", "definitionsPath", "dpdPathFromQuery", "LocalsHelper", "requestFormData", "reportData", "requestedReportData", "UserStoreItemBuilder", "requestChildReports", "childVariants", "reportingService", "token", "reportId", "dataProductDefinitionsPath", "query", "childVariant", "response", "executionId", "tableId", "requestProduct", "dashboardService", "fields", "definition", "FiltersFormUtils", "renderDashboardRequestData", "definitionPath", "reportName", "def", "name", "description", "sections", "renderReportRequestData", "_next", "variantId", "getFilterData", "interactive", "userId", "filtersData", "PersonalistionUtils", "defaultFilterValues", "FiltersUtils", "requestArgs", "service", "next", "csrfToken", "defaultsSaved", "definitionApiArgs", "template", "filterData", "error", "attr"]
7
7
  }
@@ -109,11 +109,18 @@ async function requestChildReports(
109
109
  queryData?: SetQueryFromFiltersResult,
110
110
  dataProductDefinitionsPath?: string,
111
111
  ): Promise<Array<ChildReportExecutionData>> {
112
+ let query: Record<string, string>
113
+ if (queryData) {
114
+ query = queryData.query
115
+ delete query['sortColumn']
116
+ delete query['sortedAsc']
117
+ }
118
+
112
119
  return Promise.all(
113
120
  childVariants.map((childVariant) =>
114
121
  reportingService
115
122
  .requestAsyncReport(token, reportId, childVariant.id, {
116
- ...(queryData && queryData.query),
123
+ ...(query && query),
117
124
  ...(dataProductDefinitionsPath && { dataProductDefinitionsPath }),
118
125
  })
119
126
  .then((response) => {
@@ -1,2 +1,2 @@
1
- "use strict";var T=Object.create;var g=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var B=(e,o)=>{for(var t in o)g(e,t,{get:o[t],enumerable:!0})},C=(e,o,t,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of E(o))!z.call(e,n)&&n!==t&&g(e,n,{get:()=>o[n],enumerable:!(a=x(o,n))||a.enumerable});return e};var y=(e,o,t)=>(t=e!=null?T(j(e)):{},C(o||!e||!e.__esModule?g(t,"default",{value:e,enumerable:!0}):t,e)),M=e=>C(g({},"__esModule",{value:!0}),e);var H={};B(H,{applyDashboardInteractiveQuery:()=>P,applyReportInteractiveQuery:()=>A,default:()=>$});module.exports=M(H);var m=require("../../../components/_filters/filter-input/enum"),D=y(require("../../../utils/localsHelper")),F=y(require("../../../utils/definitionUtils")),I=y(require("../../../utils/DateMapper/DateMapper")),V=y(require("../../../components/_reports/report-columns-form/utils"));const A=async(e,o,t,a)=>{const{reportId:n,id:s}=e.params,{token:l,definitionsPath:i}=D.default.getValues(o),r=(await t.reportingService.getDefinition(l,n,s,i)).variant.specification?.fields||[];return L(e,o,t,a,r)},P=async(e,o,t,a)=>{const{reportId:n,id:s}=e.params,{token:l,definitionsPath:i}=D.default.getValues(o),r=(await t.dashboardService.getDefinition(l,n,s,i)).filterFields||[];return L(e,o,t,a,r)},L=async(e,o,t,a,n)=>{const{tableId:s,id:l}=e.params,{dprUser:i}=D.default.getValues(o);let p;s?p=await t.recentlyViewedService?.getReportByTableId(s,i.id):p=await t.recentlyViewedService?.getReportById(l,i.id);const r=p?.interactiveQuery?.data,d=r?.preventDefault,R=r?.pageSize,S=r?.selectedPage,b=r?.sortColumn,h=r?.sortedAsc;let v={};r&&(v=Object.keys(r).filter(c=>c.includes("filters.")).reduce((c,u)=>({...c,[u]:r[u]}),{}));let f={...d&&{preventDefault:d},...S&&{selectedPage:S},...R&&{pageSize:R},...b&&{sortColumn:b},...h&&{sortedAsc:h},...e.body};if(a==="columns"){const{columns:c}=e.body,u=V.default.mandatoryColumns(n);let w=[];c&&(w=Array.isArray(c)?c:[c]);const U=[...u,...w];f={...f,columns:U,...v}}else{const c=r?.columns||[];f={...f,columns:c}}const Q=O({formData:f,fields:n});o.redirect(`${e.baseUrl}?${Q}`)},O=({formData:e,fields:o})=>{const t=new URLSearchParams;Object.keys(e).forEach(n=>{const s=e[n];if(s&&n!=="_csrf"){const l=n.split(".")[1];if(l){const i=F.default.getFilter(o,l);if(i){const{type:p}=i;switch(p.toLocaleLowerCase()){case m.FilterType.date.toLocaleLowerCase():case m.FilterType.dateRange.toLocaleLowerCase():case m.FilterType.granularDateRange.toLocaleLowerCase():{let r=s;const d=new I.default;d.getDateType(r)!=="none"&&(r=d.toDateString(r,"iso")||""),r&&t.append(n,r)}break;case m.FilterType.multiselect.toLocaleLowerCase():Array.isArray(s)?s.forEach(d=>{t.append(n,d)}):t.append(n,s);break;default:t.append(n,s);break}}}else Array.isArray(s)?s.forEach(i=>{t.append(n,i)}):t.append(n,s)}});const a=t.toString();return decodeURIComponent(a)};var $={applyDashboardInteractiveQuery:P,applyReportInteractiveQuery:A};0&&(module.exports={applyDashboardInteractiveQuery,applyReportInteractiveQuery});
1
+ "use strict";var x=Object.create;var g=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var B=(e,o)=>{for(var t in o)g(e,t,{get:o[t],enumerable:!0})},C=(e,o,t,i)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of T(o))!z.call(e,n)&&n!==t&&g(e,n,{get:()=>o[n],enumerable:!(i=E(o,n))||i.enumerable});return e};var D=(e,o,t)=>(t=e!=null?x(j(e)):{},C(o||!e||!e.__esModule?g(t,"default",{value:e,enumerable:!0}):t,e)),M=e=>C(g({},"__esModule",{value:!0}),e);var H={};B(H,{applyDashboardInteractiveQuery:()=>P,applyReportInteractiveQuery:()=>A,default:()=>$});module.exports=M(H);var f=require("../../../components/_filters/filter-input/enum"),y=D(require("../../../utils/localsHelper")),F=D(require("../../../utils/definitionUtils")),I=D(require("../../../utils/DateMapper/DateMapper")),V=D(require("../../../components/_reports/report-columns-form/utils"));const A=async(e,o,t,i)=>{const{reportId:n,id:r}=e.params,{token:l,definitionsPath:a}=y.default.getValues(o),s=(await t.reportingService.getDefinition(l,n,r,a)).variant.specification?.fields||[];return L(e,o,t,i,s)},P=async(e,o,t,i)=>{const{reportId:n,id:r}=e.params,{token:l,definitionsPath:a}=y.default.getValues(o),s=(await t.dashboardService.getDefinition(l,n,r,a)).filterFields||[];return L(e,o,t,i,s)},L=async(e,o,t,i,n)=>{const{tableId:r,id:l}=e.params,{dprUser:a}=y.default.getValues(o);let d;r?d=await t.recentlyViewedService?.getReportByTableId(r,a.id):d=await t.recentlyViewedService?.getReportById(l,a.id);const s=d?.interactiveQuery?.data,p=s?.preventDefault,R=s?.pageSize,S=i==="columns"?s?.selectedPage:1,b=s?.sortColumn,h=s?.sortedAsc;let v={};s&&(v=Object.keys(s).filter(c=>c.includes("filters.")).reduce((c,u)=>({...c,[u]:s[u]}),{}));let m={...p&&{preventDefault:p},...S&&{selectedPage:S},...R&&{pageSize:R},...b&&{sortColumn:b},...h&&{sortedAsc:h},...e.body};if(i==="columns"){const{columns:c}=e.body,u=V.default.mandatoryColumns(n);let w=[];c&&(w=Array.isArray(c)?c:[c]);const U=[...u,...w];m={...m,columns:U,...v}}else{const c=s?.columns||[];m={...m,columns:c}}const Q=O({formData:m,fields:n});o.redirect(`${e.baseUrl}?${Q}`)},O=({formData:e,fields:o})=>{const t=new URLSearchParams;Object.keys(e).forEach(n=>{const r=e[n];if(r&&n!=="_csrf"){const l=n.split(".")[1];if(l){const a=F.default.getFilter(o,l);if(a){const{type:d}=a;switch(d.toLocaleLowerCase()){case f.FilterType.date.toLocaleLowerCase():case f.FilterType.dateRange.toLocaleLowerCase():case f.FilterType.granularDateRange.toLocaleLowerCase():{let s=r;const p=new I.default;p.getDateType(s)!=="none"&&(s=p.toDateString(s,"iso")||""),s&&t.append(n,s)}break;case f.FilterType.multiselect.toLocaleLowerCase():Array.isArray(r)?r.forEach(p=>{t.append(n,p)}):t.append(n,r);break;default:t.append(n,r);break}}}else Array.isArray(r)?r.forEach(a=>{t.append(n,a)}):t.append(n,r)}});const i=t.toString();return decodeURIComponent(i)};var $={applyDashboardInteractiveQuery:P,applyReportInteractiveQuery:A};0&&(module.exports={applyDashboardInteractiveQuery,applyReportInteractiveQuery});
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/utils.ts"],
4
- "sourcesContent": ["import { Request, Response } from 'express'\nimport { FilterType } from '../../../components/_filters/filter-input/enum'\nimport { components } from '../../../types/api'\nimport { StoredReportData } from '../../../types/UserReports'\nimport { Services } from '../../../types/Services'\nimport LocalsHelper from '../../../utils/localsHelper'\nimport definitionUtils from '../../../utils/definitionUtils'\nimport DateMapper from '../../../utils/DateMapper/DateMapper'\nimport ColumnsUtils from '../../../components/_reports/report-columns-form/utils'\n\nexport const applyReportInteractiveQuery = async (\n req: Request,\n res: Response,\n services: Services,\n applyType: 'columns' | 'filters',\n) => {\n const { reportId, id } = req.params\n const { token, definitionsPath } = LocalsHelper.getValues(res)\n\n // Get the definition\n const definition: components['schemas']['SingleVariantReportDefinition'] =\n await services.reportingService.getDefinition(token, reportId, id, definitionsPath)\n const fields = definition.variant.specification?.fields || []\n\n return applyInteractiveQuery(req, res, services, applyType, fields)\n}\n\nexport const applyDashboardInteractiveQuery = async (\n req: Request,\n res: Response,\n services: Services,\n applyType: 'columns' | 'filters',\n) => {\n const { reportId, id } = req.params\n const { token, definitionsPath } = LocalsHelper.getValues(res)\n\n // Get the definition\n const definition: components['schemas']['DashboardDefinition'] = await services.dashboardService.getDefinition(\n token,\n reportId,\n id,\n definitionsPath,\n )\n const fields = definition.filterFields || []\n\n return applyInteractiveQuery(req, res, services, applyType, fields)\n}\n\nconst applyInteractiveQuery = async (\n req: Request,\n res: Response,\n services: Services,\n applyType: 'columns' | 'filters',\n fields: components['schemas']['FieldDefinition'][],\n) => {\n const { tableId, id } = req.params\n const { dprUser } = LocalsHelper.getValues(res)\n\n // get the report state\n let reportStateData: StoredReportData | undefined\n if (tableId) {\n // means its an async report\n reportStateData = await services.recentlyViewedService?.getReportByTableId(tableId, dprUser.id)\n } else {\n // its a sync report and can be indentified by ID as will always only be 1\n reportStateData = await services.recentlyViewedService?.getReportById(id, dprUser.id)\n }\n\n // Get the stored interactive query data\n const interactiveQueryData = reportStateData?.interactiveQuery?.data\n\n const preventDefault = interactiveQueryData?.['preventDefault']\n const pageSize = interactiveQueryData?.['pageSize']\n const selectedPage = interactiveQueryData?.['selectedPage']\n const sortColumn = interactiveQueryData?.['sortColumn']\n const sortedAsc = interactiveQueryData?.['sortedAsc']\n\n let filters = {}\n if (interactiveQueryData) {\n filters = Object.keys(interactiveQueryData)\n .filter((key) => key.includes('filters.'))\n .reduce((acc, key) => ({ ...acc, [key]: interactiveQueryData[key] }), {})\n }\n\n // Create merged form data\n let formData: Record<string, string | string[]> = {\n ...(preventDefault && { preventDefault }),\n ...(selectedPage && { selectedPage }),\n ...(pageSize && { pageSize }),\n ...(sortColumn && { sortColumn }),\n ...(sortedAsc && { sortedAsc }),\n ...req.body,\n }\n\n if (applyType === 'columns') {\n const { columns } = req.body\n const mandatoryCols = ColumnsUtils.mandatoryColumns(fields)\n\n let bodyColumns = []\n if (columns) {\n bodyColumns = Array.isArray(columns) ? columns : [columns]\n }\n const columnsData = [...mandatoryCols, ...bodyColumns]\n formData = { ...formData, columns: columnsData, ...filters }\n } else {\n const columns = interactiveQueryData?.['columns'] || []\n formData = { ...formData, columns }\n }\n\n // Create query string\n const filtersString = createQueryParamsFromFormData({\n formData,\n fields,\n })\n\n // Redirect back to report\n res.redirect(`${req.baseUrl}?${filtersString}`)\n}\n\nconst createQueryParamsFromFormData = ({\n formData,\n fields,\n}: {\n fields: components['schemas']['FieldDefinition'][]\n formData: Record<string, string | string[]>\n}) => {\n // create the query string\n const params = new URLSearchParams()\n Object.keys(formData).forEach((key) => {\n const value = formData[key]\n\n if (value && key !== '_csrf') {\n const fieldId = key.split('.')[1] // filters are prefixed with 'filters.'\n if (fieldId) {\n const filter = definitionUtils.getFilter(fields, fieldId)\n if (filter) {\n const { type: filterType } = filter\n switch (filterType.toLocaleLowerCase()) {\n // DATE RANGE TYPES\n case FilterType.date.toLocaleLowerCase():\n case FilterType.dateRange.toLocaleLowerCase():\n case FilterType.granularDateRange.toLocaleLowerCase():\n {\n let dateValue: string = <string>value\n const dateMapper = new DateMapper()\n const currentDateFormat = dateMapper.getDateType(dateValue)\n if (currentDateFormat !== 'none') {\n dateValue = dateMapper.toDateString(dateValue, 'iso') || ''\n }\n if (dateValue) {\n params.append(key, dateValue)\n }\n }\n break\n\n // MULTIVALUE TYPES: string[] || string if only one value selected\n case FilterType.multiselect.toLocaleLowerCase():\n if (Array.isArray(value)) {\n const multiselectValue = <string[]>value\n multiselectValue.forEach((v: string) => {\n params.append(key, v)\n })\n } else {\n params.append(key, <string>value)\n }\n break\n\n // OTHER TYPES - always a string\n default:\n params.append(key, <string>value)\n break\n }\n }\n } else if (Array.isArray(value)) {\n value.forEach((v: string) => {\n params.append(key, v)\n })\n } else {\n params.append(key, value)\n }\n }\n })\n\n const encodedFilters = params.toString()\n return decodeURIComponent(encodedFilters)\n}\n\nexport default {\n applyDashboardInteractiveQuery,\n applyReportInteractiveQuery,\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Request, Response } from 'express'\nimport { FilterType } from '../../../components/_filters/filter-input/enum'\nimport { components } from '../../../types/api'\nimport { StoredReportData } from '../../../types/UserReports'\nimport { Services } from '../../../types/Services'\nimport LocalsHelper from '../../../utils/localsHelper'\nimport definitionUtils from '../../../utils/definitionUtils'\nimport DateMapper from '../../../utils/DateMapper/DateMapper'\nimport ColumnsUtils from '../../../components/_reports/report-columns-form/utils'\n\nexport const applyReportInteractiveQuery = async (\n req: Request,\n res: Response,\n services: Services,\n applyType: 'columns' | 'filters',\n) => {\n const { reportId, id } = req.params\n const { token, definitionsPath } = LocalsHelper.getValues(res)\n\n // Get the definition\n const definition: components['schemas']['SingleVariantReportDefinition'] =\n await services.reportingService.getDefinition(token, reportId, id, definitionsPath)\n const fields = definition.variant.specification?.fields || []\n\n return applyInteractiveQuery(req, res, services, applyType, fields)\n}\n\nexport const applyDashboardInteractiveQuery = async (\n req: Request,\n res: Response,\n services: Services,\n applyType: 'columns' | 'filters',\n) => {\n const { reportId, id } = req.params\n const { token, definitionsPath } = LocalsHelper.getValues(res)\n\n // Get the definition\n const definition: components['schemas']['DashboardDefinition'] = await services.dashboardService.getDefinition(\n token,\n reportId,\n id,\n definitionsPath,\n )\n const fields = definition.filterFields || []\n\n return applyInteractiveQuery(req, res, services, applyType, fields)\n}\n\nconst applyInteractiveQuery = async (\n req: Request,\n res: Response,\n services: Services,\n applyType: 'columns' | 'filters',\n fields: components['schemas']['FieldDefinition'][],\n) => {\n const { tableId, id } = req.params\n const { dprUser } = LocalsHelper.getValues(res)\n\n // get the report state\n let reportStateData: StoredReportData | undefined\n if (tableId) {\n // means its an async report\n reportStateData = await services.recentlyViewedService?.getReportByTableId(tableId, dprUser.id)\n } else {\n // its a sync report and can be indentified by ID as will always only be 1\n reportStateData = await services.recentlyViewedService?.getReportById(id, dprUser.id)\n }\n\n // Get the stored interactive query data\n const interactiveQueryData = reportStateData?.interactiveQuery?.data\n\n const preventDefault = interactiveQueryData?.['preventDefault']\n const pageSize = interactiveQueryData?.['pageSize']\n const selectedPage = applyType === 'columns' ? interactiveQueryData?.['selectedPage'] : 1\n const sortColumn = interactiveQueryData?.['sortColumn']\n const sortedAsc = interactiveQueryData?.['sortedAsc']\n\n let filters = {}\n if (interactiveQueryData) {\n filters = Object.keys(interactiveQueryData)\n .filter((key) => key.includes('filters.'))\n .reduce((acc, key) => ({ ...acc, [key]: interactiveQueryData[key] }), {})\n }\n\n // Create merged form data\n let formData: Record<string, string | string[]> = {\n ...(preventDefault && { preventDefault }),\n ...(selectedPage && { selectedPage }),\n ...(pageSize && { pageSize }),\n ...(sortColumn && { sortColumn }),\n ...(sortedAsc && { sortedAsc }),\n ...req.body,\n }\n\n if (applyType === 'columns') {\n const { columns } = req.body\n const mandatoryCols = ColumnsUtils.mandatoryColumns(fields)\n\n let bodyColumns = []\n if (columns) {\n bodyColumns = Array.isArray(columns) ? columns : [columns]\n }\n const columnsData = [...mandatoryCols, ...bodyColumns]\n formData = { ...formData, columns: columnsData, ...filters }\n } else {\n const columns = interactiveQueryData?.['columns'] || []\n formData = { ...formData, columns }\n }\n\n // Create query string\n const filtersString = createQueryParamsFromFormData({\n formData,\n fields,\n })\n\n // Redirect back to report\n res.redirect(`${req.baseUrl}?${filtersString}`)\n}\n\nconst createQueryParamsFromFormData = ({\n formData,\n fields,\n}: {\n fields: components['schemas']['FieldDefinition'][]\n formData: Record<string, string | string[]>\n}) => {\n // create the query string\n const params = new URLSearchParams()\n Object.keys(formData).forEach((key) => {\n const value = formData[key]\n\n if (value && key !== '_csrf') {\n const fieldId = key.split('.')[1] // filters are prefixed with 'filters.'\n if (fieldId) {\n const filter = definitionUtils.getFilter(fields, fieldId)\n if (filter) {\n const { type: filterType } = filter\n switch (filterType.toLocaleLowerCase()) {\n // DATE RANGE TYPES\n case FilterType.date.toLocaleLowerCase():\n case FilterType.dateRange.toLocaleLowerCase():\n case FilterType.granularDateRange.toLocaleLowerCase():\n {\n let dateValue: string = <string>value\n const dateMapper = new DateMapper()\n const currentDateFormat = dateMapper.getDateType(dateValue)\n if (currentDateFormat !== 'none') {\n dateValue = dateMapper.toDateString(dateValue, 'iso') || ''\n }\n if (dateValue) {\n params.append(key, dateValue)\n }\n }\n break\n\n // MULTIVALUE TYPES: string[] || string if only one value selected\n case FilterType.multiselect.toLocaleLowerCase():\n if (Array.isArray(value)) {\n const multiselectValue = <string[]>value\n multiselectValue.forEach((v: string) => {\n params.append(key, v)\n })\n } else {\n params.append(key, <string>value)\n }\n break\n\n // OTHER TYPES - always a string\n default:\n params.append(key, <string>value)\n break\n }\n }\n } else if (Array.isArray(value)) {\n value.forEach((v: string) => {\n params.append(key, v)\n })\n } else {\n params.append(key, value)\n }\n }\n })\n\n const encodedFilters = params.toString()\n return decodeURIComponent(encodedFilters)\n}\n\nexport default {\n applyDashboardInteractiveQuery,\n applyReportInteractiveQuery,\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["utils_exports", "__export", "applyDashboardInteractiveQuery", "applyReportInteractiveQuery", "utils_default", "__toCommonJS", "import_enum", "import_localsHelper", "import_definitionUtils", "import_DateMapper", "import_utils", "req", "res", "services", "applyType", "reportId", "id", "token", "definitionsPath", "LocalsHelper", "fields", "applyInteractiveQuery", "tableId", "dprUser", "reportStateData", "interactiveQueryData", "preventDefault", "pageSize", "selectedPage", "sortColumn", "sortedAsc", "filters", "key", "acc", "formData", "columns", "mandatoryCols", "ColumnsUtils", "bodyColumns", "columnsData", "filtersString", "createQueryParamsFromFormData", "params", "value", "fieldId", "filter", "definitionUtils", "filterType", "dateValue", "dateMapper", "DateMapper", "v", "encodedFilters"]
7
7
  }
@@ -71,7 +71,7 @@ const applyInteractiveQuery = async (
71
71
 
72
72
  const preventDefault = interactiveQueryData?.['preventDefault']
73
73
  const pageSize = interactiveQueryData?.['pageSize']
74
- const selectedPage = interactiveQueryData?.['selectedPage']
74
+ const selectedPage = applyType === 'columns' ? interactiveQueryData?.['selectedPage'] : 1
75
75
  const sortColumn = interactiveQueryData?.['sortColumn']
76
76
  const sortedAsc = interactiveQueryData?.['sortedAsc']
77
77
 
@@ -1,2 +1,2 @@
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});
1
+ "use strict";var B=Object.create;var D=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var A=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var G=(e,s)=>{for(var n in s)D(e,n,{get:s[n],enumerable:!0})},v=(e,s,n,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of j(s))!S.call(e,o)&&o!==n&&D(e,o,{get:()=>s[o],enumerable:!(t=T(s,o))||t.enumerable});return e};var H=(e,s,n)=>(n=e!=null?B(A(e)):{},v(s||!e||!e.__esModule?D(n,"default",{value:e,enumerable:!0}):n,e)),L=e=>v(D({},"__esModule",{value:!0}),e);var U={};G(U,{default:()=>N,filterKeys:()=>g,filterRowsByDisplayColumns:()=>O,getDatasetRows:()=>C,getEarliestDataset:()=>E,getGroupKey:()=>I,getKeyIds:()=>R,getKeyVariations:()=>b,getLastestDataset:()=>V,groupRowsByKey:()=>k,groupRowsByTimestamp:()=>K});module.exports=L(U);var x=H(require("./logger"));const C=(e,s)=>{const{measures:n,filters:t,expectNulls:o}=e.columns;x.default.info("DEBUG: Dashboard vis filterValues:",t);const 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 w=[];return Object.keys(c).forEach(f=>{const u=c[f].raw;let m=!0;if(l.includes(f)&&t){const q=t?t.filter(d=>d.id===f).map(d=>d.equals):[],y=[];q.forEach(d=>{d===null?y.push(u===""||u===void 0||u===null):y.push(d===u)}),m=y.some(Boolean)}else r.includes(f)&&p?m=!0:r.includes(f)&&!p||i.includes(f)?m=u!==""&&u!==void 0&&u!==null:o&&(m=u===""||u===void 0||u===null);w.push(m)}),w.every(f=>f)});return p?g(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},g=(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)})},V=e=>{const s=e[e.length-1]?.ts?.raw;return s?e.filter(n=>n.ts.raw===s):e},E=e=>{const s=e[0]?.ts?.raw;return s?e.filter(n=>n.ts.raw===s):e},K=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)),I=(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},O=(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 N={getDatasetRows:C,getLastestDataset:V,getEarliestDataset:E,filterRowsByDisplayColumns:O,groupRowsByTimestamp:K,groupRowsByKey:k,getGroupKey:I,getKeyVariations:b,getKeyIds:R,filterKeys:g};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 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": "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",
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"]
4
+ "sourcesContent": ["import { DashboardDataResponse } from '../types/Metrics'\nimport { components } from '../types/api'\nimport logger from './logger'\n\nexport const getDatasetRows = (\n listDefinition: components['schemas']['DashboardVisualisationDefinition'],\n dashboardData: DashboardDataResponse[],\n) => {\n const { measures, filters, expectNulls } = listDefinition.columns\n logger.info('DEBUG: Dashboard vis filterValues:', filters)\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": "0jBAAA,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,GAEA,IAAAc,EAAmB,uBAEZ,MAAMT,EAAiB,CAC5BU,EACAC,IACG,CACH,KAAM,CAAE,SAAAC,EAAU,QAAAC,EAAS,YAAAC,CAAY,EAAIJ,EAAe,QAC1D,EAAAK,QAAO,KAAK,qCAAsCF,CAAO,EACzD,MAAMG,EAA+EN,EAAe,QAAQ,KAEtGO,EAAoBL,EAAS,IAAKM,GAAQA,EAAI,EAAE,EAChDC,EAAgBH,GAAM,IAAKE,GAAQA,EAAI,EAAE,GAAK,CAAC,EACrD,IAAIE,EAAeP,GAAS,IAAKK,GAAQA,EAAI,EAAE,GAAK,CAAC,EACrDE,EAAe,CAAC,GAAG,IAAI,IAAIA,CAAY,CAAC,EACxC,MAAMC,EAAkBL,GAAM,KAAMM,GAAQA,EAAI,QAAQ,EAEpDX,EAAc,QAAUA,EAAc,CAAC,EAAE,IAAOQ,EAAc,QAAQ,IAAI,EAE9E,MAAMI,EAAWZ,EAAc,OAAQa,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,GAAKb,EAAS,CAC7C,MAAMgB,EAAehB,EAAUA,EAAQ,OAAQiB,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,KAOhDb,IACTc,EAAQD,IAAU,IAAMA,IAAU,QAAaA,IAAU,MAG3DF,EAAS,KAAKG,CAAK,CACrB,CAAC,EAEMH,EAAS,MAAOQ,GAAQA,CAAG,CACpC,CAAC,EAED,OAAIZ,EACKvB,EAAWyB,EAAUP,GAAQ,CAAC,CAAC,EAGjCO,CACT,EAEanB,EAAoBY,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,EAEa/B,EAAY,CAACQ,EAAwCuB,IAAgC,CAChG,IAAIK,EAAyB,CAAC,EAC9B,OAAAL,EAAgB,MAAOM,GAAkB,CACvC,MAAMC,EAAY,CAAC,EAmBnB,OAjBA9B,EAAc,QAASa,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,EAEazC,EAAa,CACxBa,EACAK,IACG,CACH,MAAMkB,EAAkB9B,EAAiBY,CAAI,EACvCuB,EAAepC,EAAUQ,EAAeuB,CAAe,EAE7D,OAAOvB,EAAc,OAAQa,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,EAEa5B,EAAqBM,GAAoE,CACpG,MAAMgC,EAAkBhC,EAAcA,EAAc,OAAS,CAAC,GAAI,IAAO,IACzE,OAAIgC,EACKhC,EAAc,OAAQiC,GAASA,EAAK,GAAM,MAAQD,CAAe,EAEnEhC,CACT,EAEaV,EAAsBU,GAAoE,CACrG,MAAMgC,EAAkBhC,EAAc,CAAC,GAAI,IAAO,IAClD,OAAIgC,EACKhC,EAAc,OAAQiC,GAASA,EAAK,GAAM,MAAQD,CAAe,EAEnEhC,CACT,EAEaJ,EAAwBI,GACV,CAAC,GAAG,IAAI,IAAIA,EAAc,IAAKkC,GAASA,EAAK,GAAM,GAAG,CAAC,CAAC,EACzD,IAAKC,GACpBnC,EAAc,OAAQoC,GAAMA,EAAE,GAAM,MAAQD,CAAE,CACtD,EAGUxC,EAAiB,CAACK,EAAwCW,IAC7C,CAAC,GAAG,IAAI,IAAIX,EAAc,IAAKkC,GAASA,EAAKvB,CAAG,EAAE,GAAG,CAAC,CAAC,EACxD,IAAK0B,GACnBrC,EAAc,OAAQoC,GAAMA,EAAEzB,CAAG,EAAE,MAAQ0B,CAAQ,CAC3D,EAGU9C,EAAc,CACzB+C,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,EAEanD,EAA6B,CACxCW,EACAC,EACAyC,EAAc,KACX,CACH,KAAM,CAAE,KAAMC,EAAS,SAAAzC,CAAS,EAAIF,EAAe,QAC7CM,EAAOqC,GAAW,CAAC,EACzB,IAAIC,EAAiB,CAAC,GAAG1C,CAAQ,EAC7BwC,IACFE,EAAiB,CAAC,GAAGtC,EAAM,GAAGJ,CAAQ,GAExC,MAAMK,EAAoBqC,EAAe,IAAKpC,GAAQA,EAAI,EAAE,EAE5D,OAAOP,EAAc,IAAKa,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,IAAO1D,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", "import_logger", "listDefinition", "dashboardData", "measures", "filters", "expectNulls", "logger", "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
  }
@@ -1,11 +1,13 @@
1
1
  import { DashboardDataResponse } from '../types/Metrics'
2
2
  import { components } from '../types/api'
3
+ import logger from './logger'
3
4
 
4
5
  export const getDatasetRows = (
5
6
  listDefinition: components['schemas']['DashboardVisualisationDefinition'],
6
7
  dashboardData: DashboardDataResponse[],
7
8
  ) => {
8
9
  const { measures, filters, expectNulls } = listDefinition.columns
10
+ logger.info('DEBUG: Dashboard vis filterValues:', filters)
9
11
  const keys = <Array<components['schemas']['DashboardVisualisationColumnDefinition']>>listDefinition.columns.keys
10
12
 
11
13
  const displayColumnsIds = measures.map((col) => col.id)
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.26.0",
4
+ "version": "4.26.2",
5
5
  "main": "dpr/all.mjs",
6
6
  "sass": "dpr/all.scss",
7
7
  "engines": {