extraAttr.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. /**
  2. * admin/menu
  3. */
  4. var mcare_admin_extraAttr = function( language_code ){
  5. //상속
  6. mcare_admin.call(this);
  7. var self = this;
  8. //언어코드
  9. var DEFAULT_LANGUAGE = language_code;
  10. //변수
  11. var $wrapper = $(".main-wrapper #wrapper"),
  12. $addItem = $("#add-item"),
  13. $saveItem = $("#save-item"),
  14. $reloadItem = $("#reload-item"),
  15. $removeItem = $("#remove-item"),
  16. $deselectItem = $("#deselect-item"),
  17. $treeView = $("#tree-view"),
  18. $menuType = $("#menuType"),
  19. $extraAttrUsers = $("#extraAttrUsers"),
  20. $extraAttrDesc = $("#extraAttrDesc"),
  21. $crudServiceBaseUrl = contextPath + "/admin/extraAttr"
  22. $attrCrudServiceBaseUrl = contextPath + "/admin/userAttr"; //속성 관련 요청을 위해 별도로 작성
  23. var attrTyes = null;
  24. //트리
  25. this.treeView;
  26. this.extraAttrUsersGrid = null;
  27. /**
  28. * 객체 초기화
  29. */
  30. this.init = function(){
  31. initSplitter();
  32. initTree();
  33. initGrid();
  34. initAttrTypeList();
  35. //설명 글자수 이벤트 - core에 선언
  36. self.checkDescBytes($extraAttrDesc);
  37. addEvent();
  38. };
  39. /**
  40. * 이벤트 등록
  41. */
  42. var addEvent = function(){
  43. // 아이템 생성
  44. $addItem.on("click", function(e) {
  45. addItem(e);
  46. });
  47. // 아이템 저장
  48. $saveItem.on("click",function(e) {
  49. saveItem(e);
  50. });
  51. // 아이템 갱신 (to 모바일 서버)
  52. $reloadItem.on("click",function(e) {
  53. reloadItem(e);
  54. });
  55. // 아이템 삭제
  56. $removeItem.on("click",function(e) {
  57. removeItem(e);
  58. });
  59. // 아이템 선택 해제
  60. $deselectItem.on("click",function(e) {
  61. deselectItem(e);
  62. });
  63. };
  64. /**
  65. * 화면에서 사용하는 속성 조회
  66. */
  67. var initAttrTypeList = function(){
  68. $.ajax ({
  69. url : '/mcare-plus/admin/attr/getAttrTypeList.json',
  70. type : 'POST',
  71. success: function(result){
  72. hospitalList = result.hospital;
  73. dutyList = result.duty;
  74. workList = result.work;
  75. attrTypeList = result.attrType;
  76. searchTypeList = [{attrId: 'userId', attrName: '아이디'},{attrId: 'userName', attrName: '이름'}];
  77. }
  78. })
  79. };
  80. var initSplitter = function(){
  81. $wrapper.kendoSplitter({
  82. panes: [
  83. { collapsible: true, resizable: true, size: '240px' },
  84. { collapsible: false }
  85. ]
  86. });
  87. $wrapper.data("kendoSplitter").trigger("resize");
  88. };
  89. /**
  90. * 트리 아이템 신규 이벤트
  91. * @private
  92. */
  93. var addItem = function(e){
  94. var treeView = self.treeView;
  95. addedNodeCheck(e, treeView.dataSource.data().toJSON());
  96. if (addedNodeArr.length > 0) {
  97. alert("저장하지 않은 아이템 [ " + addedNodeArr[0].menuName + " ] (이)가 있습니다");
  98. addedNodeArr = [];
  99. return false;
  100. }
  101. var node = treeView.select(),
  102. item = treeView.dataItem(node);
  103. var nodeData = null,
  104. defData = {
  105. menuType: "CONT",
  106. menuName: "NewItem",
  107. enabledYn: "Y",
  108. authYn: "Y",
  109. authViewYn: "N",
  110. aggYn: "N",
  111. accessUriAddr: "",
  112. imageUriAddr: "",
  113. extraAttrDesc: "",
  114. childCount: 0,
  115. i18ns: [],
  116. addedNode: true,
  117. selected: false,
  118. menuParam : []
  119. };
  120. node = null;
  121. nodeData = $.extend(true, {}, {
  122. menuType: 'MAIN'
  123. }, defData);
  124. /*if( node.length === 0 ) {
  125. node = null;
  126. nodeData = $.extend(true, {}, {
  127. menuType: 'MAIN'
  128. }, defData);
  129. } else {
  130. if( item.childCount === 0 ) {
  131. item.loaded(true);
  132. }
  133. nodeData = $.extend( true, {}, item.toJSON(), {
  134. menuId: null,
  135. parentMenuId: item.menuId
  136. }, defData);
  137. }*/
  138. treeView.append(nodeData, node);
  139. };
  140. // 다국어 코드 중복 체크
  141. var i18nArr = [];
  142. /**
  143. * 트리 아이템 저장 이벤트
  144. * @private
  145. */
  146. var saveItem = function(e){
  147. var treeView = self.treeView;
  148. var node = treeView.select(),
  149. item = treeView.dataItem(node);
  150. if( node.length === 0 ) {
  151. alert("선택한 아이템이 없습니다");
  152. return false;
  153. }
  154. if( item.extraAttrName==undefined || item.extraAttrName === null || item.extraAttrName === "" ) {
  155. alert( "메뉴명이 누락되었습니다" );
  156. return false;
  157. }
  158. console.log(self.util.stringifyJson($extraAttrUsers.data("kendoGrid").dataSource.data()));
  159. var param = $.extend(true, {}, item, {
  160. extraAttrUserList : $extraAttrUsers.data("kendoGrid").dataSource.data()
  161. }, null);
  162. var opt = {
  163. url : $crudServiceBaseUrl + "/save.json",
  164. method : "POST",
  165. data : self.util.stringifyJson(param),
  166. dataType : "json",
  167. contentType: "application/json; charset=UTF-8",
  168. complete : function(){
  169. kendo.ui.progress( $wrapper, false );
  170. }
  171. };
  172. var success = function(data){
  173. alert("저장 되었습니다");
  174. location.reload(true);
  175. };
  176. var error = function(xhr,d,t){
  177. console.log(xhr);
  178. console.log(t);
  179. };
  180. self.ajaxAdmin( opt, success, error );
  181. };
  182. /**
  183. * 트리 아이템 reload 이벤트
  184. * @private
  185. */
  186. var reloadItem = function(e){
  187. kendo.ui.progress( $wrapper, true );
  188. var opt = {
  189. url : $crudServiceBaseUrl + "/cacheReload.json",
  190. type : "POST",
  191. contentType: "application/json; charset=UTF-8",
  192. complete : function(){
  193. kendo.ui.progress( $wrapper, false );
  194. }
  195. };
  196. var success = function(data){
  197. if( data === 1 ) {
  198. alert("갱신 되었습니다");
  199. } else {
  200. alert( "수행 중 에러가 발생하였습니다" );
  201. }
  202. };
  203. var error = function(xhr,d,t){
  204. console.log(xhr);
  205. console.log(t);
  206. };
  207. self.ajaxAdmin( opt, success, error );
  208. };
  209. /**
  210. * 트리 아이템 삭제 이벤트
  211. * @private
  212. */
  213. var removeItem = function(e){
  214. var treeView = self.treeView;
  215. var node = treeView.select(),
  216. item = treeView.dataItem(node);
  217. if( node.length === 0 ) {
  218. alert( "선택한 아이템이 없습니다." );
  219. return false;
  220. }
  221. kendo.unbind( $wrapper );
  222. if( item.addedNode === true ) {
  223. treeView.remove(node);
  224. } else {
  225. if( !confirm( "삭제 하시겠습니까?" ) ) {
  226. return false;
  227. }
  228. kendo.ui.progress( $wrapper, true );
  229. var opt = {
  230. url : $crudServiceBaseUrl + "/remove.json",
  231. type : "POST",
  232. data : { extraAttrId : item.extraAttrId },
  233. dataType : "json",
  234. complete : function(){
  235. kendo.ui.progress( $wrapper, false );
  236. }
  237. };
  238. var success = function(data){
  239. alert( "삭제 되었습니다" );
  240. location.reload(true);
  241. };
  242. var error = function(xhr,d,t){
  243. console.log(xhr);
  244. console.log(t);
  245. };
  246. self.ajaxAdmin( opt, success, error );
  247. }
  248. };
  249. /**
  250. * 트리 아이템 선택 해제 이벤트
  251. * @private
  252. */
  253. var deselectItem = function(e){
  254. self.treeView.select( null );
  255. };
  256. /**
  257. * 데이터소스 설정
  258. */
  259. // tree 데이터소스
  260. var treeDataSource = new kendo.data.HierarchicalDataSource({
  261. transport: {
  262. read: {
  263. url: $crudServiceBaseUrl + "/getList.json",
  264. method : "post",
  265. dataType: "json"
  266. }
  267. },
  268. schema : {
  269. model : {
  270. id: "extraAttrId",
  271. hasChildren: function(){
  272. return (this.get("childCount") > 0);
  273. }
  274. }
  275. }
  276. });
  277. /**
  278. * 트리 초기화
  279. */
  280. var initTree = function(){
  281. //kendo tree
  282. var option = {
  283. loadOnDemand: false,
  284. dataSource : treeDataSource,
  285. dataTextField : "extraAttrName",
  286. template : treeTemplate,
  287. select : treeSelect,
  288. expand : treeExpand
  289. };
  290. self.treeView = self.tree( $treeView, option );
  291. /**
  292. * tree template
  293. * @private
  294. * @description 트리 구성
  295. */
  296. function treeTemplate(o){
  297. var span = $("<span></span>").addClass("k-sprite");
  298. span.addClass("html");
  299. return span[0].outerHTML + o.item.extraAttrName;
  300. };
  301. /**
  302. * tree select
  303. * @private
  304. * @description 트리 선택
  305. */
  306. function treeSelect(o){
  307. kendo.unbind( $wrapper );
  308. var item = this.dataItem( o.node );
  309. console.log(self.util.stringifyJson(item));
  310. var observer = new kendo.observable( item );
  311. observer.bind("change", function(o) {
  312. });
  313. self.extraAttrUsersGrid.dataSource.read({"extraAttrId" : item.extraAttrId} );
  314. kendo.bind( $wrapper, observer );
  315. if( observer.extraAttrId !== undefined && observer.extraAttrId !== null ){
  316. $("#extraAttrId").prop("disabled",true);
  317. } else {
  318. $("#extraAttrId").prop("disabled",false);
  319. }
  320. //설명 글자수제한 초기화
  321. $extraAttrDesc.trigger("keyup");
  322. };
  323. /**
  324. * tree expand
  325. * @private
  326. * @description 트리 펼치기
  327. */
  328. function treeExpand(o){
  329. // var sourceData = this.dataItem(o.node);
  330. // if( !sourceData.get("enabled") ) {
  331. // return o.preventDefault();
  332. // }
  333. };
  334. };
  335. var dataSource = new kendo.data.DataSource({
  336. transport: {
  337. read: function(options) {
  338. $.ajax({
  339. url: $crudServiceBaseUrl + "/getExtraAttrUserList.json",
  340. dataType: "json",
  341. contentType : "application/json",
  342. data: options.data.extraAttrId==undefined? "": {extraAttrId: options.data.extraAttrId},
  343. success: function(result) {
  344. options.success(result);
  345. },
  346. complate: function(result) {
  347. if(result.msg!=undefined){
  348. gridReadComplete(result);
  349. };
  350. }
  351. });
  352. },
  353. create: function(e) {
  354. $("#extraAttrUsers").data("kendoGrid").dataSource.data().remove($("#extraAttrUsers").data("kendoGrid").dataSource.data()[$("#extraAttrUsers").data("kendoGrid").dataSource.data().length-1]);
  355. $("#extraAttrUsers").data("kendoGrid").dataSource.data().push(
  356. createData
  357. );
  358. return true;
  359. },
  360. destroy: function(e) {
  361. console.log(e)
  362. return true;
  363. }
  364. },
  365. serverPaging: true,
  366. serverSorting: true,
  367. schema: {
  368. data: function(response) {
  369. return response;
  370. },
  371. total: function(response){
  372. return response.length;
  373. },
  374. model: {
  375. id: "userId",
  376. fields: {
  377. userId: { type: "string", editable: false, nullable: false, validation: { required: true }},
  378. userName: { type: "string", editable: false, nullable: false, validation: { required: true }},
  379. hospitalId: { type: "string", nullable: false, validation: { required: true }},
  380. dutyId: { type: "string", nullable: false,validation: { required: true }},
  381. workId: { type: "string", nullable: false, validation: { required: true }}
  382. }
  383. }
  384. }
  385. });
  386. /**
  387. * 그리드 초기화
  388. */
  389. var initGrid = function(){
  390. var grid = $("#extraAttrUsers").kendoGrid({
  391. dataSource : dataSource,
  392. sortable: true,
  393. resizable: true,
  394. toolbar : [{name: "create", text: "추가"}],
  395. columns : [
  396. {field : "userId", title:"사용자ID", attributes: {style: "text-align: center;"}}
  397. ,{field : "userName", title : "이름", attributes: {style: "text-align: center;"}}
  398. ,{field : "hospitalName", title : "소속", attributes: {style: "text-align: center;"}}
  399. ,{field : "dutyName", title : "직무", attributes: {style: "text-align: center;"}}
  400. ,{field : "workName", title : "업무", attributes: {style: "text-align: center;"}}
  401. ,{command : [{name:"destroy",text:"삭제"}], title : "", attributes: {style: "text-align: center;"}}
  402. ],
  403. editable: {
  404. createAt : "bottom",
  405. mode: "popup",
  406. template: $('#popTemplate').html()
  407. },
  408. edit: function(e) {
  409. var editWindow = this.editable.element.data("kendoWindow");
  410. $('.k-edit-form-container').css('width', '580px');
  411. editWindow.wrapper.css({ top: "20%" });
  412. $("div[id=createDataBox]").hide();
  413. popInitGrid();
  414. $("#pop-search").on("click", function(e) {
  415. popSearchUserAttr(e);
  416. });
  417. $("#pop-select-hospital").width(100).kendoDropDownList({
  418. dataSource: hospitalList,
  419. dataTextField: "attrName",
  420. dataValueField: "attrId",
  421. optionLabel: {
  422. attrName: "전체",
  423. attrId: ""
  424. }
  425. });
  426. $("#pop-select-duty").width(100).kendoDropDownList({
  427. dataSource : dutyList,
  428. dataTextField: "attrName",
  429. dataValueField: "attrId",
  430. optionLabel: {
  431. attrName: "전체",
  432. attrId: ""
  433. }
  434. });
  435. $("#pop-select-work").width(100).kendoDropDownList({
  436. dataSource : workList,
  437. dataTextField: "attrName",
  438. dataValueField: "attrId",
  439. optionLabel: {
  440. attrName: "전체",
  441. attrId: ""
  442. }
  443. });
  444. $("#pop-select-user").width(100).kendoDropDownList({
  445. dataSource : searchTypeList,
  446. dataTextField: "attrName",
  447. dataValueField: "attrId",
  448. optionLabel: {
  449. attrName: "전체",
  450. attrId: ""
  451. }
  452. });
  453. },
  454. dataBound: function () {
  455. var rowCount = $extraAttrUsers.find( ".k-grid-content tbody tr" ).length;
  456. if( rowCount < dataSource._take ) {
  457. var addRows = dataSource._take - rowCount;
  458. for( var i = 0; i < addRows; i++ ) {
  459. $extraAttrUsers.find( ".k-grid-content tbody" )
  460. .append( "<tr class='kendo-data-row'><td>&nbsp;</td></tr>" );
  461. }
  462. }
  463. }
  464. }).data("kendoGrid");
  465. function i18nDropDownEditor(container, options) {
  466. $("[data-id='i18nDropDownEditor']:first").clone().attr("data-bind", "value:" + options.field).appendTo(container).kendoDropDownList({autoBind: false});
  467. }
  468. $(".k-button k-button-icontext myCustomClass k-grid-test").click(function() {
  469. alert("Click!");
  470. });
  471. /**
  472. * 파라미터 LOV
  473. */
  474. function reqParamTypeDropDownEditor(container, options) {
  475. $("[data-id='reqParamTypeDropDownEditor']:first").clone().attr("data-bind", "value:" + options.field).appendTo(container).kendoDropDownList({autoBind: false});
  476. }
  477. self.extraAttrUsersGrid = self.grid ( $extraAttrUsers, grid );
  478. };
  479. /**
  480. * 그리드 초기화
  481. */
  482. var popInitGrid = function(){
  483. // 그리드 옵션
  484. var grid = $("#grid3").kendoGrid({
  485. dataSource: popDataSource,
  486. pageable: true,
  487. sortable: true,
  488. resizable: true,
  489. selectable: true,
  490. height: 400,
  491. columns: [
  492. { title: "", width: 30, template: '<input type="radio" name="attrAddUser"/>'}
  493. ,{ field: "userId", title: "아이디", width: 80, attributes: {style: "text-align: center;"}}
  494. ,{ field: "userName", title: "이름", width: 100, attributes: {style: "text-align: center;"}}
  495. ,{ field: "userAttrOrder", title: "순서", width: 50, hidden: true, attributes: {style: "text-align: center;"}}
  496. ,{ field: "hospitalId", title: "소속ID", width: 120, hidden: true, attributes: {style: "text-align: center;"}}
  497. ,{ field: "hospitalName", title: "소속", width: 120, attributes: {style: "text-align: center;"}}
  498. ,{ field: "dutyId", title: "직무ID", width: 120, hidden: true, attributes: {style: "text-align: center;"}}
  499. ,{ field: "dutyName", title: "직무", width: 120, attributes: {style: "text-align: center;"}}
  500. ,{ field: "workId", title: "업무ID", width: 80, hidden: true, attributes: {style: "text-align: center;"}}
  501. ,{ field: "workName", title: "업무", width: 80, attributes: {style: "text-align: center;"}}
  502. ],
  503. change: function(data, arg){
  504. $('input[name=attrAddUser]').removeAttr("checked");
  505. $('input[name=attrAddUser]')[$(this.select()).index()].checked=true
  506. var selected = this.select(),
  507. item = this.dataItem(selected);
  508. $('.k-edit-field input[name="userId"]').val(item.userId);
  509. $('.k-edit-field input[name="hospitalName"]').val(item.hospitalId);
  510. $('.k-edit-field input[name="dutyName"]').val(item.dutyId);
  511. $('.k-edit-field input[name="workName"]').val(item.workId);
  512. createData = item;
  513. },
  514. dataBound: function () {
  515. var rowCount = $('#grid3').find( ".k-grid-content tbody tr" ).length;
  516. if( rowCount < popDataSource._take ) {
  517. var addRows = popDataSource._take - rowCount;
  518. for( var i = 0; i < addRows; i++ ) {
  519. $('#grid3').find( ".k-grid-content tbody" )
  520. .append( "<tr class='kendo-data-row'><td>&nbsp;</td></tr>" );
  521. }
  522. };
  523. }
  524. }).data("kendoGrid");
  525. };
  526. var popDataSource = new kendo.data.DataSource({
  527. transport: {
  528. read: {
  529. url: $attrCrudServiceBaseUrl + "/getList.json",
  530. method: "post",
  531. dataType: "json",
  532. contentType: "application/json",
  533. complete: gridReadComplete
  534. },
  535. parameterMap: function parameterMap( options, operation ){
  536. kendo.ui.progress($("#grid3"), true);
  537. var param = $.extend(true, {}, options, {
  538. hospitalId: $('#pop-select-hospital').val(),
  539. dutyId : $('#pop-select-duty').val(),
  540. workId : $('#pop-select-work').val(),
  541. selectUserType : $('#pop-select-user').val(),
  542. searchText : $('#pop-search-text').val(),
  543. userAttrOrder: "1"
  544. }, null);
  545. console.log(self.util.stringifyJson( param ));
  546. return self.util.stringifyJson( param );
  547. }
  548. },
  549. selectable: "row",
  550. pageSize: 10,
  551. serverPaging: true,
  552. serverSorting: true,
  553. schema: {
  554. data: "data",
  555. total: "totalCount",
  556. model: {
  557. id: "userId",
  558. fields: {
  559. userId: { type: "string", nullable: false, validation: { required: true }},
  560. userName: { type: "string", nullable: false, validation: { required: true }},
  561. userAttrOrder: { type: "string", nullable: false, validation: { required: true }},
  562. hospitalId: { type: "string", nullable: false, validation: { required: true }},
  563. dutyId: { type: "string", nullable: false,validation: { required: true }},
  564. workId: { type: "string", nullable: false, validation: { required: true }}
  565. }
  566. }
  567. }
  568. });
  569. function popSearchUserAttr(e) {
  570. popDataSource.page(1);
  571. };
  572. /**
  573. * 그리드 이벤트 동작 complate
  574. * @private
  575. */
  576. function gridActionComplete( e ){
  577. kendo.ui.progress($(".main-wrapper"), false);
  578. var result = self.util.parseJson( e.responseText );
  579. if( result.msg ){
  580. alert( result.msg );
  581. if( result.type == "AuthException" ){
  582. window.location.href = contextPath + "/admin/logout.page";
  583. return;
  584. }
  585. };
  586. $extraAttrUsers.data("kendoGrid").dataSource.read();
  587. };
  588. /**
  589. * 그리드 이벤트 동작 complate
  590. * @private
  591. */
  592. function gridReadComplete( e ){
  593. var result = self.util.parseJson( e.responseText );
  594. if( result.msg ){
  595. alert( result.msg );
  596. if( result.type == "AuthException" ){
  597. window.location.href = contextPath + "/admin/logout.page";
  598. return;
  599. }
  600. }
  601. };
  602. // 저장하지 않은 아이템 배열
  603. var addedNodeArr = [];
  604. /**
  605. * 트리 저장하지 않은 아이템 확인
  606. */
  607. var addedNodeCheck = function(e, treeViewData) {
  608. if( treeViewData ) {
  609. for( var n = 0; n < treeViewData.length; n++ ) {
  610. var childData = treeViewData[n];
  611. if( childData.addedNode === true ){
  612. addedNodeArr.push( childData );
  613. return;
  614. } else {
  615. var child = childData.items;
  616. if( child ) {
  617. if( child.length > 0 ){
  618. addedNodeCheck( e, child );
  619. }
  620. }
  621. }
  622. }
  623. }
  624. };
  625. };
  626. var rowNum = 0;
  627. function resetRowNum(){
  628. rowNum = 0;
  629. }
  630. function getNum(){
  631. return ++rowNum;
  632. }