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