B7-7 Popup Menu
들어가며
이번 강좌에서는 지난 강좌인 Cell Button에서 언급한 팝업 메뉴를 자세히 알아보도록 하겠습니다.
이론
RealGrid는 데이터 셀에 기본적인 편집기(Cell Editor) 외에 CellButton을 표시할 수 있다는것을 지난 강좌에서 배웠습니다. 셀 버튼의 유형을 popup 으로 지정하여 팝업메뉴를 사용할 수 있습니다.
팝업메뉴를 사용하기 위해 어떠한 작업이 필요한지 알아보도록 하겠습니다.
- DataColumn의 button 속성을 popup으로 지정합니다.
- MenuItem들로 이루어진 메뉴를 작성합니다.
    - label: 메뉴에 표시될 명칭을 지정합니다.
- type: 메뉴 항목의 형태, ‘normal’, ‘check’, ‘radio’, ‘separator’ 를 사용할 수 있습니다.
- group: 라디오 버튼을 사용할 때의 그룹을 지정합니다. 동일 그룹으로 지정된 메뉴항목들 안에서 하나만 선택할 수 있습니다.
- enabled: 사용 여부를 지정합니다.
- checked:- type이 ‘check’이거나 ‘radio’일때 체크 표시 여부를 지정합니다.
- tag: 테그를 지정합니다.
- children: 하위 메뉴가 필요할때 하위 메뉴에 대한 메뉴항목들을 지정합니다.
 
