editgroup.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <html>
  2. <head>
  3. <title>Edit Group</title>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=no">
  6. <link rel="stylesheet" href="../../script/tocas/tocas.css">
  7. <link rel="stylesheet" href="../../script/semantic/semantic.css">
  8. <link rel="stylesheet" href="../../script/ao.css">
  9. <script type="text/javascript" src="../../script/jquery.min.js"></script>
  10. <script type="text/javascript" src="../../script/semantic/semantic.js"></script>
  11. <script type="text/javascript" src="../../script/ao_module.js"></script>
  12. <style>
  13. body{
  14. background-color:white;
  15. }
  16. .themebackground{
  17. background-color:#588ce0 !important;
  18. color:white !important;
  19. background-image: url("/img/public/slate.png") !important;
  20. background-repeat: no-repeat !important;
  21. background-attachment: fixed !important;
  22. }
  23. .required{
  24. color:red;
  25. }
  26. .actionbtns{
  27. text-align:right;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div class="ts heading fluid padded slate themebackground" >
  33. <span class="header">
  34. <i class="users icon"></i> Edit Users Group</span>
  35. <span class="description">Fill in the following group information to proceed.</span>
  36. </div>
  37. <br>
  38. <div class="ui container">
  39. <div id="confirmUpdate" class="ui green inverted segment" style="display:none; margin-top:12px;">
  40. <i class="checkmark icon"></i> Group Permissions Updated
  41. </div>
  42. <div class="ui horizontal form">
  43. <div class="field">
  44. <label>Group Name <span class="required">(READ ONLY)</span></label>
  45. <input id="groupname" class="disabled" type="text" readonly="true">
  46. </div>
  47. <div class="two fields">
  48. <div class="field">
  49. <label>Default Storage Quota <span class="required">*</span></label>
  50. <input id="quota" type="text" value="15">
  51. </div>
  52. <div class="field">
  53. <label>Unit <span class="required">*</span></label>
  54. <select class="ui fluid search dropdown" id="unit">
  55. <option value="1">Bytes</option>
  56. <option value="1024">KB</option>
  57. <option value="1048576">MB</option>
  58. <option value="1073741824">GB</option>
  59. <option value="1099511627776">TB</option>
  60. <option value="1125899906842624">PB</option>
  61. </select>
  62. </div>
  63. </div>
  64. <div class="field">
  65. <label>Default Interface Module <span class="required">*</span></label>
  66. <div class="ui fluid selection dropdown">
  67. <input type="hidden" name="dim">
  68. <i class="dropdown icon"></i>
  69. <div class="default text">Select Interface Module</div>
  70. <div class="menu" id="interfaceModuleList">
  71. </div>
  72. </div>
  73. <small>The module that the user land once they logged in. Default Desktop</small>
  74. </div>
  75. <div class="field">
  76. <label>Allow Access <span class="required">*</span></label>
  77. <select id="allowAccessList" multiple="" class="ui fluid dropdown">
  78. </select>
  79. <small>Allow this user group to access the selected modules and their APIs.</small>
  80. </div>
  81. <div class="field">
  82. <div class="ui checkbox">
  83. <input id="setAsAdmin" type="checkbox" tabindex="0" class="">
  84. <label>Assign Administrator Privileges to Group</label>
  85. </div>
  86. </div>
  87. <div class="ui divider"></div>
  88. <table class="ts celled striped table">
  89. <thead>
  90. <tr>
  91. <th >#</th>
  92. <th>Module Name</th>
  93. </tr>
  94. </thead>
  95. <tbody id="selectedModuleList">
  96. </tbody>
  97. </table>
  98. <div class="ui divider"></div>
  99. <div align="right">
  100. <button class="ui primary button" onclick="updateGroup();">Update</button>
  101. <button id="cancelbtn" class="ui button" onclick="cancel();">Close</button>
  102. </div>
  103. <div id="errorbox" class="ui inverted red segment" style="display:none;">
  104. <p><i class="remove icon"></i><span class="errormessage"></span></p>
  105. </div>
  106. </div>
  107. <br><br>
  108. </div>
  109. <script>
  110. var selectedModules = [];
  111. var moduleList = [];
  112. if (window.location.hash.length == 0){
  113. //Invalid use of editor
  114. window.location.href = "../closeTabInsturction.html";
  115. }
  116. var targetUserGroup = window.location.hash.substr(1);
  117. targetUserGroup = JSON.parse(decodeURIComponent(targetUserGroup));
  118. var originalGroupData;
  119. function bytesToSize(bytes) {
  120. var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];
  121. if (bytes == 0) return '0 Byte';
  122. var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
  123. return [bytes / Math.pow(1024, i), sizes[i]];
  124. }
  125. //Init functions
  126. initModuleList(function(){
  127. //Set the contents of the selector to the current group one
  128. $('.ui.checkbox').checkbox();
  129. $.ajax({
  130. url: "../../system/permission/editgroup?list=true",
  131. data: {groupname: targetUserGroup},
  132. success: function(data){
  133. console.log(data);
  134. originalGroupData = data;
  135. if (data.error !== undefined){
  136. alert(data.error);
  137. }else{
  138. $("#groupname").val(data.Name);
  139. $("#interfaceModuleList").parent().dropdown("set selected",data.DefaultInterfaceModule);
  140. //Set accessable module list
  141. if (data.AccessibleModules.length > 0 && data.AccessibleModules[0] == "*"){
  142. $("#allowAccessList").parent().hide();
  143. $("#allowAccessList").parent().after("<p>This account has been set to have all permissions to all modules</p>");
  144. selectedModules = moduleList;
  145. renderSelectedModuleList();
  146. }else{
  147. $("#allowAccessList").dropdown("set selected",data.AccessibleModules);
  148. }
  149. //Set storage quota
  150. var defaultStorage = bytesToSize(data.DefaultStorageQuota);
  151. if (data.DefaultStorageQuota == -1){
  152. defaultStorage[0] = -1;
  153. }
  154. if (data.Quota == -1){
  155. $("#quota").val(-1);
  156. }else{
  157. $("#quota").val(defaultStorage[0]);
  158. $("#unit").dropdown("set selected",defaultStorage[1])
  159. }
  160. //Check admin checkbox
  161. if (data.IsAdmin == true){
  162. $("#setAsAdmin").parent().checkbox("check");
  163. }else{
  164. $("#setAsAdmin").parent().checkbox("uncheck");
  165. }
  166. }
  167. }
  168. })
  169. });
  170. $(".ui.dropdown").dropdown();
  171. $("#unit").dropdown("set selected","GB");
  172. function updateGroup(){
  173. var groupname = originalGroupData.Name;
  174. //Continue to create usergroup
  175. targetModuleList = [];
  176. if (originalGroupData.AccessibleModules[0] == "*"){
  177. //Continue to use * as the accessable modules
  178. targetModuleList = originalGroupData.AccessibleModules;
  179. }else{
  180. for (var i =0; i < selectedModules.length; i++){
  181. targetModuleList.push(selectedModules[i].Name);
  182. }
  183. }
  184. var defaultStorageSize = parseFloat($("#quota").val()) * $("#unit").val();
  185. if (isNaN(defaultStorageSize)){
  186. $("#quota").parent().addClass("error");
  187. return
  188. }else{
  189. $("#quota").parent().removeClass("error");
  190. }
  191. if ($("#quota").val() == -1){
  192. defaultStorageSize = -1;
  193. }
  194. var interfaceModule = $("#interfaceModuleList").parent().dropdown("get value");
  195. if (interfaceModule == ""){
  196. interfaceModule = "Desktop";
  197. }
  198. //Send Request to server side
  199. $.ajax({
  200. url: "../../system/permission/editgroup",
  201. data: {
  202. "groupname": groupname,
  203. "permission": JSON.stringify(targetModuleList),
  204. "isAdmin": $("#setAsAdmin").is(":checked"),
  205. "defaultQuota": defaultStorageSize,
  206. "interfaceModule": interfaceModule,
  207. },
  208. traditional: true,
  209. method: "POST",
  210. success: function(data){
  211. if (data.error !== undefined){
  212. $("#errorbox").slideDown("fast");
  213. $("#errorbox").find(".errormessage").text(data.error);
  214. }else{
  215. $("#confirmUpdate").stop().finish().slideDown("fast").delay(3000).slideUp("fast");
  216. ao_module_parentCallback(true);
  217. window.scrollTo(0,0);
  218. //ao_module_close();
  219. }
  220. }
  221. })
  222. }
  223. function initModuleList(callback=undefined){
  224. $("#interfaceModuleList").html("");
  225. var firstInterfaceModule = null;
  226. $.get("../../system/modules/list",function(data){
  227. if (data.error !== undefined){
  228. alert(data.error);
  229. }else{
  230. for (var i =0; i < data.length; i++){
  231. if (data[i].StartDir !== "" && data[i].Group != "Interface Module"){
  232. $("#allowAccessList").append(`<option value="${data[i].Name}" icon="${data[i].IconPath}">${data[i].Name}</option>`);
  233. }else if (data[i].Group == "Interface Module"){
  234. //Add to interface module list
  235. $("#interfaceModuleList").append(`
  236. <div class="item" data-value="${data[i].Name}">
  237. <img class="ui mini avatar image" style="border-radius: 0px !important;" src="../../${data[i].IconPath}">
  238. ${data[i].Name}
  239. </div>
  240. `);
  241. if (firstInterfaceModule == null){
  242. firstInterfaceModule = data[i].Name;
  243. }
  244. }else{
  245. //Utlities modules. Always allow access
  246. }
  247. }
  248. //Select the first interface modules
  249. $("#interfaceModuleList").parent().dropdown();
  250. $("#interfaceModuleList").parent().dropdown("set selected",firstInterfaceModule);
  251. moduleList = data;
  252. if (callback !== undefined){
  253. //Handle callback events
  254. callback();
  255. }
  256. }
  257. });
  258. $("#allowAccessList").on("change", function(e){
  259. var currentSelected = $(this).val();
  260. selectedModules = [];
  261. moduleList.forEach(mod => {
  262. if (currentSelected.includes(mod.Name)){
  263. selectedModules.push(mod);
  264. }
  265. });
  266. renderSelectedModuleList();
  267. });
  268. }
  269. renderSelectedModuleList();
  270. function renderSelectedModuleList(){
  271. $("#selectedModuleList").html("");
  272. for (var i = 0; i < selectedModules.length; i++){
  273. $("#selectedModuleList").append(`<tr>
  274. <td class="collapsing"><img class="ui mini image" src="../../${selectedModules[i].IconPath}"/></td>
  275. <td>${selectedModules[i].Name}</td>
  276. </tr>`);
  277. }
  278. if (selectedModules.length == 0){
  279. $("#selectedModuleList").append(`<tr>
  280. <td class="collapsing"><img class="ui mini image" src="img/nomodule.png"></img></td>
  281. <td>No Module Selected</td>
  282. </tr>`);
  283. }
  284. }
  285. function cancel(){
  286. ao_module_close();
  287. }
  288. </script>
  289. </body>
  290. </html>