From f4d0aa3b27b629b51aac0c6fcc6aada0b4d91ba0 Mon Sep 17 00:00:00 2001 From: Florian THIERRY Date: Fri, 4 Mar 2022 09:21:08 +0100 Subject: [PATCH] Add new task list model. --- src/app/core/entity/store.ts | 5 ++ src/app/core/entity/task-list.ts | 7 +++ .../core/service/store-persistence.service.ts | 28 ++++++++++ src/app/core/service/task-list.service.ts | 53 +++++++++++++++++++ todo.md | 14 +++++ 5 files changed, 107 insertions(+) create mode 100644 src/app/core/entity/store.ts create mode 100644 src/app/core/entity/task-list.ts create mode 100644 src/app/core/service/store-persistence.service.ts create mode 100644 src/app/core/service/task-list.service.ts create mode 100644 todo.md diff --git a/src/app/core/entity/store.ts b/src/app/core/entity/store.ts new file mode 100644 index 0000000..57069d8 --- /dev/null +++ b/src/app/core/entity/store.ts @@ -0,0 +1,5 @@ +import { TaskList } from "./task-list"; + +export interface Store { + taskLists: TaskList[]; +} diff --git a/src/app/core/entity/task-list.ts b/src/app/core/entity/task-list.ts new file mode 100644 index 0000000..3c0be43 --- /dev/null +++ b/src/app/core/entity/task-list.ts @@ -0,0 +1,7 @@ +import { Task } from "./task"; + +export interface TaskList { + id: string; + name: string; + tasks: Task[]; +} diff --git a/src/app/core/service/store-persistence.service.ts b/src/app/core/service/store-persistence.service.ts new file mode 100644 index 0000000..923fb45 --- /dev/null +++ b/src/app/core/service/store-persistence.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from "@angular/core"; +import { CookieService } from "ngx-cookie-service"; +import { Store } from "../entity/store"; + +const COOKIE_NAME = 'todo-store'; + +@Injectable({ + providedIn: 'root' +}) +export class StorePersistenceService { + constructor( + private _cookieService: CookieService + ) {} + + save(store: Store): void { + const serializedStore = JSON.stringify(store); + this._cookieService.set(COOKIE_NAME, serializedStore); + } + + load(): Store { + const serializedStore = this._cookieService.get(COOKIE_NAME); + try { + return JSON.parse(serializedStore); + } catch (jsonParseError) { + throw new Error(`JsonSerializationException: Invalid format for store in cookie "${COOKIE_NAME}".`); + } + } +} diff --git a/src/app/core/service/task-list.service.ts b/src/app/core/service/task-list.service.ts new file mode 100644 index 0000000..d79159f --- /dev/null +++ b/src/app/core/service/task-list.service.ts @@ -0,0 +1,53 @@ +import { Injectable } from "@angular/core"; +import { BehaviorSubject } from "rxjs"; +import { Task } from "../entity/task"; +import { TaskList } from "../entity/task-list"; +import { StorePersistenceService } from "./store-persistence.service"; + + +@Injectable({ + providedIn: 'root' +}) +export class TaskListService { + private _activeTaskList: BehaviorSubject = new BehaviorSubject(undefined as unknown as TaskList); + + constructor( + private _storePersistenceService: StorePersistenceService + ) { + this._activeTaskList.asObservable() + .subscribe(activeTaskList => { + const store = this._storePersistenceService.load(); + const storedActiveList = store.taskLists.find(taskList => activeTaskList.id === taskList.id); + if (storedActiveList) { + storedActiveList.name = activeTaskList.name; + storedActiveList.tasks = activeTaskList.tasks; + } else { + store.taskLists.push(activeTaskList); + } + this._storePersistenceService.save(store); + }); + } + + addTask(task: Task): void { + const activeTaskList = this._activeTaskList.value; + + if (!activeTaskList.tasks) { + activeTaskList.tasks = []; + } + + activeTaskList.tasks.push(task); + this._activeTaskList.next(activeTaskList); + } + + createTaskList(taskListName: string): void { + const newTaskList = { + id: taskListName, + name: taskListName, + tasks: [] + } as TaskList; + + const store = this._storePersistenceService.load(); + store.taskLists.push(newTaskList); + this._storePersistenceService.save(store); + } +} diff --git a/todo.md b/todo.md new file mode 100644 index 0000000..5ba69a2 --- /dev/null +++ b/todo.md @@ -0,0 +1,14 @@ +# Fonctionnalités +- Ajouter une tâche +- Renommer la tâche +- Terminer une tâche +- Supprimer une tâche +- Saisir la note d'une tâche +- Ajouter des sous tâches à une autre +- Renommer des sous tâches d'une autre +- Terminer des sous tâches d'une autre +- Supprimer des sous tâches d'une autre + +- J'aimerai "tagger" une tâche comme "asynchrone/bloquante" (où je dois attendre la fin, genre un build jenkins) et donc être notifié toutes les 5mins d'aller vérifier si la tâche est terminée. +- Quand je termine une sous tâche, je veux qu'elle soit archivée pour pouvoir la consulter à postériori +- J'aimerai définir un e API sur laquelle je pourrais sauverader mes tâches, à la manière de git