You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.7 KiB
JavaScript
115 lines
2.7 KiB
JavaScript
8 years ago
|
/*jshint laxbreak:true */
|
||
|
(function (window) {
|
||
|
'use strict';
|
||
|
|
||
|
var htmlEscapes = {
|
||
|
'&': '&',
|
||
|
'<': '<',
|
||
|
'>': '>',
|
||
|
'"': '"',
|
||
|
'\'': ''',
|
||
|
'`': '`'
|
||
|
};
|
||
|
|
||
|
var escapeHtmlChar = function (chr) {
|
||
|
return htmlEscapes[chr];
|
||
|
};
|
||
|
|
||
|
var reUnescapedHtml = /[&<>"'`]/g;
|
||
|
var reHasUnescapedHtml = new RegExp(reUnescapedHtml.source);
|
||
|
|
||
|
var escape = function (string) {
|
||
|
return (string && reHasUnescapedHtml.test(string))
|
||
|
? string.replace(reUnescapedHtml, escapeHtmlChar)
|
||
|
: string;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Sets up defaults for all the Template methods such as a default template
|
||
|
*
|
||
|
* @constructor
|
||
|
*/
|
||
|
function Template() {
|
||
|
this.defaultTemplate
|
||
|
= '<li data-id="{{id}}" class="{{completed}}">'
|
||
|
+ '<div class="view">'
|
||
|
+ '<input class="toggle" type="checkbox" {{checked}}>'
|
||
|
+ '<label>{{title}}</label>'
|
||
|
+ '<button class="destroy"></button>'
|
||
|
+ '</div>'
|
||
|
+ '</li>';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates an <li> HTML string and returns it for placement in your app.
|
||
|
*
|
||
|
* NOTE: In real life you should be using a templating engine such as Mustache
|
||
|
* or Handlebars, however, this is a vanilla JS example.
|
||
|
*
|
||
|
* @param {object} data The object containing keys you want to find in the
|
||
|
* template to replace.
|
||
|
* @returns {string} HTML String of an <li> element
|
||
|
*
|
||
|
* @example
|
||
|
* view.show({
|
||
|
* id: 1,
|
||
|
* title: "Hello World",
|
||
|
* completed: 0,
|
||
|
* });
|
||
|
*/
|
||
|
Template.prototype.show = function (data) {
|
||
8 years ago
|
var i = 0, l = data.length;
|
||
8 years ago
|
var view = '';
|
||
|
|
||
8 years ago
|
for (; i < l; i++) {
|
||
8 years ago
|
var template = this.defaultTemplate;
|
||
|
var completed = '';
|
||
|
var checked = '';
|
||
|
|
||
|
if (data[i].completed) {
|
||
|
completed = 'completed';
|
||
|
checked = 'checked';
|
||
|
}
|
||
|
|
||
|
template = template.replace('{{id}}', data[i].id);
|
||
|
template = template.replace('{{title}}', escape(data[i].title));
|
||
|
template = template.replace('{{completed}}', completed);
|
||
|
template = template.replace('{{checked}}', checked);
|
||
|
|
||
|
view = view + template;
|
||
|
}
|
||
|
|
||
|
return view;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Displays a counter of how many to dos are left to complete
|
||
|
*
|
||
|
* @param {number} activeTodos The number of active todos.
|
||
|
* @returns {string} String containing the count
|
||
|
*/
|
||
|
Template.prototype.itemCounter = function (activeTodos) {
|
||
|
var plural = activeTodos === 1 ? '' : 's';
|
||
|
|
||
|
return '<strong>' + activeTodos + '</strong> item' + plural + ' left';
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Updates the text within the "Clear completed" button
|
||
|
*
|
||
|
* @param {[type]} completedTodos The number of completed todos.
|
||
|
* @returns {string} String containing the count
|
||
|
*/
|
||
|
Template.prototype.clearCompletedButton = function (completedTodos) {
|
||
|
if (completedTodos > 0) {
|
||
|
return 'Clear completed';
|
||
|
} else {
|
||
|
return '';
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Export to window
|
||
|
window.app = window.app || {};
|
||
|
window.app.Template = Template;
|
||
|
})(window);
|