import { luckysheet_getcelldata } from '../function/func'; // import functionlist from '../function/functionlist'; // import Store.luckysheet_function from '../function/Store.luckysheet_function'; import formula from '../global/formula'; import { isRealNum, isRealNull } from '../global/validate'; import { modelHTML } from './constant'; import { luckysheet_count_show } from './select'; import { replaceHtml, getObjType } from '../utils/util'; import Store from '../store'; import locale from '../locale/locale'; //插入函数 const insertFormula = { init: function(){ let _this = this; let _locale = locale(); let locale_formulaMore = _locale.formulaMore; let locale_button = _locale.button; $(document).off("keyup.fxSFLI").on("keyup.fxSFLI", "#searchFormulaListInput", function(){ $("#formulaTypeList").empty(); let txt = $(this).val().toUpperCase(); let functionlist = Store.functionlist; if(txt == ""){ //若没有查找内容则根据类别筛选 _this.formulaListByType($("#formulaTypeSelect option:selected").val()); } else{ for(let i = 0; i < functionlist.length; i++){ if(/^[a-zA-Z]+$/.test(txt)){ if(functionlist[i].n.indexOf(txt) != "-1"){ $('<div class="listBox" name="'+ functionlist[i].n +'"><span>'+ functionlist[i].n +'</span><span>'+ functionlist[i].a +'</span></div>').appendTo($("#formulaTypeList")); } } else if(functionlist[i].a.indexOf(txt) != "-1"){ $('<div class="listBox" name="'+ functionlist[i].n +'"><span>'+ functionlist[i].n +'</span><span>'+ functionlist[i].a +'</span></div>').appendTo($("#formulaTypeList")); } } } $("#formulaTypeList .listBox:first-child").addClass("on"); //默认公式列表第一个为选中状态 }); $(document).off("change.fxFormulaTS").on("change.fxFormulaTS", "#formulaTypeSelect", function(){ let type = $("#formulaTypeSelect option:selected").val(); _this.formulaListByType(type); }); $(document).off("click.fxListbox").on("click.fxListbox", "#formulaTypeList .listBox", function(){ $(this).addClass("on").siblings().removeClass("on"); }); //选择公式后弹出参数栏弹框 $(document).off("click.fxFormulaCf").on("click.fxFormulaCf", "#luckysheet-search-formula-confirm", function(){ let formula = $("#luckysheet-search-formula .listBox.on").attr("name"); let formulaTxt = '<span dir="auto" class="luckysheet-formula-text-color">=</span><span dir="auto" class="luckysheet-formula-text-color">'+ formula.toUpperCase() +'</span><span dir="auto" class="luckysheet-formula-text-color">(</span><span dir="auto" class="luckysheet-formula-text-color">)</span>'; $("#luckysheet-rich-text-editor").html(formulaTxt); $("#luckysheet-functionbox-cell").html($("#luckysheet-rich-text-editor").html()); _this.formulaParmDialog(formula); }); //公式参数框 $(document).off("focus.fxParamInput").on("focus.fxParamInput", "#luckysheet-search-formula-parm .parmBox input", function(){ let parmIndex = $(this).parents(".parmBox").index(); formula.data_parm_index = parmIndex; let formulatxt = $(this).parents("#luckysheet-search-formula-parm").find(".luckysheet-modal-dialog-title-text").text(); let parmLen = Store.luckysheet_function[formulatxt].p.length; let parmDetail, parmRepeat; if(parmIndex >= parmLen){ parmDetail = Store.luckysheet_function[formulatxt].p[parmLen - 1].detail; parmRepeat = Store.luckysheet_function[formulatxt].p[parmLen - 1].repeat; } else{ parmDetail = Store.luckysheet_function[formulatxt].p[parmIndex].detail; parmRepeat = Store.luckysheet_function[formulatxt].p[parmIndex].repeat; } //参数选区显示,参数值显示 _this.parmTxtShow($(this).val()); //计算结果 _this.functionStrCompute(); //参数名称和释义切换 $("#luckysheet-search-formula-parm .parmDetailsBox").empty(); let parmName = $(this).parents(".parmBox").find(".name").text(); $('<span>'+ parmName +':</span><span>'+ parmDetail +'</span>').appendTo($("#luckysheet-search-formula-parm .parmDetailsBox")); //公式参数可自增(参数自增最多5个) if(parmRepeat == "y"){ let parmCount = $("#luckysheet-search-formula-parm .parmBox").length; if(parmCount < 5 && parmIndex == (parmCount - 1)){ $('<div class="parmBox"><div class="name">'+ locale_formulaMore.valueTitle +''+ (parmCount + 1) +'</div><div class="txt"><input class="formulaInputFocus" /><i class="fa fa-table" aria-hidden="true" title="'+locale_formulaMore.tipSelectDataRange+'"></i></div><div class="val">=</div></div>').appendTo($("#luckysheet-search-formula-parm .parmListBox")); } } }); $(document).off("blur.fxParamInput").on("blur.fxParamInput", "#luckysheet-search-formula-parm .parmBox input", function(){ let txt = $(this).val(); if(formula.getfunctionParam(txt).fn == null && !formula.iscelldata(txt)){ if(!isRealNum(txt) && txt != "" && txt.length <= 2 && txt.indexOf('"') != 0 && txt.lastIndexOf('"') != 0){ txt = '"' + txt + '"'; $(this).val(txt); _this.parmTxtShow(txt); _this.functionStrCompute(); } } }); $(document).off("keyup.fxParamInput").on("keyup.fxParamInput", "#luckysheet-search-formula-parm .parmBox input", function(){ //参数选区显示,参数值显示 _this.parmTxtShow($(this).val()); //计算结果 _this.functionStrCompute(); }); //点击图标选取数据范围 $(document).off("click.fxParamI").on("click.fxParamI", "#luckysheet-search-formula-parm .parmBox i", function(){ formula.data_parm_index = $(this).parents(".parmBox").index(); //选取范围弹出框 $("#luckysheet-search-formula-parm").hide(); $("#luckysheet-modal-dialog-mask").hide(); $("#luckysheet-search-formula-parm-select").remove(); if($(this).parents(".parmBox").find(".txt input").val() == ""){ $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-search-formula-parm-select", "addclass": "luckysheet-search-formula-parm-select", "title": locale_formulaMore.tipSelectDataRange, "content": "<input id='luckysheet-search-formula-parm-select-input' class='luckysheet-datavisual-range-container' style='font-size: 14px;padding:5px;max-width:none;' spellcheck='false' aria-label='"+ locale_formulaMore.tipDataRangeTile +"' readonly='true' placeholder='"+ locale_formulaMore.tipDataRangeTile +"'>", "botton": '<button id="luckysheet-search-formula-parm-select-confirm" class="btn btn-primary">'+locale_button.confirm+'</button>', "style": "z-index:100003" })); } else{ $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-search-formula-parm-select", "addclass": "luckysheet-search-formula-parm-select", "title": locale_formulaMore.tipSelectDataRange, "content": "<input id='luckysheet-search-formula-parm-select-input' class='luckysheet-datavisual-range-container' style='font-size: 14px;padding:5px;max-width:none;' spellcheck='false' aria-label='"+ locale_formulaMore.tipDataRangeTile +"' readonly='true' value='"+ $(this).parents(".parmBox").find(".txt input").val() +"'>", "botton": '<button id="luckysheet-search-formula-parm-select-confirm" class="btn btn-primary">'+locale_button.confirm+'</button>', "style": "z-index:100003" })); } let $t = $("#luckysheet-search-formula-parm-select").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), myh = $t.outerHeight(), myw = $t.outerWidth(); let winw = $(window).width(), winh = $(window).height(); let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop(); $("#luckysheet-search-formula-parm-select").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); //参数选区虚线框 _this.parmTxtShow($(this).parents(".parmBox").find(".txt input").val()); }); //点击确定 $(document).off("click.fxParamCf").on("click.fxParamCf", "#luckysheet-search-formula-parm-confirm", function(){ $("#luckysheet-wa-functionbox-confirm").click(); }); //选取范围后传回参数栏弹框 $(document).off("click.fxParamSelectCf").on("click.fxParamSelectCf", "#luckysheet-search-formula-parm-select-confirm", function(){ let parmIndex = $("#luckysheet-search-formula-parm-select-input").attr("data_parm_index"); $("#luckysheet-search-formula-parm-select").hide(); $("#luckysheet-search-formula-parm").show(); $("#luckysheet-search-formula-parm .parmBox").eq(parmIndex).find(".txt input").focus(); }); }, formulaListDialog: function(){ let _this = this; let _locale = locale(); let locale_formulaMore = _locale.formulaMore; let locale_button = _locale.button $("#luckysheet-modal-dialog-mask").show(); $("#luckysheet-search-formula").remove(); $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-search-formula", "addclass": "luckysheet-search-formula", "title": "", "content": "<div class='inpbox'><label for='searchFormulaListInput'>"+ locale_formulaMore.findFunctionTitle +":</label><input class='formulaInputFocus' id='searchFormulaListInput' placeholder='"+ locale_formulaMore.tipInputFunctionName +"' spellcheck='false'/></div><div class='selbox'><label>"+locale_formulaMore.selectCategory+":</label><select id='formulaTypeSelect'><option value='0'>"+locale_formulaMore.Math+"</option><option value='1'>"+locale_formulaMore.Statistical+"</option><option value='2'>"+locale_formulaMore.Lookup+"</option><option value='3'>"+locale_formulaMore.luckysheet+"</option><option value='4'>"+locale_formulaMore.dataMining+"</option><option value='5'>"+locale_formulaMore.Database+"</option><option value='6'>"+locale_formulaMore.Date+"</option><option value='7'>"+locale_formulaMore.Filter+"</option><option value='8'>"+locale_formulaMore.Financial+"</option><option value='9'>"+locale_formulaMore.Engineering+"</option><option value='10'>"+locale_formulaMore.Logical+"</option><option value='11'>"+locale_formulaMore.Operator+"</option><option value='12'>"+locale_formulaMore.Text+"</option><option value='13'>"+locale_formulaMore.Parser+"</option><option value='14'>"+locale_formulaMore.Array+"</option><option value='-1'>"+locale_formulaMore.other+"</option></select></div><div class='listbox'><label>"+locale_formulaMore.selectFunctionTitle+":</label><div id='formulaTypeList'></div></div>", "botton": '<button id="luckysheet-search-formula-confirm" class="btn btn-primary">'+locale_button.confirm+'</button><button class="btn btn-default luckysheet-model-close-btn">'+locale_button.cancel+'</button>', "style": "z-index:100003" })); let $t = $("#luckysheet-search-formula").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), myh = $t.outerHeight(), myw = $t.outerWidth(); let winw = $(window).width(), winh = $(window).height(); let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop(); $("#luckysheet-search-formula").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3, "user-select": "none" }).show(); _this.formulaListByType("0"); //默认公式列表为类型0 $("#searchFormulaListInput").focus(); }, formulaListByType: function(type){ $("#formulaTypeList").empty(); let functionlist = Store.functionlist; for(let i = 0; i < functionlist.length; i++){ if((type == "-1" && functionlist[i].t > 14) || functionlist[i].t == type){ $('<div class="listBox" name="'+ functionlist[i].n +'"><span>'+ functionlist[i].n +'</span><span>'+ functionlist[i].a +'</span></div>').appendTo($("#formulaTypeList")); } } $("#formulaTypeList .listBox:first-child").addClass("on"); //默认公式列表第一个为选中状态 }, formulaParmDialog: function(formulaTxt, parm){ //参数弹出框 let parm_title = '', parm_content = '', parm_list_content = ''; let _locale = locale(); let locale_formulaMore = _locale.formulaMore; let locale_button = _locale.button; let functionlist = Store.functionlist; for(let i = 0; i < functionlist.length; i++){ if(functionlist[i].n == formulaTxt.toUpperCase()){ parm_title = functionlist[i].n; for(let j = 0; j < functionlist[i].p.length; j++){ if(parm == null){ //无参数 parm_list_content += '<div class="parmBox">'+ '<div class="name">'+ functionlist[i].p[j].name +'</div>'+ '<div class="txt">'+ '<input class="formulaInputFocus" spellcheck="false"/>' + '<i class="fa fa-table" aria-hidden="true" title="'+locale_formulaMore.tipSelectDataRange+'"></i>'+ '</div>'+ '<div class="val">=</div>'+ '</div>'; } else{ //有参数 if(parm[j] == null){ parm[j] = ""; } parm_list_content += '<div class="parmBox">'+ '<div class="name">'+ functionlist[i].p[j].name +'</div>'+ '<div class="txt">'+ '<input class="formulaInputFocus" value="'+ parm[j] +'" spellcheck="false"/>'+ '<i class="fa fa-table" aria-hidden="true" title="'+locale_formulaMore.tipSelectDataRange+'"></i>'+ '</div>'+ '<div class="val">=</div>'+ '</div>'; } } parm_content = '<div>'+ '<div class="parmListBox">'+ parm_list_content +'</div>'+ '<div class="formulaDetails">'+ functionlist[i].d +'</div>'+ '<div class="parmDetailsBox"></div>'+ '<div class="result">'+locale_formulaMore.calculationResult+' = <span></span></div>'+ '</div>'; } } $("#luckysheet-search-formula").hide(); $("#luckysheet-modal-dialog-mask").hide(); $("#luckysheet-search-formula-parm").remove(); $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-search-formula-parm", "addclass": "luckysheet-search-formula-parm", "title": parm_title, "content": parm_content, "botton": '<button id="luckysheet-search-formula-parm-confirm" class="btn btn-primary">'+locale_button.confirm+'</button><button class="btn btn-default luckysheet-model-close-btn">'+locale_button.cancel+'</button>', "style": "z-index:100003" })); let $t = $("#luckysheet-search-formula-parm").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), myh = $t.outerHeight(), myw = $t.outerWidth(); let winw = $(window).width(), winh = $(window).height(); let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop(); $("#luckysheet-search-formula-parm").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); //参数栏第一个参数聚焦,显示选取虚线框 $("#luckysheet-search-formula-parm .parmBox:eq(0) input").focus(); //遍历参数,有参数显示值,无显示空 $("#luckysheet-search-formula-parm .parmBox").each(function(index,e){ let parmtxt = $(e).find(".txt input").val(); if(formula.getfunctionParam(parmtxt).fn == null){ //参数不是公式 if(formula.iscelldata(parmtxt)){ //参数是选区 let txtdata = luckysheet_getcelldata(parmtxt).data; if(getObjType(txtdata) == "array"){ //参数为多个单元格选区 let txtArr = []; for(let i = 0; i < txtdata.length; i++){ for(let j = 0; j < txtdata[i].length; j++){ let cell = txtdata[i][j]; if(cell == null || isRealNull(cell.v)){ txtArr.push(null); } else{ txtArr.push(cell.v); } } } $("#luckysheet-search-formula-parm .parmBox").eq(index).find(".val").text(" = {"+ txtArr.join(",") +"}"); } else{ //参数为单个单元格选区 $("#luckysheet-search-formula-parm .parmBox").eq(index).find(".val").text(" = {"+ txtdata.v +"}"); } } else{ //参数不是选区 $("#luckysheet-search-formula-parm .parmBox").eq(index).find(".val").text(" = {"+ parmtxt +"}"); } } else{ //参数是公式 $("#luckysheet-search-formula-parm .parmBox").eq(index).find(".val").text(" = {"+ (new Function("return " + $.trim(formula.functionParserExe("=" + parmtxt)))()) +"}"); } }) $("#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight").remove(); formula.data_parm_index = 0; formula.rangestart = true; }, parmTxtShow: function(parmtxt){ if(formula.getfunctionParam(parmtxt).fn == null){ //参数不是公式 if(formula.iscelldata(parmtxt)){ //参数是选区 let cellrange = formula.getcellrange(parmtxt); let r1 = cellrange.row[0], r2 = cellrange.row[1], c1 = cellrange.column[0], c2 = cellrange.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]; $("#luckysheet-formula-functionrange-select").css({ "left": col_pre, "width": col - col_pre - 1, "top": row_pre, "height": row - row_pre - 1 }).show(); $("#luckysheet-formula-help-c").hide(); luckysheet_count_show(col_pre, row_pre, col - col_pre - 1, row - row_pre - 1, cellrange.row, cellrange.column); let txtdata = luckysheet_getcelldata(parmtxt).data; if(getObjType(txtdata) == "array"){ //参数为多个单元格选区 let txtArr = []; for(let i = 0; i < txtdata.length; i++){ for(let j = 0; j < txtdata[i].length; j++){ let cell = txtdata[i][j]; if(cell == null || isRealNull(cell.v)){ txtArr.push(null); } else{ txtArr.push(cell.v); } } } $("#luckysheet-search-formula-parm .parmBox").eq(formula.data_parm_index).find(".val").text(" = {"+ txtArr.join(",") +"}"); } else{ //参数为单个单元格选区 $("#luckysheet-search-formula-parm .parmBox").eq(formula.data_parm_index).find(".val").text(" = {"+ txtdata.v +"}"); } } else{ //参数不是选区 $("#luckysheet-search-formula-parm .parmBox").eq(formula.data_parm_index).find(".val").text(" = {"+ parmtxt +"}"); $("#luckysheet-formula-functionrange-select").hide(); } } else{ //参数是公式 let txt; for(let k = 0; k < formula.getfunctionParam(parmtxt).param.length; k++){ if(formula.iscelldata(formula.getfunctionParam(parmtxt).param[k])){ txt = formula.getfunctionParam(parmtxt).param[k]; break; } } let cellrange = formula.getcellrange(txt); let r1 = cellrange.row[0], r2 = cellrange.row[1], c1 = cellrange.column[0], c2 = cellrange.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]; $("#luckysheet-formula-functionrange-select").css({ "left": col_pre, "width": col - col_pre - 1, "top": row_pre, "height": row - row_pre - 1 }).show(); $("#luckysheet-formula-help-c").hide(); luckysheet_count_show(col_pre, row_pre, col - col_pre - 1, row - row_pre - 1, cellrange.row, cellrange.column); $("#luckysheet-search-formula-parm .parmBox").eq(formula.data_parm_index).find(".val").text(" = {"+ (new Function("return " + $.trim(formula.functionParserExe("=" + parmtxt)))()) +"}"); } }, functionStrCompute: function(){ let isVal = true; //参数不为空 let parmValArr = []; //参数值集合 let lvi = -1; //最后一个有值的参数索引 let formulatxt = $("#luckysheet-search-formula-parm").find(".luckysheet-modal-dialog-title-text").text(); let p = Store.luckysheet_function[formulatxt].p; $("#luckysheet-search-formula-parm .parmBox").each(function(i, e){ let parmtxt = $(e).find(".txt input").val(); let parmRequire; if(i < p.length){ parmRequire = p[i].require; } else{ parmRequire = p[p.length - 1].require; } if(parmtxt == "" && parmRequire == "m"){ isVal = false; } if(parmtxt != ""){ lvi = i; } }); //单元格显示 let functionHtmlTxt; if(lvi == -1){ functionHtmlTxt = "=" + $("#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text").text() + "()"; } else if(lvi == 0){ functionHtmlTxt = "=" + $("#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text").text() + "(" + $("#luckysheet-search-formula-parm .parmBox").eq(0).find(".txt input").val() + ")"; } else{ for(let j = 0; j <= lvi; j++){ parmValArr.push($("#luckysheet-search-formula-parm .parmBox").eq(j).find(".txt input").val()); } functionHtmlTxt = "=" + $("#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text").text() + "(" + parmValArr.join(",") + ")"; } let function_str = formula.functionHTMLGenerate(functionHtmlTxt); $("#luckysheet-rich-text-editor").html(function_str); $("#luckysheet-functionbox-cell").html($("#luckysheet-rich-text-editor").html()); if(isVal){ //公式计算 let fp = $.trim(formula.functionParserExe($("#luckysheet-rich-text-editor").text())); let result = null; try { result = new Function("return " + fp)(); } catch (e) { result = formula.error.n; } $("#luckysheet-search-formula-parm .result span").text(result); } } } export default insertFormula;