@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.26.1 → 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
  }
@@ -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 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": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,EAAA,gCAAAC,EAAA,YAAAC,IAAA,eAAAC,EAAAL,GACA,IAAAM,EAA2B,0DAI3BC,EAAyB,0CACzBC,EAA4B,6CAC5BC,EAAuB,mDACvBC,EAAyB,qEAElB,MAAMP,EAA8B,MACzCQ,EACAC,EACAC,EACAC,IACG,CACH,KAAM,CAAE,SAAAC,EAAU,GAAAC,CAAG,EAAIL,EAAI,OACvB,CAAE,MAAAM,EAAO,gBAAAC,CAAgB,EAAI,EAAAC,QAAa,UAAUP,CAAG,EAKvDQ,GADJ,MAAMP,EAAS,iBAAiB,cAAcI,EAAOF,EAAUC,EAAIE,CAAe,GAC1D,QAAQ,eAAe,QAAU,CAAC,EAE5D,OAAOG,EAAsBV,EAAKC,EAAKC,EAAUC,EAAWM,CAAM,CACpE,EAEalB,EAAiC,MAC5CS,EACAC,EACAC,EACAC,IACG,CACH,KAAM,CAAE,SAAAC,EAAU,GAAAC,CAAG,EAAIL,EAAI,OACvB,CAAE,MAAAM,EAAO,gBAAAC,CAAgB,EAAI,EAAAC,QAAa,UAAUP,CAAG,EASvDQ,GAN2D,MAAMP,EAAS,iBAAiB,cAC/FI,EACAF,EACAC,EACAE,CACF,GAC0B,cAAgB,CAAC,EAE3C,OAAOG,EAAsBV,EAAKC,EAAKC,EAAUC,EAAWM,CAAM,CACpE,EAEMC,EAAwB,MAC5BV,EACAC,EACAC,EACAC,EACAM,IACG,CACH,KAAM,CAAE,QAAAE,EAAS,GAAAN,CAAG,EAAIL,EAAI,OACtB,CAAE,QAAAY,CAAQ,EAAI,EAAAJ,QAAa,UAAUP,CAAG,EAG9C,IAAIY,EACAF,EAEFE,EAAkB,MAAMX,EAAS,uBAAuB,mBAAmBS,EAASC,EAAQ,EAAE,EAG9FC,EAAkB,MAAMX,EAAS,uBAAuB,cAAcG,EAAIO,EAAQ,EAAE,EAItF,MAAME,EAAuBD,GAAiB,kBAAkB,KAE1DE,EAAiBD,GAAuB,eACxCE,EAAWF,GAAuB,SAClCG,EAAed,IAAc,UAAYW,GAAuB,aAAkB,EAClFI,EAAaJ,GAAuB,WACpCK,EAAYL,GAAuB,UAEzC,IAAIM,EAAU,CAAC,EACXN,IACFM,EAAU,OAAO,KAAKN,CAAoB,EACvC,OAAQO,GAAQA,EAAI,SAAS,UAAU,CAAC,EACxC,OAAO,CAACC,EAAKD,KAAS,CAAE,GAAGC,EAAK,CAACD,CAAG,EAAGP,EAAqBO,CAAG,CAAE,GAAI,CAAC,CAAC,GAI5E,IAAIE,EAA8C,CAChD,GAAIR,GAAkB,CAAE,eAAAA,CAAe,EACvC,GAAIE,GAAgB,CAAE,aAAAA,CAAa,EACnC,GAAID,GAAY,CAAE,SAAAA,CAAS,EAC3B,GAAIE,GAAc,CAAE,WAAAA,CAAW,EAC/B,GAAIC,GAAa,CAAE,UAAAA,CAAU,EAC7B,GAAGnB,EAAI,IACT,EAEA,GAAIG,IAAc,UAAW,CAC3B,KAAM,CAAE,QAAAqB,CAAQ,EAAIxB,EAAI,KAClByB,EAAgB,EAAAC,QAAa,iBAAiBjB,CAAM,EAE1D,IAAIkB,EAAc,CAAC,EACfH,IACFG,EAAc,MAAM,QAAQH,CAAO,EAAIA,EAAU,CAACA,CAAO,GAE3D,MAAMI,EAAc,CAAC,GAAGH,EAAe,GAAGE,CAAW,EACrDJ,EAAW,CAAE,GAAGA,EAAU,QAASK,EAAa,GAAGR,CAAQ,CAC7D,KAAO,CACL,MAAMI,EAAUV,GAAuB,SAAc,CAAC,EACtDS,EAAW,CAAE,GAAGA,EAAU,QAAAC,CAAQ,CACpC,CAGA,MAAMK,EAAgBC,EAA8B,CAClD,SAAAP,EACA,OAAAd,CACF,CAAC,EAGDR,EAAI,SAAS,GAAGD,EAAI,OAAO,IAAI6B,CAAa,EAAE,CAChD,EAEMC,EAAgC,CAAC,CACrC,SAAAP,EACA,OAAAd,CACF,IAGM,CAEJ,MAAMsB,EAAS,IAAI,gBACnB,OAAO,KAAKR,CAAQ,EAAE,QAASF,GAAQ,CACrC,MAAMW,EAAQT,EAASF,CAAG,EAE1B,GAAIW,GAASX,IAAQ,QAAS,CAC5B,MAAMY,EAAUZ,EAAI,MAAM,GAAG,EAAE,CAAC,EAChC,GAAIY,EAAS,CACX,MAAMC,EAAS,EAAAC,QAAgB,UAAU1B,EAAQwB,CAAO,EACxD,GAAIC,EAAQ,CACV,KAAM,CAAE,KAAME,CAAW,EAAIF,EAC7B,OAAQE,EAAW,kBAAkB,EAAG,CAEtC,KAAK,aAAW,KAAK,kBAAkB,EACvC,KAAK,aAAW,UAAU,kBAAkB,EAC5C,KAAK,aAAW,kBAAkB,kBAAkB,EAClD,CACE,IAAIC,EAA4BL,EAChC,MAAMM,EAAa,IAAI,EAAAC,QACGD,EAAW,YAAYD,CAAS,IAChC,SACxBA,EAAYC,EAAW,aAAaD,EAAW,KAAK,GAAK,IAEvDA,GACFN,EAAO,OAAOV,EAAKgB,CAAS,CAEhC,CACA,MAGF,KAAK,aAAW,YAAY,kBAAkB,EACxC,MAAM,QAAQL,CAAK,EACcA,EAClB,QAASQ,GAAc,CACtCT,EAAO,OAAOV,EAAKmB,CAAC,CACtB,CAAC,EAEDT,EAAO,OAAOV,EAAaW,CAAK,EAElC,MAGF,QACED,EAAO,OAAOV,EAAaW,CAAK,EAChC,KACJ,CACF,CACF,MAAW,MAAM,QAAQA,CAAK,EAC5BA,EAAM,QAASQ,GAAc,CAC3BT,EAAO,OAAOV,EAAKmB,CAAC,CACtB,CAAC,EAEDT,EAAO,OAAOV,EAAKW,CAAK,CAE5B,CACF,CAAC,EAED,MAAMS,EAAiBV,EAAO,SAAS,EACvC,OAAO,mBAAmBU,CAAc,CAC1C,EAEA,IAAOhD,EAAQ,CACb,+BAAAF,EACA,4BAAAC,CACF",
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
 
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.1",
4
+ "version": "4.26.2",
5
5
  "main": "dpr/all.mjs",
6
6
  "sass": "dpr/all.scss",
7
7
  "engines": {