user_modal.ejs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <div class="modal fade" id="sel-batch" data-backdrop="static">
  2. <div class="modal-dialog modal-lg" role="document">
  3. <div class="modal-content">
  4. <div class="modal-header">
  5. <h5 class="modal-title">选择账号</h5>
  6. </div>
  7. <div class="modal-body">
  8. <div class="d-flex justify-content-between mb-2">
  9. <div class="col">
  10. <div class="form-inline">
  11. <label for="inputPassword2" class="">单位:</label>
  12. <select class="form-control form-control-sm" style="width:300px" id="sel-batch-unit">
  13. <% for (const g of accountGroup) { %>
  14. <option value="<%- g.name %>"><%- g.name %></option>
  15. <% } %>
  16. </select>
  17. </div>
  18. </div>
  19. <div class="col-5">
  20. <div class="input-group input-group-sm">
  21. <input type="text" class="form-control" placeholder="姓名/职位 搜索" aria-label="姓名/职位 搜索" id="sb-keyword" aria-describedby="sb-search">
  22. <div class="input-group-append">
  23. <button class="btn btn-outline-primary" type="button" id="sb-search"><i class="fa fa-search"></i></button>
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28. <div class="modal-height-500 scroll-y">
  29. <table class="table table-bordered">
  30. <thead><tr class="text-center"><th width="15%"><input type="checkbox" id="sel-batch-all"></th><th width="20%">用户</th><th width="30%">职位</th><th>单位</th></tr></thead>
  31. <tbody id="sel-batch-users"></tbody>
  32. </table>
  33. </div>
  34. <div class="mt-3">
  35. <label class="form-text alert alert-danger">整行灰底显示的账号,请选择左上角的“单位”与之一致,即可勾选。</label>
  36. </div>
  37. </div>
  38. <div class="modal-footer">
  39. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
  40. <button type="button" class="btn btn-sm btn-sm btn-primary" id="sel-batch-ok">确定</button>
  41. </div>
  42. </div>
  43. </div>
  44. </div>
  45. <div class="modal fade" id="permission" data-backdrop="static" style="display: none;" aria-hidden="true">
  46. <div class="modal-dialog modal-xl" role="document">
  47. <div class="modal-content">
  48. <div class="modal-header">
  49. <h5 class="modal-title">编辑权限</h5>
  50. </div>
  51. <div class="modal-body" style="max-height: 800px;overflow: auto;">
  52. <% for (const pb of permissionBlock) { %>
  53. <div class="card mb-2">
  54. <h6 class="card-header">
  55. <%- pb.name %>
  56. <% if (pb.hint) { %>
  57. <div class="btn-group">
  58. <a href="javascript:void(0);" data-toggle="dropdown" title="权限说明" aria-expanded="false"><i class="fa fa-question-circle"></i></a>
  59. <div class="dropdown-menu bg-dark" style="will-change: transform;">
  60. <% for (const i of pb.hint) { %>
  61. <div class="dropdown-item text-light bg-dark"><%- i %></div>
  62. <% } %>
  63. </div>
  64. </div>
  65. <% } %>
  66. </h6>
  67. <div class="card-body permission-parent">
  68. <% if (pb.children) { %>
  69. <% for (const [i, c] of pb.children.entries()) { %>
  70. <% if (i !== 0) { %><hr/><% } %>
  71. <div class="d-flex">
  72. <div class="vertical-align ml-3" style="width:100px"><%- c.name %></div>
  73. <div class="container ml-0">
  74. <div class="row">
  75. <% for (const cp of c.permission) { %>
  76. <div class="col-md-3">
  77. <div class="form-check">
  78. <input class="form-check-input" type="checkbox" name="permission-check" id="icb-<%- c.key %>-<%- cp.value %>" ptype="<%- c.key %>" pvalue="<%- cp.value %>">
  79. <label class="form-check-label" for="icb-<%- c.key %>-<%- cp.value %>"><%- cp.title %></label>
  80. </div>
  81. </div>
  82. <% } %>
  83. </div>
  84. </div>
  85. </div>
  86. <% } %>
  87. <% } else { %>
  88. <div class="d-flex">
  89. <div class="vertical-align ml-3" style="width:100px"><%- pb.name %></div>
  90. <div class="container ml-0">
  91. <div class="row">
  92. <% for (const p of pb.permission) { %>
  93. <div class="col-md-3">
  94. <div class="form-check">
  95. <input class="form-check-input" type="checkbox" name="permission-check" id="icb-<%- pb.key %>-<%- p.value %>" ptype="<%- pb.key %>" pvalue="<%- p.value %>">
  96. <label class="form-check-label" for="icb-<%- pb.key %>-<%- p.value %>"><%- p.title %></label>
  97. </div>
  98. </div>
  99. <% } %>
  100. </div>
  101. </div>
  102. </div>
  103. <% } %>
  104. </div>
  105. </div>
  106. <% } %>
  107. </div>
  108. <div class="modal-footer">
  109. <input type="hidden" id="permission-uid">
  110. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
  111. <button type="button" class="btn btn-sm btn-primary" id="permission-ok">提交修改</button>
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. <div class="modal fade" id="copy-permission" data-backdorp="static" style="display: none" aria-hidden="true">
  117. <div class="modal-dialog modal-lg" role="document">
  118. <div class="modal-content">
  119. <div class="modal-header">
  120. <h5 class="modal-title">拷贝权限</h5>
  121. </div>
  122. <div class="modal-body">
  123. <div class="modal-height-500 scroll-y">
  124. <table class="table table-bordered">
  125. <thead><tr class="text-center"><th width="15%"><input type="checkbox" id="copy-batch-all"></th><th width="20%">用户</th><th width="30%">职位</th><th>单位</th></tr></thead>
  126. <tbody id="copy-batch-users">
  127. </tbody>
  128. </table>
  129. </div>
  130. </div>
  131. <div class="modal-footer">
  132. <input type="hidden" id="source-permission">
  133. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
  134. <button type="button" class="btn btn-sm btn-sm btn-primary" id="copy-batch-ok">确定</button>
  135. </div>
  136. </div>
  137. </div>
  138. </div>
  139. <div class="modal fade" id="copy-user-batch" data-backdorp="static" style="display: none" aria-hidden="true">
  140. <div class="modal-dialog modal-lgx" role="document">
  141. <div class="modal-content">
  142. <div class="modal-header">
  143. <h5 class="modal-title">拷贝权限</h5>
  144. </div>
  145. <div class="modal-body">
  146. <div class="row">
  147. <div class="col-5">
  148. <div class="modal-height-500 scroll-y">
  149. <table class="table table-bordered">
  150. <thead class="text-center" style="position: sticky; top:0; z-index:1;"><tr><th width="15%"><input type="checkbox" id="cub-sp-all"></th><th>项目名称</th></tr></thead>
  151. <tbody>
  152. <% for (const sp of subProjects) { %>
  153. <% if (sp.id === ctx.subProject.id) continue; %>
  154. <tr tree_id="<%- sp.id %>" tree_pid="<%- sp.tree_pid %>" tree_expand="1" tree_leaf="<%- (sp.has_children ? 0 : 1) %>">
  155. <td class="text-center"><input type="checkbox" name="cub-sp-check" tree_is_folder="<%- (sp.is_folder ? 1 : 0) %>" spid="<%- sp.id %>"></td>
  156. <td class="in-<%- sp.tree_level%> d-flex">
  157. <% if (sp.has_children) { %>
  158. <div onselectstart="return false" style="{-moz-user-select:none}" class="fold-switch mr-1 d-inline-block" title="收起" id="<%- sp.id %>"><i class="fa fa-minus-square-o"></i></div>
  159. <% } else { %>
  160. <div class="text-muted mr-1 d-inline-block" style="heigth: 100%"><%- (sp.is_last_sibling ? '└' : '├') %></div>
  161. <% } %>
  162. <div class="d-inline-block"><%- sp.name %></div>
  163. </td>
  164. </tr>
  165. <% } %>
  166. </tbody>
  167. </table>
  168. </div>
  169. </div>
  170. <div class="col">
  171. <div class="modal-height-500 scroll-y">
  172. <table class="table table-bordered">
  173. <thead style="position: sticky; top:0; z-index:1;"><tr class="text-center"><th width="15%"><input type="checkbox" id="cub-user-all"></th><th width="20%">用户</th><th width="30%">职位</th><th>单位</th></tr></thead>
  174. <tbody>
  175. <% for (const u of subProjectAllAccountList) { %>
  176. <tr><td class="text-center"><input type="checkbox" name="cub-user-check" uid="<%- u.id %>"></td><td><%- u.name %></td><td><%- u.role %></td><td><%- u.company %></td></tr>
  177. <% } %>
  178. </tbody>
  179. </table>
  180. </div>
  181. </div>
  182. </div>
  183. </div>
  184. <div class="modal-footer">
  185. <input type="hidden" id="source-permission">
  186. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
  187. <button type="button" class="btn btn-sm btn-sm btn-primary" id="copy-user-batch-ok">确定</button>
  188. </div>
  189. </div>
  190. </div>
  191. </div>
  192. <script>
  193. const setPosterityShow = function(id, show) {
  194. const children = $(`tr[tree_pid=${id}]`);
  195. for (const c of children) {
  196. if (show) {
  197. $(c).show();
  198. } else {
  199. $(c).hide();
  200. }
  201. if (c.getAttribute('tree_leaf') !== '1') {
  202. setPosterityShow(c.getAttribute('tree_id'), c.getAttribute('tree_expand') === '1' && show);
  203. }
  204. }
  205. }
  206. $('body').on('click', '.fold-switch', function() {
  207. const id = this.getAttribute('id');
  208. const nodeTr = $(`tr[tree_id=${id}]`);
  209. const expand = nodeTr.attr('tree_expand') === '1';
  210. nodeTr.attr('tree_expand', expand ? 0 : 1);
  211. if (!expand) {
  212. $(this).html(`<i class="fa fa-minus-square-o"></i>`);
  213. } else {
  214. $(this).html(`<i class="fa fa-plus-square-o"></i>`);
  215. }
  216. setPosterityShow(id, !expand);
  217. });
  218. const setChildrenCheck = function(id, check) {
  219. const children = $(`tr[tree_pid=${id}]`);
  220. for (const c of children) {
  221. $('input', c)[0].checked = check;
  222. if (c.getAttribute('tree_leaf') !== '1') {
  223. setChildrenCheck(c.getAttribute('tree_id'), check);
  224. }
  225. }
  226. }
  227. $('body').on('change', 'input[name=cub-sp-check][tree_is_folder="1"]', function() {
  228. setChildrenCheck(this.getAttribute('spid'), this.checked);
  229. })
  230. </script>