Commit 0839ee5f authored by Sindre Sorhus's avatar Sindre Sorhus

YUI app - convert to tabs

parent 8f87c1bb
This diff is collapsed.
YUI.add('todo', function (Y) { YUI.add('todo', function (Y) {
"use strict"; "use strict";
// -- Todo Model ------------- // -- Todo Model -------------
var Todo = Y.Base.create('todo', Y.Model, [Y.ModelSync.Local], { var Todo = Y.Base.create('todo', Y.Model, [Y.ModelSync.Local], {
// Set up the root localStorage key we save our Model data in. // Set up the root localStorage key we save our Model data in.
root: 'todos-yui', root: 'todos-yui',
// Toggle the completed state of the Todo. // Toggle the completed state of the Todo.
toggle: function () { toggle: function () {
this.save({completed: !this.get('completed')}); this.save({completed: !this.get('completed')});
}, },
// Destroy this Todo and remove it from localStorage. // Destroy this Todo and remove it from localStorage.
clear: function () { clear: function () {
this.destroy({remove: true}); this.destroy({remove: true});
} }
}, { }, {
// Default attributes. // Default attributes.
ATTRS: { ATTRS: {
title: { title: {
value: 'empty todo ...' value: 'empty todo ...'
}, },
completed: { completed: {
value: false value: false
} }
} }
}); });
// Set this Model under our custom Y.MVC namespace. // Set this Model under our custom Y.MVC namespace.
Y.namespace('TodoMVC').Todo = Todo; Y.namespace('TodoMVC').Todo = Todo;
}, '@VERSION@', { }, '@VERSION@', {
requires: [ requires: [
'gallery-model-sync-local', 'gallery-model-sync-local',
'model' 'model'
] ]
}); });
YUI.add('todo-list', function (Y) { YUI.add('todo-list', function (Y) {
"use strict"; "use strict";
// Dependencies from Y.MVC. // Dependencies from Y.MVC.
var Todo = Y.TodoMVC.Todo, var Todo = Y.TodoMVC.Todo,
TodoList; TodoList;
// -- TodoList Model list ----- // -- TodoList Model list -----
TodoList = Y.Base.create('todoList', Y.ModelList, [Y.ModelSync.Local], { TodoList = Y.Base.create('todoList', Y.ModelList, [Y.ModelSync.Local], {
// The related Model for our Model List. // The related Model for our Model List.
model: Todo, model: Todo,
// The root used for our localStorage key. // The root used for our localStorage key.
root: 'todos-yui', root: 'todos-yui',
// Return a ModelList of our completed Models. // Return a ModelList of our completed Models.
completed: function () { completed: function () {
return this.filter({ asList: true }, function (todo) { return this.filter({ asList: true }, function (todo) {
return todo.get('completed'); return todo.get('completed');
}); });
}, },
// Return an ModelList of our un-completed Models. // Return an ModelList of our un-completed Models.
remaining: function () { remaining: function () {
return this.filter({ asList: true }, function (todo) { return this.filter({ asList: true }, function (todo) {
return !todo.get('completed'); return !todo.get('completed');
}); });
} }
}); });
// Set this Model List under our custom Y.MVC namespace. // Set this Model List under our custom Y.MVC namespace.
Y.namespace('TodoMVC').TodoList = TodoList; Y.namespace('TodoMVC').TodoList = TodoList;
}, '@VERSION@', { }, '@VERSION@', {
requires: [ requires: [
'gallery-model-sync-local', 'gallery-model-sync-local',
'model-list', 'model-list',
'todo' 'todo'
] ]
}); });
YUI.add('todo-view', function (Y) { YUI.add('todo-view', function (Y) {
"use strict"; "use strict";
// -- Todo View ------------------- // -- Todo View -------------------
var TodoView = Y.Base.create('todoView', Y.View, [], { var TodoView = Y.Base.create('todoView', Y.View, [], {
// The container element that the View is rendered under. // The container element that the View is rendered under.
containerTemplate: '<li>', containerTemplate: '<li>',
// Compile our template using Handlebars. // Compile our template using Handlebars.
template: Y.Handlebars.compile(Y.one('#item-template').getHTML()), template: Y.Handlebars.compile(Y.one('#item-template').getHTML()),
// Bind DOM events for handling changes to a specific Todo, // Bind DOM events for handling changes to a specific Todo,
// for completion and editing. // for completion and editing.
events: { events: {
'.toggle': { '.toggle': {
click: 'toggleComplete' click: 'toggleComplete'
}, },
'label': { 'label': {
dblclick: 'edit' dblclick: 'edit'
}, },
'.edit': { '.edit': {
blur: 'close', blur: 'close',
keypress: 'enterUpdate' keypress: 'enterUpdate'
}, },
'.destroy': { '.destroy': {
click: 'clear' click: 'clear'
} }
}, },
// Initialize this view by setting event handlers when the Model // Initialize this view by setting event handlers when the Model
// is updated or destroyed. // is updated or destroyed.
initializer: function () { initializer: function () {
var model = this.get('model'); var model = this.get('model');
model.after('change', this.render, this); model.after('change', this.render, this);
}, },
// Render this view in our <li> container, and fill it with the // Render this view in our <li> container, and fill it with the
// data in our Model. // data in our Model.
render: function () { render: function () {
var container = this.get('container'), var container = this.get('container'),
model = this.get('model'); model = this.get('model');
container.setHTML(this.template(model.toJSON())); container.setHTML(this.template(model.toJSON()));
container.toggleClass('completed', model.get('completed')); container.toggleClass('completed', model.get('completed'));
this.set('inputNode', container.one('.edit')); this.set('inputNode', container.one('.edit'));
return this; return this;
}, },
// Toggle the linked Todo's completion status. // Toggle the linked Todo's completion status.
toggleComplete: function () { toggleComplete: function () {
this.get('model').toggle(); this.get('model').toggle();
}, },
// Turn on editing mode for the Todo by exposing the input field. // Turn on editing mode for the Todo by exposing the input field.
edit: function () { edit: function () {
this.get('container').addClass('editing'); this.get('container').addClass('editing');
this.get('inputNode').focus(); this.get('inputNode').focus();
}, },
// Get the value from our input field while hiding it, and // Get the value from our input field while hiding it, and
// save it to our Todo when focus is lost from the field. // save it to our Todo when focus is lost from the field.
close: function (e) { close: function (e) {
var value = this.get('inputNode').get('value'), var value = this.get('inputNode').get('value'),
editedValue = Y.Escape.html(Y.Lang.trim(value)); editedValue = Y.Escape.html(Y.Lang.trim(value));
this.get('container').removeClass('editing'); this.get('container').removeClass('editing');
if (editedValue) { if (editedValue) {
this.get('model').save({title: editedValue}); this.get('model').save({title: editedValue});
} else { } else {
this.clear(); this.clear();
} }
}, },
// Also allow updating the Todo's text through the enter key. // Also allow updating the Todo's text through the enter key.
enterUpdate: function (e) { enterUpdate: function (e) {
var ENTER_KEY = 13; var ENTER_KEY = 13;
if (e.keyCode === ENTER_KEY) { if (e.keyCode === ENTER_KEY) {
this.close(); this.close();
} }
}, },
// Destroy the model when the delete button is clicked. // Destroy the model when the delete button is clicked.
clear: function (e) { clear: function (e) {
this.get('model').clear(); this.get('model').clear();
} }
}); });
// Set this View under our custom Y.TodoMVC namespace. // Set this View under our custom Y.TodoMVC namespace.
Y.namespace('TodoMVC').TodoView = TodoView; Y.namespace('TodoMVC').TodoView = TodoView;
}, '@VERSION@', { }, '@VERSION@', {
requires: [ requires: [
'view', 'view',
'handlebars' 'handlebars'
] ]
}); });
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment