From fa3ebfedeb885713a30453d2f8df142af8a772c5 Mon Sep 17 00:00:00 2001 From: Lauris Date: Mon, 7 Dec 2015 18:40:28 +0200 Subject: [PATCH] Release v0.3.14 - selectable actions. --- bower.json | 2 +- dist/sensei-grid.css | 12 ++- dist/sensei-grid.js | 215 +++++++++++++++++++++++++++++++++++---- dist/sensei-grid.min.css | 2 +- dist/sensei-grid.min.js | 4 +- examples/index.html | 10 +- package.json | 2 +- src/sensei-grid.js | 2 +- 8 files changed, 217 insertions(+), 32 deletions(-) diff --git a/bower.json b/bower.json index 525f4f2..e7c1aef 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "sensei-grid", - "version": "0.3.13", + "version": "0.3.14", "homepage": "https://github.com/datazenit/sensei-grid", "authors": [ "Lauris " diff --git a/dist/sensei-grid.css b/dist/sensei-grid.css index 840da18..f56e4ca 100644 --- a/dist/sensei-grid.css +++ b/dist/sensei-grid.css @@ -1,5 +1,5 @@ /** - * sensei-grid v0.3.13 + * sensei-grid v0.3.14 * Copyright (c) 2015 Lauris Dzilums * Licensed under MIT */ @@ -130,3 +130,13 @@ width:1%; white-space:nowrap; } + +/* selectable styles */ +.sensei-grid th.selectable input, +.sensei-grid td.selectable input { + margin-left: 2px; +} +.sensei-grid .selectedRow, +.sensei-grid .activeRow.selectedRow { + background-color: #FFFFE0; +} diff --git a/dist/sensei-grid.js b/dist/sensei-grid.js index ba231f8..aa1a1ca 100644 --- a/dist/sensei-grid.js +++ b/dist/sensei-grid.js @@ -1,5 +1,5 @@ /** - * sensei-grid v0.3.13 + * sensei-grid v0.3.14 * Copyright (c) 2015 Lauris Dzilums * Licensed under MIT */ @@ -24,7 +24,8 @@ readonly: false, emptyGridMessage: null, skipOnDuplicate: null, - initialSort: null + initialSort: null, + selectable: false }; plugin.name = null; @@ -257,31 +258,40 @@ // unbind previous events plugin.unbindEvents(); - plugin.$el.find(".sensei-grid-tbody>tr>td").on("click.grid", plugin.clickCell); - plugin.$el.find(".sensei-grid-tbody>tr>td").on("dblclick.grid", plugin.dblClickCell); + plugin.$el.on("click.grid", ".sensei-grid-tbody>tr>td", plugin.clickCell); + plugin.$el.on("dblclick.grid", ".sensei-grid-tbody>tr>td", plugin.dblClickCell); plugin.$el.on("blur.grid", plugin.blur); plugin.$el.on("keydown.grid", plugin.keydown); - plugin.$el.find(".sensei-grid-thead .sensei-grid-sortable").on("click.grid", plugin.sort); + plugin.$el.on("click.grid", ".sensei-grid-thead .sensei-grid-sortable", plugin.sort); + plugin.$el.on("change.grid", ".sensei-grid-tbody td.selectable :checkbox", plugin.selectCell); + plugin.$el.on("change.grid", ".sensei-grid-thead th.selectable :checkbox", plugin.selectAll); $(document).on("click.grid", plugin.editorBlur); }; plugin.unbindEvents = function () { - plugin.$el.find(".sensei-grid-tbody>tr>td").off("click.grid"); - plugin.$el.find(".sensei-grid-tbody>tr>td").off("dblclick.grid"); + plugin.$el.off("click.grid", ".sensei-grid-tbody>tr>td"); + plugin.$el.off("dblclick.grid", ".sensei-grid-tbody>tr>td"); plugin.$el.off("blur.grid"); plugin.$el.off("keydown.grid"); - plugin.$el.find(".sensei-grid-thead .sensei-grid-sortable").off("click.grid"); + plugin.$el.off("click.grid", plugin.sort); + plugin.$el.off("change.grid", ".sensei-grid-tbody td.selectable :checkbox"); + plugin.$el.off("change.grid", ".sensei-grid-thead th.selectable :checkbox"); $(document).off("click.grid"); }; /** * Show sorting indicator on column header * @param $el Column header element - * @param order Sorting order: asc|desc + * @param forceOrder Sorting order: asc|desc */ plugin.showSortingIndicator = function ($el, forceOrder) { var order; + // remove row selections + plugin.$el.find("thead th.selectable :checkbox").prop("checked", false); + plugin.$el.find("tbody td.selectable :checkbox").prop("checked", false); + plugin.$el.find("tbody tr.selectedRow").removeClass("selectedRow"); + // remove previous sorting icon plugin.$el.find("th.sensei-grid-sortable .glyphicon").remove(); @@ -423,7 +433,7 @@ }; plugin.getRowCells = function ($row) { - return $row.find("td"); + return $row.find("td:not(.selectable)"); }; plugin.getRowByIndex = function (index) { @@ -457,6 +467,10 @@ return plugin.$el.find(".sensei-grid-tbody>tr"); }; + plugin.getSelectedRows = function () { + return plugin.$el.find(".sensei-grid-tbody>tr.selectedRow"); + }; + plugin.getGridData = function () { var $rows = plugin.getRows(); return $rows.map(function () { @@ -475,6 +489,7 @@ plugin.setRowSaved = function ($row) { $row.removeClass("sensei-grid-dirty-row").removeClass("sensei-grid-empty-row"); $row.find(">td").data("saved", true); + $row.find(">td.selectable").html($("")); }; plugin.setRowDirty = function ($row) { @@ -532,6 +547,15 @@ */ plugin.removeActiveRow = function () { + // check if any rows are selected + var $selectedRows = plugin.getSelectedRows(); + if ($selectedRows.length > 0) { + $selectedRows.each(function () { + plugin.removeRow($(this)); + }); + return; + } + // get active cell var $cell = plugin.getActiveCell(); @@ -808,6 +832,76 @@ } }; + plugin.selectRow = function ($row, forceSelect, forceUnselect) { + // check if row can be selected + if (!plugin.config.selectable) { + return; + } + + var $cell = $row.find(".selectable"); + plugin.selectCell($cell, forceSelect, forceUnselect); + }; + + plugin.selectCell = function ($cell, forceSelect, forceUnselect) { + // check if "this" is a selectable cell + // "this" will be a dom element if selectCell is called as a callback to dom event + if ($(this) && $(this).is("input")) { + $cell = $(this).parents("td.selectable"); + } else { + // toggle checkbox state because if "this" is not a dom element, selectCell is not called as callback to + // dom event and checkbox state is unchanged + var $checkbox = $cell.find(":checkbox"); + + if (forceSelect) { + $checkbox.prop("checked", true); + } else if (forceUnselect) { + $checkbox.prop("checked", false); + } else { + $checkbox.prop("checked", !$checkbox.prop("checked")); + } + } + + // don't select empty row + if ($cell.parent().hasClass("sensei-grid-empty-row")) { + return; + } + + // toggle row select state + if (forceSelect) { + $cell.parent().addClass("selectedRow"); + } else if (forceUnselect) { + $cell.parent().removeClass("selectedRow"); + } else { + $cell.parent().toggleClass("selectedRow"); + } + + + if ($cell.parent().hasClass("selectedRow")) { + plugin.events.trigger("row:mark", $cell.parent()); + } else { + plugin.events.trigger("row:unmark", $cell.parent()); + } + }; + + plugin.selectAll = function () { + // forced states + var forceSelect = true; + var forceUnselect = false; + + var $checkbox = plugin.$el.find("thead th.selectable :checkbox"); + + // check if current checkbox is unchecked + if ($checkbox && !$checkbox.is(":checked")) { + forceSelect = false; + forceUnselect = true; + } + + var $rows = plugin.getRows(); + $rows.each(function () { + plugin.selectRow($(this), forceSelect, forceUnselect); + }); + }; + plugin.showEditor = function () { if (!plugin.getEditorInstance()) { @@ -851,10 +945,13 @@ var preventDefault = true; // all keyCodes that will be used - var codes = [8, 9, 13, 27, 37, 38, 39, 40, 90, 89, 68]; + var codes = [8, 9, 13, 27, 32, 37, 38, 39, 40, 65, 68, 89, 90]; // specific keyCodes that won't be hijacked from the editor - var editorCodes = [8, 37, 38, 39, 40, 68, 90, 89]; + var editorCodes = [8, 32, 37, 38, 39, 40, 65, 68, 89, 90]; + + // get active cell + var $activeCell = plugin.getActiveCell(); if ((plugin.getActiveCell().length === 0 && !plugin.isEditing) || !_.contains(codes, e.which)) { return; @@ -873,23 +970,54 @@ e.preventDefault(); } + var $nextCell; + switch (e.which) { case 37: // left plugin.move("left"); break; case 38: // up + + // check if current cell is selectable and shift key is pressed + if (e.shiftKey && plugin.config.selectable) { + // select cell/row + plugin.selectRow($activeCell.parent(), true); + } + plugin.move("up"); + + $nextCell = plugin.getActiveCell(); + // check if next cell is selectable and shift key is pressed + if (e.shiftKey && plugin.config.selectable) { + // select cell/row + plugin.selectRow($nextCell.parent(), true); + } + break; case 39: // right plugin.move("right"); break; case 40: // down + + // check if current cell is selectable and shift key is pressed + if (e.shiftKey && plugin.config.selectable) { + // select cell/row + plugin.selectRow($activeCell.parent(), true); + } + plugin.move("down"); + + $nextCell = plugin.getActiveCell(); + // check if next cell is selectable and shift key is pressed + if (e.shiftKey && plugin.config.selectable) { + // select cell/row + plugin.selectRow($nextCell.parent(), true); + } break; case 13: // enter var isRowAction = false; - var $activeCell = plugin.getActiveCell(); + var isSelectable = false; if ($activeCell && $activeCell.data("action")) { var rowActionName = $activeCell.data("action-name"); @@ -901,6 +1029,16 @@ isRowAction = true; } + // check if cell is selectable checkbox wrapper + if ($activeCell && $activeCell.hasClass("selectable")) { + + // select cell/row + plugin.selectCell($activeCell); + + // set isSelectable state + isSelectable = true; + } + // @todo the code below must be refactored if (plugin.isEditing) { if (e.ctrlKey && e.shiftKey) { @@ -908,16 +1046,15 @@ } else if (e.ctrlKey && !e.shiftKey) { plugin.move("down"); } else { - // enter on row action should not - // change editor state - if (!plugin.preventEnter && !isRowAction) { + // enter on row action and selectable cell should not change editor state + if (!plugin.preventEnter && !isRowAction && !isSelectable) { plugin.exitEditor(); } } } else { - // enter on row action should not change editor state - if (!isRowAction) { + // enter on row action and selectable cell should not change editor state + if (!isRowAction && !isSelectable) { plugin.editCell(); } } @@ -937,6 +1074,13 @@ plugin.move("right"); } break; + case 32: // space + // check if row is selectable + if ($activeCell && plugin.config.selectable) { + // select row + plugin.selectRow($activeCell.parent()); + } + break; case 8: // backspace if (e.ctrlKey || e.metaKey) { plugin.removeActiveRow(); @@ -944,6 +1088,17 @@ plugin.clearActiveCell(); } break; + case 65: // "a" key + if (plugin.config.selectable && (e.ctrlKey || e.metaKey || e.shiftKey)) { + + // toggle main selectable checkbox + var $checkbox = plugin.$el.find("thead th.selectable :checkbox"); + $checkbox.prop("checked", !$checkbox.prop("checked")); + + // toggle select all rows + plugin.selectAll(); + } + break; case 90: // undo if (e.ctrlKey || e.metaKey) { var edit = plugin.undo(); @@ -997,7 +1152,11 @@ }; plugin.clickCell = function (e) { - e.preventDefault(); + // dont prevent default event if this is selectable cell with checkbox + if (!$(this).hasClass("selectable")) { + e.preventDefault(); + } + if (plugin.isEditing) { plugin.exitEditor(); } @@ -1014,6 +1173,11 @@ var $thead = $("thead", plugin.$el); var tr = document.createElement("tr"); + if (plugin.config.selectable) { + var th = $("
")[0]; + tr.appendChild(th); + } + _.each(plugin.columns, function (column) { var th = document.createElement("th"); var div = document.createElement("div"); @@ -1065,7 +1229,7 @@ $tbody.append(tr); }); - if (plugin.config["emptyRow"]) { + if (plugin.config.emptyRow) { // render empty row at the end of table var tr = plugin.renderRow(null, false); $tbody.append(tr); @@ -1091,6 +1255,17 @@ tr.className = "sensei-grid-dirty-row"; } + if (plugin.config.selectable) { + var $td = $("
"); + //var td = document.createElement("td"); + if (saved) { + var $checkbox = $(""); + $td.find("div").append($checkbox); + } + $td.prop("class", "selectable"); + tr.appendChild($td[0]); + } + _.each(plugin.columns, function (column) { var td = document.createElement("td"); var div = document.createElement("div"); diff --git a/dist/sensei-grid.min.css b/dist/sensei-grid.min.css index 1af2bd2..3773e99 100644 --- a/dist/sensei-grid.min.css +++ b/dist/sensei-grid.min.css @@ -1 +1 @@ -.sensei-grid{outline:0;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.sensei-grid>table{empty-cells:show}.sensei-grid>table td,.sensei-grid>table th{white-space:nowrap;overflow:hidden}.sensei-grid>table td>div,.sensei-grid>table th>div{overflow:hidden;border:1px solid transparent}.sensei-grid>table tr div::after{content:'\00a0'}.sensei-grid>table thead{background:#F5F5F5}.sensei-grid>table thead>tr>th{border-bottom-width:1px;font-weight:700}.sensei-grid>table .activeCell{background:#d0e9f8;border:1px double #39f}.sensei-grid>table .activeRow{background:#eff7fc}.sensei-grid>table .sensei-grid-dirty-row{color:gray}.sensei-grid-editor{position:absolute;background:#fff;border:2px solid #39f;box-shadow:2px 2px 2px rgba(0,0,0,.1)}.sensei-grid-editor input[type=text],.sensei-grid-editor select,.sensei-grid-editor textarea{border:none;width:100%;height:100%;box-shadow:none;outline:0;padding:5px 6px;background:#fff}.sensei-grid-editor input[type=checkbox]{margin:8px 0 0 8px;font-size:20px;display:inline-block;padding:0;line-height:inherit}.sensei-grid-editor textarea{vertical-align:top}.sensei-grid-date-editor .picker__holder{min-width:300px;margin-left:-2px;margin-top:2px}.sensei-grid-date-editor .picker{font-size:14px}.sensei-grid-disabled-editor{border-color:#ADADAD}.sensei-grid-disabled-editor input[type=text]{cursor:not-allowed;background:#FAFAFA}.sensei-grid th.sensei-grid-sortable{cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;padding-right:22px;position:relative}.sensei-grid th.sensei-grid-sortable .glyphicon{font-size:10px;color:#aaa;position:absolute;right:7px;top:12px}.sensei-grid-basic-row-actions{position:absolute;right:0;width:auto;background:#fff;margin-left:5px}.sensei-grid-basic-row-actions .btn{margin-right:2px}.sensei-grid td.row-action{width:1%;white-space:nowrap} \ No newline at end of file +.sensei-grid{outline:0;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.sensei-grid>table{empty-cells:show}.sensei-grid>table td,.sensei-grid>table th{white-space:nowrap;overflow:hidden}.sensei-grid>table td>div,.sensei-grid>table th>div{overflow:hidden;border:1px solid transparent}.sensei-grid>table tr div::after{content:'\00a0'}.sensei-grid>table thead{background:#F5F5F5}.sensei-grid>table thead>tr>th{border-bottom-width:1px;font-weight:700}.sensei-grid>table .activeCell{background:#d0e9f8;border:1px double #39f}.sensei-grid>table .activeRow{background:#eff7fc}.sensei-grid>table .sensei-grid-dirty-row{color:gray}.sensei-grid-editor{position:absolute;background:#fff;border:2px solid #39f;box-shadow:2px 2px 2px rgba(0,0,0,.1)}.sensei-grid-editor input[type=text],.sensei-grid-editor select,.sensei-grid-editor textarea{border:none;width:100%;height:100%;box-shadow:none;outline:0;padding:5px 6px;background:#fff}.sensei-grid-editor input[type=checkbox]{margin:8px 0 0 8px;font-size:20px;display:inline-block;padding:0;line-height:inherit}.sensei-grid-editor textarea{vertical-align:top}.sensei-grid-date-editor .picker__holder{min-width:300px;margin-left:-2px;margin-top:2px}.sensei-grid-date-editor .picker{font-size:14px}.sensei-grid-disabled-editor{border-color:#ADADAD}.sensei-grid-disabled-editor input[type=text]{cursor:not-allowed;background:#FAFAFA}.sensei-grid th.sensei-grid-sortable{cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;padding-right:22px;position:relative}.sensei-grid th.sensei-grid-sortable .glyphicon{font-size:10px;color:#aaa;position:absolute;right:7px;top:12px}.sensei-grid-basic-row-actions{position:absolute;right:0;width:auto;background:#fff;margin-left:5px}.sensei-grid-basic-row-actions .btn{margin-right:2px}.sensei-grid td.row-action{width:1%;white-space:nowrap}.sensei-grid td.selectable input,.sensei-grid th.selectable input{margin-left:2px}.sensei-grid .activeRow.selectedRow,.sensei-grid .selectedRow{background-color:#FFFFE0} \ No newline at end of file diff --git a/dist/sensei-grid.min.js b/dist/sensei-grid.min.js index 633ed06..8ed084e 100644 --- a/dist/sensei-grid.min.js +++ b/dist/sensei-grid.min.js @@ -1,6 +1,6 @@ /** - * sensei-grid v0.3.13 + * sensei-grid v0.3.14 * Copyright (c) 2015 Lauris Dzilums * Licensed under MIT */ -!function(a){a.fn.grid=function(b,c,d,e){var f=this,g={emptyRow:!1,sortable:!1,tableClass:"table table-bordered table-condensed",disableKeys:[],moveOnRowRemove:!0,readonly:!1,emptyGridMessage:null,skipOnDuplicate:null,initialSort:null};f.name=null,f.isEditing=!1,f.$prevRow=null,f.editorProps={},f.preventEnter=!1,a.fn.isOnScreen=function(){var b=a(window),c={top:b.scrollTop(),left:b.scrollLeft()};c.right=c.left+b.width(),c.bottom=c.top+b.height();var d=this.offset();return d.right=d.left+this.outerWidth(),d.bottom=d.top+this.outerHeight(),!(c.rightd.right||c.bottomd.bottom)};var h=function(a){var b=a.get(0),c=b.style.display;b.style.display="none",b.offsetHeight,b.style.display=c},i=function(a){return a.replace(/\r\n/g,"\n")};return f.setActiveCell=function(b){f.config.readonly||(f.$prevRow=a(".sensei-grid-tbody>tr>.activeCell",f.$el).parent("tr"),f.$prevRow.removeClass("activeRow"),a(".sensei-grid-tbody>tr>.activeCell",f.$el).removeClass("activeCell"),b.addClass("activeCell"),b.parent("tr").addClass("activeRow"),h(b.parent("tr")),f.events.trigger("cell:select",b),f.$prevRow.index()!==b.parent("tr").index()&&(f.events.trigger("row:select",b.parent("tr")),f.$prevRow.hasClass("sensei-grid-dirty-row")&&f.isEditing&&(f.saveEditor(!0),f.events.trigger("row:save",f.getRowData(f.$prevRow),f.$prevRow,"row:select"))))},a.fn.cellPosition=function(){var b=a(this).position();return f.isSillyFirefox()&&(b.left-=1,b.top-=1),b},f.events={_events:{}},f.events.on=function(a,b,c){_.has(this._events,a)||(this._events[a]=[]),this._events[a].push({callback:b,context:c})},f.events.trigger=function(a){var b=Array.prototype.slice.call(arguments,1);if(_.has(this._events,a)){var c=this._events[a];_.each(c,function(a){var c=_.bind(a.callback,a.context);c.apply(this,b)})}},f.events.off=function(a){_.has(this._events,a)&&delete this._events[a]},f.isSillyFirefox=function(){if(!f.$el.find("td:first").position())return!1;var a=f.$el.position().left,b=f.$el.find("td:first").position().left;return b!==a},f.registerEditor=function(a){var b=new a(f);f.editors[b.name]=b},f.registerRowAction=function(a){var b=new a(f);f.rowActions[b.name]=b},f.render=function(){if(f.rowElements={},_.each(f.rowActions,function(a){a.initialize();var b="
"+a.rowElement()+"
";f.rowElements[a.name]=b}),f.renderBaseTable(),f.renderColumns(),f.renderData(),f.config.sortable&&_.isObject(f.config.initialSort)){var b=f.config.initialSort.col,c=f.$el.find("th").filter(function(){return a(this).data("name")===b});c&&f.showSortingIndicator(c,f.config.initialSort.order)}_.each(f.editors,function(a){a.initialize(),a.render(),a.getElement().hide()}),f.bindEvents()},f.updateData=function(a){f.renderData(a),f.bindEvents()},f.destroy=function(){f.unbindEvents(),f.$el.remove()},f.addEdit=function(a){f.editPointer===f.edits.length-1?(f.editPointer+=1,f.edits.push(a)):(f.editPointer+=1,f.edits.splice(f.editPointer),f.edits.push(a))},f.redo=function(){return f.editPointer+1>=f.edits.length?[]:(f.editPointer+=1,f.edits[f.editPointer])},f.undo=function(){if(f.editPointer<0)return[];var a=f.edits[f.editPointer];return f.editPointer-=1,a},f.bindEvents=function(){f.unbindEvents(),f.$el.find(".sensei-grid-tbody>tr>td").on("click.grid",f.clickCell),f.$el.find(".sensei-grid-tbody>tr>td").on("dblclick.grid",f.dblClickCell),f.$el.on("blur.grid",f.blur),f.$el.on("keydown.grid",f.keydown),f.$el.find(".sensei-grid-thead .sensei-grid-sortable").on("click.grid",f.sort),a(document).on("click.grid",f.editorBlur)},f.unbindEvents=function(){f.$el.find(".sensei-grid-tbody>tr>td").off("click.grid"),f.$el.find(".sensei-grid-tbody>tr>td").off("dblclick.grid"),f.$el.off("blur.grid"),f.$el.off("keydown.grid"),f.$el.find(".sensei-grid-thead .sensei-grid-sortable").off("click.grid"),a(document).off("click.grid")},f.showSortingIndicator=function(b,c){var d;return f.$el.find("th.sensei-grid-sortable .glyphicon").remove(),"desc"===c||b.data("order")&&"asc"===b.data("order")?(d="desc",b.append(a("").addClass("glyphicon glyphicon-chevron-up"))):(d="asc",b.append(a("").addClass("glyphicon glyphicon-chevron-down"))),c&&(d=c),b.data("order",d),d},f.sort=function(){var b=a(this).data("name"),c=f.showSortingIndicator(a(this),c);f.events.trigger("column:sort",b,c,a(this))},f.editorBlur=function(b){f.getActiveCell().length>0&&0===f.$el.has(a(b.target)).length&&(f.exitEditor(),f.deactivateCell())},f.hideEditors=function(){a(".sensei-grid-editor",f.$el).hide()},f.blur=function(){if(f.getActiveCell().length>0&&!f.isEditing){var a=f.getActiveCell();f.exitEditor(),f.isEditing=!1,f.deactivateCell(),h(a.parent("tr"))}},f.parsers={},f.parsers.string=function(a){return a.toString()},f.parsers["int"]=function(a){return parseInt(a)},f.parsers["float"]=function(a){return parseFloat(a)},f.getCellData=function(a){var b=a.text(),c=f.getCellType(a);return _.has(f.parsers,c)&&(b=f.parsers[c](b)),b},f.getCellColumn=function(a){return a.data("column")},f.getCellType=function(a){return a.data("type")},f.getCellStatus=function(a){return!!a.data("saved")},f.getCellDataByIndex=function(a,b){var c=f.getRowByIndex(a),d=f.getCellFromRowByIndex(c,b);return f.getCellData(d)},f.getCellDataByKey=function(a,b){var c=f.getRowByIndex(a),d=f.getCellFromRowByKey(c,b);return f.getCellData(d)},f.getCellFromRowByIndex=function(a,b){var c=a.find("td").eq(b);if(0===c.length)throw new Error("Cell does not exist");return c},f.getCellFromRowByKey=function(b,c){var d=b.find("td").filter(function(){return a(this).data("column")===c});if(0===d.length)throw new Error("Cell does not exist");return d},f.getCellRow=function(a){return a.parent("tr")},f.getRowCellsByIndex=function(a){return f.getRowByIndex(a).find("td")},f.getRowCells=function(a){return a.find("td")},f.getRowByIndex=function(a){var b=f.$el.find(".sensei-grid-tbody>tr").eq(a);if(0===b.length)throw new Error("Row does not exist");return b},f.getRowDataByIndex=function(a){var b=f.getRowByIndex(a);return f.getRowData(b)},f.getRowData=function(b){var c=f.getRowCells(b),d={};return c.each(function(){d[f.getCellColumn(a(this))]=f.getCellData(a(this))}),d},f.getRows=function(){return f.$el.find(".sensei-grid-tbody>tr")},f.getGridData=function(){var b=f.getRows();return b.map(function(){return f.getRowData(a(this))}).get()},f.getActiveCell=function(){return f.isEditing&&f.activeEditor&&f.activeEditor.activeCell?f.activeEditor.activeCell:a("td.activeCell",f.$el)},f.setRowSaved=function(a){a.removeClass("sensei-grid-dirty-row").removeClass("sensei-grid-empty-row"),a.find(">td").data("saved",!0)},f.setRowDirty=function(a){a.addClass("sensei-grid-dirty-row").removeClass("sensei-grid-empty-row"),a.find(">td").data("saved",!1)},f.deactivateCell=function(){var a=f.getActiveCell();a.removeClass("activeCell"),a.parent("tr").removeClass("activeRow"),f.events.trigger("cell:deactivate",a)},f.clearActiveCell=function(){var b=f.getActiveCell(),c=f.getCellData(b);a(">div",b).empty(),f.events.trigger("cell:clear",c,b)},f.removeRow=function(a){var b=a.index();if(a.hasClass("sensei-grid-empty-row"))return!1;f.config.moveOnRowRemove&&f.moveDown();var c=f.getRowData(a);f.events.trigger("row:remove",c,b,a),a.remove()},f.removeActiveRow=function(){var a=f.getActiveCell();if(!a)return!1;var b=f.getCellRow(a);return f.removeRow(b),!0},f.duplicateActiveRow=function(){var b=f.getActiveCell();if(!b)return!1;var c=f.getCellRow(b);if(c.hasClass("sensei-grid-empty-row"))return!1;var d=f.getRowData(c);_.isEmpty(f.config.skipOnDuplicate)||(d=_.omit(d,f.config.skipOnDuplicate));var e=a(f.renderRow(d,!1,!0));return e.insertAfter(c),f.moveDown(),f.events.trigger("row:duplicate",e),!0},f.moveRight=function(){var b=f.getActiveCell();if(b.next().length>0)f.setActiveCell(b.next());else{var c=b.parent("tr").next();c.length>0&&f.setActiveCell(a("td:first",c))}},f.moveUp=function(){var b=f.getActiveCell(),c=b.parent("tr").prev();if(c.length>0){var d=b.index(),e=a("td",c).eq(d);f.setActiveCell(e.length>0?e:a("td:last",c))}},f.moveLeft=function(){var b=f.getActiveCell();if(b.prev().length>0)f.setActiveCell(b.prev());else{var c=b.parent("tr").prev();c.length>0&&f.setActiveCell(a("td:last",c))}},f.moveDown=function(){var b=f.getActiveCell(),c=b.parent("tr").next();if(c.length>0){var d=b.index(),e=a("td",c).eq(d);f.setActiveCell(e.length>0?e:a("td:first",c))}},f.move=function(a){var b="move"+a.charAt(0).toUpperCase()+a.substr(1);_.has(f,b)?(f[b](),f.isEditing&&f.saveEditor(),f.isEditing&&f.editCell(),f.getActiveCell().find(">div").isOnScreen()||f.getActiveCell().get(0).scrollIntoView(_.contains(["up","left"],a)?!0:!1)):console.warn("move method not found",b)},f.editCell=function(){f.config.readonly||f.showEditor()},f.getEditor=function(){return f.activeEditor},f.getEditorInstance=function(){var a=f.getActiveCell(),b=a.data("editor");if(b&&_.has(f.editors,b)){var c=f.getCellColumn(a);return _.has(f.editorProps,c)&&(f.editors[b].props=f.editorProps[c]),f.editors[b]}return console.info("Editor not found, skipping cell: "+b),!1},f.saveEditor=function(b){if(f.isEditing&&f.activeEditor){var c=f.getActiveCell(),d=f.activeEditor.getValue();if(i(d)!==i(c.text())){var e={previousState:f.getCellData(c),currentState:d,row:f.getRowData(f.getCellRow(c)).id,column:c.index()},g=c.data("allowHTML");f.addEdit(e),c.html(g?a("
").html(d):a("
").text(d));var h={};h[c.data("column")]=d,f.events.trigger("editor:save",h,c);var j=c.parent("tr");j.hasClass("sensei-grid-empty-row")&&(j.removeClass("sensei-grid-empty-row").addClass("sensei-grid-dirty-row"),f.assureEmptyRow())}}!b&&f.activeEditor&&f.getEditor().hide()},f.assureEmptyRow=function(){if(f.config.emptyRow&&0===f.$el.find(".sensei-grid-tbody>tr.sensei-grid-empty-row").length){var a=f.$el.find(".sensei-grid-tbody"),b=f.renderRow(null,!1);a.append(b)}},f.exitEditor=function(a){var b=f.getActiveCell();if(f.isEditing&&f.activeEditor)if(a)f.getEditor().hide();else{f.saveEditor();var c=b.parent("tr");c.hasClass("sensei-grid-dirty-row")&&f.isEditing&&f.events.trigger("row:save",f.getRowData(c),c,"editor:close")}f.isEditing&&(f.setActiveCell(b),f.$el.focus()),f.isEditing=!1},f.moveEditor=function(){f.isEditing&&(f.showEditor(),f.editCell())},f.showEditor=function(){if(!f.getEditorInstance())return f.exitEditor(),void(f.isEditing=!0);f.activeEditor=f.getEditorInstance();var a=f.activeEditor.getElement(),b=f.getActiveCell();f.activeEditor.activeCell=b,f.isEditing=!0,f.activeEditor.show(),a.css(b.cellPosition()),f.activeEditor.setDimensions(b);var c=b.data("column"),d=b.data("allowHTML"),e=d?b.find(">div").html():b.text();f.activeEditor.setValue(e);var g={};return g[c]=e,f.events.trigger("editor:load",g,b),a},f.keydown=function(b){var c=!0,d=[8,9,13,27,37,38,39,40,90,89,68],e=[8,37,38,39,40,68,90,89];if((0!==f.getActiveCell().length||f.isEditing)&&_.contains(d,b.which)){if(!f.isEditing&&_.contains(f.config.disableKeys,b.which))return void b.preventDefault();if(!(f.isEditing&&f.getEditor()&&_.contains(e,b.which))){switch(b.preventDefault(),b.which){case 37:f.move("left");break;case 38:f.move("up");break;case 39:f.move("right");break;case 40:f.move("down");break;case 13:var g=!1,h=f.getActiveCell();if(h&&h.data("action")){var i=h.data("action-name");f.rowActions[i]&&f.rowActions[i].trigger({data:{$activeCell:h}}),g=!0}f.isEditing?b.ctrlKey&&b.shiftKey?f.move("up"):b.ctrlKey&&!b.shiftKey?f.move("down"):f.preventEnter||g||f.exitEditor():g||f.editCell();break;case 27:f.isEditing?f.exitEditor(!0):f.$el.blur();break;case 9:f.move(b.shiftKey?"left":"right");break;case 8:b.ctrlKey||b.metaKey?f.removeActiveRow():f.clearActiveCell();break;case 90:if(b.ctrlKey||b.metaKey){var j=f.undo();if("row"in j&&"column"in j){var k=f.getRowByIndex(j.row-1),l=f.getCellFromRowByIndex(k,j.column);l.html(a("
").text(j.previousState));var m={};m[l.data("column")]=j.previousState,f.events.trigger("editor:save",m,l)}}break;case 89:if(b.ctrlKey||b.metaKey){var n=f.redo();if("row"in n&&"column"in n){var o=f.getRowByIndex(n.row-1),p=f.getCellFromRowByIndex(o,n.column);p.html(a("
").text(n.currentState));var q={};q[p.data("column")]=n.currentState,f.events.trigger("editor:save",q,p)}}break;case 68:(b.ctrlKey||b.shiftKey)&&f.duplicateActiveRow()}c&&b.preventDefault()}}},f.clickCell=function(b){b.preventDefault(),f.isEditing&&f.exitEditor(),f.setActiveCell(a(this))},f.dblClickCell=function(b){b.preventDefault(),f.setActiveCell(a(this)),f.editCell()},f.renderColumns=function(){var b=a("thead",f.$el),c=document.createElement("tr");_.each(f.columns,function(b){var d=document.createElement("th"),e=document.createElement("div");f.config.sortable&&(d.className="sensei-grid-sortable"),a(e).text(b.display?b.display:b.name),d.appendChild(e),a(d).data("name",b.name),a(d).data("type",b.type||"string"),a(d).data("editor",b.editor||"BasicEditor"),b.editorProps&&(f.editorProps[b.name]=b.editorProps),c.appendChild(d)}),b.append(c)},f.renderData=function(b){var c=a(".sensei-grid-tbody",f.$el);if(b&&(f.data=b),c.html(null),_.each(f.data,function(a){var b=f.renderRow(a,!0);c.append(b)}),f.config.emptyRow){var d=f.renderRow(null,!1);c.append(d)}if(_.isEmpty(f.data)&&f.config.emptyGridMessage){var e=a("").text(f.config.emptyGridMessage),g=a("").append(e);c.html(g)}},f.renderRow=function(b,c,d){var e=document.createElement("tr");return c||(e.className="sensei-grid-empty-row"),d&&(e.className="sensei-grid-dirty-row"),_.each(f.columns,function(d){var f=document.createElement("td"),g=document.createElement("div");_.has(b,d.name)&&(d.allowHTML&&d.allowHTML===!0?a(g).html(b[d.name]):a(g).text(b[d.name])),d.wrap===!0&&a(f).css("white-space","normal"),a(f).data("allowHTML",d.allowHTML),a(f).data("column",d.name),a(f).data("type",d.type||"string"),a(f).data("editor",d.editor||"BasicEditor"),a(f).data("saved",c),f.appendChild(g),e.appendChild(f)}),_.isEmpty(f.rowElements)||_.each(f.rowElements,function(b,c){var d=document.createElement("td");d.innerHTML=b,a(d).data("action",!0),a(d).data("action-name",c),a(d).addClass("row-action");var g=f.rowActions[c];g.triggerEvent&&g.triggerEvent.event&&g.triggerEvent.selector&&a(d).on(g.triggerEvent.event,g.triggerEvent.selector,{$activeCell:a(d)},g.trigger),e.appendChild(d)}),e},f.renderBaseTable=function(){var a=document.createElement("table"),b=document.createElement("thead"),c=document.createElement("tbody");c.className="sensei-grid-tbody",b.className="sensei-grid-thead",a.className=f.config.tableClass,a.appendChild(b),a.appendChild(c),f.$el.html(a),f.$el.attr("tabindex",-1)},f.init=function(b,c,d,e){return f.config=a.extend({},g,d),f.data=b,f.columns=c,f.name=e,f.$el=a(this),f.editors={},f.rowActions={},f.edits=[],f.editPointer=-1,f},f.init(b,c,d,e)}}(jQuery),function(a){var b=this,c=function(a){this.grid=a};c.extend=function(a){var b,c=this;b=function(){return c.apply(this,arguments)};var d=function(){this.constructor=b};return d.prototype=c.prototype,b.prototype=new d,a&&_.extend(b.prototype,a),b.__super__=c.prototype,b},c.prototype.getElement=function(){return a(this.editor)},c.prototype.initialize=function(){},c.prototype.render=function(){},c.prototype.show=function(){this.getElement().show()},c.prototype.hide=function(){this.getElement().hide(),this.grid.activeEditor.activeCell=null,this.grid.activeEditor=null},c.prototype.setDimensions=function(a){this.getElement().css({width:a.outerWidth()+1,height:a.outerHeight()+1})},c.prototype.getValue=function(){throw Error("Editor.getValue not implemented")},c.prototype.setValue=function(){throw Error("Editor.setValue not implemented")},b.Editor=c,b.BasicEditor=c.extend({types:[],name:"BasicEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-basic-editor";var a=document.createElement("input");a.setAttribute("type","text"),this.editor.appendChild(a),this.grid.$el.append(this.editor)}},getValue:function(){return a("input",this.editor).val()},setValue:function(b){a("input",this.editor).val(b).focus()}}),b.TextareaEditor=c.extend({types:[],name:"TextareaEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-textarea-editor";var a=document.createElement("textarea");this.editor.appendChild(a),this.grid.$el.append(this.editor)}},setDimensions:function(a){this.getElement().find("textarea").css({width:a.outerWidth()+50,height:a.outerHeight()+50})},getValue:function(){return a("textarea",this.editor).val()},setValue:function(b){a("textarea",this.editor).val(b).focus()}}),b.BooleanEditor=c.extend({types:[],name:"BooleanEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-boolean-editor";var b=a("
",{"class":"sensei-grid-checkbox-wrapper"});b.append(a("",{type:"checkbox"})),a(this.editor).append(b),this.grid.$el.append(this.editor)}},setDimensions:function(a){var b={width:a.outerWidth()-3,height:a.outerHeight()-3,background:"white"};this.getElement().find(".sensei-grid-checkbox-wrapper").css(b)},getValue:function(){return a("input",this.editor).is(":checked")?"true":"false"},setValue:function(b){"true"===b.toLowerCase()?a("input",this.editor).prop("checked",!0):a("input",this.editor).prop("checked",!1),a("input",this.editor).focus()}}),b.SelectEditor=c.extend({types:[],name:"SelectEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-custom-editor";var a=document.createElement("select");this.editor.appendChild(a),this.grid.$el.append(this.editor)}},renderValues:function(){if(_.has(this.props,"values")){var a=this.getElement().find("select");a.html(null),_.each(this.props.values,function(b){var c=document.createElement("option");c.value=b,c.innerHTML=b,a.append(c)})}},show:function(){this.renderValues(),this.getElement().show()},getValue:function(){return a("select",this.editor).val()},setValue:function(b){a("select>option",this.editor).filter(function(){return a(this).val()===b}).attr("selected","selected"),a("select").focus()}}),b.DateEditor=c.extend({types:[],name:"DateEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-date-editor";var b=a("
",{"class":"sensei-grid-date-wrapper"});b.append(a("",{type:"text","class":"datepicker"})),a(this.editor).append(b),this.grid.$el.append(this.editor);var c=this.grid;a(".datepicker").pickadate({format:"ddd mmm dd yyyy",editable:!0,today:!1,clear:!1,close:!1,onClose:function(){c.preventEnter=!1},onOpen:function(){c.preventEnter=!0}})}},getValue:function(){return a("input",this.editor).val()},setValue:function(b){a("input",this.editor).val(b).focus()}}),b.DisabledEditor=c.extend({types:[],name:"DisabledEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-disabled-editor";var b=a("",{type:"text",readOnly:!0});a(this.editor).append(b),this.grid.$el.append(this.editor)}},getValue:function(){return a("input",this.editor).val()},setValue:function(b){a("input",this.editor).val(b).focus()}}),b.RichEditor=c.extend({types:[],name:"RichEditor",render:function(){if(!this.editor){this.editor=a("
",{"class":"sensei-grid-editor sensei-grid-rich-editor"});var b=a("
",{"class":"summertime-wrapper"});this.editor.append(b),this.grid.$el.append(this.editor)}},setDimensions:function(a){this.getElement().css({width:a.outerWidth()+50})},getValue:function(){return a(".summertime-wrapper",this.editor).code()},setValue:function(b){a(".summertime-wrapper",this.editor).destroy(),a(".summertime-wrapper",this.editor).html(b);var c=this.grid;a(".summertime-wrapper",this.editor).summernote({focus:!0,toolbar:[["style",["bold","italic","underline","clear"]],["font",["strikethrough"]],["fontsize",["fontsize"]]],onfocus:function(){c.preventEnter=!0},onblur:function(){c.preventEnter=!1},onkeydown:function(a){9===a.keyCode&&a.stopImmediatePropagation()}}),a(".summertime-wrapper",this.editor).code(b)}})}(jQuery); \ No newline at end of file +!function(a){a.fn.grid=function(b,c,d,e){var f=this,g={emptyRow:!1,sortable:!1,tableClass:"table table-bordered table-condensed",disableKeys:[],moveOnRowRemove:!0,readonly:!1,emptyGridMessage:null,skipOnDuplicate:null,initialSort:null,selectable:!1};f.name=null,f.isEditing=!1,f.$prevRow=null,f.editorProps={},f.preventEnter=!1,a.fn.isOnScreen=function(){var b=a(window),c={top:b.scrollTop(),left:b.scrollLeft()};c.right=c.left+b.width(),c.bottom=c.top+b.height();var d=this.offset();return d.right=d.left+this.outerWidth(),d.bottom=d.top+this.outerHeight(),!(c.rightd.right||c.bottomd.bottom)};var h=function(a){var b=a.get(0),c=b.style.display;b.style.display="none",b.offsetHeight,b.style.display=c},i=function(a){return a.replace(/\r\n/g,"\n")};return f.setActiveCell=function(b){f.config.readonly||(f.$prevRow=a(".sensei-grid-tbody>tr>.activeCell",f.$el).parent("tr"),f.$prevRow.removeClass("activeRow"),a(".sensei-grid-tbody>tr>.activeCell",f.$el).removeClass("activeCell"),b.addClass("activeCell"),b.parent("tr").addClass("activeRow"),h(b.parent("tr")),f.events.trigger("cell:select",b),f.$prevRow.index()!==b.parent("tr").index()&&(f.events.trigger("row:select",b.parent("tr")),f.$prevRow.hasClass("sensei-grid-dirty-row")&&f.isEditing&&(f.saveEditor(!0),f.events.trigger("row:save",f.getRowData(f.$prevRow),f.$prevRow,"row:select"))))},a.fn.cellPosition=function(){var b=a(this).position();return f.isSillyFirefox()&&(b.left-=1,b.top-=1),b},f.events={_events:{}},f.events.on=function(a,b,c){_.has(this._events,a)||(this._events[a]=[]),this._events[a].push({callback:b,context:c})},f.events.trigger=function(a){var b=Array.prototype.slice.call(arguments,1);if(_.has(this._events,a)){var c=this._events[a];_.each(c,function(a){var c=_.bind(a.callback,a.context);c.apply(this,b)})}},f.events.off=function(a){_.has(this._events,a)&&delete this._events[a]},f.isSillyFirefox=function(){if(!f.$el.find("td:first").position())return!1;var a=f.$el.position().left,b=f.$el.find("td:first").position().left;return b!==a},f.registerEditor=function(a){var b=new a(f);f.editors[b.name]=b},f.registerRowAction=function(a){var b=new a(f);f.rowActions[b.name]=b},f.render=function(){if(f.rowElements={},_.each(f.rowActions,function(a){a.initialize();var b="
"+a.rowElement()+"
";f.rowElements[a.name]=b}),f.renderBaseTable(),f.renderColumns(),f.renderData(),f.config.sortable&&_.isObject(f.config.initialSort)){var b=f.config.initialSort.col,c=f.$el.find("th").filter(function(){return a(this).data("name")===b});c&&f.showSortingIndicator(c,f.config.initialSort.order)}_.each(f.editors,function(a){a.initialize(),a.render(),a.getElement().hide()}),f.bindEvents()},f.updateData=function(a){f.renderData(a),f.bindEvents()},f.destroy=function(){f.unbindEvents(),f.$el.remove()},f.addEdit=function(a){f.editPointer===f.edits.length-1?(f.editPointer+=1,f.edits.push(a)):(f.editPointer+=1,f.edits.splice(f.editPointer),f.edits.push(a))},f.redo=function(){return f.editPointer+1>=f.edits.length?[]:(f.editPointer+=1,f.edits[f.editPointer])},f.undo=function(){if(f.editPointer<0)return[];var a=f.edits[f.editPointer];return f.editPointer-=1,a},f.bindEvents=function(){f.unbindEvents(),f.$el.on("click.grid",".sensei-grid-tbody>tr>td",f.clickCell),f.$el.on("dblclick.grid",".sensei-grid-tbody>tr>td",f.dblClickCell),f.$el.on("blur.grid",f.blur),f.$el.on("keydown.grid",f.keydown),f.$el.on("click.grid",".sensei-grid-thead .sensei-grid-sortable",f.sort),f.$el.on("change.grid",".sensei-grid-tbody td.selectable :checkbox",f.selectCell),f.$el.on("change.grid",".sensei-grid-thead th.selectable :checkbox",f.selectAll),a(document).on("click.grid",f.editorBlur)},f.unbindEvents=function(){f.$el.off("click.grid",".sensei-grid-tbody>tr>td"),f.$el.off("dblclick.grid",".sensei-grid-tbody>tr>td"),f.$el.off("blur.grid"),f.$el.off("keydown.grid"),f.$el.off("click.grid",f.sort),f.$el.off("change.grid",".sensei-grid-tbody td.selectable :checkbox"),f.$el.off("change.grid",".sensei-grid-thead th.selectable :checkbox"),a(document).off("click.grid")},f.showSortingIndicator=function(b,c){var d;return f.$el.find("thead th.selectable :checkbox").prop("checked",!1),f.$el.find("tbody td.selectable :checkbox").prop("checked",!1),f.$el.find("tbody tr.selectedRow").removeClass("selectedRow"),f.$el.find("th.sensei-grid-sortable .glyphicon").remove(),"desc"===c||b.data("order")&&"asc"===b.data("order")?(d="desc",b.append(a("").addClass("glyphicon glyphicon-chevron-up"))):(d="asc",b.append(a("").addClass("glyphicon glyphicon-chevron-down"))),c&&(d=c),b.data("order",d),d},f.sort=function(){var b=a(this).data("name"),c=f.showSortingIndicator(a(this),c);f.events.trigger("column:sort",b,c,a(this))},f.editorBlur=function(b){f.getActiveCell().length>0&&0===f.$el.has(a(b.target)).length&&(f.exitEditor(),f.deactivateCell())},f.hideEditors=function(){a(".sensei-grid-editor",f.$el).hide()},f.blur=function(){if(f.getActiveCell().length>0&&!f.isEditing){var a=f.getActiveCell();f.exitEditor(),f.isEditing=!1,f.deactivateCell(),h(a.parent("tr"))}},f.parsers={},f.parsers.string=function(a){return a.toString()},f.parsers["int"]=function(a){return parseInt(a)},f.parsers["float"]=function(a){return parseFloat(a)},f.getCellData=function(a){var b=a.text(),c=f.getCellType(a);return _.has(f.parsers,c)&&(b=f.parsers[c](b)),b},f.getCellColumn=function(a){return a.data("column")},f.getCellType=function(a){return a.data("type")},f.getCellStatus=function(a){return!!a.data("saved")},f.getCellDataByIndex=function(a,b){var c=f.getRowByIndex(a),d=f.getCellFromRowByIndex(c,b);return f.getCellData(d)},f.getCellDataByKey=function(a,b){var c=f.getRowByIndex(a),d=f.getCellFromRowByKey(c,b);return f.getCellData(d)},f.getCellFromRowByIndex=function(a,b){var c=a.find("td").eq(b);if(0===c.length)throw new Error("Cell does not exist");return c},f.getCellFromRowByKey=function(b,c){var d=b.find("td").filter(function(){return a(this).data("column")===c});if(0===d.length)throw new Error("Cell does not exist");return d},f.getCellRow=function(a){return a.parent("tr")},f.getRowCellsByIndex=function(a){return f.getRowByIndex(a).find("td")},f.getRowCells=function(a){return a.find("td:not(.selectable)")},f.getRowByIndex=function(a){var b=f.$el.find(".sensei-grid-tbody>tr").eq(a);if(0===b.length)throw new Error("Row does not exist");return b},f.getRowDataByIndex=function(a){var b=f.getRowByIndex(a);return f.getRowData(b)},f.getRowData=function(b){var c=f.getRowCells(b),d={};return c.each(function(){d[f.getCellColumn(a(this))]=f.getCellData(a(this))}),d},f.getRows=function(){return f.$el.find(".sensei-grid-tbody>tr")},f.getSelectedRows=function(){return f.$el.find(".sensei-grid-tbody>tr.selectedRow")},f.getGridData=function(){var b=f.getRows();return b.map(function(){return f.getRowData(a(this))}).get()},f.getActiveCell=function(){return f.isEditing&&f.activeEditor&&f.activeEditor.activeCell?f.activeEditor.activeCell:a("td.activeCell",f.$el)},f.setRowSaved=function(b){b.removeClass("sensei-grid-dirty-row").removeClass("sensei-grid-empty-row"),b.find(">td").data("saved",!0),b.find(">td.selectable").html(a(""))},f.setRowDirty=function(a){a.addClass("sensei-grid-dirty-row").removeClass("sensei-grid-empty-row"),a.find(">td").data("saved",!1)},f.deactivateCell=function(){var a=f.getActiveCell();a.removeClass("activeCell"),a.parent("tr").removeClass("activeRow"),f.events.trigger("cell:deactivate",a)},f.clearActiveCell=function(){var b=f.getActiveCell(),c=f.getCellData(b);a(">div",b).empty(),f.events.trigger("cell:clear",c,b)},f.removeRow=function(a){var b=a.index();if(a.hasClass("sensei-grid-empty-row"))return!1;f.config.moveOnRowRemove&&f.moveDown();var c=f.getRowData(a);f.events.trigger("row:remove",c,b,a),a.remove()},f.removeActiveRow=function(){var b=f.getSelectedRows();if(b.length>0)return void b.each(function(){f.removeRow(a(this))});var c=f.getActiveCell();if(!c)return!1;var d=f.getCellRow(c);return f.removeRow(d),!0},f.duplicateActiveRow=function(){var b=f.getActiveCell();if(!b)return!1;var c=f.getCellRow(b);if(c.hasClass("sensei-grid-empty-row"))return!1;var d=f.getRowData(c);_.isEmpty(f.config.skipOnDuplicate)||(d=_.omit(d,f.config.skipOnDuplicate));var e=a(f.renderRow(d,!1,!0));return e.insertAfter(c),f.moveDown(),f.events.trigger("row:duplicate",e),!0},f.moveRight=function(){var b=f.getActiveCell();if(b.next().length>0)f.setActiveCell(b.next());else{var c=b.parent("tr").next();c.length>0&&f.setActiveCell(a("td:first",c))}},f.moveUp=function(){var b=f.getActiveCell(),c=b.parent("tr").prev();if(c.length>0){var d=b.index(),e=a("td",c).eq(d);f.setActiveCell(e.length>0?e:a("td:last",c))}},f.moveLeft=function(){var b=f.getActiveCell();if(b.prev().length>0)f.setActiveCell(b.prev());else{var c=b.parent("tr").prev();c.length>0&&f.setActiveCell(a("td:last",c))}},f.moveDown=function(){var b=f.getActiveCell(),c=b.parent("tr").next();if(c.length>0){var d=b.index(),e=a("td",c).eq(d);f.setActiveCell(e.length>0?e:a("td:first",c))}},f.move=function(a){var b="move"+a.charAt(0).toUpperCase()+a.substr(1);_.has(f,b)?(f[b](),f.isEditing&&f.saveEditor(),f.isEditing&&f.editCell(),f.getActiveCell().find(">div").isOnScreen()||f.getActiveCell().get(0).scrollIntoView(_.contains(["up","left"],a)?!0:!1)):console.warn("move method not found",b)},f.editCell=function(){f.config.readonly||f.showEditor()},f.getEditor=function(){return f.activeEditor},f.getEditorInstance=function(){var a=f.getActiveCell(),b=a.data("editor");if(b&&_.has(f.editors,b)){var c=f.getCellColumn(a);return _.has(f.editorProps,c)&&(f.editors[b].props=f.editorProps[c]),f.editors[b]}return console.info("Editor not found, skipping cell: "+b),!1},f.saveEditor=function(b){if(f.isEditing&&f.activeEditor){var c=f.getActiveCell(),d=f.activeEditor.getValue();if(i(d)!==i(c.text())){var e={previousState:f.getCellData(c),currentState:d,row:f.getRowData(f.getCellRow(c)).id,column:c.index()},g=c.data("allowHTML");f.addEdit(e),c.html(g?a("
").html(d):a("
").text(d));var h={};h[c.data("column")]=d,f.events.trigger("editor:save",h,c);var j=c.parent("tr");j.hasClass("sensei-grid-empty-row")&&(j.removeClass("sensei-grid-empty-row").addClass("sensei-grid-dirty-row"),f.assureEmptyRow())}}!b&&f.activeEditor&&f.getEditor().hide()},f.assureEmptyRow=function(){if(f.config.emptyRow&&0===f.$el.find(".sensei-grid-tbody>tr.sensei-grid-empty-row").length){var a=f.$el.find(".sensei-grid-tbody"),b=f.renderRow(null,!1);a.append(b)}},f.exitEditor=function(a){var b=f.getActiveCell();if(f.isEditing&&f.activeEditor)if(a)f.getEditor().hide();else{f.saveEditor();var c=b.parent("tr");c.hasClass("sensei-grid-dirty-row")&&f.isEditing&&f.events.trigger("row:save",f.getRowData(c),c,"editor:close")}f.isEditing&&(f.setActiveCell(b),f.$el.focus()),f.isEditing=!1},f.moveEditor=function(){f.isEditing&&(f.showEditor(),f.editCell())},f.selectRow=function(a,b,c){if(f.config.selectable){var d=a.find(".selectable");f.selectCell(d,b,c)}},f.selectCell=function(b,c,d){if(a(this)&&a(this).is("input"))b=a(this).parents("td.selectable");else{var e=b.find(":checkbox");c?e.prop("checked",!0):d?e.prop("checked",!1):e.prop("checked",!e.prop("checked"))}b.parent().hasClass("sensei-grid-empty-row")||(c?b.parent().addClass("selectedRow"):d?b.parent().removeClass("selectedRow"):b.parent().toggleClass("selectedRow"),b.parent().hasClass("selectedRow")?f.events.trigger("row:mark",b.parent()):f.events.trigger("row:unmark",b.parent()))},f.selectAll=function(){var b=!0,c=!1,d=f.$el.find("thead th.selectable :checkbox");d&&!d.is(":checked")&&(b=!1,c=!0);var e=f.getRows();e.each(function(){f.selectRow(a(this),b,c)})},f.showEditor=function(){if(!f.getEditorInstance())return f.exitEditor(),void(f.isEditing=!0);f.activeEditor=f.getEditorInstance();var a=f.activeEditor.getElement(),b=f.getActiveCell();f.activeEditor.activeCell=b,f.isEditing=!0,f.activeEditor.show(),a.css(b.cellPosition()),f.activeEditor.setDimensions(b);var c=b.data("column"),d=b.data("allowHTML"),e=d?b.find(">div").html():b.text();f.activeEditor.setValue(e);var g={};return g[c]=e,f.events.trigger("editor:load",g,b),a},f.keydown=function(b){var c=!0,d=[8,9,13,27,32,37,38,39,40,65,68,89,90],e=[8,32,37,38,39,40,65,68,89,90],g=f.getActiveCell();if((0!==f.getActiveCell().length||f.isEditing)&&_.contains(d,b.which)){if(!f.isEditing&&_.contains(f.config.disableKeys,b.which))return void b.preventDefault();if(!(f.isEditing&&f.getEditor()&&_.contains(e,b.which))){b.preventDefault();var h;switch(b.which){case 37:f.move("left");break;case 38:b.shiftKey&&f.config.selectable&&f.selectRow(g.parent(),!0),f.move("up"),h=f.getActiveCell(),b.shiftKey&&f.config.selectable&&f.selectRow(h.parent(),!0);break;case 39:f.move("right");break;case 40:b.shiftKey&&f.config.selectable&&f.selectRow(g.parent(),!0),f.move("down"),h=f.getActiveCell(),b.shiftKey&&f.config.selectable&&f.selectRow(h.parent(),!0);break;case 13:var i=!1,j=!1;if(g&&g.data("action")){var k=g.data("action-name");f.rowActions[k]&&f.rowActions[k].trigger({data:{$activeCell:g}}),i=!0}g&&g.hasClass("selectable")&&(f.selectCell(g),j=!0),f.isEditing?b.ctrlKey&&b.shiftKey?f.move("up"):b.ctrlKey&&!b.shiftKey?f.move("down"):f.preventEnter||i||j||f.exitEditor():i||j||f.editCell();break;case 27:f.isEditing?f.exitEditor(!0):f.$el.blur();break;case 9:f.move(b.shiftKey?"left":"right");break;case 32:g&&f.config.selectable&&f.selectRow(g.parent());break;case 8:b.ctrlKey||b.metaKey?f.removeActiveRow():f.clearActiveCell();break;case 65:if(f.config.selectable&&(b.ctrlKey||b.metaKey||b.shiftKey)){var l=f.$el.find("thead th.selectable :checkbox");l.prop("checked",!l.prop("checked")),f.selectAll()}break;case 90:if(b.ctrlKey||b.metaKey){var m=f.undo();if("row"in m&&"column"in m){var n=f.getRowByIndex(m.row-1),o=f.getCellFromRowByIndex(n,m.column);o.html(a("
").text(m.previousState));var p={};p[o.data("column")]=m.previousState,f.events.trigger("editor:save",p,o)}}break;case 89:if(b.ctrlKey||b.metaKey){var q=f.redo();if("row"in q&&"column"in q){var r=f.getRowByIndex(q.row-1),s=f.getCellFromRowByIndex(r,q.column);s.html(a("
").text(q.currentState));var t={};t[s.data("column")]=q.currentState,f.events.trigger("editor:save",t,s)}}break;case 68:(b.ctrlKey||b.shiftKey)&&f.duplicateActiveRow()}c&&b.preventDefault()}}},f.clickCell=function(b){a(this).hasClass("selectable")||b.preventDefault(),f.isEditing&&f.exitEditor(),f.setActiveCell(a(this))},f.dblClickCell=function(b){b.preventDefault(),f.setActiveCell(a(this)),f.editCell()},f.renderColumns=function(){var b=a("thead",f.$el),c=document.createElement("tr");if(f.config.selectable){var d=a("
")[0];c.appendChild(d)}_.each(f.columns,function(b){var d=document.createElement("th"),e=document.createElement("div");f.config.sortable&&(d.className="sensei-grid-sortable"),a(e).text(b.display?b.display:b.name),d.appendChild(e),a(d).data("name",b.name),a(d).data("type",b.type||"string"),a(d).data("editor",b.editor||"BasicEditor"),b.editorProps&&(f.editorProps[b.name]=b.editorProps),c.appendChild(d)}),b.append(c)},f.renderData=function(b){var c=a(".sensei-grid-tbody",f.$el);if(b&&(f.data=b),c.html(null),_.each(f.data,function(a){var b=f.renderRow(a,!0);c.append(b)}),f.config.emptyRow){var d=f.renderRow(null,!1);c.append(d)}if(_.isEmpty(f.data)&&f.config.emptyGridMessage){var e=a("").text(f.config.emptyGridMessage),g=a("").append(e);c.html(g)}},f.renderRow=function(b,c,d){var e=document.createElement("tr");if(c||(e.className="sensei-grid-empty-row"),d&&(e.className="sensei-grid-dirty-row"),f.config.selectable){var g=a("
");if(c){var h=a("");g.find("div").append(h)}g.prop("class","selectable"),e.appendChild(g[0])}return _.each(f.columns,function(d){var f=document.createElement("td"),g=document.createElement("div");_.has(b,d.name)&&(d.allowHTML&&d.allowHTML===!0?a(g).html(b[d.name]):a(g).text(b[d.name])),d.wrap===!0&&a(f).css("white-space","normal"),a(f).data("allowHTML",d.allowHTML),a(f).data("column",d.name),a(f).data("type",d.type||"string"),a(f).data("editor",d.editor||"BasicEditor"),a(f).data("saved",c),f.appendChild(g),e.appendChild(f)}),_.isEmpty(f.rowElements)||_.each(f.rowElements,function(b,c){var d=document.createElement("td");d.innerHTML=b,a(d).data("action",!0),a(d).data("action-name",c),a(d).addClass("row-action");var g=f.rowActions[c];g.triggerEvent&&g.triggerEvent.event&&g.triggerEvent.selector&&a(d).on(g.triggerEvent.event,g.triggerEvent.selector,{$activeCell:a(d)},g.trigger),e.appendChild(d)}),e},f.renderBaseTable=function(){var a=document.createElement("table"),b=document.createElement("thead"),c=document.createElement("tbody");c.className="sensei-grid-tbody",b.className="sensei-grid-thead",a.className=f.config.tableClass,a.appendChild(b),a.appendChild(c),f.$el.html(a),f.$el.attr("tabindex",-1)},f.init=function(b,c,d,e){return f.config=a.extend({},g,d),f.data=b,f.columns=c,f.name=e,f.$el=a(this),f.editors={},f.rowActions={},f.edits=[],f.editPointer=-1,f},f.init(b,c,d,e)}}(jQuery),function(a){var b=this,c=function(a){this.grid=a};c.extend=function(a){var b,c=this;b=function(){return c.apply(this,arguments)};var d=function(){this.constructor=b};return d.prototype=c.prototype,b.prototype=new d,a&&_.extend(b.prototype,a),b.__super__=c.prototype,b},c.prototype.getElement=function(){return a(this.editor)},c.prototype.initialize=function(){},c.prototype.render=function(){},c.prototype.show=function(){this.getElement().show()},c.prototype.hide=function(){this.getElement().hide(),this.grid.activeEditor.activeCell=null,this.grid.activeEditor=null},c.prototype.setDimensions=function(a){this.getElement().css({width:a.outerWidth()+1,height:a.outerHeight()+1})},c.prototype.getValue=function(){throw Error("Editor.getValue not implemented")},c.prototype.setValue=function(){throw Error("Editor.setValue not implemented")},b.Editor=c,b.BasicEditor=c.extend({types:[],name:"BasicEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-basic-editor";var a=document.createElement("input");a.setAttribute("type","text"),this.editor.appendChild(a),this.grid.$el.append(this.editor)}},getValue:function(){return a("input",this.editor).val()},setValue:function(b){a("input",this.editor).val(b).focus()}}),b.TextareaEditor=c.extend({types:[],name:"TextareaEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-textarea-editor";var a=document.createElement("textarea");this.editor.appendChild(a),this.grid.$el.append(this.editor)}},setDimensions:function(a){this.getElement().find("textarea").css({width:a.outerWidth()+50,height:a.outerHeight()+50})},getValue:function(){return a("textarea",this.editor).val()},setValue:function(b){a("textarea",this.editor).val(b).focus()}}),b.BooleanEditor=c.extend({types:[],name:"BooleanEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-boolean-editor";var b=a("
",{"class":"sensei-grid-checkbox-wrapper"});b.append(a("",{type:"checkbox"})),a(this.editor).append(b),this.grid.$el.append(this.editor)}},setDimensions:function(a){var b={width:a.outerWidth()-3,height:a.outerHeight()-3,background:"white"};this.getElement().find(".sensei-grid-checkbox-wrapper").css(b)},getValue:function(){return a("input",this.editor).is(":checked")?"true":"false"},setValue:function(b){"true"===b.toLowerCase()?a("input",this.editor).prop("checked",!0):a("input",this.editor).prop("checked",!1),a("input",this.editor).focus()}}),b.SelectEditor=c.extend({types:[],name:"SelectEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-custom-editor";var a=document.createElement("select");this.editor.appendChild(a),this.grid.$el.append(this.editor)}},renderValues:function(){if(_.has(this.props,"values")){var a=this.getElement().find("select");a.html(null),_.each(this.props.values,function(b){var c=document.createElement("option");c.value=b,c.innerHTML=b,a.append(c)})}},show:function(){this.renderValues(),this.getElement().show()},getValue:function(){return a("select",this.editor).val()},setValue:function(b){a("select>option",this.editor).filter(function(){return a(this).val()===b}).attr("selected","selected"),a("select").focus()}}),b.DateEditor=c.extend({types:[],name:"DateEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-date-editor";var b=a("
",{"class":"sensei-grid-date-wrapper"});b.append(a("",{type:"text","class":"datepicker"})),a(this.editor).append(b),this.grid.$el.append(this.editor);var c=this.grid;a(".datepicker").pickadate({format:"ddd mmm dd yyyy",editable:!0,today:!1,clear:!1,close:!1,onClose:function(){c.preventEnter=!1},onOpen:function(){c.preventEnter=!0}})}},getValue:function(){return a("input",this.editor).val()},setValue:function(b){a("input",this.editor).val(b).focus()}}),b.DisabledEditor=c.extend({types:[],name:"DisabledEditor",render:function(){if(!this.editor){this.editor=document.createElement("div"),this.editor.className="sensei-grid-editor sensei-grid-disabled-editor";var b=a("",{type:"text",readOnly:!0});a(this.editor).append(b),this.grid.$el.append(this.editor)}},getValue:function(){return a("input",this.editor).val()},setValue:function(b){a("input",this.editor).val(b).focus()}}),b.RichEditor=c.extend({types:[],name:"RichEditor",render:function(){if(!this.editor){this.editor=a("
",{"class":"sensei-grid-editor sensei-grid-rich-editor"});var b=a("
",{"class":"summertime-wrapper"});this.editor.append(b),this.grid.$el.append(this.editor)}},setDimensions:function(a){this.getElement().css({width:a.outerWidth()+50})},getValue:function(){return a(".summertime-wrapper",this.editor).code()},setValue:function(b){a(".summertime-wrapper",this.editor).destroy(),a(".summertime-wrapper",this.editor).html(b);var c=this.grid;a(".summertime-wrapper",this.editor).summernote({focus:!0,toolbar:[["style",["bold","italic","underline","clear"]],["font",["strikethrough"]],["fontsize",["fontsize"]]],onfocus:function(){c.preventEnter=!0},onblur:function(){c.preventEnter=!1},onkeydown:function(a){9===a.keyCode&&a.stopImmediatePropagation()}}),a(".summertime-wrapper",this.editor).code(b)}})}(jQuery); \ No newline at end of file diff --git a/examples/index.html b/examples/index.html index 7518f46..f784035 100644 --- a/examples/index.html +++ b/examples/index.html @@ -14,7 +14,7 @@ - + @@ -25,10 +25,10 @@ - - - - + + + +