diff --git a/src/app/app.component.html b/src/app/app.component.html index f733ffe..d78e6c6 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,3 +1,3 @@ - + diff --git a/src/app/app.component.ts b/src/app/app.component.ts index a585c96..fb702f8 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -2,11 +2,12 @@ import { Component } from '@angular/core'; import { RouterOutlet } from '@angular/router'; import {TodoTableComponent} from "./todo/table/todo-table.component"; import {NavbarComponent} from "./navbar.component"; +import {FlashComponent} from "./flash.component"; @Component({ selector: 'app-root', standalone: true, - imports: [RouterOutlet, TodoTableComponent, NavbarComponent], + imports: [RouterOutlet, TodoTableComponent, NavbarComponent, FlashComponent], templateUrl: './app.component.html', styleUrl: './app.component.css' }) diff --git a/src/app/flash.component.ts b/src/app/flash.component.ts new file mode 100644 index 0000000..d160422 --- /dev/null +++ b/src/app/flash.component.ts @@ -0,0 +1,64 @@ +import {Component, inject, OnInit} from "@angular/core"; +import {NgClass, NgIf} from "@angular/common"; +import {ActivatedRoute, NavigationStart, Router} from "@angular/router"; + + +@Component({ + standalone: true, + selector: 'app-flash', + imports: [ + NgClass, + NgIf + ], + template: ` +
+

{{ message }}

+
+ ` +}) +export class FlashComponent implements OnInit{ + message!: string; + + error: boolean = false; + + route: ActivatedRoute = inject(ActivatedRoute); + + router: Router = inject(Router); + + timeOutId: number = 0; + + ngOnInit() { + this.listenToRouteChanges(); + + this.displayMessage(); + } + + private listenToRouteChanges() { + this.router.events.subscribe((event) => { + if (event instanceof NavigationStart) { + console.log('NavigationStart'); + this.displayMessage(); + } + }); + } + + private displayMessage() { + this.route.queryParams.subscribe(params => { + if (params['message']) { + this.message = params['message']; + this.error = params['error'] === 'true'; + } else { + this.message = ''; + } + }); + + if (this.timeOutId) { + clearTimeout(this.timeOutId); + } + + this.timeOutId = setTimeout(() => { + this.message = ''; + this.router.navigate([], { queryParams: { message: null, error: null }, queryParamsHandling: 'merge' }); + }, 5000); + } +} diff --git a/src/app/todo/add-todo.component.ts b/src/app/todo/add-todo.component.ts index b6993cf..cd874d3 100644 --- a/src/app/todo/add-todo.component.ts +++ b/src/app/todo/add-todo.component.ts @@ -2,6 +2,8 @@ import {Component, inject, OnInit} from "@angular/core"; import {FormControl, FormGroup, ReactiveFormsModule, Validators} from "@angular/forms"; import {TodoService} from "./todo.service"; import {Router} from "@angular/router"; +import {FlashComponent} from "../flash.component"; +import {NgIf} from "@angular/common"; @Component({ @@ -37,6 +39,8 @@ export class AddTodoComponent implements OnInit { defaultDate!: Date; + errorMsg: string = ''; + ngOnInit() { const today = new Date(); const tomorrow = new Date(today); @@ -56,7 +60,25 @@ export class AddTodoComponent implements OnInit { category: this.form.get('category')?.value, } + let message = this.validateTodo(newTodo) + if (message) { + this.router.navigate([], {queryParams: {message: message, error: true}}); + return; + } + this.todoService.add(newTodo); - this.router.navigate(['/todos']); + this.router.navigate(['/todos'], {queryParams: {message: 'Todo added successfully'}}); + } + + private validateTodo(newTodo: { dueDate: any; title: any; category: any }) { + if (!newTodo.title) { + return 'Title is required'; + } else if (!newTodo.dueDate) { + return 'Due Date is required'; + } else if (!newTodo.category) { + return 'Category is required'; + } + + return } } diff --git a/src/app/todo/table/todo-table.component.ts b/src/app/todo/table/todo-table.component.ts index ed5d1c2..f2a7991 100644 --- a/src/app/todo/table/todo-table.component.ts +++ b/src/app/todo/table/todo-table.component.ts @@ -4,6 +4,7 @@ import {Todo} from "../todo"; import {NgForOf, NgIf} from "@angular/common"; import {TableFilterComponent} from "./table-filter.component"; import {SettingsService} from "../../settings/settings.service"; +import {Router} from "@angular/router"; @Component({ @@ -13,7 +14,6 @@ import {SettingsService} from "../../settings/settings.service"; NgForOf, TableFilterComponent, NgIf, - ], standalone: true }) @@ -26,6 +26,8 @@ export class TodoTableComponent implements OnInit { isFiltered: boolean = false; + router: Router = inject(Router); + ngOnInit() { this.todos = this.todoService.todos; } @@ -33,14 +35,14 @@ export class TodoTableComponent implements OnInit { deleteTodo(todo: Todo) { this.todoService.delete(todo); - this.todos = this.todoService.todos; + this.router.navigate([], { queryParams: { message: 'Todo deleted' }}); } toggleCompleted(todo: Todo) { todo.completed = !todo.completed; this.todoService.set(this._todos); - this.ngOnInit(); + this.todos = this.todoService.todos; } updateFilter(filter: string) {