@ministryofjustice/hmpps-digital-prison-reporting-frontend
Version:
The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.
140 lines (139 loc) • 4.61 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable no-param-reassign */
const dayjs_1 = __importDefault(require("dayjs"));
const isBetween_1 = __importDefault(require("dayjs/plugin/isBetween"));
const utils_1 = __importDefault(require("../start-end-date/utils"));
const dateIsInBounds = (startDate, endDate, min, max) => {
dayjs_1.default.extend(isBetween_1.default);
const minDate = (0, dayjs_1.default)(min);
const maxDate = (0, dayjs_1.default)(max);
const startDateIsBetweenMinAndMax = startDate
? startDate.isBetween(minDate, maxDate, 'day', '[]')
: true;
const endDateIsBetweenMinAndMax = endDate ? endDate.isBetween(minDate, maxDate, 'day', '[]') : true;
return startDateIsBetweenMinAndMax && endDateIsBetweenMinAndMax;
};
const calcDates = (durationValue) => {
let endDate;
let startDate;
switch (durationValue) {
case 'none':
endDate = '';
startDate = '';
break;
case 'yesterday':
endDate = (0, dayjs_1.default)();
startDate = endDate.subtract(1, 'day');
break;
case 'tomorrow':
startDate = (0, dayjs_1.default)();
endDate = startDate.add(1, 'day');
break;
case 'last-week':
endDate = (0, dayjs_1.default)();
startDate = endDate.subtract(1, 'week');
break;
case 'next-week':
startDate = (0, dayjs_1.default)();
endDate = startDate.add(1, 'week');
break;
case 'last-month':
endDate = (0, dayjs_1.default)();
startDate = endDate.subtract(1, 'month');
break;
case 'next-month':
startDate = (0, dayjs_1.default)();
endDate = startDate.add(1, 'month');
break;
default:
break;
}
return {
endDate,
startDate,
};
};
const setValueFromRequest = (filter, req, prefix) => {
const start = req.query[`${prefix}${filter.name}.start`];
const end = req.query[`${prefix}${filter.name}.end`];
const relative = req.query[`${prefix}${filter.name}.relative-duration`];
const value = {
start: start || filter.min,
end: end || filter.max,
...(relative && { relative }),
};
return value;
};
const getRelativeDateOptions = (min, max) => {
if (!min)
min = '1977-05-25';
if (!max)
max = '9999-01-01';
let options = getRelativeValues();
options.forEach((option) => {
if (option.value) {
const { endDate, startDate } = calcDates(option.value);
if (!dateIsInBounds(startDate, endDate, min, max)) {
option.disabled = true;
}
}
});
if (options
.filter((opt) => opt.value !== 'none')
.every((opt) => {
return opt.value === null || opt.disabled;
})) {
options = [];
}
return options;
};
const mapRelativeValue = (value) => {
const values = getRelativeValues();
const opt = values.find((v) => v.value === value);
return opt ? opt.text : '';
};
const getRelativeValues = () => {
return [
{ value: 'none', text: 'None' },
{ value: 'yesterday', text: 'Yesterday' },
{ value: 'tomorrow', text: 'Tomorrow' },
{ value: 'last-week', text: 'Last week' },
{ value: 'next-week', text: 'Next week' },
{ value: 'last-month', text: 'Last month' },
{ value: 'next-month', text: 'Next month' },
];
};
const getFilterFromDefinition = (filter, filterData) => {
const value = utils_1.default.getStartAndEndValueFromDefinition(filter);
const relativeOptions = getRelativeDateOptions(filter.min, filter.max);
return {
...filterData,
min: filter.min,
max: filter.max,
relativeOptions,
value,
};
};
const getQueryFromDefinition = (filter, name, filterPrefix) => {
const dates = filter.defaultValue.split(' - ');
let param;
if (dates.length >= 1) {
param = `${filterPrefix}${name}.start=${dates[0]}`;
if (dates.length >= 2) {
param = `${param}&${filterPrefix}${name}.end=${dates[1]}`;
}
}
return param;
};
exports.default = {
calcDates,
getRelativeDateOptions,
getFilterFromDefinition,
setValueFromRequest,
getQueryFromDefinition,
mapRelativeValue,
};