From 20c83dab04d53d60b5fcd08aad3d5d9fbfb4fa5c Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期四, 19 十月 2023 19:46:05 +0800 Subject: [PATCH] Merge branch 'master' into positec --- src/tabviews/zshare/actionList/index.scss | 5 src/templates/zshare/editTable/index.jsx | 49 ++++++ src/templates/zshare/formconfig.jsx | 8 + src/menu/modulecell/index.jsx | 1 src/tabviews/custom/components/table/edit-table/normalTable/index.jsx | 167 +++++++++++++++++++++++ src/tabviews/zshare/mutilform/mkPopSelect/index.jsx | 12 + /dev/null | 40 ----- src/tabviews/custom/components/table/edit-table/normalTable/index.scss | 14 + src/templates/modalconfig/source.jsx | 5 src/tabviews/zshare/mutilform/mkPopSelect/index.scss | 6 src/menu/components/table/edit-table/columns/editColumn/index.jsx | 2 src/menu/datasource/verifycard/index.jsx | 18 +- src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx | 36 +++++ 13 files changed, 306 insertions(+), 57 deletions(-) diff --git a/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx b/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx index 8d56325..0254d8b 100644 --- a/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx +++ b/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx @@ -207,6 +207,42 @@ }, { value: 'switch', text: '寮�鍏�' + }, { + value: 'date', + text: '鏃ユ湡锛堝ぉ锛�' + }] + }, + { + type: 'radio', + key: 'precision', + label: '绮剧‘搴�', + initVal: card.precision || 'day', + options: [{ + value: 'day', + text: '澶�' + }, { + value: 'hour', + text: '灏忔椂' + }, { + value: 'minute', + text: '鍒嗛挓' + }, { + value: 'second', + text: '绉�' + }] + }, + { + type: 'radio', + key: 'declareType', + label: '鏁版嵁绫诲瀷', + tooltip: '澹版槑鍙橀噺鏃剁殑绫诲瀷锛屾椂闂存牸寮廳atetime鎴栨枃鏈牸寮弉varchar(50)銆�', + initVal: card.declareType || 'datetime', + options: [{ + value: 'datetime', + text: 'datetime' + }, { + value: 'nvarchar(50)', + text: 'nvarchar(50)' }] }, { diff --git a/src/menu/components/table/edit-table/columns/editColumn/index.jsx b/src/menu/components/table/edit-table/columns/editColumn/index.jsx index 595109f..9a107bb 100644 --- a/src/menu/components/table/edit-table/columns/editColumn/index.jsx +++ b/src/menu/components/table/edit-table/columns/editColumn/index.jsx @@ -71,6 +71,8 @@ if (this.record.editType === 'switch') { _options.push('enter', 'openVal', 'closeVal', 'openText', 'closeText', 'editField') + } else if (this.record.editType === 'date') { + _options.push('required', 'precision', 'enter', 'declareType') } else if (this.record.editType === 'select') { _options.push('required', 'enter', 'resourceType', 'linkSubField', 'editField', 'dropdown') diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx index 1ef5833..0ed4d4c 100644 --- a/src/menu/datasource/verifycard/index.jsx +++ b/src/menu/datasource/verifycard/index.jsx @@ -681,15 +681,17 @@ if (/鍒楀悕\s*'[a-zA-Z0-9_-]+'\s*鏃犳晥/.test(result.message)) { let tail = '' let type = '' - searches.forEach(item => { - if (item.forbid) return - item.key.split(',').forEach(field => { - if (new RegExp(`'${field}'`).test(result.message)) { - tail = field - type = '鎼滅储鏉′欢' - } + if (setting.execute !== 'false' && setting.queryType !== 'statistics') { + searches.forEach(item => { + if (item.forbid) return + item.key.split(',').forEach(field => { + if (new RegExp(`'${field}'`).test(result.message)) { + tail = field + type = '鎼滅储鏉′欢' + } + }) }) - }) + } if (!tail) { let keys = setting.order.replace(/\s+(asc|desc)/ig, '').replace(/\s+/g, '') diff --git a/src/menu/modulecell/index.jsx b/src/menu/modulecell/index.jsx index e3825af..66e9f76 100644 --- a/src/menu/modulecell/index.jsx +++ b/src/menu/modulecell/index.jsx @@ -52,6 +52,7 @@ { subType: 'textarea', text: '澶氳鏂囨湰', type: 'form' }, { subType: 'multiselect', text: '涓嬫媺澶氶��', type: 'form' }, { subType: 'link', text: '鑱斿姩鑿滃崟', type: 'form' }, + { subType: 'popSelect', text: '閫夋嫨鍣�', type: 'form' }, { subType: 'switch', text: '寮�鍏�', type: 'form' }, { subType: 'checkbox', text: '澶氶�夋', type: 'form' }, { subType: 'radio', text: '鍗曢�夋', type: 'form' }, diff --git a/src/tabviews/custom/components/table/edit-table/normalTable/cusSwitch/index.jsx b/src/tabviews/custom/components/table/edit-table/normalTable/cusSwitch/index.jsx deleted file mode 100644 index 6b16aea..0000000 --- a/src/tabviews/custom/components/table/edit-table/normalTable/cusSwitch/index.jsx +++ /dev/null @@ -1,49 +0,0 @@ -import React, {Component} from 'react' -import PropTypes from 'prop-types' -// import { is, fromJS } from 'immutable' -import { Switch } from 'antd' - -import './index.scss' - -class ColorSketch extends Component { - static propTpyes = { - defaultValue: PropTypes.any, - autoFocus: PropTypes.any, - config: PropTypes.object, - onChange: PropTypes.func - } - state = { - status: false - } - - UNSAFE_componentWillMount () { - const { defaultValue, config } = this.props - - let status = false - - if (defaultValue === config.openVal) { - status = true - } - - this.setState({status}) - } - - changeStatus = (val) => { - const { config } = this.props - this.setState({ status: val }, () => { - let _val = val ? config.openVal : config.closeVal - let _text = val ? config.openText : config.closeText - this.props.onChange(_val, _text) - }) - } - - render() { - const { config, autoFocus } = this.props - const { status } = this.state - return ( - <Switch checkedChildren={config.openText} autoFocus={autoFocus} onBlur={this.props.onBlur} unCheckedChildren={config.closeText} checked={status} onChange={this.changeStatus} /> - ) - } -} - -export default ColorSketch \ No newline at end of file diff --git a/src/tabviews/custom/components/table/edit-table/normalTable/cusSwitch/index.scss b/src/tabviews/custom/components/table/edit-table/normalTable/cusSwitch/index.scss deleted file mode 100644 index 96900ce..0000000 --- a/src/tabviews/custom/components/table/edit-table/normalTable/cusSwitch/index.scss +++ /dev/null @@ -1,40 +0,0 @@ -.color-sketch-block { - height: 25px; - width: 100%; - - .color-sketch-block-box { - display: inline-block; - width: calc(100% - 160px); - height: 100%; - border-radius: 2px; - background: #ffffff url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==') left center; - } - .color-sketch-block-inner { - display: inline-block; - cursor: pointer; - border-radius: 2px; - box-shadow: 0 0 0 1px rgba(0, 0, 0, .1); - width: 100%; - height: 100%; - } - .color-sketch-value { - display: inline-block; - width: 160px; - padding-left: 10px; - height: 25px; - line-height: 25px; - vertical-align: top; - white-space: nowrap; - overflow: visible; - } -} - -.color-sketch-popover { - z-index: 1090!important; - .ant-popover-inner-content { - padding: 0; - .sketch-picker { - width: 250px!important; - } - } -} \ No newline at end of file diff --git a/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx b/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx index 0f95fec..95e8350 100644 --- a/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx +++ b/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx @@ -1,7 +1,7 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import { is, fromJS } from 'immutable' -import { Table, Typography, Modal, Input, InputNumber, Button, notification, message, Select } from 'antd' +import { Table, Typography, Modal, Input, InputNumber, Switch, Button, notification, message, Select, DatePicker } from 'antd' import { EditOutlined, QuestionCircleOutlined } from '@ant-design/icons' import moment from 'moment' import md5 from 'md5' @@ -10,13 +10,96 @@ import asyncComponent from '@/utils/asyncComponent' import Utils, { getEditTableSql, getMark } from '@/utils/utils.js' import MKEmitter from '@/utils/events.js' -import CusSwitch from './cusSwitch' import Encrypts from '@/components/encrypts' import './index.scss' const { Paragraph } = Typography const MkIcon = asyncComponent(() => import('@/components/mk-icon')) const CardCellComponent = asyncComponent(() => import('@/tabviews/custom/components/card/cardcellList')) + +class CusSwitch extends Component { + static propTpyes = { + defaultValue: PropTypes.any, + autoFocus: PropTypes.any, + config: PropTypes.object, + onChange: PropTypes.func + } + + state = { + status: false + } + + UNSAFE_componentWillMount () { + const { defaultValue, config } = this.props + + let status = false + + if (defaultValue === config.openVal) { + status = true + } + + this.setState({status}) + } + + changeStatus = (val) => { + const { config } = this.props + this.setState({ status: val }, () => { + let _val = val ? config.openVal : config.closeVal + let _text = val ? config.openText : config.closeText + this.props.onChange(_val, _text) + }) + } + + render() { + const { config, autoFocus } = this.props + const { status } = this.state + return ( + <Switch checkedChildren={config.openText} autoFocus={autoFocus} onBlur={this.props.onBlur} unCheckedChildren={config.closeText} checked={status} onChange={this.changeStatus} /> + ) + } +} + +class CusDatePicker extends Component { + static propTpyes = { + defaultValue: PropTypes.any, + config: PropTypes.object, + onChange: PropTypes.func, + blur: PropTypes.func + } + + state = { + value: null, + open: false + } + + UNSAFE_componentWillMount () { + const { value, open } = this.props + + let _value = value || null + if (_value) { + _value = moment(_value, 'YYYY-MM-DD HH:mm:ss') + } + + this.setState({value: _value, open: open === true}) + } + + onOpenChange = (open) => { + this.setState({open}) + + if (open === false) { + this.props.blur() + } + } + + render() { + const { config } = this.props + const { value, open } = this.state + + return ( + <DatePicker dropdownClassName={'mk-date-picker ' + config.precision} showTime={config.format !== 'YYYY-MM-DD'} format={config.format} open={open} defaultValue={value} onChange={this.props.onChange} onOpenChange={this.onOpenChange}/> + ) + } +} class BodyRow extends React.Component { shouldComponentUpdate (nextProps, nextState) { @@ -254,6 +337,33 @@ MKEmitter.emit('changeRecord', col.tableId, {...record, ...values}) } + onDateChange = (val) => { + const { col, record } = this.props + + let _val = val ? moment(val).format(col.format) : '' + + if (col.precision === 'hour') { + _val = _val + ':00:00' + } else if (col.precision === 'minute') { + _val = _val + ':00' + } + + this.setState({editing: false}) + + setTimeout(() => { + if (/\$next/.test(col.enter)) { + MKEmitter.emit('nextLine', col, record.$$uuid) + } else if (col.enter === '$sub') { + MKEmitter.emit('subLine', col, record) + } else if (col.enter !== '$noAct') { + let node = document.getElementById(col.enter + record.$$uuid) + node && node.click() + } + }, 50) + + MKEmitter.emit('changeRecord', col.tableId, {...record, [col.field]: _val}) + } + switchBlur = () => { setTimeout(() => { this.setState({editing: false}) @@ -325,6 +435,10 @@ if (!col.editType || col.editType === 'text') { return (<td className="editing_table_cell"> <Input className={err ? 'has-error' : ''} title={err} id={col.uuid + record.$$uuid} defaultValue={value} onChange={(e) => this.onChange(e.target.value)} onPressEnter={this.enterPress} onBlur={this.onBlur}/> + </td>) + } else if (col.editType === 'date') { + return (<td className="editing_table_cell"> + <CusDatePicker config={col} value={record[col.field] || null} open={true} onChange={this.onDateChange} blur={() => this.setState({editing: false})}/> </td>) } else if (col.editType === 'switch') { let _value = record[col.field] !== undefined ? record[col.field] : '' @@ -694,6 +808,31 @@ MKEmitter.emit('changeRecord', col.tableId, {...record, ...values}) } + onDateChange = (val) => { + const { col, record } = this.props + + let _val = val ? moment(val).format(col.format) : '' + + if (col.precision === 'hour') { + _val = _val + ':00:00' + } else if (col.precision === 'minute') { + _val = _val + ':00' + } + + setTimeout(() => { + if (/\$next/.test(col.enter)) { + MKEmitter.emit('nextLine', col, record.$$uuid) + } else if (col.enter === '$sub') { + MKEmitter.emit('subLine', col, record) + } else if (col.enter !== '$noAct') { + let node = document.getElementById(col.enter + record.$$uuid) + node && node.click() + } + }, 50) + + MKEmitter.emit('changeRecord', col.tableId, {...record, [col.field]: _val}) + } + render() { let { col, config, record, style, className, ...resProps } = this.props const { err } = this.state @@ -717,6 +856,10 @@ } else if (col.editType === 'switch') { children = ( <CusSwitch config={col} autoFocus={false} defaultValue={_value} onChange={this.onSwitchChange} onBlur={() => {}}/> + ) + } else if (col.editType === 'date') { + children = ( + <CusDatePicker config={col} value={record[col.field] || null} onChange={this.onDateChange} blur={() => {}}/> ) } else { children = (<> @@ -1042,6 +1185,16 @@ item.map.set(cell.value, cell.label) }) } + } else if (item.type === 'text' && item.editType === 'date') { + item.format = 'YYYY-MM-DD' + + if (item.precision === 'hour') { + item.format = 'YYYY-MM-DD HH' + } else if (item.precision === 'minute') { + item.format = 'YYYY-MM-DD HH:mm' + } else if (item.precision === 'second') { + item.format = 'YYYY-MM-DD HH:mm:ss' + } } } @@ -1075,7 +1228,13 @@ if (item.field === setting.primaryKey) return if (_forms[item.field]) { - forms.push({..._forms[item.field], datatype: item.datatype}) + let _item = {..._forms[item.field]} + if (_item.editType === 'date') { + _item.datatype = _item.declareType || 'datetime' + } else { + _item.datatype = item.datatype + } + forms.push(_item) } else { forms.push(item) } @@ -1665,6 +1824,8 @@ let val = item[col.field] !== undefined ? (item[col.field] + '') : '' if (col.required === 'true' && !val) { line.push(`${col.label}涓嶅彲涓虹┖`) + } else if (col.datatype === 'datetime' && !val) { + val = '1949-10-01' } item[col.field] = val } else if (col.type === 'number') { diff --git a/src/tabviews/custom/components/table/edit-table/normalTable/index.scss b/src/tabviews/custom/components/table/edit-table/normalTable/index.scss index 873f7e7..be948ed 100644 --- a/src/tabviews/custom/components/table/edit-table/normalTable/index.scss +++ b/src/tabviews/custom/components/table/edit-table/normalTable/index.scss @@ -9,7 +9,7 @@ >.ant-table-wrapper { position: relative; - z-index: 1; + // z-index: 1; } .ant-table { color: inherit; @@ -188,6 +188,14 @@ border: 1px solid var(--mk-sys-color); } } + .ant-calendar-picker { + display: block; + position: absolute; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + } .has-error, .has-error .ant-input-number-input { border-color: #ff4d4f!important; } @@ -220,6 +228,10 @@ text-align: inherit; } } + .ant-calendar-picker { + display: block; + height: 30px; + } .has-error, .has-error .ant-input-number-input { border-color: #ff4d4f!important; } diff --git a/src/tabviews/zshare/actionList/index.scss b/src/tabviews/zshare/actionList/index.scss index 1d31f09..23d8916 100644 --- a/src/tabviews/zshare/actionList/index.scss +++ b/src/tabviews/zshare/actionList/index.scss @@ -56,7 +56,10 @@ height: 34px; border-radius: 0px; padding-left: 15px!important; - border-bottom-width: 1px!important; + border: none; + color: rgba(0, 0, 0, 0.65)!important; + border-bottom: 1px solid #e8e8e8!important; + background: #ffffff!important; .anticon { display: none; } diff --git a/src/tabviews/zshare/mutilform/mkPopSelect/index.jsx b/src/tabviews/zshare/mutilform/mkPopSelect/index.jsx index 0181c89..320dceb 100644 --- a/src/tabviews/zshare/mutilform/mkPopSelect/index.jsx +++ b/src/tabviews/zshare/mutilform/mkPopSelect/index.jsx @@ -55,7 +55,7 @@ dataIndex: col.field, title: col.label, sorter: col.IsSort === 'true', - width: 120 + width: col.Width || 120 }) }) @@ -350,8 +350,16 @@ dataSource={options} loading={loading} onRow={(record) => { + let className = '' + + if (record.$disabled) { + className = ' mk-disable-line ' + } else if (value === record.$$uuid) { + className = ' ant-table-row-selected ' + } + return { - className: value === record.$$uuid ? ' ant-table-row-selected ' : '', + className: className, onClick: () => {this.changeRow(record)}, } }} diff --git a/src/tabviews/zshare/mutilform/mkPopSelect/index.scss b/src/tabviews/zshare/mutilform/mkPopSelect/index.scss index 245486d..9fb18d8 100644 --- a/src/tabviews/zshare/mutilform/mkPopSelect/index.scss +++ b/src/tabviews/zshare/mutilform/mkPopSelect/index.scss @@ -39,6 +39,12 @@ tr.ant-table-row-selected td { background-color: var(--mk-sys-color3); } + tr:not(.mk-disable-line) { + cursor: pointer; + } + .mk-disable-line { + color: rgba(0, 0, 0, 0.35); + } } } .ant-modal-body::-webkit-scrollbar { diff --git a/src/templates/modalconfig/source.jsx b/src/templates/modalconfig/source.jsx index 58be363..d5bce34 100644 --- a/src/templates/modalconfig/source.jsx +++ b/src/templates/modalconfig/source.jsx @@ -102,6 +102,11 @@ }, { type: 'form', + label: '閫夋嫨鍣�', + subType: 'popSelect', + }, + { + type: 'form', label: '寮�鍏�', subType: 'switch', }, diff --git a/src/templates/zshare/editTable/cusSwitch/index.jsx b/src/templates/zshare/editTable/cusSwitch/index.jsx deleted file mode 100644 index 82cd954..0000000 --- a/src/templates/zshare/editTable/cusSwitch/index.jsx +++ /dev/null @@ -1,54 +0,0 @@ -import React, {Component} from 'react' -import PropTypes from 'prop-types' -// import { is, fromJS } from 'immutable' -import { Switch } from 'antd' - -import './index.scss' - -class ColorSketch extends Component { - static propTpyes = { - defaultValue: PropTypes.any, - value: PropTypes.any, - onChange: PropTypes.func - } - state = { - status: true, - } - - UNSAFE_componentWillMount () { - const { defaultValue, value } = this.props - let initVal = 'true' - - if (this.props['data-__meta']) { - initVal = this.props['data-__meta'].initialValue - } else if (defaultValue) { - initVal = defaultValue - } else if (value) { - initVal = value - } - - if (initVal === 'false') { - initVal = false - } else { - initVal = true - } - - this.setState({status: initVal}) - } - - changeStatus = (val) => { - this.setState({ status: val }, () => { - let _val = val ? 'true' : 'false' - this.props.onChange && this.props.onChange(_val) - }) - } - - render() { - const { status } = this.state - return ( - <Switch checkedChildren="鏄�" unCheckedChildren="鍚�" checked={status} onChange={this.changeStatus} /> - ) - } -} - -export default ColorSketch \ No newline at end of file diff --git a/src/templates/zshare/editTable/cusSwitch/index.scss b/src/templates/zshare/editTable/cusSwitch/index.scss deleted file mode 100644 index 96900ce..0000000 --- a/src/templates/zshare/editTable/cusSwitch/index.scss +++ /dev/null @@ -1,40 +0,0 @@ -.color-sketch-block { - height: 25px; - width: 100%; - - .color-sketch-block-box { - display: inline-block; - width: calc(100% - 160px); - height: 100%; - border-radius: 2px; - background: #ffffff url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==') left center; - } - .color-sketch-block-inner { - display: inline-block; - cursor: pointer; - border-radius: 2px; - box-shadow: 0 0 0 1px rgba(0, 0, 0, .1); - width: 100%; - height: 100%; - } - .color-sketch-value { - display: inline-block; - width: 160px; - padding-left: 10px; - height: 25px; - line-height: 25px; - vertical-align: top; - white-space: nowrap; - overflow: visible; - } -} - -.color-sketch-popover { - z-index: 1090!important; - .ant-popover-inner-content { - padding: 0; - .sketch-picker { - width: 250px!important; - } - } -} \ No newline at end of file diff --git a/src/templates/zshare/editTable/index.jsx b/src/templates/zshare/editTable/index.jsx index 24902d3..eeb913e 100644 --- a/src/templates/zshare/editTable/index.jsx +++ b/src/templates/zshare/editTable/index.jsx @@ -2,13 +2,12 @@ import PropTypes from 'prop-types' import { is, fromJS } from 'immutable' import { DndProvider, DragSource, DropTarget } from 'react-dnd' -import { Table, Input, InputNumber, Popconfirm, Form, Select, Radio, Cascader, notification, message, Modal, Typography } from 'antd' +import { Table, Input, InputNumber, Popconfirm, Switch, Form, Select, Radio, Cascader, notification, message, Modal, Typography } from 'antd' import { CopyOutlined, EditOutlined, DeleteOutlined, SwapOutlined, PlusOutlined } from '@ant-design/icons' import Utils from '@/utils/utils.js' import ColorSketch from '@/mob/colorsketch' import asyncComponent from '@/utils/asyncComponent' -import CusSwitch from './cusSwitch' import MKEmitter from '@/utils/events.js' import './index.scss' @@ -19,6 +18,52 @@ let dragingIndex = -1 const { Paragraph } = Typography +class CusSwitch extends Component { + static propTpyes = { + defaultValue: PropTypes.any, + value: PropTypes.any, + onChange: PropTypes.func + } + state = { + status: true + } + + UNSAFE_componentWillMount () { + const { defaultValue, value } = this.props + let initVal = 'true' + + if (this.props['data-__meta']) { + initVal = this.props['data-__meta'].initialValue + } else if (defaultValue) { + initVal = defaultValue + } else if (value) { + initVal = value + } + + if (initVal === 'false') { + initVal = false + } else { + initVal = true + } + + this.setState({status: initVal}) + } + + changeStatus = (val) => { + this.setState({ status: val }, () => { + let _val = val ? 'true' : 'false' + this.props.onChange && this.props.onChange(_val) + }) + } + + render() { + const { status } = this.state + return ( + <Switch checkedChildren="鏄�" unCheckedChildren="鍚�" checked={status} onChange={this.changeStatus} /> + ) + } +} + class BodyRow extends React.Component { render() { const { isOver, moveAble, connectDragSource, connectDropTarget, moveRow, ...restProps } = this.props diff --git a/src/templates/zshare/formconfig.jsx b/src/templates/zshare/formconfig.jsx index 6e13fc6..a6170ab 100644 --- a/src/templates/zshare/formconfig.jsx +++ b/src/templates/zshare/formconfig.jsx @@ -3116,6 +3116,14 @@ return '鍚�' } } + }, + { + title: '鍒楀', + dataIndex: 'Width', + inputType: 'number', + editable: true, + width: '20%', + initval: 120 } ] }, -- Gitblit v1.8.0