feat(edit): implement editing functionality for todos

This commit is contained in:
2025-06-23 10:10:43 +02:00
parent 534f10f65c
commit 7064c174df
3 changed files with 39 additions and 46 deletions

View File

@ -1,7 +1,8 @@
import {Component, inject, OnInit} from '@angular/core'; import {Component, inject, input, InputSignal, OnInit} from '@angular/core';
import {ActivatedRoute, Router} from "@angular/router";
import {TodoService} from "../service/todo.service";
import {FormBuilder, FormGroup, ReactiveFormsModule, Validators} from "@angular/forms"; import {FormBuilder, FormGroup, ReactiveFormsModule, Validators} from "@angular/forms";
import {GetTask} from "../dto/models";
import {TodoService} from "../service/todo.service";
import {assert} from "@angular/compiler-cli/linker";
@Component({ @Component({
selector: 'app-edit', selector: 'app-edit',
@ -12,33 +13,19 @@ import {FormBuilder, FormGroup, ReactiveFormsModule, Validators} from "@angular/
styleUrl: './edit.component.css' styleUrl: './edit.component.css'
}) })
export default class EditComponent implements OnInit{ export default class EditComponent implements OnInit{
private id!: number;
private todoService: TodoService = inject(TodoService);
private route: ActivatedRoute = inject(ActivatedRoute);
private fb: FormBuilder = inject(FormBuilder); private fb: FormBuilder = inject(FormBuilder);
private todoService: TodoService = inject(TodoService);
public form!: FormGroup; public form!: FormGroup;
public todo: InputSignal<GetTask|null> = input<GetTask|null>(null);
ngOnInit() { ngOnInit() {
this.id = parseInt(this.route.snapshot.paramMap.get('id') ?? '', 10);
const old = this.todoService.getOne(this.id);
this.form = this.fb.group({ this.form = this.fb.group({
title: ['', Validators.required], title: [this.todo()?.title, Validators.required],
dueDate: ['', Validators.required], dueDate: [this.todo()?.dueDate, Validators.required],
}); });
old.subscribe((old => {
this.form.patchValue({
title: old.title,
dueDate: old.dueDate,
})
}))
} }
edit() { edit() {
const edited = this.form.value as { title: string, dueDate: Date }; this.todoService.edit(this.form.value, this.todo()?.id ?? 0)
this.todoService.edit(edited, this.id).subscribe(() => this.todoService.todos.reload());
} }
} }

View File

@ -10,12 +10,12 @@
@for (todo of todos.value(); track todo.id) { @for (todo of todos.value(); track todo.id) {
<tr> <tr>
<td> <td>
{{todo.title}} {{ todo.title }}
@if (todo.done) { @if (todo.done) {
&checkmark; &checkmark;
} }
</td> </td>
<td>{{todo.dueDate | date}}</td> <td>{{ todo.dueDate | date }}</td>
<td> <td>
<button (click)="markAsDone(todo)">Done</button> <button (click)="markAsDone(todo)">Done</button>
<button (click)="edit(todo)">Edit</button> <button (click)="edit(todo)">Edit</button>
@ -25,3 +25,7 @@
} }
</tbody> </tbody>
</table> </table>
@if (editingTodo() !== null) {
<app-edit [todo]="editingTodo()" />
}

View File

@ -1,13 +1,15 @@
import {Component, inject} from '@angular/core'; import {Component, inject, signal, WritableSignal} from '@angular/core';
import {TodoService} from "../service/todo.service"; import {TodoService} from "../service/todo.service";
import {DatePipe} from "@angular/common"; import {DatePipe} from "@angular/common";
import {GetTask} from "../dto/models"; import {GetTask} from "../dto/models";
import EditComponent from "../edit/edit.component";
@Component({ @Component({
selector: 'app-table', selector: 'app-table',
standalone: true, standalone: true,
imports: [ imports: [
DatePipe, DatePipe,
EditComponent,
], ],
templateUrl: './table.component.html', templateUrl: './table.component.html',
styleUrl: './table.component.css' styleUrl: './table.component.css'
@ -15,7 +17,7 @@ import {GetTask} from "../dto/models";
export class TableComponent { export class TableComponent {
todoService: TodoService = inject(TodoService); todoService: TodoService = inject(TodoService);
todos = this.todoService.todos; todos = this.todoService.todos;
editingTodo: WritableSignal<GetTask|null> = signal(null);
markAsDone(todo: GetTask) { markAsDone(todo: GetTask) {
this.todoService.markAsDone(todo).subscribe(() => this.todos.reload()); this.todoService.markAsDone(todo).subscribe(() => this.todos.reload());
@ -26,6 +28,6 @@ export class TableComponent {
} }
edit(todo: GetTask) { edit(todo: GetTask) {
this.editingTodo.set(todo);
} }
} }