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 참조