task-manager
120 строк · 3.4 Кб
1<template>
2<div id="app" class="container mt-4">
3<h1 class="mb-4">Менеджер задач</h1>
4<ThemeSwitcher />
5<ImportExport />
6<div class="mb-3">
7<input v-model="searchQuery" class="form-control mb-2" placeholder="Поиск задач" />
8<select v-model="filter" class="form-control mb-2">
9<option value="all">Все</option>
10<option value="completed">Выполненные</option>
11<option value="incomplete">Невыполненные</option>
12</select>
13<select v-model="sortBy" class="form-control mb-2">
14<option value="date">По дате</option>
15<option value="text">По названию</option>
16</select>
17</div>
18<button class="btn btn-primary mb-3" @click="showAddTaskModal">Добавить задачу</button>
19<TaskList
20:tasks="filteredSortedTasks"
21@remove-task="removeTask"
22@update-task="updateTask"
23/>
24<AddTaskModal v-if="showAddTask" @add-task="addTask" @close="closeAddTaskModal" />
25<EditTaskModal
26v-if="showEditTask"
27:task="taskToEdit"
28@update-task="updateTask"
29@close="closeEditTaskModal"
30/>
31</div>
32</template>
33
34<script>
35import TaskList from './components/TaskList.vue';
36import ThemeSwitcher from './components/ThemeSwitcher.vue';
37import AddTaskModal from './components/AddTaskModal.vue';
38import EditTaskModal from './components/EditTaskModal.vue';
39import ImportExport from './components/ImportExport.vue';
40
41export default {
42name: 'App',
43components: {
44TaskList,
45ThemeSwitcher,
46AddTaskModal,
47EditTaskModal,
48ImportExport
49},
50data() {
51return {
52tasks: this.loadTasks(),
53showAddTask: false,
54showEditTask: false,
55taskToEdit: null,
56searchQuery: '',
57filter: 'all',
58sortBy: 'date'
59};
60},
61computed: {
62filteredSortedTasks() {
63let filteredTasks = this.tasks.filter(task => {
64if (this.filter === 'completed') return task.completed;
65if (this.filter === 'incomplete') return !task.completed;
66return true;
67});
68
69filteredTasks = filteredTasks.filter(task =>
70task.text.toLowerCase().includes(this.searchQuery.toLowerCase())
71);
72
73if (this.sortBy === 'date') {
74return filteredTasks.sort((a, b) => new Date(a.dueDate) - new Date(b.dueDate));
75} else {
76return filteredTasks.sort((a, b) => a.text.localeCompare(b.text));
77}
78}
79},
80methods: {
81loadTasks() {
82const tasks = JSON.parse(localStorage.getItem('tasks')) || [];
83return tasks;
84},
85saveTasks() {
86localStorage.setItem('tasks', JSON.stringify(this.tasks));
87},
88addTask(task) {
89if (task.text.trim() && task.description.trim() && task.dueDate) {
90this.tasks.push({ ...task, completed: false });
91this.saveTasks();
92this.closeAddTaskModal();
93}
94},
95removeTask(index) {
96this.tasks.splice(index, 1);
97this.saveTasks();
98},
99updateTask({ index, updatedTask }) {
100this.tasks.splice(index, 1, updatedTask);
101this.saveTasks();
102this.closeEditTaskModal();
103},
104showAddTaskModal() {
105this.showAddTask = true;
106},
107closeAddTaskModal() {
108this.showAddTask = false;
109},
110showEditTaskModal(task) {
111this.taskToEdit = task;
112this.showEditTask = true;
113},
114closeEditTaskModal() {
115this.showEditTask = false;
116this.taskToEdit = null;
117}
118}
119};
120</script>
121