/* TodoList() * ========= * Converts a list into a todoList. * * @Usage: $('.my-list').todoList(options) * or add [data-widget="todo-list"] to the ul element * Pass any option as data-option="value" */ +function ($) { 'use strict' var DataKey = 'lte.todolist' var Default = { onCheck : function (item) { return item }, onUnCheck: function (item) { return item } } var Selector = { data: '[data-widget="todo-list"]' } var ClassName = { done: 'done' } // TodoList Class Definition // ========================= var TodoList = function (element, options) { this.element = element this.options = options this._setUpListeners() } TodoList.prototype.toggle = function (item) { item.parents(Selector.li).first().toggleClass(ClassName.done) if (!item.prop('checked')) { this.unCheck(item) return } this.check(item) } TodoList.prototype.check = function (item) { this.options.onCheck.call(item) } TodoList.prototype.unCheck = function (item) { this.options.onUnCheck.call(item) } // Private TodoList.prototype._setUpListeners = function () { var that = this $(this.element).on('change ifChanged', 'input:checkbox', function () { that.toggle($(this)) }) } // Plugin Definition // ================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data(DataKey) if (!data) { var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option) $this.data(DataKey, (data = new TodoList($this, options))) } if (typeof data == 'string') { if (typeof data[option] == 'undefined') { throw new Error('No method named ' + option) } data[option]() } }) } var old = $.fn.todoList $.fn.todoList = Plugin $.fn.todoList.Constructor = TodoList // No Conflict Mode // ================ $.fn.todoList.noConflict = function () { $.fn.todoList = old return this } // TodoList Data API // ================= $(window).on('load', function () { $(Selector.data).each(function () { Plugin.call($(this)) }) }) }(jQuery)