1/** 2 * Yii GridView widget. 3 * 4 * This is the JavaScript widget used by the yii\grid\GridView widget. 5 * 6 * @link http://www.yiiframework.com/ 7 * @copyright Copyright (c) 2008 Yii Software LLC 8 * @license http://www.yiiframework.com/license/ 9 * @author Qiang Xue <[email protected]> 10 * @since 2.0 11 */ 12(function ($) { 13 $.fn.yiiGridView = function (method) { 14 if (methods[method]) { 15 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 16 } else if (typeof method === 'object' || !method) { 17 return methods.init.apply(this, arguments); 18 } else { 19 $.error('Method ' + method + ' does not exist in jQuery.yiiGridView'); 20 return false; 21 } 22 }; 23 24 var defaults = { 25 filterUrl: undefined, 26 filterSelector: undefined, 27 filterOnFocusOut: true 28 }; 29 30 var gridData = {}; 31 32 var gridEvents = { 33 /** 34 * beforeFilter event is triggered before filtering the grid. 35 * The signature of the event handler should be: 36 * function (event) 37 * where 38 * - event: an Event object. 39 * 40 * If the handler returns a boolean false, it will stop filter form submission after this event. As 41 * a result, afterFilter event will not be triggered. 42 */ 43 beforeFilter: 'beforeFilter', 44 /** 45 * afterFilter event is triggered after filtering the grid and filtered results are fetched. 46 * The signature of the event handler should be: 47 * function (event) 48 * where 49 * - event: an Event object. 50 */ 51 afterFilter: 'afterFilter' 52 }; 53 54 /** 55 * Used for storing active event handlers and removing them later. 56 * The structure of single event handler is: 57 * 58 * { 59 * gridViewId: { 60 * type: { 61 * event: '...', 62 * selector: '...' 63 * } 64 * } 65 * } 66 * 67 * Used types: 68 * 69 * - filter, used for filtering grid with elements found by filterSelector 70 * - checkRow, used for checking single row 71 * - checkAllRows, used for checking all rows with according "Check all" checkbox 72 * 73 * event is the name of event, for example: 'change.yiiGridView' 74 * selector is a jQuery selector for finding elements 75 * 76 * @type {{}} 77 */ 78 var gridEventHandlers = {}; 79 80 var methods = { 81 init: function (options) { 82 return this.each(function () { 83 var $e = $(this); 84 var settings = $.extend({}, defaults, options || {}); 85 var id = $e.attr('id'); 86 if (gridData[id] === undefined) { 87 gridData[id] = {}; 88 } 89 90 gridData[id] = $.extend(gridData[id], {settings: settings}); 91 92 var filterEvents = 'change.yiiGridView keydown.yiiGridView'; 93 var enterPressed = false; 94 initEventHandler($e, 'filter', filterEvents, settings.filterSelector, function (event) { 95 if (event.type === 'keydown') { 96 if (event.keyCode !== 13) { 97 return; // only react to enter key 98 } else { 99 enterPressed = true; 100 } 101 } else { 102 // prevent processing for both keydown and change events 103 if (enterPressed) { 104 enterPressed = false; 105 return; 106 } 107 } 108 if (!settings.filterOnFocusOut && event.type !== 'keydown') { 109 return false; 110 } 111 112 methods.applyFilter.apply($e); 113 114 return false; 115 }); 116 }); 117 }, 118 119 applyFilter: function () { 120 var $grid = $(this); 121 var settings = gridData[$grid.attr('id')].settings; 122 var data = {};
123 $.each($(settings.filterSelector).serializeArray(), function () { 124 if (!(this.name in data)) { 125 data[this.name] = []; 126 } 127 data[this.name].push(this.value); 128 }); 129 130 var namesInFilter = Object.keys(data); 131 132 $.each(yii.getQueryParams(settings.filterUrl), function (name, value) { 133 if (namesInFilter.indexOf(name) === -1 && namesInFilter.indexOf(name.replace(/\[\d*\]$/, '')) === -1) { 134 if (!$.isArray(value)) { 135 value = [value]; 136 } 137 if (!(name in data)) { 138 data[name] = value; 139 } else { 140 $.each(value, function (i, val) { 141 if ($.inArray(val, data[name])) { 142 data[name].push(val); 143 } 144 }); 145 } 146 } 147 }); 148 149 var pos = settings.filterUrl.indexOf('?'); 150 var url = pos < 0 ? settings.filterUrl : settings.filterUrl.substring(0, pos); 151 var hashPos = settings.filterUrl.indexOf('#'); 152 if (pos >= 0 && hashPos >= 0) { 153 url += settings.filterUrl.substring(hashPos); 154 } 155 156 $grid.find('form.gridview-filter-form').remove(); 157 var $form = $('<form/>', { 158 action: url, 159 method: 'get', 160 'class': 'gridview-filter-form', 161 style: 'display:none', 162 'data-pjax': '' 163 }).appendTo($grid); 164 $.each(data, function (name, values) { 165 $.each(values, function (index, value) { 166 $form.append($('<input/>').attr({type: 'hidden', name: name, value: value})); 167 }); 168 }); 169 170 var event = $.Event(gridEvents.beforeFilter); 171 $grid.trigger(event); 172 if (event.result === false) { 173 return; 174 } 175 176 $form.submit(); 177 178 $grid.trigger(gridEvents.afterFilter); 179 }, 180 181 setSelectionColumn: function (options) { 182 var $grid = $(this); 183 var id = $(this).attr('id'); 184 if (gridData[id] === undefined) { 185 gridData[id] = {}; 186 } 187 gridData[id].selectionColumn = options.name; 188 if (!options.multiple || !options.checkAll) { 189 return; 190 } 191 var checkAll = "#" + id + " input[name='" + options.checkAll + "']"; 192 var inputs = options['class'] ? "input." + options['class'] : "input[name='" + options.name + "']"; 193 var inputsEnabled = "#" + id + " " + inputs + ":enabled"; 194 initEventHandler($grid, 'checkAllRows', 'click.yiiGridView', checkAll, function () { 195 $grid.find(inputs + ":enabled").prop('checked', this.checked).change(); 196 }); 197 initEventHandler($grid, 'checkRow', 'click.yiiGridView', inputsEnabled, function () { 198 var all = $grid.find(inputs).length == $grid.find(inputs + ":checked").length; 199 $grid.find("input[name='" + options.checkAll + "']").prop('checked', all).change(); 200 }); 201 }, 202 203 getSelectedRows: function () { 204 var $grid = $(this); 205 var data = gridData[$grid.attr('id')]; 206 var keys = []; 207 if (data.selectionColumn) { 208 $grid.find("input[name='" + data.selectionColumn + "']:checked").each(function () { 209 keys.push($(this).parent().closest('tr').data('key')); 210 }); 211 } 212 213 return keys; 214 }, 215 216 destroy: function () { 217 var events = ['.yiiGridView', gridEvents.beforeFilter, gridEvents.afterFilter].join(' '); 218 this.off(events); 219 220 var id = $(this).attr('id'); 221 $.each(gridEventHandlers[id], function (type, data) { 222 $(document).off(data.event, data.selector); 223 }); 224 225 delete gridData[id]; 226 227 return this; 228 }, 229 230 data: function () { 231 var id = $(this).attr('id'); 232 return gridData[id]; 233 } 234 }; 235 236 /** 237 * Used for attaching event handler and prevent of duplicating them. With each call previously attached handler of 238 * the same type is removed even selector was changed. 239 * @param {jQuery} $gridView According jQuery grid view element 240 * @param {string} type Type of the event which acts like a key 241 * @param {string}
241 event Event name, for example 'change.yiiGridView' 242 * @param {string} selector jQuery selector 243 * @param {function} callback The actual function to be executed with this event 244 */ 245 function initEventHandler($gridView, type, event, selector, callback) { 246 var id = $gridView.attr('id'); 247 var prevHandler = gridEventHandlers[id]; 248 if (prevHandler !== undefined && prevHandler[type] !== undefined) { 249 var data = prevHandler[type]; 250 $(document).off(data.event, data.selector); 251 } 252 if (prevHandler === undefined) { 253 gridEventHandlers[id] = {}; 254 } 255 $(document).on(event, selector, callback); 256 gridEventHandlers[id][type] = {event: event, selector: selector}; 257 } 258})(window.jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.