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.

343 lines (342 loc) 15.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const dayjs_1 = __importDefault(require("dayjs")); const utils_1 = __importDefault(require("../start-end-date/utils")); const types_1 = require("./types"); const hasPartialStartEnd = (granularity, startDate, endDate) => { let partialStart; let partialEnd; switch (granularity) { case types_1.Granularity.DAILY: partialStart = false; partialEnd = false; break; case types_1.Granularity.MONTHLY: { const startOfMonth = (0, dayjs_1.default)(startDate).startOf('month'); const endOfMonth = (0, dayjs_1.default)(endDate).endOf('month'); partialStart = !startOfMonth.isSame(startDate, 'day'); partialEnd = !endOfMonth.isSame(endDate, 'day'); } break; case types_1.Granularity.ANNUALLY: { const startOfYear = (0, dayjs_1.default)(startDate).startOf('year'); const endOfYear = (0, dayjs_1.default)(endDate).endOf('year'); partialStart = !startOfYear.isSame(startDate, 'day'); partialEnd = !endOfYear.isSame(endDate, 'day'); } break; default: partialStart = false; partialEnd = false; break; } return { start: partialStart, end: partialEnd, }; }; const getQuickFilterOptions = () => { const options = [ { value: types_1.QuickFilters.NONE, text: 'None' }, { value: types_1.QuickFilters.TODAY, text: 'Today' }, { value: types_1.QuickFilters.PAST, text: 'Past:', disabled: true }, { value: types_1.QuickFilters.YESTERDAY, text: 'Yesterday' }, { value: types_1.QuickFilters.LAST_SEVEN_DAYS, text: 'Last 7 days' }, { value: types_1.QuickFilters.LAST_THIRTY_DAYS, text: 'Last 30 days' }, { value: types_1.QuickFilters.LAST_MONTH, text: 'Last month' }, { value: types_1.QuickFilters.LAST_FULL_MONTH, text: 'Last full month' }, { value: types_1.QuickFilters.LAST_NINETY_DAYS, text: 'Last 90 days' }, { value: types_1.QuickFilters.LAST_THREE_MONTHS, text: 'Last 3 months' }, { value: types_1.QuickFilters.LAST_FULL_THREE_MONTHS, text: 'Last full 3 months' }, { value: types_1.QuickFilters.LAST_SIX_MONTHS, text: 'Last 6 months' }, { value: types_1.QuickFilters.LAST_FULL_SIX_MONTHS, text: 'Last full 6 months' }, { value: types_1.QuickFilters.LAST_YEAR, text: 'Last year' }, { value: types_1.QuickFilters.LAST_FULL_YEAR, text: 'Last full year' }, { value: types_1.QuickFilters.FUTURE, text: 'Future:', disabled: true }, { value: types_1.QuickFilters.TOMORROW, text: 'Tomorrow' }, { value: types_1.QuickFilters.NEXT_SEVEN_DAYS, text: 'Next 7 days' }, { value: types_1.QuickFilters.NEXT_THIRTY_DAYS, text: 'Next 30 days' }, { value: types_1.QuickFilters.NEXT_MONTH, text: 'Next month' }, { value: types_1.QuickFilters.NEXT_FULL_MONTH, text: 'Next full month' }, { value: types_1.QuickFilters.NEXT_NINETY_DAYS, text: 'Next 90 days' }, { value: types_1.QuickFilters.NEXT_THREE_MONTHS, text: 'Next 3 months' }, { value: types_1.QuickFilters.NEXT_FULL_THREE_MONTHS, text: 'Next full 3 months' }, { value: types_1.QuickFilters.NEXT_SIX_MONTHS, text: 'Next 6 months' }, { value: types_1.QuickFilters.NEXT_FULL_SIX_MONTHS, text: 'Next full 6 months' }, { value: types_1.QuickFilters.NEXT_YEAR, text: 'Next year' }, { value: types_1.QuickFilters.NEXT_FULL_YEAR, text: 'Next full year' }, ]; return options; }; const getGranularityOptions = () => { const options = [ { value: types_1.Granularity.HOURLY, text: 'Hourly' }, { value: types_1.Granularity.DAILY, text: 'Daily' }, // { value: Granularity.WEEKLY, text: 'Weekly' }, { value: types_1.Granularity.MONTHLY, text: 'Monthly' }, // { value: Granularity.QUARTERLY, text: 'Quarterly' }, { value: types_1.Granularity.ANNUALLY, text: 'Annually' }, ]; return options; }; const setDateRangeFromQuickFilterValue = (value) => { let startDate; let endDate; let granularity; switch (value) { case types_1.QuickFilters.TODAY: endDate = (0, dayjs_1.default)(); startDate = (0, dayjs_1.default)(); granularity = types_1.Granularity.DAILY; break; case types_1.QuickFilters.YESTERDAY: endDate = (0, dayjs_1.default)().subtract(1, 'day'); startDate = (0, dayjs_1.default)().subtract(1, 'day'); granularity = types_1.Granularity.DAILY; break; case types_1.QuickFilters.LAST_SEVEN_DAYS: endDate = (0, dayjs_1.default)(); startDate = endDate.subtract(7, 'day').add(1, 'day'); granularity = types_1.Granularity.DAILY; break; case types_1.QuickFilters.LAST_THIRTY_DAYS: endDate = (0, dayjs_1.default)(); startDate = endDate.subtract(30, 'day').add(1, 'day'); granularity = types_1.Granularity.DAILY; break; case types_1.QuickFilters.LAST_MONTH: endDate = (0, dayjs_1.default)(); startDate = endDate.subtract(1, 'month').add(1, 'day'); granularity = types_1.Granularity.MONTHLY; break; case types_1.QuickFilters.LAST_FULL_MONTH: endDate = (0, dayjs_1.default)().subtract(1, 'month').endOf('month'); startDate = endDate.startOf('month'); granularity = types_1.Granularity.MONTHLY; break; case types_1.QuickFilters.LAST_NINETY_DAYS: endDate = (0, dayjs_1.default)(); startDate = endDate.subtract(90, 'day').add(1, 'day'); granularity = types_1.Granularity.DAILY; break; case types_1.QuickFilters.LAST_THREE_MONTHS: endDate = (0, dayjs_1.default)(); startDate = endDate.subtract(3, 'month').add(1, 'day'); granularity = types_1.Granularity.MONTHLY; break; case types_1.QuickFilters.LAST_FULL_THREE_MONTHS: endDate = (0, dayjs_1.default)().subtract(1, 'month').endOf('month'); startDate = endDate.subtract(2, 'month').startOf('month'); granularity = types_1.Granularity.MONTHLY; break; case types_1.QuickFilters.LAST_SIX_MONTHS: endDate = (0, dayjs_1.default)(); startDate = endDate.subtract(6, 'month').add(1, 'day'); granularity = types_1.Granularity.MONTHLY; break; case types_1.QuickFilters.LAST_FULL_SIX_MONTHS: endDate = (0, dayjs_1.default)().subtract(1, 'month').endOf('month'); startDate = endDate.subtract(6, 'month').startOf('month'); granularity = types_1.Granularity.MONTHLY; break; case types_1.QuickFilters.LAST_YEAR: endDate = (0, dayjs_1.default)(); startDate = endDate.subtract(1, 'year').add(1, 'day'); granularity = types_1.Granularity.ANNUALLY; break; case types_1.QuickFilters.LAST_FULL_YEAR: endDate = (0, dayjs_1.default)().subtract(1, 'year').endOf('year'); startDate = endDate.startOf('year'); granularity = types_1.Granularity.ANNUALLY; break; case types_1.QuickFilters.TOMORROW: endDate = (0, dayjs_1.default)().add(1, 'day'); startDate = (0, dayjs_1.default)().add(1, 'day'); granularity = types_1.Granularity.DAILY; break; case types_1.QuickFilters.NEXT_SEVEN_DAYS: startDate = (0, dayjs_1.default)(); endDate = (0, dayjs_1.default)().add(7, 'day').subtract(1, 'day'); granularity = types_1.Granularity.DAILY; break; case types_1.QuickFilters.NEXT_THIRTY_DAYS: startDate = (0, dayjs_1.default)(); endDate = (0, dayjs_1.default)().add(30, 'day').subtract(1, 'day'); granularity = types_1.Granularity.DAILY; break; case types_1.QuickFilters.NEXT_MONTH: startDate = (0, dayjs_1.default)(); endDate = (0, dayjs_1.default)().add(1, 'month').subtract(1, 'day'); granularity = types_1.Granularity.MONTHLY; break; case types_1.QuickFilters.NEXT_FULL_MONTH: startDate = (0, dayjs_1.default)().add(1, 'month').startOf('month'); endDate = startDate.endOf('month'); granularity = types_1.Granularity.MONTHLY; break; case types_1.QuickFilters.NEXT_NINETY_DAYS: startDate = (0, dayjs_1.default)(); endDate = (0, dayjs_1.default)().add(90, 'day').subtract(1, 'day'); granularity = types_1.Granularity.DAILY; break; case types_1.QuickFilters.NEXT_THREE_MONTHS: startDate = (0, dayjs_1.default)(); endDate = (0, dayjs_1.default)().add(3, 'month').subtract(1, 'day'); granularity = types_1.Granularity.MONTHLY; break; case types_1.QuickFilters.NEXT_FULL_THREE_MONTHS: startDate = (0, dayjs_1.default)().add(1, 'month').startOf('month'); endDate = startDate.add(2, 'month').endOf('month'); granularity = types_1.Granularity.MONTHLY; break; case types_1.QuickFilters.NEXT_YEAR: startDate = (0, dayjs_1.default)(); endDate = (0, dayjs_1.default)().add(1, 'year').subtract(1, 'day'); granularity = types_1.Granularity.ANNUALLY; break; case types_1.QuickFilters.NEXT_FULL_YEAR: startDate = (0, dayjs_1.default)().add(1, 'year').startOf('year'); endDate = startDate.endOf('year'); granularity = types_1.Granularity.ANNUALLY; break; default: endDate = (0, dayjs_1.default)(); startDate = (0, dayjs_1.default)(); granularity = types_1.Granularity.DAILY; break; } return { start: startDate.format('YYYY-MM-DD').toString(), end: endDate.format('YYYY-MM-DD').toString(), granularity, }; }; const getOptionDisplayValue = (value, options) => { const item = options.find((opt) => { return opt.value === value; }); return item.text || value; }; const setValueFromRequest = (filter, req, prefix) => { var _a, _b, _c, _d; const { preventDefault } = req.query; const quickFilter = req.query[`${prefix}${filter.name}.quick-filter`]; let granularity; let start; let end; if (quickFilter && quickFilter !== types_1.QuickFilters.NONE) { ; ({ granularity, start, end } = setDateRangeFromQuickFilterValue(quickFilter)); } else { granularity = req.query[`${prefix}${filter.name}.granularity`]; start = req.query[`${prefix}${filter.name}.start`]; end = req.query[`${prefix}${filter.name}.end`]; } const defaultStart = preventDefault ? null : (_a = filter.value) === null || _a === void 0 ? void 0 : _a.start; const defaultEnd = preventDefault ? null : (_b = filter.value) === null || _b === void 0 ? void 0 : _b.end; const defaultGranularity = preventDefault ? types_1.Granularity.DAILY : (_c = filter.value) === null || _c === void 0 ? void 0 : _c.granularity.value; const defaultQuickFilter = preventDefault ? 'none' : (_d = filter.value) === null || _d === void 0 ? void 0 : _d.quickFilter.value; const granularityOptions = getGranularityOptions(); const quickFilterOptions = getQuickFilterOptions(); const startDate = start || defaultStart || filter.min; const endDate = end || defaultEnd || filter.max; const granularityValue = granularity || defaultGranularity; const quickFilterValue = quickFilter || defaultQuickFilter; const value = { start: startDate, end: endDate, granularity: { value: granularityValue, display: getOptionDisplayValue(granularityValue, granularityOptions), }, quickFilter: { value: quickFilterValue, display: getOptionDisplayValue(quickFilterValue, quickFilterOptions), }, partialDate: { ...hasPartialStartEnd(granularityValue, startDate, endDate), }, }; return value; }; const getFilterFromDefinition = (filter, filterData) => { let value; const quickFilterValue = filter.defaultQuickFilterValue; const granularityOptions = getGranularityOptions(); const quickFilterOptions = getQuickFilterOptions(); if (quickFilterValue) { const { start, end, granularity } = setDateRangeFromQuickFilterValue(quickFilterValue); value = { start, end, granularity: { value: granularity, display: getOptionDisplayValue(granularity, granularityOptions), }, quickFilter: { value: quickFilterValue, display: getOptionDisplayValue(quickFilterValue, quickFilterOptions), }, partialDate: { ...hasPartialStartEnd(granularity, start, end), }, }; } else { value = utils_1.default.getStartAndEndValueFromDefinition(filter); const granularityValue = value.granularity ? value.granularity.value : filter.defaultGranularity || types_1.Granularity.DAILY; value = { ...value, granularity: { value: granularityValue, display: getOptionDisplayValue(granularityValue, granularityOptions), }, quickFilter: { value: types_1.QuickFilters.NONE, display: 'None', }, partialDate: { ...hasPartialStartEnd(granularityValue, value.start, value.end), }, }; } return { ...filterData, min: filter.min, max: filter.max, value, quickFilterOptions: getQuickFilterOptions(), granularityOptions: getGranularityOptions(), }; }; const getQueryFromDefinition = (filter, name, filterPrefix, startEndParams) => { const params = []; if (filter.defaultQuickFilterValue) { const { start, end, granularity } = setDateRangeFromQuickFilterValue(filter.defaultQuickFilterValue); params.push(`${filterPrefix}${name}.quick-filter=${filter.defaultQuickFilterValue}`); params.push(`${filterPrefix}${name}.granularity=${granularity}`); params.push(`${filterPrefix}${name}.start=${start}`); params.push(`${filterPrefix}${name}.end=${end}`); } else if (filter.defaultGranularity && startEndParams) { params.push(`${filterPrefix}${name}.granularity=${filter.defaultGranularity}`); params.push(`${startEndParams}`); } else if (filter.defaultGranularity) { params.push(`${filterPrefix}${name}.granularity=${filter.defaultGranularity}`); } return params.join('&'); }; exports.default = { getFilterFromDefinition, setValueFromRequest, getQueryFromDefinition, };