Added actix-files and its dependencies (http-range, mime_guess, unicase, v_htmlescape) to enable static file functionality in the botserver. This will allow serving static assets and files through the web server. The change includes all required transitive dependencies for proper file handling and MIME type detection.
77 lines
1.6 KiB
JavaScript
77 lines
1.6 KiB
JavaScript
function tasksApp() {
|
|
return {
|
|
newTask: '',
|
|
filter: 'all',
|
|
tasks: [],
|
|
|
|
init() {
|
|
const saved = localStorage.getItem('tasks');
|
|
if (saved) {
|
|
try {
|
|
this.tasks = JSON.parse(saved);
|
|
} catch (e) {
|
|
console.error('Failed to load tasks:', e);
|
|
this.tasks = [];
|
|
}
|
|
}
|
|
},
|
|
|
|
addTask() {
|
|
if (this.newTask.trim() === '') return;
|
|
|
|
this.tasks.push({
|
|
id: Date.now(),
|
|
text: this.newTask.trim(),
|
|
completed: false,
|
|
createdAt: new Date().toISOString()
|
|
});
|
|
|
|
this.newTask = '';
|
|
this.save();
|
|
},
|
|
|
|
toggleTask(id) {
|
|
const task = this.tasks.find(t => t.id === id);
|
|
if (task) {
|
|
task.completed = !task.completed;
|
|
this.save();
|
|
}
|
|
},
|
|
|
|
deleteTask(id) {
|
|
this.tasks = this.tasks.filter(t => t.id !== id);
|
|
this.save();
|
|
},
|
|
|
|
clearCompleted() {
|
|
this.tasks = this.tasks.filter(t => !t.completed);
|
|
this.save();
|
|
},
|
|
|
|
save() {
|
|
try {
|
|
localStorage.setItem('tasks', JSON.stringify(this.tasks));
|
|
} catch (e) {
|
|
console.error('Failed to save tasks:', e);
|
|
}
|
|
},
|
|
|
|
get filteredTasks() {
|
|
if (this.filter === 'active') {
|
|
return this.tasks.filter(t => !t.completed);
|
|
}
|
|
if (this.filter === 'completed') {
|
|
return this.tasks.filter(t => t.completed);
|
|
}
|
|
return this.tasks;
|
|
},
|
|
|
|
get activeTasks() {
|
|
return this.tasks.filter(t => !t.completed).length;
|
|
},
|
|
|
|
get completedTasks() {
|
|
return this.tasks.filter(t => t.completed).length;
|
|
}
|
|
};
|
|
}
|