diff --git a/docs/api.md b/docs/api.md index fb66cde..58884e5 100644 --- a/docs/api.md +++ b/docs/api.md @@ -83,6 +83,7 @@ import 'bee-table/build/Table.css'; | [v2.2.2新增]showRowNum | 展示序号功能,false时不展示,true时展示默认情况,可传入自定义配置信息 | bool / obj:{name: '序号', key: '_index', // 在数据中存储的key值width: 50,base: 0,// 排序的基准值,为数字或者字母type:'number', // 排序类型,默认为number类型,支持单字母排序(type='ascii')} | false | | autoCheckedByClickRows | 设置为 false 时,表格行点击事件,不会自动勾选复选框 | bool | true | +| autoSelect | 树型表格勾选时,是否开启子节点的联动 | bool | false | > 快捷键部分参考示例 (快捷键在table中的简单使用应用) *注意: data参数中的key值必需,否则会导致部分功能出现问题!建议使用唯一的值,如id* @@ -137,11 +138,35 @@ import 'bee-table/build/Table.css'; | [v2.2.2新增]bgColor | 列背景颜色 | string | - | | [v2.2.2新增]titleAlign | 标题对齐方式 | 'left'\|'center'\|'right' | 'left' | | [v2.2.2新增]contentAlign | 内容对齐方式 | 'left'\|'center'\|'right' | 'left' | -| [v2.2.2新增]required | 必填项,列标题展示红色星号 | bool | false | +| [v2.2.2新增]required | 必填项的列标题展示红色星号 | bool | false | +| isShow | 是否展示该列数据 | bool | true | +| cellMenu | 渲染单元格内操作按钮 | object | - | + +#### [v2.2.x新增] cellMenu + +属性的参数说明如下: + +|名称|说明|类型|必填|默认值| +|---|---|---|---|---| +|menu|自定义的操作列表|array|是|[]| +|icon|自定义图标|string/element|否|三圆点图标``| +|iconSize|自定义图标时可能会出现右侧对齐的问题,需要手动调整图标大小|number|否|21| +|trigger|控制下拉菜单的出现方式|'hover'\|'click'|否|'hover'| +|className|下拉菜单的类名|string|否|-| + +其中,menu的配置如下: +|名称|说明|类型|必填|默认值| +|---|---|---|---|---| +|key|每一项需要的唯一的key值|string|true|-| +|text|每一项的标题|string|false|-| +|icon|每一项的图标信息|string/element|false|-| +|callback|点击行后的回调函数|Function(text,record,index)|false|-| #### [v2.2.2新增]fieldType -fieldType属性控制了不同类型数据的渲染方式,其优先级低于render属性。目前,已有`string`,`number`,`currency`,`bool`,`link`,`date`类型,支持自定义配置(`string`类型为默认类型)。 +fieldType属性控制了不同类型数据的渲染方式,其优先级低于render属性。目前,已有`string`,`number`,`currency`,`bool`,`link`,`date`,`select`,`stringChinese`类型,支持自定义配置(`string`类型为默认类型)。 + +- stringChinese类型的渲染同string,在配合高阶组件sort使用时,可支持中文拼音排序 - numberConfig @@ -194,6 +219,15 @@ fieldType属性控制了不同类型数据的渲染方式,其优先级低于rend *需要单独安装[moment.js](http://momentjs.cn/),并将moment对象传入* +- selectConfig + +|名称|说明|类型|必填项|默认值| +|---|---|---|---|---| +|options|下拉的key/value对应关系|object|是|-| +|defaultShow|找不到对应关系时的展示值|string|否|''| + +*无options时按string类型渲染* + ### 高阶函数 Table内部封装了七个高阶组件,接收基础 Table 组件作为输入,输出一个新的复杂 Table 组件。高阶组件让代码更具有复用性、逻辑性与抽象特征。 diff --git a/src/ColumnManager.js b/src/ColumnManager.js index d640cd2..b0c9073 100644 --- a/src/ColumnManager.js +++ b/src/ColumnManager.js @@ -24,12 +24,24 @@ export default class ColumnManager { columns = dragHandleColumn.concat(columns); } columns = this.addOrderColumn(columns,showRowNum); - + columns = this.deleteColumnNotShow(columns); this.columns = columns || this.normalize(elements); this.originWidth = originWidth; } + // delete the column which does not show + deleteColumnNotShow = (columns) => { + let len = columns.length; + for(let i=0; i < len; i++) { + if(columns && columns[i] && columns[i].isShow === false){ + columns.splice(i,1); + i--; + } + } + return columns; + } + // 向数据列中添加一列:序号 addOrderColumn = (columns, showRowNum) => { if(!showRowNum){ @@ -207,6 +219,7 @@ export default class ColumnManager { reset(columns, elements, showRowNum) { columns = this.addOrderColumn(columns,showRowNum); + columns = this.deleteColumnNotShow(columns); this.columns = columns || this.normalize(elements); this._cached = {}; } diff --git a/src/Table.scss b/src/Table.scss index 2a43b26..8db86d1 100644 --- a/src/Table.scss +++ b/src/Table.scss @@ -128,6 +128,31 @@ $icon-color:#505F79; margin: 0; } } + td.u-table-inline-icon{ + position: relative; + padding-right: 24px; + span.u-table-inline-op-icon{ + position: absolute; + right: 0; + .uf{ + display: block; + vertical-align: top; + } + } + span.u-table-inline-op-icon-hover{ + visibility: hidden; + } + } + } + tr.u-table-row-hover{ + td.u-table-inline-icon{ + span.u-table-inline-op-icon-hover{ + visibility: visible; + } + } + } + .u-table-inline-op-icon-hidden{ + visibility: hidden; } tr.tr-row-hover { background: $hover-bg-color-base; @@ -313,6 +338,7 @@ $icon-color:#505F79; } tr.u-table-row-hover{ background:unquote("rgb(#{$table-row-hover-bg-color})"); + } } &-expand-icon { @@ -1091,3 +1117,15 @@ $icon-color:#505F79; border-color: #F44336 !important; } } +.u-dropdown{ + ul.u-table-inline-op-dropdowm{ + li.u-dropdown-menu-item{ + padding: 0 20px 0 10px; + height: 30px; + line-height: 30px; + i.uf{ + font-size: 12px; + } + } + } +} diff --git a/src/TableCell.js b/src/TableCell.js index a0fae66..c645612 100644 --- a/src/TableCell.js +++ b/src/TableCell.js @@ -4,6 +4,9 @@ import objectPath from 'object-path'; import i18n from './lib/i18n'; import { getComponentLocale } from 'bee-locale/build/tool'; import { formatMoney } from './lib/utils'; +import Dropdown from 'bee-dropdown'; +import Menu from 'bee-menus'; +const { Item } = Menu; const propTypes = { record: PropTypes.object, clsPrefix: PropTypes.string, @@ -19,6 +22,9 @@ class TableCell extends Component{ super(props); this.isInvalidRenderCellText = this.isInvalidRenderCellText.bind(this); this.handleClick = this.handleClick.bind(this); + this.state = { + showDropdowm: false + } } isInvalidRenderCellText(text) { return text && !React.isValidElement(text) && @@ -108,13 +114,66 @@ class TableCell extends Component{ ; } - // 渲染时间类型 + // 渲染时间类型-l renderDate = ( data, config={}) => { const { moment, format } = config; if(!moment)return data; return moment(data).format(format || 'YYYY-MM-DD'); } + // 渲染下拉类型,主要为编辑表格铺垫 + renderSelect = ( data, config={}) => { + if(config.options){ + data = config.options[data] || config.defaultShow; + } + return data; + } + + + // 渲染行内菜单 + renderColumnMenu = (colMenu, text, record, index) => { + if (!colMenu) return null; + let { menu, trigger = 'hover', className = '', icon = , iconSize = 21 } = colMenu; + let items = []; + items = menu.map((item) => { + return { this.onClickColMenu(item.callback, text, record, index) }}> + {item.icon} + {item.text} + + }) + if (items.length === 0) return null; + className += ' u-table-inline-op-dropdowm' + let menus = {items}; + let top = `calc(50% - ${iconSize / 2}px)`; + let visibility = this.state.showDropdowm ? 'visible' : ''; + let iconClassName = `u-table-inline-op-icon u-table-inline-op-icon-hover`; + return + {{icon}} + + } + + // 下拉按钮状态改变,点击后保持图标常驻 + changeShowDropdowm = (val) => { + this.setState({ + showDropdowm: val + }) + } + + // 菜单点击事件 + onClickColMenu = (callback, text, record, index) => { + if (callback) { + callback(text, record, index); + } + this.setState({ + showDropdowm: false, + }) + } + render() { const { record, indentSize, clsPrefix, indent, index, expandIcon, column ,fixed,showSum, bodyDisplayInRow,lazyStartIndex,lazyEndIndex} = this.props; @@ -136,6 +195,7 @@ class TableCell extends Component{ } } + let colMenu = this.renderColumnMenu(column.cellMenu, text, record, index); // 根据 fieldType 来渲染数据 if(!render){ switch(column.fieldType){ @@ -173,6 +233,10 @@ class TableCell extends Component{ text = this.renderDate(text, column.dateConfig); break; } + case 'select':{ + text = this.renderSelect(text, column.selectConfig); + break; + } default : { break; } @@ -213,6 +277,9 @@ class TableCell extends Component{ if(expandIcon && expandIcon.props.expandable){ className = className+` ${clsPrefix}-has-expandIcon` } + if(colMenu){ + className += ' u-table-inline-icon' + } return ( {indentText} {expandIcon} {text} + {colMenu} ); }