Files
sk_fems_ui/components/common/modal/OnlnBaseEccPop.vue
Tran Van Dung/(Tran Van Dung)/현장대리인/SK 9603353ab3 update screen 33, 44, 20, fix bug Grid
2025-07-30 14:03:41 +07:00

421 lines
9.4 KiB
Vue

<template>
<v-row class="search-box" align="center" no-gutters>
<v-col :cols="labelCols">
<label for="" class="search-box-label">
<v-icon x-small :color="required ? '#fb8200' : 'primary'" class="mr-1"
>mdi-record-circle</v-icon
>
{{ labelContent }}
</label>
</v-col>
<v-col :cols="textCols">
<v-text-field
readonly
v-model="selectValue"
append-icon="mdi-magnify"
class="v-input__custom"
@click="dialogOpenCloseEvent(dialog)"
outlined
:hide-details="true"
:required="required || false"
:disabled="disabled || false"
></v-text-field>
</v-col>
<v-dialog v-model="dialog" scrollable width="540px">
<v-card style="height: 100%">
<v-card-title class="pa-5 d-flex align-center justify-space-between">
<span class="custom-title-4">{{ modalTitle }}</span>
<v-btn
icon
tile
:ripple="false"
@click="dialogOpenCloseEvent(dialog)"
>
<v-icon>mdi-close</v-icon>
</v-btn>
</v-card-title>
<div class="pa-5">
<v-row align="center" no-gutters>
<v-col :cols="3">
<label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1"
>mdi-record-circle</v-icon
>
검색
</label>
</v-col>
<v-col :cols="5">
<v-text-field
append-icon="mdi-magnify"
class="v-input__custom"
outlined
:hide-details="true"
v-model="searchWord"
@keyup.enter="search"
></v-text-field>
</v-col>
<v-spacer></v-spacer>
<v-col cols="4" class="text-right">
<v-btn :ripple="false" @click="search()">
조회
</v-btn>
<!--
<v-btn :ripple="false" @click="initSearch()">
초기화
</v-btn>
-->
</v-col>
</v-row>
</div>
<v-divider></v-divider>
<div :style="'height: calc(50vh)'">
<!-- <div :style="{ height: 'calc(100% - 213px)' }"> -->
<div ref="modalGridParent" class="h100 py-3">
<component
:is="loadGrid && dialog ? 'Grid' : null"
:gridName="grid_01"
:dataPath="searchParam.modalData.onInBaseEccPop"
:parentPrgmId="parentPrgmId"
@getRowsData="getRowData"
@dblClick="setUpdate($event)"
/>
</div>
</div>
<v-card-actions class="pa-5 d-flex align-center justify-center">
<v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)"
>닫기</v-btn
>
</v-card-actions>
</v-card>
</v-dialog>
</v-row>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import Grid from '~/components/common/Grid';
import Utility from '~/plugins/utility';
export default {
props: {
parentPrgmId: {
type: String,
require: true,
},
labelCols: {
type: Number,
require: false,
default: 4,
},
labelContent: {
type: String,
require: false,
default: '공정명',
},
textCols: {
type: Number,
require: false,
default: 7,
},
modalTitle: {
type: String,
require: false,
default: '공정목록',
},
modalContent: {
type: String,
require: false,
default: '검색',
},
required: {
require: false,
default: false,
},
disabled: {
require: false,
default: false,
},
bindOption: {
type: Object,
requrie: false,
default: null,
},
},
components: {
Grid,
Utility,
},
data() {
return {
dialog: false,
loadGrid: false,
grid_01: 'grid_01',
myModalKey: 'onInBaseEccPop',
modalDataKey: 'modalData',
searchWord: '',
selectedData: {},
textFieldData: '',
parentModalState: 'close',
};
},
computed: {
...mapState({
searchParam(state) {
return state.pageData[this.parentPrgmId];
},
}),
selectValue: {
get() {
if (!this.item) {
return this.textFieldData;
}
},
set(value) {
return value;
},
},
},
watch: {
async dialog(val) {
if (val) {
await this.getGridData();
}
},
parentModalState(val) {
if (this.bindOption !== null) {
if (val === 'open') {
this.textFieldData = this.searchParam.rowGridSelectData.eccNm;
this.searchParam[
this.bindOption.eccId
] = this.searchParam.rowGridSelectData.eccId;
this.searchParam[
this.bindOption.eccNm
] = this.searchParam.rowGridSelectData.eccNm;
} else if (val === 'openWithInit') {
this.textFieldData = '';
this.searchParam[this.bindOption.eccId] = '';
this.searchParam[this.bindOption.eccNm] = '';
}
}
},
},
beforeCreate() {
this.$store.commit('setPageData', {
modalData: { onInBaseEccPop },
});
},
created() {
this.init();
},
mounted() {},
methods: {
...mapMutations({
setPageData: 'setPageData',
setModalGridData: 'setModalGridData',
setModalGridColumn: 'setModalGridColumn',
setModalGridOption: 'setModalGridOption',
}),
...mapActions({
postApiReturn: 'modules/list/postApiReturn',
setTree: 'modules/list/setTree',
}),
init() {
this.gridInit();
},
search() {
this.getGridData();
},
initSearch() {
this.searchWord = '';
this.getGridData();
this.textFieldData = '';
this.selectedData.eccId = '';
this.selectedData.eccNm = '';
if (this.bindOption === null) {
// console.log('this.bindOption is null...');
this.setPageData({
modalEccId: '',
modalEccNm: '',
});
} else {
// console.log('this.bindOption is not null...');
this.setPageData({
[this.bindOption.eccId]: '',
[this.bindOption.eccNm]: '',
});
}
},
gridInit() {
const myOptions = {
columnOptions: {
resizable: true,
},
};
this.setModalGridOption({
modalKey: this.myModalKey,
gridKey: this.grid_01,
modalDataKey: this.modalDataKey,
value: Object.assign(
Utility.defaultGridOption(400, myOptions),
myOptions,
),
});
const _this = this;
this.setModalGridColumn({
modalKey: this.myModalKey,
gridKey: this.grid_01,
modalDataKey: this.modalDataKey,
value: [
{ header: '회사 ID', name: 'comId', hidden: true },
{
header: '공정 ID',
name: 'eccId',
width: 100,
align: 'center',
hidden: true,
},
{ header: '공정명', name: 'eccNm', align: 'center' },
],
});
this.setPageData({
modalEccId:
localStorage.getItem(this.parentPrgmId + 'ModalEccId') != null
? localStorage.getItem(this.parentPrgmId + 'ModalEccId')
: '',
modalEccNm:
localStorage.getItem(this.parentPrgmId + 'ModalEccNm') != null
? localStorage.getItem(this.parentPrgmId + 'ModalEccNm')
: '',
});
// console.log(
// 'localStorage.getItem(this.parentPrgmId + "ModalEccNm") : ',
// localStorage.getItem(this.parentPrgmId + 'ModalEccNm') != null
// ? localStorage.getItem(this.parentPrgmId + 'ModalEccNm')
// : '',
// );
this.textFieldData =
localStorage.getItem(this.parentPrgmId + 'ModalEccNm') != null
? localStorage.getItem(this.parentPrgmId + 'ModalEccNm')
: '';
},
async getGridData() {
this.loadGrid = false;
const res = await this.postApiReturn({
apiKey: 'selectOnlnBaseEcc',
resKey: 'onlnBaseEccData',
sendParam: {
eccNmLike: this.searchWord,
},
});
this.setModalGridData({
modalKey: this.myModalKey,
gridKey: this.grid_01,
modalDataKey: this.modalDataKey,
value: res,
});
this.loadGrid = true;
},
getRowData(data) {
this.selectedData = { ...data };
},
setUpdate(v) {
this.dialog = false;
this.textFieldData = this.selectedData.eccNm;
if (this.bindOption === null) {
this.searchParam.modalEccId = this.selectedData.eccId;
this.searchParam.modalEccNm = this.selectedData.eccNm;
localStorage.setItem(
this.parentPrgmId + 'ModalEccId',
this.selectedData.eccId != null ? this.selectedData.eccId : '',
);
localStorage.setItem(
this.parentPrgmId + 'ModalEccNm',
this.selectedData.eccNm != null ? this.selectedData.eccNm : '',
);
} else {
this.searchParam[this.bindOption.eccId] = this.selectedData.eccId;
this.searchParam[this.bindOption.eccNm] = this.selectedData.eccNm;
}
this.setPageData({ isFind: true });
},
dialogOpenCloseEvent(val) {
this.dialog = !val;
localStorage.setItem(
this.parentPrgmId + 'ModalEccId',
this.selectedData.eccId != null ? this.selectedData.eccId : '',
);
localStorage.setItem(
this.parentPrgmId + 'ModalEccNm',
this.selectedData.eccNm != null ? this.selectedData.eccNm : '',
);
},
},
};
var onInBaseEccPop = {
grid_01: {
data: [],
column: [],
option: {},
},
};
</script>
<style lang="scss" scoped>
::v-deep {
.v-dialog {
overflow-y: hidden !important;
}
.tui-grid-table-container {
.tui-grid-table {
border-right-style: solid !important;
border-right-color: rgba(255, 255, 255, 0.1) !important;
}
}
.tui-grid-cell.tui-grid-cell-has-tree
.tui-grid-tree-extra-content
+ .tui-grid-cell-content:before {
content: none !important;
}
}
@each $theme in dark, light {
.v-application.#{$theme}-mode {
.v-dialog {
.v-card {
&__title {
color: map-deep-get($color, 'white', '0');
@if $theme == dark {
background-color: #2d3355;
.v-btn {
background-color: #2d3355;
}
} @else {
background-color: #3f4d7d;
.v-btn {
background-color: #3f4d7d;
}
}
}
}
}
}
}
</style>