mirror of
https://github.com/DependencyTrack/dependency-track.git
synced 2025-10-19 16:03:19 +00:00
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:
parent
ace7cc75ea
commit
48688fa958
5 changed files with 208 additions and 10 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue