evtListOngoing.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <template>
  2. <div>
  3. <div class="inner--headers">
  4. <h2>{{ pageId }}</h2>
  5. <div class="bread--crumbs--wrap">
  6. <span>홈</span>
  7. <span>이벤트 관리</span>
  8. <span>{{ pageId }}</span>
  9. </div>
  10. </div>
  11. <div class="search--modules">
  12. <div class="form--cont--filter">
  13. <v-select
  14. v-model="filter"
  15. :items="filterArr"
  16. variant="outlined"
  17. class="custom-select"
  18. >
  19. </v-select>
  20. </div>
  21. <div class="form--cont--text">
  22. <v-text-field
  23. v-model="searchModel"
  24. class="custom-input mini"
  25. style="width: 100%"
  26. placeholder="검색어를 입력하세요"
  27. ></v-text-field>
  28. </div>
  29. <v-btn
  30. class="custom-btn btn-blue mini sch--btn"
  31. @click="fnSearch(searchModel, filter)"
  32. >검색</v-btn
  33. >
  34. </div>
  35. <div class="data--list--wrap">
  36. <div class="tbl-wrapper">
  37. <div class="tbl-wrap">
  38. <!-- ag grid -->
  39. <ag-grid-vue
  40. style="width: 100%; height: calc(10 * 2.94rem)"
  41. class="ag-theme-quartz"
  42. :gridOptions="gridOptions"
  43. :rowData="tblItems"
  44. :paginationPageSize="pageObj.pageSize"
  45. :suppressPaginationPanel="true"
  46. @grid-ready="onGridReady"
  47. @rowClicked="detailLocated"
  48. >
  49. </ag-grid-vue>
  50. <!-- 페이징 -->
  51. <div class="ag-grid-custom-pagenations">
  52. <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. </div>
  58. </template>
  59. <script setup>
  60. import { AgGridVue } from "ag-grid-vue3";
  61. import pagination from "../components/common/pagination.vue";
  62. /************************************************************************
  63. | 레이아웃
  64. ************************************************************************/
  65. definePageMeta({
  66. layout: "default",
  67. });
  68. /************************************************************************
  69. | PROPS
  70. ************************************************************************/
  71. const props = defineProps({
  72. propsData: {
  73. type: Object,
  74. default: () => {},
  75. },
  76. });
  77. /************************************************************************
  78. | 스토어
  79. ************************************************************************/
  80. const useDtStore = useDetailStore();
  81. /************************************************************************
  82. | 전역
  83. ************************************************************************/
  84. const searchModel = ref("");
  85. const filter = ref("");
  86. const filterArr = ref([
  87. { title: "선택하세요", value: "" },
  88. { title: "제목", value: "title" },
  89. ]);
  90. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  91. const router = useRouter();
  92. const pageId = ref("진행중 이벤트");
  93. let pageObj = ref({
  94. page: 1, // 현재 페이지
  95. pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
  96. pageSize: 10, // 테이블 조회 데이터 개수
  97. totalCnt: 0, // 전체 페이지
  98. });
  99. const tblItems = ref([]); // stat 데이터
  100. /* eslint-disable */
  101. /* prettier-ignore */
  102. pageObj.value.totalCnt = tblItems.value.length;
  103. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  104. const rowHeightRem = 2.65; // 원하는 rem 값
  105. const rowHeightPx = rowHeightRem * remToPx();
  106. const gridApi = shallowRef();
  107. // gridOption
  108. const gridOptions = {
  109. columnDefs: [
  110. {
  111. headerName: "No",
  112. valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
  113. sortable: false,
  114. width: 70,
  115. },
  116. { headerName: "제목", field: "TITLE", sortable: false },
  117. {
  118. headerName: "기간",
  119. field: "STARTDATE",
  120. sortable: false,
  121. cellRenderer: (params) => {
  122. const formatDate = (str) => {
  123. if (!str) return "";
  124. const d = new Date(str);
  125. const yyyy = d.getFullYear();
  126. const mm = String(d.getMonth() + 1).padStart(2, "0");
  127. const dd = String(d.getDate()).padStart(2, "0");
  128. return `${yyyy}-${mm}-${dd}`;
  129. };
  130. const start = formatDate(params.data.STARTDATE);
  131. const end = formatDate(params.data.ENDDATE);
  132. return `${start} ~ ${end}`;
  133. },
  134. },
  135. {
  136. headerName: "상태",
  137. field: "STATUS",
  138. sortable: false,
  139. width: 70,
  140. cellRenderer: (params) => {
  141. return params.value == 0 ? "대기중" : params.value == 1 ? "진행중" : "마감";
  142. },
  143. },
  144. { headerName: "등록일", field: "REGDATE", sortable: false, width: 140 },
  145. // {
  146. // headerName: "알림 메일 수신 여부",
  147. // field: "mail_recp_yn",
  148. // sortable: false,
  149. // width: 130,
  150. // },
  151. ],
  152. rowData: tblItems.value, // 테이블 데이터
  153. autoSizeStrategy: {
  154. type: "fitGridWidth", // width맞춤
  155. },
  156. suppressMovableColumns: true,
  157. headerHeight: rowHeightPx,
  158. rowHeight: rowHeightPx,
  159. pagination: true,
  160. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  161. //rowSelection: {
  162. // checkboxes: true,
  163. // headerCheckbox: true,
  164. // enableClickSelection: false,
  165. // mode: "multiRow",
  166. //},
  167. };
  168. /************************************************************************
  169. | 함수(METHODS)
  170. ************************************************************************/
  171. const onGridReady = (__PARAMS) => {
  172. gridApi.value = __PARAMS.api;
  173. };
  174. const chgPage = (__PAGE) => {
  175. pageObj.value.page = __PAGE;
  176. gridApi.value.paginationGoToPage(__PAGE - 1);
  177. };
  178. const addLocated = () => {
  179. router.push({
  180. path: "/view/event/evtAdd",
  181. });
  182. useDtStore.boardInfo.pageType = "I";
  183. };
  184. const detailLocated = (__EVENT) => {
  185. router.push({
  186. path: "/view/event/evtAdd",
  187. });
  188. useDtStore.boardInfo.seq = __EVENT.data.SEQ;
  189. useDtStore.boardInfo.pageType = "U";
  190. useDtStore.boardInfo.status = "1";
  191. };
  192. const evtListGet = () => {
  193. let _req = {
  194. compId: useAuthStore().getCompanyId,
  195. status: "1",
  196. };
  197. useAxios()
  198. .post("/evt/list", _req)
  199. .then((res) => {
  200. _req._size = res.data.length;
  201. tblItems.value = res.data;
  202. pageObj.value.totalCnt = tblItems.value.length;
  203. });
  204. };
  205. const fnSearch = (__KEYWORD, __FILTER) => {
  206. let _req = {
  207. compId: useAuthStore().getCompanyId,
  208. filter: __FILTER,
  209. keyword: __KEYWORD,
  210. status: "1",
  211. // _size: 1000,
  212. // _index: 0,
  213. // admin_name:
  214. // __FILTER == "admin_name" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  215. // id: __FILTER == "id" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  216. };
  217. useAxios()
  218. .post("/evt/search", _req)
  219. .then((res) => {
  220. _req._size = res.data.length;
  221. tblItems.value = res.data;
  222. pageObj.value.totalCnt = tblItems.value.length;
  223. })
  224. .catch((error) => {});
  225. };
  226. /************************************************************************
  227. | WATCH
  228. ************************************************************************/
  229. watch(
  230. () => props,
  231. () => {
  232. searchObj.value = props.propsData;
  233. fnGetStat();
  234. },
  235. { deep: true }
  236. );
  237. onMounted(() => {
  238. evtListGet();
  239. });
  240. </script>