mirror of
https://github.com/gosticks/react-bootstrap-table2.git
synced 2026-06-28 21:20:04 +00:00
@@ -44,6 +44,8 @@ export default (_, onStartEdit) =>
|
||||
this.handleClick = this.handleClick.bind(this);
|
||||
this.handleKeyDown = this.handleKeyDown.bind(this);
|
||||
this.beforeComplete = this.beforeComplete.bind(this);
|
||||
this.asyncbeforeCompete = this.asyncbeforeCompete.bind(this);
|
||||
this.displayErrorMessage = this.displayErrorMessage.bind(this);
|
||||
this.state = {
|
||||
invalidMessage: null
|
||||
};
|
||||
@@ -79,16 +81,41 @@ export default (_, onStartEdit) =>
|
||||
}, timeToCloseMessage);
|
||||
}
|
||||
|
||||
displayErrorMessage(message) {
|
||||
this.setState(() => ({
|
||||
invalidMessage: message
|
||||
}));
|
||||
this.createTimer();
|
||||
}
|
||||
|
||||
asyncbeforeCompete(newValue) {
|
||||
return (result = { valid: true }) => {
|
||||
const { valid, message } = result;
|
||||
const { onUpdate, row, column } = this.props;
|
||||
if (!valid) {
|
||||
this.displayErrorMessage(message);
|
||||
return;
|
||||
}
|
||||
onUpdate(row, column, newValue);
|
||||
};
|
||||
}
|
||||
|
||||
beforeComplete(newValue) {
|
||||
const { onUpdate, row, column } = this.props;
|
||||
if (_.isFunction(column.validator)) {
|
||||
const validateForm = column.validator(newValue, row, column);
|
||||
if (_.isObject(validateForm) && !validateForm.valid) {
|
||||
this.setState(() => ({
|
||||
invalidMessage: validateForm.message
|
||||
}));
|
||||
this.createTimer();
|
||||
return;
|
||||
const validateForm = column.validator(
|
||||
newValue,
|
||||
row,
|
||||
column,
|
||||
this.asyncbeforeCompete(newValue)
|
||||
);
|
||||
if (_.isObject(validateForm)) {
|
||||
if (validateForm.async) {
|
||||
return;
|
||||
} else if (!validateForm.valid) {
|
||||
this.displayErrorMessage(validateForm.message);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
onUpdate(row, column, newValue);
|
||||
|
||||
101
packages/react-bootstrap-table2-example/examples/cell-edit/cell-edit-async-validator-table.js
vendored
Normal file
101
packages/react-bootstrap-table2-example/examples/cell-edit/cell-edit-async-validator-table.js
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
/* eslint no-unused-vars: 0 */
|
||||
import React from 'react';
|
||||
import BootstrapTable from 'react-bootstrap-table-next';
|
||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||
import Code from 'components/common/code-block';
|
||||
import { productsGenerator } from 'utils/common';
|
||||
|
||||
const products = productsGenerator();
|
||||
|
||||
const columns = [{
|
||||
dataField: 'id',
|
||||
text: 'Product ID'
|
||||
}, {
|
||||
dataField: 'name',
|
||||
text: 'Product Name'
|
||||
}, {
|
||||
dataField: 'price',
|
||||
text: 'Product Price',
|
||||
validator: (newValue, row, column, done) => {
|
||||
setTimeout(() => {
|
||||
if (isNaN(newValue)) {
|
||||
return done({
|
||||
valid: false,
|
||||
message: 'Price should be numeric'
|
||||
});
|
||||
}
|
||||
if (newValue < 2000) {
|
||||
return done({
|
||||
valid: false,
|
||||
message: 'Price should bigger than 2000'
|
||||
});
|
||||
}
|
||||
return done();
|
||||
}, 2000);
|
||||
return {
|
||||
async: true
|
||||
};
|
||||
}
|
||||
}];
|
||||
|
||||
const sourceCode = `\
|
||||
import BootstrapTable from 'react-bootstrap-table-next';
|
||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||
|
||||
const columns = [{
|
||||
dataField: 'id',
|
||||
text: 'Product ID'
|
||||
}, {
|
||||
dataField: 'name',
|
||||
text: 'Product Name'
|
||||
}, {
|
||||
dataField: 'price',
|
||||
text: 'Product Price',
|
||||
validator: (newValue, row, column, done) => {
|
||||
setTimeout(() => {
|
||||
if (isNaN(newValue)) {
|
||||
return done({
|
||||
valid: false,
|
||||
message: 'Price should be numeric'
|
||||
});
|
||||
}
|
||||
if (newValue < 2000) {
|
||||
return done({
|
||||
valid: false,
|
||||
message: 'Price should bigger than 2000'
|
||||
});
|
||||
}
|
||||
return done();
|
||||
}, 2000);
|
||||
return {
|
||||
async: true
|
||||
};
|
||||
}
|
||||
}];
|
||||
|
||||
<BootstrapTable
|
||||
keyField="id"
|
||||
data={ products }
|
||||
columns={ columns }
|
||||
cellEdit={ cellEditFactory({
|
||||
mode: 'click',
|
||||
blurToSave: true
|
||||
}) }
|
||||
/>
|
||||
`;
|
||||
|
||||
export default () => (
|
||||
<div>
|
||||
<h3>Product Price should bigger than $2000</h3>
|
||||
<BootstrapTable
|
||||
keyField="id"
|
||||
data={ products }
|
||||
columns={ columns }
|
||||
cellEdit={ cellEditFactory({
|
||||
mode: 'click',
|
||||
blurToSave: true
|
||||
}) }
|
||||
/>
|
||||
<Code>{ sourceCode }</Code>
|
||||
</div>
|
||||
);
|
||||
@@ -98,6 +98,7 @@ import ColumnLevelEditableTable from 'examples/cell-edit/column-level-editable-t
|
||||
import CellLevelEditable from 'examples/cell-edit/cell-level-editable-table';
|
||||
import CellEditHooks from 'examples/cell-edit/cell-edit-hooks-table';
|
||||
import CellEditValidator from 'examples/cell-edit/cell-edit-validator-table';
|
||||
import AsyncCellEditValidator from 'examples/cell-edit/cell-edit-async-validator-table';
|
||||
import CellEditStyleTable from 'examples/cell-edit/cell-edit-style-table';
|
||||
import CellEditClassTable from 'examples/cell-edit/cell-edit-class-table';
|
||||
import AutoSelectTextInput from 'examples/cell-edit/auto-select-text-input-table';
|
||||
@@ -289,6 +290,7 @@ storiesOf('Cell Editing', module)
|
||||
.add('Cell Level Editable', () => <CellLevelEditable />)
|
||||
.add('Rich Hook Functions', () => <CellEditHooks />)
|
||||
.add('Validation', () => <CellEditValidator />)
|
||||
.add('Async Validation', () => <AsyncCellEditValidator />)
|
||||
.add('Auto Select Text Input', () => <AutoSelectTextInput />)
|
||||
.add('Custom Cell Style', () => <CellEditStyleTable />)
|
||||
.add('Custom Cell Classes', () => <CellEditClassTable />)
|
||||
|
||||
Reference in New Issue
Block a user