Implement treegrid to display parent-child-relationship in project list (#2152)

* Implement new functionalities for treegrid

A project now serializes his ID and his parent ID into JSON.

It's now possible to get children Projects by tag and by classifier

Signed-off-by: RBickert <rbt@mm-software.com>

* Serialize `parentUuid` instead of `id` and `pid`

Signed-off-by: RBickert <rbt@mm-software.com>

* Add check for setting inactive parent

Signed-off-by: RBickert <rbt@mm-software.com>

* Adjust API for new vue-multiselect in frontend

Signed-off-by: RBickert <rbt@mm-software.com>

* Adjust `ProjectResourceTest` to updated API

Signed-off-by: RBickert <rbt@mm-software.com>

Signed-off-by: RBickert <rbt@mm-software.com>

Closes #84
This commit is contained in:
rbt-mm 2022-12-02 18:21:49 +01:00 committed by GitHub
parent ace7cc75ea
commit 48688fa958
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 208 additions and 10 deletions

View file

@ -442,6 +442,9 @@ final class ProjectQueryManager extends QueryManager implements IQueryManager {
* @return the created Project
*/
public Project createProject(final Project project, List<Tag> tags, boolean commitIndex) {
if (project.getParent() != null && !Boolean.TRUE.equals(project.getParent().isActive())){
throw new IllegalArgumentException("An inactive Parent cannot be selected as parent");
}
final Project result = persist(project);
final List<Tag> resolvedTags = resolveTags(tags);
bind(project, resolvedTags);
@ -928,14 +931,75 @@ final class ProjectQueryManager extends QueryManager implements IQueryManager {
return result;
}
public PaginatedResult getProjectsWithoutDescendantsOf(Project project){
public PaginatedResult getChildrenProjects(final Classifier classifier, final UUID uuid, final boolean includeMetrics, final boolean excludeInactive) {
final PaginatedResult result;
final Query<Project> query = pm.newQuery(Project.class);
if (orderBy == null) {
query.setOrdering("name asc");
}
final var filterBuilder = new ProjectQueryFilterBuilder()
.excludeInactive(excludeInactive)
.withParent(uuid)
.withClassifier(classifier);
final String queryFilter = filterBuilder.buildFilter();
final Map<String, Object> params = filterBuilder.getParams();
preprocessACLs(query, queryFilter, params, false);
query.getFetchPlan().addGroup(Project.FetchGroup.ALL.name());
result = execute(query, params);
if (includeMetrics) {
// Populate each Project object in the paginated result with transitive related
// data to minimize the number of round trips a client needs to make, process, and render.
for (Project project : result.getList(Project.class)) {
project.setMetrics(getMostRecentProjectMetrics(project));
}
}
return result;
}
public PaginatedResult getChildrenProjects(final Tag tag, final UUID uuid, final boolean includeMetrics, final boolean excludeInactive) {
final PaginatedResult result;
final Query<Project> query = pm.newQuery(Project.class);
if (orderBy == null) {
query.setOrdering("name asc");
}
var filterBuilder = new ProjectQueryFilterBuilder()
.excludeInactive(excludeInactive)
.withParent(uuid)
.withTag(tag);
if (filter != null) {
final String filterString = ".*" + filter.toLowerCase() + ".*";
filterBuilder = filterBuilder.withFuzzyName(filterString);
}
final String queryFilter = filterBuilder.buildFilter();
final Map<String, Object> params = filterBuilder.getParams();
preprocessACLs(query, queryFilter, params, false);
result = execute(query, params);
if (includeMetrics) {
// Populate each Project object in the paginated result with transitive related
// data to minimize the number of round trips a client needs to make, process, and render.
for (Project project : result.getList(Project.class)) {
project.setMetrics(getMostRecentProjectMetrics(project));
}
}
return result;
}
public PaginatedResult getProjectsWithoutDescendantsOf(final boolean exludeInactive, final Project project){
final PaginatedResult result;
final Query<Project> query = pm.newQuery(Project.class);
if (orderBy == null) {
query.setOrdering("name asc, version desc");
}
var filterBuilder = new ProjectQueryFilterBuilder();
var filterBuilder = new ProjectQueryFilterBuilder()
.excludeInactive(exludeInactive);
if (filter != null) {
final String filterString = ".*" + filter.toLowerCase() + ".*";
@ -955,7 +1019,42 @@ final class ProjectQueryManager extends QueryManager implements IQueryManager {
preprocessACLs(query, queryFilter, params, false);
result = execute(query, params);
result.setObjects(result.getList(Project.class).stream().filter(p -> !isChildOf(p, project.getUuid())).toList());
result.setObjects(result.getList(Project.class).stream().filter(p -> !isChildOf(p, project.getUuid()) && !p.getUuid().equals(project.getUuid())).toList());
result.setTotal(result.getObjects().size());
return result;
}
public PaginatedResult getProjectsWithoutDescendantsOf(final String name, final boolean excludeInactive, Project project){
final PaginatedResult result;
final Query<Project> query = pm.newQuery(Project.class);
if (orderBy == null) {
query.setOrdering("name asc, version desc");
}
var filterBuilder = new ProjectQueryFilterBuilder()
.excludeInactive(excludeInactive)
.withName(name);
if (filter != null) {
final String filterString = ".*" + filter.toLowerCase() + ".*";
final Tag tag = getTagByName(filter.trim());
if (tag != null) {
filterBuilder = filterBuilder.withFuzzyNameOrExactTag(filterString, tag);
} else {
filterBuilder = filterBuilder.withFuzzyName(filterString);
}
}
final String queryFilter = filterBuilder.buildFilter();
final Map<String, Object> params = filterBuilder.getParams();
preprocessACLs(query, queryFilter, params, false);
result = execute(query, params);
result.setObjects(result.getList(Project.class).stream().filter(p -> !isChildOf(p, project.getUuid()) && !p.getUuid().equals(project.getUuid())).toList());
result.setTotal(result.getObjects().size());
return result;