From d10ba04ec9c3d5f4809c852247ee2b4ecf50ff2b Mon Sep 17 00:00:00 2001 From: Abdullah Almsaeed Date: Sat, 25 Feb 2017 14:38:26 -0500 Subject: [PATCH] Add TodoList plugin --- build/js/TodoList.js | 107 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 build/js/TodoList.js diff --git a/build/js/TodoList.js b/build/js/TodoList.js new file mode 100644 index 000000000..ebac0bacc --- /dev/null +++ b/build/js/TodoList.js @@ -0,0 +1,107 @@ +/* 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 = { + iCheck : false, + onCheck : function () { + }, + onUnCheck: function () { + } + } + + 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)