| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- @page
- @model Admin.Pages.Mail.DetailModel
- @using SharedKernel.Extensions
- @{
- ViewData["Title"] = "메일 상세";
- var data = Model.Data!;
- }
- <div class="container mail-detail">
- <h3>@ViewData["Title"]</h3>
- <hr />
- <partial name="_StatusMessage" />
- <details open>
- <summary class="fs-5 mb-3">기본 정보</summary>
- <div class="adm-section__body adm-section__body--flush">
- <table class="table table-bordered mb-0 mail-detail__meta">
- <colgroup>
- <col class="mail-detail__meta-key" />
- <col />
- </colgroup>
- <tbody>
- <tr>
- <th>ID</th>
- <td>@data.ID</td>
- </tr>
- <tr>
- <th>상태</th>
- <td>
- @switch (data.Status)
- {
- case 0:
- <span class="badge bg-secondary">대기</span>
- break;
- case 1:
- <span class="badge bg-info">처리 중</span>
- break;
- case 2:
- <span class="badge bg-success">발송 완료</span>
- break;
- case 3:
- <span class="badge bg-danger">실패</span>
- break;
- default:
- <span class="badge bg-dark">@data.StatusName</span>
- break;
- }
- </td>
- </tr>
- <tr>
- <th>수신자</th>
- <td>@data.ToAddress</td>
- </tr>
- <tr>
- <th>제목</th>
- <td>@data.Subject</td>
- </tr>
- <tr>
- <th>카테고리</th>
- <td>@(data.Category ?? "-")</td>
- </tr>
- <tr>
- <th>재시도</th>
- <td>@data.RetryCount / @data.MaxRetryCount (다음 시도: @data.NextRetryAt.GetDateAt())</td>
- </tr>
- <tr>
- <th>마지막 오류</th>
- <td>@(data.LastError ?? "-")</td>
- </tr>
- <tr>
- <th>등록 시각</th>
- <td>@data.CreatedAt.GetDateAt()</td>
- </tr>
- <tr>
- <th>처리 시각</th>
- <td>@(data.ProcessedAt.GetDateAt() ?? "-")</td>
- </tr>
- <tr>
- <th>실패 확정 시각</th>
- <td>@(data.FailedAt.GetDateAt() ?? "-")</td>
- </tr>
- </tbody>
- </table>
- </div>
- </details>
- <hr/>
- <br/>
- <details open>
- <summary class="fs-5 mb-3">
- HTML 본문 미리보기
- <small class="text-muted fw-normal">— sandbox iframe 으로 렌더링됩니다.</small>
- </summary>
- <div class="adm-section__body">
- <iframe id="mailPreview" sandbox="allow-same-origin" class="mail-detail__preview"></iframe>
- </div>
- </details>
- <hr/>
- <br/>
- @if (!string.IsNullOrWhiteSpace(data.MessageText))
- {
- <details>
- <summary class="fs-5 mb-3">텍스트 본문</summary>
- <div class="adm-section__body">
- <pre class="mail-detail__pre">@data.MessageText</pre>
- </div>
- </details>
- }
- <details>
- <summary class="fs-5 mb-3">HTML 원본</summary>
- <div class="adm-section__body">
- <pre class="mail-detail__pre mail-detail__pre--raw">@data.MessageHtml</pre>
- </div>
- </details>
- <hr/>
- <div class="d-flex gap-2 justify-content-center">
- <a href="/Mail/List" class="btn btn-secondary">목록</a>
- <form method="post" asp-page-handler="Resend" class="d-inline">
- @Html.AntiForgeryToken()
- <input type="hidden" name="id" value="@data.ID" />
- <button type="submit" class="btn btn-warning btn-detail-resend">재전송</button>
- </form>
- <form method="post" asp-page-handler="Delete" class="d-inline">
- @Html.AntiForgeryToken()
- <input type="hidden" name="id" value="@data.ID" />
- <button type="submit" class="btn btn-danger btn-detail-delete">삭제</button>
- </form>
- </div>
- <br/>
- <br/>
- <br />
- </div>
- @section Styles {
- <style>
- .mail-detail__meta-key {
- width: 15%;
- }
- .mail-detail__preview {
- width: 100%;
- height: 480px;
- border: 0;
- }
- .mail-detail__pre {
- margin: 0;
- white-space: pre-wrap;
- word-break: break-word;
- }
- .mail-detail__pre--raw {
- max-height: 300px;
- overflow: auto;
- }
- </style>
- }
- @section Scripts {
- <script>
- (function () {
- const src = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(data.MessageHtml));
- const iframe = document.getElementById("mailPreview");
- const doc = iframe.contentWindow.document;
- doc.open();
- doc.write(src);
- doc.close();
- })();
- $(document).on("click", ".btn-detail-resend", function (e) {
- if (!confirm("이 메일을 재전송하시겠습니까?")) {
- e.preventDefault();
- return false;
- }
- });
- $(document).on("click", ".btn-detail-delete", function (e) {
- if (!confirm("이 메일을 삭제하시겠습니까?")) {
- e.preventDefault();
- return false;
- }
- });
- </script>
- }
|