Compare commits

..

21 Commits

Author SHA1 Message Date
dev
39905e6f80 Merge pull request 'update code s32 s17' (#61) from dev-luannv24-s32-s17fixbug into dev
Reviewed-on: #61
2025-08-12 18:47:56 +09:00
dev
0825663c64 Merge pull request 'fix icon datepicker' (#60) from dev-manhph1-figbug into dev
Reviewed-on: #60
2025-08-12 18:47:08 +09:00
dev
8d444eafcd Merge pull request 'Update pagination UI + Fix bugs gauge chart line chart + Fix bugs s14' (#59) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #59
2025-08-12 18:43:04 +09:00
71e90064a2 update code s32 s17 2025-08-12 18:37:21 +09:00
7d2bcb9496 fix icon datepicker 2025-08-12 18:00:01 +09:00
84c7e61254 Update pagination UI + Fix bugs gauge chart line chart + Fix bugs s14 2025-08-12 17:07:52 +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
41 changed files with 1164 additions and 961 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/tabs.scss";
@import "./common/numericInput.scss";
@import "./common/pagination.scss";
@import "./common/editor.scss";
@ -443,6 +444,10 @@ a {
.v-application.#{$theme}-mode {
min-width: 1000px;
.icon-datepicker-color {
color: map-deep-get($config, #{$theme}, "icon-datepicker-color");
}
.head-logo {
gap: 8px;
}
@ -949,6 +954,7 @@ a {
& th,
& td {
height: 48px;
color: map-deep-get($config, #{$theme}, "tui-datepicker-calendar-color");
}
}

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: none;
.ant-pagination-item-link {
border: none;
background-color: map-deep-get($config, #{$theme}, "paging-background") !important;
}
}
.ant-pagination-item-active {
border: 1px solid #1890ff !important;
color: #1890ff !important
}
.ant-pagination-options-size-changer {
.ant-select-selection {
border: 0.5px solid map-deep-get($config, #{$theme}, "v-input-fieldset-color") !important;
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 {

View File

@ -182,6 +182,9 @@ $config: (
ant-btn-popup-bg: #212224,
ant-btn-popup-color: #FFFFFFD9,
ant-btn-popup-border: #424242,
paging-background: #212224,
paging-text: #FFFFFFD9,
icon-datepicker-color: #FFFFFF73,
),
light: (w-g5: $--color-gray_555,
g5-w: $--color-white,
@ -327,5 +330,8 @@ $config: (
ant-btn-popup-bg: #FFFFFF,
ant-btn-popup-color: #000000E0,
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,
default: true
},
labelClass: {
type: String,
require: false,
},
},
data() {
return {

View File

@ -19,15 +19,18 @@
readonly
outlined
>
<template #append >
<!-- <template #append >
<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 #append-outer>
<div ref="startpicker-container" id="startpicker-container"></div>
</template>
</v-text-field>
<div v-if="isRange" class="mx-3" :style="{ lineHeight: 0 }">
<img :src="arrowIcon" alt="">
<img :src="arrowIcon">
</div>
<v-text-field
v-show="isRange"
@ -40,7 +43,9 @@
outlined
>
<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 #append-outer>
<div ref="endpicker-container" id="endpicker-container"></div>
@ -209,9 +214,9 @@ export default {
},
arrowIcon() {
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: {

View File

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

View File

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

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

View File

@ -2,9 +2,9 @@
<div class="d-flex justify-center align-center"
:class="directionBtn === 'vertically'?'flex-row':'flex-column'"
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 @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>
</div>
</template>

View File

@ -2,15 +2,13 @@
export default function getGaugeChartOption({ title, min = 0, max = 160, unit = '%', isDarkMode = false, backgroundRadius = 97 }) {
const colorRanges = isDarkMode
? [
[0.375, '#49AA19'], // Dark Green
// [0.5, '#B8860B'], // Dark Yellow
[0.625, '#D89614'], // Dark Orange
[60 / 160, '#49AA19'], // Dark Green
[100 / 160, '#D89614'], // Dark Orange
[1, '#D32029'], // Dark Red
]
: [
[0.375, '#52C41A'], // Light Green
// [0.5, '#FFD700'], // Light Yellow
[0.625, '#FAAD14'], // Light Orange
[60 / 160, '#52C41A'], // Light Green
[100 / 160, '#FAAD14'], // Light Orange
[1, '#F5222D'], // Light Red
];
// Old color range
@ -56,6 +54,7 @@ export default function getGaugeChartOption({ title, min = 0, max = 160, unit =
endAngle: -45,
min: min,
max: max,
splitNumber: 8,
// progress: {
// show: true,
// width: 15,

View File

@ -34,6 +34,8 @@ export default function getLineChartOption({
legend: {
// data: legendData,
icon: 'circle',
itemWidth: 15, // Width of the legend icon
itemHeight: 15,
top: '0%',
right: '5%',
orient: 'horizontal',
@ -70,6 +72,7 @@ export default function getLineChartOption({
},
splitLine: {
lineStyle: {
type: 'dashed', // Options: 'solid', 'dashed', 'dotted'
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">
<label for="" class="search-box-label">
<v-icon
x-small
:color="item.required ? '#fb8200' : 'primary'"
class="mr-1"
>mdi-record-circle</v-icon
v-if="item.iconShow"
small
:class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
>
{{ item.label }}
<span v-if="item.essential">*</span>
</label>
<!-- <label for="" class="search-box-label ft-size_14 ft-clr_g-c">
{{ item.label }}
@ -39,12 +40,12 @@
</template>
</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-title>
<span class="custom-title-4">비밀번호 {{ isPassword }}</span>
<v-card-title class="px-4">
<span class="custom-title-4" style="padding-left: 1px;">비밀번호 {{ isPassword }}</span>
</v-card-title>
<v-card-text class="pb-4">
<v-card-text class="pb-4 px-3">
<v-col>
<label for="" class="search-box-label">
{{ isPassword }} 비밀번호를 입력하세요

View File

@ -17,20 +17,24 @@
{{ item.label }}
</label>
</v-col>
<v-col :cols="label ? item.textCols : ''">
<v-col :cols="label ? item.textCols : ''" class="py-0">
<!-- <v-col :cols="label ? 9 : ''"> -->
<!-- :value="textfield" -->
<v-text-field
readonly
v-model="selectValue"
append-icon="mdi-magnify"
class="v-input__custom"
@click="dialog = !dialog"
outlined
:hide-details="true"
:disabled="item.disabled || false"
:required="item.required || false"
></v-text-field>
>
<template v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
</template>
</v-text-field>
</v-col>
<!-- <v-row justify="center"> -->

View File

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

View File

@ -1,5 +1,5 @@
<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">
<label for="" class="search-box-label">
<v-icon v-if="item.iconShow" small

View File

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

View File

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

View File

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

View File

@ -21,9 +21,9 @@
</v-col>
</v-row>
<!-- Create the line between date picker and form -->
<v-row class="my-5" no-gutters>
<v-row class="mt-6 mb-7" no-gutters>
<v-col>
<div style="height: 1px; background-color: #ccc;"></div>
<div style="height: 1px; background-color: #0000000F;"></div>
</v-col>
</v-row>
<v-row class="search-box" align="center" no-gutters style="height: 44px;">
@ -43,7 +43,7 @@
<div
ref="gridParent"
class="w100"
style="height: calc((100vh - 600px) / 2);"
style="height: calc((100vh - 500px) / 2);"
>
<Grid
:ref="gridName"
@ -57,7 +57,7 @@
</div>
</v-col>
</v-row>
<v-row class="search-box" align="center" no-gutters style="height: 44px;">
<v-row class="search-box mt-2" align="center" no-gutters style="height: 44px;">
<v-col :cols="4">
<label for="" class="search-box-label">
<!-- <v-icon x-small color="primary" class="mr-1"
@ -77,7 +77,7 @@
<div
ref="chartParent"
class="h100 w100"
style="height: calc((100vh - 600px) / 2 - 30px);"
style="height: calc((100vh - 500px) / 2);"
>
<component
class="w100 h100"

View File

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

View File

@ -90,7 +90,7 @@
<!-- 사용자 정보 -->
<v-col :cols="7" class="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)' }">
<v-tabs v-model="tab">
<v-tab
@ -947,17 +947,6 @@ const asgnRoleByUserColumns = [
];
const asgnMenuByUserColumns = [
{
header: '',
name: '',
align: 'center',
width: 50,
formatter: (props) => {
return `<label class="custom-radio">
<span class="radio-mark"></span>
</label>`;
}
},
{ header: '메뉴명', name: 'menuNm' }];
const myDetail = blocCdList => {
@ -971,7 +960,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
class: 'py-2 pr-4 mt-2',
iconShow: true,
required: false,
placeholder: '시스템 자동입력',
@ -983,7 +972,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pl-4',
class: 'py-2 pl-4 mt-2',
iconShow: true,
required: true,
},
@ -996,8 +985,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
iconShow: true,
class: 'py-2 pr-4 mt-2',
required: true,
},
{
@ -1007,7 +995,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pl-4',
class: 'py-2 pl-4 mt-2',
iconShow: true,
required: true,
},
@ -1018,7 +1006,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
class: 'py-2 pr-4 mt-2',
iconShow: true,
list: blocCdList.map(item => ({
text: item.blocNm,
@ -1033,7 +1021,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pl-4',
class: 'py-2 pl-4 mt-2',
iconShow: true,
},
{
@ -1044,7 +1032,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
class: 'py-2 pr-4 mt-2',
iconShow: true,
placeholder: '시스템 자동입력',
},
@ -1056,7 +1044,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pl-4',
class: 'py-2 pl-4 mt-2',
iconShow: true,
placeholder: '시스템 자동입력',
},
@ -1068,7 +1056,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
class: 'py-2 pr-4 mt-2',
iconShow: true,
placeholder: '시스템 자동입력',
},
@ -1080,7 +1068,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pl-4',
class: 'py-2 pl-4 mt-2',
iconShow: true,
placeholder: '시스템 자동입력',
},

View File

@ -49,7 +49,7 @@
<v-col :cols="12" class="mt-5 pb-4">
<v-card-title class="custom-title-6 pa-0">{{ viewActionData.title }}</v-card-title>
</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;">
<viewer v-if="viewActionData.viewerFlag" ref="tuiViewer" height="inherit"
:initialValue="viewActionData.content" theme="white"

View File

@ -1196,7 +1196,8 @@ export default {
show: false,
},
left: "22%",
radius: ["50%", "80%"], // Bigger inner and outer radius
bottom: "23",
radius: ["67%", "97%"], // Bigger inner and outer radius
center: ["60%", "50%"], // Shift chart slightly right to make room for legend
itemStyle: {
borderColor: "#fff", // Color of the gap
@ -1272,7 +1273,10 @@ export default {
top: "middle",
type: "scroll",
orient: "vertical",
left: "left",
left: "20",
icon: 'rect',
itemWidth: 15, // Width of the legend icon
itemHeight: 15,
textStyle: {
color: this.isDarkMode ? "#fff" : "#333333",
},

View File

@ -105,7 +105,7 @@
</v-col>
<v-col :cols="7" style="min-height:75vh;">
<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>
<div class="px-5" style="height:calc(100% - 76px)">
@ -901,7 +901,7 @@ const myDetail = [
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pl-4',
class: 'py-2 px-4',
required: true,
iconShow: true
},
@ -938,7 +938,7 @@ const myDetail = [
cols: 6,
labelCols: 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',
itemText: 'commCdNm',
itemValue: 'commCd',
@ -956,7 +956,7 @@ const myDetail = [
// 공백 처리
type: 'Label',
cols: 6,
class: 'py-2 pl-4 mt-2',
class: 'py-2 px-4 mt-2',
disabled: false,
labelCols: 12,
textCols: 12,
@ -985,7 +985,7 @@ const myDetail = [
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pl-4 mt-2',
class: 'py-2 px-4 mt-2',
inputType: 'number',
iconShow: true
// 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,
labelCols: 12,
textCols: 12,
class: 'py-2 pl-4 mt-2',
class: 'py-2 px-4 mt-2',
value: { '1': true, '0': false },
iconShow: true,
required: true,

View File

@ -63,7 +63,7 @@
<v-tabs-items v-model="tab" style="height: calc(100% - 65px);" class="pt-6 py-2">
<v-tab-item v-for="(item, idx) in items" :key="item.id">
<component v-if="item.id == 'readPlcBaseInfoTab'" :is="'Form'" :parentPrgmId="myPrgmId"
:detailList="detailList" :bindingData="gridName"
:detailList="f" :bindingData="gridName"
@gridEditingFinish="gridEditingFinish" />
<ReadPlcAddInfoTab v-if="item.id == 'readPlcAddInfoTab'" :parentPrgmId="myPrgmId"
:innerTabGridInfo="{ tab, idx }" />

View File

@ -835,7 +835,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
class: 'py-3 pr-4',
required: false,
placeholder: '시스템 자동입력',
},
@ -848,7 +848,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
class: 'py-3 pl-4',
required: true,
},
{
@ -860,7 +860,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
class: 'py-3 pr-4 mt-2',
list: 'ercKindList',
itemText: 'commCdNm',
itemValue: 'commCd',
@ -875,7 +875,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
class: 'py-3 pl-4 mt-2',
list: 'readObjList',
itemText: 'readObjNm',
itemValue: 'readObjId',
@ -890,7 +890,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
class: 'py-3 pr-4 mt-2',
list: 'chrgKindList',
itemText: 'commCdNm',
itemValue: 'commCd',
@ -905,7 +905,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
class: 'py-3 pl-4 mt-2',
},
{
type: 'InputText',
@ -916,7 +916,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
class: 'py-3 pr-4 mt-2',
},
{
@ -928,7 +928,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
class: 'py-3 pl-4 mt-2',
list: 'blocMstrList',
itemText: 'blocNm',
itemValue: 'blocId',
@ -944,7 +944,7 @@ const myDetail = [
textCols: 12,
iconShow: true,
// class: 'py-2',
class: 'pb-0 mb-0 pr-4',
class: 'pb-0 mb-0 pr-4 mt-2',
disableContent: true,
},
{
@ -956,7 +956,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
class: 'pb-0 mb-0 pl-4 mt-2',
},
{
type: 'InputText',
@ -981,7 +981,7 @@ const myDetail = [
disabled: false,
cols: 6,
iconShow: true,
class: 'py-2 pr-4',
class: 'py-3 pr-4 mt-2',
value: { '1': true, '0': false },
},
{
@ -991,7 +991,7 @@ const myDetail = [
disabled: false,
cols: 6,
iconShow: true,
class: 'py-2 pl-4',
class: 'py-3 pl-4 mt-2',
value: { '1': true, '0': false },
required: true,
},

View File

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

View File

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

View File

@ -33,7 +33,7 @@
</v-col>
<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-row>
</v-card>

View File

@ -14,9 +14,9 @@
<!-- 대상일 -->
<component :is="'Datepicker'" :parentPrgmId="myPrgmId" :label="'대상일'" :labelCols="3" customClass="datepicker-large" />
</v-col>
<v-col :cols="4" class="text-right">
<BtnSearch @click="search" size="large" />
<v-col :cols="6" class="text-right">
<!-- 조회버튼 -->
<BtnSearch @click="search" size="large" />
</v-col>
</v-row>
</v-card>
@ -47,8 +47,13 @@
</v-row>
<div class="px-5" style="height: 80%">
<div ref="chartParent" class="w100 h100">
<component :ref="chartName" class="w100 h100" :is="loadChart ? 'Chart' : null" :parentPrgmId="myPrgmId"
:chartName="chartName" />
<component
:ref="chartName"
class="w100 h100"
:is="loadChart ? 'Chart' : null"
:parentPrgmId="myPrgmId"
:chartName="chartName"
/>
</div>
</div>
</v-card>
@ -68,6 +73,8 @@ import SelectBox from '@/components/common/select/SelectBox';
import DateUtility from '~/plugins/dateUtility';
import Chart from '~/components/common/Chart';
import getSankeyChartOption from "~/components/common/chartoptions/sankeyChart";
let myTitle;
let myPrgmId;
@ -101,6 +108,8 @@ export default {
selectValue01: null,
loadChart: false,
chartName: 'sankeyChart',
sankeyChartData: [],
sankeyChartLinks: []
};
},
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() {
myPrgmId = this.$route.query.prgmId;
@ -159,9 +178,6 @@ export default {
},
async created() { },
async mounted() {
// this.initTest();
// return;
this.init();
// document.querySelector('.icon_arrow').style.width = document.querySelector('.iconArrowCols').clientWidth-20 + "px";
},
@ -176,10 +192,8 @@ export default {
...mapActions({
getCodeList: 'modules/search/getCodeList',
}),
initTest() {
const randomNumber = n => Math.floor(Math.random() * n) + 1;
initTestChart() {
const randomNumber = n => Math.floor(Math.random() * n) + 1;
const makeData = [
{ name: 'A' },
{ name: 'B' },
@ -205,45 +219,13 @@ export default {
]);
}
const chartOption = {
backgroundColor: '#FFFFFF',
series: [
{
layoutIterations: 0,
type: 'sankey',
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.sankeyChartData = makeData;
this.sankeyChartLinks = makeLinks;
const chartOption = getSankeyChartOption({
isDarkMode: this.isDarkMode,
data: makeData,
links: makeLinks
});
this.setChartOption({ chartKey: this.chartName, value: chartOption });
this.$nextTick(() => {
this.loadChart = true;
@ -254,7 +236,11 @@ export default {
this.setFromDt();
},
async search() {
await this.getChartData();
try{
await this.getChartData();
}catch(err){
this.initTestChart();
}
this.setPageData({
isFind: false,
});
@ -458,43 +444,13 @@ export default {
};
}
const chartOption = {
backgroundColor: '#FFFFFF',
series: [
{
layoutIterations: 0,
type: 'sankey',
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.sankeyChartData = makeData;
this.sankeyChartLinks = makeLinks;
const chartOption = getSankeyChartOption({
isDarkMode: this.isDarkMode,
data: makeData,
links: makeLinks
});
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');
const el2 = document.createElement('button');
$(el2).addClass('edit-btn blue--text');
el2.innerText = '편집하다';
el2.innerText = '수정';
elDiv.appendChild(el2);
this.el = elDiv;
@ -415,7 +415,7 @@ export default {
{
header: '구분',
name: 'gubun',
width: 80,
width: 200,
align: 'left',
// hidden: true,
formatter({ value }) {
@ -447,7 +447,7 @@ export default {
myColumns.push({
header: i.toString() + '월',
name: qty,
width: 73,
width: 80,
align: 'right',
editor: 'text',
formatter: this.numberFormatter,

View File

@ -47,11 +47,14 @@
<v-row ref="contents" style="overflow: auto">
<v-col>
<div v-for="(value, key, index) in contentData" :key="'key1_' + index">
<v-card-title class="d-flex align-center justify-space-between pa-3">
<span class="tit ft-size_20 ft-weight_600">{{ value.eqpmGrpNm }}</span>
</v-card-title>
<v-card style="background: none">
<v-card-title class="d-flex align-center justify-space-between pa-3">
<span class="tit ft-size_20 ft-weight_600">{{ value.eqpmGrpNm }}</span>
</v-card-title>
</v-card>
<v-row>
<v-col :cols="3" v-for="(item, i) in value.chartData" :key="'key2_' + i">
<v-card>
<div
class="v-box"
style="height: 330px; position: relative"
@ -73,7 +76,7 @@
<!-- Information area -->
<v-col :cols="5" style="height: 100%">
<div style="height: 10%">
<strong style="font-size: 20px; font-weight: 600">{{
<strong class="v-card v-card__title pa-0" >{{
item.fabNm
}}</strong>
</div>
@ -123,6 +126,7 @@
</div>
</v-col>
</div>
</v-card>
</v-col>
</v-row>
</div>

View File

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

View File

@ -1,6 +1,6 @@
import Vue from "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 { 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(Icon.name, Icon)
Vue.component(Divider.name, Divider)
Vue.component(Pagination.name, Pagination)
// Vue.component(RangePicker.name, RangePicker)

View File

@ -910,6 +910,11 @@ const INIT_URL_STATE = {
'ems/effc/eqpmIndMntrCtr/selectDailyEnrgUseMainIdx',
selectMonthlyEnrgUseMainIdx:
'ems/effc/eqpmIndMntrCtr/selectMonthlyEnrgUseMainIdx',
selectDailyEnrgUseMainIdxPageTotal:
'ems/effc/eqpmIndMntrCtr/selectDailyEnrgUseMainIdxPageTotal',
selectMonthlyEnrgUseMainIdxPageTotal:
'ems/effc/eqpmIndMntrCtr/selectMonthlyEnrgUseMainIdxPageTotal',
//prgmId : PRG0082 에너지 사용량 - 설비상세 모니터링
selectDailyEnrgUseMainGuideIdx: