@ministryofjustice/hmpps-digital-prison-reporting-frontend 3.3.1 → 3.3.3

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.
@@ -11,6 +11,6 @@ exports.default = {
11
11
  });
12
12
  },
13
13
  getSelectedColumns: (columns, queryCols) => {
14
- return columns.filter((column) => column.disabled || queryCols.includes(column.value)).map((field) => field.value);
14
+ return columns.filter((column) => column.mandatory || queryCols.includes(column.name)).map((field) => field.name);
15
15
  },
16
16
  };
@@ -1,5 +1,4 @@
1
1
  import { components } from '../../types/api'
2
- import { Column } from './types'
3
2
 
4
3
  export default {
5
4
  getColumns: (fields: Array<components['schemas']['FieldDefinition']>) => {
@@ -12,7 +11,7 @@ export default {
12
11
  })
13
12
  },
14
13
 
15
- getSelectedColumns: (columns: Column[], queryCols: string[]) => {
16
- return columns.filter((column) => column.disabled || queryCols.includes(column.value)).map((field) => field.value)
14
+ getSelectedColumns: (columns: Array<components['schemas']['FieldDefinition']>, queryCols: string[]) => {
15
+ return columns.filter((column) => column.mandatory || queryCols.includes(column.name)).map((field) => field.name)
17
16
  },
18
17
  }
