diff --git a/framework/zii/widgets/assets/gridview/jquery.yiigridview.js b/framework/zii/widgets/assets/gridview/jquery.yiigridview.js index 8caddb003..b187c0bf8 100644 --- a/framework/zii/widgets/assets/gridview/jquery.yiigridview.js +++ b/framework/zii/widgets/assets/gridview/jquery.yiigridview.js @@ -8,10 +8,32 @@ * @version $Id$ */ -(function($) { - var gridSettings = {}; +(function ($) { + var selectCheckedRows, methods, + gridSettings = []; - var methods = { + /** + * 1. Selects rows that have checkbox checked (only checkbox that is connected with selecting a row) + * 2. Check if "check all" need to be checked/unchecked + * @return object the jQuery object + */ + selectCheckedRows = function (gridId) { + var settings = gridSettings[gridId], + table = $('#' + gridId).children('.' + settings.tableClass); + + table.children('tbody').find('input.select-on-check').filter(':checked').each(function () { + $(this).closest('tr').addClass('selected'); + }); + + table.children('thead').find('th input').filter('[type="checkbox"]').each(function () { + var name = this.name.substring(0, this.name.length - 4) + '[]', //.. remove '_all' and add '[]'' + $checks = $("input[name='" + name + "']", table); + this.checked = $checks.length > 0 && $checks.length === $checks.filter(':checked').length; + }); + return this; + }; + + methods = { /** * yiiGridView set function. * @param options map settings for the grid view. Available options are as follows: @@ -27,8 +49,8 @@ * - selectionChanged: function, the function to be called after the row selection is changed * @return object the jQuery object */ - init: function(options) { - var settings = $.extend( { + init: function (options) { + var settings = $.extend({ ajaxUpdate: [], ajaxVar: 'ajax', pagerClass: 'pager', @@ -37,81 +59,88 @@ tableClass: 'items', selectableRows: 1 // updateSelector: '#id .pager a, '#id .grid thead th a', - // beforeAjaxUpdate: function(id) {}, - // afterAjaxUpdate: function(id, data) {}, - // selectionChanged: function(id) {}, + // beforeAjaxUpdate: function (id) {}, + // afterAjaxUpdate: function (id, data) {}, + // selectionChanged: function (id) {}, // url: 'ajax request URL' }, options || {}); - return this.each(function(){ + return this.each(function () { var $grid = $(this), - id = $grid.attr('id'); + id = $grid.attr('id'), + inputSelector = '#' + id + ' .' + settings.filterClass + ' input, ' + '#' + id + ' .' + settings.filterClass + ' select'; - settings.tableClass=settings.tableClass.replace(/\s+/g,'.'); - if(settings.updateSelector === undefined) - settings.updateSelector = '#'+id+' .'+settings.pagerClass.replace(/\s+/g,'.')+' a, #'+id+' .'+settings.tableClass+' thead th a'; + settings.tableClass = settings.tableClass.replace(/\s+/g, '.'); + if (settings.updateSelector === undefined) { + settings.updateSelector = '#' + id + ' .' + settings.pagerClass.replace(/\s+/g, '.') + ' a, #' + id + ' .' + settings.tableClass + ' thead th a'; + } gridSettings[id] = settings; - if(settings.ajaxUpdate.length > 0) { - $(document).on('click', settings.updateSelector, function(){ - $('#'+id).yiiGridView('update', {url: $(this).attr('href')}); + if (settings.ajaxUpdate.length > 0) { + $(document).on('click', settings.updateSelector, function () { + $('#' + id).yiiGridView('update', {url: $(this).attr('href')}); return false; }); } - var inputSelector = '#'+id+' .'+settings.filterClass+' input, '+'#'+id+' .'+settings.filterClass+' select'; - $(document).on('change', inputSelector, function(){ + $(document).on('change', inputSelector, function () { var data = $(inputSelector).serialize(); - if(settings.pageVar !== undefined) + if (settings.pageVar !== undefined) { data += '&' + settings.pageVar + '=1'; - $('#'+id).yiiGridView('update', {data: data}); + } + $('#' + id).yiiGridView('update', {data: data}); }); - if(settings.selectableRows > 0) { - $grid.yiiGridView('selectCheckedRows'); - $(document).on('click','#'+id+' .'+settings.tableClass+' > tbody > tr',function(e){ - var $target = $(e.target); - if($target.closest('td').hasClass('button-column') || - (e.target.type === 'checkbox' && !$target.hasClass('select-on-check'))) + if (settings.selectableRows > 0) { + selectCheckedRows(this.id); + $(document).on('click', '#' + id + ' .' + settings.tableClass + ' > tbody > tr', function (e) { + var $currentGrid, $row, isRowSelected, $checks, + $target = $(e.target); + + if ($target.closest('td').hasClass('button-column') || (e.target.type === 'checkbox' && !$target.hasClass('select-on-check'))) { return; + } - var $currentGrid = $('#'+id), - $row = $(this), - isRowSelected = $row.toggleClass('selected').hasClass('selected'), - $checks = $('input.select-on-check',$currentGrid); + $row = $(this); + $currentGrid = $('#' + id); + $checks = $('input.select-on-check', $currentGrid); + isRowSelected = $row.toggleClass('selected').hasClass('selected'); - if(settings.selectableRows === 1) { + if (settings.selectableRows === 1) { $row.siblings().removeClass('selected'); - $checks.prop('checked',false); + $checks.prop('checked', false); } $('input.select-on-check', $row).prop('checked', isRowSelected); - $("input.select-on-check-all",$currentGrid).prop('checked', $checks.length === $checks.filter(':checked').length); + $("input.select-on-check-all", $currentGrid).prop('checked', $checks.length === $checks.filter(':checked').length); - if(settings.selectionChanged !== undefined) + if (settings.selectionChanged !== undefined) { settings.selectionChanged(id); + } }); - if(settings.selectableRows > 1) { - $(document).on('click','#'+id+' .select-on-check-all',function(){ - var $currentGrid = $('#'+id), - $checks = $('input.select-on-check',$currentGrid), - $checksAll = $('input.select-on-check-all',$currentGrid), - $rows = $currentGrid.children('.'+settings.tableClass).children('tbody').children(); - if(this.checked){ + if (settings.selectableRows > 1) { + $(document).on('click', '#' + id + ' .select-on-check-all', function () { + var $currentGrid = $('#' + id), + $checks = $('input.select-on-check', $currentGrid), + $checksAll = $('input.select-on-check-all', $currentGrid), + $rows = $currentGrid.children('.' + settings.tableClass).children('tbody').children(); + if (this.checked) { $rows.addClass('selected'); - $checks.prop('checked',true); - $checksAll.prop('checked',true); + $checks.prop('checked', true); + $checksAll.prop('checked', true); } else { $rows.removeClass('selected'); - $checks.prop('checked',false); - $checksAll.prop('checked',false); + $checks.prop('checked', false); + $checksAll.prop('checked', false); } - if(settings.selectionChanged !== undefined) + if (settings.selectionChanged !== undefined) { settings.selectionChanged(id); + } }); } - } else - $(document).on('click','#'+id+' .select-on-check',false); + } else { + $(document).on('click', '#' + id + ' .select-on-check', false); + } }); }, @@ -120,7 +149,7 @@ * @param row integer the row number (zero-based index) * @return string the key value */ - getKey: function(row) { + getKey: function (row) { return this.children('.keys').children('span').eq(row).text(); }, @@ -128,7 +157,7 @@ * Returns the URL that generates the grid view content. * @return string the URL that generates the grid view content. */ - getUrl: function() { + getUrl: function () { var sUrl = gridSettings[this.attr('id')].url; return sUrl || this.children('.keys').attr('title'); }, @@ -138,9 +167,9 @@ * @param row integer the row number (zero-based index) * @return jQuery the jQuery collection of the cells in the specified row. */ - getRow: function(row) { + getRow: function (row) { var sClass = gridSettings[this.attr('id')].tableClass; - return this.children('.'+sClass).children('tbody').children('tr').eq(row).children(); + return this.children('.' + sClass).children('tbody').children('tr').eq(row).children(); }, /** @@ -148,9 +177,9 @@ * @param column integer the column number (zero-based index) * @return jQuery the jQuery collection of the cells in the specified column. */ - getColumn: function(column) { + getColumn: function (column) { var sClass = gridSettings[this.attr('id')].tableClass; - return this.children('.'+sClass).children('tbody').children('tr').children('td:nth-child('+(column+1)+')'); + return this.children('.' + sClass).children('tbody').children('tr').children('td:nth-child(' + (column + 1) + ')'); }, /** @@ -159,14 +188,16 @@ * the URL to be requested is the one that generates the current content of the grid view. * @return object the jQuery object */ - update: function(options) { - if(options && options.error !== undefined) { - var customError = options.error; + update: function (options) { + var customError; + if (options && options.error !== undefined) { + customError = options.error; delete options.error; } - return this.each(function(){ - var $grid = $(this), + return this.each(function () { + var $form, + $grid = $(this), id = $grid.attr('id'), settings = gridSettings[id]; $grid.addClass(settings.loadingClass); @@ -174,76 +205,84 @@ options = $.extend({ type: 'GET', url: $grid.yiiGridView('getUrl'), - success: function(data,status) { - var $data = $('