init dev-push code ui base design

This commit is contained in:
leonard
2025-07-22 09:58:38 +07:00
parent ffdf5ccb66
commit eedbf94d56
214 changed files with 42170 additions and 28040 deletions

View File

@ -515,6 +515,3 @@ function numberFormatter({ value }) {
}
}
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -3,73 +3,50 @@
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="center" no-gutters>
<v-col :cols="4">
<component
:is="'selectCodeList'"
:parentPrgmId="myPrgmId"
:label="'시스템구분'"
dataKey="sysDivCd"
:sendParam="{ commGrpCd: 'CO_SYSDIV', useFg: '1' }"
:addAll="true"
/>
<v-row align="end" no-gutters>
<v-col :cols="3">
<component :is="'selectCodeList'" :parentPrgmId="myPrgmId" :label="'시스템구분'"
dataKey="sysDivCd" :sendParam="{ commGrpCd: 'CO_SYSDIV', useFg: '1' }" :addAll="true"
:customClass="'select-large'" />
</v-col>
<v-col :cols="4">
<component
:is="'selectCodeList'"
:parentPrgmId="myPrgmId"
:label="'사용여부'"
:dataKey="'useFg'"
:sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }"
:addAll="true"
/>
<v-col :cols="3">
<component :is="'selectCodeList'" :parentPrgmId="myPrgmId" :label="'사용여부'"
:dataKey="'useFg'" :sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }" :addAll="true"
:customClass="'select-large'" />
</v-col>
<v-col :cols="4" class="text-right">
<v-btn :ripple="false" @click="search()">조회</v-btn>
<v-col :cols="6" class="text-right">
<BtnSearch @click="search" size="large" />
</v-col>
</v-row>
</v-card>
</v-col>
</v-row>
<v-row ref="contents">
<v-col :cols="4" class="h100">
<v-row ref="contents" class="mt-4">
<v-col :cols="6" class="h100">
<v-card class="pb-5">
<div class="d-flex align-center justify-space-between pa-5">
<div class="d-flex align-center justify-space-between pa-4">
<v-card-title class="pa-0">메뉴 리스트</v-card-title>
<div>
<Buttons
:parentPrgmId="myPrgmId"
:bindingData="gridName"
:btnActionsFnc="btnActions"
/>
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridName" :btnActionsFnc="btnActions" />
</div>
</div>
<div class="h100 px-5" style="height:calc(100% - 70px)">
<div class="h100 px-4" style="height:calc(100% - 70px)">
<div ref="treeGridParent" class="w100 h100">
<component
:ref="gridName + myPrgmId"
:is="loadTree ? 'Grid' : null"
:gridName="gridName"
:parentPrgmId="myPrgmId"
@getRowsData="getRowData"
/>
<component :ref="gridName + myPrgmId" :is="loadTree ? 'Grid' : null" :gridName="gridName"
:parentPrgmId="myPrgmId" @getRowsData="getRowData" :dataPath="dataPathExample" />
</div>
</div>
</v-card>
</v-col>
<v-col :cols="8" class="h100">
<v-col :cols="6" class="h100">
<v-card class="pb-5">
<div class="d-flex align-center justify-space-between pa-5">
<div class="d-flex align-center justify-space-between pa-4">
<v-card-title class="pa-0">메뉴 상세</v-card-title>
</div>
<div class="px-5" style="height:calc(100% - 76px)">
<component
:is="'Form'"
:parentPrgmId="myPrgmId"
:detailList="detailList"
@gridEditingFinish="gridEditingFinish"
/>
<div class="px-4 py-2" style="height:calc(100% - 76px)">
<component :is="'Form'" :parentPrgmId="myPrgmId" :detailList="detailList"
@gridEditingFinish="gridEditingFinish" />
</div>
</v-card>
</v-col>
@ -82,6 +59,7 @@ import Utility from '~/plugins/utility';
import { mapState, mapMutations, mapActions } from 'vuex';
import Grid from '~/components/common/Grid';
import Buttons from '~/components/common/button/Buttons';
import BtnSearch from '~/components/common/button/BtnSearch';
import selectCodeList from '@/components/common/select/selectCodeList';
import Form from '~/components/common/form/Form';
@ -107,14 +85,27 @@ export default {
Buttons,
selectCodeList,
Form,
BtnSearch
},
data() {
return {
myPrgmId: myPrgmId,
gridName: 'treeGrid',
loadTree: false,
loadTree: true,
detailList: myDetail,
addRowFg: false,
dataPathExample: {
"treeGrid": {
data: sampleData,
column: [
{ header: '메뉴명', name: 'menuNm' },
{ header: 'prgmId ', name: 'prgmId', hidden: true },
{ header: 'sysDivCd ', name: 'sysDivCd', hidden: true },
],
option: myOptions,
}
}
};
},
computed: {
@ -218,8 +209,8 @@ export default {
item.upMenuId && item.upMenuId != '0'
? item.upMenuId
: item.upMenuId == '0'
? '0'
: 'ROOT',
? '0'
: 'ROOT',
};
return newItem;
});
@ -239,12 +230,12 @@ export default {
//rowKey: 0,
rowKey:
this.pageData.rowGridSelectKey == '' ||
this.pageData.rowGridSelectKey == null
this.pageData.rowGridSelectKey == null
? 0
: this.pageData.rowGridSelectKey ==
this.$refs[this.gridName + this.myPrgmId].getData().length - 1
? this.pageData.rowGridSelectKey
: 0,
this.$refs[this.gridName + this.myPrgmId].getData().length - 1
? this.pageData.rowGridSelectKey
: 0,
columnName: 'menuNm',
setScroll: true,
});
@ -371,6 +362,63 @@ const defaultData = {
},
},
};
const sampleData = [
{
"menuNm": "root",
"prgmId": "PRGM001",
"sysDivCd": "SYS01",
"_children": [
{
"menuNm": "서울 본사 - 1층",
"prgmId": "PRGM001-1",
"sysDivCd": "SYS01"
},
{
"menuNm": "서울 본사 - 2층",
"prgmId": "PRGM001-2",
"sysDivCd": "SYS01"
}
]
},
{
"menuNm": "부산 지사",
"prgmId": "PRGM002",
"sysDivCd": "SYS02",
"_children": [
{
"menuNm": "부산 지사 - A동",
"prgmId": "PRGM002-A",
"sysDivCd": "SYS02",
"_children": [
{
"menuNm": "부산 지사 - A동 1층",
"prgmId": "PRGM002-A1",
"sysDivCd": "SYS02"
}
]
}
]
},
{
"menuNm": "대전 창고",
"prgmId": "PRGM003",
"sysDivCd": "SYS03"
}
]
;
const myOptions = {
columnOptions: {
resizable: true,
},
treeColumnOptions: {
name: 'menuNm',       // Showing tree table
useIcon: false,      // Not using icon
indentWidth: 10,
},
}
const myDetail = [
{
type: 'InputText',
@ -378,7 +426,10 @@ const myDetail = [
valueNm: 'menuId',
readonly: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
required: false,
placeholder: '시스템 자동입력',
},
@ -388,7 +439,10 @@ const myDetail = [
valueNm: 'upMenuId',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
required: true,
},
{
@ -397,7 +451,10 @@ const myDetail = [
valueNm: 'menuNm',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
required: true,
},
{
@ -406,7 +463,10 @@ const myDetail = [
valueNm: 'prgmId',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
},
{
type: 'SelectBox',
@ -414,7 +474,9 @@ const myDetail = [
valueNm: 'sysDivCd',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
list: 'sysDivCdList',
itemText: 'commCdNm',
itemValue: 'commCd',
@ -425,7 +487,10 @@ const myDetail = [
valueNm: 'useFg',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
value: { '1': true, '0': false },
required: true,
},
@ -435,7 +500,10 @@ const myDetail = [
valueNm: 'sortSeq',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
required: true,
},
{
@ -444,7 +512,10 @@ const myDetail = [
valueNm: 'regUserNo',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
placeholder: '시스템 자동입력',
},
{
@ -453,7 +524,10 @@ const myDetail = [
valueNm: 'regDttm',
disabled: true,
cols: 6,
class: 'py-2',
clabelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
placeholder: '시스템 자동입력',
},
{
@ -462,7 +536,10 @@ const myDetail = [
valueNm: 'procUserNo',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
placeholder: '시스템 자동입력',
},
{
@ -471,11 +548,11 @@ const myDetail = [
valueNm: 'procDttm',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
placeholder: '시스템 자동입력',
},
];
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -827,6 +827,3 @@ function numberFormatter({ value }) {
}
}
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -3,7 +3,7 @@
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="center" no-gutters>
<v-row>
<v-col :cols="3">
<component
:is="'InputText'"
@ -11,6 +11,8 @@
valueNm="roleId"
label="역할코드"
:searchOption="true"
:iconShow="true"
customClass="input-large"
/>
</v-col>
<v-col :cols="3">
@ -20,6 +22,8 @@
valueNm="roleNm"
label="역할명"
:searchOption="true"
:iconShow="true"
customClass="input-large"
/>
</v-col>
<v-col :cols="3">
@ -30,10 +34,13 @@
:dataKey="'useFg'"
:sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }"
:addAll="true"
:iconShow="true"
customClass="select-large"
/>
</v-col>
<v-col :cols="3" class="text-right">
<v-btn :ripple="false" @click="search()">조회</v-btn>
<v-col :cols="3" class="d-flex align-end justify-end text-right">
<!-- <v-btn :ripple="false" @click="search()">조회</v-btn> -->
<BtnSearch @click="search" size="large" />
</v-col>
</v-row>
</v-card>
@ -60,6 +67,7 @@
:gridName="gridName"
:parentPrgmId="myPrgmId"
@getRowsData="getRowData"
:dataPath="dataPathMock"
/>
</div>
</div>
@ -93,6 +101,7 @@ import Buttons from '~/components/common/button/Buttons';
import selectCodeList from '@/components/common/select/selectCodeList';
import InputText from '@/components/common/input/InputText';
import Form from '~/components/common/form/Form';
import BtnSearch from '~/components/common/button/BtnSearch';
let myTitle;
let myPrgmId;
@ -112,6 +121,7 @@ export default {
closable: true,
},
components: {
BtnSearch,
Grid,
Buttons,
selectCodeList,
@ -122,8 +132,22 @@ export default {
return {
myPrgmId: myPrgmId,
gridName: 'rowGrid',
loadGrid: false,
loadGrid: true,
detailList: myDetail,
dataPathMock : {
rowGrid: {
column: [
{ header: '추가 정보 그룹', name: 'addGrpId', align: 'left' },
{ header: '추가 정보 ID', name: 'addInfoId', align: 'left' },
{ header: '추가 정보 명', name: 'addInfoNm', align: 'left' },
{ header: 'Data 형식', name: 'addInfoDataKind', align: 'center' },
{ header: '사용여부', name: 'useFg', align: 'center' },
],
data: dataMockExample,
defaultRow: dataMockExample,
option: {},
},
},
};
},
computed: {
@ -394,7 +418,10 @@ const myDetail = [
valueNm: 'roleId',
readonly: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
required: false,
placeholder: '시스템 자동입력',
},
@ -404,7 +431,10 @@ const myDetail = [
valueNm: 'roleNm',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
required: true,
},
{
@ -413,7 +443,10 @@ const myDetail = [
valueNm: 'useFg',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
value: { '1': true, '0': false },
required: true,
},
@ -423,7 +456,10 @@ const myDetail = [
valueNm: 'rmrk',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
},
// {
// type: "InputText",
@ -439,7 +475,10 @@ const myDetail = [
valueNm: 'regUserNo',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
placeholder: '시스템 자동입력',
},
{
@ -448,7 +487,10 @@ const myDetail = [
valueNm: 'regDttm',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
placeholder: '시스템 자동입력',
},
{
@ -457,7 +499,10 @@ const myDetail = [
valueNm: 'procUserNo',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
placeholder: '시스템 자동입력',
},
{
@ -466,11 +511,50 @@ const myDetail = [
valueNm: 'procDttm',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
placeholder: '시스템 자동입력',
},
];
const dataMockExample = [
{
addGrpId: 'GRP001',
addInfoId: 'INFO001',
addInfoNm: '온도 센서',
addInfoDataKind: 'DATA01',
useFg: true,
},
{
addGrpId: 'GRP002',
addInfoId: 'INFO002',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA02',
useFg: false,
},
{
addGrpId: 'GRP003',
addInfoId: 'INFO003',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA03',
useFg: false,
},
{
addGrpId: 'GRP004',
addInfoId: 'INFO004',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA04',
useFg: false,
},
{
addGrpId: 'GRP005',
addInfoId: 'INFO005',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA05',
useFg: false,
},
];
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -1037,6 +1037,3 @@ function sha512(str) {
.digest('hex');
}
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -4,24 +4,28 @@
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="center" no-gutters>
<v-col :cols="2">
<v-row align="end" no-gutters>
<v-col :cols="2.5">
<InputText
:parentPrgmId="myPrgmId"
label="배치ID"
valueNm="batchId"
:searchOption="true"
:iconShow="true"
customClass="input-large"
/>
</v-col>
<v-col :cols="2">
<v-col :cols="2.5">
<InputText
:parentPrgmId="myPrgmId"
label="배치명"
valueNm="batchNm"
:searchOption="true"
:iconShow="true"
customClass="input-large"
/>
</v-col>
<v-col :cols="2">
<v-col :cols="2.5">
<component
:is="'selectCodeList'"
:parentPrgmId="myPrgmId"
@ -29,19 +33,21 @@
:dataKey="'execRsltCd'"
:sendParam="{ commGrpCd: 'CO_BATCH_EXEC_RSLT', useFg: '1' }"
:addAll="true"
:iconShow="true"
customClass="select-large"
/>
</v-col>
<v-col :cols="2">
<v-col :cols="2.5">
<component
:is="'Datepicker'"
:parentPrgmId="myPrgmId"
:label="'조회기간'"
:customClass="'input-large'"
/>
</v-col>
<v-spacer></v-spacer>
<v-col :cols="4" class="text-right">
<BtnSearch />
<BtnExcelDownload :parentPrgmId="myPrgmId" :gridName="gridName" />
<v-col :cols="2" class="text-right d-flex align-end justify-end ga-1" style="gap: 4px">
<BtnSearch size="large" />
<BtnExcelDownload :parentPrgmId="myPrgmId" :gridName="gridName" size="large" />
</v-col>
</v-row>
</v-card>
@ -57,10 +63,11 @@
<div ref="gridParent" class="px-5 h100">
<component
:ref="gridName"
:is="loadGrid ? 'Grid' : null"
:is=" 'Grid' "
:parentPrgmId="myPrgmId"
:gridName="gridName"
@getRowsData="getRowData"
:dataPath="dataPathMock"
/>
</div>
</div>
@ -133,10 +140,56 @@ export default {
data() {
return {
myPrgmId: myPrgmId,
loadGrid: false,
loadGrid: true,
gridName: 'rowGrid',
// rowGridOrigin: [],
detailList: myDetail,
dataPathMock : {
'rowGrid': {
column: [
{ header: 'No.', name: 'batchLogSeq', align: 'center', width: 100 },
{ header: '배치ID', name: 'batchId', align: 'center', width: 100 },
{ header: '배치명', name: 'batchNm', align: 'left', width: 150 },
{ header: '실행 일자', name: 'execDt', align: 'center', width: 80 },
{
header: '실행 결과',
name: 'execRsltCd',
align: 'center',
width: 80,
// formatter({ value }) {
// let retVal = '';
// const newValue = _this.pageData.execRsltCdList.filter(
// item => item.commCd == value,
// );
// if (newValue.length > 0) {
// retVal = newValue[0].commCdNm;
// }
// return retVal;
// },
}, // "1": 프로그램, "2": 팝업
{ header: '실행 로그', name: 'execLogCont', minWidth: 150 },
{
header: '배치 시작 일시',
name: 'batchStrtDttm',
align: 'center',
width: 160,
},
{
header: '배치 종료 일시',
name: 'batchEndDttm',
align: 'center',
width: 160,
},
{ header: '등록자NO', name: 'regUserNo', width: 120 },
{ header: '등록일시', name: 'regDttm', align: 'center', width: 160 },
{ header: '수정자NO', name: 'procUserNo', width: 120 },
{ header: '수정일시', name: 'procDttm', align: 'center', width: 160 },
],
data: dataMockExample,
defaultRow: dataMockExample,
option: {},
},
},
};
},
computed: {
@ -195,6 +248,14 @@ export default {
init() {
// this.layoutInit();
this.gridInit();
// _this.pageData = {
// execRsltCdList: [
// { commCd: '1', commCdNm: '성공' },
// { commCd: '2', commCdNm: '실패' },
// ],
// };
},
// layoutInit() {
// const searchFilterHeight = this.$refs.searchFilter.offsetHeight;
@ -307,10 +368,13 @@ export default {
}
});
},
async getRowData(data) {
// async getRowData(data) {
async getRowData() {
console.log("something")
this.setPageData({
rowGridSelectKey: data.rowKey,
rowGridSelectData: data,
// rowGridSelectKey: data.rowKey,
rowGridSelectKey: 1,
rowGridSelectData: fakeRowData,
});
},
compareData(type, newDt) {
@ -417,16 +481,86 @@ const defaultData = {
},
};
const dataMockExample = [
{
batchLogSeq: 1,
batchId: 'BATCH001',
batchNm: '일일 데이터 백업',
execDt: '2025-07-15',
execRsltCd: '1', // sẽ được formatter thành "성공" hoặc tương tự
execLogCont: '백업 완료. 오류 없음.',
batchStrtDttm: '2025-07-15 01:00:00',
batchEndDttm: '2025-07-15 01:30:00',
regUserNo: 'admin01',
regDttm: '2025-07-15 01:00:00',
procUserNo: 'admin02',
procDttm: '2025-07-15 01:35:00',
},
{
batchLogSeq: 2,
batchId: 'BATCH002',
batchNm: '월간 리포트 생성',
execDt: '2025-07-01',
execRsltCd: '2',
execLogCont: '리포트 생성 중 오류 발생: 파일 접근 실패.',
batchStrtDttm: '2025-07-01 03:00:00',
batchEndDttm: '2025-07-01 03:10:00',
regUserNo: 'reportUser',
regDttm: '2025-07-01 03:00:00',
procUserNo: 'admin03',
procDttm: '2025-07-01 03:15:00',
},
{
batchLogSeq: 3,
batchId: 'BATCH003',
batchNm: '사용자 통계 갱신',
execDt: '2025-07-14',
execRsltCd: '1',
execLogCont: '통계 갱신 완료.',
batchStrtDttm: '2025-07-14 23:00:00',
batchEndDttm: '2025-07-14 23:20:00',
regUserNo: 'statUser',
regDttm: '2025-07-14 23:00:00',
procUserNo: 'admin01',
procDttm: '2025-07-14 23:25:00',
},
];
const fakeRowData = {
rowKey: 1,
batchLogSeq: 1,
batchId: 'BATCH001',
batchNm: '일일 데이터 백업',
execDt: '2025-07-15',
execRsltCd: '1',
execLogCont: JSON.stringify({
session: {
userNo: 'admin01',
userNm: '관리자',
comId: 'SKCC',
locale: 'ko_KR',
},
batch: {
comId: 'SKCC',
totStdDt: '20230110',
},
}),
batchStrtDttm: '2025-07-15 01:00:00',
batchEndDttm: '2025-07-15 01:30:00',
regUserNo: 'admin01',
regDttm: '2025-07-15 01:00:00',
procUserNo: 'admin02',
procDttm: '2025-07-15 01:35:00',
};
const myDetail = [
{
type: 'TextArea',
valueNm: 'execLogCont',
readonly: true,
cols: 12,
class: 'py-2',
class: 'py-2 transparent',
},
];
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -4,45 +4,38 @@
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="center" no-gutters>
<v-col :cols="2">
<InputText
:parentPrgmId="myPrgmId"
label="배치ID"
valueNm="batchId"
:searchOption="true"
/>
<v-row align="end" no-gutters>
<v-col :cols="2.5">
<InputText :parentPrgmId="myPrgmId" label="배치ID" valueNm="batchId" :searchOption="true"
:customClass="'input-large'" />
</v-col>
<v-col :cols="2">
<InputText
:parentPrgmId="myPrgmId"
label="배치명"
valueNm="batchNm"
:searchOption="true"
/>
<v-col :cols="2.5">
<InputText :parentPrgmId="myPrgmId" label="배치명" valueNm="batchNm" :searchOption="true"
:customClass="'input-large'" />
</v-col>
<v-col :cols="3">
<component
<v-col :cols="2.5">
<!-- <component
:is="'selectCodeList'"
:parentPrgmId="myPrgmId"
:label="'배치 실행 구분'"
:dataKey="'searchBatchExecTp'"
:sendParam="{ commGrpCd: 'CO_BATCH_EXEC_TP', useFg: '1' }"
:addAll="true"
/>
:customClass="'select-large'"
/> -->
</v-col>
<v-col :cols="3">
<component
<v-col :cols="2.5">
<!-- <component
:is="'selectCodeList'"
:parentPrgmId="myPrgmId"
:label="'사용여부'"
:dataKey="'searchUseFg'"
:sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }"
/>
</v-col>
<v-col :cols="2" class="text-right">
<BtnSearch />
:customClass="'select-large'"
/> -->
</v-col>
<BtnSearch size="large" />
</v-row>
</v-card>
</v-col>
@ -50,77 +43,47 @@
<v-row ref="contents">
<!-- 배치 리스트 -->
<v-col :cols="5" class="h100" style="height: calc(100vh - 180px);">
<v-col :cols="6" class="h100">
<v-card class="pb-5">
<div class="d-flex align-center justify-space-between pa-5">
<div class="d-flex align-center justify-space-between pa-4">
<!-- <v-card-title>
<span class="tit ft-size_20 ft-weight_600">배치 리스트</span>
</v-card-title> -->
<v-card-title class="pa-0"> 배치 리스트 </v-card-title>
<!-- <v-card-actions> -->
<Buttons
:parentPrgmId="myPrgmId"
:bindingData="gridName"
:detailList="detailList"
:btnActionsFnc="btnActions"
/>
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridName" :detailList="detailList"
:btnActionsFnc="btnActions" />
</div>
<div class="px-5" style="height:calc(100% - 70px);">
<div class="px-4">
<div ref="gridParent" class="h100 w100">
<component
:ref="gridName"
:is="loadGrid ? 'Grid' : null"
:parentPrgmId="myPrgmId"
:gridName="gridName"
@getRowsData="getRowData"
/>
<component :ref="gridName" :is="loadGrid ? 'Grid' : null" :parentPrgmId="myPrgmId"
:gridName="gridName" @getRowsData="getRowData" :dataPath="dataPathExample" />
</div>
<!-- </v-card-actions> -->
</div>
</v-card>
</v-col>
<!-- 배치 상세 -->
<v-col :cols="7" class="h100" style="height: calc(100vh - 180px);">
<v-col :cols="6" class="h100">
<v-card class="pd-y-20 h100">
<v-card-title class="d-flex justify-space-between align-end">
<v-card-title class="d-flex justify-space-between align-end pa-4">
<span class="tit ft-size_20 ft-weight_600">배치 상세</span>
</v-card-title>
<v-card-actions>
<div
ref="gridParent"
class="w100"
style="height: calc(100vh - 380px); padding-left:15px"
>
<component
:is="'Form'"
:parentPrgmId="myPrgmId"
:detailList="detailList"
@gridEditingFinish="gridEditingFinish"
@inputClick="inputClick"
/>
<div ref="gridParent" class="w100 pa-2 pb-6">
<component :is="'Form'" :parentPrgmId="myPrgmId" :detailList="detailList"
@gridEditingFinish="gridEditingFinish" @inputClick="inputClick" />
</div>
</v-card-actions>
</v-card>
</v-col>
<v-dialog
ref="popModal"
v-model="dialog"
width="700"
overlay-color="#000"
overlay-opacity="0.8"
scrollable
>
<v-dialog ref="popModal" v-model="dialog" width="700" overlay-color="#000" overlay-opacity="0.8" scrollable>
<v-card style="height: 100%">
<v-card-title
class="v-card__title d-flex align-center justify-space-between"
>
<v-card-title class="v-card__title d-flex align-center justify-space-between">
<span class="custom-title-4">DB 프로시져 파라메터 설정</span>
<div>
<Buttons
:parentPrgmId="myPrgmId"
:bindingData="gridNameParam"
:btnActionsFnc="btnActionsParam"
/>
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridNameParam"
:btnActionsFnc="btnActionsParam" />
</div>
</v-card-title>
<div class="pa-5">
@ -132,23 +95,16 @@
<v-card-text style="height: 300px;">
<div id="gridParent" class="mt-6" style="height:calc(100% - 36px);">
<div style="height:calc(100% - 36px);">
<Grid
:ref="gridNameParam"
:is="paramLoadGrid && dialog ? 'Grid' : null"
:gridName="gridNameParam"
:parentPrgmId="myPrgmId"
:editorGrid="true"
@getRowsData="getGridNameParamRowData"
/>
<Grid :ref="gridNameParam" :is="paramLoadGrid && dialog ? 'Grid' : null"
:gridName="gridNameParam" :parentPrgmId="myPrgmId" :editorGrid="true"
@getRowsData="getGridNameParamRowData" />
</div>
</div>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="primary" dark @click="setParamChangeData()"
>확인</v-btn
>
<v-btn color="primary" dark @click="setParamChangeData()">확인</v-btn>
<v-btn color="primary" dark @click="dialog = false">닫기</v-btn>
</v-card-actions>
</v-card>
@ -199,15 +155,76 @@ export default {
data() {
return {
myPrgmId: myPrgmId,
loadGrid: false,
loadGrid: true,
gridName: 'rowGrid',
dataPathExample: {
"rowGrid": {
data: [
{
"batchId": "BATCH001",
"batchNm": "일일 데이터 백업",
"batchExecTp": "자동 실행",
"batchDupExecFg": "N",
"useFg": "사용"
},
{
"batchId": "BATCH002",
"batchNm": "월간 리포트 생성",
"batchExecTp": "수동 실행",
"batchDupExecFg": "Y",
"useFg": "사용"
},
{
"batchId": "BATCH003",
"batchNm": "로그 정리 작업",
"batchExecTp": "자동 실행",
"batchDupExecFg": "N",
"useFg": "미사용"
},
{
"batchId": "BATCH004",
"batchNm": "사용자 통계 수집",
"batchExecTp": "예약 실행",
"batchDupExecFg": "Y",
"useFg": "사용"
},
{
"batchId": "BATCH005",
"batchNm": "서버 상태 점검",
"batchExecTp": "수동 실행",
"batchDupExecFg": "N",
"useFg": "미사용"
}
]
,
column: [
{ header: '배치ID', name: 'batchId', align: 'center', width: 100 },
{ header: '배치명', name: 'batchNm', minWidth: 200 },
{
header: '배치 실행 구분',
name: 'batchExecTp',
align: 'left',
minWidth: 190,
},
{ header: '배치 중복 여부', name: 'batchDupExecFg', hidden: true },
{
header: '사용여부',
name: 'useFg',
align: 'center',
width: 145,
},
],
}
},
// rowGridOrigin: [],
detailList: myDetail,
// 파라메터 셋팅용 변수
dialog: false,
gridNameParam: 'paramGrid',
paramLoadGrid: false,
paramLoadGrid: true,
selectedGridNameParamRow: null,
};
},
@ -275,7 +292,7 @@ export default {
}),
init() {
// this.layoutInit();
this.gridInit();
// this.gridInit();
this.gridParamInit();
},
// layoutInit() {
@ -367,7 +384,7 @@ export default {
},
async search() {
// console.log("search");
await this.getRowGridData();
// await this.getRowGridData();
await this.setPageData({
isFind: false,
});
@ -410,12 +427,12 @@ export default {
//rowKey: this.chkRowGridSelectKey || 0,
rowKey:
this.pageData.rowGridSelectKey == '' ||
this.pageData.rowGridSelectKey == null
this.pageData.rowGridSelectKey == null
? 0
: this.pageData.rowGridSelectKey ==
this.$refs[this.gridName].getData().length - 1
? this.pageData.rowGridSelectKey
: 0,
this.$refs[this.gridName].getData().length - 1
? this.pageData.rowGridSelectKey
: 0,
setScroll: true,
});
}
@ -596,6 +613,7 @@ export default {
}
},
gridParamInit() {
const gridHeight = this.$refs.gridParent.offsetHeight - 36;
const myOptions = {
columnOptions: {
@ -611,20 +629,20 @@ export default {
gridKey: this.gridNameParam,
value: myOptions,
});
setTimeout(() => {});
// setTimeout(() => { });
let modeList = [];
const modeIn = { text: 'IN', value: 'IN' };
const modeOut = { text: 'OUT', value: 'OUT' };
modeList.push(modeIn);
modeList.push(modeOut);
let typeList = [];
const typeInt = { text: 'INT', value: 'int' };
const typeStr = { text: 'STRING', value: 'str' };
const typeFunc = { text: 'FUNCTION', value: 'function' };
typeList.push(typeInt);
typeList.push(typeStr);
typeList.push(typeFunc);
// let modeList = [];
// const modeIn = { text: 'IN', value: 'IN' };
// const modeOut = { text: 'OUT', value: 'OUT' };
// modeList.push(modeIn);
// modeList.push(modeOut);
// let typeList = [];
// const typeInt = { text: 'INT', value: 'int' };
// const typeStr = { text: 'STRING', value: 'str' };
// const typeFunc = { text: 'FUNCTION', value: 'function' };
// typeList.push(typeInt);
// typeList.push(typeStr);
// typeList.push(typeFunc);
const myColumns = [
{ header: 'ID', name: 'id', editor: 'text' },
@ -646,27 +664,27 @@ export default {
header: 'Type',
name: 'type',
align: 'center',
formatter({ value }) {
let retVal = '';
switch (value) {
case 'int':
retVal = 'INT';
break;
case 'str':
retVal = 'STRING';
break;
case 'function':
retVal = 'FUNCTION';
break;
}
return retVal;
},
editor: {
type: 'select',
options: {
listItems: typeList,
},
},
// formatter({ value }) {
// let retVal = '';
// switch (value) {
// case 'int':
// retVal = 'INT';
// break;
// case 'str':
// retVal = 'STRING';
// break;
// case 'function':
// retVal = 'FUNCTION';
// break;
// }
// return retVal;
// },
// editor: {
// type: 'select',
// options: {
// listItems: typeList,
// },
// },
},
{ header: '값', name: 'val', editor: 'text' },
{ header: 'rowStat', name: 'rowStat', hidden: true },
@ -676,56 +694,95 @@ export default {
gridKey: this.gridNameParam,
value: myColumns,
});
this.getRowParamData();
this.paramLoadGrid = true;
// this.getRowParamData();
},
getRowParamData() {
this.paramLoadGrid = false;
let res = [];
// let res = [];
/* this.pageData.paramStrData 처리 */
// console.log("this.pageData.paramStrData : ", JSON.parse(this.pageData.paramStrData));
let rowData = {};
if (
this.pageData.paramStrData.startsWith('{') &&
this.pageData.paramStrData.endsWith('}')
) {
rowData = JSON.parse(this.pageData.paramStrData);
}
var keys = Object.keys(rowData); //키를 가져옵니다. 이때, keys 는 반복가능한 객체가 됩니다.
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
res.push(rowData[key]);
}
// /* this.pageData.paramStrData 처리 */
// // console.log("this.pageData.paramStrData : ", JSON.parse(this.pageData.paramStrData));
// let rowData = {};
// if (
// this.pageData.paramStrData.startsWith('{') &&
// this.pageData.paramStrData.endsWith('}')
// ) {
// rowData = JSON.parse(this.pageData.paramStrData);
// }
// var keys = Object.keys(rowData); //키를 가져옵니다. 이때, keys 는 반복가능한 객체가 됩니다.
// for (var i = 0; i < keys.length; i++) {
// var key = keys[i];
// res.push(rowData[key]);
// }
const newRes = res.map(item => {
const newObj = {
...item,
rowStat: null,
id: item.id || '',
mode: item.mode || 'in',
type: item.type || 'str',
val: item.val || '',
};
return newObj;
});
// const newRes = res.map(item => {
// const newObj = {
// ...item,
// rowStat: null,
// id: item.id || '',
// mode: item.mode || 'in',
// type: item.type || 'str',
// val: item.val || '',
// };
// return newObj;
// });
const newRes = [
{
"id": "VAR001",
"mode": "OUT",
"type": "int",
"val": "100",
"rowStat": "C"
},
{
"id": "VAR002",
"mode": "IN",
"type": "str",
"val": "Hello World",
"rowStat": "U"
},
{
"id": "FUNC001",
"mode": "out",
"type": "function",
"val": "calculateSum()",
"rowStat": "C"
},
{
"id": "VAR003",
"mode": "IN",
"type": "int",
"val": "42",
"rowStat": "D"
},
{
"id": "VAR004",
"mode": "OUT",
"type": "str",
"val": "Sample Text",
"rowStat": "C"
}
];
this.setGridData({
gridKey: this.gridNameParam,
value: newRes,
});
this.$nextTick(() => {
if (newRes.length > 0) {
try {
this.$refs[this.gridNameParam].focus({
//rowKey: 0,
rowKey: 0,
setScroll: true,
});
} catch (error) {
console.log('error[nextTick grid] : ', error);
}
}
});
// this.$nextTick(() => {
// if (newRes.length > 0) {
// try {
// this.$refs[this.gridNameParam].focus({
// //rowKey: 0,
// rowKey: 0,
// setScroll: true,
// });
// } catch (error) {
// console.log('error[nextTick grid] : ', error);
// }
// }
// });
this.paramLoadGrid = true;
},
xlsDataBind(res) {
@ -754,21 +811,22 @@ export default {
},
inputClick(event, item, valueNm) {
if (valueNm == 'refVal1') {
const rowIdxKey = this.$refs[this.gridName].gridInstance.invoke(
'getFocusedCell',
).rowKey;
const selectRowData = this.$refs[this.gridName].gridInstance.invoke(
'getRow',
rowIdxKey,
);
this.dialog = true;
// const rowIdxKey = this.$refs[this.gridName].gridInstance.invoke(
// 'getFocusedCell',
// ).rowKey;
// const selectRowData = this.$refs[this.gridName].gridInstance.invoke(
// 'getRow',
// rowIdxKey,
// );
if (selectRowData.batchExecTp == 'DP') {
// 여기에 팝업 레이어 띠우기 기능 추가
this.pageData.paramStrData = event.target.value;
this.pageData.paramChangeDataTarget = event.target;
this.getRowParamData();
this.dialog = true;
}
// if (selectRowData.batchExecTp == 'DP') {
// // 여기에 팝업 레이어 띠우기 기능 추가
// this.pageData.paramStrData = event.target.value;
// this.pageData.paramChangeDataTarget = event.target;
// this.getRowParamData();
// this.dialog = true;
// }
}
},
setParamChangeData() {
@ -835,10 +893,10 @@ const defaultData = {
/* 파라메터 설정요 변수 */
/* { "1": {"id": "comId", "type": "str", "val": "COM01"},
"2": {"id": "toStrDt", "type": "function", "val": "DATE_FORMAT(NOW(), '%Y%h%d')"},
"3": {"id": "userId", "type": "str", "val": "3"},
"4": {"id": "retCd", "mode":"OUT","type": "int", "val": "-1"},
"5": {"id": "retMsg", "mode":"OUT","type": "str", "val": "전달"}} */
"2": {"id": "toStrDt", "type": "function", "val": "DATE_FORMAT(NOW(), '%Y%h%d')"},
"3": {"id": "userId", "type": "str", "val": "3"},
"4": {"id": "retCd", "mode":"OUT","type": "int", "val": "-1"},
"5": {"id": "retMsg", "mode":"OUT","type": "str", "val": "전달"}} */
paramStrData: '',
paramChangeDataStr: '',
paramChangeDataTarget: null,
@ -920,7 +978,10 @@ const myDetail = [
valueNm: 'batchId',
readonly: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
required: false,
placeholder: '시스템 자동입력',
},
@ -929,7 +990,10 @@ const myDetail = [
label: '배치명',
valueNm: 'batchNm',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
required: true,
},
{
@ -937,7 +1001,10 @@ const myDetail = [
label: '배치 실행 구분',
valueNm: 'batchExecTp',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
list: 'batchExecTpList',
itemText: 'commCdNm',
itemValue: 'commCd',
@ -948,7 +1015,10 @@ const myDetail = [
label: '배치 중복 여부',
valueNm: 'batchDupExecFg',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
list: 'batchDupExecFgList',
itemText: 'commCdNm',
itemValue: 'commCd',
@ -959,7 +1029,10 @@ const myDetail = [
label: '실행주기(초)',
valueNm: 'execCyclSecVal',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
required: true,
},
{
@ -967,7 +1040,10 @@ const myDetail = [
label: '실행주기(분)',
valueNm: 'execCyclMinVal',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
required: true,
},
{
@ -975,7 +1051,10 @@ const myDetail = [
label: '실행주기(시)',
valueNm: 'execCyclHhVal',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
required: true,
},
{
@ -983,7 +1062,10 @@ const myDetail = [
label: '실행주기(일)',
valueNm: 'execCyclDdVal',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
required: true,
},
{
@ -991,7 +1073,10 @@ const myDetail = [
label: '실행주기(월)',
valueNm: 'execCyclMmVal',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
required: true,
},
{
@ -999,7 +1084,10 @@ const myDetail = [
label: '실행주기(요일)',
valueNm: 'execCyclWdayVal',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
required: true,
},
{
@ -1007,7 +1095,10 @@ const myDetail = [
label: '실행주기(년)',
valueNm: 'execCyclYyyyVal',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
required: true,
},
{
@ -1015,7 +1106,10 @@ const myDetail = [
label: '후속배치',
valueNm: 'fllwBatchId',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
list: 'fllwBatchIdList',
itemText: 'batchIdNm',
itemValue: 'batchId',
@ -1026,7 +1120,10 @@ const myDetail = [
label: '실행명령',
valueNm: 'execCmnd',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
required: true,
},
{
@ -1034,7 +1131,10 @@ const myDetail = [
label: '실행 명령 경로',
valueNm: 'execCmndPath',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
required: true,
},
{
@ -1042,7 +1142,10 @@ const myDetail = [
label: '참조값1',
valueNm: 'refVal1',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
required: true,
},
{
@ -1050,21 +1153,30 @@ const myDetail = [
label: '참조값2',
valueNm: 'refVal2',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
},
{
type: 'InputText',
label: '참조값3',
valueNm: 'refVal3',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
},
{
type: 'CheckBox',
label: '사용여부',
valueNm: 'useFg',
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
value: { '1': true, '0': false },
required: true,
},
@ -1074,7 +1186,10 @@ const myDetail = [
valueNm: 'regUserNo',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
placeholder: '시스템 자동입력',
},
{
@ -1083,7 +1198,10 @@ const myDetail = [
valueNm: 'regDttm',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
placeholder: '시스템 자동입력',
},
{
@ -1092,7 +1210,10 @@ const myDetail = [
valueNm: 'procUserNo',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pr-4',
iconShow: true,
placeholder: '시스템 자동입력',
},
{
@ -1101,11 +1222,11 @@ const myDetail = [
valueNm: 'procDttm',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
class: 'py-3 pl-4',
iconShow: true,
placeholder: '시스템 자동입력',
},
];
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -484,8 +484,7 @@ const defaultData = {
},
};
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
<style lang="scss" scoped>
.selectbox:focus {
outline: none;
}

View File

@ -598,6 +598,3 @@ const myDetail = [
},
];
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -12,7 +12,7 @@
/>
</v-col>
<v-col :cols="4">
<component :is="'SelectUseFg'" :parentPrgmId="myPrgmId" />
<component :is="'SelectUseFg'" :parentPrgmId="myPrgmId" :labelCols="12" :textCols="12" />
</v-col>
<v-col :cols="4" class="text-right">
<BtnSearch @click="search" />
@ -158,6 +158,23 @@ export default {
myPrgmId: myPrgmId,
gridName: 'rowGrid',
loadGrid: false,
dataPathMock: {
'rowGrid': {
column: [
{ header: '회사 ID', name: 'comId', hidden: true },
{ header: '설비 그룹 ID', name: 'eqpmGrpId'},
{ header: '설비 그룹 명', name: 'eqpmGrpNm'},
{ header: '설비종류', name: 'eqpmKindId'},
{ header: '사용여부', name: 'useFg'},
{ header: '등록자NO', name: 'regUserNo', hidden: true},
{ header: '등록일시', name: 'regDttm', hidden: true },
{ header: '수정자NO', name: 'procUserNo', hidden: true },
{ header: '수정일시', name: 'procDttm', hidden: true}
],
data: dataPathDataExample,
defaultRow: dataPathDataExample,
}
},
};
},
computed: {
@ -437,7 +454,18 @@ const defaultData = {
},
},
};
import { getPathDataExample } from '@/const/const'
const dataPathDataExample = getPathDataExample({
comId: 'EKIND0005',
eqpmGrpId: 'EQG000010',
eqpmGrpNm:'냉수파이프고온',
eqpmKindId:'냉동파이프',
useFg:'1',
regUserNo: '사용',
regDttm: 'EQP_HVAC_LT_CH001',
procUserNo: '사용',
procDttm: 'EQP_HVAC_LT_CH001',
});
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -545,7 +545,7 @@ const myDetail = [
];
</script>
<style lang="scss">
<style lang="scss" scoped>
.swiper-wrapper{
box-sizing: inherit !important;
}

View File

@ -9,32 +9,23 @@
<v-card-title class="pa-0">공지사항</v-card-title>
<div class="d-flex align-center">
<!-- <v-btn @click="listPageButtonGroupClickEvent('view')" :ripple="false" class="mr-1">상세보기</v-btn> -->
<v-btn
@click="listPageButtonGroupClickEvent('write')"
:ripple="false"
class="mr-1"
>작성</v-btn
>
<a-button type="primary" size="large" @click="listPageButtonGroupClickEvent('write')" :ripple="false"
icon="edit" class="mr-1">작성</a-button>
<!-- <v-btn @click="listPageButtonGroupClickEvent('delete')" :ripple="false">삭제</v-btn> -->
</div>
</div>
</v-card>
</v-col>
</v-row>
<v-row ref="contents" style="height:calc(100% - 76px)">
<v-row ref="contents">
<v-col :cols="12">
<v-card class="pa-5">
<div class="h100 px-5" style="height:calc(100% - 70px)">
<div ref="gridParent" class="h100">
<component
:is="loadGrid ? 'Grid' : null"
:gridName="gridName"
:parentPrgmId="myPrgmId"
ref="noticeMngGrid"
@getRowsData="getRowData"
/>
</div>
<div ref="gridParent" class="h100 px-50">
<component :is="loadGrid ? 'Grid' : null" :gridName="gridName" :parentPrgmId="myPrgmId"
ref="noticeMngGrid" @getRowsData="getRowData" :dataPath="dataPathMock" />
</div>
<!-- <div class="h100 W100 px-50" style="min-height:calc(100% - 70px)">
</div> -->
</v-card>
</v-col>
</v-row>
@ -42,94 +33,62 @@
<!-- 리스트 페이지 -->
<!-- 상세보기 페이지 시작 -->
<div v-if="pageActionFlag == 'view'" class="h100">
<v-row align="center" no-gutters>
<v-col :cols="12">
<v-card>
<div class="d-flex align-center justify-space-between pa-5">
<v-card-title class="pa-0">공지사항</v-card-title>
<div class="d-flex align-center">
<v-btn
@click="viewPageButtonGroupClickEvent('list')"
:ripple="false"
class="mr-1"
>목록</v-btn
>
<v-btn
@click="viewPageButtonGroupClickEvent('reply')"
:ripple="false"
class="mr-1"
>답글</v-btn
>
<v-btn
@click="viewPageButtonGroupClickEvent('update')"
:ripple="false"
class="mr-1"
>수정</v-btn
>
<v-btn
@click="viewPageButtonGroupClickEvent('delete')"
:ripple="false"
>삭제</v-btn
>
</div>
<v-card>
<v-row class="pa-5">
<v-col :cols="12" class="d-flex align-center justify-space-between ">
<v-card-title class="pa-0 custom-title-4">공지사항</v-card-title>
<div class="d-flex align-center">
<a-button @click="viewPageButtonGroupClickEvent('list')" type="primary" :ripple="false" class="mr-1" icon="unordered-list" >목록</a-button>
<a-button @click="viewPageButtonGroupClickEvent('reply')" type="primary" :ripple="false" class="mr-1" icon="send-outlined" >
<v-icon
small
:class="['mr-2']"
>$icoSend</v-icon>
답글
</a-button>
<a-button @click="viewPageButtonGroupClickEvent('update')" type="primary" :ripple="false" class="mr-1" icon="edit">수정</a-button>
<a-button @click="viewPageButtonGroupClickEvent('delete')" type="danger" ghost icon="delete" >삭제</a-button>
</div>
</v-card>
</v-col>
</v-row>
<v-row>
<v-col :cols="12">
<v-card min-height="60" class="pa-5">
<v-text-field
v-model="viewActionData.title"
class="v-input__custom"
placeholder="제목"
hide-details
:readonly="true"
>
</v-col>
<v-col :cols="12" class="custom-title-4-new">
제목
</v-col>
<v-col :cols="12">
<v-text-field v-model="viewActionData.title" class="v-input__custom" hide-details
:readonly="true">
</v-text-field>
</v-card>
</v-col>
</v-row>
<v-row style="height:calc(100% - 218px);">
<v-col :cols="12" style="height: 100%;">
<v-card class="pa-5" style="overflow-y:auto;">
<viewer
v-if="viewActionData.viewerFlag"
ref="tuiViewer"
height="inherit"
:initialValue="viewActionData.content"
theme="white"
:class="isDarkMode ? 'theme--white' : 'theme--black'"
/>
</v-card>
</v-col>
</v-row>
<!-- <v-row style="height: 1vh;">
</v-row> -->
<v-row>
<v-col :cols="12">
<v-card class="pa-5">
<v-row align="center" no-gutters>
<v-col cols="1">
<v-card-subtitle class="pa-0">파일목록</v-card-subtitle>
</v-col>
<v-col :cols="11">
<v-row
v-for="fileData in viewActionData.fileData"
:key="fileData.apndFileId"
>
<a @click.prevent="downloadFile(fileData)">
<div class="search-box-label">
{{ fileData.apndFileNm + '.' + fileData.apndFileExt }}
</div>
</a>
</v-row>
</v-col>
</v-row>
</v-card>
</v-col>
</v-row>
</v-col>
</v-row>
<v-row style="height:calc(100% - 218px);">
<v-col :cols="12" style="height: 100%;">
<v-card class="pa-5" style="overflow-y:auto;">
<viewer v-if="viewActionData.viewerFlag" ref="tuiViewer" height="inherit"
:initialValue="viewActionData.content" theme="white"
:class="isDarkMode ? 'theme--white' : 'theme--black'" />
</v-card>
</v-col>
</v-row>
<v-row>
<v-col :cols="12">
<v-card class="pa-5">
<v-row align="center" no-gutters>
<v-col cols="1">
<v-card-subtitle class="pa-0">파일목록</v-card-subtitle>
</v-col>
<v-col :cols="11">
<v-row v-for="fileData in viewActionData.fileData" :key="fileData.apndFileId">
<a @click.prevent="downloadFile(fileData)">
<div class="search-box-label">
{{ fileData.apndFileNm + '.' + fileData.apndFileExt }}
</div>
</a>
</v-row>
</v-col>
</v-row>
</v-card>
</v-col>
</v-row>
</v-card>
</div>
<!-- 상세보기 페이지 -->
<!-- 작성 페이지 시작 -->
@ -138,130 +97,74 @@
<v-col :cols="12">
<v-card>
<v-card-title>공지사항</v-card-title>
</v-card>
</v-col>
</v-row>
<v-row>
<v-col :cols="12">
<v-card min-height="60" class="pa-5">
<v-text-field
v-model="writeActionData.title"
class="v-input__custom"
placeholder="제목"
hide-details
>
</v-text-field>
</v-card>
</v-col>
</v-row>
<v-row style="height:calc(100% - 270px)">
<v-col :cols="12">
<editor ref="tuiEditor" height="100%" initialEditType="wysiwyg" />
</v-col>
</v-row>
<v-row>
<v-col :cols="12">
<v-card class="pa-5">
<v-row align="center" no-gutters>
<v-col cols="1">
<v-card-subtitle class="pa-0">파일첨부</v-card-subtitle>
<v-row class="pa-5">
<v-col :cols="12" class="custom-title-4-new">
제목
</v-col>
<v-col :cols="4">
<v-file-input
multiple
background-color="#47535c"
show-size
v-model="writeActionData.fileData"
hide-details="true"
>
<v-col :cols="12">
<v-text-field v-model="writeActionData.title" class="v-input__custom" hide-details outlined>
</v-text-field>
</v-col>
<v-col :cols="12" style="min-height: calc(90vh - 270px);">
<editor ref="tuiEditor" height="100%" initialEditType="wysiwyg" />
</v-col>
<v-col :cols="12" class="custom-title-4-new mt-2">
파일첨부
</v-col>
<v-col :cols="6">
<!-- background-color="#47535c" -->
<v-file-input multiple show-size v-model="writeActionData.fileData" hide-details="true"
clear-icon="delete" chips label="업로드" flat hide-input outlined>
<!-- append-icon="cancel" -->
</v-file-input>
</v-col>
<v-col :cols="12" class="text-right">
<a-button @click="writePageButtonGroupClickEvent('cancel')" :ripple="false" class="mr-2">취소</a-button>
<a-button @click="writePageButtonGroupClickEvent('write')" :ripple="false" type="primary">등록</a-button>
</v-col>
</v-row>
</v-card>
</v-col>
</v-row>
<v-row>
<v-col :cols="12" class="text-right">
<v-btn
@click="writePageButtonGroupClickEvent('write')"
:ripple="false"
>등록</v-btn
>
<v-btn
@click="writePageButtonGroupClickEvent('cancel')"
:ripple="false"
>취소</v-btn
>
</v-col>
</v-row>
</div>
<!-- 작성 페이지 -->
<!-- 답글 작성 페이지 시작 -->
<div v-if="pageActionFlag == 'reply'" class="h100">
<v-row align="center" no-gutters>
<v-col :cols="12">
<v-card>
<v-card-title>공지사항</v-card-title>
</v-card>
</v-col>
</v-row>
<v-row>
<v-col :cols="12">
<v-card min-height="60" class="pa-5">
<v-text-field
v-model="replyActionData.title"
class="v-input__custom"
placeholder="제목"
hide-details
>
<div v-if="pageActionFlag == 'reply'" class="h1001">
<v-card class="pa-5">
<v-row>
<v-col :cols="12" class="card-title-color">
<v-card-title class="pa-0 custom-title-4">공지사항</v-card-title>
</v-col>
</v-row>
<v-row align="center" class="mt-5" >
<v-col :cols="12">
<p class="custom-title-4-new">제목</p>
<v-text-field v-model="replyActionData.title" class="v-input__custom" placeholder="제목" outlined hide-details>
</v-text-field>
</v-card>
</v-col>
</v-row>
<v-row style="height:calc(100% - 270px)">
<v-col :cols="12">
<editor
ref="tuiReplyEditor"
height="100%"
initialEditType="wysiwyg"
/>
</v-col>
</v-row>
<v-row>
<v-col :cols="12">
<v-card class="pa-5">
<v-row align="center" no-gutters>
<v-col cols="1">
<v-card-subtitle class="pa-0">파일첨부</v-card-subtitle>
</v-col>
<v-col :cols="4">
<v-file-input
multiple
background-color="#47535c"
show-size
v-model="replyActionData.fileData"
hide-details="true"
>
</v-file-input>
</v-col>
</v-row>
</v-card>
</v-col>
</v-row>
<v-row>
<v-col :cols="12" class="text-right">
<v-btn
@click="replyPageButtonGroupClickEvent('reply')"
:ripple="false"
>등록</v-btn
>
<v-btn
@click="replyPageButtonGroupClickEvent('cancel')"
:ripple="false"
>취소</v-btn
>
</v-col>
</v-row>
</v-col>
<v-col :cols="12" style="height: calc(100vh - 270px);" class="mt-4" >
<editor ref="tuiReplyEditor" height="100%" initialEditType="wysiwyg" />
</v-col>
<v-col :cols="12" class="custom-title-4-new mt-4" >
파일첨부
</v-col>
<v-col :cols="12" >
<v-file-input
multiple
show-size
v-model="replyActionData.fileData"
hide-details="true">
</v-file-input>
</v-col>
<v-col :cols="12" class="text-right">
<a-button @click="replyPageButtonGroupClickEvent('cancel')" :ripple="false">취소</a-button>
<a-button @click="replyPageButtonGroupClickEvent('reply')" :ripple="false" type="primary" >등록</a-button>
</v-col>
</v-row>
</v-card>
</div>
<!-- 답글 작성 페이지 -->
<!-- 수정 페이지 시작 -->
@ -276,24 +179,15 @@
<v-row>
<v-col :cols="12">
<v-card min-height="60" class="pa-5">
<v-text-field
v-model="updateActionData.title"
class="v-input__custom"
placeholder="제목"
hide-details
>
<v-text-field v-model="updateActionData.title" class="v-input__custom" placeholder="제목" hide-details>
</v-text-field>
</v-card>
</v-col>
</v-row>
<v-row style="height:calc(100% - 342px)">
<v-col :cols="12">
<editor
ref="tuiUpdateEditor"
height="100%"
initialEditType="wysiwyg"
:initialValue="updateActionData.content"
/>
<editor ref="tuiUpdateEditor" height="100%" initialEditType="wysiwyg"
:initialValue="updateActionData.content" />
</v-col>
</v-row>
<v-row>
@ -304,13 +198,8 @@
<v-card-subtitle class="pa-0">파일첨부</v-card-subtitle>
</v-col>
<v-col :cols="4">
<v-file-input
multiple
background-color="#47535c"
show-size
v-model="updateActionData.fileData"
hide-details="true"
>
<v-file-input multiple background-color="#47535c" show-size v-model="updateActionData.fileData"
hide-details="true">
</v-file-input>
</v-col>
</v-row>
@ -325,10 +214,7 @@
<v-card-subtitle class="pa-0">파일목록</v-card-subtitle>
</v-col>
<v-col :cols="11">
<v-row
v-for="fileData in updateActionData.currentFileList"
:key="fileData.apndFileId"
>
<v-row v-for="fileData in updateActionData.currentFileList" :key="fileData.apndFileId">
<a @click.prevent="downloadFile(fileData)">
<v-col :cols="12">
<div class="search-box-label">
@ -336,10 +222,7 @@
</div>
</v-col>
</a>
<v-icon
class="pl-5"
@click="addFileToDeleteFileList(fileData)"
>
<v-icon class="pl-5" @click="addFileToDeleteFileList(fileData)">
mdi-close
</v-icon>
</v-row>
@ -350,16 +233,8 @@
</v-row>
<v-row>
<v-col :cols="12" class="text-right">
<v-btn
@click="updatePageButtonGroupClickEvent('update')"
:ripple="false"
>등록</v-btn
>
<v-btn
@click="updatePageButtonGroupClickEvent('cancel')"
:ripple="false"
>취소</v-btn
>
<v-btn @click="updatePageButtonGroupClickEvent('update')" :ripple="false">등록</v-btn>
<v-btn @click="updatePageButtonGroupClickEvent('cancel')" :ripple="false">취소</v-btn>
</v-col>
</v-row>
</div>
@ -442,6 +317,8 @@ export default {
postGrpOrd: null,
postOrgNo: null,
},
dataPathMock: {},
};
},
computed: {
@ -605,6 +482,12 @@ export default {
value: columnList,
});
// -----------------------TEST------------------
this.dataPathMock[this.gridName] = {
column: columnList,
data: dataPathDataExample,
}
// -----------------------END TEST--------------
this.getGridData();
},
async getGridData() {
@ -613,19 +496,30 @@ export default {
};
this.loadGrid = false;
var res = await this.postApiReturn({
apiKey: 'selectPostList',
resKey: 'postData',
sendParam: params,
});
let res = null;
try {
res = await this.postApiReturn({
apiKey: 'selectPostList',
resKey: 'postData',
sendParam: params,
});
}
catch (err) { }
finally {
// -----Test mock data-------------
if (null === res) {
res = dataPathDataExample;
}
// -----End test
}
this.setGridData({
gridKey: this.gridName,
value: res,
});
this.loadGrid = true;
this.$nextTick(() => {
this.loadGrid = true;
});
this.setPageData({ isFind: false });
},
getRowData(data) {
@ -1162,9 +1056,19 @@ const defaultData = {
column: [],
},
};
import { getPathDataExample } from '@/const/const'
const dataPathDataExample = getPathDataExample({
postNo: '18',
title: '오픈공지',
regUserNo: '1',
regDttm: '2023-01-09 09:39:41',
viewCnt: '1'
}, 10);
</script>
<style lang="scss">
<style lang="scss" scoped>
.tui-grid-table tr {
cursor: pointer;
}

View File

@ -4,7 +4,7 @@
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="center" no-gutters>
<v-row align="end" no-gutters>
<v-col :cols="3">
<component
:is="'selectCodeList'"
@ -13,6 +13,7 @@
:dataKey="'selectUseFg'"
:sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }"
:addAll="true"
customClass="select-large"
/>
</v-col>
<v-col :cols="4">
@ -21,12 +22,13 @@
label="프로그램명"
valueNm="prgmNm"
:searchOption="true"
:labelCols="3"
:textCols="9"
:labelCols="12"
:textCols="12"
customClass="input-large"
/>
</v-col>
<v-col :cols="5" class="text-right">
<BtnSearch />
<BtnSearch size="large" />
</v-col>
</v-row>
</v-card>
@ -48,7 +50,7 @@
/>
</div>
</div>
<div style="height:calc(100% - 70px)">
<div style="min-height:calc(100% - 70px)">
<div ref="gridParent" class="px-5 h100">
<component
:ref="gridName"
@ -56,6 +58,7 @@
:parentPrgmId="myPrgmId"
:gridName="gridName"
@getRowsData="getRowData"
:dataPath="dataPathMock"
/>
</div>
</div>
@ -67,16 +70,16 @@
<div class="d-flex align-center justify-space-between pa-5">
<v-card-title class="pa-0">프로그램 상세</v-card-title>
</div>
<div class="px-5 h100" style="height:calc(100% - 76px)">
<div class="w100">
<component
:is="'Form'"
:parentPrgmId="myPrgmId"
:bindingData="gridName"
:detailList="detailList"
@gridEditingFinish="gridEditingFinish"
/>
</div>
<div class="px-5" style="min-height:calc(100% - 76px)">
<component
:is="'Form'"
:parentPrgmId="myPrgmId"
:bindingData="gridName"
:detailList="detailList"
@gridEditingFinish="gridEditingFinish"
/>
<!-- <div class="w100">
</div> -->
</div>
</v-card>
</v-col>
@ -127,6 +130,23 @@ export default {
gridName: 'rowGrid',
// rowGridOrigin: [],
detailList: myDetail,
dataPathMock: {
'rowGrid': {
column: [
{ header: '프로그램ID', name: 'field1', align: 'left' },
{ header: '프로그램덤', name: 'field2', align: 'left' },
{ header: '타임', name: 'field3', align: 'left' },
{ header: '사용여부', name: 'field4', align: 'left' }
],
data: dataPathDataExample,
defaultRow: dataPathDataExample,
option: {
scrollY: false,
scrollX: false,
}
}
},
};
},
computed: {
@ -443,6 +463,8 @@ const myDetail = [
class: 'py-2',
required: false,
placeholder: '시스템 자동입력',
textCols: 12,
iconShow: true
},
{
type: 'InputText',
@ -451,6 +473,8 @@ const myDetail = [
cols: 6,
class: 'py-2',
required: true,
textCols: 12,
iconShow: true
},
{
type: 'SelectBox',
@ -463,6 +487,8 @@ const myDetail = [
{ text: '프로그램', value: '1' },
{ text: '팝업', value: '2' },
],
textCols: 12,
iconShow: true
},
{
type: 'CheckBox',
@ -474,6 +500,8 @@ const myDetail = [
class: 'py-2',
value: { '1': true, '0': false },
required: true,
textCols: 12,
iconShow: true
},
{
type: 'InputText',
@ -483,6 +511,8 @@ const myDetail = [
cols: 12,
class: 'py-2',
required: true,
textCols: 12,
iconShow: true
},
{
type: 'InputText',
@ -492,6 +522,8 @@ const myDetail = [
cols: 6,
class: 'py-2',
placeholder: '시스템 자동입력',
textCols: 12,
iconShow: true
},
{
type: 'InputText',
@ -501,6 +533,8 @@ const myDetail = [
cols: 6,
class: 'py-2',
placeholder: '시스템 자동입력',
textCols: 12,
iconShow: true
},
{
type: 'InputText',
@ -510,6 +544,8 @@ const myDetail = [
cols: 6,
class: 'py-2',
placeholder: '시스템 자동입력',
textCols: 12,
iconShow: true
},
{
type: 'InputText',
@ -519,9 +555,17 @@ const myDetail = [
cols: 6,
class: 'py-2',
placeholder: '시스템 자동입력',
textCols: 12,
iconShow: true
},
];
import { getPathDataExample } from '@/const/const'
const dataPathDataExample = getPathDataExample({
field1: 'PRG0001',
field2: '대시보드',
field3: '프로그램',
field4: '사용'
});
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -542,6 +542,3 @@ const myDetail = [
},
];
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -447,6 +447,3 @@ const defaultData = {
selectedRowKey: null,
};
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -296,6 +296,3 @@ const menuCnctLogColumns = [
{ header: '메뉴 접근 일시', name: 'menuCnctDttm', align: 'center' },
];
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

View File

@ -553,7 +553,7 @@ const myDetail = [
];
</script>
<style lang="scss">
<style lang="scss" scoped>
.v-text-field__details {
display: none;
}

View File

@ -56,4 +56,3 @@ export default {
}
};
</script>
<style lang="scss">@import "@/assets/scss/common.scss" </style>