From e696b2b3202654381041066f38dea29fb7e479c6 Mon Sep 17 00:00:00 2001 From: Oscar Date: Mon, 4 Sep 2017 15:02:33 +0200 Subject: [PATCH 1/6] shadow7853 feature: partial data rows, column names and column types --- demo/index.php | 68 +++++++++- demo/shadow7853.html | 274 ++++++++++++++++++++++++++++++++++++++++ jquery.edittable.js | 93 +++++++++----- jquery.edittable.min.js | 2 +- 4 files changed, 400 insertions(+), 37 deletions(-) create mode 100644 demo/shadow7853.html diff --git a/demo/index.php b/demo/index.php index b42ebeb..731bc0e 100644 --- a/demo/index.php +++ b/demo/index.php @@ -104,7 +104,9 @@ $(this).datepicker(); }); - // Example 4 + // Example 4 EDITED by shadow7853 + // shadow7853: I've modified the code to enable headerCols, row_templates to be also partials (define templates for first cells, others will be 'text') and to not disable column adding. + // shadow7853: Also data rows could be partials, not all with the same length. // Custom fields & validation var mynewtable = $('#examplex').editTable({ field_templates: { @@ -148,7 +150,69 @@ first_row: false, data: [ [false,"01/30/2013","50,00 €","Lorem ipsum...\n\nDonec in dui nisl. Nam ac libero eget magna iaculis faucibus eu non arcu. Proin sed diam ut nisl scelerisque fermentum."], - [true,"02/28/2013","50,00 €",'This is a + Show Code + Validate table + + + + +
+ +

Credits and contacts

+ +

editTable has been made by me. You can contact me at micc83@gmail.com or twitter for any issue or feauture request.

