筛选渲染器 ,查看 示例的源码
- 默认支持原生的:input、textarea、select
配置参数:
className 自定义容器的 className
isFooter 是否显示底部按钮
diff --git a/examples/views/table/renderer/Form.vue b/examples/views/table/renderer/Form.vue
index 60bf45c86..07076ba26 100644
--- a/examples/views/table/renderer/Form.vue
+++ b/examples/views/table/renderer/Form.vue
@@ -1,7 +1,7 @@
- 表单-项渲染器 ,查看 示例的源码
+ 表单-项渲染器 ,查看 示例的源码
配置参数:
renderItem (h, renderOpts, params) 项
itemVisibleMethod (params) 项可视函数
diff --git a/examples/views/table/start/Icons.vue b/examples/views/table/start/Icons.vue
index 6c950a648..8a362a511 100644
--- a/examples/views/table/start/Icons.vue
+++ b/examples/views/table/start/Icons.vue
@@ -31,11 +31,13 @@
zoomIn: 'vxe-icon--zoomin',
zoomOut: 'vxe-icon--zoomout',
custom: 'vxe-icon--menu',
+ inputClear: 'vxe-icon--close',
jumpPrev: 'vxe-icon--d-arrow-left',
jumpNext: 'vxe-icon--d-arrow-right',
prevPage: 'vxe-icon--arrow-left',
nextPage: 'vxe-icon--arrow-right',
jumpMore: 'vxe-icon--more',
+ pageSize: 'vxe-icon--caret-bottom',
modalZoomIn: 'vxe-icon--square',
modalZoomOut: 'vxe-icon--zoomout',
modalClose: 'vxe-icon--close',
@@ -45,8 +47,7 @@
modalError: 'vxe-icon--error',
modalQuestion: 'vxe-icon--question',
modalLoading: 'vxe-icon--refresh roll',
- caretBottom: 'vxe-icon--caret-bottom',
- dropdownBottom: 'vxe-icon--arrow-bottom',
+ dropdownBtn: 'vxe-icon--arrow-bottom',
btnLoading: 'vxe-icon--refresh roll'
}
})
diff --git a/examples/views/table/start/Use.vue b/examples/views/table/start/Use.vue
index 1034b5f17..e10264dc1 100644
--- a/examples/views/table/start/Use.vue
+++ b/examples/views/table/start/Use.vue
@@ -42,7 +42,7 @@
import {
// 实例
VXETable,
- // 依赖
+ // 模块
Icon,
Column,
Header,
@@ -58,6 +58,7 @@
Checkbox,
Radio,
Input,
+ Select,
Button,
Modal,
Edit,
@@ -91,6 +92,7 @@
Vue.use(Checkbox)
Vue.use(Radio)
Vue.use(Input)
+ Vue.use(Select)
Vue.use(Button)
Vue.use(Modal)
Vue.use(Edit)
diff --git a/examples/views/table/tree/Basic.vue b/examples/views/table/tree/Basic.vue
index d34eb9f66..5c9b4c041 100644
--- a/examples/views/table/tree/Basic.vue
+++ b/examples/views/table/tree/Basic.vue
@@ -2,7 +2,7 @@
树表格,通过配置 和指定列 属性来开启树表格,通过 指定主键,还可以通过 指定触发方式
- (注:不支持大量数据,大数据你可以将树结构铺平为列表进行展示)
+ (注:树结构不支持大量数据)
diff --git a/examples/views/table/tree/Edit.vue b/examples/views/table/tree/Edit.vue
index cfdb9718c..c552a7e0e 100644
--- a/examples/views/table/tree/Edit.vue
+++ b/examples/views/table/tree/Edit.vue
@@ -1,6 +1,6 @@
-
可编辑树表格,还可以通过手动调用展开收起
注:树形结构默认不支持 insert 相关方法,如果要往子节点插入数据,你可以把表格当成一个子组件进行封装,自行操作数据源即可
+
可编辑树表格,还可以通过手动调用展开收起
(注:树形结构默认不支持 insert 相关方法,如果要往子节点插入数据,你可以把表格当成一个子组件进行封装,自行操作数据源即可)
diff --git a/examples/views/table/tree/Normal.vue b/examples/views/table/tree/Normal.vue
index 577abd2ee..4f192fa96 100644
--- a/examples/views/table/tree/Normal.vue
+++ b/examples/views/table/tree/Normal.vue
@@ -1,6 +1,6 @@
-
普通树
+
普通树
(注:树结构不支持大量数据)
diff --git a/examples/views/table/tree/Template.vue b/examples/views/table/tree/Template.vue
index a2fe45899..d1dd4ab00 100644
--- a/examples/views/table/tree/Template.vue
+++ b/examples/views/table/tree/Template.vue
@@ -1,6 +1,6 @@
-
使用自定义模板渲染
+
使用自定义模板渲染
(注:树结构不支持大量数据)
diff --git a/packages/button/src/button.js b/packages/button/src/button.js
index c8c776b9a..01e85cbb3 100644
--- a/packages/button/src/button.js
+++ b/packages/button/src/button.js
@@ -8,6 +8,7 @@ export default {
type: String,
size: String,
name: [String, Number],
+ content: String,
status: String,
icon: String,
disabled: Boolean,
@@ -66,7 +67,7 @@ export default {
}, XEUtils.objectMap($listeners, (cb, type) => evnt => this.$emit(type, evnt)))
}, this.renderContent(h).concat([
h('i', {
- class: `vxe-button--dropdown-arrow ${GlobalConfig.icon.dropdownBottom}`
+ class: `vxe-button--dropdown-arrow ${GlobalConfig.icon.dropdownBtn}`
})
])),
h('div', {
@@ -99,7 +100,7 @@ export default {
},
methods: {
renderContent (h) {
- const { $scopedSlots, icon, loading } = this
+ const { $scopedSlots, content, icon, loading } = this
const contents = []
if (loading) {
contents.push(
@@ -115,9 +116,9 @@ export default {
)
}
if ($scopedSlots.default) {
- contents.push(
- $scopedSlots.default.call(this)
- )
+ contents.push($scopedSlots.default.call(this))
+ } else if (content) {
+ contents.push(UtilTools.getFuncText(content))
}
return contents
},
diff --git a/packages/conf/index.js b/packages/conf/index.js
index 2618e7595..e7b073ee7 100644
--- a/packages/conf/index.js
+++ b/packages/conf/index.js
@@ -105,6 +105,7 @@ const GlobalConfig = {
prevPage: 'vxe-icon--arrow-left',
nextPage: 'vxe-icon--arrow-right',
jumpMore: 'vxe-icon--more',
+ pageSize: 'vxe-icon--caret-bottom',
modalZoomIn: 'vxe-icon--square',
modalZoomOut: 'vxe-icon--zoomout',
modalClose: 'vxe-icon--close',
@@ -114,8 +115,7 @@ const GlobalConfig = {
modalError: 'vxe-icon--error',
modalQuestion: 'vxe-icon--question',
modalLoading: 'vxe-icon--refresh roll',
- caretBottom: 'vxe-icon--caret-bottom',
- dropdownBottom: 'vxe-icon--arrow-bottom',
+ dropdownBtn: 'vxe-icon--arrow-bottom',
btnLoading: 'vxe-icon--refresh roll'
},
grid: {
diff --git a/packages/input/src/create.js b/packages/input/src/create.js
index a237a3122..1160bc2bb 100644
--- a/packages/input/src/create.js
+++ b/packages/input/src/create.js
@@ -83,9 +83,13 @@ export default function (compName) {
},
attrs,
on: XEUtils.objectMap($listeners, (cb, type) => evnt => {
+ const typeInput = type === 'input'
const value = evnt.target.value
- const params = type === 'input' ? value : { value }
- this.$emit(type, params, evnt)
+ const params = { value }
+ this.$emit(type, typeInput ? value : params, evnt)
+ if (typeInput) {
+ this.$emit('change', params, evnt)
+ }
})
}),
isClearable || suffixIcon ? h('span', {
@@ -108,16 +112,16 @@ export default function (compName) {
methods: {
clickPrefixEvent (evnt) {
if (!this.disabled) {
- this.$emit('prefix-click', {}, evnt)
+ this.$emit('prefix-click', { value: this.value }, evnt)
}
},
clickSuffixEvent (evnt) {
if (!this.disabled) {
if (DomTools.hasClass(evnt.currentTarget, 'is--clear')) {
this.$emit('input', '')
- this.$emit('clear', {}, evnt)
+ this.$emit('clear', { value: '' }, evnt)
} else {
- this.$emit('suffix-click', {}, evnt)
+ this.$emit('suffix-click', { value: this.value }, evnt)
}
}
}
diff --git a/packages/locale/lang/en-US.js b/packages/locale/lang/en-US.js
index 7826412ab..1478928de 100644
--- a/packages/locale/lang/en-US.js
+++ b/packages/locale/lang/en-US.js
@@ -54,8 +54,8 @@ export default {
},
pager: {
goto: 'Go to',
- pagesize: '/page',
- total: 'Total {{total}} record',
+ pagesize: '{{0}}/page',
+ total: 'Total {{0}} record',
pageClassifier: '',
prevPage: 'Previous page',
nextPage: 'next page',
diff --git a/packages/locale/lang/ja-JP.js b/packages/locale/lang/ja-JP.js
index 0c705d7bc..8521e089d 100644
--- a/packages/locale/lang/ja-JP.js
+++ b/packages/locale/lang/ja-JP.js
@@ -54,8 +54,8 @@ export default {
},
pager: {
goto: '移動',
- pagesize: '件/ページ',
- total: '全 {{total}} 件',
+ pagesize: '{{0}}件/ページ',
+ total: '全 {{0}} 件',
pageClassifier: '',
prevPage: '上一页',
nextPage: '下一页',
diff --git a/packages/locale/lang/zh-CN.js b/packages/locale/lang/zh-CN.js
index ede24159e..f878304db 100644
--- a/packages/locale/lang/zh-CN.js
+++ b/packages/locale/lang/zh-CN.js
@@ -54,8 +54,8 @@ export default {
},
pager: {
goto: '前往',
- pagesize: '条/页',
- total: '共 {{total}} 条记录',
+ pagesize: '{{0}}条/页',
+ total: '共 {{0}} 条记录',
pageClassifier: '页',
prevPage: '上一页',
nextPage: '下一页',
diff --git a/packages/locale/lang/zh-TW.js b/packages/locale/lang/zh-TW.js
index 77503f7c6..66fec3768 100644
--- a/packages/locale/lang/zh-TW.js
+++ b/packages/locale/lang/zh-TW.js
@@ -54,8 +54,8 @@ export default {
},
pager: {
goto: '前往',
- pagesize: '項/頁',
- total: '共 {{total}} 項記錄',
+ pagesize: '{{0}}項/頁',
+ total: '共 {{0}} 項記錄',
pageClassifier: '頁',
prevPage: '上一頁',
nextPage: '下一頁',
diff --git a/packages/pager/src/pager.js b/packages/pager/src/pager.js
index d0dac41a6..b42837177 100644
--- a/packages/pager/src/pager.js
+++ b/packages/pager/src/pager.js
@@ -1,6 +1,6 @@
import XEUtils from 'xe-utils/methods/xe-utils'
import GlobalConfig from '../../conf'
-import { UtilTools, DomTools, GlobalEvent } from '../../tools'
+import { UtilTools } from '../../tools'
export default {
name: 'VxePager',
@@ -40,13 +40,6 @@ export default {
default: null
}
},
- data () {
- return {
- showSizes: false,
- panelStyle: null,
- panelIndex: 0
- }
- },
computed: {
vSize () {
return this.size || this.$parent.size || this.$parent.vSize
@@ -69,15 +62,6 @@ export default {
return Math.floor((this.pagerCount - 2) / 2)
}
},
- created () {
- this.panelIndex = UtilTools.nextZIndex()
- GlobalEvent.on(this, 'mousedown', this.handleGlobalMousedownEvent)
- GlobalEvent.on(this, 'keydown', this.handleGlobalKeydownEvent)
- },
- destroyed () {
- GlobalEvent.off(this, 'mousedown')
- GlobalEvent.off(this, 'keydown')
- },
render (h) {
const { vSize, align } = this
return h('div', {
@@ -190,42 +174,23 @@ export default {
},
// sizes
renderSizes (h) {
- return h('span', {
- class: ['vxe-pager--sizes', {
- 'is--active': this.showSizes
- }],
- ref: 'sizeBtn'
- }, [
- h('span', {
- class: 'size--content',
- on: {
- click: this.toggleSizePanel
+ return h('vxe-select', {
+ class: 'vxe-pager--sizes',
+ props: {
+ placement: 'top'
+ },
+ model: {
+ value: this.pageSize,
+ callback: num => this.pageSizeEvent(num)
+ }
+ }, this.pageSizes.map(num => {
+ return h('vxe-option', {
+ props: {
+ value: num,
+ label: `${XEUtils.template(GlobalConfig.i18n('vxe.pager.pagesize'), [num])}`
}
- }, [
- h('span', `${this.pageSize}${GlobalConfig.i18n('vxe.pager.pagesize')}`),
- h('i', {
- class: `vxe-pager--sizes-arrow ${GlobalConfig.icon.caretBottom}`
- })
- ]),
- h('div', {
- class: 'vxe-pager-size--select-wrapper',
- style: this.panelStyle,
- ref: 'sizePanel'
- }, [
- h('ul', {
- class: 'vxe-pager-size--select'
- }, this.pageSizes.map(num => {
- return h('li', {
- class: ['size--option', {
- 'is--active': num === this.pageSize
- }],
- on: {
- click: () => this.pageSizeEvent(num)
- }
- }, `${num}${GlobalConfig.i18n('vxe.pager.pagesize')}`)
- }))
- ])
- ])
+ })
+ }))
},
// FullJump
renderFullJump (h) {
@@ -265,7 +230,7 @@ export default {
}, [
h('span', {
class: 'vxe-pager--separator'
- }, '/'),
+ }),
h('span', this.pageCount)
])
},
@@ -273,7 +238,7 @@ export default {
renderTotal (h) {
return h('span', {
class: 'vxe-pager--total'
- }, XEUtils.template(GlobalConfig.i18n('vxe.pager.total'), { total: this.total }))
+ }, XEUtils.template(GlobalConfig.i18n('vxe.pager.total'), [this.total]))
},
// number
renderPageBtn (h, showJump) {
@@ -333,28 +298,6 @@ export default {
getPageCount (total, size) {
return Math.max(Math.ceil(total / size), 1)
},
- handleGlobalMousedownEvent (evnt) {
- const $refs = this.$refs
- if (this.showSizes && !(DomTools.getEventTargetNode(evnt, $refs.sizeBtn).flag || DomTools.getEventTargetNode(evnt, $refs.sizePanel).flag)) {
- this.hideSizePanel()
- }
- },
- handleGlobalKeydownEvent (evnt) {
- const keyCode = evnt.keyCode
- const isUpArrow = keyCode === 38
- const isDwArrow = keyCode === 40
- if ((isUpArrow || isDwArrow) && this.showSizes) {
- evnt.preventDefault()
- const { pageSizes, pageSize } = this
- let sizeIndex = XEUtils.findIndexOf(pageSizes, num => num === pageSize)
- if (isUpArrow && sizeIndex > 0) {
- sizeIndex--
- } else if (isDwArrow && sizeIndex < pageSizes.length - 1) {
- sizeIndex++
- }
- this.changePageSize(pageSizes[sizeIndex])
- }
- },
prevPage () {
const currentPage = this.currentPage
if (currentPage > 1) {
@@ -383,7 +326,6 @@ export default {
},
pageSizeEvent (pageSize) {
this.changePageSize(pageSize)
- this.hideSizePanel()
},
changePageSize (pageSize) {
const type = 'size-change'
@@ -412,29 +354,6 @@ export default {
},
emitPageChange (type, pageSize, currentPage) {
UtilTools.emitEvent(this, 'page-change', [{ type, pageSize, currentPage }])
- },
- toggleSizePanel () {
- this[this.showSizes ? 'hideSizePanel' : 'showSizePanel']()
- },
- updateZindex () {
- if (this.panelIndex < UtilTools.getLastZIndex()) {
- this.panelIndex = UtilTools.nextZIndex()
- }
- },
- showSizePanel () {
- this.showSizes = true
- this.updateZindex()
- this.$nextTick(() => {
- const { sizeBtn, sizePanel } = this.$refs
- this.panelStyle = {
- zIndex: this.panelIndex,
- bottom: `${sizeBtn.clientHeight + 6}px`,
- left: `-${sizePanel.clientWidth / 2 - sizeBtn.clientWidth / 2}px`
- }
- })
- },
- hideSizePanel () {
- this.showSizes = false
}
}
}
diff --git a/packages/select/index.js b/packages/select/index.js
index a4d87fdec..8e5ac37cf 100644
--- a/packages/select/index.js
+++ b/packages/select/index.js
@@ -1,11 +1,11 @@
import VxeSelect from './src/select'
import VxeOption from './src/option'
-import VxeOptionGroup from './src/option-group'
+import VxeOptgroup from './src/optgroup'
VxeSelect.install = function (Vue) {
Vue.component(VxeSelect.name, VxeSelect)
Vue.component(VxeOption.name, VxeOption)
- Vue.component(VxeOptionGroup.name, VxeOptionGroup)
+ Vue.component(VxeOptgroup.name, VxeOptgroup)
}
export const Pager = VxeSelect
diff --git a/packages/select/src/option-group.js b/packages/select/src/optgroup.js
similarity index 77%
rename from packages/select/src/option-group.js
rename to packages/select/src/optgroup.js
index 24547b7ee..adb571a6e 100644
--- a/packages/select/src/option-group.js
+++ b/packages/select/src/optgroup.js
@@ -1,7 +1,7 @@
import { UtilTools } from '../../tools'
export default {
- name: 'VxeOptionGroup',
+ name: 'VxeOptgroup',
props: {
label: [String, Number],
disabled: Boolean,
@@ -9,7 +9,7 @@ export default {
},
provide () {
return {
- $xegroup: this
+ $xeoptgroup: this
}
},
inject: {
@@ -30,13 +30,13 @@ export default {
},
render (h) {
return h('div', {
- class: 'vxe-select-option-group'
+ class: 'vxe-optgroup'
}, [
h('div', {
- class: 'vxe-select-option-group--title'
+ class: 'vxe-optgroup--title'
}, UtilTools.getFuncText(this.label)),
h('div', {
- class: 'vxe-select-option-group--wrapper'
+ class: 'vxe-optgroup--wrapper'
}, this.$slots.default)
])
}
diff --git a/packages/select/src/option.js b/packages/select/src/option.js
index 8c61c7d68..98d722d70 100644
--- a/packages/select/src/option.js
+++ b/packages/select/src/option.js
@@ -14,7 +14,7 @@ export default {
$xeselect: {
default: null
},
- $xegroup: {
+ $xeoptgroup: {
default: null
}
},
@@ -28,8 +28,8 @@ export default {
return this.size || this.$parent.size || this.$parent.vSize
},
isDisabled () {
- const { $xegroup, disabled } = this
- return ($xegroup && $xegroup.disabled) || disabled
+ const { $xeoptgroup, disabled } = this
+ return ($xeoptgroup && $xeoptgroup.disabled) || disabled
}
},
warch: {
diff --git a/packages/select/src/select.js b/packages/select/src/select.js
index 2317c08c8..09c56ad4f 100644
--- a/packages/select/src/select.js
+++ b/packages/select/src/select.js
@@ -75,8 +75,10 @@ export default {
clearable: Boolean,
placeholder: String,
disabled: Boolean,
+ prefixIcon: String,
placement: String,
- size: String
+ size: String,
+ transfer: Boolean
},
components: {
VxeInput
@@ -115,19 +117,32 @@ export default {
this.panelIndex = UtilTools.nextZIndex()
GlobalEvent.on(this, 'mousedown', this.handleGlobalMousedownEvent)
GlobalEvent.on(this, 'keydown', this.handleGlobalKeydownEvent)
- GlobalEvent.on(this, 'resize', this.handleGlobalResizeEvent)
+ GlobalEvent.on(this, 'mousewheel', this.handleGlobalMousewheelEvent)
+ GlobalEvent.on(this, 'blur', this.handleGlobalBlurEvent)
+ },
+ mounted () {
+ if (this.transfer) {
+ document.body.appendChild(this.$refs.panel)
+ }
+ },
+ beforeDestroy () {
+ const panelElem = this.$refs.panel
+ if (panelElem && panelElem.parentNode) {
+ panelElem.parentNode.removeChild(panelElem)
+ }
},
destroyed () {
GlobalEvent.off(this, 'mousedown')
GlobalEvent.off(this, 'keydown')
- GlobalEvent.off(this, 'resize')
+ GlobalEvent.off(this, 'mousewheel')
+ GlobalEvent.off(this, 'blur')
},
render (h) {
- const { vSize, isActivated, disabled, clearable, placeholder, selectLabel, showPanel, panelStyle } = this
+ const { vSize, transfer, isActivated, disabled, clearable, placeholder, selectLabel, showPanel, panelStyle, prefixIcon } = this
return h('div', {
class: ['vxe-select', {
- 'is--visivle': showPanel,
[`size--${vSize}`]: vSize,
+ 'is--visivle': showPanel,
'is--disabled': disabled,
'is--active': isActivated
}]
@@ -140,6 +155,7 @@ export default {
readonly: true,
disabled: disabled,
type: 'text',
+ prefixIcon: prefixIcon,
suffixIcon: `vxe-icon--caret-bottom${showPanel ? ' rotate180' : ''}`,
value: selectLabel
},
@@ -154,6 +170,7 @@ export default {
ref: 'panel',
class: ['vxe-select-option--panel', {
[`size--${vSize}`]: vSize,
+ 'is--transfer': transfer,
'is--visivle': showPanel
}],
style: panelStyle
@@ -172,7 +189,7 @@ export default {
if (!option.isDisabled && option.$xeselect) {
let children = option.$children
if (children.length) {
- children = children.filter(option => !option.isDisabled && option.$xeselect && option.$xegroup)
+ children = children.filter(option => !option.isDisabled && option.$xeselect && option.$xeoptgroup)
if (children.length) {
options.push({ comp: option, children })
}
@@ -258,8 +275,13 @@ export default {
}
}
},
- handleGlobalResizeEvent () {
- this.updatePlacement()
+ handleGlobalMousewheelEvent (evnt) {
+ if (!DomTools.getEventTargetNode(evnt, this.$el).flag && !DomTools.getEventTargetNode(evnt, this.$refs.panel).flag) {
+ this.hideOptionPanel()
+ }
+ },
+ handleGlobalBlurEvent () {
+ this.hideOptionPanel()
},
updateZindex () {
if (this.panelIndex < UtilTools.getLastZIndex()) {
@@ -293,24 +315,42 @@ export default {
},
updatePlacement () {
this.$nextTick(() => {
- const { $refs, placement, panelIndex } = this
+ const { $refs, transfer, placement, panelIndex } = this
const inputElem = $refs.input.$el
const panelElem = $refs.panel
const inputHeight = inputElem.offsetHeight
+ const inputWidth = inputElem.offsetWidth
const panelHeight = panelElem.offsetHeight
const panelStyle = {
zIndex: panelIndex
}
- const { boundingTop, visibleHeight } = DomTools.getAbsolutePos(inputElem)
- if (placement) {
- if (placement === 'top') {
- if (boundingTop > panelHeight) {
- panelStyle.bottom = `${inputHeight}px`
+ const { boundingTop, boundingLeft, visibleHeight } = DomTools.getAbsolutePos(inputElem)
+ if (transfer) {
+ const left = boundingLeft
+ let top = boundingTop + inputHeight
+ if (placement !== 'top') {
+ // 如果下面不够放,则向上
+ if (top + panelHeight > visibleHeight) {
+ top = boundingTop - panelHeight
+ }
+ // 如果上面不够放,则向下(优先)
+ if (top < 0) {
+ top = boundingTop + inputHeight
}
}
+ Object.assign(panelStyle, {
+ left: `${left}px`,
+ top: `${top}px`,
+ minWidth: `${inputWidth}px`
+ })
} else {
- if (boundingTop + inputHeight + panelHeight > visibleHeight) {
+ if (placement === 'top') {
panelStyle.bottom = `${inputHeight}px`
+ } else {
+ // 如果下面不够放,则向上
+ if (boundingTop + inputHeight + panelHeight > visibleHeight) {
+ panelStyle.bottom = `${inputHeight}px`
+ }
}
}
this.panelStyle = panelStyle
diff --git a/packages/table/src/methods.js b/packages/table/src/methods.js
index 3730894e8..530669f92 100644
--- a/packages/table/src/methods.js
+++ b/packages/table/src/methods.js
@@ -1320,31 +1320,34 @@ const Methods = {
if (validTip && DomTools.getEventTargetNode(evnt, validTip.$el).flag) {
// 如果是激活状态,且点击了校验提示框
} else if (!this.lastCallTime || this.lastCallTime + 50 < Date.now()) {
- // 如果手动调用了激活单元格,避免触发源被移除后导致重复关闭
- this.preventEvent(evnt, 'event.clearActived', actived.args, () => {
- let isClear
- if (editOpts.mode === 'row') {
- const rowNode = DomTools.getEventTargetNode(evnt, $el, 'vxe-body--row')
- // row 方式,如果点击了不同行
- isClear = rowNode.flag ? getRowNode(rowNode.targetElem).item !== getRowNode(actived.args.cell.parentNode).item : false
- } else {
- // cell 方式,如果是非编辑列
- isClear = !DomTools.getEventTargetNode(evnt, $el, 'col--edit').flag
- }
- if (!isClear) {
- isClear = DomTools.getEventTargetNode(evnt, $el, 'vxe-header--row').flag
- }
- if (!isClear) {
- isClear = DomTools.getEventTargetNode(evnt, $el, 'vxe-footer--row').flag
- }
- if (
- isClear ||
- // 如果点击了当前表格之外
- !DomTools.getEventTargetNode(evnt, $el).flag
- ) {
- setTimeout(() => this.clearActived(evnt))
- }
- })
+ // 如果是激活状态,且点击了下拉选项
+ if (!DomTools.getEventTargetNode(evnt, document.body, 'vxe-select-option--panel').flag) {
+ // 如果手动调用了激活单元格,避免触发源被移除后导致重复关闭
+ this.preventEvent(evnt, 'event.clearActived', actived.args, () => {
+ let isClear
+ if (editOpts.mode === 'row') {
+ const rowNode = DomTools.getEventTargetNode(evnt, $el, 'vxe-body--row')
+ // row 方式,如果点击了不同行
+ isClear = rowNode.flag ? getRowNode(rowNode.targetElem).item !== getRowNode(actived.args.cell.parentNode).item : false
+ } else {
+ // cell 方式,如果是非编辑列
+ isClear = !DomTools.getEventTargetNode(evnt, $el, 'col--edit').flag
+ }
+ if (!isClear) {
+ isClear = DomTools.getEventTargetNode(evnt, $el, 'vxe-header--row').flag
+ }
+ if (!isClear) {
+ isClear = DomTools.getEventTargetNode(evnt, $el, 'vxe-footer--row').flag
+ }
+ if (
+ isClear ||
+ // 如果点击了当前表格之外
+ !DomTools.getEventTargetNode(evnt, $el).flag
+ ) {
+ setTimeout(() => this.clearActived(evnt))
+ }
+ })
+ }
}
}
} else if (mouseConfig) {
diff --git a/packages/v-x-e-table/src/renderer.js b/packages/v-x-e-table/src/renderer.js
index 73a0db5a6..e44d1b4f7 100644
--- a/packages/v-x-e-table/src/renderer.js
+++ b/packages/v-x-e-table/src/renderer.js
@@ -1,18 +1,26 @@
import XEUtils from 'xe-utils/methods/xe-utils'
import { UtilTools } from '../../tools'
-function getAttrs ({ name, attrs }) {
+function getDefaultComponentName ({ name }) {
+ return `vxe-${name.replace('$', '')}`
+}
+
+function getNativeAttrs ({ name, attrs }) {
if (name === 'input') {
attrs = Object.assign({ type: 'text' }, attrs)
}
return attrs
}
-function isSyncCell (renderOpts, params) {
- return renderOpts.immediate || renderOpts.type === 'visible' || params.isEdit
+function getDefaultProps ({ $table }, { props }, defaultProps) {
+ return XEUtils.assign($table.vSize ? { size: $table.vSize } : {}, defaultProps, props)
}
-function getEvents (renderOpts, params) {
+function isSyncCell (renderOpts) {
+ return renderOpts.immediate || renderOpts.type === 'visible'
+}
+
+function getNativeEvents (renderOpts, params) {
const { name, events } = renderOpts
const { $table, row, column } = params
const { model } = column
@@ -42,14 +50,34 @@ function getEvents (renderOpts, params) {
return on
}
+function getDefaultEvents (renderOpts, params) {
+ const { events } = renderOpts
+ const { $table } = params
+ const type = 'change'
+ const on = {
+ [type] (obj, evnt) {
+ $table.updateStatus(params)
+ if (events && events[type]) {
+ events[type](params, evnt)
+ }
+ }
+ }
+ if (events) {
+ return XEUtils.assign({}, XEUtils.objectMap(events, evntFn => function (...args) {
+ args = [params].concat(args)
+ evntFn(...args)
+ }), on)
+ }
+ return on
+}
+
/**
- * 内置渲染器
- * 支持原生的 input、textarea、select
+ * 原生-可编辑渲染器 input、textarea、select
*/
-function defaultEditRender (h, renderOpts, params) {
+function nativeEditRender (h, renderOpts, params) {
const { row, column } = params
const { name } = renderOpts
- const attrs = getAttrs(renderOpts)
+ const attrs = getNativeAttrs(renderOpts)
const cellValue = isSyncCell(renderOpts, params) ? UtilTools.getCellValue(row, column) : column.model.value
return [
h(name, {
@@ -58,33 +86,67 @@ function defaultEditRender (h, renderOpts, params) {
domProps: {
value: cellValue
},
- on: getEvents(renderOpts, params)
+ on: getNativeEvents(renderOpts, params)
})
]
}
-function renderOptgroups (h, renderOpts, params, renderOptionsMethods) {
+function defaultEditRender (h, renderOpts, params) {
+ const { row, column } = params
+ const cellValue = UtilTools.getCellValue(row, column)
+ const props = getDefaultProps(params, renderOpts)
+ return [
+ h(getDefaultComponentName(renderOpts), {
+ model: {
+ value: cellValue,
+ callback (value) {
+ UtilTools.setCellValue(row, column, value)
+ }
+ },
+ props,
+ on: getDefaultEvents(renderOpts, params)
+ })
+ ]
+}
+
+function defaultButtonsEditRender (h, renderOpts, params) {
+ return renderOpts.children.map(child => defaultEditRender(h, Object.assign({ name: 'button' }, child), params)[0])
+}
+
+function renderNativeOptgroups (h, renderOpts, params, renderOptionsMethods) {
const { optionGroups, optionGroupProps = {} } = renderOpts
const groupOptions = optionGroupProps.options || 'options'
const groupLabel = optionGroupProps.label || 'label'
- return optionGroups.map((group, gIndex) => {
+ return optionGroups.map(group => {
return h('optgroup', {
domProps: {
label: group[groupLabel]
- },
- key: gIndex
+ }
}, renderOptionsMethods(h, group[groupOptions], renderOpts, params))
})
}
-function renderOptions (h, options, renderOpts, params) {
+function renderDefaultOptgroups (h, renderOpts, params, renderOptionsMethods) {
+ const { optionGroups, optionGroupProps = {} } = renderOpts
+ const groupOptions = optionGroupProps.options || 'options'
+ const groupLabel = optionGroupProps.label || 'label'
+ return optionGroups.map(group => {
+ return h('vxe-optgroup', {
+ props: {
+ label: group[groupLabel]
+ }
+ }, renderOptionsMethods(h, group[groupOptions], renderOpts, params))
+ })
+}
+
+function renderNativeOptions (h, options, renderOpts, params) {
const { optionProps = {} } = renderOpts
const { row, column } = params
const labelProp = optionProps.label || 'label'
const valueProp = optionProps.value || 'value'
const disabledProp = optionProps.disabled || 'disabled'
const cellValue = isSyncCell(renderOpts, params) ? UtilTools.getCellValue(row, column) : column.model.value
- return options.map((item, index) => {
+ return options.map(item => {
return h('option', {
attrs: {
value: item[valueProp],
@@ -93,18 +155,33 @@ function renderOptions (h, options, renderOpts, params) {
domProps: {
/* eslint-disable eqeqeq */
selected: item[valueProp] == cellValue
- },
- key: index
+ }
}, item[labelProp])
})
}
+function renderDefaultOptions (h, options, renderOpts) {
+ const { optionProps = {} } = renderOpts
+ const labelProp = optionProps.label || 'label'
+ const valueProp = optionProps.value || 'value'
+ const disabledProp = optionProps.disabled || 'disabled'
+ return options.map(item => {
+ return h('vxe-option', {
+ props: {
+ value: item[valueProp],
+ label: item[labelProp],
+ disabled: item[disabledProp]
+ }
+ })
+ })
+}
+
function handleConfirmFilter (params, column, checked, item) {
const { $panel } = params
$panel[column.filterMultiple ? 'changeMultipleOption' : 'changeRadioOption']({}, checked, item)
}
-function getFilterEvents (item, renderOpts, params) {
+function getNativeFilterEvents (item, renderOpts, params) {
const { column } = params
const { events } = renderOpts
const type = name === 'select' ? 'change' : 'input'
@@ -126,10 +203,32 @@ function getFilterEvents (item, renderOpts, params) {
return on
}
-function defaultFilterRender (h, renderOpts, params) {
+function getDefaultFilterEvents (item, renderOpts, params) {
+ const { column } = params
+ const { events } = renderOpts
+ const type = 'change'
+ const on = {
+ [type] (evnt) {
+ item.data = evnt.target.value
+ handleConfirmFilter(params, column, !!item.data, item)
+ if (events && events[type]) {
+ events[type](params, evnt)
+ }
+ }
+ }
+ if (events) {
+ return XEUtils.assign({}, XEUtils.objectMap(events, evntFn => function (...args) {
+ args = [params].concat(args)
+ evntFn(...args)
+ }), on)
+ }
+ return on
+}
+
+function nativeFilterRender (h, renderOpts, params) {
const { column } = params
const { name } = renderOpts
- const attrs = getAttrs(renderOpts)
+ const attrs = getNativeAttrs(renderOpts)
return column.filters.map(item => {
return h(name, {
class: `vxe-default-${name}`,
@@ -137,26 +236,62 @@ function defaultFilterRender (h, renderOpts, params) {
domProps: {
value: item.data
},
- on: getFilterEvents(item, renderOpts, params)
+ on: getNativeFilterEvents(item, renderOpts, params)
})
})
}
-function defaultFilterMethod ({ option, row, column }) {
+function defaultFilterRender (h, renderOpts, params) {
+ const { column } = params
+ const props = getDefaultProps(renderOpts, renderOpts)
+ return column.filters.map(item => {
+ return h(getDefaultComponentName(renderOpts), {
+ model: {
+ value: item.data,
+ callback (value) {
+ item.data = value
+ }
+ },
+ props,
+ on: getDefaultFilterEvents(item, renderOpts, params)
+ })
+ })
+}
+
+function handleFilterMethod ({ option, row, column }) {
const { data } = option
const cellValue = XEUtils.get(row, column.property)
/* eslint-disable eqeqeq */
return cellValue == data
}
-function renderSelectEdit (h, renderOpts, params) {
+function nativeSelectEditRender (h, renderOpts, params) {
return [
h('select', {
class: 'vxe-default-select',
- attrs: getAttrs(renderOpts),
- on: getEvents(renderOpts, params)
+ attrs: getNativeAttrs(renderOpts),
+ on: getNativeEvents(renderOpts, params)
},
- renderOpts.optionGroups ? renderOptgroups(h, renderOpts, params, renderOptions) : renderOptions(h, renderOpts.options, renderOpts, params))
+ renderOpts.optionGroups ? renderNativeOptgroups(h, renderOpts, params, renderNativeOptions) : renderNativeOptions(h, renderOpts.options, renderOpts, params))
+ ]
+}
+
+function defaultSelectEditRender (h, renderOpts, params) {
+ const { row, column } = params
+ const cellValue = UtilTools.getCellValue(row, column)
+ const props = getDefaultProps(params, renderOpts, { transfer: true })
+ return [
+ h(getDefaultComponentName(renderOpts), {
+ model: {
+ value: cellValue,
+ callback (value) {
+ UtilTools.setCellValue(row, column, value)
+ }
+ },
+ props,
+ on: getDefaultEvents(renderOpts, params)
+ },
+ renderOpts.optionGroups ? renderDefaultOptgroups(h, renderOpts, params, renderDefaultOptions) : renderDefaultOptions(h, renderOpts.options, renderOpts, params))
]
}
@@ -182,7 +317,7 @@ function getSelectCellValue (renderOpts, { row, column }) {
return selectItem ? selectItem[labelProp] : cellValue
}
-function getFormEvents (renderOpts, params) {
+function getNativeFormEvents (renderOpts, params) {
const { $form, data, property } = params
const { events } = renderOpts
const type = name === 'select' ? 'change' : 'input'
@@ -205,13 +340,39 @@ function getFormEvents (renderOpts, params) {
return on
}
+function getDefaultFormEvents (renderOpts, params) {
+ const { $form, data, property } = params
+ const { events } = renderOpts
+ const type = 'change'
+ const on = {
+ [type] ({ value: itemValue }, evnt) {
+ XEUtils.set(data, property, itemValue)
+ $form.updateStatus(params, itemValue)
+ if (events && events[type]) {
+ events[type](params, evnt)
+ }
+ }
+ }
+ if (events) {
+ return XEUtils.assign({}, XEUtils.objectMap(events, evntFn => function (...args) {
+ args = [params].concat(args)
+ evntFn(...args)
+ }), on)
+ }
+ return on
+}
+
+function getDefaultFormItemProps ({ $form }, { props }, defaultProps) {
+ return XEUtils.assign($form.vSize ? { size: $form.vSize } : {}, defaultProps, props)
+}
+
/**
- * 表单渲染器
+ * 原生-表单渲染器
*/
-function defaultItemRender (h, renderOpts, params) {
+function nativeItemRender (h, renderOpts, params) {
const { data, property } = params
const { name } = renderOpts
- const attrs = getAttrs(renderOpts)
+ const attrs = getNativeAttrs(renderOpts)
const itemValue = XEUtils.get(data, property)
return [
h(name, {
@@ -220,12 +381,34 @@ function defaultItemRender (h, renderOpts, params) {
domProps: attrs && name === 'input' && (attrs.type === 'submit' || attrs.type === 'reset') ? null : {
value: itemValue
},
- on: getFormEvents(renderOpts, params)
+ on: getNativeFormEvents(renderOpts, params)
})
]
}
-function renderFormOptions (h, options, renderOpts, params) {
+function defaultItemRender (h, renderOpts, params) {
+ const { data, property } = params
+ const itemValue = XEUtils.get(data, property)
+ const props = getDefaultFormItemProps(params, renderOpts)
+ return [
+ h(getDefaultComponentName(renderOpts), {
+ model: {
+ value: itemValue,
+ callback (value) {
+ XEUtils.set(data, property, value)
+ }
+ },
+ props,
+ on: getDefaultFormEvents(renderOpts, params)
+ })
+ ]
+}
+
+function defaultButtonsItemRender (h, renderOpts, params) {
+ return renderOpts.children.map(child => defaultItemRender(h, Object.assign({ name: 'button' }, child), params)[0])
+}
+
+function renderNativeFormOptions (h, options, renderOpts, params) {
const { data, property } = params
const { optionProps = {} } = renderOpts
const labelProp = optionProps.label || 'label'
@@ -257,23 +440,23 @@ function createExportMethod (valueMethod, isEdit) {
const renderMap = {
input: {
autofocus: 'input',
- renderEdit: defaultEditRender,
- renderDefault: defaultEditRender,
- renderFilter: defaultFilterRender,
- filterMethod: defaultFilterMethod,
- renderItem: defaultItemRender
+ renderEdit: nativeEditRender,
+ renderDefault: nativeEditRender,
+ renderFilter: nativeFilterRender,
+ filterMethod: handleFilterMethod,
+ renderItem: nativeItemRender
},
textarea: {
autofocus: 'textarea',
- renderEdit: defaultEditRender,
- renderDefault: defaultEditRender,
- renderFilter: defaultFilterRender,
- filterMethod: defaultFilterMethod,
- renderItem: defaultItemRender
+ renderEdit: nativeEditRender,
+ renderDefault: nativeEditRender,
+ renderFilter: nativeFilterRender,
+ filterMethod: handleFilterMethod,
+ renderItem: nativeItemRender
},
select: {
- renderEdit: renderSelectEdit,
- renderDefault: renderSelectEdit,
+ renderEdit: nativeSelectEditRender,
+ renderDefault: nativeSelectEditRender,
renderCell (h, renderOpts, params) {
return getSelectCellValue(renderOpts, params)
},
@@ -282,21 +465,84 @@ const renderMap = {
return column.filters.map(item => {
return h('select', {
class: 'vxe-default-select',
- attrs: getAttrs(renderOpts),
- on: getFilterEvents(item, renderOpts, params)
+ attrs: getNativeAttrs(renderOpts),
+ on: getNativeFilterEvents(item, renderOpts, params)
},
- renderOpts.optionGroups ? renderOptgroups(h, renderOpts, params, renderOptions) : renderOptions(h, renderOpts.options, renderOpts, params))
+ renderOpts.optionGroups ? renderNativeOptgroups(h, renderOpts, params, renderNativeOptions) : renderNativeOptions(h, renderOpts.options, renderOpts, params))
})
},
- filterMethod: defaultFilterMethod,
+ filterMethod: handleFilterMethod,
renderItem (h, renderOpts, params) {
return [
h('select', {
class: 'vxe-default-select',
- attrs: getAttrs(renderOpts),
- on: getFormEvents(renderOpts, params)
+ attrs: getNativeAttrs(renderOpts),
+ on: getNativeFormEvents(renderOpts, params)
},
- renderOpts.optionGroups ? renderOptgroups(h, renderOpts, params, renderFormOptions) : renderFormOptions(h, renderOpts.options, renderOpts, params))
+ renderOpts.optionGroups ? renderNativeOptgroups(h, renderOpts, params, renderNativeFormOptions) : renderNativeFormOptions(h, renderOpts.options, renderOpts, params))
+ ]
+ },
+ editCellExportMethod: createExportMethod(getSelectCellValue, true),
+ cellExportMethod: createExportMethod(getSelectCellValue)
+ },
+ $input: {
+ autofocus: '.vxe-input--inner',
+ renderEdit: defaultEditRender,
+ renderDefault: defaultEditRender,
+ renderFilter: defaultFilterRender,
+ filterMethod: handleFilterMethod,
+ renderItem: defaultItemRender
+ },
+ $button: {
+ renderEdit: defaultEditRender,
+ renderDefault: defaultEditRender,
+ renderItem: defaultItemRender
+ },
+ $buttons: {
+ renderEdit: defaultButtonsEditRender,
+ renderDefault: defaultButtonsEditRender,
+ renderItem: defaultButtonsItemRender
+ },
+ $select: {
+ renderEdit: defaultSelectEditRender,
+ renderDefault: defaultSelectEditRender,
+ renderCell (h, renderOpts, params) {
+ return getSelectCellValue(renderOpts, params)
+ },
+ renderFilter (h, renderOpts, params) {
+ const { column } = params
+ const props = getDefaultProps(params, renderOpts, { transfer: true })
+ return column.filters.map(item => {
+ return h(getDefaultComponentName(renderOpts), {
+ model: {
+ value: item.data,
+ callback (value) {
+ item.data = value
+ }
+ },
+ props,
+ on: getDefaultFilterEvents(item, renderOpts, params)
+ },
+ renderOpts.optionGroups ? renderDefaultOptgroups(h, renderOpts, params, renderDefaultOptions) : renderDefaultOptions(h, renderOpts.options, renderOpts, params))
+ })
+ },
+ filterMethod: handleFilterMethod,
+ renderItem (h, renderOpts, params) {
+ const { data, property } = params
+ const itemValue = XEUtils.get(data, property)
+ const props = getDefaultFormItemProps(params, renderOpts, { transfer: true })
+ return [
+ h(getDefaultComponentName(renderOpts), {
+ model: {
+ value: itemValue,
+ callback (value) {
+ UtilTools.setCellValue(data, property, value)
+ }
+ },
+ props,
+ on: getDefaultFormEvents(renderOpts, params)
+ },
+ renderOpts.optionGroups ? renderDefaultOptgroups(h, renderOpts, params, renderDefaultOptions) : renderDefaultOptions(h, renderOpts.options, renderOpts, params))
]
},
editCellExportMethod: createExportMethod(getSelectCellValue, true),
diff --git a/styles/pager.scss b/styles/pager.scss
index 9de29604f..f17317743 100644
--- a/styles/pager.scss
+++ b/styles/pager.scss
@@ -101,12 +101,8 @@
height: 28px;
line-height: 26px;
}
- .vxe-pager--sizes {
- .vxe-pager--sizes-arrow {
- top: 8px;
- }
- }
- .vxe-pager--jump .vxe-pager--goto {
+ .vxe-pager--jump .vxe-pager--goto,
+ .vxe-pager--sizes > .vxe-input {
height: 28px;
}
}
@@ -123,12 +119,8 @@
height: 26px;
line-height: 24px;
}
- .vxe-pager--sizes {
- .vxe-pager--sizes-arrow {
- top: 7px;
- }
- }
- .vxe-pager--jump .vxe-pager--goto {
+ .vxe-pager--jump .vxe-pager--goto,
+ .vxe-pager--sizes > .vxe-input {
height: 26px;
}
}
@@ -145,12 +137,8 @@
height: 24px;
line-height: 22px;
}
- .vxe-pager--sizes {
- .vxe-pager--sizes-arrow {
- top: 6px;
- }
- }
- .vxe-pager--jump .vxe-pager--goto {
+ .vxe-pager--jump .vxe-pager--goto,
+ .vxe-pager--sizes > .vxe-input {
height: 24px;
}
}
@@ -160,7 +148,6 @@
.vxe-pager--total,
.vxe-pager--prev-btn,
.vxe-pager--next-btn,
- .vxe-pager--sizes,
.vxe-pager--jump,
.vxe-pager--jump-prev,
.vxe-pager--jump-next,
@@ -173,8 +160,7 @@
.vxe-pager--jump-prev,
.vxe-pager--num-btn,
.vxe-pager--jump-next,
- .vxe-pager--next-btn,
- .vxe-pager--sizes {
+ .vxe-pager--next-btn {
cursor: pointer;
}
.vxe-pager--count,
@@ -188,6 +174,14 @@
line-height: 28px;
display: inline-block;
}
+ .vxe-pager--jump .vxe-pager--goto,
+ .vxe-pager--sizes > .vxe-input {
+ height: 30px;
+ }
+ .vxe-pager--sizes > .vxe-select-option--panel .vxe-select-option {
+ height: 22px;
+ line-height: 22px;
+ }
.vxe-pager--btn-wrapper {
list-style-type: none;
padding: 0;
@@ -248,45 +242,31 @@
margin-top: -2px;
}
.vxe-pager--sizes {
- position: relative;
- border-radius: 4px;
- padding: 0;
- border: 1px solid $vxe-input-border-color;
- color: $vxe-font-color;
+ width: 100px;
text-align: center;
display: inline-block;
- @include animatTransition(border);
- &.is--active {
- border: 1px solid $vxe-primary-color;
- .vxe-pager--sizes-arrow {
- transform: rotate(180deg);
- }
- .vxe-pager-size--select-wrapper {
- display: block;
- }
- }
- .vxe-pager--sizes-arrow {
- position: absolute;
- right: 5px;
- top: 9px;
- font-size: 12px;
- @include animatTransition(transform, .2s);
- }
- .size--content {
- padding: 0 22px 0 10px;
- display: block;
+ vertical-align: middle;
+ & .vxe-input--inner {
+ text-align: center;
}
}
.vxe-pager--count {
+ min-width: 2em;
+ text-align: center;
+ & > span {
+ vertical-align: middle;
+ }
.vxe-pager--separator {
- margin-right: 6px;
+ margin-right: 0.2em;
+ &:before {
+ content: "/";
+ }
}
}
.vxe-pager--jump .vxe-pager--goto {
border-radius: 4px;
border: 1px solid $vxe-input-border-color;
color: $vxe-font-color;
- height: 30px;
transition: border .2s ease-in-out;
&:focus {
border: 1px solid $vxe-primary-color;
@@ -306,39 +286,3 @@
}
}
}
-.vxe-pager-size--select-wrapper {
- display: none;
- position: absolute;
- bottom: 0;
- left: 0;
- text-align: center;
- pointer-events: none;
- .vxe-pager-size--select {
- margin: 0;
- padding: 4px 0;
- list-style-type: none;
- display: inline-block;
- border-radius: 4px;
- background-color: #fff;
- border: 1px solid $vxe-primary-color;
- pointer-events: auto;
- box-shadow: 0 0 6px 2px rgba(0, 0, 0, 0.1);
- .size--option {
- padding: 0 15px;
- min-width: 50px;
- max-width: 100px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- cursor: pointer;
- &:hover {
- color: $vxe-primary-color;
- }
- &.is--active {
- font-weight: 700;
- color: $vxe-primary-color;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/styles/select.scss b/styles/select.scss
index b25f0c75e..68cb1d5a3 100644
--- a/styles/select.scss
+++ b/styles/select.scss
@@ -31,8 +31,13 @@
display: none;
position: absolute;
left: 0;
- min-width: 100%;
padding: 0.2em 0;
+ &:not(.is--transfer) {
+ min-width: 100%;
+ }
+ .is--transfer {
+ position: fixed;
+ }
&.is--visivle {
display: block;
}
@@ -42,7 +47,7 @@
overflow-x: hidden;
overflow-y: auto;
padding: 0.2em 0;
- max-height: 220px;
+ max-height: 15em;
border-radius: 4px;
background-color: #fff;
border: 1px solid $vxe-table-popup-border-color;
@@ -50,15 +55,15 @@
background-color: #fff;
}
-.vxe-select-option-group {
- .vxe-select-option-group--title {
+.vxe-optgroup {
+ .vxe-optgroup--title {
padding: 0 0.6em;
- color: $vxe-select-option-group-title-color;
+ color: $vxe-optgroup-title-color;
font-size: 0.8em;
}
}
-.vxe-select-option-group--wrapper {
+.vxe-optgroup--wrapper {
.vxe-select-option {
padding: 0 1.6em;
}
@@ -79,6 +84,7 @@
&:not(.is--disabled) {
cursor: pointer;
&.is--hover {
+ color: $vxe-primary-color;
background-color: $vxe-select-option-hover-background-color;
}
&.is--checked {
@@ -94,27 +100,27 @@
}
.vxe-select-option--panel {
- .vxe-select-option-group--title,
+ .vxe-optgroup--title,
.vxe-select-option {
height: $vxe-select-option-height-default;
line-height: $vxe-select-option-height-default;
}
&.size--medium {
- .vxe-select-option-group--title,
+ .vxe-optgroup--title,
.vxe-select-option {
height: $vxe-select-option-height-medium;
line-height: $vxe-select-option-height-medium;
}
}
&.size--small {
- .vxe-select-option-group--title,
+ .vxe-optgroup--title,
.vxe-select-option {
height: $vxe-select-option-height-small;
line-height: $vxe-select-option-height-small;
}
}
&.size--mini {
- .vxe-select-option-group--title,
+ .vxe-optgroup--title,
.vxe-select-option {
height: $vxe-select-option-height-mini;
line-height: $vxe-select-option-height-mini;
diff --git a/styles/table.scss b/styles/table.scss
index 42f2082a6..c947d6e2c 100644
--- a/styles/table.scss
+++ b/styles/table.scss
@@ -120,11 +120,6 @@
}
}
-select.vxe-select,
-.vxe-input{
- width: 180px;
-}
-
/*默认的渲染*/
.vxe-table,
.vxe-table--filter-wrapper {
@@ -163,7 +158,8 @@ select.vxe-select,
vertical-align: middle;
}
.vxe-input,
- .vxe-textarea {
+ .vxe-textarea,
+ .vxe-select {
width: 100%;
display: block;
}
diff --git a/styles/variable.scss b/styles/variable.scss
index 575745779..b764872f3 100644
--- a/styles/variable.scss
+++ b/styles/variable.scss
@@ -134,7 +134,7 @@ $vxe-select-option-height-default: 30px;
$vxe-select-option-height-medium: 28px;
$vxe-select-option-height-small: 26px;
$vxe-select-option-height-mini: 24px;
-$vxe-select-option-group-title-color:#909399;
$vxe-select-option-hover-background-color: #f5f7fa;
$vxe-select-option-checked-background-color: #e6f7ff;
$vxe-select-option-hover-checked-background-color: #d7effb;
+$vxe-optgroup-title-color:#909399;