123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716 |
- /**
- * 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('<option value="'+ auth.authId +'">' + auth.authName + '</option>');
- }
- },
- 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 = $("<span></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});*/
- /*$('<input />')
- .attr('data-bind', 'value:authId')
- .appendTo(container)
- .kendoDropDownList({
- autoBind: false,
- dataSource: authList,
- dataTextField: 'authName',
- dataValueField: 'authId'
- });*/
- $('<input required name="' + options.field + '"/>')
- .appendTo(container)
- .kendoDropDownList({
- autoBind: false,
- dataTextField: "authName",
- dataValueField: "authId",
- dataSource: authList,
- optionLabel:{
- authName: "선택",
- authId: ""
- }
- });
- }
- function authValueConvert(row){
- for(var i=0; i<authList.length; i++){
- if(authList[i].authId==row.authId){
- return authList[i].authName;
- }
- }
- };
- self.i18nGrid = self.grid( $i18nGrid , option );
- self.reqParamsGrid = self.grid ( $reqParams, reqParamOption );
- self.menuAuthsGrid = self.grid ($menuAuths, menuAuthOption);
- };
-
- // 저장하지 않은 아이템 배열
- var addedNodeArr = [];
- /**
- * 트리 저장하지 않은 아이템 확인
- */
- var addedNodeCheck = function(e, treeViewData) {
- if( treeViewData ) {
- for( var n = 0; n < treeViewData.length; n++ ) {
- var childData = treeViewData[n];
- if( childData.addedNode === true ){
- addedNodeArr.push( childData );
- return;
-
- } else {
- var child = childData.items;
- if( child ) {
- if( child.length > 0 ){
- addedNodeCheck( e, child );
- }
- }
- }
- }
- }
- };
- };
- var rowNum = 0;
- function resetRowNum(){
- rowNum = 0;
- }
- function getNum(){
- return ++rowNum;
- }
|