+ + + + + \ No newline at end of file diff --git a/jquery.edittable.js b/jquery.edittable.js index e9d07d4..b554c9b 100644 --- a/jquery.edittable.js +++ b/jquery.edittable.js @@ -7,27 +7,28 @@ // Settings var s = $.extend({ - data: [['']], - tableClass: 'inputtable', - jsonData: false, - headerCols: false, - maxRows: 999, - first_row: true, - row_template: false, - field_templates: false, - validate_field: function (col_id, value, col_type, $element) { - return true; - } - }, options), + data: [['']], + tableClass: 'inputtable', + jsonData: false, + headerCols: false, + maxRows: 999, + first_row: true, + row_template: false, + field_templates: false, + validate_field: function (col_id, value, col_type, $element) { + return true; + } + }, options), $el = $(this), defaultTableContent = '', $table = $('', { class: s.tableClass + ((s.first_row) ? ' wh' : ''), html: defaultTableContent }), - defaultth = '', - colnumber, - rownumber, + defaultthbuttons = '+-', + defaultth = '', + colnumber = 0, + rownumber = 0, reset, is_validated = true; @@ -38,7 +39,7 @@ function buildCell(content, type) { content = (content === 0) ? "0" : (content || ''); // Custom type - if (type && 'text' !== type){ + if (type && 'text' !== type) { var field = s.field_templates[type]; return ''; } @@ -47,7 +48,7 @@ } // Build row - function buildRow(data, len) { + function buildRow(data) { var rowcontent = '', b; @@ -55,14 +56,18 @@ if (!s.row_template) { // Without row template - for (b = 0; b < (len || data.length); b += 1) { + for (b = 0; b < colnumber; b += 1) { rowcontent += buildCell(data[b]); } } else { // With row template - for (b = 0; b < s.row_template.length; b += 1) { - // For each field in the row - rowcontent += buildCell(data[b], s.row_template[b]); + for (b = 0; b < colnumber; b += 1) { + if (b < s.row_template.length) { + // For each field in the row + rowcontent += buildCell(data[b], s.row_template[b]); + } else { + rowcontent += buildCell(data[b]); + } } } @@ -93,28 +98,40 @@ // Clear table $table.html(defaultTableContent); + colnumber = 0; + if (data) { + for (var i = 0; i < data.length; i++) { + var l = data[i].length; + if (colnumber < l) { + colnumber = l; + } + } + } + // If headers or row_template are set if (s.headerCols || s.row_template) { - // Fixed columns - var col = s.headerCols || s.row_template; + // Fixed first columns + var fixed = Math.max((s.headerCols || []).length, (s.row_template || []).length); + + colnumber = Math.max(colnumber, fixed) // Table headers - for (a = 0; a < col.length; a += 1) { + for (a = 0; a < colnumber; a += 1) { var col_title = s.headerCols[a] || ''; - $table.find('thead tr').append(''); + $table.find('thead tr').append(''); } // Table content for (a = 0; a < crow; a += 1) { // For each row in data - buildRow(data[a], col.length).appendTo($table.find('tbody')); + buildRow(data[a]).appendTo($table.find('tbody')); } - } else if ( data[0] ) { + } else { // Variable columns - for (a = 0; a < data[0].length; a += 1) { + for (a = 0; a < colnumber; a += 1) { $table.find('thead tr').append(defaultth); } @@ -128,7 +145,7 @@ $table.find('thead tr').append(''); // Count rows and columns - colnumber = $table.find('thead th').length - 1; + //colnumber = $table.find('thead th').length - 1; rownumber = $table.find('tbody tr').length; checkButtons(); @@ -146,24 +163,24 @@ data[row] = []; $(this).find('td:not(:last-child)').each(function (i, v) { - if ( s.row_template && 'text' !== s.row_template[i] ){ + if (s.row_template && 'text' !== s.row_template[i]) { var field = s.field_templates[s.row_template[i]], el = $(this).find($(field.html).prop('tagName')); - + value = field.getValue(el); - if ( !s.validate_field(i, value, s.row_template[i], el) ){ + if (!s.validate_field(i, value, s.row_template[i], el)) { is_validated = false; } data[row].push(value); } else { value = $(this).find('input[type="text"]').val(); - if ( !s.validate_field(i, value, 'text', v) ){ + if (!s.validate_field(i, value, 'text', v)) { is_validated = false; } data[row].push(value); } }); - + }); // Remove undefined @@ -212,6 +229,10 @@ $table.find('.delcol').removeClass('disabled'); + if (s.row_template && colid < s.row_template.length) { + s.row_template.splice(colid + 1, 0, 'text'); + } + return false; }); @@ -234,6 +255,10 @@ $(this).find('td:eq(' + colid + ')').remove(); }); + if (s.row_template && colid < s.row_template.length) { + s.row_template.splice(colid, 1); + } + return false; }); diff --git a/jquery.edittable.min.js b/jquery.edittable.min.js index c2527ec..5a84034 100644 --- a/jquery.edittable.min.js +++ b/jquery.edittable.min.js @@ -1,2 +1,2 @@ /*! editTable v0.2.0 by Alessandro Benoit */ -(function(e,t,n){"use strict";e.fn.editTable=function(t){function p(e,t){e=e===0?"0":e||"";if(t&&"text"!==t){var n=r.field_templates[t];return""}return''}function d(t,n){var i="",s;t=t||"";if(!r.row_template){for(s=0;s<(n||t.length);s+=1){i+=p(t[s])}}else{for(s=0;s",{html:i+''})}function v(){if(f<2){u.find(".delcol").addClass("disabled")}if(l<2){u.find(".delrow").addClass("disabled")}if(r.maxRows&&l===r.maxRows){u.find(".addrow").addClass("disabled")}}function m(e){var t,n=Math.min(r.maxRows,e.length);u.html(o);if(r.headerCols||r.row_template){var i=r.headerCols||r.row_template;for(t=0;t"+s+"")}for(t=0;t");f=u.find("thead th").length-1;l=u.find("tbody tr").length;v()}function g(){var t=0,n=[],i;h=true;u.find("tbody tr").each(function(){t+=1;n[t]=[];e(this).find("td:not(:last-child)").each(function(s,o){if(r.row_template&&"text"!==r.row_template[s]){var u=r.field_templates[r.row_template[s]],a=e(this).find(e(u.html).prop("tagName"));i=u.getValue(a);if(!r.validate_field(s,i,r.row_template[s],a)){h=false}n[t].push(i)}else{i=e(this).find('input[type="text"]').val();if(!r.validate_field(s,i,"text",o)){h=false}n[t].push(i)}})});n.splice(0,1);return n}var r=e.extend({data:[[""]],tableClass:"inputtable",jsonData:false,headerCols:false,maxRows:999,first_row:true,row_template:false,field_templates:false,validate_field:function(e,t,n,r){return true}},t),s=e(this),o="",u=e("
+ - ' + defaultthbuttons + '' + field.setValue(field.html, content)[0].outerHTML + '' + col_title + '' + '' + col_title + '' + defaultthbuttons + '"+n.setValue(n.html,e)[0].outerHTML+"+ -
",{"class":r.tableClass+(r.first_row?" wh":""),html:o}),a='',f,l,c,h=true;n=n+1;if(s.is("textarea")){try{c=JSON.parse(s.val())}catch(y){c=r.data}s.after(u);if(u.parents("form").length>0){u.parents("form").submit(function(){s.val(JSON.stringify(g()))})}}else{c=JSON.parse(r.jsonData)||r.data;s.append(u)}m(c);u.on("click",".addcol",function(){var t=parseInt(e(this).closest("tr").children().index(e(this).parent("th")),10);f+=1;u.find("thead tr").find("th:eq("+t+")").after(a);u.find("tbody tr").each(function(){e(this).find("td:eq("+t+")").after(p())});u.find(".delcol").removeClass("disabled");return false});u.on("click",".delcol",function(){if(e(this).hasClass("disabled")){return false}var t=parseInt(e(this).closest("tr").children().index(e(this).parent("th")),10);f-=1;v();e(this).parent("th").remove();u.find("tbody tr").each(function(){e(this).find("td:eq("+t+")").remove()});return false});u.on("click",".addrow",function(){if(e(this).hasClass("disabled")){return false}l+=1;e(this).closest("tr").after(d(0,f));u.find(".delrow").removeClass("disabled");v();return false});u.on("click",".delrow",function(){if(e(this).hasClass("disabled")){return false}l-=1;v();e(this).closest("tr").remove();u.find(".addrow").removeClass("disabled");return false});u.on("click","input",function(){e(this).select()});return{getData:function(){return g()},getJsonData:function(){return JSON.stringify(g())},loadData:function(e){m(e)},loadJsonData:function(e){m(JSON.parse(e))},reset:function(){m(c)},isValidated:function(){return h}}}})(jQuery,this,0) \ No newline at end of file +(function(n,t,i){"use strict";n.fn.editTable=function(t){function c(n,t){if(n=n===0?"0":n||"",t&&"text"!==t){var i=r.field_templates[t];return"<\/tr><\/thead><\/tbody>",u=n("
+ -"+i.setValue(i.html,n)[0].outerHTML+"<\/td>"}return'<\/td>'}function v(t){var u="",i;if(t=t||"",r.row_template)for(i=0;i",{html:u+'+<\/a> -<\/a><\/td>'})}function l(){f<2&&u.find(".delcol").addClass("disabled");o<2&&u.find(".delrow").addClass("disabled");r.maxRows&&o===r.maxRows&&u.find(".addrow").addClass("disabled")}function a(n){var t,s=Math.min(r.maxRows,n.length),i,e,h,c;if(u.html(p),f=0,n)for(i=0;i'+c+"<\/span>"+w+"<\/th>");for(t=0;t<\/th>");o=u.find("tbody tr").length;l()}function y(){var f=0,i=[],t;return h=!0,u.find("tbody tr").each(function(){f+=1;i[f]=[];n(this).find("td:not(:last-child)").each(function(u,e){if(r.row_template&&"text"!==r.row_template[u]){var o=r.field_templates[r.row_template[u]],s=n(this).find(n(o.html).prop("tagName"));t=o.getValue(s);r.validate_field(u,t,r.row_template[u],s)||(h=!1);i[f].push(t)}else t=n(this).find('input[type="text"]').val(),r.validate_field(u,t,"text",e)||(h=!1),i[f].push(t)})}),i.splice(0,1),i}var r=n.extend({data:[[""]],tableClass:"inputtable",jsonData:!1,headerCols:!1,maxRows:999,first_row:!0,row_template:!1,field_templates:!1,validate_field:function(){return!0}},t),e=n(this),p="
",{"class":r.tableClass+(r.first_row?" wh":""),html:p}),w='+<\/a> -<\/a>',b="', - $table = $('
"+w+"<\/th>",f=0,o=0,s,h=!0;if(i=i+1,e.is("textarea")){try{s=JSON.parse(e.val())}catch(k){s=r.data}e.after(u);u.parents("form").length>0&&u.parents("form").submit(function(){e.val(JSON.stringify(y()))})}else s=JSON.parse(r.jsonData)||r.data,e.append(u);a(s);u.on("click",".addcol",function(){var t=parseInt(n(this).closest("tr").children().index(n(this).parent("th")),10);return f+=1,u.find("thead tr").find("th:eq("+t+")").after(b),u.find("tbody tr").each(function(){n(this).find("td:eq("+t+")").after(c())}),u.find(".delcol").removeClass("disabled"),r.row_template&&t Date: Mon, 4 Sep 2017 15:05:01 +0200 Subject: [PATCH 2/6] clean old code --- demo/index.php | 65 ++------------------------------------------------ 1 file changed, 2 insertions(+), 63 deletions(-) diff --git a/demo/index.php b/demo/index.php index 731bc0e..915590e 100644 --- a/demo/index.php +++ b/demo/index.php @@ -105,8 +105,8 @@ }); // Example 4 EDITED by shadow7853 - // shadow7853: I've modified the code to enable headerCols, row_templates to be also partials (define templates for first cells, others will be 'text') and to not disable column adding. - // shadow7853: Also data rows could be partials, not all with the same length. + // shadow7853: I've modified the code to enable headerCols, row_templates to be also partials (define templates for first cells, others will be 'text') and to not disable column adding. + // shadow7853: Also data rows could be partials, not all with the same length. // Custom fields & validation var mynewtable = $('#examplex').editTable({ field_templates: { @@ -166,67 +166,6 @@ tableClass: 'inputtable custom' }); - - // Example 4 - // Custom fields & validation - var mynewtable = $('#examplex-PARTIAL').editTable({ - field_templates: { - 'checkbox' : { - html: '', - getValue: function (input) { - return $(input).is(':checked'); - }, - setValue: function (input, value) { - if ( value ){ - return $(input).attr('checked', true); - } - return $(input).removeAttr('checked'); - } - }, - 'textarea' : { - html: ' +
Show Code Validate table diff --git a/jquery.edittable.js b/jquery.edittable.js index c15efee..526c0bd 100644 --- a/jquery.edittable.js +++ b/jquery.edittable.js @@ -1,348 +1,375 @@ /*! editTable v0.2.0 by Alessandro Benoit */ (function ($, window, i) { - - 'use strict'; - - $.fn.editTable = function (options) { - - // Settings - var s = $.extend({ - data: [['']], - tableClass: 'inputtable', - jsonData: false, - headerCols: false, - maxRows: 999, - first_row: true, - row_template: false, - field_templates: false, - fixed_cols: false, - - validate_field: function (col_id, value, col_type, $element) { - return true; - } - }, options), - $el = $(this), - defaultTableContent = '
', { - class: s.tableClass + ((s.first_row) ? ' wh' : '') + ((s.fixed_rows) ? ' fr' : ''), - html: defaultTableContent - }), - defaultthbuttons = '+-', - defaultth = '', - colnumber = 0, - rownumber = 0, - reset, - is_validated = true; - - // Increment for IDs - i = i + 1; - - // Build cell - function buildCell(content, type) { - content = (content === 0) ? "0" : (content || ''); - // Custom type - if (type && 'text' !== type) { - var field = s.field_templates[type]; - return ''; + + 'use strict'; + + $.fn.editTable = function (options) { + + // Settings + var s = $.extend({ + data: [['']], + tableClass: 'inputtable', + jsonData: false, + headerCols: false, + maxRows: 999, + first_row: true, + row_template: false, + field_templates: false, + fixed_cols: false, + + validate_field: function (col_id, value, col_type, $element) { + return true; + }, + + data_changed: function (col_id, action, value, $element) { + + } + }, options), + $el = $(this), + defaultTableContent = '', + $table = $('
' + defaultthbuttons + '' + field.setValue(field.html, content)[0].outerHTML + '
', { + class: s.tableClass + ((s.first_row) ? ' wh' : '') + ((s.fixed_rows) ? ' fr' : ''), + html: defaultTableContent + }), + defaultthbuttons = '+-', + defaultth = '', + colnumber = 0, + rownumber = 0, + reset, + is_validated = true; + + if (s.data_changed) { + $table.on('change.data', 'input, textarea, select', function () { + var colid = parseInt($(this).closest('tr').children().index($(this).parent('td')), 10); + + s.data_changed(colid, 'data', $(this).val(), $(this)); + }); + $table.on('keydown.data', 'input, textarea, select', function (evt) { + var colid = parseInt($(this).closest('tr').children().index($(this).parent('td')), 10); + + if (evt.keyCode === 13) { + s.data_changed(colid, 'data', $(this).val(), $(this)); + } + }); } - // Default - return ''; - } - - // Build row - function buildRow(data) { - - var rowcontent = '', b; - - data = data || ''; - - if (!s.row_template) { - // Without row template - for (b = 0; b < colnumber; b += 1) { - rowcontent += buildCell(data[b]); + + // Increment for IDs + i = i + 1; + + // Build cell + function buildCell(content, type) { + content = (content === 0) ? "0" : (content || ''); + // Custom type + if (type && 'text' !== type) { + var field = s.field_templates[type]; + return ''; } - } else { - // With row template - for (b = 0; b < colnumber; b += 1) { - if (b < s.row_template.length) { - // For each field in the row - rowcontent += buildCell(data[b], s.row_template[b]); - } else { + // Default + return ''; + } + + // Build row + function buildRow(data) { + + var rowcontent = '', b; + + data = data || ''; + + if (!s.row_template) { + // Without row template + for (b = 0; b < colnumber; b += 1) { rowcontent += buildCell(data[b]); } + } else { + // With row template + for (b = 0; b < colnumber; b += 1) { + if (b < s.row_template.length) { + // For each field in the row + rowcontent += buildCell(data[b], s.row_template[b]); + } else { + rowcontent += buildCell(data[b]); + } + } } + + if (!s.fixed_rows) { + rowcontent = rowcontent + ''; + } + + return $('', { + html: rowcontent + }); + } - - if (!s.fixed_rows) { - rowcontent = rowcontent + ''; - } - - return $('', { - html: rowcontent - }); - - } - - // Check button status (enable/disabled) - function checkButtons() { - if (colnumber < 2) { - $table.find('.delcol').addClass('disabled'); - } - if (rownumber < 2) { - $table.find('.delrow').addClass('disabled'); - } - if (s.maxRows && rownumber === s.maxRows) { - $table.find('.addrow').addClass('disabled'); - } - } - - // Fill table with data - function fillTableData(data) { - - var a, crow = Math.min(s.maxRows, data.length); - - // Clear table - $table.html(defaultTableContent); - - colnumber = 0; - if (data) { - for (var i = 0; i < data.length; i++) { - var l = data[i].length; - if (colnumber < l) { - colnumber = l; - } + + // Check button status (enable/disabled) + function checkButtons() { + if (colnumber < 2) { + $table.find('.delcol').addClass('disabled'); + } + if (rownumber < 2) { + $table.find('.delrow').addClass('disabled'); + } + if (s.maxRows && rownumber === s.maxRows) { + $table.find('.addrow').addClass('disabled'); } } - - // If headers or row_template are set - if (s.headerCols || s.row_template) { - - // Fixed first columns - var fixed = Math.max((s.headerCols || []).length, (s.row_template || []).length); - - colnumber = Math.max(colnumber, fixed) - - // Table headers - for (a = 0; a < colnumber; a += 1) { - var col_title = s.headerCols[a] || ''; - if (s.fixed_cols) { - $table.find('thead tr').append(''); - } else { - $table.find('thead tr').append(''); + + // Fill table with data + function fillTableData(data) { + + var a, crow = Math.min(s.maxRows, data.length); + + // Clear table + $table.html(defaultTableContent); + + colnumber = 0; + if (data) { + for (var i = 0; i < data.length; i++) { + var l = data[i].length; + if (colnumber < l) { + colnumber = l; + } } } - - // Table content - for (a = 0; a < crow; a += 1) { - // For each row in data - buildRow(data[a]).appendTo($table.find('tbody')); - } - - } else { - - // Variable columns - if (!s.fixed_cols) { + + // If headers or row_template are set + if (s.headerCols || s.row_template) { + + // Fixed first columns + var fixed = Math.max((s.headerCols || []).length, (s.row_template || []).length); + + colnumber = Math.max(colnumber, fixed) + + // Table headers for (a = 0; a < colnumber; a += 1) { - $table.find('thead tr').append(defaultth); + var col_title = s.headerCols[a] || ''; + if (s.fixed_cols) { + $table.find('thead tr').append(''); + } else { + $table.find('thead tr').append(''); + } } + + // Table content + for (a = 0; a < crow; a += 1) { + // For each row in data + buildRow(data[a]).appendTo($table.find('tbody')); + } + + } else { + + // Variable columns + if (!s.fixed_cols) { + for (a = 0; a < colnumber; a += 1) { + $table.find('thead tr').append(defaultth); + } + } + + for (a = 0; a < crow; a += 1) { + buildRow(data[a]).appendTo($table.find('tbody')); + } + } - - for (a = 0; a < crow; a += 1) { - buildRow(data[a]).appendTo($table.find('tbody')); + + // Append missing th + if (!s.fixed_rows) { + $table.find('thead tr').append(''); } - - } - - // Append missing th - if (!s.fixed_rows) { - $table.find('thead tr').append(''); + + // Count rows and columns + //colnumber = $table.find('thead th').length - 1; + rownumber = $table.find('tbody tr').length; + + checkButtons(); } - - // Count rows and columns - //colnumber = $table.find('thead th').length - 1; - rownumber = $table.find('tbody tr').length; - - checkButtons(); - } - - // Export data - function exportData() { - var row = 0, data = [], value; - - is_validated = true; - - $table.find('tbody tr').each(function () { - - row += 1; - data[row] = []; - - $(this).find('td:not(:last-child)').each(function (i, v) { - if (s.row_template && 'text' !== s.row_template[i]) { - var field = s.field_templates[s.row_template[i]], - el = $(this).find($(field.html).prop('tagName')); - - value = field.getValue(el); - if (!s.validate_field(i, value, s.row_template[i], el)) { - is_validated = false; + + // Export data + function exportData() { + var row = 0, data = [], value; + + is_validated = true; + + $table.find('tbody tr').each(function () { + + row += 1; + data[row] = []; + + $(this).find('td:not(:last-child)').each(function (i, v) { + if (s.row_template && 'text' !== s.row_template[i]) { + var field = s.field_templates[s.row_template[i]], + el = $(this).find($(field.html).prop('tagName')); + + value = field.getValue(el); + if (!s.validate_field(i, value, s.row_template[i], el)) { + is_validated = false; + } + data[row].push(value); + } else { + value = $(this).find('input[type="text"]').val(); + if (!s.validate_field(i, value, 'text', v)) { + is_validated = false; + } + data[row].push(value); } - data[row].push(value); - } else { - value = $(this).find('input[type="text"]').val(); - if (!s.validate_field(i, value, 'text', v)) { - is_validated = false; - } - data[row].push(value); - } + }); + }); - - }); - - // Remove undefined - data.splice(0, 1); - - return data; - } - - // Fill the table with data from textarea or given properties - if ($el.is('textarea')) { - - try { - reset = JSON.parse($el.val()); - } catch (e) { - reset = s.data; + + // Remove undefined + data.splice(0, 1); + + return data; } - - $el.after($table); - - // If inside a form set the textarea content on submit - if ($table.parents('form').length > 0) { - $table.parents('form').submit(function () { - $el.val(JSON.stringify(exportData())); - }); + + // Fill the table with data from textarea or given properties + if ($el.is('textarea')) { + + try { + reset = JSON.parse($el.val()); + } catch (e) { + reset = s.data; + } + + $el.after($table); + + // If inside a form set the textarea content on submit + if ($table.parents('form').length > 0) { + $table.parents('form').submit(function () { + $el.val(JSON.stringify(exportData())); + }); + } + + } else { + reset = (JSON.parse(s.jsonData) || s.data); + $el.append($table); } - - } else { - reset = (JSON.parse(s.jsonData) || s.data); - $el.append($table); - } - - fillTableData(reset); - - // Add column - $table.on('click', '.addcol', function () { - - var colid = parseInt($(this).closest('tr').children().index($(this).parent('th')), 10); - - colnumber += 1; - - $table.find('thead tr').find('th:eq(' + colid + ')').after(defaultth); - - $table.find('tbody tr').each(function () { - $(this).find('td:eq(' + colid + ')').after(buildCell()); + + fillTableData(reset); + + // Add column + $table.on('click', '.addcol', function () { + + var colid = parseInt($(this).closest('tr').children().index($(this).parent('th')), 10); + + colnumber += 1; + + $table.find('thead tr').find('th:eq(' + colid + ')').after(defaultth); + + $table.find('tbody tr').each(function () { + $(this).find('td:eq(' + colid + ')').after(buildCell()); + }); + + $table.find('.delcol').removeClass('disabled'); + + if (s.row_template && colid < s.row_template.length) { + s.row_template.splice(colid + 1, 0, 'text'); + } + + if (s.data_changed) { + s.data_changed(colid, 'addcol'); + } + + return false; }); - - $table.find('.delcol').removeClass('disabled'); - - if (s.row_template && colid < s.row_template.length) { - s.row_template.splice(colid + 1, 0, 'text'); - } - - return false; - }); - - // Remove column - $table.on('click', '.delcol', function () { - - if ($(this).hasClass('disabled')) { + + // Remove column + $table.on('click', '.delcol', function () { + + if ($(this).hasClass('disabled')) { + return false; + } + + var colid = parseInt($(this).closest('tr').children().index($(this).parent('th')), 10); + + colnumber -= 1; + + checkButtons(); + + $(this).parent('th').remove(); + + $table.find('tbody tr').each(function () { + $(this).find('td:eq(' + colid + ')').remove(); + }); + + if (s.row_template && colid < s.row_template.length) { + s.row_template.splice(colid, 1); + } + + if (s.data_changed) { + s.data_changed(colid, 'delcol'); + } + return false; - } - - var colid = parseInt($(this).closest('tr').children().index($(this).parent('th')), 10); - - colnumber -= 1; - - checkButtons(); - - $(this).parent('th').remove(); - - $table.find('tbody tr').each(function () { - $(this).find('td:eq(' + colid + ')').remove(); }); - - if (s.row_template && colid < s.row_template.length) { - s.row_template.splice(colid, 1); - } - - return false; - }); - - // Add row - $table.on('click', '.addrow', function () { - - if ($(this).hasClass('disabled')) { + + // Add row + $table.on('click', '.addrow', function () { + + if ($(this).hasClass('disabled')) { + return false; + } + + rownumber += 1; + + $(this).closest('tr').after(buildRow(0, colnumber)); + + $table.find('.delrow').removeClass('disabled'); + + checkButtons(); + return false; - } - - rownumber += 1; - - $(this).closest('tr').after(buildRow(0, colnumber)); - - $table.find('.delrow').removeClass('disabled'); - - checkButtons(); - - return false; - }); - - // Delete row - $table.on('click', '.delrow', function () { - - if ($(this).hasClass('disabled')) { + }); + + // Delete row + $table.on('click', '.delrow', function () { + + if ($(this).hasClass('disabled')) { + return false; + } + + rownumber -= 1; + + checkButtons(); + + $(this).closest('tr').remove(); + + $table.find('.addrow').removeClass('disabled'); + return false; - } - - rownumber -= 1; - - checkButtons(); - - $(this).closest('tr').remove(); - - $table.find('.addrow').removeClass('disabled'); - - return false; - }); - - // Select all content on click - $table.on('click', 'input', function () { - $(this).select(); - }); - - // Return functions - return { - // Get an array of data - getData: function () { - return exportData(); - }, - // Get the JSON rappresentation of data - getJsonData: function () { - return JSON.stringify(exportData()); - }, - // Load an array of data - loadData: function (data) { - fillTableData(data); - }, - // Load a JSON rappresentation of data - loadJsonData: function (data) { - fillTableData(JSON.parse(data)); - }, - // Reset data to the first instance - reset: function () { - fillTableData(reset); - }, - isValidated: function () { - return is_validated; - } + }); + + // Select all content on click + $table.on('click', 'input', function () { + $(this).select(); + }); + + // Return functions + return { + // Get an array of data + getData: function () { + return exportData(); + }, + // Get the JSON rappresentation of data + getJsonData: function () { + return JSON.stringify(exportData()); + }, + // Load an array of data + loadData: function (data) { + fillTableData(data); + }, + // Load a JSON rappresentation of data + loadJsonData: function (data) { + fillTableData(JSON.parse(data)); + }, + // Reset data to the first instance + reset: function () { + fillTableData(reset); + }, + isValidated: function () { + return is_validated; + } + }; }; - }; - -})(jQuery, this, 0); \ No newline at end of file + + })(jQuery, this, 0); \ No newline at end of file diff --git a/jquery.edittable.min.js b/jquery.edittable.min.js index e435205..49860c4 100644 --- a/jquery.edittable.min.js +++ b/jquery.edittable.min.js @@ -1,2 +1,2 @@ /*! editTable v0.2.0 by Alessandro Benoit */ -(function(n,t,i){"use strict";n.fn.editTable=function(t){function c(n,t){if(n=n===0?"0":n||"",t&&"text"!==t){var i=r.field_templates[t];return"",{html:u})}function l(){f<2&&u.find(".delcol").addClass("disabled");o<2&&u.find(".delrow").addClass("disabled");r.maxRows&&o===r.maxRows&&u.find(".addrow").addClass("disabled")}function a(n){var t,h=Math.min(r.maxRows,n.length),i,e,c,s;if(u.html(p),f=0,n)for(i=0;i"+s+"<\/th>"):u.find("thead tr").append('<\/tr><\/thead><\/tbody>",u=n("
' + defaultthbuttons + '' + field.setValue(field.html, content)[0].outerHTML + '+ -
+ -
' + col_title + '' + '' + col_title + '' + defaultthbuttons + '' + col_title + '' + '' + col_title + '' + defaultthbuttons + '"+i.setValue(i.html,n)[0].outerHTML+"<\/td>"}return'<\/td>'}function v(t){var u="",i;if(t=t||"",r.row_template)for(i=0;i+<\/a> -<\/a><\/td>'),n("
'+s+"<\/span>"+w+"<\/th>");for(t=0;t<\/th>");o=u.find("tbody tr").length;l()}function y(){var f=0,i=[],t;return h=!0,u.find("tbody tr").each(function(){f+=1;i[f]=[];n(this).find("td:not(:last-child)").each(function(u,e){if(r.row_template&&"text"!==r.row_template[u]){var o=r.field_templates[r.row_template[u]],s=n(this).find(n(o.html).prop("tagName"));t=o.getValue(s);r.validate_field(u,t,r.row_template[u],s)||(h=!1);i[f].push(t)}else t=n(this).find('input[type="text"]').val(),r.validate_field(u,t,"text",e)||(h=!1),i[f].push(t)})}),i.splice(0,1),i}var r=n.extend({data:[[""]],tableClass:"inputtable",jsonData:!1,headerCols:!1,maxRows:999,first_row:!0,row_template:!1,field_templates:!1,fixed_cols:!1,validate_field:function(){return!0}},t),e=n(this),p="
",{"class":r.tableClass+(r.first_row?" wh":"")+(r.fixed_rows?" fr":""),html:p}),w='+<\/a> -<\/a>',b="",{html:u})}function l(){f<2&&u.find(".delcol").addClass("disabled");o<2&&u.find(".delrow").addClass("disabled");r.maxRows&&o===r.maxRows&&u.find(".addrow").addClass("disabled")}function a(n){var t,h=Math.min(r.maxRows,n.length),i,e,c,s;if(u.html(p),f=0,n)for(i=0;i"+s+"<\/th>"):u.find("thead tr").append('<\/tr><\/thead><\/tbody>",u=n("
"+w+"<\/th>",f=0,o=0,s,h=!0;if(i=i+1,e.is("textarea")){try{s=JSON.parse(e.val())}catch(d){s=r.data}e.after(u);u.parents("form").length>0&&u.parents("form").submit(function(){e.val(JSON.stringify(y()))})}else s=JSON.parse(r.jsonData)||r.data,e.append(u);a(s);u.on("click",".addcol",function(){var t=parseInt(n(this).closest("tr").children().index(n(this).parent("th")),10);return f+=1,u.find("thead tr").find("th:eq("+t+")").after(b),u.find("tbody tr").each(function(){n(this).find("td:eq("+t+")").after(c())}),u.find(".delcol").removeClass("disabled"),r.row_template&&t"+i.setValue(i.html,n)[0].outerHTML+"<\/td>"}return'<\/td>'}function v(t){var u="",i;if(t=t||"",r.row_template)for(i=0;i+<\/a> -<\/a><\/td>'),n("
'+s+"<\/span>"+w+"<\/th>");for(t=0;t<\/th>");o=u.find("tbody tr").length;l()}function y(){var f=0,i=[],t;return h=!0,u.find("tbody tr").each(function(){f+=1;i[f]=[];n(this).find("td:not(:last-child)").each(function(u,e){if(r.row_template&&"text"!==r.row_template[u]){var o=r.field_templates[r.row_template[u]],s=n(this).find(n(o.html).prop("tagName"));t=o.getValue(s);r.validate_field(u,t,r.row_template[u],s)||(h=!1);i[f].push(t)}else t=n(this).find('input[type="text"]').val(),r.validate_field(u,t,"text",e)||(h=!1),i[f].push(t)})}),i.splice(0,1),i}var r=n.extend({data:[[""]],tableClass:"inputtable",jsonData:!1,headerCols:!1,maxRows:999,first_row:!0,row_template:!1,field_templates:!1,fixed_cols:!1,validate_field:function(){return!0},data_changed:function(){}},t),e=n(this),p="
",{"class":r.tableClass+(r.first_row?" wh":"")+(r.fixed_rows?" fr":""),html:p}),w='+<\/a> -<\/a>',b="",{html:u})}function l(){f<2&&u.find(".delcol").addClass("disabled");o<2&&u.find(".delrow").addClass("disabled");r.maxRows&&o===r.maxRows&&u.find(".addrow").addClass("disabled")}function a(n){var t,h=Math.min(r.maxRows,n.length),i,e,c,s;if(u.html(p),f=0,n)for(i=0;i"+s+"<\/th>"):u.find("thead tr").append('<\/tr><\/thead><\/tbody>",u=n("
"+w+"<\/th>",f=0,o=0,s,h=!0;if(r.data_changed){u.on("change.data","input, textarea, select",function(){var t=parseInt(n(this).closest("tr").children().index(n(this).parent("td")),10);r.data_changed(t,"data",n(this).val(),n(this))});u.on("keydown.data","input, textarea, select",function(t){var i=parseInt(n(this).closest("tr").children().index(n(this).parent("td")),10);t.keyCode===13&&r.data_changed(i,"data",n(this).val(),n(this))})}if(i=i+1,e.is("textarea")){try{s=JSON.parse(e.val())}catch(k){s=r.data}e.after(u);u.parents("form").length>0&&u.parents("form").submit(function(){e.val(JSON.stringify(y()))})}else s=JSON.parse(r.jsonData)||r.data,e.append(u);a(s);u.on("click",".addcol",function(){var t=parseInt(n(this).closest("tr").children().index(n(this).parent("th")),10);return f+=1,u.find("thead tr").find("th:eq("+t+")").after(b),u.find("tbody tr").each(function(){n(this).find("td:eq("+t+")").after(c())}),u.find(".delcol").removeClass("disabled"),r.row_template&&t Date: Tue, 5 Sep 2017 10:03:46 +0200 Subject: [PATCH 5/6] fix doc --- demo/index.php | 18 +++++++++++++++++- demo/shadow7853.html | 5 +++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/demo/index.php b/demo/index.php index a610be3..215c79b 100644 --- a/demo/index.php +++ b/demo/index.php @@ -162,6 +162,9 @@ } } return true; + }, + data_changed: function (col_id, action, value, $element) { + $('#examplexlog').append('
col_id: ' + col_id + ', action: ' + action + ', value: ' + $('
').text(value).html() + ', $element: ' + $element + '
'); }, tableClass: 'inputtable custom' }); @@ -223,6 +226,13 @@ // Validate fields validate_field: function (col_id, value, col_type, $element) { return true; + }, + + // Data changed event (triggered on input, select, textarea change event and on enter keydown) + // action: data: col_id, value, $element + // addcol: col_id + // delcol: col_id + data_changed: function (col_id, action, value, $element) { } }); @@ -449,7 +459,8 @@

Example 4 - Custom field types & validation

- + +
Show Code Validate table
@@ -516,7 +527,12 @@ } } return true; + }, + + data_changed: function (col_id, action, value, $element) { + $('#examplexlog').append('<div>col_id: ' + col_id + ', action: ' + action + ', value: ' + $('<div/>').text(value).html() + ', $element: ' + $element + '</div>'); }, + tableClass: 'inputtable custom' }); diff --git a/demo/shadow7853.html b/demo/shadow7853.html index 33558b4..f6eb3ab 100644 --- a/demo/shadow7853.html +++ b/demo/shadow7853.html @@ -259,6 +259,11 @@

