blob: 40fe7569a5ac7c533aadbbf5999fc0b8885a118c [file] [log] [blame]
library todomvc.web.elements.td_model;
import 'dart:html';
import 'package:polymer/polymer.dart';
import '../lib-elements/polymer_localstorage.dart';
class Todo extends Observable {
@observable String title;
@observable bool completed = false;
Todo(this.title);
Todo.fromJson(Map json)
: title = json['title'], completed = json['completed'];
Map toJson() => { 'title': title, 'completed': completed };
String toString() => "$title (${completed ? '' : 'not '}done)";
}
@CustomTag('td-model')
class TodoModel extends PolymerElement {
@published ObservableList<Todo> items;
@published Iterable<Todo> filtered;
@published String storageId;
@observable int completedCount = 0;
@observable int activeCount = 0;
@observable bool allCompleted = false;
@observable PolymerLocalStorage storage;
@observable String filter;
@observable String activeItemWord;
final filters = {
'active': (item) => !item.completed,
'completed': (item) => item.completed
};
factory TodoModel() => new Element.tag('td-model');
TodoModel.created() : super.created();
void ready() {
async((_) {
if (items == null) items = new ObservableList<Todo>();
});
}
void filterChanged() {
filterItems();
}
void itemsChanged() {
completedCount = items.where(filters['completed']).length;
activeCount = items.length - completedCount;
allCompleted = completedCount > 0 && activeCount == 0;
filterItems();
if (storage != null) {
storage.value = items;
storage.save();
}
// TODO(jmesserly): polymer_expressions lacks ternary operator.
activeItemWord = activeCount == 1 ? 'item' : 'items';
}
void storageIdChanged() {
storage = document.querySelector('#$storageId');
if (storage != null && storage.value != null) {
items = toObservable(storage.value.map((i) => new Todo.fromJson(i)));
}
}
void filterItems() {
var fn = filters[filter];
filtered = fn != null ? items.where(fn) : items;
}
void newItem(String title) {
title = title.trim();
if (title != '') {
items.add(new Todo(title));
itemsChanged();
}
}
void destroyItem(Todo item) {
if (items.remove(item)) itemsChanged();
}
void clearItems() {
items.removeWhere(filters['completed']);
}
void setItemsCompleted(bool completed) {
for (var item in items) {
item.completed = completed;
}
itemsChanged();
}
}