Code Monkey home page Code Monkey logo

reactdatagrid's Introduction


Table of Contents

Purpose

We've set out to build the best React Data Grid written specifically with React in mind.

Problem

We know other solutions exist out there, but we find they have one or multiple of the following problems:

  • are just thin wrappers around React - more like an after-thought;
  • are too bloated;
  • are not extensible and easy to use;
  • don't have enterprise-grade features;
  • lack of documentation.

Solution

We've poured our soul into ReactDataGrid and built it from scratch with React in mind.

There are 2 editions of the ReactDataGrid that we're releasing:

  • Community Edition - includes the core functionality most people actually use in their products (MIT License);
  • Enterprise Edition - includes advanced functionality, especially targeted for enterprise apps (Commercial License).

Both editions of the ReactDataGrid are published and available in the public npm registry.

Installation & Getting Started

ReactDataGrid is distributed via npm. So getting started is as easy as:

$ npm install @inovua/reactdatagrid-community --save

or if you want to evaluate the Enterprise Edition

$ npm install @inovua/reactdatagrid-enterprise --save

See the documentation getting started page for more details.

TypeScript support

ReactDataGrid ships with TypeScript definition files, so it's fully integrated with your preferred editor to help with autocompletion and type-safety.

Features

ReactDataGrid is packed with all the functionality you would expect from an enterprise-grade grid.

As stated before, the ReactDataGrid is built with React in mind, so it supports popular patterns in the React world: controlled/uncontrolled props, render props, built with immutability from the ground up etc.

Here's a list of the features that we support for each edition:

Community Edition features

Enterprise Edition features

Besides the above, there's a lot more backed into the ReactDataGrid, so make sure you explore our documentation.

Evaluating and using the Enterprise Edition

The Enterprise Edition is a commercial product and it requires a commercial license - please visit the pricing page for more details. Once you buy a license, we'll provide you a license key, so you can start using the ReactDataGrid Enterprise Edition in your apps.

You are free to evaluate the Enterprise Edition of the ReactDataGrid even without a license key - all the features are available and ready to use, but a license notice will be displayed initially for a few seconds. If you want to remove that, you can contact us and we'll send you an evaluation license key which you can use for 30 days.

Please note you are not allowed to integrate the Enterprise Edition of the ReactDataGrid into end products or use it for any commercial, productive or training purpose without a valid commercial license. Read EULA for more details.

After you purchase and receive your commercial license key, you have to set it in the licenseKey prop then you can start using the ReactDataGrid in development and production.

import ReactDataGrid from '@inovua/reactdatagrid-enterprise';
import '@inovua/reactdatagrid-enterprise/index.css';

<ReactDataGrid licenseKey="..." />;

Even without a license key, all features are unlocked so you can evaluate the ReactDataGrid and decide whether you need the Community Edition or the Enterprise Edition.

Documentation

We're heavily invested into our documentation - it ships with full working examples and a live editor. Each prop ReactDataGrid supports has it's own description and usage example.

Additionally, each feature is clearly presented and has a dedicated page that explains the feature and shows examples of real-life usage. See for example sorting, filtering, grouping etc.

Examples

import React from 'react';
import ReactDataGrid from '@inovua/reactdatagrid-enterprise';
import '@inovua/reactdatagrid-enterprise/index.css';

const columns = [
  { name: 'name', header: 'Name', minWidth: 50, defaultFlex: 2 },
  { name: 'age', header: 'Age', maxWidth: 1000, defaultFlex: 1 },
];

const gridStyle = { minHeight: 550 };

const dataSource = [
  { id: 1, name: 'John McQueen', age: 35 },
  { id: 2, name: 'Mary Stones', age: 25 },
  { id: 3, name: 'Robert Fil', age: 27 },
  { id: 4, name: 'Roger Robson', age: 81 },
  { id: 5, name: 'Billary Konwik', age: 18 },
  { id: 6, name: 'Bob Martin', age: 18 },
  { id: 7, name: 'Matthew Richardson', age: 54 },
  { id: 8, name: 'Ritchie Peterson', age: 54 },
  { id: 9, name: 'Bryan Martin', age: 40 },
  { id: 10, name: 'Mark Martin', age: 44 },
  { id: 11, name: 'Michelle Sebastian', age: 24 },
  { id: 12, name: 'Michelle Sullivan', age: 61 },
  { id: 13, name: 'Jordan Bike', age: 16 },
  { id: 14, name: 'Nelson Ford', age: 34 },
  { id: 15, name: 'Tim Cheap', age: 3 },
  { id: 16, name: 'Robert Carlson', age: 31 },
  { id: 17, name: 'Johny Perterson', age: 40 },
];

export default () => (
  <ReactDataGrid
    idProperty="id"
    columns={columns}
    dataSource={dataSource}
    style={gridStyle}
  />
);

Our documentation contains hundreds of running examples, so please make sure you check that out.

Client stories

It’s already been used by thousands of users in business-critical apps, so you can trust it from the get-go. Our clients are building their apps with the ReactDataGrid at the core of their products.

With the help of the ReactDataGrid, provided by Inovua Trading S.R.L., we have been able to offer our customers the perfect support for state-of-the-art data management in our fleet management solution WEBFLEET.

--Thomas Boehm, Senior Engineering Manager at Webfleet Solutions, a Bridgestone Company


Enterprise-grade Datagrid component with outstanding feature coverage and second-to-none performance made it a straightforward decision to include it in our cloud-centric on-demand solutions.

--Yuri Genin, Lead UI Architect at PROS

License

Community Edition - MIT License

Enterprise Edition - Commercial License

reactdatagrid's People

Contributors

inovua-admin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

reactdatagrid's Issues

Improve sorting when there are grouped columns

  • what edition are you using - enterprise (paying customer)

  • version for @inovua/reactdatagrid-communityor @inovua/reactdatagrid-enterprise - 4.0.16

What you did:
implemented a grid with column grouping, groupColumn={true} and sorting:

image

Then I sorted by the "enlisted" column:

image

What happened:

As you can see above, russia should be first in order since the value for that row is 3, higher than two (usa).

Reproduction repository:
https://codesandbox.io/s/laughing-euler-l8vhi?file=/src/App.js

Problem description:
This looks like a bug. Our users are trying to sort columns when there are other columns grouped, and they don't understand why it doesn't work properly.

