datatables.net-select 1.7.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- /*! Select for DataTables 1.7.0-dev
1
+ /*! Select for DataTables 2.0.1
2
2
  * © SpryMedia Ltd - datatables.net/license/mit
3
3
  */
4
- import jQuery from"jquery";import DataTable from"datatables.net";let $=jQuery;function cellRange(n,e,t){function l(t,l){l<t&&(e=l,l=t,t=e);var e,s=!1;return n.columns(":visible").indexes().filter(function(e){return e===t&&(s=!0),e===l?!(s=!1):s})}function s(t,l){var e,s=n.rows({search:"applied"}).indexes(),c=(s.indexOf(t)>s.indexOf(l)&&(e=l,l=t,t=e),!1);return s.filter(function(e){return e===t&&(c=!0),e===l?!(c=!1):c})}var c,t=n.cells({selected:!0}).any()||t?(c=l(t.column,e.column),s(t.row,e.row)):(c=l(0,e.column),s(0,e.row)),t=n.cells(t,c).flatten();n.cells(e,{selected:!0}).any()?n.cells(t).deselect():n.cells(t).select()}function disableMouseSelection(e){var t=e.settings()[0]._select.selector;$(e.table().container()).off("mousedown.dtSelect",t).off("mouseup.dtSelect",t).off("click.dtSelect",t),$("body").off("click.dtSelect"+_safeId(e.table().node()))}function enableMouseSelection(a){var o,t=$(a.table().container()),l=a.settings()[0],s=l._select.selector;t.on("mousedown.dtSelect",s,function(e){(e.shiftKey||e.metaKey||e.ctrlKey)&&t.css("-moz-user-select","none").one("selectstart.dtSelect",s,function(){return!1}),window.getSelection&&(o=window.getSelection())}).on("mouseup.dtSelect",s,function(){t.css("-moz-user-select","")}).on("click.dtSelect",s,function(e){var t,l=a.select.items();if(o){var s=window.getSelection();if((!s.anchorNode||$(s.anchorNode).closest("table")[0]===a.table().node())&&s!==o)return}var c,s=a.settings()[0],n=a.settings()[0].oClasses.sWrapper.trim().replace(/ +/g,".");$(e.target).closest("div."+n)[0]==a.table().container()&&(n=a.cell($(e.target).closest("td, th"))).any()&&(c=$.Event("user-select.dt"),eventTrigger(a,c,[l,n,e]),c.isDefaultPrevented()||(c=n.index(),"row"===l?(t=c.row,typeSelect(e,a,s,"row",t)):"column"===l?(t=n.index().column,typeSelect(e,a,s,"column",t)):"cell"===l&&(t=n.index(),typeSelect(e,a,s,"cell",t)),s._select_lastCell=c))}),$("body").on("click.dtSelect"+_safeId(a.table().node()),function(e){var t;!l._select.blurable||$(e.target).parents().filter(a.table().container()).length||0===$(e.target).parents("html").length||$(e.target).parents("div.DTE").length||(t=$.Event("select-blur.dt"),eventTrigger(a,t,[e.target,e]),t.isDefaultPrevented()||clear(l,!0))})}function eventTrigger(e,t,l,s){s&&!e.flatten().length||("string"==typeof t&&(t+=".dt"),l.unshift(e),$(e.table().node()).trigger(t,l))}function info(s){var c,n,a,o,e=s.settings()[0];e._select.info&&e.aanFeatures.i&&"api"!==s.select.style()&&(c=s.rows({selected:!0}).flatten().length,n=s.columns({selected:!0}).flatten().length,a=s.cells({selected:!0}).flatten().length,o=function(e,t,l){e.append($('<span class="select-item"/>').append(s.i18n("select."+t+"s",{_:"%d "+t+"s selected",0:"",1:"1 "+t+" selected"},l)))},$.each(e.aanFeatures.i,function(e,t){t=$(t);var l=$('<span class="select-info"/>'),s=(o(l,"row",c),o(l,"column",n),o(l,"cell",a),t.children("span.select-info"));s.length&&s.remove(),""!==l.text()&&t.append(l)}))}function init(a){var c=new DataTable.Api(a);a._select_init=!0,a.aoRowCreatedCallback.push({fn:function(e,t,l){var s,c,n=a.aoData[l];for(n._select_selected&&$(e).addClass(a._select.className),s=0,c=a.aoColumns.length;s<c;s++)(a.aoColumns[s]._select_selected||n._selected_cells&&n._selected_cells[s])&&$(n.anCells[s]).addClass(a._select.className)},sName:"select-deferRender"}),c.on("preXhr.dt.dtSelect",function(e,t){var l,s;t===c.settings()[0]&&(l=c.rows({selected:!0}).ids(!0).filter(function(e){return void 0!==e}),s=c.cells({selected:!0}).eq(0).map(function(e){var t=c.row(e.row).id(!0);return t?{row:t,column:e.column}:void 0}).filter(function(e){return void 0!==e}),c.one("draw.dt.dtSelect",function(){c.rows(l).select(),s.any()&&s.each(function(e){c.cells(e.row,e.column).select()})}))}),c.on("draw.dtSelect.dt select.dtSelect.dt deselect.dtSelect.dt info.dt",function(){info(c),c.state.save()}),c.on("destroy.dtSelect",function(){$(c.rows({selected:!0}).nodes()).removeClass(c.settings()[0]._select.className),disableMouseSelection(c),c.off(".dtSelect"),$("body").off(".dtSelect"+_safeId(c.table().node()))})}function rowColumnRange(e,t,l,s){var c,n=e[t+"s"]({search:"applied"}).indexes(),s=$.inArray(s,n),a=$.inArray(l,n);e[t+"s"]({selected:!0}).any()||-1!==s?(a<s&&(c=a,a=s,s=c),n.splice(a+1,n.length),n.splice(0,s)):n.splice($.inArray(l,n)+1,n.length),e[t](l,{selected:!0}).any()?(n.splice($.inArray(l,n),1),e[t+"s"](n).deselect()):e[t+"s"](n).select()}function clear(e,t){!t&&"single"!==e._select.style||((t=new DataTable.Api(e)).rows({selected:!0}).deselect(),t.columns({selected:!0}).deselect(),t.cells({selected:!0}).deselect())}function typeSelect(e,t,l,s,c){var n=t.select.style(),a=t.select.toggleable(),o=t[s](c,{selected:!0}).any();o&&!a||("os"===n?e.ctrlKey||e.metaKey?t[s](c).select(!o):e.shiftKey?"cell"===s?cellRange(t,c,l._select_lastCell||null):rowColumnRange(t,s,c,l._select_lastCell?l._select_lastCell[s]:null):(a=t[s+"s"]({selected:!0}),o&&1===a.flatten().length?t[s](c).deselect():(a.deselect(),t[s](c).select())):"multi+shift"==n&&e.shiftKey?"cell"===s?cellRange(t,c,l._select_lastCell||null):rowColumnRange(t,s,c,l._select_lastCell?l._select_lastCell[s]:null):t[s](c).select(!o))}function _safeId(e){return e.id.replace(/[^a-zA-Z0-9\-\_]/g,"-")}DataTable.select={},DataTable.select.version="1.7.0-dev",DataTable.select.init=function(c){var e,t,l,s,n,a,o,i,r,u,d,f=c.settings()[0];f._select||(e=c.state.loaded(),t=function(e,t,l){if(null!==l&&void 0!==l.select){if(c.rows({selected:!0}).any()&&c.rows().deselect(),void 0!==l.select.rows&&c.rows(l.select.rows).select(),c.columns({selected:!0}).any()&&c.columns().deselect(),void 0!==l.select.columns&&c.columns(l.select.columns).select(),c.cells({selected:!0}).any()&&c.cells().deselect(),void 0!==l.select.cells)for(var s=0;s<l.select.cells.length;s++)c.cell(l.select.cells[s].row,l.select.cells[s].column).select();c.state.save()}},c.on("stateSaveParams",function(e,t,l){l.select={},l.select.rows=c.rows({selected:!0}).ids(!0).toArray(),l.select.columns=c.columns({selected:!0})[0],l.select.cells=c.cells({selected:!0})[0].map(function(e){return{row:c.row(e.row).id(!0),column:e.column}})}).on("stateLoadParams",t).one("init",function(){t(0,0,e)}),s=f.oInit.select,l=DataTable.defaults.select,l=void 0===s?l:s,s="row",i=o=!(a=!(n="api")),r="td, th",d=!(u="selected"),f._select={},!0===l?(n="os",d=!0):"string"==typeof l?(n=l,d=!0):$.isPlainObject(l)&&(void 0!==l.blurable&&(a=l.blurable),void 0!==l.toggleable&&(o=l.toggleable),void 0!==l.info&&(i=l.info),void 0!==l.items&&(s=l.items),d=(n=void 0!==l.style?l.style:"os",!0),void 0!==l.selector&&(r=l.selector),void 0!==l.className&&(u=l.className)),c.select.selector(r),c.select.items(s),c.select.style(n),c.select.blurable(a),c.select.toggleable(o),c.select.info(i),f._select.className=u,$.fn.dataTable.ext.order["select-checkbox"]=function(t,e){return this.api().column(e,{order:"index"}).nodes().map(function(e){return"row"===t._select.items?$(e).parent().hasClass(t._select.className):"cell"===t._select.items&&$(e).hasClass(t._select.className)})},!d&&$(c.table().node()).hasClass("selectable")&&c.select.style("os"))},$.each([{type:"row",prop:"aoData"},{type:"column",prop:"aoColumns"}],function(e,i){DataTable.ext.selector[i.type].push(function(e,t,l){var s,c=t.selected,n=[];if(!0!==c&&!1!==c)return l;for(var a=0,o=l.length;a<o;a++)s=e[i.prop][l[a]],(!0===c&&!0===s._select_selected||!1===c&&!s._select_selected)&&n.push(l[a]);return n})}),DataTable.ext.selector.cell.push(function(e,t,l){var s,c=t.selected,n=[];if(void 0===c)return l;for(var a=0,o=l.length;a<o;a++)s=e.aoData[l[a].row],(!0!==c||!s._selected_cells||!0!==s._selected_cells[l[a].column])&&(!1!==c||s._selected_cells&&s._selected_cells[l[a].column])||n.push(l[a]);return n});var apiRegister=DataTable.Api.register,apiRegisterPlural=DataTable.Api.registerPlural;function i18n(t,l){return function(e){return e.i18n("buttons."+t,l)}}function namespacedEvents(e){e=e._eventNamespace;return"draw.dt.DT"+e+" select.dt.DT"+e+" deselect.dt.DT"+e}function enabled(e,t){return!(-1===$.inArray("rows",t.limitTo)||!e.rows({selected:!0}).any())||(!(-1===$.inArray("columns",t.limitTo)||!e.columns({selected:!0}).any())||!(-1===$.inArray("cells",t.limitTo)||!e.cells({selected:!0}).any()))}apiRegister("select()",function(){return this.iterator("table",function(e){DataTable.select.init(new DataTable.Api(e))})}),apiRegister("select.blurable()",function(t){return void 0===t?this.context[0]._select.blurable:this.iterator("table",function(e){e._select.blurable=t})}),apiRegister("select.toggleable()",function(t){return void 0===t?this.context[0]._select.toggleable:this.iterator("table",function(e){e._select.toggleable=t})}),apiRegister("select.info()",function(t){return void 0===t?this.context[0]._select.info:this.iterator("table",function(e){e._select.info=t})}),apiRegister("select.items()",function(t){return void 0===t?this.context[0]._select.items:this.iterator("table",function(e){e._select.items=t,eventTrigger(new DataTable.Api(e),"selectItems",[t])})}),apiRegister("select.style()",function(l){return void 0===l?this.context[0]._select.style:this.iterator("table",function(e){e._select||DataTable.select.init(new DataTable.Api(e)),e._select_init||init(e),e._select.style=l;var t=new DataTable.Api(e);disableMouseSelection(t),"api"!==l&&enableMouseSelection(t),eventTrigger(new DataTable.Api(e),"selectStyle",[l])})}),apiRegister("select.selector()",function(t){return void 0===t?this.context[0]._select.selector:this.iterator("table",function(e){disableMouseSelection(new DataTable.Api(e)),e._select.selector=t,"api"!==e._select.style&&enableMouseSelection(new DataTable.Api(e))})}),apiRegisterPlural("rows().select()","row().select()",function(e){var l=this;return!1===e?this.deselect():(this.iterator("row",function(e,t){clear(e),e.aoData[t]._select_selected=!0,$(e.aoData[t].nTr).addClass(e._select.className)}),this.iterator("table",function(e,t){eventTrigger(l,"select",["row",l[t]],!0)}),this)}),apiRegister("row().selected()",function(){var e=this.context[0];return!!(e&&this.length&&e.aoData[this[0]]&&e.aoData[this[0]]._select_selected)}),apiRegisterPlural("columns().select()","column().select()",function(e){var l=this;return!1===e?this.deselect():(this.iterator("column",function(e,t){clear(e),e.aoColumns[t]._select_selected=!0;t=new DataTable.Api(e).column(t);$(t.header()).addClass(e._select.className),$(t.footer()).addClass(e._select.className),t.nodes().to$().addClass(e._select.className)}),this.iterator("table",function(e,t){eventTrigger(l,"select",["column",l[t]],!0)}),this)}),apiRegister("column().selected()",function(){var e=this.context[0];return!!(e&&this.length&&e.aoColumns[this[0]]&&e.aoColumns[this[0]]._select_selected)}),apiRegisterPlural("cells().select()","cell().select()",function(e){var l=this;return!1===e?this.deselect():(this.iterator("cell",function(e,t,l){clear(e);t=e.aoData[t];void 0===t._selected_cells&&(t._selected_cells=[]),t._selected_cells[l]=!0,t.anCells&&$(t.anCells[l]).addClass(e._select.className)}),this.iterator("table",function(e,t){eventTrigger(l,"select",["cell",l.cells(l[t]).indexes().toArray()],!0)}),this)}),apiRegister("cell().selected()",function(){var e=this.context[0];if(e&&this.length){e=e.aoData[this[0][0].row];if(e&&e._selected_cells&&e._selected_cells[this[0][0].column])return!0}return!1}),apiRegisterPlural("rows().deselect()","row().deselect()",function(){var l=this;return this.iterator("row",function(e,t){e.aoData[t]._select_selected=!1,e._select_lastCell=null,$(e.aoData[t].nTr).removeClass(e._select.className)}),this.iterator("table",function(e,t){eventTrigger(l,"deselect",["row",l[t]],!0)}),this}),apiRegisterPlural("columns().deselect()","column().deselect()",function(){var l=this;return this.iterator("column",function(s,e){s.aoColumns[e]._select_selected=!1;var t=new DataTable.Api(s),l=t.column(e);$(l.header()).removeClass(s._select.className),$(l.footer()).removeClass(s._select.className),t.cells(null,e).indexes().each(function(e){var t=s.aoData[e.row],l=t._selected_cells;!t.anCells||l&&l[e.column]||$(t.anCells[e.column]).removeClass(s._select.className)})}),this.iterator("table",function(e,t){eventTrigger(l,"deselect",["column",l[t]],!0)}),this}),apiRegisterPlural("cells().deselect()","cell().deselect()",function(){var l=this;return this.iterator("cell",function(e,t,l){t=e.aoData[t];void 0!==t._selected_cells&&(t._selected_cells[l]=!1),t.anCells&&!e.aoColumns[l]._select_selected&&$(t.anCells[l]).removeClass(e._select.className)}),this.iterator("table",function(e,t){eventTrigger(l,"deselect",["cell",l[t]],!0)}),this});var _buttonNamespace=0;$.extend(DataTable.ext.buttons,{selected:{text:i18n("selected","Selected"),className:"buttons-selected",limitTo:["rows","columns","cells"],init:function(e,t,l){var s=this;l._eventNamespace=".select"+_buttonNamespace++,e.on(namespacedEvents(l),function(){s.enable(enabled(e,l))}),this.disable()},destroy:function(e,t,l){e.off(l._eventNamespace)}},selectedSingle:{text:i18n("selectedSingle","Selected single"),className:"buttons-selected-single",init:function(t,e,l){var s=this;l._eventNamespace=".select"+_buttonNamespace++,t.on(namespacedEvents(l),function(){var e=t.rows({selected:!0}).flatten().length+t.columns({selected:!0}).flatten().length+t.cells({selected:!0}).flatten().length;s.enable(1===e)}),this.disable()},destroy:function(e,t,l){e.off(l._eventNamespace)}},selectAll:{text:i18n("selectAll","Select all"),className:"buttons-select-all",action:function(e,t,l,s){var c=this.select.items(),n=s.selectorModifier;(n?("function"==typeof n&&(n=n.call(t,e,t,l,s)),this[c+"s"](n)):this[c+"s"]()).select()}},selectNone:{text:i18n("selectNone","Deselect all"),className:"buttons-select-none",action:function(){clear(this.settings()[0],!0)},init:function(t,e,l){var s=this;l._eventNamespace=".select"+_buttonNamespace++,t.on(namespacedEvents(l),function(){var e=t.rows({selected:!0}).flatten().length+t.columns({selected:!0}).flatten().length+t.cells({selected:!0}).flatten().length;s.enable(0<e)}),this.disable()},destroy:function(e,t,l){e.off(l._eventNamespace)}},showSelected:{text:i18n("showSelected","Show only selected"),className:"buttons-show-selected",action:function(e,s,t,l){var c;l._filter?(-1!==(c=DataTable.ext.search.indexOf(l._filter))&&(DataTable.ext.search.splice(c,1),l._filter=null),this.active(!1)):(l._filter=c=function(e,t,l){return e!==s.settings()[0]||e.aoData[l]._select_selected},DataTable.ext.search.push(c),this.active(!0)),s.draw()}}}),$.each(["Row","Column","Cell"],function(e,t){var c=t.toLowerCase();DataTable.ext.buttons["select"+t+"s"]={text:i18n("select"+t+"s","Select "+c+"s"),className:"buttons-select-"+c+"s",action:function(){this.select.items(c)},init:function(e){var s=this;e.on("selectItems.dt.DT",function(e,t,l){s.active(l===c)})}}}),$.fn.DataTable.select=DataTable.select,$(document).on("preInit.dt.dtSelect",function(e,t){"dt"===e.namespace&&DataTable.select.init(new DataTable.Api(t))});export default DataTable;
4
+ import jQuery from"jquery";import DataTable from"datatables.net";let $=jQuery;function cellRange(n,e,t){function l(t,l){l<t&&(e=l,l=t,t=e);var e,s=!1;return n.columns(":visible").indexes().filter(function(e){return e===t&&(s=!0),e===l?!(s=!1):s})}function s(t,l){var e,s=n.rows({search:"applied"}).indexes(),c=(s.indexOf(t)>s.indexOf(l)&&(e=l,l=t,t=e),!1);return s.filter(function(e){return e===t&&(c=!0),e===l?!(c=!1):c})}var c,t=n.cells({selected:!0}).any()||t?(c=l(t.column,e.column),s(t.row,e.row)):(c=l(0,e.column),s(0,e.row)),t=n.cells(t,c).flatten();n.cells(e,{selected:!0}).any()?n.cells(t).deselect():n.cells(t).select()}function disableMouseSelection(e){var t=e.settings()[0]._select.selector;$(e.table().container()).off("mousedown.dtSelect",t).off("mouseup.dtSelect",t).off("click.dtSelect",t),$("body").off("click.dtSelect"+_safeId(e.table().node()))}function enableMouseSelection(a){var o,t=$(a.table().container()),l=a.settings()[0],s=l._select.selector;t.on("mousedown.dtSelect",s,function(e){(e.shiftKey||e.metaKey||e.ctrlKey)&&t.css("-moz-user-select","none").one("selectstart.dtSelect",s,function(){return!1}),window.getSelection&&(o=window.getSelection())}).on("mouseup.dtSelect",s,function(){t.css("-moz-user-select","")}).on("click.dtSelect",s,function(e){var t,l=a.select.items();if(o){var s=window.getSelection();if((!s.anchorNode||$(s.anchorNode).closest("table")[0]===a.table().node())&&s!==o)return}var c,s=a.settings()[0],n=a.table().container();$(e.target).closest("div.dt-container")[0]==n&&(n=a.cell($(e.target).closest("td, th"))).any()&&(c=$.Event("user-select.dt"),eventTrigger(a,c,[l,n,e]),c.isDefaultPrevented()||(c=n.index(),"row"===l?(t=c.row,typeSelect(e,a,s,"row",t)):"column"===l?(t=n.index().column,typeSelect(e,a,s,"column",t)):"cell"===l&&(t=n.index(),typeSelect(e,a,s,"cell",t)),s._select_lastCell=c))}),$("body").on("click.dtSelect"+_safeId(a.table().node()),function(e){var t;!l._select.blurable||$(e.target).parents().filter(a.table().container()).length||0===$(e.target).parents("html").length||$(e.target).parents("div.DTE").length||(t=$.Event("select-blur.dt"),eventTrigger(a,t,[e.target,e]),t.isDefaultPrevented())||clear(l,!0)})}function eventTrigger(e,t,l,s){s&&!e.flatten().length||("string"==typeof t&&(t+=".dt"),l.unshift(e),$(e.table().node()).trigger(t,l))}function info(s,e){var t,l,c,n,a;"api"!==s.select.style()&&!1!==s.select.info()&&(a=s.rows({selected:!0}).flatten().length,t=s.columns({selected:!0}).flatten().length,l=s.cells({selected:!0}).flatten().length,c=function(e,t,l){e.append($('<span class="select-item"/>').append(s.i18n("select."+t+"s",{_:"%d "+t+"s selected",0:"",1:"1 "+t+" selected"},l)))},e=$(e),c(n=$('<span class="select-info"/>'),"row",a),c(n,"column",t),c(n,"cell",l),(a=e.children("span.select-info")).length&&a.remove(),""!==n.text())&&e.append(n)}function initCheckboxHeader(a){a.columns(".dt-select").every(function(){var n,e=this.header();$("input",e).length||(n=$("<input>").attr({class:"dt-select-checkbox",type:"checkbox","aria-label":a.i18n("select.aria.headerCheckbox")||"Select all rows"}).appendTo(e).on("change",function(){this.checked?a.rows({search:"applied"}).select():a.rows({selected:!0}).deselect()}).on("click",function(e){e.stopPropagation()}),a.on("draw select deselect",function(e,t,l){var s,c;"row"!==l&&l||(l=a.rows({selected:!0}).count(),s=a.rows({search:"applied",selected:!0}).count(),c=a.rows({search:"applied"}).count(),s&&s<=l&&s===c?n.prop("checked",!0).prop("indeterminate",!1):0===s&&0===l?n.prop("checked",!1).prop("indeterminate",!1):n.prop("checked",!1).prop("indeterminate",!0))}))})}function init(a){var c=new DataTable.Api(a);a._select_init=!0,a.aoRowCreatedCallback.push(function(e,t,l){var s,c,n=a.aoData[l];for(n._select_selected&&$(e).addClass(a._select.className).find("input.dt-select-checkbox").prop("checked",!0),s=0,c=a.aoColumns.length;s<c;s++)(a.aoColumns[s]._select_selected||n._selected_cells&&n._selected_cells[s])&&$(n.anCells[s]).addClass(a._select.className)}),c.on("preXhr.dt.dtSelect",function(e,t){var l,s;t===c.settings()[0]&&(l=c.rows({selected:!0}).ids(!0).filter(function(e){return void 0!==e}),s=c.cells({selected:!0}).eq(0).map(function(e){var t=c.row(e.row).id(!0);return t?{row:t,column:e.column}:void 0}).filter(function(e){return void 0!==e}),c.one("draw.dt.dtSelect",function(){c.rows(l).select(),s.any()&&s.each(function(e){c.cells(e.row,e.column).select()})}))}),c.on("info.dt",function(e,t,l){t._select.infoEls.includes(l)||t._select.infoEls.push(l),info(c,l)}),c.on("select.dtSelect.dt deselect.dtSelect.dt",function(){a._select.infoEls.forEach(function(e){info(c,e)}),c.state.save()}),c.on("destroy.dtSelect",function(){$(c.rows({selected:!0}).nodes()).removeClass(c.settings()[0]._select.className),disableMouseSelection(c),c.off(".dtSelect"),$("body").off(".dtSelect"+_safeId(c.table().node()))})}function rowColumnRange(e,t,l,s){var c,n=e[t+"s"]({search:"applied"}).indexes(),s=n.indexOf(s),a=n.indexOf(l);e[t+"s"]({selected:!0}).any()||-1!==s?(a<s&&(c=a,a=s,s=c),n.splice(a+1,n.length),n.splice(0,s)):n.splice(n.indexOf(l)+1,n.length),e[t](l,{selected:!0}).any()?(n.splice(n.indexOf(l),1),e[t+"s"](n).deselect()):e[t+"s"](n).select()}function clear(e,t){!t&&"single"!==e._select.style||((t=new DataTable.Api(e)).rows({selected:!0}).deselect(),t.columns({selected:!0}).deselect(),t.cells({selected:!0}).deselect())}function typeSelect(e,t,l,s,c){var n=t.select.style(),a=t.select.toggleable(),o=t[s](c,{selected:!0}).any();o&&!a||("os"===n?e.ctrlKey||e.metaKey?t[s](c).select(!o):e.shiftKey?"cell"===s?cellRange(t,c,l._select_lastCell||null):rowColumnRange(t,s,c,l._select_lastCell?l._select_lastCell[s]:null):(a=t[s+"s"]({selected:!0}),o&&1===a.flatten().length?t[s](c).deselect():(a.deselect(),t[s](c).select())):"multi+shift"==n&&e.shiftKey?"cell"===s?cellRange(t,c,l._select_lastCell||null):rowColumnRange(t,s,c,l._select_lastCell?l._select_lastCell[s]:null):t[s](c).select(!o))}function _safeId(e){return e.id.replace(/[^a-zA-Z0-9\-\_]/g,"-")}DataTable.select={},DataTable.select.version="2.0.1",DataTable.select.init=function(c){var e,t,l,s,n,a,o,i,r,d,u,f,h=c.settings()[0];if(!DataTable.versionCheck("2"))throw"Warning: Select requires DataTables 2 or newer";h._select||(e=c.state.loaded(),t=function(e,t,l){if(null!==l&&void 0!==l.select){if(c.rows({selected:!0}).any()&&c.rows().deselect(),void 0!==l.select.rows&&c.rows(l.select.rows).select(),c.columns({selected:!0}).any()&&c.columns().deselect(),void 0!==l.select.columns&&c.columns(l.select.columns).select(),c.cells({selected:!0}).any()&&c.cells().deselect(),void 0!==l.select.cells)for(var s=0;s<l.select.cells.length;s++)c.cell(l.select.cells[s].row,l.select.cells[s].column).select();c.state.save()}},c.on("stateSaveParams",function(e,t,l){l.select={},l.select.rows=c.rows({selected:!0}).ids(!0).toArray(),l.select.columns=c.columns({selected:!0})[0],l.select.cells=c.cells({selected:!0})[0].map(function(e){return{row:c.row(e.row).id(!0),column:e.column}})}).on("stateLoadParams",t).one("init",function(){t(0,0,e)}),s=h.oInit.select,l=DataTable.defaults.select,l=void 0===s?l:s,s="row",r="td, th",d="selected",f=!(u=i=o=!(a=!(n="api"))),h._select={infoEls:[]},!0===l?(n="os",f=!0):"string"==typeof l?(n=l,f=!0):$.isPlainObject(l)&&(void 0!==l.blurable&&(a=l.blurable),void 0!==l.toggleable&&(o=l.toggleable),void 0!==l.info&&(i=l.info),void 0!==l.items&&(s=l.items),f=(n=void 0!==l.style?l.style:"os",!0),void 0!==l.selector&&(r=l.selector),void 0!==l.className&&(d=l.className),void 0!==l.headerCheckbox)&&(u=l.headerCheckbox),c.select.selector(r),c.select.items(s),c.select.style(n),c.select.blurable(a),c.select.toggleable(o),c.select.info(i),h._select.className=d,!f&&$(c.table().node()).hasClass("selectable")&&c.select.style("os"),u&&(initCheckboxHeader(c),c.on("init",function(){initCheckboxHeader(c)})))},$.each([{type:"row",prop:"aoData"},{type:"column",prop:"aoColumns"}],function(e,i){DataTable.ext.selector[i.type].push(function(e,t,l){var s,c=t.selected,n=[];if(!0!==c&&!1!==c)return l;for(var a=0,o=l.length;a<o;a++)(s=e[i.prop][l[a]])&&(!0===c&&!0===s._select_selected||!1===c&&!s._select_selected)&&n.push(l[a]);return n})}),DataTable.ext.selector.cell.push(function(e,t,l){var s,c=t.selected,n=[];if(void 0===c)return l;for(var a=0,o=l.length;a<o;a++)(s=e.aoData[l[a].row])&&(!0===c&&s._selected_cells&&!0===s._selected_cells[l[a].column]||!1===c&&(!s._selected_cells||!s._selected_cells[l[a].column]))&&n.push(l[a]);return n});var apiRegister=DataTable.Api.register,apiRegisterPlural=DataTable.Api.registerPlural;function i18n(t,l){return function(e){return e.i18n("buttons."+t,l)}}function namespacedEvents(e){e=e._eventNamespace;return"draw.dt.DT"+e+" select.dt.DT"+e+" deselect.dt.DT"+e}function enabled(e,t){return!(-1===t.limitTo.indexOf("rows")||!e.rows({selected:!0}).any())||!(-1===t.limitTo.indexOf("columns")||!e.columns({selected:!0}).any())||!(-1===t.limitTo.indexOf("cells")||!e.cells({selected:!0}).any())}apiRegister("select()",function(){return this.iterator("table",function(e){DataTable.select.init(new DataTable.Api(e))})}),apiRegister("select.blurable()",function(t){return void 0===t?this.context[0]._select.blurable:this.iterator("table",function(e){e._select.blurable=t})}),apiRegister("select.toggleable()",function(t){return void 0===t?this.context[0]._select.toggleable:this.iterator("table",function(e){e._select.toggleable=t})}),apiRegister("select.info()",function(t){return void 0===t?this.context[0]._select.info:this.iterator("table",function(e){e._select.info=t})}),apiRegister("select.items()",function(t){return void 0===t?this.context[0]._select.items:this.iterator("table",function(e){e._select.items=t,eventTrigger(new DataTable.Api(e),"selectItems",[t])})}),apiRegister("select.style()",function(l){return void 0===l?this.context[0]._select.style:this.iterator("table",function(e){e._select||DataTable.select.init(new DataTable.Api(e)),e._select_init||init(e),e._select.style=l;var t=new DataTable.Api(e);disableMouseSelection(t),"api"!==l&&enableMouseSelection(t),eventTrigger(new DataTable.Api(e),"selectStyle",[l])})}),apiRegister("select.selector()",function(t){return void 0===t?this.context[0]._select.selector:this.iterator("table",function(e){disableMouseSelection(new DataTable.Api(e)),e._select.selector=t,"api"!==e._select.style&&enableMouseSelection(new DataTable.Api(e))})}),apiRegister("select.last()",function(e){var t=this.context[0];return e?(t._select_lastCell=e,this):t._select_lastCell}),apiRegisterPlural("rows().select()","row().select()",function(e){var a=this;return!1===e?this.deselect():(this.iterator("row",function(e,t){clear(e);var l=e.aoData[t],s=e.aoColumns;$(l.nTr).addClass(e._select.className),l._select_selected=!0;for(var c=0;c<s.length;c++){var n=s[c];null===n.sType&&a.columns().types(),"select-checkbox"===n.sType&&((n=l.anCells)&&n[c]&&$("input.dt-select-checkbox",n[c]).prop("checked",!0),null!==l._aSortData)&&(l._aSortData[c]=null)}}),this.iterator("table",function(e,t){eventTrigger(a,"select",["row",a[t]],!0)}),this)}),apiRegister("row().selected()",function(){var e=this.context[0];return!!(e&&this.length&&e.aoData[this[0]]&&e.aoData[this[0]]._select_selected)}),apiRegisterPlural("columns().select()","column().select()",function(e){var l=this;return!1===e?this.deselect():(this.iterator("column",function(e,t){clear(e),e.aoColumns[t]._select_selected=!0;t=new DataTable.Api(e).column(t);$(t.header()).addClass(e._select.className),$(t.footer()).addClass(e._select.className),t.nodes().to$().addClass(e._select.className)}),this.iterator("table",function(e,t){eventTrigger(l,"select",["column",l[t]],!0)}),this)}),apiRegister("column().selected()",function(){var e=this.context[0];return!!(e&&this.length&&e.aoColumns[this[0]]&&e.aoColumns[this[0]]._select_selected)}),apiRegisterPlural("cells().select()","cell().select()",function(e){var l=this;return!1===e?this.deselect():(this.iterator("cell",function(e,t,l){clear(e);t=e.aoData[t];void 0===t._selected_cells&&(t._selected_cells=[]),t._selected_cells[l]=!0,t.anCells&&$(t.anCells[l]).addClass(e._select.className)}),this.iterator("table",function(e,t){eventTrigger(l,"select",["cell",l.cells(l[t]).indexes().toArray()],!0)}),this)}),apiRegister("cell().selected()",function(){var e=this.context[0];if(e&&this.length){e=e.aoData[this[0][0].row];if(e&&e._selected_cells&&e._selected_cells[this[0][0].column])return!0}return!1}),apiRegisterPlural("rows().deselect()","row().deselect()",function(){var a=this;return this.iterator("row",function(e,t){var l=e.aoData[t],s=e.aoColumns;$(l.nTr).removeClass(e._select.className),l._select_selected=!1,e._select_lastCell=null;for(var c=0;c<s.length;c++){var n=s[c];null===n.sType&&a.columns().types(),"select-checkbox"===n.sType&&((n=l.anCells)&&n[c]&&$("input.dt-select-checkbox",l.anCells[c]).prop("checked",!1),null!==l._aSortData)&&(l._aSortData[c]=null)}}),this.iterator("table",function(e,t){eventTrigger(a,"deselect",["row",a[t]],!0)}),this}),apiRegisterPlural("columns().deselect()","column().deselect()",function(){var l=this;return this.iterator("column",function(s,e){s.aoColumns[e]._select_selected=!1;var t=new DataTable.Api(s),l=t.column(e);$(l.header()).removeClass(s._select.className),$(l.footer()).removeClass(s._select.className),t.cells(null,e).indexes().each(function(e){var t=s.aoData[e.row],l=t._selected_cells;!t.anCells||l&&l[e.column]||$(t.anCells[e.column]).removeClass(s._select.className)})}),this.iterator("table",function(e,t){eventTrigger(l,"deselect",["column",l[t]],!0)}),this}),apiRegisterPlural("cells().deselect()","cell().deselect()",function(){var l=this;return this.iterator("cell",function(e,t,l){t=e.aoData[t];void 0!==t._selected_cells&&(t._selected_cells[l]=!1),t.anCells&&!e.aoColumns[l]._select_selected&&$(t.anCells[l]).removeClass(e._select.className)}),this.iterator("table",function(e,t){eventTrigger(l,"deselect",["cell",l[t]],!0)}),this});var _buttonNamespace=0;$.extend(DataTable.ext.buttons,{selected:{text:i18n("selected","Selected"),className:"buttons-selected",limitTo:["rows","columns","cells"],init:function(e,t,l){var s=this;l._eventNamespace=".select"+_buttonNamespace++,e.on(namespacedEvents(l),function(){s.enable(enabled(e,l))}),this.disable()},destroy:function(e,t,l){e.off(l._eventNamespace)}},selectedSingle:{text:i18n("selectedSingle","Selected single"),className:"buttons-selected-single",init:function(t,e,l){var s=this;l._eventNamespace=".select"+_buttonNamespace++,t.on(namespacedEvents(l),function(){var e=t.rows({selected:!0}).flatten().length+t.columns({selected:!0}).flatten().length+t.cells({selected:!0}).flatten().length;s.enable(1===e)}),this.disable()},destroy:function(e,t,l){e.off(l._eventNamespace)}},selectAll:{text:i18n("selectAll","Select all"),className:"buttons-select-all",action:function(e,t,l,s){var c=this.select.items(),n=s.selectorModifier;(n?("function"==typeof n&&(n=n.call(t,e,t,l,s)),this[c+"s"](n)):this[c+"s"]()).select()}},selectNone:{text:i18n("selectNone","Deselect all"),className:"buttons-select-none",action:function(){clear(this.settings()[0],!0)},init:function(t,e,l){var s=this;l._eventNamespace=".select"+_buttonNamespace++,t.on(namespacedEvents(l),function(){var e=t.rows({selected:!0}).flatten().length+t.columns({selected:!0}).flatten().length+t.cells({selected:!0}).flatten().length;s.enable(0<e)}),this.disable()},destroy:function(e,t,l){e.off(l._eventNamespace)}},showSelected:{text:i18n("showSelected","Show only selected"),className:"buttons-show-selected",action:function(e,t){var s;t.search.fixed("dt-select")?(t.search.fixed("dt-select",null),this.active(!1)):(s=t.settings()[0].aoData,t.search.fixed("dt-select",function(e,t,l){return s[l]._select_selected}),this.active(!0)),t.draw()}}}),$.each(["Row","Column","Cell"],function(e,t){var c=t.toLowerCase();DataTable.ext.buttons["select"+t+"s"]={text:i18n("select"+t+"s","Select "+c+"s"),className:"buttons-select-"+c+"s",action:function(){this.select.items(c)},init:function(e){var s=this;e.on("selectItems.dt.DT",function(e,t,l){s.active(l===c)})}}}),DataTable.type("select-checkbox",{className:"dt-select",detect:function(e){return"select-checkbox"===e&&e},order:{pre:function(e){return"X"===e?-1:0}}}),$.extend(!0,DataTable.defaults.oLanguage,{select:{aria:{rowCheckbox:"Select row"}}}),DataTable.render.select=function(e,t){var n=e?DataTable.util.get(e):null,a=t?DataTable.util.get(t):null;return function(e,t,l,s){var c=s.settings.aoData[s.row]._select_selected,s=s.settings.oLanguage.select.aria.rowCheckbox;return"display"===t?$("<input>").attr({"aria-label":s,class:"dt-select-checkbox",name:a?a(l):null,type:"checkbox",value:n?n(l):null,checked:c})[0]:"type"===t?"select-checkbox":"filter"!==t&&c?"X":""}},DataTable.ext.order["select-checkbox"]=function(t,e){return this.api().column(e,{order:"index"}).nodes().map(function(e){return"row"===t._select.items?$(e).parent().hasClass(t._select.className):"cell"===t._select.items&&$(e).hasClass(t._select.className)})},$.fn.DataTable.select=DataTable.select,$(document).on("preInit.dt.dtSelect",function(e,t){"dt"===e.namespace&&DataTable.select.init(new DataTable.Api(t))});export default DataTable;
@@ -1,4 +1,4 @@
1
- /*! Select for DataTables 1.7.0-dev
1
+ /*! Select for DataTables 2.0.1
2
2
  * © SpryMedia Ltd - datatables.net/license/mit
3
3
  */
