chore: Fix editing

This commit is contained in:
Jan K9f 2025-06-23 10:57:16 +02:00
commit bb67052158
Signed by: jank
GPG key ID: 22BEAC760B3333D6
6 changed files with 30 additions and 17 deletions

View file

@ -1,7 +1,8 @@
<p>create-todo works!</p>
<form [formGroup]="form" (submit)="submit()"> <form [formGroup]="form" (submit)="submit()">
<input type="number" formControlName="id" style="display: hidden" />
<input type="text" formControlName="title" /> <input type="text" formControlName="title" />
<input type="date" formControlName="dueDate" /> <input type="date" formControlName="dueDate" />
<button type="submit">Create</button> <button type="submit">{{ isEditing() ? "Update" : "Create" }}</button>
@if (isEditing()) {
<button type="button" (click)="stopEdit()">Stop Editing</button>
}
</form> </form>

View file

@ -1,9 +1,8 @@
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
import { Component, Input, input, ResourceRef } from '@angular/core'; import { Component, Input, ResourceRef, signal } from '@angular/core';
import { import {
FormControl, FormControl,
FormGroup, FormGroup,
FormsModule,
ReactiveFormsModule, ReactiveFormsModule,
Validators, Validators,
} from '@angular/forms'; } from '@angular/forms';
@ -17,7 +16,9 @@ import {
export class CreateTodo { export class CreateTodo {
public form!: FormGroup; public form!: FormGroup;
private datePipe = new DatePipe('en-US'); private datePipe = new DatePipe('en-US');
public isEditing = signal(false);
@Input({ required: true }) tasks!: ResourceRef<any>; @Input({ required: true }) tasks!: ResourceRef<any>;
@Input() editTodo: number = -1;
submit() { submit() {
if (this.form.valid) { if (this.form.valid) {
@ -30,8 +31,9 @@ export class CreateTodo {
} }
} }
editTask(task: Task) { stopEdit() {
this.form.patchValue({ id: task.id }); this.isEditing.set(false);
this.form.controls['id'].setValue(-1);
} }
updateTask(task: Task) { updateTask(task: Task) {
@ -44,6 +46,7 @@ export class CreateTodo {
}).then(() => { }).then(() => {
this.tasks.reload(); this.tasks.reload();
}); });
this.isEditing.set(false);
} }
createTask(task: Task) { createTask(task: Task) {
@ -58,6 +61,15 @@ export class CreateTodo {
}); });
} }
editTask(task: Task) {
this.form.controls['id'].setValue(task.id);
this.form.controls['title'].setValue(task.title);
this.form.controls['dueDate'].setValue(
this.datePipe.transform(task.dueDate, 'yyyy-MM-dd'),
);
this.isEditing.set(true);
}
ngOnInit() { ngOnInit() {
this.form = new FormGroup({ this.form = new FormGroup({
id: new FormControl(-1), id: new FormControl(-1),
@ -65,6 +77,7 @@ export class CreateTodo {
dueDate: new FormControl( dueDate: new FormControl(
this.datePipe.transform(new Date(), 'yyyy-MM-dd'), this.datePipe.transform(new Date(), 'yyyy-MM-dd'),
), ),
done: new FormControl(false),
}); });
} }
} }

View file

@ -1,2 +1,2 @@
<app-create-todo #form [tasks]="table.tasks"></app-create-todo> <app-create-todo #form [tasks]="table.tasks"></app-create-todo>
<app-todo-table #table [editTask]="form.editTask"></app-todo-table> <app-todo-table #table (editTaskEvent)="form.editTask($event)"></app-todo-table>

View file

@ -1,11 +1,10 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { RouterOutlet } from '@angular/router';
import { TodoTable } from '../todo-table/todo-table'; import { TodoTable } from '../todo-table/todo-table';
import { CreateTodo } from '../create-todo/create-todo'; import { CreateTodo } from '../create-todo/create-todo';
@Component({ @Component({
selector: 'app-home', selector: 'app-home',
imports: [RouterOutlet, TodoTable, CreateTodo], imports: [TodoTable, CreateTodo],
templateUrl: './home.html', templateUrl: './home.html',
styleUrl: './home.css', styleUrl: './home.css',
}) })

View file

@ -1,4 +1,3 @@
<p>todo-table works!</p>
<table> <table>
<thead> <thead>
<tr> <tr>

View file

@ -1,10 +1,7 @@
import { JsonPipe } from '@angular/common'; import { Component, EventEmitter, Output, resource } from '@angular/core';
import { Component, computed, effect, Input, resource } from '@angular/core';
import { CreateTodo } from '../create-todo/create-todo';
@Component({ @Component({
selector: 'app-todo-table', selector: 'app-todo-table',
imports: [JsonPipe, CreateTodo],
templateUrl: './todo-table.html', templateUrl: './todo-table.html',
styleUrl: './todo-table.css', styleUrl: './todo-table.css',
}) })
@ -12,10 +9,14 @@ export class TodoTable {
public tasks = resource({ public tasks = resource({
loader: async (): Promise<Task[]> => { loader: async (): Promise<Task[]> => {
const response = await fetch('http://localhost:2000/api/tasks'); const response = await fetch('http://localhost:2000/api/tasks');
return await response.json(); return (await response.json()) as Task[];
}, },
}); });
@Input({ required: true }) editTask!: (task: Task) => void; @Output() editTaskEvent = new EventEmitter<Task>();
editTask(task: Task) {
this.editTaskEvent.emit(task);
}
toggleTaskDoneStatus(task: Task) { toggleTaskDoneStatus(task: Task) {
fetch('http://localhost:2000/api/tasks/' + task.id, { fetch('http://localhost:2000/api/tasks/' + task.id, {