@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
JavaScript
;
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,
};