4
4
 
@@ -12,11 +12,15 @@ let $ = jQuery;
12
12
  // Version information for debugger
13
13
  DataTable.select = {};
14
14
 
15
- DataTable.select.version = '1.7.0-dev';
15
+ DataTable.select.version = '2.0.1';
16
16
 
17
17
  DataTable.select.init = function (dt) {
18
18
  var ctx = dt.settings()[0];
19
19
 
20
+ if (!DataTable.versionCheck('2')) {
21
+ throw 'Warning: Select requires DataTables 2 or newer';
22
+ }
23
+
20
24
  if (ctx._select) {
21
25
  return;
22
26
  }
@@ -81,9 +85,12 @@ DataTable.select.init = function (dt) {
81
85
  var info = true;
82
86
  var selector = 'td, th';
83
87
  var className = 'selected';
88
+ var headerCheckbox = true;
84
89
  var setStyle = false;
85
90
 
86
- ctx._select = {};
91
+ ctx._select = {
92
+ infoEls: []
93
+ };
87
94
 
88
95
  // Initialisation customisations
89
96
  if (opts === true) {
@@ -127,6 +134,10 @@ DataTable.select.init = function (dt) {
127
134
  if (opts.className !== undefined) {
128
135
  className = opts.className;
129
136
  }
137
+
138
+ if (opts.headerCheckbox !== undefined) {
139
+ headerCheckbox = opts.headerCheckbox;
140
+ }
130
141
  }
131
142
 
132
143
  dt.select.selector(selector);
@@ -137,27 +148,21 @@ DataTable.select.init = function (dt) {
137
148
  dt.select.info(info);
138
149
  ctx._select.className = className;
139
150
 
140
- // Sort table based on selected rows. Requires Select Datatables extension
141
- $.fn.dataTable.ext.order['select-checkbox'] = function (settings, col) {
142
- return this.api()
143
- .column(col, { order: 'index' })
144
- .nodes()
145
- .map(function (td) {
146
- if (settings._select.items === 'row') {
147
- return $(td).parent().hasClass(settings._select.className);
148
- }
149
- else if (settings._select.items === 'cell') {
150
- return $(td).hasClass(settings._select.className);
151
- }
152
- return false;
153
- });
154
- };
155
-
156
151
  // If the init options haven't enabled select, but there is a selectable
157
152
  // class name, then enable
158
153
  if (!setStyle && $(dt.table().node()).hasClass('selectable')) {
159
154
  dt.select.style('os');
160
155
  }
156
+
157
+ // Insert a checkbox into the header if needed - might need to wait
158
+ // for init complete, or it might already be done
159
+ if (headerCheckbox) {
160
+ initCheckboxHeader(dt);
161
+
162
+ dt.on('init', function () {
163
+ initCheckboxHeader(dt);
164
+ });
165
+ }
161
166
  };
162
167
 
163
168
  /*
@@ -209,6 +214,7 @@ The `_select` object contains the following properties:
209
214
  on the row
210
215
  info:boolean - If the selection summary should be shown in the table
211
216
  information elements
217
+ infoEls:element[] - List of HTML elements with info elements for a table
212
218
  }
213
219
  ```
214
220
 
@@ -393,10 +399,10 @@ function enableMouseSelection(dt) {
393
399
  }
394
400
 
395
401
  var ctx = dt.settings()[0];
396
- var wrapperClass = dt.settings()[0].oClasses.sWrapper.trim().replace(/ +/g, '.');
402
+ var container = dt.table().container();
397
403
 
398
404
  // Ignore clicks inside a sub-table
399
- if ($(e.target).closest('div.' + wrapperClass)[0] != dt.table().container()) {
405
+ if ($(e.target).closest('div.dt-container')[0] != container) {
400
406
  return;
401
407
  }
402
408
 
@@ -494,14 +500,8 @@ function eventTrigger(api, type, args, any) {
494
500
  * @param {DataTable.Api} api DataTable to update
495
501
  * @private
496
502
  */
497
- function info(api) {
498
- var ctx = api.settings()[0];
499
-
500
- if (!ctx._select.info || !ctx.aanFeatures.i) {
501
- return;
502
- }
503
-
504
- if (api.select.style() === 'api') {
503
+ function info(api, node) {
504
+ if (api.select.style() === 'api' || api.select.info() === false) {
505
505
  return;
506
506
  }
507
507
 
@@ -521,22 +521,81 @@ function info(api) {
521
521
  );
522
522
  };
523
523
 
524
- // Internal knowledge of DataTables to loop over all information elements
525
- $.each(ctx.aanFeatures.i, function (i, el) {
526
- el = $(el);
524
+ var el = $(node);
525
+ var output = $('<span class="select-info"/>');
527
526
 
528
- var output = $('<span class="select-info"/>');
529
- add(output, 'row', rows);
530
- add(output, 'column', columns);
531
- add(output, 'cell', cells);
527
+ add(output, 'row', rows);
528
+ add(output, 'column', columns);
529
+ add(output, 'cell', cells);
532
530
 
533
- var exisiting = el.children('span.select-info');
534
- if (exisiting.length) {
535
- exisiting.remove();
536
- }
531
+ var existing = el.children('span.select-info');
537
532
 
538
- if (output.text() !== '') {
539
- el.append(output);
533
+ if (existing.length) {
534
+ existing.remove();
535
+ }
536
+
537
+ if (output.text() !== '') {
538
+ el.append(output);
539
+ }
540
+ }
541
+
542
+ /**
543
+ * Add a checkbox to the header for checkbox columns, allowing all rows to
544
+ * be selected, deselected or just to show the state.
545
+ *
546
+ * @param {*} dt API
547
+ */
548
+ function initCheckboxHeader( dt ) {
549
+ // Find any checkbox column(s)
550
+ dt.columns('.dt-select').every(function () {
551
+ var header = this.header();
552
+
553
+ if (! $('input', header).length) {
554
+ // If no checkbox yet, insert one
555
+ var input = $('<input>')
556
+ .attr({
557
+ class: 'dt-select-checkbox',
558
+ type: 'checkbox',
559
+ 'aria-label': dt.i18n('select.aria.headerCheckbox') || 'Select all rows'
560
+ })
561
+ .appendTo(header)
562
+ .on('change', function () {
563
+ if (this.checked) {
564
+ dt.rows({search: 'applied'}).select();
565
+ }
566
+ else {
567
+ dt.rows({selected: true}).deselect();
568
+ }
569
+ })
570
+ .on('click', function (e) {
571
+ e.stopPropagation();
572
+ });
573
+
574
+ // Update the header checkbox's state when the selection in the
575
+ // table changes
576
+ dt.on('draw select deselect', function (e, pass, type) {
577
+ if (type === 'row' || ! type) {
578
+ var count = dt.rows({selected: true}).count();
579
+ var search = dt.rows({search: 'applied', selected: true}).count();
580
+ var available = dt.rows({search: 'applied'}).count();
581
+
582
+ if (search && search <= count && search === available) {
583
+ input
584
+ .prop('checked', true)
585
+ .prop('indeterminate', false);
586
+ }
587
+ else if (search === 0 && count === 0) {
588
+ input
589
+ .prop('checked', false)
590
+ .prop('indeterminate', false);
591
+ }
592
+ else {
593
+ input
594
+ .prop('checked', false)
595
+ .prop('indeterminate', true);
596
+ }
597
+ }
598
+ });
540
599
  }
541
600
  });
542
601
  }
@@ -562,14 +621,15 @@ function init(ctx) {
562
621
  // This method of attaching to `aoRowCreatedCallback` is a hack until
563
622
  // DataTables has proper events for row manipulation If you are reviewing
564
623
  // this code to create your own plug-ins, please do not do this!
565
- ctx.aoRowCreatedCallback.push({
566
- fn: function (row, data, index) {
624
+ ctx.aoRowCreatedCallback.push(function (row, data, index) {
567
625
  var i, ien;
568
626
  var d = ctx.aoData[index];
569
627
 
570
628
  // Row
571
629
  if (d._select_selected) {
572
- $(row).addClass(ctx._select.className);
630
+ $(row)
631
+ .addClass(ctx._select.className)
632
+ .find('input.dt-select-checkbox').prop('checked', true);
573
633
  }
574
634
 
575
635
  // Cells and columns - if separated out, we would need to do two
@@ -579,12 +639,11 @@ function init(ctx) {
579
639
  ctx.aoColumns[i]._select_selected ||
580
640
  (d._selected_cells && d._selected_cells[i])
581
641
  ) {
582
- $(d.anCells[i]).addClass(ctx._select.className);
642
+ $(d.anCells[i]).addClass(ctx._select.className)
583
643
  }
584
644
  }
585
- },
586
- sName: 'select-deferRender'
587
- });
645
+ }
646
+ );
588
647
 
589
648
  // On Ajax reload we want to reselect all rows which are currently selected,
590
649
  // if there is an rowId (i.e. a unique value to identify each row with)
@@ -628,8 +687,20 @@ function init(ctx) {
628
687
  });
629
688
 
630
689
  // Update the table information element with selected item summary
631
- api.on('draw.dtSelect.dt select.dtSelect.dt deselect.dtSelect.dt info.dt', function () {
632
- info(api);
690
+ api.on('info.dt', function (e, ctx, node) {
691
+ // Store the info node for updating on select / deselect
692
+ if (!ctx._select.infoEls.includes(node)) {
693
+ ctx._select.infoEls.push(node);
694
+ }
695
+
696
+ info(api, node);
697
+ });
698
+
699
+ api.on('select.dtSelect.dt deselect.dtSelect.dt', function () {
700
+ ctx._select.infoEls.forEach(function (el) {
701
+ info(api, el);
702
+ });
703
+
633
704
  api.state.save();
634
705
  });
635
706
 
@@ -657,13 +728,13 @@ function init(ctx) {
657
728
  function rowColumnRange(dt, type, idx, last) {
658
729
  // Add a range of rows from the last selected row to this one
659
730
  var indexes = dt[type + 's']({ search: 'applied' }).indexes();
660
- var idx1 = $.inArray(last, indexes);
661
- var idx2 = $.inArray(idx, indexes);
731
+ var idx1 = indexes.indexOf(last);
732
+ var idx2 = indexes.indexOf(idx);
662
733
 
663
734
  if (!dt[type + 's']({ selected: true }).any() && idx1 === -1) {
664
735
  // select from top to here - slightly odd, but both Windows and Mac OS
665
736
  // do this
666
- indexes.splice($.inArray(idx, indexes) + 1, indexes.length);
737
+ indexes.splice(indexes.indexOf(idx) + 1, indexes.length);
667
738
  }
668
739
  else {
669
740
  // reverse so we can shift click 'up' as well as down
@@ -683,7 +754,7 @@ function rowColumnRange(dt, type, idx, last) {
683
754
  }
684
755
  else {
685
756
  // Deselect range - need to keep the clicked on row selected
686
- indexes.splice($.inArray(idx, indexes), 1);
757
+ indexes.splice(indexes.indexOf(idx), 1);
687
758
  dt[type + 's'](indexes).deselect();
688
759
  }
689
760
  }
@@ -810,8 +881,10 @@ $.each(
810
881
  data = settings[o.prop][indexes[i]];
811
882
 
812
883
  if (
813
- (selected === true && data._select_selected === true) ||
814
- (selected === false && !data._select_selected)
884
+ data && (
885
+ (selected === true && data._select_selected === true) ||
886
+ (selected === false && !data._select_selected)
887
+ )
815
888
  ) {
816
889
  out.push(indexes[i]);
817
890
  }
@@ -835,11 +908,13 @@ DataTable.ext.selector.cell.push(function (settings, opts, cells) {
835
908
  rowData = settings.aoData[cells[i].row];
836
909
 
837
910
  if (
838
- (selected === true &&
839
- rowData._selected_cells &&
840
- rowData._selected_cells[cells[i].column] === true) ||
841
- (selected === false &&
842
- (!rowData._selected_cells || !rowData._selected_cells[cells[i].column]))
911
+ rowData && (
912
+ (selected === true &&
913
+ rowData._selected_cells &&
914
+ rowData._selected_cells[cells[i].column] === true) ||
915
+ (selected === false &&
916
+ (!rowData._selected_cells || !rowData._selected_cells[cells[i].column]))
917
+ )
843
918
  ) {
844
919
  out.push(cells[i]);
845
920
  }
@@ -954,6 +1029,17 @@ apiRegister('select.selector()', function (selector) {
954
1029
  });
955
1030
  });
956
1031
 
1032
+ apiRegister('select.last()', function (set) {
1033
+ let ctx = this.context[0];
1034
+
1035
+ if (set) {
1036
+ ctx._select_lastCell = set;
1037
+ return this;
1038
+ }
1039
+
1040
+ return ctx._select_lastCell;
1041
+ });
1042
+
957
1043
  apiRegisterPlural('rows().select()', 'row().select()', function (select) {
958
1044
  var api = this;
959
1045
 
@@ -964,8 +1050,37 @@ apiRegisterPlural('rows().select()', 'row().select()', function (select) {
964
1050
  this.iterator('row', function (ctx, idx) {
965
1051
  clear(ctx);
966
1052
 
967
- ctx.aoData[idx]._select_selected = true;
968
- $(ctx.aoData[idx].nTr).addClass(ctx._select.className);
1053
+ // There is a good amount of knowledge of DataTables internals in
1054
+ // this function. It _could_ be done without that, but it would hurt
1055
+ // performance (or DT would need new APIs for this work)
1056
+ var dtData = ctx.aoData[idx];
1057
+ var dtColumns = ctx.aoColumns;
1058
+
1059
+ $(dtData.nTr).addClass(ctx._select.className);
1060
+ dtData._select_selected = true;
1061
+
1062
+ for (var i=0 ; i<dtColumns.length ; i++) {
1063
+ var col = dtColumns[i];
1064
+
1065
+ // Regenerate the column type if not present
1066
+ if (col.sType === null) {
1067
+ api.columns().types()
1068
+ }
1069
+
1070
+ if (col.sType === 'select-checkbox') {
1071
+ var cells = dtData.anCells;
1072
+
1073
+ // Make sure the checkbox shows the right state
1074
+ if (cells && cells[i]) {
1075
+ $('input.dt-select-checkbox', cells[i]).prop('checked', true);
1076
+ }
1077
+
1078
+ // Invalidate the sort data for this column, if not already done
1079
+ if (dtData._aSortData !== null) {
1080
+ dtData._aSortData[i] = null;
1081
+ }
1082
+ }
1083
+ }
969
1084
  });
970
1085
 
971
1086
  this.iterator('table', function (ctx, i) {
@@ -1070,9 +1185,36 @@ apiRegisterPlural('rows().deselect()', 'row().deselect()', function () {
1070
1185
  var api = this;
1071
1186
 
1072
1187
  this.iterator('row', function (ctx, idx) {
1073
- ctx.aoData[idx]._select_selected = false;
1188
+ // Like the select action, this has a lot of knowledge about DT internally
1189
+ var dtData = ctx.aoData[idx];
1190
+ var dtColumns = ctx.aoColumns;
1191
+
1192
+ $(dtData.nTr).removeClass(ctx._select.className);
1193
+ dtData._select_selected = false;
1074
1194
  ctx._select_lastCell = null;
1075
- $(ctx.aoData[idx].nTr).removeClass(ctx._select.className);
1195
+
1196
+ for (var i=0 ; i<dtColumns.length ; i++) {
1197
+ var col = dtColumns[i];
1198
+
1199
+ // Regenerate the column type if not present
1200
+ if (col.sType === null) {
1201
+ api.columns().types()
1202
+ }
1203
+
1204
+ if (col.sType === 'select-checkbox') {
1205
+ var cells = dtData.anCells;
1206
+
1207
+ // Make sure the checkbox shows the right state
1208
+ if (cells && cells[i]) {
1209
+ $('input.dt-select-checkbox', dtData.anCells[i]).prop('checked', false);
1210
+ }
1211
+
1212
+ // Invalidate the sort data for this column, if not already done
1213
+ if (dtData._aSortData !== null) {
1214
+ dtData._aSortData[i] = null;
1215
+ }
1216
+ }
1217
+ }
1076
1218
  });
1077
1219
 
1078
1220
  this.iterator('table', function (ctx, i) {
@@ -1158,15 +1300,15 @@ function namespacedEvents(config) {
1158
1300
  }
1159
1301
 
1160
1302
  function enabled(dt, config) {
1161
- if ($.inArray('rows', config.limitTo) !== -1 && dt.rows({ selected: true }).any()) {
1303
+ if (config.limitTo.indexOf('rows') !== -1 && dt.rows({ selected: true }).any()) {
1162
1304
  return true;
1163
1305
  }
1164
1306
 
1165
- if ($.inArray('columns', config.limitTo) !== -1 && dt.columns({ selected: true }).any()) {
1307
+ if (config.limitTo.indexOf('columns') !== -1 && dt.columns({ selected: true }).any()) {
1166
1308
  return true;
1167
1309
  }
1168
1310
 
1169
- if ($.inArray('cells', config.limitTo) !== -1 && dt.cells({ selected: true }).any()) {
1311
+ if (config.limitTo.indexOf('cells') !== -1 && dt.cells({ selected: true }).any()) {
1170
1312
  return true;
1171
1313
  }
1172
1314
 
@@ -1266,34 +1408,23 @@ $.extend(DataTable.ext.buttons, {
1266
1408
  showSelected: {
1267
1409
  text: i18n('showSelected', 'Show only selected'),
1268
1410
  className: 'buttons-show-selected',
1269
- action: function (e, dt, node, conf) {
1270
- // Works by having a filtering function which will reduce to the selected
1271
- // items only. So we can re-reference the function it gets stored in the
1272
- // `conf` object
1273
- if (conf._filter) {
1274
- var idx = DataTable.ext.search.indexOf(conf._filter);
1275
-
1276
- if (idx !== -1) {
1277
- DataTable.ext.search.splice(idx, 1);
1278
- conf._filter = null;
1279
- }
1411
+ action: function (e, dt) {
1412
+ if (dt.search.fixed('dt-select')) {
1413
+ // Remove existing function
1414
+ dt.search.fixed('dt-select', null);
1280
1415
 
1281
1416
  this.active(false);
1282
1417
  }
1283
1418
  else {
1284
- var fn = function (s, data, idx) {
1285
- // Need to be sure we are operating on our table!
1286
- if (s !== dt.settings()[0]) {
1287
- return true;
1288
- }
1289
-
1290
- let row = s.aoData[idx];
1291
-
1292
- return row._select_selected;
1293
- };
1294
-
1295
- conf._filter = fn;
1296
- DataTable.ext.search.push(fn);
1419
+ // Use a fixed filtering function to match on selected rows
1420
+ // This needs to reference the internal aoData since that is
1421
+ // where Select stores its reference for the selected state
1422
+ var dataSrc = dt.settings()[0].aoData;
1423
+
1424
+ dt.search.fixed('dt-select', function (text, data, idx) {
1425
+ // _select_selected is set by Select on the data object for the row
1426
+ return dataSrc[idx]._select_selected;
1427
+ });
1297
1428
 
1298
1429
  this.active(true);
1299
1430
  }
@@ -1322,6 +1453,74 @@ $.each(['Row', 'Column', 'Cell'], function (i, item) {
1322
1453
  };
1323
1454
  });
1324
1455
 
1456
+ DataTable.type('select-checkbox', {
1457
+ className: 'dt-select',
1458
+ detect: function (data) {
1459
+ // Rendering function will tell us if it is a checkbox type
1460
+ return data === 'select-checkbox' ? data : false;
1461
+ },
1462
+ order: {
1463
+ pre: function (d) {
1464
+ return d === 'X' ? -1 : 0;
1465
+ }
1466
+ }
1467
+ });
1468
+
1469
+ $.extend(true, DataTable.defaults.oLanguage, {
1470
+ select: {
1471
+ aria: {
1472
+ rowCheckbox: 'Select row'
1473
+ }
1474
+ }
1475
+ });
1476
+
1477
+ DataTable.render.select = function (valueProp, nameProp) {
1478
+ var valueFn = valueProp ? DataTable.util.get(valueProp) : null;
1479
+ var nameFn = nameProp ? DataTable.util.get(nameProp) : null;
1480
+
1481
+ return function (data, type, row, meta) {
1482
+ var dtRow = meta.settings.aoData[meta.row];
1483
+ var selected = dtRow._select_selected;
1484
+ var ariaLabel = meta.settings.oLanguage.select.aria.rowCheckbox;
1485
+
1486
+ if (type === 'display') {
1487
+ return $('<input>')
1488
+ .attr({
1489
+ 'aria-label': ariaLabel,
1490
+ class: 'dt-select-checkbox',
1491
+ name: nameFn ? nameFn(row) : null,
1492
+ type: 'checkbox',
1493
+ value: valueFn ? valueFn(row) : null,
1494
+ checked: selected
1495
+ })[0];
1496
+ }
1497
+ else if (type === 'type') {
1498
+ return 'select-checkbox';
1499
+ }
1500
+ else if (type === 'filter') {
1501
+ return '';
1502
+ }
1503
+
1504
+ return selected ? 'X' : '';
1505
+ }
1506
+ }
1507
+
1508
+ // Legacy checkbox ordering
1509
+ DataTable.ext.order['select-checkbox'] = function (settings, col) {
1510
+ return this.api()
1511
+ .column(col, { order: 'index' })
1512
+ .nodes()
1513
+ .map(function (td) {
1514
+ if (settings._select.items === 'row') {
1515
+ return $(td).parent().hasClass(settings._select.className);
1516
+ }
1517
+ else if (settings._select.items === 'cell') {
1518
+ return $(td).hasClass(settings._select.className);
1519
+ }
1520
+ return false;
1521
+ });
1522
+ };
1523
+
1325
1524
  $.fn.DataTable.select = DataTable.select;
1326
1525
 
1327
1526
  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "main": "js/dataTables.select.js",
5
5
  "module": "js/dataTables.select.mjs",
6
6
  "types": "./types/types.d.ts",
7
- "version": "1.7.1",
7
+ "version": "2.0.1",
8
8
  "files": [
9
9
  "js/**/*.js",
10
10
  "js/**/*.mjs",
@@ -20,7 +20,7 @@
20
20
  "sort"
21
21
  ],
22
22
  "dependencies": {
23
- "datatables.net": "^1.13.0",
23
+ "datatables.net": "^2",
24
24
  "jquery": ">=1.7"
25
25
  },
26
26
  "moduleType": [