/**
* admin/menu
*/
var mcare_admin_menu = function( language_code ){
//상속
mcare_admin.call(this);
var self = this;
//언어코드
var DEFAULT_LANGUAGE = language_code;
//변수
var $wrapper = $(".main-wrapper #wrapper"),
$addItem = $("#add-item"),
$saveItem = $("#save-item"),
$reloadItem = $("#reload-item"),
$removeItem = $("#remove-item"),
$deselectItem = $("#deselect-item"),
$treeView = $("#tree-view"),
$i18nGrid = $("#i18ns"),
$menuOrder = $("#menuOrder"),
$menuType = $("#menuType"),
$reqParams = $("#reqParams"),
$menuDesc = $("#menuDesc"),
$menuAuths = $("#menuAuths"),
$authSelector = $("#authSelector"),
$crudServiceBaseUrl = contextPath + "/admin/menu",
$authCrudServiceBaseUrl = contextPath + "/admin/auth"; //속성 관련 요청을 위해 별도로 작성
//트리
this.treeView;
this.i18nGrid;
this.menuAuthsGrid;
this.reqParamsGrid = null;
/**
* 객체 초기화
*/
this.init = function(){
initSplitter();
initTree();
initGrid();
initNumBox();
initDropDownList();
//설명 글자수 이벤트 - core에 선언
self.checkDescBytes($menuDesc);
addEvent();
initAuths();
};
/**
* 이벤트 등록
*/
var addEvent = function(){
// 아이템 생성
$addItem.on("click", function(e) {
addItem(e);
});
// 아이템 저장
$saveItem.on("click",function(e) {
saveItem(e);
});
// 아이템 갱신 (to 모바일 서버)
$reloadItem.on("click",function(e) {
reloadItem(e);
});
// 아이템 삭제
$removeItem.on("click",function(e) {
removeItem(e);
});
// 아이템 선택 해제
$deselectItem.on("click",function(e) {
deselectItem(e);
});
};
var initSplitter = function(){
$wrapper.kendoSplitter({
panes: [
{ collapsible: true, resizable: true, size: '240px' },
{ collapsible: false }
]
});
$wrapper.data("kendoSplitter").trigger("resize");
};
/**
* 트리 아이템 신규 이벤트
* @private
*/
var addItem = function(e){
var treeView = self.treeView;
addedNodeCheck(e, treeView.dataSource.data().toJSON());
if (addedNodeArr.length > 0) {
alert("저장하지 않은 아이템 [ " + addedNodeArr[0].menuName + " ] (이)가 있습니다");
addedNodeArr = [];
return false;
}
var node = treeView.select(),
item = treeView.dataItem(node);
var nodeData = null,
defData = {
menuType: "CONT",
menuName: "NewItem",
menuOrder: 0,
enabledYn: "Y",
authYn: "Y",
authViewYn: "N",
aggYn: "N",
accessUriAddr: "",
imageUriAddr: "",
menuDesc: "",
childCount: 0,
i18ns: [],
addedNode: true,
selected: false,
menuParam : [],
menuAuths : [],
};
if( node.length === 0 ) {
node = null;
nodeData = $.extend(true, {}, {
menuType: 'MAIN'
}, defData);
} else {
if( item.childCount === 0 ) {
item.loaded(true);
}
nodeData = $.extend( true, {}, item.toJSON(), {
menuId: null,
parentMenuId: item.menuId
}, defData);
}
treeView.append(nodeData, node);
};
// 다국어 코드 중복 체크
var i18nArr = [];
/**
* 트리 아이템 저장 이벤트
* @private
*/
var saveItem = function(e){
var treeView = self.treeView;
var node = treeView.select(),
item = treeView.dataItem(node);
if( node.length === 0 ) {
alert("선택한 아이템이 없습니다");
return false;
}
if( item.menuId === null || item.menuId === "" ) {
alert( "아이디가 누락되었습니다" );
return false;
}
var pnode = item.parentNode();
if( pnode ) {
if( pnode.menuType === "CONT" && item.menuType !== "CONT" ) {
alert( "콘텐츠 하위에는 콘텐츠만 등록할 수 있습니다" );
return false;
}
if( item.menuType === "SIDE" ){
alert( "메뉴타입을 사이드바로 지정할 수 없습니다." );
return false;
}
}
console.log(self.util.stringifyJson($menuAuths.data("kendoGrid").dataSource.data()));
var param = $.extend(true, {}, item, {
i18ns: $i18nGrid.data("kendoGrid").dataSource.data(),
menuParam : $reqParams.data("kendoGrid").dataSource.data(),
menuAuth : $menuAuths.data("kendoGrid").dataSource.data(),
}, null);
// 다국어 코드 중복 체크
for( var i = 0; i < param.i18ns.length; i++ ) {
i18nCd = param.i18ns[i].i18nCd;
if( $.inArray( i18nCd, i18nArr ) > -1 ) {
alert("다국어 코드는 중복될 수 없습니다");
return false;
} else {
i18nArr.push( i18nCd );
}
}
param.accessUriAddr = $("input#accessUriAddr.k-textbox").val();
if( param.accessUriAddr.indexOf("javascript:") > -1 && param.aggYn === "Y" ){
alert( "스크립트 메뉴는 통계여부를 '아니오'로 설정해주세요.")
return false;
}
kendo.ui.progress( $wrapper, true );
// $.ajax({
// url : $crudServiceBaseUrl + "/save.json",
// method : "POST",
// data : self.util.stringifyJson(param),
// dataType : "json",
// contentType: "application/json; charset=UTF-8",
// success : function(data){
// if( data.msg !== undefined ) {
// alert("수행 중 에러가 발생하였습니다");
// console.log(data.msg);
// return false;
// }
// alert("저장 되었습니다");
// location.reload();
// },
// error : function(xhr,d,t){
// console.log(xhr);
// console.log(t);
// },
// complete : function(){
// kendo.ui.progress( $wrapper, false );
// }
// });
var opt = {
url : $crudServiceBaseUrl + "/save.json",
method : "POST",
data : self.util.stringifyJson(param),
dataType : "json",
contentType: "application/json; charset=UTF-8",
complete : function(){
kendo.ui.progress( $wrapper, false );
}
};
var success = function(data){
alert("저장 되었습니다");
location.reload(true);
};
var error = function(xhr,d,t){
console.log(xhr);
console.log(t);
};
self.ajaxAdmin( opt, success, error );
};
/**
* 트리 아이템 reload 이벤트
* @private
*/
var reloadItem = function(e){
kendo.ui.progress( $wrapper, true );
// $.ajax({
// url : $crudServiceBaseUrl + "/cacheReload.json",
// type : "POST",
// contentType: "application/json; charset=UTF-8",
// success : function(data){
// if( data === 1 ) {
// alert("갱신 되었습니다");
// } else {
// alert( "수행 중 에러가 발생하였습니다" );
// }
// },
// error : function(xhr,d,t){
// console.log(xhr);
// console.log(t);
// },
// complete : function(){
// kendo.ui.progress( $wrapper, false );
// }
// });
var opt = {
url : $crudServiceBaseUrl + "/cacheReload.json",
type : "POST",
contentType: "application/json; charset=UTF-8",
complete : function(){
kendo.ui.progress( $wrapper, false );
}
};
var success = function(data){
if( data === 1 ) {
alert("갱신 되었습니다");
} else {
alert( "수행 중 에러가 발생하였습니다" );
}
};
var error = function(xhr,d,t){
console.log(xhr);
console.log(t);
};
self.ajaxAdmin( opt, success, error );
};
/**
* 트리 아이템 삭제 이벤트
* @private
*/
var removeItem = function(e){
var treeView = self.treeView;
var node = treeView.select(),
item = treeView.dataItem(node);
if( node.length === 0 ) {
alert( "선택한 아이템이 없습니다." );
return false;
}
kendo.unbind( $wrapper );
if( item.addedNode === true ) {
treeView.remove(node);
} else {
if( item.childCount > 0 ) {
alert( "하위 아이템이 존재하여 삭제할 수 없습니다." );
return false;
}
if( !confirm( "삭제 하시겠습니까?" ) ) {
return false;
}
kendo.ui.progress( $wrapper, true );
// $.ajax({
// url : $crudServiceBaseUrl + "/remove.json",
// type : "POST",
// data : { menuId : item.menuId },
// dataType : "json",
// success : function(data){
// if( data.msg !== undefined ) {
// alert( "수행 중 에러가 발생하였습니다" );
// console.log( data.msg );
// return false;
// }
// alert( "삭제 되었습니다" );
// location.reload();
// },
// error : function(xhr,d,t){
// console.log(xhr);
// console.log(t);
// },
// complete : function(){
// kendo.ui.progress( $wrapper, false );
// }
// });
var opt = {
url : $crudServiceBaseUrl + "/remove.json",
type : "POST",
data : { menuId : item.menuId },
dataType : "json",
complete : function(){
kendo.ui.progress( $wrapper, false );
}
};
var success = function(data){
alert( "삭제 되었습니다" );
location.reload(true);
};
var error = function(xhr,d,t){
console.log(xhr);
console.log(t);
};
self.ajaxAdmin( opt, success, error );
}
};
/**
* 트리 아이템 선택 해제 이벤트
* @private
*/
var deselectItem = function(e){
self.treeView.select( null );
};
var initNumBox = function(){
$menuOrder.kendoNumericTextBox({
format: '0',
min: 0,
max: 1000,
step: 1
});
};
/**
* 속성 데이터 가져오기
*/
var authList;
var initAuths = function() {
$.ajax({
url : $authCrudServiceBaseUrl + "/getList.json",
method : "POST",
dataType : "json",
contentType : "application/json",
success : function(data){
authList = data;
console.log(self.util.stringifyJson(data));
//
// //추가 업무 목록 Selecter 만들기
for (var i = 0; i < data.length; i++) {
var auth = data[i];
$authSelector.append('');
}
},
error : function(xhr,d,t){
},
complete: function(){
}
});
}
var initDropDownList = function(){
self.dropDownList( $menuType, {
change:function(e){
//네비게이션이면
if( e.sender.value() === "NAVI" ){
$("input#accessUriAddr.k-textbox").val("/navigation.page");
} else {
var text = $("input#accessUriAddr.k-textbox").val();
text = (text!==""&& text !=="/navigation.page")?text:"";
$("input#accessUriAddr.k-textbox").val(text);
}
}
} );
};
/**
* 데이터소스 설정
*/
// tree 데이터소스
var treeDataSource = new kendo.data.HierarchicalDataSource({
transport: {
read: {
url: $crudServiceBaseUrl + "/getList.json",
method : "post",
dataType: "json"
}
},
schema : {
model : {
id: "menuId",
hasChildren: function(){
return (this.get("childCount") > 0);
}
}
}
});
//grid 데이터 소스
var gridDataSource = {
transport: {
read: {
url: $crudServiceBaseUrl + "/getI18nList.json",
method: "get",
dataType: "json"
}
},
schema: {
data : function(d){
if( d.msg !== undefined ){
return [];
} else {
return d;
}
},
model: {
id: "menuId",
fields: {
i18nCd: {type: "string", defaultValue : DEFAULT_LANGUAGE},
cdText: {type: "string", editable : true}
}
}
}
};
//grid 데이터 소스
var gridMenuAuhtDataSource = new kendo.data.DataSource({
transport: {
read: {
url: $crudServiceBaseUrl + "/getMenuAuthList.json",
method: "get",
dataType: "json"
}
},
schema: {
autoSync: true,
data : function(d){
if( d.msg !== undefined ){
return [];
} else {
return d;
}
},
model: {
id: "authId",
fields: {
authId: { type: "string", nullable: false, validation: { required: true }},
authName: {defaultValue: ""},
}
}
}
});
/**
* 트리 초기화
*/
var initTree = function(){
//kendo tree
var option = {
loadOnDemand: false,
dataSource : treeDataSource,
dataTextField : "menuName",
template : treeTemplate,
select : treeSelect,
expand : treeExpand
};
self.treeView = self.tree( $treeView, option );
/**
* tree template
* @private
* @description 트리 구성
*/
function treeTemplate(o){
var span = $("").addClass("k-sprite");
if( o.item.menuType === "NAVI" ){
span.addClass("folder");
} else if( o.item.menuType === "CONT" ){
span.addClass("html");
} else {
span.addClass("rootfolder");
}
return span[0].outerHTML + o.item.menuName;
};
/**
* tree select
* @private
* @description 트리 선택
*/
function treeSelect(o){
kendo.unbind( $wrapper );
var item = this.dataItem( o.node );
var observer = new kendo.observable( item );
observer.bind("change", function(o) {
});
self.i18nGrid.dataSource.read({ "menuId" : item.menuId });
self.reqParamsGrid.dataSource.read({"menuId" : item.menuId} );
self.menuAuthsGrid.dataSource.read({"menuId" : item.menuId} );
kendo.bind( $wrapper, observer );
if( observer.menuId !== undefined && observer.menuId !== null ){
$("#menuId").prop("disabled",true);
} else {
$("#menuId").prop("disabled",false);
}
//설명 글자수제한 초기화
$menuDesc.trigger("keyup");
};
/**
* tree expand
* @private
* @description 트리 펼치기
*/
function treeExpand(o){
// var sourceData = this.dataItem(o.node);
// if( !sourceData.get("enabled") ) {
// return o.preventDefault();
// }
};
};
/**
* 그리드 초기화
*/
var initGrid = function(){
var option = {
dataSource : gridDataSource,
toolbar : [ {name: "create", text: "추가"} ],
editable : { createAt : "bottom" },
columns : [
{field: "i18nCd", title: "다국어 코드", width: 100, editor: i18nDropDownEditor, template: "#=i18nCd#"},
{field: "cdText", title: "코드 텍스트", width: 200, attributes: {style: "text-align: center;"}},
{command: "destroy", title: '', width: 92, attributes: {style: "text-align: center;"}}
]
};
var menuAuthOption = {
dataSource : gridMenuAuhtDataSource,
toolbar : [ {name: "create", text: "추가"} ],
editable : { createAt : "bottom" },
columns : [
{field: "authId", title: "권한 이름", width: 100, editor: authsDropDownEditor, template: authValueConvert
},
/*{field: "authName", title: "권한 ID", width: 100, editor: authsDropDownEditor, template: "#=authName#"},*/
// {field: "authId", title: "권한 ID", width: 200, attributes: {style: "text-align: center;"}},
{command: "destroy", title: '', width: 92, attributes: {style: "text-align: center;"}}
]
};
var reqParamOption = {
dataSource : {
transport : {
read : {
url : $crudServiceBaseUrl + "/getParamList.json",
method : "get",
dataType : "json",
contentType : "application/json"
}
},
schema : {
data : function(d){
if( d.msg !== undefined ){
return [];
} else {
return d;
}
},
model : {
id : "menuParamSeq",
fields : {
menuParamName : {type : "string", validation : { required : true}},
dataType : {type : "string",defaultValue : "STRING"},
paramValue : {type : "string"},
paramDesc : {type : "string"}
}
}
}
},
toolbar : [{name: "create", text: "추가"}],
editable : { createAt : "bottom"},
columns : [
{title:"no",template:"#= getNum()#",width:30,attributes: {style: "text-align: center;"}}
,{field : "paramName", title : "이름", attributes: {style: "text-align: center;"}}
,{field : "dataType", title : "타입", editor : reqParamTypeDropDownEditor, template: "#=dataType#"}
,{field : "paramValue", title : "파라미터값", attributes: {style: "text-align: center;"}}
,{field : "paramDesc", title : "설명", attributes: {style: "text-align: center;"}}
,{command : "destroy", title : "", attributes: {style: "text-align: center;"}}
]
};
function i18nDropDownEditor(container, options) {
$("[data-id='i18nDropDownEditor']:first").clone().attr("data-bind", "value:" + options.field).appendTo(container).kendoDropDownList({autoBind: false});
}
/**
* 파라미터 LOV
*/
function reqParamTypeDropDownEditor(container, options) {
$("[data-id='reqParamTypeDropDownEditor']:first").clone().attr("data-bind", "value:" + options.field).appendTo(container).kendoDropDownList({autoBind: false});
}
function authsDropDownEditor(container, options) {
/*$("[data-id='authsDropDownEditor']:first").clone().attr("data-bind", "value:authId").appendTo(container).kendoDropDownList({autoBind: false});*/
/*$('')
.attr('data-bind', 'value:authId')
.appendTo(container)
.kendoDropDownList({
autoBind: false,
dataSource: authList,
dataTextField: 'authName',
dataValueField: 'authId'
});*/
$('')
.appendTo(container)
.kendoDropDownList({
autoBind: false,
dataTextField: "authName",
dataValueField: "authId",
dataSource: authList,
optionLabel:{
authName: "선택",
authId: ""
}
});
}
function authValueConvert(row){
for(var i=0; i 0 ){
addedNodeCheck( e, child );
}
}
}
}
}
};
};
var rowNum = 0;
function resetRowNum(){
rowNum = 0;
}
function getNum(){
return ++rowNum;
}