import {createApp, nextTick} from "vue/dist/vue.esm-bundler.js"; import {getTokenHeader} from '~src/api/request/header'; import {toParse, isArray} from "vue-utils-plus"; import HcTableFormUpload from "~com/plugins/table-form/hc-form-upload.vue" import HcFormSelectSearch from "~com/plugins/table-form/hc-form-select-search.vue" import HcFormCheckboxGroup from "~com/plugins/table-form/hc-form-checkbox-group.vue" import { ElButton, ElTooltip, ElInput, ElDatePicker, ElUpload, ElInputNumber, ElSelect, ElOption, ElRadioGroup, ElRadio, ElCheckbox, ElCheckboxGroup, ElTimePicker } from 'element-plus' const components = { ElButton, ElTooltip, ElInput, ElDatePicker, ElUpload, ElInputNumber, ElTimePicker, ElSelect, ElOption, ElRadioGroup, ElRadio, ElCheckbox, ElCheckboxGroup, HcTableFormUpload, HcFormSelectSearch, HcFormCheckboxGroup } //表单渲染 export default class HTableForm { static createForm({template, tableForm, keys, appId, onRight, onBlur}) { const _this = this; const app = createApp({ data() { return { getTokenHeader: getTokenHeader(), formData: tableForm, } }, //html标签数据 template, //自定义组件,需要把饿了么的组件,或者自定义组件手动传递进来绑定,否则渲染时,自定义组件不会生效 components, //监听数据,伪双向绑定(v-model) watch: { tableForm: { handler(obj) { this.formData = obj }, deep: true }, formData: { handler(obj) { tableForm = obj }, deep: true }, }, methods: { //鼠标右键事件 RightClick(a, b, c, d, e, f, event) { event.preventDefault(); const KeyName = event?.target?.getAttribute('keyname') || '' if (onRight) { onRight(event, KeyName) } }, //焦点事件 getInformation() { }, //日期选择事件 datePickerChange(val, key) { this.formData[key] = val }, //上传完成 formUploadSuccess({src, key}) { this.formData[key] = src }, //删除上传的文件 delTableFormFile(key) { this.formData[key] = '' }, //失去焦点事件 getRegularExpression(event, reg, msg, a, b, leng) { const KeyName = event?.target?.getAttribute('keyname') || '' if (onBlur) { onBlur(event, KeyName, reg, this.formData[KeyName], msg, leng) } }, //远程搜索处理 formRemoteChange(data) { Object.keys(data).forEach(key => { this.formData[key] = data[key] }) }, //多选框处理 checkboxGroupChange({key, val}) { this.formData[key] = val }, //键盘事件 上键 keyupShiftUp(event) { _this.setKeyupData(event, 'up', keys) }, //键盘事件 下键 keyupShiftDown(event) { _this.setKeyupData(event, 'down', keys) }, //键盘事件 左键 keyupShiftLeft(event) { _this.setKeyupData(event, 'left', keys) }, //键盘事件 右键 keyupShiftRight(event) { _this.setKeyupData(event, 'right', keys) }, } }) app.mount(appId) return app } //处理日期范围数据 static setPickerKey(data) { const pickerKey = data['pickerKey'] || '' if (pickerKey) { const pickerKeys = pickerKey.split(',') for (let i = 0; i < pickerKeys.length; i++) { const val = data[pickerKeys[i]] || '' if (val) { const dataVal = val.replace(/'/g, '"'); data[pickerKeys[i]] = toParse(dataVal) || [] } else { data[pickerKeys[i]] = [] } } } return data } //处理日期时间框的切换事件 static setByClassKeyup(keys) { try { let poppers = document.getElementsByClassName('hc-table-form-date-picker') for (let i = 0; i < poppers.length; i++) { let item = poppers[i], key = ''; const ids = item.getAttribute('class').split('-form-id-') if (ids.length >= 1) { key = ids[1] } if (ids) { let panels = item.getElementsByClassName('el-picker-panel__content') this.setElementsEvent(panels, key, keys) } } } catch (e) { console.log(e) } } //设置事件 static setElementsEvent(elements, key, keys) { if (elements.length > 0) { const _this = this; elements[0].addEventListener("keydown", e => { e.stopPropagation() if (e.key === 'ArrowUp') { _this.setKeyupData({target: {id: key}}, 'up', keys) } else if (e.key === 'ArrowDown') { _this.setKeyupData({target: {id: key}}, 'down', keys) } else if (e.key === 'ArrowLeft') { _this.setKeyupData({target: {id: key}}, 'left', keys) } else if (e.key === 'ArrowRight') { _this.setKeyupData({target: {id: key}}, 'right', keys) } }, { capture: true }); } } //计算上下左右快捷键的 static setKeyupData({target}, type, keys) { const key = target.id //处理快捷键数据和事件 if (key && type && isArray(keys)) { //计算当前的位置 let left = -1, top = -1; for (let i = 0; i < keys.length; i++) { if (isArray(keys[i])) { const index = keys[i].findIndex(id => id === key) if (index !== -1) { left = index top = i break; } } } if (type === 'up') { //向上移动 if (top > 0) { let keyId = ''; const tops = keys[top - 1] const keyLength = tops.length - 1; if (keyLength < left) { keyId = tops[keyLength] } else { keyId = tops[left] } this.setElementFocus(keyId) } } else if (type === 'down') { //向下移动 const tops = keys.length - 1; if (tops > top) { let keyId = ''; const tops = keys[top + 1] const keyLength = tops.length - 1; if (keyLength < left) { keyId = tops[keyLength] } else { keyId = tops[left] } this.setElementFocus(keyId) } } else if (type === 'left') { //向左移动 if (left > 0) { const keyId = keys[top][left - 1] this.setElementFocus(keyId) } } else if (type === 'right') { //向右移动 const lefts = keys[top] const leftLength = lefts.length - 1; if (leftLength > left) { const keyId = lefts[left + 1] this.setElementFocus(keyId) } } } } //设置元素焦点 static setElementFocus(keyId) { if (keyId) { try { console.log('focus', keyId) document.getElementById(keyId).focus(); } catch (e) { console.log(e) } } } }