This portal only for GCC Officers. Based on there roles and Group ID they can view there module`s Like PGR, QR Public Asset Feedback, Makkalai Thedi Mayor,etc...
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

272 lines
11 KiB

​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head th:replace="~{fragments/modules/base/head :: head}"></head>
  4. <body>
  5. <!--[if lt IE 8]>
  6. <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
  7. <![endif]-->
  8. <div class="wrapper">
  9. <!-- header top menu Start -->
  10. <header th:replace="~{fragments/modules/base/header :: header}"></header>
  11. <!-- header top menu end -->
  12. <div class="page-wrap">
  13. <!--=============== Left Menu side Start ================-->
  14. <div th:replace="~{fragments/modules/base/menu :: menu}"></div>
  15. <!--=============== Left side End ================-->
  16. <div class="main-content">
  17. <div class="container-fluid">
  18. <div class="page-header">
  19. <div class="row align-items-end">
  20. <div class="col-lg-8">
  21. <div class="page-header-title">
  22. <i class="fa fa-id-badge bg-blue"></i>
  23. <div class="d-inline">
  24. <h5>User Group Access</h5>
  25. <span>GCC Application Configuration</span>
  26. </div>
  27. </div>
  28. </div>
  29. <div class="col-lg-4">
  30. <nav class="breadcrumb-container" aria-label="breadcrumb">
  31. <ol class="breadcrumb">
  32. <li class="breadcrumb-item">
  33. <a href="index"><i class="ik ik-home"></i></a>
  34. </li>
  35. <li class="breadcrumb-item" aria-current="page">Admin</li>
  36. <li class="breadcrumb-item active" aria-current="page">User Group Access</li>
  37. </ol>
  38. </nav>
  39. </div>
  40. </div>
  41. </div>
  42. <p></p>
  43. <div class="row">
  44. <div class="col-md-12">
  45. <div class="card">
  46. <div class="card-header">
  47. <div class="row">
  48. <div class="col-md-12"></div>
  49. <div class="input-group col-md-12 mb-0">
  50. <label for="search_groupid" class="pt-2"> User Group: &nbsp;</label>
  51. <select class="form-control select2" id="search_groupid" name="search_groupid">
  52. <option value="">Please choose a User Group Name to retrieve data.</option>
  53. <option th:each="userGroup: ${userGroupList}" th:value="${userGroup.id}" th:text="${userGroup.name}">-</option>
  54. </select>
  55. <span class="input-group-append">
  56. <button type="button" id="groupSearchbtn" class="btn btn-success" onclick="showAccessTree();" data-toggle="tooltip" data-animation="true" data-placement="top" data-original-title="Search" title="">
  57. <i class="ik ik-search me-1"></i> Search
  58. </button>
  59. </span>
  60. </div>
  61. </div>
  62. </div>
  63. <div class="card-body">
  64. <div class="col-sm-12">
  65. <div id="loadaccesstree"></div>
  66. <!-- <div th:utext="${accessHTML}"></div> -->
  67. </div>
  68. </div>
  69. <div class="card-footer">
  70. <div class="col-sm-12 text-right">
  71. <button type="reset" class="btn btn-secondary btn-sm" data-dismiss="modal" onclick="return closeModel();"><i class="ik ik-x-square"></i>Close</button>
  72. <button type="submit" class="btn btn-success btn-sm" id="savebtn" onclick="return getCheckedData()"><i class="ik ik-save"></i>Save</button>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. </div>
  79. </div>
  80. <footer th:replace="~{fragments/modules/base/footer :: footer}"></footer>
  81. </div>
  82. </div>
  83. <div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
  84. <script th:replace="~{fragments/modules/base/script :: script}"></script>
  85. <script>
  86. (function($){
  87. $.fn.extend({
  88. // Tree Check By Paranet (Check All)
  89. checktree: function(){
  90. $(this)
  91. .addClass('checktree-root')
  92. .on('change', 'input[type="checkbox"]', function(e){
  93. e.stopPropagation();
  94. e.preventDefault();
  95. checkParents($(this));
  96. checkChildren($(this));
  97. })
  98. ;
  99. var checkParents = function (c)
  100. {
  101. var parentLi = c.parents('ul:eq(0)').parents('li:eq(0)');
  102. if (parentLi.length)
  103. {
  104. var siblingsChecked = parseInt($('input[type="checkbox"]:checked', c.parents('ul:eq(0)')).length),
  105. rootCheckbox = parentLi.find('input[type="checkbox"]:eq(0)')
  106. ;
  107. if (c.is(':checked'))
  108. rootCheckbox.prop('checked', true)
  109. else if (siblingsChecked === 0)
  110. rootCheckbox.prop('checked', false);
  111. checkParents(rootCheckbox);
  112. }
  113. }
  114. var checkChildren = function (c)
  115. {
  116. var childLi = $('ul li input[type="checkbox"]', c.parents('li:eq(0)'));
  117. if (childLi.length)
  118. childLi.prop('checked', c.is(':checked'));
  119. }
  120. }
  121. });
  122. })(jQuery);
  123. callMenuTreeAccess = function(groupId,groupName){
  124. const loadaccesstree = $("#loadaccesstree");
  125. const searchBtn = $("#groupSearchbtn");
  126. const savebtn = $("#savebtn");
  127. const apiUrl = "/gcc/api/getAccessTree?groupId="+groupId+"&groupName="+groupName;
  128. $.ajax({
  129. url: apiUrl,
  130. type: 'GET',
  131. dataType: 'text',
  132. success: function(Response) {
  133. // Handle the API response data here
  134. //console.log('Data from API:', Response);
  135. // Parse the JSON response into a JavaScript object
  136. var data = Response;
  137. if(data.ResultStatus=="False")
  138. {
  139. loadaccesstree.html("<center>"+nodata(data.Message)+"</center>");
  140. searchBtn.prop("disabled", false);
  141. searchBtn.html('<i class="ik ik-search me-1"></i> Search');
  142. }
  143. else{
  144. loadaccesstree.html(data);
  145. $('#tree').checktree();
  146. // Enable the button
  147. searchBtn.prop("disabled", false);
  148. searchBtn.html('<i class="ik ik-search me-1"></i> Search');
  149. savebtn.prop("disabled", false);
  150. }
  151. },
  152. error: function(xhr, status, error) {
  153. // Handle errors here
  154. console.error('Error fetching data:', xhr.status, error);
  155. if (xhr.status == 404) {
  156. // Handle 404 error specifically
  157. loadaccesstree.html(nodata("<b>Unable to fetch data. Please try again later.<br>Error 404: Resource not found. Please check the URL.</b>"));
  158. } else {
  159. // Handle other errors
  160. loadaccesstree.html(nodata("<b>Error: Unable to fetch data. Please try again later.</b>"));
  161. }
  162. // Enable the button
  163. searchBtn.prop("disabled", false);
  164. searchBtn.html('<i class="ik ik-search me-1"></i> Search');
  165. }
  166. });
  167. }
  168. // Load Access Tree
  169. showAccessTree = function(){
  170. const loadaccesstree = $("#loadaccesstree");
  171. const selectedGroup = $('#search_groupid');
  172. const selectedGroupId = selectedGroup.val();
  173. const selectedGroupName = selectedGroup.find('option:selected').text();
  174. const searchBtn = $("#groupSearchbtn");
  175. const savebtn = $("#savebtn");
  176. call_loading('loadaccesstree','start');
  177. savebtn.prop("disabled", true); // Stop Save button
  178. if(selectedGroupId>0){
  179. // Disable the button to prevent multiple clicks
  180. searchBtn.prop("disabled", true);
  181. // Show the loading icon on the button
  182. searchBtn.html('<i class="fas fa-spinner fa-spin"></i>');
  183. callMenuTreeAccess(selectedGroupId,selectedGroupName);
  184. }
  185. else{
  186. loadaccesstree.html(searchinfo("<b>Please select and search for a User Group to continue.</b>"));
  187. }
  188. }
  189. showAccessTree();
  190. var getCheckedData = function() {
  191. var checkedData = [];
  192. $('input[type="checkbox"]:checked', "#tree").each(function() {
  193. checkedData.push($(this).val());
  194. });
  195. // Push Group ID
  196. const selectedGroup = $('#search_groupid');
  197. const selectedGroupId = selectedGroup.val();;
  198. console.log(checkedData);
  199. submitCheckedData(checkedData,selectedGroupId);
  200. return false;//checkedData;
  201. };
  202. var submitCheckedData = function(checkedData, groupId) {
  203. // Perform your AJAX request here using checkedData
  204. // Replace the URL and other options with your actual API endpoint and data
  205. const apiUrl = "/gcc/api/saveGroupAccessData";
  206. const selectedGroup = $('#search_groupid');
  207. const selectedGroupName = selectedGroup.find('option:selected').text();
  208. $.ajax({
  209. url: apiUrl,
  210. type: 'POST',
  211. contentType: 'application/json',
  212. data: JSON.stringify({ checkedData: checkedData, groupId: groupId }),
  213. success: function(response) {
  214. // Handle the success response
  215. console.log('API response:', response);
  216. Swal.fire(
  217. 'User Group Access!',
  218. 'Access has been successfully mapped to the User Group (' + selectedGroupName + ')!',
  219. 'success'
  220. ).then(() => {
  221. location.reload();
  222. });
  223. },
  224. error: function(error) {
  225. // Handle the error response
  226. console.error('API error:', error);
  227. }
  228. });
  229. };
  230. </script>
  231. </body>
  232. </html>