import { replaceHtml } from '../utils/util'; import { getSheetIndex } from '../methods/get'; import { isRealNull } from '../global/validate'; import { isEditMode } from '../global/validate'; import tooltip from '../global/tooltip'; import { modelHTML } from './constant'; import { selectHightlightShow } from './select'; import conditionformat from './conditionformat'; import Store from '../store'; import locale from '../locale/locale'; //定位 const luckysheetLocationCell = { createDialog: function(){ $("#luckysheet-modal-dialog-mask").show(); $("#luckysheet-locationCell-dialog").remove(); const _locale = locale(); const locale_location = _locale.findAndReplace; const locale_button = _locale.button; let content = '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'+ ''+ ''+ '
'+ '
'; $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-locationCell-dialog", "addclass": "luckysheet-locationCell-dialog", "title": locale_location.location, "content": content, "botton": '', "style": "z-index:100003" })); let $t = $("#luckysheet-locationCell-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 400).end(), myh = $t.outerHeight(), myw = $t.outerWidth(); let winw = $(window).width(), winh = $(window).height(); let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop(); $("#luckysheet-locationCell-dialog").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); }, init: function(){ let _this = this; const locale_location = locale().findAndReplace; $(document).on("click", "#luckysheet-locationCell-dialog .listItem input:radio", function(e){ $("#luckysheet-locationCell-dialog .listItem input:checkbox").prop("disabled", true); $("#luckysheet-locationCell-dialog .listItem .subbox label").css("color", "#666"); $(this).siblings(".subbox").find("input:checkbox").removeAttr("disabled"); $(this).siblings(".subbox").find("label").css("color", "#000"); }); $(document).off("click.locationCellConfirm").on("click.locationCellConfirm", "#luckysheet-locationCell-dialog #luckysheet-locationCell-dialog-confirm", function(){ $("#luckysheet-modal-dialog-mask").hide(); $("#luckysheet-locationCell-dialog").hide(); let $radio = $("#luckysheet-locationCell-dialog .listItem input:radio:checked"); let id = $radio.attr("id"); if(id == "locationConstant" || id == "locationFormula"){ let $checkbox = $radio.siblings(".subbox").find("input:checkbox:checked"); let value; if($checkbox.length == 0){ return; } else if($checkbox.length == 5){ value = "all"; } else{ let arr = []; for(let i = 0; i < $checkbox.length; i++){ if($($checkbox[i]).hasClass("date")){ arr.push("d"); } else if($($checkbox[i]).hasClass("number")){ arr.push("n"); } else if($($checkbox[i]).hasClass("string")){ arr.push("s,g"); } else if($($checkbox[i]).hasClass("boolean")){ arr.push("b"); } else if($($checkbox[i]).hasClass("error")){ arr.push("e"); } } value = arr.join(","); } 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); } _this.apply(range, id, value); } else if(id == "locationStepRow"){ 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])){ if(isEditMode()){ alert(locale_location.locationTiplessTwoRow); } else{ tooltip.info("", locale_location.locationTiplessTwoRow); } return; } let range = $.extend(true, [], Store.luckysheet_select_save); _this.apply(range, "locationStepRow"); } else if(id == "locationStepColumn"){ if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){ if(isEditMode()){ alert(locale_location.locationTiplessTwoColumn); } else{ tooltip.info("", locale_location.locationTiplessTwoColumn); } return; } let range = $.extend(true, [], Store.luckysheet_select_save); _this.apply(range, "locationStepColumn"); } else{ 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); } _this.apply(range, id); } }); }, apply: function(range, type, value){ const locale_location = locale().findAndReplace; let rangeArr = []; if(type == "locationFormula" || type == "locationConstant" || type == "locationNull"){ //公式 常量 空值 let minR = null, maxR = null, minC = null, maxC = null, cellSave = {}; for(let s = 0; s < range.length; s++){ let st_r = range[s].row[0], ed_r = range[s].row[1], st_c = range[s].column[0], ed_c = range[s].column[1]; if(minR == null || minR < st_r){ minR = st_r; } if(maxR == null || maxR > ed_r){ maxR = ed_r; } if(minC == null || minC < st_c){ minC = st_c; } if(maxC == null || maxC > ed_c){ maxC = ed_c; } for(let r = st_r; r <= ed_r; r++){ for(let c = st_c; c <= ed_c; c++){ let cell = Store.flowdata[r][c]; if(cell != null && cell.mc != null){ cell = Store.flowdata[cell.mc.r][cell.mc.c]; } if(type == 'locationFormula' && cell != null && !isRealNull(cell.v) && cell.f != null && (value == 'all' || (cell.ct != null && value.indexOf(cell.ct.t) > -1))){ cellSave[r + '_' + c] = 0; } else if(type == 'locationConstant' && cell != null && !isRealNull(cell.v) && (value == 'all' || (cell.ct != null && value.indexOf(cell.ct.t) > -1))){ cellSave[r + '_' + c] = 0; } else if(type == 'locationNull' && (cell == null || isRealNull(cell.v))){ cellSave[r + '_' + c] = 0; } } } } rangeArr = this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); } else if(type == "locationCF"){ //条件格式 let index = getSheetIndex(Store.currentSheetIndex); let ruleArr = Store.luckysheetfile[index]["luckysheet_conditionformat_save"]; let data = Store.luckysheetfile[index]["data"]; if(ruleArr == null || ruleArr.length == 0){ if(isEditMode()){ alert(locale_location.locationTipNotFindCell); } else{ tooltip.info("", locale_location.locationTipNotFindCell); } return; } computeMap = conditionformat.compute(ruleArr, data); if(Object.keys(computeMap).length == 0){ if(isEditMode()){ alert(locale_location.locationTipNotFindCell); } else{ tooltip.info("", locale_location.locationTipNotFindCell); } return; } let minR = null, maxR = null, minC = null, maxC = null, cellSave = {}; for(let s = 0; s < range.length; s++){ let st_r = range[s].row[0], ed_r = range[s].row[1], st_c = range[s].column[0], ed_c = range[s].column[1]; if(minR == null || minR < st_r){ minR = st_r; } if(maxR == null || maxR > ed_r){ maxR = ed_r; } if(minC == null || minC < st_c){ minC = st_c; } if(maxC == null || maxC > ed_c){ maxC = ed_c; } for(let r = st_r; r <= ed_r; r++){ for(let c = st_c; c <= ed_c; c++){ if((r + '_' + c) in computeMap){ cellSave[r + '_' + c] = 0; } } } } rangeArr = this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); } else if(type == "locationStepRow"){ //间隔行 for(let s = 0; s < range.length; s++){ if(range[s].row[0] == range[s].row[1]){ continue; } let st_r = range[s].row[0], ed_r = range[s].row[1]; let st_c = range[s].column[0], ed_c = range[s].column[1]; for(let r = st_r; r <= ed_r; r++){ if((r - st_r) % 2 == 0){ rangeArr.push({"row": [r, r], "column": [st_c, ed_c]}); } } } } else if(type == "locationStepColumn"){ //间隔列 for(let s = 0; s < range.length; s++){ if(range[s].column[0] == range[s].column[1]){ continue; } let st_r = range[s].row[0], ed_r = range[s].row[1]; let st_c = range[s].column[0], ed_c = range[s].column[1]; for(let c = st_c; c <= ed_c; c++){ if((c - st_c) % 2 == 0){ rangeArr.push({"row": [st_r, ed_r], "column": [c, c]}); } } } } if(rangeArr.length == 0){ if(isEditMode()){ alert(locale_location.locationTipNotFindCell); } else{ tooltip.info("", locale_location.locationTipNotFindCell); } } else{ Store.luckysheet_select_save = rangeArr; selectHightlightShow(); let scrollLeft = $("#luckysheet-cell-main").scrollLeft(), scrollTop = $("#luckysheet-cell-main").scrollTop(); let winH = $("#luckysheet-cell-main").height(), winW = $("#luckysheet-cell-main").width(); let r1 = Store.luckysheet_select_save[0]["row"][0], r2 = Store.luckysheet_select_save[0]["row"][1], c1 = Store.luckysheet_select_save[0]["column"][0], c2 = Store.luckysheet_select_save[0]["column"][1]; let row = Store.visibledatarow[r2], row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]; let col = Store.visibledatacolumn[c2], col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 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); } } }, getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr){ if(Object.keys(cellSave).length == 0){ return rangeArr; } let _this = this; let stack_str = null, stack_edr = null, stack_stc = null, stack_edc = null; for(let r = minR; r <= maxR; r++){ for(let c = minC; c <= maxC; c++){ let cell = Store.flowdata[r][c]; if((r + '_' + c) in cellSave){ if(cell != null && cell.mc != null){ if(stack_stc == null){ let range = { 'row': [cell.mc.r, cell.mc.r + cell.mc.rs - 1], 'column': [cell.mc.c, cell.mc.c + cell.mc.cs - 1] }; rangeArr.push(range); cellSave = _this.deleteCellInSave(cellSave, range); return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); } else if(c < stack_edc){ let range = { 'row': [stack_str, stack_edr], 'column': [stack_stc, stack_edc] } rangeArr.push(range); cellSave = _this.deleteCellInSave(cellSave, range); return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); } else{ break; } } else if(stack_stc == null){ stack_stc = c; stack_edc = c; stack_str = r; stack_edr = r; } else if(c > stack_edc){ stack_edc = c; } } else if(stack_stc != null){ if(cell != null && cell.mc != null){ break; } else if(c < stack_stc){ } else if(c <= stack_edc){ let range = { 'row': [stack_str, stack_edr], 'column': [stack_stc, stack_edc] } rangeArr.push(range); cellSave = _this.deleteCellInSave(cellSave, range); return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); } else{ stack_edr = r; } } } } if(stack_stc != null){ let range = { 'row': [stack_str, stack_edr], 'column': [stack_stc, stack_edc] } rangeArr.push(range); cellSave = _this.deleteCellInSave(cellSave, range); return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); } }, deleteCellInSave(cellSave, range){ for(let r = range.row[0]; r <= range.row[1]; r++){ for(let c = range.column[0]; c <= range.column[1]; c++){ delete cellSave[r + '_' + c]; } } return cellSave; } } export default luckysheetLocationCell;