@ministryofjustice/hmpps-digital-prison-reporting-frontend
Version:
The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.
113 lines (112 loc) • 5.15 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DEFAULT_FILTERS_PREFIX = void 0;
const urlHelper_1 = require("../utils/urlHelper");
const utils_1 = __importDefault(require("../components/_reports/report-columns-form/utils"));
exports.DEFAULT_FILTERS_PREFIX = 'filters.';
class ReportQuery {
constructor({ fields, template, queryParams, definitionsPath, filtersPrefix = exports.DEFAULT_FILTERS_PREFIX, }) {
this.selectedPage = queryParams.selectedPage ? Number(queryParams.selectedPage) : 1;
this.pageSize =
queryParams.pageSize && template ? Number(queryParams.pageSize) : this.getDefaultPageSize(template);
this.sortColumn = queryParams.sortColumn ? queryParams.sortColumn.toString() : this.getDefaultSortColumn(fields);
this.sortedAsc = queryParams.sortedAsc !== 'false';
this.dataProductDefinitionsPath =
definitionsPath !== null && definitionsPath !== void 0 ? definitionsPath : (queryParams.dataProductDefinitionsPath ? queryParams.dataProductDefinitionsPath.toString() : null);
this.filtersPrefix = filtersPrefix;
if (queryParams.columns) {
const columns = typeof queryParams.columns === 'string' ? queryParams.columns.split(',') : queryParams.columns;
this.columns = utils_1.default.ensureMandatoryColumns(fields, columns);
}
else {
this.columns = fields.filter((f) => f.visible).map((f) => f.name);
}
let min;
let max;
const dateField = fields.find((f) => {
return ((f.type === 'date' && f.filter && f.filter.type === 'daterange') ||
(f.type === 'date' && f.filter && f.filter.type === 'date'));
});
if (dateField)
({ min, max } = dateField.filter);
this.filters = {};
Object.keys(queryParams)
.filter((key) => key.startsWith(this.filtersPrefix))
.filter((key) => queryParams[key])
.forEach((key) => {
const filter = key.replace(this.filtersPrefix, '');
let value = queryParams[key].toString();
if (filter.includes('.start') && min) {
if (new Date(value) < new Date(min))
value = min;
}
if (filter.includes('.end') && max) {
if (new Date(value) > new Date(max))
value = max;
}
if (value !== 'no-filter') {
this.filters[filter] = value;
}
});
if (dateField && dateField.filter.type === 'daterange') {
if (min &&
Object.keys(queryParams).some((key) => key.includes(this.filtersPrefix)) &&
Object.keys(queryParams).every((key) => !key.includes('.start'))) {
this.filters[`${dateField.name}.start`] = min;
}
if (max &&
Object.keys(queryParams).some((key) => key.includes(this.filtersPrefix)) &&
Object.keys(queryParams).every((key) => !key.includes('.end'))) {
this.filters[`${dateField.name}.end`] = max;
}
}
if (dateField && dateField.filter.type === 'date') {
if (min &&
Object.keys(queryParams).some((key) => key.includes(this.filtersPrefix)) &&
Object.keys(queryParams).every((key) => !key.includes(dateField.name))) {
this.filters[`${dateField.name}.start`] = min;
}
}
}
getDefaultSortColumn(fields) {
var _a;
const defaultSortColumn = fields.find((f) => f.defaultsort);
return defaultSortColumn ? defaultSortColumn.name : (_a = fields.find((f) => f.sortable)) === null || _a === void 0 ? void 0 : _a.name;
}
toRecordWithFilterPrefix(removeClearedFilters = false) {
const record = {
selectedPage: this.selectedPage.toString(),
pageSize: this.pageSize.toString(),
sortColumn: this.sortColumn,
sortedAsc: this.sortedAsc.toString(),
columns: this.columns,
};
if (this.dataProductDefinitionsPath) {
record.dataProductDefinitionsPath = this.dataProductDefinitionsPath;
}
Object.keys(this.filters).forEach((filterName) => {
const value = this.filters[filterName];
if (!removeClearedFilters || value !== urlHelper_1.clearFilterValue) {
record[`${this.filtersPrefix}${filterName}`] = value;
}
});
return record;
}
getDefaultPageSize(template) {
const maxResultsSize = 50000;
const standardPage = 20;
switch (template) {
case 'list-section':
case 'summary-section':
case 'row-section-child':
case 'parent-child':
return maxResultsSize;
default:
return standardPage;
}
}
}
exports.default = ReportQuery;