accessRuleEditor.html 10 KB

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