Visualize Overdue Taskgroups
This commit is contained in:
parent
7394f9910a
commit
2c6c5dd6a6
@ -5,10 +5,9 @@
|
|||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="3a869f59-290a-4ab2-b036-a878ce801bc4" name="Changes" comment="Remove update spamming in console">
|
<list default="true" id="3a869f59-290a-4ab2-b036-a878ce801bc4" name="Changes" comment="Remove update spamming in console">
|
||||||
<change afterPath="$PROJECT_DIR$/src/main/java/core/api/models/timemanager/taskgroup/RecursiveTaskgroupInfo.java" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/src/main/java/core/api/models/timemanager/tasks/TaskOverviewInfo.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/main/java/core/api/controller/TaskgroupController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/core/api/controller/TaskgroupController.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/src/main/java/core/api/models/timemanager/taskgroup/RecursiveTaskgroupInfo.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/core/api/models/timemanager/taskgroup/RecursiveTaskgroupInfo.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/src/main/java/core/entities/timemanager/Taskgroup.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/core/entities/timemanager/Taskgroup.java" afterDir="false" />
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
@ -104,7 +103,7 @@
|
|||||||
<workItem from="1698246651541" duration="5106000" />
|
<workItem from="1698246651541" duration="5106000" />
|
||||||
<workItem from="1698298897364" duration="4242000" />
|
<workItem from="1698298897364" duration="4242000" />
|
||||||
<workItem from="1698426430946" duration="665000" />
|
<workItem from="1698426430946" duration="665000" />
|
||||||
<workItem from="1698474363766" duration="1934000" />
|
<workItem from="1698474363766" duration="3686000" />
|
||||||
</task>
|
</task>
|
||||||
<task id="LOCAL-00001" summary="Structure Taskgroups in Hierarchies">
|
<task id="LOCAL-00001" summary="Structure Taskgroups in Hierarchies">
|
||||||
<option name="closed" value="true" />
|
<option name="closed" value="true" />
|
||||||
|
@ -4,7 +4,9 @@ import core.api.models.timemanager.tasks.TaskOverviewInfo;
|
|||||||
import core.entities.timemanager.Task;
|
import core.entities.timemanager.Task;
|
||||||
import core.entities.timemanager.Taskgroup;
|
import core.entities.timemanager.Taskgroup;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class RecursiveTaskgroupInfo {
|
public class RecursiveTaskgroupInfo {
|
||||||
@ -12,9 +14,13 @@ public class RecursiveTaskgroupInfo {
|
|||||||
private long taskgroupID;
|
private long taskgroupID;
|
||||||
private String taskgroupName;
|
private String taskgroupName;
|
||||||
|
|
||||||
|
private boolean hasOverdueTask;
|
||||||
|
|
||||||
|
private int amountActiveTasks;
|
||||||
|
|
||||||
private List<RecursiveTaskgroupInfo> childTaskgroups = new ArrayList<>();
|
private List<RecursiveTaskgroupInfo> childTaskgroups = new ArrayList<>();
|
||||||
|
|
||||||
private List<TaskOverviewInfo> activeTasks = new ArrayList<>();
|
private List<TaskOverviewInfo> activeTasks = new LinkedList<>();
|
||||||
|
|
||||||
public RecursiveTaskgroupInfo(Taskgroup taskgroup) {
|
public RecursiveTaskgroupInfo(Taskgroup taskgroup) {
|
||||||
this.taskgroupID = taskgroup.getTaskgroupID();
|
this.taskgroupID = taskgroup.getTaskgroupID();
|
||||||
@ -24,9 +30,13 @@ public class RecursiveTaskgroupInfo {
|
|||||||
this.childTaskgroups.add(new RecursiveTaskgroupInfo(child));
|
this.childTaskgroups.add(new RecursiveTaskgroupInfo(child));
|
||||||
}
|
}
|
||||||
|
|
||||||
for(Task task : taskgroup.getTasks()) {
|
for(Task task : taskgroup.getActiveTasks()) {
|
||||||
this.activeTasks.add(new TaskOverviewInfo(task));
|
this.activeTasks.add(new TaskOverviewInfo(task));
|
||||||
|
if(task.getDeadline().isBefore(LocalDate.now())) {
|
||||||
|
this.hasOverdueTask = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
this.amountActiveTasks = taskgroup.getAmountOfActiveTasks();
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getTaskgroupID() {
|
public long getTaskgroupID() {
|
||||||
@ -60,4 +70,20 @@ public class RecursiveTaskgroupInfo {
|
|||||||
public void setActiveTasks(List<TaskOverviewInfo> activeTasks) {
|
public void setActiveTasks(List<TaskOverviewInfo> activeTasks) {
|
||||||
this.activeTasks = activeTasks;
|
this.activeTasks = activeTasks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isHasOverdueTask() {
|
||||||
|
return hasOverdueTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHasOverdueTask(boolean hasOverdueTask) {
|
||||||
|
this.hasOverdueTask = hasOverdueTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAmountActiveTasks() {
|
||||||
|
return amountActiveTasks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAmountActiveTasks(int amountActiveTasks) {
|
||||||
|
this.amountActiveTasks = amountActiveTasks;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -97,4 +97,22 @@ public class Taskgroup {
|
|||||||
}
|
}
|
||||||
return ancestors;
|
return ancestors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Task> getActiveTasks() {
|
||||||
|
List<Task> tasks = new LinkedList<>();
|
||||||
|
for(Task task : this.tasks) {
|
||||||
|
if(!task.isFinished()) {
|
||||||
|
tasks.add(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tasks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAmountOfActiveTasks() {
|
||||||
|
int activeAmountTasks = getActiveTasks().size();
|
||||||
|
for(Taskgroup taskgroup : children) {
|
||||||
|
activeAmountTasks += taskgroup.getAmountOfActiveTasks();
|
||||||
|
}
|
||||||
|
return activeAmountTasks;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,5 +23,13 @@ export interface RecursiveTaskgroupInfo {
|
|||||||
taskgroupName: string;
|
taskgroupName: string;
|
||||||
childTaskgroups: Array<RecursiveTaskgroupInfo>;
|
childTaskgroups: Array<RecursiveTaskgroupInfo>;
|
||||||
activeTasks: Array<TaskOverviewInfo>;
|
activeTasks: Array<TaskOverviewInfo>;
|
||||||
|
/**
|
||||||
|
* determines whether the taskgroup has an overdue task or not
|
||||||
|
*/
|
||||||
|
hasOverdueTask: boolean;
|
||||||
|
/**
|
||||||
|
* determines the number of active tasks that can be scheduled
|
||||||
|
*/
|
||||||
|
amountActiveTasks: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,3 +161,7 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.overdue-taskgroup {
|
||||||
|
background-color: #ff6354;
|
||||||
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
</mat-action-list>
|
</mat-action-list>
|
||||||
<mat-tree [dataSource]="dataSource" [treeControl]="treeControl" >
|
<mat-tree [dataSource]="dataSource" [treeControl]="treeControl" >
|
||||||
<!-- This is the tree node template for leaf nodes -->
|
<!-- This is the tree node template for leaf nodes -->
|
||||||
<mat-tree-node *matTreeNodeDef="let node" matTreeNodePadding class="taskgroup-btn" matTreeNodePaddingIndent="10">
|
<mat-tree-node *matTreeNodeDef="let node" matTreeNodePadding class="taskgroup-btn" matTreeNodePaddingIndent="10" [ngClass]="node.hasOverdueTask? 'overdue-taskgroup':''">
|
||||||
<!-- use a disabled button to provide padding for tree leaf -->
|
<!-- use a disabled button to provide padding for tree leaf -->
|
||||||
<button mat-icon-button disabled></button>
|
<button mat-icon-button disabled></button>
|
||||||
<div class="treenode-content-container">
|
<div class="treenode-content-container">
|
||||||
@ -13,7 +13,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</mat-tree-node>
|
</mat-tree-node>
|
||||||
<!-- This is the tree node template for expandable nodes -->
|
<!-- This is the tree node template for expandable nodes -->
|
||||||
<mat-tree-node *matTreeNodeDef="let node;when: hasChild" matTreeNodePadding class="taskgroup-btn" matTreeNodePaddingIndent="10">
|
<mat-tree-node *matTreeNodeDef="let node;when: hasChild" matTreeNodePadding class="taskgroup-btn" matTreeNodePaddingIndent="10" [ngClass]="node.hasOverdueTask? 'overdue-taskgroup':''">
|
||||||
<button mat-icon-button matTreeNodeToggle
|
<button mat-icon-button matTreeNodeToggle
|
||||||
[attr.aria-label]="'Toggle ' + node.name" style="padding-left: 10px">
|
[attr.aria-label]="'Toggle ' + node.name" style="padding-left: 10px">
|
||||||
<mat-icon class="mat-icon-rtl-mirror">
|
<mat-icon class="mat-icon-rtl-mirror">
|
||||||
@ -24,6 +24,7 @@
|
|||||||
<button mat-button class="node-name">{{node.name}}</button>
|
<button mat-button class="node-name">{{node.name}}</button>
|
||||||
<span class="spacer"></span>
|
<span class="spacer"></span>
|
||||||
<div class="task-number">{{node.activeTasks}}</div>
|
<div class="task-number">{{node.activeTasks}}</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</mat-tree-node>
|
</mat-tree-node>
|
||||||
</mat-tree>
|
</mat-tree>
|
||||||
|
@ -14,6 +14,7 @@ interface ExampleFlatNode {
|
|||||||
name: string;
|
name: string;
|
||||||
level: number;
|
level: number;
|
||||||
activeTasks: number;
|
activeTasks: number;
|
||||||
|
hasOverdueTask: boolean
|
||||||
}
|
}
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-taskgroup-overview',
|
selector: 'app-taskgroup-overview',
|
||||||
@ -26,7 +27,8 @@ export class TaskgroupOverviewComponent {
|
|||||||
expandable: !!node.childTaskgroups && node.childTaskgroups.length > 0,
|
expandable: !!node.childTaskgroups && node.childTaskgroups.length > 0,
|
||||||
name: node.taskgroupName,
|
name: node.taskgroupName,
|
||||||
level: level,
|
level: level,
|
||||||
activeTasks: node.activeTasks.length
|
activeTasks: node.amountActiveTasks,
|
||||||
|
hasOverdueTask: node.hasOverdueTask
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
10
openapi.yaml
10
openapi.yaml
@ -2002,6 +2002,8 @@ components:
|
|||||||
- taskgroupName
|
- taskgroupName
|
||||||
- childTaskgroups
|
- childTaskgroups
|
||||||
- activeTasks
|
- activeTasks
|
||||||
|
- hasOverdueTask
|
||||||
|
- amountActiveTasks
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
properties:
|
properties:
|
||||||
taskgroupID:
|
taskgroupID:
|
||||||
@ -2022,6 +2024,14 @@ components:
|
|||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
$ref: '#/components/schemas/TaskOverviewInfo'
|
$ref: '#/components/schemas/TaskOverviewInfo'
|
||||||
|
hasOverdueTask:
|
||||||
|
type: boolean
|
||||||
|
example: true
|
||||||
|
description: determines whether the taskgroup has an overdue task or not
|
||||||
|
amountActiveTasks:
|
||||||
|
type: number
|
||||||
|
example: 2
|
||||||
|
description: determines the number of active tasks that can be scheduled
|
||||||
TaskOverviewInfo:
|
TaskOverviewInfo:
|
||||||
required:
|
required:
|
||||||
- taskID
|
- taskID
|
||||||
|
Loading…
Reference in New Issue
Block a user