Example 4 - Custom field types & validation - EDITED by shadow78 } return true; }, + + data_changed: function (col_id, action, value, $element) { + $('#examplexlog').append('<div>col_id: ' + col_id + ', action: ' + action + ', value: ' + $('<div/>').text(value).html() + ', $element: ' + $element + '</div>'); + }, + tableClass: 'inputtable custom' }); From c92f00044eb4a76c66a952ce660d6d908f1c8ec9 Mon Sep 17 00:00:00 2001 From: Oscar Date: Wed, 27 Sep 2017 16:09:49 +0200 Subject: [PATCH 6/6] trigger data_changed event on addrow and delrow --- jquery.edittable.js | 10 ++++++++++ jquery.edittable.min.js | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/jquery.edittable.js b/jquery.edittable.js index 526c0bd..6f233f6 100644 --- a/jquery.edittable.js +++ b/jquery.edittable.js @@ -1,4 +1,6 @@ /*! editTable v0.2.0 by Alessandro Benoit */ +/*! https://codeb.it/edittable/ - https://github.com/micc83/editTable */ +/*! VERSIONE MODIFICATA da shaodw7853: https://github.com/shadow7853/editTable */ (function ($, window, i) { 'use strict'; @@ -318,6 +320,10 @@ checkButtons(); + if (s.data_changed) { + s.data_changed(rownumber, 'addrow'); + } + return false; }); @@ -336,6 +342,10 @@ $table.find('.addrow').removeClass('disabled'); + if (s.data_changed) { + s.data_changed(rownumber, 'delrow'); + } + return false; }); diff --git a/jquery.edittable.min.js b/jquery.edittable.min.js index 49860c4..02cc903 100644 --- a/jquery.edittable.min.js +++ b/jquery.edittable.min.js @@ -1,2 +1,4 @@ /*! editTable v0.2.0 by Alessandro Benoit */ -(function(n,t,i){"use strict";n.fn.editTable=function(t){function c(n,t){if(n=n===0?"0":n||"",t&&"text"!==t){var i=r.field_templates[t];return"

"+i.setValue(i.html,n)[0].outerHTML+"<\/td>"}return'<\/td>'}function v(t){var u="",i;if(t=t||"",r.row_template)for(i=0;i+<\/a> -<\/a><\/td>'),n("
'+s+"<\/span>"+w+"<\/th>");for(t=0;t<\/th>");o=u.find("tbody tr").length;l()}function y(){var f=0,i=[],t;return h=!0,u.find("tbody tr").each(function(){f+=1;i[f]=[];n(this).find("td:not(:last-child)").each(function(u,e){if(r.row_template&&"text"!==r.row_template[u]){var o=r.field_templates[r.row_template[u]],s=n(this).find(n(o.html).prop("tagName"));t=o.getValue(s);r.validate_field(u,t,r.row_template[u],s)||(h=!1);i[f].push(t)}else t=n(this).find('input[type="text"]').val(),r.validate_field(u,t,"text",e)||(h=!1),i[f].push(t)})}),i.splice(0,1),i}var r=n.extend({data:[[""]],tableClass:"inputtable",jsonData:!1,headerCols:!1,maxRows:999,first_row:!0,row_template:!1,field_templates:!1,fixed_cols:!1,validate_field:function(){return!0},data_changed:function(){}},t),e=n(this),p="
",{"class":r.tableClass+(r.first_row?" wh":"")+(r.fixed_rows?" fr":""),html:p}),w='+<\/a> -<\/a>',b="",{html:u})}function l(){f<2&&u.find(".delcol").addClass("disabled");e<2&&u.find(".delrow").addClass("disabled");r.maxRows&&e===r.maxRows&&u.find(".addrow").addClass("disabled")}function a(n){var t,h=Math.min(r.maxRows,n.length),i,o,c,s;if(u.html(p),f=0,n)for(i=0;i"+s+"<\/th>"):u.find("thead tr").append('<\/tr><\/thead><\/tbody>",u=n("
"+w+"<\/th>",f=0,o=0,s,h=!0;if(r.data_changed){u.on("change.data","input, textarea, select",function(){var t=parseInt(n(this).closest("tr").children().index(n(this).parent("td")),10);r.data_changed(t,"data",n(this).val(),n(this))});u.on("keydown.data","input, textarea, select",function(t){var i=parseInt(n(this).closest("tr").children().index(n(this).parent("td")),10);t.keyCode===13&&r.data_changed(i,"data",n(this).val(),n(this))})}if(i=i+1,e.is("textarea")){try{s=JSON.parse(e.val())}catch(k){s=r.data}e.after(u);u.parents("form").length>0&&u.parents("form").submit(function(){e.val(JSON.stringify(y()))})}else s=JSON.parse(r.jsonData)||r.data,e.append(u);a(s);u.on("click",".addcol",function(){var t=parseInt(n(this).closest("tr").children().index(n(this).parent("th")),10);return f+=1,u.find("thead tr").find("th:eq("+t+")").after(b),u.find("tbody tr").each(function(){n(this).find("td:eq("+t+")").after(c())}),u.find(".delcol").removeClass("disabled"),r.row_template&&t"+i.setValue(i.html,n)[0].outerHTML+"<\/td>"}return'<\/td>'}function v(t){var u="",i;if(t=t||"",r.row_template)for(i=0;i+<\/a> -<\/a><\/td>'),n("
'+s+"<\/span>"+w+"<\/th>");for(t=0;t<\/th>");e=u.find("tbody tr").length;l()}function y(){var f=0,i=[],t;return h=!0,u.find("tbody tr").each(function(){f+=1;i[f]=[];n(this).find("td:not(:last-child)").each(function(u,e){if(r.row_template&&"text"!==r.row_template[u]){var o=r.field_templates[r.row_template[u]],s=n(this).find(n(o.html).prop("tagName"));t=o.getValue(s);r.validate_field(u,t,r.row_template[u],s)||(h=!1);i[f].push(t)}else t=n(this).find('input[type="text"]').val(),r.validate_field(u,t,"text",e)||(h=!1),i[f].push(t)})}),i.splice(0,1),i}var r=n.extend({data:[[""]],tableClass:"inputtable",jsonData:!1,headerCols:!1,maxRows:999,first_row:!0,row_template:!1,field_templates:!1,fixed_cols:!1,validate_field:function(){return!0},data_changed:function(){}},t),o=n(this),p="
",{"class":r.tableClass+(r.first_row?" wh":"")+(r.fixed_rows?" fr":""),html:p}),w='+<\/a> -<\/a>',b="
"+w+"<\/th>",f=0,e=0,s,h=!0;if(r.data_changed){u.on("change.data","input, textarea, select",function(){var t=parseInt(n(this).closest("tr").children().index(n(this).parent("td")),10);r.data_changed(t,"data",n(this).val(),n(this))});u.on("keydown.data","input, textarea, select",function(t){var i=parseInt(n(this).closest("tr").children().index(n(this).parent("td")),10);t.keyCode===13&&r.data_changed(i,"data",n(this).val(),n(this))})}if(i=i+1,o.is("textarea")){try{s=JSON.parse(o.val())}catch(k){s=r.data}o.after(u);u.parents("form").length>0&&u.parents("form").submit(function(){o.val(JSON.stringify(y()))})}else s=JSON.parse(r.jsonData)||r.data,o.append(u);a(s);u.on("click",".addcol",function(){var t=parseInt(n(this).closest("tr").children().index(n(this).parent("th")),10);return f+=1,u.find("thead tr").find("th:eq("+t+")").after(b),u.find("tbody tr").each(function(){n(this).find("td:eq("+t+")").after(c())}),u.find(".delcol").removeClass("disabled"),r.row_template&&t