accessRuleEditor.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <!-- Notes: This should be open in its original path-->
  5. <meta charset="utf-8">
  6. <meta name="zoraxy.csrf.Token" content="{{.csrfToken}}">
  7. <link rel="stylesheet" href="../script/semantic/semantic.min.css">
  8. <script src="../script/jquery-3.6.0.min.js"></script>
  9. <script src="../script/semantic/semantic.min.js"></script>
  10. <script src="../script/utils.js"></script>
  11. <style>
  12. #refreshAccessRuleListBtn{
  13. position: absolute;
  14. top: 0.4em;
  15. right: 1em;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <link rel="stylesheet" href="../darktheme.css">
  21. <script src="../script/darktheme.js"></script>
  22. <br>
  23. <div class="ui container">
  24. <div class="ui header">
  25. <div class="content">
  26. Access Rule Editor
  27. <div class="sub header">Create, Edit or Remove Access Rules</div>
  28. </div>
  29. </div>
  30. <div class="ui divider"></div>
  31. <div class="ui top attached tabular menu">
  32. <a class="active item" data-tab="new"><i class="ui green add icon"></i> New</a>
  33. <a class="item" data-tab="edit"><i class="ui grey edit icon"></i> Edit</a>
  34. </div>
  35. <div class="ui bottom attached active tab segment" data-tab="new">
  36. <p>Create a new Access Rule</p>
  37. <form class="ui form" id="accessRuleForm">
  38. <div class="field">
  39. <label>Rule Name</label>
  40. <input type="text" name="accessRuleName" placeholder="Rule Name" required>
  41. </div>
  42. <div class="field">
  43. <label>Description</label>
  44. <textarea name="description" placeholder="Description" required></textarea>
  45. </div>
  46. <button class="ui basic button" type="submit"><i class="ui green add icon"></i> Create</button>
  47. </form>
  48. <br>
  49. </div>
  50. <div class="ui bottom attached tab segment" data-tab="edit">
  51. <p>Select an Access Rule to edit</p>
  52. <button id="refreshAccessRuleListBtn" class="ui circular basic icon button" onclick="reloadAccessRuleList()"><i class="ui green refresh icon"></i></button>
  53. <div class="ui selection fluid dropdown" id="accessRuleSelector">
  54. <input type="hidden" name="targetAccessRule" value="default">
  55. <i class="dropdown icon"></i>
  56. <div class="default text"></div>
  57. <div class="menu" id="accessRuleList">
  58. <div class="item" data-value="default"><i class="ui yellow star icon"></i> Default</div>
  59. </div>
  60. </div>
  61. <br>
  62. <form class="ui form" id="modifyRuleInfo">
  63. <div class="disabled field">
  64. <label>Rule ID</label>
  65. <input type="text" name="accessRuleUUID">
  66. </div>
  67. <div class="field">
  68. <label>Rule Name</label>
  69. <input type="text" name="accessRuleName" placeholder="Rule Name" required>
  70. </div>
  71. <div class="field">
  72. <label>Description</label>
  73. <textarea name="description" placeholder="Description" required></textarea>
  74. </div>
  75. <button class="ui basic button" type="submit"><i class="ui green save icon"></i> Save Changes</button>
  76. <button class="ui basic button" onclick="removeAccessRule(event);"><i class="ui red trash icon"></i> Remove Rule</button>
  77. </form>
  78. </div>
  79. <br>
  80. <button class="ui basic button" style="float: right;" onclick="parent.hideSideWrapper();"><i class="remove icon"></i> Close</button>
  81. <br><br><br>
  82. </div>
  83. <script>
  84. let accessRuleList = [];
  85. $('.dropdown').dropdown();
  86. $('.menu .item').tab();
  87. function handleCreateNewAccessRule(event) {
  88. event.preventDefault(); // Prevent the default form submission
  89. const formData = new FormData(event.target);
  90. const accessRuleName = formData.get('accessRuleName');
  91. const description = formData.get('description');
  92. console.log('Access Rule Name:', accessRuleName);
  93. console.log('Description:', description);
  94. $("#accessRuleForm input[name='accessRuleName']").val("");
  95. $("#accessRuleForm textarea[name='description']").val("");
  96. $.cjax({
  97. url: "/api/access/create",
  98. method: "POST",
  99. data: {
  100. "name": accessRuleName,
  101. "desc": description
  102. },
  103. success: function(data){
  104. if (data.error != undefined){
  105. parent.msgbox(data.error, false);
  106. }else{
  107. parent.msgbox("Access Rule Created", true);
  108. reloadAccessRuleList();
  109. if (parent != undefined && parent.reloadAccessRules != undefined){
  110. parent.reloadAccessRules();
  111. }
  112. }
  113. }
  114. })
  115. }
  116. //Handle on change of the dropdown selection
  117. function handleSelectEditingAccessRule(){
  118. const selectedValue = document.querySelector('#accessRuleSelector').querySelector('input').value;
  119. console.log('Selected Value:', selectedValue);
  120. //Load the information from list
  121. loadAccessRuleInfoIntoEditFields(selectedValue);
  122. }
  123. //Load the access rules information into the fields
  124. function loadAccessRuleInfoIntoEditFields(targetAccessRuleUUID){
  125. var targetAccessRule = undefined;
  126. for (var i = 0; i < accessRuleList.length; i++){
  127. let thisAccessRule = accessRuleList[i];
  128. if (thisAccessRule.ID == targetAccessRuleUUID){
  129. targetAccessRule = thisAccessRule;
  130. }
  131. }
  132. if (targetAccessRule == undefined){
  133. //Target exists rule no longer exists
  134. return;
  135. }
  136. let accessRuleID = targetAccessRule.ID;
  137. let accessRuleName = targetAccessRule.Name;
  138. let accessRuleDesc = targetAccessRule.Desc;
  139. //Load the information into the form input field
  140. //Load the information into the form input field
  141. document.querySelector('#modifyRuleInfo input[name="accessRuleUUID"]').value = accessRuleID;
  142. document.querySelector('#modifyRuleInfo input[name="accessRuleName"]').value = accessRuleName;
  143. document.querySelector('#modifyRuleInfo textarea[name="description"]').value = accessRuleDesc;
  144. }
  145. //Bind events to modify rule form
  146. document.getElementById('modifyRuleInfo').addEventListener('submit', function(event){
  147. event.preventDefault(); // Prevent the default form submission
  148. const accessRuleUUID = document.querySelector('#modifyRuleInfo input[name="accessRuleUUID"]').value;
  149. const accessRuleName = document.querySelector('#modifyRuleInfo input[name="accessRuleName"]').value;
  150. const description = document.querySelector('#modifyRuleInfo textarea[name="description"]').value;
  151. console.log('Access Rule UUID:', accessRuleUUID);
  152. console.log('Access Rule Name:', accessRuleName);
  153. console.log('Description:', description);
  154. $.cjax({
  155. url: "/api/access/update",
  156. method: "POST",
  157. data: {
  158. "id":accessRuleUUID,
  159. "name":accessRuleName,
  160. "desc":description
  161. },
  162. success: function(data){
  163. if (data.error != undefined){
  164. parent.msgbox(data.error, false);
  165. }else{
  166. parent.msgbox("Access rule updated", true);
  167. initAccessRuleList(function(){
  168. $("#accessRuleSelector").dropdown("set selected", accessRuleUUID);
  169. loadAccessRuleInfoIntoEditFields(accessRuleUUID);
  170. });
  171. if (parent != undefined && parent.reloadAccessRules != undefined){
  172. parent.reloadAccessRules();
  173. }
  174. }
  175. }
  176. })
  177. });
  178. function initAccessRuleList(callback=undefined){
  179. $.get("/api/access/list", function(data){
  180. if (data.error == undefined){
  181. $("#accessRuleList").html("");
  182. data.forEach(function(rule){
  183. let icon = `<i class="ui grey filter icon"></i>`;
  184. if (rule.ID == "default"){
  185. icon = `<i class="ui yellow star icon"></i>`;
  186. }else if (rule.BlacklistEnabled && !rule.WhitelistEnabled){
  187. //This is a blacklist filter
  188. icon = `<i class="ui red filter icon"></i>`;
  189. }else if (rule.WhitelistEnabled && !rule.BlacklistEnabled){
  190. //This is a whitelist filter
  191. icon = `<i class="ui green filter icon"></i>`;
  192. }
  193. $("#accessRuleList").append(`<div class="item" data-value="${rule.ID}">${icon} ${rule.Name}</div>`);
  194. });
  195. accessRuleList = data;
  196. $(".dropdown").dropdown();
  197. if (callback != undefined){
  198. callback();
  199. }
  200. }
  201. })
  202. }
  203. initAccessRuleList(function(){
  204. $("#accessRuleSelector").dropdown("set selected", "default");
  205. loadAccessRuleInfoIntoEditFields("default");
  206. });
  207. function reloadAccessRuleList(){
  208. initAccessRuleList(function(){
  209. $("#accessRuleSelector").dropdown("set selected", "default");
  210. loadAccessRuleInfoIntoEditFields("default");
  211. });
  212. }
  213. function removeAccessRule(event){
  214. event.preventDefault();
  215. event.stopImmediatePropagation();
  216. let accessRuleUUID = $("#modifyRuleInfo input[name='accessRuleUUID']").val();
  217. if (accessRuleUUID == ""){
  218. return;
  219. }
  220. if (accessRuleUUID == "default"){
  221. parent.msgbox("Default access rule cannot be removed", false);
  222. return;
  223. }
  224. let accessRuleName = $("#modifyRuleInfo input[name='accessRuleName']").val();
  225. if (confirm("Confirm removing access rule " + accessRuleName + "?")){
  226. $.cjax({
  227. url: "/api/access/remove",
  228. data: {
  229. "id": accessRuleUUID
  230. },
  231. method: "POST",
  232. success: function(data){
  233. if (data.error != undefined){
  234. parent.msgbox(data.error, false);
  235. }else{
  236. parent.msgbox("Access rule removed", true);
  237. reloadAccessRuleList();
  238. if (parent != undefined && parent.reloadAccessRules != undefined){
  239. parent.reloadAccessRules();
  240. }
  241. }
  242. }
  243. })
  244. }
  245. }
  246. document.getElementById('accessRuleSelector').addEventListener('change', handleSelectEditingAccessRule);
  247. document.getElementById('accessRuleForm').addEventListener('submit', handleCreateNewAccessRule);
  248. </script>
  249. </body>
  250. </html>