Suggested solution:
in "group mode" (when there are other columns grouped) sorting a column should also sort the grid by group level. In my second screenshot for example, russia would appear above usa.

in code, I'd do something like this (following the example in the sandbox posted above):

const columns = [
{ ..., sortGroupBy: ({ data }) => data.array.reduce((acc, item) => acc + item, 0) }
]

data would be the same as in columns.render.

That's the simplest most intuitive API I could think of. I'm sure there are other ways to implement this, but ATM it looks and behaves like a bug, and it's a must for us and our clients. Thanks.

virtual row list shrinks when component scaled

  • what edition are you using - community
  • version 4.0.22

Relevant code or config

What you did:
applied transform: "scale(0.8)" via grid style property

What happened:
virtual row list shrinked, not filling the entire component height anymore as can be seen in the codesandbox below

Reproduction repository:
https://codesandbox.io/s/pensive-wu-87czv

Problem description:

Component should adapt to the scaling properly.

Context: I came across this issue when integrating the component into Powerapps canvas app via PCF framework - while having Powerapps "Scale to fit" option ON, which is applying the scaling.

Suggested solution:
fix the virtual list CSS?

It is not possible to clear all checked item by the header

  • what edition are you using - community
  • version for @inovua/reactdatagrid-community version 4.0.11

What you did:
On a list with "checkboxColumn":
I clicked on "check all". Then all item were checked.
I clicked on "Clear Check All". Then nothing happen.

What happened:
All the item were supposed to be unchecked but nothing happen.

2020-11-22-20-44-03

Reproduction repository:
This can be reproduce with the exemple at "Multiple selection with checkbox column". On your docs page (https://reactdatagrid.io/docs/row-selection).

But it works with the exemple "Multiple checkbox section. DataSource + grouping + sorting + pagination - all performed remotely"

Problem description:
Usually when an item is checked, the icon of the header should change to
2020-11-22 20_27_23-Row selection _ Docs and API Reference _ ReactDataGrid by Inovua et 1 page suppl
But it doesn't.

Also when all item are checked the icon should be
2020-11-22 20_27_33-Row selection _ Docs and API Reference _ ReactDataGrid by Inovua et 1 page suppl
But it doesn't.

Suggested solution:
Fix it.

"Select all" checkbox shows selected rows only from the current page

community 4.0.22

What you did:
set up grid with checkbox column and pagination, then clicked on "select/deselect all" toggle checkbox

What happened/problem description:
grid shows only items of the current page as selected (onSelectionChange also returns only those items)
Expected: show/return all selected rows upon "select all" + this should be only the filtered ones (from my tests, the "Select all" ignores current filter).

Reproduction repository:
https://codesandbox.io/s/inovua-grid-community-selall-bug-9bjgo
STEPS: either select all, or filter and then select all, and you will always get only the current page rows

Suggested solution:

  1. "Select all" should take into account other data pages and the current filter.
  2. grid API should provide a way to get the array of filtered rows.

Text input clear button submits wrapping form

  • what edition are you using - community
  • version for @inovua/reactdatagrid-communityor @inovua/reactdatagrid-enterprise - 4.0.16

Relevant code or config

        key="clearButton"
        className={join(
          `${rootClassName}__clear-button-wrapper`,
          !showButton && `${rootClassName}__clear-button-wrapper--hidden`
        )}
      >
        {this.renderClearButton({
          clearButtonColor,
          clearButtonStyle,
          clearButtonSize,
          ...getClearButtonClassNames(props),
        })}
      </div>

What you did:

My data grid runs in tabs which are wrapped in a form.

What happened:

When I type something in the filter text box and then press the clear button it bubbles up to the form and submits it.

image

Problem description:

Button clicks should not be bubbling and submitting parent elements.

Suggested solution:

Add a stop propagation or at minimum designate the button as type = button so it doesn't get interpreted as a submit button.

Grid cells lost position on paging back from the last page and end of the scroll

There is an issue when the table has greater than 14 columns and If scrolling all the way to the left (end of table/last column) and also paging to the last page.
If the last page has less than rows of default limit rows and then paging back the table cells lost their position and the position is back only when scrolling a side.

I have checked into the developer tools those cells style left property is set to 0.

Please look into the attachments
paging back

DateInput loses focus when clock input clicked

  • what edition are you using - community
  • version for @inovua/reactdatagrid-community - 4.0.29

Relevant code or config

export const DateField = () => {

    return (
        <DateInput theme={"default-dark"} dateFormat="DD/MM/YY HH:mm:ss" showClock={true}>
            <Calendar okButtonText="Select..." cancelButtonText="Close..." showClock={true}/>
        </DateInput>
    );
}

What you did:
Tried DateInput example with showClock true.

What happened:
Picker focus lost when clicked on clock input.

Reproduction repository:
https://codesandbox.io/s/reactdatagrid-dateinput-h0r5i?file=/src/styles.css

Problem description:
DateInput with clock loses focus on clock input click.

Suggested solution:
DateInput controls this.pickerView.isTimeInputFocused (MonthView) but this method implemented in picker's itself (Calendar).

this.pickerView should be replaced with this.picker in the following methods in Calendar/src/DateInput/index.js:
onFieldBlur(event),
isTimeInputFocused()

MultiSelect doesn't work on click in latest chrome version

Using the latest Chrome version 89.0.4389.90 on Mac or windows, the Row selection/multiselection doesn't work anymore.
The workaround is to use the Checkbox https://reactdatagrid.io/docs/row-selection#multiple-selection-with-checkbox-column but it is not user friendly anymore

Same table worked with older version of chrome or other browsers.

  • what edition are you using - community
  • version for @inovua/reactdatagrid-community - 4.0.27

Relevant code or config
Reproducible also in the demo page below
https://reactdatagrid.io/docs/row-selection#multiple-row-selection

import React, { useState, useCallback } from 'react'

import ReactDataGrid from '@inovua/reactdatagrid-enterprise'
import '@inovua/reactdatagrid-enterprise/index.css'

import people from './people'
import flags from './flags'

const gridStyle = { minHeight: 550 };

const columns = [
  { name: 'id', header: 'Id', defaultVisible: false, defaultWidth: 60, type: 'number' },
  { name: 'name', header: 'Name', defaultFlex: 1 },
  { name: 'country', header: 'Country', defaultFlex: 1,
    render: ({ value })=> flags[value]? flags[value] : value
  },
  { name: 'city', header: 'City', defaultFlex: 1 },
  { name: 'age', header: 'Age', defaultFlex: 1, type: 'number' }
];

const App = () => {
  const [selected, setSelected] = useState(null);

  const onSelectionChange = useCallback(({ selected: selectedMap, data }) => {
    const newSelected = Object.keys(selectedMap).map(id => id * 1)

    setSelected(newSelected);
  }, [])

  return (
    <div>
      <h3>Multiple row selection - uncontrolled</h3>
      <ReactDataGrid
        idProperty="id"
        enableSelection
        multiSelect
        onSelectionChange={onSelectionChange}
        style={gridStyle}
        columns={columns}
        dataSource={people}
      />
      <p>
        Selected rows: {selected == null ? 'none' : JSON.stringify(selected)}.
      </p>
    </div>
  );
}

export default () => <App />

What you did:
Trying to click on the row itself. Expecting that the row is marked as selected

What happened:
Clicked row is not marked as selected and it is not displayed in the output "Selected Rows: none"

Problem description:

The only way to select a row is using checkbox, which become painful for multiple rows which in the past can be selected holding the Shift key

Multi Select Filter tag remove problem when datasource id=0|false|null

  • what edition are you using - community
  • version for @inovua/reactdatagrid-community - 4.0.20

Relevant code or config

What you did:
Selected both "YES" and "NO" filters in Enlisted column.
Clicked clear button inside "NO" tag.

What happened:
Nothing changed.

Reproduction repository:

https://codesandbox.io/s/reactdatagrid-12viw

Problem description:

id values of 0,false,null etc. can not be removed with tag's clear button when multi selection enabled.

Suggested solution:

In Combobox.js -> updateValueMap function
line can be changed:
id: this.getIdProperty(item) || item --> id: this.getIdProperty(item),

Row selection is not always applied

  • what edition are you using - community (But the problem seems to happen on both version)
  • version for both

Relevant code or config

What you did:
Just click on a list with the option enableSelection enabled

What happened:
The border is always applied on the last clicked row but the row background is not always applied

Reproduction repository:
You can easily reproduce the problem with example provided on the page https://reactdatagrid.io/docs/row-selection.
The probleme is also happening in the community version.

ezgif com-gif-maker

Problem description:
onSelectionChange callback is not always called. This causes that the last clicked cell is not always selected.

Suggested solution:
The selected row style must be applied.

checkboxColumn behavior is strange

  • what edition are you using - community
  • version for @inovua/reactdatagrid-community 4.0.11

What you did:
On a datagrid with checkboxColumn enabled.
Click on the row, then the item is selected.
Click on another row, the item is selected but the first item is unchecked.
Click on the current checked row, then nothing happen.

What happened:
2020-11-22-20-58-14

Reproduction repository:
This can be reproduce with the exemple at "Multiple selection with checkbox column". On your docs page (https://reactdatagrid.io/docs/row-selection).

Problem description:
The behavior is not what we are used to see.
But if we click directly on the checkbox it works correctly.

Loosing all checked row but clicking on another row can be disturbing.

But we can we can override the behavior with selected and onSelectionChange.

Suggested solution:

  • Keep check status when you click on another item.
  • Remove check status when you click on the row of an item checked

Custom search remote data

❓ Questions:
I try to create a custom search with remote data.
How do I re-render the grid to pull data from the server?

Thanks,

[bug] selected/onSelectChanged breaks when selected value passed in is `undefined`

Hello, after I pass in undefined as a value of selected prop, selecting a row no longer works. null works fine. Considering that the default value for this prop is undefined per doc, I would assume that it should also work.

Below is a code snippet using code editor on https://reactdatagrid.io/ and the behavior can be replicated by pressing the button first and then clicking on different rows.

import React, { useState, useCallback } from 'react'
import ReactDataGrid from '@inovua/reactdatagrid-enterprise'
import '@inovua/reactdatagrid-enterprise/index.css'

import people from './people'
import flags from './flags'

const gridStyle = { minHeight: 550 }

const columns = [
  { name: 'id', defaultWidth: 60, header: 'Id', defaultVisible: false },
  { name: 'name', defaultFlex: 1, header: 'Name' },
  { name: 'country', defaultFlex: 1, header: 'Country',
    render: ({ value }) => flags[value] ? flags[value] : value
  },
  { name: 'age', type: 'number', defaultFlex: 1, header: 'Age' },
  { name: 'email', header: 'Email', defaultFlex: 1 }
]

const App = () => {
  const [selected, setSelected] = useState('1');

  const onSelectionChange = useCallback(({ selected }) => {
    console.log('selected', selected);
    setSelected(selected)
  }, [])

  return (
    <div>
      <p>
        Selected rows: {selected == undefined ? 'none' : selected}.
      </p>
      <button onClick={() => { setSelected(undefined) }}>change selection</button>
      <ReactDataGrid
        idProperty="id"
        selected={selected}
        onSelectionChange={onSelectionChange}
        style={gridStyle}
        columns={columns}
        dataSource={people}
      />
    </div>
  );
}

export default () => <App />

collapsing all groups and then opening a top level group will open all children groups.

  • what edition are you using - enterprise
  • version for @inovua/reactdatagrid-communityor @inovua/reactdatagrid-enterprise - 4.0.16

What you did:
called collapseAllGroups and then opened a top level group

What happened:
All children groups were opened as well.
image

Reproduction repository:
https://codesandbox.io/s/throbbing-fire-jjc6g?file=/src/App.js

Problem description:
This only happens when calling collapseAllGroups and then drilling down. Closing groups manually and then reopening them does not produce this behavior.

Makes the grid harder to navigate. when I drill down a group, I'm only interested in the next level of drill, not all the way down for all the subgroups. We use it for initial display. We have customers with 8 levels of drill down, and they start the view with only seeing the top level group, click one to expand, and bam, all the way down to level 8.

Suggested solution:
whatever happens behind the scenes when manually closing all groups, make the same happen when calling collapseAllGroups.

Last column Date Filter : Calendar is truncated

Edition `@inovua/reactdatagrid-community

Relevant code or config

just take an example with a date filter column

What you did:
Put the date column at the end of the grid
The grid fill the body space.

What happened:

The calendar is hidden

image

Support for paginated grouped data

  • what edition are you using - enterprise (for evaluation)
  • version - 4.0.20

Looking at the demos and docs, it seems like server-side grouping always expects the full data set. Would it be possible to have each group be paginated and potentially use something like the pagination toolbar, infinite scrolling, or a custom "Load More..." button solution in order to load the next page of data for a specific group?

The only way I see of doing this now is by hijacking the summary row and render a load more button or something to fetch the next set of data for that group and then update the datasource accordingly. The only issue with that is that this UX will be contained to a single column and not the entire bottom row which isn't ideal.

[Bug] Unable to expand row when toggling `renderRowDetails` from undefined to function

We currently have an external button that handles whether the table should show row details and what the details component should be. When the initial value of renderRowDetails is undefined and then gets changed to appropriate render function, expanding a row no longer works. It seems like the computedProps.dataMap doesn't get created since it's undefined.

Reproduction:

  1. Click on Toggle Details
  2. Try to expand one of the rows
  3. You'll see an error in the console
import React, { useState, useCallback } from 'react'

import ReactDataGrid from '@inovua/reactdatagrid-enterprise'
import '@inovua/reactdatagrid-enterprise/index.css'

import Button from '@inovua/reactdatagrid-community/packages/Button'

import people from './people'

const gridStyle = { minHeight: 550 }

const renderRowDetails = ({ data }) => {
  return <div style={{ padding: 20}}>
    <h3>Row details:</h3>
    <table>
      <tbody>
        {Object.keys(data).map((name, i) => {
          return <tr key={i}>
            <td>{name}</td>
            <td>{data[name]}</td>
          </tr>
        })}
      </tbody>
    </table>
  </div>
};

const columns = [
  { name: 'id', header: 'Id', defaultVisible: false, defaultWidth: 80 },
  { name: 'name', header: 'Name', defaultWidth: 120 },
  { name: 'email', header: 'Email', defaultWidth: 120 },
  { name: 'country', header: 'Country', defaultWidth: 120 },
  { name: 'city', header: 'City', defaultWidth: 120 },
  { name: 'age', header: 'Age', type: 'number', defaultWidth: 120 }
];

const App = () => {
  const [showDetails, setShowDetails] = useState(false);

  return (
    <div>
      <div>
         <Button onClick={() => setShowDetails(prev => !prev)}>
          Toggle Details
        </Button>
      </div>

      <ReactDataGrid
        idProperty="id"
        style={gridStyle}
        rowExpandHeight={400}
        renderRowDetails={showDetails ? renderRowDetails : undefined}
        columns={columns}
        dataSource={people}
      />
    </div>
  );
}

export default () => <App />

grouping style is broken in RTL

  • what edition are you using - enterprise
  • version for @inovua/reactdatagrid-communityor @inovua/reactdatagrid-enterprise - 4.0.16

What you did: implemented a grid with grouping in rtl mode

What happened: ui is broken
image

Reproduction repository:
https://codesandbox.io/s/gracious-sun-khueb

Problem description:
UI is broken

Suggested solution:
Fix it :)

Filling datasource from Redux in Remote pagination and remote data mode

I'm using Redux, Redux Saga and Reactdatagrid version 4.0.22. The problem is dataSource prop only supports an array or a promise/function as value. So when I pass an array of data from Redux to dataSource, how can I set the count (total results) to the component?? both the data and pagination are remote.

Date filter does not work if a date format is defined at the column

Tested with the first example at https://reactdatagrid.io/docs/filtering. Open the source code and add a date format for the column "birthDate":

 {
    name: 'birthDate',
    header: 'Bith date',
    defualtFlex: 1,
    minWidth: 200,
    dateFormat: 'MM-DD-YYYY', // This like breaks the date filter logic.
    filterEditor: DateFilter,
    filterEditorProps: (props, { index }) => {
      return {
        dateFormat: 'MM-DD-YYYY',
        cancelButton: false,
        highlightWeekends: false,
        placeholder: index == 1 ? 'Created date is before...': 'Created date is after...'
      }
    },
    render: ({ value, cellProps }) => {
      return moment(value).format('MM-DD-YYYY')
    }
  },

Then select today's date and choose "before".

Expected behavior: Filter returns all records.
Actual behavior: Filter returns no recods.

Aside from the bug I would like to understand why I need to define a date format at column level when it is already defined via dateEditorProps.

It would also be nice if you can add the column level dateFormat property to the type definitions.

Uncaught (in promise) TypeError: window.moment is not a function in filterTypes.js

  • what edition are you using - community
  • version for @inovua/reactdatagrid-community is 4.0.16 -

Error encountered in filterTypes.js (specifically in DateFilters)

Uncaught (in promise) TypeError: window.moment is not a function
    Choo 11
    React 7
    unstable_runWithPriority Choo
    React 4
    unstable_runWithPriority Choo
    React 19
    unstable_runWithPriority Choo
    React 4
    Choo 5
    React 5
[learn more]

Package.json

{
  "name": "client",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@inovua/reactdatagrid-community": "^4.0.16",
    "@testing-library/jest-dom": "^5.11.4",
    "@testing-library/react": "^11.1.0",
    "@testing-library/user-event": "^12.1.10",
    "axios": "^0.21.1",
    "bootstrap": "^4.5.3",
    "moment": "^2.29.1",
    "react": "^17.0.1",
    "react-dom": "^17.0.1",
    "react-moment": "^1.1.1",
    "react-redux": "^7.2.2",
    "react-router-dom": "^5.2.0",
    "react-scripts": "4.0.1",
    "reactstrap": "^8.8.1",
    "redux": "^4.0.5",
    "redux-devtools-extension": "^2.13.8",
    "redux-thunk": "^2.3.0",
    "web-vitals": "^0.2.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "proxy": "http://localhost:5000"
}

I added DateFilter exactly how it is given in the documentation except I used local dataSource instead of remote dataSource. Also, I am using the Community version for my personal project. Component code is given below:

import React from 'react'

import ReactDataGrid from '@inovua/reactdatagrid-community'
import '@inovua/reactdatagrid-community/index.css'

import NumberFilter from '@inovua/reactdatagrid-community/NumberFilter'
import DateFilter from '@inovua/reactdatagrid-community/DateFilter'

const moment = require('moment')
const gridStyle = { minHeight: 600 }

const people = [
    {id: 1, name: "Arpit", age: "22", city: "Lucknow", birthDate: new Date("1990-02-07")},
    {id: 2, name: "Gangwar", age: "21", city: "Bareilly", birthDate: new Date("1996-12-23")},
    {id: 3, name: "Apu", age: "21", city: "Bangalore", birthDate: new Date("1998-01-11")}
]

const filterValue = [
    { name: 'name', operator: 'startsWith', type: 'string', value: '' },
    { name: 'age', operator: 'gte', type: 'number', value: 21 },
    { name: 'city', operator: 'startsWith', type: 'string', value: '' },
    {
      name: 'birthDate',
      operator: 'before',
      type: 'date',
      value: ''
    }
]

const columns = [
    { name: 'id', header: 'Id', defaultVisible: false, defaultWidth: 80, type: 'number' },
    { name: 'name', header: 'Name', defaultFlex: 1 },
    { name: 'age', header: 'Age', defaultFlex: 1, type: 'number', filterEditor: NumberFilter },
    {
      name: 'birthDate',
      header: 'Bith date',
      defualtFlex: 1,
      minWidth: 200,
      filterEditor: DateFilter,
      filterEditorProps: (props, { index }) => {
        // for range and notinrange operators, the index is 1 for the after field
        return {
          dateFormat: 'MM-DD-YYYY',
          cancelButton: false,
          highlightWeekends: false,
          placeholder: index === 1 ? 'Created date is before...': 'Created date is after...'
        }
      },
      render: ({ value, cellProps }) => {
        return moment(value).format('MM-DD-YYYY')
      }
    },
    { name: 'city', header: 'City', defaultFlex: 1 },
]

const ListComponent = () => {
    
    return(
        <div>
            <h3>Grid with default filter value</h3>
        <ReactDataGrid
            idProperty="id"
            style={gridStyle}
            defaultFilterValue={filterValue}
            columns={columns}
            dataSource={people}
        />
        </div>
    )
}

export default ListComponent

What happened:

While using the date filter, If I select a date say "07/12/2020" the following error appears:
Screenshot from 2021-01-01 16-48-38

This error only occurs while using date filter. Rests are just warnings about using StrictMode in react.

Reproduction repository:

Given below is a codesandbox link with the above mentioned components and the dependencies. Please open this link separately.

https://codesandbox.io/s/modest-pare-v5sum?file=/src/ListComponent.js

Just try and use Date filter and you can see the error.

Problem description:

It says Window.moment is not a function. I am using Ubuntu 20.04. This error completely renders the date filter useless and result in the crash of the application. Date filter also does not filters the dates.

Suggested solution:

I think using moment from moment.js instead of window.moment might work but I am not sure. I am hoping to find a solution so please look into it.

onRenderRow props not found.

  • what edition are you using - enterprise
  • version for @inovua/reactdatagrid-enterprise -4.0.22

Relevant code or config
import React from 'react'
import ReactDataGrid from '@inovua/reactdatagrid-enterprise'
import '@inovua/reactdatagrid-enterprise/index.css'

import people from './people'
import flags from './flags'

const gridStyle = { minHeight: 550 }

const onRenderRow = ({ data, style }) => {
const { age } = data
if (age > 30) {
if (age > 35) {
style.color = '#ef9a9a'
} else {
style.color = '#7986cb'
}
}
}

const columns = [
{ name: 'id', header: 'Id', defaultVisible: false, defaultWidth: 80 },
{ name: 'name', header: 'Name', defaultFlex: 1 },
{ name: 'email', header: 'Email', defaultFlex: 1 },
{ name: 'country', header: 'Country', defaultFlex: 1,
render: ({ value }) => flags[value] ? flags[value] : value
},
{ name: 'age', header: 'Age', type: 'number', defaultFlex: 1 }
]

const App = () => {
return (


<div style={{marginBottom: 20}}>
Customized row rendering, computed by age



);
}

export default () =>

What you did:

What happened:
Not found when we try.

Reproduction repository:

Problem description:

Suggested solution:

[Bug] Updating columns and data source dependencies crashes the entire page

Our data source has a dependency on the table columns since it needs to know what data to request but it also has dependencies on other state that gets update via useMemo and useEffect. When the columns and the data source update at the same time, it crashes the entire app.

Reproduction:

Clicking the "Crash!" button should crash the entire page.

import React, { useState, useCallback } from 'react'

import ReactDataGrid from '@inovua/reactdatagrid-enterprise'
import '@inovua/reactdatagrid-enterprise/index.css'

import Button from '@inovua/reactdatagrid-community/packages/Button'
import DATASET_URL from './DATASET_URL'

const gridStyle = { minHeight: 550, marginTop: 10 }
const empty = () => null;

const columns = [
  { name: 'firstName', header: 'First Name', defaultFlex: 2 },
  { name: 'lastName', header: 'Last Name', defaultFlex: 2 },
  { name: 'email', header: 'Email', defaultFlex: 3 }
];

const App = () => {
  const [tableColumns, setTableColumns] = useState([...columns]);
  const [count, setCount] = useState(0);

  const dataSource = useCallback(async () => ({ data: [], count: 0 }), [
    tableColumns,
    count
  ]);

  const reRender = () => {
    setTableColumns([...columns]);

    setTimeout(() => {
      setCount((count) => count + 1);
      setTableColumns([...columns]);
    }, 0);
  };

  return (
    <div>
      <Button onClick={reRender}>Crash!</Button>
      <ReactDataGrid
        idProperty="id"
        style={gridStyle}
        columns={tableColumns}
        pagination
        livePagination
        limit={10}
        dataSource={dataSource}
      />
    </div>
  );
}

export default () => <App />

[Bug] Controlled selected prop doesn't work with string or number value

When a string or number is passed in as selected, the grid does not select the appropriate row. This works if an object with same value is passed in.

We are using @inovua/reactdatagrid-enterprise and it's v4.0.23.

Reproduction

Below code is a modification of code sample on https://reactdatagrid.io/docs/api-reference#props-selected

import React, { useState, useCallback } from 'react'
import ReactDataGrid from '@inovua/reactdatagrid-enterprise'
import '@inovua/reactdatagrid-enterprise/index.css'

import people from './people'
import flags from './flags'

const gridStyle = { minHeight: 550 }

const columns = [
  { name: 'id', defaultWidth: 60, header: 'Id', defaultVisible: false },
  { name: 'name', defaultFlex: 1, header: 'Name' },
  { name: 'country', defaultFlex: 1, header: 'Country',
    render: ({ value }) => flags[value] ? flags[value] : value
  },
  { name: 'age', type: 'number', defaultFlex: 1, header: 'Age' },
  { name: 'email', header: 'Email', defaultFlex: 1 }
]

const App = () => {
  return (
    <div>
      <ReactDataGrid
        idProperty="id"
        multiSelect
        // below will work if passed in { 1: true }
        // also does not work when passed in '1'
        selected={1}
        style={gridStyle}
        columns={columns}
        dataSource={people}
      />
    </div>
  );
}

export default () => <App />

buggy gridRef.visibleColumns

  • what edition are you using - enterprise
  • version for @inovua/reactdatagrid-communityor @inovua/reactdatagrid-enterprise - 4.0.16

What you did: printed gridRef?.current.visibleColumns.length when there were 5 columns

What happened: resulted to 4

image

Reproduction repository:
https://codesandbox.io/s/vibrant-grass-0wvbe?file=/src/App.js:1183-1221

Problem description:
there are two bugs here. the initial column length is 4. when I clear both groupings, it goes to 5, which is correct. Afterwards, if I group by two groupings, and then cancel one, it goes back to 4.

missing typescript definitions for filters

Hey there :)

  • what edition are you using - community
  • version for @inovua/reactdatagrid-community - 4.0.30

What you did:

Using the example code https://github.com/inovua/reactdatagrid/blob/master/examples/pages/filters/select-null.page.tsx in a fresh CRA installation: npx create-react-app reactdatagrid-example --template typescript. Adding reactdatagrid: yarn add @inovua/reactdatagrid-community. Replaced CRA example code with code from your example.

What happened:

I'm evaluating different data grids to use in my company's react typescript applications. When trying to add filters to columns, I encountered missing type definitions. As of your project readme, there should be full Typescript support.

TypeScript error in /home/me/dev/reactdatagrid-example/src/components/MyDataGrid.tsx(3,26):
Could not find a declaration file for module '@inovua/reactdatagrid-community/SelectFilter'. '/home/me/dev/reactdatagrid-example/node_modules/@inovua/reactdatagrid-community/SelectFilter/index.js' implicitly has an 'any' type.
  Try `npm i --save-dev @types/inovua__reactdatagrid-community` if it exists or add a new declaration (.d.ts) file containing `declare module '@inovua/reactdatagrid-community/SelectFilter';`  TS7016

    1 | import React from "react";
    2 | import ReactDataGrid from "@inovua/reactdatagrid-community";
  > 3 | import SelectFilter from "@inovua/reactdatagrid-community/SelectFilter";
      |                          ^
    4 | import NumberFilter from "@inovua/reactdatagrid-community/NumberFilter";
    5 | 
    6 | import filterTypes from "@inovua/reactdatagrid-community/filterTypes";

This issue is the same for the NumberFilter.

Reproduction repository:

Your example repo: https://github.com/inovua/reactdatagrid/blob/master/examples/pages/filters/select-null.page.tsx

Problem description:

Suggested solution:

Add missing TS definitions to the Filters.

onScroll never gets to 0 when scrolling to the top

  • what edition are you using - enterprise
  • version for @inovua/reactdatagrid-communityor @inovua/reactdatagrid-enterprise - 4.0.29

Relevant code or config

const GridScrollDemo: React.FC<TypeComputedProps> = (props) => {
  const [gridRef, setGridRef] = React.useState<TypeComputedProps>();

  const handleGridScroll = React.useCallback(() => {
    console.log('grid', gridRef?.getScrollTop()); // <--- THIS NEVER GETS TO ZERO
  }, [gridRef]);

  const handleOnReady = (
    ref: React.MutableRefObject<TypeComputedProps | null>
  ) => {
    if (ref.current) {
      setGridRef?.(ref.current);
    }

    props.onReady?.(ref);
  };

  return (
    <ReactDataGrid
      {...props}
      onReady={handleOnReady}
      onScroll={handleGridScroll}
    />
  );
};

What you did:

Trying to get the scroll value in order to synchronize scrolling with other components. I've also tried activating "undocumented" feature:

    <ReactDataGrid
      {...props}
      onReady={handleOnReady}
      onScroll={handleGridScroll}
      scrollProps={{
        scrollDebounceDelay: 0
      }}
    />

I'm afraid it could cause other side effects, but I need this in order to synchronize the component scrolling.

Problem description:

Since it never goes to 0, the synchronization is off.

Suggested solution:

Fix the bug to return scroll 0

Controlled data source + server side fetching

  • what edition are you using - enterprise (for evaluation)
  • version - 4.0.20

While trying to get inline editing working with infinite scrolling with a remote data source, I noticed that its not really possible since the data source isn't truly controlled. Since the dataSource must be method that returns the next set of data, I no longer have access to the entire set of rows since the table component keeps that state internally. For inline editing to actually work with server side data fetching, I'd need full control of the entire data set in order to correctly update the data to the new values.

Ideally, the data source API will be split into 2 different props. dataSource which will only be an array, and some sort of getRows prop which would be called whenever the table needed a new set of data.

The table is not redrawing when dataSource change in React.StrictMode

What edition are you using :
Community
Version for @inovua/reactdatagrid-community :
4.0.8

Relevant code or config

import logo from './logo.svg';
import './App.css';

import React from 'react'

import ReactDataGrid from '@inovua/reactdatagrid-community'
import '@inovua/reactdatagrid-community/index.css'
import Button from '@inovua/reactdatagrid-community/packages/Button'

const gridStyle = { minHeight: 550, marginTop: 10 };

const columns = [
  { name: 'id', header: 'Id', defaultVisible: false, type: 'number', maxWidth: 40 },
  { name: 'firstName', header: 'First Name', defaultFlex: 2 },
  { name: 'lastName', header: 'Last Name', defaultFlex: 2 },
  { name: 'email', header: 'Email', defaultFlex: 3 }
];

function App() {
  const [dataSource, setDataSource] = React.useState([]);

  const loadData = () => {
    setDataSource([{ id: 1, firstName: 'test', lastName: "test1", email: '[email protected]' }]);
  }

  return (
    <div>
      <h3>Sort with remote data</h3>
      <div>
        <Button onClick={loadData}>Load async data</Button>
        <Button
          onClick={() => setDataSource([])}
          style={{ marginLeft: 10 }}
        >Clear data</Button>
      </div>

      <ReactDataGrid
        idProperty="id"
        style={gridStyle}
        columns={columns}
        dataSource={dataSource}
      />
    </div>
  );
}

export default App;

What you did:
I load data from an array of object. Initialy the array is empty. When I click on the seach button, the array is filled with 1 results.

What happened:
The table always shows no record.

Reproduction repository:
https://github.com/lavoiekeven/bug-reactdatagird

Problem description:
The table is not refreshed when dataSource change

Suggested solution:
useEffect trigger on dataSource change ?

setGridRef and onReady not working in Typescript

Hello, setGridRef in Typescript gives a weird error when trying to use it with onReady prop.
Here's a sandbox: https://codesandbox.io/s/dry-tree-7surl?file=/src/App.tsx

(JSX attribute) onReady?: ((computedPropsRef: React.MutableRefObject<TypeComputedProps | null>) => void) | undefined
Type 'Dispatch<SetStateAction<null>>' is not assignable to type '(computedPropsRef: MutableRefObject<TypeComputedProps | null>) => void'.
  Types of parameters 'value' and 'computedPropsRef' are incompatible.
    Type 'MutableRefObject<TypeComputedProps | null>' is not assignable to type 'SetStateAction<null>'.
      Type 'MutableRefObject<TypeComputedProps | null>' provides no match for the signature '(prevState: null): null'.ts(2322)
TypeDataGridProps.d.ts(94, 5): The expected type comes from property 'onReady' which is declared here on type 'IntrinsicAttributes & Pick<TypeDataGridProps, "style" | "filterable" | "onReady" | "handle" | "renderInPortal" | "onSkipChange" | ... 160 more ... | "isRowReorderValid"> & Partial<...> & Partial<...>'

Is there any solution to this? or am I doing something wrong...

Missing TS definitions

  • what edition are you using - community
  • version for @inovua/reactdatagrid-community - 4.0.17

Relevant code or config

<ReactDataGrid
      idProperty="id"
      columns={columns}
      dataSource={dataSource}
      onSortInfoChange={handleSort}
      limit={10}
      // @ts-ignore
      onLimitChange={handlePageSize}
      // @ts-ignore
      onSkipChange={handlePageChange}
      sortable
      allowUnsort={false}
      style={gridStyle}
      pagination='remote' />

What you did:
Trying to do server site sorting/filtering/pagination, but typescript seems to be missing some definitions

What happened:

// @ts-ignore
onLimitChange={handlePageSize}
// @ts-ignore
onSkipChange={handlePageChange}

If I use @ts-ignore, both onLimitChange and onSkipChange work as expected, so its just the definitions missing.

Reproduction repository:
Codesandbox

Problem description:
I don't want to have to use ts-ignore to make the program work.

When virtualizeColumns is set to true a column that is locked to the end is showing as an artifact on top of the first column

  • what edition are you using - community / enterprise: enterprise
  • version for @inovua/reactdatagrid-communityor @inovua/reactdatagrid-enterprise - latest version (reproducible on the docs site)

Relevant code or config

import React from 'react'

import ReactDataGrid from '@inovua/reactdatagrid-enterprise'
import '@inovua/reactdatagrid-enterprise/index.css'

import people from './people'
import flags from './flags'

const gridStyle = { minHeight: 550, maxWidth: 1000 };

const columns = [
  { name: 'id', header: 'Id', defaultVisible: false, defaultWidth: 100, type: 'number' },
  { name: 'name', defaultLocked: 'end', header: 'Name', defaultFlex: 1, minWidth: 450 },
  { name: 'country', header: 'Country', defaultFlex: 1, minWidth: 200,
    render: ({ value }) => flags[value] ? flags[value] : value
  },
  { name: 'city', header: 'City', defaultFlex: 1, minWidth: 450 },
  { name: 'age', header: 'Age', minWidth: 100, type: 'number' }
]

const App = () => {
  return (
    <div>
      <h3>Scroll horizontally to see the effect</h3>
      <ReactDataGrid
        idProperty="id"
        reorderColumns={false}
        style={gridStyle}
        columns={columns}
        dataSource={people}
        virtualizeColumns
      />
    </div>
  );
}

export default () => <App />

What you did:
Try to lock one of the column to the 'end' when 'virtualizeColumns' property of the grid is set to true.

What happened:
The first unlocked column shows artifacts of the locked column cells' text on top of its own text.

Reproduction repository:

Problem description:

Suggested solution:

[Bug] Updated async data source isn't "cancelling" previous data source requests

Within our application, users can select which columns they do or do not want to see. Once they make their selections, we use the new set of columns to figure our what data we need to requests via our GQL client. This means that our data source has a dependency on the table columns and the table columns can change at any time (including while the table is fetching data for the previous set of columns).

This is what we see in our app when that happens:

Screen Shot 2021-02-10 at 10 20 50 AM

  1. Table has 1 column and requests first page of data
  2. Table now has 3 columns and requests first page of data
  3. Table has 3 columns and requests second page of data

The Grid then displays the first page of the 1 column request and the second page of the 3 column request. Instead, it should ignore the first request altogether and use the 2 pages of the 3 columns requests.

Reproduction:

Click on the "Re-Render" button. You might have to do this a few times and/or scroll the table a bit.

import React, { useState, useCallback } from 'react'

import ReactDataGrid from '@inovua/reactdatagrid-enterprise'
import '@inovua/reactdatagrid-enterprise/index.css'

import Button from '@inovua/reactdatagrid-community/packages/Button'
import DATASET_URL from './DATASET_URL'

const gridStyle = { minHeight: 550, marginTop: 10 }
const empty = () => null;

const columns = [
  { name: 'firstName', header: 'First Name', defaultFlex: 2 },
  { name: 'lastName', header: 'Last Name', defaultFlex: 2 },
  { name: 'email', header: 'Email', defaultFlex: 3 }
];

const loadData = ({ skip, sortInfo, limit }) => {
  return new Promise(resolve => setTimeout(resolve, 2000))
    .then(() => fetch(DATASET_URL + '?skip=' + skip + '&limit=' + limit + '&sortInfo='+JSON.stringify(sortInfo)))
    .then(response => {
      const totalCount = response.headers.get('X-Total-Count');
      return response.json().then((data) => {
        return { data, count: parseInt(totalCount) };
      })
    })
}

const App = () => {
  const [tableColumns, setTableColumns] = useState([...columns]);
  const dataSource = useCallback((params) => {
    return loadData(params).then(result => {
      // Since we only request data based on the selected columns, simulate that
      // same here by removing keys from the data that aren't part of the columns.
      const columnKeys = tableColumns.map((c) => c.name);
      const data = result.data.map((d) =>
        Object.fromEntries(
          Object.entries(d).filter(([key]) => columnKeys.includes(key))
        )
      );
      
      console.log('dataSource', { skip: params.skip, data, tableColumns })

      return { data, count: result.count };
    })
  }, [tableColumns]);
  
  const reRender = () => {
    // Remove some columns
    setTableColumns([...columns].slice(0, 1));

    setTimeout(() => {
      // Restore some columns
      setTableColumns([...columns]);
    }, 0);
  };

  return (
    <div>
      <Button onClick={reRender}>Re-Render</Button>
      <ReactDataGrid
        idProperty="id"
        style={gridStyle}
        columns={tableColumns}
        pagination
        livePagination
        limit={10}
        dataSource={dataSource}
      />
    </div>
  );
}

export default () => <App />

Filter a complex object

Hello everyone,

  • what edition are you using - community
  • version for @inovua/reactdatagrid-community- 4.0.23

Relevant code or config

import DataGrid from '@inovua/reactdatagrid-community';
import '@inovua/reactdatagrid-community/index.css';

const dataSource = [
  {basic: 'test1', complex: {name: 'name 1'}},
  {basic: 'test2', complex: {name: 'name 2'}},
  {basic: 'test3', complex: {name: 'name 3'}},
  {basic: 'test4', complex: {name: 'name 4'}},
  {basic: 'test5', complex: {name: 'name 5'}}
],
columns = [
  { name: 'basic', header: 'Basic' },
  { name: 'complex', header: 'Complex', render: ({ data }) => data.complex.name }
],
defaultFilterValue = [
  { name: 'basic', type: 'string', operator: 'contains', value: '' },
  { name: 'complex', type: 'string', operator: 'contains', value: '' }
];

export default function App() {
  return (
    <DataGrid
      columns={columns}
      pagination
      defaultFilterValue={defaultFilterValue}
      dataSource={dataSource} />
  );
}

It's look like filter is not possible on complex object.
When I want to filter on complex column, it just return No records available

Is someone have an idea how to implement filtering on complex object ?

filtering null values with select type doesn't work

  • what edition are you using - enterprise
  • version for @inovua/reactdatagrid-communityor @inovua/reactdatagrid-enterprise - 4.0.16

What you did:
I have a column with values either true, false, or null. I have a filter on that column for each one of the values. I select "null" ("Blank" in the UI of the sandbox)

image

What happened:
Nothing. I expect to see only the row with the null value, and the word "Blank" in the filter.

Reproduction repository:
https://codesandbox.io/s/small-wood-ldn2d?file=/src/App.js

Problem description:
the filtering doesn't work.

Suggested solution:
do a check for null value in the filter

"Natural row height" does not work

  • what edition are you using - community but i can reproduce it on entreprise
  • version 4.0.15

Relevant code or config
https://reactdatagrid.io/docs/api-reference#props-minRowHeight

What you did:
Try to use natural row height rendering with rowHeight=null and minRowHeight

What happened:
The big cell doesn't render as expected
image

Reproduction repository:
Documentation example : https://reactdatagrid.io/docs/api-reference#props-minRowHeight

Problem description:

The natural row height doesn't not work
image

With virtualized={false} the table does not render
image

UI page block on state change

  • what edition are you using - community / enterprise
  • version for @inovua/reactdatagrid-communityor @inovua/reactdatagrid-enterprise -

Relevant code or config

What you did:

What happened:

Reproduction repository:

Problem description:

Suggested solution:

[Date filter] "Today" label is not translated

Hi,

i'm using @inovua/reactdatagrid-community` and i cannot find how to translate "Today" message in calendar filter ?

Here "today" is not translatted but days and months are

image

I searched in documentation without result :

https://reactdatagrid.io/docs/api-reference#props-i18n

Any help ?

(I try to make this question in stackoverflow but i got this message :
"Creating the new tag 'reactdatagrid' requires at least 1500 reputation. Try something from the existing tags list instead."

Thanks

group columns with undefined values are broken

  • what edition are you using - enterprise
  • version for @inovua/reactdatagrid-communityor @inovua/reactdatagrid-enterprise - 4.0.16

What you did:
grid with grouping in which some of the cell values are undefined

What happened:
the grouping breaks:
image

Reproduction repository:
https://codesandbox.io/s/eager-lichterman-ug7k8?file=/src/App.js

Problem description:
Grouping is broken, and some of the data in our grids is undefined.

Suggested solution:
treat undefined like any other value. there should be a group of all undefined data. i.e. in the sandbox above, there would be a second group after "usa", and that group would have one member, with the undefined country and age.

Inline editing: onEditComplete is called even when editing is canceled

  • what edition are you using - enterprise (for evaluation)
  • version - 4.0.20

Problem description:
The inline editing documentation here states that pressing the Escape key cancels cell editing. However, it seems that pressing Escape will call onEditCancel and onEditComplete, making it impossible to differentiate whether an edit was a true edit. I was able to reproduce this both on your documentation example and local code.

Expected behavior:
OnEditCancel and onEditComplete are mutually exclusive.

The last column of the table is truncated

  • what edition are you using - community or enterprise
  • version 4.0.22
  • macos, Google Chrome   ver 88.0.4324.96 , (x86_64)

What you did: implemented a grid in rtl or ltr mode
What happened: When table is scrollable, the last column of the table is truncated
Снимок экрана 2021-02-01 в 08 40 20

is renderRow prop removed or renamed?

Hi, thanks for your great plugin. I'm using enterprise version @inovua/[email protected], seems like renderRow property is missing but it is documented in the API docs

Here's a sandbox: https://codesandbox.io/s/eloquent-brattain-t954x?file=/src/App.tsx

Property 'renderRow' does not exist on type 'IntrinsicAttributes & Pick<TypeDataGridProps, "style" | "filterable" | "onReady" | "handle" | "renderInPortal" | "onSkipChange" | ... 160 more ... | "isRowReorderValid"> & Partial<...> & Partial<...>'

What I'm basically trying to do is to change the background color of each row based on some specific data, I thought that renderRow does the trick, is it removed from API or renamed, or maybe you can purpose a solution on doing something similar with another method or callback prop. Thanks in advance.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.