Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(react-grid): support column data types (#336)
- Loading branch information
Showing
41 changed files
with
1,157 additions
and
76 deletions.
There are no files selected for viewing
101 changes: 101 additions & 0 deletions
101
packages/dx-react-demos/src/bootstrap3/data-types/editors.jsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
import React from 'react'; | ||
import { | ||
DataTypeProvider, | ||
EditingState, | ||
} from '@devexpress/dx-react-grid'; | ||
import { | ||
Grid, | ||
TableView, | ||
TableHeaderRow, | ||
TableEditRow, | ||
TableEditColumn, | ||
} from '@devexpress/dx-react-grid-bootstrap3'; | ||
|
||
import { | ||
generateRows, | ||
globalSalesValues, | ||
} from '../../demo-data/generator'; | ||
|
||
const BooleanTypeProvider = () => ( | ||
<DataTypeProvider | ||
type="boolean" | ||
formatterTemplate={({ value }) => | ||
<span className="label label-default">{value ? 'Yes' : 'No'}</span>} | ||
editorTemplate={({ value, onValueChange }) => ( | ||
<select | ||
className="form-control" | ||
value={value} | ||
onChange={e => onValueChange(e.target.value === 'true')} | ||
> | ||
<option value={false}>No</option> | ||
<option value>Yes</option> | ||
</select> | ||
)} | ||
/> | ||
); | ||
|
||
export default class Demo extends React.PureComponent { | ||
constructor(props) { | ||
super(props); | ||
|
||
this.state = { | ||
columns: [ | ||
{ name: 'customer', title: 'Customer' }, | ||
{ name: 'product', title: 'Product' }, | ||
{ name: 'units', title: 'Units' }, | ||
{ name: 'shipped', title: 'Shipped', dataType: 'boolean' }, | ||
], | ||
rows: generateRows({ | ||
columnValues: { id: ({ index }) => index, ...globalSalesValues }, | ||
length: 14, | ||
}), | ||
}; | ||
|
||
this.commitChanges = ({ added, changed, deleted }) => { | ||
let rows = this.state.rows; | ||
if (added) { | ||
const startingAddedId = (rows.length - 1) > 0 ? rows[rows.length - 1].id + 1 : 0; | ||
rows = [ | ||
...rows, | ||
...added.map((row, index) => ({ | ||
id: startingAddedId + index, | ||
...row, | ||
})), | ||
]; | ||
} | ||
if (changed) { | ||
rows = rows.map(row => (changed[row.id] ? { ...row, ...changed[row.id] } : row)); | ||
} | ||
if (deleted) { | ||
const deletedSet = new Set(deleted); | ||
rows = rows.filter(row => !deletedSet.has(row.id)); | ||
} | ||
this.setState({ rows }); | ||
}; | ||
} | ||
render() { | ||
const { rows, columns } = this.state; | ||
|
||
return ( | ||
<Grid | ||
rows={rows} | ||
columns={columns} | ||
getRowId={row => row.id} | ||
> | ||
<BooleanTypeProvider /> | ||
<EditingState | ||
onCommitChanges={this.commitChanges} | ||
defaultEditingRows={[0]} | ||
/> | ||
<TableView /> | ||
<TableHeaderRow /> | ||
<TableEditRow /> | ||
<TableEditColumn | ||
allowAdding | ||
allowEditing | ||
allowDeleting | ||
/> | ||
</Grid> | ||
); | ||
} | ||
} |
11 changes: 11 additions & 0 deletions
11
packages/dx-react-demos/src/bootstrap3/data-types/editors.test.jsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
import React from 'react'; | ||
import { mount } from 'enzyme'; | ||
import Demo from './editors'; | ||
|
||
describe('BS3: data types formatting demo', () => { | ||
it('should work', () => { | ||
mount( | ||
<Demo />, | ||
); | ||
}); | ||
}); |
61 changes: 61 additions & 0 deletions
61
packages/dx-react-demos/src/bootstrap3/data-types/formatters.jsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
import React from 'react'; | ||
import { | ||
DataTypeProvider, | ||
} from '@devexpress/dx-react-grid'; | ||
import { | ||
Grid, | ||
TableView, | ||
TableHeaderRow, | ||
} from '@devexpress/dx-react-grid-bootstrap3'; | ||
|
||
import { | ||
generateRows, | ||
globalSalesValues, | ||
} from '../../demo-data/generator'; | ||
|
||
const CurrencyTypeProvider = () => ( | ||
<DataTypeProvider | ||
type="currency" | ||
formatterTemplate={({ value }) => ( | ||
<b className="text-primary">${value}</b> | ||
)} | ||
/> | ||
); | ||
const DateTypeProvider = () => ( | ||
<DataTypeProvider | ||
type="date" | ||
formatterTemplate={({ value }) => | ||
value.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3.$2.$1')} | ||
/> | ||
); | ||
|
||
export default class Demo extends React.PureComponent { | ||
constructor(props) { | ||
super(props); | ||
|
||
this.state = { | ||
columns: [ | ||
{ name: 'customer', title: 'Customer' }, | ||
{ name: 'product', title: 'Product' }, | ||
{ name: 'saleDate', title: 'Sale Date', dataType: 'date' }, | ||
{ name: 'amount', title: 'Sale Amount', dataType: 'currency', align: 'right' }, | ||
], | ||
rows: generateRows({ columnValues: globalSalesValues, length: 14 }), | ||
}; | ||
} | ||
render() { | ||
const { rows, columns } = this.state; | ||
|
||
return ( | ||
<Grid | ||
rows={rows} | ||
columns={columns} | ||
> | ||
<CurrencyTypeProvider /> | ||
<DateTypeProvider /> | ||
<TableView /> | ||
<TableHeaderRow /> | ||
</Grid> | ||
); | ||
} | ||
} |
11 changes: 11 additions & 0 deletions
11
packages/dx-react-demos/src/bootstrap3/data-types/formatters.test.jsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
import React from 'react'; | ||
import { mount } from 'enzyme'; | ||
import Demo from './formatters'; | ||
|
||
describe('BS3: custom editors demo', () => { | ||
it('should work', () => { | ||
mount( | ||
<Demo />, | ||
); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
100 changes: 100 additions & 0 deletions
100
packages/dx-react-demos/src/material-ui/data-types/editors.jsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
import React from 'react'; | ||
import Chip from 'material-ui/Chip'; | ||
import { | ||
DataTypeProvider, | ||
EditingState, | ||
} from '@devexpress/dx-react-grid'; | ||
import { | ||
Grid, | ||
TableView, | ||
TableHeaderRow, | ||
TableEditRow, | ||
TableEditColumn, | ||
DropDownMenu, | ||
} from '@devexpress/dx-react-grid-material-ui'; | ||
|
||
import { | ||
generateRows, | ||
globalSalesValues, | ||
} from '../../demo-data/generator'; | ||
|
||
const BooleanTypeProvider = () => ( | ||
<DataTypeProvider | ||
type="boolean" | ||
formatterTemplate={({ value }) => <Chip label={value ? 'Yes' : 'No'} />} | ||
editorTemplate={({ value, onValueChange }) => ( | ||
<DropDownMenu | ||
selectedItem={value ? 'Yes' : 'No'} | ||
items={['No', 'Yes']} | ||
onItemClick={item => onValueChange(item === 'Yes')} | ||
/> | ||
)} | ||
/> | ||
); | ||
|
||
export default class Demo extends React.PureComponent { | ||
constructor(props) { | ||
super(props); | ||
|
||
this.state = { | ||
columns: [ | ||
{ name: 'customer', title: 'Customer' }, | ||
{ name: 'product', title: 'Product' }, | ||
{ name: 'units', title: 'Units' }, | ||
{ name: 'shipped', title: 'Shipped', dataType: 'boolean' }, | ||
], | ||
rows: generateRows({ | ||
columnValues: { id: ({ index }) => index, ...globalSalesValues }, | ||
length: 14, | ||
}), | ||
}; | ||
|
||
this.commitChanges = ({ added, changed, deleted }) => { | ||
let rows = this.state.rows; | ||
if (added) { | ||
const startingAddedId = (rows.length - 1) > 0 ? rows[rows.length - 1].id + 1 : 0; | ||
rows = [ | ||
...rows, | ||
...added.map((row, index) => ({ | ||
id: startingAddedId + index, | ||
...row, | ||
})), | ||
]; | ||
} | ||
if (changed) { | ||
rows = rows.map(row => (changed[row.id] ? { ...row, ...changed[row.id] } : row)); | ||
} | ||
if (deleted) { | ||
const deletedSet = new Set(deleted); | ||
rows = rows.filter(row => !deletedSet.has(row.id)); | ||
} | ||
this.setState({ rows }); | ||
}; | ||
} | ||
render() { | ||
const { rows, columns } = this.state; | ||
|
||
return ( | ||
<Grid | ||
rows={rows} | ||
columns={columns} | ||
getRowId={row => row.id} | ||
> | ||
<BooleanTypeProvider /> | ||
<EditingState | ||
onCommitChanges={this.commitChanges} | ||
defaultEditingRows={[0]} | ||
/> | ||
<TableView /> | ||
<TableHeaderRow /> | ||
<TableEditRow /> | ||
<TableEditColumn | ||
allowAdding | ||
allowEditing | ||
allowDeleting | ||
/> | ||
</Grid> | ||
); | ||
} | ||
} | ||
|
14 changes: 14 additions & 0 deletions
14
packages/dx-react-demos/src/material-ui/data-types/editors.test.jsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
import React from 'react'; | ||
import { mount } from 'enzyme'; | ||
import { MuiThemeProvider, createMuiTheme } from 'material-ui/styles'; | ||
import Demo from './editors'; | ||
|
||
describe('MUI: custom editors demo', () => { | ||
it('should work', () => { | ||
mount( | ||
<MuiThemeProvider theme={createMuiTheme()}> | ||
<Demo /> | ||
</MuiThemeProvider>, | ||
); | ||
}); | ||
}); |
61 changes: 61 additions & 0 deletions
61
packages/dx-react-demos/src/material-ui/data-types/formatters.jsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
import React from 'react'; | ||
import { | ||
DataTypeProvider, | ||
} from '@devexpress/dx-react-grid'; | ||
import { | ||
Grid, | ||
TableView, | ||
TableHeaderRow, | ||
} from '@devexpress/dx-react-grid-material-ui'; | ||
|
||
import { | ||
generateRows, | ||
globalSalesValues, | ||
} from '../../demo-data/generator'; | ||
|
||
const CurrencyTypeProvider = () => ( | ||
<DataTypeProvider | ||
type="currency" | ||
formatterTemplate={({ value }) => ( | ||
<b style={{ color: 'darkblue' }}>${value}</b> | ||
)} | ||
/> | ||
); | ||
const DateTypeProvider = () => ( | ||
<DataTypeProvider | ||
type="date" | ||
formatterTemplate={({ value }) => | ||
value.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3.$2.$1')} | ||
/> | ||
); | ||
|
||
export default class Demo extends React.PureComponent { | ||
constructor(props) { | ||
super(props); | ||
|
||
this.state = { | ||
columns: [ | ||
{ name: 'customer', title: 'Customer' }, | ||
{ name: 'product', title: 'Product' }, | ||
{ name: 'saleDate', title: 'Sale Date', dataType: 'date' }, | ||
{ name: 'amount', title: 'Sale Amount', dataType: 'currency', align: 'right' }, | ||
], | ||
rows: generateRows({ columnValues: globalSalesValues, length: 14 }), | ||
}; | ||
} | ||
render() { | ||
const { rows, columns } = this.state; | ||
|
||
return ( | ||
<Grid | ||
rows={rows} | ||
columns={columns} | ||
> | ||
<CurrencyTypeProvider /> | ||
<DateTypeProvider /> | ||
<TableView /> | ||
<TableHeaderRow /> | ||
</Grid> | ||
); | ||
} | ||
} |
Oops, something went wrong.