Compare commits

...

136 Commits

Author SHA1 Message Date
d6dd66c4b3 fix bugs 47, 145 2025-08-11 11:51:28 +07:00
dev
1ece377457 Merge pull request 'update code' (#51) from dev-luannv24-screen36-32-31-26-17-15 into dev
Reviewed-on: #51
2025-08-08 11:35:28 +09:00
335f93e6cf resovel conflix 2025-08-08 11:30:10 +09:00
dev
9979f32f8c Merge pull request 'dev-trungvq7-0729' (#50) from dev-trungvq7-0729 into dev
Reviewed-on: #50
2025-08-08 10:25:21 +09:00
71394443ac update code 2025-08-07 19:04:13 +09:00
dev
d8c5bd5323 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-08-07 18:54:21 +09:00
dev
c9bc9d3186 Merge 0729 2025-08-07 18:54:14 +09:00
dev
a06d2e553d Merge pull request 'dev-dungtv-0807' (#49) from dev-dungtv-0807 into dev
Reviewed-on: #49
2025-08-07 18:43:05 +09:00
dev
6a894df6ec Merge pull request 'add dark mode for editor' (#47) from dev-manhph1-figbug into dev
Reviewed-on: #47
2025-08-07 18:15:02 +09:00
dev
e194557753 Merge pull request 'dev-dungtv-0807' (#48) from dev-dungtv-0807 into dev
Reviewed-on: #48
2025-08-07 17:46:32 +09:00
d0572dc07c fixbug grid 2025-08-07 15:26:53 +07:00
ea4910db79 fix bugs screen 10, 20 2025-08-07 15:18:06 +07:00
c636db83bd fix bug screen 8 bug-32 2025-08-07 13:57:24 +07:00
6871d6034d fix bugs screen 20.1~20.4 2025-08-07 13:50:37 +07:00
dev
1352223416 Merge pull request 'Fix checkboxes in form' (#46) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #46
2025-08-07 15:42:38 +09:00
fa68aa31e6 add dark mode for editor 2025-08-07 13:33:35 +07:00
439079eee8 Fix checkboxes in form 2025-08-07 12:49:14 +09:00
dev
93dd46c225 Merge pull request 'fixbugs screen 10' (#45) from dev-dungtv-0807 into dev
Reviewed-on: #45
2025-08-07 12:45:25 +09:00
537a16fbc7 fixbugs screen 10 2025-08-07 10:40:23 +07:00
dev
6f6f19349f Merge pull request 'fix bug 07/08/25' (#44) from dev-manhph1-figbug into dev
Reviewed-on: #44
2025-08-07 12:23:53 +09:00
2533d5bb7a fix bug 07/08/25 2025-08-07 09:58:49 +07:00
dev
19a634e3a5 Merge pull request 'dev-luannv24-s2s17s15-fixbug' (#41) from dev-luannv24-s2s17s15-fixbug into dev
Reviewed-on: #41
2025-08-07 11:42:33 +09:00
dev
e4331ad79f Merge pull request 'fix bug screen 10' (#42) from dev-dungtv-0807 into dev
Reviewed-on: #42
2025-08-07 11:37:15 +09:00
8c7a8d5b29 resolve commit code 2025-08-07 09:36:18 +07:00
140f73814f update 2025-08-07 11:29:24 +09:00
b53ce8bd83 refactor code 2025-08-07 11:27:51 +09:00
8bb0d56a80 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-luannv24-s2s17s15-fixbug 2025-08-07 11:23:58 +09:00
dev
f715405ad2 Merge pull request 'dev-trungvq7-0729' (#40) from dev-trungvq7-0729 into dev
Reviewed-on: #40
2025-08-07 10:58:23 +09:00
f80bfc5c71 fix bug screen 10 2025-08-07 08:37:59 +07:00
56607d0770 update code 2025-08-06 19:08:06 +09:00
dev
6db0ff96c0 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-08-06 19:03:14 +09:00
2cf00c0880 update code fixbug 2025-08-06 19:02:19 +09:00
dev
9155a2b55e commit 0608 2025-08-06 19:00:29 +09:00
dev
484d8879aa Merge pull request 'fix bugs' (#39) from dev-dungtv-0806 into dev
Reviewed-on: #39
2025-08-06 18:50:46 +09:00
38585f7b4f hotfix layout 2025-08-06 16:43:12 +07:00
b0ad70d33e fix bugs 2025-08-06 16:31:44 +07:00
dev
3f89707a01 Merge pull request 'fixbugs grid' (#38) from dev-dungtv-0805 into dev
Reviewed-on: #38
2025-08-06 12:13:45 +09:00
a4007d5697 resolve comment 2025-08-06 10:12:34 +07:00
3b6c05c70a Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv-0805 2025-08-06 09:27:47 +07:00
dev
550659475f Merge pull request 'fix bug 18 33 34' (#37) from dev-manhph1-figbug into dev
Reviewed-on: #37
2025-08-06 11:27:22 +09:00
4a7077336d resolve confict 2025-08-06 09:26:53 +07:00
dev
ca27167d3d Merge pull request 'Update tooltip s4 + add view button to switch page' (#36) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #36
2025-08-06 10:32:48 +09:00
bf6d03df63 fixbugs grid 2025-08-05 17:28:12 +07:00
8cadade514 fix bug 18 33 34 2025-08-05 15:00:22 +07:00
f929ad2c28 Update tooltip s4 + add view button to switch page 2025-08-05 15:29:25 +09:00
dev
53b8b89e68 Merge pull request 'dev-trungvq7-0729' (#35) from dev-trungvq7-0729 into dev
Reviewed-on: #35
2025-08-05 11:15:47 +09:00
dev
b32aa1d5bb Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-08-04 19:40:08 +09:00
dev
8f7f5c598d Update 0408 2025-08-04 19:39:58 +09:00
dev
e96d012d17 Merge pull request 'fixbug' (#34) from dev-luannv24-fixbugs32s2 into dev
Reviewed-on: #34
2025-08-04 19:01:26 +09:00
dev
efee1098ba Merge pull request 'dev-manhph1-figbug' (#33) from dev-manhph1-figbug into dev
Reviewed-on: #33
2025-08-04 18:56:50 +09:00
5735777bb1 fixbug 2025-08-04 18:53:30 +09:00
2253ddef0a conflic 2025-08-04 16:41:29 +07:00
41095098e2 fixbug-scrren-12 2025-08-04 16:37:00 +07:00
28fe49d39f fixbug-scrren-12 2025-08-04 16:35:12 +07:00
dev
f180f22324 Merge pull request 'fix bug screen 8, 10, menu' (#32) from dev-dungtv44-0804 into dev
Reviewed-on: #32
2025-08-04 18:06:52 +09:00
a7968774c3 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv44-0804 2025-08-04 15:03:03 +07:00
dev
195c48ff25 Merge pull request 'Update s1 s29 - Remove mock data s5 s11' (#31) from dev-nghiantt-s1s29 into dev
Reviewed-on: #31
2025-08-04 17:02:41 +09:00
7bca077859 fix bug screen 8, 10, menu 2025-08-04 15:00:22 +07:00
6dfda50ebd Change style to built in class + Add missing titlte 2025-08-04 11:21:29 +09:00
df678daedf Fix duplicate id not reload page date 2025-08-01 16:03:54 +09:00
06308055ef Remove mock data popup s11 2025-08-01 12:08:43 +09:00
1284d5b14f Update s1 s29 - Remove mock data s5 s11 2025-08-01 11:41:32 +09:00
dev
cd7a6362a5 Merge pull request 'dev-luannv24-s32s17s2' (#30) from dev-luannv24-s32s17 into dev
Reviewed-on: #30
2025-07-31 18:49:01 +09:00
3ae3ff8167 refactor code 2025-07-31 18:47:42 +09:00
dev
39cb5d2883 Merge pull request 'dev-dungtv-0731' (#28) from dev-dungtv-0731 into dev
Reviewed-on: #28
2025-07-31 18:22:10 +09:00
dcdcf772ce fixbug screen 20.4 2025-07-31 16:18:44 +07:00
881a5ceb2d merge code 2025-07-31 17:44:19 +09:00
e4074201e4 update screen 32 vs 2 2025-07-31 17:43:45 +09:00
40addfe639 fixbug active menu item 2025-07-31 15:05:33 +07:00
dev
a557130c15 Merge pull request 'fixbug ui 20 21' (#29) from dev-manhph1-fixbugui-21-28 into dev
Reviewed-on: #29
2025-07-31 16:44:05 +09:00
34d5a1eeb7 fixbug ui 20 21 2025-07-31 16:18:33 +09:00
238fdb5fc5 remove console 2025-07-31 14:18:29 +07:00
3c249aa476 update code 2025-07-31 15:57:07 +09:00
bfe206a2bf Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv-0731 2025-07-31 13:52:37 +07:00
a6e8e6cf86 fixbug screen 20 2025-07-31 13:52:28 +07:00
dev
f9643f46a0 Merge pull request 'Commit 3107' (#27) from dev-trungvq7-0729 into dev
Reviewed-on: #27
2025-07-31 15:39:36 +09:00
dev
056d1a1e17 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-07-31 15:03:33 +09:00
dev
a58062a7b7 Commit 3107 2025-07-31 14:54:02 +09:00
dev
44077048e6 Merge pull request 'dev-trungvq7-0729' (#26) from dev-trungvq7-0729 into dev
Reviewed-on: #26
2025-07-31 14:43:43 +09:00
dev
e32f03c9ae Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-07-31 11:33:52 +09:00
dev
58bb7f915c Update screen 30, 13, 22 2025-07-31 11:31:53 +09:00
dev
a85f9f98f6 Merge pull request 'fix style grid' (#25) from dev-dungtv44-0730 into dev
Reviewed-on: #25
2025-07-31 10:49:24 +09:00
dev
791b291c30 Merge pull request 'dev-luannv24-s32s17' (#24) from dev-luannv24-s32s17 into dev
Reviewed-on: #24
2025-07-30 19:18:37 +09:00
e6e1703942 update date pickker 2025-07-30 19:16:42 +09:00
719e7cee69 fix style grid 2025-07-30 17:09:09 +07:00
9b89a5625b update code fix bug and revert screen 2 2025-07-30 18:34:46 +09:00
e600089f7e fix bug 2025-07-30 18:15:08 +09:00
adbf220770 merge file 2025-07-30 18:14:21 +09:00
dev
51b59bf4c9 Merge pull request 'dev-dungtv44-0730' (#23) from dev-dungtv44-0730 into dev
Reviewed-on: #23
2025-07-30 17:41:07 +09:00
b2e50837fd update code 2025-07-30 16:21:52 +09:00
88b59f5f33 update code merge 2025-07-30 16:19:54 +09:00
a2e7e8d74e pull dev 2025-07-30 14:07:08 +07:00
dev
d37f23512a Merge pull request 'Update s14 s29 + Fix bugs s1 + Update datepicker height' (#22) from dev-nghiantt-s1s29 into dev
Reviewed-on: #22
2025-07-30 16:05:38 +09:00
1a23077421 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv44-0730 2025-07-30 14:04:11 +07:00
9603353ab3 update screen 33, 44, 20, fix bug Grid 2025-07-30 14:03:41 +07:00
6077dddb74 Remove mockdata screen 5 2025-07-30 15:35:41 +09:00
2338bbf2ec Remove log + fix click chart top 10 2025-07-30 15:01:44 +09:00
c2e2c10a8a Update s14 s29 + Fix bugs s1 + Update datepicker height 2025-07-30 12:35:12 +09:00
dev
d790249743 Merge pull request 'fix ui EvtObjPop' (#21) from dev-manhph1-fixbug-18-19-21-28 into dev
Reviewed-on: #21
2025-07-30 11:43:21 +09:00
205821fc11 fix ui EvtObjPop 2025-07-30 11:39:45 +09:00
dev
fade079b06 Merge pull request 'dev-manhph1-fixbug-18-19-21-28' (#18) from dev-manhph1-fixbug-18-19-21-28 into dev
Reviewed-on: #18
2025-07-30 11:24:55 +09:00
dev
98c26a156e Merge pull request 'update screen 34, fix bug grid - select item' (#20) from dev-dungtv44-0730 into dev
Reviewed-on: #20
2025-07-30 11:22:38 +09:00
b4f8e41c7e update screen 34, fix bug grid - select item 2025-07-30 09:15:11 +07:00
dev
e9bdd80f14 Merge pull request 'update screen 34, 20' (#19) from dev-dungtv44-0730 into dev
Reviewed-on: #19
2025-07-30 10:35:21 +09:00
eeadcd254d remove console log 2025-07-30 08:32:27 +07:00
b56bd12bb7 update screen 34, 20 2025-07-30 08:23:13 +07:00
bea1e0889b dev-manhph1-add-pagination-28 2025-07-29 18:30:19 +09:00
dev
0f66d84b48 Merge pull request 'hotfix grid' (#17) from dev-dungtv-fix-grid into dev
Reviewed-on: #17
2025-07-29 17:45:00 +09:00
34d03b2546 dev-manhph1-fixbug-18-19-21-28 2025-07-29 17:18:41 +09:00
8f83e1d60c hotfix grid 2025-07-29 14:58:37 +07:00
dev
1faf49056d Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-07-29 15:59:34 +09:00
dev
e9ab3faa51 update 2025-07-29 15:59:32 +09:00
dev
54220aa4eb Merge pull request 'update screen 12, 20' (#15) from dev-dungtv-0729 into dev
Reviewed-on: #15
2025-07-29 15:39:16 +09:00
315aafc528 update screen 12, 20 2025-07-29 13:20:29 +07:00
8963a92475 update screen15-screen31 2025-07-29 12:06:11 +09:00
d66a03626b updatenew-code-new 2025-07-29 12:04:09 +09:00
dev
665a178f82 Merge pull request 'update screen 2, 8, 9, 10, 27, 33, 34' (#12) from dev-dungtv-0728 into dev
Reviewed-on: #12
2025-07-29 11:52:11 +09:00
7e2383efda update-subtitle-screen15 2025-07-29 11:39:05 +09:00
13cedc7337 resolve conflict 2025-07-29 09:36:40 +07:00
dev
e128375aeb Merge pull request 'Update Screen 16, 22' (#13) from dev-trungvq7-2207 into dev
Reviewed-on: #13
2025-07-29 11:30:56 +09:00
dev
710714116e Remove inline style 2025-07-29 11:30:05 +09:00
dev
33dbe93290 Merge pull request '- Update screen 14 29 - Remove mock data dashboard' (#11) from dev-nghiantt-s14 into dev
Reviewed-on: #11
2025-07-29 11:25:51 +09:00
708b648080 updatecode 2025-07-29 11:20:59 +09:00
dev
2845672723 Update 16, 22 2025-07-29 10:51:49 +09:00
bbaf26af86 Fix comment 2025-07-28 18:34:29 +09:00
c3d01c998c update screen 2, 8, 9, 10, 27, 33, 34 2025-07-28 16:12:24 +07:00
aec9353ab2 - Update screen 14 29 - Remove mock data dashboard 2025-07-28 17:22:38 +09:00
dev
2dd0c6a72c Merge pull request 'dev-trungvq7-2207' (#10) from dev-trungvq7-2207 into dev
Reviewed-on: #10
2025-07-28 14:39:36 +09:00
dev
631637a8e1 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-2207 2025-07-28 14:31:49 +09:00
dev
3ff87852e5 Update 2507 2025-07-28 14:31:41 +09:00
dev
117e0adeb9 Merge pull request 'dev-dungtv-0725' (#9) from dev-dungtv-0725 into dev
Reviewed-on: #9
2025-07-28 10:59:55 +09:00
402b09440f fix code comment 2025-07-28 08:59:17 +07:00
71f7cf4d30 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv-0725 2025-07-28 08:45:04 +07:00
d3984182e8 update screen 8, 10 2025-07-28 08:44:51 +07:00
dev
933d4b751f Merge pull request 'dev-luannv27-2407' (#7) from dev-luannv27-2407 into dev
Reviewed-on: #7
2025-07-28 10:35:21 +09:00
dev
d45d141c3c Update 2507 2025-07-25 17:59:38 +09:00
119 changed files with 5115 additions and 8677 deletions

View File

@ -9,11 +9,12 @@
@import "./common/card.scss";
@import "./common/tabs.scss";
@import "./common/numericInput.scss";
@import "./common/editor.scss";
html,
body {
overflow: auto;
// overflow: auto;
}
a {
@ -119,7 +120,7 @@ a {
.v-main,
.v-main__wrap,
.container {
height: 100%;
// height: 100%;
}
.v-main__wrap>.container {
@ -144,7 +145,9 @@ a {
}
& .router-tab__container {
min-height: calc(100% - 72px);
overflow-y: auto;
height: calc(100vh - 105px);
max-height: calc(100vh - 105px);
padding: 20px;
}
@ -265,7 +268,7 @@ a {
}
&>.v-treeview-node__root:hover:before {
opacity: 1 !important;
opacity: 0 !important;
}
.v-treeview-node__children {
@ -279,13 +282,17 @@ a {
.v-treeview-node--click[aria-expanded="true"] {
&>.v-treeview-node__root:before {
opacity: 1 !important;
opacity: 0 !important;
}
}
.v-treeview-node[aria-expanded="true"] {
&>.v-treeview-node__root>.v-treeview-node__content>.v-treeview-node__label>button>.v-icon.mdi-chevron-down {
transform: rotate(-180deg);
&>.v-treeview-node__root>.v-treeview-node__content
>.v-treeview-node__label>button {
>.anticon,
>.v-icon.mdi-chevron-down {
transform: rotate(-180deg);
}
}
}
@ -297,15 +304,17 @@ a {
// justify-content: center;
}
& .anticon,
& .v-icon.mdi-chevron-down {
margin-left: auto;
animation-duration: 0.5s;
}
}
}
.v-treeview-node--active {
&:before {
opacity: 1 !important;
opacity: 0 !important;
}
}
@ -321,7 +330,8 @@ a {
.v-treeview-node__content span:not(.v-icon),
.v-treeview-node__root>button,
.v-treeview-node__level,
.v-treeview-node__content .v-icon.mdi-chevron-down {
.v-treeview-node__content .v-icon.mdi-chevron-down,
.v-treeview-node__content .anticon {
display: none;
}
@ -433,7 +443,7 @@ a {
.v-application.#{$theme}-mode {
min-width: 1000px;
.head-logo{
.head-logo {
gap: 8px;
}
@ -473,7 +483,11 @@ a {
.header {
background-color: map-deep-get($config, #{$theme}, "header-backgroud");
border-color: #D3D6EA;
border-bottom: 1px solid map-deep-get($config, #{$theme}, "v-header-border");
}
.custom-chart{
border: 1px solid map-deep-get($config, #{$theme}, "v-chart-border");
}
.btn-header {
@ -484,6 +498,12 @@ a {
.container--fluid {
background-color: map-deep-get($config, #{$theme}, "container-fluid");
.menu-container {
height:calc(100vh - 60px);
overflow-y: auto;
border-right: 1px solid map-deep-get($config, #{$theme}, "v-sidebar-border") ;
}
}
.v-icon {
@ -529,8 +549,6 @@ a {
}
}
.router-tab {
.router-tab__header {
background-color: map-deep-get($config, #{$theme}, "router-header");
@ -599,45 +617,9 @@ a {
}
}
// .v-banner {
// &__wrapper {
// border-bottom-color: map-deep-get($config,
// #{$theme},
// "v-banner-border-color"
// ) !important;
// }
// }
.v-navigation-drawer__append {
>p {
@if $theme ==dark {
color: rgba(255, 255, 255, 0.6);
}
@else {
color: #999;
}
}
}
.v-footer {
@if $theme ==light {
background-color: #dfdfe5;
color: #767d83;
}
}
.bd {
@if $theme ==dark {
&-r-1 {
border-right: 1px #373f45 solid;
}
}
@else {
&-r-1 {
border-right: 1px #efefef solid;
}
color: map-deep-get($config, #{$theme}, "v-banner-border-color" ) !important;
}
}
@ -687,255 +669,116 @@ a {
}
&>.v-treeview-node {
&>.v-treeview-node__root {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-label-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-icon-color"
);
}
}
.v-treeview-node__root {
border-radius: 8px;
&:hover {
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-label-active-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-icon-active-color"
);
}
}
background-color: map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color" );
}
}
&>.v-treeview-node__children {
&>.v-treeview-node {
&>.v-treeview-node__root {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-node-subroot-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-icon-color"
);
}
}
&:not(.v-treeview-node--active):hover {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-color"
);
}
}
}
}
&>.v-treeview-node__children {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-subchildren-backgroundColor"
);
}
&>.v-treeview-node--active {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-node-subroot-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-active-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-icon-active-color"
);
}
}
}
&>.v-treeview-node__children {
& .v-treeview-node {
&>.v-treeview-node__root {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-node-subroot-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-icon-color"
);
}
}
&:not(.v-treeview-node--active):hover {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-color"
);
}
}
}
}
&>.v-treeview-node--active {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-active-bg"
);
border: 1px solid map-deep-get($config,
#{$theme},
"v-treeview-node-label-active-border"
);
border-radius: 8px;
&:before {
opacity: 0 !important;
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-active-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-active-color"
);
}
}
}
}
}
&[aria-expanded="true"] {
& .v-treeview-node__root>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-children-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-icon-active-color"
);
}
}
}
}
}
&[aria-expanded="true"] {
& .v-treeview-node__root>.v-treeview-node__content {
.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-label-active-color"
);
color: map-deep-get($config, #{$theme}, "tui-grid-title-color");
}
}
}
&[aria-expanded="true"]{
// Level 1
&>.v-treeview-node__root {
background-color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-bg" );
border: 1px solid map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border" );
color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border");
&:before {
background-color: map-deep-get($config, #{$theme}, "v-treeview-node-subroot-backgroundColor");
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-icon-active-color"
);
.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border");
}
.v-icon:first-child,
.v-icon:first-child::before {
color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border" );
}
}
}
&>.v-treeview-node__children {
// Level 2
.v-treeview-node__root {
color: map-deep-get($config, #{$theme}, "v-treeview-node-root-label-color");
&:hover {
background-color: map-deep-get($config, #{$theme}, "v-calendar-weekday-backgroundColor");
}
}
&>[aria-expanded="true"] >.v-treeview-node__root,
.v-treeview-node__root.v-treeview-node--active {
background-color: map-deep-get($config, #{$theme}, "v-calendar-day-in-not-month-color" );
.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config, #{$theme}, "card-title-color");
}
.v-icon,
.v-icon::before,
.anticon {
color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border" );
}
}
}
// Level 3
.v-treeview-node__children {
.v-treeview-node {
>.v-treeview-node__root {
.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config, #{$theme}, "card-default-color");
}
}
*:hover,
:hover {
border-width: 0;
}
&:hover {
border: 1px solid map-deep-get($config, #{$theme}, "v-input-textarea-border");
border-radius: 8px;
background-color: rgba(0, 0, 0, 0);
.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config, #{$theme}, "tui-grid-title-color");
}
}
}
&.v-treeview-node--active {
// color: map-deep-get($config, #{$theme}, "card-title-color");
background-color: rgba(0, 0, 0, 0);
.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config, #{$theme}, "tui-grid-title-color");
}
.v-icon,
.v-icon::before,
.anticon {
color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border" );
}
}
}
}
}
}
}
}
}
}
@ -947,15 +790,24 @@ a {
"v-calendar-weekday-backgroundColor"
);
border-right: 1px solid map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color");
border-bottom: 1px solid map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color");
border-top: 1px solid map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color");
color: map-deep-get($config, #{$theme}, "v-calendar-weekday-color");
&:nth-of-type(1) {
color: map-deep-get($color, "week", "sun");
// color: map-deep-get($config,
// #{$theme},
// "v-calendar-is-sun"
// );
border-left: 1px solid map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color");
}
&:nth-of-type(7) {
color: map-deep-get($color, "week", "sat");
}
// &:nth-of-type(7) {
// color: map-deep-get($config,
// #{$theme},
// "v-calendar-is-sat"
// );
// }
}
>.vc-day {
@ -964,22 +816,33 @@ a {
.day-hldyNm,
.day-label.is-holiday {
color: map-deep-get($color, "week", "sun");
color: map-deep-get($config,
#{$theme},
"v-calendar-is-sun"
);
}
&.weekday-1 {
.day-label,
.day-hldyNm {
color: map-deep-get($color, "week", "sun");
color: map-deep-get($config,
#{$theme},
"v-calendar-is-sun"
);
}
border-left: 1px solid map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color");
}
&.weekday-7 {
.day-label,
.day-hldyNm {
color: map-deep-get($color, "week", "sat");
color: map-deep-get($config,
#{$theme},
"v-calendar-is-sat"
);
}
}
@ -1003,7 +866,7 @@ a {
);
.day-label {
color: map-deep-get($config, #{$theme}, "non-activate");
color: map-deep-get($config, #{$theme}, "card-text-title-color");
}
}
}
@ -1181,11 +1044,17 @@ a {
}
th.tui-sun {
color: map-deep-get($color, "week", "sun");
color: map-deep-get($config,
#{$theme},
"v-calendar-is-sun"
);
}
th.tui-sat {
color: map-deep-get($color, "week", "sat");
color: map-deep-get($config,
#{$theme},
"v-calendar-is-sat"
);
}
}
@ -1201,11 +1070,17 @@ a {
}
td.tui-calendar-sun {
color: map-deep-get($color, "week", "sun");
color: map-deep-get($config,
#{$theme},
"v-calendar-is-sun"
);
}
td.tui-calendar-sat {
color: map-deep-get($color, "week", "sat");
color: map-deep-get($config,
#{$theme},
"v-calendar-is-sat"
);
}
}
}
@ -1247,34 +1122,47 @@ a {
}
.v-list {
background-color: map-deep-get($config,
#{$theme},
"tui-datepicker-backgroundColor"
);
border: 1px solid map-deep-get($config, #{$theme}, "tui-datepicker-border-color");
border-radius: 4px;
background-color: map-deep-get($config,
#{$theme},
"tui-datepicker-backgroundColor"
);
border: 1px solid map-deep-get($config, #{$theme}, "tui-datepicker-border-color");
border-radius: 4px;
padding: 4px;
&-item--active {
border-radius: 4px;
&:before {
opacity: 0;
}
.v-list-item__title {
color: map-deep-get($config, #{$theme}, "tui-datepicker-calendar-color");
}
}
&.v-select-list{
>.v-list-item {
margin-bottom: 4px;
.anticon {
&.anticon-check {
display: none;
}
}
&[aria-selected="true"] {
border-radius: 8px;
background-color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-bg");
.anticon {
&.anticon-check {
display: block;
color: map-deep-get($config, #{$theme}, "v-icon-blue");
}
}
}
}
}
&-item--active {
&:before {
opacity: 0;
}
.v-list-item__content {
background-color: currentColor;
}
.v-list-item__title {
color: map-deep-get($config,
#{$theme},
"tui-datepicker-calendar-color"
);
@if $theme ==light {
color: #fff !important;
}
}
}
}
}
.theme--white {
.toastui-editor-contents {
@ -1284,14 +1172,14 @@ a {
}
}
.toastui-editor-contents {
* {
color: map-deep-get($config,
#{$theme},
"tui-editor-contents-color"
) !important;
}
}
// .toastui-editor-contents {
// * {
// color: map-deep-get($config,
// #{$theme},
// "tui-editor-contents-color"
// ) !important;
// }
// }
.lnb-logo {
color: map-deep-get($config, #{$theme}, "v-dialog-card-text-color");
@ -1327,11 +1215,12 @@ a {
color: #46c0ff;
}
}
.v-btn {
background-color: transparent !important;
color: map-deep-get($config, #{$theme}, "btn-header-select-color") !important;
}
}
[hover-tooltip] {
@ -1391,11 +1280,6 @@ a {
}
}
}

View File

@ -66,6 +66,12 @@
}
}
.custom-action-btn{
height: 24px;
width: 24px;
font-size: 12px;
}
.v-btn {
background-color: map-deep-get($config,
#{$theme},
@ -92,21 +98,23 @@
background: map-deep-get($config, #{$theme}, "basic-button-background");
}
.search-button {
color: map-deep-get($config, #{$theme}, "search-btn-color");
.searchFilter {
.search-button {
height: 40px;
color: map-deep-get($config, #{$theme}, "search-btn-color");
}
}
.v-dialog {
.ant-btn-icon-only {
color: map-deep-get(
$config,
color: map-deep-get($config,
#{$theme},
"icon-color"
);
}
}
.ant-btn {
.ant-btn {
&.ant-btn-outlined {
color:map-deep-get($config, #{$theme}, "ant-btn-default-color");
@ -118,6 +126,10 @@
background: map-deep-get($config, #{$theme}, "ant-btn-primary-bg");
border-color:map-deep-get($config, #{$theme}, "ant-btn-primary-bg");
color:map-deep-get($config, #{$theme}, "ant-btn-primary-color");
&.ant-btn-background-ghost {
color:map-deep-get($config, #{$theme}, "ant-btn-primary-bg");
}
}
&.ant-btn-default {
@ -125,6 +137,11 @@
color:map-deep-get($config, #{$theme}, "ant-btn-default-color");
}
&.ant-btn-popup-default {
background:map-deep-get($config, #{$theme}, "ant-btn-popup-bg");
color:map-deep-get($config, #{$theme}, "ant-btn-popup-color");
}
&.ant-btn-danger {
&.ant-btn-background-ghost {
color:map-deep-get($config, #{$theme}, "ant-btn-danger-color");
@ -132,20 +149,32 @@
background: map-deep-get($config, #{$theme}, "ant-btn-danger-bg") !important;
}
}
&.expand-btn {
.v-icon {
color: map-deep-get($config, #{$theme}, "basic-button-color");
svg {
fill: map-deep-get($config, #{$theme}, "basic-button-color");
}
}
}
}
}
}
.v-application {
.ant-btn {
.ant-btn {
border-radius: 6px;
&.ant-btn-lg {
border-radius: 8px;
}
&.ant-btn-default {
border:none !important
border: none !important
}
}
}
@ -156,6 +185,16 @@
border: none;
width: 16px;
height: 16px;
background:none;
background: none;
}
}
.ant-btn {
&.expand-btn {
span {
&.v-icon {
margin-right: 8px;
}
}
}
}

View File

@ -0,0 +1,474 @@
@charset "utf-8";
.toastui-editor-dark .toastui-editor-defaultUI {
border-color: #424242;
color: #eee;
}
.toastui-editor-dark .toastui-editor-md-container,
.toastui-editor-dark .toastui-editor-ww-container {
background-color: #212224;
}
.toastui-editor-dark .toastui-editor-defaultUI-toolbar {
background-color: #212224;
border-bottom-color: #303238;
}
.toastui-editor-dark .toastui-editor-toolbar-icons {
background-position-y: -49px;
border-color: #232428;
}
.toastui-editor-dark .toastui-editor-toolbar-icons:not(:disabled):hover {
background-color: #36383f;
border-color: #36383f;
}
.toastui-editor-dark .toastui-editor-toolbar-divider {
background-color: #303238;
}
.toastui-editor-dark .toastui-editor-tooltip {
background-color: #535662;
}
.toastui-editor-dark .toastui-editor-tooltip .arrow {
background-color: #535662;
}
.toastui-editor-dark .toastui-editor-defaultUI-toolbar .scroll-sync::before {
color: #8f939f;
}
.toastui-editor-dark .toastui-editor-defaultUI-toolbar .scroll-sync.active::before {
color: #67ccff;
}
.toastui-editor-dark .toastui-editor-defaultUI-toolbar .switch {
background-color: #2b4455;
}
.toastui-editor-dark .toastui-editor-defaultUI-toolbar input:checked + .switch {
background-color: #2b4455;
}
.toastui-editor-dark .toastui-editor-defaultUI-toolbar .switch::before {
background-color: #8f939f;
}
.toastui-editor-dark .toastui-editor-defaultUI-toolbar input:checked + .switch::before {
background-color: #67ccff;
}
.toastui-editor-dark .toastui-editor-main .toastui-editor-md-splitter {
background-color: #303238;
}
.toastui-editor-dark .toastui-editor-mode-switch {
border-top-color: #424242;
background-color: #212224;
}
.toastui-editor-dark .toastui-editor-mode-switch .tab-item {
border-color: #424242;
background-color: #212224;
color: #eee;
}
.toastui-editor-dark .toastui-editor-mode-switch .tab-item.active {
border-top-color: #424242;
background-color: #212224;
color: #1677FF;
}
.toastui-editor-dark .toastui-editor-popup,
.toastui-editor-dark .toastui-editor-context-menu {
background-color: #121212;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08);
border-color: #494c56;
}
.toastui-editor-dark .toastui-editor-popup-add-heading ul li:hover {
background-color: #36383f;
}
.toastui-editor-dark .toastui-editor-popup-body label {
color: #9a9da3;
}
.toastui-editor-dark .toastui-editor-popup-body input[type='text'] {
background-color: transparent;
color: #eee;
border-color: #303238;
}
.toastui-editor-dark .toastui-editor-popup-body input[type='text']:focus {
outline-color: #67ccff;
}
.toastui-editor-dark .toastui-editor-popup-body input[type='text'].disabled {
color: #969aa5;
border-color: #303238;
background-color: rgba(48, 50, 56, 0.4);
}
.toastui-editor-dark .toastui-editor-popup-add-image .toastui-editor-tabs .tab-item {
border-bottom-color: #292e37;
color: #eee;
}
.toastui-editor-dark .toastui-editor-popup-add-image .toastui-editor-tabs .tab-item:hover {
border-bottom-color: #3c424d;
}
.toastui-editor-dark .toastui-editor-popup-add-image .toastui-editor-tabs .tab-item.active {
color: #67ccff;
border-bottom-color: #67ccff;
}
.toastui-editor-dark .toastui-editor-popup-body .toastui-editor-file-name {
border-color: #303238;
color: #eee;
}
.toastui-editor-dark .toastui-editor-popup-body .toastui-editor-file-select-button {
border-color: #303238;
background-color: #232428;
color: #eee;
}
.toastui-editor-dark .toastui-editor-popup-body .toastui-editor-file-select-button:hover {
border-color: #494c56;
}
.toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-close-button {
color: #eee;
border-color: #303238;
background-color: #232428;
}
.toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-close-button:hover {
border-color: #494c56;
}
.toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-ok-button {
color: #121212;
background-color: #67ccff;
}
.toastui-editor-dark.toastui-editor-defaultUI .toastui-editor-ok-button:hover {
color: #121212;
background-color: #32baff;
}
.toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-cell {
border-color: #303238;
background-color: #121212;
}
.toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-cell.header {
border-color: #303238;
background-color: #232428;
}
.toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-selection-layer {
border-color: rgba(103, 204, 255, 0.4);
background-color: rgba(103, 204, 255, 0.1);
}
.toastui-editor-dark .toastui-editor-popup-add-table .toastui-editor-table-description {
color: #eee
}
.toastui-editor-dark .toastui-editor-md-tab-container {
background-color: #232428;
border-bottom-color: #303238;
}
.toastui-editor-dark .toastui-editor-md-tab-container .tab-item {
border-color: #393b42;
background-color: #2d2f34;
color: #757a86;
}
.toastui-editor-dark .toastui-editor-md-tab-container .tab-item.active {
border-bottom-color: #121212;
background-color: #121212;
color: #eee;
}
.toastui-editor-dark .toastui-editor-context-menu .menu-group {
border-bottom-color: #303238;
color: #eee;
}
.toastui-editor-dark .toastui-editor-context-menu .menu-item span::before {
background-position-y: -126px;
}
.toastui-editor-dark .toastui-editor-context-menu li:not(.disabled):hover {
background-color: #36383f;
}
.toastui-editor-dark .toastui-editor-context-menu li.disabled {
color: #969aa5;
}
.toastui-editor-dark .toastui-editor-dropdown-toolbar {
border-color: #494c56;
background-color: #232428;
}
.toastui-editor-dark .ProseMirror,
.toastui-editor-dark .toastui-editor-contents p,
.toastui-editor-dark .toastui-editor-contents h1,
.toastui-editor-dark .toastui-editor-contents h2,
.toastui-editor-dark .toastui-editor-contents h3,
.toastui-editor-dark .toastui-editor-contents h4,
.toastui-editor-dark .toastui-editor-contents h5,
.toastui-editor-dark .toastui-editor-contents h6 {
color: #fff;
}
.toastui-editor-dark .toastui-editor-contents h1,
.toastui-editor-dark .toastui-editor-contents h2 {
border-color: #fff;
}
.toastui-editor-dark .toastui-editor-contents del {
color: #777980;
}
.toastui-editor-dark .toastui-editor-contents blockquote {
border-color: #303135;
}
.toastui-editor-dark .toastui-editor-contents blockquote p,
.toastui-editor-dark .toastui-editor-contents blockquote ul,
.toastui-editor-dark .toastui-editor-contents blockquote ol {
color: #777980;
}
.toastui-editor-dark .toastui-editor-contents pre {
background-color: #232428;
}
.toastui-editor-dark .toastui-editor-contents pre code {
background-color: transparent;
color: #fff;
}
.toastui-editor-dark .toastui-editor-contents code {
color: #c1798b;
background-color: #35262a;
}
.toastui-editor-dark .toastui-editor-contents div {
color: #fff;
}
.toastui-editor-dark .toastui-editor-ww-code-block-language {
border-color: #303238;
background-color: #121212;
}
.toastui-editor-dark .toastui-editor-ww-code-block-language input {
color: #fff;
}
.toastui-editor-dark .toastui-editor-contents .toastui-editor-ww-code-block:after {
background-color: #232428;
border: 1px solid #393b42;
color: #eee;
background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjIuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuugiOydtOyWtF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMzAgMzAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMwIDMwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I2ZmZjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPGc+CgkJCTxnPgoJCQkJPGc+CgkJCQkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE1LjUsMTIuNWwyLDJMMTIsMjBoLTJ2LTJMMTUuNSwxMi41eiBNMTgsMTBsMiwybC0xLjUsMS41bC0yLTJMMTgsMTB6Ii8+CgkJCQk8L2c+CgkJCTwvZz4KCQk8L2c+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==');
}
.toastui-editor-dark .toastui-editor-contents .toastui-editor-custom-block-editor {
background: #392d31;
color: #fff;
border-color: #327491;
}
.toastui-editor-dark .toastui-editor-custom-block.ProseMirror-selectednode .toastui-editor-custom-block-view {
color: #fff;
border-color: #327491;
}
.toastui-editor-dark .toastui-editor-custom-block-view button {
background-color: #232428;
border-color: #393b42;
background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjIuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuugiOydtOyWtF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMzAgMzAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMwIDMwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I2ZmZjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPGc+CgkJCTxnPgoJCQkJPGc+CgkJCQkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE1LjUsMTIuNWwyLDJMMTIsMjBoLTJ2LTJMMTUuNSwxMi41eiBNMTgsMTBsMiwybC0xLjUsMS41bC0yLTJMMTgsMTB6Ii8+CgkJCQk8L2c+CgkJCTwvZz4KCQk8L2c+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==');
}
.toastui-editor-dark .toastui-editor-custom-block-view button:hover {
background-color: #232428;
border-color: #595c68;
}
.toastui-editor-dark .toastui-editor-custom-block-view .info {
color: #65acca;
}
.toastui-editor-dark .toastui-editor-contents table {
border-color: #303238;
}
.toastui-editor-dark .toastui-editor-contents table th,
.toastui-editor-dark .toastui-editor-contents table td {
border-color: #303238;
}
.toastui-editor-dark .toastui-editor-contents table th {
background-color: #3a3c42;
}
.toastui-editor-dark .toastui-editor-contents table td,
.toastui-editor-dark .toastui-editor-contents table td p {
color: #fff;
}
.toastui-editor-dark .toastui-editor-contents td.toastui-editor-cell-selected {
background-color: rgba(103, 204, 255, 0.5);
}
.toastui-editor-dark .toastui-editor-contents th.toastui-editor-cell-selected {
background-color: rgba(103, 204, 255, 0.3);
}
.toastui-editor-dark table.ProseMirror-selectednode {
outline-color: #67ccff;
}
.toastui-editor-dark .html-block.ProseMirror-selectednode {
outline-color: #67ccff;
}
.toastui-editor-dark .toastui-editor-contents ul,
.toastui-editor-dark .toastui-editor-contents menu,
.toastui-editor-dark .toastui-editor-contents ol,
.toastui-editor-dark .toastui-editor-contents dir {
color: #55575f;
}
.toastui-editor-dark .toastui-editor-contents ul > li::before {
background-color: #55575f;
}
.toastui-editor-dark .toastui-editor-contents hr {
border-color: #55575f;
}
.toastui-editor-dark .toastui-editor-contents a {
color: #4b96e6;
}
.toastui-editor-dark .toastui-editor-contents a:hover {
color: #1f70de;
}
.toastui-editor-dark .toastui-editor-contents .image-link:hover::before {
border-color: #393b42;
background-color: #232428;
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4KICAgICAgICA8ZyBzdHJva2U9IiNFRUUiIHN0cm9rZS13aWR0aD0iMS41Ij4KICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICA8Zz4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy42NjUgMTUuMDdsLTEuODE5LS4wMDJjLTEuNDg2IDAtMi42OTItMS4yMjgtMi42OTItMi43NDR2LS4xOTJjMC0xLjUxNSAxLjIwNi0yLjc0NCAyLjY5Mi0yLjc0NGgzLjg0NmMxLjQ4NyAwIDIuNjkyIDEuMjI5IDIuNjkyIDIuNzQ0di4xOTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDQ1IC0xNzQzKSB0cmFuc2xhdGUoMTA0MCAxNzM4KSB0cmFuc2xhdGUoNSA1KSBzY2FsZSgxIC0xKSByb3RhdGUoNDUgMzcuMjkzIDApIi8+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEyLjMyNiA0LjkzNGwxLjgyMi4wMDJjMS40ODcgMCAyLjY5MyAxLjIyOCAyLjY5MyAyLjc0NHYuMTkyYzAgMS41MTUtMS4yMDYgMi43NDQtMi42OTMgMi43NDRoLTMuODQ1Yy0xLjQ4NyAwLTIuNjkyLTEuMjI5LTIuNjkyLTIuNzQ0VjcuNjgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDQ1IC0xNzQzKSB0cmFuc2xhdGUoMTA0MCAxNzM4KSB0cmFuc2xhdGUoNSA1KSBzY2FsZSgxIC0xKSByb3RhdGUoNDUgMzAuOTk2IDApIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPgo=');
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08);
}
.toastui-editor-dark .toastui-editor-contents .task-list-item::before {
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICAgIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgc3Ryb2tlPSIjNTU1NzVGIj4KICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTAzMCAtMzE2KSB0cmFuc2xhdGUoNzg4IDE5MikgdHJhbnNsYXRlKDI0MiAxMjQpIj4KICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD0iMTciIGhlaWdodD0iMTciIHg9Ii41IiB5PSIuNSIgcng9IjIiLz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cg==');
background-color: transparent;
}
.toastui-editor-dark .toastui-editor-contents .task-list-item.checked::before {
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICAgIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgZmlsbD0iIzRCOTZFNiI+CiAgICAgICAgICAgIDxnPgogICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2IDBjMS4xMDUgMCAyIC44OTUgMiAydjE0YzAgMS4xMDUtLjg5NSAyLTIgMkgyYy0xLjEwNSAwLTItLjg5NS0yLTJWMkMwIC44OTUuODk1IDAgMiAwaDE0em0tMS43OTMgNS4yOTNjLS4zOS0uMzktMS4wMjQtLjM5LTEuNDE0IDBMNy41IDEwLjU4NSA1LjIwNyA4LjI5M2wtLjA5NC0uMDgzYy0uMzkyLS4zMDUtLjk2LS4yNzgtMS4zMi4wODMtLjM5LjM5LS4zOSAxLjAyNCAwIDEuNDE0bDMgMyAuMDk0LjA4M2MuMzkyLjMwNS45Ni4yNzggMS4zMi0uMDgzbDYtNiAuMDgzLS4wOTRjLjMwNS0uMzkyLjI3OC0uOTYtLjA4My0xLjMyeiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwNTAgLTI5NikgdHJhbnNsYXRlKDc4OCAxOTIpIHRyYW5zbGF0ZSgyNjIgMTA0KSIvPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K');
}
.toastui-editor-dark .toastui-editor-md-delimiter,
.toastui-editor-dark .toastui-editor-md-code.toastui-editor-md-delimiter,
.toastui-editor-dark .toastui-editor-md-thematic-break,
.toastui-editor-dark .toastui-editor-md-link,
.toastui-editor-dark .toastui-editor-md-table,
.toastui-editor-dark .toastui-editor-md-block-quote {
color: #55575f;
}
.toastui-editor-dark .toastui-editor-md-meta,
.toastui-editor-dark .toastui-editor-md-html {
color: #55575f;
}
.toastui-editor-dark .toastui-editor-md-link.toastui-editor-md-link-url.toastui-editor-md-marked-text {
color: #777980;
}
.toastui-editor-dark .toastui-editor-md-block-quote .toastui-editor-md-marked-text,
.toastui-editor-dark .toastui-editor-md-list-item .toastui-editor-md-meta {
color: #b3b5bc;
}
.toastui-editor-dark .toastui-editor-md-link.toastui-editor-md-link-desc.toastui-editor-md-marked-text,
.toastui-editor-dark .toastui-editor-md-list-item-style.toastui-editor-md-list-item-odd {
color: #4b96e6;
}
.toastui-editor-dark .toastui-editor-md-list-item-style.toastui-editor-md-list-item-even {
color: #ef6767;
}
.toastui-editor-dark .toastui-editor-md-table .toastui-editor-md-table-cell {
color: #fff;
}
.toastui-editor-dark .toastui-editor-md-code.toastui-editor-md-marked-text {
color: #c1798b;
}
.toastui-editor-dark .toastui-editor-md-code {
background-color: #35262a;
}
.toastui-editor-dark .toastui-editor-md-code-block-line-background {
background-color: #232428;
}
.toastui-editor-dark .toastui-editor-md-code-block .toastui-editor-md-meta {
color: #aaa;
}
.toastui-editor-dark .toastui-editor-md-custom-block {
color: #fff;
}
.toastui-editor-dark .toastui-editor-md-custom-block-line-background {
background-color: #392d31;
}
.toastui-editor-dark .toastui-editor-md-custom-block .toastui-editor-md-delimiter {
color: #327491;
}
.toastui-editor-dark .toastui-editor-md-custom-block .toastui-editor-md-meta {
color: #65acca;
}
.toastui-editor-dark .toastui-editor-contents .toastui-editor-md-preview-highlight::after {
background-color: rgba(255, 250, 193, 0.5);
}
.toastui-editor-dark .toastui-editor-contents th.toastui-editor-md-preview-highlight,
.toastui-editor-dark .toastui-editor-contents td.toastui-editor-md-preview-highlight {
background-color: rgba(255, 250, 193, 0.5);
}
.toastui-editor-dark .toastui-editor-contents th.toastui-editor-md-preview-highlight {
color: #fff;
}
.toastui-editor-dark .toastui-editor-contents th.toastui-editor-md-preview-highlight,
.toastui-editor-dark .toastui-editor-contents td.toastui-editor-md-preview-highlight {
background-color: rgba(255, 250, 193, 0.25);
}
.toastui-editor-dark .toastui-editor-contents .toastui-editor-md-preview-highlight::after {
background-color: rgba(255, 250, 193, 0.25);
}

View File

@ -17,18 +17,6 @@
border: 0 !important;
}
// &-body-container {
// width: 100% !important;
// }
// &-table {
// width: 100% !important;
// }
// &-lside-area .tui-grid-body-area {
// margin-right: -11px;
// }
&-lside-area .tui-grid-scrollbar-left-bottom {
display: none;
}
@ -68,6 +56,12 @@
font-weight: 400;
}
th[data-column-name="_checked"] {
padding-left: 0;
}
}
.tui-grid-table{
@ -75,6 +69,13 @@
.tui-grid-cell-has-input .tui-grid-cell-content {
padding: 8px;
}
th[data-column-name="_checked"] {
&.tui-grid-cell-header {
padding-left: 0;
}
}
}
.treeGrid {
@ -98,6 +99,32 @@
@include theme($theme);
.v-application.#{$theme}-mode {
.tui-grid-content-area{
.tui-grid-header-area{
height: auto !important;
}
}
.grid-title {
font-weight: 600;
font-size: 16px;
line-height: 24px;
letter-spacing: 0;
color: map-deep-get($config,
#{$theme},
"tui-grid-title-color"
);
}
.grid-toggle-section{
.tui-grid-rside-area{
.tui-grid-body-area {
height: auto !important;
}
}
}
.tui-grid {
&-table {
border: 1px solid;
@ -123,46 +150,29 @@
}
&-body-container{
border-right: 1px solid;
border-right-color: map-deep-get($config,
#{$theme},
"tui-grid-cell-borderColor"
);
border-right: 0;
// position: relative;
width: auto !important;
.tui-grid-table-container{
// width: 100% !important;
.tui-grid-table {
// width: 100% !important;
// table-layout: fixed;
// th, td {
// &:last-child{
// width: auto !important;
// }
// }
}
}
}
&-container,
&-summary-area {
&-summary-area,
&-container {
font-family: Inter;
// color: #000000E0;
& ::-webkit-scrollbar {
width: $scrollbar-width !important;
height: $scrollbar-width !important;
-webkit-appearance: initial;
background-color: map-deep-get($config,
#{$theme},
"scrollbar-track"
) !important;
border-radius: 3px !important;
}
& ::-webkit-scrollbar-track {
background-color: map-deep-get($config,
#{$theme},
"scrollbar-track"
) !important;
}
& ::-webkit-scrollbar-thumb {
width: 50px !important;
height: 50px !important;
background-color: map-deep-get($config, #{$theme}, "scrollbar-thumb");
border-radius: 3px;
}
.tui-grid-cell {
&.tui-grid-cell-summary {
color: map-deep-get($config,
#{$theme},
@ -172,6 +182,32 @@
}
}
&-body-area {
overflow: auto;
&::-webkit-scrollbar {
width: $scrollbar-width !important;
height: $scrollbar-width !important;
-webkit-appearance: initial;
background-color: rgba(0, 0, 0, 0) !important;
border-radius: 3px !important;
// border-right: 1px solid;
// border-right-color: map-deep-get($config, #{$theme}, "tui-grid-cell-borderColor");
}
&::-webkit-scrollbar-track {
background-color: rgba(0, 0, 0, 0) !important;
}
&::-webkit-scrollbar-thumb {
height: 50px !important;
background-color: map-deep-get($config, #{$theme}, "scrollbar-thumb");
border-radius: 3px;
// width: 50px !important;
// background-color: rgba(0, 0, 0, 0);
}
}
&-rside-area {
background-color: map-deep-get($config, #{$theme}, "scrollbar-track");
}
@ -184,6 +220,7 @@
&-scrollbar-right-top {
background-color: rgba(0, 0, 0, 0);
border: none;
display: none;
// background-color: map-deep-get(
// $config,
// #{$theme},
@ -209,13 +246,14 @@
&-scrollbar-right-bottom {
width: $scrollbar-width !important;
height: $scrollbar-width !important;
border-color: map-deep-get($config, #{$theme}, "cardBackground");
background-color: map-deep-get($config, #{$theme}, "cardBackground");
box-sizing: border-box;
// display: none !important;
border-color: map-deep-get($config, #{$theme}, "scrollbar-track");
background-color: map-deep-get($config, #{$theme}, "scrollbar-track");
// border: none !important;
// bottom: -1px;
// right: -2px;
box-sizing: border-box;
// display: none;
}
&-scrollbar-frozen-border,
@ -225,13 +263,9 @@
border-color: transparent !important;
}
// &-body-area {
// overflow: auto !important;
// }
&-body-area,
&-container,
&-layer-state,
&-body-area,
&-summary-area,
&-cell {
background-color: map-deep-get($config,
@ -243,23 +277,36 @@
"tui-grid-border-vertical-color"
);
&-current-row{
td {
.custom-radio {
.radio-mark{
border-color: #1677ff;
background-color: #fff;
&::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
height: 11px;
width: 11px;
border-radius: 50%;
background-color: #1677ff;
}
// &-current-row{
// }
td.row-selected {
.custom-radio {
background-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-color"
);
.radio-mark{
border-color: map-deep-get($config,
#{$theme},
"arow-line-color"
);
background-color: map-deep-get($config,
#{$theme},
"arow-line-btn-bg-color"
);
&::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
height: 8px;
width: 8px;
border-radius: 50%;
background-color: map-deep-get($config,
#{$theme},
"arow-line-color"
);
}
}
}
@ -274,13 +321,13 @@
#{$theme},
"tui-grid-cell-borderColor"
);
.tui-grid-cell-content {
border-right: 1px solid ;
border-right-color: map-deep-get($config,
#{$theme},
"tui-grid-cell-borderColor"
);
}
// .tui-grid-cell-content {
// border-right: 1px solid ;
// border-right-color: map-deep-get($config,
// #{$theme},
// "tui-grid-cell-borderColor"
// );
// }
}
}
@ -291,8 +338,8 @@
&-header-area,
&-cell-header {
// font-family: inherit;
// font-style: Semi Bold;
font-weight: 600;
font-style: Semi Bold;
background-color: map-deep-get($config,
#{$theme},
"tui-grid-header-backgroundColor"
@ -309,8 +356,17 @@
}
&-header-area {
background-color: none;
// background-color: none;
border: none;
margin-right: 0 !important;
background-color: map-deep-get($config,
#{$theme},
"tui-grid-cell-backgroundColor"
);
// width: 100% !important;
// .tui-grid-table {
// width: 100% !important;
// }
}
&-row-odd,
@ -440,6 +496,7 @@
}
&-tree-button-expand {
z-index: 9999;
.tui-grid-btn-tree {
i {
width: 16px;
@ -458,6 +515,7 @@
}
&-tree-button-collapse {
z-index: 9999;
.tui-grid-btn-tree {
i {
width: 16px;

View File

@ -1,4 +1,6 @@
.v-select__custom {
padding: 0.125rem;
&.v-text-field.v-text-field--solo:not(.v-text-field--solo-flat)>.v-input__control>.v-input__slot {
box-shadow: none;
}
@ -42,8 +44,13 @@
legend {
width: 0;
}
.v-select-list {
padding: 0 1rem;
}
}
.v-input__custom {
.v-input__slot {
@ -143,6 +150,11 @@
.v-input {
margin-top: 0 !important;
padding-top: 0 !important;
&.v-text-field--outlined {
fieldset {
top: -4px
}
}
}
.v-input__append-inner {
@ -165,25 +177,27 @@
align-items: center;
cursor: pointer;
position: relative;
padding-left: 28px;
margin: 10px;
padding-left: 0;
margin: 5px;
font-size: 16px;
}
.custom-radio input[type="radio"] {
position: absolute;
opacity: 0;
cursor: pointer;
}
/* Custom radio appearance */
.radio-mark {
position: absolute;
left: 0;
left: -8px;
top: 50%;
transform: translateY(-50%);
height: 18px;
width: 18px;
background-color: white;
border: 2px solid #ccc;
height: 14px;
width: 14px;
// background-color: white;
border: 1px solid #ccc;
border-radius: 50%;
transition: all 0.2s ease;
}
@ -216,11 +230,43 @@
color: #424242 !important;
}
.ant-checkbox {
.ant-checkbox-inner {
border-radius: 4px
}
}
input[type="checkbox"] {
width: 16px;
height: 16px
}
@each $theme in dark, light {
@include theme($theme);
.v-application.#{$theme}-mode {
.ant-checkbox-wrapper {
.ant-checkbox {
.ant-checkbox-inner {
background-color: map-deep-get($config, #{$theme}, "ant-checkbox-bg"); // background for unchecked checkbox
border-color: map-deep-get($config, #{$theme}, "ant-checkbox-border");
}
}
.ant-checkbox-checked {
.ant-checkbox-inner {
background: map-deep-get($config, #{$theme}, "ant-btn-primary-bg"); // background for checked checkbox
border-color:map-deep-get($config, #{$theme}, "ant-btn-primary-bg");
color:map-deep-get($config, #{$theme}, "ant-btn-primary-color");
&.ant-checkbox-inner::after {
border-color: map-deep-get($config, #{$theme}, "ant-btn-primary-color");
}
}
}
}
.v-input-popup__custom {
.v-input__slot {
padding-left: 12px;
@ -233,17 +279,18 @@
}
.v-textarea {
.v-input__slot{
.v-input__slot {
border: map-deep-get($config,
#{$theme},
"v-input-textarea-border"
);
#{$theme},
"v-input-textarea-border"
);
fieldset {
background-color: map-deep-get($config,
#{$theme},
"v-input-textarea-bg"
);
}
}
}
@ -257,9 +304,6 @@
"v-input-backgroundColor"
);
&:not(.v-input--radio-group, .v-input--checkbox) {
.v-input__slot {
background-color: map-deep-get($config,
@ -366,6 +410,24 @@
}
}
}
.radio-mark {
background-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-color"
);
border-color: map-deep-get($config,
#{$theme},
"v-input-textarea-border"
);
}
input[type="checkbox"] {
accent-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-bg"
);
}
}
.v-radio {
@ -390,6 +452,12 @@
.v-input--checkbox {
.v-icon {
transform: none;
&.mdi:before {
font-size: 20px;
}
@if $theme ==dark {
color: rgba(255, 255, 255, 0.6);
}
@ -400,6 +468,9 @@
}
}
.v-textarea {
textarea {
padding: 10px;

View File

@ -63,6 +63,12 @@
line-height: 1.25 !important;
}
.custom-title-7 {
font-size: 0.875rem !important;
font-weight: 400 !important;
line-height: 22px !important;
}
.custom-title-8 {
font-size: 0.75rem !important;
font-weight: 700 !important;
@ -76,15 +82,15 @@
.custom-text-2 {
opacity: 0.6;
font-family: SpoqaHanSansNeo;
font-size: 14px;
font-weight: normal;
font-stretch: normal;
font-style: normal;
line-height: 2.17;
letter-spacing: normal;
text-align: right;
color: #fff;
// font-weight: normal;
// font-stretch: normal;
// font-style: normal;
// letter-spacing: normal;
// text-align: right;
// color: #fff;
// font-family: SpoqaHanSansNeo;
}
.text-color--white-0 {
@ -113,6 +119,14 @@
color: map-deep-get($config, #{$theme}, "h1-title");
}
.custom-subtitle-tab {
font-size: 1.25rem !important;
font-weight: 600 !important;
line-height: 1.25 !important;
color: map-deep-get($config, #{$theme}, "subtitle-tab");
}
.v-dialog {
.custom-title-4 {
font-size: 16px !important;

View File

@ -14,11 +14,22 @@
position: relative;
border-radius: 6px;
border: solid 1px;
height: 40px;
// border-color: #424242;
border-color: map-deep-get($config, #{$theme}, "tui-datepicker-border-color");
height: 32px;
color: map-deep-get($config, #{$theme}, "v-input-fieldset-color") !important;
border-color: currentColor;
// border-color: map-deep-get($config, #{$theme}, "tui-datepicker-border-color");
&:hover {
border-color: map-deep-get($config, #{$theme}, "v-input-fieldset-hover-color" ) !important;
}
&:has(.v-input--is-focused){
border-width: 2px;
}
&.datepicker-large {
height: 40px;
}
.v-input {
// ----------------------

View File

@ -32,8 +32,8 @@ $color: (
"black": ("0": #000,
"1": #111),
"white": ("0": #fff),
"week": ("sun": #fb5a83,
"sat": #2d8cf6)
"week": ("sun": #FF4D4F,
"sat": #597EF7)
);
$config: (
@ -96,22 +96,25 @@ $config: (
v-input-disabled-backgroundColor:rgba(255, 255, 255, 0.08),
v-input-disabled-color: rgba(255, 255, 255, 0.5),
v-select-label-color: rgba(255, 255, 255, 0.85),
v-calendar-weekday-backgroundColor: #383f5d,
v-calendar-weekday-color: #fff,
v-calendar-weekday-border-color: rgba(255, 255, 255, 0.1),
v-calendar-day-color: #fff,
v-calendar-day-in-not-month-color: rgba(255, 255, 255, 0.05),
v-calendar-is-today-background-color: #2d4571,
v-calendar-weekday-backgroundColor: #FFFFFF0A,
v-calendar-weekday-color: #FFFFFFD9,
v-calendar-weekday-border-color: #FFFFFF0F,
v-calendar-day-color: #FFFFFFD9,
v-calendar-day-in-not-month-color: #FFFFFF14,
v-calendar-is-today-background-color: #0A224F,
v-calendar-is-sat: #263EA0,
v-calendar-is-sun:#A61D24,
tui-grid-title-color: #FFFFFFD9,
tui-grid-header-backgroundColor: #2a2b2d,
tui-grid-header-color: #FFFFFFD9,
tui-grid-border-horziontal-color: #212224,
tui-grid-border-vertical-color: #212224,
tui-grid-border-vertical-color: #FFFFFF0F,
tui-grid-cell-backgroundColor: #212224,
tui-grid-cell-color: #fff,
tui-grid-cell-insert-color: #13636c,
tui-grid-cell-color: #FFFFFFD9,
tui-grid-cell-insert-color: #2B2111,
tui-grid-cell-selected-color: #0A224F,
tui-grid-cell-modify-color: #13636c,
tui-grid-cell-removed-color: #f6637b,
tui-grid-cell-removed-color: #2A1215,
tui-grid-cell-disabled-color: rgb(170, 170, 170),
tui-grid-cell-hover-backgroundColor: #2d4571,
v-tabs-items-border-color: #FFFFFF0F,
@ -170,6 +173,14 @@ $config: (
ant-btn-default-border-outlined:#424242,
btn-header-select-bg: #1F1F1F,
btn-header-select-color:#FFFFFFD9,
subtitle-tab: #FFFFFFA6,
v-header-border: #424242,
v-chart-border: #424242,
v-sidebar-border: #303030,
ant-checkbox-bg: #212224,
ant-checkbox-border: #424242,
ant-btn-popup-bg: #212224,
ant-btn-popup-color: #FFFFFFD9,
),
light: (w-g5: $--color-gray_555,
g5-w: $--color-white,
@ -205,7 +216,6 @@ $config: (
router-tab-item-hover-color: #1677ff,
router-tab-slot-end-button-backgroundColor: #3f4d7d,
v-btn-backgroundColor: #1677ff,
// v-btn-backgroundColor: #fff,
v-box: #FFFFFF,
v-banner-border-color: #ddd,
v-treeview-node-root-backgroundColor: #FFFFFF,
@ -232,22 +242,25 @@ $config: (
v-input-disabled-backgroundColor: rgba(0, 0, 0, 0.04),
v-input-disabled-color: rgba(0, 0, 0, 0.25),
v-select-label-color: rgba(0, 0, 0, 0.88),
v-calendar-weekday-backgroundColor: #e0e0e0,
v-calendar-weekday-color: #111,
v-calendar-weekday-border-color: #d4d4d4,
v-calendar-day-color: #111,
v-calendar-day-in-not-month-color: #f8f8f8,
v-calendar-is-today-background-color: #e3eaf3,
v-calendar-weekday-backgroundColor: #00000005,
v-calendar-weekday-color: #000000E0,
v-calendar-weekday-border-color: #0000000F,
v-calendar-day-color: #000000E0,
v-calendar-day-in-not-month-color: #0000000A,
v-calendar-is-today-background-color: #E6F4FF,
v-calendar-is-sat: #597EF7,
v-calendar-is-sun:#FF4D4F,
tui-grid-title-color: #000000E0,
tui-grid-header-backgroundColor: #fafafa, //#e0e0e0,
tui-grid-header-color: rgba(0, 0, 0, 0.88),
tui-grid-border-horziontal-color: #e0e0e0,
tui-grid-border-vertical-color: rgba(0, 0, 0, 0.06), //#d4d4d4,
tui-grid-cell-backgroundColor: #fff,
tui-grid-cell-color: #000000E0,
tui-grid-cell-insert-color: #13636c,
tui-grid-cell-insert-color: #FFFBE6,
tui-grid-cell-selected-color: #E6F4FF,
tui-grid-cell-modify-color: #e6f5f7,
tui-grid-cell-removed-color: #fddde1,
tui-grid-cell-removed-color: #FFF1F0,
tui-grid-cell-hover-backgroundColor: #f5f5f5,
v-tabs-items-border-color: #0000000F,
v-tabs-backgroundColor: #ddd,
@ -304,5 +317,13 @@ $config: (
ant-btn-default-border-outlined:#D9D9D9,
btn-header-select-color:#1F1F1F,
btn-header-select-bg:#FFFFFF,
subtitle-tab: #000000A6,
v-header-border: #D9D9D9,
v-chart-border: #D9D9D9,
v-sidebar-border: #F0F0F0,
ant-checkbox-bg: #FFFFFF,
ant-checkbox-border: #D9D9D9,
ant-btn-popup-bg: #FFFFFF,
ant-btn-popup-color: #000000E0,
),
);

View File

@ -3,45 +3,28 @@
<div class="custom-vc-calender-title text-center" v-if="headerVisible">
<span>{{ selectedYear }} {{ selectedMonth }}</span>
</div>
<vc-calendar
ref="myCalendar"
:attributes="calendarAttributes"
class="custom-calendar"
>
<vc-calendar locale="ko-KR" ref="myCalendar" :attributes="calendarAttributes" class="custom-calendar">
<!-- disable-page-swipe
is-expanded -->
<template v-slot:day-content="{ day, attributes }">
<div class="plusButton" style="overflow:auto">
<!-- <p class="plusButton mr-1" >+</p> -->
<span
:class="['day-label', { 'is-holiday': hldyValues(day.day) }]"
@click="addPlan(day.year, day.month, day.day)"
>{{ day.day }}</span
>
<span :class="['day-label', { 'is-holiday': hldyValues(day.day) }]"
@click="addPlan(day.year, day.month, day.day)">{{ day.day }}</span>
<span v-for="attr in attributes" :key="attr.key" class="day-hldyNm">
{{ attr.customData.title }}
</span>
<div class="">
<p
v-for="attr in attributes"
:key="attr.key"
:class="attr.customData.planColor"
@click="updatePlan(attr.customData.planSeq)"
>
<p v-for="attr in attributes" :key="attr.key" :class="attr.customData.planColor"
@click="updatePlan(attr.customData.planSeq)">
{{ attr.customData.planTitle }}
</p>
</div>
</div>
</template>
</vc-calendar>
<component
ref="planPop"
:is="'PlanPop'"
v-show="false"
:detailList="detailList"
:label="planLabel"
:parentPrgmId="parentPrgmId"
/>
<component ref="planPop" :is="'PlanPop'" v-show="false" :detailList="detailList" :label="planLabel"
:parentPrgmId="parentPrgmId" />
</div>
</template>
<script>
@ -63,6 +46,10 @@ export default {
type: Boolean,
default: true,
},
showTitle: {
type: Boolean,
default: false,
},
},
computed: {
...mapState({
@ -122,7 +109,7 @@ export default {
planColor:
// item.endDt < Utility.setFormatDate(new Date(), 'YYYY-MM-DD')
// ? 'grey':
item.planColor,
item.planColor,
},
dates: new Date(yy, mm, dd),
});
@ -166,15 +153,14 @@ export default {
this.$refs['planPop'].strtDt = '';
this.$refs['planPop'].endDt = '';
this.$refs['planPop'].addPlanData = {
year : year,
month : month,
day : day
year: year,
month: month,
day: day
}
// BEGIN TEST UI
// this.$refs['planPop'].blocId = this.pageData.blocMstrList[
// this.pageData.blocId
// ].blocId;
// END TEST UI
this.$refs['planPop'].blocId = this.pageData.blocMstrList[
this.pageData.blocId
].blocId;
this.$refs['planPop'].dialog = true;
},
updatePlan(val) {
@ -188,7 +174,7 @@ export default {
this.$refs['planPop'].dialog = true;
},
},
mounted() {},
mounted() { },
};
const myDetail = [];
</script>
@ -196,36 +182,44 @@ const myDetail = [];
<style lang="scss" scoped>
@import '@/assets/scss/var.scss';
@import '@/assets/scss/mixin.scss';
::-webkit-scrollbar {
width: 0px;
}
::-webkit-scrollbar-track {
display: none;
}
.custom-vc-calender {
&-title {
margin-bottom: 20px;
}
}
::v-deep {
.custom-calendar.vc-container {
width: 100%;
background-color: transparent;
border: 0;
}
.vc-header,
.vc-arrows-container {
display: none;
}
.vc-weeks {
display: flex;
flex-wrap: wrap;
align-items: center;
padding: 0;
> div {
>div {
flex: 1 0 calc(100% / 7);
}
}
.vc-weekday {
display: flex;
align-items: center;
@ -233,6 +227,7 @@ const myDetail = [];
height: 36px;
padding: 0;
}
.vc-day {
height: 10.889vh;
min-height: auto;
@ -241,6 +236,7 @@ const myDetail = [];
font-size: 1rem;
line-height: 1.235;
}
.day-hldyNm {
overflow: hidden;
text-overflow: ellipsis;
@ -251,25 +247,27 @@ const myDetail = [];
font-size: 10pt;
}
> div {
>div {
position: relative;
height: 100%;
padding: 10px;
border-radius: 0 !important;
}
}
.vc-day.is-not-in-month {
* {
opacity: 1 !important;
}
}
.plusButton:hover > span:first-child {
.plusButton:hover>span:first-child {
font-weight: bolder;
cursor: pointer;
}
.red {
//background-color: rgba(229,62,62,var(--bg-opacity));
background-color: #e53e3e !important;
background-color: #FF4D4F !important;
color: #fff;
border-radius: 0.125rem;
font-size: 0.75rem;
@ -277,9 +275,9 @@ const myDetail = [];
text-align: left;
margin-bottom: 0.25rem;
}
.blue {
//background-color: rgba(66,153,225,var(--bg-opacity));
background-color: #4299e1 !important;
background-color: #597EF7 !important;
color: #fff;
border-radius: 0.125rem;
font-size: 0.75rem;
@ -287,9 +285,9 @@ const myDetail = [];
text-align: left;
margin-bottom: 0.25rem;
}
.puple {
//background-color: rgba(102,126,234,var(--bg-opacity));
background-color: #667eea !important;
background-color: #9254DE !important;
color: #fff;
border-radius: 0.125rem;
font-size: 0.75rem;
@ -297,9 +295,9 @@ const myDetail = [];
text-align: left;
margin-bottom: 0.25rem;
}
.green {
//background-color: rgba(56,178,172,var(--bg-opacity));
background-color: #38b2ac !important;
background-color: #73D13D !important;
color: #fff;
border-radius: 0.125rem;
font-size: 0.75rem;
@ -308,9 +306,9 @@ const myDetail = [];
margin-bottom: 0.25rem;
width: 90%;
}
.orange {
//background-color: rgba(237,137,54,var(--bg-opacity));
background-color: #ed8936 !important;
background-color: #FFA940 !important;
color: #fff;
border-radius: 0.125rem;
font-size: 0.75rem;
@ -318,9 +316,9 @@ const myDetail = [];
text-align: left;
margin-bottom: 0.25rem;
}
.pink {
//background-color: rgba(237,100,166,var(--bg-opacity));
background-color: #ed64a6 !important;
background-color: #F759AB !important;
color: #fff;
border-radius: 0.125rem;
font-size: 0.75rem;
@ -328,8 +326,8 @@ const myDetail = [];
text-align: left;
margin-bottom: 0.25rem;
}
.grey {
background-color: #6d6d6d;
color: #fff;
border-radius: 0.125rem;
font-size: 0.75rem;

View File

@ -61,7 +61,8 @@ export default {
isDarkMode: 'isDarkMode',
chartOption(state) {
var dark_Col = [
'#01AE6A',
'#79B100',
// '#01AE6A',
'#FFB046',
'#F6637B',
'#944FE9',
@ -194,7 +195,8 @@ export default {
var lightCol_dashReadplcStatus = ['#3cc380', '#ffb13b', '#f98694'];
var light_Col = [
'#3CC380',
'#3BAD43',
// '#3CC380',
'#FFB13B',
'#F98694',
'#CF74E5',
@ -351,25 +353,25 @@ export default {
tmpChrtOp.color = light_Col;
}
}
console.log('ops11:',tmpChrtOp)
// console.log('ops11:',tmpChrtOp)
return tmpChrtOp;
},
}),
},
created() {
console.log('wd data:',this.widgetData)
// console.log('wd data:',this.widgetData)
},
methods: {
onClick(event, instance, ECharts) {
console.log('onClick : ', event);
// console.log('onClick : ', event);
this.$emit('click', event);
},
onDblClick(event, instance, ECharts) {
console.log('onDblClick : ', event);
// console.log('onDblClick : ', event);
this.$emit('dblclick', event);
},
onRightClick(event, instance, ECharts) {
console.log('onRightClick : ', event);
// console.log('onRightClick : ', event);
this.$emit('rclick', event);
},
onLegendSelect(params) {

View File

@ -2,26 +2,17 @@
<v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label">
<v-icon
v-if="iconShow"
small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
>
<v-icon v-if="iconShow" small :class="['mr-1', required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
{{ label }}
</label>
</v-col>
<v-col :cols="label ? textCols : ''">
<v-checkbox
v-model="chkValue"
:disabled="disabledFlag"
:readonly="readonly || false"
:required="required || false"
:false-value="false"
:color="isDarkMode ? '#fff' : '#1890ff'"
@change="modifyValue"
></v-checkbox>
<a-checkbox v-model="chkValue" :disabled="disabledFlag" :readonly="readonly || false"
:required="required || false" @change="modifyValue">
</a-checkbox>
</v-col>
</v-row>
</template>
@ -68,10 +59,10 @@ export default {
default: 7,
},
iconShow: {
type: Boolean,
require: false,
default: true
},
type: Boolean,
require: false,
default: true
},
},
data() {
return {
@ -103,7 +94,8 @@ export default {
methods: {
...mapMutations({ setPageData: "setPageData" }),
modifyValue(e) {
return this.setPageData({ [this.valueNm]: e });
const isChecked = e.target.checked;
return this.setPageData({ [this.valueNm]: isChecked });
},
},
};

View File

@ -9,7 +9,7 @@
</label>
</v-col>
<v-col :cols="label ? textCols : ''">
<div class="datepicker-container" >
<div :class="['datepicker-container', customClass]" >
<v-text-field
id="startpicker"
ref="startpicker"
@ -30,7 +30,7 @@
<img :src="arrowIcon" alt="">
</div>
<v-text-field
v-if="isRange"
v-show="isRange"
id="endpicker"
ref="endpicker"
v-model="toDtValue"
@ -47,9 +47,6 @@
</template>
</v-text-field>
</div>
<!-- test -->
<!-- <a-button @click="onOpenDatepicker()">Open</a-button> -->
<!-- end test -->
</v-col>
</v-row>
</template>
@ -96,7 +93,12 @@ export default {
type:Boolean,
require:false,
default: true
}
},
customClass: {
type: String,
require: false,
},
},
data() {
return {
@ -424,7 +426,7 @@ export default {
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/datepicker.scss";
// @import "@/assets/scss/datepicker.scss";
::v-deep {
.tui-timepicker-row {

View File

@ -52,6 +52,7 @@
selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1
"
@update:propsValue="selectTimeValue1 = $event"
customClass="select-large"
/>
<!-- <div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }">~</div> -->
@ -99,6 +100,7 @@
selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1
"
@update:propsValue="selectTimeValue2 = $event"
customClass="select-large"
/>
</div>
</v-col>

View File

@ -4,12 +4,12 @@
:data="chkGridData"
:columns="chkGridColumns"
:options="chkGridOptions"
@focusChange="focusChangeEvt"
@click="startEditing"
@editingFinish="editingFinish"
@dblclick="dblClick"
@mouseover="mouseoverEvent"
@mouseout="mouseoutEvent"
@focusChange="focusChangeEvt"
/>
</template>
<script>
@ -107,16 +107,13 @@ export default {
},
chkGridOptions() {
const options = {
// bodyHeight: 'fitToContent',
scrollX: false,
scrollY: false,
...this.gridData.option,
useIcon: false,
};
options.treeColumnOptions = {
useIcon: false,
...options.treeColumnOptions,
};
return options;
},
defaultRow() {
@ -163,7 +160,7 @@ export default {
},
created() {},
async mounted() {
console.log('--------------DEBUG----gridData: ', this.gridData);
// console.log(this.dataPath);
if (this.gridName) {
this.gridInstance = this.$refs['tuigrid' + this.gridName];
@ -186,13 +183,13 @@ export default {
}),
// true : 현재 행 혹은 연결된 그리드가 수정중인 상태
checkGridState() {
var rowStatList = ['I', 'U', 'D'];
var row = this.gridInstance.invoke('getFocusedCell');
const rowStatList = ['I', 'U', 'D'];
const row = this.gridInstance.invoke('getFocusedCell');
if (row) {
var rowData = this.gridInstance.invoke('getRow', row.rowKey);
const rowData = this.gridInstance.invoke('getRow', row.rowKey);
if (rowData) {
var rowStat = rowData['rowStat'];
const rowStat = rowData['rowStat'];
if (rowStatList.includes(rowStat)) {
return true;
}
@ -200,8 +197,8 @@ export default {
}
if (this.preventFocusChangeEventTargetGridList) {
for (var gridInstance of this.preventFocusChangeEventTargetGridList) {
var dataArr = gridInstance.save();
for (let gridInstance of this.preventFocusChangeEventTargetGridList) {
const dataArr = gridInstance.save();
if (dataArr.length > 0) {
return true;
@ -278,7 +275,7 @@ export default {
}
// console.log('focusChangeEvt2...')
// cell 선택시 row 선택 method
if (e.rowKey >= 0) {
if (e.rowKey > -1) {
this.$emit(
'getRowsData',
this.gridInstance.invoke('getRow', e.rowKey),
@ -293,7 +290,6 @@ export default {
startEditing(e) {
// console.log('startEditing1...')
if (this.preventFocusChangeEvent(e)) {
// console.log('prevent startEditing')
return;
}
@ -305,7 +301,6 @@ export default {
// console.log('startEditing2...')
if (this.editorGrid && e.rowKey >= 0) {
this.editorStartKey = e.rowKey;
// console.log("E::", this.gridInstance.invoke("getRow", e.rowKey));
this.gridInstance.invoke('startEditing', e.rowKey, e.columnName);
this.$emit(
'getRowsData',
@ -611,6 +606,7 @@ export default {
list.map(item => this.gridInstance.invoke('check', item));
},
refreshLayout() {
// console.log("---------DEBUG---refreshLayout: ");
this.gridInstance.invoke('refreshLayout');
},
refreshGrid(){
@ -619,54 +615,52 @@ export default {
var containerEl = this.$refs['tuigrid' + this.gridName].$el;
// var containerEl = document.querySelector('.tui-grid-container')
var parentEl = containerEl.parentElement;
// console.log("containerEl : ",containerEl);
// console.log('parentEl : ', parentEl)
// function refreshLayout(store, containerEl, parentEl) {
var dimension = store.dimension;
var autoWidth = dimension.autoWidth, fitToParentHeight = dimension.fitToParentHeight;
var clientHeight = containerEl.clientHeight, clientWidth = containerEl.clientWidth, scrollTop = containerEl.scrollTop, scrollLeft = containerEl.scrollLeft;
var _a = containerEl.getBoundingClientRect(), top = _a.top, left = _a.left;
this.setOffsetTop(store, top + scrollTop);
// store.dimension.setOffsetTop = top + scrollTop;
this.setOffsetLeft(store, left + scrollLeft);
// store.dimension.headerHeight = left + scrollLeft;
this.setWidth(store, clientWidth, autoWidth);
// store.dimension.autoWidth = autoWidth;
// store.dimension.width = clientWidth;
// console.log("###",getComputedStyle(parentEl));
// console.log("fitToParentHeight : ",fitToParentHeight);
// console.log("parentEl : ",parentEl)
// 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)));
}
// console.log("---------DEBUG---containerEl: ",containerEl);
// console.log('---------DEBUG---parentEl: ', parentEl)
// function refreshLayout(store, containerEl, parentEl) {
var dimension = store.dimension;
var autoWidth = dimension.autoWidth, fitToParentHeight = dimension.fitToParentHeight;
var clientHeight = containerEl.clientHeight, clientWidth = containerEl.clientWidth, scrollTop = containerEl.scrollTop, scrollLeft = containerEl.scrollLeft;
var _a = containerEl.getBoundingClientRect(), top = _a.top, left = _a.left;
this.setOffsetTop(store, top + scrollTop);
// store.dimension.setOffsetTop = top + scrollTop;
this.setOffsetLeft(store, left + scrollLeft);
// store.dimension.headerHeight = left + scrollLeft;
this.setWidth(store, clientWidth, autoWidth);
// store.dimension.autoWidth = autoWidth;
// store.dimension.width = clientWidth;
// console.log("###",getComputedStyle(parentEl));
// console.log("fitToParentHeight : ",fitToParentHeight);
// console.log("parentEl : ",parentEl)
// 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)));
}
// }
},
setOffsetTop(store, offsetTop) {
// console.log("setOffsetTop");
// console.log("---------DEBUG---setOffsetTop: ");
store.dimension.offsetTop = offsetTop;
},
setWidth(_a, width, autoWidth) {
// console.log("setWidth");
// console.log("---------DEBUG---setWidth: ");
var dimension = _a.dimension;
dimension.autoWidth = autoWidth;
dimension.width = width;
},
setHeaderHeight(store, height) {
// console.log("setHeaderHeight")
// console.log("---------DEBUG---setHeaderHeight: ");
store.dimension.headerHeight = height;
},
setOffsetLeft(store, offsetLeft) {
// console.log("setOffsetLeft")
// console.log("---------DEBUG---setOffsetLeft: ");
store.dimension.offsetLeft = offsetLeft;
},
setHeight(_a,height){
// console.log("setHeight");
// console.log("---------DEBUG---setHeight: ");
var dimension = _a.dimension;
var headerHeight = dimension.headerHeight, summaryHeight = dimension.summaryHeight, tableBorderWidth = dimension.tableBorderWidth;
dimension.bodyHeight = height - headerHeight - summaryHeight - tableBorderWidth;
@ -697,17 +691,13 @@ export default {
// resetData() {
// // console.log("resetData = ", this.tuigridProps.data);
// this.$refs.tuigrid.invoke("resetData", this.tuigridProps.data);
// }
// },
},
};
</script>
<style scoped lang="scss">
::v-deep .tui-grid-container {
// .tui-grid-body-area {
// overflow: hidden !important;
// }
.tui-grid-content-area {
.tui-grid-cell-content {
input[type='number'] {

View File

@ -2,12 +2,14 @@
<v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1">mdi-record-circle</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">
<div :class="['datepicker-container', customClass]" >
<v-text-field
id="startpicker"
ref="startpicker"
@ -17,14 +19,16 @@
readonly
outlined
>
<template #append>
<v-icon size="20">$icoCalendar</v-icon>
<template #append >
<v-icon size="20" v-show="!isRange">$icoCalendar</v-icon>
</template>
<template #append-outer>
<div ref="startpicker-container" id="startpicker-container"></div>
</template>
</v-text-field>
<div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }">~</div>
<div v-if="isRange" class="mx-3" :style="{ lineHeight: 0 }">
<img :src="arrowIcon" alt="">
</div>
<v-text-field
v-show="isRange"
id="endpicker"
@ -75,6 +79,10 @@ export default {
require: false,
default: 8,
},
customClass: {
type: String,
require: false,
},
},
data() {
return {
@ -129,6 +137,12 @@ export default {
this.defaultRange === 'no limite'
);
},
arrowIcon() {
if(this.isDarkMode){
return require('@/assets/images/arrow_datepicker_dm.png');
}
return require('@/assets/images/arrow_datepicker.png');
}
},
watch: {
myCmCycle() {

View File

@ -31,8 +31,8 @@ export default {
this.mode = !this.mode;
this.$vuetify.theme.isDark = this.mode;
this.setThemeChange(this.mode);
console.log(this.mode)
console.log(this.$vuetify.theme.isDark)
// console.log(this.mode)
// console.log(this.$vuetify.theme.isDark)
},
},
};

View File

@ -1,23 +1,10 @@
<template>
<div class="d-flex flex-column justify-center align-center">
<!--<v-btn icon tile :ripple="false" @click="btnActionsFnc('addLeftToRight')">
<v-icon>mdi-chevron-right</v-icon>
</v-btn> -->
<a-button type="default" @click="btnActionsFnc('addLeftToRight')">
<RightOutlines/>
<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>
<!--<v-btn
icon
tile
:ripple="false"
class="mt-2"
@click="btnActionsFnc('removeRightToLeft')"
>
<v-icon>mdi-chevron-left</v-icon>
</v-btn> -->
<a-button class="mt-2" type="default" @click="btnActionsFnc('removeRightToLeft')">
<LeftOutlines/>
<a-button @click="btnActionsFnc('addLeftToRight')" type="primary" ghost :icon="icons.add" class="custom-action-btn">
</a-button>
</div>
</template>
@ -40,8 +27,18 @@ export default {
type: Function,
required: true,
},
directionBtn: {
type: String,
default: "horizontally" //horizontally, vertically.
}
},
computed: {
icons() {
return this.directionBtn === "vertically"
? { remove: "up", add: "down" }
: { remove: "left", add: "right" };
},
},
computed: {},
data() {
return {};
},

View File

@ -45,7 +45,7 @@ export default {
size: {
type: String,
require: false,
default: "middle", // small, middle, large
default: "default", // small, default, large
}
},
data() {

View File

@ -10,7 +10,7 @@ export default {
size: {
type: String,
require: false,
default: "middle", // small, middle, large
default: "default", // small, default, large
}
},
methods: {

View File

@ -1,5 +1,5 @@
// Gauge chart options
export default function getGaugeChartOption({ title, value, min = 0, max = 160, unit = '%', isDarkMode = false, backgroundRadius = 97 }) {
export default function getGaugeChartOption({ title, min = 0, max = 160, unit = '%', isDarkMode = false, backgroundRadius = 97 }) {
const colorRanges = isDarkMode
? [
[0.375, '#49AA19'], // Dark Green

View File

@ -2,7 +2,7 @@
export default function getLineChartOption({
xAxisData = [],
seriesData = [],
legendData = [],
// legendData = [],
isDarkMode = false,
}) {
@ -15,7 +15,8 @@ export default function getLineChartOption({
const styledSeries = seriesData.map((item, index) => {
const color = item.color || defaultColors[index % defaultColors.length];
return {
...item,
...item,
showSymbol: true, // Show symbol at each data point
itemStyle: {
color,
},
@ -27,17 +28,17 @@ export default function getLineChartOption({
left: '3%',
right: '5%',
top: '25%',
bottom: '0%',
containLabel: true,
},
legend: {
data: legendData,
// data: legendData,
icon: 'circle',
top: '0%',
right: '5%',
orient: 'horizontal',
textStyle: {
color: isDarkMode ? '#676A7B' : '#676A7B',
color: isDarkMode ? 'white' : '#676A7B',
},
},
xAxis: {

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

@ -12,15 +12,26 @@
</label>
</v-col>
<v-col :cols="item.label ? 7 : ''" >
<v-checkbox
<!-- <v-checkbox
v-model="chkValue"
:disabled="disabledFlag"
:readonly="item.readonly || false"
:required="item.required || false"
:false-value="false"
:color="isDarkMode ? '#fff' : '#1890ff'"
@change="modifyValue"
></v-checkbox>
:color="isDarkMode ? '#1668DC' : '#1890ff'"
@change="modifyValue"
class="small-checkbox"
></v-checkbox> -->
<a-checkbox
v-model="chkValue"
:disabled="disabledFlag"
:readonly="item.readonly || false"
:required="item.required || false"
:false-value="false"
:color="isDarkMode ? '#1668DC' : '#1890ff'"
@change="modifyValue"
>
</a-checkbox>
</v-col>
</v-row>
</template>
@ -141,7 +152,7 @@ export default {
modifyValue(e) {
const dt = {
columnName: this.item.valueNm,
value: e,
value: e.target.checked,
};
this.$emit('gridEditingFinish', dt);
},

View File

@ -125,7 +125,7 @@ export default {
modifyValue(e) {
let val = e.target.value.replace(/[^-.0-9]/g, '');
console.log('val : ', val);
// console.log('val : ', val);
if(this.item.min != undefined && parseFloat(val) < this.item.min){
val = this.item.min;
@ -134,7 +134,7 @@ export default {
if(this.item.max != undefined && parseFloat(val) > this.item.max){
val = this.item.max;
}
console.log('val2 : ', val);
// console.log('val2 : ', val);
this.textValue = val;
// this.textValue = this.validateNumber(val);

View File

@ -17,7 +17,9 @@
:item-text="typeof item.list != 'string' ? 'text' : item.itemText"
:item-value="typeof item.list != 'string' ? 'value' : item.itemValue" outlined :hide-details="true"
class="v-select__custom" :disabled="item.disabled || false" :readonly="item.readonly || false"
:required="item.required || false" @change="modifyValue($event, item.valueNm)" append-icon="">
:required="item.required || false" @change="modifyValue($event, item.valueNm)" append-icon=""
:menu-props="{ top: false, offsetY: true }"
>
<template v-slot:append>
<!-- Custom SVG icon -->

View File

@ -44,8 +44,7 @@
<v-card-title>
<span class="custom-title-4">비밀번호 {{ isPassword }}</span>
</v-card-title>
<v-divider></v-divider>
<v-card-text>
<v-card-text class="pb-4">
<v-col>
<label for="" class="search-box-label">
{{ isPassword }} 비밀번호를 입력하세요
@ -73,12 +72,11 @@
></v-text-field>
</v-col>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-card-actions class="pb-4">
<v-spacer></v-spacer>
<!-- <v-btn color="primary" dark @click="setUpdate()">확인</v-btn> -->
<div>
<a-button @click="close()" class="btn-default">삭제</a-button>
<div class="pr-3">
<a-button @click="close()" class="ant-btn-popup-default">닫기</a-button>
<a-button type="primary" @click="setUpdate()" class="v-btn-add-text">
확인
</a-button>

View File

@ -152,12 +152,12 @@ export default {
const snarData = this.searchParam.isMulti
? this.searchParam.snarInfoList
: this.searchParam.snarInfo;
console.log('this.searchParam.isMulti', this.searchParam.isMulti);
console.log(
'this.searchParam.snarInfoList',
this.searchParam.snarInfoList,
);
console.log('this.searchParam.snarInfo', this.searchParam.snarInfo);
// console.log('this.searchParam.isMulti', this.searchParam.isMulti);
// console.log(
// 'this.searchParam.snarInfoList',
// this.searchParam.snarInfoList,
// );
// console.log('this.searchParam.snarInfo', this.searchParam.snarInfo);
if (Array.isArray(snarData)) {
if (snarData.length > 0) {
for (const item of snarData) {

View File

@ -394,7 +394,7 @@ export default {
params: {},
},
});
console.log('statusCd', statusCd);
// console.log('statusCd', statusCd);
if (statusCd.data.retnCd == 0) {
const params2 = {
simulationId: statusCd.data.dataset.simulId,

View File

@ -22,6 +22,7 @@
<span class="custom-title-4">{{ option.modalTitle }}</span>
<a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
</v-card-title>
<div class="px-6 py-4 pt-0">
<v-row align="center">
<v-col :cols="5">
@ -46,11 +47,10 @@
v-model="searchWord" @keyup.enter="search"><template v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
</template></v-text-field>
</v-col>
<v-spacer></v-spacer>
<v-col cols="3" class="text-right">
<v-col :cols="3" class="text-right">
<a-button icon="search" type="primary" @click="search()"
class="search-button">조회</a-button>
<!-- <v-btn :ripple="false" @click="initSearch()">
@ -59,26 +59,32 @@
</v-col>
</v-row>
</v-col>
<v-col :cols="12">
<div style="height: 50vh;">
<div ref="modalGridParent" class="h100 py-4">
<component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01"
:dataPath="searchParam.pyscModalData.egrpPysclQtyPop" :parentPrgmId="parentPrgmId"
@getRowsData="getRowData" @dblClick="setUpdate($event)" />
</div>
</div>
</v-col>
</v-row>
</div>
<div :style="'height: calc(50vh)'">
<!-- <div style="height: 50vh;">
<div ref="modalGridParent" class="h100 px-6 py-4">
<component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01"
:dataPath="searchParam.pyscModalData.egrpPysclQtyPop" :parentPrgmId="parentPrgmId"
@getRowsData="getRowData" @dblClick="setUpdate($event)" />
</div>
</div>
</div> -->
<v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<!-- <v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)">닫기</v-btn> -->
<!-- <v-btn v-if="item.closeBtnFg || false" :ripple="false" @click="deleteBtnAction($event)">삭제</v-btn> -->
<a-button :ripple="false" @click="setUpdate($event)" class="mr-2">확인</a-button>
<a-button :ripple="false" type="primary" @click="dialogOpenCloseEvent(dialog)"
class="mr-2">닫기</a-button>
<a-button v-if="item.closeBtnFg || false" :ripple="false" icon="delete" type="danger" ghost danger
@click="deleteBtnAction($event)">삭제</a-button>
<a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="mr-2">닫기</a-button>
<a-button v-if="item.closeBtnFg || false" :ripple="false" type="danger" ghost danger
@click="deleteBtnAction($event)" class="mr-2">삭제</a-button>
<a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button>
</v-card-actions>
</v-card>
</v-dialog>
@ -150,23 +156,7 @@ export default {
return {
dialog: false,
loadGrid: true,
dataPathPopExample: {
"rowGrid": {
data: [
{
'calcProc': 'AVG_CNT2',
'argCnt': '2',
'calcDesc': '두개 변수에 대한 평균'
}
],
column: [
{ header: '계산코드', name: 'calcProc', width: 150 },
{ header: '아규먼트갯수', name: 'argCnt', align: 'center', width: 100 },
]
}
},
loadGrid: false,
grid_01: 'grid_01',
myModalKey: 'egrpPysclQtyPop',
modalDataKey: 'pyscModalData',
@ -298,46 +288,39 @@ export default {
},
async setSelectValueList01() {
// form으로 popup 사용할 때 인자로 eqpmKindId, eqpmGrpId 보내줘야한다.
// let res = await this.postApiReturn({
// apiKey: 'selectEqpmGrpCodeList',
// resKey: 'eqpmGrpCodeLists',
// sendParam: {
// eqpmKindId:
// this.item.eqpmKindId != undefined
// ? this.item.eqpmKindId
// : this.searchParam.eqpmKindId,
// },
// // form을 통해 popup을 사용할 경우 -> this.item.eqpmKindId 사용
// // 부모 페이지에서 설비종류인 eqpmKindId 값을 꼭 가져와야한다.
// });
// if (res.length > 0) {
// this.selectValueList01 = await res.map(obj => {
// return {
// text: obj.eqpmGrpNm,
// value: obj.eqpmGrpId,
// };
// });
// // form을 통해 popup을 사용할 경우 -> this.item.eqpmGrpId 사용
// // 부모 페이지에서 설비그룹을 선택한 값이 있다면(eqpmGrpId) 그 값으로 바인딩 아닐 경우 조회한 데이터의 첫번째 값으로 선택
// // console.log('this.item.eqpmGrpId : ', this.item.eqpmGrpId);
// // console.log('this.searchParam.eqpmGrpId : ', this.searchParam.eqpmGrpId);
// this.selectValue01 =
// this.item.eqpmGrpId != undefined
// ? this.item.eqpmGrpId
// : this.searchParam.eqpmGrpId != undefined
// ? this.searchParam.eqpmGrpId
// : this.selectValueList01[0].value;
// } else {
// this.selectValueList01 = [];
// this.selectValue01 = null;
// }
this.selectValueList01 = [
{ label: '냉동기고온', value: '냉동기고온' },
{ label: '냉동기저온', value: '냉동기저온' },
{ label: '공조기', value: '공조기' },
{ label: '보일러', value: '보일러' }
];
let res = await this.postApiReturn({
apiKey: 'selectEqpmGrpCodeList',
resKey: 'eqpmGrpCodeLists',
sendParam: {
eqpmKindId:
this.item.eqpmKindId != undefined
? this.item.eqpmKindId
: this.searchParam.eqpmKindId,
},
// form을 통해 popup을 사용할 경우 -> this.item.eqpmKindId 사용
// 부모 페이지에서 설비종류인 eqpmKindId 값을 꼭 가져와야한다.
});
if (res.length > 0) {
this.selectValueList01 = await res.map(obj => {
return {
text: obj.eqpmGrpNm,
value: obj.eqpmGrpId,
};
});
// form을 통해 popup을 사용할 경우 -> this.item.eqpmGrpId 사용
// 부모 페이지에서 설비그룹을 선택한 값이 있다면(eqpmGrpId) 그 값으로 바인딩 아닐 경우 조회한 데이터의 첫번째 값으로 선택
// console.log('this.item.eqpmGrpId : ', this.item.eqpmGrpId);
// console.log('this.searchParam.eqpmGrpId : ', this.searchParam.eqpmGrpId);
this.selectValue01 =
this.item.eqpmGrpId != undefined
? this.item.eqpmGrpId
: this.searchParam.eqpmGrpId != undefined
? this.searchParam.eqpmGrpId
: this.selectValueList01[0].value;
} else {
this.selectValueList01 = [];
this.selectValue01 = null;
}
},
search() {
this.getGridData();
@ -359,7 +342,7 @@ export default {
modalDataKey: this.modalDataKey,
value: Object.assign(
// Utility.defaultGridOption(this.$refs.modalGridParent.offsetHeight - 60, myOptions),
// Utility.defaultGridOption(100, myOptions),
Utility.defaultGridOption(400, myOptions),
myOptions,
),
});
@ -388,44 +371,44 @@ export default {
this.loadGrid = false;
let res = [];
// res = await this.postApiReturn({
// apiKey: 'selectEgrpPysclQtyPop',
// resKey: 'egrpPysclQtyData',
// sendParam: {
// searchWord: this.searchWord,
// eqpmGrpId: this.selectValue01,
// openMode: this.item.openMode,
// },
// });
// let newRes = [];
// let tempTagList = this.pyscPopVal.split('/*wq2a/');
// let tagList = tempTagList.filter(item => item != '');
// if (tagList.length > 0) {
// newRes = res.filter(item => {
// return !tagList.includes(item.pysclQtyId);
// });
// res = newRes;
// }
// //이미 선택된 값들 제거(배열)
// if (this.item.dataList) {
// if (this.item.dataList.length > 0) {
// newRes = res.filter(item => {
// return !this.item.dataList.includes(item.pysclQtyId);
// });
// res = newRes;
// }
// }
res = [
{
'pysclQtyId': 'PYSCL00001',
'pysclQtyCd': 'AMP_1A',
'pysclQtyNm': '회로1 전류A',
'pysclQtyTpNm': 'TAG'
res = await this.postApiReturn({
apiKey: 'selectEgrpPysclQtyPop',
resKey: 'egrpPysclQtyData',
sendParam: {
searchWord: this.searchWord,
eqpmGrpId: this.selectValue01,
openMode: this.item.openMode,
},
});
let newRes = [];
let tempTagList = this.pyscPopVal.split('/*wq2a/');
let tagList = tempTagList.filter(item => item != '');
if (tagList.length > 0) {
newRes = res.filter(item => {
return !tagList.includes(item.pysclQtyId);
});
res = newRes;
}
//이미 선택된 값들 제거(배열)
if (this.item.dataList) {
if (this.item.dataList.length > 0) {
newRes = res.filter(item => {
return !this.item.dataList.includes(item.pysclQtyId);
});
res = newRes;
}
]
}
// res = [
// {
// 'pysclQtyId' : 'PYSCL00001',
// 'pysclQtyCd' : 'AMP_1A',
// 'pysclQtyNm' : '회로1 전류A',
// 'pysclQtyTpNm' : 'TAG'
// }
// ]
this.setModalGridData({
modalKey: this.myModalKey,
gridKey: this.grid_01,
@ -480,10 +463,10 @@ export default {
this.dialog = flag;
},
async dialogOpenCloseEvent(val) {
// await this.setSelectValueList01();
// if (!this.myBindingData) {
// return alert('그리드를 먼저 선택해주세요.');
// }
await this.setSelectValueList01();
if (!this.myBindingData) {
return alert('그리드를 먼저 선택해주세요.');
}
this.dialog = !val;
},
deleteBtnAction(v) {

View File

@ -58,7 +58,7 @@
<div class="pa-5">
<!-- <v-text-field label="위치정보 선택"></v-text-field> -->
<v-row align="center" no-gutters>
<v-col :cols="label ? 3 : ''">
<v-col :cols="label ? 3 : ''" class="pr-3" >
<component
:is="'selectCodeList'"
:parentPrgmId="parentPrgmId"
@ -66,41 +66,66 @@
dataKey="searchElecContKind"
:sendParam="{ commGrpCd: 'EM_CONT', useFg: '1' }"
:addAll="true"
:customClass="'select-large'"
/>
</v-col>
<v-col :cols="label ? 3 : ''">
<v-col :cols="label ? 3 : ''" class="pr-3" >
<component
:is="'selectCodeList'"
:parentPrgmId="parentPrgmId"
:label="'전압구분'"
dataKey="searchVoltKind"
:sendParam="{ commGrpCd: 'EM_VOLT_KIND', useFg: '1' }"
:customClass="'select-large'"
:addAll="true"
/>
</v-col>
<v-col :cols="label ? 3 : ''">
<v-col :cols="label ? 3 : ''" class="pr-3" >
<component
:is="'selectCodeList'"
:parentPrgmId="parentPrgmId"
:label="'전압구분'"
dataKey="searchOptKind"
:sendParam="{ commGrpCd: 'EM_VOLT_OPT', useFg: '1' }"
:customClass="'select-large'"
:addAll="true"
/>
</v-col>
<v-col cols="3" class="text-right">
<v-btn
<div style="height: 25px"></div>
<!-- <v-btn
v-if="!searchParam.isMulti"
:ripple="false"
@click="search()"
>검색</v-btn
> -->
<a-button
v-if="!searchParam.isMulti"
type="primary"
class="mr-1"
icon="search"
:ripple="false"
@click="search"
style="height: 40px"
>
<v-btn
검색
</a-button>
<!-- <v-btn
v-if="!searchParam.isMulti"
:ripple="false"
@click="initVal()"
>초기화</v-btn
> -->
<a-button
v-if="!searchParam.isMulti"
type="primary"
class="mr-1"
:ripple="false"
@click="initVal"
style="height: 40px"
>
초기화
</a-button>
</v-col>
</v-row>
</div>
@ -310,7 +335,11 @@ export default {
},
// 공정/설비 트리 그리드 세팅
gridInit() {
const myOptions = {};
const myOptions = {
header: {
height: 38,
},
};
this.setModalGridOption({
modalKey: this.myModalKey,
gridKey: this.gridName,
@ -606,11 +635,11 @@ const myColumns = [
{ header: '전력계약 ID', name: 'eleclContId', hidden: true},
{ header: '전력계약 명', name: 'eleclContNm', hidden: true},
{ header: '전력계약구분CD', name: 'elecContKind', hidden: true},
{ header: '전력계약구분', name: 'elecContKindNm', align: 'center'},
{ header: '전력계약구분', name: 'elecContKindNm', align: 'left'},
{ header: '전압구분CD', name: 'voltKind', hidden: true },
{ header: '전압구분', name: 'voltKindNm', align: 'center' },
{ header: '전압구분', name: 'voltKindNm', align: 'left' },
{ header: '옵션CD', name: 'optKind', hidden: true },
{ header: '옵션', name: 'optKindNm', align: 'center' },
{ header: '옵션', name: 'optKindNm', align: 'left' },
{
header: '기본요금(원/kW)',
name: 'baseChrg',
@ -620,7 +649,7 @@ const myColumns = [
},
},
{ header: '시간대CD', name: 'peakKind', hidden: true },
{ header: '시간대', name: 'peakKindNm', align: 'center' },
{ header: '시간대', name: 'peakKindNm', align: 'left' },
{
header: '여름철(6~8월)',
name: 'unitPrcSum',

View File

@ -119,8 +119,7 @@
/>
</div> -->
<v-card-actions>
<v-spacer></v-spacer>
<v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<a-button color="primary" type="primary" @click="closePop()">확인</a-button>
</v-card-actions>
</v-card>
@ -275,7 +274,12 @@ export default {
// const gridHeight = this.$refs.gridParent.offsetHeight - 30;
const myOptions = {
rowHeaders: ['rowNum'],
rowHeaders: [
{
type: 'rowNum',
align: 'right',
},
],
columnOptions: {
resizable: true,
minWidth: 100
@ -319,19 +323,19 @@ export default {
header: '주의',
width: 100,
name: 'careStndVal',
align: 'center'
align: 'right'
},
{
header: '경고',
width: 100,
name: 'warnStndVal',
align: 'center'
align: 'right'
},
{
header: '가이드값',
width: 100,
name: 'totVal',
align: 'center'
align: 'right'
},
{
header: '알람내용',

View File

@ -37,6 +37,7 @@
:itemList="selectValueList01"
:label="'대상월'"
@update:propsValue="selectValue01 = $event"
customClass="select-large"
/>
</v-col>
<v-col :cols="5.5" class="mr-2">
@ -49,9 +50,10 @@
:itemList="selectValueList02"
:label="'전년대비절감율'"
@update:propsValue="selectValue02 = $event"
customClass="select-large"
/>
</v-col>
<a-button color="primary" dark @click="search()" icon="clock-circle" >
<a-button class="ant-btn-popup-default" color="primary" dark @click="search()" icon="check-circle" size="large">
<!-- <template #icon>
<ClockCircleOutlined />
</template> -->
@ -65,13 +67,10 @@
<!-- <div id="chartParent" ref="chartParent" style="height: 100px"> -->
<div :style="'height: calc(50vh)'">
<div class="d-flex align-center justify-space-between pa-4" style="height: 10%">
<v-card-title class="pa-0 custom-title-4">사용량 계획</v-card-title>
</div>
<!-- <div id="chartParent" ref="chartParent" :style="'height: 80%'"> -->
<div id="chartParent" ref="chartParent" style="height: 70%">
<div id="chartParent" ref="chartParent" style="height: 100%" class="px-6">
<component
class="w100 h100"
class="w100 h100 py-7 custom-chart"
:is="loadChart ? 'Chart' : null"
:parentPrgmId="parentPrgmId"
:modalId="modalId"
@ -130,9 +129,8 @@
/>
</div> -->
<v-divider></v-divider>
<v-card-actions class="pa-5 d-flex align-center justify-end">
<a-button color="primary" type="default" class="mr-2" dark @click="closePop()">취소</a-button>
<a-button color="primary" class="mr-2 ant-btn-popup-default" dark @click="closePop()">취소</a-button>
<a-button color="primary" type="primary" dark @click="setUpdate()">확정</a-button>
</v-card-actions>
</v-card>
@ -318,7 +316,7 @@ export default {
// }
},
mounted(){
this.initTest(); return;
// this.initTest(); return;
},
methods: {
...mapMutations({
@ -478,10 +476,6 @@ export default {
// })
},
async setChart(){
// test
this.initTestChart(); return;
// end test
this.loadChart = false;
let xAxisData = [];
let seriesData = [];
@ -537,7 +531,7 @@ export default {
seriesData = data.map(item => ({
name: item.gubun == '2PLAN' ? '계획' : '전년실적',
type: item.gubun == '2PLAN' ? 'line' : 'bar',
data: targetMonthList.map(obj => item[obj] || null)
data: targetMonthList.map(obj => item[obj] || null),
// data: targetMonthList.map(obj => item[obj] || 0)
}));
this.nowSeriesData = seriesData;
@ -562,7 +556,6 @@ export default {
series: seriesData,
tooltip: tooltipData
};
// console.log('option', option);
await this.$nextTick(() => {
});
@ -605,7 +598,6 @@ export default {
sData2 = nowSeriesData.filter(item => {
return item.name == '계획';
})[0]['data'];
// console.log('sData1', sData);
if(targetMonth.includes('qty')){
targetMonth = parseInt(targetMonth.slice(-2));
}
@ -614,13 +606,11 @@ export default {
sData2[i] = sData[i] * targetRatio;
}
}
// console.log('sData2', sData2);
seriesData = nowSeriesData.map(item => ({
...item,
data: item.name == '계획' ? sData2 : item.data
}));
// console.log('seriesData', seriesData);
await this.$nextTick(() => {
});
@ -647,4 +637,4 @@ let modifyEnrgUsePlanModalDataKey =
modifyEnrgUsePlanChart: Utility.defaultChartOption(true)
};
// 전력량 요금(원/kWh)
</script>
</script>

View File

@ -2,12 +2,8 @@
<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
:class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
>
<v-icon v-if="item.iconShow" small
:class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
{{ option.labelContent }}
</label>
</v-col>
@ -30,9 +26,9 @@
<div class="pa-6 pt-0">
<v-row align="center">
<v-col :cols="5">
<component :is="'SelectBox'" ref="SelectBox1" :labelCols="12" :textCols="12" :iconShow="true"
:propsValue="selectValue01" :itemList="selectValueList01" :label="'설비그룹'"
@update:propsValue="selectValue01 = $event" :readonly="item.openMode == undefined
<component :is="'SelectBox'" ref="SelectBox1" :labelCols="12" :textCols="12"
:iconShow="true" :propsValue="selectValue01" :itemList="selectValueList01"
:label="'설비그룹'" @update:propsValue="selectValue01 = $event" :readonly="item.openMode == undefined
? openMode
: item.openMode == 'ALL'
? false
@ -47,14 +43,14 @@
물리량명
</label>
</v-col>
<v-col :cols="9"> <v-text-field append-icon="" class="v-input__custom"
outlined :hide-details="true" v-model="searchWord"
@keyup.enter="search"><template v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
<v-col :cols="9"> <v-text-field append-icon="" class="v-input__custom" outlined
:hide-details="true" v-model="searchWord" @keyup.enter="search"><template
v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
</template></v-text-field></v-col>
</template></v-text-field></v-col>
<v-spacer></v-spacer>
<v-col cols="3" class="text-right">
<a-button icon="search" type="primary" @click="search()"
@ -76,9 +72,9 @@
</div>
</div>
<v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<a-button :ripple="false" @click="setUpdate($event)" class="mr-2">확인</a-button>
<a-button :ripple="false" type="primary" @click="dialogOpenCloseEvent(dialog)"
class="mr-2">닫기</a-button>
<a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="mr-2">닫기</a-button>
<a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button>
</v-card-actions>
</v-card>
</v-dialog>
@ -274,36 +270,30 @@ export default {
this.gridInit();
},
async setSelectValueList01() {
// let res = await this.postApiReturn({
// apiKey: 'selectEqpmGrpCodeList',
// resKey: 'eqpmGrpCodeLists',
// sendParam: { eqpmKindId: this.searchParam.eqpmKindId },
// // 부모 페이지에서 설비종류인 eqpmKindId 값을 꼭 가져와야한다.
// });
// if (res.length > 0) {
// this.selectValueList01 = await res.map(obj => {
// return {
// text: obj.eqpmGrpNm,
// value: obj.eqpmGrpId,
// };
// });
// // 부모 페이지에서 설비그룹을 선택한 값이 있다면(eqpmGrpId) 그 값으로 바인딩 아닐 경우 조회한 데이터의 첫번째 값으로 선택
// this.selectValue01 =
// this.searchParam.eqpmGrpId != undefined
// ? this.searchParam.eqpmGrpId
// : this.selectValueList01[0].value;
// // this.selectValue01 = this.selectValueList01[0].value;
// } else {
// this.selectValueList01 = [];
// this.selectValue01 = null;
// }
let res = await this.postApiReturn({
apiKey: 'selectEqpmGrpCodeList',
resKey: 'eqpmGrpCodeLists',
sendParam: { eqpmKindId: this.searchParam.eqpmKindId },
// 부모 페이지에서 설비종류인 eqpmKindId 값을 꼭 가져와야한다.
});
if (res.length > 0) {
this.selectValueList01 = await res.map(obj => {
return {
text: obj.eqpmGrpNm,
value: obj.eqpmGrpId,
};
});
// 부모 페이지에서 설비그룹을 선택한 값이 있다면(eqpmGrpId) 그 값으로 바인딩 아닐 경우 조회한 데이터의 첫번째 값으로 선택
this.selectValue01 =
this.searchParam.eqpmGrpId != undefined
? this.searchParam.eqpmGrpId
: this.selectValueList01[0].value;
// this.selectValue01 = this.selectValueList01[0].value;
} else {
this.selectValueList01 = [];
this.selectValue01 = null;
}
this.selectValueList01 = [
{ label: '냉동기고온', value: '냉동기고온' },
{ label: '냉동기저온', value: '냉동기저온' },
{ label: '공조기', value: '공조기' },
{ label: '보일러', value: '보일러' }
];
},
search() {
this.getGridData();
@ -341,34 +331,26 @@ export default {
},
async getGridData() {
this.loadGrid = false;
// let res = [];
// let res = await this.postApiReturn({
// apiKey: 'selectEqpmBaseInfoPop',
// resKey: 'epqmBaseInfoData',
// sendParam: {
// eqpmGrpId: this.selectValue01,
// searchWord: this.searchWord,
// // openMode : this.item.openMode == undefined ? this.openMode : this.item.openMode
// },
// });
// // grid와 popup eqpmId 값 중복되는 것 제거하는 로직 - 시작
// let newRes = [];
// if (this.bindingGridEqpmIdList.length > 0) {
// newRes = res.filter(item => {
// return !this.bindingGridEqpmIdList.includes(item.eqpmId);
// });
// res = newRes;
// }
let res = await this.postApiReturn({
apiKey: 'selectEqpmBaseInfoPop',
resKey: 'epqmBaseInfoData',
sendParam: {
eqpmGrpId: this.selectValue01,
searchWord: this.searchWord,
// openMode : this.item.openMode == undefined ? this.openMode : this.item.openMode
},
});
// grid와 popup eqpmId 값 중복되는 것 제거하는 로직 - 시작
let newRes = [];
if (this.bindingGridEqpmIdList.length > 0) {
newRes = res.filter(item => {
return !this.bindingGridEqpmIdList.includes(item.eqpmId);
});
res = newRes;
}
// grid와 popup eqpmId 값 중복되는 것 제거하는 로직 - 끝
const res = [
{
'eqpmId': 'PYSCL00001',
'eqpmNm': 'AMP_1A',
}
]
this.setModalGridData({
modalKey: this.myModalKey,
gridKey: this.gridName,
@ -441,9 +423,9 @@ export default {
// this.dialog = false;
// return;
// }
// if (this.myBindingData.length <= 0) {
// return alert('설비상세 리스트를 먼저 선택해주세요.');
// }
if (this.myBindingData.length <= 0) {
return alert('설비상세 리스트를 먼저 선택해주세요.');
}
this.dialog = !val;
},
},
@ -481,7 +463,7 @@ var eqpmBaseInfoPop = {
// .v-dialog {
// .v-card {
// &__title {
// @if $theme ==dark {
// background-color: #2d3355;

View File

@ -5,7 +5,7 @@
<v-icon
v-if="iconShow"
small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
:class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
>
{{ option.labelContent }}
@ -36,7 +36,7 @@
계산설명
</label>
</v-col>
<v-col :cols="10" class="mr-4 py-0" >
<v-col :cols="11" class="pr-8 py-0" >
<v-text-field append-icon="" class="v-input__custom" outlined
:hide-details="true" v-model="searchWord" @keyup.enter="search"><template v-slot:append>
<!-- Custom SVG icon -->
@ -45,7 +45,7 @@
</template></v-text-field>
</v-col>
<v-col cols="1" class="py-0">
<v-col cols="1" class="py-0" style="display: flex; justify-content: flex-end;">
<a-button icon="search" type="primary" @click="search()" class="search-button">조회</a-button>
<!-- <v-btn :ripple="false" @click="initSearch()">
초기화
@ -63,10 +63,8 @@
</div>
</div>
<v-card-actions class="pa-5 d-flex align-center justify-end">
<!-- <v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)">닫기</v-btn> -->
<a-button :ripple="false" @click="setUpdate($event)" class="mr-2">확인</a-button>
<a-button :ripple="false" type="primary" @click="dialogOpenCloseEvent(dialog)">닫기</a-button>
<a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="mr-2">닫기</a-button>
<a-button :ripple="false" type="primary" @click="setUpdate($event)" >확인</a-button>
</v-card-actions>
</v-card>
</v-dialog>
@ -306,38 +304,22 @@ export default {
},
async getGridData() {
this.loadGrid = false;
// let res = await this.postApiReturn({
// apiKey: 'selectEqpmCalcPop',
// resKey: 'eqpmCalcPopData',
// sendParam: {
// calcDescLike: this.searchWord,
// openMode: this.item.openMode != undefined ? this.item.openMode : this.openMode
// },
// });
// if (this.myBindingData['calcProc'] != '' || this.myBindingData['calcProc'] != null || this.myBindingData['calcProc'] != undefined) {
// let newRes = [];
// newRes = res.filter(item => {
// return item.calcProc != this.myBindingData['calcProc']
// });
// res = newRes;
// }
const res = [
{
'calcProc': 'AVG_CNT2',
'argCnt': '2',
'calcDesc': '두개 변수에 대한 평균'
let res = await this.postApiReturn({
apiKey: 'selectEqpmCalcPop',
resKey: 'eqpmCalcPopData',
sendParam: {
calcDescLike: this.searchWord,
openMode: this.item.openMode != undefined ? this.item.openMode : this.openMode
},
{ 'calcProc': 'PROC001', argCnt: 2, 'calcDesc': '덧셈 연산' },
{ 'calcProc': 'PROC002', argCnt: 1, 'calcDesc': '제곱 연산' },
{ 'calcProc': 'PROC003', argCnt: 2, 'calcDesc': '곱셈 연산' },
{ 'calcProc': 'PROC004', argCnt: 1, 'calcDesc': '루트 연산' },
{ 'calcProc': 'PROC005', argCnt: 3, 'calcDesc': '최대값 계산' },
{ 'calcProc': 'PROC006', argCnt: 3, 'calcDesc': '최소값 계산' },
]
});
if (this.myBindingData['calcProc'] != '' || this.myBindingData['calcProc'] != null || this.myBindingData['calcProc'] != undefined) {
let newRes = [];
newRes = res.filter(item => {
return item.calcProc != this.myBindingData['calcProc']
});
res = newRes;
}
this.setModalGridData({
modalKey: this.myModalKey,
gridKey: this.grid_01,

View File

@ -1,6 +1,6 @@
<template>
<v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols">
<v-col v-if="label" :cols="labelCols" class="mr-2">
<label for="" class="search-box-label">
<v-icon v-if="iconShow" small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
@ -8,62 +8,64 @@
</label>
</v-col>
<v-col :cols="textCols">
<v-text-field readonly append-icon="" :class="['v-input__custom', customClass]"
<v-text-field readonly v-model="selectValue" append-icon="" :class="['v-input__custom', customClass]"
@click="dialogOpenCloseEvent(dialog)" outlined :hide-details="true" :required="required || false"
:disabled="disabled || false"><template v-slot:append>
:disabled="disabled || false"
:placeholder="placeholder"
>
<template v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
</template></v-text-field>
</template>
</v-text-field>
</v-col>
<v-dialog ref="popModal" v-model="dialog" width="800" overlay-color="#000" overlay-opacity="0.8" scrollable>
<v-card style="height: 100%">
<v-dialog ref="popModal" v-model="dialog" width="800" content-class="custom-dialog" scrollable>
<v-card style="height: 100%;">
<v-card-title class="px-5 py-4 d-flex align-center justify-space-between">
<span class="custom-title-4">설비 선택</span>
<a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
</v-card-title>
<div class="pa-2 pt-0">
<v-card class="searchFilter">
<v-row align="end">
<v-col :cols="3.5">
<!-- 설비그룹 -->
<component :is="'SelectBox'" :propsValue="selectValue01" :itemList="selectValueList01"
:label="'설비그룹'" :disabled="eqpmGrpDisabled"
@update:propsValue="selectValue01 = $event" :labelCols="12" :textCols="12"
:iconShow="true" />
</v-col>
<v-col :cols="3.5">
<!-- FAB -->
<component :is="'SelectBoxMulti'" :propsValue="selectValue02"
:itemList="selectValueList02" :label="'FAB'" :labelCols="12" :multiple="true"
:disabled="fabDisabled" @update:propsValue="selectValue02 = $event" :textCols="12"
:iconShow="true" />
</v-col>
<v-col :cols="3.5">
<v-row>
<v-col :cols="12" class="py-0">
<label for="" class="search-box-label">
<v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
설비명
</label>
</v-col>
<v-col :cols="12" class="pt-0">
<v-text-field append-icon="" class="v-input__custom" outlined
:hide-details="true" v-model="searchWord" @keyup.enter="search"><template
v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
<div class="px-5 pt-2">
<!-- <v-card class="searchFilter">
</v-card> -->
<v-row align="end">
<v-col :cols="3.5">
<!-- 설비그룹 -->
<component :is="'SelectBox'" :propsValue="selectValue01" :itemList="selectValueList01"
:label="'설비그룹'" :disabled="eqpmGrpDisabled" @update:propsValue="selectValue01 = $event"
:labelCols="12" :textCols="12" :iconShow="true" />
</v-col>
<v-col>
<!-- FAB -->
<component :is="'SelectBoxMulti'" :propsValue="selectValue02" :itemList="selectValueList02"
:label="'FAB'" :labelCols="12" :multiple="true" :disabled="fabDisabled"
@update:propsValue="selectValue02 = $event" :textCols="12" :iconShow="true" />
</v-col>
<v-col >
<v-row>
<v-col :cols="12" class="py-0">
<label for="" class="search-box-label">
<v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
설비명
</label>
</v-col>
<v-col :cols="12" class="pt-0">
<v-text-field append-icon="" class="v-input__custom" outlined :hide-details="true"
v-model="searchWord" @keyup.enter="search"><template v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
</template></v-text-field>
</v-col>
</template></v-text-field>
</v-col>
</v-row>
</v-col>
<a-button icon="search" type="primary" @click="search()" class="search-button">조회</a-button>
</v-row>
</v-col>
<v-col :cols="2" class="last-col mr-2">
<a-button icon="search" :ripple="false" type="primary" @click="search()"
class="search-button">조회</a-button>
</v-col>
</v-row>
</v-card>
</v-row>
<!-- <v-row align="center" no-gutters style="margin-top: 14px;">
<v-col :cols="1">
@ -77,14 +79,20 @@
:hide-details="true" v-model="searchWord" @keyup.enter="search"></v-text-field>
</v-col>
</v-row> -->
<!-- <v-row>
<v-col :col="12">
</v-col>
</v-row> -->
</div>
<div class="px-5" style="height:429px;">
<div ref="modalGridParent" class="w100 h100">
<div class="pa-5" style="height:calc(100% - 30px)">
<div ref="modalGridParent" class="h100 w100">
<component :ref="gridName" :is="loadGrid ? 'Grid' : null"
:dataPath="searchParam.eqpmSelectPopData.eqpmSelectPop" :gridName="gridName"
:parentPrgmId="parentPrgmId" @getRowsData="getRowData" />
</div>
</div>
<v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="mr-2">닫기</a-button>
<a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button>
@ -117,6 +125,11 @@ export default {
require: false,
default: '전력 계약 정보',
},
placeholder: {
type: String,
require: false,
default: '',
},
valueNm: {
type: String,
require: false,
@ -251,7 +264,7 @@ export default {
},
chkDialog() {
if (this.isMulti) {
this.$store.state.pageData[this.parentPrgmId][this.modalDataKey][this.myModalKey][this.gridName].option.rowHeaders = [{ type: 'checkbox' }];
this.$store.state.pageData[this.parentPrgmId][this.modalDataKey][this.myModalKey][this.gridName].option.rowHeaders = [{ type: 'checkbox', width: 72 }];
} else {
this.$store.state.pageData[this.parentPrgmId][this.modalDataKey][this.myModalKey][this.gridName].option.rowHeaders = [];
}
@ -391,8 +404,8 @@ export default {
rowHeight: 'auto',
};
if (this.isMulti) {
// myOptions['rowHeaders'] = [{ type: 'checkbox' }];
// myOptions['rowHeight'] = 'auto';
myOptions['rowHeaders'] = [{ type: 'checkbox' }];
myOptions['rowHeight'] = 'auto';
}
@ -418,18 +431,15 @@ export default {
{
header: 'FAB',
name: 'fabNm',
align: 'center'
},
{
header: '설비ID',
name: 'eqpmId',
align: 'center',
name: 'eqpmId'
// hidden:true
},
{
header: '설비명',
name: 'eqpmNm',
align: 'center'
name: 'eqpmNm'
},
{
header: 'eccId',
@ -518,7 +528,6 @@ export default {
this.getChecked();
}
});
},
setUpdate() {
if (this.isMulti) {
@ -569,3 +578,16 @@ var eqpmSelectPop = {
}
</script>
<style lang="scss" scoped>
::v-deep {
.last-col {
flex-basis: content;
}
.v-dialog {
overflow-y: hidden;
}
}
</style>

View File

@ -286,8 +286,8 @@ export default {
// Row selection config
rowSelection: {
onChange: (selectedRowKeys, selectedRows) => {
console.log('Selected Row Keys:', selectedRowKeys);
console.log('Selected Rows:', selectedRows);
// console.log('Selected Row Keys:', selectedRowKeys);
// console.log('Selected Rows:', selectedRows);
},
}
};
@ -332,7 +332,7 @@ export default {
// this.getRowGridData();
// },
searchFab() {
console.log('tttttttttttt')
// console.log('tttttttttttt')
// this.filteredData = this.data.filter(item => {
// const matchGrp = this.eqpmGrpSelected ? item.group === this.eqpmGrpSelected : true;
// const matchFab = this.localFabSelected ? item.fab === this.localFabSelected : true;

View File

@ -1,5 +1,5 @@
<template>
<v-row class="search-box" align="center">
<v-row class="search-box no-gutters" align="center">
<v-col :cols="option.labelCols" class="py-0">
<label for="" class="search-box-label">
<v-icon v-if="item.iconShow" small
@ -7,12 +7,13 @@
{{ option.labelContent }}
</label>
</v-col>
<v-col :cols="option.textCols">
<v-text-field readonly v-model="selectValue" append-icon="mdi-magnify"
:class="['v-select__custom', customClass]"
@click="dialogOpenCloseEvent(dialog)" outlined :hide-details="true"
:required="item.required || false"></v-text-field>
<!-- :disabled="item.disabled || false" -->
<v-col :cols="option.textCols" class="py-0">
<v-text-field readonly append-icon="" :class="['v-select__custom', customClass]" outlined :hide-details="true"
v-model="selectValue" @keyup.enter="typeEnterKey" @click="dialogOpenCloseEvent(dialog)" style="padding: 0;"
:required="item.required || false"><template v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
</template></v-text-field>
</v-col>
<v-dialog v-model="dialog" scrollable width="1000px">
@ -21,10 +22,10 @@
<span class="custom-title-4">{{ option.modalTitle }}</span>
<v-icon @click="dialogOpenCloseEvent(dialog)">mdi-close</v-icon>
</v-card-title>
<v-row align="end" class="pa-5" no-gutters>
<v-row align="end" class="px-5 pb-3" no-gutters>
<v-col :cols="2.5" class="mr-2">
<v-row>
<v-col :cols="2">
<v-col :cols="12" class="py-0">
<label for="" class="search-box-label">
<!-- <v-icon small
:class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
@ -32,28 +33,28 @@
검색
</label>
</v-col>
<v-col :cols="12">
<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 :cols="11" class="py-0 pr-3">
<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>
<a-button icon="search" :ripple="false" type="primary" @click="search()"
class="search-button">조회</a-button>
</v-row>
</v-col>
<a-button type="primary" :ripple="false" @click="search()">
조회
</a-button>
</v-row>
<!-- <div :style="'height: calc(65vh)'"> -->
<div :style="'height: 600px'">
<div :style="'height: 600px'" class="px-5">
<!-- <div :style="{ height: 'calc(100% - 213px)' }"> -->
<div ref="modalGridParent" class="h100 py-3">
<!-- :is="loadGrid && dialog ? 'Grid' : null" -->
<component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01"
:dataPath="searchParam.modalData2.evtObjPop" :parentPrgmId="parentPrgmId" @getRowsData="getRowData"
@dblClick="setUpdate($event)" />
:dataPath="searchParam.modalData2.evtObjPop" :parentPrgmId="parentPrgmId"
@getRowsData="getRowData" @dblClick="setUpdate($event)" />
</div>
</div>
<v-card-actions class="pa-5 d-flex align-center justify-end">
<a-button type="default" class="mr-2" :ripple="false" @click="dialogOpenCloseEvent(dialog)">닫기</a-button>
<a-button type="default" class="mr-2" :ripple="false"
@click="dialogOpenCloseEvent(dialog)">닫기</a-button>
<a-button type="primary" class="mr-2" :ripple="false" @click="setUpdate('init')">초기화</a-button>
<a-button type="primary" :ripple="false" @click="setUpdate($event)">확인</a-button>
</v-card-actions>

View File

@ -126,7 +126,7 @@ export default {
async chkDialog(val) {
if (val) {
// 열릴 때
console.log('dsfafds');
// console.log('dsfafds');
await this.getData();
// console.log("chkDialog: ", val);
// if(this.searchParam.selecUserList.length > 0){

View File

@ -22,37 +22,29 @@
outlined
:hide-details="true"
>
<!-- Custom SVG icon -->
<template v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
<v-icon>$icoSearch</v-icon>
</template>
</v-text-field>
</v-col>
<v-dialog v-model="dialog" scrollable width="700px">
<v-card style="height: 100%">
<v-card-title class="pa-5 d-flex align-center justify-space-between">
<v-card-title class="px-6 py-4 d-flex align-center justify-space-between">
<span class="custom-title-4">{{ option.modalTitle }}</span>
<v-btn
icon
tile
:ripple="false"
@click="dialogOpenCloseEvent(dialog)"
>
<v-icon>mdi-close</v-icon>
</v-btn>
<a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
</v-card-title>
<div class="pa-5">
<v-row align="center" no-gutters>
<v-col :cols="3">
<v-col :cols="12">
<label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1"
>mdi-record-circle</v-icon
>
<!-- <v-icon x-small color="primary" class="mr-1">mdi-record-circle</v-icon> -->
<v-icon small :class="['mr-1 icon-blue']">$icoBulletPoint</v-icon>
검색
</label>
</v-col>
<v-col :cols="5">
<v-col :cols="9">
<v-text-field
append-icon="mdi-magnify"
class="v-input__custom"
@ -63,21 +55,19 @@
></v-text-field>
</v-col>
<v-spacer></v-spacer>
<v-col cols="4" class="text-right">
<v-btn :ripple="false" @click="search()">
<v-col :cols="3" class="text-right">
<a-button type="primary" @click="search()" icon="search">
조회
</v-btn>
<v-btn :ripple="false" @click="initSearch()">
</a-button>
<a-button @click="initSearch()">
초기화
</v-btn>
</a-button>
</v-col>
</v-row>
</div>
<v-divider></v-divider>
<!-- <div :style="'height: calc(65vh)'"> -->
<div :style="'height: 429px;'">
<!-- <div :style="{ height: 'calc(100% - 213px)' }"> -->
<div ref="modalGridParent" class="h100 w100 py-3">
<!-- <v-divider></v-divider> -->
<div style="height: 429px;" class="py-3 px-5">
<div ref="modalGridParent" class="h100 w100">
<component
:is="loadGrid && dialog ? 'Grid' : null"
:gridName="grid_01"
@ -88,11 +78,9 @@
/>
</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 class="pa-5 d-flex align-center justify-end">
<a-button class="mr-2" @click="dialogOpenCloseEvent(dialog)">닫기</a-button>
<a-button type="primary" @click="setUpdate($event)">확인</a-button>
</v-card-actions>
</v-card>
</v-dialog>
@ -292,52 +280,41 @@ export default {
modalKey: this.myModalKey,
gridKey: this.grid_01,
modalDataKey: this.modalDataKey,
value: [{ header: '위치정보', name: 'eccNm' }],
value: [
{
align: 'center',
width: 30,
minWidth: 60,
formatter: (props) => {
return `<span class="custom-radio"><span class="radio-mark"></span></span>`;
}
},
{ header: '위치정보', name: 'eccNm' }
],
});
},
async getGridData() {
// this.loadGrid = false;
this.loadGrid = false;
// const res = await this.postApiReturn({
// apiKey: 'selectEccBaseInfo',
// resKey: 'eccBaseInfoData',
// sendParam: {
// blocId: this.myBindingData.blocId,
// eqpmYn: '0',
// search: this.searchWord,
// },
// });
const res = await this.postApiReturn({
apiKey: 'selectEccBaseInfo',
resKey: 'eccBaseInfoData',
sendParam: {
blocId: this.myBindingData.blocId,
eqpmYn: '0',
search: this.searchWord,
},
});
// const setTreeData = await this.setTree({
// gridKey: this.gridNameTree,
// treeKey: 'ECC_ID',
// value: res.map(item => ({
// ...item,
// eccNm: item.eccNm,
// })),
// });
//mockdata eccNm
let res = [
{ ECC_ID: 'ECC001', eccNm: '서울 본사', iconShow: false, align: 'center' },
{ ECC_ID: 'ECC002', eccNm: '부산 지사', useIcon: false, align: 'center' },
{ ECC_ID: 'ECC003', eccNm: '대구 센터', useIcon: false, align: 'center' },
{ ECC_ID: 'ECC004', eccNm: '광주 사무소' , useIcon: false, align: 'center'},
{ ECC_ID: 'ECC005', eccNm: '인천 물류창고' , useIcon: false, align: 'center'},
];
const setTreeData = {
ROOT: res.map(item => ({
const setTreeData = await this.setTree({
gridKey: this.gridNameTree,
treeKey: 'ECC_ID',
value: res.map(item => ({
...item,
eccNm: item.eccNm,
}))
};
})),
});
console.log(res);
this.setModalGridData({
modalKey: this.myModalKey,
gridKey: this.grid_01,
@ -395,7 +372,31 @@ var FtnPlcFormPop = {
</script>
<style lang="scss" scoped>
// @each $theme in dark, light {
// @include theme($theme);
// .v-application.#{$theme}-mode {
// .v-input--is-readonly {
// border-color: map-deep-get($config,
// #{$theme},
// "v-input-readonly-border-color"
// );
// ::v-deep {
// &:not(.v-input--radio-group, .v-input--checkbox) {
// .v-input__slot {
// background-color: map-deep-get($config,
// #{$theme},
// "v-input-backgroundColor"
// ) !important;
// }
// }
// }
// }
// }
// }
::v-deep {
.v-dialog {
overflow-y: hidden !important;
}
@ -418,26 +419,4 @@ var FtnPlcFormPop = {
}
}
@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>

View File

@ -294,10 +294,10 @@ export default {
if (this.searchParam.energyCd < 0) {
roiIdVal = null;
} else {
console.log(
'this.searchParam.energyList[this.searchParam.energyCd]',
this.searchParam.energyList[this.searchParam.energyCd],
);
// console.log(
// 'this.searchParam.energyList[this.searchParam.energyCd]',
// this.searchParam.energyList[this.searchParam.energyCd],
// );
roiIdVal = this.searchParam.energyList[this.searchParam.energyCd + 1]
.cd;
}

View File

@ -239,13 +239,13 @@ export default {
this.selectedData.eccNm = '';
if (this.bindOption === null) {
console.log('this.bindOption is null...');
// console.log('this.bindOption is null...');
this.setPageData({
modalEccId: '',
modalEccNm: '',
});
} else {
console.log('this.bindOption is not null...');
// console.log('this.bindOption is not null...');
this.setPageData({
[this.bindOption.eccId]: '',
[this.bindOption.eccNm]: '',
@ -296,12 +296,12 @@ export default {
? localStorage.getItem(this.parentPrgmId + 'ModalEccNm')
: '',
});
console.log(
'localStorage.getItem(this.parentPrgmId + "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')

View File

@ -43,7 +43,10 @@
</v-col>
<v-col :cols="6" class="py-0 pl-2">
<!-- <DatePicker v-model="strtDt" :parentPrgmId="parentPrgmId"/> -->
<div class="startpicker-container2">
<component :parentPrgmId="parentPrgmId" :is="'SelectBoxTime'" ref="SelectBox1"
:propsValue="selectTimeValue1" :itemList="selectTimeValueList1" :minInterval="selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1
" @update:propsValue="selectTimeValue1 = $event" />
<!-- <div class="startpicker-container2">
<v-text-field id="startpicker2" ref="startpicker2" v-model="strtDt"
:class="'v-input__custom'" :hide-details="true" readonly outlined>
<template #append>
@ -53,7 +56,7 @@
<div ref="startpicker-container2" id="startpicker-container2"></div>
</template>
</v-text-field>
</div>
</div> -->
</v-col>
<!-- <v-col :cols="2">
<vue-numeric-input v-model="strtHh" :min="0" :max="23" controls-type="updown"
@ -91,17 +94,9 @@
</div>
</v-col>
<v-col :cols="6" class="pl-2">
<div class="startpicker-container3">
<v-text-field id="startpicker3" ref="startpicker3" v-model="endDt"
:class="'v-input__custom'" :hide-details="true" readonly outlined>
<template #append>
<v-icon size="20">$icoCalendar</v-icon>
</template>
<template #append-outer>
<div ref="startpicker-container3" id="startpicker-container3"></div>
</template>
</v-text-field>
</div>
<component :parentPrgmId="parentPrgmId" :is="'SelectBoxTime'" ref="SelectBox2"
:propsValue="selectTimeValue2" :itemList="selectTimeValueList2" :minInterval="selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1
" @update:propsValue="selectTimeValue2 = $event" />
</v-col>
<!-- <v-col :cols="2">
<vue-numeric-input v-model="endHh" :min="0" :max="23" controls-type="updown"
@ -186,10 +181,11 @@
</div>
</template>
<v-card-actions class="justify-end">
<a-button :ripple="false" @click="btnAction('save')" class="mr-2">저장</a-button>
<a-button :ripple="false" @click="btnAction('close')" class="mr-2">닫기</a-button>
<a-button type="primary" :ripple="false" @click="btnAction('save')" class="mr-2">저장</a-button>
<a-button v-show="popUpAction === 'update'" type="danger" ghost danger :ripple="false"
@click="btnAction('delete')" class="mr-2">삭제</a-button>
<a-button :ripple="false" type="primary" @click="btnAction('close')" class="mr-2">닫기</a-button>
@click="btnAction('delete')">삭제</a-button>
</v-card-actions>
</v-card>
</v-dialog>
@ -210,6 +206,7 @@ import DatePicker from '~/components/common/Datepicker';
import mixinGlobal from '@/mixin/global.js';
import Utility from '~/plugins/utility';
import TuiDatepicker from 'tui-date-picker';
import SelectBoxTime from "@/components/common/select/SelectBoxTime";
export default {
mixins: [mixinGlobal],
@ -237,6 +234,13 @@ export default {
type: String,
require: false,
},
selectBoxTimeItemList: {
type: Object,
require: false,
default: () => {
return {};
},
},
},
components: {
InputText,
@ -250,6 +254,7 @@ export default {
Utility,
TuiDatepicker,
VueNumericInput,
SelectBoxTime,
},
data() {
return {
@ -272,7 +277,23 @@ export default {
planSeq: '',
blocId: '',
addPlanData: {
}
},
selectTimeValue1:
this.selectBoxTimeItemList.selectTimeValue1 != undefined
? this.selectBoxTimeItemList.selectTimeValue1
: null, // selectBoxTime에 필요한 prop
selectTimeValueList1:
this.selectBoxTimeItemList.selectTimeValueList1 != undefined
? this.selectBoxTimeItemList.selectTimeValueList1
: [], // selectBoxTime에 필요한 prop
selectTimeValue2:
this.selectBoxTimeItemList.selectTimeValue2 != undefined
? this.selectBoxTimeItemList.selectTimeValue2
: null, // selectBoxTime에 필요한 prop
selectTimeValueList2:
this.selectBoxTimeItemList.selectTimeValueList2 != undefined
? this.selectBoxTimeItemList.selectTimeValueList2
: [], // selectBoxTime에 필요한 prop
};
},
computed: {
@ -296,25 +317,29 @@ export default {
}
},
strtDt(val) {
console.log('strtDt : ', val);
// console.log('strtDt : ', val);
this.checkStrtAndEndDateTime('start');
if (this.startDatepickerInstance3) {
this.startDatepickerInstance3.setDate(new Date(this.endDt));
}
},
endDt(val) {
console.log('endDt : ', val);
// console.log('endDt : ', val);
this.checkStrtAndEndDateTime('end');
if (this.startDatepickerInstance) {
this.startDatepickerInstance.setDate(new Date(this.strtDt));
}
},
strtHh(val) {
// const [hh, mm] = selectTimeValue1.split(':');
// console.log(`Hours: ${hh}, Minutes: ${mm}`);
console.log('strtHh : ', val);
this.checkStrtAndEndDateTime('start');
},
endHh(val) {
console.log('endHh : ', val);
// console.log('endHh : ', val);
this.checkStrtAndEndDateTime('end');
},
strtMm(val) {
@ -323,6 +348,12 @@ export default {
endMm(val) {
this.checkStrtAndEndDateTime('end');
},
selectTimeValue1(val) {
this.setPageData({ selectTimeValue1: val });
},
selectTimeValue2(val) {
this.setPageData({ selectTimeValue2: val });
}
},
methods: {
...mapMutations({
@ -505,10 +536,8 @@ export default {
let returnData = res[0];
this.strtDt = Utility.setFormatDate(returnData.strtDt, 'YYYY-MM-DD');
this.endDt = Utility.setFormatDate(returnData.endDt, 'YYYY-MM-DD');
this.strtHh = returnData.strtHh;
this.strtMm = returnData.strtMm;
this.endHh = returnData.endHh;
this.endMm = returnData.endMm;
this.selectTimeValue1 = returnData.strtHh+' : '+ returnData.strtMm;
this.selectTimeValue2 = returnData.endHh+' : '+ returnData.endMm;
this.planTitle = returnData.planTitle;
this.planCntn = returnData.planCntn;
this.planColor = returnData.planColor;
@ -525,10 +554,8 @@ export default {
if (
this.strtDt === '' ||
this.endDt === '' ||
this.strtHh === '' ||
this.strtMm === '' ||
this.endHh === '' ||
this.endMm === '' ||
this.selectTimeValue1 === '' ||
this.selectTimeValue2 === '' ||
this.planTitle === '' ||
this.planCntn === '' ||
this.planColor === ''
@ -542,10 +569,8 @@ export default {
if (
this.strtDt == '' ||
this.endDt == '' ||
this.strtHh == '' ||
this.strtMm == '' ||
this.endHh == '' ||
this.endMm == '' ||
this.selectTimeValue1 === '' ||
this.selectTimeValue2 === '' ||
this.planTitle == '' ||
this.planCntn == '' ||
this.planColor == ''
@ -565,13 +590,17 @@ export default {
//console.log(this);
},
async insertDetail() {
const [strtHh, strtMm] = this.selectTimeValue1 ? this.selectTimeValue1.split(':') : '00:00'.split(':');
const [endHh, endMm] = this.selectTimeValue2 ? this.selectTimeValue2.split(':') : '01:00'.split(':');
var params = {
strtDt: this.strtDt,
endDt: this.endDt,
strtHh: this.strtHh.toString(),
strtMm: this.strtMm.toString(),
endHh: this.endHh.toString(),
endMm: this.endMm.toString(),
strtHh: strtHh.trim().toString(),
strtMm: strtMm.trim().toString(),
endHh: endHh.trim().toString(),
endMm: endMm.trim().toString(),
blocId: this.blocId,
planTitle: this.planTitle,
planCntn: this.planCntn,
@ -592,13 +621,16 @@ export default {
});
},
async updateDetail() {
const [strtHh, strtMm] = this.selectTimeValue1 ? this.selectTimeValue1.split(':') : '00:00'.split(':');
const [endHh, endMm] = this.selectTimeValue2 ? this.selectTimeValue2.split(':') : '01:00'.split(':');
var params = {
strtDt: this.strtDt.substr(0, 10),
endDt: this.endDt.substr(0, 10),
strtHh: this.strtHh.toString(),
strtMm: this.strtMm.toString(),
endHh: this.endHh.toString(),
endMm: this.endMm.toString(),
strtHh: strtHh.trim().toString(),
strtMm: strtMm.trim().toString(),
endHh: endHh.trim().toString(),
endMm: endMm.trim().toString(),
planTitle: this.planTitle,
planCntn: this.planCntn,
planColor: this.planColor,

View File

@ -253,7 +253,7 @@ export default {
readObjid: this.searchParam.energyCd,
},
});
console.log('getTreeData : ', res);
// console.log('getTreeData : ', res);
// this.treeData = res;
// const ROOT = res[0].plcCd;
const setTreeData = await this.setTree({
@ -327,7 +327,7 @@ export default {
// 공정/설비 트리 row 클릭이벤트
async getRowData(data) {
// console.log("getRowData 시작...");
console.log('data', data);
// console.log('data', data);
this.activeRowData = data;
// if(data.enableFg == 1){
// this.activeRowData = data;

View File

@ -1,5 +1,5 @@
<template>
<v-row class="search-box" align="center" >
<v-row class="search-box" align="center">
<!-- <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">
@ -37,12 +37,11 @@
<v-row align="center">
<v-col v-if="label" cols="12" class="py-0">
<label for="" class="search-box-label">
<v-icon small
:class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
<v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
{{ item.label }}
</label>
</v-col>
<v-col :cols="label ? 6 : ''" class="py-0">
<v-col :cols="label ? 8 : ''" class="py-0">
<!-- :value="textfield" -->
<v-text-field append-icon="" class="v-input__custom" outlined :hide-details="true"
v-model="searchWord" @keyup.enter="typeEnterKey"><template v-slot:append>
@ -52,13 +51,10 @@
</template></v-text-field>
</v-col>
<v-spacer></v-spacer>
<v-col cols="3" class="text-right">
<v-btn :ripple="false" icon tile @click="btnTreeExpand()">
<!-- {{ treeExpand }} -->
<v-icon size="30"
v-text="treeExpandAll ? 'mdi-chevron-up' : 'mdi-chevron-down'"></v-icon>
</v-btn>
<!-- <v-spacer></v-spacer> -->
<v-col cols="2" class="text-right">
<a-button icon="search" type="primary" @click="search()" class="search-button">조회</a-button>
<!-- <v-btn color="primary" dark>펼치기</v-btn> -->
<!-- <v-btn color="primary" dark>접기</v-btn> -->
<!-- <v-btn :ripple="false">초기화</v-btn> -->
@ -66,8 +62,12 @@
<v-btn v-if="!searchParam.isMulti" :ripple="false" @click="search()">검색</v-btn> -->
<!-- as-is 봐도 초기화가 하는 기능을 모르겠음.. -->
</v-col>
<v-col cols="2" class="text-right"><a-button class="expand-btn" :ripple="false" @click="btnTreeExpand()">
<v-icon small>$icoExpandAlt</v-icon>
Expand All
</a-button></v-col>
</v-row>
<!-- <v-btn color="primary" dark @click="btnTreeExpand()">{{
treeExpand
}}</v-btn> -->
@ -78,7 +78,7 @@
</div>
<v-card-text>
<div ref="treeGridParent" style="height: 500px">
<div ref="treeGridParent" style="height: 450px">
<component :ref="'treeGrid' + parentPrgmId" :is="loadGrid && dialog ? 'Grid' : null"
:gridName="gridNameTree" :dataPath="searchParam.modalData.selectReadObjListTree"
:parentPrgmId="parentPrgmId" :bindingData="bindingData" @getRowsData="getRowData"
@ -89,10 +89,10 @@
:tree-data="ftnPlcListTreeData"
/> -->
</v-card-text>
<v-divider></v-divider>
<v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<a-button :ripple="false" @click="setUpdate()" class="mr-2">확인</a-button>
<a-button :ripple="false" type="primary" @click="dialog = false" class="mr-2">닫기</a-button>
<a-button :ripple="false" @click="dialog = false" class="mr-2">닫기</a-button>
<a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button>
</v-card-actions>
</v-card>
</v-dialog>
@ -155,7 +155,7 @@ export default {
myModalKey: 'selectReadObjListTree',
gridNameTree: 'treeGrid',
loadGrid: true,
loadGrid: false,
dialog: false,
treeData: [], // 리턴받은 원본 트리 데이터
@ -268,7 +268,7 @@ export default {
header: '',
name: '',
align: 'center',
width: 50,
width: 20,
formatter: (props) => {
return `<label class="custom-radio">
<span class="radio-mark"></span>
@ -278,10 +278,10 @@ export default {
{
header: '검침개소명',
name: 'readPlcNm',
width: 370,
width: 500,
align: 'left',
},
{ header: '검침개소', name: 'name', align: 'center' },
{ header: '검침개소', name: 'name', align: 'left', width: 200 },
],
});
},
@ -289,73 +289,34 @@ export default {
async getTreeData() {
this.loadGrid = false;
// const res = await this.postApiReturn({
// apiKey: 'selectReadPlcBaseInfo',
// resKey: 'readPlcBaseInfoData',
// sendParam: {
// blocId:
// this.searchParam.blocMstrList.length > 0
// ? this.searchParam.blocMstrList[this.searchParam.blocId].blocId
// : this.searchParam.blocId, //"BL0001",
// // readObjId: this.searchParam.readObj, // "MTT00001" // 전력 코드 고정
// readObjId: this.searchParam.searchReadObj, // "MTT00001" // 전력 코드 고정
const res = await this.postApiReturn({
apiKey: 'selectReadPlcBaseInfo',
resKey: 'readPlcBaseInfoData',
sendParam: {
blocId:
this.searchParam.blocMstrList.length > 0
? this.searchParam.blocMstrList[this.searchParam.blocId].blocId
: this.searchParam.blocId, //"BL0001",
// readObjId: this.searchParam.readObj, // "MTT00001" // 전력 코드 고정
readObjId: this.searchParam.searchReadObj, // "MTT00001" // 전력 코드 고정
// useFg: '1',
// readPlcNmLike: this.searchWord,
// },
// });
const treeData = [
{
readPlcNm: '서울 본사',
name: '본사',
_children: [
{
readPlcNm: '서울 본사 - 1층',
name: '1층',
},
{
readPlcNm: '서울 본사 - 2층',
name: '2층',
},
],
useFg: '1',
readPlcNmLike: this.searchWord,
},
{
readPlcNm: '부산 지사',
name: '지사',
_children: [
{
readPlcNm: '부산 지사 - A동',
name: 'A동',
_children: [
{
readPlcNm: '부산 지사 - A동 1층',
name: '1층',
},
{
readPlcNm: '부산 지사 - A동 2층',
name: '2층',
},
],
},
{
readPlcNm: '부산 지사 - B동',
name: 'B동',
},
],
},
{
readPlcNm: '대전 창고',
name: '창고',
},
];
});
// // console.log("treeData", res)
// console.log("treeData", res)
let myOptionsTree = {
columnOptions: {
resizable: true,
},
treeColumnOptions: {
name: 'readPlcNm',
},
header: {
height: 37,
},
rowHeight: 'auto',
};
if (this.searchParam.isMulti) {
myOptionsTree['rowHeaders'] = [{ type: 'checkbox' }];
@ -373,26 +334,26 @@ export default {
// this.treeData = res;
// const ROOT = res[0].plcCd;
// const setTreeData = await this.setTree({
// gridKey: this.gridNameTree,
// treeKey: 'READ_PLC_ID',
// value: res.map(item => ({
// ...item,
// rowStat: null,
// readPlcId: item.readPlcId,
// readPlcIdNm: item.readPlcId,
// upReadPlcId:
// item.upReadPlcId == null || item.upReadPlcId == ''
// ? ''
// : item.upReadPlcId,
// upReadPlcNm:
// item.upReadPlcNm == null || item.upReadPlcNm == ''
// ? ''
// : item.upReadPlcNm,
// blocId: item.blocId,
// useFg: item.useFg === '1' ? true : false,
// })),
// });
const setTreeData = await this.setTree({
gridKey: this.gridNameTree,
treeKey: 'READ_PLC_ID',
value: res.map(item => ({
...item,
rowStat: null,
readPlcId: item.readPlcId,
readPlcIdNm: item.readPlcId,
upReadPlcId:
item.upReadPlcId == null || item.upReadPlcId == ''
? ''
: item.upReadPlcId,
upReadPlcNm:
item.upReadPlcNm == null || item.upReadPlcNm == ''
? ''
: item.upReadPlcNm,
blocId: item.blocId,
useFg: item.useFg === '1' ? true : false,
})),
});
// this.treeData = setTreeData;
@ -400,7 +361,7 @@ export default {
modalKey: this.myModalKey,
gridKey: this.gridNameTree,
modalDataKey: this.modalDataKey,
value: treeData,
value: setTreeData.ROOT || [],
});
this.loadGrid = true;
@ -540,22 +501,4 @@ const selectReadObjListTree = {
}
}
@each $theme in dark, light {
.v-application.#{$theme}-mode {
.v-dialog {
.v-card {
&__title {
@if $theme ==dark {
background-color: #2d3355;
.v-btn {
background-color: #2d3355;
}
}
}
}
}
}
}
</style>

View File

@ -273,9 +273,9 @@ export default {
});
},
async created() {
// await this.setSelectValueList01();
// await this.setSelectValueList02();
// await this.setSelectValueList03();
await this.setSelectValueList01();
await this.setSelectValueList02();
await this.setSelectValueList03();
this.init();
// if(this.searchParam.isMulti == true){
// this.setPageData({
@ -487,40 +487,40 @@ export default {
eqpmId: this.selectValue03,
searchWord: this.searchWord,
};
let res = [
{
eqpmGrpNm: "냉각 시스템",
eqpmGrpId: "GRP001",
eqpmId: "EQ001",
eqpmNm: "냉각기 A",
tagId: "TAG001-001",
tagNm: "냉각 온도 센서",
rowStat: "I",
},
{
eqpmGrpNm: "전력 시스템",
eqpmGrpId: "GRP002",
eqpmId: "EQ002",
eqpmNm: "변압기 B",
tagId: "TAG002-002",
tagNm: "전류 센서",
rowStat: "U",
},
{
eqpmGrpNm: "공기압 시스템",
eqpmGrpId: "GRP003",
eqpmId: "EQ003",
eqpmNm: "압축기 C",
tagId: "TAG003-003",
tagNm: "압력 센서",
rowStat: "D",
},
];
// res = await this.postApiReturn({
// apiKey: "selectTagAndEqpmList",
// resKey: "tagTrndDatas",
// sendParam: searchParam,
// });
// let res = [
// {
// eqpmGrpNm: "냉각 시스템",
// eqpmGrpId: "GRP001",
// eqpmId: "EQ001",
// eqpmNm: "냉각기 A",
// tagId: "TAG001-001",
// tagNm: "냉각 온도 센서",
// rowStat: "I",
// },
// {
// eqpmGrpNm: "전력 시스템",
// eqpmGrpId: "GRP002",
// eqpmId: "EQ002",
// eqpmNm: "변압기 B",
// tagId: "TAG002-002",
// tagNm: "전류 센서",
// rowStat: "U",
// },
// {
// eqpmGrpNm: "공기압 시스템",
// eqpmGrpId: "GRP003",
// eqpmId: "EQ003",
// eqpmNm: "압축기 C",
// tagId: "TAG003-003",
// tagNm: "압력 센서",
// rowStat: "D",
// },
// ];
let res = await this.postApiReturn({
apiKey: "selectTagAndEqpmList",
resKey: "tagTrndDatas",
sendParam: searchParam,
});
let newRes = [];
if (this.searchParam["tagList"].length > 0) {
newRes = res.filter((item) => {

View File

@ -81,6 +81,10 @@ export default {
type: String,
require: false,
},
required: {
type: Boolean,
default: false
},
},
data() {
return {};

View File

@ -2,22 +2,17 @@
<v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label">
<v-icon
v-if="iconShow"
small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
>
<v-icon v-if="iconShow" small :class="['mr-1', required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
{{ label }}
</label>
</v-col>
<v-col :cols="label ? textCols : ''">
<v-select v-model="selectValue" :items="searchParam[parentPrgmId].blocMstrList" label="사업장을 선택하세요"
item-text="blocNm" item-value="idx" append-icon="" class="v-select__custom" outlined
:hide-details="true" :class="['v-select__custom', customClass]">
<template v-slot:append>
    <v-icon>$icoChevronDown</v-icon>
  </template>
<v-select v-model="selectValue" :items="searchParam[parentPrgmId].blocMstrList"
item-text="blocNm" item-value="idx" append-icon="" outlined
:hide-details="true" :class="['v-select__custom', customClass]"
:menu-props="{ top: false, offsetY: true }"
>
<template v-slot:append><v-icon>$icoChevronDown</v-icon></template>
</v-select>
</v-col>
</v-row>

View File

@ -14,12 +14,14 @@
<v-col :cols="label ? textCols : ''">
<v-select v-model="innerValue" :items="itemList" item-text="text" item-value="value" solo outlined
:hide-details="true" append-icon="" :class="['v-select__custom', customClass]" :disabled="disabled"
:readonly="readonly"><template v-slot:append>
:readonly="readonly"
:menu-props="{ top: false, offsetY: true }"
>
<template v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoChevronDown</v-icon>
</template></v-select>
</template>
</v-select>
<!-- @change="updateBlocCode($event)" -->
</v-col>
</v-row>

View File

@ -20,13 +20,28 @@
outlined
:multiple="multiple"
:hide-details="true"
append-icon=""
:class="['v-select__custom', customClass]"
:disabled="disabled"
:readonly="readonly"
><template v-slot:append>
append-icon=""
:menu-props="{ top: false, offsetY: true }"
>
<template v-slot:append>
<v-icon>$icoChevronDown</v-icon>
</template></v-select>
</template>
<template v-slot:item="{item, attrs, on, props}">
<v-list-item v-bind="attrs" v-on="on" >
<v-list-item-content>
<v-list-item-title class="d-flex justify-space-between">
{{item.text}}
<a-icon type="check" ></a-icon>
</v-list-item-title>
</v-list-item-content>
</v-list-item>
</template>
</v-select>
</v-col>
</v-row>
</template>
@ -125,4 +140,4 @@ export default {
};
</script>
<style></style>
<style scoped lang="scss"></style>

View File

@ -22,11 +22,11 @@
outlined
:menu-props="{ auto: true, offsetY: true }"
:hide-details="true"
:class="'v-select__custom select-large'"
:class="['v-select__custom', customClass]"
:disabled="disabled"
:readonly="readonly"
@click="setDatepickerHide"
style="width: 170px; border-radius: 6px !important"
style="min-width: 170px;"
>
<template v-slot:append>
<a-icon
@ -106,6 +106,10 @@ export default {
require: false,
default: 1,
},
customClass: {
type: String,
require: false,
},
},
emits: ["update:propsValue"],
data() {

View File

@ -70,7 +70,7 @@ export default {
return this.searchParam[this.parentPrgmId][this.enrgCd];
},
set(value) {
console.log('value : ', value);
// console.log('value : ', value);
return this.setPageData({ [this.enrgCd]: value });
},
},

View File

@ -85,6 +85,11 @@ export default {
type: String,
require: false,
},
required: {
type: Boolean,
require: false,
default: false
},
},
data() {
return {

View File

@ -21,6 +21,7 @@
outlined
append-icon=""
:class="['v-select__custom', customClass]"
:menu-props="{ top: false, offsetY: true }"
><template v-slot:append>
<v-icon>$icoChevronDown</v-icon>
</template></v-select>

View File

@ -11,9 +11,13 @@
<v-col :cols="label ? textCols : ''">
<v-select v-model="selectValue" :items="searchParam[parentPrgmId][dataKey + 'List']" item-text="commCdNm"
item-value="commCd" outlined :hide-details="true" append-icon=""
:class="['v-select__custom', customClass]"><template v-slot:append>
:class="['v-select__custom', customClass]"
:menu-props="{ top: false, offsetY: true }"
>
<template v-slot:append>
<v-icon>$icoChevronDown</v-icon>
</template></v-select>
</template>
</v-select>
<!-- @change="updateBlocCode($event)" -->
</v-col>
</v-row>

View File

@ -270,8 +270,8 @@ export default {
filteredData: [],
rowSelection: {
onChange: (selectedRowKeys, selectedRows) => {
console.log('Selected Row Keys:', selectedRowKeys);
console.log('Selected Rows:', selectedRows);
// console.log('Selected Row Keys:', selectedRowKeys);
// console.log('Selected Rows:', selectedRows);
},
}
};

View File

@ -0,0 +1,6 @@
<template>
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" class="v-icon" xmlns="http://www.w3.org/2000/svg">
<path
d="M14.1248 1.71225L10.7462 2.13189C10.6283 2.14617 10.5801 2.28903 10.6623 2.37296L11.6391 3.34975L8.89799 6.09082C8.8714 6.11767 8.85649 6.15392 8.85649 6.19171C8.85649 6.2295 8.8714 6.26575 8.89799 6.2926L9.70335 7.09796C9.7587 7.15332 9.84977 7.15332 9.90513 7.09796L12.648 4.3551L13.6248 5.33189C13.6436 5.35072 13.6674 5.36387 13.6934 5.36981C13.7193 5.37576 13.7465 5.37427 13.7716 5.36551C13.7968 5.35675 13.819 5.34107 13.8356 5.32028C13.8523 5.29949 13.8628 5.27443 13.8658 5.24796L14.2837 1.87117C14.2867 1.84961 14.2846 1.82765 14.2776 1.80702C14.2707 1.78639 14.2591 1.76765 14.2437 1.75226C14.2283 1.73687 14.2096 1.72524 14.1889 1.7183C14.1683 1.71136 14.1463 1.70929 14.1248 1.71225ZM6.2962 8.89439C6.26935 8.8678 6.23309 8.85289 6.19531 8.85289C6.15752 8.85289 6.12127 8.8678 6.09442 8.89439L3.35334 11.6372L2.37656 10.6605C2.35771 10.6416 2.33394 10.6285 2.30797 10.6225C2.282 10.6166 2.25487 10.6181 2.22971 10.6268C2.20455 10.6356 2.18236 10.6513 2.16569 10.6721C2.14903 10.6929 2.13856 10.7179 2.13549 10.7444L1.71584 14.1212C1.70513 14.214 1.78192 14.2908 1.87477 14.2801L5.25335 13.8605C5.3712 13.8462 5.41942 13.7033 5.33727 13.6194L4.36049 12.6426L7.10334 9.89974C7.1587 9.84439 7.1587 9.75332 7.10334 9.69796L6.2962 8.89439Z" />
</svg>
</template>

View File

@ -1,7 +1,7 @@
<template>
<div class="pb-5 h100">
<div class="d-flex align-center justify-space-between">
<span class="text-h6">공통그룹코드</span>
<span class="grid-title">공통그룹코드</span>
<div>
<Buttons
:parentPrgmId="parentPrgmId"
@ -126,7 +126,7 @@ export default {
{
header: '사용여부',
name: 'useFg',
align: 'center',
align: 'left',
formatter({ value }) {
const newValue = _this.pageData.useFgList.filter(
item => item.commCd == value,

View File

@ -1,35 +1,36 @@
<template>
<div>
<div class="d-flex justify-space-between align-center" style="min-height: 80px;">
<span class="txt custom-title-4-new">Data Set TAG 연결 정보</span>
<div class="d-flex justify-space-between align-center pb-5" >
<!-- <span class="txt custom-title-4">Data Set TAG 연결 정보</span> -->
<v-card-title class="pa-0">
Data Set TAG 연결 정보
</v-card-title>
<Buttons :parentPrgmId="parentPrgmId" :bindingData="gridName" :detailList="detailDataSetTagList"
:btnActionsFnc="btnActions" />
</div>
<div ref="gridParent">
<div ref="gridParent" style="min-height: 30vh;">
<Grid :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName" :parentPrgmId="parentPrgmId"
@getRowsData="getRowData" :innerTabGridInfo="innerTabGridInfo" :dataPath="dataPathMock" />
@getRowsData="getRowData" :innerTabGridInfo="innerTabGridInfo" />
</div>
<div ref="formParent" class="mt-4">
<component :is="'Form'" :parentPrgmId="parentPrgmId" :bindingData="gridName" :detailList="detailDataSetTagList"
@gridEditingFinish="gridEditingFinish" />
</div>
<div ref="formParent" style="min-height: 100px;" class="w100 h100">
<v-row ref="contents" class="w100">
<v-col :cols="6">
<div ref="formParent" class="h100">
<v-row align="end" ref="contents" class="">
<v-col>
<component :is="'Datepicker'" :parentPrgmId="parentPrgmId" :label="'검색기간'" :labelCols="12" :textCols="12" />
</v-col>
<v-col :cols="4">
<v-col >
<component :is="'selectCodeList'" :parentPrgmId="parentPrgmId" :label="'주기'" dataKey="mdlDataTerm"
:sendParam="{ commGrpCd: 'MDL_DATA_TERM', useFg: '1' }" :addAll="false" :labelCols="12" :textCols="12" :iconShow="true" />
</v-col>
<v-col class="text-right align-self-end">
<a-button @click="jamoviProcClickEvent('view1')" type="primary" :ripple="false" class="mr-1">데이터 분석</a-button>
</v-row>
<v-row align="center" no-gutters class="searchFilter mt-2">
<v-col class="d-flex justify-end">
<a-button @click="jamoviProcClickEvent('view1')" type="primary" :ripple="false" class="mb-1">데이터 분석</a-button>
</v-col>
<!-- <v-card class="searchFilter w100">
<v-row align="center" no-gutters>
</v-row>
</v-card> -->
</v-row>
</div>
</div>
@ -38,7 +39,7 @@
import { mapState, mapMutations, mapActions } from 'vuex';
import Buttons from '~/components/common/button/Buttons';
import Grid from '~/components/common/Grid';
import { CustumChecbox } from '~/plugins/gridUtility';
import { CustomCheckbox } from '~/plugins/gridUtility';
import { CustomNumberEditor } from '~/plugins/gridUtility';
import Form from '~/components/common/form/Form';
import mixinGlobal from '@/mixin/global.js';
@ -66,7 +67,7 @@ export default {
},
data() {
return {
loadGrid: true,
loadGrid: false,
gridName: 'rowDataSetTagRelGrid',
detailDataSetTagList: myDataSetTagDetail,
dataPathMock: {
@ -128,8 +129,6 @@ export default {
const gridHeight = this.$refs['gridParent'].offsetHeight - 36;
const myOptions = {
// bodyHeight: gridHeight,
// minBodyHeight: gridHeight,
header: {
height: 28,
},
@ -137,14 +136,9 @@ export default {
minRowHeight: 29,
selectionUnit: 'row',
editingEvent: 'click',
// columnOptions: {
// resizable: true,
// minWidth: 100
// }
};
this.setGridOption({
gridKey: this.gridName,
// value: myOptions
value: Object.assign(Utility.defaultGridOption(gridHeight), myOptions),
});
@ -163,7 +157,7 @@ export default {
{
header: '모델 Data 구분',
name: 'mdlDataTypeCd',
align: 'center',
align: 'left',
width: 120,
formatter({ value }) {
var retVal = '';
@ -180,7 +174,7 @@ export default {
{
header: '사용여부',
name: 'useFg',
align: 'center',
align: 'left',
width: 100,
formatter({ value }) {
value = value === true ? '1' : '0';
@ -196,7 +190,7 @@ export default {
// }
// }
},
{ header: '비고', name: 'rmrk', align: 'center' },
{ header: '비고', name: 'rmrk', align: 'left' },
];
this.setGridColumn({
@ -204,16 +198,11 @@ export default {
value: myColumns,
});
this.loadGrid = true;
this.$nextTick(() => {
this.loadGrid = true;
})
},
async getRowData(data, gridName) {
// if (data.rowStat === 'I') {
// this.detailDataSetTagList[0].disabled = false;
// this.detailDataSetTagList[1].disabled = false;
// } else {
// this.detailDataSetTagList[0].disabled = true;
// this.detailDataSetTagList[1].disabled = true;
// }
this.setGridSelectData({
gridKey: gridName,
gridSelect: true,
@ -225,7 +214,7 @@ export default {
let dataArr = [];
switch (action) {
case 'add':
console.log('add this.pageData : '); // , this.pageData);
// console.log('add this.pageData : '); // , this.pageData);
const defaultRow = {
dataSetId: this.pageData.dataSetId,
dataSetNm: this.pageData.dataSetNm,
@ -308,7 +297,7 @@ export default {
comId: this.selectedComId,
dataSetId: this.selectedDataSetId,
};
console.log('data : ', data);
// console.log('data : ', data);
this.$emit('jamoviClickEvent', 'view1', data);
},
},

View File

@ -20,7 +20,6 @@
:editorGrid="true"
:innerTabGridInfo="innerTabGridInfo"
@getRowsData="getRowData"
:dataPath="dataPathMock"
/>
</div>
</div>
@ -54,22 +53,10 @@ export default {
},
data() {
return {
loadGrid: true,
loadGrid: false,
gridName: 'rowDetailGrid',
rowKey: null,
edtingFinishFlag: 'Y',
dataPathMock: {
"rowDetailGrid": {
column: [
{ header: '추가 정보', name: 'readObjId', align: 'left' },
{ header: 'Data 구분', name: 'readObjNm', align: 'left' },
{ header: '추가 정보 값', name: 'readObjKind', align: 'left' },
],
data: dataPathDataExample,
defaultRow: dataPathDataExample,
option: {}
}
},
};
},
computed: {
@ -444,22 +431,4 @@ export default {
},
},
};
const dataPathDataExample = [
{
readObjId: 'OBJ001',
readObjNm: '서울 본사',
readObjKind: 'TYPE01',
},
{
readObjId: 'OBJ002',
readObjNm: '부산 지사',
readObjKind: 'TYPE02',
},
{
readObjId: 'OBJ003',
readObjNm: '대전 공장',
readObjKind: 'TYPE03',
}
]
</script>

View File

@ -11,7 +11,7 @@
:btnActionsFnc="btnActions"
/>
</div>
<div ref="gridParent" style="height: calc(100vh - 760px);">
<div ref="gridParent" >
<component
:ref="gridName"
:is="loadGrid ? 'Grid' : null"
@ -19,7 +19,6 @@
:parentPrgmId="parentPrgmId"
@getRowsData="getRowData"
:innerTabGridInfo="innerTabGridInfo"
:dataPath="dataPathMock"
/>
</div>
<div>
@ -60,24 +59,11 @@ export default {
},
data() {
return {
loadGrid: true,
loadGrid: false,
gridName: 'rowEccIaoGrid',
inputList_emMapDiv: [],
inputList_cmInOut: [],
detailList: myDetail,
dataPathMock: {
"rowEccIaoGrid": {
column: [
{ header: '검침 대상 ID', name: 'readObjId', align: 'left' },
{ header: '검침 대상 명', name: 'readObjNm', align: 'left' },
{ header: '검침 대상 유형', name: 'readObjKind', align: 'left' },
{ header: '그룹', name: 'grpCd', align: 'left' },
],
data: dataPathDataExample,
defaultRow: dataPathDataExample,
option: {}
}
},
};
},
computed: {
@ -516,12 +502,4 @@ const myDetail = [
iconShow: true,
},
];
const dataPathDataExample = [
{
readObjId: 'OBJ001',
readObjNm: '서울 본사',
readObjKind: 'TYPE01',
grpCd: 'GRP01',
},
]
</script>

View File

@ -69,55 +69,6 @@ export default {
return {
loadGrid: false,
gridName: 'effcInfoGrid',
// "effcInfoGrid": {
// data:
// [
// {
// "eqpmKindId": "펌프",
// "eqpmGrpId": "냉각수 시스템",
// "totMethNm": "평균값"
// },
// {
// "eqpmKindId": "모터",
// "eqpmGrpId": "공기압 시스템",
// "totMethNm": "최대값"
// },
// {
// "eqpmKindId": "밸브",
// "eqpmGrpId": "스팀 공급",
// "totMethNm": "합계"
// },
// {
// "eqpmKindId": "센서",
// "eqpmGrpId": "온도 제어",
// "totMethNm": "최소값"
// },
// {
// "eqpmKindId": "컴프레서",
// "eqpmGrpId": "에어 시스템",
// "totMethNm": "중앙값"
// }
// ]
// ,
// column: [
// {
// header: '대상설비종류',
// name: 'eqpmKindId',
// },
// {
// header: '대상설비그룹',
// name: 'eqpmGrpId',
// },
// { header: '집계방법', name: 'totMethNm', align: 'center' },
// ]
// }
// },
itemList: [],
tagTpList: [],
// detailList: myDetail,
@ -388,10 +339,10 @@ export default {
},
// bodyHeight: gridHeight,
// minBodyHeight: gridHeight,
// header: {
// height: 28,
// },
// rowHeight: 29,
header: {
height: 37,
},
rowHeight: 37,
// minRowHeight: 29,
// selectionUnit: 'row',
// editingEvent: 'click',
@ -436,7 +387,6 @@ export default {
header: '물리량ID',
name: 'pysclQtyId',
width: 200,
align: 'center',
hidden: true,
},
{ header: '물리량', name: 'pysclQtyCd', hidden: true, minWidth: 200 },
@ -445,7 +395,7 @@ export default {
{ header: '가이드지표', name: 'gdIdxId', hidden: true },
{ header: '가이드지표명', name: 'gdIdxNm', hidden: true },
{ header: '집계방법', name: 'totMeth', hidden: true },
{ header: '집계방법', name: 'totMethNm', align: 'center' },
{ header: '집계방법', name: 'totMethNm',},
];
if (this.selectValue01 == 'PYSCL') {

View File

@ -1,17 +1,16 @@
<template>
<div>
<div
class="d-flex justify-space-between align-center"
style="height: 80px;"
>
<span class="txt custom-title-4-new">설비 추가 정보</span>
<div class="d-flex justify-space-between align-center mb-5" >
<v-card-title class="txt custom-title-4 pa-0">
설비 추가 정보
</v-card-title>
<Buttons
:parentPrgmId="parentPrgmId"
:bindingData="gridName"
:btnActionsFnc="btnActions"
/>
</div>
<div ref="gridParent" style="height: calc(100vh - 520px);">
<div ref="gridParent" class="w100" style="height: calc(100vh - 520px);">
<Grid
:ref="gridName"
:is="loadGrid ? 'Grid' : null"
@ -20,7 +19,6 @@
:editorGrid="true"
:innerTabGridInfo="innerTabGridInfo"
@getRowsData="getRowData"
:dataPath="dataPathMock"
/>
</div>
</div>
@ -52,16 +50,16 @@ export default {
},
data() {
return {
loadGrid: true,
loadGrid: false,
gridName: 'rowDetailGrid',
rowKey: null,
edtingFinishFlag: 'Y',
dataPathMock: {
'rowDetailGrid' : {
column: [
{ header: '추가 정보', name: 'id', headerAlign: 'left' },
{ header: 'Data 구분', name: 'lable', headerAlign: 'left' },
{ header: '추가 정보 값', name: 'type', headerAlign: 'left' },
{ header: '추가 정보', name: 'id', headerAlign: 'left', align: 'left', },
{ header: 'Data 구분', name: 'lable', headerAlign: 'left', align: 'left' },
{ header: '추가 정보 값', name: 'type', headerAlign: 'left', align: 'right' },
// { header: '비고', name: 'note', headerAlign: 'left' }
],
data: dataPathDataExample,
@ -124,10 +122,10 @@ export default {
bodyHeight: gridHeight,
minBodyHeight: gridHeight,
header: {
height: 28,
height: 38,
},
rowHeight: 29,
minRowHeight: 29,
// rowHeight: 39,
// minRowHeight: 29,
selectionUnit: 'row',
editingEvent: 'click',
};
@ -267,11 +265,12 @@ export default {
}
return retVal;
},
minWidth: 230,
},
{
header: 'Data 구분',
name: 'addInfoDataKind',
align: 'center',
align: 'left',
formatter({ value }) {
let retVal = '';
const newValue = addInfoDataKindList.filter(
@ -282,6 +281,7 @@ export default {
}
return retVal;
},
minWidth: 330,
},
{
header: '숫자 값',
@ -300,7 +300,7 @@ export default {
{
header: '추가 정보 값',
name: 'addInfoVal',
align: 'center',
align: 'left',
renderer: {
type: CustomRenderer,
},
@ -312,6 +312,7 @@ export default {
// console.log('test :', test);
return data.row.addInfoDataKind;
},
minWidth: 330,
},
//{ header: "추가 정보 값", name: "addInfoVal", align: "center" , editor: "text",
//},
@ -343,7 +344,9 @@ export default {
value: myColumns,
});
this.loadGrid = true;
this.$nextTick(() => {
this.loadGrid = true;
});
},
async btnActions(action) {
let dataArr = [];
@ -416,3 +419,4 @@ const dataPathDataExample = getPathDataExample({
type: '사용', note: '-'
});
</script>
<style lang="scss" scoped> </style>

View File

@ -1,12 +1,15 @@
<template>
<div>
<div class="d-flex justify-space-between align-center" style="height: 80px;">
<span class="txt custom-title-4-new">설비 상수 정보</span>
<div class="d-flex justify-space-between align-center mb-5" >
<!-- <span class="txt custom-subtitle-tab">설비 상수 정보</span> -->
<v-card-title class="txt custom-title-4 pa-0">
설비 상수 정보
</v-card-title>
<Buttons :parentPrgmId="parentPrgmId" :bindingData="gridName" :btnActionsFnc="btnActions" />
</div>
<div ref="gridParent" style="min-height: calc(100vh - 800px);">
<Grid :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName" :parentPrgmId="parentPrgmId"
@getRowsData="getRowData" :innerTabGridInfo="innerTabGridInfo" :dataPath="dataPathMock" />
@getRowsData="getRowData" :innerTabGridInfo="innerTabGridInfo" />
</div>
<div style="min-height: calc(100vh - 900px);" class="mt-4">
<component :is="'Form'" :parentPrgmId="parentPrgmId" :bindingData="gridName" :detailList="detailList"
@ -41,7 +44,7 @@ export default {
},
data() {
return {
loadGrid: true,
loadGrid: false,
gridName: 'rowEqpmConstGrid',
detailList: myEqpmConstDetail,
@ -96,20 +99,20 @@ export default {
watch: {
selectedEqpmKindId(val) {
if (val) {
this.detailList[2].eqpmKindId = val;
this.detailList[1].eqpmKindId = val;
}
},
selectedEqpmGrpId(val) {
// if(!val){
// this.detailList[2].eqpmGrpId = '';
// this.detailList[1].eqpmGrpId = '';
// }else{
// this.detailList[2].eqpmGrpId = val;
// this.detailList[1].eqpmGrpId = val;
// }
// if(val){
// this.detailList[2].eqpmGrpId = val;
// this.detailList[1].eqpmGrpId = val;
// }
// else if(val == null || val == ''){
// this.detailList[2].eqpmGrpId = '';
// this.detailList[1].eqpmGrpId = '';
// }
},
},
@ -160,11 +163,11 @@ export default {
{ header: '회사 ID', name: 'comId', hidden: true },
{ header: '설비 번호', name: 'eqpmId', hidden: true },
// { header: '대상항목', name: 'objId', align: 'center', hidden: true},
{ header: '물리량 ID', name: 'pysclQtyId', align: 'left' },
{ header: '물리량 명', name: 'pysclQtyNm', align: 'left' },
{ header: '물리량값', name: 'pysclQtyVal', align: 'left' },
{ header: '물리량 ID', name: 'pysclQtyId', align: 'left', minWidth: 230, },
{ header: '물리량 명', name: 'pysclQtyNm', align: 'left', minWidth: 230, },
{ header: '물리량값', name: 'pysclQtyVal', align: 'left', minWidth: 230, },
// { header: '대상항목', name: 'objNm', align: 'left'},
{ header: '대상항목', name: 'objId', align: 'left' },
{ header: '대상항목', name: 'objId', align: 'left', minWidth: 230, },
{
header: '에너지원 명',
name: 'ercId',
@ -232,14 +235,16 @@ export default {
value: myColumns,
});
this.loadGrid = true;
this.$nextTick(() => {
this.loadGrid = true;
});
},
async getRowData(data, gridName) {
if (data.rowStat === 'I') {
this.detailList[2].disabled = false;
this.detailList[1].disabled = false;
this.detailList[3].disabled = false;
} else {
this.detailList[2].disabled = true;
this.detailList[1].disabled = true;
this.detailList[3].disabled = true;
}
@ -255,12 +260,12 @@ export default {
switch (action) {
case 'add':
this.$refs[this.gridName].addRow();
this.detailList[2].disabled = false;
this.detailList[1].disabled = false;
this.detailList[3].disabled = false;
break;
case 'remove':
this.detailList[2].disabled = true;
this.detailList[1].disabled = true;
this.detailList[3].disabled = true;
this.$refs[this.gridName].removeRow();
break;
@ -289,8 +294,8 @@ export default {
dataArr.map(item => {
for (var key of Object.keys(item)) {
console.log('key : ', key);
console.log('item[key] : ', item[key]);
// console.log('key : ', key);
// console.log('item[key] : ', item[key]);
if (!item[key] && requiredKeyList.includes(key)) {
validCheck = false;
}
@ -356,7 +361,6 @@ const myEqpmConstDetail = [
{
type: 'SelectBox',
label: '대상 유형',
disabled: true,
cols: 6,
class: 'py-3 pr-4',
list: 'emMapDivList2',
@ -369,6 +373,7 @@ const myEqpmConstDetail = [
textCols: 12,
iconShow: true,
},
// ==================
{
type: 'EgrpPysclQtyPop',
labelContent: '물리량',
@ -380,11 +385,11 @@ const myEqpmConstDetail = [
pysclQtyNm: 'pysclQtyNm',
},
valueNm: 'objId',
disabled: false,
disabled: true,
required: true,
openMode: 'CONST',
cols: 6,
class: 'py-3 pl-4',
class: 'pt-3 pb-1 pl-4',
eqpmGrpDisableFlag: true,
// eqpmGrpId:'',
labelCols: 12,
@ -404,13 +409,14 @@ const myEqpmConstDetail = [
disabled: true,
readonly: true,
cols: 6,
class: 'py-3 pt-1 pl-4',
class: 'pb-3 pt-0 pl-4',
align: 'right',
// class: 'py-2 d-none',
labelCols: 12,
textCols: 12,
iconShow: true,
},
// ------------
{
type: 'InputText',
label: '물리량 값',
@ -438,3 +444,11 @@ const dataPathDataExample = getPathDataExample({
field2: '2222',
});
</script>
<style lang="scss" scoped>
::v-deep {
.tui-grid-layer-state {
top: 40px !important;
}
}
</style>

View File

@ -1,28 +1,27 @@
<template>
<div>
<div
class="d-flex justify-space-between align-center"
style="height: 80px;"
>
<span class="txt custom-title-4-new">설비 입출력 정보</span>
<div class="d-flex justify-space-between align-center mb-5" >
<!-- <span class="txt custom-subtitle-tab">설비 입출력 정보</span> -->
<v-card-title class="txt custom-title-4 pa-0">
설비 입출력 정보
</v-card-title>
<Buttons
:parentPrgmId="parentPrgmId"
:bindingData="gridName"
:btnActionsFnc="btnActions"
/>
</div>
<div ref="gridParent" style="min-height: calc(100vh - 800px);" >
<!-- :is="loadGrid ? 'Grid' : null" -->
<div ref="gridParent" style="height: calc(100vh - 700px);">
<Grid
:ref="gridName"
:is="loadGrid ? 'Grid' : null"
:gridName="gridName"
:parentPrgmId="parentPrgmId"
@getRowsData="getRowData"
:innerTabGridInfo="innerTabGridInfo"
:dataPath="dataPathMock"
/>
</div>
<div style="min-height: calc(100vh - 900px);" class="mt-4">
<div style="height: 60vh;" class="mt-5">
<component
:is="'Form'"
:parentPrgmId="parentPrgmId"
@ -60,28 +59,12 @@ export default {
},
data() {
return {
loadGrid: true,
loadGrid: false,
gridName: 'rowEqpmIaoGrid',
detailList: myEqpmIaoDetail,
inputList_emMapDiv: [],
inputList_cmInOut: [],
dataPathMock: {
'rowEqpmIaoGrid' : {
column: [
{ header: '대상항목', name: 'id', headerAlign: 'left' },
{ header: '에너지원 명', name: 'lable', headerAlign: 'left' },
{ header: '대상 유형', name: 'type', headerAlign: 'left' },
{ header: '물리량', name: 'note', headerAlign: 'left' },
{ header: '계산여부', name: 'field1', headerAlign: 'left' },
{ header: '분배율', name: 'field2', headerAlign: 'left' }
],
data: dataPathDataExample,
defaultRow: dataPathDataExample,
option: {}
}
},
};
},
computed: {
@ -128,18 +111,24 @@ export default {
},
watch: {
selectedObjId(val) {
console.log('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 = 'py-3 pl-4 pb-0';
this.detailList[1].class = 'py-3 d-none';
this.detailList[2].class = 'py-3 d-none';
this.detailList[3].class = 'py-3 pl-4 pt-1 d-none';
this.detailList[4].class = 'py-3 pl-4';
this.detailList[5].class = 'py-3 pl-4';
this.detailList[6].class = 'py-3 pl-4 pt-0';
} 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[1].class = 'py-3 pl-4';
this.detailList[2].class = 'py-3';
this.detailList[3].class = 'py-3 pl-4 pt-0';
this.detailList[4].class = 'py-3 d-none';
this.detailList[5].class = 'py-3 d-none';
this.detailList[6].class = 'py-3 d-none';
}
},
selectedCalcFg(val) {
@ -172,7 +161,7 @@ export default {
},
},
mounted() {
// this.init();
this.init();
},
methods: {
...mapMutations({
@ -240,11 +229,12 @@ export default {
return retVal;
},
minWidth: 150,
},
{
header: '대상 유형',
name: 'objKind',
align: 'center',
align: 'left',
formatter({ value }) {
var retVal = '';
@ -256,9 +246,10 @@ export default {
return retVal;
},
minWidth: 150,
},
{ header: '물리량', name: 'pysclQtyId', align: 'left', hidden: true },
{ header: '물리량', name: 'pysclQtyNm', align: 'left' },
{ header: '물리량', name: 'pysclQtyNm', align: 'left', minWidth: 150, },
{
header: '물리량값',
name: 'pysclQtyVal',
@ -275,7 +266,7 @@ export default {
{
header: '계산여부',
name: 'calcFg',
align: 'center',
align: 'left',
formatter({ value }) {
value = value === true ? '1' : '0';
const newValue = _this.pageData.useFgList.filter(
@ -283,6 +274,7 @@ export default {
);
return newValue[0].commCdNm;
},
minWidth: 100,
},
{ header: '분배율', name: 'distRt', align: 'right' },
{ header: '등록 사용자', name: 'regUserNo', hidden: true },
@ -302,13 +294,13 @@ export default {
async getRowData(data, gridName) {
if (data.rowStat === 'I') {
this.detailList[0].disabled = false;
this.detailList[2].disabled = false;
this.detailList[1].disabled = false;
this.detailList[3].disabled = false;
this.detailList[4].disabled = false;
this.detailList[5].disabled = false;
} else {
this.detailList[0].disabled = true;
this.detailList[2].disabled = true;
this.detailList[1].disabled = true;
this.detailList[3].disabled = true;
this.detailList[4].disabled = true;
this.detailList[5].disabled = true;
@ -326,7 +318,7 @@ export default {
case 'add':
this.$refs[this.gridName].addRow();
this.detailList[0].disabled = false;
this.detailList[2].disabled = false;
this.detailList[1].disabled = false;
this.detailList[3].disabled = false;
this.detailList[4].disabled = false;
this.detailList[5].disabled = false;
@ -335,7 +327,7 @@ export default {
case 'remove':
this.$refs[this.gridName].removeRow();
this.detailList[0].disabled = true;
this.detailList[2].disabled = true;
this.detailList[1].disabled = true;
this.detailList[3].disabled = true;
this.detailList[4].disabled = true;
this.detailList[5].disabled = true;
@ -355,7 +347,7 @@ export default {
}
if (dataArr.length > 0) {
console.log('dataArr : ', dataArr);
// console.log('dataArr : ', dataArr);
var requiredKeyList = this.detailList
.filter(item => {
@ -416,6 +408,7 @@ export default {
},
};
function checkDuplicate(data, targetKey) {
var duplicateFlag = false;
var set = new Set();
@ -455,10 +448,10 @@ const myEqpmIaoDetail = [
type: 'ReadPlcPop',
label: '대상 항목',
valueNm: 'objId',
disabled: true,
cols: 6,
class: 'py-3 pl-4',
class: 'py-3 pl-4 pb-0',
required: true,
disabled: true,
bindNm: 'objNm',
textCols: 12,
labelCols: 12,
@ -479,30 +472,39 @@ const myEqpmIaoDetail = [
readonly: true,
disabled: true,
cols: 6,
class: 'py-3 pl-4 pt-1',
class: 'py-3 pl-4 pt-0',
textCols: 12,
labelCols: 12,
iconShow: true
},
// ============
{
type: 'EvtObjPop',
labelContent: '대상 항목 111',
labelContent: '대상 항목',
valueNm: 'objId',
valueNm2: 'objNm',
bindNm: 'objNm',
disabled: true,
required: true,
cols: 6,
class: 'py-3 d-none',
class: 'py-3 pl-4 d-none',
disableContent: true,
textCols: 12,
labelCols: 12,
iconShow: true
},
{
type: 'InputText',
cols: 5,
type: 'Label',
cols: 6,
class: 'py-3 d-none',
disabled: true,
textCols: 12,
labelCols: 12,
},
{
type: 'InputText',
cols: 6,
class: 'py-3 pl-4 d-none',
valueNm: 'objNm',
readonly: true,
disabled: true,
@ -510,6 +512,7 @@ const myEqpmIaoDetail = [
labelCols: 12,
iconShow: true
},
// --------------------------------------------
{
type: 'SelectBox',
label: '에너지원',
@ -614,13 +617,11 @@ const myEqpmIaoDetail = [
iconShow: true
},
];
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: '-',
field1: '1111',
field2: '2222',
});
</script>
<style lang="scss" scoped >
::v-deep {
.tui-grid-layer-state {
top: 40px !important;
}
}
</style>

View File

@ -20,6 +20,12 @@
</v-card>
</v-col>
</v-row>
<!-- Create the line between date picker and form -->
<v-row class="my-5" no-gutters>
<v-col>
<div style="height: 1px; background-color: #ccc;"></div>
</v-col>
</v-row>
<v-row class="search-box" align="center" no-gutters style="height: 44px;">
<v-col :cols="4">
<label for="" class="search-box-label">
@ -271,63 +277,6 @@ export default {
value: myColumns,
});
const res = [
{
"comId": "COM001",
"ercId": "ERC001",
"objMm": "202507",
"objYm": "2025-07",
"unitPrce": 120.5,
"peakPow": 450,
"baseChrg": 30000,
"notiChrg": 32500,
"rmrk": "Standard summer rate",
"blocId": "BLOC001",
"regUserNo": "USER001",
"regDttm": "2025-07-01T09:00:00",
"procUserNo": "USER002",
"procDttm": "2025-07-15T14:30:00"
},
{
"comId": "COM002",
"ercId": "ERC002",
"objMm": "202507",
"objYm": "2025-07",
"unitPrce": 98.75,
"peakPow": 300,
"baseChrg": 25000,
"notiChrg": 27000,
"rmrk": "Reduced rate for solar",
"blocId": "BLOC002",
"regUserNo": "USER003",
"regDttm": "2025-07-02T10:15:00",
"procUserNo": "USER004",
"procDttm": "2025-07-16T11:45:00"
},
{
"comId": "COM003",
"ercId": "ERC003",
"objMm": "202507",
"objYm": "2025-07",
"unitPrce": 110.0,
"peakPow": 400,
"baseChrg": 28000,
"notiChrg": 29500,
"rmrk": "Geothermal adjustment",
"blocId": "BLOC003",
"regUserNo": "USER005",
"regDttm": "2025-07-03T08:45:00",
"procUserNo": "USER006",
"procDttm": "2025-07-17T13:20:00"
}
]
this.setGridData({
gridKey: this.gridName,
value: res,
});
this.loadGrid = true;
},
async btnActions(action) {

View File

@ -1,10 +1,10 @@
<template>
<div>
<div
class="d-flex justify-space-between align-center"
style="height: 80px;"
class="d-flex justify-space-between"
style="height: 45px;"
>
<span class="txt">검침 대상 추가 정보</span>
<span class="txt custom-subtitle-tab">검침 대상 추가 정보</span>
<Buttons
:parentPrgmId="parentPrgmId"
:bindingData="gridName"
@ -20,8 +20,6 @@
:editorGrid="true"
:innerTabGridInfo="innerTabGridInfo"
@getRowsData="getRowData"
:selectedRowDataWatchFlag="true"
:dataPath="dataPathMock"
/>
</div>
</div>
@ -55,23 +53,10 @@ export default {
},
data() {
return {
loadGrid: true,
loadGrid: false,
gridName: 'rowDetailGrid',
rowKey: null,
edtingFinishFlag: 'Y',
dataPathMock: {
"rowDetailGrid": {
column: [
{ header: '검침 대상 ID', name: 'readObjId', align: 'left' },
{ header: '검침 대상 명', name: 'readObjNm', align: 'left' },
{ header: '검침 대상 유형', name: 'readObjKind', align: 'left' },
{ header: '그룹', name: 'grpCd', align: 'left' },
],
data: dataPathDataExample,
defaultRow: dataPathDataExample,
option: {}
}
},
};
},
computed: {
@ -158,7 +143,6 @@ export default {
class CustomRenderer {
constructor(props) {
//const { min, max } = props.columnInfo.renderer.options;
//console.log('props: %o', props);
const el = document.createElement('input');
if (
@ -230,15 +214,12 @@ export default {
}
$(el).addClass('tui-grid-content-text');
}
// console.log('props: %o', props);
// console.log('el: %o', el);
this.el = el;
this.render(props);
}
change(ev) {
//console.log('props: %o', ev);
if (ev.target.checked) {
ev.target.value = 1;
} else {
@ -260,7 +241,6 @@ export default {
} else {
this.el.value = String(props.value);
}
//console.log('props: %o', props);
}
mounted() {
@ -276,7 +256,7 @@ export default {
{ header: '검침 대상 ID', name: 'readObjId', hidden: true },
{
header: '추가 정보',
name: 'addInfoId',
name: 'addInfoId',
align: 'left',
formatter({ value }) {
let retVal = '';
@ -290,7 +270,7 @@ export default {
{
header: 'Data 구분',
name: 'addInfoDataKind',
align: 'center',
align: 'left',
formatter({ value }) {
let retVal = '';
const newValue = addInfoDataKindList.filter(
@ -338,8 +318,6 @@ export default {
},
//{ header: "추가 정보 값", name: "addInfoVal", align: "center" , editor: "text",
// formatter({ value, row , column}) {
// console.log("addInfoVal row : ", row);
// console.log("addInfoVal state : ", column);
// if(row.addInfoDataKind === "NUM"){
// column.align = "right";
// }else{
@ -461,25 +439,4 @@ export default {
search() {},
},
};
const dataPathDataExample = [
{
readObjId: 'OBJ001',
readObjNm: '서울 본사',
readObjKind: 'TYPE01',
grpCd: 'GRP01',
},
{
readObjId: 'OBJ002',
readObjNm: '부산 지사',
readObjKind: 'TYPE02',
grpCd: 'GRP02',
},
{
readObjId: 'OBJ003',
readObjNm: '대전 공장',
readObjKind: 'TYPE03',
grpCd: 'GRP01',
}
];
</script>

View File

@ -1,26 +1,12 @@
<template>
<div>
<div
class="d-flex justify-space-between"
>
<div class="d-flex justify-space-between">
<v-card-title class="px-0 pt-0 custom-title-4">검침개소 추가 정보</v-card-title>
<Buttons
:parentPrgmId="parentPrgmId"
:bindingData="gridName"
:btnActionsFnc="btnActions"
/>
<Buttons :parentPrgmId="parentPrgmId" :bindingData="gridName" :btnActionsFnc="btnActions" />
</div>
<div ref="gridParent">
<Grid
:ref="gridName"
:gridName="gridName"
:parentPrgmId="parentPrgmId"
:editorGrid="true"
:innerTabGridInfo="innerTabGridInfo"
@getRowsData="getRowData"
:dataPath="addInfoTabData"
/>
<div ref="gridParent" style="height: calc(100vh - 520px);">
<Grid :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName" :parentPrgmId="parentPrgmId"
:editorGrid="true" :innerTabGridInfo="innerTabGridInfo" @getRowsData="getRowData" />
</div>
</div>
</template>
@ -53,65 +39,65 @@ export default {
},
data() {
return {
loadGrid: true,
loadGrid: false,
gridName: 'rowDetailGrid',
rowKey: null,
edtingFinishFlag: 'Y',
addInfoTabData: {
"rowDetailGrid": {
data: [
// addInfoTabData: {
// "rowDetailGrid": {
// data: [
{
readPlcNm: '서울 본사',
plcKind: '전기',
useFg: '1',
},
// {
// readPlcNm: '서울 본사',
// plcKind: '전기',
// useFg: '1',
// },
],
column: [
// { header: '회사 ID', name: 'comId', hidden: true },
{
header: '검침개소명',
name: 'readPlcNm',
align: 'left',
minWidth: 400,
},
{
header: '개소 종류',
name: 'plcKind',
minWidth: 100,
align: 'center',
// formatter({ value }) {
// let retVal = '';
// const newValue = _this.pageData.plcKindList.filter(
// item => item.commCd == value,
// );
// if (newValue.length > 0) {
// retVal = newValue[0].commCdNm;
// }
// return retVal;
// },
},
{
header: '사용 여부',
name: 'useFg',
minWidth: 100,
align: 'center',
// formatter({ value }) {
// value = value === true ? '1' : '0';
// const newValue = _this.pageData.useFgList.filter(
// item => item.commCd == value,
// );
// return newValue[0].commCdNm;
// },
},
]
// ],
// column: [
// // { header: '회사 ID', name: 'comId', hidden: true },
// {
// header: '검침개소명',
// name: 'readPlcNm',
// align: 'left',
// minWidth: 400,
// },
// {
// header: '개소 종류',
// name: 'plcKind',
// minWidth: 100,
// align: 'center',
// // formatter({ value }) {
// // let retVal = '';
// // const newValue = _this.pageData.plcKindList.filter(
// // item => item.commCd == value,
// // );
// // if (newValue.length > 0) {
// // retVal = newValue[0].commCdNm;
// // }
// // return retVal;
// // },
// },
// {
// header: '사용 여부',
// name: 'useFg',
// minWidth: 100,
// align: 'center',
// // formatter({ value }) {
// // value = value === true ? '1' : '0';
// // const newValue = _this.pageData.useFgList.filter(
// // item => item.commCd == value,
// // );
// // return newValue[0].commCdNm;
// // },
// },
// ]
}
}
// }
// }
};
},
computed: {
@ -166,9 +152,9 @@ export default {
bodyHeight: gridHeight,
minBodyHeight: gridHeight,
header: {
height: 28,
height: 37,
},
rowHeight: 29,
rowHeight: 37,
minRowHeight: 29,
selectionUnit: 'row',
editingEvent: 'click',
@ -178,128 +164,128 @@ export default {
value: myOptions,
});
// const _this = this;
// let useFgSelectList = [];
// this.pageData.useFgList.forEach(item => {
// const it = { text: item.commCdNm, value: item.commCd };
// useFgSelectList.push(it);
// });
// let addInfoList = [];
// this.pageData.addInfoList.forEach(item => {
// const it = { text: item.addInfoNm, value: item.addInfoId };
// addInfoList.push(it);
// });
// let addInfoDataKindList = [];
// this.pageData.addInfoDataKindList.forEach(item => {
// const it = { text: item.commCdNm, value: item.commCd };
// addInfoDataKindList.push(it);
// });
const _this = this;
let useFgSelectList = [];
this.pageData.useFgList.forEach(item => {
const it = { text: item.commCdNm, value: item.commCd };
useFgSelectList.push(it);
});
let addInfoList = [];
this.pageData.addInfoList.forEach(item => {
const it = { text: item.addInfoNm, value: item.addInfoId };
addInfoList.push(it);
});
let addInfoDataKindList = [];
this.pageData.addInfoDataKindList.forEach(item => {
const it = { text: item.commCdNm, value: item.commCd };
addInfoDataKindList.push(it);
});
// const myColumns = [
// { header: '회사 ID', name: 'comId', hidden: true },
// { header: '검침개소 번호', name: 'readPlcId', hidden: true },
// {
// header: '추가 정보',
// name: 'addInfoId',
// align: 'left',
// formatter({ value }) {
// let retVal = '';
// const newValue = addInfoList.filter(item => item.value == value);
// if (newValue.length > 0) {
// retVal = newValue[0].text;
// }
// return retVal;
// },
// },
// {
// header: 'Data 구분',
// name: 'addInfoDataKind',
// align: 'center',
// formatter({ value }) {
// let retVal = '';
// const newValue = addInfoDataKindList.filter(
// item => item.value == value,
// );
// if (newValue.length > 0) {
// retVal = newValue[0].text;
// }
// return retVal;
// },
// // editor: {
// // type: "select",
// // options: {
// // listItems: addInfoDataKindList
// // }
// // }
// },
// {
// header: '숫자 값',
// name: 'addInfoNumVal',
// align: 'right',
// editor: 'text',
// hidden: true,
// },
// {
// header: '문자 값',
// name: 'addInfoTxtVal',
// align: 'left',
// editor: 'text',
// hidden: true,
// },
// {
// header: '추가 정보 값',
// name: 'addInfoVal',
// align: 'center',
// renderer: {
// type: NewCustomRenderer,
// },
// editor: {
// type: NewCustomEditor,
// },
// formatter(data) {
// return data.row.addInfoDataKind;
// },
// },
//{ header: "추가 정보 값", name: "addInfoVal", align: "center" , editor: "text",
// formatter({ value, row , column}) {
// console.log("addInfoVal row : ", row);
// console.log("addInfoVal state : ", column);
// if(row.addInfoDataKind === "NUM"){
// column.align = "right";
// }else{
// column.align = "left";
// }
// return value;
// }
//},
const myColumns = [
{ header: '회사 ID', name: 'comId', hidden: true },
{ header: '검침개소 번호', name: 'readPlcId', hidden: true },
{
header: '추가 정보',
name: 'addInfoId',
align: 'left',
formatter({ value }) {
let retVal = '';
const newValue = addInfoList.filter(item => item.value == value);
if (newValue.length > 0) {
retVal = newValue[0].text;
}
return retVal;
},
},
{
header: 'Data 구분',
name: 'addInfoDataKind',
formatter({ value }) {
let retVal = '';
const newValue = addInfoDataKindList.filter(
item => item.value == value,
);
if (newValue.length > 0) {
retVal = newValue[0].text;
}
return retVal;
},
// editor: {
// type: "select",
// options: {
// listItems: addInfoDataKindList
// }
// }
},
{
header: '숫자 값',
name: 'addInfoNumVal',
align: 'right',
editor: 'text',
hidden: true,
},
{
header: '문자 값',
name: 'addInfoTxtVal',
align: 'left',
editor: 'text',
hidden: true,
},
{
header: '추가 정보 값',
name: 'addInfoVal',
align: 'center',
renderer: {
type: NewCustomRenderer,
},
editor: {
type: NewCustomEditor,
},
formatter(data) {
return data.row.addInfoDataKind;
},
},
// {
// header: "추가 정보 값", name: "addInfoVal", align: "center", editor: "text",
// formatter({ value, row, column }) {
// console.log("addInfoVal row : ", row);
// console.log("addInfoVal state : ", column);
// if (row.addInfoDataKind === "NUM") {
// column.align = "right";
// } else {
// column.align = "left";
// }
// return value;
// }
// },
/*{
header: "사용여부",
name: "useFg",
align: "center",
formatter({ value }) {
return value == "1" ? "사용" : "사용안함";
},
editor: {
type: "select",
options: {
// listItems: useFgSelectList
listItems: [
{text:"사용", value:"1"},
{text:"사용안함", value:"0"},
]
}
}
},*/
// { header: '등록 사용자', name: 'regUserNo', hidden: true },
// { header: '등록 일자', name: 'regDttm', hidden: true },
// { header: '수정 사용자', name: 'procUserNo', hidden: true },
// { header: '수정 일자', name: 'procDttm', hidden: true },
// ];
header: "사용여부",
name: "useFg",
align: "center",
formatter({ value }) {
return value == "1" ? "사용" : "사용안함";
},
editor: {
type: "select",
options: {
// listItems: useFgSelectList
listItems: [
{text:"사용", value:"1"},
{text:"사용안함", value:"0"},
]
}
}
},*/
{ header: '등록 사용자', name: 'regUserNo', hidden: true },
{ header: '등록 일자', name: 'regDttm', hidden: true },
{ header: '수정 사용자', name: 'procUserNo', hidden: true },
{ header: '수정 일자', name: 'procDttm', hidden: true },
];
// this.setGridColumn({
// gridKey: this.gridName,
// value: myColumns,
// });
this.setGridColumn({
gridKey: this.gridName,
value: myColumns,
});
this.loadGrid = true;
},
@ -379,7 +365,7 @@ export default {
gridEditingFinish2(data, bindingData) {
this.$refs[bindingData].editingFinish(data);
},
search() {},
search() { },
},
};
</script>

View File

@ -7,10 +7,10 @@
</div>
<div ref="gridParent" style="height: calc((100vh - 520px) /2);">
<Grid :ref="gridName" :gridName="gridName" :parentPrgmId="parentPrgmId" @getRowsData="getRowData"
:innerTabGridInfo="innerTabGridInfo" :dataPath="imgInfoTabData" />
<Grid :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName" :parentPrgmId="parentPrgmId" @getRowsData="getRowData"
:innerTabGridInfo="innerTabGridInfo" />
</div>
<div ref="formParent">
<div ref="formParent" style="height: calc((100vh - 400px) /2);">
<component :is="'Form'" :parentPrgmId="parentPrgmId" :bindingData="gridName"
:detailList="detailReadPlcImgList" @gridEditingFinish="gridEditingFinish" />
</div>
@ -44,26 +44,9 @@ export default {
},
data() {
return {
loadGrid: true,
loadGrid: false,
gridName: 'rowReadPlcImgGrid',
detailReadPlcImgList: myReadPlcImgDetail,
imgInfoTabData: {
"rowReadPlcImgGrid": {
data:
[
{ "objReadPlcId": "1001", "objReadPlcNm": "서울역", "distRt": 12 },
{ "objReadPlcId": "1002", "objReadPlcNm": "강남역", "distRt": 8 },
{ "objReadPlcId": "1003", "objReadPlcNm": "잠실역", "distRt": 15 },
]
,
column: [
{ header: '대상 검침개소 번호', name: 'objReadPlcId', align: 'center' },
{ header: '대상 검침개소명', name: 'objReadPlcNm', align: 'left' },
{ header: '분배율(1~100)', name: 'distRt', align: 'right' },
]
}
}
};
},
computed: {
@ -118,12 +101,13 @@ export default {
// bodyHeight: gridHeight,
// minBodyHeight: gridHeight,
header: {
height: 28,
height: 37,
},
rowHeight: 29,
minRowHeight: 29,
rowHeight: 37,
// minRowHeight: 29,
selectionUnit: 'row',
editingEvent: 'click',
rowHeight: 'auto',
};
this.setGridOption({
gridKey: this.gridName,
@ -140,13 +124,12 @@ export default {
const myColumns = [
{ header: '회사 ID', name: 'comId', hidden: true },
{ header: '검침개소 번호', name: 'readPlcId', hidden: true },
{ header: '대상 검침개소 번호', name: 'objReadPlcId', align: 'center' },
{ header: '대상 검침개소 번호', name: 'objReadPlcId'},
{ header: '대상 검침개소명', name: 'objReadPlcNm', align: 'left' },
{ header: '분배율(1~100)', name: 'distRt', align: 'right' },
{
header: '가감유형',
name: 'ddctKind',
align: 'center',
formatter({ value }) {
let retVal = '';
const newValue = ddctKindList.filter(item => item.value == value);

View File

@ -6,12 +6,23 @@
:btnActionsFnc="btnActions" />
</div>
<div ref="gridParent" style="height: calc((100vh - 520px) /2);">
<Grid :ref="gridName" :gridName="gridName" :parentPrgmId="parentPrgmId" @getRowsData="getRowData"
:innerTabGridInfo="innerTabGridInfo" :dataPath="tagRelTabData" />
<Grid
:ref="gridName"
:is="loadGrid ? 'Grid' : null"
:gridName="gridName"
:parentPrgmId="parentPrgmId"
@getRowsData="getRowData"
:innerTabGridInfo="innerTabGridInfo"
/>
</div>
<div ref="formParent" >
<component :is="'Form'" :parentPrgmId="parentPrgmId" :bindingData="gridName"
:detailList="detailReadPlcTagList" @gridEditingFinish="gridEditingFinish" />
<div ref="formParent" style="height: calc((100vh - 400px) /2);">
<component
:is="'Form'"
:parentPrgmId="parentPrgmId"
:bindingData="gridName"
:detailList="detailReadPlcTagList"
@gridEditingFinish="gridEditingFinish"
/>
</div>
</div>
</template>
@ -19,7 +30,7 @@
import { mapState, mapMutations, mapActions } from 'vuex';
import Buttons from '~/components/common/button/Buttons';
import Grid from '~/components/common/Grid';
import { CustumChecbox } from '~/plugins/gridUtility';
import { CustomCheckbox } from '~/plugins/gridUtility';
import { CustomNumberEditor } from '~/plugins/gridUtility';
import Form from '~/components/common/form/Form';
import mixinGlobal from '@/mixin/global.js';
@ -46,78 +57,7 @@ export default {
loadGrid: false,
gridName: 'rowReadPlcTagRelGrid',
detailReadPlcTagList: myReadPlcTagDetail,
tagRelTabData: {
"rowReadPlcTagRelGrid": {
data:
[
{
"tagNm": "TAG_001",
"ercId": "전기",
"distRt": 10,
"reprTagFg": "1",
"useFg": "Y",
"rmrk": "기본 설정",
"tagId": "TAG_001"
},
{
"tagNm": "TAG_002",
"ercId": "가스",
"distRt": 15,
"reprTagFg": "0",
"useFg": "Y",
"rmrk": "",
"tagId": "TAG_002"
},
{
"tagNm": "TAG_003",
"ercId": "수도",
"distRt": 8,
"reprTagFg": "0",
"useFg": "N",
"rmrk": "테스트용",
"tagId": "TAG_003"
},
]
,
column: [
{ header: 'TAG 명', name: 'tagNm', align: 'left' },
{
header: '에너지원',
name: 'ercId',
align: 'center',
width: 100,
},
{
header: '분배율(1~100)',
name: 'distRt',
align: 'right',
width: 100,
},
{
header: '대표 TAG 여부',
name: 'reprTagFg',
align: 'center',
width: 100,
formatter({ value }) {
return value == '1' ? '예' : '아니오';
},
},
{
header: '사용여부',
name: 'useFg',
align: 'center',
width: 100,
},
{ header: '비고', name: 'rmrk', align: 'left', width: 100 },
{ header: 'TAG ID', name: 'tagId', align: 'center', hidden: true },
]
}
}
};
},
computed: {
@ -170,9 +110,9 @@ export default {
// bodyHeight: gridHeight,
// minBodyHeight: gridHeight,
header: {
height: 28,
height: 37,
},
rowHeight: 29,
rowHeight: 37,
minRowHeight: 29,
selectionUnit: 'row',
editingEvent: 'click',
@ -213,7 +153,6 @@ export default {
{
header: '에너지원',
name: 'ercId',
align: 'center',
width: 100,
formatter({ value }) {
let retVal = '';
@ -242,10 +181,9 @@ export default {
{
header: '대표 TAG 여부',
name: 'reprTagFg',
align: 'center',
width: 100,
// renderer: {
// type: CustumChecbox,
// type: CustomCheckbox,
// options: {
// onlyone: true,
// // disabled: true
@ -258,7 +196,6 @@ export default {
{
header: '사용여부',
name: 'useFg',
align: 'center',
width: 100,
formatter({ value }) {
value = value === true ? '1' : '0';
@ -274,7 +211,7 @@ export default {
// }
// }
},
{ header: '비고', name: 'rmrk', align: 'left', width: 100 },
{ header: '비고', name: 'rmrk', width: 100 },
{ header: '등록 사용자', name: 'regUserNo', hidden: true },
{ header: '등록 일자', name: 'regDttm', hidden: true },
{ header: '수정 사용자', name: 'procUserNo', hidden: true },
@ -395,7 +332,7 @@ const myReadPlcTagDetail = [
valueNm2: 'tagNm',
disabled: true,
cols: 6,
class: 'pr-4 pb-2 py-3',
class: 'pr-4 pb-2 py-2',
required: true,
labelCols: 12,
textCols: 12,
@ -408,7 +345,7 @@ const myReadPlcTagDetail = [
valueNm: 'ercId',
disabled: false,
cols: 6,
class: 'pl-4 py-3',
class: 'pl-4 pb-2 py-3',
list: 'ercNmList',
itemText: 'text',
itemValue: 'value',

View File

@ -1,7 +1,7 @@
<template>
<v-card class="pb-5">
<v-card-title class="d-flex justify-space-between align-end">
<span class="tit ft-size_20 ft-weight_600">TAG 추가 정보</span>
<span style="color:#000000A6" class="tit custom-title-4-new">TAG 추가 정보</span>
<Buttons
:parentPrgmId="parentPrgmId"
:bindingData="gridName"
@ -107,8 +107,7 @@ export default {
header: {
height: 38,
},
rowHeight: 22,
minRowHeight: 22,
selectionUnit: 'row',
editingEvent: 'click',
};
@ -269,7 +268,7 @@ export default {
{
header: 'Data 구분',
name: 'addInfoDataKind',
align: 'center',
align: 'left',
formatter({ value }) {
let retVal = '';
const newValue = addInfoDataKindList.filter(

View File

@ -9,7 +9,6 @@
<div class="lnb-logo">
<img v-if="isDarkMode" src="@/assets/images/logo_dm.png" />
<img v-else src="@/assets/images/logo_lm.png" />
<!-- <img v-else src="@/assets/images/logo_lm.png" /> -->
</div>
<!-- <div class="lnb-logo">FEMS</div>-->
</router-link>
@ -40,16 +39,16 @@
<v-menu offset-y>
<template v-slot:activator="{ on, attrs }">
<a-button
:ripple="false"
tile
class="btn-header"
v-bind="attrs"
v-on="on"
style="width: 100px"
>
<span class="body-2">즐겨찾기</span>
<v-icon size="20">mdi-chevron-down</v-icon>
</a-button>
:ripple="false"
tile
class="btn-header"
v-bind="attrs"
v-on="on"
style="width: 100px"
>
<span class="body-2">즐겨찾기</span>
<v-icon size="20">mdi-chevron-down</v-icon>
</a-button>
<!-- <a-button style="width: 100px; height: 36px" class="btn-header">
<span class="body-2">즐겨찾기</span>
<v-icon size="20">mdi-chevron-down</v-icon></a-button> -->
@ -62,10 +61,10 @@
</v-list-item>
</v-list>
</v-menu>
<a-button id="refresh" class="btn-header" @click="removeBookMark" v-if="bookmarkBtn == 1">
<a-button id="removeBm" class="btn-header" @click="removeBookMark" v-if="bookmarkBtn == 1">
<span class="material-icons" style="font-size: 17px">star</span>
</a-button>
<a-button id="refresh" class="btn-header" :style="{
<a-button id="addBm" class="btn-header" :style="{
display: 'flex',
alignItems: 'center'}" @click="addBookMark" v-if="bookmarkBtn == 0">
<span class="material-icons" style="font-size: 17px">star_border</span>
@ -88,39 +87,12 @@
</v-row>
</div>
<v-main>
<v-container fluid>
<v-row class="flex-nowrap">
<div class="menu-container">
<v-navigation-drawer ref="navigationdrawer" :value="drawer" :mini-variant="miniVariant" :clipped="clipped"
:absolute="false" mini-variant-width="60">
<div class="d-flex align-center justify-space-between py-4 px-3" v-if="false">
<router-link class="home" :to="myHome.root">
<div class="lnb-logo">
<img v-if="isDarkMode" src="@/assets/images/logo_dm.png" />
<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',
color: isDarkMode ? '#fff' : '#111',
}" />
<!-- <router-view :key="$route.fullPath"/> -->
</div>
<!--
v-model="treeValue"
return-object
@input="treeModel"
@update:active="clkTab"
-->
<AdminMenu :miniVariant="miniVariant" :userNm="this.userInfo.userNm" :comId="this.userInfo.comId" v-if="false" />
<component ref="changePswdPop" :is="'ChangePswdPop'" v-show="false" :comId="this.userInfo.comId" />
<v-treeview ref="treeview" :active.sync="activeTree" active-class="v-treeview-node--active"
:items="treevieItems" activatable hoverable color="#3896ff" open-on-click @update:open="openNode">
@ -137,25 +109,19 @@
:class="miniVariant === false ? 'mr-2' : ''" size="9">
$depth3rdBulletDark
</v-icon>
<span v-if="item.url">{{ item.menuNm }}
<span v-if="item.url">
{{ item.menuNm }}
<!-- <span v-if="item.bookmark" class="material-icons" style="font-size: 17px; vertical-align: middle;" @click="addBookMark(item.menuId, item.url, item.bookmark)">star</span>
<span v-else-if="!item.bookmark" class="material-icons" style="font-size: 17px; vertical-align: middle;" @click="addBookMark(item.menuId, item.url, item.bookmark)">star_border</span> -->
</span>
<span v-else-if="!item.url">{{ item.menuNm }}</span>
<v-icon v-if="item.lvl >= 1 && item.childeVo && item.childeVo.length > 0 && !item.url">
<!-- <v-icon v-if="item.lvl >= 1 && item.childeVo && item.childeVo.length > 0 && !item.url">
mdi-chevron-down
</v-icon>
</v-icon> -->
<a-icon type="down" v-if="item.lvl >= 1 && item.childeVo && item.childeVo.length > 0 && !item.url" />
</button>
</template>
</v-treeview>
<!-- <template #append>
<p
class="text-caption"
:style="{ letterSpacing: '-0.2px !important' }"
>
&copy; 2022. SK C&C all rights reserved.
</p>
</template> -->
</v-navigation-drawer>
</div>
@ -322,19 +288,6 @@
</div>
</div>
</v-main>
<!-- <v-footer
:absolute="!fixed"
app
:class="
drawer
? miniVariant
? 'drawerFooter miniFooter'
: 'drawerFooter'
: 'full-size'
"
>
<span>&copy; 2022. SK C&C all rights reserved.</span>
</v-footer> -->
</fullscreen>
</v-app>
</template>
@ -833,7 +786,7 @@ export default {
// console.log('if isLoading stmt3');
// return;
// }
alert("move to", url);
// alert("move to", url);
this.$router.push({
path: url + "?prgmId=" + prgmId,
});

View File

@ -1,809 +0,0 @@
<template>
<v-app :class="`${isDarkMode ? 'dark-mode' : 'light-mode'}`">
<!-- <v-app :class="'light-mode'"> -->
<fullscreen :fullscreen.sync="fullscreen">
<v-navigation-drawer
ref="navigationdrawer"
:value="drawer"
:mini-variant="miniVariant"
:clipped="clipped"
:absolute="true"
mini-variant-width="60"
fixed
app
>
<div class="d-flex align-center justify-space-between py-4 px-3">
<router-link class="home" :to="myHome.root">
<div class="lnb-logo">
<img v-if="isDarkMode" src="@/assets/images/logo_dm.png" />
<img v-else src="@/assets/images/logo_lm.png" />
</div>
<!-- <div class="lnb-logo">FEMS</div>-->
</router-link>
<v-app-bar-nav-icon
ref="appbarnavicon"
id="appbarnavicon"
@click.stop="miniVariant = !miniVariant"
@click="updateTreeview"
:style="{
backgroundColor: 'transparent',
color: isDarkMode ? '#fff' : '#111',
}"
/>
<!-- <router-view :key="$route.fullPath"/> -->
</div>
<!--
v-model="treeValue"
return-object
@input="treeModel"
@update:active="clkTab"
-->
<AdminMenu
:miniVariant="miniVariant"
:userNm="this.userInfo.userNm"
:comId="this.userInfo.comId"
/>
<component
ref="changePswdPop"
:is="'ChangePswdPop'"
v-show="false"
:comId="this.userInfo.comId"
/>
<v-treeview
ref="treeview"
:active.sync="activeTree"
active-class="v-treeview-node--active"
:items="treevieItems"
activatable
hoverable
color="#3896ff"
open-on-click
@update:open="openNode"
>
<template slot="label" slot-scope="{ item }">
<button
:class="{ 'justify-center': miniVariant }"
@mouseover="doMouseOver"
>
<v-icon
v-if="item.lvl === 1 && menuIconKeys.includes(item.menuId)"
v-text="menuIconById[item.menuId]"
:class="{ 'mr-2': !miniVariant }"
size="20"
></v-icon>
<v-icon
v-else-if="
item.lvl === 1 && !menuIconKeys.includes(item.menuId)
"
:class="{ 'mr-2': !miniVariant }"
size="20"
>mdi-package-variant-closed</v-icon
>
<v-icon
v-else-if="item.lvl === 2"
:class="{ 'mr-2': !miniVariant }"
size="10"
>
mdi-checkbox-blank
</v-icon>
<v-icon
v-else-if="
item.lvl >= 3 && item.childeVo.length === 0 && item.url
"
:class="miniVariant === false ? 'mr-2' : ''"
size="9"
>
$depth3rdBulletDark
</v-icon>
<span v-if="item.url"
>{{ item.menuNm }}
<!-- <span v-if="item.bookmark" class="material-icons" style="font-size: 17px; vertical-align: middle;" @click="addBookMark(item.menuId, item.url, item.bookmark)">star</span>
<span v-else-if="!item.bookmark" class="material-icons" style="font-size: 17px; vertical-align: middle;" @click="addBookMark(item.menuId, item.url, item.bookmark)">star_border</span> -->
</span>
<span v-else-if="!item.url">{{ item.menuNm }}</span>
<v-icon
v-if="item.lvl >= 1 && item.childeVo.length > 0 && !item.url"
>
mdi-chevron-down
</v-icon>
</button>
</template>
</v-treeview>
<!-- <template #append>
<p
class="text-caption"
:style="{ letterSpacing: '-0.2px !important' }"
>
&copy; 2022. SK C&C all rights reserved.
</p>
</template> -->
</v-navigation-drawer>
<v-main>
<v-container fluid>
<router-tab
ref="routerTab"
:tabs="treevieItems"
:keep-last-tab="false"
:contextmenu="false"
>
<template slot-scope="{ title, closable, to }">
<span>{{ title }}</span>
<v-icon
size="18"
class="ml-2"
v-if="closable"
@click.stop="onCloseTab(to)"
>mdi-close-circle</v-icon
>
</template>
<template #end>
<!--<ThemeSwitch />-->
<v-menu offset-y>
<template v-slot:activator="{ on, attrs }">
<v-btn
:ripple="false"
tile
class="btn-close"
v-bind="attrs"
v-on="on"
>
<span class="body-2">닫기</span>
<v-icon size="20">mdi-chevron-down</v-icon>
</v-btn>
</template>
<v-list
class="py-2 btn-close-menu-list"
:style="{
backgroundColor: isDarkMode ? '#144985' : '#3f4d7d',
}"
>
<v-list-item class="px-2">
<v-list-item-title @click="delAllTabsData()" class="body-2"
>전체 닫기</v-list-item-title
>
</v-list-item>
<v-list-item class="px-2">
<v-list-item-title
@click="deleteSblingsTab()"
class="body-2"
>나머지 닫기</v-list-item-title
>
</v-list-item>
</v-list>
</v-menu>
<v-menu offset-y>
<template v-slot:activator="{ on, attrs }">
<v-btn
:ripple="false"
tile
class="btn-close"
v-bind="attrs"
v-on="on"
style="width:100px;"
>
<span class="body-2">즐겨찾기</span>
<v-icon size="20">mdi-chevron-down</v-icon>
</v-btn>
</template>
<v-list
v-if="myMenuList.length > 0"
class="py-2 btn-close-menu-list"
:style="{
backgroundColor: isDarkMode ? '#144985' : '#3f4d7d',
}"
>
<v-list-item
v-for="item in myMenuList"
:key="item.menuId"
class="px-2"
style="cursor:pointer;"
>
<v-list-item-title
@click="moveToMyMenu(item.url, item.menuId, item.prgmId)"
class="body-2"
>{{ item.menuNm }}</v-list-item-title
>
</v-list-item>
</v-list>
</v-menu>
<v-btn
icon
tile
:ripple="false"
@click="removeBookMark()"
v-if="bookmarkBtn == 1"
>
<span
class="material-icons"
style="font-size: 17px; vertical-align: middle;"
>star</span
>
</v-btn>
<v-btn
icon
tile
:ripple="false"
@click="addBookMark()"
v-if="bookmarkBtn == 0"
>
<span
class="material-icons"
style="font-size: 17px; vertical-align: middle;"
>star_border</span
>
</v-btn>
<v-btn
id="refresh"
icon
tile
:ripple="false"
@click="refreshTab()"
>
<v-icon>mdi-refresh</v-icon>
</v-btn>
<v-btn icon tile :ripple="false" @click="setDrawer()">
<v-icon>mdi-crop-free</v-icon>
</v-btn>
<!-- <v-btn icon tile :ripple="false" @click="toggle()">
<v-icon v-if="!fullscreen">mdi-arrow-expand-all</v-icon>
<v-icon v-else>mdi-arrow-collapse-all</v-icon>
</v-btn> -->
</template>
</router-tab>
</v-container>
<div v-if="loadingStackCnt > 0" class="loading-container">
<div class="loading">
<Fade-loader />
</div>
</div>
</v-main>
<!-- <v-footer
:absolute="!fixed"
app
:class="
drawer
? miniVariant
? 'drawerFooter miniFooter'
: 'drawerFooter'
: 'full-size'
"
>
<span>&copy; 2022. SK C&C all rights reserved.</span>
</v-footer> -->
</fullscreen>
</v-app>
</template>
<script>
import { mapState, mapActions, mapMutations } from 'vuex'; // , mapActions
import ThemeSwitch from '@/components/common/ThemeSwitch';
import AdminMenu from '@/components/common/AdminMenu';
import FadeLoader from 'vue-spinner/src/FadeLoader.vue';
import ChangePswdPop from '~/components/common/modal/ChangePswdPop';
export default {
components: {
ThemeSwitch,
AdminMenu,
FadeLoader,
ChangePswdPop,
},
data() {
return {
fullscreen: false,
activeTree: [],
clipped: false,
fixed: false,
miniVariant: false,
// activeTabIdx: "",
routerTabInstance: null,
// programIdObj: null,
myPrgmId: null,
treeValue: [],
menuIconById: {
// MNU0003: 'mdi-chart-line',
// MNU0004: 'mdi-alarm-light',
// MNU0005: 'mdi-pencil-box-outline',
// MNU0006: 'mdi-cog-outline',
MNU0002: 'mdi-monitor',
MNU0091: 'mdi-chart-box',
MNU0102: 'mdi-human-male-board-poll',
MNU0103: 'mdi-file-chart-outline',
MNU0104: 'mdi-chart-sankey-variant',
MNU0106: 'mdi-database-edit-outline',
MNU0105: 'mdi-chart-bell-curve',
MNU0006: 'mdi-bulletin-board',
MNU0007: 'mdi-cog',
menu2: 'mdi-monitor',
menu3: 'mdi-chart-box',
menu4: 'mdi-human-male-board-poll',
menu5: 'mdi-file-chart-outline',
menu6: 'mdi-chart-sankey-variant',
menu7: 'mdi-database-edit-outline',
menu8: 'mdi-bulletin-board',
},
isLoading: false,
loadingStackCnt: 0,
bookmarkBtn: 0,
myMenuList: [],
prgmIdList: [],
initPageData: {},
obj: {},
newObj: {},
};
},
computed: {
...mapState({
myHome: 'myHome',
myHomeTabItems: 'myHomeTabItems',
indexRoot: 'indexRoot',
treevieItems: 'treevieItems',
menuData: 'menuData',
menuLink: state => state.modules.menu,
activeMenuId: state => state.activeMenuInfo.menuId,
isDarkMode: 'isDarkMode',
drawer: state => state.drawer,
userInfo: state => state.userInfo,
pageData: 'pageData',
}),
activeTabs() {
if (this.routerTabInstance) {
return this.routerTabInstance.activeTab;
} else {
return this.myHome.root;
}
},
menuIconKeys() {
return Object.keys(this.menuIconById);
},
},
watch: {
activeTabs: {
// 탭 클릭시 좌측 treeview 싱크 맞추가
deep: true,
handler(value) {
if (value) {
const prgmId = value.prgmId;
let thisPrgmId = this.$route.query.prgmId;
var tmp = 0;
for (var i = 0; i < this.myMenuList.length; i++) {
if (this.myMenuList[i].prgmId == thisPrgmId) {
tmp = 1;
}
}
this.bookmarkBtn = tmp;
//if (thisPrgmId && this.myPrgmId && this.myPrgmId != thisPrgmId) {
this.myPrgmId = prgmId;
this.activeTree.pop(); // 기존 황성화 트리 값 삭제
this.activeTree.push(thisPrgmId); // 인덱스가 아닐 경우 새로 넣어줌
// this.$set(this.activeTree, 0, prgmId); // treeview activetree 새로 셋팅 <= 위 pop() 과 push() 로 대체
//}
}
},
},
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;
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/');
// 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;
// }
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,
handler(newVal, oldVal) {},
},
pageData: {
deep: true,
handler(newVal, oldVal) {
localStorage.setItem('pageData', JSON.stringify(this.pageData));
//console.log("localPageData", this.pageData);
},
},
// menuLink: {
// deep: true,
// handler() {
// let prgmIdList = Object.keys(this.menuData);
// let initPageData = {};
// prgmIdList.forEach(item => {
// let newObj = {
// [item] : {}
// };
// initPageData = Object.assign(initPageData, newObj)
// });
// }
// }
},
created() {},
beforeUnmount() {
//window.removeEventListener('beforeunload', this.unLoadEvent);
},
async mounted() {
//window.addEventListener('beforeunload', this.unLoadEvent);
const _this = this;
await this.getMenu({});
await this.initPageDataFunc();
await this.selectMyMenuFunc();
this.routerTabInstance = this.$refs.routerTab;
if (this.$route.fullPath == '/') {
this.routerTabInstance.reset();
this.$router.replace(this.myHome.root);
} else if (this.$route.fullPath != this.myHome.root) {
this.$refs.routerTab.items.unshift(this.myHomeTabItems);
} else {
this.refreshTab();
}
// this.$router.beforeEach((to, from, next) => {
// _this.isLoading = true;
// // console.log('$router.beforeEach...');
// // console.log('_this.isLoading[beforeEach] : ', _this.isLoading);
// // console.log('_this.loadingStackCnt : ', _this.loadingStackCnt);
// if(_this.loadingStackCnt > 0 && _this.isLoading){
// next(false);
// // return;
// }else if (!to.matched.length){
// next(false);
// }else{
// next();
// }
// });
// this.$router.afterEach((to, from, failure) => {
// });
// 요청 인터셉터
this.$axios.interceptors.request.use(
function(config) {
//alert(1)
_this.isLoading = true;
if(config.url.search('Page')<0){
// _this.loadingStackCnt++;
}
return config;
},
function(error) {
// 에라 나면 로딩 끄기
//alert(2)
_this.isLoading = false;
// if(error.url.search('Page')<0){
// _this.loadingStackCnt--;
// }
return Promise.reject(error);
},
);
// 응답 인터셉터
this.$axios.interceptors.response.use(
function(response) {
_this.isLoading = false;
if(response.config.url.search('Page')<0){
_this.loadingStackCnt--;
}
//alert(3)
return response;
},
function(error) {
// 응답 에러 시에도 로딩 끄기
//alert(4 )
_this.isLoading = false;
// if(error.url.search('Page')<0){
// _this.loadingStackCnt--;
// }
return Promise.reject(error);
},
);
},
methods: {
...mapMutations({
setDrawer: 'setDrawer', // 사이드메뉴 접고 펼치기
setPageDataInit: 'setPageDataInit',
}),
...mapActions({
getMenu: 'modules/menu/getMenu', // 트리메뉴 가져오기
chkOpenTabList: 'chkOpenTabList', // 트리메뉴 클릭 시 해당 pprgmId push
postUpdateApi: 'modules/list/postUpdateApi',
postApiReturn: 'modules/list/postApiReturn',
}),
// // tabActive(id) {},
// clkTab(itemArr) {
// console.log(itemArr[0]);
// if (!itemArr[0].to) return;
// this.$router.push({
// path: itemArr[0].to
// });
// },
toggle() {
this.fullscreen = !this.fullscreen;
},
refreshTab() {
// console.log("현재 탭 새로고침");
//this.routerTabInstance.refresh();
this.$nuxt.refresh();
this.routerTabInstance.refresh();
},
delAllTabsData() {
// console.log("탭 전체 닫기");
// for (let i = this.routerTabInstance.items.length - 1; i > -1; --i) {
// const diffTo = this.routerTabInstance.items[i].to;
// if (diffTo != this.myHome.root) {
// this.routerTabInstance.items.splice(i, 1);
// }
// }
//if(this.$router.currentRoute.fullPath != this.myHome.root){
if (this.routerTabInstance.items.length > 0) {
this.routerTabInstance.reset();
}
this.$router.replace(this.myHome.root);
//}
},
deleteSblingsTab() {
// console.log("탭 나머지 닫기");
// for (let i = this.routerTabInstance.items.length - 1; i > -1; --i) {
// const activeTo = this.routerTabInstance.activeTab.to;
// const diffTo = this.routerTabInstance.items[i].to;
// if (activeTo != diffTo && diffTo != this.myHome.root) {
// this.routerTabInstance.items.splice(i, 1);
// }
// }
if (this.routerTabInstance.items.length > 1) {
for (let i = this.routerTabInstance.items.length - 1; i > -1; --i) {
const activeTo = this.routerTabInstance.activeTab.to;
const diffTo = this.routerTabInstance.items[i].to;
if (activeTo != diffTo && diffTo != this.myHome.root) {
this.routerTabInstance.close(diffTo);
}
}
}
},
tabScrollMove(dir) {
const scrollTab = this.routerTabInstance.$refs.scroll;
const scrollWidth =
scrollTab.scrollData.scrollWidth - scrollTab.scrollData.clientWidth;
const scrollLeft = scrollTab.scrollData.scrollLeft;
const xAxis = this.calcScroll(scrollLeft, scrollWidth, dir);
scrollTab.scrollTo(xAxis, 0);
},
updateTreeview() {
if (this.miniVariant) {
// sidebar 접혀져 있을 때
this.$refs.treeview.updateAll();
} else {
// sidebar 펼쳐져 있을 때
}
},
// 열려있는 노드의 key 값 리턴(선택된 값이 아님)
openNode(node) {
//console.log('onOpen');
if (this.miniVariant) {
// sidebar 접혀져 있을 때
if (event.currentTarget.id !== this.$refs.appbarnavicon.$refs.link.id) {
this.$refs.appbarnavicon.click(event);
}
} else {
// sidebar 펼쳐져 있을 때
}
},
doMouseOver: function(event) {
//console.log(event);
},
calcScroll(sl, sw, dir) {
const deScrW = 60;
let returnSl = 0;
switch (dir) {
case 'prev':
returnSl = sl - deScrW <= 0 ? 0 : sl - deScrW;
break;
case 'next':
returnSl = sl + deScrW >= sw ? sw : sl + deScrW;
break;
default:
break;
}
return returnSl;
},
initPageDataFunc() {
const _this = this;
this.prgmIdList = Object.keys(this.menuData);
this.initPageData = {};
this.prgmIdList.forEach(item => {
_this.obj = {};
if (_this.pageData[item]) {
_this.obj = _this.pageData[item];
}
_this.newObj = {};
_this.newObj = {
[item]: _this.obj,
};
_this.initPageData = Object.assign(
{},
_this.initPageData,
_this.newObj,
);
});
localStorage.setItem('pageData', JSON.stringify(this.initPageData));
this.setPageDataInit(this.initPageData);
},
onCloseTab(to) {
const findIndex = this.$tabs.items.findIndex(v => v.to === to);
const { to: next } = this.$tabs.items[findIndex - 1];
this.$tabs.close(to, null);
if (this.$router.currentRoute.fullPath != next) {
this.$router.replace(next);
}
},
async addBookMark() {
var params = {
menuId: this.activeMenuId,
};
await this.postUpdateApi({
apiKey: 'saveBookmark',
sendParam: {
datas: {
bookmarkDt: [params],
},
params: {},
},
});
const res = await this.postApiReturn({
apiKey: 'selectMyMenu',
resKey: 'menuData',
sendParam: {},
});
this.myMenuList = res;
this.bookmarkBtn = 1;
},
async removeBookMark() {
var params = {
menuId: this.activeMenuId,
};
await this.postUpdateApi({
apiKey: 'deleteBookmark',
sendParam: {
datas: {
bookmarkDt: [params],
},
params: {},
},
});
const res = await this.postApiReturn({
apiKey: 'selectMyMenu',
resKey: 'menuData',
sendParam: {},
});
this.myMenuList = res;
this.bookmarkBtn = 0;
},
moveToMyMenu(url, menuId, prgmId) {
// console.log('moveToMyMenu...');
// if(this.isLoading == true){
// console.log('if isLoading stmt3');
// return;
// }
this.$router.push({
path: url + '?prgmId=' + prgmId,
});
},
async selectMyMenuFunc() {
const headers = {
headers: {
'X-Fems-MenuId': 'MNU0001',
},
};
const params = { params: {} };
const res = await this.$axios.post(
'/comm/base/MenuMngCtr/selectMyMenu',
params,
headers,
);
this.myMenuList = res.data.dataset.menuData;
},
// unLoadEvent: function (event) {
// //if (this.isLeaveSite) return;
// //this.delAllTabsData();
// this.$router.push({
// path: this.myHome.root
// });
// console.log("event", event)
// event.preventDefault();
// event.returnValue = '';
// },
// treeModel(obj) {
// console.log(">>> treeModel::obj = ", obj);
// this.treeValue[0] = obj;
// this.$refs.treeview.updateAll();
// // console.log(this.$refs.treeview);
// // this.$refs.treeview.activeCache = obj.id;
// }
},
};
</script>
<style lang="scss" scoped>
.loading {
z-index: 99;
position: fixed;
top: 50%;
left: 50%;
width: 100%;
height: 100%;
transform: translate(-50%, -50%);
background-color: rgba(0, 0, 0, 0.4);
//box-shadow: rgba(68, 67, 67, 0.9) 0 0 0 9999px;
}
.v-spinner {
top: 50%;
left: 50%;
}
</style>

View File

@ -1,928 +0,0 @@
<template>
<v-app :class="`${isDarkMode ? 'dark-mode' : 'light-mode'}`">
<!-- <v-app :class="'light-mode'"> -->
<fullscreen :fullscreen.sync="fullscreen">
<v-navigation-drawer
ref="navigationdrawer"
:value="drawer"
:mini-variant="miniVariant"
:clipped="clipped"
:absolute="true"
mini-variant-width="60"
fixed
app
>
<div class="d-flex align-center justify-space-between py-4 px-3">
<router-link class="home" :to="myHome.root">
<div class="lnb-logo">
<img v-if="isDarkMode" src="@/assets/images/logo_dm.png" />
<img v-else src="@/assets/images/logo_lm.png" />
</div>
<!-- <div class="lnb-logo">FEMS</div>-->
</router-link>
<v-app-bar-nav-icon
ref="appbarnavicon"
id="appbarnavicon"
@click.stop="miniVariant = !miniVariant"
@click="updateTreeview"
:style="{
backgroundColor: 'transparent',
color: isDarkMode ? '#fff' : '#111',
}"
/>
<!-- <router-view :key="$route.fullPath"/> -->
</div>
<!--
v-model="treeValue"
return-object
@input="treeModel"
@update:active="clkTab"
-->
<AdminMenu
:miniVariant="miniVariant"
:userNm="this.userInfo.userNm"
:comId="this.userInfo.comId"
/>
<component
ref="changePswdPop"
:is="'ChangePswdPop'"
v-show="false"
:comId="this.userInfo.comId"
/>
<v-treeview
ref="treeview"
:active.sync="activeTree"
active-class="v-treeview-node--active"
:items="treevieItems"
activatable
hoverable
color="#3896ff"
open-on-click
@update:open="openNode"
>
<template slot="label" slot-scope="{ item }">
<button :class="{ 'justify-center': miniVariant }" @mouseover="doMouseOver">
<v-icon
v-if="item.lvl === 1 && menuIconKeys.includes(item.menuId)"
v-text="menuIconById[item.menuId]"
:class="{ 'mr-2': !miniVariant }"
size="20"
></v-icon>
<v-icon
v-else-if="item.lvl === 1 && !menuIconKeys.includes(item.menuId)"
:class="{ 'mr-2': !miniVariant }"
size="20"
>mdi-package-variant-closed</v-icon
>
<v-icon
v-else-if="item.lvl === 2"
:class="{ 'mr-2': !miniVariant }"
size="10"
>
mdi-checkbox-blank
</v-icon>
<v-icon
v-else-if="item.lvl >= 3 && item.childeVo.length === 0 && item.url"
:class="miniVariant === false ? 'mr-2' : ''"
size="9"
>
$depth3rdBulletDark
</v-icon>
<span v-if="item.url"
>{{ item.menuNm }}
<!-- <span v-if="item.bookmark" class="material-icons" style="font-size: 17px; vertical-align: middle;" @click="addBookMark(item.menuId, item.url, item.bookmark)">star</span>
<span v-else-if="!item.bookmark" class="material-icons" style="font-size: 17px; vertical-align: middle;" @click="addBookMark(item.menuId, item.url, item.bookmark)">star_border</span> -->
</span>
<span v-else-if="!item.url">{{ item.menuNm }}</span>
<v-icon v-if="item.lvl >= 1 && item.childeVo.length > 0 && !item.url">
mdi-chevron-down
</v-icon>
</button>
</template>
</v-treeview>
<!-- <template #append>
<p
class="text-caption"
:style="{ letterSpacing: '-0.2px !important' }"
>
&copy; 2022. SK C&C all rights reserved.
</p>
</template> -->
</v-navigation-drawer>
<v-main>
<v-container fluid>
<router-tab
ref="routerTab"
:tabs="treevieItems"
:keep-last-tab="false"
:contextmenu="false"
>
<template slot-scope="{ title, closable, to }">
<span>{{ title }}</span>
<v-icon size="18" class="ml-2" v-if="closable" @click.stop="onCloseTab(to)"
>mdi-close-circle</v-icon
>
</template>
<template #end>
<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">
<span class="body-2">닫기</span>
<v-icon size="20">mdi-chevron-down</v-icon>
</v-btn> -->
<a-button style="width: 80px; height: 36px" class="btn-close">
<span class="body-2">닫기</span>
<v-icon size="20">mdi-chevron-down</v-icon></a-button
>
</template>
<v-list
class="py-2 btn-close-menu-list"
:style="{
backgroundColor: isDarkMode ? '#144985' : '#3f4d7d',
}"
>
<v-list-item class="px-2">
<v-list-item-title @click="delAllTabsData()" class="body-2"
>전체 닫기</v-list-item-title
>
</v-list-item>
<v-list-item class="px-2">
<v-list-item-title @click="deleteSblingsTab()" class="body-2"
>나머지 닫기</v-list-item-title
>
</v-list-item>
</v-list>
</v-menu>
<v-menu offset-y>
<template v-slot:activator="{ on, attrs }">
<!-- <v-btn
:ripple="false"
tile
class="btn-close"
v-bind="attrs"
v-on="on"
style="width: 100px"
>
<span class="body-2">즐겨찾기</span>
<v-icon size="20">mdi-chevron-down</v-icon>
</v-btn> -->
<a-button style="width: 100px; height: 36px" class="btn-close">
<span class="body-2">즐겨찾기</span>
<v-icon size="20">mdi-chevron-down</v-icon></a-button
>
</template>
<v-list
v-if="myMenuList.length > 0"
class="py-2 btn-close-menu-list"
:style="{
backgroundColor: isDarkMode ? '#144985' : '#3f4d7d',
}"
>
<v-list-item
v-for="item in myMenuList"
:key="item.menuId"
class="px-2"
style="cursor: pointer"
>
<v-list-item-title
@click="moveToMyMenu(item.url, item.menuId, item.prgmId)"
class="body-2"
>{{ item.menuNm }}</v-list-item-title
>
</v-list-item>
</v-list>
</v-menu>
<!-- <v-btn
icon
tile
:ripple="false"
@click="removeBookMark()"
v-if="bookmarkBtn == 1"
>
<span
class="material-icons"
style="font-size: 17px; vertical-align: middle"
>star</span
>
</v-btn> -->
<a-button
id="refresh"
:style="{
padding: '0',
width: '36px',
height: '36px',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
borderRadius: '4px', // square corners
}"
type="text"
@click="removeBookMark"
v-if="bookmarkBtn == 1"
>
<span
class="material-icons"
style="font-size: 17px; vertical-align: middle"
>star</span
>
</a-button>
<!-- <v-btn
icon
tile
:ripple="false"
@click="addBookMark()"
v-if="bookmarkBtn == 0"
>
<span
class="material-icons"
style="font-size: 17px; vertical-align: middle"
>star_border</span
>
</v-btn> -->
<a-button
id="refresh"
:style="{
padding: '0',
width: '36px',
height: '36px',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
borderRadius: '4px', // square corners
}"
type="text"
@click="addBookMark"
v-if="bookmarkBtn == 0"
>
<span
class="material-icons"
style="font-size: 17px; vertical-align: middle"
>star_border</span
>
</a-button>
<v-btn
style="
background-color: white;
color: #fff;
border: 0.2px solid rgb(217, 217, 217);
"
id="refresh"
icon
tile
:ripple="false"
@click="refreshTab()"
>
<v-icon style="color: rgba(0, 0, 0, 0.54)">mdi-refresh</v-icon>
</v-btn>
<!-- <a-button
id="refresh"
:style="{
padding: '0',
width: '36px',
height: '36px',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
borderRadius: '4px', // square corners
}"
type="text"
@click="refreshTab"
>
<v-icon >mdi-refresh</v-icon>
</a-button> -->
<!-- <a-button id="refresh" type="text" @click="setDrawer" class="icon-button">
    <i class="mdi mdi-crop-free" style="font-size: 20px"></i>  
</a-button>
 
<a-button type="text" @click="setDrawer" class="icon-button">
    <i class="mdi mdi-crop-free" style="font-size: 20px"></i>  
</a-button> -->
<!-- <a-button
:style="{
padding: '0',
width: '36px',
height: '36px',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
borderRadius: '4px', // square corners
}"
type="text"
@click="toggle"
>
<v-icon v-if="!fullscreen">mdi-arrow-expand-all</v-icon>  
<v-icon v-else>mdi-arrow-collapse-all</v-icon>
</a-button> -->
<v-btn
style="
background-color: white;
color: #fff;
border: 0.2px solid rgb(217, 217, 217);
"
icon
tile
:ripple="false"
@click="toggle()"
>
<v-icon style="color: rgba(0, 0, 0, 0.54)" v-if="!fullscreen"
>mdi-arrow-expand-all</v-icon
>
<v-icon style="color: rgba(0, 0, 0, 0.54)" v-else
>mdi-arrow-collapse-all</v-icon
>
</v-btn>
</template>
</router-tab>
</v-container>
<div v-if="loadingStackCnt > 0" class="loading-container">
<div class="loading">
<Fade-loader />
</div>
</div>
</v-main>
<!-- <v-footer
:absolute="!fixed"
app
:class="
drawer
? miniVariant
? 'drawerFooter miniFooter'
: 'drawerFooter'
: 'full-size'
"
>
<span>&copy; 2022. SK C&C all rights reserved.</span>
</v-footer> -->
</fullscreen>
</v-app>
</template>
<script>
import { mapState, mapActions, mapMutations } from "vuex"; // , mapActions
import ThemeSwitch from "@/components/common/ThemeSwitch";
import AdminMenu from "@/components/common/AdminMenu";
import FadeLoader from "vue-spinner/src/FadeLoader.vue";
import ChangePswdPop from "~/components/common/modal/ChangePswdPop";
export default {
components: {
ThemeSwitch,
AdminMenu,
FadeLoader,
ChangePswdPop,
},
data() {
return {
fullscreen: false,
activeTree: [],
clipped: false,
fixed: false,
miniVariant: false,
// activeTabIdx: "",
routerTabInstance: null,
// programIdObj: null,
myPrgmId: null,
treeValue: [],
menuIconById: {
// MNU0003: 'mdi-chart-line',
// MNU0004: 'mdi-alarm-light',
// MNU0005: 'mdi-pencil-box-outline',
// MNU0006: 'mdi-cog-outline',
MNU0002: "mdi-monitor",
MNU0091: "mdi-chart-box",
MNU0102: "mdi-human-male-board-poll",
MNU0103: "mdi-file-chart-outline",
MNU0104: "mdi-chart-sankey-variant",
MNU0106: "mdi-database-edit-outline",
MNU0105: "mdi-chart-bell-curve",
MNU0006: "mdi-bulletin-board",
MNU0007: "mdi-cog",
},
isLoading: false,
loadingStackCnt: 0,
bookmarkBtn: 0,
myMenuList: [],
prgmIdList: [],
initPageData: {},
obj: {},
newObj: {},
};
},
computed: {
...mapState({
myHome: "myHome",
myHomeTabItems: "myHomeTabItems",
indexRoot: "indexRoot",
treevieItems: "treevieItems",
menuData: "menuData",
menuLink: (state) => state.modules.menu,
activeMenuId: (state) => state.activeMenuInfo.menuId,
isDarkMode: "isDarkMode",
drawer: (state) => state.drawer,
userInfo: (state) => state.userInfo,
pageData: "pageData",
}),
activeTabs() {
if (this.routerTabInstance) {
return this.routerTabInstance.activeTab;
} else {
return this.myHome.root;
}
},
menuIconKeys() {
return Object.keys(this.menuIconById);
},
},
watch: {
activeTabs: {
// 탭 클릭시 좌측 treeview 싱크 맞추가
deep: true,
handler(value) {
if (value) {
const prgmId = value.prgmId;
let thisPrgmId = this.$route.query.prgmId;
var tmp = 0;
for (var i = 0; i < this.myMenuList.length; i++) {
if (this.myMenuList[i].prgmId == thisPrgmId) {
tmp = 1;
}
}
this.bookmarkBtn = tmp;
//if (thisPrgmId && this.myPrgmId && this.myPrgmId != thisPrgmId) {
this.myPrgmId = prgmId;
this.activeTree.pop(); // 기존 황성화 트리 값 삭제
this.activeTree.push(thisPrgmId); // 인덱스가 아닐 경우 새로 넣어줌
// this.$set(this.activeTree, 0, prgmId); // treeview activetree 새로 셋팅 <= 위 pop() 과 push() 로 대체
//}
}
},
},
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;
const isCommMenu = menuUrl.indexOf("comm/");
const isEmsMenu = menuUrl.indexOf("ems/");
const isCmmsMenu = menuUrl.indexOf("cmms/");
// console.log('activeTree...');
console.log(isEmsMenu);
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.replace("/").then(() => {
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,
handler(newVal, oldVal) {},
},
pageData: {
deep: true,
handler(newVal, oldVal) {
localStorage.setItem("pageData", JSON.stringify(this.pageData));
//console.log("localPageData", this.pageData);
},
},
// menuLink: {
// deep: true,
// handler() {
// let prgmIdList = Object.keys(this.menuData);
// let initPageData = {};
// prgmIdList.forEach(item => {
// let newObj = {
// [item] : {}
// };
// initPageData = Object.assign(initPageData, newObj)
// });
// }
// }
},
created() {
this.$vuetify.theme.isDark = false;
this.setThemeChange(false);
},
beforeUnmount() {
//window.removeEventListener('beforeunload', this.unLoadEvent);
},
async mounted() {
//window.addEventListener('beforeunload', this.unLoadEvent);
const _this = this;
await this.getMenu({});
await this.initPageDataFunc();
await this.selectMyMenuFunc();
this.routerTabInstance = this.$refs.routerTab;
if (this.$route.fullPath == "/") {
this.routerTabInstance.reset();
this.$router.replace(this.myHome.root);
} else if (this.$route.fullPath != this.myHome.root) {
this.$refs.routerTab.items.unshift(this.myHomeTabItems);
} else {
this.refreshTab();
}
this.$router.beforeEach((to, from, next) => {
_this.isLoading = true;
// console.log('$router.beforeEach...');
// console.log('state : ', _this.$store.state)
// console.log('activeActionCnt : ', _this.$store.state.activeActionCnt)
// console.log('_this.isLoading[beforeEach] : ', _this.isLoading);
// console.log('_this.loadingStackCnt : ', _this.loadingStackCnt);
// if(_this.loadingStackCnt > 0 && _this.isLoading && _this.$store.state.activeActionCnt > 0){
if (_this.loadingStackCnt > 0 && _this.isLoading) {
next(false);
// return;
} else if (!to.matched.length) {
next(false);
} else {
next();
}
});
this.$router.afterEach((to, from, failure) => {});
// 요청 인터셉터
this.$axios.interceptors.request.use(
function (config) {
//alert(1)
_this.isLoading = true;
if (config.url.search("Page") < 0) {
_this.loadingStackCnt++;
}
return config;
},
function (error) {
// 에라 나면 로딩 끄기
//alert(2)
_this.isLoading = false;
// if(error.url.search('Page')<0){
// _this.loadingStackCnt--;
// }
return Promise.reject(error);
}
);
// 응답 인터셉터
this.$axios.interceptors.response.use(
function (response) {
_this.isLoading = false;
if (response.config.url.search("Page") < 0) {
_this.loadingStackCnt--;
}
//alert(3)
return response;
},
function (error) {
// 응답 에러 시에도 로딩 끄기
//alert(4 )
_this.isLoading = false;
// if(error.url.search('Page')<0){
// _this.loadingStackCnt--;
// }
return Promise.reject(error);
}
);
},
methods: {
...mapMutations({
setDrawer: "setDrawer", // 사이드메뉴 접고 펼치기
setPageDataInit: "setPageDataInit",
setThemeChange: "setThemeChange",
}),
...mapActions({
getMenu: "modules/menu/getMenu", // 트리메뉴 가져오기
chkOpenTabList: "chkOpenTabList", // 트리메뉴 클릭 시 해당 pprgmId push
postUpdateApi: "modules/list/postUpdateApi",
postApiReturn: "modules/list/postApiReturn",
}),
// // tabActive(id) {},
// clkTab(itemArr) {
// console.log(itemArr[0]);
// if (!itemArr[0].to) return;
// this.$router.push({
// path: itemArr[0].to
// });
// },
toggle() {
this.fullscreen = !this.fullscreen;
},
refreshTab() {
// console.log("현재 탭 새로고침");
//this.routerTabInstance.refresh();
this.$nuxt.refresh();
this.routerTabInstance.refresh();
},
delAllTabsData() {
// console.log("탭 전체 닫기");
// for (let i = this.routerTabInstance.items.length - 1; i > -1; --i) {
// const diffTo = this.routerTabInstance.items[i].to;
// if (diffTo != this.myHome.root) {
// this.routerTabInstance.items.splice(i, 1);
// }
// }
//if(this.$router.currentRoute.fullPath != this.myHome.root){
if (this.routerTabInstance.items.length > 0) {
this.routerTabInstance.reset();
}
this.$router.replace(this.myHome.root);
//}
},
deleteSblingsTab() {
// console.log("탭 나머지 닫기");
// for (let i = this.routerTabInstance.items.length - 1; i > -1; --i) {
// const activeTo = this.routerTabInstance.activeTab.to;
// const diffTo = this.routerTabInstance.items[i].to;
// if (activeTo != diffTo && diffTo != this.myHome.root) {
// this.routerTabInstance.items.splice(i, 1);
// }
// }
if (this.routerTabInstance.items.length > 1) {
for (let i = this.routerTabInstance.items.length - 1; i > -1; --i) {
const activeTo = this.routerTabInstance.activeTab.to;
const diffTo = this.routerTabInstance.items[i].to;
if (activeTo != diffTo && diffTo != this.myHome.root) {
this.routerTabInstance.close(diffTo);
}
}
}
},
tabScrollMove(dir) {
const scrollTab = this.routerTabInstance.$refs.scroll;
const scrollWidth =
scrollTab.scrollData.scrollWidth - scrollTab.scrollData.clientWidth;
const scrollLeft = scrollTab.scrollData.scrollLeft;
const xAxis = this.calcScroll(scrollLeft, scrollWidth, dir);
scrollTab.scrollTo(xAxis, 0);
},
updateTreeview() {
if (this.miniVariant) {
// sidebar 접혀져 있을 때
this.$refs.treeview.updateAll();
} else {
// sidebar 펼쳐져 있을 때
}
},
// 열려있는 노드의 key 값 리턴(선택된 값이 아님)
openNode(node) {
//console.log('onOpen');
if (this.miniVariant) {
// sidebar 접혀져 있을 때
if (event.currentTarget.id !== this.$refs.appbarnavicon.$refs.link.id) {
this.$refs.appbarnavicon.click(event);
}
} else {
// sidebar 펼쳐져 있을 때
}
},
doMouseOver: function (event) {
//console.log(event);
},
calcScroll(sl, sw, dir) {
const deScrW = 60;
let returnSl = 0;
switch (dir) {
case "prev":
returnSl = sl - deScrW <= 0 ? 0 : sl - deScrW;
break;
case "next":
returnSl = sl + deScrW >= sw ? sw : sl + deScrW;
break;
default:
break;
}
return returnSl;
},
initPageDataFunc() {
const _this = this;
this.prgmIdList = Object.keys(this.menuData);
this.initPageData = {};
this.prgmIdList.forEach((item) => {
_this.obj = {};
if (_this.pageData[item]) {
_this.obj = _this.pageData[item];
}
_this.newObj = {};
_this.newObj = {
[item]: _this.obj,
};
_this.initPageData = Object.assign({}, _this.initPageData, _this.newObj);
});
localStorage.setItem("pageData", JSON.stringify(this.initPageData));
this.setPageDataInit(this.initPageData);
},
onCloseTab(to) {
const findIndex = this.$tabs.items.findIndex((v) => v.to === to);
const { to: next } = this.$tabs.items[findIndex - 1];
this.$tabs.close(to, null);
if (this.$router.currentRoute.fullPath != next) {
this.$router.replace(next);
}
},
async addBookMark() {
var params = {
menuId: this.activeMenuId,
};
await this.postUpdateApi({
apiKey: "saveBookmark",
sendParam: {
datas: {
bookmarkDt: [params],
},
params: {},
},
});
const res = await this.postApiReturn({
apiKey: "selectMyMenu",
resKey: "menuData",
sendParam: {},
});
// const res = [
// {
// comId: "abc",
// upMenuId: "abc",
// menuId: "dashboard",
// menuNm: "abc",
// url: "DashboardPage",
// authCd: "yes",
// lvl: 9999,
// prgmId: "PRG0001",
// },
// {
// comId: "abc",
// upMenuId: "dashboard",
// menuId: "test",
// menuNm: "test",
// url: "DashboardPage",
// authCd: "yes",
// lvl: 666,
// prgmId: "PRG0002",
// },
// ];
this.myMenuList = res;
this.bookmarkBtn = 1;
},
async removeBookMark() {
var params = {
menuId: this.activeMenuId,
};
await this.postUpdateApi({
apiKey: "deleteBookmark",
sendParam: {
datas: {
bookmarkDt: [params],
},
params: {},
},
});
const res = await this.postApiReturn({
apiKey: "selectMyMenu",
resKey: "menuData",
sendParam: {},
});
this.myMenuList = res;
this.bookmarkBtn = 0;
},
moveToMyMenu(url, menuId, prgmId) {
// console.log('moveToMyMenu...');
// if(this.isLoading == true){
// console.log('if isLoading stmt3');
// return;
// }
alert("move to", url);
this.$router.push({
path: url + "?prgmId=" + prgmId,
});
},
async selectMyMenuFunc() {
const headers = {
headers: {
"X-Fems-MenuId": "MNU0001",
},
};
const params = { params: {} };
const res = await this.$axios.post(
"/comm/base/MenuMngCtr/selectMyMenu",
params,
headers
);
this.myMenuList = res.data.dataset.menuData;
},
// unLoadEvent: function (event) {
// //if (this.isLeaveSite) return;
// //this.delAllTabsData();
// this.$router.push({
// path: this.myHome.root
// });
// console.log("event", event)
// event.preventDefault();
// event.returnValue = '';
// },
// treeModel(obj) {
// console.log(">>> treeModel::obj = ", obj);
// this.treeValue[0] = obj;
// this.$refs.treeview.updateAll();
// // console.log(this.$refs.treeview);
// // this.$refs.treeview.activeCache = obj.id;
// }
},
};
</script>
<style lang="scss" scoped>
.loading {
z-index: 99;
position: fixed;
top: 50%;
left: 50%;
width: 100%;
height: 100%;
transform: translate(-50%, -50%);
background-color: rgba(0, 0, 0, 0.4);
//box-shadow: rgba(68, 67, 67, 0.9) 0 0 0 9999px;
}
.v-spinner {
top: 50%;
left: 50%;
}
</style>

View File

@ -58,7 +58,7 @@ export default {
layoutInit() {
if (this.$refs.searchFilter) {
const searchFilterHeight = this.$refs.searchFilter.offsetHeight;
this.$refs.contents.style.height = `calc(100% - ${searchFilterHeight}px)`;
this.$refs.contents.style.height = `calc(100% - ${searchFilterHeight + 20}px)`;
}
},
//init() {}

View File

@ -49,7 +49,7 @@ module.exports = {
// Auto import components: https://go.nuxtjs.dev/config-components
components: true,
// Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
buildModules: [
// https://go.nuxtjs.dev/vuetify
@ -57,7 +57,7 @@ module.exports = {
],
// Modules: https://go.nuxtjs.dev/config-modules
modules: ['@nuxtjs/axios', '@nuxtjs/dayjs', '@nuxtjs/style-resources','@nuxtjs/google-fonts'],
modules: ['@nuxtjs/axios', '@nuxtjs/dayjs', '@nuxtjs/style-resources' ],
styleResources: {
scss: ['./assets/scss/*.scss'],
},

View File

@ -1,6 +1,7 @@
<template>
<div class="l-layout">
<v-row ref="searchFilter">
<common-page-title />
<v-row ref="searchFilter" class="mt-2">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="end" no-gutters>
@ -34,7 +35,7 @@
<div class="h100 px-4" style="height:calc(100% - 70px)">
<div ref="treeGridParent" class="w100 h100">
<component :ref="gridName + myPrgmId" :is="loadTree ? 'Grid' : null" :gridName="gridName"
:parentPrgmId="myPrgmId" @getRowsData="getRowData" :dataPath="dataPathExample" />
:parentPrgmId="myPrgmId" @getRowsData="getRowData" />
</div>
</div>
</v-card>
@ -91,21 +92,9 @@ export default {
return {
myPrgmId: myPrgmId,
gridName: 'treeGrid',
loadTree: true,
loadTree: false,
detailList: myDetail,
addRowFg: false,
dataPathExample: {
"treeGrid": {
data: sampleData,
column: [
{ header: '메뉴명', name: 'menuNm' },
{ header: 'prgmId ', name: 'prgmId', hidden: true },
{ header: 'sysDivCd ', name: 'sysDivCd', hidden: true },
],
option: myOptions,
}
}
};
},
computed: {
@ -162,10 +151,17 @@ export default {
gridInit() {
const treeGridHeight = this.$refs.treeGridParent.offsetHeight - 30;
const myOptionsTree = {
columnOptions: {
resizable: true,
},
treeColumnOptions: {
name: 'menuNm',
},
scrollX: false,
header: {
height: 37,
},
rowHeight: 37,
};
this.setGridOption({
gridKey: this.gridName,
@ -178,6 +174,17 @@ export default {
this.setGridColumn({
gridKey: this.gridName,
value: [
{
header: '',
name: '',
align: 'center',
width: 20,
formatter: (props) => {
return `<label class="custom-radio">
<span class="radio-mark"></span>
</label>`;
}
},
{ header: '메뉴명', name: 'menuNm' },
{ header: 'prgmId ', name: 'prgmId', hidden: true },
{ header: 'sysDivCd ', name: 'sysDivCd', hidden: true },

View File

@ -5,25 +5,14 @@
<v-card class="searchFilter">
<v-row algin="end" no-gutters>
<v-col :cols="3">
<InputText
:parentPrgmId="myPrgmId"
label="역할ID"
valueNm="roleId"
:searchOption="true"
customClass="input-large"
/>
<InputText :parentPrgmId="myPrgmId" label="역할ID" valueNm="roleId" :searchOption="true"
customClass="input-large" />
</v-col>
<v-col :cols="3">
<InputText
:parentPrgmId="myPrgmId"
label="역할명"
valueNm="roleNm"
:searchOption="true"
customClass="input-large"
/>
<InputText :parentPrgmId="myPrgmId" label="역할명" valueNm="roleNm" :searchOption="true"
customClass="input-large" />
</v-col>
<v-col :cols="6" class="text-right">
<!-- <v-btn @click="test = !test">WWW</v-btn> -->
<v-col class="text-right d-flex justify-end align-end mr-3">
<BtnSearch size="large" />
</v-col>
</v-row>
@ -31,102 +20,72 @@
</v-col>
</v-row>
<v-row ref="contents" style="height: 100vh;">
<v-col cols="12" lg="2" class="h100">
<v-row ref="contents">
<v-col cols="12" lg="3">
<v-card>
<v-card-title>
<span class="custom-title-4">역할 리스트</span>
</v-card-title>
<div class="px-5" style="height:calc(100% - 100px)">
<div
ref="gridParent"
class="w100 h100"
>
<component
:is="loadGrid ? 'Grid' : null"
:ref="gridName + myPrgmId"
:gridName="gridName"
:parentPrgmId="myPrgmId"
@getRowsData="getRowData"
/>
</div>
<div ref="gridParent" class="px-5" style="height: 60vh;">
<component :is="loadGrid ? 'Grid' : null" :ref="gridName + myPrgmId" :gridName="gridName"
:parentPrgmId="myPrgmId" @getRowsData="getRowData" />
</div>
</v-card>
</v-col>
<v-col cols="12" lg="10" class="h100">
<v-col cols="12" lg="9" class="pl-0">
<v-card>
<v-card-title>
<span class="custom-title-4">역할 메뉴별 권한</span>
</v-card-title>
<v-row
align="center"
no-gutters
:style="{ height: 'calc(100% - 62px)' }"
class="px-5"
>
<v-col :cols="4" class="h100">
<span
class="body-1 font-weight-bold d-flex align-center"
:style="{ minHeight: '36px' }"
>[미배정]메뉴리스트</span
>
<div class="px-5" style="height:calc(100% - 64px)">
<div
<v-row align="center" no-gutters :style="{ height: 'calc(100% - 62px)' }" class="px-5">
<v-col class="h100" style="max-width: 400px;">
<v-card-title class="pl-0 pb-3">
<span class="custom-title-4">[미배정]메뉴리스트</span>
</v-card-title>
<!-- <span class="body-1 font-weight-bold d-flex align-center"
:style="{ minHeight: '36px' }">[미배정]메뉴리스트</span> -->
<div ref="treeGridParent" class="px-0 mt-2" style="height: 60vh;">
<!-- <div
ref="treeGridParent"
class="w100 h100"
>
<component
:is="loadTreeGrid ? 'Grid' : null"
:ref="gridName2 + myPrgmId"
:gridName="gridName2"
:parentPrgmId="myPrgmId"
@getRowsData="getUnAsgnRowData"
/>
</div>
</div> -->
<component :is="loadTreeGrid ? 'Grid' : null" :ref="gridName2 + myPrgmId"
:gridName="gridName2" :parentPrgmId="myPrgmId" @getRowsData="getUnAsgnRowData" />
</div>
</v-col>
<v-col :cols="1">
<ActionButtons
:parentPrgmId="myPrgmId"
:leftGridName="gridName2"
:rightGridName="gridName3"
:btnActionsFnc="dualGridBtnActions"
/>
</v-col>
<!-- <v-col :cols="1.5">
<ActionButtons :parentPrgmId="myPrgmId" :leftGridName="gridName2" :rightGridName="gridName3"
:btnActionsFnc="dualGridBtnActions" />
</v-col> -->
<div class="pr-2 arrow-button">
<ActionButtons :parentPrgmId="myPrgmId" :leftGridName="gridName2" :rightGridName="gridName3"
:btnActionsFnc="dualGridBtnActions"/>
</div>
<v-col :cols="7" class="h100">
<v-row
justify="space-between"
align="center"
no-gutters
class="px-5"
>
<v-row justify="space-between" align="center" no-gutters class="px-5 pl-0">
<v-col :cols="11">
<span class="body-1 font-weight-bold"
>[배정]메뉴별권한 리스트</span
>
<v-card-title class="pl-0 pb-3">
<span class="custom-title-4">[배정]메뉴별권한 리스트</span>
</v-card-title>
<!-- <span class="body-1 font-weight-bold d-flex align-center"
:style="{ minHeight: '36px' }">[배정]메뉴별권한 리스트</span> -->
<!-- <span class="body-1 font-weight-bold">[배정]메뉴별권한 리스트</span> -->
</v-col>
<v-col :cols="1" class="text-right">
<Buttons
:parentPrgmId="myPrgmId"
:bindingData="gridName3"
:btnActionsFnc="btnActions"
/>
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridName3"
:btnActionsFnc="btnActions" />
</v-col>
</v-row>
<div class="px-5" style="height:calc(100% - 64px)">
<div
<div ref="treeGridParent2" class="px-0 mt-2" style="height: 60vh;">
<!-- <div
ref="treeGridParent2"
class="w100 h100"
>
<component
:is="loadTreeGrid2 ? 'Grid' : null"
:ref="gridName3 + myPrgmId"
:gridName="gridName3"
:parentPrgmId="myPrgmId"
:editorGrid="true"
@getRowsData="getAsgnRowData"
/>
</div>
</div> -->
<component :is="loadTreeGrid2 ? 'Grid' : null" :ref="gridName3 + myPrgmId"
:gridName="gridName3" :parentPrgmId="myPrgmId" :editorGrid="true"
@getRowsData="getAsgnRowData" />
</div>
</v-col>
</v-row>
@ -292,8 +251,8 @@ export default {
async gridInit() {
//---------------------gridOption 설정 시작----------------------------
const gridHeight = this.$refs.gridParent.offsetHeight - 30;
const treeGridHeight = this.$refs.treeGridParent.offsetHeight - 30;
const treeGridHeight2 = this.$refs.treeGridParent2.offsetHeight - 30;
const treeGridHeight = this.$refs.treeGridParent.offsetHeight - 50;
const treeGridHeight2 = this.$refs.treeGridParent2.offsetHeight - 50;
// const gridHeight = this.$refs.contents.offsetHeight - 30;
const myOptions = {
@ -322,8 +281,10 @@ export default {
treeColumnOptions: {
name: 'menuNm',
},
scrollX: false,
// scrollY: false,
rowHeight: 37,
minRowHeight: 37,
scrollX: true,
scrollY: true,
};
this.setGridOption({
@ -348,11 +309,14 @@ export default {
//---------------------gridOption 설정 끝----------------------------
//---------------------gridName3의 체크박스 설정 시작----------------------------
class CustumChecbox {
class CustomCheckbox {
constructor(props) {
const el = document.createElement('input');
const { grid, rowKey, columnInfo } = props;
el.type = 'checkbox';
$(el).css('width', '16px');
$(el).css('height', '16px');
$(el).css('accent-color', '#1677FF');
el.value = props.value;
this.el = el;
@ -386,12 +350,12 @@ export default {
const _this = this;
const myColumns = [
{ header: '역할ID', name: 'roleId', align: 'center', minWidth: 70 },
{ header: '역할명', name: 'roleNm', minWidth: 70 },
{ header: '역할ID', name: 'roleId', align: 'left', minWidth: 70, width: 120 },
{ header: '역할명', name: 'roleNm', minWidth: 70, align: 'left', width: 120 },
{
header: '사용여부',
name: 'useFg',
align: 'center',
align: 'left',
minWidth: 84,
formatter({ value }) {
const newValue = _this.pageData.useFgList.filter(
@ -403,9 +367,18 @@ export default {
];
const myTreeColumns = [
{
align: 'center',
width: 30,
minWidth: 60,
formatter: (props) => {
return `<span class="custom-radio"><span class="radio-mark"></span></span>`;
}
},
{
header: '메뉴명',
name: 'menuNm',
maxWidth: 120,
validation: {
dataType: 'string',
validatorFn: (value, row) => {
@ -415,6 +388,14 @@ export default {
},
];
const myTreeColumns2 = [
{
align: 'center',
width: 30,
minWidth: 60,
formatter: (props) => {
return `<span class="custom-radio"><span class="radio-mark"></span></span>`;
}
},
{ header: '역할ID', name: 'roleId', hidden: true },
{ header: '메뉴ID', name: 'menuId', hidden: true },
{ header: '메뉴명', name: 'menuNm', minWidth: '235' },
@ -423,7 +404,7 @@ export default {
name: 'useFg',
align: 'center',
renderer: {
type: CustumChecbox,
type: CustomCheckbox,
},
},
{
@ -431,7 +412,7 @@ export default {
name: 'authCd1',
align: 'center',
renderer: {
type: CustumChecbox,
type: CustomCheckbox,
},
},
{
@ -439,7 +420,7 @@ export default {
name: 'authCd2',
align: 'center',
renderer: {
type: CustumChecbox,
type: CustomCheckbox,
},
},
{
@ -447,7 +428,7 @@ export default {
name: 'authCd3',
align: 'center',
renderer: {
type: CustumChecbox,
type: CustomCheckbox,
},
},
{
@ -455,7 +436,7 @@ export default {
name: 'authCd4',
align: 'center',
renderer: {
type: CustumChecbox,
type: CustomCheckbox,
},
},
{
@ -463,7 +444,7 @@ export default {
name: 'authCd5',
align: 'center',
renderer: {
type: CustumChecbox,
type: CustomCheckbox,
},
},
{
@ -471,7 +452,7 @@ export default {
name: 'authCd6',
align: 'center',
renderer: {
type: CustumChecbox,
type: CustomCheckbox,
},
},
];
@ -539,12 +520,12 @@ export default {
//rowKey: 0,
rowKey:
this.pageData.rowGridSelectKey == '' ||
this.pageData.rowGridSelectKey == null
this.pageData.rowGridSelectKey == null
? 0
: this.pageData.rowGridSelectKey ==
this.$refs[this.gridName + this.myPrgmId].getData().length - 1
? this.pageData.rowGridSelectKey
: 0,
this.$refs[this.gridName + this.myPrgmId].getData().length - 1
? this.pageData.rowGridSelectKey
: 0,
columnName: 'roleId',
setScroll: true,
});
@ -552,6 +533,7 @@ export default {
});
},
async getRowData(data) {
await this.setPageData({
rowGridSelectKey: data.rowKey,
rowGridSelectData: {
@ -598,8 +580,8 @@ export default {
item.upMenuId && item.upMenuId != '0'
? item.upMenuId
: item.upMenuId == '0'
? '00'
: 'ROOT',
? '00'
: 'ROOT',
};
return newItem;
});
@ -638,8 +620,8 @@ export default {
item.upMenuId && item.upMenuId != '0'
? item.upMenuId
: item.upMenuId == '0'
? '00'
: 'ROOT',
? '00'
: 'ROOT',
};
return newItem;
});
@ -829,4 +811,23 @@ function numberFormatter({ value }) {
return value;
}
}
</script>
<style lang="scss" scoped>
::v-deep {
.arrow-button button {
display: flex;
justify-content: center;
align-items: center;
width: 24px;
height: 24px;
}
.arrow-button svg {
width: 14px;
height: 14px;
}
}
</style>

View File

@ -1,5 +1,6 @@
<template>
<div class="l-layout">
<CommonPageTitle />
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
@ -67,7 +68,6 @@
:gridName="gridName"
:parentPrgmId="myPrgmId"
@getRowsData="getRowData"
:dataPath="dataPathMock"
/>
</div>
</div>
@ -132,22 +132,8 @@ export default {
return {
myPrgmId: myPrgmId,
gridName: 'rowGrid',
loadGrid: true,
loadGrid: false,
detailList: myDetail,
dataPathMock : {
rowGrid: {
column: [
{ header: '추가 정보 그룹', name: 'addGrpId', align: 'left' },
{ header: '추가 정보 ID', name: 'addInfoId', align: 'left' },
{ header: '추가 정보 명', name: 'addInfoNm', align: 'left' },
{ header: 'Data 형식', name: 'addInfoDataKind', align: 'center' },
{ header: '사용여부', name: 'useFg', align: 'center' },
],
data: dataMockExample,
defaultRow: dataMockExample,
option: {},
},
},
};
},
computed: {
@ -220,12 +206,12 @@ export default {
const _this = this;
const myColumns = [
{ header: '역할ID', name: 'roleId', align: 'center' },
{ header: '역할ID', name: 'roleId', align: 'left' },
{ header: '역할명', name: 'roleNm' },
{
header: '사용여부',
name: 'useFg',
align: 'center',
align: 'left',
formatter({ value }) {
value = value === true ? '1' : '0';
const newValue = _this.pageData.useFgList.filter(
@ -518,43 +504,4 @@ const myDetail = [
placeholder: '시스템 자동입력',
},
];
const dataMockExample = [
{
addGrpId: 'GRP001',
addInfoId: 'INFO001',
addInfoNm: '온도 센서',
addInfoDataKind: 'DATA01',
useFg: true,
},
{
addGrpId: 'GRP002',
addInfoId: 'INFO002',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA02',
useFg: false,
},
{
addGrpId: 'GRP003',
addInfoId: 'INFO003',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA03',
useFg: false,
},
{
addGrpId: 'GRP004',
addInfoId: 'INFO004',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA04',
useFg: false,
},
{
addGrpId: 'GRP005',
addInfoId: 'INFO005',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA05',
useFg: false,
},
];
</script>

View File

@ -1,6 +1,7 @@
<template>
<div class="l-layout">
<!-- 조회조견 -->
<CommonPageTitle />
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
@ -12,6 +13,8 @@
:parentPrgmId="myPrgmId"
:sendParam="{ comId }"
customClass="select-large"
:labelCols="12"
:textCols="12"
/>
<!-- <component
:is="'selectCodeList'"
@ -79,7 +82,6 @@
@getRowsData="getRowData"
@sendSelectedRowStatInfo="getSelectedRowStatInfo"
:selectedRowDataWatchFlag="true"
:dataPath="dataPathMock"
/>
</div>
</div>
@ -126,13 +128,13 @@
<!-- 역할수정 -->
<template v-else-if="item.id == 'AsgnRoleByUser'">
<v-col :cols="3" class="h100">
<v-col :cols="12" class="overflow-y-scroll grid-toggle-section">
<v-card-title
class="pa-0 custom-title-4"
class="pa-0 custom-subtitle-tab"
style="min-height:36px;"
>역할리스트</v-card-title
>
<div style="height:calc(100% - 36px)" class="py-5">
<div class="py-5">
<component
class="w100"
:is="loadGridTab2 ? 'Grid' : null"
@ -144,17 +146,18 @@
/>
</div>
</v-col>
<v-col :cols="1" class="d-flex justify-center">
<v-col :cols="12" class="d-flex justify-center">
<ActionButtons
:parentPrgmId="myPrgmId"
:leftGridName="gridName2"
:rightGridName="gridName3"
:btnActionsFnc="dualGridBtnActions"
directionBtn="vertically"
/>
</v-col>
<v-col :cols="8" class="h100">
<v-col :cols="12" class="h100">
<div class="d-flex align-center justify-space-between">
<v-card-title class="pa-0 custom-title-4">
<v-card-title class="pa-0 custom-subtitle-tab">
사용자 역할</v-card-title
>
<div>
@ -307,40 +310,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 = {
@ -923,6 +896,7 @@ const defaultData = {
};
const myColumns = [
{ header: '사용자No', name: 'userNo', align: 'center', hidden: true },
{ header: '사용자명', name: 'userNm' },
{ header: '사용자ID', name: 'userLoginId' },
@ -938,7 +912,18 @@ const myColumns = [
];
const unAsgnRoleByUserColumns = [
{ header: '역할ID', name: 'roleId', align: 'center' },
{
header: '',
name: '',
align: 'center',
width: 50,
formatter: (props) => {
return `<label class="custom-radio">
<span class="radio-mark"></span>
</label>`;
}
},
{ header: '역할ID', name: 'roleId', align: 'left' },
{ header: '역할명', name: 'roleNm' },
{ header: '적용시작일', name: 'aplyStartDt', hidden: true },
{ header: '적용종료일', name: 'aplyEndDt', hidden: true },
@ -947,6 +932,7 @@ const unAsgnRoleByUserColumns = [
];
const asgnRoleByUserColumns = [
{ header: '역할ID', name: 'roleId', align: 'center' },
{ header: '역할명', name: 'roleNm' },
{
@ -960,7 +946,19 @@ const asgnRoleByUserColumns = [
{ header: 'comId', name: 'comId', hidden: true },
];
const asgnMenuByUserColumns = [{ header: '메뉴명', name: 'menuNm' }];
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 => {
return [
@ -985,7 +983,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
class: 'py-2 pl-4',
iconShow: true,
required: true,
},
@ -1009,7 +1007,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
class: 'py-2 pl-4',
iconShow: true,
required: true,
},
@ -1035,7 +1033,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
class: 'py-2 pl-4',
iconShow: true,
},
{
@ -1058,7 +1056,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
class: 'py-2 pl-4',
iconShow: true,
placeholder: '시스템 자동입력',
},
@ -1082,7 +1080,7 @@ const myDetail = blocCdList => {
cols: 6,
labelCols: 12,
textCols: 12,
class: 'py-2 pr-4',
class: 'py-2 pl-4',
iconShow: true,
placeholder: '시스템 자동입력',
},
@ -1100,67 +1098,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>
</script>

View File

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

View File

@ -1,7 +1,8 @@
<template>
<div class="l-layout">
<!-- 조회조견 -->
<v-row ref="searchFilter">
<common-page-title />
<v-row ref="searchFilter" class="mt-2">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="end" no-gutters>
@ -14,36 +15,26 @@
:customClass="'input-large'" />
</v-col>
<v-col :cols="2.5">
<component
:is="'selectCodeList'"
:parentPrgmId="myPrgmId"
:label="'배치 실행 구분'"
<component :is="'selectCodeList'" :parentPrgmId="myPrgmId" :label="'배치 실행 구분'"
:dataKey="'searchBatchExecTp'"
:sendParam="{ commGrpCd: 'CO_BATCH_EXEC_TP', useFg: '1' }"
:addAll="true"
:customClass="'select-large'"
/>
:sendParam="{ commGrpCd: 'CO_BATCH_EXEC_TP', useFg: '1' }" :addAll="true"
:customClass="'select-large'" />
</v-col>
<v-col :cols="2.5">
<component
:is="'selectCodeList'"
:parentPrgmId="myPrgmId"
:label="'사용여부'"
:dataKey="'searchUseFg'"
:sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }"
:customClass="'select-large'"
/>
<v-col :cols="2.5" class="pr-4">
<component :is="'selectCodeList'" :parentPrgmId="myPrgmId" :label="'사용여부'"
:dataKey="'searchUseFg'" :sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }"
:customClass="'select-large'" />
</v-col>
<BtnSearch size="large" />
<BtnSearch size="large" class="mr-2" />
</v-row>
</v-card>
</v-col>
</v-row>
<v-row ref="contents" class="mt-4">
<v-row ref="contents" class="mt-4 h100">
<!-- 배치 리스트 -->
<v-col :cols="6" class="h100 pr-2">
<v-col :cols="6" class="pr-2">
<v-card class="pb-5">
<div class="d-flex align-center justify-space-between pa-4">
<!-- <v-card-title>
@ -55,16 +46,16 @@
:btnActionsFnc="btnActions" />
</div>
<div class="px-4">
<div ref="gridParent" class="h100 w100">
<div ref="gridParent" class="h100 w100" style="height:calc(100% - 70px)">
<component :ref="gridName" :is="loadGrid ? 'Grid' : null" :parentPrgmId="myPrgmId"
:gridName="gridName" @getRowsData="getRowData" :dataPath="dataPathExample" />
:gridName="gridName" @getRowsData="getRowData" />
</div>
<!-- </v-card-actions> -->
</div>
</v-card>
</v-col>
<!-- 배치 상세 -->
<v-col :cols="6" class="h100 pl-3">
<v-col :cols="6" class="pl-3">
<v-card class="pd-y-20 h100">
<v-card-title class="d-flex justify-space-between align-end pa-4">
<span class="tit ft-size_20 ft-weight_600">배치 상세</span>
@ -77,21 +68,23 @@
</v-card-actions>
</v-card>
</v-col>
<v-dialog ref="popModal" v-model="dialog" width="700" overlay-color="#000" overlay-opacity="0.8" scrollable>
<v-dialog ref="popModal" v-model="dialog" width="800" overlay-color="#000" overlay-opacity="0.8" scrollable>
<v-card style="height: 100%">
<v-card-title class="v-card__title d-flex align-center justify-space-between">
<span class="custom-title-4">DB 프로시져 파라메터 설정</span>
<div>
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridNameParam"
:btnActionsFnc="btnActionsParam" />
</div>
<a-button icon="close" type="text" @click="dialog = false"></a-button>
</v-card-title>
<div class="pa-5">
<v-row align="center" no-gutters>
<v-col cols="12" class="text-right"> </v-col>
<v-row align="end" no-gutters>
<v-col cols="12" class="d-flex justify-end">
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridNameParam"
:btnActionsFnc="btnActionsParam" />
</v-col>
</v-row>
</div>
<v-divider></v-divider>
<v-card-text style="height: 300px;">
<div id="gridParent" class="mt-6" style="height:calc(100% - 36px);">
<div style="height:calc(100% - 36px);">
@ -101,11 +94,9 @@
</div>
</div>
</v-card-text>
<v-divider></v-divider>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="primary" dark @click="setParamChangeData()">확인</v-btn>
<v-btn color="primary" dark @click="dialog = false">닫기</v-btn>
<v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<a-button :ripple="false" @click="dialog = false" class="mr-2">닫기</a-button>
<a-button :ripple="false" type="primary" @click="setParamChangeData()">확인</a-button>
</v-card-actions>
</v-card>
</v-dialog>
@ -155,76 +146,16 @@ export default {
data() {
return {
myPrgmId: myPrgmId,
loadGrid: true,
loadGrid: false,
gridName: 'rowGrid',
dataPathExample: {
"rowGrid": {
data: [
{
"batchId": "BATCH001",
"batchNm": "일일 데이터 백업",
"batchExecTp": "자동 실행",
"batchDupExecFg": "N",
"useFg": "사용"
},
{
"batchId": "BATCH002",
"batchNm": "월간 리포트 생성",
"batchExecTp": "수동 실행",
"batchDupExecFg": "Y",
"useFg": "사용"
},
{
"batchId": "BATCH003",
"batchNm": "로그 정리 작업",
"batchExecTp": "자동 실행",
"batchDupExecFg": "N",
"useFg": "미사용"
},
{
"batchId": "BATCH004",
"batchNm": "사용자 통계 수집",
"batchExecTp": "예약 실행",
"batchDupExecFg": "Y",
"useFg": "사용"
},
{
"batchId": "BATCH005",
"batchNm": "서버 상태 점검",
"batchExecTp": "수동 실행",
"batchDupExecFg": "N",
"useFg": "미사용"
}
]
,
column: [
{ header: '배치ID', name: 'batchId', align: 'center', width: 100 },
{ header: '배치명', name: 'batchNm', minWidth: 200 },
{
header: '배치 실행 구분',
name: 'batchExecTp',
align: 'left',
minWidth: 190,
},
{ header: '배치 중복 여부', name: 'batchDupExecFg', hidden: true },
{
header: '사용여부',
name: 'useFg',
align: 'center',
width: 145,
},
],
}
},
// rowGridOrigin: [],
detailList: myDetail,
// 파라메터 셋팅용 변수
dialog: false,
gridNameParam: 'paramGrid',
paramLoadGrid: true,
paramLoadGrid: false,
selectedGridNameParamRow: null,
};
},
@ -292,7 +223,7 @@ export default {
}),
init() {
// this.layoutInit();
// this.gridInit();
this.gridInit();
this.gridParamInit();
},
// layoutInit() {
@ -309,6 +240,10 @@ export default {
columnOptions: {
resizable: true,
},
header: {
height: 37,
},
rowHeight: 37,
};
this.setGridOption({
gridKey: this.gridName,
@ -318,7 +253,7 @@ export default {
const _this = this;
const myColumns = [
{ header: '배치ID', name: 'batchId', align: 'center', width: 100 },
{ header: '배치ID', name: 'batchId', align: 'right', width: 100 },
{ header: '배치명', name: 'batchNm', minWidth: 200 },
{
header: '배치 실행 구분',
@ -340,7 +275,6 @@ export default {
{
header: '사용여부',
name: 'useFg',
align: 'center',
width: 145,
formatter({ value }) {
let retVal = '';
@ -384,7 +318,7 @@ export default {
},
async search() {
// console.log("search");
// await this.getRowGridData();
await this.getRowGridData();
await this.setPageData({
isFind: false,
});
@ -613,7 +547,7 @@ export default {
}
},
gridParamInit() {
const gridHeight = this.$refs.gridParent.offsetHeight - 36;
const myOptions = {
columnOptions: {
@ -624,32 +558,35 @@ export default {
selectionUnit: 'row',
editingEvent: 'click',
scrollX: false,
header: {
height: 37,
},
rowHeight: 37,
};
this.setGridOption({
gridKey: this.gridNameParam,
value: myOptions,
});
// setTimeout(() => { });
setTimeout(() => { });
// let modeList = [];
// const modeIn = { text: 'IN', value: 'IN' };
// const modeOut = { text: 'OUT', value: 'OUT' };
// modeList.push(modeIn);
// modeList.push(modeOut);
// let typeList = [];
// const typeInt = { text: 'INT', value: 'int' };
// const typeStr = { text: 'STRING', value: 'str' };
// const typeFunc = { text: 'FUNCTION', value: 'function' };
// typeList.push(typeInt);
// typeList.push(typeStr);
// typeList.push(typeFunc);
let modeList = [];
const modeIn = { text: 'IN', value: 'IN' };
const modeOut = { text: 'OUT', value: 'OUT' };
modeList.push(modeIn);
modeList.push(modeOut);
let typeList = [];
const typeInt = { text: 'INT', value: 'int' };
const typeStr = { text: 'STRING', value: 'str' };
const typeFunc = { text: 'FUNCTION', value: 'function' };
typeList.push(typeInt);
typeList.push(typeStr);
typeList.push(typeFunc);
const myColumns = [
{ header: 'ID', name: 'id', editor: 'text' },
{
header: 'MODE',
name: 'mode',
align: 'center',
formatter({ value }) {
return value == ('OUT' || 'out') ? 'OUT' : 'IN';
},
@ -664,27 +601,27 @@ export default {
header: 'Type',
name: 'type',
align: 'center',
// formatter({ value }) {
// let retVal = '';
// switch (value) {
// case 'int':
// retVal = 'INT';
// break;
// case 'str':
// retVal = 'STRING';
// break;
// case 'function':
// retVal = 'FUNCTION';
// break;
// }
// return retVal;
// },
// editor: {
// type: 'select',
// options: {
// listItems: typeList,
// },
// },
formatter({ value }) {
let retVal = '';
switch (value) {
case 'int':
retVal = 'INT';
break;
case 'str':
retVal = 'STRING';
break;
case 'function':
retVal = 'FUNCTION';
break;
}
return retVal;
},
editor: {
type: 'select',
options: {
listItems: typeList,
},
},
},
{ header: '값', name: 'val', editor: 'text' },
{ header: 'rowStat', name: 'rowStat', hidden: true },
@ -699,90 +636,53 @@ export default {
},
getRowParamData() {
this.paramLoadGrid = false;
// let res = [];
let res = [];
// /* this.pageData.paramStrData 처리 */
// // console.log("this.pageData.paramStrData : ", JSON.parse(this.pageData.paramStrData));
// let rowData = {};
// if (
// this.pageData.paramStrData.startsWith('{') &&
// this.pageData.paramStrData.endsWith('}')
// ) {
// rowData = JSON.parse(this.pageData.paramStrData);
// }
// var keys = Object.keys(rowData); //키를 가져옵니다. 이때, keys 는 반복가능한 객체가 됩니다.
// for (var i = 0; i < keys.length; i++) {
// var key = keys[i];
// res.push(rowData[key]);
// }
let rowData = {};
if (
this.pageData.paramStrData.startsWith('{') &&
this.pageData.paramStrData.endsWith('}')
) {
rowData = JSON.parse(this.pageData.paramStrData);
}
var keys = Object.keys(rowData); //키를 가져옵니다. 이때, keys 는 반복가능한 객체가 됩니다.
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
res.push(rowData[key]);
}
// const newRes = res.map(item => {
// const newObj = {
// ...item,
// rowStat: null,
// id: item.id || '',
// mode: item.mode || 'in',
// type: item.type || 'str',
// val: item.val || '',
// };
// return newObj;
// });
const newRes = res.map(item => {
const newObj = {
...item,
rowStat: null,
id: item.id || '',
mode: item.mode || 'in',
type: item.type || 'str',
val: item.val || '',
};
return newObj;
});
const newRes = [
{
"id": "VAR001",
"mode": "OUT",
"type": "int",
"val": "100",
"rowStat": "C"
},
{
"id": "VAR002",
"mode": "IN",
"type": "str",
"val": "Hello World",
"rowStat": "U"
},
{
"id": "FUNC001",
"mode": "out",
"type": "function",
"val": "calculateSum()",
"rowStat": "C"
},
{
"id": "VAR003",
"mode": "IN",
"type": "int",
"val": "42",
"rowStat": "D"
},
{
"id": "VAR004",
"mode": "OUT",
"type": "str",
"val": "Sample Text",
"rowStat": "C"
}
];
this.setGridData({
gridKey: this.gridNameParam,
value: newRes,
});
// this.$nextTick(() => {
// if (newRes.length > 0) {
// try {
// this.$refs[this.gridNameParam].focus({
// //rowKey: 0,
// rowKey: 0,
// setScroll: true,
// });
// } catch (error) {
// console.log('error[nextTick grid] : ', error);
// }
// }
// });
this.$nextTick(() => {
if (newRes.length > 0) {
try {
this.$refs[this.gridNameParam].focus({
//rowKey: 0,
rowKey: 0,
setScroll: true,
});
} catch (error) {
console.log('error[nextTick grid] : ', error);
}
}
});
this.paramLoadGrid = true;
},
xlsDataBind(res) {
@ -811,22 +711,21 @@ export default {
},
inputClick(event, item, valueNm) {
if (valueNm == 'refVal1') {
this.dialog = true;
// const rowIdxKey = this.$refs[this.gridName].gridInstance.invoke(
// 'getFocusedCell',
// ).rowKey;
// const selectRowData = this.$refs[this.gridName].gridInstance.invoke(
// 'getRow',
// rowIdxKey,
// );
const rowIdxKey = this.$refs[this.gridName].gridInstance.invoke(
'getFocusedCell',
).rowKey;
const selectRowData = this.$refs[this.gridName].gridInstance.invoke(
'getRow',
rowIdxKey,
);
// if (selectRowData.batchExecTp == 'DP') {
// // 여기에 팝업 레이어 띠우기 기능 추가
// this.pageData.paramStrData = event.target.value;
// this.pageData.paramChangeDataTarget = event.target;
// this.getRowParamData();
// this.dialog = true;
// }
if (selectRowData.batchExecTp == 'DP') {
// 여기에 팝업 레이어 띠우기 기능 추가
this.pageData.paramStrData = event.target.value;
this.pageData.paramChangeDataTarget = event.target;
this.getRowParamData();
this.dialog = true;
}
}
},
setParamChangeData() {

View File

@ -1,6 +1,7 @@
<template>
<div class="l-layout">
<v-row ref="searchFilter">
<common-page-title />
<v-row ref="searchFilter" class="mt-2">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="end" no-gutters>
@ -10,7 +11,7 @@
</v-col>
<v-col cols="3">
<!-- <component :is="'SelectDateSolo'" :parentPrgmId="myPrgmId" /> -->
<DatePicker :parentPrgmId="myPrgmId" :label="'조회연월'" />
<DatePicker :parentPrgmId="myPrgmId" customClass="datepicker-large" :label="'조회연월'" />
</v-col>
<v-col cols="6" class="text-right">
<BtnSearch @click="search()" size="large" />
@ -20,28 +21,29 @@
</v-col>
</v-row>
<v-row ref="contents" id="CalendarMngContent" class="mt-4">
<v-col cols="12" lg="4" class="h100 pr-2">
<v-col cols="12" lg="4" class=" pr-2">
<v-card class="w100">
<v-card-title class="d-flex justify-space-between align-center">
<span class="custom-title-4">캘린더 리스트</span>
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridName" :btnActionsFnc="btnActions" />
</v-card-title>
<v-card-actions class="pt-0 px-5 pb-5" :style="{ height: 'calc(100% - 72.56px)' }">
<v-card-actions class="pt-0 px-5 pb-5" :style="{ height: 'calc(100% - 10px)' }">
<div ref="gridParent" class="w100 h100">
<component class="w100" :ref="gridName + myPrgmId" :is="loadGrid ? 'Grid' : null"
:gridName="gridName" :parentPrgmId="myPrgmId" :editorGrid="true"
@getRowsData="getRowData" :dataPath="dataPathExample" />
@getRowsData="getRowData" />
</div>
</v-card-actions>
</v-card>
</v-col>
<v-col cols="12" lg="8" class="h100 pl-3">
<v-col cols="12" lg="8" class=" pl-3">
<v-card>
<v-card-title>
<span class="custom-title-4">캘린더 미리보기</span>
</v-card-title>
<v-card-actions class="px-5 d-block" :style="{ height: 'calc(100% - 62px)' }">
<Calendar :parentPrgmId="myPrgmId" :gridName="gridName" :headerVisible="false" />
<v-card-actions class="px-5 d-block" >
<Calendar :parentPrgmId="myPrgmId" :gridName="gridName" :headerVisible="false"
:showTitle="false" />
</v-card-actions>
</v-card>
</v-col>
@ -94,81 +96,7 @@ export default {
return {
myPrgmId: myPrgmId,
gridName: 'rowGrid',
loadGrid: true,
dataPathExample: {
"rowGrid": {
data: [
{
"hldyFg": "평일",
"hldyNm": ""
},
{
"dt": "2025-07-23",
"dtNm": "수요일",
"dt": "2025-07-21",
"dtNm": "월요일",
"hldyFg": "평일",
"hldyNm": ""
},
{
"dt": "2025-07-22",
"dtNm": "화요일",
"hldyFg": "평일",
"hldyNm": ""
},
{
"dt": "2025-07-24",
"dtNm": "목요일",
"hldyFg": "평일",
"hldyNm": ""
},
{
"dt": "2025-07-25",
"dtNm": "금요일",
"hldyFg": "평일",
"hldyNm": ""
},
{
"dt": "2025-07-26",
"dtNm": "토요일",
"hldyFg": "주말",
"hldyNm": ""
},
{
"dt": "2025-07-27",
"dtNm": "일요일",
"hldyFg": "휴일",
"hldyNm": "정기휴일"
}
],
column: [
{
header: '일자',
name: 'dt',
align: 'center',
// formatter({ value }) {
// return value.split(' ')[0];
// },
},
{
header: '요일',
name: 'dtNm',
align: 'center',
// formatter({ value }) {
// return value + '요일';
// },
},
{
header: '구분',
name: 'hldyFg',
align: 'center',
essential: true,
},
{ header: '휴일명', name: 'hldyNm', editor: 'text' },
],
}
},
loadGrid: false,
rowKey: null,
edtingFinishFlag: 'Y',
};
@ -241,16 +169,19 @@ export default {
await this.gridInit();
},
async search() {
// await this.getRowGridData();
await this.getRowGridData();
},
async gridInit() {
// const gridHeight = this.$refs.gridParent.offsetHeight - 30;
// this.setGridOption({
// gridKey: this.gridName,
// value: Object.assign(Utility.defaultGridOption(gridHeight), {
// scrollX: false,
// }),
// });
const gridHeight = this.$refs.gridParent.offsetHeight - 30;
this.setGridOption({
gridKey: this.gridName,
value: Object.assign(Utility.defaultGridOption(gridHeight), {
scrollX: false, header: {
height: 37,
},
rowHeight: 37,
}),
});
// this.getRowGridData();
},
@ -319,7 +250,6 @@ export default {
{
header: '요일',
name: 'dtNm',
align: 'center',
formatter({ value }) {
return value + '요일';
},
@ -327,7 +257,6 @@ export default {
{
header: '구분',
name: 'hldyFg',
align: 'center',
essential: true,
formatter({ value }) {
return value == 1 ? '휴일' : '평일';
@ -350,86 +279,86 @@ export default {
this.loadGrid = false;
// let res = await this.postApiReturn({
// apiKey: 'selectWorkCald',
// resKey: 'workcaldData',
// sendParam: {
// blocId: this.pageData.blocMstrList[this.chkBlocCd].blocId,
// yymm: this.chkFromDt,
// comId: this.comId,
// },
// });
let res = await this.postApiReturn({
apiKey: 'selectWorkCald',
resKey: 'workcaldData',
sendParam: {
blocId: this.pageData.blocMstrList[this.chkBlocCd].blocId,
yymm: this.chkFromDt,
comId: this.comId,
},
});
// let res2 = await this.postApiReturn({
// apiKey: 'selectWorkCaldDetl',
// resKey: 'workcaldDetlData',
// sendParam: {
// blocId: this.pageData.blocMstrList[this.chkBlocCd].blocId,
// yymm: this.chkFromDt,
// comId: this.comId,
// },
// });
let res2 = await this.postApiReturn({
apiKey: 'selectWorkCaldDetl',
resKey: 'workcaldDetlData',
sendParam: {
blocId: this.pageData.blocMstrList[this.chkBlocCd].blocId,
yymm: this.chkFromDt,
comId: this.comId,
},
});
// for (var i = 0; i < res2.length; i++) {
// if (
// !(
// res2[i].hldyNm == null ||
// res2[i].hldyNm == '토요일' ||
// res2[i].hldyNm == '일요일'
// )
// ) {
// for (var j = i + 1; j < res2.length; j++) {
// if (res2[i].hldyNm == res2[j].hldyNm) {
// res2[i].hldyNm = '';
// }
// }
// }
// }
for (var i = 0; i < res2.length; i++) {
if (
!(
res2[i].hldyNm == null ||
res2[i].hldyNm == '토요일' ||
res2[i].hldyNm == '일요일'
)
) {
for (var j = i + 1; j < res2.length; j++) {
if (res2[i].hldyNm == res2[j].hldyNm) {
res2[i].hldyNm = '';
}
}
}
}
// res = res.map(item => {
// const dt = this.$dayjs(item.dt.split(' ')[0]); // YYYY-MM-DD
// const dtNm = dt.format('ddd'); // 요일
// const newItem = {
// ...item,
// dtNm: dtNm,
// hldyNm: item.hldyNm ? item.hldyNm : '',
// rowStat: null,
// };
// return newItem;
// });
res = res.map(item => {
const dt = this.$dayjs(item.dt.split(' ')[0]); // YYYY-MM-DD
const dtNm = dt.format('ddd'); // 요일
const newItem = {
...item,
dtNm: dtNm,
hldyNm: item.hldyNm ? item.hldyNm : '',
rowStat: null,
};
return newItem;
});
// this.loadGrid = true;
// this.setPageData({ isFind: false });
this.loadGrid = true;
this.setPageData({ isFind: false });
// this.setGridColumn({
// gridKey: this.gridName,
// value: myColumns,
// });
this.setGridColumn({
gridKey: this.gridName,
value: myColumns,
});
// this.setGridData({
// gridKey: this.gridName,
// value: res,
// });
this.setGridData({
gridKey: this.gridName,
value: res,
});
// this.setPageData({ planData: res2 });
this.setPageData({ planData: res2 });
// // 첫번째 row 선택상태
// this.$nextTick(() => {
// this.$refs[this.gridName + this.myPrgmId].focus({
// //rowKey: 0,
// rowKey:
// this.pageData.rowGridSelectKey == '' ||
// this.pageData.rowGridSelectKey == null
// ? 0
// : this.pageData.rowGridSelectKey ==
// this.$refs[this.gridName + this.myPrgmId].getData().length - 1
// ? this.pageData.rowGridSelectKey
// : 0,
// columnName: 'dt',
// setScroll: true,
// });
// this.setPageData({ isFind: false });
// });
// 첫번째 row 선택상태
this.$nextTick(() => {
this.$refs[this.gridName + this.myPrgmId].focus({
//rowKey: 0,
rowKey:
this.pageData.rowGridSelectKey == '' ||
this.pageData.rowGridSelectKey == null
? 0
: this.pageData.rowGridSelectKey ==
this.$refs[this.gridName + this.myPrgmId].getData().length - 1
? this.pageData.rowGridSelectKey
: 0,
columnName: 'dt',
setScroll: true,
});
this.setPageData({ isFind: false });
});
},
async getRowData(data, gridName) {
this.setGridSelectData({
@ -604,4 +533,17 @@ select.selectbox {
border-width: 0px;
// box-sizing: border-box;
}
::v-deep {
.custom-vc-calender {
.vc-header {
display: none;
}
.vc-weeks {
padding: 0;
}
}
}
</style>

View File

@ -1,33 +1,65 @@
<template>
<div class="l-layout">
<CommonPageTitle/>
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="center" no-gutters>
<v-col :cols="4">
<v-col :cols="3">
<component
:is="'selectCodeList'"
:parentPrgmId="myPrgmId"
:label="'시스템구분'"
dataKey="sysDivCd"
:labelCols="12"
:textCols="12"
:sendParam="{ commGrpCd: 'CO_SYSDIV', useFg: '1' }"
:addAll="true"
customClass="select-large"
/>
</v-col>
<v-col :cols="4">
<v-col :cols="3">
<component
:is="'selectCodeList'"
:parentPrgmId="myPrgmId"
:label="'사용여부'"
:labelCols="12"
:textCols="12"
:dataKey="'useFg'"
customClass="select-large"
:sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }"
/>
</v-col>
<v-col :cols="4" class="text-right">
<BtnSearch @click="search" />
<v-col :cols="3">
<InputText
:parentPrgmId="myPrgmId"
label="그룹코드"
valueNm="commGrpCd"
:searchOption="true"
:labelCols="12"
:textCols="12"
customClass="input-large"
/>
</v-col>
<v-col :cols="3">
<InputText
:parentPrgmId="myPrgmId"
label="그룹코드명"
valueNm="commGrpCdNm"
:searchOption="true"
:labelCols="12"
:textCols="12"
customClass="input-large"
/>
</v-col>
<v-col :cols="12" class="text-right">
<BtnSearch style="margin-top:20px" @click="search" size="large" />
</v-col>
</v-row>
<v-row align="center" no-gutters>
<!-- <v-row align="center" no-gutters>
<v-col :cols="4">
<InputText
:parentPrgmId="myPrgmId"
@ -48,7 +80,7 @@
:textCols="8"
/>
</v-col>
</v-row>
</v-row> -->
</v-card>
</v-col>
</v-row>
@ -85,7 +117,7 @@
<v-card class="pb-5">
<v-card-title>공통그룹코드 상세</v-card-title>
<div class="px-5" style="height:calc(100% - 70px)">
<v-tabs v-model="tab" :hide-slider="true">
<v-tabs v-model="tab" >
<v-tab
v-for="item in items"
:key="item.id"
@ -132,6 +164,7 @@ import Form from '~/components/common/form/Form';
import CommCdTab from '@/components/pages/comm/CommCdTab';
import Grid from '~/components/common/Grid';
import Utility from '~/plugins/utility';
import PageTitle from "~/components/common/PageTitle";
let myTitle;
let myPrgmId;
@ -158,6 +191,7 @@ export default {
Form,
CommCdTab,
Grid,
PageTitle
},
data() {
return {
@ -229,6 +263,9 @@ export default {
const myOptions = {
scrollX: false,
header: {
height: 38,
},
};
this.setGridOption({
gridKey: this.gridName,
@ -241,7 +278,7 @@ export default {
{
header: '시스템구분',
name: 'sysDivCd',
align: 'center',
align: 'left',
formatter({ value }) {
let commCdNm = '';
if (sysCdList.length > 0) {
@ -278,7 +315,7 @@ export default {
{
header: '사용여부',
name: 'useFg',
align: 'center',
align: 'left',
formatter({ value }) {
const newValue = _this.pageData.useFgList.filter(
item => item.commCd == value,
@ -326,7 +363,7 @@ export default {
gridKey: this.gridName,
value: newRes,
});
this.loadGrid = true;
this.loadGrid = true;
this.$nextTick(() => {
if (newRes.length > 0) {
this.$refs[this.gridName].focus({
@ -554,7 +591,10 @@ const myDetail = [
valueNm: 'commGrpCd',
disabled: true,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-2',
required: true,
},
{
@ -563,7 +603,10 @@ const myDetail = [
valueNm: 'commGrpNm',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-2',
required: true,
},
{
@ -572,7 +615,10 @@ const myDetail = [
valueNm: 'sysDivCd',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-2 mt-3',
list: 'sysDivCdList',
itemText: 'commCdNm',
itemValue: 'commCd',
@ -584,7 +630,10 @@ const myDetail = [
valueNm: 'useFg',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-2 mt-10',
value: { '1': true, '0': false },
required: true,
},
@ -594,7 +643,10 @@ const myDetail = [
valueNm: 'rmrk',
disabled: false,
cols: 6,
class: 'py-2',
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-2 mt-3',
},
];
</script>

View File

@ -1,23 +1,24 @@
<template>
<div class="l-layout">
<CommonPageTitle />
<!-- 리스트 페이지 시작 -->
<div v-if="pageActionFlag == 'list'" class="h1001">
<v-card class="" >
<v-card class="">
<div class="pa-5">
<v-row align="center" no-gutters >
<v-row align="center" no-gutters>
<v-col :cols="12" class="d-flex align-center justify-space-between">
<v-card-title class="pa-0 custom-title-4">공지사항</v-card-title>
<div class="d-flex align-center">
<!-- <v-btn @click="listPageButtonGroupClickEvent('view')" :ripple="false" class="mr-1">상세보기</v-btn> -->
<a-button type="primary" size="large" @click="listPageButtonGroupClickEvent('write')" :ripple="false"
<a-button type="primary" @click="listPageButtonGroupClickEvent('write')" :ripple="false"
icon="edit" class="mr-1">작성</a-button>
<!-- <v-btn @click="listPageButtonGroupClickEvent('delete')" :ripple="false">삭제</v-btn> -->
</div>
</v-col>
<v-col :cols="12" ref="contents" class="mt-5">
<div ref="gridParent" class="h100 px-50">
<component :is="loadGrid ? 'Grid' : null" :gridName="gridName" :parentPrgmId="myPrgmId"
ref="noticeMngGrid" @getRowsData="getRowData" :dataPath="dataPathMock" />
<v-col :cols="12" ref="contents" class="mt-5" style="min-height: calc(100% - 76px);">
<div ref="gridParent" class="px-50" style="min-height: 70vh;">
<component :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName"
:parentPrgmId="myPrgmId" @getRowsData="getRowData" />
</div>
</v-col>
</v-row>
@ -26,43 +27,45 @@
</div>
<!-- 리스트 페이지 -->
<!-- 상세보기 페이지 시작 -->
<div v-if="pageActionFlag == 'view'" class="h1001">
<div v-if="pageActionFlag == 'view'">
<v-card>
<v-row class="pa-5">
<v-col :cols="12" class="d-flex align-center justify-space-between ">
<v-card-title class="pa-0 custom-title-4">공지사항</v-card-title>
<v-card-title class="pa-0 custom-title-4">공지사항 보기</v-card-title>
<div class="d-flex align-center">
<a-button @click="viewPageButtonGroupClickEvent('list')" type="primary" :ripple="false" class="mr-1"
icon="unordered-list">목록</a-button>
<a-button @click="viewPageButtonGroupClickEvent('reply')" type="primary" :ripple="false" class="mr-1"
icon="send-outlined">
<a-button @click="viewPageButtonGroupClickEvent('list')" type="primary" :ripple="false"
class="mr-1" icon="unordered-list">목록</a-button>
<a-button @click="viewPageButtonGroupClickEvent('reply')" type="primary" :ripple="false"
class="mr-1" icon="send-outlined">
<v-icon small :class="['mr-2']">$icoSend</v-icon>
답글
</a-button>
<a-button @click="viewPageButtonGroupClickEvent('update')" type="primary" :ripple="false" class="mr-1"
icon="edit">수정</a-button>
<a-button @click="viewPageButtonGroupClickEvent('delete')" type="danger" ghost icon="delete">삭제</a-button>
<a-button @click="viewPageButtonGroupClickEvent('update')" type="primary" :ripple="false"
class="mr-1" icon="edit">수정</a-button>
<a-button @click="viewPageButtonGroupClickEvent('delete')" type="danger" ghost
icon="delete">삭제</a-button>
</div>
</v-col>
<v-col :cols="12">
<p class="custom-title-3 mb-2"> 제목 </p>
<v-text-field v-model="viewActionData.title" class="v-input__custom" hide-details :readonly="true">
</v-text-field>
<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:calc(90vh - 218px);" class="pa-5">
<viewer v-if="viewActionData.viewerFlag" ref="tuiViewer" height="inherit"
:initialValue="viewActionData.content" theme="white"
:class="isDarkMode ? 'theme--white' : 'theme--black'" />
<v-col :cols="12" style="min-height: 30vh;" 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"
:class="[isDarkMode ? 'theme--white' : 'theme--black']" />
</v-card>
</v-col>
<v-col :cols="6">
<p class="custom-title-3 mb-2">파일목록</p>
<div v-for="fileData in viewActionData.fileData"
:key="fileData.apndFileId"
class="file-item">
<v-col :cols="6" class="mt-5">
<v-card-title class="custom-title-7 pa-0">
파일목록
</v-card-title>
<div v-for="fileData in viewActionData.fileData" :key="fileData.apndFileId" class="file-item" style="background-color: unset;">
<a @click.prevent="downloadFile(fileData)">
<div class="d-flex justify-space-between search-box-label">
<div class="d-flex justify-start search-box-label">
<v-icon>mdi-paperclip</v-icon>
<span class="file-item-name">{{ fileData.apndFileNm + '.' + fileData.apndFileExt }}</span>
<span class="file-item-name ml-2">{{ fileData.apndFileNm + '.' +
fileData.apndFileExt }}</span>
</div>
</a>
</div>
@ -72,56 +75,47 @@
</div>
<!-- 상세보기 페이지 -->
<!-- 작성 페이지 시작 -->
<div v-if="pageActionFlag == 'write'" class="h1001">
<div v-if="pageActionFlag == 'write'">
<v-card>
<div class="pa-5">
<v-row class="pa-50">
<v-col :cols="12" class="">
<v-card-title class="custom-title-4 pa-0">공지사항</v-card-title>
<v-card-title class="custom-title-4 pa-0">공지사항 작성</v-card-title>
</v-col>
<v-col :cols="12" class="custom-title-4-new mt-4">
<p class="custom-title-3 mb-2">제목</p>
<v-col :cols="12" class="mt-4">
<v-card-title class="custom-title-7 pa-0">제목</v-card-title>
<v-text-field v-model="writeActionData.title" class="v-input__custom" hide-details outlined>
</v-text-field>
</v-col>
<v-col :cols="12" style="min-height: calc(90vh - 270px);">
<editor ref="tuiEditor" height="100%" initialEditType="wysiwyg" />
<v-col :cols="12" style="min-height: calc(100vh - 450px);">
<editor ref="tuiEditor" height="100%" initialEditType="wysiwyg"
:class="[isDarkMode ? 'toastui-editor-dark' : 'toastui-editor-light']"/>
</v-col>
<v-col :cols="12" class="mt-2">
<p class="custom-title-3 mb-2">
파일첨부
</p>
</v-col>
<v-col :cols="6">
<v-col :cols="6" class="mt-5">
<v-card-title class="custom-title-7 pa-0">파일첨부</v-card-title>
<div class="" v-if="writeActionData.fileData">
<div
v-for="(fileData, index) in writeActionData.fileData"
:key="fileData.apndFileId"
<div v-for="(fileData, index) in writeActionData.fileData" :key="fileData.apndFileId"
class="file-item d-flex justify-space-between">
<div class="file-item-detail">
<v-icon>mdi-paperclip</v-icon>
<span href="#" class="file-item-name">{{ fileData.name }}</span>
</div>
<a-icon type="delete" class="v-icon pointer" @click="writeActionData.fileData.splice(index, 1)" />
<a-icon type="delete" class="v-icon pointer"
@click="writeActionData.업로드fileData.splice(index, 1)" />
</div>
</div>
<a-button class="mt-2" icon="upload" @click="$refs.writeInputFile.$refs.input.click()" >
<a-button class="mt-2" icon="upload" @click="$refs.writeInputFile.$refs.input.click()">
업로드
</a-button>
<v-file-input
ref="writeInputFile"
v-model="writeActionData.fileData"
multiple
outlined
hide-input
class="d-none"
prepend-icon="mdi-tray-arrow-up"
></v-file-input>
<v-file-input ref="writeInputFile" v-model="writeActionData.fileData" multiple outlined
hide-input class="d-none" prepend-icon="mdi-tray-arrow-up"></v-file-input>
</v-col>
<v-col :cols="12" class="text-right">
<a-button @click="writePageButtonGroupClickEvent('cancel')" :ripple="false" class="mr-2">취소</a-button>
<a-button @click="writePageButtonGroupClickEvent('write')" :ripple="false" type="primary">등록</a-button>
<a-button @click="writePageButtonGroupClickEvent('cancel')" :ripple="false"
class="mr-2">취소</a-button>
<a-button @click="writePageButtonGroupClickEvent('write')" :ripple="false"
type="primary">등록</a-button>
</v-col>
</v-row>
</div>
@ -129,92 +123,105 @@
</div>
<!-- 작성 페이지 -->
<!-- 답글 작성 페이지 시작 -->
<div v-if="pageActionFlag == 'reply'" class="h1001">
<div v-if="pageActionFlag == 'reply'">
<v-card class="pa-5">
<v-row align="center" class="mt-0">
<v-col :cols="12" class="">
<v-card-title class="custom-title-4 pa-0">공지사항</v-card-title>
</v-col>
<v-col :cols="12">
<p class="custom-title-3 mb-2">제목</p>
<v-text-field v-model="replyActionData.title" class="v-input__custom" placeholder="제목" outlined
hide-details>
<v-col :cols="12" class="mt-4">
<v-card-title class="custom-title-7 pa-0">제목</v-card-title>
<v-text-field v-model="replyActionData.title" class="v-input__custom" outlined hide-details>
</v-text-field>
</v-col>
<v-col :cols="12" style="height: calc(100vh - 270px);" class="mt-2">
<editor ref="tuiReplyEditor" height="100%" initialEditType="wysiwyg" />
<editor ref="tuiReplyEditor" height="100%" initialEditType="wysiwyg"
:class="[isDarkMode ? 'toastui-editor-dark' : 'toastui-editor-light']"/>
</v-col>
<v-col :cols="6" class="mt-4">
<p class="custom-title-3 mb-2">
파일첨부
</p>
<v-col :cols="6" class="mt-5">
<v-card-title class="custom-title-7 pa-0">파일첨부</v-card-title>
<div class="" v-if="replyActionData.fileData">
<div
v-for="(fileData, index) in replyActionData.fileData"
:key="fileData.apndFileId"
<div v-for="(fileData, index) in replyActionData.fileData" :key="fileData.apndFileId"
class="file-item d-flex justify-space-between">
<div class="file-item-detail">
<v-icon>mdi-paperclip</v-icon>
<span href="#" class="file-item-name">{{ fileData.name }}</span>
</div>
<a-icon type="delete" class="v-icon pointer" @click="replyActionData.fileData.splice(index, 1)" />
<a-icon type="delete" class="v-icon pointer"
@click="replyActionData.fileData.splice(index, 1)" />
</div>
</div>
<a-button class="mt-3" icon="upload" @click="$refs.replyInputFile.$refs.input.click()" >
<a-button class="mt-3" icon="upload" @click="$refs.replyInputFile.$refs.input.click()">
업로드
</a-button>
<v-file-input ref="replyInputFile" multiple show-size v-model="replyActionData.fileData" hide-details="true" class="d-none">
<v-file-input ref="replyInputFile" multiple show-size v-model="replyActionData.fileData"
hide-details="true" class="d-none">
</v-file-input>
</v-col>
<v-col :cols="12" class="text-right">
<a-button @click="replyPageButtonGroupClickEvent('cancel')" :ripple="false">취소</a-button>
<a-button @click="replyPageButtonGroupClickEvent('reply')" :ripple="false" type="primary">등록</a-button>
<a-button @click="replyPageButtonGroupClickEvent('reply')" :ripple="false"
type="primary">등록</a-button>
</v-col>
</v-row>
</v-card>
</div>
<!-- 답글 작성 페이지 -->
<!-- 수정 페이지 시작 -->
<div v-if="pageActionFlag == 'update'" class="h1001">
<div v-if="pageActionFlag == 'update'">
<v-card>
<div class="pa-5">
<v-row align="center" no-gutters>
<v-col :cols="12">
<v-card-title class="custom-title-4 pa-0">공지사항</v-card-title>
<v-card-title class="custom-title-4 pa-0">공지사항 수정</v-card-title>
</v-col>
<v-col :cols="12" class="mt-4">
<p class="custom-title-3 mb-2">제목</p>
<v-text-field v-model="updateActionData.title" class="v-input__custom" placeholder="" hide-details outlined>
<v-card-title class="custom-title-7 pa-0">제목</v-card-title>
<v-text-field v-model="updateActionData.title" class="v-input__custom" hide-details
outlined>
</v-text-field>
</v-col>
<v-col :cols="12" style="height: calc(90vh - 270px);" class="mt-4" >
<v-col :cols="12" style="height: calc(90vh - 270px);" class="mt-4">
<editor ref="tuiUpdateEditor" height="100%" initialEditType="wysiwyg"
:initialValue="updateActionData.content" />
:initialValue="updateActionData.content"
:class="[isDarkMode ? 'toastui-editor-dark' : 'toastui-editor-light']"/>
</v-col>
<v-col :cols="6">
<p class="pa-0 mb-2 custom-title-4-new-1">파일첨부</p>
<div class="" v-if="updateActionData.fileData">
<div
v-for="(fileData, index) in updateActionData.fileData"
:key="fileData.apndFileId"
class="file-item d-flex justify-space-between">
<div class="file-item-detail">
<v-icon>mdi-paperclip</v-icon>
<span href="#" class="file-item-name">{{ fileData.name }}</span>
</div>
<a-icon type="delete" class="v-icon pointer" @click="updateActionData.fileData.splice(index, 1)" />
<v-col :cols="6" class="mt-5">
<v-card-title class="custom-title-7 pa-0">파일첨부</v-card-title>
<div class="" v-if="updateActionData.fileData">
<div v-for="(fileData, index) in updateActionData.fileData" :key="fileData.apndFileId"
class="file-item d-flex justify-space-between">
<div class="file-item-detail">
<v-icon style="font-size: 18px;">mdi-paperclip</v-icon>
<span href="#" class="file-item-name">{{ fileData.name }}</span>
</div>
<a-icon type="delete" class="v-icon pointer"
@click="updateActionData.fileData.splice(index, 1)" />
</div>
<a-button class="mt-2" icon="upload" @click="$refs.updateInputFile.$refs.input.click()" >
업로드
</a-button>
<v-file-input ref="updateInputFile" multiple show-size v-model="updateActionData.fileData"
hide-details="true" class="d-none">
</v-file-input>
</div>
<div class="" v-if="updateActionData.currentFileList">
<div v-for="(fileData, index) in updateActionData.currentFileList"
:key="fileData.apndFileId" class="file-item d-flex justify-space-between">
<div class="file-item-detail">
<v-icon style="font-size: 18px;">mdi-paperclip</v-icon>
<span @click.prevent="downloadFile(fileData)" href="#"
class="file-item-name pointer">{{ fileData.apndFileNm + '.' +
fileData.apndFileExt }}</span>
</div>
<a-icon type="delete" class="v-icon pointer"
@click="addFileToDeleteFileList(fileData)" />
</div>
</div>
<a-button class="mt-2" icon="upload" @click="$refs.updateInputFile.$refs.input.click()">
업로드
</a-button>
<v-file-input ref="updateInputFile" multiple show-size v-model="updateActionData.fileData"
hide-details="true" class="d-none">
</v-file-input>
</v-col>
<v-col :cols="12" class="text-right">
<a-button @click="updatePageButtonGroupClickEvent('cancel')" >취소</a-button>
<a-button @click="updatePageButtonGroupClickEvent('update')" type="primary" >등록</a-button>
<a-button @click="updatePageButtonGroupClickEvent('cancel')">취소</a-button>
<a-button @click="updatePageButtonGroupClickEvent('update')" type="primary">등록</a-button>
</v-col>
</v-row>
</div>
@ -266,7 +273,8 @@ export default {
myPrgmId: myPrgmId,
//comId: "SEMPIO",
//comId: this.userInfo.comId,
comId: this.$store.state.userInfo.comId,
// comId: this.$store.state.userInfo.comId,
bordNo: null,
pageActionFlag: 'list',
gridName: 'noticeMngGrid',
@ -299,8 +307,6 @@ export default {
postGrpOrd: null,
postOrgNo: null,
},
dataPathMock: {},
};
},
computed: {
@ -345,7 +351,7 @@ export default {
chkOpenTabList: 'chkOpenTabList',
getDomain: 'modules/list/getDomain',
}),
onTest(){
onTest() {
console.log(this.writeActionData.fileData);
},
async init() {
@ -402,10 +408,13 @@ export default {
this.getGridData();
},
gridInit() {
this.loadGrid = false;
const gridHeight = this.$refs.contents.offsetHeight - 76;
const myOptions = {};
const myOptions = {
header: {
height: 38,
},
};
this.setGridOption({
gridKey: this.gridName,
value: Object.assign(Utility.defaultGridOption(gridHeight), myOptions),
@ -426,7 +435,7 @@ export default {
align: 'center',
hidden: true,
},
{ header: '번호', name: 'postNo', width: 150, align: 'center' },
{ header: '번호', name: 'postNo', width: 150, align: 'right' },
{
header: '원글번호',
name: 'postOrgNo',
@ -456,9 +465,9 @@ export default {
hidden: true,
},
{ header: '제목', name: 'title', align: 'left' },
{ header: '작성자', name: 'regUserNo', width: 250, align: 'center' },
{ header: '작성자', name: 'regUserNo', width: 250, align: 'right' },
{ header: '작성일', name: 'regDttm', width: 250, align: 'center' },
{ header: '조회수', name: 'viewCnt', width: 150, align: 'center' },
{ header: '조회수', name: 'viewCnt', width: 150, align: 'right' },
// {header: "파일아이디", name:"apndFileUuid", width:150, align:"center"}, // 수정필요
];
@ -466,13 +475,6 @@ export default {
gridKey: this.gridName,
value: columnList,
});
// -----------------------TEST------------------
this.dataPathMock[this.gridName] = {
column: columnList,
data: dataPathDataExample,
}
// -----------------------END TEST--------------
this.getGridData();
},
async getGridData() {
@ -481,22 +483,12 @@ export default {
};
this.loadGrid = false;
let res = null;
try {
res = await this.postApiReturn({
apiKey: 'selectPostList',
resKey: 'postData',
sendParam: params,
});
}
catch (err) { }
finally {
// -----Test mock data-------------
if (null === res) {
res = dataPathDataExample;
}
// -----End test
}
const res = await this.postApiReturn({
apiKey: 'selectPostList',
resKey: 'postData',
sendParam: params,
});
this.setGridData({
gridKey: this.gridName,
@ -1042,15 +1034,6 @@ const defaultData = {
},
};
import { getPathDataExample } from '@/const/const'
const dataPathDataExample = getPathDataExample({
postNo: '18',
title: '오픈공지',
regUserNo: '1',
regDttm: '2023-01-09 09:39:41',
viewCnt: '1'
}, 10);
</script>
<style lang="scss" scoped>
@ -1064,8 +1047,46 @@ const dataPathDataExample = getPathDataExample({
margin: 2px 0;
padding: 4px;
background-color: #0000000A;
.file-item-name{
.file-item-name {
color: #1677FF;
}
}
::v-deep {
.v-input__slot {
padding-left: 8px;
padding-right: 8px;
}
.custom-view {
border: 1px solid;
border-radius: 6px;
height: 0;
@each $theme in dark, light {
@include theme($theme);
border-color: map-deep-get($config, #{$theme}, "v-input-textarea-border");
;
}
}
.toastui-editor-mode-switch {
font-family: Inter !important;
font-size: 1.0rem !important;
}
.toastui-editor-mode-switch .tab-item.active {
color: #1677FF
}
.toastui-editor-light .toastui-editor-mode-switch .tab-item {
color: #000000E0
}
.v-icon.anticon-delete svg {
width: 14px;
height: 14px;
}
}
</style>

View File

@ -1,33 +1,21 @@
<template>
<div class="l-layout">
<CommonPageTitle />
<!-- 조회조견 -->
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="end" no-gutters>
<v-col :cols="3">
<component
:is="'selectCodeList'"
:parentPrgmId="myPrgmId"
:label="'사용여부'"
:dataKey="'selectUseFg'"
:sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }"
:addAll="true"
customClass="select-large"
/>
<component :is="'selectCodeList'" :parentPrgmId="myPrgmId" :label="'사용여부'"
:dataKey="'selectUseFg'" :sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }"
:addAll="true" customClass="select-large" />
</v-col>
<v-col :cols="4">
<InputText
:parentPrgmId="myPrgmId"
label="프로그램명"
valueNm="prgmNm"
:searchOption="true"
:labelCols="12"
:textCols="12"
customClass="input-large"
/>
<v-col :cols="3">
<InputText :parentPrgmId="myPrgmId" label="프로그램명" valueNm="prgmNm" :searchOption="true"
:labelCols="12" :textCols="12" customClass="input-large" />
</v-col>
<v-col :cols="5" class="text-right">
<v-col :cols="6" class="text-right">
<BtnSearch size="large" />
</v-col>
</v-row>
@ -37,47 +25,32 @@
<v-row ref="contents">
<!-- 프로그램 리스트 -->
<v-col :cols="5" class="h100">
<v-card class="pb-5">
<div class="d-flex align-center justify-space-between pa-5">
<v-col :cols="5">
<v-card class="pa-5">
<div class="d-flex align-center justify-space-between">
<v-card-title class="pa-0">프로그램 리스트</v-card-title>
<div>
<Buttons
:parentPrgmId="myPrgmId"
:bindingData="gridName"
:detailList="detailList"
:btnActionsFnc="btnActions"
/>
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridName" :detailList="detailList"
:btnActionsFnc="btnActions" />
</div>
</div>
<div style="min-height:calc(100% - 70px)">
<div ref="gridParent" class="px-5 h100">
<component
:ref="gridName"
:is="loadGrid ? 'Grid' : null"
:parentPrgmId="myPrgmId"
:gridName="gridName"
@getRowsData="getRowData"
:dataPath="dataPathMock"
/>
</div>
<div ref="gridParent" class="pt-5" style="height: 60vh">
<!-- <div ref="gridParent" class="px-5 h100">
</div> -->
<component :ref="gridName" :is="loadGrid ? 'Grid' : null" :parentPrgmId="myPrgmId"
:gridName="gridName" @getRowsData="getRowData" />
</div>
</v-card>
</v-col>
<!-- 프로그램 상세 -->
<v-col :cols="7" class="h100">
<v-col :cols="7">
<v-card class="pb-5">
<div class="d-flex align-center justify-space-between pa-5">
<v-card-title class="pa-0">프로그램 상세</v-card-title>
</div>
<div class="px-5" style="min-height:calc(100% - 76px)">
<component
:is="'Form'"
:parentPrgmId="myPrgmId"
:bindingData="gridName"
:detailList="detailList"
@gridEditingFinish="gridEditingFinish"
/>
<component :is="'Form'" :parentPrgmId="myPrgmId" :bindingData="gridName"
:detailList="detailList" @gridEditingFinish="gridEditingFinish" />
<!-- <div class="w100">
</div> -->
</div>
@ -130,23 +103,6 @@ export default {
gridName: 'rowGrid',
// rowGridOrigin: [],
detailList: myDetail,
dataPathMock: {
'rowGrid': {
column: [
{ header: '프로그램ID', name: 'field1', align: 'left' },
{ header: '프로그램덤', name: 'field2', align: 'left' },
{ header: '타임', name: 'field3', align: 'left' },
{ header: '사용여부', name: 'field4', align: 'left' }
],
data: dataPathDataExample,
defaultRow: dataPathDataExample,
option: {
scrollY: false,
scrollX: false,
}
}
},
};
},
computed: {
@ -218,17 +174,17 @@ export default {
const gridHeight = this.$refs.gridParent.offsetHeight - 36;
const myOptions = {
scrollX: false,
scrollY: true,
};
// console.log("this.pageData", this.pageData)
const _this = this;
const myColumns = [
{ header: '프로그램ID', name: 'prgmId', align: 'center' },
{ header: '프로그램명', name: 'prgmNm' },
{ header: '프로그램ID', name: 'prgmId', align: 'left' },
{ header: '프로그램명', name: 'prgmNm', align: 'left' },
{
header: '타입',
name: 'prgmTpCd',
align: 'center',
align: 'left',
formatter({ value }) {
return value ? (value === '1' ? '프로그램' : '팝업') : null;
},
@ -236,7 +192,7 @@ export default {
{
header: '사용여부',
name: 'useFg',
align: 'center',
align: 'left',
formatter({ value }) {
value = value === true ? '1' : '0';
const newValue = _this.pageData.selectUseFgList.filter(
@ -262,8 +218,6 @@ export default {
});
// this.getRowGridData();
this.loadGrid = true;
},
async search() {
await this.getRowGridData();
@ -296,6 +250,7 @@ export default {
gridKey: this.gridName,
value: newRes,
});
this.loadGrid = true;
this.$nextTick(() => {
if (newRes.length > 0) {
@ -304,18 +259,23 @@ export default {
//rowKey: this.chkRowGridSelectKey || 0,
rowKey:
this.pageData.rowGridSelectKey == '' ||
this.pageData.rowGridSelectKey == null
this.pageData.rowGridSelectKey == null
? 0
: this.pageData.rowGridSelectKey ==
this.$refs[this.gridName].getData().length - 1
? this.pageData.rowGridSelectKey
: 0,
this.$refs[this.gridName].getData().length - 1
? this.pageData.rowGridSelectKey
: 0,
setScroll: true,
});
}
});
},
async getRowData(data, gridName) {
// gridKey: gridName,
// gridSelect: true,
// rowGridSelectKey: data.rowKey,
// rowGridSelectData: data,
// });
this.setGridSelectData({
gridKey: gridName,
gridSelect: true,
@ -327,6 +287,7 @@ export default {
rowGridSelectKey: data.rowKey,
rowGridSelectData: data,
});
},
compareData(type, newDt) {
if (this.selectedCommCdData[type] == newDt) {
@ -482,7 +443,7 @@ const myDetail = [
valueNm: 'prgmTpCd',
essential: true,
cols: 6,
class: 'py-2',
class: 'py-2 pt-5',
list: [
{ text: '프로그램', value: '1' },
{ text: '팝업', value: '2' },
@ -497,10 +458,11 @@ const myDetail = [
essential: true,
disabled: false,
cols: 6,
class: 'py-2',
class: 'py-2 pt-13',
value: { '1': true, '0': false },
required: true,
textCols: 12,
labelCols:12,
iconShow: true
},
{
@ -509,7 +471,7 @@ const myDetail = [
valueNm: 'url',
disabled: false,
cols: 12,
class: 'py-2',
class: 'py-2 pt-4',
required: true,
textCols: 12,
iconShow: true
@ -520,7 +482,7 @@ const myDetail = [
valueNm: 'regUserNo',
disabled: true,
cols: 6,
class: 'py-2',
class: 'py-2 pt-5',
placeholder: '시스템 자동입력',
textCols: 12,
iconShow: true
@ -531,7 +493,7 @@ const myDetail = [
valueNm: 'regDttm',
disabled: true,
cols: 6,
class: 'py-2',
class: 'py-2 pt-5',
placeholder: '시스템 자동입력',
textCols: 12,
iconShow: true
@ -542,7 +504,7 @@ const myDetail = [
valueNm: 'procUserNo',
disabled: true,
cols: 6,
class: 'py-2',
class: 'py-2 pt-5',
placeholder: '시스템 자동입력',
textCols: 12,
iconShow: true
@ -553,19 +515,10 @@ const myDetail = [
valueNm: 'procDttm',
disabled: true,
cols: 6,
class: 'py-2',
class: 'py-2 pt-5',
placeholder: '시스템 자동입력',
textCols: 12,
iconShow: true
},
];
import { getPathDataExample } from '@/const/const'
const dataPathDataExample = getPathDataExample({
field1: 'PRG0001',
field2: '대시보드',
field3: '프로그램',
field4: '사용'
});
</script>

View File

@ -1,5 +1,6 @@
<template>
<div class="l-layout">
<CommonPageTitle />
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">

View File

@ -12,7 +12,6 @@
dataKey="searchAddGrp"
:sendParam="{ useFg: '1' }"
:addAll="true"
:iconShow="true"
customClass="select-large"
/>
</v-col>
@ -22,7 +21,6 @@
label="추가 정보명"
valueNm="addInfoNm"
:searchOption="true"
:iconShow="true"
customClass="input-large"
/>
</v-col>
@ -64,7 +62,6 @@
:gridName="gridName"
:parentPrgmId="myPrgmId"
@getRowsData="getRowData"
:dataPath="dataPathMock"
/>
</div>
</div>
@ -137,24 +134,10 @@ export default {
return {
myPrgmId: myPrgmId,
gridName: 'rowGrid',
loadGrid: true,
loadGrid: false,
tab: null,
detailList: myDetail,
initedFlag: false,
dataPathMock : {
'rowGrid': {
column: [
{ header: '추가 정보 그룹', name: 'addGrpId', align: 'left' },
{ header: '추가 정보 ID', name: 'addInfoId', align: 'left' },
{ header: '추가 정보 명', name: 'addInfoNm', align: 'left' },
{ header: 'Data 형식', name: 'addInfoDataKind', align: 'center' },
{ header: '사용여부', name: 'useFg', align: 'center' },
],
data: dataMockExample,
defaultRow: dataMockExample,
option: {},
},
},
};
},
computed: {
@ -351,8 +334,7 @@ export default {
this.search();
},
async search() {
//process
this.loadGrid = true;
this.loadGrid = false;
await this.getRowGridData();
await this.setPageData({
isFind: false,
@ -562,7 +544,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
class: 'py-2 pr-4 mt-2',
required: true,
},
{
@ -574,7 +556,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
class: 'py-2 pl-4 mt-2',
list: 'addInfoDataKindList',
itemText: 'commCdNm',
itemValue: 'commCd',
@ -589,7 +571,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
class: 'py-2 pr-4 mt-2 d-flex align-items-center',
value: { '1': true, '0': false },
required: true,
},
@ -602,7 +584,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
class: 'py-2 pl-4 mt-2',
placeholder: '시스템 자동입력',
},
{
@ -614,7 +596,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
class: 'py-2 pr-4 mt-2',
placeholder: '시스템 자동입력',
},
{
@ -626,7 +608,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pl-4',
class: 'py-2 pl-4 mt-2',
placeholder: '시스템 자동입력',
},
{
@ -638,47 +620,11 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-2 pr-4',
class: 'py-2 pr-4 mt-2',
placeholder: '시스템 자동입력',
},
];
const dataMockExample = [
{
addGrpId: 'GRP001',
addInfoId: 'INFO001',
addInfoNm: '온도 센서',
addInfoDataKind: 'DATA01',
useFg: true,
},
{
addGrpId: 'GRP002',
addInfoId: 'INFO002',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA02',
useFg: false,
},
{
addGrpId: 'GRP003',
addInfoId: 'INFO003',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA03',
useFg: false,
},
{
addGrpId: 'GRP004',
addInfoId: 'INFO004',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA04',
useFg: false,
},
{
addGrpId: 'GRP005',
addInfoId: 'INFO005',
addInfoNm: '압력 센서',
addInfoDataKind: 'DATA05',
useFg: false,
},
];
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,7 @@
<template>
<div class="l-layout">
<v-row ref="searchFilter">
<CommonPageTitle />
<v-row ref="searchFilter" class="mt-2">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="end" no-gutters>
@ -16,8 +17,8 @@
</v-card>
</v-col>
</v-row>
<v-row ref="contents">
<v-col :cols="5" style="height:100%">
<v-row ref="contents" class="pt-2">
<v-col :cols="5" class="pr-2">
<v-card class="pb-5">
<div class="d-flex align-center justify-space-between pa-4">
<v-card-title class="pa-0 custom-title-4">효율지표 리스트</v-card-title>
@ -32,11 +33,11 @@
</div>
</v-card>
</v-col>
<v-col :cols="7" style="height:100%">
<v-col :cols="7" class="pl-2">
<v-card class="pb-5">
<v-card-title class="custom-title-4 pa-4 pb-2">효율지표 상세
</v-card-title>
<div class="px-4" style="height:calc(100% - 76px)">
<div class="px-4" >
<v-tabs v-model="tab">
<v-tab v-for="item in items" :key="item.id" :disabled="(item.id == 'EffcIdxAddInfoTab'
? isInfoTabDisabled
@ -161,7 +162,7 @@ import EffcIdxAddInfoTab from '@/components/pages/ems/EffcIdxInfo/EffcIdxAddInfo
import Grid from '~/components/common/Grid';
import Utility from '~/plugins/utility';
import SelectBox from '@/components/common/select/SelectBox';
import CheckBox from '~/components/common/checkbox/CheckBox';
import CheckBox from '~/components/common/CheckBox';
import EqpmCalcPop from '~/components/common/modal/EqpmCalcPop';
import TextArea from '@/components/common/form/TextArea';
@ -213,64 +214,6 @@ export default {
},
],
loadGrid: false,
// "effcIdxGrid": {
// data: [
// {
// "effcIdxId": "E001",
// "effcIdxNm": "에너지 소비 효율",
// "effcKind": "환경"
// },
// {
// "effcIdxId": "E002",
// "effcIdxNm": "작업 시간 대비 생산량",
// "effcKind": "생산성"
// },
// {
// "effcIdxId": "E003",
// "effcIdxNm": "장비 가동률",
// "effcKind": "운영"
// },
// {
// "effcIdxId": "E004",
// "effcIdxNm": "불량률",
// "effcKind": "품질"
// },
// {
// "effcIdxId": "E005",
// "effcIdxNm": "재고 회전율",
// "effcKind": "물류"
// }
// ]
// ,
// column: [
// {
// header: '효율지표 ID',
// name: 'effcIdxId',
// align: 'center',
// // hidden:true
// },
// {
// header: '효율지표명',
// name: 'effcIdxNm',
// align: 'left',
// minWidth: 150,
// // hidden:true
// },
// {
// header: '효율지표종류',
// name: 'effcKind',
// align: 'left',
// // hidden: true,
// },
// // { header: '등록 사용자', name: 'regUserNo', hidden: true },
// // { header: '등록 일자', name: 'regDttm', hidden: true },
// // { header: '수정 사용자', name: 'procUserNo', hidden: true },
// // { header: '수정 일자', name: 'procDttm', hidden: true },
// ],
// }
// },
initFlag: false,
selectValueList01: [],
selectValueList02: [],
@ -918,7 +861,6 @@ export default {
{
header: '효율지표 ID',
name: 'effcIdxId',
align: 'center',
// hidden:true
},
{

View File

@ -12,8 +12,6 @@
dataKey="searchLocKind"
:sendParam="{ commGrpCd: 'EM_LOC_KIND', useFg: '1' }"
:addAll="true"
:iconShow="true"
customClass="select-large"
/>
</v-col>
<v-col :cols="2.5">
@ -24,12 +22,10 @@
dataKey="searchEccKind"
:sendParam="{ commGrpCd: 'EM_ECC_KIND', useFg: '1' }"
:addAll="true"
:iconShow="true"
customClass="select-large"
/>
</v-col>
<!-- 사업장 -->
<!-- <v-col :cols="3">
사업장
<div style="visibility:hidden">
<component
:is="'SelectBlocMstr'"
@ -46,8 +42,6 @@
dataKey="useFg"
:sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }"
:addAll="true"
:iconShow="true"
customClass="select-large"
/>
</v-col>
<v-col :cols="2.5">
@ -58,11 +52,20 @@
:labelCols="12"
:textCols="12"
:searchOption="true"
:iconShow="true"
customClass="input-large"
/>
</v-col>
<BtnSearch @click="search" size="large" />
<v-col class="text-right">
<BtnSearch @click="search" />
</v-col>
</v-row>
<v-row align="center" no-gutters>
<div style="display: none">
<component
:is="'SelectBlocMstr'"
ref="SelectBlocMstr"
:parentPrgmId="myPrgmId"
/>
</div>
</v-row>
</v-card>
</v-col>
@ -79,23 +82,22 @@
:btnActionsFnc="btnActions"
/>
</div>
<div class="px-5" style="min-height:calc(100% - 76px)">
<div ref="gridParent" class="w100 h100 pb-2">
<div class="px-5" style="height:calc(100% - 76px)">
<div ref="gridParent" class="w100 h100">
<component
:ref="gridName"
:is="loadGrid ? 'Grid' : null"
:is="loadGrid ? 'Grid' : null"
:gridName="gridName"
:parentPrgmId="myPrgmId"
@getRowsData="getRowData"
@sendSelectedRowStatInfo="getSelectedRowStatInfo"
:selectedRowDataWatchFlag="true"
:dataPath="dataPathMock"
/>
</div>
</div>
</v-card>
</v-col>
<v-col :cols="7" class="h100">
<v-col :cols="7" style="min-height:75vh;">
<v-card class="pb-5">
<v-card-title class="custom-title-4" style="min-height:76px;"
>공정 상세
@ -196,15 +198,13 @@ export default {
gridName: 'rowGrid',
loadGrid: false,
tab: null,
selectedRowKey: null,
// rowSelectionStatus: {},
dataPathMock : { },
items: [
{ name: '공정 정보', id: 'eccBaseInfoTab', disabledFlag: false },
{ name: '공정 추가 정보', id: 'eccAddInfoTab', disabledFlag: false },
{ name: '공정 연결 정보', id: 'eccIaoTab', disabledFlag: false },
],
detailList: myDetail,
loadGrid: false,
};
},
computed: {
@ -320,23 +320,11 @@ export default {
},
mounted() {
this.init();
this.$nextTick(() => {
// const checkbox = document.getElementById('headerCheckbox');
// if (checkbox) {
// checkbox.addEventListener('change', this.handleHeaderCheckboxChange);
// }
});
},
beforeDestroy() {
this.chkOpenTabList({ key: 'destroy', prgmId: myPrgmId });
},
methods: {
handleHeaderCheckboxChange(event) {
const checked = event.target.checked;
this.dataPathMock.rowGrid.data.forEach(row => {
row.selected = checked;
});},
...mapMutations({
setPageData: 'setPageData',
}),
@ -351,41 +339,7 @@ export default {
blocId: this.userInfo.blocId,
});
},
gridInitTest() {
const rowGrid = {
column: [
{
header: '',
name: '',
align: 'center',
width: 50,
formatter: (props) => {
return `<label class="custom-radio">
<span class="radio-mark"></span>
</label>`;
}
},
{ header: '공정 정보', name: 'eccNm', align: 'left' },
{ header: '현재 상태', name: 'status', align: 'center' },
{ header: '공정 유형', name: 'eccKind', align: 'left' },
{ header: '사용 여부', name: 'useFg', align: 'center' },
],
data: dataMockExample,
defaultRow: dataMockExample,
option: {
...gridOptions,
},
}
this.dataPathMock = {rowGrid};
this.$nextTick(() => {
this.loadGrid = true;
});
},
gridInit() {
// Test
this.gridInitTest(); return;
// End test
const gridHeight = this.$refs.gridParent.offsetHeight - 30;
const gridWidth = this.$refs.gridParent.offsetWidth;
@ -404,6 +358,17 @@ export default {
const _this = this;
const myColumns = [
{
header: '',
name: '',
align: 'center',
width: 50,
formatter: (props) => {
return `<label class="custom-radio">
<span class="radio-mark"></span>
</label>`;
}
},
{ header: '회사 ID', name: 'comId', hidden: true },
{
header: '공정 명',
@ -598,16 +563,6 @@ export default {
});
},
async getRowData(data) {
//Progess and fake radio
// const rowKey = data.rowKey;
// this.selectedRowKey = rowKey;
// Object.keys(this.rowSelectionStatus).forEach(key => {
// this.$set(this.rowSelectionStatus, key, false);
// });
// this.$set(this.rowSelectionStatus, rowKey, true);
this.setEccAddInfo(data);
this.setEccIao(data);
this.setGridSelectData({
@ -623,9 +578,6 @@ export default {
rowGridSelectKey: data.rowKey,
rowGridSelectData: Object.assign({}, data),
});
//fake radio need recheck
// this.$refs[this.gridName]?.repaint?.();
},
async setEccAddInfo(data) {
this.setPageData({
@ -1070,142 +1022,4 @@ const myDetail = [
value: { '1': true, '0': false },
},
];
const dataMockExample = [
{
eccId: 'ECC000001',
eccNm: 'EGP_HVAC_LT_CH001',
status: '운영중',
eccKind: '공정',
useFg: '1',
_children: [
{
eccId: 'ECC000002',
eccNm: 'B01',
status: '대기',
eccKind: '공정',
useFg: '1',
_children: [
{
eccId: 'ECC000005',
eccNm: 'B01-1',
status: '운영중',
eccKind: '공정',
useFg: '1',
_children: [
{
eccId: 'ECC000009',
eccNm: 'B01-1-1',
status: '운영중',
eccKind: '공정',
useFg: '1'
},
{
eccId: 'ECC0000010',
eccNm: 'B01-1-2',
status: '운영중',
eccKind: '공정',
useFg: '1'
},
{
eccId: 'ECC0000011',
eccNm: 'B01-1-3',
status: '운영중',
eccKind: '공정',
useFg: '1'
},
]
},
{
eccId: 'ECC000006',
eccNm: 'B01-2',
status: '점검중',
eccKind: '공정',
useFg: '0',
_children: [
{
eccId: 'ECC0000013',
eccNm: 'B01-2-1',
status: '운영중',
eccKind: '공정',
useFg: '1'
},
{
eccId: 'ECC0000014',
eccNm: 'B01-1-2',
status: '운영중',
eccKind: '공정',
useFg: '1'
},
{
eccId: 'ECC0000015',
eccNm: 'B01-1-3',
status: '운영중',
eccKind: '공정',
useFg: '1'
},
]
},
{
eccId: 'ECC000007',
eccNm: 'B01-3',
status: '운영중',
eccKind: '공정',
useFg: '1',
_children: [
{
eccId: 'ECC000009',
eccNm: 'B01-3-1',
status: '운영중',
eccKind: '공정',
useFg: '1'
},
{
eccId: 'ECC0000010',
eccNm: 'B01-3-2',
status: '운영중',
eccKind: '공정',
useFg: '1'
},
{
eccId: 'ECC0000011',
eccNm: 'B01-3-3',
status: '운영중',
eccKind: '공정',
useFg: '1'
},
]
},
],
},
{
eccId: 'ECC000003',
eccNm: 'B02',
status: '운영중',
eccKind: '공정',
useFg: '1',
},
{
eccId: 'ECC000004',
eccNm: 'B03',
status: '점검중',
eccKind: '공정',
useFg: '0',
},
],
},
];
const gridOptions = {
treeColumnOptions: {
name: 'eccNm', // Showing tree table
useIcon: false, // Not using icon
indentWidth: 10,// spacing when showing children
},
header: {
height: 40,
},
rowHeight: 35,
showCheckbox: false,
};
</script>
</script>

View File

@ -1,6 +1,7 @@
<template>
<div class="l-layout">
<v-row ref="searchFilter">
<CommonPageTitle />
<v-row ref="searchFilter" class="mt-2">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="end" no-gutters>
@ -19,36 +20,35 @@
:sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }" :addAll="true" :labelCols="12"
:textCols="12" :customClass="'select-large'" :iconShow="true" />
</v-col>
<v-col :cols="2.5">
<v-col :cols="2.5" class="pr-4">
<InputText :parentPrgmId="myPrgmId" label="검침개소명" valueNm="readPlcNm" :labelCols="12"
:textCols="12" :searchOption="true" :customClass="'input-large'" :iconShow="true" />
</v-col>
<BtnSearch @click="search" size="large" />
<BtnSearch @click="search" size="large" class="mr-2" />
</v-row>
</v-card>
</v-col>
</v-row>
<v-row ref="contents" class="mt-4">
<v-col :cols="5" class="h100">
<v-row ref="contents" class="mt-3">
<v-col :cols="5" class="h100 pr-2">
<v-card class="pb-5">
<div class="d-flex align-center justify-space-between pa-4 pb-6">
<v-card-title class="pa-0 custom-title-4">검침개소 정보</v-card-title>
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridName" :detailList="detailList"
:btnActionsFnc="btnActions" />
</div>
<div class="px-4">
<div class="px-4" style="height:calc(100% - 76px)">
<div ref="gridParent" class="w100 h100">
<component :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName"
:parentPrgmId="myPrgmId" @getRowsData="getRowData"
@sendSelectedRowStatInfo="getSelectedRowStatInfo" :selectedRowDataWatchFlag="true"
:dataPath="dataPathExample" />
@sendSelectedRowStatInfo="getSelectedRowStatInfo" :selectedRowDataWatchFlag="true" />
</div>
</div>
</v-card>
</v-col>
<v-col :cols="7" class="h100">
<v-col :cols="7" class="h100 pl-2">
<v-card class="pb-5">
<v-card-title class="custom-title-4 pb-1 pa-4">검침개소 상세
</v-card-title>
@ -134,7 +134,7 @@ export default {
return {
myPrgmId: myPrgmId,
gridName: 'rowGrid',
loadGrid: true,
loadGrid: false,
tab: null,
isImgTabDisabled: false,
items: [
@ -157,47 +157,6 @@ export default {
],
detailList: myDetail,
defaultUseFg: 1,
dataPathExample: {
"rowGrid": {
data: sampleData,
column: [
{
header: '',
name: '',
align: 'center',
width: 50,
formatter: (props) => {
return `<label class="custom-radio">
<span class="radio-mark"></span>
</label>`;
}
},
{
header: '검침개소명',
name: 'readPlcNm',
align: 'left',
minWidth: 400,
},
{
header: '개소 종류',
name: 'plcKind',
minWidth: 100,
align: 'center',
},
{
header: '사용 여부',
name: 'useFg',
minWidth: 100,
align: 'center',
},
],
option: myOptions,
}
}
// loadTree: false
};
},
@ -312,18 +271,18 @@ export default {
},
async initData() {
let ercList = [];
// const res = await this.postApiReturn({
// apiKey: 'selectErcInfo',
// resKey: 'ercInfoData',
// sendParam: {
// blocId: this.userInfo.blocId,
// },
// });
// res.forEach(item => {
// const it = { text: item.ercNm, value: item.ercId };
// ercList.push(it);
// });
// this.setPageData({ ercNmList: ercList });
const res = await this.postApiReturn({
apiKey: 'selectErcInfo',
resKey: 'ercInfoData',
sendParam: {
blocId: this.userInfo.blocId,
},
});
res.forEach(item => {
const it = { text: item.ercNm, value: item.ercId };
ercList.push(it);
});
this.setPageData({ ercNmList: ercList });
},
gridInit() {
const gridHeight = this.$refs.gridParent.offsetHeight - 30;
@ -334,10 +293,12 @@ export default {
resizable: true,
},
treeColumnOptions: {
name: 'eccNm',       // Showing tree table
useIcon: false,      // Not using icon
indentWidth: 10,
name: 'readPlcNm',
},
header: {
height: 37,
},
rowHeight: 37,
};
this.setGridOption({
gridKey: this.gridName,
@ -346,12 +307,22 @@ export default {
const _this = this;
const myColumns = [
{
header: '',
name: '',
align: 'center',
formatter: (props) => {
return `<span class="custom-radio">
<span class="radio-mark"></span>
</span>`;
}
},
{ header: '회사 ID', name: 'comId', hidden: true },
{
header: '검침개소명',
name: 'readPlcNm',
align: 'left',
minWidth: 400,
minWidth: 350,
},
{
header: '검침개소 ID',
@ -371,7 +342,6 @@ export default {
header: '개소 종류',
name: 'plcKind',
minWidth: 100,
align: 'center',
formatter({ value }) {
let retVal = '';
const newValue = _this.pageData.plcKindList.filter(
@ -421,7 +391,6 @@ export default {
header: '사용 여부',
name: 'useFg',
minWidth: 100,
align: 'center',
formatter({ value }) {
value = value === true ? '1' : '0';
const newValue = _this.pageData.useFgList.filter(
@ -955,62 +924,50 @@ const defaultData = {
};
const sampleData = [
{
readPlcNm: '서울 본사',
plcKind: '본사',
useFg: '사용',
_children: [
{
readPlcNm: '서울 본사 - 1층',
plcKind: '층',
useFg: '사용',
},
{
readPlcNm: '서울 본사 - 2층',
plcKind: '층',
useFg: '미사용',
},
],
},
{
readPlcNm: '부산 지사',
plcKind: '지사',
useFg: '사용',
_children: [
{
readPlcNm: '부산 지사 - A동',
plcKind: '건물',
useFg: '사용',
_children: [
{
readPlcNm: '부산 지사 - A동 1층',
plcKind: '층',
useFg: '사용',
},
],
},
],
},
{
readPlcNm: '대전 창고',
plcKind: '창고',
useFg: '미사용',
},
{
readPlcNm: '서울 본사',
plcKind: '본사',
useFg: '사용',
_children: [
{
readPlcNm: '서울 본사 - 1층',
plcKind: '층',
useFg: '사용',
},
{
readPlcNm: '서울 본사 - 2층',
plcKind: '층',
useFg: '미사용',
},
],
},
{
readPlcNm: '부산 지사',
plcKind: '지사',
useFg: '사용',
_children: [
{
readPlcNm: '부산 지사 - A동',
plcKind: '건물',
useFg: '사용',
_children: [
{
readPlcNm: '부산 지사 - A동 1층',
plcKind: '층',
useFg: '사용',
},
],
},
],
},
{
readPlcNm: '대전 창고',
plcKind: '창고',
useFg: '미사용',
},
];
const myOptions = {
columnOptions: {
resizable: true,
},
treeColumnOptions: {
name: 'readPlcNm',       // Showing tree table
useIcon: false,      // Not using icon
indentWidth: 10,
},
}
const myDetail = [
{
type: 'InputText',

View File

@ -1,5 +1,6 @@
<template>
<div class="l-layout">
<CommonPageTitle/>
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
@ -12,6 +13,7 @@
:textCols="12"
:labelCols="12"
:parentPrgmId="myPrgmId"
:customClass="'select-large'"
/>
</v-col>
<v-col :cols="3">
@ -22,6 +24,7 @@
dataKey="searchErcKind"
:sendParam="{ commGrpCd: 'EM_ERCKIND', useFg: '1' }"
:addAll="true"
:customClass="'select-large'"
/>
</v-col>
<v-col :cols="3">
@ -34,13 +37,9 @@
:addAll="true"
:textCols="12"
:labelCols="12"
:customClass="'select-large'"
/>
</v-col>
<v-col :cols="3" class="text-right">
<BtnSearch @click="search" />
</v-col>
</v-row>
<v-row align="center" no-gutters>
<v-col :cols="3">
<component
:is="'selectCodeList'"
@ -49,8 +48,11 @@
dataKey="searchChrgKind"
:sendParam="{ commGrpCd: 'EM_ENGCHAGKIND', useFg: '1' }"
:addAll="true"
:customClass="'select-large'"
/>
</v-col>
</v-row>
<v-row align="center" no-gutters>
<v-col :cols="3">
<component
:is="'selectCodeList'"
@ -59,6 +61,7 @@
dataKey="useFg"
:sendParam="{ commGrpCd: 'CO_USEFG', useFg: '1' }"
:addAll="true"
:customClass="'select-large'"
/>
</v-col>
<v-col :cols="3">
@ -69,13 +72,19 @@
:textCols="12"
:labelCols="12"
:searchOption="true"
:customClass="'input-large'"
/>
</v-col>
<v-col :cols="3">
</v-col>
<v-col :cols="3" class="text-right">
<BtnSearch :size="'default'" @click="search" />
</v-col>
</v-row>
</v-card>
</v-col>
</v-row>
<v-row ref="contents" style="height: calc(100vh - 400px)">
<v-row >
<v-col :cols="5" class="h100">
<v-card class="pb-5">
<v-card-title class="d-flex justify-space-between align-end">
@ -105,7 +114,7 @@
<v-col :cols="7" class="h100">
<v-card class="pb-5">
<v-card-title>에너지원 상세</v-card-title>
<div class="px-5" style="height:calc(100% - 70px)">
<div class="px-5" style="min-height: auto;">
<v-tabs v-model="tab">
<v-tab
v-for="item in items"
@ -117,21 +126,21 @@
</v-tabs>
<v-tabs-items
v-model="tab"
style="height: calc(100% - 65px);"
class="py-6"
style="min-height: auto;"
>
<v-tab-item v-for="(item, idx) in items" :key="item.id">
<v-tab-item v-for="(item, idx) in items" :key="item.id">
<component
v-if="item.id == 'ercInfoTab'"
:is="'Form'"
:parentPrgmId="myPrgmId"
:detailList="detailList"
@gridEditingFinish="gridEditingFinish"
v-if="item.id == 'ercInfoTab'"
:is="'Form'"
:parentPrgmId="myPrgmId"
:detailList="detailList"
@gridEditingFinish="gridEditingFinish"
/>
<ErcChrgInfoTab
v-if="item.id == 'ercChrgInfoTab'"
:parentPrgmId="myPrgmId"
:innerTabGridInfo="{ tab, idx }"
v-if="item.id == 'ercChrgInfoTab'"
:parentPrgmId="myPrgmId"
:innerTabGridInfo="{ tab, idx }"
/>
</v-tab-item>
</v-tabs-items>
@ -323,6 +332,9 @@ export default {
columnOptions: {
resizable: true,
},
header: {
height: 38,
},
};
this.setGridOption({
gridKey: this.gridName,
@ -332,12 +344,12 @@ export default {
const _this = this;
const myColumns = [
{ header: '회사 ID', name: 'comId', hidden: true },
{ header: '에너지원ID', name: 'ercId', width: 120, align: 'center' },
{ header: '에너지원ID', name: 'ercId', width: 120, align: 'left' },
{ header: '에너지원명', name: 'ercNm', align: 'left' },
{
header: '에너지원 유형',
name: 'ercKind',
align: 'center',
align: 'left',
formatter({ value }) {
let retVal = '';
const newValue = _this.pageData.ercKindList.filter(
@ -450,7 +462,7 @@ export default {
header: '사용 여부',
name: 'useFg',
width: 95,
align: 'center',
align: 'left',
formatter({ value }) {
value = value === true ? '1' : '0';
const newValue = _this.pageData.useFgList.filter(
@ -479,74 +491,24 @@ export default {
this.loadGrid = true;
},
async getRowGridData() {
let res = [
{
"comId": "COM001",
"ercId": "ERC001",
"ercNm": "LNG 가스",
"ercKind": "GAS",
"readObjId": "READ001",
"readPlcId": "PLC001",
"chrgKind": "FIXED",
"unitPrce": 120.5,
"prceFg": "1",
"peakPow": 500,
"elecContId": "EC001",
"elecContNm": "계약A",
"blocId": "BLOC001",
"useFg": true
},
{
"comId": "COM002",
"ercId": "ERC002",
"ercNm": "태양광",
"ercKind": "ELEC",
"readObjId": "READ002",
"readPlcId": "PLC002",
"chrgKind": "VARIABLE",
"unitPrce": 95.0,
"prceFg": "0",
"peakPow": 300,
"elecContId": "EC002",
"elecContNm": "계약B",
"blocId": "BLOC002",
"useFg": false
},
{
"comId": "COM003",
"ercId": "ERC003",
"ercNm": "지열",
"ercKind": "HEAT",
"readObjId": "READ003",
"readPlcId": "PLC003",
"chrgKind": "FIXED",
"unitPrce": 110.0,
"prceFg": "1",
"peakPow": 450,
"elecContId": "EC003",
"elecContNm": "계약C",
"blocId": "BLOC003",
"useFg": true
}
]
;
let res = [];
// if (this.pageData.blocMstrList.length > 0) {
// res = await this.postApiReturn({
// apiKey: 'selectErcInfo',
// resKey: 'ercInfoData',
// sendParam: {
// blocId: this.pageData.blocMstrList[this.pageData.blocId].blocId,
// ercKind: this.pageData.searchErcKind,
// readObjId: this.pageData.searchReadObj,
// chrgKind: this.pageData.searchChrgKind,
// useFg: this.pageData.useFg,
// ercNmLike: this.pageData.ercNm,
// },
// });
// } else {
// this.setPageData({ isFind: false });
// }
if (this.pageData.blocMstrList.length > 0) {
res = await this.postApiReturn({
apiKey: 'selectErcInfo',
resKey: 'ercInfoData',
sendParam: {
blocId: this.pageData.blocMstrList[this.pageData.blocId].blocId,
ercKind: this.pageData.searchErcKind,
readObjId: this.pageData.searchReadObj,
chrgKind: this.pageData.searchChrgKind,
useFg: this.pageData.useFg,
ercNmLike: this.pageData.ercNm,
},
});
} else {
this.setPageData({ isFind: false });
}
const newRes = res.map(item => {
const newObj = {
...item,
@ -798,133 +760,8 @@ const defaultData = {
/* data 세팅 */
// 로컬 gridName 값과 동일한 이름으로 세팅
rowGrid: {
data: [
{
"comId": "COM001",
"ercId": "ERC001",
"ercNm": "LNG 가스",
"ercKind": "GAS",
"readObjId": "READ001",
"readPlcId": "PLC001",
"chrgKind": "FIXED",
"unitPrce": 120.5,
"prceFg": "1",
"peakPow": 500,
"elecContId": "EC001",
"elecContNm": "계약A",
"blocId": "BLOC001",
"useFg": true
},
{
"comId": "COM002",
"ercId": "ERC002",
"ercNm": "태양광",
"ercKind": "ELEC",
"readObjId": "READ002",
"readPlcId": "PLC002",
"chrgKind": "VARIABLE",
"unitPrce": 95.0,
"prceFg": "0",
"peakPow": 300,
"elecContId": "EC002",
"elecContNm": "계약B",
"blocId": "BLOC002",
"useFg": false
},
{
"comId": "COM003",
"ercId": "ERC003",
"ercNm": "지열",
"ercKind": "HEAT",
"readObjId": "READ003",
"readPlcId": "PLC003",
"chrgKind": "FIXED",
"unitPrce": 110.0,
"prceFg": "1",
"peakPow": 450,
"elecContId": "EC003",
"elecContNm": "계약C",
"blocId": "BLOC003",
"useFg": true
}
],
column: [
{ header: '회사 ID', name: 'comId', hidden: true },
{ header: '에너지원ID', name: 'ercId', width: 120, align: 'center' },
{ header: '에너지원명', name: 'ercNm', align: 'left' },
{
header: '에너지원 유형',
name: 'ercKind',
align: 'center',
},
{
header: '검침대상',
name: 'readObjId',
align: 'left',
},
{
header: '검침 개소 ID',
name: 'readPlcId',
width: 80,
align: 'center',
hidden: true,
},
{
header: '고지 유형',
name: 'chrgKind',
width: 80,
align: 'center',
hidden: true,
},
{
header: '기본단가',
name: 'unitPrce',
width: 100,
align: 'right',
hidden: true,
},
{
header: '단가 사용여부',
name: 'prceFg',
width: 100,
align: 'center',
hidden: true,
},
{
header: '피크 전력',
name: 'peakPow',
width: 100,
align: 'right',
hidden: true,
},
{
header: '전력 계약',
name: 'elecContId',
width: 100,
align: 'center',
hidden: true,
},
{
header: '전력 계약',
name: 'elecContNm',
width: 100,
align: 'center',
hidden: true,
},
{
header: '사업장',
name: 'blocId',
width: 100,
align: 'center',
hidden: true,
},
{
header: '사용 여부',
name: 'useFg',
width: 95,
align: 'center',
}
], // myColumns,
data: [],
column: [], // myColumns,
option: {}, // myOptions
defaultRow: {
comId: '',

View File

@ -1,6 +1,7 @@
<template>
<div ref="mainDiv" class="l-layout">
<v-row ref="searchFilter">
<CommonPageTitle />
<v-row ref="searchFilter" class="mt-2">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="end" no-gutters>
@ -29,10 +30,10 @@
</v-card>
</v-col>
</v-row>
<v-row ref="contents">
<v-col :cols="5" class="h100">
<v-row ref="contents" class="mt-3">
<v-col :cols="5" class="pr-2">
<v-card class="pb-5">
<v-card-title class="d-flex align-center justify-space-between pa-4">
<v-card-title class="d-flex align-center justify-space-between pa-5">
물리량 리스트
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridName" :detailList="detailList"
@ -44,12 +45,12 @@
:parentPrgmId="myPrgmId" @getRowsData="getRowData"
@sendSelectedRowStatInfo="getSelectedRowStatInfo" :selectedRowDataWatchFlag="true"
:preventFocusChangeEventFlag="true"
:preventFocusChangeEventTargetGridList="editingGridList" :dataPath="dataPathExample" />
:preventFocusChangeEventTargetGridList="editingGridList" />
</div>
</div>
</v-card>
</v-col>
<v-col :cols="7" class="h100">
<v-col :cols="7" class="pl-2">
<v-card class="pb-5 px-4">
<v-card-title class="px-0">물리량 상세</v-card-title>
<v-row no-gutters>
@ -113,7 +114,7 @@
<component :is="'TextArea'" :parentPrgmId="myPrgmId" ref="TextArea" :item="calcDescItem" />
</v-col>
</v-row>
<v-row no-gutters v-show="argContentShowFlag">
<v-row no-gutters v-show="argContentShowFlag" align="end" >
<v-col :cols="12" class="py-2">
<label for="">
<v-icon small
@ -121,13 +122,13 @@
계산Argument
</label>
</v-col>
<v-col :cols="6" class="py-2">
<v-col :cols="6" class="py-2 pr-4">
<InputText :parentPrgmId="myPrgmId" label="ARG갯수" valueNm="argCnt" :labelCols="12"
:textCols="12" :iconShow="true" :required="requiredValueList[7]"
:textCols="12" :iconShow="false" :required="requiredValueList[7]"
:disabled="disabledValueList[7]" :readonly="readOnlyValueList[7]" />
</v-col>
<v-col :cols="4"> </v-col>
<v-col :cols="12" class="py-2" align="right">
<!-- <v-col :cols="4"> </v-col> -->
<v-col :cols="6" class="py-2" align="right">
<a-button type="primary" @click="btnAction('add')" class="v-btn-add-text mr-1" icon="plus">추가</a-button>
<a-button type="danger" @click="btnAction('remove')" ghost danger icon="delete">삭제</a-button>
</v-col>
@ -136,7 +137,7 @@
<v-col :cols="12" style="height:100%">
<div ref="gridParent2" style="height:100%">
<component :ref="gridName2" :is="loadGrid2 ? 'Grid' : null" :gridName="gridName2"
:parentPrgmId="myPrgmId" @getRowsData="getRowData2" :dataPath="dataPathExample2" />
:parentPrgmId="myPrgmId" @getRowsData="getRowData2" />
</div>
</v-col>
</v-row>
@ -223,115 +224,8 @@ export default {
formatterSelectList01: [],
formatterSelectList02: [],
loadGrid: true,
dataPathExample: {
"rowGrid": {
data: [
{
"pysclQtyId": "001",
"pysclQtyCd": "TEMP001",
"pysclQtyNm": "온도",
"pysclQtyTp": "실수"
},
{
"pysclQtyId": "002",
"pysclQtyCd": "PRESS001",
"pysclQtyNm": "압력",
"pysclQtyTp": "실수"
},
{
"pysclQtyId": "003",
"pysclQtyCd": "FLOW001",
"pysclQtyNm": "유량",
"pysclQtyTp": "정수"
},
{
"pysclQtyId": "004",
"pysclQtyCd": "HUMID001",
"pysclQtyNm": "습도",
"pysclQtyTp": "실수"
},
{
"pysclQtyId": "005",
"pysclQtyCd": "VOLT001",
"pysclQtyNm": "전압",
"pysclQtyTp": "실수"
}
]
,
column: [
{
header: '물리량 ID',
name: 'pysclQtyId',
width: 100,
align: 'center',
},
{ header: '물리량코드', name: 'pysclQtyCd', minWidth: 255 },
{ header: '물리량명', name: 'pysclQtyNm', width: 150 },
{
header: '물리량타입',
name: 'pysclQtyTp',
width: 80,
},
],
}
},
dataPathExample2: {
"rowGrid2": {
data:
[
{
"argSeq": "1",
"argPysclQtyId": "001",
"eqpmGrpId": "EQPM-GRP-A",
"pysclQtyCd": "TEMP001"
},
{
"argSeq": "2",
"argPysclQtyId": "002",
"eqpmGrpId": "EQPM-GRP-B",
"pysclQtyCd": "PRESS001"
},
{
"argSeq": "3",
"argPysclQtyId": "003",
"eqpmGrpId": "EQPM-GRP-C",
"pysclQtyCd": "FLOW001"
},
{
"argSeq": "4",
"argPysclQtyId": "004",
"eqpmGrpId": "EQPM-GRP-D",
"pysclQtyCd": "HUMID001"
},
{
"argSeq": "5",
"argPysclQtyId": "005",
"eqpmGrpId": "EQPM-GRP-E",
"pysclQtyCd": "VOLT001"
}
]
,
column: [
{ header: '순번', name: 'argSeq', editor: 'text' },
{ header: '물리량 ID', name: 'argPysclQtyId' },
{
header: '설비그룹',
name: 'eqpmGrpId',
},
{ header: '물리량 코드', name: 'pysclQtyCd' },
],
}
},
loadGrid2: true,
loadGrid: false,
loadGrid2: false,
detailList: myDetail,
readOnlyValueList: [
@ -1001,6 +895,12 @@ export default {
columnOptions: {
resizable: true,
},
header: {
height: 37,
},
rowHeight: 'auto',
scrollX: true,
scrollY: true,
};
this.setGridOption({
@ -1014,7 +914,7 @@ export default {
header: '물리량 ID',
name: 'pysclQtyId',
width: 100,
align: 'center',
align: 'left',
},
{ header: '설비그룹 ID', name: 'eqpmGrpId', hidden: true },
{ header: 'argCnt', name: 'argCnt', hidden: true },
@ -1066,6 +966,10 @@ export default {
columnOptions: {
resizable: true,
},
header: {
height: 37,
},
rowHeight: 'auto',
};
this.setGridOption({
@ -1076,7 +980,7 @@ export default {
var columnList = [
{ header: '회사 ID', name: 'comId', hidden: true },
{ header: '물리량 ID', name: 'pysclQtyId', hidden: true },
{ header: '순번', name: 'argSeq', editor: 'text' },
{ header: '순번', name: 'argSeq', editor: 'text', align: 'right' },
{ header: '물리량 ID', name: 'argPysclQtyId' },
{
header: '설비그룹',

View File

@ -1,6 +1,6 @@
<template>
<div ref="mainDiv" class="l-layout">
<PageTitle/>
<CommonPageTitle/>
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
@ -167,7 +167,7 @@ export default {
header: '설비종류ID',
name: 'eqpmKindId',
width: gridWidth * 0.5,
align: 'center',
align: 'left',
},
{
header: '설비종류명',
@ -359,7 +359,7 @@ const myDetail = [
label: '설비종류 ID',
valueNm: 'eqpmKindId',
cols: 6,
class: 'py-2 pr-4',
class: 'py-2 pr-4 pt-1',
iconShow: true,
required: false,
readonly: true,
@ -373,7 +373,7 @@ const myDetail = [
valueNm: 'eqpmKindNm',
disabled: false,
cols: 6,
class: 'py-2 pl-4',
class: 'py-2 pl-4 pt-1',
iconShow: true,
required: true,
labelCols: 12,

View File

@ -1,6 +1,6 @@
<template>
<div ref="mainDiv" class="l-layout">
<PageTitle />
<CommonPageTitle />
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
@ -461,7 +461,7 @@ const myDetail = [
valueNm: 'eqpmGrpId',
disabled: true,
cols: 6,
class: 'py-2 pr-4',
class: 'py-2 pr-4 pt-1',
required: false,
iconShow: true,
labelCols: 12,
@ -474,24 +474,23 @@ const myDetail = [
valueNm: 'eqpmGrpNm',
disabled: false,
cols: 6,
class: 'py-2 pl-4',
class: 'py-2 pl-4 pt-1',
required: true,
iconShow: true,
labelCols: 12,
textCols: 12,
},
{
type: 'CheckBox',
label: '사용 여부',
valueNm: 'useFg',
disabled: false,
cols: 6,
class: 'py-2 pr-4 pt-5',
class: 'py-2 pr-4 pt-4',
value: { '1': true, '0': false },
required: true,
iconShow: true,
labelCols: 12,
textCols: 12,
},
{
type: 'SelectBox',

View File

@ -1,5 +1,6 @@
<template>
<div class="l-layout">
<CommonPageTitle />
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
@ -34,25 +35,25 @@
</v-col>
</v-row>
<v-row ref="contents">
<v-col :cols="5" class="h100">
<v-col :cols="5" >
<v-card class="pb-5">
<div class="d-flex align-center justify-space-between pa-5">
<v-card-title class="pa-0 custom-title-4">설비 정보</v-card-title>
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridName" :detailList="detailList"
:btnActionsFnc="btnActions" />
</div>
<div class="px-5" style="min-height:calc(100% - 76px)">
<div ref="gridParent" class="w100 h100">
<component :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName" :parentPrgmId="myPrgmId"
@getRowsData="getRowData" @sendSelectedRowStatInfo="getSelectedRowStatInfo"
:selectedRowDataWatchFlag="true" :preventFocusChangeEventFlag="false" :dataPath="dataPathMock" />
</div>
<div ref="gridParent" class="px-5" style="min-height:60vh;">
<component :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName" :parentPrgmId="myPrgmId"
@getRowsData="getRowData" @sendSelectedRowStatInfo="getSelectedRowStatInfo"
:selectedRowDataWatchFlag="true" :preventFocusChangeEventFlag="false" />
<!-- <div ref="gridParent" class="w100 h100">
</div> -->
</div>
</v-card>
</v-col>
<v-col :cols="7" class="h100">
<v-col :cols="7" >
<v-card class="pb-5">
<v-card-title class="custom-title-4" style="min-height:76px;">설비 상세</v-card-title>
<v-card-title class="custom-title-4 pb-1" >설비 상세</v-card-title>
<div class="px-5" style="min-height:calc(100% - 76px)">
<v-tabs v-model="tab">
<v-tab v-for="item in items" :key="item.id" :disabled="item.disabledFlag">
@ -287,7 +288,7 @@ export default {
blocId: this.userInfo.blocId,
},
});
console.log('res : ', res);
// console.log('res : ', res);
res.map(item => {
const it = { text: item.ercNm, value: item.ercId };
ercList.push(it);
@ -364,7 +365,7 @@ export default {
header: '사업장',
name: 'blocId',
width: 100,
align: 'center',
align: 'left',
hidden: true,
formatter({ value }) {
let retVal = '';
@ -381,7 +382,7 @@ export default {
header: '사용 여부',
name: 'useFg',
width: 100,
align: 'center',
align: 'left',
formatter({ value }) {
const newValue = _this.pageData.useFgList.filter(
item => item.commCd == value,
@ -968,7 +969,7 @@ const myDetail = [
labelCols: 12,
textCols: 12,
iconShow: true,
class: 'py-3 pr-4',
class: 'py-3 pr-4 pb-2',
},
{
type: 'CheckBox',

View File

@ -1,6 +1,7 @@
<template>
<div ref="mainDiv" class="l-layout">
<v-row ref="searchFilter">
<CommonPageTitle />
<v-row ref="searchFilter" class="mt-2">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="end" no-gutters>
@ -8,7 +9,7 @@
<component :is="'SelectBox'" ref="SelectBox1" :propsValue="selectValue01"
:itemList="selectValueList01" :label="'설비종류'" :iconShow="true"
@update:propsValue="selectValue01 = $event" :labelCols="12" :textCols="12"
:customClass="'select-large'" />
:customClass="'select-large'" />
</v-col>
<v-col :cols="3">
<component :is="'SelectBox'" ref="SelectBox2" :propsValue="selectValue02"
@ -18,10 +19,11 @@
</v-col>
<v-col :cols="3">
<InputText :parentPrgmId="myPrgmId" label="가이드명" :textCols="12" valueNm="gdIdxNm"
:searchOption="true" :iconShow="true" :labelCols="12" :customClass="'input-large'"/>
:searchOption="true" :iconShow="true" :labelCols="12" :customClass="'input-large'" />
</v-col>
<v-col :cols="3" class="text-right">
<a-button icon="search" type="primary" @click="search()" class="search-button" size="large">조회</a-button>
<a-button icon="search" type="primary" @click="search()" class="search-button"
size="large">조회</a-button>
</v-col>
</v-row>
</v-card>
@ -37,13 +39,13 @@
:btnActionsFnc="btnActions" />
</div>
<div class="h100 px-4" style="height:calc(100% - 70px)">
<div ref="gridParent" >
<div ref="gridParent" style="height: 26%">
<component :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName"
:parentPrgmId="myPrgmId" @getRowsData="getRowData" :dataPath="dataPathExample" />
</div>
<div class="d-flex py-4">
<div class="d-flex py-4 mt-4">
<component :is="'Form'" :parentPrgmId="myPrgmId" :detailList="detailList"
@gridEditingFinish="gridEditingFinish" />
@gridEditingFinish="gridEditingFinish" />
</div>
</div>
@ -112,115 +114,12 @@ export default {
myPrgmId: myPrgmId,
initedFlag: false,
gridName: 'rowGrid',
loadGrid: true,
loadGrid: false,
detailList: myDetail,
selectValue01: null,
selectValueList01: [],
selectValue02: null,
selectValueList02: [],
// pyscPopupValueChkList: 'pyscPopupValueChkList',
// pyscListChk: {
// pysclQtyId1 : null,
// pysclQtyId2 : null,
// pysclQtyId3 : null,
// pysclQtyId4 : null
// }
dataPathExample: {
"rowGrid": {
data: [
{
gdIdxId: 'GD001',
gdIdxNm: '온도 가이드',
eqpmGrpId: 'EQ001',
upTotMeth: 'AVG',
careStndVal: 50,
warnStndVal: 70,
alrmMsg: '온도가 기준치를 초과했습니다.',
},
{
gdIdxId: 'GD002',
gdIdxNm: '습도 가이드',
eqpmGrpId: 'EQ002',
upTotMeth: 'MAX',
careStndVal: 30,
warnStndVal: 60,
alrmMsg: '습도가 기준치를 초과했습니다.',
},
{
gdIdxId: 'GD003',
gdIdxNm: '압력 가이드',
eqpmGrpId: 'EQ003',
upTotMeth: 'SUM',
careStndVal: 100,
warnStndVal: 150,
alrmMsg: '압력이 기준치를 초과했습니다.',
}
],
column: [
{
header: '가이드',
name: 'gdIdxId',
width: 100,
align: 'center',
},
{
header: '가이드명',
name: 'gdIdxNm',
width: 210,
align: 'left',
},
{
header: '설비그룹ID',
name: 'eqpmGrpId',
width: 100,
align: 'center',
// formatter({ value }) {
// let retVal = '';
// const newValue = _this.pageData.eqpmGrpList.filter(item => item.value == value);
// if (newValue.length > 0) {
// retVal = newValue[0].text;
// }
// return retVal;
// },
},
{
header: '상위집계방법',
name: 'upTotMeth',
width: 100,
align: 'center',
// formatter({ value }) {
// let retVal = '';
// const newValue = _this.pageData.upTotMethList.filter(item => item.commCd == value);
// if (newValue.length > 0) {
// retVal = newValue[0].commCdNm;
// }
// return retVal;
// },
},
{
header: '주의기준',
name: 'careStndVal',
width: 100,
align: 'right',
},
{
header: '경고기준',
name: 'warnStndVal',
width: 100,
align: 'right',
},
{
header: '알람메세지',
name: 'alrmMsg',
minWidth: 860,
align: 'left',
}
]
}
}
};
},
computed: {
@ -352,60 +251,46 @@ export default {
});
},
async getEqpmKind() {
// let res = await this.postApiReturn({
// apiKey: 'selectEqpmKindCodeList',
// resKey: 'eqpmKindCodeLists',
// sendParam: {},
// });
// if (res.length > 0) {
// this.selectValueList01 = await res.map(item => {
// return {
// text: item.eqpmKindNm,
// value: item.eqpmKindId,
// };
// });
// this.selectValue01 = this.selectValueList01[0].value;
// } else {
// this.selectValueList01 = [];
// this.selectValue01 = null;
// }
this.selectValueList01 = [
{ label: 'Etcher', value: 'EQK001' },
{ label: 'Deposition', value: 'EQK002' },
{ label: 'Inspection', value: 'EQK003' },
];
this.selectValue01 = 'EQK001';
let res = await this.postApiReturn({
apiKey: 'selectEqpmKindCodeList',
resKey: 'eqpmKindCodeLists',
sendParam: {},
});
if (res.length > 0) {
this.selectValueList01 = await res.map(item => {
return {
text: item.eqpmKindNm,
value: item.eqpmKindId,
};
});
this.selectValue01 = this.selectValueList01[0].value;
} else {
this.selectValueList01 = [];
this.selectValue01 = null;
}
this.setPageData({
eqpmKindList: this.selectValueList01,
eqpmKindId: this.selectValue01,
});
},
async getEqpmGrp() {
// let res = await this.postApiReturn({
// apiKey: 'selectEqpmGrpCodeList',
// resKey: 'eqpmGrpCodeLists',
// sendParam: { eqpmKindId: this.selectValue01 },
// });
// if (res.length > 0) {
// this.selectValueList02 = await res.map(item => {
// return {
// text: item.eqpmGrpNm,
// value: item.eqpmGrpId,
// };
// });
// this.selectValue02 = this.selectValueList02[0].value;
// } else {
// this.selectValueList02 = [];
// this.selectValue02 = null;
// }
this.selectValueList02 = [
{ label: '냉동기고온', value: '냉동기고온' },
{ label: '냉동기저온', value: '냉동기저온' },
{ label: '공조기', value: '공조기' },
{ label: '보일러', value: '보일러' }
];
let res = await this.postApiReturn({
apiKey: 'selectEqpmGrpCodeList',
resKey: 'eqpmGrpCodeLists',
sendParam: { eqpmKindId: this.selectValue01 },
});
if (res.length > 0) {
this.selectValueList02 = await res.map(item => {
return {
text: item.eqpmGrpNm,
value: item.eqpmGrpId,
};
});
this.selectValue02 = this.selectValueList02[0].value;
} else {
this.selectValueList02 = [];
this.selectValue02 = null;
}
this.setPageData({
eqpmGrpList: this.selectValueList02,
@ -419,6 +304,10 @@ export default {
columnOptions: {
resizable: true,
},
header: {
height: 37,
},
rowHeight: 'auto',
};
this.setGridOption({
gridKey: this.gridName,
@ -438,14 +327,12 @@ export default {
header: 'COM ID',
name: 'comId',
width: 100,
aling: 'center',
hidden: true,
},
{
header: '가이드',
name: 'gdIdxId',
width: 100,
align: 'center',
},
{
header: '가이드명',
@ -457,7 +344,6 @@ export default {
header: '설비그룹ID',
name: 'eqpmGrpId',
width: 100,
align: 'center',
// hidden: true,
formatter({ value }) {
let retVal = '';
@ -474,7 +360,6 @@ export default {
header: '상위집계방법',
name: 'upTotMeth',
width: 100,
align: 'center',
// hidden: true,
formatter({ value }) {
let retVal = '';
@ -636,100 +521,48 @@ export default {
async getRowGridData() {
this.loadGrid = false;
let res = [];
const newRes = [
{
comId: 'COM001',
gdIdxId: 'GD001',
gdIdxNm: '온도 가이드',
eqpmGrpId: 'EQ001',
upTotMeth: 'AVG',
sortSeq: 1,
pysclQtyId1: 'TEMP',
pysclQtyId2: null,
pysclQtyId3: null,
pysclQtyId4: null,
ctgr1: '환경',
ctgr2: '내부',
careStndVal: 50,
warnStndVal: 70,
gdMeth: '자동',
useFg: '1',
alrmMsg: '온도가 기준치를 초과했습니다.',
calcProc: 'PROC001',
calcDesc: '평균 계산',
calcMeth: '(A+B)/2',
unit: 'C',
argCnt: 2,
rowStat: null,
},
{
comId: 'COM002',
gdIdxId: 'GD002',
gdIdxNm: '습도 가이드',
eqpmGrpId: 'EQ002',
upTotMeth: 'MAX',
sortSeq: 2,
pysclQtyId1: 'HUMID',
pysclQtyId2: null,
pysclQtyId3: null,
pysclQtyId4: null,
ctgr1: '환경',
ctgr2: '외부',
careStndVal: 30,
warnStndVal: 60,
gdMeth: '수동',
useFg: '0',
alrmMsg: '습도가 기준치를 초과했습니다.',
calcProc: 'PROC002',
calcDesc: '최대값 계산',
calcMeth: 'MAX(A,B)',
unit: '%',
argCnt: 2,
rowStat: null,
},
];
// res = await this.postApiReturn({
// apiKey: 'selectEqpmGdIdxDataList',
// resKey: 'eqpmGdIdxDataList',
// sendParam: {
// eqpmGrpId: this.selectValue02,
// gdIdxNmLike: this.pageData.gdIdxNm,
// },
// });
// const newRes = res.map(item => {
// const newObj = {
// ...item,
// rowStat: null,
// };
// return newObj;
// });
res = await this.postApiReturn({
apiKey: 'selectEqpmGdIdxDataList',
resKey: 'eqpmGdIdxDataList',
sendParam: {
eqpmGrpId: this.selectValue02,
gdIdxNmLike: this.pageData.gdIdxNm,
},
});
const newRes = res.map(item => {
const newObj = {
...item,
rowStat: null,
};
return newObj;
});
this.setGridData({
gridKey: this.gridName,
value: newRes,
});
//this.loadGrid = true;
// this.$nextTick(() => {
// if (newRes.length > 0) {
// try {
// this.$refs[this.gridName].focus({
// //rowKey: 0,
// rowKey:
// this.pageData.rowGridSelectKey == '' ||
// this.pageData.rowGridSelectKey == null
// ? 0
// : this.pageData.rowGridSelectKey ==
// this.$refs[this.gridName].getData().length - 1
// ? this.pageData.rowGridSelectKey
// : 0,
// columnName: 'gdIdxId',
// setScroll: true,
// });
// } catch (error) { }
// } else {
// this.detailDataInit();
// }
// });
this.$nextTick(() => {
if (newRes.length > 0) {
try {
this.$refs[this.gridName].focus({
//rowKey: 0,
rowKey:
this.pageData.rowGridSelectKey == '' ||
this.pageData.rowGridSelectKey == null
? 0
: this.pageData.rowGridSelectKey ==
this.$refs[this.gridName].getData().length - 1
? this.pageData.rowGridSelectKey
: 0,
columnName: 'gdIdxId',
setScroll: true,
});
} catch (error) { }
} else {
this.detailDataInit();
}
});
this.loadGrid = true;
},
async getRowData(data) {
@ -1286,14 +1119,7 @@ const myDetail = [
required: true,
iconShow: true
},
// {
// // 공백 처리
// type: 'Label',
// cols: 3,
// class: 'py-2',
// // label: "* '주의기준값' 또는 '경고기준값' 중 하나는 필수로 입력해 주세요.",
// disabled: false,
// },
// {
// type: 'CheckBox',
// label: '설비기준적용',
@ -1359,7 +1185,8 @@ const myDetail = [
// required: true,
labelCols: 12,
textCols: 12,
iconShow: true
iconShow: true,
inputType: 'number',
},
// {
// // 공백 처리
@ -1407,7 +1234,15 @@ const myDetail = [
{
// 공백 처리
type: 'Label',
cols: 9,
cols: 3,
class: 'py-2',
// label: "* '주의기준값' 또는 '경고기준값' 중 하나는 필수로 입력해 주세요.",
disabled: false,
},
{
// 공백 처리
type: 'Label',
cols: 6,
class: 'py-3',
// label: "* '주의기준값' 또는 '경고기준값' 중 하나는 필수로 입력해 주세요.",
disabled: false,
@ -1462,7 +1297,7 @@ const myDetail = [
class: 'pa-3',
// required: true,
openMode: 'ALL',
disabled: false,
disabled: true,
eqpmKindId: '',
eqpmGrpId: '',
closeBtnFg: true,
@ -1606,9 +1441,3 @@ const myDetail = [
},
];
</script>
<style lang="scss" scoped>
.searchFilter {
border-radius: 6px;
box-shadow: none;
}
</style>

View File

@ -1,6 +1,7 @@
<template>
<div ref="mainDiv" class="l-layout">
<v-row ref="searchFilter">
<CommonPageTitle />
<v-row ref="searchFilter" class="mt-2">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="end" no-gutters>
@ -29,14 +30,14 @@
</v-card>
</v-col>
</v-row>
<v-row ref="contents" class="mt-4">
<v-row ref="contents" class="mt-3">
<v-col :cols="12" style="height: 100%">
<!-- <v-card class="py-5"> -->
<v-card style="height: 60%">
<v-card style="height: auto;">
<div class="d-flex align-center justify-space-between pa-4">
<v-card-title class="pa-0 custom-title-4">가이드 정보</v-card-title>
</div>
<div class="d-flex align-end justify-space-between px-4 py-2">
<div class="d-flex align-end justify-space-between px-4 py-2 pb-4">
<v-row :cols="12" class="align-end">
<!-- 가이드 설비그룹 라인 시작 -->
<v-col :cols="3" class="pa-2">
@ -115,9 +116,9 @@
</v-card>
<v-row style="height: 40%" class="mt-4">
<v-col :cols="6" style="height: 100%">
<v-card class="pb-5">
<v-row class="mt-3" >
<v-col :cols="6" class="pr-2">
<v-card >
<div class="d-flex align-center justify-space-between pa-4">
<v-card-title class="pa-0 custom-title-4 ">설비상세 리스트</v-card-title>
<Buttons :parentPrgmId="myPrgmId" :bindingData="gridName" :btnActionsFnc="btnActions" />
@ -126,13 +127,13 @@
<div ref="gridParent" class="w100 h100">
<component :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName"
:parentPrgmId="myPrgmId" @getRowsData="getRowData"
:dataPath="dataPathExample" />
/>
</div>
</div>
</v-card>
</v-col>
<v-col :cols="6" style="height: 100%">
<v-card class="pb-5">
<v-col :cols="6" class="pl-2">
<v-card >
<div class="d-flex align-center justify-space-between pa-4">
<v-card-title class="pa-0 custom-title-4">설비가이드 기준 정보</v-card-title>
</div>
@ -201,7 +202,7 @@ export default {
readonlyFg: true,
initedFlag: false,
gridName: 'rowGrid',
loadGrid: true,
loadGrid: false,
detailList: myDetail,
selectValue01: null,
selectValueList01: [],
@ -209,62 +210,62 @@ export default {
selectValueList02: [],
selectValue03: null,
selectValueList03: [],
dataPathExample: {
"rowGrid": {
data: [
// dataPathExample: {
// "rowGrid": {
// data: [
{
eqpmId: 'EQ001',
originEqpmId: 'ORIG001',
eqpmNm: '냉각기 A',
careStndVal: 75,
warnStndVal: 90,
},
{
eqpmId: 'EQ002',
originEqpmId: 'ORIG002',
eqpmNm: '펌프 B',
careStndVal: 60,
warnStndVal: 80,
},
{
eqpmId: 'EQ003',
originEqpmId: 'ORIG003',
eqpmNm: '모터 C',
careStndVal: 50,
warnStndVal: 70,
},
{
eqpmId: 'EQ004',
originEqpmId: 'ORIG004',
eqpmNm: '밸브 D',
careStndVal: 65,
warnStndVal: 85,
},
{
eqpmId: 'EQ005',
originEqpmId: 'ORIG005',
eqpmNm: '컨트롤러 E',
careStndVal: 55,
warnStndVal: 75,
},
// {
// eqpmId: 'EQ001',
// originEqpmId: 'ORIG001',
// eqpmNm: '냉각기 A',
// careStndVal: 75,
// warnStndVal: 90,
// },
// {
// eqpmId: 'EQ002',
// originEqpmId: 'ORIG002',
// eqpmNm: '펌프 B',
// careStndVal: 60,
// warnStndVal: 80,
// },
// {
// eqpmId: 'EQ003',
// originEqpmId: 'ORIG003',
// eqpmNm: '모터 C',
// careStndVal: 50,
// warnStndVal: 70,
// },
// {
// eqpmId: 'EQ004',
// originEqpmId: 'ORIG004',
// eqpmNm: '밸브 D',
// careStndVal: 65,
// warnStndVal: 85,
// },
// {
// eqpmId: 'EQ005',
// originEqpmId: 'ORIG005',
// eqpmNm: '컨트롤러 E',
// careStndVal: 55,
// warnStndVal: 75,
// },
],
column: [
{ header: '설비', name: 'eqpmId', align: 'left' },
{
header: 'origin설비',
name: 'originEqpmId',
align: 'center',
hidden: true,
},
{ header: '설비명', name: 'eqpmNm', align: 'left' },
{ header: '주의기준', name: 'careStndVal', align: 'right' },
{ header: '심각기준', name: 'warnStndVal', align: 'right' },
]
// ],
// column: [
// { header: '설비', name: 'eqpmId', align: 'left' },
// {
// header: 'origin설비',
// name: 'originEqpmId',
// align: 'center',
// hidden: true,
// },
// { header: '설비명', name: 'eqpmNm', align: 'left' },
// { header: '주의기준', name: 'careStndVal', align: 'right' },
// { header: '심각기준', name: 'warnStndVal', align: 'right' },
// ]
}
}
// }
// }
};
},
computed: {
@ -408,6 +409,10 @@ export default {
columnOptions: {
resizable: true,
},
header: {
height: 37,
},
rowHeight: 'auto',
};
this.setGridOption({
gridKey: this.gridName,
@ -511,69 +516,69 @@ export default {
this.loadGrid = false;
let res = [];
// if (this.selectValue01 && this.selectValue02 && this.selectValue03) {
// res = await this.postApiReturn({
// apiKey: 'selectEqpmGdDetl',
// resKey: 'eqpmGdDetlData',
// sendParam: {
// gdIdxId: this.selectValue03,
// },
// });
// }
if (this.selectValue01 && this.selectValue02 && this.selectValue03) {
res = await this.postApiReturn({
apiKey: 'selectEqpmGdDetl',
resKey: 'eqpmGdDetlData',
sendParam: {
gdIdxId: this.selectValue03,
},
});
}
// // grid에서 eqpmId를 기억해서 popup에서 중복되는 값을 제거하는데 사용하기위해 저장 - 시작
// let eqpmIdList = res.map(item => {
// return item.eqpmId;
// });
// this.setPageData({ nowGridEqpmIdList: eqpmIdList });
// // grid에서 eqpmId를 기억해서 popup에서 중복되는 값을 제거하는데 사용하기위해 저장 - 끝
// const newRes = res.map(item => {
// const newObj = {
// ...item,
// rowStat: null,
// };
// return newObj;
// });
const newRes = [
// grid에서 eqpmId를 기억해서 popup에서 중복되는 값을 제거하는데 사용하기위해 저장 - 시작
let eqpmIdList = res.map(item => {
return item.eqpmId;
});
this.setPageData({ nowGridEqpmIdList: eqpmIdList });
// grid에서 eqpmId를 기억해서 popup에서 중복되는 값을 제거하는데 사용하기위해 저장 - 끝
const newRes = res.map(item => {
const newObj = {
...item,
rowStat: null,
};
return newObj;
});
// const newRes = [
{
eqpmId: 'EQ001',
originEqpmId: 'ORIG001',
eqpmNm: '냉각기 A',
careStndVal: 75,
warnStndVal: 90,
},
{
eqpmId: 'EQ002',
originEqpmId: 'ORIG002',
eqpmNm: '펌프 B',
careStndVal: 60,
warnStndVal: 80,
},
{
eqpmId: 'EQ003',
originEqpmId: 'ORIG003',
eqpmNm: '모터 C',
careStndVal: 50,
warnStndVal: 70,
},
{
eqpmId: 'EQ004',
originEqpmId: 'ORIG004',
eqpmNm: '밸브 D',
careStndVal: 65,
warnStndVal: 85,
},
{
eqpmId: 'EQ005',
originEqpmId: 'ORIG005',
eqpmNm: '컨트롤러 E',
careStndVal: 55,
warnStndVal: 75,
},
// {
// eqpmId: 'EQ001',
// originEqpmId: 'ORIG001',
// eqpmNm: '냉각기 A',
// careStndVal: 75,
// warnStndVal: 90,
// },
// {
// eqpmId: 'EQ002',
// originEqpmId: 'ORIG002',
// eqpmNm: '펌프 B',
// careStndVal: 60,
// warnStndVal: 80,
// },
// {
// eqpmId: 'EQ003',
// originEqpmId: 'ORIG003',
// eqpmNm: '모터 C',
// careStndVal: 50,
// warnStndVal: 70,
// },
// {
// eqpmId: 'EQ004',
// originEqpmId: 'ORIG004',
// eqpmNm: '밸브 D',
// careStndVal: 65,
// warnStndVal: 85,
// },
// {
// eqpmId: 'EQ005',
// originEqpmId: 'ORIG005',
// eqpmNm: '컨트롤러 E',
// careStndVal: 55,
// warnStndVal: 75,
// },
]
// ]
this.setGridData({
gridKey: this.gridName,
value: newRes,

View File

@ -1,63 +1,27 @@
<template>
<div class="l-layout">
<PageTitle text="측정 위치 데이터 조회" />
<CommonPageTitle />
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
<v-row align="end" no-gutters>
<v-col :cols="2">
<component
:is="'SelectBlocMstr'"
ref="SelectBlocMstr"
:parentPrgmId="myPrgmId"
:textCols="12"
customClass="select-large"
/>
</v-col>
<!-- <v-col :cols="2">
<component
label="검침개소"
:is="'PastRsltDataReadPop'"
:parentPrgmId="myPrgmId"
/>
</v-col> -->
<!-- <v-col :cols="2">
<component
:is="'SelectTagNmList'"
ref="SelectTagNmList"
:parentPrgmId="myPrgmId"
/>
</v-col> -->
<v-col :cols="3">
<!-- <component
:is="'PastRsltDataReadTagPop'"
:parentPrgmId="myPrgmId"
:label="'TAG'"
/> -->
<component
:is="'EvtObjPop'"
:parentPrgmId="myPrgmId"
:item="evtObjPopItem"
customClass="select-large"
/>
<component :is="'SelectBlocMstr'" ref="SelectBlocMstr" :parentPrgmId="myPrgmId"
:textCols="12" customClass="select-large" />
</v-col>
<v-col :cols="4">
<component
:is="'Datepicker'"
:parentPrgmId="myPrgmId"
:label="'조회기간'"
:textCols="12"
/>
<v-col :cols="3">
<component :is="'EvtObjPop'" :parentPrgmId="myPrgmId" :item="evtObjPopItem"
customClass="select-large" />
</v-col>
<v-col :cols="3" class="d-flex align-end justify-end text-right">
<BtnExcelDownload
class="mr-1"
:parentPrgmId="myPrgmId"
:gridName="gridName"
type="primary"
size="large"
/>
<v-col :cols="3">
<!-- 대상일 -->
<component :is="'Datepicker'" :parentPrgmId="myPrgmId" :label="'조회기간'" :textCols="12"
customClass="datepicker-large" />
</v-col>
<v-col :cols="3" class="d-flex align-end justify-end text-right">
<BtnExcelDownload class="mr-1" :parentPrgmId="myPrgmId" :gridName="gridName" type="primary"
size="large" />
<BtnSearch @click="search" size="large" />
</v-col>
</v-row>
@ -68,12 +32,12 @@
<v-col :cols="12" style="height: 100%" class="h100">
<v-card class="px-5 py-5 h100">
<div ref="gridParent" class="h100 px-5" style="height: 100%">
<component
ref="myGrid"
:is="loadGrid ? 'Grid' : null"
:gridName="gridName"
:parentPrgmId="myPrgmId"
/>
<component ref="myGrid" :is="loadGrid ? 'Grid' : null" :gridName="gridName"
:parentPrgmId="myPrgmId" />
</div>
<div class="d-flex align-center justify-space-between">
<pagination id="pagination" :total-count="totalCount" :page-num="page" :limit="limit"
@loadData="changeGrid" />
</div>
</v-card>
</v-col>
@ -97,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 PageTitle from "~/components/common/PageTitle";
import pagination from '~/components/Pagination';
let myTitle;
// const myPrgmId = "PRG0052";
@ -130,7 +94,7 @@ export default {
PastRsltDataReadPop,
PastRsltDataReadTagPop,
EvtObjPop,
PageTitle,
pagination,
},
data() {
return {
@ -146,12 +110,16 @@ export default {
valueNm2: 'tagNm',
iconShow: true,
disabled: false,
labelCols: 12,
textCols: 12,
class: 'py-2',
required: false,
formFg: false,
},
itemsPerPage: 10,
itemsPerPageArray: [10, 20, 30],
limit: 20,
page: 1,
totalCount: 0,
};
},
computed: {
@ -164,9 +132,6 @@ export default {
chkTagId() {
return this.pageData.tagList === undefined ? null : this.pageData.tagId;
},
// chkTagList() {
// return this.pageData.tagList;
// },
chkTagNm() {
return this.pageData.tagData.tagNm;
},
@ -176,18 +141,16 @@ export default {
},
watch: {
chkIsFind(val) {
if (val) this.search();
if (val) {
this.page = 1;
this.search();
}
},
chkTagId(val) {
if (this.initFlag && val != null) {
this.search();
}
},
// chkTagList() {
// if(this.initFlag){
// this.search();
// }
// },
chkTagNm() {
if (this.initFlag) {
this.search();
@ -207,7 +170,7 @@ export default {
defaultData: defaultData,
});
},
created() {},
created() { },
async mounted() {
await this.setFromDt();
await this.init();
@ -330,6 +293,7 @@ export default {
this.loadGrid = false;
let res = [];
let res2 = [];
let yearQuarterData = [];
yearQuarterData = this.yearQuarterMaker([
this.pageData.fromDt,
@ -381,8 +345,18 @@ export default {
apiKey: 'selectTagRawDataByQuarter',
resKey: 'pastRsltReadData',
sendParam: sendParams,
limit: this.limit,
page: this.page,
offset: (this.page - 1) * this.limit, // MariaDB Query에서 직접 계산이 안됨
});
res2 = await this.postApiReturn({
apiKey: 'selectTagRawDataByQuarterPageTotal',
resKey: 'pastRslPageTotal',
sendParam: sendParams
});
this.totalCount = res2[0].totalcount;
this.setGridData({
gridKey: this.gridName,
value: res,
@ -393,6 +367,9 @@ export default {
fromDt: this.pageData.fromDt,
toDt: this.pageData.toDt,
yearQuarterList: yearQuarterData['yearQuarterList'],
limit: this.limit,
page: this.page,
offset: (this.page - 1) * this.limit, // MariaDB Query에서 직접 계산이 안됨
};
sendParams['tagId'] = this.pageData.tagId;
//
@ -410,6 +387,14 @@ export default {
sendParam: sendParams,
});
res2 = await this.postApiReturn({
apiKey: 'selectTagRawDataByQuarterPageTotal',
resKey: 'pastRslPageTotal',
sendParam: sendParams
});
this.totalCount = res2[0].totalcount;
this.setGridData({
gridKey: this.gridName,
value: res,
@ -487,6 +472,12 @@ export default {
finalResult['yearQuarterList'] = result;
return finalResult;
},
changeGrid: async function (pageNum, limit) {
this.page = pageNum;
this.limit = limit;
this.search();
},
},
};

View File

@ -1,5 +1,6 @@
<template>
<div ref="mainDiv" class="l-layout">
<CommonPageTitle />
<v-row ref="searchFilter">
<v-col :cols="12">
<v-card class="searchFilter">
@ -28,7 +29,7 @@
customClass="select-large"
/>
</v-col>
<v-col :cols="3">
<v-col :cols="3">
<InputText
:parentPrgmId="myPrgmId"
label="검침대상명"
@ -59,19 +60,16 @@
:btnActionsFnc="btnActions"
/>
</div>
<div class="h100 px-5" style="height:calc(100% - 70px)">
<div ref="gridParent" class="w100 h100">
<component
:ref="gridName"
:is="loadGrid ? 'Grid' : null"
:gridName="gridName"
:parentPrgmId="myPrgmId"
@getRowsData="getRowData"
@sendSelectedRowStatInfo="getSelectedRowStatInfo"
:selectedRowDataWatchFlag="true"
:dataPath="dataPathMock"
/>
</div>
<div ref="gridParent" class="h100 px-5" style="height:calc(100% - 70px)">
<component
:ref="gridName"
:is="loadGrid ? 'Grid' : null"
:gridName="gridName"
:parentPrgmId="myPrgmId"
@getRowsData="getRowData"
@sendSelectedRowStatInfo="getSelectedRowStatInfo"
:selectedRowDataWatchFlag="true"
/>
</div>
</v-card>
</v-col>
@ -81,7 +79,7 @@
>검침대상 상세
</v-card-title>
<div class="px-5" style="height:calc(100% - 76px)">
<v-tabs v-model="tab" >
<v-tabs v-model="tab">
<v-tab
v-for="item in items"
:key="item.id"
@ -188,26 +186,8 @@ export default {
return {
myPrgmId: myPrgmId,
gridName: 'rowGrid',
loadGrid: true,
loadGrid: false,
tab: null,
dataPathMock: {
"rowGrid": {
column: [
{ header: '검침 대상 ID', name: 'readObjId', align: 'left' },
{ header: '검침 대상 명', name: 'readObjNm', align: 'left' },
{ header: '검침 대상 유형', name: 'readObjKind', align: 'left' },
{ header: '그룹', name: 'grpCd', align: 'left' },
{ header: 'TJ 환산계수', name: 'tjCvrtCoef', align: 'right' },
{ header: 'TOE 환산계수', name: 'toeCvrtCoef', align: 'right' },
{ header: 'CO2 환산계수', name: 'co2CvrtCoef', align: 'right' },
{ header: '단위', name: 'unitCd', align: 'left' },
{ header: '사용 여부', name: 'useFg', align: 'center' },
],
data: dataPathDataExample,
defaultRow: dataPathDataExample,
option: {}
}
},
items: [
{
name: '검침 대상 정보',
@ -724,8 +704,8 @@ const defaultData = {
},
buttonAuth: {
add: true,
save: true,
remove: true,
save: true,
excel: false,
},
},
@ -873,40 +853,7 @@ const myDetail = [
required: true,
},
];
const dataPathDataExample = [
{
readObjId: 'OBJ001',
readObjNm: '서울 본사',
readObjKind: 'TYPE01',
grpCd: 'GRP01',
tjCvrtCoef: 1.25,
toeCvrtCoef: 0.85,
co2CvrtCoef: 2.1,
unitCd: 'kWh',
useFg: '1',
},
{
readObjId: 'OBJ002',
readObjNm: '부산 지사',
readObjKind: 'TYPE02',
grpCd: 'GRP02',
tjCvrtCoef: 1.10,
toeCvrtCoef: 0.90,
co2CvrtCoef: 1.8,
unitCd: 'MJ',
useFg: '0',
},
{
readObjId: 'OBJ003',
readObjNm: '대전 공장',
readObjKind: 'TYPE03',
grpCd: 'GRP01',
tjCvrtCoef: 1.30,
toeCvrtCoef: 0.95,
co2CvrtCoef: 2.3,
unitCd: 'GJ',
useFg: '1',
}
];
</script>
<style lang="scss">
@import '@/assets/scss/common.scss';
</style>

Some files were not shown because too many files have changed in this diff Show More