- GridBase.addPopupMenu()을 사용하여 2번에서 만들어진 메뉴를 등록합니다.
- 팝업메뉴를 사용하려는 DataColumn.popupMenu 에 3번에서 등록한 이름을 지정 합니다.
이런 과정을 거쳐야 팝업메뉴가 사용가능 합니다.
실습
실습에서는 직업 컬럼에 팝업메뉴를 연결하고 팝업 메뉴를 클릭시 발생하는 콜백함수를 확인해보도록 하겠습니다.
- 
    메뉴 항목들로 이루어진 팝업메뉴를 만들고 그리드에 메뉴를 등록해보도록 하겠습니다. 주석을 확인해보면서 메뉴 항목의 기능을 습득하세요. $("#btnAddPopupMenu").click(function () { // popup menus var menu = [{ label: "menu1 입니다.", // menu1은 활성화 되어 있고 하위 메뉴를 가지고 있습니다. enabled: true, children: [{ label: "submenu1 입니다." }, { label: "submenu2 입니다." }] }, { label: "menu2 입니다", enabled: false // menu2 는 비활성화 되어 있습니다. }, { label: "-" // menu2 와 menu3 사이에 구분선이 그어집니다. // type: "separator" 와 label: "-" 는 같은 기능을 합니다. }, { label: "menu3 입니다", type: "check", // menu3은 체크를 할 수 있는 아이템 checked: true, // menu3은 기본값으로 체크되어 있습니다. tag: "check_menu" // 해당 메뉴항목이 클릭되어 있는지의 여부를 확인하기 위해 테그를 지정했습니다. }, { label: "group menu", children: [{ // group menu는 하위 메뉴를 가지고 있습니다. label: "group1 - 첫번째", // menu1의 하위 메뉴와는 다르게 라디오 버튼을 사용하며, type: "radio", // 라디오 버튼은 group1, group2 두개의 그룹으로 이루어져 있습니다. group: "group1", checked: true // "group1 - 첫번째"만 체크 되어 있습니다. }, { label: "group1 - 두번째", type: "radio", group: "group1", enabled: false // "group1 - 두번째"는 비활성화 되어 체크할 수 없습니다. }, { label: "group1 - 세번째", type: "radio", group: "group1" }, { label: "group2 - 첫번째", // group2는 어느것도 체크되어 있지 않습니다. type: "radio", // 그러나 팝업메뉴를 통해 체크할 수 있습니다. group: "group2" }, { label: "group2 - 두번째", type: "radio", group: "group2" }] }]; gridView.addPopupMenu("menu1", menu); //"menu1"이란 이름으로 위에서 만든 팝업메뉴를 등록합니다. });
- 
    메뉴항목을 클릭했을때 발생하는 콜백함수를 설정 합니다. $("#btnSetCallback").click(function () { gridView.onMenuItemClicked = function (grid, data) { var s = data.label + (data.checked ? " checked" : ""); if (data.tag) s += "\n" + "tag: " + data.tag; alert(s); }; });
- 
    직업 컬럼에 팝업메뉴를 연결 합니다. $("#btnSetColumn").click(function () { var col = gridView.columnByName("col1"); col.button = "popup"; col.popupMenu = "menu1"; gridView.setColumn(col); });
실행화면
- 
    버튼을 클릭하면 그리드에 팝업메뉴를 등록합니다. 화면에는 아무 변화가 없습니다. 
- 
    버튼을 클릭하면 콜백 함수를 설정합니다. 화면에는 아무 변화가 없습니다. 
- 
    버튼을 클릭하면 직업 컬럼에 팝업메뉴를 연결합니다. 
- 
    직업 컬럼을 선택하여 팝업 메뉴를 실행해보면서 결과를 확인해 보세요. 
전체 소스코드
SCRIPT
<link rel="stylesheet" href="/css/bootstrap.css">
<script type="text/javascript" src="/script/jquery-1.112.min.js"></script>
<script type="text/javascript" src="/script/bootstrap.min.js"></script>
<!--realgrid-->
<script type="text/javascript" src="/script/realgridjs_eval.1.0.14.min.js"></script>
<script type="text/javascript" src="/script/realgridjs-api.1.0.14.js"></script>
<script>
var gridView;
var dataProvider;
$(document).ready( function(){
    RealGridJS.setTrace(false);
    RealGridJS.setRootContext("/script");
    
    dataProvider = new RealGridJS.LocalDataProvider();
    gridView = new RealGridJS.GridView("realgrid");
    gridView.setDataSource(dataProvider);
    //필드 배열 객체를  생성합니다.
    var fields = [
        {
            fieldName: "field1"
        },
        {
            fieldName: "field2"
        },
        {
            fieldName: "field3"
        },
        {
            fieldName: "field4"
        },
        {
            fieldName: "field5"
        },
        {
            fieldName: "field6"
        },
        {
            fieldName: "field7"
        },
        {
            fieldName: "field8"
        },
        {
            fieldName: "field9"
        },
        {
            fieldName: "field10"
        }
    ];
    //DataProvider의 setFields함수로 필드를 입력합니다.
    dataProvider.setFields(fields);
    //필드와 연결된 컬럼 배열 객체를 생성합니다.
    var columns = [
        {
            name: "col1",
            fieldName: "field1",
            header : {
                text: "직업"
            },
            width : 60
        },
        {
            name: "col2",
            fieldName: "field2",
            header : {
                text: "성별"
            },
            width: 50
        },
        {
            name: "col3",
            fieldName: "field3",
            header : {
                text: "이름"
            },
            width: 80
        },
        {
            name: "col4",
            fieldName: "field4",
            header : {
                text: "국어"
            },
            width: 80
        },
        {
            name: "col5",
            fieldName: "field5",
            header : {
                text: "수학"
            },
            width: 80
        },
        {
            name: "col6",
            fieldName: "field6",
            header : {
                text: "민법"
            },
            width: 80
        },
        {
            name: "col7",
            fieldName: "field7",
            header : {
                text: "한국사"
            },
            width: 80
        },
        {
            name: "col8",
            fieldName: "field8",
            header : {
                text: "영어"
            },
            width: 80
        },
        {
            name: "col9",
            fieldName: "field9",
            header : {
                text: "과학"
            },
            width: 80
        },
        {
            name: "col10",
            fieldName: "field10",
            header : {
                text: "사회"
            },
            width: 80
        }
    ];
    //컬럼을 GridView에 입력 합니다.
    gridView.setColumns(columns);
    var data = [
        ["배우", "여자", "전도연", "0", "70", "90", "70", "60", "100", "80"],
        ["가수", "여자", "이선희", "1", "33", "90", "70", "60", "100", "80"],
        ["배우", "여자", "하지원", "2", "100", "90", "70", "60", "100", "80"],
        ["가수", "여자", "박정현", "3", "90", "90", "70", "60", "100", "80"],
        ["배우", "여자", "전지현", "4", "100", "90", "70", "60", "100", "80"],
        ["가수", "남자", "성시경", "7", "100", "100", "100", "100", "100", "100"],
        ["가수", "남자", "신해철", "8", "100", "100", "100", "100", "100", "100"],
        ["가수", "남자", "윤상", "9", "100", "100", "100", "100", "100", "100"],
        ["가수", "남자", "윤종신", "10", "100", "100", "100", "100", "100", "100"],
        ["가수", "여자", "이소라", "11", "100", "100", "100", "100", "100", "100"],
        ["배우", "여자", "강소라", "12", "100", "100", "100", "100", "100", "100"],
        ["가수", "남자", "타블로", "13", "100", "100", "100", "100", "100", "100"],
        ["가수", "남자", "이승환", "14", "100", "100", "100", "100", "100", "100"],
        ["가수", "남자", "토이", "15", "100", "100", "100", "100", "100", "100"]
    ];
    dataProvider.setRows(data);
    gridView.setOptions({
        indicator: {visible: true},        
        checkBar: {visible: false},
        stateBar: {visible: true},
        edit: {insertable: true, appendable: true, updatable: true, editable: true, deletable: true},
        sort: {enabled: false},
        panel: {visible: false}
    });
    dataProvider.setOptions({
        softDeleting: true
    })
    //메뉴 항목들로 이루어진 팝업메뉴를 만들고 그리드에 메뉴를 등록해보도록 하겠습니다.
    //주석을 확인해보면서 메뉴 항목의 기능을 습득하세요.
    $("#btnAddPopupMenu").click(function () {    
        // popup menus
        var menu = [{
            label: "menu1 입니다.",         // menu1은 활성화 되어 있고 하위 메뉴를 가지고 있습니다.
            enabled: true,
            children: [{
                label: "submenu1 입니다."
            }, {
                label: "submenu2 입니다."
            }]
        }, {
            label: "menu2 입니다",
            enabled: false                 // menu2 는 비활성화 되어 있습니다.
        }, {
            label: "-"                     // menu2 와 menu3 사이에 구분선이 그어집니다. 
                                           // type: "separator" 와 label: "-" 는 같은 기능을 합니다.
        }, {
            label: "menu3 입니다",            
            type: "check",                 // menu3은 체크를 할 수 있는 아이템
            checked: true,                 // menu3은 기본값으로 체크되어 있습니다.
            tag: "check_menu"              // 해당 메뉴항목이 클릭되어 있는지의 여부를 확인하기 위해 테그를 지정했습니다.
        }, {
            label: "group menu",            
            children: [{                   // group menu는 하위 메뉴를 가지고 있습니다.
                label: "group1 - 첫번째",    // menu1의 하위 메뉴와는 다르게 라디오 버튼을 사용하며,   
                type: "radio",             // 라디오 버튼은 group1, group2 두개의 그룹으로 이루어져 있습니다.
                group: "group1",            
                checked: true              // "group1 - 첫번째"만 체크 되어 있습니다.
            }, {
                label: "group1 - 두번째",
                type: "radio",
                group: "group1",
                enabled: false             // "group1 - 두번째"는 비활성화 되어 체크할 수 없습니다.  
            }, {
                label: "group1 - 세번째",
                type: "radio",
                group: "group1"
            }, {
                label: "group2 - 첫번째",    // group2는 어느것도 체크되어 있지 않습니다.
                type: "radio",             // 그러나 팝업메뉴를 통해 체크할 수 있습니다.
                group: "group2"
            }, {
                label: "group2 - 두번째",
                type: "radio",
                group: "group2"                
            }]
        }];
        gridView.addPopupMenu("menu1", menu);   //"menu1"이란 이름으로 위에서 만든 팝업메뉴를 등록합니다.
    });
    //메뉴항목을 클릭했을때 발생하는 콜백함수를 설정합니다.
    $("#btnSetCallback").click(function () {
        gridView.onMenuItemClicked = function (grid, data) {
            var s = data.label + (data.checked ? " checked" : "");
            if (data.tag)
                s += "\n" + "tag: " + data.tag;
            alert(s);
        };      
    });
    //직업 컬럼에 팝업메뉴를 연결 합니다. 
    $("#btnSetColumn").click(function () {
        var col = gridView.columnByName("col1");
        col.button = "popup";
        col.popupMenu = "menu1";
        gridView.setColumn(col);
    });
});    
</script>
HTML
1. <button type="button" class="btn btn-primary btn-xs" id="btnAddPopupMenu">AddPopupMenu</button> 버튼을 클릭하면 그리드에 팝업메뉴를 등록합니다. 화면에는 아무 변화가 없습니다. 2. <button type="button" class="btn btn-primary btn-xs" id="btnSetCallback">SetCallback</button> 버튼을 클릭하면 콜백 함수를 설정합니다. 화면에는 아무 변화가 없습니다. 3. <button type="button" class="btn btn-primary btn-xs" id="btnSetColumn">btnSetColumn</button> 버튼을 클릭하면 직업 컬럼에 팝업메뉴를 연결합니다. 4. 직업 컬럼을 선택하여 팝업 메뉴를 실행해보면서 결과를 확인해 보세요. <div id="realgrid" style="width: 100%; height: 250px;"></div>
데모 사이트
API 참조
 RealGrid HELP
 RealGrid HELP