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 {checkProtectionLocked} from './protection';
import escapeHtml from "escape-html";
//查找替换
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 = '
' +
''+ locale_findAndReplace.find +'' +
''+ locale_findAndReplace.replace +'' +
'
' +
'' +
'
' +
'
' +
'' +
'' +
'' +
'' +
'
' +
'
';
$("body").first().append(replaceHtml(modelHTML, {
"id": "luckysheet-search-replace",
"addclass": "luckysheet-search-replace",
"title": "",
"content": content,
"botton": '',
"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 += '' +
'' + escapeHtml(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name) + '' +
'' + chatatABC(searchIndexArr[i].c) + (searchIndexArr[i].r + 1) + '' +
'' + escapeHtml(value_ShowEs) + '' +
'
';
}
else{
searchAllHtml += '' +
'' + Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name + '' +
'' + chatatABC(searchIndexArr[i].c) + (searchIndexArr[i].r + 1) + '' +
'' + escapeHtml(value_ShowEs) + '' +
'
';
}
}
$(`${locale_findAndReplace.searchTargetSheet}${locale_findAndReplace.searchTargetCell}${locale_findAndReplace.searchTargetValue}
${searchAllHtml}
`).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){
const arr = [];
const obj = {};
const $container = $("#luckysheet-search-replace");
const isChecked = (inputId) => $container.find(`#${inputId} input[type='checkbox']`).is(":checked");
//正则表达式匹配
const regCheck = isChecked("regCheck");
//整词匹配
const wordCheck = isChecked("wordCheck");
//区分大小写匹配
const caseCheck = isChecked("caseCheck");
let regExpFlags = "g";
if (!caseCheck) {
searchText = searchText.toLowerCase();
regExpFlags += "i";
}
const addResult = (r, c) => {
if(!((r + "_" + c) in obj)){
obj[r + "_" + c] = 0;
arr.push({"r": r, "c": c});
}
}
for(let s = 0; s < range.length; s++){
const r1 = range[s].row[0], r2 = range[s].row[1];
const c1 = range[s].column[0], c2 = range[s].column[1];
for(let r = r1; r <= r2; r++){
for(let c = c1; c <= c2; c++){
const 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 != ""){
let wasFound = false;
value = value.toString();
value = caseCheck ? value : value.toLowerCase();
if(wordCheck){ //整词
wasFound = searchText == value;
}
else if(regCheck){ //正则表达式
let reg = new RegExp(func_methods.getRegExpStr(searchText), regExpFlags);
wasFound = reg.test(value);
}
else {
wasFound = ~value.indexOf(searchText);
}
wasFound && addResult(r, 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;