{"version":3,"sourceRoot":"/cv/scripts/DAC0/eng/include","sources":["multipageSelect.js"],"sourcesContent":["// Multi-page selection and submission for datatables. This makes use of dataTables.select, but extends it to do our own checkAll manipulation and include named inputs across pages into a form on submit.\r\n//\r\n// Requires: ES6-capable browser\r\n//\r\n// Usage:\r\n// Your table should have checkboxes contained in a with the rowSelector class. These will be used to enable/disable row selection.\r\n//\r\n// To query selected rows,\r\n//\r\n// After initializing a datatable -\r\n// var mps = new multipageSelect({\r\n// table: '[API instance returned by DataTable()]',\r\n// tableSelector: '[jquery selector string to find the target table]',\r\n// formSelector: '[jquery selector string to find the form that will receive inputs from selected rows on form submit. Be sure to use .trigger('submit') so that the onSubmit event is fired!]',\r\n// checkallSelector: '[jquery selector string to find the checkAll checkbox (within the context of tableSelector)]',\r\n// clickCallback: [callbackFunction whenever a click occurs. Will receive context of the event target of the originating click],\r\n// rowSelectorClass: '[custom rowSelector class. default=\"rowSelector\"]'. Place this class on the container element (ie ) containing your selection element\r\n// disableNextSubmitLatch: boolean - disables table gathering for the next submit event\r\n// });\r\n\r\nfunction multipageSelect(options) {\r\n var that=this;\r\n this.tableDt = null;\r\n this.tableSelector = null;\r\n this.formSelector = null;\r\n this.checkallSelector = null;\r\n this.clickCallback = null;\r\n this.rowSelectorClass = 'rowSelector';\r\n this.selectAllOnSubmit = false;\r\n this.minimumSelectedCount = 0;\r\n this.disableNextSubmitLatch = false;\r\n\r\n if (options.table) { this.tableDt = options.table; }\r\n if (options.tableSelector) { this.tableSelector = options.tableSelector; }\r\n if (options.formSelector) { this.formSelector = options.formSelector; }\r\n if (options.checkallSelector) { this.checkallSelector = options.checkallSelector; }\r\n if (options.clickCallback) { this.clickCallback = options.clickCallback; }\r\n if (options.rowSelectorClass) { this.rowSelectorClass = options.rowSelectorClass; }\r\n if (options.selectAllOnSubmit) { this.selectAllOnSubmit = options.selectAllOnSubmit; }\r\n if (options.disableNextSubmitLatch) { this.disableNextSubmitLatch = options.disableNextSubmitLatch; }\r\n\r\n // Radio button-based rowSelectors on a single-select table get pre-configured to not go below 1 selection (once at least one item is selected).\r\n this.minimumSelectedCount = (that.tableDt.select.style()=='single' && $('.rowSelector input:radio', this.tableSelector).length) ? 1 : 0;\r\n // If we ever want to expose this through the options object (because we need a selectable radio button list where radio buttons\r\n // can be completely deselected), uncomment the following line:\r\n //if (options.minimumSelectedCount) { this.minimumSelectedCount = options.minimumSelectedCount; }\r\n\r\n // Updates \"Select all\" control in a data table, but only if a checkallSelector is supplied\r\n this.updateDataTableSelectAllCtrl = function() {\r\n if (this.rowSelectorClass && this.checkallSelector) {\r\n var $table = $(this.tableSelector);\r\n var $chkbox_all = $('tbody td.' + this.rowSelectorClass + ' input:checkbox', $table);\r\n var $chkbox_checked = $('tbody td.' + this.rowSelectorClass + ' input:checkbox:checked', $table);\r\n var $chkbox_select_all = $(this.checkallSelector, $table);\r\n\r\n if ($chkbox_select_all.length) {\r\n // If none of the checkboxes are checked\r\n if($chkbox_checked.length === 0){\r\n $chkbox_select_all.prop('checked', false);\r\n $chkbox_select_all.prop('indeterminate', false);\r\n // If all of the checkboxes are checked\r\n } else if ($chkbox_checked.length === $chkbox_all.length){\r\n $chkbox_select_all.prop('checked' ,true);\r\n $chkbox_select_all.prop('indeterminate', false);\r\n // If some of the checkboxes are checked\r\n } else {\r\n $chkbox_select_all.prop('checked' ,this.getCheckedStateForIndeterminate());\r\n $chkbox_select_all.prop('indeterminate' ,true);\r\n }\r\n }\r\n }\r\n };\r\n\r\n /// Determine the checked state to give to a checkbox\r\n /// with indeterminate state, so that it becomes checked\r\n /// on click on IE, Chrome and Firefox 5+.\r\n /// All glory to https://stackoverflow.com/a/19447939\r\n this.getCheckedStateForIndeterminate = function()\r\n {\r\n // Create a unchecked checkbox with indeterminate state\r\n var test = document.createElement(\"input\");\r\n test.type = \"checkbox\";\r\n test.checked = false;\r\n test.indeterminate = true;\r\n\r\n // Try to click the checkbox\r\n var body = document.body;\r\n body.appendChild(test); // Required to work on FF\r\n test.click();\r\n body.removeChild(test); // Required to work on FF\r\n\r\n // Check if the checkbox is now checked and cache the result\r\n if (test.checked) {\r\n this.getCheckedStateForIndeterminate = function () { return false; };\r\n return false;\r\n } else {\r\n this.getCheckedStateForIndeterminate = function () { return true; };\r\n return true;\r\n }\r\n };\r\n\r\n this.doClickFollowup = function(e) {\r\n // update the state of the select all control\r\n this.updateDataTableSelectAllCtrl();\r\n if (this.clickCallback) {\r\n this.clickCallback.call(e.target);\r\n }\r\n };\r\n\r\n // prevent the click on a single row that would deselect a row and bring the total selection count below the configured minimum.\r\n this.preventSingleRowDeselectClick = function(e, $row) {\r\n if ($row.length && $row instanceof jQuery) {\r\n $row = $row[0];\r\n }\r\n\r\n if (that.tableDt.rows({selected: true}).count() <= that.minimumSelectedCount && $.inArray($row, that.tableDt.rows({selected: true}).nodes())>-1) {\r\n e.stopPropagation();\r\n return false;\r\n }\r\n };\r\n\r\n // Handle click on \"Select all\" control. Only select visible rows as part of SelectAll\r\n if (this.checkallSelector) {\r\n $(this.checkallSelector, this.tableSelector).on('click.multipageSelect', function(e) {\r\n var $visibleRows = $(that.tableSelector).find('tbody tr');\r\n if(e.target.checked) {\r\n that.tableDt.rows($visibleRows).select();\r\n } else {\r\n that.tableDt.rows($visibleRows).deselect();\r\n }\r\n\r\n that.doClickFollowup(e);\r\n\r\n // Prevent click event from propagating to parent\r\n e.stopPropagation();\r\n });\r\n }\r\n\r\n // clear all selected but non-visible rows whenever something about the table changes (which would trigger a redraw)\r\n var clearSelection = function(e){\r\n var selectedRows = that.tableDt.rows({selected: true}).nodes().toArray();\r\n if (selectedRows.length) {\r\n var visibleRows = $(that.tableSelector).find('tr').toArray();\r\n var deselectRows = selectedRows.filter(function(selRow) { return visibleRows.indexOf(selRow) === -1});\r\n if (deselectRows.length) {\r\n that.tableDt.rows(deselectRows).deselect();\r\n }\r\n }\r\n };\r\n // use draw.dt as it is fired after data is updated, instead of page.dt/order.dt/length.dt which are fired pre-data update.\r\n $(this.tableSelector).on('draw.dt', clearSelection);\r\n\r\n // \"pre-[de]select\" handler for .rowSelector\r\n $('.rowSelector', this.tableSelector).on('click', function(e) {\r\n var $target = $(e.target);\r\n if ($target.find('input:radio')) {\r\n return that.preventSingleRowDeselectClick(e, $target.closest('tr'));\r\n }\r\n });\r\n\r\n // \"pre-[de]select\" handler for supported inputs in .rowSelector.\r\n // This contains a workaround to datatable's default behavior where selecting (highlighting) text will prevent a select/deselect from occuring. This is not a bug on datatables, just not the behavior we want.\r\n $('.rowSelector input:checkbox, .rowSelector input:radio', this.tableSelector).on('click', function(e) {\r\n var $target = $(e.target);\r\n var isClickPrevented;\r\n\r\n if ($target.has(':radio')) {\r\n isClickPrevented = that.preventSingleRowDeselectClick(e, $target.closest('tr'));\r\n }\r\n\r\n if (!isClickPrevented && ($target.has(':radio') || $target.has(':checkbox'))) {\r\n // work around datatable's default behavior where selecting text will prevent a select/deselect from occuring. This is not a bug on datatables, just not the behavior we want.\r\n var oSel = window.getSelection();\r\n if (oSel && oSel.type=='Range') {\r\n if ($target.prop('checked')) {\r\n that.tableDt.row($target.closest('tr')).select();\r\n } else {\r\n that.tableDt.row($target.closest('tr')).deselect();\r\n }\r\n }\r\n \r\n } \r\n return isClickPrevented;\r\n });\r\n\r\n this.tableDt.on( 'select.multipageSelect', function( e, dt, type, indexes ) { \r\n $.each(indexes, function(idx, obj) {\r\n var $rowSelectorThing = $(that.tableDt.row(obj).node()).find('input:checkbox, input:radio');\r\n if ($rowSelectorThing.length>0) { $rowSelectorThing.prop('checked', true); }\r\n });\r\n\r\n that.doClickFollowup(e);\r\n });\r\n\r\n this.tableDt.on( 'deselect.multipageSelect', function( e, dt, type, indexes ) {\r\n $.each(indexes, function(idx, obj) {\r\n\r\n\r\n var $rowSelectorThing = $(that.tableDt.row(obj).node()).find('input:checkbox, input:radio');\r\n if ($rowSelectorThing.length>0) { $rowSelectorThing.prop('checked', false); }\r\n });\r\n\r\n that.doClickFollowup(e);\r\n });\r\n\r\n // Handle table draw event\r\n this.tableDt.on('draw.multipageSelect', function(e) {\r\n // Update state of \"Select all\" control\r\n that.doClickFollowup(e);\r\n });\r\n\r\n // Handle form submission event\r\n $(this.formSelector).on('submit', function(e) {\r\n var timeoutMs = 250;\r\n\r\n // this is a limiter so that if one submit is already in process, it will wait until it finishes before gathering form elements and doing another submit\r\n if (that.formSelector && !that.disableNextSubmitLatch) {\r\n // gather all named inputs from selected rows\r\n var $allInputs;\r\n if (that.selectAllOnSubmit) {\r\n $allInputs = $(that.tableDt.rows().nodes()).find('[name]:input');\r\n } else {\r\n $allInputs = $(that.tableDt.rows({selected:true}).nodes()).find('[name]:input');\r\n }\r\n // find all *visible* elements in the table that is itself contained within the form, and remove them from the inputs that will be manipulated\r\n if (that.tableSelector && $(that.tableSelector, that.formSelector).length>0) {\r\n // if the visible form elements aren't spliced out, those elements will jump around the page right before submit happens\r\n var $visibleInputs = $('tbody tr [name]:input:visible', that.tableSelector);\r\n $.each($visibleInputs, function(idx, obj) {\r\n var arrIdx = $.inArray(obj, $allInputs);\r\n if (arrIdx>-1) {\r\n $allInputs.splice(arrIdx, 1);\r\n }\r\n });\r\n }\r\n\r\n // now clone and append all remaining inputs into the form that don't already exist in the form.\r\n $allInputs.filter(function(idx, el) {return !($(this).parents(that.formSelector).length);})\r\n .clone()\r\n .addClass('hidden mpsRemoveAfterSubmit')\r\n .appendTo(that.formSelector);\r\n // \"hack\" to remove added form elements after submit happens - this is trusting that the timeout has gathered everything it needs from DOM for submit before \r\n // the timeout expires, and there's no good way to capture this event on a pure browser submit.\r\n setTimeout(function() {\r\n $('.mpsRemoveAfterSubmit', that.formSelector).remove();\r\n }, timeoutMs);\r\n }\r\n\r\n that.disableNextSubmitLatch = false;\r\n });\r\n}"],"names":["multipageSelect","options","that","this","tableDt","tableSelector","formSelector","checkallSelector","clickCallback","rowSelectorClass","selectAllOnSubmit","minimumSelectedCount","disableNextSubmitLatch","table","select","style","$","length","updateDataTableSelectAllCtrl","$chkbox_all","$chkbox_checked","$chkbox_select_all","$table","prop","getCheckedStateForIndeterminate","test","document","createElement","body","type","checked","indeterminate","appendChild","click","removeChild","doClickFollowup","e","call","target","preventSingleRowDeselectClick","$row","jQuery","rows","selected","count","inArray","nodes","stopPropagation","on","$visibleRows","find","deselect","visibleRows","selectedRows","toArray","deselectRows","filter","selRow","indexOf","$target","closest","isClickPrevented","has","oSel","window","getSelection","row","dt","indexes","each","idx","obj","$rowSelectorThing","node","$visibleInputs","$allInputs","arrIdx","splice","el","parents","clone","addClass","appendTo","setTimeout","remove"],"mappings":"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"}