Edit.cshtml 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. @page "{id:int}"
  2. @model Admin.Pages.Crypto.List.EditModel
  3. @{
  4. ViewData["Title"] = "코인 수정";
  5. }
  6. <div class="container">
  7. <h3>@ViewData["Title"]</h3>
  8. <hr />
  9. <partial name="_StatusMessage" />
  10. <ul class="nav nav-tabs mb-3">
  11. <li class="nav-item">
  12. <a class="nav-link active" href="/Crypto/List/Edit/@Model.CoinID">기본 정보</a>
  13. </li>
  14. <li class="nav-item">
  15. <a class="nav-link" href="/Crypto/Board/Index?coinID=@Model.CoinID">게시판 연결</a>
  16. </li>
  17. </ul>
  18. <form id="fAdminWrite" method="post" enctype="multipart/form-data" accept-charset="utf-8" autocomplete="off" class="mt-3">
  19. @Html.AntiForgeryToken()
  20. <div class="row mb-2">
  21. <label asp-for="Input.Symbol" class="col-sm-2 col-form-label">
  22. <span class="text-danger">*</span> 심볼
  23. </label>
  24. <div class="col-sm-10">
  25. <input asp-for="Input.Symbol" class="form-control text-uppercase" maxlength="30" required placeholder="BTC" />
  26. <div class="form-text">대문자로 자동 변환됩니다 (예: BTC, ETH)</div>
  27. <span asp-validation-for="Input.Symbol" class="text-danger"></span>
  28. </div>
  29. </div>
  30. <div class="row mb-2">
  31. <label asp-for="Input.KorName" class="col-sm-2 col-form-label">
  32. <span class="text-danger">*</span> 한글명
  33. </label>
  34. <div class="col">
  35. <input asp-for="Input.KorName" class="form-control" maxlength="200" required placeholder="비트코인" />
  36. <span asp-validation-for="Input.KorName" class="text-danger"></span>
  37. </div>
  38. </div>
  39. <div class="row mb-2">
  40. <label asp-for="Input.EngName" class="col-sm-2 col-form-label">
  41. <span class="text-danger">*</span> 영문명
  42. </label>
  43. <div class="col">
  44. <input asp-for="Input.EngName" class="form-control" maxlength="200" required placeholder="Bitcoin" />
  45. <span asp-validation-for="Input.EngName" class="text-danger"></span>
  46. </div>
  47. </div>
  48. <div class="row mb-2">
  49. <label asp-for="Input.LogoImageFile" class="col-sm-2 col-form-label">로고 이미지</label>
  50. <div class="col-sm-10">
  51. @if (!string.IsNullOrEmpty(Model.CurrentLogoImage))
  52. {
  53. <div class="mb-2">
  54. <img src="@Model.CurrentLogoImage" alt="현재 로고" style="max-width:128px;max-height:128px;object-fit:contain;border:1px solid #ddd;border-radius:4px;" />
  55. <div class="form-check mt-1">
  56. <input asp-for="Input.DeleteLogoImage" class="form-check-input" />
  57. <label asp-for="Input.DeleteLogoImage" class="form-check-label text-danger">현재 이미지 삭제</label>
  58. </div>
  59. </div>
  60. }
  61. <div id="LogoImagePrev" hidden>
  62. <img class="img-fluid img-thumbnail" alt="로고 이미지 미리보기" style="max-width:128px;max-height:128px;" /><br />
  63. <button type="button" class="btn btn-sm btn-danger mt-2 mb-2 btn-remove-preview">삭제</button>
  64. </div>
  65. <input asp-for="Input.LogoImageFile" class="form-control" accept="image/*,.svg" />
  66. <div class="form-text">jpg, jpeg, png, gif, webp, svg</div>
  67. <span asp-validation-for="Input.LogoImageFile" class="text-danger"></span>
  68. </div>
  69. </div>
  70. <div class="row mb-2">
  71. <label asp-for="Input.CategoryIDs" class="col-sm-2 col-form-label">카테고리</label>
  72. <div class="col-sm-10 align-self-center">
  73. @if (Model.Categories.Count > 0)
  74. {
  75. <div class="border rounded p-2" style="max-height: 150px; overflow-y: auto;">
  76. @foreach (var cat in Model.Categories)
  77. {
  78. <div class="form-check">
  79. <input class="form-check-input" type="checkbox" name="Input.CategoryIDs" id="cat_@(cat.Value)" value="@cat.Value" @(Model.Input.CategoryIDs.Contains(int.Parse(cat.Value)) ? "checked" : "") />
  80. <label class="form-check-label" for="cat_@(cat.Value)">@cat.Text</label>
  81. </div>
  82. }
  83. </div>
  84. }
  85. else
  86. {
  87. <span>-</span>
  88. }
  89. <span asp-validation-for="Input.CategoryIDs" class="text-danger"></span>
  90. </div>
  91. </div>
  92. <div class="row mb-2">
  93. <label asp-for="Input.Description" class="col-sm-2 col-form-label">설명</label>
  94. <div class="col-sm-10">
  95. <textarea asp-for="Input.Description" class="form-control" rows="4" maxlength="5000" placeholder="코인에 대한 설명을 입력하세요."></textarea>
  96. <span asp-validation-for="Input.Description" class="text-danger"></span>
  97. </div>
  98. </div>
  99. <div class="row mb-2">
  100. <label asp-for="Input.ContractAddress" class="col-sm-2 col-form-label">컨트랙트 주소</label>
  101. <div class="col-md-10">
  102. <input asp-for="Input.ContractAddress" class="form-control" maxlength="100" placeholder="0x..." />
  103. <span asp-validation-for="Input.ContractAddress" class="text-danger"></span>
  104. </div>
  105. </div>
  106. <div class="row mb-2">
  107. <label asp-for="Input.WebsiteUrl" class="col-sm-2 col-form-label">Site URL</label>
  108. <div class="col-sm-10">
  109. <input asp-for="Input.WebsiteUrl" class="form-control" maxlength="500" placeholder="https://..." />
  110. <span asp-validation-for="Input.WebsiteUrl" class="text-danger"></span>
  111. </div>
  112. </div>
  113. <div class="row mb-2">
  114. <label asp-for="Input.WhitepaperUrl" class="col-sm-2 col-form-label">Whitepaper URL</label>
  115. <div class="col-sm-10">
  116. <input asp-for="Input.WhitepaperUrl" class="form-control" maxlength="500" placeholder="https://..." />
  117. <span asp-validation-for="Input.WhitepaperUrl" class="text-danger"></span>
  118. </div>
  119. </div>
  120. <div class="row mb-2">
  121. <label asp-for="Input.TwitterUrl" class="col-sm-2 col-form-label">Twitter URL</label>
  122. <div class="col-sm-10">
  123. <input asp-for="Input.TwitterUrl" class="form-control" maxlength="500" placeholder="https://twitter.com/..." />
  124. <span asp-validation-for="Input.TwitterUrl" class="text-danger"></span>
  125. </div>
  126. </div>
  127. <div class="row mb-3">
  128. <label asp-for="Input.TelegramUrl" class="col-sm-2 col-form-label">Telegram URL</label>
  129. <div class="col-sm-10">
  130. <input asp-for="Input.TelegramUrl" class="form-control" maxlength="500" placeholder="https://t.me/..." />
  131. <span asp-validation-for="Input.TelegramUrl" class="text-danger"></span>
  132. </div>
  133. </div>
  134. <div class="row">
  135. <label class="col-sm-2">상태</label>
  136. <div class="col-sm-10">
  137. <div class="d-flex gap-3 flex-wrap">
  138. <div class="form-check">
  139. <input asp-for="Input.IsActive" class="form-check-input" />
  140. <label asp-for="Input.IsActive" class="form-check-label">활성화</label>
  141. </div>
  142. <div class="form-check">
  143. <input asp-for="Input.IsNew" class="form-check-input" />
  144. <label asp-for="Input.IsNew" class="form-check-label text-primary">신규 상장</label>
  145. </div>
  146. <div class="form-check">
  147. <input asp-for="Input.IsWarning" class="form-check-input" />
  148. <label asp-for="Input.IsWarning" class="form-check-label text-danger">위험 경고</label>
  149. </div>
  150. <div class="form-check">
  151. <input asp-for="Input.IsDelisted" class="form-check-input" />
  152. <label asp-for="Input.IsDelisted" class="form-check-label text-warning">상장 폐지</label>
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157. <hr />
  158. <div class="d-grid gap-2 text-center d-md-block">
  159. <button type="submit" class="btn btn-success">저장</button>
  160. <a href="/Crypto/List/Index" class="btn btn-secondary">취소</a>
  161. </div>
  162. <br/>
  163. </form>
  164. </div>
  165. @section Scripts {
  166. <script>
  167. setupImagePreview("Input_LogoImageFile", "LogoImagePrev");
  168. </script>
  169. }