Add functionalty to add task

This commit is contained in:
Huffle 2025-05-18 16:15:34 +02:00
parent f72cc8a802
commit 61694e340f
8 changed files with 124 additions and 35 deletions

View File

@ -2,5 +2,5 @@ export interface Task {
id: number; id: number;
name: string; name: string;
reward: number; reward: number;
assigned: number; assigned: number | null;
} }

View File

@ -1,7 +1,7 @@
<ion-header [translucent]="true"> <ion-header [translucent]="true">
<ion-toolbar> <ion-toolbar>
<ion-title *ngIf="isAddMode">Create Task</ion-title> <ion-title *ngIf="isAddMode">Create Task</ion-title>
<ion-title **ngIf="!isAddMode">Edit Task</ion-title> <ion-title *ngIf="!isAddMode">Edit Task</ion-title>
</ion-toolbar> </ion-toolbar>
</ion-header> </ion-header>
@ -13,7 +13,12 @@
<label>Reward</label> <label>Reward</label>
<input id="name" type="number" formControlName="reward"/> <input id="name" type="number" formControlName="reward"/>
<button type="button" [disabled]="!form.valid"> <label>Assigned</label>
<select formControlName="assigned">
<option *ngFor="let user of users" [value]="user.id">{{ user.name }}</option>
</select>
<button type="button" [disabled]="!form.valid" (click)="submit()">
<span *ngIf="isAddMode">Add Task</span> <span *ngIf="isAddMode">Add Task</span>
<span *ngIf="!isAddMode">Update Task</span> <span *ngIf="!isAddMode">Update Task</span>
</button> </button>

View File

@ -0,0 +1,34 @@
form {
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
}
label {
color: var(--ion-color-primary);
margin-top: 25px;
margin-bottom: 10px;
}
input,
select {
border: 1px solid var(--ion-color-primary);
border-radius: 5px;
width: 250px;
}
button {
background-color: var(--ion-color-primary);
border-radius: 5px;
color: white;
padding: 10px;
width: 250px;
margin-top: auto;
margin-bottom: 50px;
}
button:disabled,
button[disabled]{
opacity: 0.5;
}

View File

@ -1,7 +1,10 @@
import { Location } from '@angular/common';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { User } from 'src/app/models/user';
import { TaskService } from 'src/app/services/task.service'; import { TaskService } from 'src/app/services/task.service';
import { UserService } from 'src/app/services/user.service';
@Component({ @Component({
selector: 'app-edit-task', selector: 'app-edit-task',
@ -13,25 +16,30 @@ export class EditTaskPage implements OnInit {
form: FormGroup; form: FormGroup;
id: number; id: number;
isAddMode: boolean; isAddMode: boolean;
users: Array<User> = [{id: 0, name: 'unassigned'}];
constructor( constructor(
private route: ActivatedRoute, private route: ActivatedRoute,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private taskService: TaskService, private taskService: TaskService,
private userService: UserService,
private router: Router
) { ) {
console.log('Test?')
this.id = this.route.snapshot.params['id']; this.id = this.route.snapshot.params['id'];
this.isAddMode = !this.id; this.isAddMode = !this.id;
this.form = this.formBuilder.group({ this.form = this.formBuilder.group({
name: ['', Validators.required], name: ['', Validators.required],
reward: ['', Validators.required], reward: ['', [Validators.required, Validators.pattern("^[0-9]*$")]],
assigned: ['', Validators.required] assigned: [0, Validators.required]
}); });
} }
ngOnInit() { ngOnInit() {
console.log('Test?') this.userService.getUserList().subscribe(users => {
this.users.push(...users);
});
if (!this.isAddMode) { if (!this.isAddMode) {
this.taskService.getTaskById(this.id).subscribe(task => { this.taskService.getTaskById(this.id).subscribe(task => {
this.form.setValue({ this.form.setValue({
@ -43,4 +51,23 @@ export class EditTaskPage implements OnInit {
} }
} }
submit() {
const formValue = this.form.value;
let assigned: number | null = Number(formValue.assigned);
if (assigned === 0) {
assigned = null;
}
const task = {
name: formValue.name,
reward: formValue.reward,
assigned
}
if (this.isAddMode) {
this.taskService.createTask(task);
} else {}
this.router.navigate(['/tabs/tasks']);
}
} }

View File

@ -6,11 +6,9 @@ const routes: Routes = [
{ {
path: '', path: '',
component: TasksPage, component: TasksPage,
children: [ },
{ path: 'add', loadChildren: () => import('../edit-task/edit-task.module').then(m => m.EditTaskPageModule) }, { path: 'add', loadChildren: () => import('../edit-task/edit-task.module').then(m => m.EditTaskPageModule) },
{ path: 'edit/:id', loadChildren: () => import('../edit-task/edit-task.module').then(m => m.EditTaskPageModule) } { path: 'edit/:id', loadChildren: () => import('../edit-task/edit-task.module').then(m => m.EditTaskPageModule) }
]
}
]; ];
@NgModule({ @NgModule({

View File

@ -1,24 +1,28 @@
<ion-header [translucent]="true" class="ion-no-border"> <ion-header [translucent]="true" class="ion-no-border">
<ion-toolbar> <ion-toolbar>
<ion-title> <div class="toolbar">
Tasks <ion-title>
</ion-title> Tasks
</ion-title>
<button class="add-button" (click)="createTask()">Add task</button>
</div>
</ion-toolbar> </ion-toolbar>
</ion-header> </ion-header>
<ion-content> <ion-content>
<div class="icon"> <div class="content">
<mat-icon>filter_alt</mat-icon> <div class="icon">
</div> <mat-icon>filter_alt</mat-icon>
<div class="list"> </div>
<div class="task" *ngFor="let task of tasks"> <div class="list">
<button>Done</button> <div class="task" *ngFor="let task of tasks$ | async">
<div class="name">{{ task.name }}</div> <button>Done</button>
<div <div class="name">{{ task.name }}</div>
class="reward" <div
[ngClass]="{ 'negative': task.reward < 0 }" class="reward"
>{{ task.reward.toFixed(2) }} SP</div> [ngClass]="{ 'negative': task.reward < 0 }"
>{{ task.reward.toFixed(2) }} SP</div>
</div>
</div> </div>
</div> </div>
<button (click)="createTask()">ADD</button>
</ion-content> </ion-content>

View File

@ -1,3 +1,13 @@
.toolbar {
display: flex;
}
.content {
display: flex;
flex-direction: column;
height: 100%;
}
.icon { .icon {
padding: 5px; padding: 5px;
display: flex; display: flex;
@ -44,4 +54,10 @@ button {
border-radius: 10px; border-radius: 10px;
color: white; color: white;
background: var(--confirm-button-color); background: var(--confirm-button-color);
}
.add-button {
background-color: var(--ion-color-primary);
margin-right: 15px;
width: 75px;
} }

View File

@ -1,34 +1,39 @@
import { Component, OnInit } from '@angular/core'; import { ChangeDetectionStrategy, Component } from '@angular/core';
import { TaskService } from 'src/app/services/task.service'; import { TaskService } from 'src/app/services/task.service';
import { Task } from 'src/app/models/task'; import { Task } from 'src/app/models/task';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { BehaviorSubject } from 'rxjs';
import { ViewWillEnter } from '@ionic/angular';
@Component({ @Component({
selector: 'app-tasks', selector: 'app-tasks',
templateUrl: 'tasks.page.html', templateUrl: 'tasks.page.html',
styleUrls: ['tasks.page.scss'], styleUrls: ['tasks.page.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false, standalone: false,
}) })
export class TasksPage implements OnInit { export class TasksPage implements ViewWillEnter {
public tasks: Array<Task> = []; public tasks$: BehaviorSubject<Array<Task>> = new BehaviorSubject<Array<Task>>([]);
constructor( constructor(
private taskService: TaskService, private taskService: TaskService,
private router: Router, private router: Router,
private route: ActivatedRoute private route: ActivatedRoute
) {} ) {
this.getTasks();
}
ngOnInit(): void { ionViewWillEnter(): void {
this.getTasks(); this.getTasks();
} }
getTasks() { getTasks() {
this.taskService.getTaskList().subscribe(tasks => { this.taskService.getTaskList().subscribe(tasks => {
this.tasks = tasks; this.tasks$.next(tasks);
}); });
} }
createTask() { createTask() {
this.router.navigate(['edit', 1], { relativeTo: this.route }); this.router.navigate(['add'], { relativeTo: this.route });
} }
} }