# AcceptKeys/ExceptKeys 마이그레이션

## 6. 기타

### AcceptKeys,ExceptKeys 마이그레이션

`AcceptKeys`와 `ExceptKeys`는 둘다 특정 문자에 대한 입력만 허용하거나 불허하는 기능입니다. IBSheet7에서는 `E(영문)`, `N(숫자)`, `K(한글)` 와 같은 예약어와 함께 특정 원하는 문자를 다음과 같이 설정하였습니다.

    //AS-IS
    var Cols = [
        //AcceptKeys 예          영문자,숫자,-(기호)만 허용
        {Type:"Text", Name:"SA_NO", AcceptKeys:"E|N|[-]" },

        //ExceptKeys 예          영문자와 !,@,# 는 입력 불가
        {Type:"Text", Name:"SA_PRT", ExceptKeys:"E|[!@#]" }
    ];

    ///TO-BE
    opt.Cols = [
        //AcceptKeys 대신 EditMask를 이용하여 영문자,숫자,-(기호)만 허용
        {Type:"Text", Name:"SA_NO", EditMask:"^[a-zA-Z|\\d|\\-]*$" },

        //ExceptKeys 대신 EditMask를 이용하여 영문자와 !,@,# 는 입력 불가
        {Type:"Text", Name:"SA_PRT", EditMask:"^[^a-zA-Z|^!|^@|^#]*$" }
    ];

정규식에 익숙하지 않다면 onBeforeCreate (static)에서 공통로직을 통해 기존에 설정한 `AcceptKeys`, `ExceptKeys`를 자동으로 EditMask (col)로 변환하게 할 수도 있습니다.

아래 로직을 참고해 주세요.

    //시트 생성 직전에 발생하는 이벤트(IBSheet.create함수에 넣은 인자가 opt안에 모두 들어있음.)
    IBSheet.onBeforeCreate = function(opt){
        var acceptExceptKeysMig = function(Cols){

            for(var i = 0; i < Cols.length; i++) {
                var c = Cols[i];

                //EditMask를 통해 AcceptKeys를 유사하게 구현한다.
                if (c["AcceptKeys"]) {

                    var setV = c["AcceptKeys"];
                    var acceptKeyArr = setV.split("|");
                    var mask = "";

                    for (var i = 0; i < acceptKeyArr.length; i++) {
                        switch (acceptKeyArr[i]) {
                        case "E":
                            mask += "|a-zA-Z";
                            break;
                        case "N":
                            mask += "|\\d";
                            break;
                        case "K":
                            mask += "|\\u3131-\\u314e\\u314f-\\u3163\\uac00-\\ud7a3";
                            break;
                        default:
                            if (acceptKeyArr[i].substring(0, 1) == "[" && acceptKeyArr[i].substring(acceptKeyArr[i].length-1) == "]") {
                                var otherKeys = acceptKeyArr[i].substring(1, acceptKeyArr[i].length-1);
                                for (var x = 0; x < otherKeys.length; x++) {
                                    if ([".","-","$","^","*","+","|","(",")"].indexOf(otherKeys[x]) > -1) {
                                        mask += "|\\" + otherKeys[x];
                                    } else {
                                        mask += "|" + otherKeys[x];
                                    }
                                }
                            }
                            break;
                        }
                    }
                    c.EditMask = "^[" + mask.substring(1) + "]*$";

                //EditMask를 통해 ExceptKeys를 유사하게 구현한다.
                } else if(c["ExceptKeys"]) {

                    var setV = c["ExceptKeys"];
                    var acceptKeyArr = setV.split("|");
                    var mask = "";

                    for (var i = 0; i < acceptKeyArr.length; i++) {
                        switch (acceptKeyArr[i]) {
                        case "E":
                            mask += "|^a-zA-Z";
                            break;
                        case "N":
                            mask += "|^\\d";
                            break;
                        case "K":
                            mask += "|^\\u3131-\\u314e\\u314f-\\u3163\\uac00-\\ud7a3";
                            break;
                        default:
                            if (acceptKeyArr[i].substring(0, 1) == "[" && acceptKeyArr[i].substring(acceptKeyArr[i].length-1) == "]") {
                                var otherKeys = acceptKeyArr[i].substring(1, acceptKeyArr[i].length-1);
                                for (var x = 0; x<otherKeys.length; x++) {
                                    if ([".","-","$","^","*","+","|","(",")"].indexOf(otherKeys[x]) > -1) {
                                        mask += "|^\\" + otherKeys[x];
                                    } else {
                                        mask += "|^" + otherKeys[x];
                                    }
                                }
                            }
                            break;
                        }
                    }
                    c.EditMask = "^[" + mask.substring(1) + "]*$";
                }
            }
        }

        acceptExceptKeysMig(opt.options.Cols);
        if(opt.options.LeftCols) acceptExceptKeysMig(opt.options.LeftCols);
        if(opt.options.RightCols) acceptExceptKeysMig(opt.options.RightCols);

        //반드시 수정된 opt를 리턴해야 시트가 만들어짐.
        return opt;
    }