-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsimpleGrid.min.js
More file actions
2 lines (2 loc) · 10.8 KB
/
simpleGrid.min.js
File metadata and controls
2 lines (2 loc) · 10.8 KB
1
2
/*! simpleGrid.js - v: 0.1 - 2015-21-08 // 2015 Albert Cansado Sola; Licensed MIT*/
!function(t,e){"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():t.simpleGrid=e()}(this,function(){"use strict";function t(t){return new RegExp("(^|\\s+)"+t+"(\\s+|$)")}var e=function(t,i,s){if("string"==typeof i&&(i=i.split(".")),i.length>1){var r=i.shift();return(n.isNull(t[r])||!n.isObject(t[r]))&&(t[r]={}),e(t[r],i,s)}return n.isUndefined(s)||(t[i[0]]=s),t[i[0]]},n={hasClass:function(e,n){return t(n).test(e.className)},addClass:function(t,e){n.hasClass(t,e)||(n.isEmpty(t.className)||(e=" "+e),t.className=t.className+e)},removeClass:function(e,n){e.className=e.className.replace(t(n),"")},toggleClass:function(t,e){var i=n.hasClass(t,e)?n.removeClass:n.addClass;i(t,e)},on:function(t,e,i){return n.isNodeList(t)?void n.foreach(t,function(t){n.on(t,e,i)}):void t.addEventListener(e,i.bind(e))},off:function(t,e){t.removeEventListener(e)},isNull:function(t){return Boolean(null===t)},isUndefined:function(t){return"undefined"==typeof t},isEmpty:function(t){return!t||0===t.length},isElement:function(t){return!(!t||1!==t.nodeType)},isNodeList:function(t){return!n.isUndefined(t.length)&&!n.isUndefined(t.item)},isJqObject:function(t){try{return t instanceof jQuery}catch(e){return!1}},isObject:function(t){var e=typeof t;return"function"===e||"object"===e&&!!t},isFunction:function(t){return"function"==typeof t},isString:function(t){return"string"==typeof t},equalTag:function(t,e){try{return t.tagName.toLowerCase()===e.toString()}catch(n){return!1}},insert:function(t,e,i){return i=n.isUndefined(i)?!0:Boolean(i),n.isElement(e)?t.appendChild(e):t[i?"innerHTML":"textContent"]=e.toString(),t},value:function(t,e){return n.isUndefined(e)||(n.equalTag(t,"input")?t.value=e:n.insert(t,e)),n.equalTag(t,"input")?t.value:n.isElement(t)?t.innerHTML:t},matchSelector:function(t,e,i){if(!e)return!1;n.isUndefined(i)&&(i=e.charAt(0));var s=!1;return s="."===i?n.hasClass(t,e.substr(1)):"#"===i?t.id===e.substr(1):"["===i?t.hasAttribute(e.substr(1,e.length-1)):n.equalTag(t,e)},getParents:function(t,e,i){var s=[],r="";for(e&&(r=e.charAt(0));t&&t!==document&&(e?n.matchSelector(t,e,r)&&s.push(t):s.push(t),!i||!s.length);t=t.parentNode);return s},getParent:function(t,e){var i=n.getParents(t,e,!0);return i.length?i[0]:[]},foreach:function(t,e){n.isNodeList(t)&&[].slice.call(t).forEach(e)},extend:function(){var t={},e=function(e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=n.isObject(e[i])?n.extend(t[i],e[i]):e[i])};e(arguments[0]);for(var i=1,s=arguments.length;s>i;i++){var r=arguments[i];e(r)}return t},formatNumber:function(t,e,n){for(var i="",s="",r=0,o=!1,a=!1,c=0,d=e.length;d>c;c++)switch(e[c]){case",":case".":i&&(s=i),i=e[c],r=0;break;case"#":r++;break;case" ":o=!0;break;case"c":a=0===c?"first":"last"}var l=Number(t).formatMoney(r,i,s);return a&&n&&(l="first"===a?o?n+" "+l:n+l:o?l+" "+n:l+n),l}};Number.prototype.formatMoney=function(t,e,i){t=isNaN(t=Math.abs(t))?2:t,e=n.isUndefined(e)?".":e,i=n.isUndefined(i)?",":i;var s=this,r=0>s?"-":"",o=parseInt(s=Math.abs(+s||0).toFixed(t))+"",a=(a=o.length)>3?a%3:0;return r+(a?o.substr(0,a)+i:"")+o.substr(a).replace(/(\d{3})(?=\d)/g,"$1"+i)+(t?e+Math.abs(s-o).toFixed(t).slice(2):"")};var i={selector:".js-simpleGrid",emptyText:"Nada :(",removeText:"Are you sure you want to delete this row?",icons:{edit:"",remove:"",cancel:"",save:""},oddClass:"sg-odd",evenClass:"sg-even",headers:[],allowEmpty:!0,actions:{add:!0,edit:!0,remove:!0},columns:{},sorting:!0},s=function(){this.options=n.extend({},i,arguments[0]),this.el=document.querySelector(this.config("selector")),this.el&&(this._data={},this.init())};return s.prototype.nextId=0,s.prototype.data=function(t,e,i){switch(n.isUndefined(i)&&!n.isUndefined(e)&&(i=e),i){case"edit":if(n.isUndefined(e)||!n.isObject(t))return!1;this._data[e]=t;break;case"remove":if(!n.isString(t))return!1;delete this._data[t];break;case"get":var s=this._data[t];return n.isUndefined(s)?"":e===i?s:s.hasOwnProperty(e)?s[e]:"";case"addAll":if(!n.isObject(t))return!1;this._data=t;break;case"add":default:if(!n.isObject(t))return!1;this._data[e]=t}return n.insert(this.saveInput,JSON.stringify(this._data)),!0},s.prototype.config=function(t,n){return e(this.options,t,n)},s.prototype.init=function(){if(this.table=this.el.querySelector("table"),this.emptyRow=this.table.querySelector(".sg-empty-row"),this.addBtn=this.el.querySelector(".sg-add"),this.saveInput=this.el.querySelector(".sg-textarea"),n.isNull(this.table)||n.isNull(this.emptyRow)||n.isNull(this.saveInput))throw"init elements are wrong";this.config("cols",this.table.querySelectorAll("th").length),this.table=this.el.querySelector("tbody"),this._initData(),this.config("sorting")&&window.jQuery&&jQuery.tableDnD?(this.orderBtn=this.el.querySelector(".sg-order"),this._sorting()):this.config("sorting",!1);var t=this.table.rows.length;this.config("empty",1===t),this.nextId=t-1,this._toggleEmpty(!this.config("empty")),this._attachEvents()},s.prototype._initData=function(){var t=this.saveInput.innerHTML;if(!n.isEmpty(t)){try{this._data=JSON.parse(t)}catch(e){return!1}for(var i in this._data)this._data.hasOwnProperty(i)&&this.addRow(i,0)}},s.prototype._allow=function(t){return n.isUndefined(t)?!1:Boolean(this.config("actions."+t))},s.prototype._setId=function(){var t=this.nextId;return this.nextId+=1,"sg"+t},s.prototype._isNew=function(t){var e=!1;return n.equalTag(t,"tr")&&(e=Boolean(parseInt(t.getAttribute("data-new"),10))),e},s.prototype._attachEvents=function(){this._allow("add")&&n.on(this.addBtn,"click",this.onAddRow.bind(this)),this.config("sorting")&&n.on(this.orderBtn,"click",this.onSaveOrder.bind(this)),n.on(this.table,"keypress",this.onKeyPress.bind(this))},s.prototype._toggleEmpty=function(t){n[Boolean(t)?"addClass":"removeClass"](this.emptyRow,"sg-hidden")},s.prototype._evenOddClass=function(t,e){n.addClass(t,this.config(e%2?"evenClass":"oddClass"))},s.prototype._resetRowsClass=function(){for(var t=this.table.rows,e=1,i=t.length-1;i>=e;e++){var s=t[e];n.removeClass(s,this.config("evenClass")),n.removeClass(s,this.config("oddClass")),this._evenOddClass(s,e)}},s.prototype._sorting=function(){return this.config("sorting")?(n.isUndefined(this.tablednd)?this.tablednd=$(this.table).tableDnD({onDragClass:"sg-drag"}):this.tablednd.tableDnDUpdate(),!0):!1},s.prototype._formatContent=function(t,e){if(n.isUndefined(e))return t;var i=this.config("columns."+e);return i&&"number"===i.type&&(t=n.formatNumber(t,i.format,i.currency)),t},s.prototype._createEditBtn=function(){var t=document.createElement("button");return t.className="sg-btn sg-btn--edit",t.onclick=this.onEditRow.bind(this),t.innerHTML='<img src="'+this.config("icons.edit")+'" alt="Edit">',t.href="#",t},s.prototype._createDeleteBtn=function(){var t=document.createElement("button");return t.className="sg-btn sg-btn--delete",t.onclick=this.onDeleteRow.bind(this),t.innerHTML='<img src="'+this.config("icons.remove")+'" alt="Delete">',t},s.prototype._createCancelEditBtn=function(){var t=document.createElement("button");return t.className="sg-btn sg-btn--cancel",t.onclick=this.onCancelRow.bind(this),t.innerHTML='<img src="'+this.config("icons.cancel")+'" alt="Cancel">',t},s.prototype._createSaveBtn=function(){var t=document.createElement("button");return t.className="sg-btn sg-btn--save",n.on(t,"click",this.onSaveRow.bind(this)),t.innerHTML='<img src="'+this.config("icons.save")+'" alt="Save">',t},s.prototype._createEditingDiv=function(){var t=document.createElement("div");return t.className="sg-options--edit",t.appendChild(this._createSaveBtn()),t.appendChild(this._createCancelEditBtn()),t},s.prototype._createNormalDiv=function(){var t=document.createElement("div");return t.className="sg-options",this._allow("edit")&&t.appendChild(this._createEditBtn()),this._allow("remove")&&t.appendChild(this._createDeleteBtn()),t},s.prototype._createOptionsCell=function(t,e){var n=this.addCell(t,e);n.appendChild(this._createNormalDiv()),n.appendChild(this._createEditingDiv())},s.prototype._createInput=function(t,e){var i=document.createElement("input");return i.type="text",i.className="sg-input",n.isUndefined(t)||i.setAttribute("data-label",t),n.isUndefined(e)||(i.value=e),i},s.prototype.onKeyPress=function(t){(13===t.which||13===t.charCode)&&this.onSaveRow(t)},s.prototype.onAddRow=function(t){t.preventDefault();var e=this.config("empty");e&&(this._toggleEmpty(e),this.config("empty",!e)),this.addRow()},s.prototype.onEditRow=function(t){t.preventDefault();var e=n.getParent(t.currentTarget,"tr");e&&(e.setAttribute("data-new",0),this._toggleColumns(e,!0))},s.prototype.onDeleteRow=function(t){if(t.preventDefault(),confirm(this.config("removeText"))){var e=n.getParent(t.currentTarget,"tr");e&&(this.removeRow(e),this._resetRowsClass(),this._sorting())}},s.prototype.onCancelRow=function(t){t.preventDefault();var e=n.getParent(t.currentTarget,"tr"),i=this._isNew(e);i?this.removeRow(e):this._toggleColumns(e,!1)},s.prototype.onSaveRow=function(t){t.preventDefault();for(var e=n.getParent(t.target,"tr"),i=this._isNew(e),s=e.getAttribute("data-id"),r={},o=!0,a=0,c=this.config("cols")-1;c>a;a++){var d=e.children[a],l=n.value(d.children[0]);!n.isEmpty(l)&&o&&(o=!1),r[d.getAttribute("data-label")]=l}return!this.config("allowEmpty")&&o?void this.removeRow(e):(this.data(r,s,i?"add":"edit"),this._toggleColumns(e),void this._sorting())},s.prototype.onSaveOrder=function(t){t.preventDefault();for(var e={},n=this.table.rows,i=1,s=n.length;s>i;i++){var r=n[i].getAttribute("data-id");e[r]=this.data(r,"get")}this.data(e,"addAll"),this._resetRowsClass()},s.prototype._createColums=function(t,e){for(var n=this._isNew(t),i=0,s=this.config("cols")-1;s>i;i++){var r=this.config("headers."+i),o="";o=n?this._createInput():this._formatContent(this.data(e,r,"get"),r),this.addCell(t,i,r,o)}this._createOptionsCell(t,i)},s.prototype._toggleColumns=function(t,e){e=n.isUndefined(e)?!1:e;for(var i=t.getAttribute("data-id"),s=0,r=this.config("cols")-1;r>s;s++){var o=this.config("headers."+s),a=t.children[s],c="";c=e?this._createInput(o,this.data(i,o,"get")):this._formatContent(this.data(i,o,"get"),o),a.innerHTML="",n.insert(a,c)}n[e?"addClass":"removeClass"](t,"sg-is-editing")},s.prototype.addCell=function(t,e,i,s){var r=t.insertCell(e);if(r.className="sg-col sg-col"+e.toString(),n.isUndefined(i)||r.setAttribute("data-label",i),!n.isUndefined(s)){var o=s;n.isFunction(s)&&(o=s.apply(this)),n.insert(r,o)}return r},s.prototype.addRow=function(t,e){n.isUndefined(t)&&(t=this._setId()),n.isUndefined(e)&&(e=1);try{var i=this.table.insertRow(-1);i.setAttribute("data-new",e),i.setAttribute("data-id",t),this._evenOddClass(i,this.table.rows.length-1),this._createColums(i,t),e&&n.addClass(i,"sg-is-editing")}catch(s){return this.removeRow(i),!1}return!0},s.prototype.removeRow=function(t){try{this.data(t.getAttribute("data-id"),"remove"),this.table.deleteRow(t.rowIndex-1)}catch(e){}1===this.table.rows.length&&(this.config("empty",!0),this.config("nextId",0),this._toggleEmpty(!1))},s});