12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445 |
- import XEUtils from 'xe-utils'
- import PropTypes from 'ant-design-vue/es/_util/vue-types'
- import { JVXETypes } from '@/components/jeecg/JVxeTable/jvxeTypes'
- import VxeWebSocketMixins from '../mixins/vxe.web.socket.mixins'
- import { initDictOptions } from '@/components/dict/JDictSelectUtil'
- import { getRefPromise } from '../utils/vxeUtils'
- import { getEnhancedMixins, replaceProps } from '../utils/cellUtils'
- import JVxeToolbar from './JVxeToolbar'
- import JVxeSubPopover from './JVxeSubPopover'
- import JVxeDetailsModal from './JVxeDetailsModal'
- import JVxePagination from './JVxePagination'
- import { cloneObject, getVmParentByName, pushIfNotExist, randomString, simpleDebounce } from '@/utils/util'
- import { UtilTools } from 'vxe-table/packages/tools/src/utils'
- import { getNoAuthCols } from '@/utils/authFilter'
- export default {
- name: 'JVxeTable',
- provide() {
- return {
- superTrigger: (name, event) => this.trigger(name, event)
- }
- },
- mixins: [VxeWebSocketMixins],
- components: {JVxeToolbar, JVxeSubPopover, JVxeDetailsModal, JVxePagination},
- props: {
- rowKey: PropTypes.string.def('id'),
- // 列信息
- columns: {
- type: Array,
- required: true
- },
- // 数据源
- dataSource: {
- type: Array,
- required: true
- },
- authPre: {
- type: String,
- required: false,
- default: ''
- },
- // 是否显示工具栏
- toolbar: PropTypes.bool.def(false),
- // 工具栏配置
- toolbarConfig: PropTypes.object.def(() => ({
- // prefix 前缀;suffix 后缀;
- slots: ['prefix', 'suffix'],
- // add 新增按钮;remove 删除按钮;clearSelection 清空选择按钮;collapse 展开收起
- btns: ['add', 'remove', 'clearSelection'],
- })),
- // 是否显示行号
- rowNumber: PropTypes.bool.def(false),
- // 是否可选择行
- rowSelection: PropTypes.bool.def(false),
- // 选择行类型
- rowSelectionType: PropTypes.oneOf(['checkbox', 'radio']).def('checkbox'),
- // 是否可展开行
- rowExpand: PropTypes.bool.def(false),
- // 展开行配置
- expandConfig: PropTypes.object.def(() => ({})),
- // 页面是否在加载中
- loading: PropTypes.bool.def(false),
- height: PropTypes.instanceOf([Number, String]).def('auto'),
- // 最大高度
- maxHeight: {
- type: Number,
- default: () => null,
- },
- // 要禁用的行 TODO 未实现
- disabledRows: PropTypes.object.def(() => ({})),
- // 是否禁用全部组件
- disabled: PropTypes.bool.def(false),
- // 是否可拖拽排序 TODO 仅实现上下排序,未实现拖拽排序(可能无法实现或较为困难)
- dragSort: PropTypes.bool.def(false),
- // 排序字段保存的Key
- dragSortKey: PropTypes.string.def('orderNum'),
- // 大小,可选值有:medium(中)、small(小)、mini(微)、tiny(非常小)
- size: PropTypes.oneOf(['medium', 'small', 'mini', 'tiny']).def('medium'),
- // 是否显示边框线
- bordered: PropTypes.bool.def(false),
- // 分页器参数,设置了即可显示分页器
- pagination: PropTypes.object.def(() => ({})),
- // 点击行时是否显示子表单
- clickRowShowSubForm: PropTypes.bool.def(false),
- // 点击行时是否显示主表单
- clickRowShowMainForm: PropTypes.bool.def(false),
- // 是否点击选中行,优先级最低
- clickSelectRow: PropTypes.bool.def(false),
- // 是否开启 reload 数据效果
- reloadEffect: PropTypes.bool.def(false),
- // 校验规则
- editRules: PropTypes.object.def(() => ({})),
- // 是否异步删除行,如果你要实现异步删除,那么需要把这个选项开启,
- // 在remove事件里调用confirmRemove方法才会真正删除(除非删除的全是新增的行)
- asyncRemove: PropTypes.bool.def(false),
- // 是否一直显示组件,如果为false则只有点击的时候才出现组件
- // 注:该参数不能动态修改;如果行、列字段多的情况下,会根据机器性能造成不同程度的卡顿。
- alwaysEdit: PropTypes.bool.def(false),
- // 联动配置,数组,详情配置见文档
- linkageConfig: PropTypes.array.def(() => []),
- },
- data() {
- return {
- isJVXETable: true,
- // caseId,表格唯一标识
- caseId: `_j-vxe-${randomString(8)}_`,
- // 内置columns
- _innerColumns: [],
- // 内置 EditRules
- _innerEditRules: [],
- // 记录滚动条位置
- scroll: {top: 0, left: 0},
- // 当前是否正在滚动
- scrolling: false,
- // vxe 默认配置
- defaultVxeProps: {
- 'row-id': this.rowKey,
- // 高亮hover的行
- 'highlight-hover-row': true,
- // 溢出隐藏并显示tooltip
- 'show-overflow': true,
- // 表头溢出隐藏并显示tooltip
- 'show-header-overflow': true,
- 'show-footer-overflow': true,
- // 可编辑配置
- 'edit-config': {trigger: 'click', mode: 'cell', showStatus: true},
- 'expand-config': {
- iconClose: 'ant-table-row-expand-icon ant-table-row-collapsed',
- iconOpen: 'ant-table-row-expand-icon ant-table-row-expanded'
- },
- // 虚拟滚动配置,y轴大于30条数据时启用虚拟滚动
- // 'scroll-y': {
- // gt: 30
- // },
- // 'scroll-x': {
- // gt: 15
- // },
- 'radio-config': {highlight: true},
- 'checkbox-config': {highlight: true},
- },
- // 绑定左侧选择框
- selectedRows: [],
- // 绑定左侧选择框已选择的id
- selectedRowIds: [],
- // 统计列配置
- statistics: {
- has: false,
- sum: [],
- average: [],
- },
- // 允许执行刷新特效的行ID
- reloadEffectRowKeysMap: {},
- //配置了但是没有授权的按钮和列 集合
- excludeCode:[],
- // 联动下拉选项(用于隔离不同的下拉选项)
- // 内部联动配置,map
- _innerLinkageConfig: null,
- }
- },
- computed: {
- // vxe 最终 columns
- vxeColumns() {
- this._innerColumns.forEach(column => {
- let renderOptions = {
- caseId: this.caseId,
- bordered: this.bordered,
- disabled: this.disabled,
- scrolling: this.scrolling,
- reloadEffect: this.reloadEffect,
- reloadEffectRowKeysMap: this.reloadEffectRowKeysMap,
- listeners: this.cellListeners,
- }
- if (column.$type === JVXETypes.rowDragSort) {
- renderOptions.dragSortKey = this.dragSortKey
- }
- // slot 组件特殊处理
- if (column.$type === JVXETypes.slot) {
- if (this.$scopedSlots.hasOwnProperty(column.slotName)) {
- renderOptions.slot = this.$scopedSlots[column.slotName]
- renderOptions.target = this
- }
- }
- // 处理联动列,联动列只能作用于 select 组件
- if (column.$type === JVXETypes.select && this._innerLinkageConfig != null) {
- // 判断当前列是否是联动列
- if (this._innerLinkageConfig.has(column.key)) {
- renderOptions.linkage = {
- config: this._innerLinkageConfig.get(column.key),
- getLinkageOptionsSibling: this.getLinkageOptionsSibling,
- getLinkageOptionsAsync: this.getLinkageOptionsAsync,
- linkageSelectChange: this.linkageSelectChange,
- }
- }
- }
- if (column.editRender) {
- Object.assign(column.editRender, renderOptions)
- }
- if (column.cellRender) {
- Object.assign(column.cellRender, renderOptions)
- }
- // update--begin--autor:lvdandan-----date:20201019------for:LOWCOD-882 【新行编辑】列表上带按钮的遮挡问题
- if (column.$type === JVXETypes.file || column.$type === JVXETypes.image) {
- if (column.width && column.width.endsWith('px')) {
- column.width = Number.parseInt(column.width.substr(0,column.width.length-2))+Number.parseInt(1)+'px';
- }
- }
- // update--begin--autor:lvdandan-----date:20201019------for:LOWCOD-882 【新行编辑】列表上带按钮的遮挡问题
- // update--begin--autor:lvdandan-----date:20201211------for:JT-118 【online】 日期、时间控件长度较小
- if (column.$type === JVXETypes.datetime || column.$type === JVXETypes.userSelect || column.$type === JVXETypes.departSelect) {
- let width = column.width && column.width.endsWith('px')?Number.parseInt(column.width.substr(0,column.width.length-2)):0;
- if(width <= 190){
- column.width = '190px'
- }
- }
- if (column.$type === JVXETypes.date) {
- let width = column.width && column.width.endsWith('px')?Number.parseInt(column.width.substr(0,column.width.length-2)):0;
- if(width <= 135){
- column.width = '135px'
- }
- }
- // update--end--autor:lvdandan-----date:20201211------for:JT-118 【online】 日期、时间控件长度较小
- })
- return this._innerColumns
- },
- // vxe 最终 editRules
- vxeEditRules() {
- return Object.assign({}, this.editRules, this._innerEditRules)
- },
- // vxe 最终 props
- vxeProps() {
- let expandConfig = Object.assign({}, this.defaultVxeProps['expand-config'], this.expandConfig)
- return Object.assign({}, this.defaultVxeProps, {
- showFooter: this.statistics.has,
- }, this.$attrs, {
- loading: this.loading,
- columns: this.vxeColumns,
- editRules: this.vxeEditRules,
- // data: this.dataSource,
- height: this.height === 'auto' ? null : this.height,
- maxHeight: this.maxHeight,
- border: this.bordered,
- expandConfig: expandConfig,
- footerMethod: this.handleFooterMethod,
- // footerSpanMethod: this.handleFooterSpanMethod,
- })
- },
- // vxe 最终 events
- vxeEvents() {
- // 内置事件
- let events = {
- 'scroll': this.handleVxeScroll,
- 'cell-click': this.handleCellClick,
- 'edit-closed': this.handleEditClosed,
- 'edit-actived': this.handleEditActived,
- 'radio-change': this.handleVxeRadioChange,
- 'checkbox-all': this.handleVxeCheckboxAll,
- 'checkbox-change': this.handleVxeCheckboxChange,
- }
- // 用户传递的事件,进行合并操作
- Object.keys(this.$listeners).forEach(key => {
- let listen = this.$listeners[key]
- if (events.hasOwnProperty(key)) {
- if (Array.isArray(listen)) {
- listen.push(events[key])
- } else {
- listen = [events[key], listen]
- }
- }
- events[key] = listen
- })
- return events
- },
- // 组件监听事件
- cellListeners() {
- return {
- trigger: (name, event) => this.trigger(name, event),
- valueChange: event => this.trigger('valueChange', event),
- /** 当前行向上移一位 */
- rowMoveUp: rowIndex => this.rowResort(rowIndex, rowIndex - 1),
- /** 当前行向下移一位 */
- rowMoveDown: rowIndex => this.rowResort(rowIndex, rowIndex + 1),
- /** 在当前行下面插入一行 */
- rowInsertDown: rowIndex => this.insertRows({}, rowIndex + 1),
- }
- },
- },
- watch: {
- dataSource: {
- // deep: true,
- immediate: true,
- async handler() {
- let vxe = await getRefPromise(this, 'vxe')
- this.dataSource.forEach((data, idx) => {
- // 开启了排序就自动计算排序值
- if (this.dragSort) {
- this.$set(data, this.dragSortKey, idx + 1)
- }
- // 处理联动回显数据
- if (this._innerLinkageConfig != null) {
- for (let configItem of this._innerLinkageConfig.values()) {
- this.autoSetLinkageOptionsByData(data, '', configItem, 0)
- }
- }
- })
- // 阻断vue监听大数据,提高性能
- vxe.loadData(this.dataSource)
- // TODO 解析disabledRows
- // let disabled = false
- //
- // let disabledRowIds = (this.disabledRowIds || [])
- // // 解析disabledRows
- // Object.keys(this.disabledRows).forEach(disabledColKey => {
- // // 判断是否有该属性
- // if (data.hasOwnProperty(disabledColKey)) {
- // if (disabled !== true) {
- // let temp = this.disabledRows[disabledColKey]
- // // 禁用规则可以是一个数组
- // if (Array.isArray(temp)) {
- // disabled = temp.includes(data[disabledColKey])
- // } else {
- // disabled = (temp === data[disabledColKey])
- // }
- // if (disabled) {
- // disabledRowIds.push(row.id)
- // }
- // }
- // }
- // })
- },
- },
- columns: {
- immediate: true,
- handler(columns) {
- //获取不需要显示列
- this.loadExcludeCode()
- let _innerColumns = []
- let _innerEditRules = {}
- let {rowNumber, rowSelection, rowExpand, dragSort} = this
- let expandColumn, seqColumn, checkboxColumn, radioColumn, dragSortColumn
- if (Array.isArray(columns)) {
- this.statistics.has = false
- this.statistics.sum = []
- this.statistics.average = []
- // 处理成vxe可识别的columns
- columns.forEach(column => {
- if(this.excludeCode.indexOf(column.key)>=0){
- return false
- }
- let col = {...column}
- let {type} = col
- const enhanced = getEnhancedMixins(type)
- if (type === JVXETypes.rowNumber) {
- seqColumn = col
- } else if (type === JVXETypes.rowCheckbox) {
- checkboxColumn = col
- } else if (type === JVXETypes.rowRadio) {
- radioColumn = col
- } else if (type === JVXETypes.rowExpand) {
- expandColumn = col
- } else if (type === JVXETypes.rowDragSort) {
- dragSortColumn = col
- } else {
- col.field = col.key
- // 防止和vxeTable自带的type起冲突
- col.$type = col.type
- delete col.type
- let renderName = 'cellRender', renderOptions = {name: JVXETypes._prefix + type}
- if (type) {
- // hidden 是特殊的组件
- if (type === JVXETypes.hidden) {
- col.visible = false
- } else if (enhanced.switches.editRender) {
- renderName = 'editRender'
- renderOptions.type = (enhanced.switches.visible || this.alwaysEdit) ? 'visible' : 'default'
- }
- } else {
- renderOptions.name = JVXETypes._prefix + JVXETypes.normal
- }
- col[renderName] = renderOptions
- // 处理字典
- if (col.dictCode) {
- this._loadDictConcatToOptions(col)
- }
- // 处理校验
- if (col.validateRules) {
- let rules = []
- if (Array.isArray(col.validateRules)) {
- for (let rule of col.validateRules) {
- let replace = {
- message: replaceProps(col, rule.message)
- }
- if (rule.unique || rule.pattern === 'only') {
- // 唯一校验器
- rule.validator = uniqueValidator.bind(this)
- } else if (rule.pattern) {
- // 非空
- if (rule.pattern === fooPatterns[0].value) {
- rule.required = true
- delete rule.pattern
- } else {
- // 兼容Online表单的特殊规则
- for (let foo of fooPatterns) {
- if (foo.value === rule.pattern) {
- rule.pattern = foo.pattern
- break
- }
- }
- }
- } else if (typeof rule.handler === 'function') {
- // 自定义函数校验
- rule.validator = handlerConvertToValidator.bind(this)
- }
- rules.push(Object.assign({}, rule, replace))
- }
- }
- _innerEditRules[col.key] = rules
- }
- // 处理统计列
- // sum = 求和、average = 平均值
- if (Array.isArray(col.statistics)) {
- this.statistics.has = true
- col.statistics.forEach(item => {
- let arr = this.statistics[item.toLowerCase()]
- if (Array.isArray(arr)) {
- pushIfNotExist(arr, col.key)
- }
- })
- }
- _innerColumns.push(col)
- }
- })
- }
- // 判断是否开启了序号
- if (rowNumber) {
- let col = {type: 'seq', title: '#', width: 60, fixed: 'left', align: 'center'}
- if (seqColumn) {
- col = Object.assign(col, seqColumn, {type: 'seq'})
- }
- _innerColumns.unshift(col)
- }
- // 判断是否开启了可选择行
- if (rowSelection) {
- let width = 40
- if (this.statistics.has && !rowExpand && !dragSort) {
- width = 60
- }
- let col = {type: this.rowSelectionType, width, fixed: 'left', align: 'center'}
- // radio
- if (this.rowSelectionType === 'radio' && radioColumn) {
- col = Object.assign(col, radioColumn, {type: 'radio'})
- }
- // checkbox
- if (this.rowSelectionType === 'checkbox' && checkboxColumn) {
- col = Object.assign(col, checkboxColumn, {type: 'checkbox'})
- }
- _innerColumns.unshift(col)
- }
- // 是否可展开行
- if (rowExpand) {
- let width = 40
- if (this.statistics.has && !dragSort) {
- width = 60
- }
- let col = {type: 'expand', title: '', width, fixed: 'left', align: 'center', slots: {content: 'expandContent'}}
- if (expandColumn) {
- col = Object.assign(col, expandColumn, {type: 'expand'})
- }
- _innerColumns.unshift(col)
- }
- // 是否可拖动排序
- if (dragSort) {
- let width = 40
- if (this.statistics.has) {
- width = 60
- }
- let col = {type: JVXETypes.rowDragSort, title: '', width, fixed: 'left', align: 'center', cellRender: {name: JVXETypes._prefix + JVXETypes.rowDragSort}}
- if (dragSortColumn) {
- col = Object.assign(col, dragSortColumn, {type: JVXETypes.rowDragSort})
- }
- _innerColumns.unshift(col)
- }
- this._innerColumns = _innerColumns
- this._innerEditRules = _innerEditRules
- }
- },
- // watch linkageConfig
- // 整理多级联动配置
- linkageConfig: {
- immediate: true,
- handler() {
- if (Array.isArray(this.linkageConfig) && this.linkageConfig.length > 0) {
- // 获取联动的key顺序
- let getLcKeys = (key, arr) => {
- let col = this._innerColumns.find(col => col.key === key)
- if (col) {
- arr.push(col.key)
- if (col.linkageKey) {
- return getLcKeys(col.linkageKey, arr)
- }
- }
- return arr
- }
- let configMap = new Map()
- this.linkageConfig.forEach(lc => {
- let keys = getLcKeys(lc.key, [])
- // 多个key共享一个,引用地址
- let configItem = {
- ...lc, keys,
- optionsMap: new Map()
- }
- keys.forEach(k => configMap.set(k, configItem))
- })
- this._innerLinkageConfig = configMap
- } else {
- this._innerLinkageConfig = null
- }
- }
- },
- },
- created() {
- },
- mounted() {
- this.handleTabsChange()
- },
- methods: {
- /**
- * 自动判断父级是否是 <a-tabs/> 组件,然后添加事件监听,自动重置表格
- */
- handleTabsChange() {
- // 获取父级
- const tabs = getVmParentByName(this, 'ATabs')
- const tabPane = getVmParentByName(this, 'ATabPane')
- if (tabs && tabPane) {
- // 用户自定义的 key
- const currentKey = tabPane.$vnode.key
- // 添加 activeKey 监听
- const unwatch = tabs.$children[0].$watch('$data._activeKey', async (key) => {
- // 切换到自己时重新计算
- if (currentKey === key) {
- await this.$nextTick()
- await this.refreshScroll()
- await this.recalculate()
- }
- })
- // 当前实例销毁时取消监听
- this.$on('beforeDestroy', () => unwatch())
- }
- },
- handleVxeScroll(event) {
- let {$refs, scroll} = this
- // 记录滚动条的位置
- scroll.top = event.scrollTop
- scroll.left = event.scrollLeft
- $refs.subPopover ? $refs.subPopover.close() : null
- this.scrolling = true
- this.closeScrolling()
- },
- // 当手动勾选单选时触发的事件
- handleVxeRadioChange(event) {
- let row = event.$table.getRadioRecord()
- this.selectedRows = row ? [row] : []
- this.handleSelectChange('radio', this.selectedRows, event)
- },
- // 当手动勾选全选时触发的事件
- handleVxeCheckboxAll(event) {
- this.selectedRows = event.$table.getCheckboxRecords()
- this.handleSelectChange('checkbox-all', this.selectedRows, event)
- },
- // 当手动勾选并且值发生改变时触发的事件
- handleVxeCheckboxChange(event) {
- this.selectedRows = event.$table.getCheckboxRecords()
- this.handleSelectChange('checkbox', this.selectedRows, event)
- },
- // 行选择change事件
- handleSelectChange(type, selectedRows, $event) {
- let action
- if (type === 'radio') {
- action = 'selected'
- } else if (type === 'checkbox') {
- action = selectedRows.includes($event.row) ? 'selected' : 'unselected'
- } else {
- action = 'selected-all'
- }
- this.selectedRowIds = selectedRows.map(row => row.id)
- this.trigger('selectRowChange', {
- type: type,
- action: action,
- $event: $event,
- row: $event.row,
- selectedRows: this.selectedRows,
- selectedRowIds: this.selectedRowIds
- })
- },
- // 点击单元格时触发的事件
- handleCellClick(event) {
- let {row, column, $event, $table} = event
- let {$refs} = this
- // 点击了可编辑的
- if (column.editRender) {
- $refs.subPopover ? $refs.subPopover.close() : null
- return
- }
- // 显示详细信息
- if (column.own.showDetails) {
- // 两个如果同时存在的话会出现死循环
- $refs.subPopover ? $refs.subPopover.close() : null
- $refs.detailsModal ? $refs.detailsModal.open(event) : null
- } else if ($refs.subPopover) {
- $refs.subPopover.toggle(event)
- } else if (this.clickSelectRow) {
- let className = $event.target.className || ''
- className = typeof className === 'string' ? className : className.toString()
- // 点击的是expand,不做处理
- if (className.includes('vxe-table--expand-btn')) {
- return
- }
- // 点击的是checkbox,不做处理
- if (className.includes('vxe-checkbox--icon') || className.includes('vxe-cell--checkbox')) {
- return
- }
- // 点击的是radio,不做处理
- if (className.includes('vxe-radio--icon') || className.includes('vxe-cell--radio')) {
- return
- }
- if (this.rowSelectionType === 'radio') {
- $table.setRadioRow(row)
- this.handleVxeRadioChange(event)
- } else {
- $table.toggleCheckboxRow(row)
- this.handleVxeCheckboxChange(event)
- }
- }
- },
- // 单元格编辑状态下被关闭时会触发该事件
- handleEditClosed({column}) {
- // 执行增强
- getEnhancedMixins(column.own.$type, 'aopEvents').editClosed.apply(this, arguments)
- },
- // 单元格被激活编辑时会触发该事件
- handleEditActived({column}) {
- // 执行增强
- getEnhancedMixins(column.own.$type, 'aopEvents').editActived.apply(this, arguments)
- },
- /** 表尾数据处理方法,用于显示统计信息 */
- handleFooterMethod({columns, data}) {
- const {statistics} = this
- let footers = []
- if (statistics.has) {
- if (statistics.sum.length > 0) {
- footers.push(this.getFooterStatisticsMap({
- columns: columns,
- title: '合计',
- checks: statistics.sum,
- method: (column) => XEUtils.sum(data, column.property)
- }))
- }
- if (statistics.average.length > 0) {
- footers.push(this.getFooterStatisticsMap({
- columns: columns,
- title: '平均',
- checks: statistics.average,
- method: (column) => XEUtils.mean(data, column.property)
- }))
- }
- }
- return footers
- },
- getFooterStatisticsMap({columns, title, checks, method}) {
- return columns.map((column, columnIndex) => {
- if (columnIndex === 0) {
- return title
- }
- if (checks.includes(column.property)) {
- return method(column, columnIndex)
- }
- return null
- })
- },
- /** 表尾单元格合并方法 */
- handleFooterSpanMethod(event) {
- if (event.columnIndex === 0) {
- return {colspan: 2}
- }
- },
- /*--- 外部可调用接口方法 ---*/
- /**
- * 重置滚动条Top位置
- * @param top 新top位置,留空则滚动到上次记录的位置,用于解决切换tab选项卡时导致白屏以及自动将滚动条滚动到顶部的问题
- */
- resetScrollTop(top) {
- this.scrollTo(null, (top == null || top === '') ? this.scroll.top : top)
- },
- /**
- * 加载新数据,和 loadData 不同的是,用该方法加载的数据都是相当于点新增按钮新增的数据。
- * 适用于不是数据库里查出来的没有id的临时数据
- * @param dataSource
- */
- async loadNewData(dataSource) {
- if (Array.isArray(dataSource)) {
- let {xTable} = this.$refs.vxe.$refs
- // issues/2784
- // 先清空所有数据
- xTable.loadData([])
- dataSource.forEach((data, idx) => {
- // 开启了排序就自动计算排序值
- if (this.dragSort) {
- this.$set(data, this.dragSortKey, idx + 1)
- }
- // 处理联动回显数据
- if (this._innerLinkageConfig != null) {
- for (let configItem of this._innerLinkageConfig.values()) {
- this.autoSetLinkageOptionsByData(data, '', configItem, 0)
- }
- }
- })
- // 再新增
- return xTable.insertAt(dataSource)
- }
- return []
- },
- // 校验table,失败返回errMap,成功返回null
- async validateTable() {
- const errMap = await this.validate().catch(errMap => errMap)
- return errMap ? errMap : null
- },
- // 完整校验
- async fullValidateTable() {
- const errMap = await this.fullValidate().catch(errMap => errMap)
- return errMap ? errMap : null
- },
- /** 设置某行某列的值 */
- setValues(values) {
- if (!Array.isArray(values)) {
- console.warn(`JVxeTable.setValues:必须传递数组`)
- return
- }
- values.forEach((item, idx) => {
- let {rowKey, values: record} = item
- let {row} = this.getIfRowById(rowKey)
- if (!row) {
- return
- }
- Object.keys(record).forEach(colKey => {
- let column = this.getColumnByKey(colKey)
- if (column) {
- let oldValue = row[colKey]
- let newValue = record[colKey]
- if (newValue !== oldValue) {
- this.$set(row, colKey, newValue)
- // 触发 valueChange 事件
- this.trigger('valueChange', {
- type: column.own.$type,
- value: newValue,
- oldValue: oldValue,
- col: column.own,
- column: column,
- isSetValues: true,
- })
- }
- } else {
- console.warn(`JVxeTable.setValues:没有找到key为"${colKey}"的列`)
- }
- })
- })
- },
- /** 获取所有的数据,包括values、deleteIds */
- getAll() {
- return {
- tableData: this.getTableData(),
- deleteData: this.getDeleteData()
- }
- },
- /** 获取表格表单里的值 */
- getValues(callback, rowIds) {
- let tableData = this.getTableData({rowIds: rowIds})
- callback('', tableData)
- },
- /** 获取表格数据 */
- getTableData(options = {}) {
- let {rowIds} = options
- let tableData
- // 仅查询指定id的行
- if (Array.isArray(rowIds) && rowIds.length > 0) {
- tableData = []
- rowIds.forEach(rowId => {
- let {row} = this.getIfRowById(rowId)
- if (row) {
- tableData.push(row)
- }
- })
- } else {
- // 查询所有行
- tableData = this.$refs.vxe.getTableData().fullData
- }
- return this.filterNewRows(tableData, false)
- },
- /** 仅获取新增的数据 */
- getNewData() {
- let newData = cloneObject(this.$refs.vxe.getInsertRecords())
- newData.forEach(row => delete row.id)
- return newData
- },
- /** 仅获取新增的数据,带有id */
- getNewDataWithId() {
- let newData = cloneObject(this.$refs.vxe.getInsertRecords())
- return newData
- },
- /** 根据ID获取行,新增的行也能查出来 */
- getIfRowById(id) {
- let row = this.getRowById(id), isNew = false
- if (!row) {
- row = this.getNewRowById(id)
- if (!row) {
- console.warn(`JVxeTable.getIfRowById:没有找到id为"${id}"的行`)
- return {row: null}
- }
- isNew = true
- }
- return {row, isNew}
- },
- /** 通过临时ID获取新增的行 */
- getNewRowById(id) {
- let records = this.getInsertRecords()
- for (let record of records) {
- if (record.id === id) {
- return record
- }
- }
- return null
- },
- /** 仅获取被删除的数据(新增又被删除的数据不会被获取到) */
- getDeleteData() {
- return cloneObject(this.$refs.vxe.getRemoveRecords())
- },
- /**
- * 添加一行或多行
- *
- * @param rows
- * @param isOnlJs 是否是onlineJS增强触发的
- * @return
- */
- async addRows(rows = {}, isOnlJs) {
- return this._addOrInsert(rows, -1, 'added', isOnlJs)
- },
- /**
- * 添加一行或多行
- *
- * @param rows
- * @param index 添加下标,数字,必填
- * @return
- */
- async insertRows(rows, index) {
- if (typeof index !== 'number' || index < 0) {
- console.warn(`【JVXETable】insertRows:index必须传递数字,且大于-1`)
- return
- }
- return this._addOrInsert(rows, index, 'inserted')
- },
- /**
- * 添加一行或多行临时数据,不会填充默认值,传什么就添加进去什么
- * @param rows
- * @param options 选项
- * @param options.setActive 是否激活最后一行的编辑模式
- */
- async pushRows(rows = {}, options = {}) {
- let {xTable} = this.$refs.vxe.$refs
- let {setActive, index} = options
- setActive = setActive == null ? false : !!setActive
- index = index == null ? -1 : index
- index = index === -1 ? index : xTable.tableFullData[index]
- // 插入行
- let result = await xTable.insertAt(rows, index)
- if (setActive) {
- // 激活最后一行的编辑模式
- xTable.setActiveRow(result.rows[result.rows.length - 1])
- }
- await this._recalcSortNumber()
- return result
- },
- /** 清空选择行 */
- clearSelection() {
- let event = {$table: this.$refs.vxe, target: this}
- if (this.rowSelectionType === JVXETypes.rowRadio) {
- this.$refs.vxe.clearRadioRow()
- this.handleVxeRadioChange(event)
- } else {
- this.$refs.vxe.clearCheckboxRow()
- this.handleVxeCheckboxChange(event)
- }
- },
- /** 删除一行或多行数据 */
- async removeRows(rows) {
- const res = await this._remove(rows)
- await this._recalcSortNumber()
- return res
- },
- /** 根据id删除一行或多行 */
- removeRowsById(rowId) {
- let rowIds
- if (Array.isArray(rowId)) {
- rowIds = rowId
- } else {
- rowIds = [rowId]
- }
- let rows = rowIds.map((id) => {
- let {row} = this.getIfRowById(id)
- if (!row) {
- return
- }
- if (row) {
- return row
- } else {
- console.warn(`【JVXETable】removeRowsById:${id}不存在`)
- return null
- }
- }).filter((row) => row != null)
- return this.removeRows(rows)
- },
- getColumnByKey() {
- return this.$refs.vxe.getColumnByField.apply(this.$refs.vxe, arguments)
- },
- /* --- 辅助方法 ---*/
- // 触发事件
- trigger(name, event = {}) {
- event.$target = this
- event.$table = this.$refs.vxe
- //online增强参数兼容
- event.target = this
- this.$emit(name, event)
- },
- /** 【多级联动】获取同级联动下拉选项 */
- getLinkageOptionsSibling(row, col, config, request) {
- // 如果当前列不是顶级列
- let key = ''
- if (col.key !== config.key) {
- // 就找出联动上级列
- let idx = config.keys.findIndex(k => col.key === k)
- let parentKey = config.keys[idx - 1]
- key = row[parentKey]
- // 如果联动上级列没有选择数据,就直接返回空数组
- if (key === '' || key == null) {
- return []
- }
- } else {
- key = 'root'
- }
- let options = config.optionsMap.get(key)
- if (!Array.isArray(options)) {
- if (request) {
- let parent = key === 'root' ? '' : key
- return this.getLinkageOptionsAsync(config, parent)
- } else {
- options = []
- }
- }
- return options
- },
- /** 【多级联动】获取联动下拉选项(异步) */
- getLinkageOptionsAsync(config, parent) {
- return new Promise(resolve => {
- let key = parent ? parent : 'root'
- let options
- if (config.optionsMap.has(key)) {
- options = config.optionsMap.get(key)
- if (options instanceof Promise) {
- options.then(opt => {
- config.optionsMap.set(key, opt)
- resolve(opt)
- })
- } else {
- resolve(options)
- }
- } else if (typeof config.requestData === 'function') {
- // 调用requestData方法,通过传入parent来获取子级
- let promise = config.requestData(parent)
- config.optionsMap.set(key, promise)
- promise.then(opt => {
- config.optionsMap.set(key, opt)
- resolve(opt)
- })
- } else {
- resolve([])
- }
- })
- },
- // 【多级联动】 用于回显数据,自动填充 optionsMap
- autoSetLinkageOptionsByData(data, parent, config, level) {
- if (level === 0) {
- this.getLinkageOptionsAsync(config, '')
- } else {
- this.getLinkageOptionsAsync(config, parent)
- }
- if (config.keys.length - 1 > level) {
- let value = data[config.keys[level]]
- if (value) {
- this.autoSetLinkageOptionsByData(data, value, config, level + 1)
- }
- }
- },
- // 【多级联动】联动组件change时,清空下级组件
- linkageSelectChange(row, col, config, value) {
- if (col.linkageKey) {
- this.getLinkageOptionsAsync(config, value)
- let idx = config.keys.findIndex(k => k === col.key)
- let values = {}
- for (let i = idx; i < config.keys.length; i++) {
- values[config.keys[i]] = ''
- }
- // 清空后几列的数据
- this.setValues([{rowKey: row.id, values}])
- }
- },
- /** 加载数据字典并合并到 options */
- _loadDictConcatToOptions(column) {
- initDictOptions(column.dictCode).then((res) => {
- if (res.success) {
- let newOptions = (column.options || [])// .concat(res.result)
- res.result.forEach(item => {
- // 过滤重复数据
- for (let option of newOptions) if (option.value === item.value) return
- newOptions.push(item)
- })
- this.$set(column, 'options', newOptions)
- } else {
- console.group(`JVxeTable 查询字典(${column.dictCode})发生异常`)
- console.warn(res.message)
- console.groupEnd()
- }
- })
- },
- //options自定义赋值 刷新
- virtualRefresh(){
- this.scrolling = true
- this.closeScrolling()
- },
- // 设置 this.scrolling 防抖模式
- closeScrolling: simpleDebounce(function () {
- this.scrolling = false
- }, 100),
- /**
- * 过滤添加的行
- * @param rows 要筛选的行数据
- * @param remove true = 删除新增,false=只删除id
- * @param handler function
- */
- filterNewRows(rows, remove = true, handler) {
- let insertRecords = this.$refs.vxe.getInsertRecords()
- let records = []
- for (let row of rows) {
- let item = cloneObject(row)
- if (insertRecords.includes(row)) {
- handler ? handler({item, row, insertRecords}) : null
- if (remove) {
- continue
- }
- delete item.id
- }
- records.push(item)
- }
- return records
- },
- // 删除选中的数据
- async removeSelection() {
- let res = await this._remove(this.selectedRows)
- this.clearSelection()
- await this._recalcSortNumber()
- return res
- },
- /**
- * 【删除指定行数据】(重写vxeTable的内部方法,添加了从keepSource中删除)
- * 如果传 row 则删除一行
- * 如果传 rows 则删除多行
- * 如果为空则删除所有
- */
- _remove(rows) {
- const xTable = this.$refs.vxe.$refs.xTable
- const {afterFullData, tableFullData, tableSourceData, editStore, treeConfig, checkboxOpts, selection, isInsertByRow, scrollYLoad} = xTable
- const {actived, removeList, insertList} = editStore
- const {checkField: property} = checkboxOpts
- let rest = []
- const nowData = afterFullData
- if (treeConfig) {
- throw new Error(UtilTools.getLog('vxe.error.noTree', ['remove']))
- }
- if (!rows) {
- rows = tableFullData
- } else if (!XEUtils.isArray(rows)) {
- rows = [rows]
- }
- // 如果是新增,则保存记录
- rows.forEach(row => {
- if (!isInsertByRow(row)) {
- removeList.push(row)
- }
- })
- // 如果绑定了多选属性,则更新状态
- if (!property) {
- XEUtils.remove(selection, row => rows.indexOf(row) > -1)
- }
- // 从数据源中移除
- if (tableFullData === rows) {
- rows = rest = tableFullData.slice(0)
- tableFullData.length = 0
- nowData.length = 0
- } else {
- rest = XEUtils.remove(tableFullData, row => rows.indexOf(row) > -1)
- XEUtils.remove(nowData, row => rows.indexOf(row) > -1)
- }
- // 【从keepSource中删除】
- if (xTable.keepSource) {
- let rowIdSet = new Set(rows.map(row => row.id))
- XEUtils.remove(tableSourceData, row => rowIdSet.has(row.id))
- }
- // 如果当前行被激活编辑,则清除激活状态
- if (actived.row && rows.indexOf(actived.row) > -1) {
- xTable.clearActived()
- }
- // 从新增中移除已删除的数据
- XEUtils.remove(insertList, row => rows.indexOf(row) > -1)
- xTable.handleTableData()
- xTable.updateFooter()
- xTable.updateCache()
- xTable.checkSelectionStatus()
- if (scrollYLoad) {
- xTable.updateScrollYSpace()
- }
- return xTable.$nextTick().then(() => {
- xTable.recalculate()
- return {row: rest.length ? rest[rest.length - 1] : null, rows: rest}
- })
- },
- /** 行重新排序 */
- async rowResort(oldIndex, newIndex) {
- const xTable = this.$refs.vxe.$refs.xTable
- window.xTable = xTable
- const sort = (array) => {
- // 存储旧数据,并删除旧项目
- let row = array.splice(oldIndex, 1)[0]
- // 向新项目里添加旧数据
- array.splice(newIndex, 0, row)
- }
- sort(xTable.tableFullData)
- if (xTable.keepSource) {
- sort(xTable.tableSourceData)
- }
- await this.$nextTick()
- await this._recalcSortNumber()
- },
- /** 重新计算排序字段的数值 */
- async _recalcSortNumber() {
- const xTable = this.$refs.vxe.$refs.xTable
- if (this.dragSort) {
- xTable.tableFullData.forEach((data, idx) => data[this.dragSortKey] = (idx + 1))
- }
- await xTable.updateCache(true)
- return await xTable.updateData()
- },
- async _addOrInsert(rows = {}, index, triggerName, isOnlJs) {
- let {xTable} = this.$refs.vxe.$refs
- let records
- if (Array.isArray(rows)) {
- records = rows
- } else {
- records = [rows]
- }
- // 遍历添加默认值
- records.forEach(record => this._createRow(record))
- let result = await this.pushRows(records, {index: index, setActive: true})
- // 遍历插入的行
- // update--begin--autor:lvdandan-----date:20201117------for:LOWCOD-987 【新行编辑】js增强附表内置方法调用问题 #1819
- // online js增强时以传过来值为准,不再赋默认值
- if (isOnlJs != true) {
- for (let i = 0; i < result.rows.length; i++) {
- let row = result.rows[i]
- this.trigger(triggerName, {
- row: row,
- $table: xTable,
- target: this,
- })
- }
- }
- // update--end--autor:lvdandan-----date:20201117------for:LOWCOD-987 【新行编辑】js增强附表内置方法调用问题 #1819
- return result
- },
- // 创建新行,自动添加默认值
- _createRow(record = {}) {
- let {xTable} = this.$refs.vxe.$refs
- // 添加默认值
- xTable.tableFullColumn.forEach(column => {
- let col = column.own
- if (col.key && (record[col.key] == null || record[col.key] === '')) {
- // 设置默认值
- let createValue = getEnhancedMixins(col.$type || col.type, 'createValue')
- record[col.key] = createValue({row: record, column, $table: xTable})
- }
- // update-begin--author:sunjianlei---date:20210819------for: 处理联动列,联动列只能作用于 select 组件
- if (col.$type === JVXETypes.select && this._innerLinkageConfig != null) {
- // 判断当前列是否是联动列
- if (this._innerLinkageConfig.has(col.key)) {
- let configItem = this._innerLinkageConfig.get(col.key)
- this.getLinkageOptionsAsync(configItem, '')
- }
- }
- // update-end--author:sunjianlei---date:20210819------for: 处理联动列,联动列只能作用于 select 组件
- })
- return record
- },
- /*--- 渲染函数 ---*/
- // 渲染 vxe
- renderVxeGrid(h) {
- return h('vxe-grid', {
- ref: 'vxe',
- class: ['j-vxe-table'],
- props: this.vxeProps,
- on: this.vxeEvents,
- // 作用域插槽的格式为
- scopedSlots: this.$scopedSlots,
- })
- },
- // 渲染工具栏
- renderToolbar(h) {
- if (this.toolbar) {
- return h('j-vxe-toolbar', {
- props: {
- toolbarConfig: this.toolbarConfig,
- excludeCode: this.excludeCode,
- size: this.size,
- disabled: this.disabled,
- disabledRows: this.disabledRows,
- selectedRowIds: this.selectedRowIds,
- },
- on: {
- // 新增事件
- add: () => this.addRows(),
- // 保存事件
- save: () => this.trigger('save', {
- $table: this.$refs.vxe,
- target: this,
- }),
- // 删除事件
- remove: () => {
- let $table = this.$refs.vxe
- let deleteRows = this.filterNewRows(this.selectedRows)
- // 触发删除事件
- if (deleteRows.length > 0) {
- let removeEvent = {deleteRows, $table, target: this}
- if (this.asyncRemove) {
- // 确认删除,只有调用这个方法才会真删除
- removeEvent.confirmRemove = () => this.removeSelection()
- } else {
- this.removeSelection()
- }
- this.trigger('remove', removeEvent)
- } else {
- this.removeSelection()
- }
- },
- // 清除选择事件
- clearSelection: this.clearSelection
- },
- scopedSlots: {
- toolbarPrefix: this.$scopedSlots.toolbarPrefix,
- toolbarSuffix: this.$scopedSlots.toolbarSuffix,
- },
- })
- }
- return null
- },
- // 渲染 toolbarAfter 插槽
- renderToolbarAfterSlot() {
- if (this.$scopedSlots['toolbarAfter']) {
- return this.$scopedSlots['toolbarAfter']()
- }
- return null
- },
- // 渲染点击时弹出的子表
- renderSubPopover(h) {
- if (this.clickRowShowSubForm && this.$scopedSlots.subForm) {
- return h('j-vxe-sub-popover', {
- ref: 'subPopover',
- scopedSlots: {
- subForm: this.$scopedSlots.subForm,
- }
- })
- }
- return null
- },
- // 渲染点击时弹出的详细信息
- renderDetailsModal(h) {
- if (this.clickRowShowMainForm && this.$scopedSlots.mainForm) {
- return h('j-vxe-details-modal', {
- ref: 'detailsModal',
- scopedSlots: {
- subForm: this.clickRowShowSubForm ? this.$scopedSlots.subForm : null,
- mainForm: this.$scopedSlots.mainForm
- }
- })
- }
- },
- // 渲染分页器
- renderPagination(h) {
- if (this.pagination && Object.keys(this.pagination).length > 0) {
- return h('j-vxe-pagination', {
- props: {
- size: this.size,
- disabled: this.disabled,
- pagination: this.pagination
- },
- on: {
- change: (e) => this.trigger('pageChange', e)
- },
- })
- }
- return null
- },
- loadExcludeCode(){
- if(!this.authPre || this.authPre.length==0){
- this.excludeCode = []
- }else{
- let pre = this.authPre
- if(!pre.endsWith(':')){
- pre += ':'
- }
- this.excludeCode = getNoAuthCols(pre)
- }
- }
- },
- render(h) {
- return h('div', {
- class: ['j-vxe-table-box', `size--${this.size}`]
- }, [
- this.renderSubPopover(h),
- this.renderDetailsModal(h),
- this.renderToolbar(h),
- this.renderToolbarAfterSlot(),
- this.renderVxeGrid(h),
- this.renderPagination(h),
- ])
- },
- beforeDestroy() {
- this.$emit('beforeDestroy')
- }
- }
- // 兼容 online 的规则
- const fooPatterns = [
- {title: '非空', value: '*', pattern: /^.+$/},
- {title: '6到16位数字', value: 'n6-16', pattern: /^\d{6,16}$/},
- {title: '6到16位任意字符', value: '*6-16', pattern: /^.{6,16}$/},
- {title: '6到18位字母', value: 's6-18', pattern: /^[a-z|A-Z]{6,18}$/},
- {title: '网址', value: 'url', pattern: /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/},
- {title: '电子邮件', value: 'e', pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/},
- {title: '手机号码', value: 'm', pattern: /^1[3456789]\d{9}$/},
- {title: '邮政编码', value: 'p', pattern: /^[1-9]\d{5}$/},
- {title: '字母', value: 's', pattern: /^[A-Z|a-z]+$/},
- {title: '数字', value: 'n', pattern: /^-?\d+(\.?\d+|\d?)$/},
- {title: '整数', value: 'z', pattern: /^-?\d+$/},
- {title: '金额', value: 'money', pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/},
- ]
- /** 旧版handler转为新版Validator */
- function handlerConvertToValidator(event) {
- const {column, rule} = event
- return new Promise((resolve, reject) => {
- rule.handler(event, (flag, msg) => {
- let message = rule.message
- if (typeof msg === 'string') {
- message = replaceProps(column.own, msg)
- }
- if (flag == null) {
- resolve(message)
- } else if (!!flag) {
- resolve(message)
- } else {
- reject(new Error(message))
- }
- }, this, event)
- })
- }
- /** 唯一校验器 */
- function uniqueValidator(event) {
- const {cellValue, column, rule} = event
- let tableData = this.getTableData()
- let findCount = 0
- for (let rowData of tableData) {
- if (rowData[column.own.key] === cellValue) {
- if (++findCount >= 2) {
- return Promise.reject(new Error(rule.message))
- }
- }
- }
- return Promise.resolve()
- }
|