123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- /**
- * @license Copyright (c) 2014-2018, Oleg Kiriljuk, oleg.kiriljuk@ok-soft-gmbh.com
- * Dual licensed under the MIT and GPL licenses
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl-2.0.html
- * Date: 2014-11-13, 2015-04-06
- * see https://github.com/tonytomov/jqGrid/issues/650 for more details
- */
- /*global jQuery, define, module, require */
- (function (global, factory) {
- "use strict";
- if (typeof define === "function" && define.amd) {
- // AMD. Register as an anonymous module.
- define([
- "jquery",
- "./jquery.contextmenu-ui",
- "free-jqgrid/grid.base"
- ], function ($) {
- return factory($, global, global.document);
- });
- } else if (typeof module === "object" && module.exports) {
- // Node/CommonJS
- module.exports = function (root, $) {
- if ($ === undefined) {
- // require("jquery") returns a factory that requires window to
- // build a jQuery instance, we normalize how we use modules
- // that require this pattern but the window provided is a noop
- // if it's defined (how jquery works)
- $ = typeof window !== "undefined" ?
- require("jquery") :
- require("jquery")(root || window);
- }
- require("./jquery.contextmenu-ui");
- require("free-jqgrid/grid.base");
- factory($, root, root.document);
- return $;
- };
- } else {
- // Browser globals
- factory(jQuery, global, global.document);
- }
- }(typeof window !== "undefined" ? window : this, function ($, window, document) {
- "use strict";
- $.jgrid = $.jgrid || {};
- $.extend($.jgrid, {
- // define default options of showHideColumnMenu plugin
- showHideColumnMenu: {
- adjustGridWidth: true,
- viewHideDlgColumnsAsDisabled: false,
- allowHideInernalColumns: false,
- shrink: false,
- menuStyle: { "float": "left" },
- modifyMenuItem: function ($li, cm, options) {
- if ($.inArray(cm.name, ["rn", "subgrid", "cb"]) >= 0) { // skip predefined columns
- if (!options.allowHideInernalColumns) {
- $li.hide();
- }
- return;
- }
- if (!cm.hidedlg) {
- return;
- }
- if (options.viewHideDlgColumnsAsDisabled) {
- $li.addClass("ui-state-disabled");
- } else {
- $li.hide();
- }
- }
- }
- });
- /*jslint continue: true, eqeq: true, unparam: true, plusplus: true */
- $.jgrid.extend({
- showHideColumnMenu: function (opt) {
- var options = $.extend(true, {}, $.jgrid.showHideColumnMenu, opt),
- versionParts = $.ui != null && typeof $.ui.version === "string" ? /^([0-9]+)\.([0-9]+)\.([0-9]+)$/.exec($.ui.version) : [],
- isAncorRequired = versionParts != null && versionParts.length === 4 && versionParts[1] === "1" && versionParts[2] < 11;
- return this.each(function () {
- var $self = $(this),
- bindContextMenu = function () {
- $(this.grid.hDiv).find(".ui-jqgrid-labels").contextmenu(function (e) {
- var p = $self.jqGrid("getGridParam"), colModel = p.colModel, colNames = p.colNames, iCol, nCol = colModel.length, cm, $li,
- gh = p.groupHeader, iColByName = {}, colHeader = {}, i, j, l, ghItem,
- $menu = $("<ul class='ui-jqgrid-showHideColumnMenu'></ul>");
- // first fill the helper map which get iCol by the column name
- for (iCol = 0; iCol < nCol; iCol++) {
- iColByName[colModel[iCol].name] = iCol;
- }
- // fill colHeader for columns which have column header
- if (gh != null && gh.groupHeaders != null) {
- for (i = 0, l = gh.groupHeaders.length; i < l; i++) {
- ghItem = gh.groupHeaders[i];
- for (j = 0; j < ghItem.numberOfColumns; j++) {
- iCol = iColByName[ghItem.startColumnName] + j;
- cm = colModel[iCol];
- colHeader[iCol] = $.isFunction(options.buildItemText) ?
- options.buildItemText.call($self[0], {
- iCol: iCol,
- cm: cm,
- cmName: cm.name,
- colName: colNames[iCol],
- groupTitleText: ghItem.titleText
- }) :
- $.jgrid.stripHtml(ghItem.titleText) + ": " +
- $.jgrid.stripHtml(colNames[iCol] === "" ? cm.name : colNames[iCol]);
- }
- }
- }
- // fill colHeader for all other columns
- for (iCol = 0; iCol < nCol; iCol++) {
- if (colHeader[iCol] === undefined) {
- cm = colModel[iCol];
- colHeader[iCol] = $.isFunction(options.buildItemText) ?
- options.buildItemText.call($self[0], {
- iCol: iCol,
- cm: cm,
- cmName: cm.name,
- colName: colNames[iCol],
- groupTitleText: null
- }) :
- $.jgrid.stripHtml(colNames[iCol]);
- }
- }
- // fill the menu items now
- for (iCol = 0; iCol < nCol; iCol++) {
- cm = colModel[iCol];
- $li = $("<li></li>")
- .data("iCol", iCol)
- .html(colHeader[iCol]);
- options.modifyMenuItem.call($self[0], $li, cm, options);
- $li.prepend(cm.hidden ? options.checkboxUnChecked : options.checkboxChecked);
- if (isAncorRequired) {
- $li.wrapInner("<a></a>");
- }
- $li.appendTo($menu);
- }
- $menu.css(options.menuStyle);
- $("ul.ui-jqgrid-showHideColumnMenu").menu("destroy").remove(); // remove menu if any exist
- $menu.appendTo("body")
- .menu({
- select: function (event, ui) {
- var index = parseInt(ui.item.data("iCol"), 10), $cb = ui.item.find(options.checkboxSelector),
- cmi = colModel[index],
- toHide = options.isChecked.call($self[0], $cb, event, cmi);
- if (!isNaN(index) && index >= 0 && cmi != null && $cb.length > 0) {
- if (toHide) {
- options.toUnCheck.call($self[0], $cb, event, cmi);
- $self.jqGrid("hideCol", cmi.name);
- } else {
- options.toCheck.call($self[0], $cb, event, cmi);
- $self.jqGrid("showCol", cmi.name);
- }
- $(this).parent().css("zoom", 1); // fix visibility in IE
- $menu.menu("focus", event, ui.item);
- }
- },
- create: function () {
- var mHeight = $menu.height(),
- wHeight = window.innerHeight || document.documentElement.clientHeight;
- if (mHeight > wHeight) {
- $menu.height(wHeight).css("overflow-y", "scroll");
- }
- }
- })
- .mouseleave(function () {
- $(this).menu("destroy").remove();
- })
- .position({
- of: $(e.target),
- my: "left top",
- at: "right center",
- collision: "flipfit flipfit"
- });
- return false; // prevent creating of the standard context menu of web browser
- });
- };
- options = $.extend(true,
- (this.p.iconSet === "fontAwesome" || options.iconSet === "fontAwesome") ? {
- checkboxChecked: "<i class=\"fa fa-check-square-o fa-fw fa-lg\"></i> ",
- checkboxUnChecked: "<i class=\"fa fa-square-o fa-fw fa-lg\"></i> ",
- checkboxSelector: "i.fa",
- isChecked: function ($checkbox) { return $checkbox.hasClass("fa-check-square-o"); },
- toCheck: function ($checkbox) { $checkbox.removeClass("fa-square-o").addClass("fa-check-square-o"); },
- toUnCheck: function ($checkbox) { $checkbox.removeClass("fa-check-square-o").addClass("fa-square-o"); }
- } : {
- checkboxChecked: "<input disabled=\"disabled\" checked=\"checked\" type=\"checkbox\"/>",
- checkboxUnChecked: "<input disabled=\"disabled\" type=\"checkbox\"/>",
- checkboxSelector: "input[type=checkbox]",
- isChecked: function ($checkbox) { return $checkbox.is(":checked"); },
- toCheck: function ($checkbox) { $checkbox.prop("checked", true); },
- toUnCheck: function ($checkbox) { $checkbox.prop("checked", false); }
- },
- options);
- bindContextMenu.call(this);
- $self.bind("jqGridAfterSetGroupHeaders", function () {
- bindContextMenu.call(this);
- });
- });
- }
- });
- }));
|