From 5adfc6055bf4cfed7f1ff40933d292057196bc7e Mon Sep 17 00:00:00 2001 From: wpxp123456 <2677556700@qq.com> Date: Thu, 29 Oct 2020 16:11:13 +0800 Subject: [PATCH] feat(hyperlink): perfect hyperlink function n --- src/controllers/controlHistory.js | 18 +++-- src/controllers/handler.js | 10 ++- src/controllers/hyperlinkCtrl.js | 98 ++++++++++++++++++++++++- src/global/extend.js | 114 +++++++++++++++++++++++++++++- src/global/refresh.js | 23 ++++-- 5 files changed, 246 insertions(+), 17 deletions(-) diff --git a/src/controllers/controlHistory.js b/src/controllers/controlHistory.js index d3940df..d22e77c 100644 --- a/src/controllers/controlHistory.js +++ b/src/controllers/controlHistory.js @@ -167,7 +167,8 @@ const controlHistory = { ctr.cf, ctr.af, ctr.freezen, - ctr.dataVerification + ctr.dataVerification, + ctr.hyperlink ); } else if (ctr.type == "delRC") { //删除行列撤销操作 @@ -185,7 +186,8 @@ const controlHistory = { ctr.cf, ctr.af, ctr.freezen, - ctr.dataVerification + ctr.dataVerification, + ctr.hyperlink ); } else if (ctr.type == "deleteCell") { //删除单元格撤销操作 @@ -196,7 +198,8 @@ const controlHistory = { ctr.calc, ctr.filterObj, ctr.cf, - ctr.dataVerification + ctr.dataVerification, + ctr.hyperlink ); } else if (ctr.type == "showHidRows") { // 隐藏、显示行 撤销操作 @@ -497,7 +500,8 @@ const controlHistory = { ctr.curCf, ctr.curAf, ctr.curFreezen, - ctr.curDataVerification + ctr.curDataVerification, + ctr.curHyperlink ); } else if (ctr.type == "delRC") { //删除行列重做操作 @@ -511,7 +515,8 @@ const controlHistory = { ctr.curCf, ctr.curAf, ctr.curFreezen, - ctr.curDataVerification + ctr.curDataVerification, + ctr.curHyperlink ); } else if (ctr.type == "deleteCell") { //删除单元格重做操作 @@ -522,7 +527,8 @@ const controlHistory = { ctr.curCalc, ctr.curFilterObj, ctr.curCf, - ctr.curDataVerification + ctr.curDataVerification, + ctr.curHyperlink ); } else if (ctr.type == "showHidRows") { // 隐藏、显示行 重做操作 diff --git a/src/controllers/handler.js b/src/controllers/handler.js index f7d72fa..4b0acb6 100644 --- a/src/controllers/handler.js +++ b/src/controllers/handler.js @@ -339,9 +339,6 @@ export default function luckysheetHandler() { //数据验证 单元格聚焦 dataVerificationCtrl.cellFocus(row_index, col_index, true); - //链接 单元格聚焦 - hyperlinkCtrl.cellFocus(row_index, col_index); - //若点击单元格部分不在视图内 if (col_pre < $("#luckysheet-cell-main").scrollLeft()) { $("#luckysheet-scrollbar-x").scrollLeft(col_pre); @@ -377,6 +374,12 @@ export default function luckysheetHandler() { } } + //链接 单元格聚焦 + if(hyperlinkCtrl.hyperlink && hyperlinkCtrl.hyperlink[row_index + "_" + col_index] && event.which != "3"){ + hyperlinkCtrl.cellFocus(row_index, col_index); + return; + } + Store.luckysheet_scroll_status = true; //公式相关 @@ -1346,6 +1349,7 @@ export default function luckysheetHandler() { //表格mousemove $(document).on("mousemove.luckysheetEvent",function (event) { luckysheetPostil.overshow(event); //有批注显示 + hyperlinkCtrl.overshow(event); //链接提示显示 window.cancelAnimationFrame(Store.jfautoscrollTimeout); diff --git a/src/controllers/hyperlinkCtrl.js b/src/controllers/hyperlinkCtrl.js index a906031..fb63fcf 100644 --- a/src/controllers/hyperlinkCtrl.js +++ b/src/controllers/hyperlinkCtrl.js @@ -1,11 +1,16 @@ import { replaceHtml } from '../utils/util'; import { getcellvalue } from '../global/getdata'; import { luckysheetrefreshgrid } from '../global/refresh'; +import { rowLocation, colLocation, mouseposition } from '../global/location'; import formula from '../global/formula'; import tooltip from '../global/tooltip'; import editor from '../global/editor'; import { modelHTML } from './constant'; +import { selectHightlightShow } from './select'; import server from './server'; +import sheetmanage from './sheetmanage'; +import luckysheetFreezen from './freezen'; +import menuButton from './menuButton'; import { getSheetIndex } from '../methods/get'; import locale from '../locale/locale'; import Store from '../store'; @@ -224,7 +229,98 @@ const hyperlinkCtrl = { return; } - + let item = _this.hyperlink[r + '_' + c]; + + if(item.linkType == 'external'){ + window.open(item.linkAddress); + } + else{ + let cellrange = formula.getcellrange(item.linkAddress); + let sheetIndex = cellrange.sheetIndex; + let range = [{ + row: cellrange.row, + column: cellrange.column + }]; + + if(sheetIndex != Store.currentSheetIndex){ + $("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"); + $("#luckysheet-sheets-item" + sheetIndex).addClass("luckysheet-sheets-item-active"); + + sheetmanage.changeSheet(sheetIndex); + } + + Store.luckysheet_select_save = range; + selectHightlightShow(true); + + let row_pre = cellrange.row[0] - 1 == -1 ? 0 : Store.visibledatarow[cellrange.row[0] - 1]; + let col_pre = cellrange.column[0] - 1 == -1 ? 0 : Store.visibledatacolumn[cellrange.column[0] - 1]; + + $("#luckysheet-scrollbar-x").scrollLeft(col_pre); + $("#luckysheet-scrollbar-y").scrollTop(row_pre); + } + }, + overshow: function(event){ + let _this = this; + + $("#luckysheet-hyperlink-overshow").remove(); + + if($(event.target).closest("#luckysheet-cell-main").length == 0){ + return; + } + + let mouse = mouseposition(event.pageX, event.pageY); + let scrollLeft = $("#luckysheet-cell-main").scrollLeft(); + let scrollTop = $("#luckysheet-cell-main").scrollTop(); + let x = mouse[0] + scrollLeft; + let y = mouse[1] + scrollTop; + + if(luckysheetFreezen.freezenverticaldata != null && mouse[0] < (luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2])){ + return; + } + + if(luckysheetFreezen.freezenhorizontaldata != null && mouse[1] < (luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2])){ + return; + } + + let row_index = rowLocation(y)[2]; + let col_index = colLocation(x)[2]; + + let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index); + if(!!margeset){ + row_index = margeset.row[2]; + col_index = margeset.column[2]; + } + + if(_this.hyperlink == null || _this.hyperlink[row_index + "_" + col_index] == null){ + return; + } + + let item = _this.hyperlink[row_index + "_" + col_index]; + let linkTooltip = item.linkTooltip; + + if(linkTooltip == null || linkTooltip.replace(/\s/g, '') == ''){ + linkTooltip = item.linkAddress; + } + + let row = Store.visibledatarow[row_index], + row_pre = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1]; + let col = Store.visibledatacolumn[col_index], + col_pre = col_index - 1 == -1 ? 0 : Store.visibledatacolumn[col_index - 1]; + + if(!!margeset){ + row = margeset.row[1]; + row_pre = margeset.row[0]; + + col = margeset.column[1]; + col_pre = margeset.column[0]; + } + + let html = ``; + + $(html).appendTo($("#luckysheet-cell-main")); }, ref: function(historyHyperlink, currentHyperlink, sheetIndex, d, range){ let _this = this; diff --git a/src/global/extend.js b/src/global/extend.js index 305e8a3..d715605 100644 --- a/src/global/extend.js +++ b/src/global/extend.js @@ -526,6 +526,50 @@ function luckysheetextendtable(type, index, value, direction, sheetIndex) { } } + //超链接配置变动 + let hyperlink = file.hyperlink; + let newHyperlink = {}; + if(hyperlink != null){ + for(let key in hyperlink){ + let r = Number(key.split('_')[0]), + c = Number(key.split('_')[1]); + let item = hyperlink[key]; + + if(type == "row"){ + if(index < r){ + newHyperlink[(r + value) + "_" + c] = item; + } + else if(index == r){ + if(direction == "lefttop"){ + newHyperlink[(r + value) + "_" + c] = item; + } + else{ + newHyperlink[r + "_" + c] = item; + } + } + else{ + newHyperlink[r + "_" + c] = item; + } + } + else if(type == "column"){ + if(index < c){ + newHyperlink[r + "_" + (c + value)] = item; + } + else if(index == c){ + if(direction == "lefttop"){ + newHyperlink[r + "_" + (c + value)] = item; + } + else{ + newHyperlink[r + "_" + c] = item; + } + } + else{ + newHyperlink[r + "_" + c] = item; + } + } + } + } + let type1; if (type == "row") { type1 = "r"; @@ -845,7 +889,8 @@ function luckysheetextendtable(type, index, value, direction, sheetIndex) { newCFarr, newAFarr, newFreezen, - newDataVerification + newDataVerification, + newHyperlink ); } else{ @@ -857,6 +902,7 @@ function luckysheetextendtable(type, index, value, direction, sheetIndex) { file.luckysheet_conditionformat_save = newCFarr; file.luckysheet_alternateformat_save = newAFarr; file.dataVerification = newDataVerification; + file.hyperlink = newHyperlink; } let range = null; @@ -1450,6 +1496,34 @@ function luckysheetdeletetable(type, st, ed, sheetIndex) { } } + //超链接配置变动 + let hyperlink = file.hyperlink; + let newHyperlink = {}; + if(hyperlink != null){ + for(let key in hyperlink){ + let r = Number(key.split('_')[0]), + c = Number(key.split('_')[1]); + let item = hyperlink[key]; + + if(type == "row"){ + if(r < st){ + newHyperlink[r + "_" + c] = item; + } + else if(r > ed){ + newHyperlink[(r - slen) + "_" + c] = item; + } + } + else if(type == "column"){ + if(c < st){ + newHyperlink[r + "_" + c] = item; + } + else if(c > ed){ + newHyperlink[r + "_" + (c - slen)] = item; + } + } + } + } + //主逻辑 let type1; if (type == "row") { @@ -1686,7 +1760,8 @@ function luckysheetdeletetable(type, st, ed, sheetIndex) { newCFarr, newAFarr, newFreezen, - newDataVerification + newDataVerification, + newHyperlink ); } else{ @@ -1698,6 +1773,7 @@ function luckysheetdeletetable(type, st, ed, sheetIndex) { file.luckysheet_conditionformat_save = newCFarr; file.luckysheet_alternateformat_save = newAFarr; file.dataVerification = newDataVerification; + file.hyperlink = newHyperlink; } } @@ -2089,6 +2165,36 @@ function luckysheetDeleteCell(type, str, edr, stc, edc, sheetIndex) { } } + //超链接配置变动 + let hyperlink = file.hyperlink; + let newHyperlink = {}; + if(hyperlink != null){ + for(let key in hyperlink){ + let r = Number(key.split('_')[0]), + c = Number(key.split('_')[1]); + let item = hyperlink[key]; + + if(r < str || r > edr || c < stc || c > edc){ + if(type == "moveLeft"){ + if(c > edc && r >= str && r <= edr){ + newHyperlink[r + "_" + (c - clen)] = item; + } + else{ + newHyperlink[r + "_" + c] = item; + } + } + else if(type == "moveUp"){ + if(r > edr && c >= stc && c <= edc){ + newHyperlink[(r - rlen) + "_" + c] = item; + } + else{ + newHyperlink[r + "_" + c] = item; + } + } + } + } + } + //边框配置变动 if(cfg["borderInfo"] && cfg["borderInfo"].length > 0){ let borderInfo = []; @@ -2200,7 +2306,8 @@ function luckysheetDeleteCell(type, str, edr, stc, edc, sheetIndex) { newCalcChain, newFilterObj, newCFarr, - newDataVerification + newDataVerification, + newHyperlink ); } else{ @@ -2211,6 +2318,7 @@ function luckysheetDeleteCell(type, str, edr, stc, edc, sheetIndex) { file.filter_select = newFilterObj.filter_select; file.luckysheet_conditionformat_save = newCFarr; file.dataVerification = newDataVerification; + file.hyperlink = newHyperlink; } } diff --git a/src/global/refresh.js b/src/global/refresh.js index 4bfa7b2..a6c2942 100644 --- a/src/global/refresh.js +++ b/src/global/refresh.js @@ -14,6 +14,7 @@ import server from '../controllers/server'; import sheetmanage from '../controllers/sheetmanage'; import luckysheetPostil from '../controllers/postil'; import dataVerificationCtrl from '../controllers/dataVerificationCtrl'; +import hyperlinkCtrl from '../controllers/hyperlinkCtrl'; import { selectHightlightShow, selectionCopyShow } from '../controllers/select'; import { createFilterOptions } from '../controllers/filter'; import { getSheetIndex } from '../methods/get'; @@ -375,7 +376,7 @@ function jfrefreshrange(data, range, cdformat) { } //删除、增加行列 刷新表格 -function jfrefreshgrid_adRC(data, cfg, ctrlType, ctrlValue, calc, filterObj, cf, af, freezen, dataVerification){ +function jfrefreshgrid_adRC(data, cfg, ctrlType, ctrlValue, calc, filterObj, cf, af, freezen, dataVerification, hyperlink){ let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]; //merge改变对应的单元格值改变 @@ -443,7 +444,9 @@ function jfrefreshgrid_adRC(data, cfg, ctrlType, ctrlValue, calc, filterObj, cf, "freezen": { "freezenhorizontaldata": luckysheetFreezen.freezenhorizontaldata, "freezenverticaldata": luckysheetFreezen.freezenverticaldata }, "curFreezen": freezen, "dataVerification": $.extend(true, {}, file.dataVerification), - "curDataVerification": dataVerification + "curDataVerification": dataVerification, + "hyperlink": $.extend(true, {}, file.hyperlink), + "curHyperlink": hyperlink }); } @@ -567,12 +570,17 @@ function jfrefreshgrid_adRC(data, cfg, ctrlType, ctrlValue, calc, filterObj, cf, file.dataVerification = dataVerification; server.saveParam("all", Store.currentSheetIndex, file.dataVerification, { "k": "dataVerification" }); + //超链接 + hyperlinkCtrl.hyperlink = hyperlink; + file.hyperlink = hyperlink; + server.saveParam("all", Store.currentSheetIndex, file.hyperlink, { "k": "hyperlink" }); + //行高、列宽刷新 jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length); } //删除单元格 刷新表格 -function jfrefreshgrid_deleteCell(data, cfg, ctrl, calc, filterObj, cf, dataVerification){ +function jfrefreshgrid_deleteCell(data, cfg, ctrl, calc, filterObj, cf, dataVerification, hyperlink){ let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]; clearTimeout(refreshCanvasTimeOut); //merge改变对应的单元格值改变 @@ -650,7 +658,9 @@ function jfrefreshgrid_deleteCell(data, cfg, ctrl, calc, filterObj, cf, dataVeri "cf": $.extend(true, [], file.luckysheet_conditionformat_save), "curCf": cf, "dataVerification": $.extend(true, {}, file.dataVerification), - "curDataVerification": dataVerification + "curDataVerification": dataVerification, + "hyperlink": $.extend(true, {}, file.hyperlink), + "curHyperlink": hyperlink }); } @@ -729,6 +739,11 @@ function jfrefreshgrid_deleteCell(data, cfg, ctrl, calc, filterObj, cf, dataVeri file.dataVerification = dataVerification; server.saveParam("all", Store.currentSheetIndex, file.dataVerification, { "k": "dataVerification" }); + //超链接 + hyperlinkCtrl.hyperlink = hyperlink; + file.hyperlink = hyperlink; + server.saveParam("all", Store.currentSheetIndex, file.hyperlink, { "k": "hyperlink" }); + refreshCanvasTimeOut = setTimeout(function () { luckysheetrefreshgrid(); }, 1);