149 lines
3.5 KiB
Vue
149 lines
3.5 KiB
Vue
![]() |
<template>
|
||
|
<div class="codes-page">
|
||
|
<div class="page-header">
|
||
|
<h1>프로그램 관리</h1>
|
||
|
<div class="page-actions">
|
||
|
<button class="action-btn">프로그램 추가</button>
|
||
|
<button class="action-btn primary">저장</button>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div class="aggrid-section">
|
||
|
<div class="aggrid-title">프로그램 목록</div>
|
||
|
<div class="aggrid-container">
|
||
|
<ag-grid-vue
|
||
|
class="ag-theme-material"
|
||
|
style="width: 100%; height: 600px"
|
||
|
:column-defs="programColDefs"
|
||
|
:row-data="programRowData"
|
||
|
:default-col-def="defaultColDef"
|
||
|
/>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<script setup lang="ts">
|
||
|
import { ref, onMounted } from "vue";
|
||
|
import { AgGridVue } from "ag-grid-vue3";
|
||
|
import { ModuleRegistry, AllCommunityModule } from "ag-grid-community";
|
||
|
import type { Program, ColDef, DefaultColDef } from "~/types/ag-grid";
|
||
|
|
||
|
onMounted(() => {
|
||
|
ModuleRegistry.registerModules([AllCommunityModule]);
|
||
|
});
|
||
|
|
||
|
const programColDefs = ref<ColDef[]>([
|
||
|
{ headerName: "부모 코드", field: "parentCode", width: 100 },
|
||
|
{ headerName: "레벨", field: "level", width: 60 },
|
||
|
{ headerName: "코드", field: "code", width: 120 },
|
||
|
{ headerName: "이름", field: "name", width: 160 },
|
||
|
{ headerName: "사용 여부", field: "useYn", width: 80 },
|
||
|
{ headerName: "메뉴 여부", field: "menuYn", width: 80 },
|
||
|
{ headerName: "API 여부", field: "apiYn", width: 80 },
|
||
|
{ headerName: "예외 허용 여부", field: "exceptionYn", width: 110 },
|
||
|
{ headerName: "표시 순서", field: "order", width: 80 },
|
||
|
{ headerName: "uri", field: "uri", width: 180 },
|
||
|
{ headerName: "필드1", field: "field1", width: 100 },
|
||
|
{ headerName: "필드2", field: "field2", width: 100 },
|
||
|
{ headerName: "필드3", field: "field3", width: 100 },
|
||
|
]);
|
||
|
|
||
|
const programRowData = ref<Program[]>([
|
||
|
{
|
||
|
parentCode: "OMS01",
|
||
|
level: 1,
|
||
|
code: "OMS01_01",
|
||
|
name: "DASHBOARD",
|
||
|
useYn: true,
|
||
|
menuYn: true,
|
||
|
apiYn: false,
|
||
|
exceptionYn: false,
|
||
|
order: 1,
|
||
|
uri: "/dashboard/overview",
|
||
|
field1: "ri-pie-chart-2-line",
|
||
|
field2: "",
|
||
|
field3: "",
|
||
|
},
|
||
|
{
|
||
|
parentCode: "OMS01_02",
|
||
|
level: 2,
|
||
|
code: "OMS01_02_01",
|
||
|
name: "IoT 센서이력 조회",
|
||
|
useYn: true,
|
||
|
menuYn: true,
|
||
|
apiYn: false,
|
||
|
exceptionYn: false,
|
||
|
order: 5,
|
||
|
uri: "/environmental/iot-sensor-history",
|
||
|
field1: "ri-line-chart-line",
|
||
|
field2: "",
|
||
|
field3: "",
|
||
|
},
|
||
|
// ... (샘플 데이터 추가)
|
||
|
]);
|
||
|
|
||
|
const defaultColDef = ref<DefaultColDef>({
|
||
|
resizable: true,
|
||
|
sortable: true,
|
||
|
filter: true,
|
||
|
minWidth: 80,
|
||
|
});
|
||
|
</script>
|
||
|
|
||
|
<style scoped>
|
||
|
.codes-page {
|
||
|
padding: 32px 32px 0 32px;
|
||
|
}
|
||
|
.page-header {
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
justify-content: space-between;
|
||
|
margin-bottom: 18px;
|
||
|
}
|
||
|
.page-header h1 {
|
||
|
font-size: 1.35rem;
|
||
|
font-weight: 700;
|
||
|
color: #222;
|
||
|
margin: 0;
|
||
|
}
|
||
|
.page-actions {
|
||
|
display: flex;
|
||
|
gap: 10px;
|
||
|
}
|
||
|
.action-btn {
|
||
|
background: #f4f6fa;
|
||
|
border: 1px solid #e0e7ef;
|
||
|
color: #1976d2;
|
||
|
font-weight: 500;
|
||
|
border-radius: 5px;
|
||
|
padding: 7px 18px;
|
||
|
font-size: 1rem;
|
||
|
cursor: pointer;
|
||
|
transition: background 0.15s, color 0.15s;
|
||
|
}
|
||
|
.action-btn.primary {
|
||
|
background: #1976d2;
|
||
|
color: #fff;
|
||
|
border: none;
|
||
|
}
|
||
|
.action-btn:hover {
|
||
|
background: #e6f0fa;
|
||
|
}
|
||
|
.aggrid-section {
|
||
|
margin-bottom: 32px;
|
||
|
}
|
||
|
.aggrid-title {
|
||
|
font-size: 1.08rem;
|
||
|
font-weight: 600;
|
||
|
color: #1976d2;
|
||
|
margin-bottom: 8px;
|
||
|
margin-left: 2px;
|
||
|
}
|
||
|
.aggrid-container {
|
||
|
background: #fff;
|
||
|
border-radius: 8px;
|
||
|
box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.04);
|
||
|
padding: 18px 18px 0 18px;
|
||
|
}
|
||
|
</style>
|