Permission.cshtml 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. @page
  2. @model Admin.Pages.Director.Role.PermissionModel
  3. @{
  4. ViewData["Title"] = $"{Model.Role.RoleName}의 권한";
  5. }
  6. <div class="container">
  7. <partial name="_StatusMessage" />
  8. <form name="f_admin_write" id="fAdminWrite" method="post" accept-charset="utf-8" autocomplete="off">
  9. <input type="hidden" asp-for="Role.RoleID" />
  10. <input type="hidden" asp-for="Role.RoleName" />
  11. <div asp-validation-summary="All" class="text-danger"></div>
  12. <div class="row">
  13. <div class="col">
  14. <h2>@ViewData["Title"]</h2>
  15. 권한을 추가하거나 회수할 수 있습니다. <ins>Create: 읽기, View: 열람, Edit: 수정, Delete: 삭제</ins>
  16. </div>
  17. <div class="col-auto align-self-end">
  18. <button type="submit" class="btn btn-success">저장</button>
  19. <a asp-page="/Director/Role/Index" class="btn btn-secondary">취소</a>
  20. </div>
  21. </div>
  22. <hr />
  23. <div class="flex">
  24. @if (Model.Role != null)
  25. {
  26. @for (int i = 0; i < Model.Role.RoleClaims.Count; i++)
  27. {
  28. var group = Model.Role.RoleClaims[i];
  29. var isAllChecked = group.IsAllSelected ? "checked" : "";
  30. var IsPartialSelected = group.IsPartialSelected ? "data-indeterminate=\"true\"" : "";
  31. <div class="mb-2 border p-3 rounded shadow-sm">
  32. <div class="form-check">
  33. <input type="checkbox" id="grp-@i" class="form-check-input group-toggle mr-1" data-group="@group.GroupName" @isAllChecked @IsPartialSelected />
  34. <label for="grp-@i" class="font-semibold mb-2">
  35. @group.GroupName 전체 선택
  36. </label>
  37. </div>
  38. <div class="row row-cols-1 row-cols-sm-2 row-cols-md-4">
  39. @for (int j = 0; j < group.Permissions.Count; j++)
  40. {
  41. var perm = group.Permissions[j].DisplayValue?.Split('.') ?? Array.Empty<string>();
  42. var menuName = perm.Length > 1 ? perm[1] : string.Empty;
  43. var menuID = perm.Length > 2 ? perm[2] : string.Empty;
  44. var permission = perm.Length > 3 ? perm[3] : string.Empty;
  45. <div class="col">
  46. <div class="form-check m-1">
  47. <input type="hidden" name="Role.RoleClaims[@i].Permissions[@j].DisplayValue" value="@group.Permissions[j].DisplayValue" />
  48. <input type="hidden" name="Role.RoleClaims[@i].GroupName" value="@group.GroupName" />
  49. <input type="checkbox"
  50. name="Role.RoleClaims[@i].Permissions[@j].IsSelected"
  51. value="true"
  52. class="form-check-input perm-checkbox"
  53. data-group="@group.GroupName"
  54. id="chk-@i-@j"
  55. @(group.Permissions[j].IsSelected ? "checked" : "") />
  56. <label class="form-check-label" for="chk-@i-@j">
  57. @menuName - <span class="badge text-bg-light border">@permission</span>
  58. </label>
  59. </div>
  60. </div>
  61. }
  62. </div>
  63. </div>
  64. }
  65. } else {
  66. <div class="alert alert-warning">권한 정보가 없습니다.</div>
  67. }
  68. </div>
  69. <div class="card-footer text-center p-4">
  70. <button type="submit" class="btn btn-success">저장</button>
  71. <a asp-page="/Director/Role/Index" class="btn btn-secondary">취소</a>
  72. </div>
  73. <br />
  74. </form>
  75. </div>
  76. @section Scripts {
  77. <script>
  78. document.querySelectorAll('.group-toggle').forEach(groupCheckbox => {
  79. if (groupCheckbox.dataset.indeterminate === "true") {
  80. groupCheckbox.indeterminate = true;
  81. }
  82. groupCheckbox.addEventListener('change', (e) => {
  83. const group = e.target.dataset.group;
  84. const isChecked = e.target.checked;
  85. console.log(group);
  86. document.querySelectorAll(`.perm-checkbox[data-group="${group}"]`).forEach(cb => {
  87. cb.checked = isChecked;
  88. });
  89. });
  90. });
  91. </script>
  92. }