UNPKG

metro4

Version:

The front-end framework for Build responsive, mobile-first projects on the web with the first front-end component library in Metro Style

244 lines (193 loc) 6.94 kB
/* global Metro */ (function(Metro, $) { 'use strict'; var Utils = Metro.utils; var SorterDefaultConfig = { sorterDeferred: 0, thousandSeparator: ",", decimalSeparator: ",", sortTarget: null, sortSource: null, sortDir: "asc", sortStart: true, saveInitial: true, onSortStart: Metro.noop, onSortStop: Metro.noop, onSortItemSwitch: Metro.noop, onSorterCreate: Metro.noop }; Metro.sorterSetup = function (options) { SorterDefaultConfig = $.extend({}, SorterDefaultConfig, options); }; if (typeof window["metroSorterSetup"] !== undefined) { Metro.sorterSetup(window["metroSorterSetup"]); } Metro.Component('sorter', { init: function( options, elem ) { this._super(elem, options, SorterDefaultConfig, { initial: [] }); return this; }, _create: function(){ var element = this.element; this._createStructure(); this._fireEvent("sorter-create", { element: element }); }, _createStructure: function(){ var element = this.element, o = this.options; if (o.sortTarget === null) { o.sortTarget = element.children()[0].tagName; } this.initial = element.find(o.sortTarget).get(); if (o.sortStart === true) { this.sort(o.sortDir); } }, _getItemContent: function(item){ var o = this.options; var data, inset, i, format; if (Utils.isValue(o.sortSource)) { data = ""; inset = item.getElementsByClassName(o.sortSource); if (inset.length > 0) for (i = 0; i < inset.length; i++) { data += inset[i].textContent; } format = inset[0].dataset.format; } else { data = item.textContent; format = item.dataset.format; } data = (""+data).toLowerCase().replace(/[\n\r]+|[\s]{2,}/g, ' ').trim(); if (Utils.isValue(format)) { if (['number', 'int', 'float', 'money'].indexOf(format) !== -1 && (o.thousandSeparator !== "," || o.decimalSeparator !== "." )) { data = Utils.parseNumber(data, o.thousandSeparator, o.decimalSeparator); } switch (format) { case "date": data = Utils.isDate(data) ? new Date(data) : ""; break; case "number": data = Number(data); break; case "int": data = parseInt(data); break; case "float": data = parseFloat(data); break; case "money": data = Utils.parseMoney(data); break; case "card": data = Utils.parseCard(data); break; case "phone": data = Utils.parsePhone(data); break; } } return data; }, sort: function(dir){ var that = this, element = this.element, o = this.options; var items; var id = Utils.elementId("temp"); var prev; if (dir !== undefined) { o.sortDir = dir; } items = element.find(o.sortTarget).get(); if (items.length === 0) { return ; } prev = $("<div>").attr("id", id).insertBefore($(element.find(o.sortTarget)[0])); this._fireEvent("sort-start", { items: items }); items.sort(function(a, b){ var c1 = that._getItemContent(a); var c2 = that._getItemContent(b); var result = 0; if (c1 < c2 ) { result = -1; } if (c1 > c2 ) { result = 1; } if (result !== 0) { that._fireEvent("sort-item-switch", { a: a, b: b, result: result }); } return result; }); if (o.sortDir === "desc") { items.reverse(); } element.find(o.sortTarget).remove(); $.each(items, function(){ var $this = $(this); $this.insertAfter(prev); prev = $this; }); $("#"+id).remove(); this._fireEvent("sort-stop", { items: items }); }, reset: function(){ var element = this.element, o = this.options; var items; var id = Utils.elementId('sorter'); var prev; items = this.initial; if (items.length === 0) { return ; } prev = $("<div>").attr("id", id).insertBefore($(element.find(o.sortTarget)[0])); element.find(o.sortTarget).remove(); $.each(items, function(){ var $this = $(this); $this.insertAfter(prev); prev = $this; }); $("#"+id).remove(); }, changeAttribute: function(attributeName){ var that = this, element = this.element, o = this.options; var changeSortDir = function() { var dir = element.attr("data-sort-dir").trim(); if (dir === "") return; o.sortDir = dir; that.sort(); }; var changeSortContent = function(){ var content = element.attr("data-sort-content").trim(); if (content === "") return ; o.sortContent = content; that.sort(); }; switch (attributeName) { case "data-sort-dir": changeSortDir(); break; case "data-sort-content": changeSortContent(); break; } }, destroy: function(){ return this.element; } }); Metro['sorter'] = { create: function(el, op){ return Utils.$()(el).sorter(op); }, isSorter: function(el){ return Utils.isMetroObject(el, "sorter"); }, sort: function(el, dir){ if (!this.isSorter(el)) { return false; } if (dir === undefined) { dir = "asc"; } Metro.getPlugin(el, "sorter").sort(dir); }, reset: function(el){ if (!this.isSorter(el)) { return false; } Metro.getPlugin(el, "sorter").reset(); } }; }(Metro, m4q));