From c36c9ac46adcbd5eac7a0f4c7af0eee3f93badc6 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Wed, 3 Dec 2025 00:07:27 +0000 Subject: [PATCH] Change API for object property listing to work better with the ui. --- src/database/database.js | 43 +++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/src/database/database.js b/src/database/database.js index 0bde985..de114b9 100644 --- a/src/database/database.js +++ b/src/database/database.js @@ -225,16 +225,23 @@ function nestGroups(groups, props, filter, idx = 0) { // Build a map of key -> groups for this property const keyToGroups = {}; for (const group of groups) { - const { key } = getKeyAndFilterVals(group._id[prop]); - if (!keyToGroups[key]) keyToGroups[key] = []; - keyToGroups[key].push(group); + const val = group._id[prop]; + const { key } = getKeyAndFilterVals(val); + if (!keyToGroups[key]) { + keyToGroups[key] = { + groups: [], + value: val, + }; + } + keyToGroups[key].groups.push(group); } - let map = {}; + let result = []; if (filterPresent) { const filterValue = filter[prop]?.toString?.() ?? filter[prop]; - for (const [key, groupList] of Object.entries(keyToGroups)) { + for (const [key, data] of Object.entries(keyToGroups)) { + const { groups: groupList, value } = data; // Check if any group in this key matches the filter (by _id or name) const matches = groupList.filter((group) => { const { filterVals } = getKeyAndFilterVals(group._id[prop]); @@ -242,28 +249,36 @@ function nestGroups(groups, props, filter, idx = 0) { console.log('filterValue', filterValue); return filterVals.some((val) => val?.toString() === filterValue); }); + + let children = []; if (matches.length > 0) { if (idx === props.length - 1) { // Last property in filter, return items - let items = []; for (const group of matches) { - items = items.concat(group.objects.map(expandObjectIds)); + children = children.concat(group.objects.map(expandObjectIds)); } - map[key] = items; } else { - map[key] = nestGroups(matches, props, filter, idx + 1); + children = nestGroups(matches, props, filter, idx + 1); } - } else { - map[key] = {}; } + + result.push({ + property: prop, + value: expandObjectIds(value), + children: children, + }); } } else { // No filter for this property, just show all keys at this level with empty objects - for (const key of Object.keys(keyToGroups)) { - map[key] = {}; + for (const [key, data] of Object.entries(keyToGroups)) { + result.push({ + property: prop, + value: expandObjectIds(data.value), + children: [], + }); } } - return map; + return result; } // Group objects by multiple properties and return nested groupings