@ministryofjustice/hmpps-digital-prison-reporting-frontend 6.2.2 → 6.2.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.
|
@@ -55,19 +55,26 @@ class ReportQuery {
|
|
|
55
55
|
const filterName = key.replace(this.filtersPrefix, '');
|
|
56
56
|
const p = queryParams[key];
|
|
57
57
|
let value = p ? p.toString() : '';
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
58
|
+
// Extract base field name
|
|
59
|
+
const baseFieldName = filterName.split('.')[0];
|
|
60
|
+
const field = fields.find((f) => f.name === baseFieldName);
|
|
61
|
+
if (!field?.filter)
|
|
62
|
+
return;
|
|
63
|
+
const { type, staticOptions } = field.filter;
|
|
64
|
+
// Drop relative-duration for daterange types
|
|
65
|
+
if ((type === 'daterange' || type === 'granulardaterange') && filterName.endsWith('relative-duration')) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Select / radio / multiselect validation
|
|
69
|
+
if (type.toLowerCase() === 'radio' || type.toLowerCase() === 'select' || type === 'multiselect') {
|
|
70
|
+
const validated = this.validateSelectFilterValue(p, type, staticOptions);
|
|
71
|
+
if (!validated)
|
|
72
|
+
return;
|
|
73
|
+
value = validated;
|
|
67
74
|
}
|
|
68
75
|
// Handle Date types
|
|
69
|
-
if (field
|
|
70
|
-
const { min, max
|
|
76
|
+
if (field.type === 'date') {
|
|
77
|
+
const { min, max } = field.filter;
|
|
71
78
|
if (type === 'daterange' || type === 'granulardaterange') {
|
|
72
79
|
if (min && filterName.endsWith('.start')) {
|
|
73
80
|
if (new Date(value) < new Date(min))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReportQuery.js","sources":["../../../../../../../../../src/dpr/types/ReportQuery.ts"],"sourcesContent":["import type { ParsedQs } from 'qs'\nimport { FilteredListRequest } from './index'\nimport Dict = NodeJS.Dict\nimport { components } from './api'\nimport { clearFilterValue } from '../utils/urlHelper'\nimport ColumnUtils from '../components/_reports/report-heading/report-columns/report-columns-form/utils'\nimport { Template } from './Templates'\nimport { ReportType } from './UserReports'\nimport logger from '../utils/logger'\n\nexport const DEFAULT_FILTERS_PREFIX = 'filters.'\n\nclass ReportQuery implements FilteredListRequest {\n selectedPage: number\n\n pageSize: number\n\n sortColumn?: string | undefined\n\n columns: Array<string>\n\n sortedAsc: boolean\n\n filters: Dict<string>\n\n filtersPrefix: string\n\n dataProductDefinitionsPath?: string | undefined\n\n constructor({\n fields,\n template,\n queryParams,\n definitionsPath,\n filtersPrefix = DEFAULT_FILTERS_PREFIX,\n reportType,\n }: {\n fields: components['schemas']['FieldDefinition'][]\n template?: Template\n queryParams: ParsedQs\n definitionsPath?: string\n filtersPrefix?: string\n reportType?: ReportType\n }) {\n this.selectedPage = queryParams['selectedPage'] ? Number(queryParams['selectedPage']) : 1\n this.pageSize = this.getPageSize(queryParams, template, reportType)\n\n this.sortColumn = queryParams['sortColumn']\n ? queryParams['sortColumn'].toString()\n : this.getDefaultSortColumn(fields)\n\n this.sortedAsc =\n queryParams['sortedAsc'] !== undefined\n ? queryParams['sortedAsc'] !== 'false'\n : this.getDefaultSortDirection(fields)\n\n this.dataProductDefinitionsPath =\n definitionsPath ??\n (queryParams['dataProductDefinitionsPath'] ? queryParams['dataProductDefinitionsPath'].toString() : undefined)\n\n this.filtersPrefix = filtersPrefix\n\n this.columns = this.setColumns(queryParams, fields)\n\n this.filters = {}\n\n this.setAndTrimFiltersFromQuery(queryParams, fields)\n\n this.handleUnsetDateTypeDefaultsAndBounds(fields)\n }\n\n /**\n * Set the filers from the query params\n * - trims the start/end dates to min/max\n * - removes no-filter options\n *\n * @private\n * @param {ParsedQs} queryParams\n * @param {string} [min]\n * @param {string} [max]\n * @memberof ReportQuery\n */\n private setAndTrimFiltersFromQuery(queryParams: ParsedQs, fields: components['schemas']['FieldDefinition'][]) {\n Object.keys(queryParams)\n .filter((key) => key.startsWith(this.filtersPrefix))\n .filter((key) => queryParams[key])\n .forEach((key) => {\n const filterName = key.replace(this.filtersPrefix, '')\n const p = queryParams[key]\n let value = p ? p.toString() : ''\n\n const field = fields.find((f) => f.name === filterName)\n\n if (field?.filter) {\n const { type, staticOptions } = field.filter\n\n if (type.toLowerCase() === 'radio' || type.toLowerCase() === 'Select' || type === 'multiselect') {\n const validated = this.validateSelectFilterValue(p, type, staticOptions)\n if (!validated) return // skip invalid values\n\n value = validated\n }\n }\n\n // Handle Date types\n if (field?.type === 'date' && field.filter) {\n const { min, max, type } = field.filter\n\n if (type === 'daterange' || type === 'granulardaterange') {\n if (min && filterName.endsWith('.start')) {\n if (new Date(value) < new Date(min)) value = min\n }\n\n if (max && filterName.endsWith('.end')) {\n if (new Date(value) > new Date(max)) value = max\n }\n }\n\n if (type === 'date') {\n if (min && new Date(value) < new Date(min)) {\n value = min\n }\n\n if (max && new Date(value) > new Date(max)) {\n value = max\n }\n }\n }\n\n // Handle no filter values (select, radio)\n if (value !== 'no-filter') {\n this.filters[filterName] = value\n }\n })\n }\n\n /**\n * Validates that all staticOption values are correct\n *\n * - checks/validates value against the staticOptions in the filter definition\n * - if not present then it is dropped from the query,\n * - and logged\n *\n * @private\n * @param {unknown} rawValue\n * @param {string} type\n * @param {components['schemas']['FilterDefinition']['staticOptions']} [staticOptions]\n * @param {string} [fieldName]\n * @return {*} {(string | undefined)}\n * @memberof ReportQuery\n */\n private validateSelectFilterValue(\n rawValue: unknown,\n type: string,\n staticOptions?: components['schemas']['FilterDefinition']['staticOptions'],\n fieldName?: string,\n ): string | undefined {\n if (!staticOptions || !rawValue) return undefined\n\n const validValues = staticOptions.map((o) => o.name.toLowerCase())\n\n // Normalize input - array of strings\n const values = Array.isArray(rawValue)\n ? rawValue.map((v) => v.toString().toLowerCase())\n : rawValue\n .toString()\n .split(',')\n .map((v) => v.trim().toLowerCase())\n\n if (type === 'multiselect') {\n const invalidValues = values.filter((v) => !validValues.includes(v))\n const filtered = [...new Set(values.filter((v) => validValues.includes(v)))]\n\n if (invalidValues.length > 0) {\n logger.warn(`Invalid filter values removed for multiselect: ${fieldName}: [${invalidValues.join(', ')}]`)\n }\n\n if (filtered.length === 0) return undefined\n\n return filtered.join(',')\n }\n\n // radio / select (single value)\n const value = values[0]\n\n if (!validValues.includes(value)) {\n logger.warn(`Invalid filter value: ${fieldName}: ${value}`)\n return undefined\n }\n\n return value\n }\n\n /**\n * Handles the setting of default values for date type filters\n * when no user input value has been applied\n *\n * - if min/max bounds in definition we ensure the date in within bounds\n * before being sent to the API\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @memberof ReportQuery\n */\n private handleUnsetDateTypeDefaultsAndBounds(fields: components['schemas']['FieldDefinition'][]) {\n const dateFields: components['schemas']['FieldDefinition'][] | undefined = fields.filter((f) => {\n return (\n (f.type === 'date' && f.filter && f.filter.type === 'daterange') ||\n (f.type === 'date' && f.filter && f.filter.type === 'date') ||\n (f.type === 'date' && f.filter && f.filter.type === 'granulardaterange')\n )\n })\n\n dateFields.forEach((df) => {\n if (df.filter) {\n const min = df.filter.min ?? undefined\n const max = df.filter.max ?? undefined\n\n this.setDefaultBoundsOnUnsetDatefields(df, df.filter, min, max)\n }\n })\n }\n\n /**\n * Set the default value for date filters where min/max is provided\n *\n * - If min / max exist and the user hasn’t already provided date bounds in the request,\n * - the code injects them as defaults so the filtering stays within those bounds.\n *\n * @private\n * @memberof ReportQuery\n */\n private setDefaultBoundsOnUnsetDatefields(\n dateField: components['schemas']['FieldDefinition'],\n dateFieldFilter: components['schemas']['FilterDefinition'],\n min?: string,\n max?: string,\n ) {\n const existingKeys = Object.keys(this.filters)\n\n const baseKey = dateField.name\n const startKey = `${baseKey}.start`\n const endKey = `${baseKey}.end`\n\n if (dateFieldFilter.type === 'daterange' || dateFieldFilter.type === 'granulardaterange') {\n const hasStart = existingKeys.some((key) => key === startKey)\n const hasEnd = existingKeys.some((key) => key === endKey)\n\n if (min && !hasStart) {\n this.filters[startKey] = min\n }\n\n if (max && !hasEnd) {\n this.filters[endKey] = max\n }\n }\n\n if (dateFieldFilter.type === 'date') {\n // Any value for this field counts (base or dotted)\n const hasAnyValueForField = existingKeys.some((key) => key === baseKey || key.startsWith(`${baseKey}.`))\n\n if (!hasAnyValueForField) {\n const value = min ?? max\n if (value) {\n this.filters[baseKey] = value\n }\n }\n }\n }\n\n private setColumns(queryParams: ParsedQs, fields: components['schemas']['FieldDefinition'][]) {\n if (queryParams['columns']) {\n const columns =\n typeof queryParams['columns'] === 'string'\n ? queryParams['columns'].split(',')\n : (queryParams['columns'] as string[])\n\n return ColumnUtils.ensureMandatoryColumns(fields, columns)\n }\n\n return fields.filter((f) => f.visible).map((f) => f.name)\n }\n\n /**\n * Sets the default sort column\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultSortColumn(fields: components['schemas']['FieldDefinition'][]): string | undefined {\n const defaultSortColumn = fields.find((f) => f.defaultsort)\n return defaultSortColumn ? defaultSortColumn.name : fields.find((f) => f.sortable)?.name\n }\n\n /**\n * Gets the default sort direction\n * - Default if not set in DPD: ASC\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultSortDirection(fields: components['schemas']['FieldDefinition'][]) {\n const field = fields.find((f) => f.defaultsort)\n if (field) {\n return field.sortDirection ? field.sortDirection === 'asc' : true\n }\n return true\n }\n\n /**\n * Get the pagesize for the request\n * - from query, otherwise set meaningful default\n *\n * @param {ParsedQs} queryParams\n * @param {Template} [template]\n * @param {ReportType} [reportType]\n * @return {*} {number}\n * @memberof ReportQuery\n */\n getPageSize(queryParams: ParsedQs, template?: Template, reportType?: ReportType): number {\n let pageSize = 5000000\n if (!reportType || reportType === ReportType.REPORT) {\n if (queryParams['pageSize']) {\n pageSize = Number(queryParams['pageSize'])\n } else if (template) {\n pageSize = this.getDefaultPageSize(template)\n }\n }\n return pageSize\n }\n\n toRecordWithFilterPrefix(removeClearedFilters = false): Record<string, string | Array<string>> {\n const record: Record<string, string | Array<string>> = {\n selectedPage: this.selectedPage.toString(),\n ...(this.pageSize && { pageSize: this.pageSize.toString() }),\n ...(this.sortColumn && { sortColumn: this.sortColumn }),\n sortedAsc: this.sortedAsc.toString(),\n columns: this.columns,\n }\n\n if (this.dataProductDefinitionsPath) {\n record['dataProductDefinitionsPath'] = this.dataProductDefinitionsPath\n }\n\n Object.keys(this.filters).forEach((filterName) => {\n const value = this.filters[filterName]\n if ((value && !removeClearedFilters) || value !== clearFilterValue) {\n record[`${this.filtersPrefix}${filterName}`] = <string>value\n }\n })\n\n return record\n }\n\n /**\n * Gets a meaningful default pagesize for a request\n *\n * @private\n * @param {Template} template\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultPageSize(template: Template) {\n const maxResultsSize = 500000 // catch all rows\n const standardPage = 20 // smallest pagesize\n\n switch (template) {\n // These templates do no include pagination so return all rows\n case 'list-section':\n case 'summary-section':\n case 'row-section-child':\n case 'parent-child':\n case 'parent-child-section':\n return maxResultsSize\n\n default:\n return standardPage\n }\n }\n}\n\nexport { ReportQuery }\nexport default ReportQuery\n"],"names":["logger","ColumnUtils","ReportType","clearFilterValue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReportQuery.js","sources":["../../../../../../../../../src/dpr/types/ReportQuery.ts"],"sourcesContent":["import type { ParsedQs } from 'qs'\nimport { FilteredListRequest } from './index'\nimport Dict = NodeJS.Dict\nimport { components } from './api'\nimport { clearFilterValue } from '../utils/urlHelper'\nimport ColumnUtils from '../components/_reports/report-heading/report-columns/report-columns-form/utils'\nimport { Template } from './Templates'\nimport { ReportType } from './UserReports'\nimport logger from '../utils/logger'\n\nexport const DEFAULT_FILTERS_PREFIX = 'filters.'\n\nclass ReportQuery implements FilteredListRequest {\n selectedPage: number\n\n pageSize: number\n\n sortColumn?: string | undefined\n\n columns: Array<string>\n\n sortedAsc: boolean\n\n filters: Dict<string>\n\n filtersPrefix: string\n\n dataProductDefinitionsPath?: string | undefined\n\n constructor({\n fields,\n template,\n queryParams,\n definitionsPath,\n filtersPrefix = DEFAULT_FILTERS_PREFIX,\n reportType,\n }: {\n fields: components['schemas']['FieldDefinition'][]\n template?: Template\n queryParams: ParsedQs\n definitionsPath?: string\n filtersPrefix?: string\n reportType?: ReportType\n }) {\n this.selectedPage = queryParams['selectedPage'] ? Number(queryParams['selectedPage']) : 1\n this.pageSize = this.getPageSize(queryParams, template, reportType)\n\n this.sortColumn = queryParams['sortColumn']\n ? queryParams['sortColumn'].toString()\n : this.getDefaultSortColumn(fields)\n\n this.sortedAsc =\n queryParams['sortedAsc'] !== undefined\n ? queryParams['sortedAsc'] !== 'false'\n : this.getDefaultSortDirection(fields)\n\n this.dataProductDefinitionsPath =\n definitionsPath ??\n (queryParams['dataProductDefinitionsPath'] ? queryParams['dataProductDefinitionsPath'].toString() : undefined)\n\n this.filtersPrefix = filtersPrefix\n\n this.columns = this.setColumns(queryParams, fields)\n\n this.filters = {}\n\n this.setAndTrimFiltersFromQuery(queryParams, fields)\n\n this.handleUnsetDateTypeDefaultsAndBounds(fields)\n }\n\n /**\n * Set the filers from the query params\n * - trims the start/end dates to min/max\n * - removes no-filter options\n *\n * @private\n * @param {ParsedQs} queryParams\n * @param {string} [min]\n * @param {string} [max]\n * @memberof ReportQuery\n */\n private setAndTrimFiltersFromQuery(queryParams: ParsedQs, fields: components['schemas']['FieldDefinition'][]) {\n Object.keys(queryParams)\n .filter((key) => key.startsWith(this.filtersPrefix))\n .filter((key) => queryParams[key])\n .forEach((key) => {\n const filterName = key.replace(this.filtersPrefix, '')\n const p = queryParams[key]\n let value = p ? p.toString() : ''\n\n // Extract base field name\n const baseFieldName = filterName.split('.')[0]\n\n const field = fields.find((f) => f.name === baseFieldName)\n\n if (!field?.filter) return\n\n const { type, staticOptions } = field.filter\n\n // Drop relative-duration for daterange types\n if ((type === 'daterange' || type === 'granulardaterange') && filterName.endsWith('relative-duration')) {\n return\n }\n\n // Select / radio / multiselect validation\n if (type.toLowerCase() === 'radio' || type.toLowerCase() === 'select' || type === 'multiselect') {\n const validated = this.validateSelectFilterValue(p, type, staticOptions)\n if (!validated) return\n\n value = validated\n }\n\n // Handle Date types\n if (field.type === 'date') {\n const { min, max } = field.filter\n\n if (type === 'daterange' || type === 'granulardaterange') {\n if (min && filterName.endsWith('.start')) {\n if (new Date(value) < new Date(min)) value = min\n }\n\n if (max && filterName.endsWith('.end')) {\n if (new Date(value) > new Date(max)) value = max\n }\n }\n\n if (type === 'date') {\n if (min && new Date(value) < new Date(min)) {\n value = min\n }\n\n if (max && new Date(value) > new Date(max)) {\n value = max\n }\n }\n }\n\n // Handle no filter values (select, radio)\n if (value !== 'no-filter') {\n this.filters[filterName] = value\n }\n })\n }\n\n /**\n * Validates that all staticOption values are correct\n *\n * - checks/validates value against the staticOptions in the filter definition\n * - if not present then it is dropped from the query,\n * - and logged\n *\n * @private\n * @param {unknown} rawValue\n * @param {string} type\n * @param {components['schemas']['FilterDefinition']['staticOptions']} [staticOptions]\n * @param {string} [fieldName]\n * @return {*} {(string | undefined)}\n * @memberof ReportQuery\n */\n private validateSelectFilterValue(\n rawValue: unknown,\n type: string,\n staticOptions?: components['schemas']['FilterDefinition']['staticOptions'],\n fieldName?: string,\n ): string | undefined {\n if (!staticOptions || !rawValue) return undefined\n\n const validValues = staticOptions.map((o) => o.name.toLowerCase())\n\n // Normalize input - array of strings\n const values = Array.isArray(rawValue)\n ? rawValue.map((v) => v.toString().toLowerCase())\n : rawValue\n .toString()\n .split(',')\n .map((v) => v.trim().toLowerCase())\n\n if (type === 'multiselect') {\n const invalidValues = values.filter((v) => !validValues.includes(v))\n const filtered = [...new Set(values.filter((v) => validValues.includes(v)))]\n\n if (invalidValues.length > 0) {\n logger.warn(`Invalid filter values removed for multiselect: ${fieldName}: [${invalidValues.join(', ')}]`)\n }\n\n if (filtered.length === 0) return undefined\n\n return filtered.join(',')\n }\n\n // radio / select (single value)\n const value = values[0]\n\n if (!validValues.includes(value)) {\n logger.warn(`Invalid filter value: ${fieldName}: ${value}`)\n return undefined\n }\n\n return value\n }\n\n /**\n * Handles the setting of default values for date type filters\n * when no user input value has been applied\n *\n * - if min/max bounds in definition we ensure the date in within bounds\n * before being sent to the API\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @memberof ReportQuery\n */\n private handleUnsetDateTypeDefaultsAndBounds(fields: components['schemas']['FieldDefinition'][]) {\n const dateFields: components['schemas']['FieldDefinition'][] | undefined = fields.filter((f) => {\n return (\n (f.type === 'date' && f.filter && f.filter.type === 'daterange') ||\n (f.type === 'date' && f.filter && f.filter.type === 'date') ||\n (f.type === 'date' && f.filter && f.filter.type === 'granulardaterange')\n )\n })\n\n dateFields.forEach((df) => {\n if (df.filter) {\n const min = df.filter.min ?? undefined\n const max = df.filter.max ?? undefined\n\n this.setDefaultBoundsOnUnsetDatefields(df, df.filter, min, max)\n }\n })\n }\n\n /**\n * Set the default value for date filters where min/max is provided\n *\n * - If min / max exist and the user hasn’t already provided date bounds in the request,\n * - the code injects them as defaults so the filtering stays within those bounds.\n *\n * @private\n * @memberof ReportQuery\n */\n private setDefaultBoundsOnUnsetDatefields(\n dateField: components['schemas']['FieldDefinition'],\n dateFieldFilter: components['schemas']['FilterDefinition'],\n min?: string,\n max?: string,\n ) {\n const existingKeys = Object.keys(this.filters)\n\n const baseKey = dateField.name\n const startKey = `${baseKey}.start`\n const endKey = `${baseKey}.end`\n\n if (dateFieldFilter.type === 'daterange' || dateFieldFilter.type === 'granulardaterange') {\n const hasStart = existingKeys.some((key) => key === startKey)\n const hasEnd = existingKeys.some((key) => key === endKey)\n\n if (min && !hasStart) {\n this.filters[startKey] = min\n }\n\n if (max && !hasEnd) {\n this.filters[endKey] = max\n }\n }\n\n if (dateFieldFilter.type === 'date') {\n // Any value for this field counts (base or dotted)\n const hasAnyValueForField = existingKeys.some((key) => key === baseKey || key.startsWith(`${baseKey}.`))\n\n if (!hasAnyValueForField) {\n const value = min ?? max\n if (value) {\n this.filters[baseKey] = value\n }\n }\n }\n }\n\n private setColumns(queryParams: ParsedQs, fields: components['schemas']['FieldDefinition'][]) {\n if (queryParams['columns']) {\n const columns =\n typeof queryParams['columns'] === 'string'\n ? queryParams['columns'].split(',')\n : (queryParams['columns'] as string[])\n\n return ColumnUtils.ensureMandatoryColumns(fields, columns)\n }\n\n return fields.filter((f) => f.visible).map((f) => f.name)\n }\n\n /**\n * Sets the default sort column\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultSortColumn(fields: components['schemas']['FieldDefinition'][]): string | undefined {\n const defaultSortColumn = fields.find((f) => f.defaultsort)\n return defaultSortColumn ? defaultSortColumn.name : fields.find((f) => f.sortable)?.name\n }\n\n /**\n * Gets the default sort direction\n * - Default if not set in DPD: ASC\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultSortDirection(fields: components['schemas']['FieldDefinition'][]) {\n const field = fields.find((f) => f.defaultsort)\n if (field) {\n return field.sortDirection ? field.sortDirection === 'asc' : true\n }\n return true\n }\n\n /**\n * Get the pagesize for the request\n * - from query, otherwise set meaningful default\n *\n * @param {ParsedQs} queryParams\n * @param {Template} [template]\n * @param {ReportType} [reportType]\n * @return {*} {number}\n * @memberof ReportQuery\n */\n getPageSize(queryParams: ParsedQs, template?: Template, reportType?: ReportType): number {\n let pageSize = 5000000\n if (!reportType || reportType === ReportType.REPORT) {\n if (queryParams['pageSize']) {\n pageSize = Number(queryParams['pageSize'])\n } else if (template) {\n pageSize = this.getDefaultPageSize(template)\n }\n }\n return pageSize\n }\n\n toRecordWithFilterPrefix(removeClearedFilters = false): Record<string, string | Array<string>> {\n const record: Record<string, string | Array<string>> = {\n selectedPage: this.selectedPage.toString(),\n ...(this.pageSize && { pageSize: this.pageSize.toString() }),\n ...(this.sortColumn && { sortColumn: this.sortColumn }),\n sortedAsc: this.sortedAsc.toString(),\n columns: this.columns,\n }\n\n if (this.dataProductDefinitionsPath) {\n record['dataProductDefinitionsPath'] = this.dataProductDefinitionsPath\n }\n\n Object.keys(this.filters).forEach((filterName) => {\n const value = this.filters[filterName]\n if ((value && !removeClearedFilters) || value !== clearFilterValue) {\n record[`${this.filtersPrefix}${filterName}`] = <string>value\n }\n })\n\n return record\n }\n\n /**\n * Gets a meaningful default pagesize for a request\n *\n * @private\n * @param {Template} template\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultPageSize(template: Template) {\n const maxResultsSize = 500000 // catch all rows\n const standardPage = 20 // smallest pagesize\n\n switch (template) {\n // These templates do no include pagination so return all rows\n case 'list-section':\n case 'summary-section':\n case 'row-section-child':\n case 'parent-child':\n case 'parent-child-section':\n return maxResultsSize\n\n default:\n return standardPage\n }\n }\n}\n\nexport { ReportQuery }\nexport default ReportQuery\n"],"names":["logger","ColumnUtils","ReportType","clearFilterValue"],"mappings":"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"}
|
package/dpr/types/ReportQuery.js
CHANGED
|
@@ -51,19 +51,26 @@ class ReportQuery {
|
|
|
51
51
|
const filterName = key.replace(this.filtersPrefix, '');
|
|
52
52
|
const p = queryParams[key];
|
|
53
53
|
let value = p ? p.toString() : '';
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
54
|
+
// Extract base field name
|
|
55
|
+
const baseFieldName = filterName.split('.')[0];
|
|
56
|
+
const field = fields.find((f) => f.name === baseFieldName);
|
|
57
|
+
if (!field?.filter)
|
|
58
|
+
return;
|
|
59
|
+
const { type, staticOptions } = field.filter;
|
|
60
|
+
// Drop relative-duration for daterange types
|
|
61
|
+
if ((type === 'daterange' || type === 'granulardaterange') && filterName.endsWith('relative-duration')) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Select / radio / multiselect validation
|
|
65
|
+
if (type.toLowerCase() === 'radio' || type.toLowerCase() === 'select' || type === 'multiselect') {
|
|
66
|
+
const validated = this.validateSelectFilterValue(p, type, staticOptions);
|
|
67
|
+
if (!validated)
|
|
68
|
+
return;
|
|
69
|
+
value = validated;
|
|
63
70
|
}
|
|
64
71
|
// Handle Date types
|
|
65
|
-
if (field
|
|
66
|
-
const { min, max
|
|
72
|
+
if (field.type === 'date') {
|
|
73
|
+
const { min, max } = field.filter;
|
|
67
74
|
if (type === 'daterange' || type === 'granulardaterange') {
|
|
68
75
|
if (min && filterName.endsWith('.start')) {
|
|
69
76
|
if (new Date(value) < new Date(min))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReportQuery.js","sources":["../../../../../../../../src/dpr/types/ReportQuery.ts"],"sourcesContent":["import type { ParsedQs } from 'qs'\nimport { FilteredListRequest } from './index'\nimport Dict = NodeJS.Dict\nimport { components } from './api'\nimport { clearFilterValue } from '../utils/urlHelper'\nimport ColumnUtils from '../components/_reports/report-heading/report-columns/report-columns-form/utils'\nimport { Template } from './Templates'\nimport { ReportType } from './UserReports'\nimport logger from '../utils/logger'\n\nexport const DEFAULT_FILTERS_PREFIX = 'filters.'\n\nclass ReportQuery implements FilteredListRequest {\n selectedPage: number\n\n pageSize: number\n\n sortColumn?: string | undefined\n\n columns: Array<string>\n\n sortedAsc: boolean\n\n filters: Dict<string>\n\n filtersPrefix: string\n\n dataProductDefinitionsPath?: string | undefined\n\n constructor({\n fields,\n template,\n queryParams,\n definitionsPath,\n filtersPrefix = DEFAULT_FILTERS_PREFIX,\n reportType,\n }: {\n fields: components['schemas']['FieldDefinition'][]\n template?: Template\n queryParams: ParsedQs\n definitionsPath?: string\n filtersPrefix?: string\n reportType?: ReportType\n }) {\n this.selectedPage = queryParams['selectedPage'] ? Number(queryParams['selectedPage']) : 1\n this.pageSize = this.getPageSize(queryParams, template, reportType)\n\n this.sortColumn = queryParams['sortColumn']\n ? queryParams['sortColumn'].toString()\n : this.getDefaultSortColumn(fields)\n\n this.sortedAsc =\n queryParams['sortedAsc'] !== undefined\n ? queryParams['sortedAsc'] !== 'false'\n : this.getDefaultSortDirection(fields)\n\n this.dataProductDefinitionsPath =\n definitionsPath ??\n (queryParams['dataProductDefinitionsPath'] ? queryParams['dataProductDefinitionsPath'].toString() : undefined)\n\n this.filtersPrefix = filtersPrefix\n\n this.columns = this.setColumns(queryParams, fields)\n\n this.filters = {}\n\n this.setAndTrimFiltersFromQuery(queryParams, fields)\n\n this.handleUnsetDateTypeDefaultsAndBounds(fields)\n }\n\n /**\n * Set the filers from the query params\n * - trims the start/end dates to min/max\n * - removes no-filter options\n *\n * @private\n * @param {ParsedQs} queryParams\n * @param {string} [min]\n * @param {string} [max]\n * @memberof ReportQuery\n */\n private setAndTrimFiltersFromQuery(queryParams: ParsedQs, fields: components['schemas']['FieldDefinition'][]) {\n Object.keys(queryParams)\n .filter((key) => key.startsWith(this.filtersPrefix))\n .filter((key) => queryParams[key])\n .forEach((key) => {\n const filterName = key.replace(this.filtersPrefix, '')\n const p = queryParams[key]\n let value = p ? p.toString() : ''\n\n const field = fields.find((f) => f.name === filterName)\n\n if (field?.filter) {\n const { type, staticOptions } = field.filter\n\n if (type.toLowerCase() === 'radio' || type.toLowerCase() === 'Select' || type === 'multiselect') {\n const validated = this.validateSelectFilterValue(p, type, staticOptions)\n if (!validated) return // skip invalid values\n\n value = validated\n }\n }\n\n // Handle Date types\n if (field?.type === 'date' && field.filter) {\n const { min, max, type } = field.filter\n\n if (type === 'daterange' || type === 'granulardaterange') {\n if (min && filterName.endsWith('.start')) {\n if (new Date(value) < new Date(min)) value = min\n }\n\n if (max && filterName.endsWith('.end')) {\n if (new Date(value) > new Date(max)) value = max\n }\n }\n\n if (type === 'date') {\n if (min && new Date(value) < new Date(min)) {\n value = min\n }\n\n if (max && new Date(value) > new Date(max)) {\n value = max\n }\n }\n }\n\n // Handle no filter values (select, radio)\n if (value !== 'no-filter') {\n this.filters[filterName] = value\n }\n })\n }\n\n /**\n * Validates that all staticOption values are correct\n *\n * - checks/validates value against the staticOptions in the filter definition\n * - if not present then it is dropped from the query,\n * - and logged\n *\n * @private\n * @param {unknown} rawValue\n * @param {string} type\n * @param {components['schemas']['FilterDefinition']['staticOptions']} [staticOptions]\n * @param {string} [fieldName]\n * @return {*} {(string | undefined)}\n * @memberof ReportQuery\n */\n private validateSelectFilterValue(\n rawValue: unknown,\n type: string,\n staticOptions?: components['schemas']['FilterDefinition']['staticOptions'],\n fieldName?: string,\n ): string | undefined {\n if (!staticOptions || !rawValue) return undefined\n\n const validValues = staticOptions.map((o) => o.name.toLowerCase())\n\n // Normalize input - array of strings\n const values = Array.isArray(rawValue)\n ? rawValue.map((v) => v.toString().toLowerCase())\n : rawValue\n .toString()\n .split(',')\n .map((v) => v.trim().toLowerCase())\n\n if (type === 'multiselect') {\n const invalidValues = values.filter((v) => !validValues.includes(v))\n const filtered = [...new Set(values.filter((v) => validValues.includes(v)))]\n\n if (invalidValues.length > 0) {\n logger.warn(`Invalid filter values removed for multiselect: ${fieldName}: [${invalidValues.join(', ')}]`)\n }\n\n if (filtered.length === 0) return undefined\n\n return filtered.join(',')\n }\n\n // radio / select (single value)\n const value = values[0]\n\n if (!validValues.includes(value)) {\n logger.warn(`Invalid filter value: ${fieldName}: ${value}`)\n return undefined\n }\n\n return value\n }\n\n /**\n * Handles the setting of default values for date type filters\n * when no user input value has been applied\n *\n * - if min/max bounds in definition we ensure the date in within bounds\n * before being sent to the API\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @memberof ReportQuery\n */\n private handleUnsetDateTypeDefaultsAndBounds(fields: components['schemas']['FieldDefinition'][]) {\n const dateFields: components['schemas']['FieldDefinition'][] | undefined = fields.filter((f) => {\n return (\n (f.type === 'date' && f.filter && f.filter.type === 'daterange') ||\n (f.type === 'date' && f.filter && f.filter.type === 'date') ||\n (f.type === 'date' && f.filter && f.filter.type === 'granulardaterange')\n )\n })\n\n dateFields.forEach((df) => {\n if (df.filter) {\n const min = df.filter.min ?? undefined\n const max = df.filter.max ?? undefined\n\n this.setDefaultBoundsOnUnsetDatefields(df, df.filter, min, max)\n }\n })\n }\n\n /**\n * Set the default value for date filters where min/max is provided\n *\n * - If min / max exist and the user hasn’t already provided date bounds in the request,\n * - the code injects them as defaults so the filtering stays within those bounds.\n *\n * @private\n * @memberof ReportQuery\n */\n private setDefaultBoundsOnUnsetDatefields(\n dateField: components['schemas']['FieldDefinition'],\n dateFieldFilter: components['schemas']['FilterDefinition'],\n min?: string,\n max?: string,\n ) {\n const existingKeys = Object.keys(this.filters)\n\n const baseKey = dateField.name\n const startKey = `${baseKey}.start`\n const endKey = `${baseKey}.end`\n\n if (dateFieldFilter.type === 'daterange' || dateFieldFilter.type === 'granulardaterange') {\n const hasStart = existingKeys.some((key) => key === startKey)\n const hasEnd = existingKeys.some((key) => key === endKey)\n\n if (min && !hasStart) {\n this.filters[startKey] = min\n }\n\n if (max && !hasEnd) {\n this.filters[endKey] = max\n }\n }\n\n if (dateFieldFilter.type === 'date') {\n // Any value for this field counts (base or dotted)\n const hasAnyValueForField = existingKeys.some((key) => key === baseKey || key.startsWith(`${baseKey}.`))\n\n if (!hasAnyValueForField) {\n const value = min ?? max\n if (value) {\n this.filters[baseKey] = value\n }\n }\n }\n }\n\n private setColumns(queryParams: ParsedQs, fields: components['schemas']['FieldDefinition'][]) {\n if (queryParams['columns']) {\n const columns =\n typeof queryParams['columns'] === 'string'\n ? queryParams['columns'].split(',')\n : (queryParams['columns'] as string[])\n\n return ColumnUtils.ensureMandatoryColumns(fields, columns)\n }\n\n return fields.filter((f) => f.visible).map((f) => f.name)\n }\n\n /**\n * Sets the default sort column\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultSortColumn(fields: components['schemas']['FieldDefinition'][]): string | undefined {\n const defaultSortColumn = fields.find((f) => f.defaultsort)\n return defaultSortColumn ? defaultSortColumn.name : fields.find((f) => f.sortable)?.name\n }\n\n /**\n * Gets the default sort direction\n * - Default if not set in DPD: ASC\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultSortDirection(fields: components['schemas']['FieldDefinition'][]) {\n const field = fields.find((f) => f.defaultsort)\n if (field) {\n return field.sortDirection ? field.sortDirection === 'asc' : true\n }\n return true\n }\n\n /**\n * Get the pagesize for the request\n * - from query, otherwise set meaningful default\n *\n * @param {ParsedQs} queryParams\n * @param {Template} [template]\n * @param {ReportType} [reportType]\n * @return {*} {number}\n * @memberof ReportQuery\n */\n getPageSize(queryParams: ParsedQs, template?: Template, reportType?: ReportType): number {\n let pageSize = 5000000\n if (!reportType || reportType === ReportType.REPORT) {\n if (queryParams['pageSize']) {\n pageSize = Number(queryParams['pageSize'])\n } else if (template) {\n pageSize = this.getDefaultPageSize(template)\n }\n }\n return pageSize\n }\n\n toRecordWithFilterPrefix(removeClearedFilters = false): Record<string, string | Array<string>> {\n const record: Record<string, string | Array<string>> = {\n selectedPage: this.selectedPage.toString(),\n ...(this.pageSize && { pageSize: this.pageSize.toString() }),\n ...(this.sortColumn && { sortColumn: this.sortColumn }),\n sortedAsc: this.sortedAsc.toString(),\n columns: this.columns,\n }\n\n if (this.dataProductDefinitionsPath) {\n record['dataProductDefinitionsPath'] = this.dataProductDefinitionsPath\n }\n\n Object.keys(this.filters).forEach((filterName) => {\n const value = this.filters[filterName]\n if ((value && !removeClearedFilters) || value !== clearFilterValue) {\n record[`${this.filtersPrefix}${filterName}`] = <string>value\n }\n })\n\n return record\n }\n\n /**\n * Gets a meaningful default pagesize for a request\n *\n * @private\n * @param {Template} template\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultPageSize(template: Template) {\n const maxResultsSize = 500000 // catch all rows\n const standardPage = 20 // smallest pagesize\n\n switch (template) {\n // These templates do no include pagination so return all rows\n case 'list-section':\n case 'summary-section':\n case 'row-section-child':\n case 'parent-child':\n case 'parent-child-section':\n return maxResultsSize\n\n default:\n return standardPage\n }\n }\n}\n\nexport { ReportQuery }\nexport default ReportQuery\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReportQuery.js","sources":["../../../../../../../../src/dpr/types/ReportQuery.ts"],"sourcesContent":["import type { ParsedQs } from 'qs'\nimport { FilteredListRequest } from './index'\nimport Dict = NodeJS.Dict\nimport { components } from './api'\nimport { clearFilterValue } from '../utils/urlHelper'\nimport ColumnUtils from '../components/_reports/report-heading/report-columns/report-columns-form/utils'\nimport { Template } from './Templates'\nimport { ReportType } from './UserReports'\nimport logger from '../utils/logger'\n\nexport const DEFAULT_FILTERS_PREFIX = 'filters.'\n\nclass ReportQuery implements FilteredListRequest {\n selectedPage: number\n\n pageSize: number\n\n sortColumn?: string | undefined\n\n columns: Array<string>\n\n sortedAsc: boolean\n\n filters: Dict<string>\n\n filtersPrefix: string\n\n dataProductDefinitionsPath?: string | undefined\n\n constructor({\n fields,\n template,\n queryParams,\n definitionsPath,\n filtersPrefix = DEFAULT_FILTERS_PREFIX,\n reportType,\n }: {\n fields: components['schemas']['FieldDefinition'][]\n template?: Template\n queryParams: ParsedQs\n definitionsPath?: string\n filtersPrefix?: string\n reportType?: ReportType\n }) {\n this.selectedPage = queryParams['selectedPage'] ? Number(queryParams['selectedPage']) : 1\n this.pageSize = this.getPageSize(queryParams, template, reportType)\n\n this.sortColumn = queryParams['sortColumn']\n ? queryParams['sortColumn'].toString()\n : this.getDefaultSortColumn(fields)\n\n this.sortedAsc =\n queryParams['sortedAsc'] !== undefined\n ? queryParams['sortedAsc'] !== 'false'\n : this.getDefaultSortDirection(fields)\n\n this.dataProductDefinitionsPath =\n definitionsPath ??\n (queryParams['dataProductDefinitionsPath'] ? queryParams['dataProductDefinitionsPath'].toString() : undefined)\n\n this.filtersPrefix = filtersPrefix\n\n this.columns = this.setColumns(queryParams, fields)\n\n this.filters = {}\n\n this.setAndTrimFiltersFromQuery(queryParams, fields)\n\n this.handleUnsetDateTypeDefaultsAndBounds(fields)\n }\n\n /**\n * Set the filers from the query params\n * - trims the start/end dates to min/max\n * - removes no-filter options\n *\n * @private\n * @param {ParsedQs} queryParams\n * @param {string} [min]\n * @param {string} [max]\n * @memberof ReportQuery\n */\n private setAndTrimFiltersFromQuery(queryParams: ParsedQs, fields: components['schemas']['FieldDefinition'][]) {\n Object.keys(queryParams)\n .filter((key) => key.startsWith(this.filtersPrefix))\n .filter((key) => queryParams[key])\n .forEach((key) => {\n const filterName = key.replace(this.filtersPrefix, '')\n const p = queryParams[key]\n let value = p ? p.toString() : ''\n\n // Extract base field name\n const baseFieldName = filterName.split('.')[0]\n\n const field = fields.find((f) => f.name === baseFieldName)\n\n if (!field?.filter) return\n\n const { type, staticOptions } = field.filter\n\n // Drop relative-duration for daterange types\n if ((type === 'daterange' || type === 'granulardaterange') && filterName.endsWith('relative-duration')) {\n return\n }\n\n // Select / radio / multiselect validation\n if (type.toLowerCase() === 'radio' || type.toLowerCase() === 'select' || type === 'multiselect') {\n const validated = this.validateSelectFilterValue(p, type, staticOptions)\n if (!validated) return\n\n value = validated\n }\n\n // Handle Date types\n if (field.type === 'date') {\n const { min, max } = field.filter\n\n if (type === 'daterange' || type === 'granulardaterange') {\n if (min && filterName.endsWith('.start')) {\n if (new Date(value) < new Date(min)) value = min\n }\n\n if (max && filterName.endsWith('.end')) {\n if (new Date(value) > new Date(max)) value = max\n }\n }\n\n if (type === 'date') {\n if (min && new Date(value) < new Date(min)) {\n value = min\n }\n\n if (max && new Date(value) > new Date(max)) {\n value = max\n }\n }\n }\n\n // Handle no filter values (select, radio)\n if (value !== 'no-filter') {\n this.filters[filterName] = value\n }\n })\n }\n\n /**\n * Validates that all staticOption values are correct\n *\n * - checks/validates value against the staticOptions in the filter definition\n * - if not present then it is dropped from the query,\n * - and logged\n *\n * @private\n * @param {unknown} rawValue\n * @param {string} type\n * @param {components['schemas']['FilterDefinition']['staticOptions']} [staticOptions]\n * @param {string} [fieldName]\n * @return {*} {(string | undefined)}\n * @memberof ReportQuery\n */\n private validateSelectFilterValue(\n rawValue: unknown,\n type: string,\n staticOptions?: components['schemas']['FilterDefinition']['staticOptions'],\n fieldName?: string,\n ): string | undefined {\n if (!staticOptions || !rawValue) return undefined\n\n const validValues = staticOptions.map((o) => o.name.toLowerCase())\n\n // Normalize input - array of strings\n const values = Array.isArray(rawValue)\n ? rawValue.map((v) => v.toString().toLowerCase())\n : rawValue\n .toString()\n .split(',')\n .map((v) => v.trim().toLowerCase())\n\n if (type === 'multiselect') {\n const invalidValues = values.filter((v) => !validValues.includes(v))\n const filtered = [...new Set(values.filter((v) => validValues.includes(v)))]\n\n if (invalidValues.length > 0) {\n logger.warn(`Invalid filter values removed for multiselect: ${fieldName}: [${invalidValues.join(', ')}]`)\n }\n\n if (filtered.length === 0) return undefined\n\n return filtered.join(',')\n }\n\n // radio / select (single value)\n const value = values[0]\n\n if (!validValues.includes(value)) {\n logger.warn(`Invalid filter value: ${fieldName}: ${value}`)\n return undefined\n }\n\n return value\n }\n\n /**\n * Handles the setting of default values for date type filters\n * when no user input value has been applied\n *\n * - if min/max bounds in definition we ensure the date in within bounds\n * before being sent to the API\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @memberof ReportQuery\n */\n private handleUnsetDateTypeDefaultsAndBounds(fields: components['schemas']['FieldDefinition'][]) {\n const dateFields: components['schemas']['FieldDefinition'][] | undefined = fields.filter((f) => {\n return (\n (f.type === 'date' && f.filter && f.filter.type === 'daterange') ||\n (f.type === 'date' && f.filter && f.filter.type === 'date') ||\n (f.type === 'date' && f.filter && f.filter.type === 'granulardaterange')\n )\n })\n\n dateFields.forEach((df) => {\n if (df.filter) {\n const min = df.filter.min ?? undefined\n const max = df.filter.max ?? undefined\n\n this.setDefaultBoundsOnUnsetDatefields(df, df.filter, min, max)\n }\n })\n }\n\n /**\n * Set the default value for date filters where min/max is provided\n *\n * - If min / max exist and the user hasn’t already provided date bounds in the request,\n * - the code injects them as defaults so the filtering stays within those bounds.\n *\n * @private\n * @memberof ReportQuery\n */\n private setDefaultBoundsOnUnsetDatefields(\n dateField: components['schemas']['FieldDefinition'],\n dateFieldFilter: components['schemas']['FilterDefinition'],\n min?: string,\n max?: string,\n ) {\n const existingKeys = Object.keys(this.filters)\n\n const baseKey = dateField.name\n const startKey = `${baseKey}.start`\n const endKey = `${baseKey}.end`\n\n if (dateFieldFilter.type === 'daterange' || dateFieldFilter.type === 'granulardaterange') {\n const hasStart = existingKeys.some((key) => key === startKey)\n const hasEnd = existingKeys.some((key) => key === endKey)\n\n if (min && !hasStart) {\n this.filters[startKey] = min\n }\n\n if (max && !hasEnd) {\n this.filters[endKey] = max\n }\n }\n\n if (dateFieldFilter.type === 'date') {\n // Any value for this field counts (base or dotted)\n const hasAnyValueForField = existingKeys.some((key) => key === baseKey || key.startsWith(`${baseKey}.`))\n\n if (!hasAnyValueForField) {\n const value = min ?? max\n if (value) {\n this.filters[baseKey] = value\n }\n }\n }\n }\n\n private setColumns(queryParams: ParsedQs, fields: components['schemas']['FieldDefinition'][]) {\n if (queryParams['columns']) {\n const columns =\n typeof queryParams['columns'] === 'string'\n ? queryParams['columns'].split(',')\n : (queryParams['columns'] as string[])\n\n return ColumnUtils.ensureMandatoryColumns(fields, columns)\n }\n\n return fields.filter((f) => f.visible).map((f) => f.name)\n }\n\n /**\n * Sets the default sort column\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultSortColumn(fields: components['schemas']['FieldDefinition'][]): string | undefined {\n const defaultSortColumn = fields.find((f) => f.defaultsort)\n return defaultSortColumn ? defaultSortColumn.name : fields.find((f) => f.sortable)?.name\n }\n\n /**\n * Gets the default sort direction\n * - Default if not set in DPD: ASC\n *\n * @private\n * @param {components['schemas']['FieldDefinition'][]} fields\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultSortDirection(fields: components['schemas']['FieldDefinition'][]) {\n const field = fields.find((f) => f.defaultsort)\n if (field) {\n return field.sortDirection ? field.sortDirection === 'asc' : true\n }\n return true\n }\n\n /**\n * Get the pagesize for the request\n * - from query, otherwise set meaningful default\n *\n * @param {ParsedQs} queryParams\n * @param {Template} [template]\n * @param {ReportType} [reportType]\n * @return {*} {number}\n * @memberof ReportQuery\n */\n getPageSize(queryParams: ParsedQs, template?: Template, reportType?: ReportType): number {\n let pageSize = 5000000\n if (!reportType || reportType === ReportType.REPORT) {\n if (queryParams['pageSize']) {\n pageSize = Number(queryParams['pageSize'])\n } else if (template) {\n pageSize = this.getDefaultPageSize(template)\n }\n }\n return pageSize\n }\n\n toRecordWithFilterPrefix(removeClearedFilters = false): Record<string, string | Array<string>> {\n const record: Record<string, string | Array<string>> = {\n selectedPage: this.selectedPage.toString(),\n ...(this.pageSize && { pageSize: this.pageSize.toString() }),\n ...(this.sortColumn && { sortColumn: this.sortColumn }),\n sortedAsc: this.sortedAsc.toString(),\n columns: this.columns,\n }\n\n if (this.dataProductDefinitionsPath) {\n record['dataProductDefinitionsPath'] = this.dataProductDefinitionsPath\n }\n\n Object.keys(this.filters).forEach((filterName) => {\n const value = this.filters[filterName]\n if ((value && !removeClearedFilters) || value !== clearFilterValue) {\n record[`${this.filtersPrefix}${filterName}`] = <string>value\n }\n })\n\n return record\n }\n\n /**\n * Gets a meaningful default pagesize for a request\n *\n * @private\n * @param {Template} template\n * @return {*}\n * @memberof ReportQuery\n */\n private getDefaultPageSize(template: Template) {\n const maxResultsSize = 500000 // catch all rows\n const standardPage = 20 // smallest pagesize\n\n switch (template) {\n // These templates do no include pagination so return all rows\n case 'list-section':\n case 'summary-section':\n case 'row-section-child':\n case 'parent-child':\n case 'parent-child-section':\n return maxResultsSize\n\n default:\n return standardPage\n }\n }\n}\n\nexport { ReportQuery }\nexport default ReportQuery\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ministryofjustice/hmpps-digital-prison-reporting-frontend",
|
|
3
|
-
"version": "6.2.
|
|
3
|
+
"version": "6.2.3",
|
|
4
4
|
"description": "The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.",
|
|
5
5
|
"main": "./cjs/index.js",
|
|
6
6
|
"module": "./index.js",
|