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 = `
+
${linkTooltip}
+
单击鼠标可以追踪
+
`;
+
+ $(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);