/** * @fileoverview 넥사크로 공통 Library interface * @author copyright 2015 TOBESOFT {J} */ if (!JsNamespace.exist("LGE.Filter")) { /** * @namespace * @name LGE.Interface * @author * @memberof! LGE.Filter */ JsNamespace.declare("LGE.Filter", { /** * 공통 Gobal Variable * @private * @memberOf LGE.Filter */ $: { // 필터 가능 표시 이미지 FILTER_ENABLE_IMAGE_URL : "images::grd_filter_combo.png", FILTER_ENABLE_IMAGE_SIZE : [17, 15], // 필터 적용 표시 이미지 FILTER_APPLY_IMAGE_URL : "images::grd_filter_check.png", FILTER_APPLY_IMAGE_SIZE : [17, 15] }, // 그리드 헤드 영역 추가 필터기능 관련 function /** * Grid head에 filer 기능 추가하기 초기화 * @param {Grid} grid 대상 Grid Component * @return * @example * * @memberOf Inject.Filter */ initGridHeadAppendFilter : function(grid, obj) { var pThis = LGE.Filter; // 대상이 이미 초기화 되었는지 확인 if ( Eco.XComp.getUserProperty(grid, "initGridHeadAppendFilter") ) { return; } // 필터영역(Div) 컴포넌트 name 을 담아둘 속성 추가 Eco.XComp.setUserProperty(grid, "appendFilterCompNameList", []); // 필터적용 정보를 담아둘 속성 추가 Eco.XComp.setUserProperty(grid, "filterInfos", {}); // 사용자에 의해 셀이 이동된 경우 필터 관련 컴포넌트 재배치 pThis.setUserGridOnCellMoved(grid, pThis.arrangeAppendFilterComps, obj); // 사용자에 의해 컬럼 사이즈가 변경된 경우 필터 관련 컴포넌트 재배치 pThis.setUserGridOnColResized(grid, pThis.arrangeAppendFilterComps, obj); // add onhscroll handler - 가로 스크롤 발생 시 컴포넌트 재배치 grid.addEventHandler("onhscroll", pThis.arrangeAppendFilterComps, obj); // 초기화 설정 완료 속성 지정 - 초기화 재설정 방지용 Eco.XComp.setUserProperty(grid, "initGridHeadAppendFilter", true); }, /** * Grid head append filter 보이기 * @param {Grid} grid 대상 Grid Component * @param {Form} obj 대상 Form * @return * @example * * @memberOf Inject.Filter */ showHeadAppendFilter : function(grid, obj) { var pThis = LGE.Filter; var index = Eco.XComp.getUserProperty(grid, "appendHeadRowIndex"); if ( Eco.isUndefined(index) ) { // 신규 Row 추가 index = grid.appendContentsRow("head"); // Grid Head-band size 변경 grid.setFormatRowProperty(index,"size",23); // 추가된 head row index를 담아두어 제거시 사용 Eco.XComp.setUserProperty(grid, "appendHeadRowIndex", index); // Grid Head 영역의 각 cell에 필터 컴포넌트 생성 pThis.arrangeAppendFilterComps(grid, obj); } }, /** * Grid head append filter 숨기기 (필터제거 포함) * @param {Grid} grid 대상 Grid Component * @return * @example * * @memberOf Inject.Filter */ hideHeadAppendFilter : function(grid) { var pThis = LGE.Filter; var index = Eco.XComp.getUserProperty(grid, "appendHeadRowIndex"); if ( !Eco.isUndefined(index) ) { grid.deleteContentsRow("head", index); // Div 숨기기 및 값 초기화 var comps = grid.parent.components; var comp, nameList = Eco.XComp.getUserProperty(grid, "appendFilterCompNameList"); for (var i=0,len=nameList.length; i areaLeft && l < areaRight ) { if ( l < areaLeft ) { l = areaLeft; } if ( r > areaRight ) { r = areaRight + 9; } w = r - l; // 보이는 셀 영역 최소 기준 값 적용 //if ( w >= 50 ) //{ makeInfo.push({ 'cell': i, 'left': l, 'top': rect.top, 'width': r - l, 'height': rect.height }); //} } } } } // 현재 보이는 cell 영역에 필터 입력 영역 생성 var len = makeInfo.length; var info; for (var i=0; i 0 ) { if ( logic == "and" ) { filterString += " && "; } else if ( logic == "or" ) { filterString += " || "; } } filterString += pThis.getFilterExprString(columnName, colType, info.operator, info.value); } filterString += ")"; } } Eco.Logger.debug("filter==>"+filterString); // 필터 적용 ds.filter(filterString); }, /** * 현재 적용된 필터를 제거한다. * @param {Grid} grid 대상 Grid Component */ clearFilter : function(grid) { // 데이터셋 필터 제거 var ds = Eco.XComp.lookup(grid.parent, grid.binddataset); ds.filter(""); // 정보 초기화 Eco.XComp.setUserProperty(grid, "filterInfos", {}); }, /** * 필터 조건문 문자열을 반환 * @param {string} columnName 필터 대상 데이터셋 컬럼명 * @param {string} colType 필터 대상 데이터셋 컬럼형 * @param {string} operator 연산자 * @param {*} value 피연산자 값 */ getFilterExprString : function(columnName, colType, operator, value) { // 필터값 중 괄호입력시 필터가 되지 않는 문제에 대한 수정 Eco.Logger.debug("b value ==> " + value); value = nexacro.replaceAll(value, "(", "\\\\("); value = nexacro.replaceAll(value, ")", "\\\\)"); Eco.Logger.debug("a value ==> " + value); var expr = ""; switch(operator) { case 'equal' : expr = "==" + ( colType == "STRING" ? nexacro.wrapQuote(value) : value); break; case 'notEqual' : expr = "!=" + ( colType == "STRING" ? nexacro.wrapQuote(value) : value); break; case 'greaterThan' : expr = ">" + ( colType == "STRING" ? nexacro.wrapQuote(value) : value); break; case 'greaterThanOrEqual' : expr = ">=" + ( colType == "STRING" ? nexacro.wrapQuote(value) : value); break; case 'lessThan' : expr = "<" + ( colType == "STRING" ? nexacro.wrapQuote(value) : value); break; case 'lessThanOrEqual' : expr = "<=" + ( colType == "STRING" ? nexacro.wrapQuote(value) : value); break; case 'startWith' : expr = ".toString().substr(0, "+value.length+") == '" + value + "'"; break; case 'endWith' : expr = ".toString().substr("+columnName+".toString().length-"+value.length+") == '" + value + "'"; break; case 'contains' : expr = ".toUpperCase().toString().search('"+value.toUpperCase()+"') > -1"; break; } if ( !Eco.isEmpty(expr) ) { var aValue = value.split(","); if(aValue.length > 1){ for(i=0; i -1" + ")"; } else { expr = "(" + columnName + ".toString().search('"+aValue[i]+"') > -1" + ")"; } } else { if (colType == "INT" || colType == "Decimal" || colType == "BIGDECIMAL" || colType == "FLOAT") { expr += " || (String(" + columnName + ").toString().search('"+aValue[i]+"') > -1" + ")"; } else { expr += " || (" + columnName + ".toString().search('"+aValue[i]+"') > -1" + ")"; } } } } else { if (colType == "INT" || colType == "Decimal" || colType == "BIGDECIMAL" || colType == "FLOAT") { expr = "String(" + columnName + ")" + expr; } else { expr = columnName + expr; } } } return expr; }, // Grid Utility function /** * Cell object 를 반환 (Grid 내부 속성이므로 get 용도로만 사용) * @param {Grid} grid 대상 Grid Component * @param {string} band 얻고자 하는 cell 의 band (head/body/summ); * @param {number} index 얻고자 하는 cell 의 index * @return {object} cell object */ getGridCellObject : function(grid, band, index) { // 내부속성을 통해 얻어온다. var refCell; var format = grid._curFormat; if (format) { if ( band == "head" ) { refCell = format._headcells[index]; } else if ( band == "body" ) { refCell = format._bodycells[index]; } else if ( band == "summ" || band == "summary" ) { refCell = format._summcells[index]; } } return refCell; }, /** * cell object에서 index 를 얻어온다. (Grid 내부 속성이므로 get 용도로만 사용) * @param {object} cell 대상 cell object * @return {number} cell index */ getCellObjectIndex : function(cell) { return cell._cellidx; }, /** * body cell index로 binding 된 컬럼명을 얻어온다. * @param {Grid} grid 대상 Grid Component * @param {number} index body cell index */ getBindColumnNameByIndex : function(grid, index) { var text = ""; var columnid = ""; var subCell = grid.getCellProperty("body", index, "subcell"); if ( subCell > 0 ) { text = grid.getSubCellProperty("body", index, 0, "text"); } else { text = grid.getCellProperty("body", index, "text"); } if ( !Eco.isEmpty(text) && text != null && text != "undefinded" && text != "" ) { if ( text.search(/^BIND\(/) > -1 ) { columnid = text.replace(/^BIND\(/, ""); columnid = columnid.substr(0, columnid.length-1); } else if ( text.search(/^bind:/) > -1 ) { columnid = text.replace(/^bind:/, ""); } } return columnid; }, /** * head cell에 match되는 body cell을 얻어온다 * @param {Grid} grid 대상 Grid Component * @param {number} headCellIndex head cell index * @param {boolean=} useColspan head cell 이 colspan 일 경우에도 반환값을 받을지 여부 */ getBodyCellIndex : function(grid, headCellIndex, useColspan) { // Max Head Row Index var maxHeadRow = 0; for (var i=0, len=grid.getCellCount("head"); i maxBodyRow) { sRow = nRow - (maxHeadRow - maxBodyRow); sRow = (sRow < 0 ? 0 : sRow); } else { sRow = nRow; } var cRow, cCol, cColspan; for (var i=0, len=grid.getCellCount("body"); i * (Column resize 이벤트가 없으므로 내부속성을 이용하여 확인한다.) * @param {Grid} grid 대상 Grid Component * @param {function} func resize가 발생했을 때 호출할 함수 (호출시 넘겨줄 인자 object는 {col, oldvalue, newvalue} ) * @param {scope=} scope 함수 내부에서 this 로 사용할 scope (인자 값이 없다면 grid parent) */ setUserGridOnColResized : function(grid, func, scope) { // check grid argument if ( Eco.isEmpty(grid) || Eco.XComp.typeOf(grid) != "Grid" ) { var msg = { 'message': "1'st argument must be a Grid Component", 'stack' : true }; Eco.Logger.error(msg); } // check func argument if ( Eco.isEmpty(func) || !Eco.isFunction(func) ) { var msg = { 'message': "2'nd argument must be a Function", 'stack' : true }; Eco.Logger.error(msg); } // check scope argument if ( Eco.isEmpty(scope) ) { scope = grid.parent; } // 대상 그리드에 이미 추가 되었는지 확인 if ( Eco.XComp.getUserProperty(grid, "setUserGridOnColResized") ) { return; } // add onmousemove handler // 마우스 이동 시 내부 속성을 확인하여 리사이즈 정보를 지정한다. grid.addEventHandler("onmousemove", function(obj, e) { if ( (obj.cellsizingtype == "col" || obj.cellsizingtype == "both") && e.col != -1 ) { Eco.XComp.setUserProperty(obj, "colResizeInfo", { 'col' : e.col, 'oldvalue' : obj.getRealColSize(e.col) }); } }, scope); // add onlbuttonup handler grid.addEventHandler("onlbuttonup", function(obj, e) { if ( (obj.cellsizingtype == "col" || obj.cellsizingtype == "both") && e.col != -1 ) { var colResizeInfo = Eco.XComp.getUserProperty(obj, "colResizeInfo"); if ( !Eco.isEmpty(colResizeInfo) ) { var info = { 'col': colResizeInfo.col, 'oldvalue': colResizeInfo.oldvalue, 'newvalue': obj.getRealColSize(colResizeInfo.col) }; func.call(scope, obj, info); //func.call(obj, Eco.XComp.getUserProperty(obj, "form"), e); // (grid, obj, e) // func == arrangeAppendFilterComps } } }, scope); // add onsize handler : 전체창 사이즈 조정 시 이벤트 처리 grid.addEventHandler("onsize", function(obj, e) { var info = { 'gapx': e.cx, // 변경된 너비 'gapy': e.cy // 변경된 높이 }; func.call(scope, obj, info); //func.call(obj, Eco.XComp.getUserProperty(obj, "form"), e); // (grid, obj, e) // func == arrangeAppendFilterComps }, scope); // 재정의 방지용 Eco.XComp.setUserProperty(grid, "setUserGridOnColResized", true); }, /** * cell move 가 발생할 때 주어진 함수를 호출한다.
* (cell moving 이벤트가 없으므로 내부속성을 이용하여 확인한다.) * @param {Grid} grid 대상 Grid Component * @param {function} func moving이 발생했을 때 호출할 함수 (호출시 넘겨줄 인자 object는 {col, oldcell, newcell, oldcol, newcol} ) * @param {scope=} scope 함수 내부에서 this 로 사용할 scope (인자 값이 없다면 grid parent) */ setUserGridOnCellMoved : function(grid, func, scope) { var pThis = LGE.Filter; // check grid argument if ( Eco.isEmpty(grid) || Eco.XComp.typeOf(grid) != "Grid" ) { var msg = { 'message': "1'st argument must be a Grid Component", 'stack' : true }; Eco.Logger.error(msg); } // check func argument if ( Eco.isEmpty(func) || !Eco.isFunction(func) ) { var msg = { 'message': "2'nd argument must be a Function", 'stack' : true }; Eco.Logger.error(msg); } // check scope argument if ( Eco.isEmpty(scope) ) { scope = grid.parent; } // 대상 그리드에 이미 추가 되었는지 확인 if ( Eco.XComp.getUserProperty(grid, "setUserGridOnCellMoved") ) { return; } // add onlbuttondown handler grid.addEventHandler("onlbuttondown", function(obj, e) { if ( obj.cellmovingtype == "col" && e.row == -1 ) { var cellMovingInfo = { 'oldcell': e.cell, 'oldcol': e.col, 'refCell': pThis.getGridCellObject(obj, "head", e.cell) }; Eco.XComp.setUserProperty(obj, "cellMovingInfo", cellMovingInfo); } else { Eco.XComp.setUserProperty(obj, "cellMovingInfo", null); } }, scope); // add onlbuttonup handler grid.addEventHandler("onlbuttonup", function(obj, e) { if ( obj.cellmovingtype == "col" && e.row < 0 ) { var cellMovingInfo = Eco.XComp.getUserProperty(obj, "cellMovingInfo"); if ( !Eco.isEmpty(cellMovingInfo) ) { if ( cellMovingInfo.oldcell != e.cell ) { var info = { 'oldcell': cellMovingInfo.oldcell, 'newcell': cellMovingInfo.refCell._cellidx, 'oldcol': cellMovingInfo.oldcol, 'newcol': cellMovingInfo.refCell._col }; func.call(scope, obj, info); //func.call(obj, Eco.XComp.getUserProperty(obj, "form"), e); // (grid, obj, e) Eco.XComp.setUserProperty(obj, "cellMovingInfo", null); } } } }, scope); Eco.XComp.setUserProperty(grid, "setUserGridOnCellMoved", true); } }); }