//////////////////////////////////////////////////////////////////////////////////////// //Page 전역 변수 //////////////////////////////////////////////////////////////////////////////////////// var dataTableRef; // 데이터테이블 참조 변수 var groupMembersDataTable; var attributesDataTable; var realm = 'master'; // realm 명 var selectedGroup = { id: null, name: null, attributes: {} }; //////////////////////////////////////////////////////////////////////////////////////// //Document Ready //////////////////////////////////////////////////////////////////////////////////////// function execDocReady() { var pluginGroups = [ [ '../reference/light-blue/lib/vendor/jquery.ui.widget.js', '../reference/light-blue/lib/vendor/http_blueimp.github.io_JavaScript-Templates_js_tmpl.js', '../reference/light-blue/lib/vendor/http_blueimp.github.io_JavaScript-Load-Image_js_load-image.js', '../reference/light-blue/lib/vendor/http_blueimp.github.io_JavaScript-Canvas-to-Blob_js_canvas-to-blob.js', '../reference/light-blue/lib/jquery.iframe-transport.js', '../reference/light-blue/lib/jquery.fileupload.js', '../reference/light-blue/lib/jquery.fileupload-fp.js', '../reference/light-blue/lib/jquery.fileupload-ui.js', ], [ '../reference/jquery-plugins/select2-4.0.2/dist/css/select2_lightblue4.css', '../reference/jquery-plugins/lou-multi-select-0.9.12/css/multiselect-lightblue4.css', '../reference/jquery-plugins/multiple-select-1.5.2/dist/multiple-select-bluelight.css', '../reference/jquery-plugins/select2-4.0.2/dist/js/select2.min.js', '../reference/jquery-plugins/lou-multi-select-0.9.12/js/jquery.quicksearch.js', '../reference/jquery-plugins/lou-multi-select-0.9.12/js/jquery.multi-select.js', '../reference/jquery-plugins/multiple-select-1.5.2/dist/multiple-select.min.js', ], [ '../reference/jquery-plugins/datetimepicker-2.5.20/build/jquery.datetimepicker.min.css', '../reference/light-blue/lib/bootstrap-datepicker.js', '../reference/jquery-plugins/datetimepicker-2.5.20/build/jquery.datetimepicker.full.min.js', '../reference/lightblue4/docs/lib/widgster/widgster.js', '../reference/lightblue4/docs/lib/slimScroll/jquery.slimscroll.min.js', '../reference/lightblue4/docs/lib/jquery.sparkline/index.js', '../reference/lightblue4/docs/js/charts.js', //jsTree '../reference/jquery-plugins/jstree-v.pre1.0/jquery.jstree.js', '../arms/js/common/table_new.js', ], [ // datatables(13) '../reference/jquery-plugins/dataTables-1.10.16/media/css/jquery.dataTables_lightblue4.css', '../reference/jquery-plugins/dataTables-1.10.16/extensions/Responsive/css/responsive.dataTables_lightblue4.css', '../reference/jquery-plugins/dataTables-1.10.16/extensions/Select/css/select.dataTables_lightblue4.css', '../reference/jquery-plugins/dataTables-1.10.16/media/js/jquery.dataTables.min.js', '../reference/jquery-plugins/dataTables-1.10.16/extensions/Responsive/js/dataTables.responsive.min.js', '../reference/jquery-plugins/dataTables-1.10.16/extensions/Select/js/dataTables.select.min.js', '../reference/jquery-plugins/dataTables-1.10.16/extensions/RowGroup/js/dataTables.rowsGroup.min.js', '../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/dataTables.buttons.min.js', '../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/buttons.html5.js', '../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/buttons.print.js', '../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/jszip.min.js', '../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/pdfmake.min.js', '../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/vfs_fonts.js', ], // 추가적인 플러그인 그룹들을 이곳에 추가하면 됩니다. ]; loadPluginGroupsParallelAndSequential(pluginGroups) .then(function () { console.log('모든 플러그인 로드 완료'); // 사이드 메뉴 색상 설정 $('.widget').widgster(); setSideMenu('sidebar_menu_security', 'sidebar_menu_security_group'); tabClickEvent(); btnClickEvent(); var waitDataTable = setInterval(function () { try { if (!$.fn.DataTable.isDataTable('#attributesTable')) { clearInterval(waitDataTable); $(document).trigger($.Event('init.attributeTable')); } } catch (err) { console.log('서비스 데이터 테이블 로드가 완료되지 않아서 초기화 재시도 중...'); } }, 313 /*milli*/); // group List 조회 getGroups(); }) .catch(function (error) { console.error('플러그인 로드 중 오류 발생'); console.log(error); }); } // 데이터 테이블 데이터 렌더링 이후 콜백 함수. function dataTableCallBack() { console.log('table Callback'); } function dataTableDrawCallback(tableInfo) { console.log('dataTableDrawCallback => ', tableInfo); } function dataTableClick(tempDataTable, selectedData) { console.log('tempDataTable => ', tempDataTable); console.log('tempDataTable => ', tempDataTable.context[0].sTableId); console.log('selectedData => ', selectedData); if (tempDataTable.context[0].sTableId === 'membersTable') { // 페이지 이동 with userId 함께 let url = '/backoffice/template.html?page=securityUser&userId=' + selectedData.id; // user page 클릭 이벤트 연결 필요 window.location.href = url; } } ///////////////////////////////// // jsTree 선택된 노드 판별 함수 ///////////////////////////////// function isDefaultOrFolderNode() { // root node 선택 또는 아무 노드도 선택하지 않았을 때 if (selectedGroup.id === 'root_id' || selectedGroup.id === null) { return false; } // root 노드 제외하고 선택 else { return true; } } ////////////////////// // Button Click Event ////////////////////// function btnClickEvent() { /* * Group 추가 */ $('#btnGroupCreateSave').on('click', function () { console.log('btnClickEvent :: btnGroupCreateSave is submitted'); let groupName = $('#modalCreateGroupName').val().trim(); if (groupName) { if (isDefaultOrFolderNode()) { createChildGroup(selectedGroup.id, groupName); } else { createGroup(groupName); } } else { jError('그룹 이름을 입력해 주세요.'); } }); /* * Group 삭제 */ // 삭제모달 $('#groupDeleteBtn').on('click', function () { console.log('btnClickEvent :: groupDeleteDtn is submitted'); console.log('selectedGroup.name => ', selectedGroup.name); if (typeof selectedGroup.name === 'object') { $('#modalDeleteGroupName').val(selectedGroup.name.title); } else { $('#modalDeleteGroupName').val(selectedGroup.name); } }); // 삭제 실행 $('#btnGroupDelete').on('click', function () { deleteGroups(selectedGroup.id, selectedGroup.name); }); /* * Group 명 변경 */ $('#name-edit-btn').on('click', function () { console.log('btnClickEvent :: name-edit-btn is submitted'); if ($('#group-name').val() == '' || $('#group-name').val() === selectedGroup.name) { return false; } else { editGroupName(selectedGroup.id, $('#group-name').val()); } }); /* * Role Mappings */ $('#available').on('change', function () { if ($(this).find('option:selected').length > 0) { $('#addSelected').removeAttr('disabled').addClass('btn-primary'); } else { $('#addSelected').attr('disabled', 'disabled').removeClass('btn-primary'); } $('#assigned').prop('selectedIndex', -1); // #assigned의 선택 해제 $('#removeSelected').attr('disabled', 'disabled').removeClass('btn-danger'); }); $('#assigned').on('change', function () { if ($(this).find('option:selected').length > 0) { $('#removeSelected').removeAttr('disabled').addClass('btn-danger'); } else { $('#removeSelected').attr('disabled', 'disabled').removeClass('btn-danger'); } $('#available').prop('selectedIndex', -1); // #available의 선택 해제 $('#addSelected').attr('disabled', 'disabled').removeClass('btn-primary'); }); $('#addSelected').on('click', function () { $('#available option:selected').each(function () { addRoleMapping(realm, selectedGroup.id, $(this).val()); }); if ($('#available option').length === 0) { $('#addSelected').attr('disabled', 'disabled').removeClass('btn-primary'); } $('#assigned').prop('selectedIndex', -1); // #assigned의 선택 해제 $('#addSelected').attr('disabled', 'disabled').removeClass('btn-primary'); $('#removeSelected').attr('disabled', 'disabled').removeClass('btn-danger'); }); $('#removeSelected').on('click', function () { $('#assigned option:selected').each(function () { deleteRoleMapping(realm, selectedGroup.id, $(this).val()); }); if ($('#assigned option').length === 0) { $('#removeSelected').attr('disabled', 'disabled').removeClass('btn-danger'); } $('#available').prop('selectedIndex', -1); // #available의 선택 해제 $('#addSelected').attr('disabled', 'disabled').removeClass('btn-primary'); $('#removeSelected').attr('disabled', 'disabled').removeClass('btn-danger'); }); } ////////////////////// // Tab Click Event ////////////////////// function tabClickEvent() { $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { var target = $(e.target).attr('href'); // activated tab console.log('[ security :: group ] :: target => ' + target); if (target === '#groupSettings') { $('.tab-content .tab-pane').addClass('hidden'); $('#groupSettings').removeClass('hidden'); } else if (target === '#attributes') { $('.tab-content .tab-pane').addClass('hidden'); $('#attributes').removeClass('hidden'); if (!selectedGroup.id) { jError('선택된 그룹이 없습니다. 폴더 또는 일반 그룹을 선택해주세요.'); } else if (selectedGroup.id === 'root_id') { jError('루트를 선택하셨습니다. 폴더 또는 일반 그룹을 선택해주세요.'); } getAttributeInfo(selectedGroup.id); } else if (target === '#roleMappings') { $('.tab-content .tab-pane').addClass('hidden'); $('#roleMappings').removeClass('hidden'); if (!selectedGroup.id) { jError('선택된 그룹이 없습니다. 폴더 또는 일반 그룹을 선택해주세요.'); } else if (selectedGroup.id === 'root_id') { jError('루트를 선택하셨습니다. 폴더 또는 일반 그룹을 선택해주세요.'); } getComposite('master', selectedGroup.id); getAvailableRoles('master', selectedGroup.id); getAssignedRoles('master', selectedGroup.id); } else if (target === '#members') { // 그룹 유저 $('.tab-content .tab-pane').addClass('hidden'); $('#members').removeClass('hidden'); if (!selectedGroup.id) { jError('선택된 그룹이 없습니다. 폴더 또는 일반 그룹을 선택해주세요.'); } else if (selectedGroup.id === 'root_id') { jError('루트를 선택하셨습니다. 폴더 또는 일반 그룹을 선택해주세요.'); } getGroupMembers('master', selectedGroup.id); } }); } function groupMembersTableLoad(tableData) { var columnList = [ { name: 'username', title: 'Username', data: 'username', render: function (data, type, row, meta) { if (isEmpty(data) || data === 'false') { return "
N/A
"; } else { let displayText = data; let color = '#a4c6ff'; // color = "#f8f8f8"; // 기본 텍스트 색상 return "
" + displayText + '
'; } }, className: 'dt-body-left', visible: true, }, { name: 'lastName', title: 'Last Name (Family Name)', data: 'lastName', render: function (data, type, row, meta) { if (isEmpty(data) || data === 'false') { return "
N/A
"; } else { let displayText = data; let color = '#a4c6ff'; // color = "#f8f8f8"; // 기본 텍스트 색상 return "
" + displayText + '
'; } }, className: 'dt-body-left', visible: true, }, { name: 'firstName', title: 'First Name', data: 'firstName', render: function (data, type, row, meta) { if (isEmpty(data) || data === 'false') { return "
N/A
"; } else { let displayText = data; let color = '#a4c6ff'; // color = "#f8f8f8"; // 기본 텍스트 색상 return "
" + displayText + '
'; } }, className: 'dt-body-left', visible: true, }, { name: 'email', title: 'Email', data: 'email', render: function (data, type, row, meta) { if (isEmpty(data) || data === 'false') { return "
N/A
"; } else { let displayText = data; let color = '#a4c6ff'; // color = "#f8f8f8"; // 기본 텍스트 색상 return "
" + displayText + '
'; } }, className: 'dt-body-left', visible: true, }, { name: 'id', title: '', data: 'id', orderable: false, render: function (data, type) { if (type === 'display' && data) { return $(`