@ministryofjustice/hmpps-digital-prison-reporting-frontend
Version:
The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.
100 lines (97 loc) • 3.23 kB
JavaScript
import { getField, getFieldDisplayName } from '../../../utils/definitionUtils.js';
import { formatFilterDisplay } from '../../../utils/filterDisplay.js';
/**
* Builds the query summary
*
* @param {Record<string, unknown>} body
* @param {components['schemas']['FieldDefinition'][]} fields
* @return {*} {QuerySummaryItem[]}
*/
const buildQuerySummary = (body, fields) => {
const filterStateByField = collectFilterState(body);
const filterSummaries = Array.from(filterStateByField.entries())
.map(([fieldId, state]) => {
const field = getField(fields, fieldId);
if (!field)
return null;
const value = formatFilterDisplay(field, state);
if (!value)
return null;
return {
name: getFieldDisplayName(fields, fieldId) ?? fieldId,
value,
};
})
.filter(Boolean);
const sortSummaries = buildSortSummaries(body, fields);
return [...filterSummaries, ...sortSummaries];
};
/**
* Builds the filter state into predictable format
*
* @param {Record<string, unknown>} body
* @return {*} {Map<string, FilterDisplayState>}
*/
const collectFilterState = (body) => {
const map = new Map();
Object.entries(body).forEach(([key, value]) => {
if (value == null || value === '' || value === 'no-filter')
return;
if (!key.startsWith('filters.'))
return;
const [, fieldId, suffix] = key.split('.');
const state = map.get(fieldId) ?? { values: [] };
switch (suffix) {
case 'start':
state.start = String(value);
break;
case 'end':
state.end = String(value);
break;
case 'relative-duration':
state.relativeDuration = String(value);
break;
case 'quick-filter':
state.quickFilter = String(value);
break;
case 'granularity':
state.granularity = String(value);
break;
default:
state.values.push(String(value));
}
map.set(fieldId, state);
});
return map;
};
/**
* Builds the sort summary
*
* @param {Record<string, unknown>} body
* @param {components['schemas']['FieldDefinition'][]} fields
* @return {*} {QuerySummaryItem[]}
*/
const buildSortSummaries = (body, fields) => {
const summary = [];
Object.entries(body).forEach(([key, value]) => {
if (value == null || value === '')
return;
if (key === 'sortColumn') {
const columns = Array.isArray(value) ? value.map(String) : [String(value)];
const displayNames = columns.map(col => getField(fields, col)?.display ?? col);
summary.push({
name: 'Sort Column',
value: displayNames.join(', '),
});
}
if (key === 'sortedAsc') {
summary.push({
name: 'Sort Direction',
value: value === 'true' ? 'Ascending' : 'Descending',
});
}
});
return summary;
};
export { buildQuerySummary };
//# sourceMappingURL=utils.js.map