UNPKG

@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
"use strict"; 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, };