curationList.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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. <span v-if="pageIdSub">{{ pageIdSub }}</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="filderArr"
  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="btn--actions--wrap">
  37. <div class="left--sections">
  38. <!-- <v-btn class="custom-btn mini btn-white">선택 삭제</v-btn> -->
  39. </div>
  40. <div class="right--sections">
  41. <v-btn class="custom-btn mini btn-reg" @click="addLocated"
  42. ><i class="ico"></i>신규 등록</v-btn
  43. >
  44. </div>
  45. </div>
  46. <div class="tbl-wrapper">
  47. <div class="tbl-wrap">
  48. <!-- ag grid -->
  49. <ag-grid-vue
  50. style="width: 100%; height: calc(10 * 2.94rem)"
  51. class="ag-theme-quartz"
  52. :gridOptions="gridOptions"
  53. :rowData="tblItems"
  54. :paginationPageSize="pageObj.pageSize"
  55. :suppressPaginationPanel="true"
  56. @grid-ready="onGridReady"
  57. @rowClicked="detailLocated"
  58. >
  59. </ag-grid-vue>
  60. <!-- 페이징 -->
  61. <div class="ag-grid-custom-pagenations">
  62. <pagination @chg_page="chgPage" :pageObj="pageObj"></pagination>
  63. </div>
  64. </div>
  65. </div>
  66. </div>
  67. </div>
  68. </template>
  69. <script setup>
  70. import pagination from "../components/common/pagination.vue";
  71. import { AgGridVue } from "ag-grid-vue3";
  72. import searchModules from "@/components/search/searchModules";
  73. /************************************************************************
  74. | 레이아웃
  75. ************************************************************************/
  76. definePageMeta({
  77. layout: "default",
  78. });
  79. /************************************************************************
  80. | PROPS
  81. ************************************************************************/
  82. const props = defineProps({
  83. propsData: {
  84. type: Object,
  85. default: () => {},
  86. },
  87. });
  88. /************************************************************************
  89. | 스토어
  90. ************************************************************************/
  91. const useDtStore = useDetailStore();
  92. /************************************************************************
  93. | 전역
  94. ************************************************************************/
  95. const filter = ref("");
  96. const filderArr = ref([
  97. { title: "선택하세요", value: "" },
  98. { title: "제목", value: "title" },
  99. { title: "내용", value: "content" },
  100. ]);
  101. const searchModel = ref("");
  102. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp();
  103. const router = useRouter();
  104. const pageId = ref("CURATION");
  105. const pageIdSub = ref();
  106. let pageObj = ref({
  107. page: 1, // 현재 페이지
  108. pageMaxNumSize: 10, // 페이지 숫자 최대 표현 개수
  109. pageSize: 10, // 테이블 조회 데이터 개수
  110. totalCnt: 0, // 전체 페이지
  111. });
  112. const tblItems = ref([]); // stat 데이터
  113. /* eslint-disable */
  114. /* prettier-ignore */
  115. const remToPx = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
  116. const rowHeightRem = 2.65; // 원하는 rem 값
  117. const rowHeightPx = rowHeightRem * remToPx();
  118. const gridApi = shallowRef();
  119. // gridOption
  120. const gridOptions = {
  121. columnDefs: [
  122. {
  123. headerName: "No",
  124. valueGetter: (params) => params.api.getDisplayedRowCount() - params.node.rowIndex,
  125. sortable: false,
  126. width: 70,
  127. },
  128. { headerName: "언어", field: "brd_lang", sortable: true, width: 70 },
  129. { headerName: "제목", field: "title", sortable: false, width: 500 },
  130. // { headerName: "조회수", field: "", sortable: false },
  131. { headerName: "노출여부", field: "show_yn", sortable: true, width: 70 },
  132. { headerName: "작성자", field: "admin_name", sortable: false, width: 120 },
  133. { headerName: "등록일", field: "crt_dtime", sortable: false, width: 120 },
  134. ],
  135. rowData: tblItems.value, // 테이블 데이터
  136. autoSizeStrategy: {
  137. type: "fitGridWidth", // width맞춤
  138. },
  139. suppressMovableColumns: true,
  140. headerHeight: rowHeightPx,
  141. rowHeight: rowHeightPx,
  142. pagination: true,
  143. suppressPaginationPanel: true, // 하단 default 페이징 컨트롤 숨김
  144. // rowSelection: {
  145. // checkboxes: true,
  146. // headerCheckbox: true,
  147. // enableClickSelection: false,
  148. // mode: "multiRow",
  149. // },
  150. };
  151. /************************************************************************
  152. | 함수(METHODS)
  153. ************************************************************************/
  154. const onGridReady = (__PARAMS) => {
  155. gridApi.value = __PARAMS.api;
  156. };
  157. const chgPage = (__PAGE) => {
  158. pageObj.value.page = __PAGE;
  159. gridApi.value.paginationGoToPage(__PAGE - 1);
  160. };
  161. const addLocated = () => {
  162. router.push({
  163. path: "/view/media/curationAdd",
  164. //query: { id: rowId },
  165. });
  166. useDtStore.boardInfo.pageType = "I";
  167. };
  168. const detailLocated = (__EVENT) => {
  169. router.push({
  170. path: "/view/media/curationAdd",
  171. });
  172. useDtStore.boardInfo.seq = __EVENT.data.seq;
  173. useDtStore.boardInfo.pageType = "U";
  174. };
  175. const newsListGet = () => {
  176. let _req = {
  177. _size: 1000,
  178. _index: 0,
  179. brd_lang: "",
  180. brd_cd: "BR03",
  181. };
  182. useAxios()
  183. .post("/brd/list", _req)
  184. .then((res) => {
  185. _req._size = res.data.list.length;
  186. tblItems.value = res.data.list;
  187. pageObj.value.totalCnt = tblItems.value.length;
  188. })
  189. .catch((error) => {});
  190. };
  191. const fnSearch = (__KEYWORD, __FILTER) => {
  192. let _req = {
  193. _size: 1000,
  194. _index: 0,
  195. brd_lang: "",
  196. brd_cd: "BR03",
  197. content: __FILTER == "content" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  198. title: __FILTER == "title" ? __KEYWORD : __FILTER == "" ? __KEYWORD : null,
  199. };
  200. useAxios()
  201. .post("/brd/list", _req)
  202. .then((res) => {
  203. _req._size = res.data.list.length;
  204. tblItems.value = res.data.list;
  205. pageObj.value.totalCnt = tblItems.value.length;
  206. })
  207. .catch((error) => {});
  208. };
  209. /************************************************************************
  210. | WATCH
  211. ************************************************************************/
  212. onMounted(() => {
  213. newsListGet();
  214. });
  215. </script>