import { replaceHtml, chatatABC } from '../utils/util'; import { getSheetIndex } from '../methods/get'; import { modelHTML, keycode } from './constant'; import { selectHightlightShow } from './select'; import sheetmanage from './sheetmanage'; import { isEditMode } from '../global/validate'; import { valueShowEs } from '../global/format'; import { setcellvalue } from '../global/setdata'; import { jfrefreshgrid } from '../global/refresh'; import editor from '../global/editor'; import tooltip from '../global/tooltip'; import func_methods from '../global/func_methods'; import Store from '../store'; import locale from '../locale/locale'; import {checkProtectionLockedRangeList,checkProtectionAllSelected,checkProtectionSelectLockedOrUnLockedCells,checkProtectionNotEnable,checkProtectionLocked} from './protection'; //查找替换 const luckysheetSearchReplace = { createDialog: function(source){ $("#luckysheet-modal-dialog-mask").hide(); $("#luckysheet-search-replace").remove(); const _locale = locale(); const locale_findAndReplace = _locale.findAndReplace; const locale_button = _locale.button; let content = '<div class="tabBox">' + '<span id="searchTab">'+ locale_findAndReplace.find +'</span>' + '<span id="replaceTab">'+ locale_findAndReplace.replace +'</span>' + '</div>' + '<div class="ctBox">' + '<div class="inputBox">' + '<div class="textboxs" id="searchInput">'+ locale_findAndReplace.findTextbox +':<input class="formulaInputFocus" spellcheck="false" value=""/></div>' + '<div class="textboxs" id="replaceInput">'+ locale_findAndReplace.replaceTextbox +':<input class="formulaInputFocus" spellcheck="false" value=""/></div>' + '<div class="checkboxs">' + '<div id="regCheck">' + '<input type="checkbox"/>' + '<span>'+ locale_findAndReplace.regexTextbox +'</span>' + '</div>' + '<div id="wordCheck">' + '<input type="checkbox"/>' + '<span>'+ locale_findAndReplace.wholeTextbox +'</span>' + '</div>' + '<div id="caseCheck">' + '<input type="checkbox"/>' + '<span>'+ locale_findAndReplace.distinguishTextbox +'</span>' + '</div>' + '</div>' + '</div>' + '<div class="btnBox">' + '<button id="replaceAllBtn" class="btn btn-default">'+ locale_findAndReplace.allReplaceBtn +'</button>' + '<button id="replaceBtn" class="btn btn-default">'+ locale_findAndReplace.replaceBtn +'</button>' + '<button id="searchAllBtn" class="btn btn-default">'+ locale_findAndReplace.allFindBtn +'</button>' + '<button id="searchNextBtn" class="btn btn-default">'+ locale_findAndReplace.findBtn +'</button>' + '</div>' + '</div>'; $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-search-replace", "addclass": "luckysheet-search-replace", "title": "", "content": content, "botton": '<button class="btn btn-default luckysheet-model-close-btn">'+locale_button.close+'</button>', "style": "z-index:100003", "close":locale_button.close })); let $t = $("#luckysheet-search-replace").find(".luckysheet-modal-dialog-content").css("min-width", 500).end(), myh = $t.outerHeight(), myw = $t.outerWidth(); let winw = $(window).width(), winh = $(window).height(); let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop(); $("#luckysheet-search-replace").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); if(source == "0"){ $("#luckysheet-search-replace #searchTab").addClass("on").siblings().removeClass("on"); $("#luckysheet-search-replace #replaceInput").hide(); $("#luckysheet-search-replace #replaceAllBtn").hide(); $("#luckysheet-search-replace #replaceBtn").hide(); } else if(source == "1"){ $("#luckysheet-search-replace #replaceTab").addClass("on").siblings().removeClass("on"); $("#luckysheet-search-replace #replaceInput").show(); $("#luckysheet-search-replace #replaceAllBtn").show(); $("#luckysheet-search-replace #replaceBtn").show(); } }, init: function(){ let _this = this; //查找替换 切换 $(document).off("click.SRtabBoxspan").on("click.SRtabBoxspan", "#luckysheet-search-replace .tabBox span", function(){ $(this).addClass("on").siblings().removeClass("on"); let $id = $(this).attr("id"); if($id == "searchTab"){ $("#luckysheet-search-replace #replaceInput").hide(); $("#luckysheet-search-replace #replaceAllBtn").hide(); $("#luckysheet-search-replace #replaceBtn").hide(); $("#luckysheet-search-replace #searchInput input").focus(); } else if($id == "replaceTab"){ $("#luckysheet-search-replace #replaceInput").show(); $("#luckysheet-search-replace #replaceAllBtn").show(); $("#luckysheet-search-replace #replaceBtn").show(); $("#luckysheet-search-replace #replaceInput input").focus(); } }); //查找下一个 $(document).off("keyup.SRsearchInput").on("keyup.SRsearchInput", "#luckysheet-search-replace #searchInput input", function(event){ let kcode = event.keyCode; if(kcode == keycode.ENTER){ _this.searchNext(); } }); $(document).off("click.SRsearchNextBtn").on("click.SRsearchNextBtn", "#luckysheet-search-replace #searchNextBtn", function(){ _this.searchNext(); }); //查找全部 $(document).off("click.SRsearchAllBtn").on("click.SRsearchAllBtn", "#luckysheet-search-replace #searchAllBtn", function(){ _this.searchAll(); }); $(document).off("click.SRsearchAllboxItem").on("click.SRsearchAllboxItem", "#luckysheet-search-replace #searchAllbox .boxItem", function(){ $(this).addClass("on").siblings().removeClass("on"); let r = $(this).attr("data-row"); let c = $(this).attr("data-col"); let sheetIndex = $(this).attr("data-sheetIndex"); if(sheetIndex != Store.currentSheetIndex){ sheetmanage.changeSheetExec(sheetIndex); } Store.luckysheet_select_save = [ { "row": [r, r], "column": [c, c] } ]; selectHightlightShow(); let scrollLeft = $("#luckysheet-cell-main").scrollLeft(), scrollTop = $("#luckysheet-cell-main").scrollTop(); let winH = $("#luckysheet-cell-main").height(), winW = $("#luckysheet-cell-main").width(); let row = Store.visibledatarow[r], row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1]; let col = Store.visibledatacolumn[c], col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1]; if (col - scrollLeft - winW + 20 > 0) { $("#luckysheet-scrollbar-x").scrollLeft(col - winW + 20); } else if (col_pre - scrollLeft - 20 < 0) { $("#luckysheet-scrollbar-x").scrollLeft(col_pre - 20); } if (row - scrollTop - winH + 20 > 0) { $("#luckysheet-scrollbar-y").scrollTop(row - winH + 20); } else if (row_pre - scrollTop - 20 < 0) { $("#luckysheet-scrollbar-y").scrollTop(row_pre - 20); } }); //替换 $(document).off("click.SRreplaceBtn").on("click.SRreplaceBtn", "#luckysheet-search-replace #replaceBtn", function(){ _this.replace(); }); //全部替换 $(document).off("click.SRreplaceAllBtn").on("click.SRreplaceAllBtn", "#luckysheet-search-replace #replaceAllBtn", function(){ _this.replaceAll(); }); }, searchNext: function(){ let _this = this; let searchText = $("#luckysheet-search-replace #searchInput input").val(); if(searchText == "" || searchText == null){ return; } const _locale = locale(); const locale_findAndReplace = _locale.findAndReplace; let range; if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){ range = [{ "row": [0, Store.flowdata.length - 1], "column": [0, Store.flowdata[0].length - 1] }]; } else{ range = $.extend(true, [], Store.luckysheet_select_save); } let searchIndexArr = _this.getSearchIndexArr(searchText, range); if(searchIndexArr.length == 0){ if(isEditMode()){ alert(locale_findAndReplace.noFindTip); } else{ tooltip.info(locale_findAndReplace.noFindTip, ""); } return; } let count = 0; if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){ if(Store.luckysheet_select_save.length == 0){ count = 0; } else{ for(let i = 0; i < searchIndexArr.length; i++){ if(searchIndexArr[i].r == Store.luckysheet_select_save[0].row[0] && searchIndexArr[i].c == Store.luckysheet_select_save[0].column[0]){ if(i == searchIndexArr.length - 1){ count = 0; } else{ count = i + 1; } break; } } } Store.luckysheet_select_save = [{ "row": [searchIndexArr[count].r, searchIndexArr[count].r], "column": [searchIndexArr[count].c, searchIndexArr[count].c] }]; } else{ let rf = range[range.length - 1].row_focus; let cf = range[range.length - 1].column_focus; for(let i = 0; i < searchIndexArr.length; i++){ if(searchIndexArr[i].r == rf && searchIndexArr[i].c == cf){ if(i == searchIndexArr.length - 1){ count = 0; } else{ count = i + 1; } break; } } for(let s = 0; s < range.length; s++){ let r1 = range[s].row[0], r2 = range[s].row[1]; let c1 = range[s].column[0], c2 = range[s].column[1]; if(searchIndexArr[count].r >= r1 && searchIndexArr[count].r <= r2 && searchIndexArr[count].c >= c1 && searchIndexArr[count].c <= c2){ let obj = range[s]; obj["row_focus"] = searchIndexArr[count].r; obj["column_focus"] = searchIndexArr[count].c; range.splice(s, 1); range.push(obj); break; } } Store.luckysheet_select_save = range; } selectHightlightShow(); let scrollLeft = $("#luckysheet-cell-main").scrollLeft(), scrollTop = $("#luckysheet-cell-main").scrollTop(); let winH = $("#luckysheet-cell-main").height(), winW = $("#luckysheet-cell-main").width(); let row = Store.visibledatarow[searchIndexArr[count].r], row_pre = searchIndexArr[count].r - 1 == -1 ? 0 : Store.visibledatarow[searchIndexArr[count].r - 1]; let col = Store.visibledatacolumn[searchIndexArr[count].c], col_pre = searchIndexArr[count].c - 1 == -1 ? 0 : Store.visibledatacolumn[searchIndexArr[count].c - 1]; if (col - scrollLeft - winW + 20 > 0) { $("#luckysheet-scrollbar-x").scrollLeft(col - winW + 20); } else if (col_pre - scrollLeft - 20 < 0) { $("#luckysheet-scrollbar-x").scrollLeft(col_pre - 20); } if (row - scrollTop - winH + 20 > 0) { $("#luckysheet-scrollbar-y").scrollTop(row - winH + 20); } else if (row_pre - scrollTop - 20 < 0) { $("#luckysheet-scrollbar-y").scrollTop(row_pre - 20); } if($("#searchAllbox").is(":visible")){ $("#luckysheet-search-replace #searchAllbox .boxItem").removeClass("on"); } }, searchAll: function(){ let _this = this; const _locale = locale(); const locale_findAndReplace = _locale.findAndReplace; $("#luckysheet-search-replace #searchAllbox").remove(); let searchText = $("#luckysheet-search-replace #searchInput input").val(); if(searchText == "" || searchText == null){ return; } let range; if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){ range = [{ "row": [0, Store.flowdata.length - 1], "column": [0, Store.flowdata[0].length - 1] }]; } else{ range = $.extend(true, [], Store.luckysheet_select_save); } let searchIndexArr = _this.getSearchIndexArr(searchText, range); if(searchIndexArr.length == 0){ if(isEditMode()){ alert(locale_findAndReplace.noFindTip); } else{ tooltip.info(locale_findAndReplace.noFindTip, ""); } return; } let searchAllHtml = ''; for(let i = 0; i < searchIndexArr.length; i++){ let value_ShowEs = valueShowEs(searchIndexArr[i].r, searchIndexArr[i].c, Store.flowdata).toString(); if(value_ShowEs.indexOf("</") > -1 && value_ShowEs.indexOf(">") > -1){ searchAllHtml += '<div class="boxItem" data-row="' + searchIndexArr[i].r + '" data-col="' + searchIndexArr[i].c + '" data-sheetIndex="' + Store.currentSheetIndex + '">' + '<span>' + Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name + '</span>' + '<span>' + chatatABC(searchIndexArr[i].c) + (searchIndexArr[i].r + 1) + '</span>' + '<span>' + value_ShowEs + '</span>' + '</div>'; } else{ searchAllHtml += '<div class="boxItem" data-row="' + searchIndexArr[i].r + '" data-col="' + searchIndexArr[i].c + '" data-sheetIndex="' + Store.currentSheetIndex + '">' + '<span>' + Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name + '</span>' + '<span>' + chatatABC(searchIndexArr[i].c) + (searchIndexArr[i].r + 1) + '</span>' + '<span title="' + value_ShowEs + '">' + value_ShowEs + '</span>' + '</div>'; } } $('<div id="searchAllbox"><div class="boxTitle"><span>'+ locale_findAndReplace.searchTargetSheet +'</span><span>'+locale_findAndReplace.searchTargetCell+'</span><span>'+locale_findAndReplace.searchTargetValue+'</span></div><div class="boxMain">' + searchAllHtml + '</div></div>').appendTo($("#luckysheet-search-replace")); $("#luckysheet-search-replace #searchAllbox .boxItem").eq(0).addClass("on").siblings().removeClass("on"); Store.luckysheet_select_save = [{ "row": [searchIndexArr[0].r, searchIndexArr[0].r], "column": [searchIndexArr[0].c, searchIndexArr[0].c] }]; selectHightlightShow(); }, getSearchIndexArr: function(searchText, range){ let arr = []; let obj = {}; //正则表达式匹配 let regCheck = false; if($("#luckysheet-search-replace #regCheck input[type='checkbox']").is(":checked")){ regCheck = true; } //整词匹配 let wordCheck = false; if($("#luckysheet-search-replace #wordCheck input[type='checkbox']").is(":checked")){ wordCheck = true; } //区分大小写匹配 let caseCheck = false; if($("#luckysheet-search-replace #caseCheck input[type='checkbox']").is(":checked")){ caseCheck = true; } for(let s = 0; s < range.length; s++){ let r1 = range[s].row[0], r2 = range[s].row[1]; let c1 = range[s].column[0], c2 = range[s].column[1]; for(let r = r1; r <= r2; r++){ for(let c = c1; c <= c2; c++){ let cell = Store.flowdata[r][c]; if(cell != null){ let value = valueShowEs(r, c, Store.flowdata); if(value == 0){ value = value.toString(); } if(value != null && value != ""){ value = value.toString(); // 1. 勾选整词 直接匹配 // 2. 勾选了正则 结合是否勾选 构造正则 // 3. 什么都没选 用字符串 indexOf 匹配 if(wordCheck){ //整词 if(caseCheck){ if(searchText == value){ if(!((r + "_" + c) in obj)){ obj[r + "_" + c] = 0; arr.push({"r": r, "c": c}); } } } else{ let txt = searchText.toLowerCase(); if(txt == value.toLowerCase()){ if(!((r + "_" + c) in obj)){ obj[r + "_" + c] = 0; arr.push({"r": r, "c": c}); } } } } else if(regCheck){ //正则表达式 let reg; // 是否区分大小写 if(caseCheck){ reg = new RegExp(func_methods.getRegExpStr(searchText), "g"); } else{ reg = new RegExp(func_methods.getRegExpStr(searchText), "ig"); } if(reg.test(value)){ if(!((r + "_" + c) in obj)){ obj[r + "_" + c] = 0; arr.push({"r": r, "c": c}); } } } else{ if(~value.indexOf(searchText)){ if(!((r + "_" + c) in obj)){ obj[r + "_" + c] = 0; arr.push({"r": r, "c": c}); } } } } } } } } return arr; }, replace: function(){ let _this = this; const _locale = locale(); const locale_findAndReplace = _locale.findAndReplace; if(!Store.allowEdit){ tooltip.info(locale_findAndReplace.modeTip, ""); return; } let searchText = $("#luckysheet-search-replace #searchInput input").val(); if(searchText == "" || searchText == null){ if(isEditMode()){ alert(locale_findAndReplace.searchInputTip); } else{ tooltip.info(locale_findAndReplace.searchInputTip, ""); } return; } let range; if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){ range = [{ "row": [0, Store.flowdata.length - 1], "column": [0, Store.flowdata[0].length - 1] }]; } else{ range = $.extend(true, [], Store.luckysheet_select_save); } let searchIndexArr = _this.getSearchIndexArr(searchText, range); if(searchIndexArr.length == 0){ if(isEditMode()){ alert(locale_findAndReplace.noReplceTip); } else{ tooltip.info(locale_findAndReplace.noReplceTip, ""); } return; } let count = null; let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]; let rf = last.row_focus; let cf = last.column_focus; for(let i = 0; i < searchIndexArr.length; i++){ if(searchIndexArr[i].r == rf && searchIndexArr[i].c == cf){ count = i; break; } } if(count == null){ if(searchIndexArr.length == 0){ if(isEditMode()){ alert(locale_findAndReplace.noMatchTip); } else{ tooltip.info(locale_findAndReplace.noMatchTip, ""); } return; } else{ count = 0; } } //正则表达式匹配 let regCheck = false; if($("#luckysheet-search-replace #regCheck input[type='checkbox']").is(":checked")){ regCheck = true; } //整词匹配 let wordCheck = false; if($("#luckysheet-search-replace #wordCheck input[type='checkbox']").is(":checked")){ wordCheck = true; } //区分大小写匹配 let caseCheck = false; if($("#luckysheet-search-replace #caseCheck input[type='checkbox']").is(":checked")){ caseCheck = true; } let replaceText = $("#luckysheet-search-replace #replaceInput input").val(); let d = editor.deepCopyFlowData(Store.flowdata); let r, c; if(wordCheck){ r = searchIndexArr[count].r; c = searchIndexArr[count].c; let v = replaceText; if(!checkProtectionLocked(r, c, Store.currentSheetIndex)){ return; } setcellvalue(r, c, d, v); } else{ let reg; if(caseCheck){ reg = new RegExp(func_methods.getRegExpStr(searchText), "g"); } else{ reg = new RegExp(func_methods.getRegExpStr(searchText), "ig"); } r = searchIndexArr[count].r; c = searchIndexArr[count].c; if(!checkProtectionLocked(r, c, Store.currentSheetIndex)){ return; } let v = valueShowEs(r, c, d).toString().replace(reg, replaceText); setcellvalue(r, c, d, v); } Store.luckysheet_select_save = [{ "row": [r, r], "column": [c, c] }]; if($("#luckysheet-search-replace #searchAllbox").is(":visible")){ $("#luckysheet-search-replace #searchAllbox").hide(); } jfrefreshgrid(d, Store.luckysheet_select_save); selectHightlightShow(); let scrollLeft = $("#luckysheet-cell-main").scrollLeft(), scrollTop = $("#luckysheet-cell-main").scrollTop(); let winH = $("#luckysheet-cell-main").height(), winW = $("#luckysheet-cell-main").width(); let row = Store.visibledatarow[r], row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1]; let col = Store.visibledatacolumn[c], col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1]; if (col - scrollLeft - winW + 20 > 0) { $("#luckysheet-scrollbar-x").scrollLeft(col - winW + 20); } else if (col_pre - scrollLeft - 20 < 0) { $("#luckysheet-scrollbar-x").scrollLeft(col_pre - 20); } if (row - scrollTop - winH + 20 > 0) { $("#luckysheet-scrollbar-y").scrollTop(row - winH + 20); } else if (row_pre - scrollTop - 20 < 0) { $("#luckysheet-scrollbar-y").scrollTop(row_pre - 20); } }, replaceAll: function(){ let _this = this; const _locale = locale(); const locale_findAndReplace = _locale.findAndReplace; if(!Store.allowEdit){ tooltip.info(locale_findAndReplace.modeTip, ""); return; } let searchText = $("#luckysheet-search-replace #searchInput input").val(); if(searchText == "" || searchText == null){ if(isEditMode()){ alert(locale_findAndReplace.searchInputTip); } else{ tooltip.info(locale_findAndReplace.searchInputTip, ""); } return; } let range; if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){ range = [{ "row": [0, Store.flowdata.length - 1], "column": [0, Store.flowdata[0].length - 1] }]; } else{ range = $.extend(true, [], Store.luckysheet_select_save); } let searchIndexArr = _this.getSearchIndexArr(searchText, range); if(searchIndexArr.length == 0){ if(isEditMode()){ alert(locale_findAndReplace.noReplceTip); } else{ tooltip.info(locale_findAndReplace.noReplceTip, ""); } return; } //正则表达式匹配 let regCheck = false; if($("#luckysheet-search-replace #regCheck input[type='checkbox']").is(":checked")){ regCheck = true; } //整词匹配 let wordCheck = false; if($("#luckysheet-search-replace #wordCheck input[type='checkbox']").is(":checked")){ wordCheck = true; } //区分大小写匹配 let caseCheck = false; if($("#luckysheet-search-replace #caseCheck input[type='checkbox']").is(":checked")){ caseCheck = true; } let replaceText = $("#luckysheet-search-replace #replaceInput input").val(); let d = editor.deepCopyFlowData(Store.flowdata); let replaceCount = 0; if(wordCheck){ for(let i = 0; i < searchIndexArr.length; i++){ let r = searchIndexArr[i].r; let c = searchIndexArr[i].c; if(!checkProtectionLocked(r, c, Store.currentSheetIndex, false)){ continue; } let v = replaceText; setcellvalue(r, c, d, v); range.push({ "row": [r, r], "column": [c, c] }); replaceCount++; } } else{ let reg; if(caseCheck){ reg = new RegExp(func_methods.getRegExpStr(searchText), "g"); } else{ reg = new RegExp(func_methods.getRegExpStr(searchText), "ig"); } for(let i = 0; i < searchIndexArr.length; i++){ let r = searchIndexArr[i].r; let c = searchIndexArr[i].c; if(!checkProtectionLocked(r, c, Store.currentSheetIndex, false)){ continue; } let v = valueShowEs(r, c, d).toString().replace(reg, replaceText); setcellvalue(r, c, d, v); range.push({ "row": [r, r], "column": [c, c] }); replaceCount++; } } if($("#luckysheet-search-replace #searchAllbox").is(":visible")){ $("#luckysheet-search-replace #searchAllbox").hide(); } jfrefreshgrid(d, range); Store.luckysheet_select_save = $.extend(true, [], range); selectHightlightShow(); let succeedInfo = replaceHtml(locale_findAndReplace.successTip, { "xlength": replaceCount }); if(isEditMode()){ alert(succeedInfo); } else{ tooltip.info(succeedInfo, ""); } } } export default luckysheetSearchReplace;