Permission.cshtml 5.0 KB

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