[ Nexacro-FrameWork1. step2.메뉴연결 및 업무화면생성 ]
1. menu dataset생성
- id : gds_menu
- Columns : level, menuId, menuNm, formUrl, param
- Rows : 메뉴 data row 추가 및 data추가 (잘)
2. 열려진 menu dataset생성
- id : gds_openMenu
- Columns : level, menuId, menuNm, formUrl
3. 왼쪽 Frame에 메뉴 목록 조회
- leftMenu.xfdl
- grid 생성 : id : grd_menu, binddataset : gds_menu
- grd_menu에 : gds_menu연결 및 메뉴를 tree로 보여주도록 Grid (잘)설정
- grid 속성
. autofittype : col
. treeinitstatus : expand,all
. treeusecheckbox : false
4. workMain.xfdl - div생성
- 정의 : 업무 화면을 보여줄(연결할) div생성
- id : div_work
5. 업무화면(form)용 Services 하나 추가
- Service ID : busi
- Service Type : form
- Service Url : ./busi/
6. 업무화면 추가
- busi::commonCode.xfdl (공통코드) (width:784, height:608)
- busi::subsidiary.xfdl (법인코드) (width:784, height:608)
- busi::proforma.xfdl (견적서관리) (width:784, height:608)
- busi::unitPrice.xfdl (단가관리) (width:784, height:608)
- busi::bid.xfdl (입찰관리) (width:784, height:608)
7. 업무화면 id와 gds_menu의 url 등 연결
- 잘...
8. leftMenu.xfdl
1. 정의 : Grid에서 menu douclick시 화면 조회 script개발
//메뉴클릭 시 > 업무화면 open
this.grd_menu_oncelldblclick = function(obj:Grid, e:nexacro.GridClickEventInfo)
{
var nChildCnt = obj.getTreeChildCount(e.row);
if (nChildCnt == 0){
var sMenuId = application.gds_menu.getColumn(e.row, "menuId");
application.afn_menuOpen(sMenuId);
}
}
8. application script 개발
1. 정의 : 메뉴 클릭 시 화면 open(interface용. tabFrame에 fn_menuOpen() 호출)
2. event1개, function1개 추가
. application_onloadingglobalvariables : Event추가 (application관점에서 변수관리)
. afn_menuOpen() : function추가 (메뉴 open interface용)
3. script
this.av_mainFrame;
this.av_tapFrame;
this.av_mdiFrameSet;
this.application_onloadingglobalvariables = function(obj:Application, e:nexacro.LoadEventInfo)
{
this.av_mainFrame = application.mainframe;
this.av_tapFrame = this.av_mainFrame.vStartFrameSet.vMainFrameSet.hMiddleFrameSet.vWorkFrameSet.tabFrame;
this.av_mdiFrameSet = this.av_mainFrame.vStartFrameSet.vMainFrameSet.hMiddleFrameSet.vWorkFrameSet.mdiFrameSet;
}
//메뉴클릭 시 > 업무화면 open(interface용. tabFrame에 fn_menuOpen() 호출)
this.afn_menuOpen = function(sMenuId){
var nRow = application.gds_menu.findRow("menuId", sMenuId);
if (nRow < 0) return;
this.av_tapFrame.form.fn_menuOpen(nRow); //이때 중간에 form object명을 넣어야 됨 (왜, 몰러??)
}
9. tapFrame.xfdl
1. 정의 : 클릭한 메뉴를 tab에 보여주고, workFrame에 화면 보여주기
2. tab component 추가
. id : tabMenu
. 초기 생성 시 : tabpage가 2개 생성됨. 이때 하나는 삭제
(하나는 남겨두는 이유는 개발자 눈에 보이기 위해서.
차후 onload event에서 결국 삭제 함)
3. Event 3개 와 function1개 생성
. form.fn_onload : 화면 onload시 tab 초기화
. fn_menuOpen : workMain Frame에 MDI로 업무화면 open
. tabMenu.onchanged : menu클릭 시 클릭한 메뉴 tab에 추가 및 화면 open
. tabMenu.onextrabuttonclick : tabpage에서 [x]를 클릭하면 화면 close
4. fn_onload script
/*
* desc : form onload
*/
this.fn_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
this.tabMenu.removeTabpage(0);
}
5. fn_menuOpen script
/*
* desc : menu 클릭 시 클릭한 메뉴 open
*/
var fv_maxMenu = 20;
this.fn_menuOpen = function(nMenuRow){
var objTab = this.tabMenu;
var objDsMenu = application.gds_menu;
var sMenuId = objDsMenu.getColumn(nMenuRow, "menuId");
var sMenuNm = objDsMenu.getColumn(nMenuRow, "menuNm");
var sFormUrl = objDsMenu.getColumn(nMenuRow, "formUrl");
var sFormUrl = objDsMenu.getColumn(nMenuRow, "formUrl");
var sParam = objDsMenu.getColumn(nMenuRow, "param");
if (this.gfn_isNull(sFormUrl)) return;
//1. 현재 메뉴가 이미 open되어 있으면 해당화면 활성화
var nFind = application.gds_openMenu.findRow("menuId", sMenuId)
if (nFind >= 0){
var nPageCnt = this.tabMenu.getTabpageCount();
var objPages = this.tabMenu.tabpages;
for(var idx=0; idx<nPageCnt; idx++){
if (sMenuId == objPages[idx].name){
this.tabMenu.set_tabindex(idx);
}
}
return;
}
//2. open가능 메뉴 수 체크
var nOpenMenuCnt = this.tabMenu.getTabpageCount();
if (nOpenMenuCnt >= fv_maxMenu){
alert("최대수 " + fv_maxMenu + "개를 넘었습니다");
return;
}
//4. openmenu dataset에 추가
var objOpenMenu = application.gds_openMenu;
var nAddRow = objOpenMenu.addRow();
objOpenMenu.setColumn(nAddRow, "level" , objDsMenu.getColumn(nMenuRow, "level"));
objOpenMenu.setColumn(nAddRow, "menuId" , sMenuId);
objOpenMenu.setColumn(nAddRow, "menuNm" , sMenuNm);
objOpenMenu.setColumn(nAddRow, "formUrl", sFormUrl);
//5. 화면 MDI로 form생성 및 조회
var newChild = new nexacro.ChildFrame;
//업무화면을 workMain Form과 div를 이용해서 업무화면 open하는 방식
newChild.init(sMenuId,"absolute",10, 10, 10, 10, null, null, "frame::workMain.xfdl");
//업무화면을 직접 open하는 방식
//newChild.init(sMenuId,"absolute",10, 10, 10, 10, null, null, sFormUrl);
application.av_mdiFrameSet.addChild(sMenuId, newChild);
newChild.set_showtitlebar(false);
newChild.set_autosize(true);
newChild.set_resizable(true);
newChild.set_titletext("");
newChild.set_showstatusbar(false);
newChild.set_openalign("left top");
newChild.set_openstatus("maximize");
newChild.style.set_border("0px solid blue");
newChild.show();
newChild.biz_url = sFormUrl;
newChild.biz_menuText = sMenuNm;
newChild.biz_menuId = sMenuId;
newChild.biz_param = sParam;
newChild.setFocus();
application.gv_activeMenuId = sMenuId;
//3. page 추가(이때 바로 'tabMenu_onchanged' event가 발생됨)
//
// 참고, 아래 script가 'application.av_mdiFrameSet.addChild(sMenuId, newChild);' 위쪽으로 올라 가면
// tabMenu_onchanged() Event쪽에서 오류가 발생한다.
// 이유, 1. tabMenu.insertTabpage()로 page추가
// 2. tabMenu_onchanged() Event 발생
// 3. application.av_mdiFrameSet[sMenuId].setFocus(); -> 이때 아직 mdi화면생성이 안되어 있기에 오류 발생
// 4. application.av_mdiFrameSet.addChild(sMenuId, newChild); -> tabMenu_onchanged() Event 발생 종료 후 mdi화면 추가 및 조회
objTab.insertTabpage(sMenuId, objTab.getTabpageCount(), "", sMenuNm);
}
5. tabMenu.onchanged script
//page변경 시 해당화면 활성화
this.tabMenu_onchanged = function(obj:Tab, e:nexacro.TabIndexChangeEventInfo)
{
var objPages = obj.tabpages;
//e.postindex : 현재 click한 page index
//objPages[e.postindex].name : Tab.insertTabpage()함수로 설정한 page Id (즉, 메뉴id)
var sMenuId = objPages[e.postindex].name;
application.av_mdiFrameSet[sMenuId].setFocus();
application.gv_activeMenuId = sMenuId;
}
6. tabMenu.onextrabuttonclick script
//page닫기 버튼 클릭 시 (page 삭제하고, 열려있는 화면 닫기)
this.tabMenu_onextrabuttonclick = function(obj:Tab, e:nexacro.TabMouseEventInfo)
{
var objPages = obj.tabpages;
var sMenuId = objPages[e.index].name;
//1. MDI Close
application.av_mdiFrameSet[sMenuId].form.close();
//2. Page Close
obj.removeTabpage(e.index);
application.gv_activeMenuId = '';
//3. openMenu Delete
var nFindRow = application.gds_openMenu.findRow("menuId", sMenuId);
application.gds_openMenu.deleteRow(nFindRow);
if (application.gds_openMenu.rowcount <= 0){
//intro 화면 open하기
}
//4. 참고
// page를 삭제 하면 자동으로 tab onchanged() Event가 발생 됨
// 그래서 다음 tabpage의 화면이 활성화 됨
}
//isNull검사
this.gfn_isNull = function(sValue)
{
if (new String(sValue).valueOf().toUpperCase() == "UNDEFINED") return true;
if (sValue == null) return true;
var v_ChkStr = new String(sValue);
if (v_ChkStr == null) return true;
if (v_ChkStr.toString().length == 0 ) return true;
return false;
}
7. workMain script개발
1. 정의 : tabFrame에서 workMain을 MDI로생성 시 onload Event에서 workMain.div_work에 업무화면 URL을 연동시킨다.
2. script개발
. event 1개
. fn_onload Event : tabFrame에서 workMain을 생성시 연결시켜준 argument를 이용해서 업무화면을 연동시킨다.
3.fn_onload Event Script
this.fv_param;
this.fv_menuId;
this.fn_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
var sBizUrl = this.getOwnerFrame().biz_url;
var sMenuNm = this.getOwnerFrame().biz_menuText;
this.fv_menuId = this.getOwnerFrame().biz_menuId;
this.fv_param = this.getOwnerFrame().biz_param;
this.div_work.set_url(sBizUrl);
//this.setZoom(80);
}
'Nexacro-Framework > framework type1' 카테고리의 다른 글
Nexacro-FrameWork1. step9. 주요소스 (0) | 2017.08.17 |
---|---|
Nexacro-FrameWork1. step5.업무중 Frame hidden처리 (0) | 2017.08.17 |
Nexacro-FrameWork1. step4.Frame에서 업무화면 함수호출 (0) | 2017.08.17 |
Nexacro-FrameWork1. step3.메뉴와 업무화면간 parameter 연동 (0) | 2017.08.17 |
Nexacro-FrameWork1. step1.MDI Frame 생성 (4) | 2017.08.17 |