
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
<template>
<div class="card">
<div class="card-body">
<h2 class="card-title">공통코드 관리</h2>
<div>
<div class="search-wrap mb20">
<select name="searchType" id="searchType" class="form-select sm" v-model="searchParams.searchType">
<option value="">전체</option>
<option v-for="(item, index) of searchOptions" :key="index" :value="item.key"> {{ item.label }} </option>
</select>
<input type="text" class="form-control sm" v-model="searchParams.searchText" @keyup.enter="handleSearch" placeholder="검색어를 입력하세요">
<button class="btn-ico md ico-sch" @click="handleSearch"></button>
</div>
<div class="tbl-wrap">
<table id="codeTable" class="tbl data">
<colgroup>
<col style="width: 18%;">
<col style="width: 18%;">
<col style="width: 18%;">
<col style="width: 18%;">
<col style="width: 18%;">
<col style="width: 10%;">
</colgroup>
<thead>
<tr>
<th style="border-radius: 1rem 0 0 0;">상위코드</th>
<th>상위코드명</th>
<th>코드</th>
<th>코드명</th>
<th>등록일</th>
<th style="border-radius: 0 1rem 0 0;">사용여부</th>
</tr>
</thead>
<tbody>
<template v-if="codeList.length > 0">
<tr v-for="(code, index) in codeList" :key="index" :class="{ expired: code.useAt === 'N' }" @click="handleNavigation('view', code.code)">
<td>{{ code.upperCode }}</td>
<td>{{ code.upperCodeNm }}</td>
<td>{{ code.code }}</td>
<td>{{ code.codeNm }}</td>
<td>{{ formatDate(code.rgsde) }}</td>
<td>{{ getActiveStatusText(code.useAt) }}</td>
</tr>
</template>
<tr v-else>
<td colspan="6" class="text-center" style="border-radius: 0 0 1rem 1rem;">등록된 코드가 없습니다.</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="d-flex justify-between align-center">
<div></div>
<Pagination :search="searchParams" @onChange="handlePageChange" />
<button class="btn sm primary" @click="handleNavigation('edit')">등록</button>
</div>
</template>
<script>
import Pagination from "../../../component/Pagination.vue";
// API
import { findCodesProc } from "../../../../resources/api/code";
export default {
name: 'CodeListPage',
components: {
Pagination,
},
data() {
return {
codeList: [], // 코드 목록
searchOptions: [
{ key: "UPPER_CODE", label: "상위코드" },
{ key: "UPPERCODE_NAME", label: "상위코드 이름" },
{ key: "CODE", label: "코드" },
{ key: "CODE_NAME", label: "코드 이름" },
],
searchParams: {
searchType: '',
searchText: '',
currentPage: 1,
}
}
},
mounted() {
this.fetchCodeList();
},
methods: {
// 코드 목록 조회
async fetchCodeList() {
try {
const response = await findCodesProc(this.searchParams);
const result = response.data.data;
this.codeList = result.codes;
this.searchParams = result.search;
} catch (error) {
this.handleError(error);
}
},
// 날짜 포맷팅
formatDate(dateString) {
return dateString ? dateString.split(' ')[0] : '-';
},
// 사용여부 텍스트 반환
getActiveStatusText(useAt) {
return useAt === 'Y' ? '사용중' : useAt === 'N' ? '미사용' : '';
},
// 검색 실행
handleSearch() {
this.searchParams.currentPage = 1;
this.fetchCodeList();
},
// 페이지 변경
handlePageChange(currentPage) {
this.searchParams.currentPage = Number(currentPage);
this.$nextTick(() => {
this.fetchCodeList();
});
},
// 페이지 이동
handleNavigation(type, id) {
const routeMap = {
'list': { name: 'CodeManagementListPage' },
'view': { name: 'CodeManagementViewPage', query: { id } },
'edit': { name: 'CodeManagementInsertPage', query: this.$isEmpty(id) ? {} : { id } },
};
const route = routeMap[type];
if (route) {
this.$router.push(route);
} else {
this.handleNavigationError(type);
}
},
// 네비게이션 에러 처리
handleNavigationError(type) {
console.warn(`유효하지 않은 라우트 타입: ${type}`);
alert("올바르지 않은 경로를 요청하여 목록으로 이동합니다.");
this.$router.push({ name: 'CodeManagementListPage' });
},
// 에러 처리
handleError(error) {
const message = error.response?.data?.message || "에러가 발생했습니다.";
alert(message);
console.error(error.message);
},
},
};
</script>
<style scoped>
tr {
cursor: pointer;
}
</style>