Compare commits

..

19 Commits

Author SHA1 Message Date
270279b0c2 add paging for page 38 2025-08-14 15:51:06 +09:00
9a42291cf4 add paging for page 38 2025-08-14 15:50:01 +09:00
2802e93a44 add pagination for screen 27 move pagination screen 28 2025-08-13 13:38:12 +09:00
7d2bcb9496 fix icon datepicker 2025-08-12 18:00:01 +09:00
dev
ffdc56b8f1 Merge pull request 'fix bug screen17 tab3' (#58) from dev-luannv27-s17 into dev
Reviewed-on: #58
2025-08-12 16:42:35 +09:00
245444d5fa fix bug screen17 tab3 2025-08-12 16:38:22 +09:00
dev
541ae86068 Merge pull request 'fixbug screen 2 , screen 17 , screen 15' (#57) from dev-luannv24-fixbug-8/12 into dev
Reviewed-on: #57
2025-08-12 15:14:30 +09:00
5c43496282 refactor code 2025-08-12 15:12:06 +09:00
31413d1e48 update code 2025-08-12 12:58:41 +09:00
dev
dd24592eca Merge pull request 'Fix datepicker icon + add dash line in line chart' (#56) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #56
2025-08-11 18:29:55 +09:00
e59078a19c Fix datepicker icon + add dash line in line chart 2025-08-11 17:58:25 +09:00
dev
bc96d2ae45 Merge pull request 'fix bug grid not load when change menu tab' (#55) from dev-manhph1-figbug into dev
Reviewed-on: #55
2025-08-11 16:55:41 +09:00
4fd2eac344 add check direction for actionbutton 2025-08-11 16:12:19 +09:00
c40352e37c fix bug grid not load when change menu tab 2025-08-11 15:12:01 +09:00
dev
6583d68ea7 Merge pull request 'fix bugs 47, 145' (#54) from dev-dungtv-0811 into dev
Reviewed-on: #54
2025-08-11 14:06:24 +09:00
dev
5859c5d681 Merge pull request 'Add pagination + fix bugs tooltip + fix bugs line chart' (#53) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #53
2025-08-11 13:54:33 +09:00
d6dd66c4b3 fix bugs 47, 145 2025-08-11 11:51:28 +07:00
f666110a1a Add pagination + fix bugs tooltip + fix bugs line chart 2025-08-11 11:55:32 +09:00
dev
d22b09cc47 Merge pull request 'fixbug' (#52) from dev-luannv24-fixbug1 into dev
Reviewed-on: #52
2025-08-11 11:25:42 +09:00
37 changed files with 1217 additions and 955 deletions

View File

@ -0,0 +1,3 @@
<svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.4369 8.15117L10.1947 5.30742C10.1538 5.25551 10.1017 5.21353 10.0423 5.18464C9.98285 5.15575 9.91764 5.14071 9.85156 5.14062H8.96562C8.87402 5.14062 8.82344 5.2459 8.87949 5.31836L10.8523 7.82031H2.57812C2.51797 7.82031 2.46875 7.86953 2.46875 7.92969V8.75C2.46875 8.81016 2.51797 8.85938 2.57812 8.85938H12.0924C12.4588 8.85938 12.6625 8.43828 12.4369 8.15117Z" fill="black" fill-opacity="0.45"/>
</svg>

After

Width:  |  Height:  |  Size: 514 B

View File

@ -0,0 +1,3 @@
<svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.4369 8.15117L10.1947 5.30742C10.1538 5.25551 10.1017 5.21353 10.0423 5.18464C9.98285 5.15575 9.91764 5.14071 9.85156 5.14062H8.96562C8.87402 5.14062 8.82344 5.2459 8.87949 5.31836L10.8523 7.82031H2.57812C2.51797 7.82031 2.46875 7.86953 2.46875 7.92969V8.75C2.46875 8.81016 2.51797 8.85938 2.57812 8.85938H12.0924C12.4588 8.85938 12.6625 8.43828 12.4369 8.15117Z" fill="white" fill-opacity="0.45"/>
</svg>

After

Width:  |  Height:  |  Size: 514 B

View File

@ -9,6 +9,7 @@
@import "./common/card.scss"; @import "./common/card.scss";
@import "./common/tabs.scss"; @import "./common/tabs.scss";
@import "./common/numericInput.scss"; @import "./common/numericInput.scss";
@import "./common/pagination.scss";
@import "./common/editor.scss"; @import "./common/editor.scss";
@ -443,6 +444,10 @@ a {
.v-application.#{$theme}-mode { .v-application.#{$theme}-mode {
min-width: 1000px; min-width: 1000px;
.icon-datepicker-color {
color: map-deep-get($config, #{$theme}, "icon-datepicker-color");
}
.head-logo { .head-logo {
gap: 8px; gap: 8px;
} }
@ -949,6 +954,7 @@ a {
& th, & th,
& td { & td {
height: 48px; height: 48px;
color: map-deep-get($config, #{$theme}, "tui-datepicker-calendar-color");
} }
} }

View File

@ -25,7 +25,7 @@
.tui-grid-header-area, .tui-grid-header-area,
.tui-grid-summary-area { .tui-grid-summary-area {
margin-right: $scrollbar-width; margin-right: $scrollbar-width !important;
} }
} }
@ -358,7 +358,7 @@
&-header-area { &-header-area {
// background-color: none; // background-color: none;
border: none; border: none;
margin-right: 0 !important; // margin-right: 0 !important;
background-color: map-deep-get($config, background-color: map-deep-get($config,
#{$theme}, #{$theme},
"tui-grid-cell-backgroundColor" "tui-grid-cell-backgroundColor"

View File

@ -0,0 +1,43 @@
@each $theme in dark, light {
// @include theme($theme);
.v-application.#{$theme}-mode {
.ant-pagination-item,
.ant-pagination-prev,
.ant-pagination-next {
// border: none !important;
// box-shadow: none !important;
background-color: map-deep-get($config, #{$theme}, "paging-background") !important;
color: map-deep-get($config, #{$theme}, "paging-text") !important;
border: 0.5px solid #424242;
.ant-pagination-item-link {
border: none;
background-color: map-deep-get($config, #{$theme}, "paging-background") !important;
}
}
.ant-pagination-item-active {
border-color: #1890ff !important;
color: #1890ff !important
}
.ant-pagination-options-size-changer {
.ant-select-selection {
border: 0.5px solid #424242;
background: map-deep-get($config, #{$theme}, "paging-background") !important;
color: map-deep-get($config, #{$theme}, "paging-text") !important;
}
.ant-select-arrow {
color: map-deep-get($config, #{$theme}, "paging-text") !important;
}
.ant-select-selection__rendered {
margin-right: 30px;
}
}
}
}

View File

@ -66,6 +66,10 @@
} }
} }
} }
.v-icon {
color: map-deep-get($config, #{$theme}, "v-icon-chevron-down") !important;
}
} }
.v-input__custom { .v-input__custom {

View File

@ -182,6 +182,9 @@ $config: (
ant-btn-popup-bg: #212224, ant-btn-popup-bg: #212224,
ant-btn-popup-color: #FFFFFFD9, ant-btn-popup-color: #FFFFFFD9,
ant-btn-popup-border: #424242, ant-btn-popup-border: #424242,
paging-background: #212224,
paging-text: #FFFFFFD9,
icon-datepicker-color: #FFFFFF73,
), ),
light: (w-g5: $--color-gray_555, light: (w-g5: $--color-gray_555,
g5-w: $--color-white, g5-w: $--color-white,
@ -327,5 +330,8 @@ $config: (
ant-btn-popup-bg: #FFFFFF, ant-btn-popup-bg: #FFFFFF,
ant-btn-popup-color: #000000E0, ant-btn-popup-color: #000000E0,
ant-btn-popup-border: #D9D9D9, ant-btn-popup-border: #D9D9D9,
paging-background: #FFFFFF,
paging-text: #000000E0,
icon-datepicker-color: #00000073,
), ),
); );

View File

@ -61,10 +61,6 @@ export default {
require: false, require: false,
default: true default: true
}, },
labelClass: {
type: String,
require: false,
},
}, },
data() { data() {
return { return {

View File

@ -19,15 +19,18 @@
readonly readonly
outlined outlined
> >
<template #append > <!-- <template #append >
<v-icon size="20" v-show="!isRange">$icoCalendar</v-icon> <v-icon size="20" v-show="!isRange">$icoCalendar</v-icon>
</template> -->
<template v-slot:append>
<a-icon v-show="!isRange" class="v-icon" type="calendar" style="width: 14px; height: 14px;" />
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="startpicker-container" id="startpicker-container"></div> <div ref="startpicker-container" id="startpicker-container"></div>
</template> </template>
</v-text-field> </v-text-field>
<div v-if="isRange" class="mx-3" :style="{ lineHeight: 0 }"> <div v-if="isRange" class="mx-3" :style="{ lineHeight: 0 }">
<img :src="arrowIcon" alt=""> <img :src="arrowIcon">
</div> </div>
<v-text-field <v-text-field
v-show="isRange" v-show="isRange"
@ -40,7 +43,9 @@
outlined outlined
> >
<template #append> <template #append>
<v-icon size="20">$icoCalendar</v-icon> <div class="pr-1">
<a-icon class="v-icon" type="calendar" style="width: 14px; height: 14px;" />
</div>
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="endpicker-container" id="endpicker-container"></div> <div ref="endpicker-container" id="endpicker-container"></div>
@ -209,9 +214,9 @@ export default {
}, },
arrowIcon() { arrowIcon() {
if(this.isDarkMode){ if(this.isDarkMode){
return require('@/assets/images/arrow_datepicker_dm.png'); return require('@/assets/images/SwapRight_Dark.svg');
} }
return require('@/assets/images/arrow_datepicker.png'); return require('@/assets/images/SwapRight.svg');
} }
}, },
watch: { watch: {

View File

@ -5,10 +5,7 @@
<!-- <v-icon x-small :color="required ? '#fb8200' : 'primary'" class="mr-1" <!-- <v-icon x-small :color="required ? '#fb8200' : 'primary'" class="mr-1"
>mdi-record-circle</v-icon >mdi-record-circle</v-icon
> --> > -->
<v-icon <v-icon small :class="['mr-1', required ? 'icon-orange' : 'icon-blue']">
small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>
$icoBulletPoint $icoBulletPoint
</v-icon> </v-icon>
{{ label }} {{ label }}
@ -16,17 +13,11 @@
</v-col> </v-col>
<v-col :cols="label ? textCols : ''"> <v-col :cols="label ? textCols : ''">
<div class="datepicker-container"> <div class="datepicker-container">
<v-text-field <v-text-field id="startpicker" ref="startpicker" v-model="fromDtValue"
id="startpicker" :class="isRange ? 'v-input__custom half' : 'v-input__custom'" :hide-details="true" readonly
ref="startpicker" outlined>
v-model="fromDtValue" <template v-slot:append>
:class="isRange ? 'v-input__custom half' : 'v-input__custom'" <a-icon v-show="!isRange" class="v-icon" type="calendar" style="width: 14px; height: 14px;" />
:hide-details="true"
readonly
outlined
>
<template #append >
<v-icon size="20" v-show="!isRange">$icoCalendar</v-icon>
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="startpicker-container" id="startpicker-container"></div> <div ref="startpicker-container" id="startpicker-container"></div>
@ -36,18 +27,13 @@
<div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }"> <div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }">
<img :src="arrowIcon" alt=""> <img :src="arrowIcon" alt="">
</div> </div>
<v-text-field <v-text-field v-show="isRange" id="endpicker" ref="endpicker" v-model="toDtValue"
v-show="isRange" :class="isRange ? 'v-input__custom half' : 'v-input__custom'" :hide-details="true" readonly
id="endpicker" outlined>
ref="endpicker"
v-model="toDtValue"
:class="isRange ? 'v-input__custom half' : 'v-input__custom'"
:hide-details="true"
readonly
outlined
>
<template #append> <template #append>
<v-icon size="20">$icoCalendar</v-icon> <div class="pr-1">
<a-icon class="v-icon" type="calendar" style="width: 14px; height: 14px;" />
</div>
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="endpicker-container" id="endpicker-container"></div> <div ref="endpicker-container" id="endpicker-container"></div>
@ -91,9 +77,9 @@ export default {
require: false, require: false,
default: false, default: false,
}, },
isRangeOption:{ isRangeOption: {
type:Boolean, type: Boolean,
require:false, require: false,
default: true default: true
} }
}, },
@ -177,21 +163,23 @@ export default {
this.myOptions.viewFormat, this.myOptions.viewFormat,
); );
}, },
toDtChange(){ toDtChange() {
return { return {
isCheck:this.searchParam.isCheck , isCheck: this.searchParam.isCheck,
toDt : Utility.setFormatDate( toDt: Utility.setFormatDate(
this.searchParam.toDt, this.searchParam.toDt,
this.myOptions.viewFormat, this.myOptions.viewFormat,
)}; )
};
}, },
fromDtChange(){ fromDtChange() {
return { return {
isCheck:this.searchParam.isCheck , isCheck: this.searchParam.isCheck,
fromDt : Utility.setFormatDate( fromDt: Utility.setFormatDate(
this.searchParam.fromDt, this.searchParam.fromDt,
this.myOptions.viewFormat, this.myOptions.viewFormat,
)}; )
};
}, },
defaultRange() { defaultRange() {
return this.searchParam.defaultRange return this.searchParam.defaultRange
@ -205,10 +193,10 @@ export default {
); );
}, },
arrowIcon() { arrowIcon() {
if(this.isDarkMode){ if (this.isDarkMode) {
return require('@/assets/images/arrow_datepicker_dm.png'); return require('@/assets/images/SwapRight_Dark.svg');
} }
return require('@/assets/images/arrow_datepicker.png'); return require('@/assets/images/SwapRight.svg');
} }
}, },
watch: { watch: {
@ -242,24 +230,24 @@ export default {
this.endDatepickerInstance.setDate(new Date(newVal)); this.endDatepickerInstance.setDate(new Date(newVal));
} }
}, },
fromDtChange:{ fromDtChange: {
deep:true, deep: true,
handler(){ handler() {
if(this.fromDtChange.isCheck){ if (this.fromDtChange.isCheck) {
this.fromDtChanged(this.fromDtChange.fromDt); this.fromDtChanged(this.fromDtChange.fromDt);
this.setPageData({ this.setPageData({
isCheck : false isCheck: false
}) })
} }
} }
}, },
toDtChange:{ toDtChange: {
deep:true, deep: true,
handler(){ handler() {
if(this.toDtChange.isCheck){ if (this.toDtChange.isCheck) {
this.toDtChanged(this.toDtChange.toDt); this.toDtChanged(this.toDtChange.toDt);
this.setPageData({ this.setPageData({
isCheck : false isCheck: false
}) })
} }
} }
@ -370,7 +358,7 @@ export default {
if ( if (
(myRange > rangeGap && compareDt.isAfter(defaultDt)) || (myRange > rangeGap && compareDt.isAfter(defaultDt)) ||
defaultDt.format(this.myOptions.sendFormat) === defaultDt.format(this.myOptions.sendFormat) ===
compareDt.format(this.myOptions.sendFormat) compareDt.format(this.myOptions.sendFormat)
) { ) {
// if(this.cmCycleFlag){ // if(this.cmCycleFlag){
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
@ -400,7 +388,7 @@ export default {
if ( if (
(myRange > rangeGap && defaultDt.isAfter(compareDt)) || (myRange > rangeGap && defaultDt.isAfter(compareDt)) ||
defaultDt.format(this.myOptions.sendFormat) === defaultDt.format(this.myOptions.sendFormat) ===
compareDt.format(this.myOptions.sendFormat) compareDt.format(this.myOptions.sendFormat)
) { ) {
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
} else { } else {
@ -424,6 +412,7 @@ export default {
display: flex; display: flex;
justify-content: space-around; justify-content: space-around;
background-color: #edf4fc; background-color: #edf4fc;
.tui-timepicker-column.tui-timepicker-colon { .tui-timepicker-column.tui-timepicker-colon {
color: #000 !important; color: #000 !important;
} }

View File

@ -158,7 +158,7 @@ export default {
}, 500); }, 500);
}, },
}, },
created() {}, created() { },
async mounted() { async mounted() {
// console.log(this.dataPath); // console.log(this.dataPath);
if (this.gridName) { if (this.gridName) {
@ -166,9 +166,9 @@ export default {
this.scrollBody = document this.scrollBody = document
.getElementsByClassName('tui-grid-rside-area') .getElementsByClassName('tui-grid-rside-area')
[ [
document.getElementsByClassName('tui-grid-rside-area').length - 1 document.getElementsByClassName('tui-grid-rside-area').length - 1
].getElementsByClassName('tui-grid-body-area')[0]; ].getElementsByClassName('tui-grid-body-area')[0];
this.scrollBody.addEventListener('scroll', e => { this.scrollBody.addEventListener('scroll', e => {
this.gridScrollTop = e.target.scrollTop; this.gridScrollTop = e.target.scrollTop;
@ -606,18 +606,20 @@ export default {
list.map(item => this.gridInstance.invoke('check', item)); list.map(item => this.gridInstance.invoke('check', item));
}, },
refreshLayout() { refreshLayout() {
// console.log("---------DEBUG---refreshLayout: "); setTimeout(() => {
this.gridInstance.invoke('refreshLayout'); this.gridInstance.invoke('refreshLayout');
}, 150);
// this.gridInstance.invoke('refreshLayout');
}, },
refreshGrid(){ refreshGrid() {
// console.log("refreshLayout",this.$refs['tuigrid' + this.gridName]) // console.log("refreshLayout",this.$refs['tuigrid' + this.gridName])
var store = this.$refs['tuigrid' + this.gridName].gridInstance.store; var store = this.$refs['tuigrid' + this.gridName].gridInstance.store;
var containerEl = this.$refs['tuigrid' + this.gridName].$el; var containerEl = this.$refs['tuigrid' + this.gridName].$el;
// var containerEl = document.querySelector('.tui-grid-container') // var containerEl = document.querySelector('.tui-grid-container')
var parentEl = containerEl.parentElement; var parentEl = containerEl.parentElement;
// console.log("---------DEBUG---containerEl: ",containerEl); // console.log("---------DEBUG---containerEl: ",containerEl);
// console.log('---------DEBUG---parentEl: ', parentEl) // console.log('---------DEBUG---parentEl: ', parentEl)
// function refreshLayout(store, containerEl, parentEl) { // function refreshLayout(store, containerEl, parentEl) {
var dimension = store.dimension; var dimension = store.dimension;
var autoWidth = dimension.autoWidth, fitToParentHeight = dimension.fitToParentHeight; var autoWidth = dimension.autoWidth, fitToParentHeight = dimension.fitToParentHeight;
@ -636,35 +638,35 @@ export default {
// console.log("parentEl.clientHeight" , parentEl.clientHeight) // console.log("parentEl.clientHeight" , parentEl.clientHeight)
// console.log("clientHeight : ",clientHeight); // console.log("clientHeight : ",clientHeight);
if (parentEl && parentEl.clientHeight !== clientHeight) { if (parentEl && parentEl.clientHeight !== clientHeight) {
var _b = getComputedStyle(parentEl), paddingTop = _b.paddingTop, paddingBottom = _b.paddingBottom; var _b = getComputedStyle(parentEl), paddingTop = _b.paddingTop, paddingBottom = _b.paddingBottom;
this.setHeight(store, parentEl.clientHeight - (parseFloat(paddingTop) + parseFloat(paddingBottom))); this.setHeight(store, parentEl.clientHeight - (parseFloat(paddingTop) + parseFloat(paddingBottom)));
} }
// } // }
}, },
setOffsetTop(store, offsetTop) { setOffsetTop(store, offsetTop) {
// console.log("---------DEBUG---setOffsetTop: "); // console.log("---------DEBUG---setOffsetTop: ");
store.dimension.offsetTop = offsetTop; store.dimension.offsetTop = offsetTop;
}, },
setWidth(_a, width, autoWidth) { setWidth(_a, width, autoWidth) {
// console.log("---------DEBUG---setWidth: "); // console.log("---------DEBUG---setWidth: ");
var dimension = _a.dimension; var dimension = _a.dimension;
dimension.autoWidth = autoWidth; dimension.autoWidth = autoWidth;
dimension.width = width; dimension.width = width;
}, },
setHeaderHeight(store, height) { setHeaderHeight(store, height) {
// console.log("---------DEBUG---setHeaderHeight: "); // console.log("---------DEBUG---setHeaderHeight: ");
store.dimension.headerHeight = height; store.dimension.headerHeight = height;
}, },
setOffsetLeft(store, offsetLeft) { setOffsetLeft(store, offsetLeft) {
// console.log("---------DEBUG---setOffsetLeft: "); // console.log("---------DEBUG---setOffsetLeft: ");
store.dimension.offsetLeft = offsetLeft; store.dimension.offsetLeft = offsetLeft;
}, },
setHeight(_a,height){ setHeight(_a, height) {
// console.log("---------DEBUG---setHeight: "); // console.log("---------DEBUG---setHeight: ");
var dimension = _a.dimension; var dimension = _a.dimension;
var headerHeight = dimension.headerHeight, summaryHeight = dimension.summaryHeight, tableBorderWidth = dimension.tableBorderWidth; var headerHeight = dimension.headerHeight, summaryHeight = dimension.summaryHeight, tableBorderWidth = dimension.tableBorderWidth;
dimension.bodyHeight = height - headerHeight - summaryHeight - tableBorderWidth; dimension.bodyHeight = height - headerHeight - summaryHeight - tableBorderWidth;
}, },
sendSelectedRowData(eventRowKey) { sendSelectedRowData(eventRowKey) {
if (this.selectedRowDataWatchFlag) { if (this.selectedRowDataWatchFlag) {
var rowKey = var rowKey =

View File

@ -0,0 +1,93 @@
<template>
<div class="custom-pagination">
<a-pagination
:current="pageNum"
:total="totalCount"
:page-size="itemsPerPage"
:show-size-changer="useLimit"
:page-size-options="itemsPerPageArray.map(String)"
@change="handlePageChange"
@showSizeChange="changePageLeng"
/>
</div>
</template>
<script>
export default {
props: {
useLimit: {
type: Boolean,
default: true,
},
totalCount: {
type: Number,
default: 0,
},
pageNum: {
type: Number,
default: 0,
},
limit: {
type: Number,
default: 0,
},
itemsPerPageArray: {
type: Array,
default: () => [20, 50, 100],
},
},
data() {
return {
moveToPage: '',
};
},
computed: {
page: function() {
return this.numberOfPages + '-' + this.lastPage;
},
lastPage: function() {
//grid data가 없을 경우 1 리턴
if (this.totalCount == 0) return 1;
let pageLength = Math.floor(this.totalCount / this.itemsPerPage);
if (this.totalCount % this.itemsPerPage > 0) {
pageLength++;
}
return pageLength;
},
itemsPerPage: function() {
return this.limit;
},
numberOfPages: function() {
return Number(this.pageNum);
},
plusPage: function() {
return Number(this.pageNum) + 1;
},
minusPage: function() {
return Number(this.pageNum) - 1;
},
},
watch: {
totalCount: function(newData) {
return (this.moveToPage = newData > 0 ? this.moveToPage : '');
},
moveToPage: function() {
return (this.moveToPage = this.moveToPage.replaceAll(/[^0-9]/g, ''));
},
},
methods: {
handlePageChange(newPage) {
// Emit an event to the parent to load data for the selected page
this.$emit('loadData', newPage, this.itemsPerPage);
},
changePageLeng: function(current, newLimit) {
//부모 컴포넌트에서 loadData(데이터 조회) 구현
//this.$emit('loadData', this.pageNum, limit);
// limit 변경 시 1 페이지로 초기화
this.$emit('loadData', 1, newLimit);
},
},
};
</script>

View File

@ -3,24 +3,18 @@
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon small color="primary" <v-icon small color="primary"
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']" :class="['mr-1', required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
>$icoBulletPoint</v-icon>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? textCols : ''"> <v-col :cols="label ? textCols : ''">
<div :class="['datepicker-container', customClass]" > <div :class="['datepicker-container', customClass]">
<v-text-field <v-text-field id="startpicker" ref="startpicker" v-model="fromDtValue"
id="startpicker" :class="isRange ? 'v-input__custom half' : 'v-input__custom'" :hide-details="true" readonly
ref="startpicker" outlined>
v-model="fromDtValue" <template #append>
:class="isRange ? 'v-input__custom half' : 'v-input__custom'" <a-icon class="v-icon" v-show="!isRange" type="calendar" style="width: 14px; height: 14px;" />
:hide-details="true" <!-- <v-icon size="20" v-show="!isRange">$icoCalendar</v-icon> -->
readonly
outlined
>
<template #append >
<v-icon size="20" v-show="!isRange">$icoCalendar</v-icon>
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="startpicker-container" id="startpicker-container"></div> <div ref="startpicker-container" id="startpicker-container"></div>
@ -29,18 +23,13 @@
<div v-if="isRange" class="mx-3" :style="{ lineHeight: 0 }"> <div v-if="isRange" class="mx-3" :style="{ lineHeight: 0 }">
<img :src="arrowIcon" alt=""> <img :src="arrowIcon" alt="">
</div> </div>
<v-text-field <v-text-field v-show="isRange" id="endpicker" ref="endpicker" v-model="toDtValue"
v-show="isRange" :class="isRange ? 'v-input__custom half' : 'v-input__custom'" :hide-details="true" readonly
id="endpicker" outlined>
ref="endpicker"
v-model="toDtValue"
:class="isRange ? 'v-input__custom half' : 'v-input__custom'"
:hide-details="true"
readonly
outlined
>
<template #append> <template #append>
<v-icon size="20">$icoCalendar</v-icon> <div class="pr-1">
<a-icon class="v-icon" type="calendar" style="width: 14px; height: 14px;" />
</div>
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="endpicker-container" id="endpicker-container"></div> <div ref="endpicker-container" id="endpicker-container"></div>
@ -98,6 +87,7 @@ export default {
searchParam(state) { searchParam(state) {
return state.pageData[this.parentPrgmId]; return state.pageData[this.parentPrgmId];
}, },
isDarkMode: "isDarkMode",
}), }),
myCmCycle() { myCmCycle() {
return this.searchParam.cmCycle; return this.searchParam.cmCycle;
@ -138,10 +128,10 @@ export default {
); );
}, },
arrowIcon() { arrowIcon() {
if(this.isDarkMode){ if (this.isDarkMode) {
return require('@/assets/images/arrow_datepicker_dm.png'); return require('@/assets/images/SwapRight_Dark.svg');
} }
return require('@/assets/images/arrow_datepicker.png'); return require('@/assets/images/SwapRight.svg');
} }
}, },
watch: { watch: {
@ -280,7 +270,7 @@ export default {
if ( if (
(myRange > rangeGap && compareDt.isAfter(defaultDt)) || (myRange > rangeGap && compareDt.isAfter(defaultDt)) ||
defaultDt.format(this.myOptions.sendFormat) === defaultDt.format(this.myOptions.sendFormat) ===
compareDt.format(this.myOptions.sendFormat) compareDt.format(this.myOptions.sendFormat)
) { ) {
// if(this.cmCycleFlag){ // if(this.cmCycleFlag){
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
@ -310,7 +300,7 @@ export default {
if ( if (
(myRange > rangeGap && defaultDt.isAfter(compareDt)) || (myRange > rangeGap && defaultDt.isAfter(compareDt)) ||
defaultDt.format(this.myOptions.sendFormat) === defaultDt.format(this.myOptions.sendFormat) ===
compareDt.format(this.myOptions.sendFormat) compareDt.format(this.myOptions.sendFormat)
) { ) {
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
} else { } else {
@ -334,6 +324,7 @@ export default {
display: flex; display: flex;
justify-content: space-around; justify-content: space-around;
background-color: #edf4fc; background-color: #edf4fc;
.tui-timepicker-column.tui-timepicker-colon { .tui-timepicker-column.tui-timepicker-colon {
color: #000 !important; color: #000 !important;
} }

View File

@ -2,9 +2,9 @@
<div class="d-flex justify-center align-center" <div class="d-flex justify-center align-center"
:class="directionBtn === 'vertically'?'flex-row':'flex-column'" :class="directionBtn === 'vertically'?'flex-row':'flex-column'"
style="gap: 12px"> style="gap: 12px">
<a-button @click="btnActionsFnc('removeRightToLeft')" type="primary" ghost :icon="icons.remove" class="custom-action-btn"> <a-button @click="directionBtn === 'vertically' ? btnActionsFnc('removeRightToLeft') : btnActionsFnc('addLeftToRight')" type="primary" ghost :icon="directionBtn === 'vertically'? icons.remove :icons.add " class="custom-action-btn">
</a-button> </a-button>
<a-button @click="btnActionsFnc('addLeftToRight')" type="primary" ghost :icon="icons.add" class="custom-action-btn"> <a-button @click="directionBtn === 'vertically' ? btnActionsFnc('removeRightToLeft') :btnActionsFnc('removeRightToLeft')" type="primary" ghost :icon="directionBtn === 'vertically'? icons.add :icons.remove" class="custom-action-btn">
</a-button> </a-button>
</div> </div>
</template> </template>

View File

@ -70,6 +70,7 @@ export default function getLineChartOption({
}, },
splitLine: { splitLine: {
lineStyle: { lineStyle: {
type: 'dashed', // Options: 'solid', 'dashed', 'dotted'
color: isDarkMode ? '#444444' : '#EEEEEE', color: isDarkMode ? '#444444' : '#EEEEEE',
}, },
}, },

View File

@ -0,0 +1,46 @@
// Sankey chart options
export function getSankeyChartOption({ isDarkMode = false, data = [], links = [] }) {
const chartOption = {
backgroundColor: '#FFFFFF',
series: [
{
data,
links,
layoutIterations: 0,
type: 'sankey',
left: 25.0,
top: 20.0,
right: 120,
bottom: 50.0,
nodeGap: 10,
nodeAlign: 'left',
lineStyle: {
color: 'source',
curveness: 0.5,
},
// nodeWidth:10,
// triggerEvent: true,
itemStyle: {
//color: '#1f77b4',
//borderColor: '#1f77b4'
},
label: {
color: isDarkMode
? '#FFFFFFD9'
: '#000000E0',
// fontFamily: 'Arial',
fontSize: 14,
},
},
],
tooltip: {
trigger: 'item',
},
};
return chartOption;
}
export default getSankeyChartOption;

View File

@ -3,12 +3,13 @@
<v-col v-if="item.label" :cols="item.labelCols !== undefined ? item.labelCols : item.cols == 12 ? 2 : 4"> <v-col v-if="item.label" :cols="item.labelCols !== undefined ? item.labelCols : item.cols == 12 ? 2 : 4">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon
x-small v-if="item.iconShow"
:color="item.required ? '#fb8200' : 'primary'" small
class="mr-1" :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>mdi-record-circle</v-icon >$icoBulletPoint</v-icon
> >
{{ item.label }} {{ item.label }}
<span v-if="item.essential">*</span>
</label> </label>
<!-- <label for="" class="search-box-label ft-size_14 ft-clr_g-c"> <!-- <label for="" class="search-box-label ft-size_14 ft-clr_g-c">
{{ item.label }} {{ item.label }}
@ -39,12 +40,12 @@
</template> </template>
</v-col> </v-col>
<v-dialog v-model="dialog" scrollable width="540px"> <v-dialog v-model="dialog" scrollable width="504px">
<v-card style="height: 100%"> <v-card style="height: 100%">
<v-card-title> <v-card-title class="px-4">
<span class="custom-title-4">비밀번호 {{ isPassword }}</span> <span class="custom-title-4" style="padding-left: 1px;">비밀번호 {{ isPassword }}</span>
</v-card-title> </v-card-title>
<v-card-text class="pb-4"> <v-card-text class="pb-4 px-3">
<v-col> <v-col>
<label for="" class="search-box-label"> <label for="" class="search-box-label">
{{ isPassword }} 비밀번호를 입력하세요 {{ isPassword }} 비밀번호를 입력하세요

View File

@ -404,8 +404,8 @@ export default {
rowHeight: 'auto', rowHeight: 'auto',
}; };
if (this.isMulti) { if (this.isMulti) {
// myOptions['rowHeaders'] = [{ type: 'checkbox' }]; myOptions['rowHeaders'] = [{ type: 'checkbox' }];
// myOptions['rowHeight'] = 'auto'; myOptions['rowHeight'] = 'auto';
} }
@ -523,12 +523,11 @@ export default {
this.loadGrid = true; this.loadGrid = true;
// this.$nextTick(() => { this.$nextTick(() => {
// if (this.isMulti) { if (this.isMulti) {
// this.getChecked(); this.getChecked();
// } }
// }); });
}, },
setUpdate() { setUpdate() {
if (this.isMulti) { if (this.isMulti) {

View File

@ -1,5 +1,5 @@
<template> <template>
<v-row class="search-box no-gutters" align="center"> <v-row class="search-box" align="center">
<v-col :cols="option.labelCols" class="py-0"> <v-col :cols="option.labelCols" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon v-if="item.iconShow" small <v-icon v-if="item.iconShow" small

View File

@ -4,7 +4,7 @@
class="d-flex justify-space-between align-center" class="d-flex justify-space-between align-center"
style="height: 80px;" style="height: 80px;"
> >
<span class="txt custom-title-4-new">공정 추가 정보</span> <span class="txt custom-subtitle-tab">공정 추가 정보</span>
<Buttons <Buttons
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
:bindingData="gridName" :bindingData="gridName"

View File

@ -4,14 +4,14 @@
class="d-flex justify-space-between align-center" class="d-flex justify-space-between align-center"
style="height: 80px;" style="height: 80px;"
> >
<span class="txt custom-title-4-new">공정 입출력 정보</span> <span class="txt custom-subtitle-tab">공정 입출력 정보</span>
<Buttons <Buttons
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
:bindingData="gridName" :bindingData="gridName"
:btnActionsFnc="btnActions" :btnActionsFnc="btnActions"
/> />
</div> </div>
<div ref="gridParent" style="height: calc(100vh - 700px);"> <div ref="gridParent" style="height: calc(90vh - 700px);">
<component <component
:ref="gridName" :ref="gridName"
:is="loadGrid ? 'Grid' : null" :is="loadGrid ? 'Grid' : null"
@ -21,7 +21,7 @@
:innerTabGridInfo="innerTabGridInfo" :innerTabGridInfo="innerTabGridInfo"
/> />
</div> </div>
<div style="height: 60vh;" class="mt-5"> <div style="height: 25vh;" class="mt-5">
<component <component
:is="'Form'" :is="'Form'"
:bindingData="gridName" :bindingData="gridName"
@ -98,17 +98,19 @@ export default {
watch: { watch: {
selectedObjId(val) { selectedObjId(val) {
if (val === 'TAG') { if (val === 'TAG') {
this.detailList[2].class = 'py-2 d-none'; this.detailList[1].class = 'd-none';
this.detailList[3].class = 'py-2 d-none'; this.detailList[2].class = 'd-block pl-4';
this.detailList[4].class = 'py-2'; this.detailList[3].class = 'd-block';
this.detailList[5].class = 'py-2';
} else { } else {
// }else if(val==="READ_PLC"){ // }else if(val==="READ_PLC"){
this.detailList[5].class = 'py-2 d-none'; this.detailList[3].class = 'd-block';
this.detailList[4].class = 'py-2 d-none'; this.detailList[2].class = 'd-none';
this.detailList[3].class = 'py-2'; this.detailList[1].class = 'd-block pl-4';
this.detailList[2].class = 'py-2';
} }
this.detailList[4].class = 'pl-4 mt-2';
console.log(val)
console.log(this.detailList)
}, },
}, },
created() {}, created() {},
@ -188,6 +190,7 @@ export default {
{ header: '대상 명', name: 'objNm', width: 300, align: 'left' }, { header: '대상 명', name: 'objNm', width: 300, align: 'left' },
{ {
header: '에너지원 명', header: '에너지원 명',
width: 150,
name: 'ercId', name: 'ercId',
align: 'left', align: 'left',
formatter({ value }) { formatter({ value }) {
@ -204,8 +207,9 @@ export default {
}, },
{ {
header: '대상 유형', header: '대상 유형',
width: 150,
name: 'objKind', name: 'objKind',
align: 'center', align: 'left',
formatter({ value }) { formatter({ value }) {
var retVal = ''; var retVal = '';
@ -221,7 +225,8 @@ export default {
{ {
header: '투입 생산 유형', header: '투입 생산 유형',
name: 'inProdKind', name: 'inProdKind',
align: 'center', width: 150,
align: 'left',
formatter({ value }) { formatter({ value }) {
var retVal = ''; var retVal = '';
@ -237,7 +242,8 @@ export default {
{ {
header: '계산 여부', header: '계산 여부',
name: 'calcFg', name: 'calcFg',
align: 'center', width: 150,
align: 'left',
formatter({ value }) { formatter({ value }) {
value = value === true ? '1' : '0'; value = value === true ? '1' : '0';
const newValue = _this.pageData.useFgList.filter( const newValue = _this.pageData.useFgList.filter(
@ -247,7 +253,7 @@ export default {
// return value === true ? "사용" : "사용안함"; // return value === true ? "사용" : "사용안함";
}, },
}, },
{ header: '분배율(1~100)', name: 'distRt', align: 'right' }, { header: '분배율(1~100)', name: 'distRt', align: 'right', width: 150 },
{ header: '사업장', name: 'blocId', align: 'center', hidden: true }, { header: '사업장', name: 'blocId', align: 'center', hidden: true },
{ header: '등록 사용자', name: 'regUserNo', hidden: true }, { header: '등록 사용자', name: 'regUserNo', hidden: true },
{ header: '등록 일자', name: 'regDttm', hidden: true }, { header: '등록 일자', name: 'regDttm', hidden: true },
@ -374,7 +380,7 @@ const myDetail = [
label: '대상 유형', label: '대상 유형',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'py-2 pr-4', class: 'pr-4',
list: 'emMapDivList', list: 'emMapDivList',
valueNm: 'objKind', valueNm: 'objKind',
itemText: 'commCdNm', itemText: 'commCdNm',
@ -391,7 +397,7 @@ const myDetail = [
valueNm: 'objId', valueNm: 'objId',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'pt-2 pb-0 mb-0 pl-4', class: 'pl-4 py-2',
required: true, required: true,
bindNm: 'objNm', bindNm: 'objNm',
labelCols: 12, labelCols: 12,
@ -400,24 +406,6 @@ const myDetail = [
noText: true, noText: true,
iconShow: true, iconShow: true,
}, },
{
// 공백 처리
type: 'Label',
cols: 6,
class: 'py-2 pr-4',
disabled: false,
},
{
type: 'InputText',
valueNm: 'objNm',
readonly: true,
disabled: true,
cols: 6,
class: 'pl-4',
labelCols: 12,
textCols: 12,
iconShow: true,
},
{ {
type: 'EvtObjPop', type: 'EvtObjPop',
labelContent: '대상 항목', labelContent: '대상 항목',
@ -428,16 +416,23 @@ const myDetail = [
disabled: true, disabled: true,
required: true, required: true,
cols: 6, cols: 6,
class: 'd-none pr-4', class: 'd-none pr-4 py-2',
disableContent: true, disableContent: true,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
iconShow: true, iconShow: true,
}, },
{
// 공백 처리
type: 'Label',
cols: 6,
class: 'py-2 pr-4',
disabled: false,
},
{ {
type: 'InputText', type: 'InputText',
cols: 6, cols: 6,
class: 'd-none pt-0 pl-4', class: 'pt-0 pl-4 mt-2 py-2',
valueNm: 'objNm', valueNm: 'objNm',
readonly: true, readonly: true,
disabled: true, disabled: true,
@ -450,7 +445,7 @@ const myDetail = [
label: '에너지원', label: '에너지원',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
list: 'ercNmList', list: 'ercNmList',
valueNm: 'ercId', valueNm: 'ercId',
itemText: 'text', itemText: 'text',
@ -465,7 +460,7 @@ const myDetail = [
label: '투입생산유형', label: '투입생산유형',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'py-2 pl-4', class: 'py-2 pl-4 mt-2',
list: 'cmInoutList', list: 'cmInoutList',
valueNm: 'inProdKind', valueNm: 'inProdKind',
itemText: 'commCdNm', itemText: 'commCdNm',
@ -478,7 +473,7 @@ const myDetail = [
{ {
type: 'CheckBox', type: 'CheckBox',
cols: 6, cols: 6,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
label: '계산 여부', label: '계산 여부',
valueNm: 'calcFg', valueNm: 'calcFg',
disabled: false, disabled: false,
@ -495,7 +490,7 @@ const myDetail = [
valueNm: 'distRt', valueNm: 'distRt',
readonly: false, readonly: false,
cols: 6, cols: 6,
class: 'py-2 pl-4', class: 'py-2 pl-4 mt-2',
required: true, required: true,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,

View File

@ -332,7 +332,7 @@ const myReadPlcTagDetail = [
valueNm2: 'tagNm', valueNm2: 'tagNm',
disabled: true, disabled: true,
cols: 6, cols: 6,
class: 'pr-4 pb-2 py-2', class: 'pr-4 pb-2 py-2 mt-2',
required: true, required: true,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
@ -345,7 +345,7 @@ const myReadPlcTagDetail = [
valueNm: 'ercId', valueNm: 'ercId',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'pl-4 pb-2 py-3', class: 'pl-4 pb-2 py-3 mt-2',
list: 'ercNmList', list: 'ercNmList',
itemText: 'text', itemText: 'text',
itemValue: 'value', itemValue: 'value',
@ -360,7 +360,7 @@ const myReadPlcTagDetail = [
readonly: true, readonly: true,
cols: 6, cols: 6,
textCols: 12, textCols: 12,
class: 'pt-1 py-3 pr-4', class: 'pt-1 py-3 pr-4 mt-2',
required: true, required: true,
}, },
{ {
@ -372,7 +372,7 @@ const myReadPlcTagDetail = [
valueNm: 'distRt', valueNm: 'distRt',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'py-3 pr-4', class: 'py-3 pr-4 mt-2',
inputType: 'number', inputType: 'number',
min: 1, min: 1,
max: 100, max: 100,
@ -387,7 +387,7 @@ const myReadPlcTagDetail = [
valueNm: 'reprTagFg', valueNm: 'reprTagFg',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'py-3 pl-4', class: 'py-3 pl-4 mt-2',
value: { '1': true, '0': false }, value: { '1': true, '0': false },
required: true, required: true,
labelCols: 12, labelCols: 12,
@ -401,7 +401,7 @@ const myReadPlcTagDetail = [
valueNm: 'useFg', valueNm: 'useFg',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'py-3 pr-4', class: 'py-3 pr-4 mt-2',
value: { '1': true, '0': false }, value: { '1': true, '0': false },
required: true, required: true,
labelCols: 12, labelCols: 12,
@ -414,7 +414,7 @@ const myReadPlcTagDetail = [
valueNm: 'rmrk', valueNm: 'rmrk',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'py-3 pl-4', class: 'py-3 pl-4 mt-2',
inputType: 'string', inputType: 'string',
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,

View File

@ -90,7 +90,7 @@
<!-- 사용자 정보 --> <!-- 사용자 정보 -->
<v-col :cols="7" class="h100"> <v-col :cols="7" class="h100">
<v-card class="pb-5 h100"> <v-card class="pb-5 h100">
<v-card-title class="custom-title-4">사용자 정보</v-card-title> <v-card-title class="custom-title-4 pb-0">사용자 정보</v-card-title>
<div class="px-5" :style="{ height: 'calc(100% - 62.5px)' }"> <div class="px-5" :style="{ height: 'calc(100% - 62.5px)' }">
<v-tabs v-model="tab"> <v-tabs v-model="tab">
<v-tab <v-tab
@ -971,7 +971,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
iconShow: true, iconShow: true,
required: false, required: false,
placeholder: '시스템 자동입력', placeholder: '시스템 자동입력',
@ -983,7 +983,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pl-4', class: 'py-2 pl-4 mt-2',
iconShow: true, iconShow: true,
required: true, required: true,
}, },
@ -996,8 +996,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
iconShow: true,
required: true, required: true,
}, },
{ {
@ -1007,7 +1006,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pl-4', class: 'py-2 pl-4 mt-2',
iconShow: true, iconShow: true,
required: true, required: true,
}, },
@ -1018,7 +1017,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
iconShow: true, iconShow: true,
list: blocCdList.map(item => ({ list: blocCdList.map(item => ({
text: item.blocNm, text: item.blocNm,
@ -1033,7 +1032,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pl-4', class: 'py-2 pl-4 mt-2',
iconShow: true, iconShow: true,
}, },
{ {
@ -1044,7 +1043,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
iconShow: true, iconShow: true,
placeholder: '시스템 자동입력', placeholder: '시스템 자동입력',
}, },
@ -1056,7 +1055,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pl-4', class: 'py-2 pl-4 mt-2',
iconShow: true, iconShow: true,
placeholder: '시스템 자동입력', placeholder: '시스템 자동입력',
}, },
@ -1068,7 +1067,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
iconShow: true, iconShow: true,
placeholder: '시스템 자동입력', placeholder: '시스템 자동입력',
}, },
@ -1080,7 +1079,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pl-4', class: 'py-2 pl-4 mt-2',
iconShow: true, iconShow: true,
placeholder: '시스템 자동입력', placeholder: '시스템 자동입력',
}, },

View File

@ -67,6 +67,10 @@
@getRowsData="getRowData" @getRowsData="getRowData"
/> />
</div> </div>
<div class="d-flex align-center justify-center pa-5" v-if="loadGrid && totalCount > 0">
<pagination id="pagination" :total-count="totalCount" :page-num="page" :limit="limit"
@loadData="changeGrid" />
</div>
</div> </div>
</v-card> </v-card>
</v-col> </v-col>
@ -105,6 +109,7 @@ import Buttons from '~/components/common/button/Buttons';
import Grid from '~/components/common/Grid'; import Grid from '~/components/common/Grid';
import Form from '~/components/common/form/Form'; import Form from '~/components/common/form/Form';
import Utility from '~/plugins/utility'; import Utility from '~/plugins/utility';
import pagination from '~/components/common/Pagination';
let myTitle; let myTitle;
let myPrgmId; let myPrgmId;
@ -133,6 +138,7 @@ export default {
BtnSearch, BtnSearch,
BtnExcelDownload, BtnExcelDownload,
Buttons, Buttons,
pagination,
}, },
data() { data() {
return { return {
@ -141,6 +147,11 @@ export default {
gridName: 'rowGrid', gridName: 'rowGrid',
// rowGridOrigin: [], // rowGridOrigin: [],
detailList: myDetail, detailList: myDetail,
itemsPerPage: 10,
itemsPerPageArray: [10, 20, 30],
limit: 20,
page: 1,
totalCount: 0,
}; };
}, },
computed: { computed: {
@ -161,7 +172,10 @@ export default {
}, },
watch: { watch: {
chkIsFind(val) { chkIsFind(val) {
if (val) this.search(); if (val) {
this.page = 1;
this.search();
}
}, },
chkExecRsltCd() { chkExecRsltCd() {
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
@ -197,16 +211,15 @@ export default {
// chkOpenTabList: "chkOpenTabList" // chkOpenTabList: "chkOpenTabList"
// }), // }),
init() { init() {
// this.layoutInit(); this.layoutInit();
this.gridInit(); this.gridInit();
}, },
// layoutInit() { layoutInit() {
// const searchFilterHeight = this.$refs.searchFilter.offsetHeight; this.$refs.contents.style.height = 'auto';
// this.$refs.contents.style.height = `calc(100% - ${searchFilterHeight}px)`; },
// },
gridInit() { gridInit() {
this.loadGrid = false; this.loadGrid = false;
const gridHeight = this.$refs.gridParent.offsetHeight - 30; const gridHeight = this.$refs.gridParent.offsetHeight;
const myOptions = { const myOptions = {
scrollX: false, scrollX: false,
@ -219,10 +232,10 @@ export default {
const _this = this; const _this = this;
const myColumns = [ const myColumns = [
{ header: 'No.', name: 'batchLogSeq', align: 'right', width: 100 }, { header: 'No.', name: 'batchLogSeq', align: 'right', width: 90 },
{ header: '배치ID', name: 'batchId', align: 'right', width: 100 }, { header: '배치ID', name: 'batchId', align: 'right', width: 90 },
{ header: '배치명', name: 'batchNm', align: 'left', width: 150 }, { header: '배치명', name: 'batchNm', align: 'left', width: 150 },
{ header: '실행 일자', name: 'execDt', align: 'right', width: 80 }, { header: '실행 일자', name: 'execDt', align: 'right', width: 70 },
{ {
header: '실행 결과', header: '실행 결과',
name: 'execRsltCd', name: 'execRsltCd',
@ -252,9 +265,9 @@ export default {
align: 'center', align: 'center',
width: 160, width: 160,
}, },
{ header: '등록자NO', name: 'regUserNo', width: 120 }, { header: '등록자NO', name: 'regUserNo', width: 100 },
{ header: '등록일시', name: 'regDttm', align: 'center', width: 160 }, { header: '등록일시', name: 'regDttm', align: 'center', width: 160 },
{ header: '수정자NO', name: 'procUserNo', width: 120 }, { header: '수정자NO', name: 'procUserNo', width: 100 },
{ header: '수정일시', name: 'procDttm', align: 'center', width: 160 }, { header: '수정일시', name: 'procDttm', align: 'center', width: 160 },
]; ];
@ -274,6 +287,11 @@ export default {
}); });
}, },
async getRowGridData() { async getRowGridData() {
this.loadGrid = false;
// this.setGridData({
// gridKey: this.gridName,
// value: [],
// });
const res = await this.postApiReturn({ const res = await this.postApiReturn({
apiKey: 'selectBatchLog', apiKey: 'selectBatchLog',
resKey: 'batchLogData', resKey: 'batchLogData',
@ -282,8 +300,24 @@ export default {
batchNm: this.pageData.batchNm, // 검색키워드: 배치명 batchNm: this.pageData.batchNm, // 검색키워드: 배치명
execRsltCd: this.pageData.execRsltCd, //배치 실행 결과 execRsltCd: this.pageData.execRsltCd, //배치 실행 결과
fromDt: this.pageData.fromDt, fromDt: this.pageData.fromDt,
limit: this.limit,
page: this.page,
offset: (this.page - 1) * this.limit, // MariaDB Query에서 직접 계산이 안됨
}, },
}); });
const res2 = await this.postApiReturn({
apiKey: 'selectBatchLogPageTotal',
resKey: 'batchLogPageTotal',
sendParam: {
batchId: this.pageData.batchId, // 검색키워드: 배치ID
batchNm: this.pageData.batchNm, // 검색키워드: 배치명
execRsltCd: this.pageData.execRsltCd, //배치 실행 결과
fromDt: this.pageData.fromDt,
},
});
this.totalCount = res2[0].totalcount;
const newRes = res.map(item => { const newRes = res.map(item => {
const newObj = { const newObj = {
...item, ...item,
@ -302,6 +336,7 @@ export default {
}); });
this.$nextTick(() => { this.$nextTick(() => {
this.loadGrid = true;
if (newRes.length > 0) { if (newRes.length > 0) {
this.$refs[this.gridName].focus({ this.$refs[this.gridName].focus({
rowKey: this.chkRowGridSelectKey || 0, rowKey: this.chkRowGridSelectKey || 0,
@ -361,6 +396,12 @@ export default {
} }
return retVal; return retVal;
}, },
changeGrid: async function (pageNum, limit) {
this.page = pageNum;
this.limit = limit;
this.search();
},
}, },
}; };

View File

@ -49,7 +49,7 @@
<v-col :cols="12" class="mt-5 pb-4"> <v-col :cols="12" class="mt-5 pb-4">
<v-card-title class="custom-title-6 pa-0">{{ viewActionData.title }}</v-card-title> <v-card-title class="custom-title-6 pa-0">{{ viewActionData.title }}</v-card-title>
</v-col> </v-col>
<v-col :cols="12" style="min-height: 30vh;" class="pa-0 custom-view"> <v-col :cols="12" style="min-height: 50vh;" class="pa-0 custom-view">
<v-card class="pa-3" style="overflow-y:auto;"> <v-card class="pa-3" style="overflow-y:auto;">
<viewer v-if="viewActionData.viewerFlag" ref="tuiViewer" height="inherit" <viewer v-if="viewActionData.viewerFlag" ref="tuiViewer" height="inherit"
:initialValue="viewActionData.content" theme="white" :initialValue="viewActionData.content" theme="white"

View File

@ -105,7 +105,7 @@
</v-col> </v-col>
<v-col :cols="7" style="min-height:75vh;"> <v-col :cols="7" style="min-height:75vh;">
<v-card class="pb-5"> <v-card class="pb-5">
<v-card-title class="custom-title-4" style="min-height:65px;" <v-card-title class="custom-title-4 pb-0" style="min-height:65px;"
>공정 상세 >공정 상세
</v-card-title> </v-card-title>
<div class="px-5" style="height:calc(100% - 76px)"> <div class="px-5" style="height:calc(100% - 76px)">
@ -901,7 +901,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pl-4', class: 'py-2 px-4',
required: true, required: true,
iconShow: true iconShow: true
}, },
@ -938,7 +938,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 mb-0 pb-0 pl-4 mt-2', class: 'py-2 mb-0 pb-0 px-4 mt-2',
list: 'locKindList', list: 'locKindList',
itemText: 'commCdNm', itemText: 'commCdNm',
itemValue: 'commCd', itemValue: 'commCd',
@ -956,7 +956,7 @@ const myDetail = [
// 공백 처리 // 공백 처리
type: 'Label', type: 'Label',
cols: 6, cols: 6,
class: 'py-2 pl-4 mt-2', class: 'py-2 px-4 mt-2',
disabled: false, disabled: false,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
@ -985,7 +985,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pl-4 mt-2', class: 'py-2 px-4 mt-2',
inputType: 'number', inputType: 'number',
iconShow: true iconShow: true
// onkeydown : "if(this.value > 100) this.value = 100;if(this.value < 0) this.value = 0;if(this.value == '') this.value = 0;" // onkeydown : "if(this.value > 100) this.value = 100;if(this.value < 0) this.value = 0;if(this.value == '') this.value = 0;"
@ -1012,7 +1012,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pl-4 mt-2', class: 'py-2 px-4 mt-2',
value: { '1': true, '0': false }, value: { '1': true, '0': false },
iconShow: true, iconShow: true,
required: true, required: true,

View File

@ -12,7 +12,7 @@
</v-col> </v-col>
<v-col :cols="3"> <v-col :cols="3">
<component :is="'EvtObjPop'" :parentPrgmId="myPrgmId" :item="evtObjPopItem" <component :is="'EvtObjPop'" :parentPrgmId="myPrgmId" :item="evtObjPopItem"
customClass="select-large" /> class="no-gutters" customClass="select-large" />
</v-col> </v-col>
<v-col :cols="3"> <v-col :cols="3">
<!-- 대상일 --> <!-- 대상일 -->
@ -29,17 +29,18 @@
</v-col> </v-col>
</v-row> </v-row>
<v-row ref="contents"> <v-row ref="contents">
<v-col :cols="12" style="height: 100%" class="h100"> <v-col :cols="12" class="h100">
<v-card class="px-5 py-5 h100"> <v-card class="px-5 py-5">
<div ref="gridParent" class="h100 px-5" style="height: 100%"> <div ref="gridParent" class="px-5" style="height:calc(100% - 40px)">
<component ref="myGrid" :is="loadGrid ? 'Grid' : null" :gridName="gridName" <component ref="myGrid" :is="loadGrid ? 'Grid' : null" :gridName="gridName"
:parentPrgmId="myPrgmId" /> :parentPrgmId="myPrgmId" />
</div> </div>
<div class="d-flex align-center justify-space-between"> <div class="d-flex align-center justify-center pa-5" v-if="loadGrid && totalCount > 0">
<pagination id="pagination" :total-count="totalCount" :page-num="page" :limit="limit" <pagination id="pagination" :total-count="totalCount" :page-num="page" :limit="limit"
@loadData="changeGrid" /> @loadData="changeGrid" />
</div> </div>
</v-card> </v-card>
</v-col> </v-col>
</v-row> </v-row>
</div> </div>
@ -61,7 +62,7 @@ import BtnExcelDownload from '~/components/common/button/BtnExcelDownload';
import DateUtility from '~/plugins/dateUtility'; import DateUtility from '~/plugins/dateUtility';
// import Search from "~/components/common/search"; // import Search from "~/components/common/search";
import EvtObjPop from '~/components/common/modal/EvtObjPop'; import EvtObjPop from '~/components/common/modal/EvtObjPop';
import pagination from '~/components/Pagination'; import pagination from '~/components/common/Pagination';
let myTitle; let myTitle;
// const myPrgmId = "PRG0052"; // const myPrgmId = "PRG0052";
@ -212,7 +213,7 @@ export default {
}, },
layoutInit() { layoutInit() {
const searchFilterHeight = this.$refs.searchFilter.offsetHeight; const searchFilterHeight = this.$refs.searchFilter.offsetHeight;
this.$refs.contents.style.height = `calc(100% - ${searchFilterHeight}px)`; this.$refs.contents.style.height = `calc(100% - 30px - ${searchFilterHeight}px) `;
}, },
async setFromDt() { async setFromDt() {
this.pageData.fromDt = Utility.setBeforetDate( this.pageData.fromDt = Utility.setBeforetDate(
@ -220,7 +221,6 @@ export default {
this.pageData.toDt, this.pageData.toDt,
'YYYYMMDD', 'YYYYMMDD',
); );
// this.pageData.toDt = Utility.setAftertDate(this.pageData, this.pageData.fromDt, "YYYYMMDD");
}, },
gridInit() { gridInit() {
this.loadGrid = false; this.loadGrid = false;

View File

@ -75,7 +75,7 @@
</v-col> </v-col>
<v-col :cols="7" class="h100"> <v-col :cols="7" class="h100">
<v-card class="pb-5"> <v-card class="pb-5">
<v-card-title class="custom-title-4-new" style="min-height:65px;" <v-card-title class="custom-title-4-new pb-0" style="min-height:65px;"
>검침대상 상세 >검침대상 상세
</v-card-title> </v-card-title>
<div class="px-5" style="height:calc(100% - 76px)"> <div class="px-5" style="height:calc(100% - 76px)">
@ -742,7 +742,7 @@ const myDetail = [
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
iconShow: true, iconShow: true,
class: 'py-2 pr-2', class: 'py-2 pr-2 mt-2',
required: false, required: false,
placeholder: '시스템 자동입력', placeholder: '시스템 자동입력',
}, },
@ -754,7 +754,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2', class: 'py-2 mt-2',
required: true, required: true,
iconShow: true, iconShow: true,
}, },
@ -766,7 +766,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-2', class: 'py-2 pr-2 mt-2',
list: 'readObjKindDetailList', list: 'readObjKindDetailList',
itemText: 'commCdNm', itemText: 'commCdNm',
itemValue: 'commCd', itemValue: 'commCd',
@ -781,7 +781,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2', class: 'py-2 mt-2',
list: 'readObjGrpList', list: 'readObjGrpList',
itemText: 'commCdNm', itemText: 'commCdNm',
itemValue: 'commCd', itemValue: 'commCd',
@ -796,7 +796,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-2', class: 'py-2 pr-2 mt-2',
iconShow: true, iconShow: true,
inputType: 'number', inputType: 'number',
}, },
@ -808,7 +808,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2', class: 'py-2 mt-2',
iconShow: true, iconShow: true,
inputType: 'number', inputType: 'number',
}, },
@ -820,7 +820,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-2', class: 'py-2 pr-2 mt-2',
iconShow: true, iconShow: true,
inputType: 'number', inputType: 'number',
}, },
@ -832,7 +832,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2', class: 'py-2 mt-2',
list: 'unitCdList', list: 'unitCdList',
itemText: 'commCdNm', itemText: 'commCdNm',
itemValue: 'commCd', itemValue: 'commCd',
@ -847,7 +847,7 @@ const myDetail = [
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-2', class: 'py-2 pr-2 mt-2',
value: { '1': true, '0': false }, value: { '1': true, '0': false },
iconShow: true, iconShow: true,
required: true, required: true,

View File

@ -100,6 +100,10 @@
:gridName="gridName" :gridName="gridName"
/> />
</div> </div>
<div class="d-flex align-center justify-center pa-5" v-if="loadGrid && totalCount > 0">
<pagination id="pagination" :total-count="totalCount" :page-num="page" :limit="limit"
@loadData="changeGrid" />
</div>
</v-card> </v-card>
</v-col> </v-col>
</v-row> </v-row>
@ -117,6 +121,7 @@ import selectCodeList from "@/components/common/select/selectCodeList";
import SelectMttList from "@/components/common/select/SelectMttList"; import SelectMttList from "@/components/common/select/SelectMttList";
import Datepicker from "~/components/common/Datepicker"; import Datepicker from "~/components/common/Datepicker";
import BtnExcelDownload from "~/components/common/button/BtnExcelDownload"; import BtnExcelDownload from "~/components/common/button/BtnExcelDownload";
import pagination from '~/components/common/Pagination';
let myTitle; let myTitle;
// const myPrgmId = "PRG0018"; // const myPrgmId = "PRG0018";
@ -144,27 +149,18 @@ export default {
Datepicker, Datepicker,
Search, Search,
Grid, Grid,
pagination,
}, },
data() { data() {
return { return {
myPrgmId: myPrgmId, myPrgmId: myPrgmId,
gridName: "rowGrid", gridName: "rowGrid",
loadGrid: false, loadGrid: false,
dataPathMock: { itemsPerPage: 10,
rowGrid: { itemsPerPageArray: [10, 20, 30],
column: [ limit: 20,
{ header: "태그", name: "id", headerAlign: "left" }, page: 1,
{ header: "배율", name: "lable", headerAlign: "left" }, totalCount: 0,
{ header: "설비비", name: "type", headerAlign: "left" },
{ header: "설비배분비율", name: "note", headerAlign: "left" },
{ header: "금일데이터", name: "note", headerAlign: "left" },
{ header: "최종마감시각", name: "date", headerAlign: "left" },
],
data: dataPathDataExample,
defaultRow: dataPathDataExample,
option: {},
},
},
}; };
}, },
computed: { computed: {
@ -190,7 +186,10 @@ export default {
}, },
watch: { watch: {
chkIsFind(val) { chkIsFind(val) {
if (val) this.search(); if (val) {
this.page = 1;
this.search();
}
}, },
chkBlocId() { chkBlocId() {
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
@ -243,10 +242,6 @@ export default {
columnOptions: { columnOptions: {
resizable: true, resizable: true,
}, },
pageOptions: {
useClient: true,
perPage: 13,
},
}; };
this.setGridOption({ this.setGridOption({
gridKey: this.gridName, gridKey: this.gridName,
@ -261,6 +256,8 @@ export default {
await this.getRowGridData(); await this.getRowGridData();
}, },
async getRowGridData() { async getRowGridData() {
this.loadGrid = false;
if ( if (
this.pageData.blocMstrList.length > 0 && this.pageData.blocMstrList.length > 0 &&
this.pageData.commCdList.length > 0 && this.pageData.commCdList.length > 0 &&
@ -274,8 +271,25 @@ export default {
mttCd: this.pageData.commCd, // 검침대상유형 mttCd: this.pageData.commCd, // 검침대상유형
mttTp: this.pageData.readObjId, // 검침대상 mttTp: this.pageData.readObjId, // 검침대상
readDt: this.pageData.fromDt, // 조회기간 readDt: this.pageData.fromDt, // 조회기간
limit: this.limit,
page: this.page,
offset: (this.page - 1) * this.limit, // MariaDB Query에서 직접 계산이 안됨
}, },
}); });
const res2 = await this.postApiReturn({
apiKey: 'selectReadResultCloseMngPageTotal',
resKey: 'cdKindPageTotal',
sendParam: {
blocId: this.pageData.blocMstrList[this.pageData.blocId].blocId, // 사업장
mttCd: this.pageData.commCd, // 검침대상유형
mttTp: this.pageData.readObjId, // 검침대상
readDt: this.pageData.fromDt, // 조회기간
},
});
this.totalCount = res2[0].totalcount;
this.setGridData({ this.setGridData({
gridKey: this.gridName, gridKey: this.gridName,
value: res.map((item) => ({ value: res.map((item) => ({
@ -325,6 +339,12 @@ export default {
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
} }
}, },
changeGrid: async function (pageNum, limit) {
this.page = pageNum;
this.limit = limit;
this.search();
},
}, },
}; };
@ -431,13 +451,4 @@ const myColumns = [
}, },
}, },
]; ];
import { getPathDataExample } from "@/const/const";
const dataPathDataExample = getPathDataExample({
id: "INCHEON.HVAC.EQP_HT_CH001.UT_CH101.CHI_AMP_1A_PV",
lable: "INCHEON 고온 냉동기 101호기 - 호로1",
type: "사용",
note: "-",
date: "2023-01-10 20:02:00",
});
</script> </script>

View File

@ -33,7 +33,7 @@
</v-col> </v-col>
<v-col :cols="6" class="text-right"> <v-col :cols="6" class="text-right">
<!-- 조회버튼 --> <!-- 조회버튼 -->
<BtnSearch style="margin-top: 20px" size="large" @click="search" /> <BtnSearch style="margin-top: 25px" size="large" @click="search" />
</v-col> </v-col>
</v-row> </v-row>
</v-card> </v-card>

View File

@ -14,9 +14,9 @@
<!-- 대상일 --> <!-- 대상일 -->
<component :is="'Datepicker'" :parentPrgmId="myPrgmId" :label="'대상일'" :labelCols="3" customClass="datepicker-large" /> <component :is="'Datepicker'" :parentPrgmId="myPrgmId" :label="'대상일'" :labelCols="3" customClass="datepicker-large" />
</v-col> </v-col>
<v-col :cols="4" class="text-right"> <v-col :cols="6" class="text-right">
<BtnSearch @click="search" size="large" />
<!-- 조회버튼 --> <!-- 조회버튼 -->
<BtnSearch @click="search" size="large" />
</v-col> </v-col>
</v-row> </v-row>
</v-card> </v-card>
@ -47,8 +47,13 @@
</v-row> </v-row>
<div class="px-5" style="height: 80%"> <div class="px-5" style="height: 80%">
<div ref="chartParent" class="w100 h100"> <div ref="chartParent" class="w100 h100">
<component :ref="chartName" class="w100 h100" :is="loadChart ? 'Chart' : null" :parentPrgmId="myPrgmId" <component
:chartName="chartName" /> :ref="chartName"
class="w100 h100"
:is="loadChart ? 'Chart' : null"
:parentPrgmId="myPrgmId"
:chartName="chartName"
/>
</div> </div>
</div> </div>
</v-card> </v-card>
@ -68,6 +73,8 @@ import SelectBox from '@/components/common/select/SelectBox';
import DateUtility from '~/plugins/dateUtility'; import DateUtility from '~/plugins/dateUtility';
import Chart from '~/components/common/Chart'; import Chart from '~/components/common/Chart';
import getSankeyChartOption from "~/components/common/chartoptions/sankeyChart";
let myTitle; let myTitle;
let myPrgmId; let myPrgmId;
@ -101,6 +108,8 @@ export default {
selectValue01: null, selectValue01: null,
loadChart: false, loadChart: false,
chartName: 'sankeyChart', chartName: 'sankeyChart',
sankeyChartData: [],
sankeyChartLinks: []
}; };
}, },
computed: { computed: {
@ -148,6 +157,16 @@ export default {
}); });
} }
}, },
isDarkMode(newVal) {
this.setChartOption({
chartKey: this.chartName,
value: getSankeyChartOption({
isDarkMode: newVal,
data: this.sankeyChartData,
links: this.sankeyChartLinks
})
});
},
}, },
async beforeCreate() { async beforeCreate() {
myPrgmId = this.$route.query.prgmId; myPrgmId = this.$route.query.prgmId;
@ -159,9 +178,6 @@ export default {
}, },
async created() { }, async created() { },
async mounted() { async mounted() {
// this.initTest();
// return;
this.init(); this.init();
// document.querySelector('.icon_arrow').style.width = document.querySelector('.iconArrowCols').clientWidth-20 + "px"; // document.querySelector('.icon_arrow').style.width = document.querySelector('.iconArrowCols').clientWidth-20 + "px";
}, },
@ -176,10 +192,8 @@ export default {
...mapActions({ ...mapActions({
getCodeList: 'modules/search/getCodeList', getCodeList: 'modules/search/getCodeList',
}), }),
initTest() { initTestChart() {
const randomNumber = n => Math.floor(Math.random() * n) + 1;
const randomNumber = n => Math.floor(Math.random() * n) + 1;
const makeData = [ const makeData = [
{ name: 'A' }, { name: 'A' },
{ name: 'B' }, { name: 'B' },
@ -205,45 +219,13 @@ export default {
]); ]);
} }
const chartOption = { this.sankeyChartData = makeData;
backgroundColor: '#FFFFFF', this.sankeyChartLinks = makeLinks;
series: [ const chartOption = getSankeyChartOption({
{ isDarkMode: this.isDarkMode,
layoutIterations: 0, data: makeData,
type: 'sankey', links: makeLinks
left: 25.0, });
top: 20.0,
right: 120,
bottom: 50.0,
// nodeWidth:10,
nodeGap: 10,
nodeAlign: 'left',
data: makeData,
links: makeLinks,
lineStyle: {
color: 'source',
curveness: 0.5,
},
// triggerEvent: true,
itemStyle: {
//color: '#1f77b4',
//borderColor: '#1f77b4'
},
label: {
color: this.isDarkMode
? 'rgba(250,250,250,0.7)'
: 'rgba(0,0,0,0.7)',
fontFamily: 'Arial',
fontSize: 12,
},
},
],
tooltip: {
trigger: 'item',
},
};
this.setChartOption({ chartKey: this.chartName, value: chartOption }); this.setChartOption({ chartKey: this.chartName, value: chartOption });
this.$nextTick(() => { this.$nextTick(() => {
this.loadChart = true; this.loadChart = true;
@ -254,7 +236,11 @@ export default {
this.setFromDt(); this.setFromDt();
}, },
async search() { async search() {
await this.getChartData(); try{
await this.getChartData();
}catch(err){
this.initTestChart();
}
this.setPageData({ this.setPageData({
isFind: false, isFind: false,
}); });
@ -458,43 +444,13 @@ export default {
}; };
} }
const chartOption = { this.sankeyChartData = makeData;
backgroundColor: '#FFFFFF', this.sankeyChartLinks = makeLinks;
series: [ const chartOption = getSankeyChartOption({
{ isDarkMode: this.isDarkMode,
layoutIterations: 0, data: makeData,
type: 'sankey', links: makeLinks
left: 25.0, });
top: 20.0,
right: 120,
bottom: 50.0,
// nodeWidth:10,
nodeGap: 10,
nodeAlign: 'left',
data: makeData,
links: makeLinks,
lineStyle: {
color: 'source',
curveness: 0.5,
},
// triggerEvent: true,
itemStyle: {
//color: '#1f77b4',
//borderColor: '#1f77b4'
},
label: {
color: this.isDarkMode
? 'rgba(250,250,250,0.7)'
: 'rgba(0,0,0,0.7)',
fontFamily: 'Arial',
fontSize: 12,
},
},
],
tooltip: {
trigger: 'item',
},
};
this.setChartOption({ chartKey: this.chartName, value: chartOption }); this.setChartOption({ chartKey: this.chartName, value: chartOption });

File diff suppressed because it is too large Load Diff

View File

@ -304,7 +304,7 @@ export default {
$(elDiv).addClass('tui-grid-cell-content d-flex justify-space-between'); $(elDiv).addClass('tui-grid-cell-content d-flex justify-space-between');
const el2 = document.createElement('button'); const el2 = document.createElement('button');
$(el2).addClass('edit-btn blue--text'); $(el2).addClass('edit-btn blue--text');
el2.innerText = '편집하다'; el2.innerText = '수정';
elDiv.appendChild(el2); elDiv.appendChild(el2);
this.el = elDiv; this.el = elDiv;
@ -415,7 +415,7 @@ export default {
{ {
header: '구분', header: '구분',
name: 'gubun', name: 'gubun',
width: 80, width: 200,
align: 'left', align: 'left',
// hidden: true, // hidden: true,
formatter({ value }) { formatter({ value }) {
@ -447,7 +447,7 @@ export default {
myColumns.push({ myColumns.push({
header: i.toString() + '월', header: i.toString() + '월',
name: qty, name: qty,
width: 73, width: 80,
align: 'right', align: 'right',
editor: 'text', editor: 'text',
formatter: this.numberFormatter, formatter: this.numberFormatter,

View File

@ -52,6 +52,8 @@
</v-card-title> </v-card-title>
<v-row> <v-row>
<v-col :cols="3" v-for="(item, i) in value.chartData" :key="'key2_' + i"> <v-col :cols="3" v-for="(item, i) in value.chartData" :key="'key2_' + i">
<v-card>
<div <div
class="v-box" class="v-box"
style="height: 330px; position: relative" style="height: 330px; position: relative"
@ -73,7 +75,7 @@
<!-- Information area --> <!-- Information area -->
<v-col :cols="5" style="height: 100%"> <v-col :cols="5" style="height: 100%">
<div style="height: 10%"> <div style="height: 10%">
<strong style="font-size: 20px; font-weight: 600">{{ <strong class="v-card v-card__title pa-0" >{{
item.fabNm item.fabNm
}}</strong> }}</strong>
</div> </div>
@ -123,6 +125,8 @@
</div> </div>
</v-col> </v-col>
</div> </div>
</v-card>
</v-col> </v-col>
</v-row> </v-row>
</div> </div>

View File

@ -97,14 +97,25 @@
<v-card-title class="d-flex align-center justify-space-between pa-5"> <v-card-title class="d-flex align-center justify-space-between pa-5">
<span class="tit ft-size_20 ft-weight_600">설비별 현황 리스트</span> <span class="tit ft-size_20 ft-weight_600">설비별 현황 리스트</span>
</v-card-title> </v-card-title>
<div class="px-5" style="height: calc(100% - 106px)"> <div class="px-5" style="height: calc(100% - 56px)">
<div ref="gridParent" class="w100 h100"> <div ref="gridParent" class="w100 h100" style="height: calc(100% - 166px)">
<component <component
:ref="gridName" :ref="gridName"
:is="loadGrid ? 'Grid' : null" :is="loadGrid ? 'Grid' : null"
:gridName="gridName" :gridName="gridName"
:parentPrgmId="myPrgmId" :parentPrgmId="myPrgmId"
/> />
<div class="pagination-wrapper">
<pagination
id="pagination"
:total-count="totalCount"
:page-num="page"
:limit="limit"
:itemsPerPageArray="itemsPerPageArray"
@loadData="changeGrid"
/>
</div>
<!-- <!--
<component <component
:ref="gridName" :ref="gridName"
@ -142,6 +153,7 @@ import SelectBox from "@/components/common/select/SelectBox";
import SelectCmCycle from "@/components/common/select/SelectCmCycle"; import SelectCmCycle from "@/components/common/select/SelectCmCycle";
import DatePicker from "@/components/common/Datepicker"; import DatePicker from "@/components/common/Datepicker";
import Grid from "~/components/common/Grid"; import Grid from "~/components/common/Grid";
import pagination from "~/components/common/Pagination";
let myTitle; let myTitle;
let myPrgmId; let myPrgmId;
@ -168,6 +180,7 @@ export default {
SelectCmCycle, SelectCmCycle,
DatePicker, DatePicker,
Grid, Grid,
pagination,
}, },
data() { data() {
return { return {
@ -188,6 +201,10 @@ export default {
gridName: "grid01", gridName: "grid01",
enrgUseMainIdxDesc: [], enrgUseMainIdxDesc: [],
itemsPerPageArray: [10, 20, 30],
limit: 10,
page: 1,
totalCount: 0,
// tooltipData: { // tooltipData: {
// show: false, // show: false,
@ -263,6 +280,11 @@ export default {
this.chkOpenTabList({ key: "destroy", prgmId: myPrgmId }); this.chkOpenTabList({ key: "destroy", prgmId: myPrgmId });
}, },
methods: { methods: {
changeGrid: async function (pageNum, limit) {
this.page = pageNum;
this.limit = limit;
this.search();
},
async init() { async init() {
await this.getSelectValueList(); await this.getSelectValueList();
await this.setQueryParams(); await this.setQueryParams();
@ -367,50 +389,57 @@ export default {
const _this = this; const _this = this;
// Define custom button // Define custom button
class CustomButton { class CustomButton {
constructor(props,pageData) { constructor(props, pageData) {
const { grid, rowKey, columnInfo } = props; const { grid, rowKey, columnInfo } = props;
const gridData = grid.store.data.rawData; const gridData = grid.store.data.rawData;
const value = gridData[rowKey][columnInfo.name]; const value = gridData[rowKey][columnInfo.name];
const onClickCallback = columnInfo.renderer.options.onClick; const onClickCallback = columnInfo.renderer.options.onClick;
this.disabled = columnInfo.renderer.options.disabled || false; this.disabled = columnInfo.renderer.options.disabled || false;
const elDiv = document.createElement('div'); const elDiv = document.createElement("div");
elDiv.innerHTML = `<span>${value}</span>`; elDiv.innerHTML = `<span>${value}</span>`;
$(elDiv).addClass('tui-grid-cell-content d-flex justify-space-between'); $(elDiv).addClass("tui-grid-cell-content d-flex justify-space-between");
const el2 = document.createElement('button'); const el2 = document.createElement("button");
$(el2).addClass('edit-btn blue--text'); $(el2).addClass("edit-btn blue--text");
el2.innerText = '보기'; el2.innerText = "보기";
elDiv.appendChild(el2); elDiv.appendChild(el2);
this.el = elDiv; this.el = elDiv;
if (!this.disabled && typeof onClickCallback === 'function') { if (!this.disabled && typeof onClickCallback === "function") {
// click 이벤트 // click 이벤트
this.el.addEventListener('click', function(event) { this.el.addEventListener("click", function (event) {
onClickCallback(rowKey); onClickCallback(rowKey);
}); });
} }
} }
getElement() { getElement() {
return this.el; return this.el;
} }
getValue() { getValue() {
// return this.el.value; // return this.el.value;
} }
mounted() { mounted() {
// this.el.focus(); // this.el.focus();
} }
} }
var columnList = [ var columnList = [
{ header: "NO", name: "no", align: "right", width: 80 }, { header: "NO", name: "no", align: "right", width: 80 },
{ header: "fabId", name: "fabId", hidden: true }, { header: "fabId", name: "fabId", hidden: true },
{ header: "FAB", name: "fabNm", align: "left" }, { header: "FAB", name: "fabNm", align: "left" },
{ header: "eqpmGrpId", name: "eqpmGrpId", hidden: true }, { header: "eqpmGrpId", name: "eqpmGrpId", hidden: true },
{ header: "설비그룹", name: "eqpmGrpNm", align: "left", width: 200, {
header: "설비그룹",
name: "eqpmGrpNm",
align: "left",
width: 200,
},
{ header: "eqpmId", name: "eqpmId", hidden: true },
{ header: "설비명", name: "eqpmNm", align: "left", width: 200,
// Render custom button to switch page instead of double click on row // Render custom button to switch page instead of double click on row
renderer: { renderer: {
type: CustomButton, type: CustomButton,
options: { options: {
value: '보기', value: "보기",
onClick: (rowKey) => { onClick: (rowKey) => {
const gridInstance = this.$refs[this.gridName].gridInstance; const gridInstance = this.$refs[this.gridName].gridInstance;
const eventRowData = gridInstance.invoke("getRow", rowKey); const eventRowData = gridInstance.invoke("getRow", rowKey);
@ -434,12 +463,10 @@ export default {
key: key, key: key,
}, },
}); });
} },
} },
} },
}, },
{ header: "eqpmId", name: "eqpmId", hidden: true },
{ header: "설비명", name: "eqpmNm", align: "left", width: 200 },
{ {
header: "계획량", header: "계획량",
name: "planVal", name: "planVal",
@ -546,10 +573,10 @@ export default {
}, },
], ],
}, },
pageOptions: { // pageOptions: {
useClient: true, // useClient: true,
perPage: 3, // perPage: 3,
} // }
}; };
this.setGridOption({ this.setGridOption({
@ -566,26 +593,39 @@ export default {
this.loadGrid = false; this.loadGrid = false;
this.enrgUseMainIdxDesc = []; this.enrgUseMainIdxDesc = [];
var apiKey = null; var apiKey = null;
var apiKey2 = null;
var params = { var params = {
fabId: this.selectValue01, fabId: this.selectValue01,
eqpmKindId: this.selectValue02, eqpmKindId: this.selectValue02,
eqpmGrpId: this.selectValue03, eqpmGrpId: this.selectValue03,
fromDt: this.pageData.fromDt, fromDt: this.pageData.fromDt,
limit: this.limit,
page: this.page,
offset: (this.page - 1) * this.limit, // MariaDB Query에서 직접 계산이 안됨
}; };
if (this.pageData.cmCycle == "CYC_DAY") { if (this.pageData.cmCycle == "CYC_DAY") {
params["fromDtMm"] = String(this.pageData.fromDt).substring(0, 6); params["fromDtMm"] = String(this.pageData.fromDt).substring(0, 6);
apiKey = "selectDailyEnrgUseMainIdx"; apiKey = "selectDailyEnrgUseMainIdx";
apiKey2 = "selectDailyEnrgUseMainIdxPageTotal";
} else if (this.pageData.cmCycle == "CYC_MONTH") { } else if (this.pageData.cmCycle == "CYC_MONTH") {
apiKey = "selectMonthlyEnrgUseMainIdx"; apiKey = "selectMonthlyEnrgUseMainIdx";
apiKey2 = "selectMonthlyEnrgUseMainIdxPageTotal";
} }
var res = await this.postApiReturn({ var res = await this.postApiReturn({
apiKey: apiKey, apiKey: apiKey,
resKey: "eqpmIndMntrData", resKey: "eqpmIndMntrData",
sendParam: params, sendParam: params,
}); });
var res2 = await this.postApiReturn({
apiKey: apiKey2,
resKey: "eqpmIndMntrPageTotal",
sendParam: params,
});
this.totalCount = res2[0].totalcount;
this.enrgUseMainIdxDesc = await this.postApiReturn({ this.enrgUseMainIdxDesc = await this.postApiReturn({
apiKey: "selectEnrgUseMainIdxDesc", apiKey: "selectEnrgUseMainIdxDesc",
resKey: "eqpmIndMntrData", resKey: "eqpmIndMntrData",
@ -654,7 +694,7 @@ export default {
// id값 설정 // id값 설정
elementList[i].id = "tooltipTargetElement_" + i; elementList[i].id = "tooltipTargetElement_" + i;
tooltipElement.id = "tooltipElement_" + i; tooltipElement.id = "tooltipElement_" + i;
tooltipElement.classList.add(this.isDarkmode ? "dark-mode" : "light-mode");
// element 추가 // element 추가
elementList[i].append(tooltipElement); elementList[i].append(tooltipElement);
} }
@ -849,5 +889,12 @@ function numberFormatter({ value }) {
overflow-y: visible; overflow-y: visible;
} }
} }
.pagination-wrapper {
display: flex;
justify-content: center;
align-items: center;
padding: 12px 0;
}
} }
</style> </style>

View File

@ -1,6 +1,6 @@
import Vue from "vue"; import Vue from "vue";
// import Antd from "ant-design-vue"; // import Antd from "ant-design-vue";
import { Row, Col, Card, Button, Checkbox, DatePicker, Select, Table, Modal, Input, Icon, Divider } from "ant-design-vue"; import { Row, Col, Card, Button, Checkbox, DatePicker, Select, Table, Modal, Input, Icon, Divider, Pagination } from "ant-design-vue";
import 'ant-design-vue/dist/antd.css' import 'ant-design-vue/dist/antd.css'
// import { RangePicker } from "ant-design-vue/types/date-picker/range-picker"; // import { RangePicker } from "ant-design-vue/types/date-picker/range-picker";
@ -17,4 +17,5 @@ Vue.component(Modal.name, Modal)
Vue.component(Input.name, Input) Vue.component(Input.name, Input)
Vue.component(Icon.name, Icon) Vue.component(Icon.name, Icon)
Vue.component(Divider.name, Divider) Vue.component(Divider.name, Divider)
Vue.component(Pagination.name, Pagination)
// Vue.component(RangePicker.name, RangePicker) // Vue.component(RangePicker.name, RangePicker)

View File

@ -210,6 +210,8 @@ const INIT_URL_STATE = {
// prgmId: "TMP0013" 검침실적마감관리 ems/ReadResultCloseMngPage // prgmId: "TMP0013" 검침실적마감관리 ems/ReadResultCloseMngPage
selectReadResultCloseMng: selectReadResultCloseMng:
'ems/base/ReadResultCloseMngCtr/selectReadResultCloseMng', // 일일검침정보 'ems/base/ReadResultCloseMngCtr/selectReadResultCloseMng', // 일일검침정보
selectReadResultCloseMngPageTotal:
'ems/base/ReadResultCloseMngCtr/selectReadResultCloseMngPageTotal', // 일일검침정보
saveReadResultCloseMngSP: saveReadResultCloseMngSP:
'ems/base/ReadResultCloseMngCtr/saveReadResultCloseMngSP', // 전월 or 일 마감 'ems/base/ReadResultCloseMngCtr/saveReadResultCloseMngSP', // 전월 or 일 마감
saveReadResultCloseMngSPMM: saveReadResultCloseMngSPMM:
@ -279,6 +281,7 @@ const INIT_URL_STATE = {
// prgmId: "PRG0020" 배치로그 // prgmId: "PRG0020" 배치로그
selectBatchLog: 'comm/base/BatchLogCtr/selectBatchLog', // 배치 로그 selectBatchLog: 'comm/base/BatchLogCtr/selectBatchLog', // 배치 로그
selectBatchLogPageTotal: 'comm/base/BatchLogCtr/selectBatchLogPageTotal', // 배치 로그
// prgmId: "PRG0017" 검침개소 기간별 비교 // prgmId: "PRG0017" 검침개소 기간별 비교
selectSameReadPlcTime: 'ems/base/sameReadPlcCtr/selectSameReadPlcTime', selectSameReadPlcTime: 'ems/base/sameReadPlcCtr/selectSameReadPlcTime',
@ -910,6 +913,11 @@ const INIT_URL_STATE = {
'ems/effc/eqpmIndMntrCtr/selectDailyEnrgUseMainIdx', 'ems/effc/eqpmIndMntrCtr/selectDailyEnrgUseMainIdx',
selectMonthlyEnrgUseMainIdx: selectMonthlyEnrgUseMainIdx:
'ems/effc/eqpmIndMntrCtr/selectMonthlyEnrgUseMainIdx', 'ems/effc/eqpmIndMntrCtr/selectMonthlyEnrgUseMainIdx',
selectDailyEnrgUseMainIdxPageTotal:
'ems/effc/eqpmIndMntrCtr/selectDailyEnrgUseMainIdxPageTotal',
selectMonthlyEnrgUseMainIdxPageTotal:
'ems/effc/eqpmIndMntrCtr/selectMonthlyEnrgUseMainIdxPageTotal',
//prgmId : PRG0082 에너지 사용량 - 설비상세 모니터링 //prgmId : PRG0082 에너지 사용량 - 설비상세 모니터링
selectDailyEnrgUseMainGuideIdx: selectDailyEnrgUseMainGuideIdx: