Index.cshtml 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. @page
  2. @model Admin.Pages.Store.Shipment.IndexModel
  3. @using Domain.Entities.Store.ValueObject
  4. @{
  5. ViewData["Title"] = "배송 관리";
  6. }
  7. <div class="container-fluid">
  8. <h3>@ViewData["Title"]</h3>
  9. <hr />
  10. <partial name="_StatusMessage" />
  11. <div class="row g-2 mb-2">
  12. <div class="col-12 col-lg-auto">
  13. <div class="row g-2">
  14. <div class="col-auto col-md-auto">
  15. <select id="search" class="form-select">
  16. <option value="">검색 조건</option>
  17. <option value="1" selected="@(Model.Query.Search == 1)">주문번호</option>
  18. <option value="2" selected="@(Model.Query.Search == 2)">주문자(이메일)</option>
  19. <option value="3" selected="@(Model.Query.Search == 3)">송장번호</option>
  20. </select>
  21. </div>
  22. <div class="col col-md-auto">
  23. <input type="search" id="keyword" class="form-control" maxlength="100" value="@Model.Query.Keyword" placeholder="검색어를 입력하세요." />
  24. </div>
  25. </div>
  26. </div>
  27. <div class="col-12 col-lg-auto">
  28. <div class="row row-cols-2 g-2">
  29. <div class="col">
  30. <input type="datetime-local" id="startAt" class="form-control" value="@Model.Query.StartAt" />
  31. </div>
  32. <div class="col">
  33. <input type="datetime-local" id="endAt" class="form-control" value="@Model.Query.EndAt" />
  34. </div>
  35. </div>
  36. </div>
  37. </div>
  38. <div class="row justify-content-center mt-3">
  39. <div class="col col-sm-auto">
  40. <button type="submit" id="btnSearch" class="btn btn-primary w-100">검색</button>
  41. </div>
  42. </div>
  43. <hr />
  44. <ul class="nav nav-tabs">
  45. <li class="nav-item">
  46. <a class="nav-link @(!Model.Query.Status.HasValue ? "active" : null)" href="?">
  47. 전체 (@((Model.Counts?.All ?? 0).ToString("N0")))
  48. </a>
  49. </li>
  50. <li class="nav-item">
  51. <a class="nav-link @(Model.Query.Status == ShipmentStatus.Preparing ? "active" : null)" href="?Query.Status=@((int)ShipmentStatus.Preparing)">
  52. 준비중 (@((Model.Counts?.Preparing ?? 0).ToString("N0")))
  53. </a>
  54. </li>
  55. <li class="nav-item">
  56. <a class="nav-link @(Model.Query.Status == ShipmentStatus.Pickup ? "active" : null)" href="?Query.Status=@((int)ShipmentStatus.Pickup)">
  57. 집화 (@((Model.Counts?.Pickup ?? 0).ToString("N0")))
  58. </a>
  59. </li>
  60. <li class="nav-item">
  61. <a class="nav-link @(Model.Query.Status == ShipmentStatus.InTransit ? "active" : null)" href="?Query.Status=@((int)ShipmentStatus.InTransit)">
  62. 배송중 (@((Model.Counts?.InTransit ?? 0).ToString("N0")))
  63. </a>
  64. </li>
  65. <li class="nav-item">
  66. <a class="nav-link @(Model.Query.Status == ShipmentStatus.Delivered ? "active" : null)" href="?Query.Status=@((int)ShipmentStatus.Delivered)">
  67. 배송완료 (@((Model.Counts?.Delivered ?? 0).ToString("N0")))
  68. </a>
  69. </li>
  70. <li class="nav-item">
  71. <a class="nav-link @(Model.Query.Status == ShipmentStatus.Failed ? "active" : null)" href="?Query.Status=@((int)ShipmentStatus.Failed)">
  72. 실패 (@((Model.Counts?.Failed ?? 0).ToString("N0")))
  73. </a>
  74. </li>
  75. </ul>
  76. <div class="row g-2 mt-2">
  77. <div class="col">
  78. Total : @Model.Total.ToString("N0")
  79. </div>
  80. <div class="col-auto">
  81. <select name="perPage" id="perPage" class="form-select w-auto d-inline-block">
  82. <option value="10" selected="@(Model.Query.PerPage == 10)">10</option>
  83. <option value="20" selected="@(Model.Query.PerPage == 20)">20</option>
  84. <option value="50" selected="@(Model.Query.PerPage == 50)">50</option>
  85. <option value="100" selected="@(Model.Query.PerPage == 100)">100</option>
  86. </select>
  87. </div>
  88. </div>
  89. <div class="table-responsive">
  90. <table class="table table-bordered table-hover mt-3">
  91. <colgroup>
  92. <col style="width: 5%;" />
  93. <col style="width: 13%;" />
  94. <col />
  95. <col style="width: 10%;" />
  96. <col style="width: 12%;" />
  97. <col style="width: 15%;" />
  98. <col style="width: 12%;" />
  99. <col style="width: 12%;" />
  100. <col style="width: 10%;" />
  101. </colgroup>
  102. <thead>
  103. <tr>
  104. <th>#</th>
  105. <th>주문번호</th>
  106. <th>주문자(이메일)</th>
  107. <th>상태</th>
  108. <th>택배사</th>
  109. <th>송장번호</th>
  110. <th>출고일</th>
  111. <th>배송완료</th>
  112. <th>비고</th>
  113. </tr>
  114. </thead>
  115. @if (Model.List == null || Model.List.Count <= 0)
  116. {
  117. <tbody><tr><td colspan="9">No Data.</td></tr></tbody>
  118. }
  119. else
  120. {
  121. <tbody>
  122. @foreach (var row in Model.List)
  123. {
  124. <tr>
  125. <td>@row.Num</td>
  126. <td><a href="@row.DetailURL"><code>@row.OrderNumber</code></a></td>
  127. <td>@row.BuyerEmail</td>
  128. <td>@row.StatusText</td>
  129. <td>@(row.Carrier ?? "-")</td>
  130. <td>@(row.TrackingNumber ?? "-")</td>
  131. <td>@(row.ShippedAt ?? "-")</td>
  132. <td>@(row.DeliveredAt ?? "-")</td>
  133. <td>
  134. <div class="d-xl-flex gap-2 justify-content-center d-grid">
  135. <a class="btn btn-sm btn-outline-info" href="@row.DetailURL">상세</a>
  136. </div>
  137. </td>
  138. </tr>
  139. }
  140. </tbody>
  141. }
  142. </table>
  143. <partial name="_Pagination" model="Model.Pagination" />
  144. </div>
  145. </div>
  146. @section Scripts {
  147. <script>
  148. function updateQueryString() {
  149. let queryParams = new URLSearchParams();
  150. queryParams.set("Query.Search", document.getElementById("search").value);
  151. queryParams.set("Query.Keyword", document.getElementById("keyword").value);
  152. queryParams.set("Query.StartAt", document.getElementById("startAt").value);
  153. queryParams.set("Query.EndAt", document.getElementById("endAt").value);
  154. queryParams.set("Query.PerPage", document.getElementById("perPage").value);
  155. @if (Model.Query.Status.HasValue)
  156. {
  157. <text>queryParams.set("Query.Status", "@((int)Model.Query.Status.Value)");</text>
  158. }
  159. window.location.href = window.location.pathname + "?" + queryParams.toString();
  160. }
  161. $(document).on("change", "#perPage", updateQueryString);
  162. $(document).on("click", "#btnSearch", function(e) {
  163. e.preventDefault();
  164. updateQueryString();
  165. });
  166. $(document).on("keyup", "#keyword, #startAt, #endAt", function(e) {
  167. if (e.which === 13 || e.key === "Enter") {
  168. e.preventDefault();
  169. updateQueryString();
  170. }
  171. });
  172. </script>
  173. }