Add Tree-View Interface (#4602)

* Fix local type extraction

* Render basic tree in tree-view

* Render drawer-item in tree-view-group

* Retrieve nested draggable changes

* Default sort query to configured sortField

* Store nested group / sort to API

* Allow updating item values

* Figure out a dropzone approach on preview

* Finish editable tree view

* Set sort value based on sort field in relation

* Add create-new / add-existing

* Respect previously made nested edits

* Add description in setup

* Fix fetching level of o2m sort field

* Remove min height on empty root

* Remove unused types

* Add notice for invalid relationship type

* Allow recursive o2m in setup

* Styling tweak

* Revert changes in v-list

* Revert changes in groupable
This commit is contained in:
Rijk van Zanten
2021-03-26 17:12:55 -04:00
committed by GitHub
parent a12c433249
commit b562ceeb0c
12 changed files with 666 additions and 17 deletions

View File

@@ -155,8 +155,6 @@ function getDBQuery(
delete queryCopy.limit;
}
query.sort = query.sort || [{ column: primaryKeyField, order: 'asc' }];
applyQuery(table, dbQuery, queryCopy, schema);
return dbQuery;
@@ -187,6 +185,10 @@ function applyParentFilters(nestedCollectionNodes: NestedCollectionNode[], paren
nestedNode.children.push({ type: 'field', name: nestedNode.relation.many_field });
}
if (nestedNode.relation.sort_field) {
nestedNode.children.push({ type: 'field', name: nestedNode.relation.sort_field });
}
nestedNode.query = {
...nestedNode.query,
filter: {
@@ -245,16 +247,30 @@ function mergeWithParentItems(
}
} else if (nestedNode.type === 'o2m') {
for (const parentItem of parentItems) {
let itemChildren = nestedItems.filter((nestedItem) => {
if (nestedItem === null) return false;
if (Array.isArray(nestedItem[nestedNode.relation.many_field])) return true;
let itemChildren = nestedItems
.filter((nestedItem) => {
if (nestedItem === null) return false;
if (Array.isArray(nestedItem[nestedNode.relation.many_field])) return true;
return (
nestedItem[nestedNode.relation.many_field] == parentItem[nestedNode.relation.one_primary!] ||
nestedItem[nestedNode.relation.many_field]?.[nestedNode.relation.one_primary!] ==
parentItem[nestedNode.relation.one_primary!]
);
});
return (
nestedItem[nestedNode.relation.many_field] == parentItem[nestedNode.relation.one_primary!] ||
nestedItem[nestedNode.relation.many_field]?.[nestedNode.relation.one_primary!] ==
parentItem[nestedNode.relation.one_primary!]
);
})
.sort((a, b) => {
// This is pre-filled in get-ast-from-query
const { column, order } = nestedNode.query.sort![0]!;
if (a[column] === b[column]) return 0;
if (a[column] === null) return 1;
if (b[column] === null) return -1;
if (order === 'asc') {
return a[column] < b[column] ? -1 : 1;
} else {
return a[column] < b[column] ? 1 : -1;
}
});
// We re-apply the requested limit here. This forces the _n_ nested items per parent concept
if (nested) {