@@ -16,7 +16,7 @@ export interface DataTableOptions {
16
16
  head: Array<Header>
17
17
  rows: Array<Array<Cell>>
18
18
  count: number
19
- currentQueryParams: Dict<string>
19
+ currentQueryParams: Dict<string | Array<string>>
20
20
  classification: string
21
21
  printable?: boolean
22
22
  url: string
@@ -15,11 +15,11 @@ const mapDate = (isoDate) => {
15
15
  return `${day}/${month}/${year} ${hours}:${minutes}`;
16
16
  };
17
17
  exports.default = {
18
- mapHeader: (format, reportQuery, createUrlForParameters, selectedColumns) => {
18
+ mapHeader: (format, reportQuery, createUrlForParameters) => {
19
19
  const currentQueryParams = reportQuery.toRecordWithFilterPrefix();
20
20
  return format
21
21
  .filter((f) => {
22
- return selectedColumns.includes(f.name);
22
+ return reportQuery.columns.includes(f.name);
23
23
  })
24
24
  .map((f) => {
25
25
  let header;
@@ -22,14 +22,16 @@ export default {
22
22
  mapHeader: (
23
23
  format: Array<components['schemas']['FieldDefinition']>,
24
24
  reportQuery: ReportQuery,
25
- createUrlForParameters: (currentQueryParams: Dict<string>, updateQueryParams: Dict<string>) => string,
26
- selectedColumns: Array<string>,
25
+ createUrlForParameters: (
26
+ currentQueryParams: Dict<string | Array<string>>,
27
+ updateQueryParams: Dict<string>,
28
+ ) => string,
27
29
  ) => {
28
30
  const currentQueryParams = reportQuery.toRecordWithFilterPrefix()
29
31
 
30
32
  return format
31
33
  .filter((f) => {
32
- return selectedColumns.includes(f.name)
34
+ return reportQuery.columns.includes(f.name)
33
35
  })
34
36
  .map((f) => {
35
37
  let header: Header
@@ -1,11 +1,5 @@
1
1
  import { FilterType } from './enum'
2
2
 
3
- export interface FilterDefinition {
4
- type: FilterType
5
- options?: Array<FilterOption>
6
- value?: string
7
- }
8
-
9
3
  export interface FilterOption {
10
4
  value: string
11
5
  text: string
@@ -23,7 +17,7 @@ export interface GenericFilterValue {
23
17
  dynamicResourceEndpoint?: string
24
18
  }
25
19
 
26
- export interface DateFilterValue extends FilterValue {
20
+ export interface DateFilterValue extends GenericFilterValue {
27
21
  type: FilterType.dateRange
28
22
  value?: DateRange
29
23
  min?: string
@@ -60,7 +60,10 @@ export default {
60
60
  getSelectedFilters: (
61
61
  format: Array<components['schemas']['FieldDefinition']>,
62
62
  reportQuery: ReportQuery,
63
- createUrlForParameters: (currentQueryParams: Dict<string>, updateQueryParams: Dict<string>) => string,
63
+ createUrlForParameters: (
64
+ currentQueryParams: Dict<string | Array<string>>,
65
+ updateQueryParams: Dict<string>,
66
+ ) => string,
64
67
  ) =>
65
68
  format
66
69
  .filter((f) => f.filter)
@@ -10,7 +10,6 @@ const utils_2 = __importDefault(require("../filters/utils"));
10
10
  const utils_3 = __importDefault(require("../columns/utils"));
11
11
  const reportingClient_1 = __importDefault(require("../../data/reportingClient"));
12
12
  const filtersQueryParameterPrefix = 'filters.';
13
- const columnsQueryParameterPrefix = 'columns';
14
13
  function getDefaultSortColumn(fields) {
15
14
  var _a;
16
15
  const defaultSortColumn = fields.find((f) => f.defaultsort);
@@ -42,7 +41,7 @@ function redirectWithDefaultFilters(reportQuery, variantDefinition, response, re
42
41
  });
43
42
  }
44
43
  if (Object.keys(defaultFilters).length > 0) {
45
- const querystring = (0, urlHelper_1.default)(reportQuery.toRecordWithFilterPrefix(), defaultFilters, reportQuery.columns);
44
+ const querystring = (0, urlHelper_1.default)(reportQuery.toRecordWithFilterPrefix(), defaultFilters);
46
45
  response.redirect(`${request.baseUrl}${request.path}${querystring}`);
47
46
  return true;
48
47
  }
@@ -65,15 +64,13 @@ function renderList(listData, variantDefinition, reportQuery, request, response,
65
64
  // eslint-disable-next-line prefer-destructuring
66
65
  data = resolvedData[0];
67
66
  }
68
- const columns = utils_3.default.getColumns(fields);
69
- const selectedColumns = utils_3.default.getSelectedColumns(columns, reportQuery.columns);
70
67
  const columnOptions = {
71
- columns,
72
- selectedColumns,
68
+ columns: utils_3.default.getColumns(fields),
69
+ selectedColumns: reportQuery.columns,
73
70
  };
74
71
  const dataTableOptions = {
75
- head: utils_1.default.mapHeader(fields, reportQuery, urlHelper_1.default, selectedColumns),
76
- rows: utils_1.default.mapData(data, fields, selectedColumns),
72
+ head: utils_1.default.mapHeader(fields, reportQuery, urlHelper_1.default),
73
+ rows: utils_1.default.mapData(data, fields, reportQuery.columns),
77
74
  count: resolvedData[1],
78
75
  currentQueryParams: reportQuery.toRecordWithFilterPrefix(),
79
76
  classification,
@@ -109,7 +106,7 @@ const renderListWithDefinition = ({ title, definitionName, variantName, request,
109
106
  .then((reportDefinition) => {
110
107
  const reportName = reportDefinition.name;
111
108
  const variantDefinition = reportDefinition.variant;
112
- const reportQuery = new ReportQuery_1.default(variantDefinition.specification.fields, request.query, getDefaultSortColumn(variantDefinition.specification.fields), filtersQueryParameterPrefix, columnsQueryParameterPrefix);
109
+ const reportQuery = new ReportQuery_1.default(variantDefinition.specification.fields, request.query, getDefaultSortColumn(variantDefinition.specification.fields), filtersQueryParameterPrefix);
113
110
  const getListData = {
114
111
  data: reportingClient.getListWithWarnings(variantDefinition.resourceName, token, reportQuery),
115
112
  count: reportingClient.getCount(variantDefinition.resourceName, token, reportQuery),
@@ -124,7 +121,7 @@ exports.default = {
124
121
  filtersQueryParameterPrefix,
125
122
  renderListWithData: ({ title, variantDefinition, request, response, next, getListDataSources, otherOptions, layoutTemplate, dynamicAutocompleteEndpoint, }) => {
126
123
  const { fields } = variantDefinition.specification;
127
- const reportQuery = new ReportQuery_1.default(fields, request.query, getDefaultSortColumn(fields), filtersQueryParameterPrefix, columnsQueryParameterPrefix);
124
+ const reportQuery = new ReportQuery_1.default(fields, request.query, getDefaultSortColumn(fields), filtersQueryParameterPrefix);
128
125
  const listData = getListDataSources(reportQuery);
129
126
  renderList(listData, variantDefinition, reportQuery, request, response, next, title, layoutTemplate, dynamicAutocompleteEndpoint, otherOptions);
130
127
  },
@@ -14,7 +14,6 @@ import RenderListWithDefinitionInput from './RenderListWithDefinitionInput'
14
14
  import CreateRequestHandlerInput from './CreateRequestHandlerInput'
15
15
 
16
16
  const filtersQueryParameterPrefix = 'filters.'
17
- const columnsQueryParameterPrefix = 'columns'
18
17
 
19
18
  function getDefaultSortColumn(fields: components['schemas']['FieldDefinition'][]) {
20
19
  const defaultSortColumn = fields.find((f) => f.defaultsort)
@@ -62,11 +61,7 @@ function redirectWithDefaultFilters(
62
61
  }
63
62
 
64
63
  if (Object.keys(defaultFilters).length > 0) {
65
- const querystring = createUrlForParameters(
66
- reportQuery.toRecordWithFilterPrefix(),
67
- defaultFilters,
68
- reportQuery.columns,
69
- )
64
+ const querystring = createUrlForParameters(reportQuery.toRecordWithFilterPrefix(), defaultFilters)
70
65
  response.redirect(`${request.baseUrl}${request.path}${querystring}`)
71
66
  return true
72
67
  }
@@ -103,16 +98,14 @@ function renderList(
103
98
  data = resolvedData[0]
104
99
  }
105
100
 
106
- const columns = ColumnUtils.getColumns(fields)
107
- const selectedColumns = ColumnUtils.getSelectedColumns(columns, reportQuery.columns)
108
101
  const columnOptions = {
109
- columns,
110
- selectedColumns,
102
+ columns: ColumnUtils.getColumns(fields),
103
+ selectedColumns: reportQuery.columns,
111
104
  }
112
105
 
113
106
  const dataTableOptions: DataTableOptions = {
114
- head: DataTableUtils.mapHeader(fields, reportQuery, createUrlForParameters, selectedColumns),
115
- rows: DataTableUtils.mapData(data, fields, selectedColumns),
107
+ head: DataTableUtils.mapHeader(fields, reportQuery, createUrlForParameters),
108
+ rows: DataTableUtils.mapData(data, fields, reportQuery.columns),
116
109
  count: resolvedData[1],
117
110
  currentQueryParams: reportQuery.toRecordWithFilterPrefix(),
118
111
  classification,
@@ -171,7 +164,6 @@ const renderListWithDefinition = ({
171
164
  request.query,
172
165
  getDefaultSortColumn(variantDefinition.specification.fields),
173
166
  filtersQueryParameterPrefix,
174
- columnsQueryParameterPrefix,
175
167
  )
176
168
 
177
169
  const getListData: ListDataSources = {
@@ -216,7 +208,6 @@ export default {
216
208
  request.query,
217
209
  getDefaultSortColumn(fields),
218
210
  filtersQueryParameterPrefix,
219
- columnsQueryParameterPrefix,
220
211
  )
221
212
  const listData = getListDataSources(reportQuery)
222
213
 
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  const urlHelper_1 = require("../utils/urlHelper");
7
+ const utils_1 = __importDefault(require("../components/columns/utils"));
4
8
  class ReportQuery {
5
- constructor(fields, queryParams, defaultSortColumn, filtersPrefix, columnsPrefix) {
9
+ constructor(fields, queryParams, defaultSortColumn, filtersPrefix) {
6
10
  this.selectedPage = queryParams.selectedPage ? Number(queryParams.selectedPage) : 1;
7
11
  this.pageSize = queryParams.pageSize ? Number(queryParams.pageSize) : 20;
8
12
  this.sortColumn = queryParams.sortColumn ? queryParams.sortColumn.toString() : defaultSortColumn;
@@ -11,9 +15,9 @@ class ReportQuery {
11
15
  ? queryParams.dataProductDefinitionsPath.toString()
12
16
  : null;
13
17
  this.filtersPrefix = filtersPrefix;
14
- this.columnsPrefix = columnsPrefix;
15
18
  if (queryParams.columns) {
16
- this.columns = typeof queryParams.columns === 'string' ? [queryParams.columns] : queryParams.columns;
19
+ const columns = typeof queryParams.columns === 'string' ? queryParams.columns.split(',') : queryParams.columns;
20
+ this.columns = utils_1.default.getSelectedColumns(fields, columns);
17
21
  }
18
22
  else {
19
23
  this.columns = fields.map((f) => f.name);
@@ -32,6 +36,7 @@ class ReportQuery {
32
36
  pageSize: this.pageSize.toString(),
33
37
  sortColumn: this.sortColumn,
34
38
  sortedAsc: this.sortedAsc.toString(),
39
+ columns: this.columns,
35
40
  };
36
41
  if (this.dataProductDefinitionsPath) {
37
42
  record.dataProductDefinitionsPath = this.dataProductDefinitionsPath;
@@ -3,6 +3,7 @@ import { FilteredListRequest } from './index'
3
3
  import Dict = NodeJS.Dict
4
4
  import { components } from './api'
5
5
  import { clearFilterValue } from '../utils/urlHelper'
6
+ import ColumnUtils from '../components/columns/utils'
6
7
 
7
8
  export default class ReportQuery implements FilteredListRequest {
8
9
  selectedPage: number
@@ -19,8 +20,6 @@ export default class ReportQuery implements FilteredListRequest {
19
20
 
20
21
  filtersPrefix: string
21
22
 
22
- columnsPrefix: string
23
-
24
23
  dataProductDefinitionsPath?: string
25
24
 
26
25
  constructor(
@@ -28,7 +27,6 @@ export default class ReportQuery implements FilteredListRequest {
28
27
  queryParams: ParsedQs,
29
28
  defaultSortColumn: string,
30
29
  filtersPrefix: string,
31
- columnsPrefix: string,
32
30
  ) {
33
31
  this.selectedPage = queryParams.selectedPage ? Number(queryParams.selectedPage) : 1
34
32
  this.pageSize = queryParams.pageSize ? Number(queryParams.pageSize) : 20
@@ -38,10 +36,11 @@ export default class ReportQuery implements FilteredListRequest {
38
36
  ? queryParams.dataProductDefinitionsPath.toString()
39
37
  : null
40
38
  this.filtersPrefix = filtersPrefix
41
- this.columnsPrefix = columnsPrefix
42
39
 
43
40
  if (queryParams.columns) {
44
- this.columns = typeof queryParams.columns === 'string' ? [queryParams.columns] : (queryParams.columns as string[])
41
+ const columns =
42
+ typeof queryParams.columns === 'string' ? queryParams.columns.split(',') : (queryParams.columns as string[])
43
+ this.columns = ColumnUtils.getSelectedColumns(fields, columns)
45
44
  } else {
46
45
  this.columns = fields.map((f) => f.name)
47
46
  }
@@ -56,12 +55,13 @@ export default class ReportQuery implements FilteredListRequest {
56
55
  })
57
56
  }
58
57
 
59
- toRecordWithFilterPrefix(removeClearedFilters = false): Record<string, string> {
60
- const record: Record<string, string> = {
58
+ toRecordWithFilterPrefix(removeClearedFilters = false): Record<string, string | Array<string>> {
59
+ const record: Record<string, string | Array<string>> = {
61
60
  selectedPage: this.selectedPage.toString(),
62
61
  pageSize: this.pageSize.toString(),
63
62
  sortColumn: this.sortColumn,
64
63
  sortedAsc: this.sortedAsc.toString(),
64
+ columns: this.columns,
65
65
  }
66
66
 
67
67
  if (this.dataProductDefinitionsPath) {
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createQuerystringFromObject = exports.clearFilterValue = void 0;
4
4
  exports.clearFilterValue = '~clear~';
5
- const createUrlForParameters = (currentQueryParams, updateQueryParams, columns = []) => {
5
+ const createUrlForParameters = (currentQueryParams, updateQueryParams) => {
6
6
  let queryParams;
7
7
  if (updateQueryParams) {
8
8
  queryParams = {
@@ -20,11 +20,6 @@ const createUrlForParameters = (currentQueryParams, updateQueryParams, columns =
20
20
  });
21
21
  }
22
22
  });
23
- if (columns.length) {
24
- columns.forEach((col) => {
25
- queryParams[`columns.${col}`] = col;
26
- });
27
- }
28
23
  }
29
24
  else {
30
25
  queryParams = {
@@ -45,13 +40,7 @@ const createUrlForParameters = (currentQueryParams, updateQueryParams, columns =
45
40
  };
46
41
  const createQuerystringFromObject = (source) => {
47
42
  const querystring = Object.keys(source)
48
- .map((key) => {
49
- let k = key;
50
- // eslint-disable-next-line prefer-destructuring
51
- if (key.includes('columns.'))
52
- k = key.split('.')[0];
53
- return `${encodeURI(k)}=${encodeURI(source[key])}`;
54
- })
43
+ .map((key) => `${encodeURI(key)}=${encodeURI(source[key])}`)
55
44
  .join('&');
56
45
  return `?${querystring}`;
57
46
  };
@@ -1,11 +1,10 @@
1
1
  export const clearFilterValue = '~clear~'
2
2
 
3
3
  const createUrlForParameters = (
4
- currentQueryParams: NodeJS.Dict<string>,
4
+ currentQueryParams: NodeJS.Dict<string | Array<string>>,
5
5
  updateQueryParams: NodeJS.Dict<string>,
6
- columns: Array<string> = [],
7
6
  ) => {
8
- let queryParams: NodeJS.Dict<string>
7
+ let queryParams: NodeJS.Dict<string | Array<string>>
9
8
 
10
9
  if (updateQueryParams) {
11
10
  queryParams = {
@@ -23,12 +22,6 @@ const createUrlForParameters = (
23
22
  })
24
23
  }
25
24
  })
26
-
27
- if (columns.length) {
28
- columns.forEach((col) => {
29
- queryParams[`columns.${col}`] = col
30
- })
31
- }
32
25
  } else {
33
26
  queryParams = {
34
27
  selectedPage: '1',
@@ -39,7 +32,7 @@ const createUrlForParameters = (
39
32
  }
40
33
  }
41
34
 
42
- const nonEmptyQueryParams: NodeJS.Dict<string> = {}
35
+ const nonEmptyQueryParams: NodeJS.Dict<string | Array<string>> = {}
43
36
 
44
37
  Object.keys(queryParams)
45
38
  .filter((key) => queryParams[key])
@@ -52,12 +45,7 @@ const createUrlForParameters = (
52
45
 
53
46
  export const createQuerystringFromObject = (source: object) => {
54
47
  const querystring = Object.keys(source)
55
- .map((key) => {
56
- let k = key
57
- // eslint-disable-next-line prefer-destructuring
58
- if (key.includes('columns.')) k = key.split('.')[0]
59
- return `${encodeURI(k)}=${encodeURI(source[key as keyof typeof source])}`
60
- })
48
+ .map((key) => `${encodeURI(key)}=${encodeURI(source[key])}`)
61
49
  .join('&')
62
50
 
63
51
  return `?${querystring}`
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": "3.3.1",
4
+ "version": "3.3.3",
5
5
  "main": "dpr/assets/js/all.mjs",
6
6
  "sass": "dpr/all.scss",
7
7
  "engines": {
package/package.zip CHANGED
Binary file