Index.cshtml 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. @page
  2. @using Domain.Entities.Developers.ValueObject
  3. @model Admin.Pages.Developers.Apps.IndexModel
  4. @{
  5. ViewData["Title"] = "개발자 앱 관리";
  6. }
  7. <div class="container-fluid">
  8. <h3>@ViewData["Title"]</h3>
  9. <hr />
  10. <partial name="_StatusMessage" />
  11. <form id="fAdminSearch" method="get">
  12. <div class="row g-2 align-items-end">
  13. <div class="col-6 col-sm-auto">
  14. <select name="status" id="status" class="form-select">
  15. <option value="">상태 전체</option>
  16. <option value="@((int)ApplicationStatus.Pending)" selected="@(Model.Query.Status == ApplicationStatus.Pending)">대기</option>
  17. <option value="@((int)ApplicationStatus.Active)" selected="@(Model.Query.Status == ApplicationStatus.Active)">활성</option>
  18. <option value="@((int)ApplicationStatus.Suspended)" selected="@(Model.Query.Status == ApplicationStatus.Suspended)">정지</option>
  19. <option value="@((int)ApplicationStatus.Rejected)" selected="@(Model.Query.Status == ApplicationStatus.Rejected)">거부</option>
  20. </select>
  21. </div>
  22. <div class="col-12 col-sm col-md col-lg-auto">
  23. <input type="text" name="keyword" class="form-control" maxlength="100" value="@Model.Query.Keyword" placeholder="앱 이름/설명" />
  24. </div>
  25. <div class="col-12 col-lg-auto">
  26. <button type="submit" class="btn btn-primary">검색</button>
  27. </div>
  28. </div>
  29. </form>
  30. <hr />
  31. <form id="fAdminList" method="post">
  32. <div class="row g-2 align-items-end mb-2">
  33. <div class="col">Total: @Model.Total.ToString("N0")</div>
  34. <div class="col-auto">
  35. <button type="submit" asp-page-handler="Approve" class="btn btn-success">선택 승인</button>
  36. <button type="submit" asp-page-handler="Suspend" class="btn btn-warning">선택 정지</button>
  37. </div>
  38. </div>
  39. <div class="table-responsive">
  40. <table class="table table-bordered table-hover">
  41. <thead>
  42. <tr>
  43. <th style="width:40px"><input type="checkbox" id="checkedAll" class="form-check-input" /></th>
  44. <th>ID</th>
  45. <th>앱 이름</th>
  46. <th>소유자</th>
  47. <th>Cred</th>
  48. <th>상태</th>
  49. <th>생성일</th>
  50. <th>승인일</th>
  51. </tr>
  52. </thead>
  53. <tbody>
  54. @if (Model.List.Count <= 0)
  55. {
  56. <tr>
  57. <td colspan="8" class="text-center text-muted py-4">No Data.</td>
  58. </tr>
  59. }
  60. else
  61. {
  62. @foreach (var row in Model.List)
  63. {
  64. <tr>
  65. <td><input type="checkbox" name="ids" value="@row.ID" class="form-check-input"/></td>
  66. <td>@row.ID</td>
  67. <td><a asp-page="/Developers/Apps/Detail" asp-route-id="@row.ID">@row.Name</a></td>
  68. <td>@row.OwnerEmail (@(row.OwnerName ?? "-"))</td>
  69. <td>@row.CredentialCount</td>
  70. <td>@row.Status</td>
  71. <td>@row.CreatedAt.ToString("yyyy-MM-dd")</td>
  72. <td>@(row.ApprovedAt?.ToString("yyyy-MM-dd") ?? "-")</td>
  73. </tr>
  74. }
  75. }
  76. </tbody>
  77. </table>
  78. </div>
  79. @if (Model.Pagination != null)
  80. {
  81. <partial name="_Pagination" model="Model.Pagination" />
  82. }
  83. </form>
  84. </div>
  85. <script>
  86. document.getElementById('checkedAll')?.addEventListener('change', function() {
  87. document.querySelectorAll('input[name="ids"]').forEach(c => c.checked = this.checked);
  88. });
  89. </script>