diff --git a/docs/columns.md b/docs/columns.md index 6546f81..5e7a8b0 100644 --- a/docs/columns.md +++ b/docs/columns.md @@ -2,23 +2,26 @@ Available properties in a column object: +#### Required * [dataField (**required**)](#dataField) * [text (**required**)](#text) + +#### Optional * [hidden](#hidden) * [formatter](#formatter) -* [headerFormatter](#headerFormatter) * [formatExtraData](#formatExtraData) +* [headerFormatter](#headerFormatter) * [classes](#classes) * [style](#style) * [title](#title) * [events](#events) * [align](#align) * [attrs](#attrs) +* [headerClasses](#headerClasses) +* [headerStyle](#headerStyle) * [headerTitle](#headerTitle) * [headerEvents](#headerEvents) * [headerAlign](#headerAlign) -* [headerClasses](#headerClasses) -* [headerStyle](#headerStyle) * [headerAttrs](#headerAttrs) Following is a most simplest and basic usage: @@ -91,14 +94,27 @@ It's availabe to have custom class on table column: classes: 'id-custom-cell' } ``` -In addition, `classes` also accept a callback function which have more power to custom the css class on each columns. This callback function take three arguments and a string is expect to return: +In addition, `classes` also accept a callback function which have more power to custom the css class on each columns. This callback function take `4` arguments and a `string` is expect to return: -* `cell` -* `row` -* `colIndex` + +```js +{ + classes: function callback(cell, row, rowIndex, colIndex) { ... } +} +``` + +**Parameters** +* `cell`: The value of current cell. +* `row`: The value of `row` being processed in the `BootstrapTable`. +* `rowIndex`: The index of the current `row` being processed in the `BootstrapTable`. +* `colIndex`: The index of the current `column` being processed in `BootstrapTable`. + +**Return value** + +A new `String` will be the result of element class. ## column.headerClasses - [String | Function] -It's availabe to have customized class on table header column: +It's similar to [`column.classes`](#classes), `headerClasses` is availabe to have customized class on table header column: ```js { @@ -106,13 +122,24 @@ It's availabe to have customized class on table header column: headerClasses: 'id-custom-cell' } ``` -In addition, similar to [`column.classes`](#classes), `headerClasses` also accept a callback function which have more power to custom the css class on header column. This callback function take two arguments and a string is expect to return: +Furthermore, it also accept a callback function which takes 2 arguments and a `String` is expect to return: -* `column` -* `colIndex` +```js +{ + headerClasses: function callback(column, colIndex) { ... } +} +``` + +**Parameters** +* `column`: The value of current column. +* `colIndex`: The index of the current `column` being processed in `BootstrapTable`. + +**Return value** + +A new `String` will be the result of element headerClasses. ## column.style - [Object | Function] -It's availabe to have custom class on table column: +It's availabe to have custom style on table column: ```js { @@ -120,7 +147,26 @@ It's availabe to have custom class on table column: style: { backgroundColor: 'green' } } ``` -`style` like [`column.classes`](#classes), it accept a callback function too and have same arguments: `cell`, `row` and `colIndex`. + +In addition, similar to [`column.classes`](#classes), `style` also accept a callback function which have more power to customize the `inline style` on each columns. This callback function takes `4` arguments and an `Object` is expect to return: + + +```js +{ + style: function callback(cell, row, rowIndex, colIndex) { ... } +} +``` + +**Parameters** +* `cell`: The value of current cell. +* `row`: The value of `row` being processed in the `BootstrapTable`. +* `rowIndex`: The index of the current `row` being processed in the `BootstrapTable`. +* `colIndex`: The index of the current `column` being processed in `BootstrapTable`. + +**Return value** + +A new `Object` will be the result of element style. + ## column.headerStyle - [Object | Function] It's availabe to have customized inline-style on table header column: @@ -131,42 +177,104 @@ It's availabe to have customized inline-style on table header column: headerStyle: { backgroundColor: 'green' } } ``` -`headerStyle` like [`column.headerClasses`](#headerClasses), it accept a callback function as well and have same arguments: `column` and `colIndex`. + +Moreover, it also accept a callback function which takes 2 arguments and an `Object` is expect to return: + +```js +{ + headerStyle: function callback(column, colIndex) { ... } +} +``` + +**Parameters** +* `column`: The value of current column. +* `colIndex`: The index of the current `column` being processed in `BootstrapTable`. + +**Return value** + +A new `Object` will be the result of element headerStyle. + ## column.title - [Bool | Function] -`react-bootstrap-table2` is disable [`HTML title`](https://www.w3schools.com/tags/tag_title.asp) as default. You can assign `title` as `true` to enable the HTML title on table column. In addition, you can custom the title via a callback function: +`react-bootstrap-table2` is disable [`HTML title`](https://www.w3schools.com/tags/tag_title.asp) as default. You can assign `title` as `true` to enable the HTML title on table column and take `cell content` as default value. Additionally, you could customize title via a callback. It takes `4` arguments and a `String` is expect to return: + ```js { // omit... - title: (cell, row, colIndex) => { - // return custom title here - } + title: function callback(cell, row, rowIndex, colIndex) { ... } + // return custom title here } ``` +**Parameters** +* `cell`: The value of current cell. +* `row`: The value of `row` being processed in the `BootstrapTable`. +* `rowIndex`: The index of the current `row` being processed in the `BootstrapTable`. +* `colIndex`: The index of the current `column` being processed in `BootstrapTable`. + +**Return value** + +A new `String` will be the result of element title. + ## column.headerTitle - [Bool | Function] -`headerTitle` is only for the title on header column, default is disable. The usage almost same as [`column.title`](#title), it's also availabe to custom via a callback function: +`headerTitle` is only for the title on header column, default is disable. The usage almost same as [`column.title`](#title), ```js { // omit... - headerTitle: (column, colIndex) => { - // column is an object and perform itself - // return custom title here - } + headerTitle: true } ``` -## column.align - [String | Function] -You can configure the [CSS text-align](https://www.w3schools.com/cssref/pr_text_text-align.asp) for table column by `align` property. However, `align` also accept a callback function for customizable reason and this function take fore arguments: +It's also availabe to custom via a callback function: +```js +{ + headerTitle: function callback(column, colIndex) { ... } +} +``` -* `cell` -* `row` -* `colIndex` +**Parameters** +* `column`: The value of current column. +* `colIndex`: The index of the current `column` being processed in `BootstrapTable`. + +**Return value** + +A new `String` will be the result of element headerTitle. + +## column.align - [String | Function] +You can configure the [CSS text-align](https://www.w3schools.com/cssref/pr_text_text-align.asp) for table column by `align` property. + +Besides, `align` also accept a callback function for dynamically setting text align. It takes `4` arguments and a `String` is expect to return: + +```js +{ + // omit... + align: function callback(cell, row, rowIndex, colIndex) { ... } +} +``` + +**Parameters** +* `cell`: The value of current cell. +* `row`: The value of `row` being processed in the `BootstrapTable`. +* `rowIndex`: The index of the current `row` being processed in the `BootstrapTable`. +* `colIndex`: The index of the current `column` being processed in `BootstrapTable`. + +**Return value** + +A new `String` will be the result of element text alignment. ## column.headerAlign - [String | Function] -It's almost same as [`column.align`](#align), but it's for the [CSS text-align](https://www.w3schools.com/cssref/pr_text_text-align.asp) on header column. Also, you can custom the align by a callback function: +It's almost same as [`column.align`](#align), but it's for the [CSS text-align](https://www.w3schools.com/cssref/pr_text_text-align.asp) on header column. + +```js +{ + // omit... + headerAlign: 'center' +} +``` + +Also, you can custom the align by a callback function: ```js { @@ -177,6 +285,14 @@ It's almost same as [`column.align`](#align), but it's for the [CSS text-align]( } } ``` +**Parameters** +* `column`: The value of current column. +* `colIndex`: The index of the current `column` being processed in `BootstrapTable`. + +**Return value** + +A new `String` will be the result of element headerAlign. + ## column.events - [Object] You can assign any [HTML Event](https://www.w3schools.com/tags/ref_eventattributes.asp) on table column via event property: @@ -193,17 +309,44 @@ You can assign any [HTML Event](https://www.w3schools.com/tags/ref_eventattribut ## column.headerEvents - [Object] `headerEvents` same as [`column.events`](#events) but this is for header column. +```js +{ + // omit... + headerEvents: { + onClick: e => { ... } + } +} +``` + ## column.attrs - [Object | Function] -Via `attrs` property, You can costomize table column [HTML attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes) which allow user to configure the elements or adjust their behavior. It takes `Object` and `callback function` is also acceptable. +Via `attrs` property, You can customize table column [HTML attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes) which allow user to configure the elements or adjust their behavior. ```js { // omit... - attrs: (cell, row, colIndex) => ({ - // return customized HTML attribute here - }) + attrs: { + title: 'bar', + 'data-test': 'foo' + } } ``` +Not only `Object`, `callback function` is also acceptable. It takes `4` arguments and an `Object` is expect to return: + +```js +{ + attrs: function callback(cell, row, rowIndex, colIndex) { ... } +} +``` + +**Parameters** +* `cell`: The value of current cell. +* `row`: The value of `row` being processed in the `BootstrapTable`. +* `rowIndex`: The index of the current `row` being processed in the `BootstrapTable`. +* `colIndex`: The index of the current `column` being processed in `BootstrapTable`. + +**Return value** + +A new `Object` will be the result of element HTML attributes. #### * Caution @@ -218,7 +361,18 @@ If `column.classes`, `column.style`, `column.title`, `column.hidden` or `column. ``` ## column.headerAttrs - [Object | Function] -`headerAttrs` is similiar to [`column.attrs`](#attrs) but it's for header column. +`headerAttrs` is similiar to [`column.attrs`](#attrs) but it works for header column. +```js +{ + // omit... + headerAttrs: { + title: 'bar', + 'data-test': 'foo' + } +} +``` + +Additionally, customize the header attributes by a `2-arguments` callback function: ```js { @@ -228,3 +382,14 @@ If `column.classes`, `column.style`, `column.title`, `column.hidden` or `column. }) } ``` + +**Parameters** +* `column`: The value of current column. +* `colIndex`: The index of the current `column` being processed in `BootstrapTable`. + +**Return value** + +A new `Object` will be the result of element headerAttrs. + +#### * Caution +Same as [column.attrs](#attrs), it has lower priority and will be overwrited when other props related to HTML attributes were given. diff --git a/packages/react-bootstrap-table2-example/examples/columns/column-align-table.js b/packages/react-bootstrap-table2-example/examples/columns/column-align-table.js index 55ad2aa..37b510f 100644 --- a/packages/react-bootstrap-table2-example/examples/columns/column-align-table.js +++ b/packages/react-bootstrap-table2-example/examples/columns/column-align-table.js @@ -14,8 +14,8 @@ const columns = [{ }, { dataField: 'name', text: 'Product Name', - align: (cell, row, colIndex) => { - if (row.id % 2 === 0) return 'right'; + align: (cell, row, rowIndex, colIndex) => { + if (rowIndex % 2 === 0) return 'right'; return 'left'; } }, { @@ -31,8 +31,8 @@ const columns = [{ }, { dataField: 'name', text: 'Product Name', - align: (cell, row, colIndex) => { - if (row.id % 2 === 0) return 'right'; + align: (cell, row, rowIndex, colIndex) => { + if (rowIndex % 2 === 0) return 'right'; return 'left'; } }, { diff --git a/packages/react-bootstrap-table2-example/examples/columns/column-attrs-table.js b/packages/react-bootstrap-table2-example/examples/columns/column-attrs-table.js index bb25ad5..43c377a 100644 --- a/packages/react-bootstrap-table2-example/examples/columns/column-attrs-table.js +++ b/packages/react-bootstrap-table2-example/examples/columns/column-attrs-table.js @@ -14,7 +14,7 @@ const columns = [{ }, { dataField: 'name', text: 'Product Name', - attrs: (cell, row, colIndex) => ({ 'data-test': `customized data ${colIndex}` }) + attrs: (cell, row, rowIndex, colIndex) => ({ 'data-test': `customized data ${rowIndex}` }) }, { dataField: 'price', text: 'Product Price' @@ -28,7 +28,7 @@ const columns = [{ }, { dataField: 'name', text: 'Product Name', - attrs: (cell, row, colIndex) => ({ 'data-test': \`customized data \${colIndex}\` }) + attrs: (cell, row, rowIndex, colIndex) => ({ 'data-test': \`customized data \${rowIndex}\` }) }, { dataField: 'price', text: 'Product Price' diff --git a/packages/react-bootstrap-table2-example/examples/columns/column-class-table.js b/packages/react-bootstrap-table2-example/examples/columns/column-class-table.js index 44029ae..3a1e6fc 100644 --- a/packages/react-bootstrap-table2-example/examples/columns/column-class-table.js +++ b/packages/react-bootstrap-table2-example/examples/columns/column-class-table.js @@ -14,8 +14,8 @@ const columns = [{ }, { dataField: 'name', text: 'Product Name', - classes: (cell, row, colIndex) => { - if (row.id % 2 === 0) return 'demo-row-even'; + classes: (cell, row, rowIndex, colIndex) => { + if (rowIndex % 2 === 0) return 'demo-row-even'; return 'demo-row-odd'; } }, { @@ -31,8 +31,8 @@ const columns = [{ }, { dataField: 'name', text: 'Product Name', - classes: (cell, row, colIndex) => { - if (row.id % 2 === 0) return 'demo-row-even'; + classes: (cell, row, rowIndex, colIndex) => { + if (rowIndex % 2 === 0) return 'demo-row-even'; return 'demo-row-odd'; } }, { diff --git a/packages/react-bootstrap-table2-example/examples/columns/column-style-table.js b/packages/react-bootstrap-table2-example/examples/columns/column-style-table.js index 157193b..4dae9bc 100644 --- a/packages/react-bootstrap-table2-example/examples/columns/column-style-table.js +++ b/packages/react-bootstrap-table2-example/examples/columns/column-style-table.js @@ -17,8 +17,8 @@ const columns = [{ }, { dataField: 'name', text: 'Product Name', - style: (cell, row, colIndex) => { - if (row.id % 2 === 0) { + style: (cell, row, rowIndex, colIndex) => { + if (rowIndex % 2 === 0) { return { backgroundColor: '#81c784' }; @@ -43,8 +43,8 @@ const columns = [{ }, { dataField: 'name', text: 'Product Name', - style: (cell, row, colIndex) => { - if (row.id % 2 === 0) { + style: (cell, row, rowIndex, colIndex) => { + if (rowIndex % 2 === 0) { return { backgroundColor: '#81c784' }; diff --git a/packages/react-bootstrap-table2-example/examples/columns/column-title-table.js b/packages/react-bootstrap-table2-example/examples/columns/column-title-table.js index ec2ee76..f75455a 100644 --- a/packages/react-bootstrap-table2-example/examples/columns/column-title-table.js +++ b/packages/react-bootstrap-table2-example/examples/columns/column-title-table.js @@ -14,7 +14,7 @@ const columns = [{ }, { dataField: 'name', text: 'Product Name', - title: (cell, row, colIndex) => `this is custom title for ${cell}` + title: (cell, row, rowIndex, colIndex) => `this is custom title for ${cell}` }, { dataField: 'price', text: 'Product Price' @@ -28,7 +28,7 @@ const columns = [{ }, { dataField: 'name', text: 'Product Name', - title: (cell, row, colIndex) => \`this is custom title for \${cell}\` + title: (cell, row, rowIndex, colIndex) => \`this is custom title for \${cell}\` }, { dataField: 'price', text: 'Product Price' diff --git a/packages/react-bootstrap-table2/src/cell.js b/packages/react-bootstrap-table2/src/cell.js index 4cb1621..2126c93 100644 --- a/packages/react-bootstrap-table2/src/cell.js +++ b/packages/react-bootstrap-table2/src/cell.js @@ -21,18 +21,20 @@ const Cell = ({ row, rowIndex, column, columnIndex }) => { let content = _.get(row, dataField); const cellAttrs = { - ..._.isFunction(attrs) ? attrs(content, row, columnIndex) : attrs, + ..._.isFunction(attrs) ? attrs(content, row, rowIndex, columnIndex) : attrs, ...events }; - const cellClasses = _.isFunction(classes) ? classes(content, row, columnIndex) : classes; + const cellClasses = _.isFunction(classes) + ? classes(content, row, rowIndex, columnIndex) + : classes; if (style) { - cellStyle = _.isFunction(style) ? style(content, row, columnIndex) : style; + cellStyle = _.isFunction(style) ? style(content, row, rowIndex, columnIndex) : style; } if (title) { - cellTitle = _.isFunction(title) ? title(content, row, columnIndex) : content; + cellTitle = _.isFunction(title) ? title(content, row, rowIndex, columnIndex) : content; cellAttrs.title = cellTitle; } @@ -41,7 +43,7 @@ const Cell = ({ row, rowIndex, column, columnIndex }) => { } if (align) { - cellStyle.textAlign = _.isFunction(align) ? align(content, row, columnIndex) : align; + cellStyle.textAlign = _.isFunction(align) ? align(content, row, rowIndex, columnIndex) : align; } if (hidden) { diff --git a/packages/react-bootstrap-table2/test/cell.test.js b/packages/react-bootstrap-table2/test/cell.test.js index 1d1bebb..21e7400 100644 --- a/packages/react-bootstrap-table2/test/cell.test.js +++ b/packages/react-bootstrap-table2/test/cell.test.js @@ -81,6 +81,7 @@ describe('Cell', () => { describe('when column.style prop is defined', () => { let column; const columnIndex = 1; + const rowIndex = 1; beforeEach(() => { column = { @@ -93,7 +94,7 @@ describe('Cell', () => { beforeEach(() => { column.style = { backgroundColor: 'red' }; wrapper = shallow( - ); + ); }); it('should render successfully', () => { @@ -108,11 +109,11 @@ describe('Cell', () => { beforeEach(() => { styleCallBack = sinon.stub() - .withArgs(row[column.dataField], row, columnIndex) + .withArgs(row[column.dataField], row, rowIndex, columnIndex) .returns(returnStyle); column.style = styleCallBack; wrapper = shallow( - ); + ); }); afterEach(() => { styleCallBack.reset(); }); @@ -124,7 +125,9 @@ describe('Cell', () => { it('should call custom style function correctly', () => { expect(styleCallBack.callCount).toBe(1); - expect(styleCallBack.calledWith(row[column.dataField], row, columnIndex)).toBe(true); + expect( + styleCallBack.calledWith(row[column.dataField], row, rowIndex, columnIndex) + ).toBe(true); }); }); }); @@ -132,6 +135,7 @@ describe('Cell', () => { describe('when column.classes prop is defined', () => { let column; const columnIndex = 1; + const rowIndex = 1; beforeEach(() => { column = { @@ -144,7 +148,7 @@ describe('Cell', () => { beforeEach(() => { column.classes = 'td-test-class'; wrapper = shallow( - ); + ); }); it('should render successfully', () => { @@ -159,11 +163,11 @@ describe('Cell', () => { beforeEach(() => { classesCallBack = sinon.stub() - .withArgs(row[column.dataField], row, columnIndex) + .withArgs(row[column.dataField], row, rowIndex, columnIndex) .returns(returnClasses); column.classes = classesCallBack; wrapper = shallow( - ); + ); }); afterEach(() => { classesCallBack.reset(); }); @@ -175,7 +179,9 @@ describe('Cell', () => { it('should call custom classes function correctly', () => { expect(classesCallBack.callCount).toBe(1); - expect(classesCallBack.calledWith(row[column.dataField], row, columnIndex)).toBe(true); + expect( + classesCallBack.calledWith(row[column.dataField], row, rowIndex, columnIndex) + ).toBe(true); }); }); }); @@ -183,6 +189,7 @@ describe('Cell', () => { describe('when column.title prop is defined', () => { let column; const columnIndex = 1; + const rowIndex = 1; beforeEach(() => { column = { @@ -195,7 +202,7 @@ describe('Cell', () => { beforeEach(() => { column.title = true; wrapper = shallow( - ); + ); }); it('should render title as cell value as default', () => { @@ -210,11 +217,11 @@ describe('Cell', () => { beforeEach(() => { titleCallBack = sinon.stub() - .withArgs(row[column.dataField], row, columnIndex) + .withArgs(row[column.dataField], row, rowIndex, columnIndex) .returns(customTitle); column.title = titleCallBack; wrapper = shallow( - ); + ); }); it('should render title correctly by custom title function', () => { @@ -224,7 +231,9 @@ describe('Cell', () => { it('should call custom title function correctly', () => { expect(titleCallBack.callCount).toBe(1); - expect(titleCallBack.calledWith(row[column.dataField], row, columnIndex)).toBe(true); + expect( + titleCallBack.calledWith(row[column.dataField], row, rowIndex, columnIndex) + ).toBe(true); }); }); }); @@ -232,6 +241,7 @@ describe('Cell', () => { describe('when column.events prop is defined', () => { let column; const columnIndex = 1; + const rowIndex = 1; beforeEach(() => { column = { @@ -243,7 +253,7 @@ describe('Cell', () => { }; wrapper = shallow( - ); + ); }); it('should attachs DOM event successfully', () => { @@ -260,6 +270,7 @@ describe('Cell', () => { describe('when column.align prop is defined', () => { let column; const columnIndex = 1; + const rowIndex = 1; beforeEach(() => { column = { @@ -272,7 +283,7 @@ describe('Cell', () => { beforeEach(() => { column.align = 'center'; wrapper = shallow( - ); + ); }); it('should render style.textAlign correctly', () => { @@ -287,11 +298,11 @@ describe('Cell', () => { beforeEach(() => { alignCallBack = sinon.stub() - .withArgs(row[column.dataField], row, columnIndex) + .withArgs(row[column.dataField], row, rowIndex, columnIndex) .returns(customAlign); column.align = alignCallBack; wrapper = shallow( - ); + ); }); it('should render style.textAlign correctly', () => { @@ -301,7 +312,9 @@ describe('Cell', () => { it('should call custom headerAlign function correctly', () => { expect(alignCallBack.callCount).toBe(1); - expect(alignCallBack.calledWith(row[column.dataField], row, columnIndex)).toBe(true); + expect( + alignCallBack.calledWith(row[column.dataField], row, rowIndex, columnIndex) + ).toBe(true); }); }); }); @@ -309,6 +322,7 @@ describe('Cell', () => { describe('when column.attrs prop is defined', () => { let column; const columnIndex = 1; + const rowIndex = 1; beforeEach(() => { column = { @@ -412,11 +426,11 @@ describe('Cell', () => { beforeEach(() => { attrsCallBack = sinon.stub() - .withArgs(row[column.dataField], row, columnIndex) + .withArgs(row[column.dataField], row, rowIndex, columnIndex) .returns(customAttrs); column.attrs = attrsCallBack; wrapper = shallow( - ); + ); }); it('should render style.attrs correctly', () => { @@ -427,7 +441,9 @@ describe('Cell', () => { it('should call custom attrs function correctly', () => { expect(attrsCallBack.callCount).toBe(1); - expect(attrsCallBack.calledWith(row[column.dataField], row, columnIndex)).toBe(true); + expect( + attrsCallBack.calledWith(row[column.dataField], row, rowIndex, columnIndex) + ).toBe(true); }); }); });