diff --git a/task-1/src/main.js b/task-1/src/main.ts similarity index 62% rename from task-1/src/main.js rename to task-1/src/main.ts index a822bdf..1e85d56 100644 --- a/task-1/src/main.js +++ b/task-1/src/main.ts @@ -1,33 +1,34 @@ import { TaskManager } from "./task-manager.js"; import { TaskStore } from "./store.js"; import { AppView } from "./views/app-view.js"; +import { FilterStatus, TaskHandlers } from "./types.js"; const taskManager = new TaskManager(new TaskStore()); -let currentFilter = "all"; -let appView; +let currentFilter: FilterStatus = "all"; +let appView: AppView; -function render() { +function render(): void { appView.render(taskManager.getFiltered(currentFilter), currentFilter); } -const handlers = { - onAdd(title, description) { +const handlers: TaskHandlers = { + onAdd(title: string, description: string): void { taskManager.addTask(title, description); render(); }, - onToggle(id) { + onToggle(id: string): void { taskManager.toggleTask(id); render(); }, - onDelete(id) { + onDelete(id: string): void { taskManager.deleteTask(id); render(); }, - onEdit(id, title, description) { + onEdit(id: string, title: string, description: string): void { taskManager.editTask(id, title, description); render(); }, - onFilter(status) { + onFilter(status: FilterStatus): void { currentFilter = status; render(); }, diff --git a/task-1/src/store.js b/task-1/src/store.ts similarity index 77% rename from task-1/src/store.js rename to task-1/src/store.ts index ad81051..290aab1 100644 --- a/task-1/src/store.js +++ b/task-1/src/store.ts @@ -1,7 +1,9 @@ +import { Task } from './types.js'; + export class TaskStore { STORAGE_KEY = "todo-tasks"; - load() { + load(): Task[] { try { const raw = localStorage.getItem(this.STORAGE_KEY); if (!raw) return []; @@ -11,7 +13,7 @@ export class TaskStore { } } - save(tasks) { + save(tasks: Task[]): void { localStorage.setItem(this.STORAGE_KEY, JSON.stringify(tasks)); } -} +} \ No newline at end of file diff --git a/task-1/src/task-manager.js b/task-1/src/task-manager.ts similarity index 66% rename from task-1/src/task-manager.js rename to task-1/src/task-manager.ts index 8d976f9..27ffea0 100644 --- a/task-1/src/task-manager.js +++ b/task-1/src/task-manager.ts @@ -1,17 +1,21 @@ +import { Task, FilterStatus } from './types.js'; +import { TaskStore } from './store.js'; + export class TaskManager { - tasks = []; + tasks: Task[] = []; + store: TaskStore; - constructor(store) { + constructor(store: TaskStore) { this.store = store; this.tasks = store.load(); } - save() { + save(): void { this.store.save(this.tasks); } - addTask(title, description) { - const newTask = { + addTask(title: string, description: string): void { + const newTask: Task = { id: crypto.randomUUID(), title, description, @@ -21,26 +25,26 @@ export class TaskManager { this.save(); } - deleteTask(id) { + deleteTask(id: string): void { this.tasks = this.tasks.filter((task) => task.id !== id); this.save(); } - toggleTask(id) { + toggleTask(id: string): void { this.tasks = this.tasks.map((task) => task.id === id ? { ...task, completed: !task.completed } : task, ); this.save(); } - editTask(id, title, description) { + editTask(id: string, title: string, description: string): void { this.tasks = this.tasks.map((task) => task.id === id ? { ...task, title, description } : task, ); this.save(); } - getFiltered(status) { + getFiltered(status: FilterStatus): Task[] { switch (status) { case "all": return this.tasks; @@ -50,4 +54,4 @@ export class TaskManager { return this.tasks.filter((task) => !task.completed); } } -} +} \ No newline at end of file diff --git a/task-1/src/types.ts b/task-1/src/types.ts new file mode 100644 index 0000000..b17790f --- /dev/null +++ b/task-1/src/types.ts @@ -0,0 +1,17 @@ + +export interface Task { + id: string; + title: string; + description: string; + completed: boolean; +} + +export type FilterStatus = 'all' | 'completed' | 'pending'; + +export interface TaskHandlers { + onAdd(title: string, description: string): void; + onToggle(id: string): void; + onDelete(id: string): void; + onEdit(id: string, title: string, description: string): void; + onFilter(status: FilterStatus): void; +} diff --git a/task-1/src/views/app-view.js b/task-1/src/views/app-view.ts similarity index 57% rename from task-1/src/views/app-view.js rename to task-1/src/views/app-view.ts index a6185e2..054b44b 100644 --- a/task-1/src/views/app-view.js +++ b/task-1/src/views/app-view.ts @@ -1,7 +1,11 @@ import { TaskListView } from "./task-list-view.js"; +import { Task, TaskHandlers, FilterStatus } from "../types.js"; export class AppView { - constructor(root, handlers) { + filterBar: HTMLDivElement; + taskListView: TaskListView; + + constructor(root: HTMLElement, handlers: TaskHandlers) { root.innerHTML = String.raw`