site.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. // Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
  2. // for details on configuring this project to bundle and minify static web assets.
  3. // Write your JavaScript code.
  4. $(function () {
  5. // 사이드 바 토글 유지
  6. let isHidden = aside.isHidden();
  7. if (isHidden) {
  8. aside.hideAside();
  9. } else {
  10. aside.showAside();
  11. }
  12. // 사이드바 스크롤 위치 복원
  13. const savedAsideScroll = sessionStorage.getItem("aside-scroll");
  14. if (savedAsideScroll) {
  15. document.getElementById("aside").scrollTop = parseInt(savedAsideScroll);
  16. }
  17. // 메인 콘텐츠 스크롤 위치 복원
  18. const savedMainScroll = sessionStorage.getItem("main-scroll");
  19. if (savedMainScroll) {
  20. document.getElementById("main").scrollTop = parseInt(savedMainScroll);
  21. }
  22. });
  23. // 페이지 이동 전 스크롤 위치 저장
  24. window.addEventListener("beforeunload", function () {
  25. sessionStorage.setItem("aside-scroll", document.getElementById("aside").scrollTop);
  26. sessionStorage.setItem("main-scroll", document.getElementById("main").scrollTop);
  27. });
  28. // 좌측 메뉴 처리
  29. class Aside {
  30. constructor() {
  31. this.body = document.body;
  32. this.aside = document.getElementById("aside");
  33. this.btnAsideToggle = document.getElementById("btnAsideToggle");
  34. }
  35. // 사이드 바 토글 시
  36. toggleAside(e) {
  37. let isHidden = this.isHidden();
  38. if (isHidden) {
  39. aside.showAside();
  40. } else {
  41. aside.hideAside();
  42. }
  43. setCookie("hidden-aside", isHidden ? "visible" : "hidden", 7);
  44. }
  45. // 사이드 바 토글 시 아이콘 변경
  46. toggleAsideIcon (isHidden) {
  47. let icon = this.btnAsideToggle.querySelector("i");
  48. if (isHidden) {
  49. icon.classList.remove("bi-arrow-left");
  50. icon.classList.add("bi-arrow-right");
  51. } else {
  52. icon.classList.remove("bi-arrow-right");
  53. icon.classList.add("bi-arrow-left");
  54. }
  55. };
  56. // 숨김 여부 확인
  57. isHidden() {
  58. let isHidden = getCookie("hidden-aside") ;
  59. if (isHidden == "") {
  60. isHidden = this.body.classList.contains("hidden-aside");
  61. }
  62. return (isHidden === "hidden");
  63. }
  64. // 보이기
  65. showAside() {
  66. this.body.classList.remove("hidden-aside");
  67. this.toggleAsideIcon(0);
  68. setCookie("hidden-aside", "visible", 7);
  69. }
  70. // 숨기기
  71. hideAside() {
  72. this.body.classList.add("hidden-aside");
  73. this.toggleAsideIcon(1);
  74. setCookie("hidden-aside", "hidden", 7);
  75. }
  76. }
  77. const aside = new Aside();
  78. document.getElementById("btnAsideToggle").addEventListener("click", (e) => aside.toggleAside(e));
  79. // 화면이 작아지면
  80. window.addEventListener("resize", function () {
  81. if (window.innerWidth > 768) {
  82. aside.showAside(0);
  83. } else {
  84. aside.hideAside(1);
  85. }
  86. });
  87. // 메뉴 토글 유지
  88. document.querySelectorAll(".collapse").forEach(e => {
  89. const collapseID = e.id;
  90. const collapseState = getCookie(collapseID);
  91. const instance = bootstrap.Collapse.getOrCreateInstance(e, {
  92. toggle: false
  93. });
  94. if (collapseState === "open") {
  95. instance.show();
  96. } else {
  97. instance.hide();
  98. }
  99. e.addEventListener("show.bs.collapse", () => {
  100. setCookie(collapseID, "open", 7);
  101. });
  102. e.addEventListener("hide.bs.collapse", () => {
  103. setCookie(collapseID, "closed", 7);
  104. });
  105. });
  106. // 드롭박스 적용
  107. const dropdownList = [...document.querySelectorAll('.dropdown-toggle')].map(e => new bootstrap.Dropdown(e));
  108. function GetCheckedBoxIDs() {
  109. return Array.from(document.querySelectorAll('input[type="checkbox"].list-check-box:checked')).map(c => c.value);
  110. }
  111. // 목록 버튼상자
  112. class ActionButtons {
  113. constructor() {
  114. this.form = document.getElementById("fAdminList");
  115. }
  116. validate() {
  117. let checked = $("input:checkbox.list-check-box:checked");
  118. if (checked.length < 1) {
  119. alert("항목을 하나 이상 선택하세요.");
  120. return false;
  121. }
  122. return true;
  123. }
  124. checkout(e, action)
  125. {
  126. let handler = "";
  127. switch (action) {
  128. case "Restore":
  129. handler = "?handler=Restore";
  130. break;
  131. case "Delete":
  132. handler = "?handler=Delete";
  133. break;
  134. case "Update":
  135. handler = "?handler=Update";
  136. break;
  137. }
  138. if (handler) {
  139. this.form.action = handler;
  140. }
  141. this.form.submit();
  142. }
  143. Update(e) {
  144. if (!this.validate()) {
  145. return false;
  146. }
  147. if (confirm("선택한 항목을 정말 수정 하시겠습니까?")) {
  148. this.checkout(e, "Update");
  149. }
  150. }
  151. Delete(e) {
  152. let ids = GetCheckedBoxIDs();
  153. if (ids.length > 1) {
  154. if (confirm(`${ids.length}건의 항목을 정말 삭제 하시겠습니까?`)) {
  155. if (!this.validate()) {
  156. return false;
  157. }
  158. }
  159. } else {
  160. if (!confirm("선택한 항목을 정말 삭제 하시겠습니까?")) {
  161. return false;
  162. }
  163. let id = e.target.dataset.id;
  164. if (id) {
  165. this.form.elements[`ids_${id}`].checked = true;
  166. }
  167. }
  168. setTimeout(() => this.checkout(e, "Delete"), 100);
  169. }
  170. Restore(e) {
  171. if (!this.validate()) {
  172. return false;
  173. }
  174. if (confirm("선택한 항목을 정말 복원 하시겠습니까?")) {
  175. this.checkout(e, "Restore");
  176. }
  177. }
  178. checkedAll(e) {
  179. let chk = document.getElementsByClassName("list-check-box");
  180. for (let i = 0; i < chk.length; i++) {
  181. let targetFormName = (e.target.getAttribute("form") || e.target.form.id);
  182. let chkFormName = (chk[i].getAttribute("form") || chk[i].form.id);
  183. if (targetFormName == chkFormName) {
  184. chk[i].checked = e.target.checked;
  185. }
  186. }
  187. this.toggleDisabled();
  188. }
  189. toggleDisabled() {
  190. let checked = $("input:checkbox.list-check-box:checked");
  191. if (checked.length > 0) {
  192. $('button[form="fAdminList"]').prop("disabled", false);
  193. } else {
  194. $('button[form="fAdminList"]').prop("disabled", true);
  195. }
  196. }
  197. }
  198. const actionButtons = new ActionButtons();
  199. $(document).on("click", "#btnListUpdate", (e) => actionButtons.Update(e));
  200. $(document).on("click", "#btnListDelete", (e) => actionButtons.Delete(e));
  201. $(document).on("click", "#btnListRestore", (e) => actionButtons.Restore(e));
  202. $(document).on("click", "#btnListExecute", (e) => actionButtons.Execute(e));
  203. $(document).on("click", ".btn-row-delete", (e) => actionButtons.Delete(e));
  204. $(document).on("click", "#checkedAll", (e) => actionButtons.checkedAll(e));
  205. $(document).on("change", "input.list-check-box", actionButtons.toggleDisabled);