diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml
index 86e32db..07e8d25 100644
--- a/backend/.idea/workspace.xml
+++ b/backend/.idea/workspace.xml
@@ -5,7 +5,10 @@
-
+
+
+
+
@@ -41,33 +44,33 @@
- {
+ "keyToString": {
+ "RequestMappingsPanelOrder0": "0",
+ "RequestMappingsPanelOrder1": "1",
+ "RequestMappingsPanelWidth0": "75",
+ "RequestMappingsPanelWidth1": "75",
+ "RunOnceActivity.OpenProjectViewOnStart": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "WebServerToolWindowFactoryState": "false",
+ "git-widget-placeholder": "issue-11-angular-update",
+ "last_directory_selection": "D:/Programmierprojekte/TimeManager/backend/src/main/java/core/api/models/timemanager",
+ "last_opened_file_path": "D:/Programmierprojekte/Dicewars/client",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "settings.editor.selected.configurable": "swagger",
+ "ts.external.directory.path": "/snap/intellij-idea-ultimate/459/plugins/javascript-impl/jsLanguageServicesImpl/external",
+ "vue.rearranger.settings.migration": "true"
},
- "keyToStringList": {
- "DatabaseDriversLRU": [
- "mariadb"
+ "keyToStringList": {
+ "DatabaseDriversLRU": [
+ "mariadb"
]
}
-}]]>
+}
@@ -100,6 +103,8 @@
+
+
diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts
index c107997..8043478 100644
--- a/frontend/src/app/app.module.ts
+++ b/frontend/src/app/app.module.ts
@@ -64,6 +64,8 @@ import { BasicSchedulerComponent } from './schedules/basic-scheduler/basic-sched
import { ScheduleDashboardComponent } from './schedules/schedule-dashboard/schedule-dashboard.component';
import { DashboardComponent } from './dashboard/dashboard.component';
import { ActiveScheduleComponent } from './dashboard/active-schedule/active-schedule.component';
+import {MatTreeModule} from "@angular/material/tree";
+import { TaskgroupOverviewComponent } from './dashboard/taskgroup-overview/taskgroup-overview.component';
@NgModule({
declarations: [
AppComponent,
@@ -92,43 +94,45 @@ import { ActiveScheduleComponent } from './dashboard/active-schedule/active-sche
BasicSchedulerComponent,
ScheduleDashboardComponent,
DashboardComponent,
- ActiveScheduleComponent
- ],
- imports: [
- BrowserModule,
- AppRoutingModule,
- FormsModule,
- ApiModule,
- HttpClientModule,
- BrowserAnimationsModule,
- MatToolbarModule,
- MatButtonModule,
- MatIconModule,
- MatDialogModule,
- MatFormFieldModule,
- MatInputModule,
- MatProgressSpinnerModule,
- MatSnackBarModule,
- MatMenuModule,
- MatTabsModule,
- MatTableModule,
- MatCheckboxModule,
- MatCardModule,
- ReactiveFormsModule,
- MatListModule,
- MatDatepickerModule,
- MatInputModule,
- MatDatepickerModule,
- MatMomentDateModule,
- FormsModule,
- MatSlideToggleModule,
- MatSortModule,
- MatPaginatorModule,
- MatProgressBarModule,
- MatExpansionModule,
- CalendarModule.forRoot({provide: DateAdapter, useFactory: adapterFactory}),
- MatSelectModule
+ ActiveScheduleComponent,
+ TaskgroupOverviewComponent
],
+ imports: [
+ BrowserModule,
+ AppRoutingModule,
+ FormsModule,
+ ApiModule,
+ HttpClientModule,
+ BrowserAnimationsModule,
+ MatToolbarModule,
+ MatButtonModule,
+ MatIconModule,
+ MatDialogModule,
+ MatFormFieldModule,
+ MatInputModule,
+ MatProgressSpinnerModule,
+ MatSnackBarModule,
+ MatMenuModule,
+ MatTabsModule,
+ MatTableModule,
+ MatCheckboxModule,
+ MatCardModule,
+ ReactiveFormsModule,
+ MatListModule,
+ MatDatepickerModule,
+ MatInputModule,
+ MatDatepickerModule,
+ MatMomentDateModule,
+ FormsModule,
+ MatSlideToggleModule,
+ MatSortModule,
+ MatPaginatorModule,
+ MatProgressBarModule,
+ MatExpansionModule,
+ CalendarModule.forRoot({provide: DateAdapter, useFactory: adapterFactory}),
+ MatSelectModule,
+ MatTreeModule
+ ],
providers: [
HttpClientModule,
/*
diff --git a/frontend/src/app/dashboard/dashboard.component.css b/frontend/src/app/dashboard/dashboard.component.css
index b6f411a..d6a2964 100644
--- a/frontend/src/app/dashboard/dashboard.component.css
+++ b/frontend/src/app/dashboard/dashboard.component.css
@@ -133,3 +133,10 @@
.right-actions {
float: right;
}
+
+.taskgroup-first-child {
+ background-color: #f3f3f3;
+ border: 0 solid #000000;
+ border-top-width: 1px;
+ border-bottom-width: 1px;
+}
diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html
index 3b16ade..a516d20 100644
--- a/frontend/src/app/dashboard/dashboard.component.html
+++ b/frontend/src/app/dashboard/dashboard.component.html
@@ -39,12 +39,10 @@
+
-
-
-
-
-
+
+
diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts
index 0a089b9..ccc66d2 100644
--- a/frontend/src/app/dashboard/dashboard.component.ts
+++ b/frontend/src/app/dashboard/dashboard.component.ts
@@ -42,4 +42,6 @@ export class DashboardComponent implements OnInit{
this.workedMinutesToday += stopActiveScheduleInfo.workedMinutes;
this.schedules = this.schedules.filter(schedule => schedule.scheduleID !== stopActiveScheduleInfo.schedule.scheduleID);
}
+
+
}
diff --git a/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.css b/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.css
new file mode 100644
index 0000000..ff6ca31
--- /dev/null
+++ b/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.css
@@ -0,0 +1,148 @@
+.container {
+ margin: 20px auto;
+ width: 70%;
+ display: flex;
+}
+
+.spacer {
+ margin-bottom: 2.5%;
+}
+
+
+@media screen and (max-width: 600px) {
+ .container {
+ width: 100%;
+ margin: 20px 10px;
+ }
+}
+
+.today-worked-info {
+ margin-left: 20px;
+ background-color: #e1e1e1;
+ padding-right: 5px;
+ padding-left: 5px;
+ border-radius: 5px;
+}
+
+.red-card {
+ background-color: #e54c3c;
+ color: white;
+}
+
+.green-card {
+ background-color: #00bc8c;
+ color: white;
+}
+
+.main-container {
+ width: 45%;
+ margin-right: 20px;
+}
+
+.btn-link {
+ text-decoration: underline;
+ color: white;
+ margin-left: 20px;
+}
+
+.dashboard-heading {
+ margin-top: 20px;
+ font-size: 2.5em;
+}
+
+.today-worked-info {
+ font-size: .8em;
+}
+
+
+.lightBlueBtn {
+ background-color: #3498db;
+ color: white;
+}
+
+.grayBtn {
+ background-color: #444444;
+ color: white;
+ border-radius: 0;
+}
+
+::ng-deep .mat-mdc-list-base {
+ --mdc-list-list-item-label-text-color: white
+}
+
+::ng-deep .mat-mdc-list-base .taskgroup-btn, ::ng-deep .mat-mdc-list-base .taskgroup-last-btn {
+ --mdc-list-list-item-label-text-color: black
+}
+
+.taskgroup-overview {
+ width: 25%;
+ float: right;
+}
+
+.spacer {
+ flex: 1 1 auto;
+}
+
+.taskgroup-btn {
+ background-color: #f3f3f3;
+ border: 0 solid #000000;
+ border-bottom-width: 1px;
+}
+
+.taskgroup-last-btn {
+ background-color: #f3f3f3;
+}
+
+.link-no-deco {
+ text-decoration: none;
+ color: black;
+}
+
+.link-no-deco:hover{
+ text-decoration: underline;
+}
+
+.gray-text {
+ color: #6e6e6e;
+}
+
+.yellowBtn {
+ background-color: #f39c12;
+ color: white;
+ border-radius: 0;
+}
+
+.primaryBtn {
+ border-radius: 0;
+}
+
+
+::ng-deep .mat-mdc-card-header-text {
+ display: block;
+ width: 100%;
+}
+
+.schedule-del-btn {
+ margin-top: 10px;
+}
+
+.left-actions {
+ float: left;
+}
+
+.right-actions {
+ float: right;
+}
+
+.taskgroup-first-child {
+ background-color: #f3f3f3;
+ border: 0 solid #000000;
+ border-top-width: 1px;
+ border-bottom-width: 1px;
+}
+
+.node-name {
+ font-style: normal;
+ font-weight: normal;
+ text-align: left;
+}
diff --git a/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.html b/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.html
new file mode 100644
index 0000000..c0b2d37
--- /dev/null
+++ b/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.spec.ts b/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.spec.ts
new file mode 100644
index 0000000..064cc0d
--- /dev/null
+++ b/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.spec.ts
@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { TaskgroupOverviewComponent } from './taskgroup-overview.component';
+
+describe('TaskgroupOverviewComponent', () => {
+ let component: TaskgroupOverviewComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ declarations: [TaskgroupOverviewComponent]
+ });
+ fixture = TestBed.createComponent(TaskgroupOverviewComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.ts b/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.ts
new file mode 100644
index 0000000..acf9627
--- /dev/null
+++ b/frontend/src/app/dashboard/taskgroup-overview/taskgroup-overview.component.ts
@@ -0,0 +1,87 @@
+import { Component } from '@angular/core';
+import {MatIconModule} from "@angular/material/icon";
+import {MatButtonModule} from "@angular/material/button";
+import {MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule} from "@angular/material/tree";
+import {FlatTreeControl} from "@angular/cdk/tree";
+
+
+interface TreeNode {
+ name: string
+ children?: TreeNode[]
+}
+
+const TREE_DATA: TreeNode[] = [
+ {
+ name: "KIT",
+ children: [
+ {
+ name: "WS23",
+ children: [
+ {
+ name: "Computergrafik",
+ children: [{name: "Vorlesungen"}, {name: "Globalübungen"}]
+ },
+ {
+ name: "Softwaretechnik II",
+ children: [{name: "Vorlesungen"}, {name: "Globalübungen"}]
+ },
+ {
+ name: "Algorithmen II",
+ children: [{name: "Vorlesungen"}, {name: "Globalübungen"}]
+ }
+ ]
+ },
+ {
+ name: "SS24",
+ children: [
+ {
+ name: "Interaktive Computergrafik",
+ children: [{name: "Vorlesungen"}, {name: "Globalübungen"}]
+ }
+ ]
+ }
+ ]
+ }
+]
+
+/** Flat node with expandable and level information */
+interface ExampleFlatNode {
+ expandable: boolean;
+ name: string;
+ level: number;
+}
+@Component({
+ selector: 'app-taskgroup-overview',
+ templateUrl: './taskgroup-overview.component.html',
+ styleUrls: ['./taskgroup-overview.component.css']
+})
+export class TaskgroupOverviewComponent {
+
+ private _transformer = (node: TreeNode, level: number) => {
+ return {
+ expandable: !!node.children && node.children.length > 0,
+ name: node.name,
+ level: level,
+ };
+ };
+
+ treeControl = new FlatTreeControl(
+ node => node.level,
+ node => node.expandable,
+ );
+
+ treeFlattener = new MatTreeFlattener(
+ this._transformer,
+ node => node.level,
+ node => node.expandable,
+ node => node.children,
+ );
+
+ dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
+
+ constructor() {
+ this.dataSource.data = TREE_DATA;
+ }
+
+ hasChild = (_: number, node: ExampleFlatNode) => node.expandable;
+}