1

When we select multiple filter options in React Data Grid, the column headers are getting messed up. Is there a way to fix this issue so that the selected filter options appear above a line in a dropdown instead of getting added to column header. The column header size is growing as new filter keys get added to the list.

Reference: https://github.com/adazzle/react-data-grid/issues/885

```

import React from 'react';

var ExecutionEnvironment = require('exenv');

if (ExecutionEnvironment.canUseDOM) {
  var ReactDataGrid = require('react-data-grid');
  var { Toolbar, Filters: { NumericFilter, AutoCompleteFilter, MultiSelectFilter, SingleSelectFilter }, Data: { Selectors } } = require('react-data-grid-addons');
}

export default class ReactGrid extends React.Component {
  constructor(props, context) {
    const { Toolbar, Filters: { NumericFilter, AutoCompleteFilter, MultiSelectFilter, SingleSelectFilter }, Data: { Selectors } } = require('react-data-grid-addons');
    super(props, context);

    this._columns = [
      {
        key: 'prd_family_name',
        name: 'Product Family Name',
        width: 190,
        filterable: true,
        filterRenderer: MultiSelectFilter,
        sortable: true
      },
      {
        key: 'prd_family_mkt',
        name: 'Market',
        width: 70,
        filterable: true,
        filterRenderer: AutoCompleteFilter,
        sortable: true
      }
    ];
    console.log(`gridvalue${this.props.gridValues}`);
    this.state = { filters: {} };
  }

  componentWillReceiveProps(nextProps) {
    this.setState({ rows: nextProps.gridValues });
  }

  getRandomDate = (start, end) => new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())).toLocaleDateString();

  rowGetter = index => Selectors.getRows(this.state)[index];

  rowsCount = () => Selectors.getRows(this.state).length;

  handleFilterChange = (filter) => {
    const newFilters = Object.assign({}, this.state.filters);
    if (filter.filterTerm) {
      newFilters[filter.column.key] = filter;
    } else {
      delete newFilters[filter.column.key];
    }
    this.setState({ filters: newFilters });
  };

  getValidFilterValues = (columnId) => {
    const values = this.state.rows.map(r => r[columnId]);
    return values.filter((item, i, a) => i === a.indexOf(item));
  };

  handleOnClearFilters = () => {
    this.setState({ filters: {} });
  };

  handleGridSort = (sortColumn, sortDirection) => {
    const comparer = (a, b) => {
      if (sortDirection === 'ASC') {
        return (a[sortColumn] > b[sortColumn]) ? 1 : -1;
      } else if (sortDirection === 'DESC') {
        return (a[sortColumn] < b[sortColumn]) ? 1 : -1;
      }
    };

    const rows = sortDirection === 'NONE' ? this.state.originalRows.slice(0) : this.state.rows.sort(comparer);

    this.setState({ rows });
  };

  render() {
    return (
      <ReactDataGrid
        enableCellSelect
        columns={this._columns}
        rowGetter={this.rowGetter}
        rowsCount={this.rowsCount()}
        onGridSort={this.handleGridSort}
        minHeight={450}
        toolbar={<Toolbar enableFilter />}
        onAddFilter={this.handleFilterChange}
        getValidFilterValues={this.getValidFilterValues}
        onClearFilters={this.handleOnClearFilters}
      />);
  }
}

```

The above piece of code is being used for rendering the data grid.

enter image description here

Rakesh Nallam
  • 235
  • 2
  • 6
  • 17
  • Please provide some code that can recreate this issue, beyond github links, as that doesn't provide much context (and can change over time). https://stackoverflow.com/help/mcve – Matt Fletcher Nov 29 '17 at 21:14

1 Answers1

3

I saw the exact same issue. I've sorted a bunch of CSS that breaks the filter selects out of the header when you mouse over.

Filter on mouse over

When you mouse out, it goes back to horizontal layout with the overflow clipped. Not 100% perfect, but it seems to do the job quite well for me.

You'll need to adjust a few values in the CSS to work with your font / sizes, but that should be trivial.

.react-grid-Container
{
  font-size : 10px;
  font-family: Roboto Mono, sans-serif;
}

div.react-grid-HeaderCell .input-sm {
    height: 30px;
    padding: 5px 10px;
    font-size: 12px;
    line-height: 1.5;
    border-radius: 3px;
    max-width : 100%;
    border : 1px solid #ddd;
}

div.react-grid-HeaderCell
{
  font-family: Raleway, sans-serif;
  font-weight: 700;
  font-size: 11px;
}

div.react-grid-HeaderCell:hover
{
  z-index:9999;
  overflow:visible;
}

div.react-grid-HeaderCell:hover input:not(.Select-input)
{
  max-width: 250px;
  width: 250px;
  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}

div.react-grid-HeaderCell div.input-sm
{
  display : none;
}

div.react-grid-HeaderCell:hover .Select div.Select-Value
{
  clear:both;
}

div.react-grid-HeaderCell .Select-control
{
    width: 100%;
}

div.react-grid-HeaderCell:hover .Select .Select-control,
div.react-grid-HeaderCell:hover .Select .Select-menu-outer
{
    width: max-content;
    min-width: 250px;
    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}

div.react-grid-HeaderCell:hover .Select .Select-control .Select-value
{
    float: left;
    clear: left;
    margin-right : 20px;
}

div.react-grid-HeaderCell:hover .Select .Select-multi-value-wrapper
{
    padding : 5px;
    padding-top : 40px;
}

div.react-grid-HeaderCell:hover .Select div.Select-input
{
    position : absolute;
    left : 0;
    width:max-content;
    min-width : 220px;
    margin-top : -35px;
    margin-right : 20px;
    border : 1px solid #ddd;
    padding-right: 5px;
}

div.react-grid-HeaderCell:hover .Select--multi .Select-arrow-zone,
div.react-grid-HeaderCell:hover .Select--multi .Select-clear-zone
{
    margin-left: 5px;
    position : absolute;
}

div.react-grid-HeaderCell:hover .Select--multi .Select-arrow-zone
{
  right : -3px;
  top : 7px;
}

div.react-grid-HeaderCell:hover .Select--multi .Select-clear-zone
{
  right : 3px;
  bottom : 3px;
}

div.react-grid-HeaderCell:hover .Select--multi .Select-control .Select-value
{
  max-height : 22px;
}
Ian Bale
  • 191
  • 9