Compare commits

..

1 Commits

Author SHA1 Message Date
7227d5d56c Update to original menu 2025-07-25 12:36:03 +09:00
8 changed files with 104 additions and 289 deletions

View File

@ -433,10 +433,6 @@ a {
.v-application.#{$theme}-mode {
min-width: 1000px;
.head-logo{
gap: 8px;
}
.v-navigation-drawer {
background: map-deep-get($config, #{$theme}, "menu-bg-color");
}
@ -478,7 +474,7 @@ a {
.btn-header {
background-color: map-deep-get($config, #{$theme}, "v-btn-header-background");
border:1px solid map-deep-get($config, #{$theme}, "v-btn-header-border");
border: map-deep-get($config, #{$theme}, "v-btn-header-border");
color: map-deep-get($config, #{$theme}, "v-btn-header-text");
}

View File

@ -107,13 +107,6 @@
}
.ant-btn {
&.ant-btn-outlined {
color:map-deep-get($config, #{$theme}, "ant-btn-default-color");
border:1px solid map-deep-get($config, #{$theme}, "ant-btn-default-border-outlined");
background-color: transparent;
}
&.ant-btn-primary {
background: map-deep-get($config, #{$theme}, "ant-btn-primary-bg");
border-color:map-deep-get($config, #{$theme}, "ant-btn-primary-bg");

View File

@ -221,16 +221,6 @@
.v-application.#{$theme}-mode {
.v-input-popup__custom {
.v-input__slot {
padding-left: 12px;
padding-right: 12px;
border: 1px solid map-deep-get($config,
#{$theme},
"v-input-popup-password-border"
);
}
}
.v-textarea {
.v-input__slot{

View File

@ -72,11 +72,11 @@ $config: (
v-btn-backgroundColor: #144985,
v-box: #212224,
v-banner-border-color: rgba(255, 255, 255, 0.1),
v-treeview-node-root-backgroundColor: #212224,
v-treeview-node-root-label-color: #FFFFFFD9,
v-treeview-node-root-label-active-color: #FFFFFFD9,
v-treeview-node-root-icon-color: #FFFFFFD9,
v-treeview-node-root-icon-active-color: #FFFFFFD9,
v-treeview-node-root-backgroundColor: #18579e,
v-treeview-node-root-label-color: #fff,
v-treeview-node-root-label-active-color: #fff,
v-treeview-node-root-icon-color: #fff,
v-treeview-node-root-icon-active-color: #fff,
// v-treeview-node-subroot-backgroundColor: #FFFFFF0A,
v-treeview-node-subroot-backgroundColor: transparent,
v-treeview-node-label-color: rgba(255, 255, 255, 0.6),
@ -152,7 +152,6 @@ $config: (
search-btn-background: #1668DC,
v-btn-color-default: #FFFFFFD9,
v-btn-bg-default: #FFFFFF2E,
v-input-popup-password-border: #424242,
v-input-textarea-border: #424242,
v-input-textarea-bg: #212224,
v-input-textarea-color: #FFFFFFD9,
@ -167,7 +166,6 @@ $config: (
ant-btn-default-border:#FFFFFF2E,
ant-btn-default-bg:#FFFFFF2E,
ant-btn-default-color:#FFFFFFD9,
ant-btn-default-border-outlined:#424242,
),
light: (w-g5: $--color-gray_555,
g5-w: $--color-white,
@ -206,11 +204,11 @@ $config: (
// v-btn-backgroundColor: #fff,
v-box: #FFFFFF,
v-banner-border-color: #ddd,
v-treeview-node-root-backgroundColor: #FFFFFF,
v-treeview-node-root-label-color: #000000E0,
v-treeview-node-root-label-active-color: #000000E0,
v-treeview-node-root-icon-color: #000000E0,
v-treeview-node-root-icon-active-color: #000000E0,
v-treeview-node-root-backgroundColor: #4777d9,
v-treeview-node-root-label-color: #111,
v-treeview-node-root-label-active-color: #fff,
v-treeview-node-root-icon-color: #555,
v-treeview-node-root-icon-active-color: #fff,
// v-treeview-node-subroot-backgroundColor: #00000005,
v-treeview-node-subroot-backgroundColor: transparent,
v-treeview-node-label-color: #555,
@ -284,7 +282,6 @@ $config: (
search-btn-background: #1677FF,
v-btn-bg-default: #00000026,
v-btn-color-default: #000000E0,
v-input-popup-password-border: #D9D9D9,
v-input-textarea-border: #D9D9D9,
v-input-textarea-bg: #FFFFFF,
v-input-textarea-color: #000000E0,
@ -299,6 +296,5 @@ $config: (
ant-btn-default-border:#00000026,
ant-btn-default-bg:#00000026,
ant-btn-default-color:#000000E0,
ant-btn-default-border-outlined:#D9D9D9,
),
);

View File

@ -1,11 +1,9 @@
<template>
<a-button
class="btn-header"
:color="mode ? 'dark' : 'light'"
@click="themeChange"
icon="bulb"
>
</a-button>
<v-switch
class="theme-switch"
v-model="mode"
@change="themeChange"
></v-switch>
</template>
<script>
import { mapState, mapMutations } from 'vuex';
@ -28,11 +26,8 @@ export default {
setThemeChange: 'setThemeChange',
}),
themeChange() {
this.mode = !this.mode;
this.$vuetify.theme.isDark = this.mode;
this.setThemeChange(this.mode);
console.log(this.mode)
console.log(this.$vuetify.theme.isDark)
},
},
};
@ -74,14 +69,12 @@ export default {
background-color: #f2f2f2;
top: 2px;
left: 0;
// background-image: url(../../assets/images/icon/ico-theme-light.png);
content: "light";
background-image: url(../../assets/images/icon/ico-theme-light.png);
background-size: 18px 18px;
background-position: center center;
background-repeat: no-repeat;
}
}
&.v-input--is-label-active {
::v-deep {
.v-input--switch__track {
@ -89,8 +82,7 @@ export default {
}
.v-input--switch__thumb {
// transform: translate(38px, 0);
// background-image: url(../../assets/images/icon/ico-theme-dark.png);
content: 'dark';
background-image: url(../../assets/images/icon/ico-theme-dark.png);
}
}
}

View File

@ -1,6 +1,6 @@
<template>
<v-row class="search-box" align="center" no-gutters>
<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.cols == 12 ? 2 : 4">
<label for="" class="search-box-label">
<v-icon
x-small
@ -28,14 +28,10 @@
></v-text-field>
</template>
<template v-else>
<!-- <v-icon>mdi-content-save</v-icon> -->
<!-- <v-btn :ripple="false" @click="dialog = !dialog">
<span>비밀번호 {{ isPassword }}</span>
</v-btn> -->
<a-button :ripple="false" @click="dialog = !dialog" class="ant-btn-outlined">
<v-btn :ripple="false" @click="dialog = !dialog">
<!-- <v-icon>mdi-content-save</v-icon> -->
비밀번호 {{ isPassword }}
</a-button>
<span>비밀번호 {{ isPassword }}</span>
</v-btn>
</template>
</v-col>
@ -52,7 +48,7 @@
</label>
<v-text-field
v-model.trim="firstPswd"
class="v-input-popup__custom"
class="v-input__custom"
type="password"
:readonly="!isFocused"
@focus="isFocused = true"
@ -65,7 +61,7 @@
</label>
<v-text-field
v-model.trim="secondPswd"
class="v-input-popup__custom"
class="v-input__custom"
type="password"
:readonly="!isFocused"
@focus="isFocused = true"
@ -76,15 +72,8 @@
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<!-- <v-btn color="primary" dark @click="setUpdate()">확인</v-btn> -->
<div>
<a-button @click="close()" class="btn-default">삭제</a-button>
<a-button type="primary" @click="setUpdate()" class="v-btn-add-text">
확인
</a-button>
</div>
<!-- <v-btn color="primary" dark @click="close()">닫기</v-btn> -->
<v-btn color="primary" dark @click="setUpdate()">확인</v-btn>
<v-btn color="primary" dark @click="close()">닫기</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
@ -146,10 +135,8 @@ export default {
} else {
return '';
}
console.log(value)
},
set(value) {
console.log(value)
return value;
},
},

View File

@ -4,7 +4,7 @@
<fullscreen :fullscreen.sync="fullscreen">
<div class="header">
<v-row class="mx-0">
<div class="head-logo pl-4 d-flex gap-3">
<div class="head-logo pl-4">
<router-link class="home" :to="myHome.root">
<div class="lnb-logo">
<img v-if="isDarkMode" src="@/assets/images/logo_dm.png" />
@ -13,11 +13,9 @@
</div>
<!-- <div class="lnb-logo">FEMS</div>-->
</router-link>
<div class="align-center d-flex">
<ThemeSwitch style="margin-right: 20px" />
</div>
</div>
<v-col col="1" class="d-flex justify-end py-4 px-6 flex-row" style="gap: 8px;">
<ThemeSwitch style="margin-right: 20px" />
<v-menu offset-y>
<template v-slot:activator="{ on, attrs }">
<a-button :ripple="false" tile class="btn-header" v-bind="attrs" v-on="on">
@ -104,9 +102,7 @@
<img v-else src="@/assets/images/logo_lm.png" />
</div>
<!-- <div class="lnb-logo">FEMS</div>-->
</router-link>
<ThemeSwitch style="margin-right: 20px" />
<v-app-bar-nav-icon ref="appbarnavicon" id="appbarnavicon" @click.stop="miniVariant = !miniVariant"
@click="updateTreeview" :style="{
backgroundColor: 'transparent',
@ -168,6 +164,7 @@
<v-icon size="20" class="ml-2" v-if="closable" @click.stop="onCloseTab(to)">mdi-close</v-icon>
</template>
<template #end v-if="false">
<ThemeSwitch style="margin-right: 20px" />
<v-menu offset-y>
<template v-slot:activator="{ on, attrs }">
<!-- <v-btn :ripple="false" tile class="btn-close" v-bind="attrs" v-on="on">
@ -447,80 +444,71 @@ export default {
activeTree: {
deep: true,
handler(newVal, oldVal) {
var _this = this;
const nv = newVal[0];
const ov = oldVal[0];
if (nv !== ov) {
if (!nv) {
// 중복클릭 시 발생 상황 기존 값을 다시 넣어줌
this.activeTree.push(ov);
} else {
this.myPrgmId = nv;
console.log("menu:", this.menuData);
if (this.menuData[nv].url) {
const menuUrl = this.menuData[nv].url;
const menuId = this.menuData[nv].menuId;
var _this = this;
const nv = newVal[0];
const ov = oldVal[0];
if (nv !== ov) {
if (!nv) {
// 중복클릭 시 발생 상황 기존 값을 다시 넣어줌
this.activeTree.push(ov);
} else {
this.myPrgmId = nv;
if (this.menuData[nv].url) {
const menuUrl = this.menuData[nv].url;
const menuId = this.menuData[nv].menuId;
const isCommMenu = menuUrl.indexOf("comm/");
const isEmsMenu = menuUrl.indexOf("ems/");
const isCmmsMenu = menuUrl.indexOf("cmms/");
const isCommMenu = menuUrl.indexOf('comm/');
const isEmsMenu = menuUrl.indexOf('ems/');
const isCmmsMenu = menuUrl.indexOf('cmms/');
// console.log('activeTree...');
console.log(isEmsMenu);
// console.log('activeTree...');
if (isCommMenu > -1 || isEmsMenu > -1 || isCmmsMenu > -1) {
// console.log('activeTree if stmt1');
// console.log('this.isLoading : ', this.isLoading);
// if(this.isLoading == true){
// console.log('if isLoading stmt1');
// return;
// }
console.log("this:", this.menuData[nv].url);
this.$router.push({
path: `/${this.menuData[nv].url}?prgmId=${nv}`,
});
// this.$router.replace("/").then(() => {
// alert("hihi");
// this.$router.push({
// path: `${this.menuData[nv].url}?prgmId=${nv}`,
// });
// });
// this.$router.beforeEach((to, from, next) => {
// if(_this.isLoading == true){
// next(false);
// }
// if (!to.matched.length) {
// next(false);
// } else {
// next();
// }
// });
var tmp = 0;
for (var i = 0; i < this.myMenuList.length; i++) {
if (this.myMenuList[i].menuId == menuId) {
tmp = 1;
}
}
this.bookmarkBtn = tmp;
} else {
// console.log('activeTree if stmt2');
// console.log('this.isLoading : ', this.isLoading);
// if(this.isLoading == true){
// console.log('if isLoading stmt2');
// return;
// }
this.$refs.routerTab.openIframe(
encodeURI(`http://localhost:9999${this.menuData[nv].url}?prgmId=${nv}`),
this.menuData[nv].menuNm
);
}
this.$axios.get(`${this.menuData[nv].url}?$menuId=${menuId}`);
} else alert("지정된 페이지 경로가 없습니다.");
}
}
},
if (isCommMenu > -1 || isEmsMenu > -1 || isCmmsMenu > -1) {
// console.log('activeTree if stmt1');
// console.log('this.isLoading : ', this.isLoading);
// if(this.isLoading == true){
// console.log('if isLoading stmt1');
// return;
// }
this.$router.push({
path: `${this.menuData[nv].url}?prgmId=${nv}`,
});
// this.$router.beforeEach((to, from, next) => {
// if(_this.isLoading == true){
// next(false);
// }
// if (!to.matched.length) {
// next(false);
// } else {
// next();
// }
// });
var tmp = 0;
for (var i = 0; i < this.myMenuList.length; i++) {
if (this.myMenuList[i].menuId == menuId) {
tmp = 1;
}
}
this.bookmarkBtn = tmp;
} else {
// console.log('activeTree if stmt2');
// console.log('this.isLoading : ', this.isLoading);
// if(this.isLoading == true){
// console.log('if isLoading stmt2');
// return;
// }
this.$refs.routerTab.openIframe(
encodeURI(
`http://localhost:9999${this.menuData[nv].url}?prgmId=${nv}`,
),
this.menuData[nv].menuNm,
);
}
this.$axios.get(`${this.menuData[nv].url}?$menuId=${menuId}`);
} else alert('지정된 페이지 경로가 없습니다.');
}
}
},
},
menuData: {
deep: true,

View File

@ -4,14 +4,13 @@
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="end" no-gutters>
<v-row align="center" no-gutters>
<v-col :cols="3">
<!-- 사업장 -->
<component
:is="'SelectBlocMstr'"
:parentPrgmId="myPrgmId"
:sendParam="{ comId }"
customClass="select-large"
/>
<!-- <component
:is="'selectCodeList'"
@ -36,7 +35,6 @@
label="로그인ID"
valueNm="userLoginId"
:searchOption="true"
customClass="input-large"
/>
</v-col>
<v-col :cols="3">
@ -45,11 +43,10 @@
label="사용자명"
valueNm="userNm"
:searchOption="true"
customClass="input-large"
/>
</v-col>
<v-col :cols="3" class="text-right">
<BtnSearch size="large"/>
<BtnSearch />
</v-col>
</v-row>
</v-card>
@ -79,7 +76,6 @@
@getRowsData="getRowData"
@sendSelectedRowStatInfo="getSelectedRowStatInfo"
:selectedRowDataWatchFlag="true"
:dataPath="dataPathMock"
/>
</div>
</div>
@ -307,40 +303,10 @@ export default {
},
methods: {
async init() {
this.gridInit();
await this.gridInit();
},
gridInitTest() {
const rowGrid = {
column: [
{ header: '사용자No', name: 'userNo', align: 'center', hidden: true },
{ header: '사용자명', name: 'userNm' },
{ header: '사용자ID', name: 'userLoginId' },
{ header: '사용자비밀번호', name: 'userPswd', hidden: true },
{ header: '사업장', name: 'blocId', hidden: true },
{ header: 'email', name: 'email', hidden: true },
{ header: '등록자NO', name: 'regUserNo', hidden: true },
{ header: '등록일시', name: 'regDttm', hidden: true },
{ header: '수정자NO', name: 'procUserNo', hidden: true },
{ header: '수정일시', name: 'procDttm', hidden: true },
{ header: 'comId', name: 'comId', hidden: true },
{ header: 'deptId', name: 'deptId', hidden: true },
],
data: dataMockExample,
defaultRow: dataMockExample,
option: [],
}
this.dataPathMock = {rowGrid};
this.$nextTick(() => {
this.loadGrid = true;
});
},
// 사용자 리스트 그리드 세팅
gridInit() {
// this.gridInitTest(); return
const gridHeight = this.$refs.gridParent.offsetHeight - 90;
const myOptions = {
@ -971,10 +937,7 @@ const myDetail = blocCdList => {
elseDisabled: 'I', // 선택적 disabled => rowStat 상태가 해당 값이 아닐경우 true
readonly: true,
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
iconShow: true,
class: 'py-2',
required: false,
placeholder: '시스템 자동입력',
},
@ -983,10 +946,7 @@ const myDetail = blocCdList => {
label: '사용자ID',
valueNm: 'userLoginId',
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
iconShow: true,
class: 'py-2',
required: true,
},
{
@ -996,10 +956,7 @@ const myDetail = blocCdList => {
valueNm: 'userPswd',
// disabled: true,
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
iconShow: true,
class: 'py-2',
required: true,
},
{
@ -1007,10 +964,7 @@ const myDetail = blocCdList => {
label: '사용자명',
valueNm: 'userNm',
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
iconShow: true,
class: 'py-2',
required: true,
},
{
@ -1018,10 +972,7 @@ const myDetail = blocCdList => {
label: '사업장',
valueNm: 'blocId',
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
iconShow: true,
class: 'py-2',
list: blocCdList.map(item => ({
text: item.blocNm,
value: item.blocId,
@ -1033,10 +984,7 @@ const myDetail = blocCdList => {
label: 'email',
valueNm: 'email',
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
iconShow: true,
class: 'py-2',
},
{
type: 'InputText',
@ -1044,10 +992,7 @@ const myDetail = blocCdList => {
valueNm: 'regUserNo',
disabled: true,
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
iconShow: true,
class: 'py-2',
placeholder: '시스템 자동입력',
},
{
@ -1056,10 +1001,7 @@ const myDetail = blocCdList => {
valueNm: 'regDttm',
disabled: true,
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
iconShow: true,
class: 'py-2',
placeholder: '시스템 자동입력',
},
{
@ -1068,10 +1010,7 @@ const myDetail = blocCdList => {
valueNm: 'procUserNo',
disabled: true,
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
iconShow: true,
class: 'py-2',
placeholder: '시스템 자동입력',
},
{
@ -1080,10 +1019,7 @@ const myDetail = blocCdList => {
valueNm: 'procDttm',
disabled: true,
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
iconShow: true,
class: 'py-2',
placeholder: '시스템 자동입력',
},
];
@ -1100,67 +1036,4 @@ function sha512(str) {
.update(str)
.digest('hex');
}
const dataMockExample = [
{
userNo: 1,
userNm: '홍길동',
userLoginId: 'hong123',
userPswd: 'password123',
blocId: 'B001',
email: 'hong@example.com',
regUserNo: 100,
regDttm: '2025-07-01 10:00:00',
procUserNo: 101,
procDttm: '2025-07-15 14:30:00',
comId: 'C001',
deptId: 'D001'
},
{
userNo: 2,
userNm: '김영희',
userLoginId: 'kimyh',
userPswd: 'securePass456',
blocId: 'B002',
email: 'kim@example.com',
regUserNo: 102,
regDttm: '2025-07-02 11:20:00',
procUserNo: 103,
procDttm: '2025-07-16 09:45:00',
comId: 'C002',
deptId: 'D002'
},
{
userNo: 3,
userNm: '관리자',
userLoginId: 'user',
userPswd: 'securePass456',
blocId: 'B002',
email: 'kim@example.com',
regUserNo: 102,
regDttm: '2025-07-02 11:20:00',
procUserNo: 103,
procDttm: '2025-07-16 09:45:00',
comId: 'C002',
deptId: 'D002'
},
{
userNo: 4,
userNm: '사용자',
userLoginId: 'admin',
userPswd: 'securePass456',
blocId: 'B002',
email: 'kim@example.com',
regUserNo: 102,
regDttm: '2025-07-02 11:20:00',
procUserNo: 103,
procDttm: '2025-07-16 09:45:00',
comId: 'C002',
deptId: 'D002'
}
];
</script>