splitColumn.js 11.3 KB
import { replaceHtml } from '../utils/util';
import { modelHTML } from './constant';
import { selectHightlightShow } from './select';
import tooltip from '../global/tooltip';
import editor from '../global/editor';
import { setcellvalue } from '../global/setdata';
import { getcellvalue } from '../global/getdata';
import { jfrefreshgrid } from '../global/refresh';
import Store from '../store';
import locale from '../locale/locale';

//分列
const luckysheetSplitColumn = {
    createDialog: function(){
        let _this = this;

        const _locale = locale();
        const locale_splitText = _locale.splitText;
        const locale_punctuation = _locale.punctuation;
        const locale_button = _locale.button;

        $("#luckysheet-modal-dialog-mask").show();
        $("#luckysheet-splitColumn-dialog").remove();

        let content = '<div class="box">' +
                        '<div class="boxTitle">'+locale_splitText.splitDelimiters+'</div>' +
                        '<div class="boxMain">' +
                            '<div style="height: 22px;line-height: 22px;">' +
                                '<input id="splitColumn_type_01" type="checkbox"/>' +
                                '<label for="splitColumn_type_01">'+ locale_punctuation.tab +'</label>' +
                            '</div>' +
                            '<div style="height: 22px;line-height: 22px;">' +
                                '<input id="splitColumn_type_02" type="checkbox"/>' +
                                '<label for="splitColumn_type_02">'+ locale_punctuation.semicolon +'</label>' +
                            '</div>' +
                            '<div style="height: 22px;line-height: 22px;">' +
                                '<input id="splitColumn_type_03" type="checkbox"/>' +
                                '<label for="splitColumn_type_03">'+ locale_punctuation.comma +'</label>' +
                            '</div>' +
                            '<div style="height: 22px;line-height: 22px;">' +
                                '<input id="splitColumn_type_04" type="checkbox"/>' +
                                '<label for="splitColumn_type_04">'+ locale_punctuation.space +'</label>' +
                            '</div>' +
                            '<div style="height: 22px;line-height: 22px;">' +
                                '<input id="splitColumn_type_05" type="checkbox"/>' +
                                '<label for="splitColumn_type_05">'+ locale_splitText.splitOther +'</label>' +
                                '<input type="text" class="formulaInputFocus" maxlength="1"/>' +
                            '</div>' +
                        '</div>' +
                        '<div style="height: 22px;line-height: 22px;">' +
                            '<input id="splitColumn_type_06" type="checkbox"/>' +
                            '<label for="splitColumn_type_06">'+ locale_splitText.splitContinueSymbol +'</label>' +
                        '</div>' +
                        '<div class="boxTitle" style="margin-top: 10px;">'+ locale_splitText.splitDataPreview +'</div>' +
                        '<div class="boxMain" id="splitColumnData">' +

                        '</div>' +
                      '</div>';

        $("body").first().append(replaceHtml(modelHTML, { 
            "id": "luckysheet-splitColumn-dialog", 
            "addclass": "luckysheet-splitColumn-dialog", 
            "title": locale_splitText.splitTextTitle, 
            "content": content, 
            "botton": '<button id="luckysheet-splitColumn-dialog-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-splitColumn-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-splitColumn-dialog").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show();

        let dataArr = _this.getDataArr();
        _this.dataPreview(dataArr);
    },
    init: function(){
        let _this = this;
        const _locale = locale();
        const locale_splitText = _locale.splitText;

        //数据预览
        $(document).off("change.SPCinpcheckbox").on("change.SPCcheckbox", "#luckysheet-splitColumn-dialog .box input[type='checkbox']", function(){
            let regStr = _this.getRegStr();
            let dataArr = _this.getDataArr(regStr);
            _this.dataPreview(dataArr);
        });
        $(document).off("keyup.SPCinptext").on("keyup.SPCinptext", "#luckysheet-splitColumn-dialog .box input[type='text']", function(){
            if($(this).siblings("input[type='checkbox']").is(":checked")){
                let regStr = _this.getRegStr();
                let dataArr = _this.getDataArr(regStr);
                _this.dataPreview(dataArr);
            }
        })

        //确定按钮
        $(document).off("click.SPCconfirm").on("click.SPCconfirm", "#luckysheet-splitColumn-dialog #luckysheet-splitColumn-dialog-confirm", function(){
            $("#luckysheet-modal-dialog-mask").hide();
            $("#luckysheet-splitColumn-dialog").hide();

            let regStr = _this.getRegStr();
            let dataArr = _this.getDataArr(regStr);

            let r = Store.luckysheet_select_save[0].row[0];
            let c = Store.luckysheet_select_save[0].column[0];

            if(dataArr[0].length == 1){
                return;
            }

            let dataCover = false;
            for(let i = 0; i < dataArr.length; i++){
                for(let j = 1; j < dataArr[0].length; j++){
                    let cell = Store.flowdata[r + i][c + j];

                    if(cell != null && cell.v != null){
                        dataCover = true;
                        break;
                    }
                }
            }

            if(dataCover){
                let func1 = function(){
                    _this.update(r, c, dataArr);
                } 

                tooltip.confirm("", locale_splitText.splitConfirmToExe, func1);
            }
            else{
                _this.update(r, c, dataArr);
            }
        });
    },
    update: function(r, c, dataArr){
        let d = editor.deepCopyFlowData(Store.flowdata);

        for(let i = 0; i < dataArr.length; i++){
            for(let j = 0; j < dataArr[0].length; j++){
                let v = dataArr[i][j];
                setcellvalue(r + i, c + j, d, v);
            }
        }

        let st_r = Store.luckysheet_select_save[0].row[0], 
            st_c = Store.luckysheet_select_save[0].column[0];

        let range = [{ "row": [st_r, st_r + dataArr.length - 1], "column": [st_c, st_c + dataArr[0].length - 1] }]

        jfrefreshgrid(d, range);
        selectHightlightShow();
    },
    dataPreview: function(dataArr){
        $("#luckysheet-splitColumn-dialog #splitColumnData").empty();

        let trHtml = '';

        for(let i = 0; i < dataArr.length; i++){
            let tdHtml = '';

            for(let j = 0; j < dataArr[0].length; j++){
                tdHtml += '<td>' + dataArr[i][j] + '</td>';
            }

            trHtml += '<tr>' + tdHtml + '</tr>';
        }

        let tableHtml = '<table>' + trHtml + '</table>';

        $("#luckysheet-splitColumn-dialog #splitColumnData").append(tableHtml);
    },
    getRegStr: function(){
        let regStr = '', mark = 0;

        $("#luckysheet-splitColumn-dialog .box input[type='checkbox']:checked").each(function(i, e){
            let $id = $(e).attr("id");

            if($id == "splitColumn_type_01"){ //Tab键
                regStr += "\\t";
                mark++;
            }
            else if($id == "splitColumn_type_02"){ //分号
                if(mark > 0){
                    regStr += "|";
                }

                regStr += ";";
                mark++;
            }
            else if($id == "splitColumn_type_03"){ //逗号
                if(mark > 0){
                    regStr += "|";
                }

                regStr += ",";
                mark++;
            }
            else if($id == "splitColumn_type_04"){ //空格
                if(mark > 0){
                    regStr += "|";
                }

                regStr += "\\s";
                mark++;
            }
            else if($id == "splitColumn_type_05"){ //其它
                let txt = $(e).siblings("input[type='text']").val().trim();

                if(txt != ""){
                    if(mark > 0){
                        regStr += "|";
                    }

                    regStr += txt;
                }
            }
            else if($id == "splitColumn_type_06"){ //连续分隔符号视为单个处理
                regStr = "[" + regStr + "]+";
            }
        })

        return regStr;
    },
    getDataArr: function(regStr){
        let _this = this;

        let arr = [];

        let r1 = Store.luckysheet_select_save[0].row[0];
        let r2 = Store.luckysheet_select_save[0].row[1];
        let c = Store.luckysheet_select_save[0].column[0];

        if(regStr != null && regStr != ""){
            let reg = new RegExp(regStr, "g");

            let dataArr = [];

            for(let r = r1; r <= r2; r++){
                let rowArr = [];

                let cell = Store.flowdata[r][c];

                let value;
                if(cell != null && cell["m"] != null){
                    value = cell["m"];
                }
                else{
                    value = getcellvalue(r, c, Store.flowdata);
                }

                if(value == null){
                    value = "";
                }

                rowArr = value.toString().split(reg);

                dataArr.push(rowArr);
            }

            let rlen = dataArr.length;
            let clen = 0;

            for(let i = 0; i < rlen; i++){
                if(dataArr[i].length > clen){
                    clen = dataArr[i].length;
                }
            }

            arr = _this.getNullData(rlen, clen);

            for(let i = 0; i < arr.length; i++){
                for(let j = 0; j < arr[0].length; j++){
                    if(dataArr[i][j] != null){
                        arr[i][j] = dataArr[i][j];
                    }
                }
            }
        }
        else{
            for(let r = r1; r <= r2; r++){
                let rowArr = [];

                let cell = Store.flowdata[r][c];

                let value;
                if(cell != null && cell["m"] != null){
                    value = cell["m"];
                }
                else{
                    value = getcellvalue(r, c, Store.flowdata);
                }

                if(value == null){
                    value = "";
                }

                rowArr.push(value);

                arr.push(rowArr);
            }
        }

        return arr;
    },
    getNullData: function(rlen, clen){
        let arr = [];

        for(let r = 0; r < rlen; r++){
            let rowArr = [];

            for(let c = 0; c < clen; c++){
                rowArr.push("");
            }

            arr.push(rowArr);
        }

        return arr;
    }
}

export default luckysheetSplitColumn;