<x-todo-form>
<input type="text" placeholder="Add a new task..."
value="{{todo}}" x-enter-pressed="add"/>
<button x-click="add">Add Task</button>
</x-todo-form>
<x-todo-list>
<div>Total: {{count}} | Done: {{done}} | Left: {{left}}</div>
<div x-list="items"></div>
</x-todo-list>
function TodoItem(self, name) {
self.name = name;
self.done = false;
self.delete = () => self.emit('del-todo', self);
self.changed = () => {
self.done = !self.done;
self.emit('task-changed');
};
self.template = `
<div class="todo-item">
<input type="checkbox" x-change="changed" />
<div x-class="done:done">{{name}}</div>
<button x-click="delete">Delete</button>
</div>`;
}
function TodoForm(self) {
self.todo = "";
self.add = () => {
if (!self.todo) return;
self.emit("new-todo", self.todo);
self.todo = "";
}
}
function TodoList(self) {
self.items = new WatchList([]);
self.left = self.done = self.count = 0;
self.countTasks = () => {
self.count = self.items.count();
self.done = self.items.count(x => x.done);
self.left = self.count - self.done;
};
self.on('new-todo', todo => {
self.items.add($(TodoItem, todo));
self.countTasks();
});
self.on('del-todo', todo => {
self.items.delete(x => x === todo);
self.countTasks();
});
self.on('task-changed', self.countTasks);
}
$([TodoForm, TodoList, TodoItem]);