feat(export): subject/parameter members + dimension dispatcher

This commit is contained in:
Experiments DB Dev
2026-07-19 13:19:15 -04:00
parent a411d59305
commit 7d112de0d7
2 changed files with 82 additions and 0 deletions
+36
View File
@@ -102,6 +102,42 @@ export function buildStatusIndex(statuses) {
return index;
}
export function listSubjectMembers(animals, groupField) {
const list = [...(animals ?? [])];
const nameCounts = new Map();
for (const a of list) {
const n = a?.animal_name ?? '';
nameCounts.set(n, (nameCounts.get(n) ?? 0) + 1);
}
const members = list.map((a) => {
const name = a?.animal_name ?? '';
const label = nameCounts.get(name) > 1 ? `${name} (${a?.animal_id_string ?? ''})` : name;
return { id: a.id, label, animalId: a.id, group: subjectGroupValue(a, groupField) };
});
const grouped = !!groupField && groupField !== '__none__';
members.sort((x, y) => {
if (grouped) {
const g = String(x.group ?? '').localeCompare(String(y.group ?? ''));
if (g !== 0) return g;
}
return String(x.label).localeCompare(String(y.label));
});
return members;
}
export function listParameterMembers(dailyTemplate, statuses) {
return listExportableParams(dailyTemplate, statuses).map((p) => ({
id: p.id, label: p.label, param: p, group: p.group,
}));
}
export function listDimensionMembers(dim, { statuses, animals, dailyTemplate, groupField }) {
if (dim === 'date') return listDateMembers(statuses);
if (dim === 'subject') return listSubjectMembers(animals, groupField);
if (dim === 'parameter') return listParameterMembers(dailyTemplate, statuses);
return [];
}
// A cell has a value unless it is null, undefined, or the empty string.
// (0 and false are real values.)
function hasValue(v) {