Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/QbCollectionController.java =================================================================== diff -u -r43d88e533dd5666feeaeab4368982ad8028bfae3 -r4d33113a6642a8c4e598c9606c7bc1f65f07ed71 --- lams_central/src/java/org/lamsfoundation/lams/web/qb/QbCollectionController.java (.../QbCollectionController.java) (revision 43d88e533dd5666feeaeab4368982ad8028bfae3) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/QbCollectionController.java (.../QbCollectionController.java) (revision 4d33113a6642a8c4e598c9606c7bc1f65f07ed71) @@ -92,10 +92,11 @@ List questions = qbService.getCollectionQuestions(collectionUid, offset, rowLimit, sortBy, sortOrder, searchString); int total = qbService.countCollectionQuestions(collectionUid, searchString); - return QbCollectionController.toGridXML(questions, page, total); + int maxPages = total / rowLimit + 1; + return QbCollectionController.toGridXML(questions, page, maxPages); } - private static String toGridXML(List questions, int page, int total) { + private static String toGridXML(List questions, int page, int maxPages) { try { Document document = WebUtil.getDocument(); @@ -107,7 +108,7 @@ rootElement.appendChild(pageElement); Element totalPageElement = document.createElement(CommonConstants.ELEMENT_TOTAL); - totalPageElement.appendChild(document.createTextNode(String.valueOf(total))); + totalPageElement.appendChild(document.createTextNode(String.valueOf(maxPages))); rootElement.appendChild(totalPageElement); Element recordsElement = document.createElement(CommonConstants.ELEMENT_RECORDS); Index: lams_central/web/qb/collection.jsp =================================================================== diff -u -r43d88e533dd5666feeaeab4368982ad8028bfae3 -r4d33113a6642a8c4e598c9606c7bc1f65f07ed71 --- lams_central/web/qb/collection.jsp (.../collection.jsp) (revision 43d88e533dd5666feeaeab4368982ad8028bfae3) +++ lams_central/web/qb/collection.jsp (.../collection.jsp) (revision 4d33113a6642a8c4e598c9606c7bc1f65f07ed71) @@ -26,7 +26,6 @@ collectionGrid.jqGrid({ guiStyle: "bootstrap", iconSet: 'fontAwesome', - autoencode:false, caption: collectionGrid.data('collectionName'), datatype: "xml", url: "qb/collection/getCollectionGridData.do?collectionUid=" + collectionGrid.data('collectionUid'), @@ -35,9 +34,10 @@ shrinkToFit: true, cellEdit: false, cmTemplate: { title: false, search: false }, - viewrecords: true, sortorder: "asc", sortname: "name", + multiselect : true, + multiPageSelection : true, pager: true, rowList:[10,20,30,40,50,100], rowNum: 10, @@ -47,15 +47,108 @@ "Stats" ], colModel:[ - {name:'id', index:'id', sortable:true, width: 10}, - {name:'name',index:'name', sortable:true, search:true, autoencode:true}, - {name:'stats', index:'stats', sortable:false, width: 10, align: "center", formatter: statsLinkFormatter} + {name:'id', index:'uid', sortable:true, width: 10}, + {name:'name', index:'name', sortable:true, search:true, autoencode:true}, + {name:'stats', index:'stats', classes: "stats-cell", sortable:false, width: 10, align: "center", formatter: statsLinkFormatter} ], + onSelectRow : function(id, status, event) { + var grid = $(this), + included = grid.data('included'), + excluded = grid.data('excluded'), + selectAllChecked = grid.closest('.ui-jqgrid-view').find('.jqgh_cbox .cbox').prop('checked'); + if (selectAllChecked) { + var index = excluded.indexOf(+id); + // if row is deselected, add it to excluded array + if (index < 0) { + if (!status) { + excluded.push(+id); + } + } else if (status) { + excluded.splice(index, 1); + } + } else { + var index = included.indexOf(+id); + // if row is selected, add it to included array + if (index < 0) { + if (status) { + included.push(+id); + } + } else if (!status) { + included.splice(index, 1); + } + } + }, + gridComplete : function(){ + var grid = $(this), + included = grid.data('included'), + // cell containing "(de)select all" button + selectAllCell = grid.closest('.ui-jqgrid-view').find('.jqgh_cbox > div'); + // remove the default button provided by jqGrid + $('.cbox', selectAllCell).remove(); + // create own button which follows own rules + var selectAllCheckbox = $('') + .prop('checked', included === null) + .prependTo(selectAllCell) + .change(function(){ + // start with deselecting every question on current page + grid.resetSelection(); + if ($(this).prop('checked')){ + // on select all change mode and select all on current page + grid.data('included', null); + grid.data('excluded', []); + $('[role="row"]', grid).each(function(){ + grid.jqGrid('setSelection', +$(this).attr('id'), false); + }); + } else { + // on deselect all just change mode + grid.data('excluded', null); + grid.data('included', []); + } + }); + grid.resetSelection(); + if (selectAllCheckbox.prop('checked')) { + var excluded = grid.data('excluded'); + // go through each loaded row + $('[role="row"]', grid).each(function(){ + var id = +$(this).attr('id'), + selected = $(this).hasClass('success'); + // if row is not selected and is not excluded, select it + if (!selected && (!excluded || !excluded.includes(id))) { + // select without triggering onSelectRow + grid.jqGrid('setSelection', id, false); + } + }); + } else { + // go through each loaded row + $('[role="row"]', grid).each(function(){ + var id = +$(this).attr('id'), + selected = $(this).hasClass('success'); + // if row is not selected and is included, select it + if (!selected && included.includes(id)) { + // select without triggering onSelectRow + grid.jqGrid('setSelection', id, false); + } + }); + } + }, + loadComplete : function(){ + var grid = $(this), + gridView = grid.closest('.ui-jqgrid-view'); + $('tr.ui-search-toolbar .cbox', gridView).remove(); + + $('.stats-cell', gridView).click(function(event){ + event.stopImmediatePropagation(); + }); + }, loadError: function(xhr,st,err) { collectionGrid.clearGridData(); alert("Error!"); } }).jqGrid('filterToolbar'); + + + collectionGrid.data('excluded', null) + .data('included', []); }); });