All Downloads are FREE. Search and download functionalities are using the official Maven repository.

assets.lib.SlickGrid.plugins.slick.headerbuttons.js Maven / Gradle / Ivy

The newest version!
(function ($) {
  // register namespace
  $.extend(true, window, {
    "Slick": {
      "Plugins": {
        "HeaderButtons": HeaderButtons
      }
    }
  });


  /***
   * A plugin to add custom buttons to column headers.
   *
   * USAGE:
   *
   * Add the plugin .js & .css files and register it with the grid.
   *
   * To specify a custom button in a column header, extend the column definition like so:
   *
   *   var columns = [
   *     {
   *       id: 'myColumn',
   *       name: 'My column',
   *
   *       // This is the relevant part
   *       header: {
   *          buttons: [
   *              {
   *                // button options
   *              },
   *              {
   *                // button options
   *              }
   *          ]
   *       }
   *     }
   *   ];
   *
   * Available button options:
   *    cssClass:     CSS class to add to the button.
   *    image:        Relative button image path.
   *    tooltip:      Button tooltip.
   *    showOnHover:  Only show the button on hover.
   *    handler:      Button click handler.
   *    command:      A command identifier to be passed to the onCommand event handlers.
   *
   * The plugin exposes the following events:
   *    onCommand:    Fired on button click for buttons with 'command' specified.
   *        Event args:
   *            grid:     Reference to the grid.
   *            column:   Column definition.
   *            command:  Button command identified.
   *            button:   Button options.  Note that you can change the button options in your
   *                      event handler, and the column header will be automatically updated to
   *                      reflect them.  This is useful if you want to implement something like a
   *                      toggle button.
   *
   *
   * @param options {Object} Options:
   *    buttonCssClass:   a CSS class to use for buttons (default 'slick-header-button')
   * @class Slick.Plugins.HeaderButtons
   * @constructor
   */
  function HeaderButtons(options) {
    var _grid;
    var _self = this;
    var _handler = new Slick.EventHandler();
    var _defaults = {
      buttonCssClass: "slick-header-button"
    };


    function init(grid) {
      options = $.extend(true, {}, _defaults, options);
      _grid = grid;
      _handler
        .subscribe(_grid.onHeaderCellRendered, handleHeaderCellRendered)
        .subscribe(_grid.onBeforeHeaderCellDestroy, handleBeforeHeaderCellDestroy);

      // Force the grid to re-render the header now that the events are hooked up.
      _grid.setColumns(_grid.getColumns());
    }


    function destroy() {
      _handler.unsubscribeAll();
    }


    function handleHeaderCellRendered(e, args) {
      var column = args.column;

      if (column.header && column.header.buttons) {
        // Append buttons in reverse order since they are floated to the right.
        var i = column.header.buttons.length;
        while (i--) {
          var button = column.header.buttons[i];
          var btn = $("
") .addClass(options.buttonCssClass) .data("column", column) .data("button", button); if (button.showOnHover) { btn.addClass("slick-header-button-hidden"); } if (button.image) { btn.css("backgroundImage", "url(" + button.image + ")"); } if (button.cssClass) { btn.addClass(button.cssClass); } if (button.tooltip) { btn.attr("title", button.tooltip); } if (button.command) { btn.data("command", button.command); } if (button.handler) { btn.bind("click", button.handler); } btn .bind("click", handleButtonClick) .appendTo(args.node); } } } function handleBeforeHeaderCellDestroy(e, args) { var column = args.column; if (column.header && column.header.buttons) { // Removing buttons via jQuery will also clean up any event handlers and data. // NOTE: If you attach event handlers directly or using a different framework, // you must also clean them up here to avoid memory leaks. $(args.node).find("." + options.buttonCssClass).remove(); } } function handleButtonClick(e) { var command = $(this).data("command"); var columnDef = $(this).data("column"); var button = $(this).data("button"); if (command != null) { _self.onCommand.notify({ "grid": _grid, "column": columnDef, "command": command, "button": button }, e, _self); // Update the header in case the user updated the button definition in the handler. _grid.updateColumnHeader(columnDef.id); } // Stop propagation so that it doesn't register as a header click event. e.preventDefault(); e.stopPropagation(); } $.extend(this, { "init": init, "destroy": destroy, "onCommand": new Slick.Event() }); } })(jQuery);




© 2015 - 2024 Weber Informatics LLC | Privacy Policy