This commit is contained in:
linfso 2025-07-07 10:07:52 +08:00
parent f914164aee
commit 8845e27acd
2 changed files with 85 additions and 65 deletions

View File

@ -95,9 +95,9 @@
</slot>
</div>
<!-- @mouseenter="initKeyDownEvent" @mouseleave="removeKeyDownEvent" -->
<div >
<div @blur="handleXdTableBlur" >
<!-- <div class="flex-auto"> -->
<orig-table ref="table" :key="refreshKeyId" tabindex="0" :config="config" v-dragSelect class="xd-tb-wrapper" />
<orig-table ref="table" :key="refreshKeyId" tabindex="0" :config="config" v-dragSelect class="xd-tb-wrapper" />
<!-- </div> -->
<!-- 统计数据 v-dragColumn v-dragSelect-->
@ -270,15 +270,18 @@ export default {
// 鼠标按下事件
tbBodyDiv.onmousedown = function (ev) {
console.log('===tbBodyDiv.onmousedown===>')
var evt = window.event || arguments[0];
var flag = true;
// 鼠标右键菜单,并且记录当前位置
if(evt.button == 2){
flag=false;
if(vnode.context.multipleSelection&&vnode.context.multipleSelection.length>0)
if(
vnode.context.multipleSelection
&&vnode.context.multipleSelection.length>0
&& vnode.context.mouseInScope
)
{
// 记住当前单元格位置
vnode.context.currentOdiv=oDiv;
vnode.context.currentCell=evt.target;
@ -286,20 +289,21 @@ export default {
const currentCellInfo=getCellPosition(evt.target);
vnode.context.currentCellInfo=currentCellInfo;
// 显示右键菜单
showContextMenu(evt);
// 绑定右键菜单
bindRightContextMenu(evt);
}
return;
}
// 清除已有选择
let selNodes=document.querySelectorAll(".seled");
if(selNodes!=null&&selNodes.length>0){
for (var i = 0; i < selNodes.length; i++) {
selNodes[i].classList.remove("seled")
}
}
vnode.context.contextVisible=false;
// 增加图层
var xdTableObj = document.getElementById(vnode.context.tableId);
@ -333,41 +337,47 @@ export default {
vnode.context.clearEventBubble(evt);
// //打开开关
vnode.context.mouseflag = true;
const tbBodyDivRect = tbBodyDiv.getBoundingClientRect();
// //鼠标拖动时画框
document.onmousemove = function (ev) {
const tbBodyDivRect = tbBodyDiv.getBoundingClientRect();
console.log("===document.onmousemove==>",ev,tbBodyDivRect);
evt = window.event || arguments[0];
_x = (evt.x || evt.clientX);
_y = (evt.y || evt.clientY);
//为了确定是点击事件还是移动事件
if(_x<tbBodyDivRect.x || _y<tbBodyDivRect.y){
console.log("no scope");
vnode.context.isTableFocused=false;
return;
}
vnode.context.isTableFocused=true;
console.log("in scope");
//过滤在范围外的事件
if(_x<tbBodyDivRect.x || _x>(tbBodyDivRect.x+tbBodyDivRect.width)
|| _y<tbBodyDivRect.y || _y>(tbBodyDivRect.y+tbBodyDivRect.height)
){
vnode.context.isTableFocused=false;
vnode.context.mouseInScope=false;
// cancelRightContextMenu();
return;
}
// if(!tbBodyDiv.contains(document.activeElement)){
// vnode.context.isTableFocused=false;
// vnode.context.mouseInScope=false;
// return;
// }
vnode.context.isTableFocused=true;
vnode.context.mouseInScope=true;
if(Math.abs(_x - startX)<5 && Math.abs(_y - startY)<5){
// setMouseCellSelect(evt.target);
// setMouseRowSelect(evt.target);
return;
}
if(flag){
//
if(flag&&vnode.context.mouseflag){
vnode.context.multipleSelection=[];
// console.log("===fileNodes.length==>",fileNodes.length);
// 只选取范围内的数据
for (var i = 0; i < fileNodes.length; i++) {
// console.log("===fileNodes==>",i);
if (fileNodes[i].className.indexOf("el-table__cell") != -1) {
fileNodes[i].classList.remove("seled");
// console.log("===selList.length==>",selList.length);
selList.push(fileNodes[i]);
}
}
@ -455,28 +465,14 @@ export default {
vnode.context.clearEventBubble(evt);
};
function showContextMenu(event){
function bindRightContextMenu(evt){
var xdTableObj = document.getElementById(vnode.context.tableId);
xdTableObj.addEventListener("contextmenu", function(event) {
vnode.context.clearEventBubble(event)
var menu = xdTableObj.querySelector("#contextMenu");
// console.log("====>xdTableObj====>",xdTableObj);
// console.log("====>menu====>",menu);
let tbPosRect=getTablePosition(xdTableObj);
menu.style.left = (event.clientX-tbPosRect.left+5) + "px";
menu.style.top = (event.clientY-tbPosRect.top-35) + "px";
menu.style.display = "block";
menu.style.zIndex = 3000;
vnode.context.contextVisible=true;
event.preventDefault();
});
xdTableObj.addEventListener("contextmenu", vnode.context.handleOnContextMenu);
}
function cancelContextMenu() {
document.oncontextmenu = new Function("event.returnValue=true");
function cancelRightContextMenu() {
var xdTableObj = document.getElementById(vnode.context.tableId);
xdTableObj.removeEventListener('contextmenu',vnode.context.handleOnContextMenu)
// document.oncontextmenu = new Function("event.returnValue=true");
}
// 获取el-table元素的位置信息
function getTablePosition(tbDom) {
@ -515,10 +511,13 @@ export default {
}
else{
cell.className = cell.className + " seled";
vnode.context.mouseInScope=true;
}
const cellInfo=getCellPosition(cell);
vnode.context.multipleSelection=[];
vnode.context.multipleSelection.push(cellInfo);
// 行样式设置
// const refTableObj=vnode.context.getInstance();
@ -611,6 +610,8 @@ export default {
//指令中确定的时候是鼠标按下事件
mouseflag: false,
// 鼠标位置在表格区域内
mouseInScope: false,
//选中的数组
multipleSelection: [],
multipleRowSelection:[],
@ -676,17 +677,19 @@ export default {
},
},
mounted() {
// console.log("===>xdtabe mounted==111->");
if(this.saveStorageName&&this.saveStorageName!=undefined&&this.saveStorageName!=''){
this.isNeedDbSaveTpl=true;
}else{
this.fullUrl=window.location.origin + window.location.pathname + window.location.search + window.location.hash;
this.pageId=this.MD5(this.fullUrl);
this.saveStorageName=this.pageId;
// // console.log("===> this.fullUrl==>", this.fullUrl,this.saveStorageName)
this.isNeedDbSaveTpl=false;
}
// 监听全局焦点变化事件
// document.addEventListener('focusin', this.handleGlobalFocusIn);
// document.addEventListener('focusout', this.handleGlobalFocusOut);
this.initKeyDownEvent();
// 初始化默认模版到本地
this.initDefaultTplList();
@ -694,9 +697,6 @@ export default {
this.updateTable()
this.tableDom=this.getTableDom();
// 监听 ctrl+c键盘事件
let that=this;
},
beforeDestroy () {
document.removeEventListener('keydown', this.handleGlobalKeydown)
@ -709,25 +709,52 @@ export default {
return Math.random().toString(36).substring(3,10);
},
// 处理全局焦点进入事件
handleGlobalFocusIn(event) {
// var tableEl = document.getElementById(this.tableId);
// const hasFocus = tableEl.contains(event.target);
// console.log("===>hasFocus===>",hasFocus,tableEl,event.target);
// 表格获得焦点
// if (hasFocus && !this.isTableFocused) {
// this.tableHasFocus = true;
// this.$message({
// message: '表格已获得焦点',
// type: 'success',
// duration: 1500
// });
// }
},
handleXdTableBlur(){
this.isTableFocused=false;
console.log("===>handleXdTableBlur===>",this.isTableFocused);
},
// 全局键盘事件处理
handleGlobalKeydown(event) {
// console.log("===>handleGlobalKeydown===>",event)
// 检查是否按下了Ctrl+C组合键
event = event||window.event;
if ((event.ctrlKey || event.metaKey) && event.key === 'c') {
// 如果焦点在表格内,处理复制操作
if (this.isTableFocused) {
event.preventDefault();
this.handleCopySelect();
// e = e||window.event;
// if(e.ctrlKey&&e.code=="KeyC"){
// that.handleCopySelect(e);
// return false;
// }
}
}
},
handleOnContextMenu(event){
// vnode.context.clearEventBubble(event)
var xdTableObj = document.getElementById(this.tableId);
this.clearEventBubble(event)
var menu = xdTableObj.querySelector("#contextMenu");
let tbPosRect=this.getTablePosition(xdTableObj);
menu.style.left = (event.clientX-tbPosRect.left+5) + "px";
menu.style.top = (event.clientY-tbPosRect.top-35) + "px";
menu.style.display = "block";
menu.style.zIndex = 3000;
this.contextVisible=true;
event.preventDefault();
},
clearSelection(){
this.$nextTick(()=>{
this.$refs.table.$refs.elTable.clearSelection();
@ -735,11 +762,9 @@ export default {
},
initKeyDownEvent(){
// console.log('===initKeyDownEvent===>')
document.addEventListener('keydown', this.handleGlobalKeydown );
},
removeKeyDownEvent(){
// console.log('===removeKeyDownEvent===>')
document.removeEventListener('keydown', this.handleGlobalKeydown );
},
@ -939,12 +964,7 @@ export default {
});
selStr=this.trimTabChar(selStr,'\t','');
// 去除两端空格
this.currentSelectStr=selStr;
this.isTableFocused=true;
}else{
this.isTableFocused=false;
}
// this.$emit('handleSelect',this.multipleSelection)
@ -1270,8 +1290,6 @@ export default {
}
}
list=list2;
// console.log("===>list=1111=>",list);
this.storageList = list
},
// 根据缓存的数组进行渲染表格

View File

@ -240,11 +240,13 @@ import EmisUserSimplePicker2 from '@/views/emis/EmisBaseTools/EmisUserSimplePick
import EmpNamePicker1 from '@/views/emis/EmisBaseTools/EmpNamePicker.vue';
import EmpNamePicker2 from '@/views/emis/EmisBaseTools/EmpNamePicker.vue';
import XdTable3 from '@/components/XdTable/index3.vue';
export default {
name: "MoneyUserList",
components: {AirTable, EmpNamePicker1,EmpNamePicker2,elDateSimplePicker,moneyUserForm ,CountryPicker,
EmisSiteSimplePicker,ProvincePicker,CityPicker,
EmisUserSimplePicker0,EmisUserSimplePicker1,EmisUserSimplePicker2
EmisUserSimplePicker0,EmisUserSimplePicker1,EmisUserSimplePicker2,XdTable3
},
dicts: [
],