Edit.cshtml 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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 class="col-sm-2 col-form-label">거래쌍</label>
  32. <div class="col-sm-10 align-self-center">
  33. @if (Model.Markets.Count > 0)
  34. {
  35. <span>@string.Join(", ", Model.Markets)</span>
  36. }
  37. else
  38. {
  39. <span class="text-muted">Upbit 동기화 후 자동 등록됩니다</span>
  40. }
  41. </div>
  42. </div>
  43. <div class="row mb-2">
  44. <label asp-for="Input.KorName" class="col-sm-2 col-form-label">
  45. <span class="text-danger">*</span> 한글명
  46. </label>
  47. <div class="col">
  48. <input asp-for="Input.KorName" class="form-control" maxlength="200" required placeholder="비트코인" />
  49. <span asp-validation-for="Input.KorName" class="text-danger"></span>
  50. </div>
  51. </div>
  52. <div class="row mb-2">
  53. <label asp-for="Input.EngName" class="col-sm-2 col-form-label">
  54. <span class="text-danger">*</span> 영문명
  55. </label>
  56. <div class="col">
  57. <input asp-for="Input.EngName" class="form-control" maxlength="200" required placeholder="Bitcoin" />
  58. <span asp-validation-for="Input.EngName" class="text-danger"></span>
  59. </div>
  60. </div>
  61. <div class="row mb-2">
  62. <label asp-for="Input.LogoImageFile" class="col-sm-2 col-form-label">로고 이미지</label>
  63. <div class="col-sm-10">
  64. @if (!string.IsNullOrEmpty(Model.CurrentLogoImage))
  65. {
  66. <div class="mb-2">
  67. <img src="@Model.CurrentLogoImage" alt="현재 로고" style="max-width:128px;max-height:128px;object-fit:contain;border:1px solid #ddd;border-radius:4px;" />
  68. <div class="form-check mt-1">
  69. <input asp-for="Input.DeleteLogoImage" class="form-check-input" />
  70. <label asp-for="Input.DeleteLogoImage" class="form-check-label text-danger">현재 이미지 삭제</label>
  71. </div>
  72. </div>
  73. }
  74. <div id="LogoImagePrev" hidden>
  75. <img class="img-fluid img-thumbnail" alt="로고 이미지 미리보기" style="max-width:128px;max-height:128px;" /><br />
  76. <button type="button" class="btn btn-sm btn-danger mt-2 mb-2 btn-remove-preview">삭제</button>
  77. </div>
  78. <input asp-for="Input.LogoImageFile" class="form-control" accept="image/*,.svg" />
  79. <div class="form-text">jpg, jpeg, png, gif, webp, svg</div>
  80. <span asp-validation-for="Input.LogoImageFile" class="text-danger"></span>
  81. </div>
  82. </div>
  83. <div class="row mb-2">
  84. <label asp-for="Input.CategoryIDs" class="col-sm-2 col-form-label">카테고리</label>
  85. <div class="col-sm-10 align-self-center">
  86. @if (Model.Categories.Count > 0)
  87. {
  88. <div class="border rounded p-2" style="max-height: 150px; overflow-y: auto;">
  89. @foreach (var cat in Model.Categories)
  90. {
  91. <div class="form-check">
  92. <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" : "") />
  93. <label class="form-check-label" for="cat_@(cat.Value)">@cat.Text</label>
  94. </div>
  95. }
  96. </div>
  97. }
  98. else
  99. {
  100. <span>-</span>
  101. }
  102. <span asp-validation-for="Input.CategoryIDs" class="text-danger"></span>
  103. </div>
  104. </div>
  105. <div class="row mb-2">
  106. <label asp-for="Input.Description" class="col-sm-2 col-form-label">설명</label>
  107. <div class="col-sm-10">
  108. <textarea asp-for="Input.Description" class="form-control" rows="4" maxlength="5000" placeholder="코인에 대한 설명을 입력하세요."></textarea>
  109. <span asp-validation-for="Input.Description" class="text-danger"></span>
  110. </div>
  111. </div>
  112. <div class="row mb-2">
  113. <label asp-for="Input.ContractAddress" class="col-sm-2 col-form-label">컨트랙트 주소</label>
  114. <div class="col-md-10">
  115. <input asp-for="Input.ContractAddress" class="form-control" maxlength="100" placeholder="0x..." />
  116. <span asp-validation-for="Input.ContractAddress" class="text-danger"></span>
  117. </div>
  118. </div>
  119. <div class="row mb-2">
  120. <label asp-for="Input.WebsiteUrl" class="col-sm-2 col-form-label">Site URL</label>
  121. <div class="col-sm-10">
  122. <input asp-for="Input.WebsiteUrl" class="form-control" maxlength="500" placeholder="https://..." />
  123. <span asp-validation-for="Input.WebsiteUrl" class="text-danger"></span>
  124. </div>
  125. </div>
  126. <div class="row mb-2">
  127. <label asp-for="Input.WhitepaperUrl" class="col-sm-2 col-form-label">Whitepaper URL</label>
  128. <div class="col-sm-10">
  129. <input asp-for="Input.WhitepaperUrl" class="form-control" maxlength="500" placeholder="https://..." />
  130. <span asp-validation-for="Input.WhitepaperUrl" class="text-danger"></span>
  131. </div>
  132. </div>
  133. <div class="row mb-2">
  134. <label asp-for="Input.TwitterUrl" class="col-sm-2 col-form-label">Twitter URL</label>
  135. <div class="col-sm-10">
  136. <input asp-for="Input.TwitterUrl" class="form-control" maxlength="500" placeholder="https://twitter.com/..." />
  137. <span asp-validation-for="Input.TwitterUrl" class="text-danger"></span>
  138. </div>
  139. </div>
  140. <div class="row mb-3">
  141. <label asp-for="Input.TelegramUrl" class="col-sm-2 col-form-label">Telegram URL</label>
  142. <div class="col-sm-10">
  143. <input asp-for="Input.TelegramUrl" class="form-control" maxlength="500" placeholder="https://t.me/..." />
  144. <span asp-validation-for="Input.TelegramUrl" class="text-danger"></span>
  145. </div>
  146. </div>
  147. <div class="row">
  148. <label class="col-sm-2">상태</label>
  149. <div class="col-sm-10">
  150. <div class="d-flex gap-3 flex-wrap">
  151. <div class="form-check">
  152. <input asp-for="Input.IsActive" class="form-check-input" />
  153. <label asp-for="Input.IsActive" class="form-check-label">활성화</label>
  154. </div>
  155. <div class="form-check">
  156. <input asp-for="Input.IsNew" class="form-check-input" />
  157. <label asp-for="Input.IsNew" class="form-check-label text-primary">신규 상장</label>
  158. </div>
  159. <div class="form-check">
  160. <input asp-for="Input.IsWarning" class="form-check-input" />
  161. <label asp-for="Input.IsWarning" class="form-check-label text-danger">위험 경고</label>
  162. </div>
  163. <div class="form-check">
  164. <input asp-for="Input.IsDelisted" class="form-check-input" />
  165. <label asp-for="Input.IsDelisted" class="form-check-label text-warning">상장 폐지</label>
  166. </div>
  167. </div>
  168. </div>
  169. </div>
  170. <hr />
  171. <div class="d-grid gap-2 text-center d-md-block">
  172. <button type="submit" class="btn btn-success">저장</button>
  173. <a href="/Crypto/List/Index" class="btn btn-secondary">취소</a>
  174. </div>
  175. <br/>
  176. </form>
  177. </div>
  178. @section Scripts {
  179. <script>
  180. setupImagePreview("Input_LogoImageFile", "LogoImagePrev");
  181. </script>
  182. }