index.vue 7.7 KB

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