mirror of
https://github.com/gosticks/react-bootstrap-table2.git
synced 2026-08-11 11:40:22 +00:00
fix #1004
This commit is contained in:
@@ -11,6 +11,7 @@ Available properties in a column object:
|
||||
* [hidden](#hidden)
|
||||
* [formatter](#formatter)
|
||||
* [formatExtraData](#formatExtraData)
|
||||
* [type](#type)
|
||||
* [sort](#sort)
|
||||
* [sortFunc](#sortFunc)
|
||||
* [sortCaret](#sortCaret)
|
||||
@@ -132,6 +133,10 @@ The third argument: `components` have following specified properties:
|
||||
## <a name='formatExtraData'>column.formatExtraData - [Any]</a>
|
||||
It's only used for [`column.formatter`](#formatter), you can define any value for it and will be passed as fourth argument for [`column.formatter`](#formatter) callback function.
|
||||
|
||||
## <a name='type'>column.type - [String]</a>
|
||||
Specify the data type on column. Available value so far is `string`, `number`, `bool` and `date`. Default is `string`.
|
||||
`column.type` can be used when you enable the cell editing and want to save your cell data with correct data type.
|
||||
|
||||
## <a name='sort'>column.sort - [Bool]</a>
|
||||
Enable the column sort via a `true` value given.
|
||||
|
||||
|
||||
+4
-3
@@ -56,12 +56,13 @@ export default (
|
||||
}
|
||||
|
||||
handleCellUpdate(row, column, newValue) {
|
||||
const newValueWithType = dataOperator.typeConvert(column.type, newValue);
|
||||
const { cellEdit } = this.props;
|
||||
const { beforeSaveCell } = cellEdit.options;
|
||||
const oldValue = _.get(row, column.dataField);
|
||||
const beforeSaveCellDone = (result = true) => {
|
||||
if (result) {
|
||||
this.doUpdate(row, column, newValue);
|
||||
this.doUpdate(row, column, newValueWithType);
|
||||
} else {
|
||||
this.escapeEditing();
|
||||
}
|
||||
@@ -69,7 +70,7 @@ export default (
|
||||
if (_.isFunction(beforeSaveCell)) {
|
||||
const result = beforeSaveCell(
|
||||
oldValue,
|
||||
newValue,
|
||||
newValueWithType,
|
||||
row,
|
||||
column,
|
||||
beforeSaveCellDone
|
||||
@@ -78,7 +79,7 @@ export default (
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.doUpdate(row, column, newValue);
|
||||
this.doUpdate(row, column, newValueWithType);
|
||||
}
|
||||
|
||||
doUpdate(row, column, newValue) {
|
||||
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
/* eslint prefer-template: 0 */
|
||||
import React from 'react';
|
||||
import BootstrapTable from 'react-bootstrap-table-next';
|
||||
import cellEditFactory, { Type } from 'react-bootstrap-table2-editor';
|
||||
import Code from 'components/common/code-block';
|
||||
import { stockGenerator } from 'utils/common';
|
||||
|
||||
const products = stockGenerator();
|
||||
|
||||
const columns = [{
|
||||
dataField: 'id',
|
||||
text: 'Stock ID'
|
||||
}, {
|
||||
dataField: 'name',
|
||||
text: 'Stock Name'
|
||||
}, {
|
||||
dataField: 'price',
|
||||
text: 'Price',
|
||||
type: 'number'
|
||||
}, {
|
||||
dataField: 'visible',
|
||||
text: 'Visible?',
|
||||
type: 'bool',
|
||||
editor: {
|
||||
type: Type.CHECKBOX,
|
||||
value: 'true:false'
|
||||
}
|
||||
}, {
|
||||
dataField: 'inStockDate',
|
||||
text: 'Stock Date',
|
||||
type: 'date',
|
||||
formatter: (cell) => {
|
||||
let dateObj = cell;
|
||||
if (typeof cell !== 'object') {
|
||||
dateObj = new Date(cell);
|
||||
}
|
||||
return `${('0' + dateObj.getUTCDate()).slice(-2)}/${('0' + (dateObj.getUTCMonth() + 1)).slice(-2)}/${dateObj.getUTCFullYear()}`;
|
||||
},
|
||||
editor: {
|
||||
type: Type.DATE
|
||||
}
|
||||
}];
|
||||
|
||||
const sourceCode = `\
|
||||
import BootstrapTable from 'react-bootstrap-table-next';
|
||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||
|
||||
const columns = [{
|
||||
dataField: 'id',
|
||||
text: 'Stock ID'
|
||||
}, {
|
||||
dataField: 'name',
|
||||
text: 'Stock Name'
|
||||
}, {
|
||||
dataField: 'price',
|
||||
text: 'Price',
|
||||
type: 'number'
|
||||
}, {
|
||||
dataField: 'visible',
|
||||
text: 'Visible?',
|
||||
type: 'bool',
|
||||
editor: {
|
||||
type: Type.CHECKBOX,
|
||||
value: 'true:false'
|
||||
}
|
||||
}, {
|
||||
dataField: 'inStockDate',
|
||||
text: 'Stock Date',
|
||||
type: 'date',
|
||||
formatter: (cell) => {
|
||||
let dateObj = cell;
|
||||
if (typeof cell !== 'object') {
|
||||
dateObj = new Date(cell);
|
||||
}
|
||||
return \`$\{('0' + dateObj.getUTCDate()).slice(-2)}/$\{('0' + (dateObj.getUTCMonth() + 1)).slice(-2)}/$\{dateObj.getUTCFullYear()}\`;
|
||||
},
|
||||
editor: {
|
||||
type: Type.DATE
|
||||
}
|
||||
}];
|
||||
|
||||
function afterSaveCell(oldValue, newValue) {
|
||||
console.log('--after save cell--');
|
||||
console.log('New Value was apply as');
|
||||
console.log(newValue);
|
||||
console.log(\`and the type is $\{typeof newValue}\`);
|
||||
}
|
||||
|
||||
<BootstrapTable
|
||||
keyField="id"
|
||||
data={ products }
|
||||
columns={ columns }
|
||||
cellEdit={ cellEditFactory({
|
||||
mode: 'click',
|
||||
blurToSave: true,
|
||||
afterSaveCell
|
||||
}) }
|
||||
/>
|
||||
`;
|
||||
|
||||
function afterSaveCell(oldValue, newValue) {
|
||||
console.log('--after save cell--');
|
||||
console.log('New Value was apply as');
|
||||
console.log(newValue);
|
||||
console.log(`and the type is ${typeof newValue}`);
|
||||
}
|
||||
|
||||
export default () => (
|
||||
<div>
|
||||
<h3>Save Cell Value with Specified Data Type</h3>
|
||||
<BootstrapTable
|
||||
keyField="id"
|
||||
data={ products }
|
||||
columns={ columns }
|
||||
cellEdit={ cellEditFactory({
|
||||
mode: 'click',
|
||||
blurToSave: true,
|
||||
afterSaveCell
|
||||
}) }
|
||||
/>
|
||||
<Code>{ sourceCode }</Code>
|
||||
</div>
|
||||
);
|
||||
@@ -69,8 +69,9 @@ const endDate = new Date();
|
||||
export const stockGenerator = (quantity = 5) =>
|
||||
Array.from({ length: quantity }, (value, index) => ({
|
||||
id: index,
|
||||
name: `Todo item ${index}`,
|
||||
name: `Stock Name ${index}`,
|
||||
price: Math.floor((Math.random() * 2) + 1),
|
||||
visible: Math.random() > 0.5,
|
||||
inStockDate:
|
||||
new Date(startDate.getTime() + Math.random() * (endDate.getTime() - startDate.getTime()))
|
||||
}));
|
||||
|
||||
@@ -131,6 +131,7 @@ import TextareaEditorTable from 'examples/cell-edit/textarea-editor-table';
|
||||
import CheckboxEditorTable from 'examples/cell-edit/checkbox-editor-table';
|
||||
import DateEditorTable from 'examples/cell-edit/date-editor-table';
|
||||
import CustomEditorTable from 'examples/cell-edit/custom-editor-table';
|
||||
import CellEditorWithDataType from 'examples/cell-edit/cell-edit-with-data-type';
|
||||
|
||||
// work on row selection
|
||||
import SingleSelectionTable from 'examples/row-selection/single-selection';
|
||||
@@ -377,7 +378,8 @@ storiesOf('Cell Editing', module)
|
||||
.add('Textarea Editor', () => <TextareaEditorTable />)
|
||||
.add('Checkbox Editor', () => <CheckboxEditorTable />)
|
||||
.add('Date Editor', () => <DateEditorTable />)
|
||||
.add('Custom Editor', () => <CustomEditorTable />);
|
||||
.add('Custom Editor', () => <CustomEditorTable />)
|
||||
.add('Cell Editor with Data Type', () => <CellEditorWithDataType />);
|
||||
|
||||
storiesOf('Row Selection', module)
|
||||
.addDecorator(bootstrapStyle())
|
||||
|
||||
+5
-1
@@ -8,5 +8,9 @@ export default {
|
||||
CHECKBOX_STATUS_INDETERMINATE: 'indeterminate',
|
||||
CHECKBOX_STATUS_UNCHECKED: 'unchecked',
|
||||
INDICATOR_POSITION_LEFT: 'left',
|
||||
INDICATOR_POSITION_RIGHT: 'right'
|
||||
INDICATOR_POSITION_RIGHT: 'right',
|
||||
TYPE_STRING: 'string',
|
||||
TYPE_NUMBER: 'number',
|
||||
TYPE_BOOLEAN: 'bool',
|
||||
TYPE_DATE: 'date'
|
||||
};
|
||||
|
||||
@@ -117,6 +117,12 @@ HeaderCell.propTypes = {
|
||||
column: PropTypes.shape({
|
||||
dataField: PropTypes.string.isRequired,
|
||||
text: PropTypes.string.isRequired,
|
||||
type: PropTypes.oneOf([
|
||||
Const.TYPE_STRING,
|
||||
Const.TYPE_NUMBER,
|
||||
Const.TYPE_BOOLEAN,
|
||||
Const.TYPE_DATE
|
||||
]),
|
||||
isDummyField: PropTypes.bool,
|
||||
hidden: PropTypes.bool,
|
||||
headerFormatter: PropTypes.func,
|
||||
|
||||
+3
-1
@@ -3,11 +3,13 @@ import * as selection from './selection';
|
||||
import * as expand from './expand';
|
||||
import * as mutate from './mutate';
|
||||
import * as sort from './sort';
|
||||
import * as type from './type';
|
||||
|
||||
export default {
|
||||
...rows,
|
||||
...selection,
|
||||
...expand,
|
||||
...mutate,
|
||||
...sort
|
||||
...sort,
|
||||
...type
|
||||
};
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
import Const from '../const';
|
||||
|
||||
export const typeConvert = (type, value) => {
|
||||
if (!type || type === Const.TYPE_STRING) {
|
||||
return String(value);
|
||||
} else if (type === Const.TYPE_NUMBER) {
|
||||
return Number(value);
|
||||
} else if (type === Const.TYPE_BOOLEAN) {
|
||||
if (typeof value === 'boolean') {
|
||||
return value;
|
||||
}
|
||||
return value === 'true';
|
||||
} else if (type === Const.TYPE_DATE) {
|
||||
return new Date(value);
|
||||
}
|
||||
return value;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user