Edit.cshtml 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. @page "{id:int}"
  2. @model Admin.Pages.Banner.List.EditModel
  3. @{
  4. ViewData["Title"] = "배너 수정";
  5. }
  6. <div class="container">
  7. <h3>@ViewData["Title"]</h3>
  8. <hr />
  9. <div asp-validation-summary="ModelOnly" class="text-danger"></div>
  10. <partial name="_StatusMessage" />
  11. <form id="fAdminWrite" method="post" accept-charset="utf-8" autocomplete="off" enctype="multipart/form-data">
  12. <input type="hidden" asp-for="Input.ID" />
  13. <input type="hidden" asp-for="QueryString" />
  14. <div class="row mb-2">
  15. <label asp-for="Input.PositionID" class="col-sm-2 col-form-label"><span class="text-danger">*</span> 배너 위치</label>
  16. <div class="col-sm-10">
  17. <div class="row">
  18. <div class="col col-md-auto">
  19. <select asp-for="Input.PositionID" class="form-select" asp-items="Model.Positions" required></select>
  20. </div>
  21. </div>
  22. <span asp-validation-for="Input.PositionID" class="text-danger"></span>
  23. </div>
  24. </div>
  25. <div class="row mb-2">
  26. <label asp-for="Input.Subject" class="col-sm-2 col-form-label"><span class="text-danger">*</span> 배너 명</label>
  27. <div class="col-sm-10">
  28. <input asp-for="Input.Subject" class="form-control" required />
  29. <span asp-validation-for="Input.Subject" class="text-danger"></span>
  30. </div>
  31. </div>
  32. <div class="row mb-2">
  33. <label asp-for="Input.Link" class="col-sm-2 col-form-label">링크 주소</label>
  34. <div class="col-sm-10">
  35. <input asp-for="Input.Link" class="form-control" type="url" placeholder="https://example.com" />
  36. <span asp-validation-for="Input.Link" class="text-danger"></span>
  37. <div class="form-check form-check-inline mt-2">
  38. <input type="radio" asp-for="Input.LinkTarget" value="_self" class="form-check-input" id="lt_self" />
  39. <label class="form-check-label" for="lt_self">현재 창</label>
  40. </div>
  41. <div class="form-check form-check-inline">
  42. <input type="radio" asp-for="Input.LinkTarget" value="_blank" class="form-check-input" id="lt_blank" />
  43. <label class="form-check-label" for="lt_blank">새 창</label>
  44. </div>
  45. <span asp-validation-for="Input.LinkTarget" class="text-danger"></span>
  46. </div>
  47. </div>
  48. <div class="row mb-2">
  49. <label class="col-sm-2 col-form-label">현재 이미지</label>
  50. <div class="col-sm-10">
  51. <div class="mb-2">
  52. <div class="form-text">
  53. Desktop
  54. @if (Model.CurrentDesktopImage != null)
  55. {
  56. <div id="currentDesktopWrap">
  57. <br />
  58. <img src="@Model.CurrentDesktopImage" class="img-thumbnail img-fluid rounded" />
  59. <br />
  60. <button type="button" class="btn btn-sm btn-danger mt-2" onclick="markRemove('Desktop')">이미지 삭제</button>
  61. </div>
  62. <div id="removeDesktopNotice" class="text-danger mt-2" hidden>
  63. Desktop 이미지가 삭제됩니다. <button type="button" class="btn btn-sm btn-secondary ms-2" onclick="undoRemove('Desktop')">취소</button>
  64. </div>
  65. <input type="checkbox" asp-for="Input.RemoveDesktopImage" id="Input_RemoveDesktopImage" hidden />
  66. }
  67. else
  68. {
  69. <text>-</text>
  70. }
  71. </div>
  72. </div>
  73. <div>
  74. <div class="form-text">
  75. Mobile
  76. @if (Model.CurrentMobileImage != null)
  77. {
  78. <div id="currentMobileWrap">
  79. <br />
  80. <img src="@Model.CurrentMobileImage" class="img-thumbnail img-fluid rounded" />
  81. <br />
  82. <button type="button" class="btn btn-sm btn-danger mt-2" onclick="markRemove('Mobile')">이미지 삭제</button>
  83. </div>
  84. <div id="removeMobileNotice" class="text-danger mt-2" hidden>
  85. Mobile 이미지가 삭제됩니다. <button type="button" class="btn btn-sm btn-secondary ms-2" onclick="undoRemove('Mobile')">취소</button>
  86. </div>
  87. <input type="checkbox" asp-for="Input.RemoveMobileImage" id="Input_RemoveMobileImage" hidden />
  88. }
  89. else
  90. {
  91. <text>-</text>
  92. }
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. <div class="row mb-2">
  98. <label class="col-sm-2 col-form-label">이미지</label>
  99. <div class="col-sm-10">
  100. <div class="mb-3">
  101. <label asp-for="Input.DesktopImageFile" class="form-label">Desktop</label>
  102. <div id="DesktopBannerPrev" hidden>
  103. <img class="img-fluid img-thumbnail" alt="이미지(Desktop) 미리보기" /><br />
  104. <button type="button" class="btn btn-sm btn-danger mt-2 mb-2 btn-remove-preview">제거</button>
  105. </div>
  106. <input asp-for="Input.DesktopImageFile" type="file" class="form-control" accept="image/*" />
  107. <span asp-validation-for="Input.DesktopImageFile" class="text-danger"></span>
  108. </div>
  109. <div>
  110. <label asp-for="Input.MobileImageFile" class="form-label">Mobile</label>
  111. <div id="MobileBannerPrev" hidden>
  112. <img class="img-fluid img-thumbnail" alt="이미지(Mobile) 미리보기" /><br />
  113. <button type="button" class="btn btn-sm btn-danger mt-2 mb-2 btn-remove-preview">제거</button>
  114. </div>
  115. <input asp-for="Input.MobileImageFile" type="file" class="form-control" accept="image/*" />
  116. <span asp-validation-for="Input.MobileImageFile" class="text-danger"></span>
  117. </div>
  118. </div>
  119. </div>
  120. <div class="row mb-2">
  121. <label asp-for="Input.Order" class="col-sm-2 col-form-label"><span class="text-danger">*</span> 순서</label>
  122. <div class="col-sm-10">
  123. <div class="row">
  124. <div class="col col-md-auto">
  125. <input asp-for="Input.Order" class="form-control" type="number" min="-9999" max="9999" required />
  126. </div>
  127. </div>
  128. <span asp-validation-for="Input.Order" class="text-danger"></span>
  129. </div>
  130. </div>
  131. <div class="row mb-2">
  132. <label class="col-sm-2 col-form-label">노출 기간</label>
  133. <div class="col-sm-10">
  134. <div class="row g-2">
  135. <div class="col col-md-auto">
  136. <input asp-for="Input.StartAt" class="form-control" />
  137. <span asp-validation-for="Input.StartAt" class="text-danger"></span>
  138. </div>
  139. <div class="col-auto d-none d-md-block align-self-center">~</div>
  140. <div class="col col-md-auto">
  141. <input asp-for="Input.EndAt" class="form-control" />
  142. <span asp-validation-for="Input.EndAt" class="text-danger"></span>
  143. </div>
  144. </div>
  145. <span class="text-muted form-text">
  146. 노출 기간을 입력하지 않으면 항상 표시됩니다.
  147. </span>
  148. </div>
  149. </div>
  150. <div class="row mb-2">
  151. <label asp-for="Input.IsActive" class="col-sm-2 col-form-label">사용 여부</label>
  152. <div class="col-sm-10 align-content-center">
  153. <div class="form-check-inline">
  154. <input type="checkbox" asp-for="Input.IsActive" class="form-check-input" />
  155. <label class="form-check-label" asp-for="Input.IsActive">사용함</label>
  156. <span asp-validation-for="Input.IsActive" class="text-danger"></span>
  157. </div>
  158. </div>
  159. </div>
  160. <hr />
  161. <div class="row">
  162. <div class="col text-center p-3">
  163. <button type="submit" class="btn btn-success">저장</button>
  164. <a href="/Banner/List@(Model.QueryString)" class="btn btn-secondary">취소</a>
  165. </div>
  166. </div>
  167. <br />
  168. </form>
  169. </div>
  170. @section Scripts {
  171. <script>
  172. setupImagePreview("Input_DesktopImageFile", "DesktopBannerPrev");
  173. setupImagePreview("Input_MobileImageFile", "MobileBannerPrev");
  174. function markRemove(kind) {
  175. const cb = document.getElementById('Input_Remove' + kind + 'Image');
  176. const wrap = document.getElementById('current' + kind + 'Wrap');
  177. const notice = document.getElementById('remove' + kind + 'Notice');
  178. if (cb) { cb.checked = true; }
  179. if (wrap) { wrap.hidden = true; }
  180. if (notice) { notice.hidden = false; }
  181. }
  182. function undoRemove(kind) {
  183. const cb = document.getElementById('Input_Remove' + kind + 'Image');
  184. const wrap = document.getElementById('current' + kind + 'Wrap');
  185. const notice = document.getElementById('remove' + kind + 'Notice');
  186. if (cb) { cb.checked = false; }
  187. if (wrap) { wrap.hidden = false; }
  188. if (notice) { notice.hidden = true; }
  189. }
  190. </script>
  191. }