Compare commits

...

79 Commits

Author SHA1 Message Date
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
020432d5ac update code 2025-07-25 19:05:38 +09:00
3f99958fe3 update slected header 2025-07-25 19:03:41 +09:00
dev
898df6743a Merge pull request 'dev-manhph1-screen18-19-21-28' (#5) from dev-manhph1-screen18-19-21-28 into dev
Reviewed-on: #5
2025-07-25 18:50:19 +09:00
dd559629ab dev-manhph1-screen18-19-21-28 2025-07-25 18:11:31 +09:00
dev
d45d141c3c Update 2507 2025-07-25 17:59:38 +09:00
dev
1453e75f9a Merge pull request 'Update to original menu' (#4) from dev-nghiantt-menu into dev
Reviewed-on: #4
2025-07-25 16:04:04 +09:00
7227d5d56c Update to original menu 2025-07-25 12:36:03 +09:00
85fc9a62af update theme header 2025-07-25 12:30:27 +09:00
dev
a87a8262f4 Merge pull request 'Update screen 7, 25' (#3) from dev-trungvq7-2207 into dev
Reviewed-on: #3
2025-07-25 12:15:44 +09:00
dev
481434a144 Update 2025-07-25 12:09:27 +09:00
dev
524023b3e1 update screen 7, 25 2025-07-25 11:57:02 +09:00
dev
cb2d4e2e91 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-2207 2025-07-24 16:54:54 +09:00
dev
dca6673a11 commit 2407 2025-07-24 16:54:47 +09:00
dev
15aa03b1c1 Merge pull request 'impoaver sceen 2-notice management page' (#2) from dev-dungtv-screen2 into dev
Reviewed-on: #2
2025-07-24 16:49:45 +09:00
bbd037dcb4 update code 2025-07-24 14:45:30 +07:00
0ad898769d update32.1vs32.2 2025-07-24 11:41:23 +09:00
bcf4015cae Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv-screen2 2025-07-23 15:57:24 +07:00
dd9739bf74 impoaver sceen 2-notice management page 2025-07-23 15:41:44 +07:00
dev
ab702c4495 Merge pull request 'Update 2207' (#1) from dev-trungvq7-2207 into dev
Reviewed-on: #1
2025-07-22 15:16:42 +09:00
edab77d0c6 Update 2025-07-22 14:41:39 +09:00
e2f7ab5113 merge 2207 2025-07-22 12:24:07 +09:00
eedbf94d56 init dev-push code ui base design 2025-07-22 09:58:38 +07:00
226 changed files with 37112 additions and 27905 deletions

1
.gitignore vendored
View File

@ -88,3 +88,4 @@ sw.*
# Vim swap files # Vim swap files
*.swp *.swp
.history

20
assets/css/Oxanium.css Normal file
View File

@ -0,0 +1,20 @@
@font-face {
font-family: 'Oxanium';
font-weight: 700;
src: local('Oxanium Bold'),
url('../font/Oxanium/Oxanium-Bold.ttf') format('truetype');
}
@font-face {
font-family: 'Oxanium';
font-weight: 500;
src: local('Oxanium Medium'),
url('../font/Oxanium/Oxanium-Medium.ttf') format('truetype');
}
@font-face {
font-family: 'Oxanium';
font-weight: 300;
src: local('Oxanium Light'),
url('../font/Oxanium/Oxanium-Light.ttf') format('truetype');
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because it is too large Load Diff

BIN
assets/scss/common.zip Normal file

Binary file not shown.

View File

@ -1,40 +1,54 @@
.v-btn { .v-btn {
background-color: #144985; background-color: #1677ff;
&:not(.v-btn--round) {
border-radius: 6px;
}
&-radius { &-radius {
&__20 { &__20 {
border-radius: 20px !important; border-radius: 20px !important;
} }
&__50per { &__50per {
border-radius: 50% !important; border-radius: 50% !important;
} }
} }
&__full { &__full {
width: 100%; width: 100%;
} }
&__round { &__round {
min-width: 100px !important; min-width: 100px !important;
padding: 8px 25px !important; padding: 8px 25px !important;
border-radius: 20px !important; border-radius: 20px !important;
} }
&__excel { &__excel {
background-color: #47535c !important; background-color: #47535c !important;
} }
&-bg { &-bg {
&__transparent { &__transparent {
background-color: transparent !important; background-color: transparent !important;
} }
&__blue { &__blue {
background-color: $--color-primary__blue; background-color: $--color-primary__blue;
} }
&__white-blue { &__white-blue {
background-color: $--color-white; background-color: $--color-white;
color: $--color-primary__blue; color: $--color-primary__blue;
} }
} }
&__transparent { &__transparent {
border: 0; border: 0;
background-color: transparent !important; background-color: transparent !important;
} }
&.v-btn--icon.v-btn--tile { &.v-btn--icon.v-btn--tile {
border-radius: 4px; border-radius: 4px;
} }
@ -42,16 +56,18 @@
@each $theme in dark, light { @each $theme in dark, light {
@include theme($theme); @include theme($theme);
.v-application.#{$theme}-mode { .v-application.#{$theme}-mode {
.v-btn-bg__w-g5 { .v-btn-bg__w-g5 {
background-color: $--theme-color-w-g5; background-color: $--theme-color-w-g5;
i { i {
color: $--theme-color-g5-w; color: $--theme-color-g5-w;
} }
} }
.v-btn { .v-btn {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-btn-backgroundColor" "v-btn-backgroundColor"
); );
@ -59,8 +75,7 @@
&.v-btn--disabled { &.v-btn--disabled {
opacity: 0.4; opacity: 0.4;
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-btn-backgroundColor" "v-btn-backgroundColor"
) !important; ) !important;
@ -71,5 +86,100 @@
} }
} }
} }
.basic-button {
color: map-deep-get($config, #{$theme}, "basic-button-color");
background: map-deep-get($config, #{$theme}, "basic-button-background");
}
.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,
#{$theme},
"icon-color"
);
}
}
.ant-btn {
&.ant-btn-outlined {
color:map-deep-get($config, #{$theme}, "ant-btn-default-color");
border:1px solid map-deep-get($config, #{$theme}, "ant-btn-default-border-outlined");
background-color: transparent;
}
&.ant-btn-primary {
background: map-deep-get($config, #{$theme}, "ant-btn-primary-bg");
border-color:map-deep-get($config, #{$theme}, "ant-btn-primary-bg");
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 {
background:map-deep-get($config, #{$theme}, "ant-btn-default-bg");
color:map-deep-get($config, #{$theme}, "ant-btn-default-color");
}
&.ant-btn-danger {
&.ant-btn-background-ghost {
color:map-deep-get($config, #{$theme}, "ant-btn-danger-color");
border-color:map-deep-get($config, #{$theme}, "ant-btn-danger-border");
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 {
border-radius: 6px;
&.ant-btn-lg {
border-radius: 8px;
}
&.ant-btn-default {
border:none !important
}
}
}
.v-dialog {
.ant-btn-icon-only {
border: none;
width: 16px;
height: 16px;
background:none;
}
}
.ant-btn {
&.expand-btn {
.v-icon {
span {
margin-right: 8px;
}
}
} }
} }

View File

@ -3,13 +3,43 @@
} }
@each $theme in dark, light { @each $theme in dark, light {
// @include theme($theme); // @include theme($theme);
.v-application.#{$theme}-mode { .v-application.#{$theme}-mode {
.v-card { .v-card {
color: map-deep-get($config, #{$theme}, "card-default-color"); color: map-deep-get($config, #{$theme}, "card-default-color");
background-color: map-deep-get($config, #{$theme}, "cardBackground");
.v-card__subtitle { .v-card__subtitle {
font-size: 14px;
font-weight: 400;
color: map-deep-get($config, #{$theme}, "card-subtitle"); color: map-deep-get($config, #{$theme}, "card-subtitle");
} }
.v-card__title {
font-size: 20px;
font-weight: 600;
line-height: 28px;
color: map-deep-get($config, #{$theme}, "card-title-color") !important;
}
.card-text-info {
font-family: "Oxanium", sans-serif;
font-weight: 500;
font-size: 24px;
line-height: 24px;
letter-spacing: 0;
color: map-deep-get($config, #{$theme}, "card-text-info-color");
}
.card-text-title {
font-weight: 400;
font-size: 14px;
line-height: 22px;
letter-spacing: 0;
color: map-deep-get($config, #{$theme}, "card-text-title-color");
}
} }
} }
} }

View File

@ -11,9 +11,10 @@
width: 100%; width: 100%;
border-radius: 10px; border-radius: 10px;
} }
&-content-area { &-content-area {
width: 100%; width: 100%;
border: 0; border: 0 !important;
} }
// &-body-container { // &-body-container {
@ -33,6 +34,7 @@
} }
&-rside-area { &-rside-area {
.tui-grid-header-area, .tui-grid-header-area,
.tui-grid-summary-area { .tui-grid-summary-area {
margin-right: $scrollbar-width; margin-right: $scrollbar-width;
@ -40,27 +42,41 @@
} }
&-border-line-top, &-border-line-top,
&-border-line-bottom, &-border-line-bottom {
&-border-line-right {
border: 0 !important; border: 0 !important;
} }
&-cell { &-cell {
border-width: 1px !important; border-width: 1px !important;
} }
&-cell-header { &-cell-header {
border-top: 0; border-top: 0;
font-weight: 400;
} }
&-cell-header, &-cell-header,
&-cell-content, &-cell-content,
&-cell.tui-grid-cell-summary { &-cell.tui-grid-cell-summary {
font-family: "Spoqa Han Sans Neo"; // font-family: "Spoqa Han Sans Neo";
font-size: 0.875rem; font-size: 0.875rem;
font-weight: 400;
line-height: 1.25rem; line-height: 1.25rem;
letter-spacing: 0.0178571429em; letter-spacing: 0.0178571429em;
} }
&-cell-content {
font-weight: 400;
} }
}
.tui-grid-table{
.tui-grid-cell-header,
.tui-grid-cell-has-input .tui-grid-cell-content {
padding: 8px;
}
}
.treeGrid { .treeGrid {
.tui-grid { .tui-grid {
&-header-area { &-header-area {
@ -73,42 +89,101 @@
} }
} }
} }
.tui-grid-scrollbar-right-top { .tui-grid-scrollbar-right-top {
z-index: 5; z-index: 5;
} }
@each $theme in dark, light { @each $theme in dark, light {
@include theme($theme); @include theme($theme);
.v-application.#{$theme}-mode { .v-application.#{$theme}-mode {
.grid-title {
font-weight: 600;
font-size: 16px;
line-height: 24px;
letter-spacing: 0;
color: map-deep-get($config,
#{$theme},
"tui-grid-title-color"
);
}
.tui-grid { .tui-grid {
&-table {
border: 1px solid;
border-color: map-deep-get($config,
#{$theme},
"scrollbar-track"
);
.tui-grid-cell {
border-color: map-deep-get($config,
#{$theme},
"tui-grid-cell-borderColor-darkmode"
);
border-style: map-deep-get($config,
#{$theme},
"tui-grid-cell-borderStyle-darkmode"
);
}
}
&-border-line-right{
opacity: 0;
}
&-body-container{
border-right: 0;
// border-right-color: map-deep-get($config,
// #{$theme},
// "tui-grid-cell-borderColor"
// );
width: auto !important;
}
&-container, &-container,
&-summary-area { &-summary-area {
font-family: Inter;
// color: #000000E0;
& ::-webkit-scrollbar { & ::-webkit-scrollbar {
width: $scrollbar-width !important; width: $scrollbar-width !important;
height: $scrollbar-width !important; height: $scrollbar-width !important;
-webkit-appearance: initial; -webkit-appearance: initial;
background-color: map-deep-get( // background-color: map-deep-get($config,
$config, // #{$theme},
#{$theme}, // "tui-grid-cell-borderColor"
"scrollbar-track" // ) !important;
) !important; background-color: rgba(0, 0, 0, 0) !important;
border-radius: 3px !important; border-radius: 3px !important;
} }
& ::-webkit-scrollbar-track { & ::-webkit-scrollbar-track {
background-color: map-deep-get( // background-color: map-deep-get($config,
$config, // #{$theme},
#{$theme}, // "tui-grid-cell-borderColor"
"scrollbar-track" // ) !important;
) !important; background-color: rgba(0, 0, 0, 0) !important;
} }
& ::-webkit-scrollbar-thumb { & ::-webkit-scrollbar-thumb {
width: 50px !important; width: 50px !important;
height: 50px !important; height: 50px !important;
background-color: map-deep-get($config, #{$theme}, "scrollbar-thumb"); background-color: map-deep-get($config, #{$theme}, "scrollbar-thumb");
// background-color: rgba(0, 0, 0, 0);
border-radius: 3px; border-radius: 3px;
} }
.tui-grid-cell {
&.tui-grid-cell-summary {
color: map-deep-get($config,
#{$theme},
"tui-grid-cell-color"
);
}
}
} }
&-rside-area { &-rside-area {
@ -121,38 +196,42 @@
} }
&-scrollbar-right-top { &-scrollbar-right-top {
background-color: map-deep-get( background-color: rgba(0, 0, 0, 0);
$config, border: none;
#{$theme}, display: none;
"tui-grid-header-backgroundColor" // background-color: map-deep-get(
); // $config,
border-left-color: map-deep-get( // #{$theme},
$config, // "tui-grid-header-backgroundColor"
#{$theme}, // );
"tui-grid-border-horziontal-color" // border-left-color: map-deep-get(
); // $config,
border-right-color: map-deep-get( // #{$theme},
$config, // "tui-grid-border-horziontal-color"
#{$theme}, // );
"tui-grid-border-horziontal-color" // border-right-color: map-deep-get(
); // $config,
border-bottom-color: map-deep-get( // #{$theme},
$config, // "tui-grid-border-horziontal-color"
#{$theme}, // );
"tui-grid-border-vertical-color" // border-bottom-color: map-deep-get(
); // $config,
// #{$theme},
// "tui-grid-border-vertical-color"
// );
} }
&-scrollbar-right-bottom { &-scrollbar-right-bottom {
width: $scrollbar-width !important; width: $scrollbar-width !important;
height: $scrollbar-width !important; height: $scrollbar-width !important;
// display: none !important; // display: none !important;
border-color: map-deep-get($config, #{$theme}, "scrollbar-track"); border-color: map-deep-get($config, #{$theme}, "cardBackground");
background-color: map-deep-get($config, #{$theme}, "scrollbar-track"); background-color: map-deep-get($config, #{$theme}, "cardBackground");
// border: none !important; // border: none !important;
// bottom: -1px; // bottom: -1px;
// right: -2px; // right: -2px;
box-sizing: border-box; box-sizing: border-box;
// display: none;
} }
&-scrollbar-frozen-border, &-scrollbar-frozen-border,
@ -162,25 +241,72 @@
border-color: transparent !important; border-color: transparent !important;
} }
&-body-area { &-body-area,
overflow: auto !important;
}
&-container, &-container,
&-layer-state, &-layer-state,
&-body-area,
&-summary-area, &-summary-area,
&-cell { &-cell {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-cell-backgroundColor" "tui-grid-cell-backgroundColor"
); );
border-color: map-deep-get( border-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-border-vertical-color" "tui-grid-border-vertical-color"
); );
// &-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: 11px;
width: 11px;
border-radius: 50%;
background-color: map-deep-get($config,
#{$theme},
"arow-line-color"
);
}
}
}
}
}
&-cell {
&:last-child {
padding-right: 1px;
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"
);
}
}
} }
&-cell-summary { &-cell-summary {
@ -189,17 +315,32 @@
&-header-area, &-header-area,
&-cell-header { &-cell-header {
background-color: map-deep-get( // font-family: inherit;
$config, // font-style: Semi Bold;
font-weight: 600;
background-color: map-deep-get($config,
#{$theme}, #{$theme},
"tui-grid-header-backgroundColor" "tui-grid-header-backgroundColor"
); );
border-color: map-deep-get( border-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-border-vertical-color" "tui-grid-border-vertical-color"
); );
color: map-deep-get($config, #{$theme}, "activate"); color: map-deep-get($config,
#{$theme},
"tui-grid-header-color"
);
}
&-header-area {
// background-color: none;
border: none;
margin-right: 0 !important;
background-color: map-deep-get($config,
#{$theme},
"tui-grid-cell-backgroundColor"
);
} }
&-row-odd, &-row-odd,
@ -210,8 +351,7 @@
&:hover { &:hover {
>.tui-grid-cell { >.tui-grid-cell {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-cell-hover-backgroundColor" "tui-grid-cell-hover-backgroundColor"
); );
@ -221,33 +361,33 @@
} }
} }
} }
} }
&-cell { &-cell {
&.row-insert { &.row-insert {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-cell-insert-color" "tui-grid-cell-insert-color"
); );
} }
&.row-modify { &.row-modify {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-cell-modify-color" "tui-grid-cell-modify-color"
); );
} }
&.row-removed { &.row-removed {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-cell-removed-color" "tui-grid-cell-removed-color"
); );
} }
&.row-disabled { &.row-disabled {
color: map-deep-get( color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-cell-disabled-color" "tui-grid-cell-disabled-color"
); );
@ -256,9 +396,9 @@
color: map-deep-get($config, #{$theme}, "tui-grid-cell-disabled-color"); color: map-deep-get($config, #{$theme}, "tui-grid-cell-disabled-color");
} }
} }
&.row-selected { &.row-selected {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-cell-selected-color" "tui-grid-cell-selected-color"
); );
@ -284,8 +424,7 @@
align-items: center; align-items: center;
position: relative; position: relative;
.tui-grid-tree-depth .tui-grid-tree-depth {
{
width: 16px; width: 16px;
height: 16px; height: 16px;
position: relative; position: relative;
@ -303,6 +442,7 @@
margin-right: 6px; margin-right: 6px;
top: 0; top: 0;
left: 0 !important; left: 0 !important;
i { i {
margin-top: 0; margin-top: 0;
} }
@ -311,15 +451,19 @@
&-tree-icon { &-tree-icon {
margin-top: 0; margin-top: 0;
top: 0; top: 0;
i { i {
width: 16px; width: 16px;
height: 16px; height: 16px;
margin-left: 0; margin-left: 0;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 0; background-position: 0 0;
@if $theme ==dark { @if $theme ==dark {
background-image: url("data:image/svg+xml,%3Csvg id='ico_tree_item' xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cdefs%3E%3Cstyle%3E .cls-1, .cls-4 %7B fill: none; %7D .cls-1 %7B stroke: %23fff; opacity: 0.3; %7D .cls-2 %7B fill: %23fff; %7D .cls-3 %7B stroke: none; %7D %3C/style%3E%3C/defs%3E%3Cg id='사각형_703' data-name='사각형 703' class='cls-1'%3E%3Crect class='cls-3' width='16' height='16' rx='3'/%3E%3Crect class='cls-4' x='0.5' y='0.5' width='15' height='15' rx='2.5'/%3E%3C/g%3E%3Crect id='사각형_1384' data-name='사각형 1384' class='cls-2' width='8' height='1' rx='0.5' transform='translate(4 4.5)'/%3E%3Crect id='_1386' data-name=' 1386' class='cls-2' width='8' height='1' rx='0.5' transform='translate(4 7.5)'/%3E%3Crect id='_1387' data-name=' 1387' class='cls-2' width='8' height='1' rx='0.5' transform='translate(4 10.5)'/%3E%3C/svg%3E%0A"); background-image: url("data:image/svg+xml,%3Csvg id='ico_tree_item' xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cdefs%3E%3Cstyle%3E .cls-1, .cls-4 %7B fill: none; %7D .cls-1 %7B stroke: %23fff; opacity: 0.3; %7D .cls-2 %7B fill: %23fff; %7D .cls-3 %7B stroke: none; %7D %3C/style%3E%3C/defs%3E%3Cg id='사각형_703' data-name='사각형 703' class='cls-1'%3E%3Crect class='cls-3' width='16' height='16' rx='3'/%3E%3Crect class='cls-4' x='0.5' y='0.5' width='15' height='15' rx='2.5'/%3E%3C/g%3E%3Crect id='사각형_1384' data-name='사각형 1384' class='cls-2' width='8' height='1' rx='0.5' transform='translate(4 4.5)'/%3E%3Crect id='_1386' data-name=' 1386' class='cls-2' width='8' height='1' rx='0.5' transform='translate(4 7.5)'/%3E%3Crect id='_1387' data-name=' 1387' class='cls-2' width='8' height='1' rx='0.5' transform='translate(4 10.5)'/%3E%3C/svg%3E%0A");
} @else { }
@else {
background-image: url("data:image/svg+xml,%3Csvg id='ico_tree_item' xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cdefs%3E%3Cstyle%3E .cls-2%7Bfill:%23a4aac3%7D %3C/style%3E%3C/defs%3E%3Cg id='사각형_703' data-name='사각형 703' style='stroke:%23a4aac3;fill:none'%3E%3Crect width='16' height='16' rx='3' style='stroke:none'/%3E%3Crect x='.5' y='.5' width='15' height='15' rx='2.5' style='fill:none'/%3E%3C/g%3E%3Crect id='사각형_1384' data-name='사각형 1384' class='cls-2' width='8' height='1' rx='.5' transform='translate(4 4.5)'/%3E%3Crect id='_1386' data-name=' 1386' class='cls-2' width='8' height='1' rx='.5' transform='translate(4 7.5)'/%3E%3Crect id='_1387' data-name=' 1387' class='cls-2' width='8' height='1' rx='.5' transform='translate(4 10.5)'/%3E%3C/svg%3E%0A"); background-image: url("data:image/svg+xml,%3Csvg id='ico_tree_item' xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cdefs%3E%3Cstyle%3E .cls-2%7Bfill:%23a4aac3%7D %3C/style%3E%3C/defs%3E%3Cg id='사각형_703' data-name='사각형 703' style='stroke:%23a4aac3;fill:none'%3E%3Crect width='16' height='16' rx='3' style='stroke:none'/%3E%3Crect x='.5' y='.5' width='15' height='15' rx='2.5' style='fill:none'/%3E%3C/g%3E%3Crect id='사각형_1384' data-name='사각형 1384' class='cls-2' width='8' height='1' rx='.5' transform='translate(4 4.5)'/%3E%3Crect id='_1386' data-name=' 1386' class='cls-2' width='8' height='1' rx='.5' transform='translate(4 7.5)'/%3E%3Crect id='_1387' data-name=' 1387' class='cls-2' width='8' height='1' rx='.5' transform='translate(4 10.5)'/%3E%3C/svg%3E%0A");
} }
} }
@ -331,10 +475,13 @@
width: 16px; width: 16px;
height: 16px; height: 16px;
background-position: 0 0; background-position: 0 0;
@if $theme ==dark { @if $theme ==dark {
background-image: url("data:image/svg+xml,%3Csvg id='btn_tree_item_close' xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cdefs%3E%3Cstyle%3E .cls-1 %7B fill: %230d0f17; stroke: %23fff; opacity: 0.3; %7D .cls-2 %7B fill: %23fff; %7D .cls-3 %7B stroke: none; %7D .cls-4 %7B fill: none; %7D %3C/style%3E%3C/defs%3E%3Cg id='사각형_703' data-name='사각형 703' class='cls-1'%3E%3Crect class='cls-3' width='16' height='16' rx='3'/%3E%3Crect class='cls-4' x='0.5' y='0.5' width='15' height='15' rx='2.5'/%3E%3C/g%3E%3Crect id='사각형_1384' data-name='사각형 1384' class='cls-2' width='8' height='2' rx='1' transform='translate(4 7)'/%3E%3C/svg%3E%0A"); background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22none%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Crect%20width%3D%2216%22%20height%3D%2216%22%20rx%3D%224%22%20fill%3D%22%23212224%22/%3E%3Crect%20x%3D%220.5%22%20y%3D%220.5%22%20width%3D%2215%22%20height%3D%2215%22%20rx%3D%223.5%22%20stroke%3D%22white%22%20stroke-opacity%3D%220.06%22/%3E%3Cpath%20d%3D%22M12.5998%208H2.99979%22%20stroke%3D%22white%22%20stroke-opacity%3D%220.85%22/%3E%3C/svg%3E");
} @else { }
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cg data-name='사각형 703' style='fill:%23f1f3f9;stroke:%23a4aac3'%3E%3Crect width='16' height='16' rx='3' style='stroke:none'/%3E%3Crect x='.5' y='.5' width='15' height='15' rx='2.5' style='fill:none'/%3E%3C/g%3E%3Crect data-name='사각형 1384' width='8' height='2' rx='1' transform='translate(4 7)' style='fill:%23a4aac3'/%3E%3C/svg%3E ");
@else {
background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22none%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Crect%20width%3D%2216%22%20height%3D%2216%22%20rx%3D%224%22%20fill%3D%22white%22/%3E%3Crect%20x%3D%220.5%22%20y%3D%220.5%22%20width%3D%2215%22%20height%3D%2215%22%20rx%3D%223.5%22%20stroke%3D%22black%22%20stroke-opacity%3D%220.06%22/%3E%3Cpath%20d%3D%22M12.5997%208H2.99973%22%20stroke%3D%22black%22%20stroke-opacity%3D%220.88%22/%3E%3C/svg%3E");
} }
} }
} }
@ -346,10 +493,13 @@
width: 16px; width: 16px;
height: 16px; height: 16px;
background-position: 0 0; background-position: 0 0;
@if $theme ==dark { @if $theme ==dark {
background-image: url("data:image/svg+xml,%3Csvg id='btn_tree_item_open' xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cdefs%3E%3Cstyle%3E .cls-2%7Bfill:%23fff%7D %3C/style%3E%3C/defs%3E%3Cg id='사각형_703' data-name='사각형 703' style='fill:%230d0f17;stroke:%23fff;opacity:.3'%3E%3Crect width='16' height='16' rx='3' style='stroke:none'/%3E%3Crect x='.5' y='.5' width='15' height='15' rx='2.5' style='fill:none'/%3E%3C/g%3E%3Crect id='사각형_1384' data-name='사각형 1384' class='cls-2' width='8' height='2' rx='1' transform='translate(4 7)'/%3E%3Crect id='_1385' data-name=' 1385' class='cls-2' width='2' height='8' rx='1' transform='translate(7 4)'/%3E%3C/svg%3E%0A"); background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22none%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Crect%20width%3D%2216%22%20height%3D%2216%22%20rx%3D%224%22%20fill%3D%22%23212224%22/%3E%3Crect%20x%3D%220.5%22%20y%3D%220.5%22%20width%3D%2215%22%20height%3D%2215%22%20rx%3D%223.5%22%20stroke%3D%22white%22%20stroke-opacity%3D%220.06%22/%3E%3Cpath%20d%3D%22M7.7998%203.00073V12.6007%22%20stroke%3D%22white%22%20stroke-opacity%3D%220.85%22/%3E%3Cpath%20d%3D%22M12.5999%207.80078L2.99985%207.80078%22%20stroke%3D%22white%22%20stroke-opacity%3D%220.85%22/%3E%3C/svg%3E");
} @else { }
background-image: url("data:image/svg+xml,%3Csvg id='btn_tree_item_open' xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cdefs%3E%3Cstyle%3E .cls-2%7Bfill:%23a4aac3%7D %3C/style%3E%3C/defs%3E%3Cg id='사각형_703' data-name='사각형 703' style='fill:%23f1f3f9;stroke:%23a4aac3'%3E%3Crect width='16' height='16' rx='3' style='stroke:none'/%3E%3Crect x='.5' y='.5' width='15' height='15' rx='2.5' style='fill:none'/%3E%3C/g%3E%3Crect id='사각형_1384' data-name='사각형 1384' class='cls-2' width='8' height='2' rx='1' transform='translate(4 7)'/%3E%3Crect id='_1385' data-name=' 1385' class='cls-2' width='2' height='8' rx='1' transform='translate(7 4)'/%3E%3C/svg%3E ");
@else {
background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22none%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Crect%20width%3D%2216%22%20height%3D%2216%22%20rx%3D%224%22%20fill%3D%22white%22/%3E%3Crect%20x%3D%220.5%22%20y%3D%220.5%22%20width%3D%2215%22%20height%3D%2215%22%20rx%3D%223.5%22%20stroke%3D%22black%22%20stroke-opacity%3D%220.06%22/%3E%3Cpath%20d%3D%22M7.7998%203.00073V12.6007%22%20stroke%3D%22black%22%20stroke-opacity%3D%220.88%22/%3E%3Cpath%20d%3D%22M12.5997%207.80078L2.99973%207.80078%22%20stroke%3D%22black%22%20stroke-opacity%3D%220.88%22/%3E%3C/svg%3E");
} }
} }
} }

View File

@ -1,40 +1,88 @@
.v-select__custom { .v-select__custom {
&.v-text-field.v-text-field--solo:not(.v-text-field--solo-flat) padding: 0.125rem;
> .v-input__control
> .v-input__slot { &.v-text-field.v-text-field--solo:not(.v-text-field--solo-flat)>.v-input__control>.v-input__slot {
box-shadow: none; box-shadow: none;
} }
&.v-text-field.v-text-field--solo .v-input__control { &.v-text-field.v-text-field--solo .v-input__control {
min-height: 36px; min-height: 32px;
height: 36px; height: 32px;
} }
&.v-input input { &.v-input input {
min-height: 36px; min-height: 32px;
height: 36px; height: 32px;
} }
.v-input--selection-controls { .v-input--selection-controls {
margin-top: 0; margin-top: 0;
padding-top: 0; padding-top: 0;
} }
.v-input__slot { .v-input__slot {
overflow: hidden; overflow: hidden;
position: relative; position: relative;
height: 36px; height: 32px;
}
&.v-text-field .v-input__control {
border-color: #d9d9d9;
}
&.select-large {
.v-input__slot,
.v-input__control {
height: 40px !important;
// border: solid 1px #D9D9D9;
border-radius: 8px !important;
}
}
legend {
width: 0;
}
.v-select-list {
padding: 0 1rem;
} }
} }
.v-input__custom { .v-input__custom {
.v-input__slot { .v-input__slot {
&:before, &:before,
&:after { &:after {
display: none; display: none;
} }
} }
.v-input__slot { .v-input__slot {
overflow: hidden; overflow: hidden;
position: relative; position: relative;
} }
&.input-large {
border-radius: 8px !important;
input {
max-height: 40px;
height: 40px;
}
}
&.v-text-field .v-input__control {
border-color: #d9d9d9;
}
&.surface-name {
fieldset {
max-width: 345px;
}
}
} }
.v-text-field .v-input__append-inner, .v-text-field .v-input__append-inner,
@ -45,19 +93,20 @@
.v-select__widget { .v-select__widget {
&.v-text-field.v-text-field--solo:not(.v-text-field--solo-flat) &.v-text-field.v-text-field--solo:not(.v-text-field--solo-flat)>.v-input__control>.v-input__slot {
> .v-input__control
> .v-input__slot {
box-shadow: none; box-shadow: none;
} }
&.v-text-field.v-text-field--solo .v-input__control { &.v-text-field.v-text-field--solo .v-input__control {
min-height: 30px !important; min-height: 30px !important;
height: 30px !important; height: 30px !important;
} }
&.v-input input { &.v-input input {
min-height: 30px !important; min-height: 30px !important;
height: 30px !important; height: 30px !important;
} }
&.v-text-field--outlined>.v-input__control>.v-input__slot { &.v-text-field--outlined>.v-input__control>.v-input__slot {
align-items: stretch; align-items: stretch;
min-height: 30px; min-height: 30px;
@ -67,6 +116,7 @@
margin-top: 0; margin-top: 0;
padding-top: 0; padding-top: 0;
} }
.v-input__slot { .v-input__slot {
overflow: hidden; overflow: hidden;
position: relative; position: relative;
@ -79,12 +129,14 @@
width: 110px; width: 110px;
height: 30px; height: 30px;
flex: 0 0 auto; flex: 0 0 auto;
&.v-text-field.v-text-field--solo .v-input__control { &.v-text-field.v-text-field--solo .v-input__control {
min-height: 30px; min-height: 30px;
height: 30px; height: 30px;
} }
} }
} }
.v-text-field>.v-input__control>.v-input__slot:after, .v-text-field>.v-input__control>.v-input__slot:after,
.v-text-field>.v-input__control>.v-input__slot:before { .v-text-field>.v-input__control>.v-input__slot:before {
display: none; display: none;
@ -93,6 +145,7 @@
.v-input__slot { .v-input__slot {
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
.v-input { .v-input {
margin-top: 0 !important; margin-top: 0 !important;
padding-top: 0 !important; padding-top: 0 !important;
@ -104,25 +157,124 @@
} }
} }
.v-main {
.ant-input,
.ant-input-affix-wrapper>input,
.ant-select-selection {
border-radius: 6px;
}
}
.custom-radio {
display: inline-flex;
align-items: center;
cursor: pointer;
position: relative;
padding-left: 28px;
margin: 10px;
font-size: 16px;
}
.custom-radio input[type="radio"] {
position: absolute;
opacity: 0;
cursor: pointer;
}
/* Custom radio appearance */
.radio-mark {
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
height: 18px;
width: 18px;
// background-color: white;
border: 2px solid #ccc;
border-radius: 50%;
transition: all 0.2s ease;
}
/* Show selected state */
.custom-radio input[type="radio"]:checked~.radio-mark {
border-color: #1677ff;
background-color: #fff;
}
.custom-radio input[type="radio"]:checked~.radio-mark::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
height: 11px;
width: 11px;
border-radius: 50%;
background-color: #1677ff;
}
/* Light mode: use Vuetify default */
.checkbox-light .v-icon {
color: #D9D9D9 !important;
}
/* Dark mode: override tick color to black */
.checkbox-dark .v-icon {
color: #424242 !important;
}
@each $theme in dark, light { @each $theme in dark, light {
@include theme($theme); @include theme($theme);
.v-application.#{$theme}-mode { .v-application.#{$theme}-mode {
.v-input-popup__custom {
.v-input__slot {
padding-left: 12px;
padding-right: 12px;
border: 1px solid map-deep-get($config,
#{$theme},
"v-input-popup-password-border"
);
}
}
.v-textarea {
.v-input__slot{
border: map-deep-get($config,
#{$theme},
"v-input-textarea-border"
);
fieldset {
background-color: map-deep-get($config,
#{$theme},
"v-input-textarea-bg"
);
}
}
}
.v-input { .v-input {
border-radius: 4px; border-radius: 4px;
border-radius: 6px;
border-color: #d9d9d9;
color: map-deep-get($config,
#{$theme},
"v-input-backgroundColor"
);
&:not(.v-input--radio-group, .v-input--checkbox) { &:not(.v-input--radio-group, .v-input--checkbox) {
.v-input__slot { .v-input__slot {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-input-backgroundColor" "v-input-backgroundColor"
); );
} }
} }
.v-input__slot { .v-input__slot {
fieldset { fieldset {
color: map-deep-get( color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-input-fieldset-color" "v-input-fieldset-color"
) !important; ) !important;
@ -130,8 +282,7 @@
&:hover { &:hover {
fieldset { fieldset {
color: map-deep-get( color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-input-fieldset-hover-color" "v-input-fieldset-hover-color"
) !important; ) !important;
@ -144,15 +295,14 @@
} }
&--is-readonly { &--is-readonly {
border-color: map-deep-get( border-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-input-readonly-border-color" "v-input-readonly-border-color"
); );
&:not(.v-input--radio-group, .v-input--checkbox) { &:not(.v-input--radio-group, .v-input--checkbox) {
.v-input__slot { .v-input__slot {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-input-readonly-backgroundColor" "v-input-readonly-backgroundColor"
) !important; ) !important;
@ -161,20 +311,20 @@
} }
&--is-disabled { &--is-disabled {
border-color: map-deep-get( border-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-input-readonly-border-color" "v-input-readonly-border-color"
); );
&:not(.v-input--radio-group, .v-input--checkbox) { &:not(.v-input--radio-group, .v-input--checkbox) {
.v-input__slot { .v-input__slot {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-input-disabled-backgroundColor" "v-input-disabled-backgroundColor"
) !important; ) !important;
} }
} }
input { input {
color: map-deep-get($config, #{$theme}, "v-input-disabled-color"); color: map-deep-get($config, #{$theme}, "v-input-disabled-color");
} }
@ -184,22 +334,23 @@
.v-select { .v-select {
.v-label { .v-label {
color: map-deep-get($config, #{$theme}, "v-select-label-color"); color: map-deep-get($config, #{$theme}, "v-select-label-color");
position: static !important;
} }
&.v-input--is-disabled { &.v-input--is-disabled {
.v-label { .v-label {
color: map-deep-get($config, #{$theme}, "v-input-disabled-color"); color: map-deep-get($config, #{$theme}, "v-input-disabled-color");
} }
.v-icon.v-icon--disabled { .v-icon.v-icon--disabled {
color: map-deep-get( color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-input-disabled-color" "v-input-disabled-color"
) !important; ) !important;
} }
.v-select__selection--disabled { .v-select__selection--disabled {
color: map-deep-get( color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-input-disabled-color" "v-input-disabled-color"
) !important; ) !important;
@ -211,12 +362,24 @@
.v-label { .v-label {
color: map-deep-get($config, #{$theme}, "non-activate"); color: map-deep-get($config, #{$theme}, "non-activate");
} }
&.v-item--active { &.v-item--active {
.v-label { .v-label {
color: map-deep-get($config, #{$theme}, "activate"); color: map-deep-get($config, #{$theme}, "activate");
} }
} }
} }
.radio-mark {
background-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-color"
);
border-color: map-deep-get($config,
#{$theme},
"v-input-textarea-border"
);
}
} }
.v-radio { .v-radio {
@ -243,7 +406,9 @@
.v-icon { .v-icon {
@if $theme ==dark { @if $theme ==dark {
color: rgba(255, 255, 255, 0.6); color: rgba(255, 255, 255, 0.6);
} @else { }
@else {
color: #aaaaaa; color: #aaaaaa;
} }
} }

View File

@ -1,20 +1,20 @@
// .v-tabs { .v-tabs {
// height: 38px;
// flex: 0; .v-tab {
// & + .v-tabs-items { padding: 16px 0;
// height: calc(100% - 38px) !important; font-size: 14px;
// width: 100%; position: relative;
// background-color: transparent !important; z-index: 2;
// } transform: translateY(1px);
// &-bar { letter-spacing: 0;
// height: 38px;
// background-color: transparent !important; +.v-tab {
// border-bottom: 1px solid $--color-hover_d; margin-left: 32px;
// } }
// .v-tab {
// margin: 0 !important; min-width:auto;
// } }
// } }
@each $theme in dark, light { @each $theme in dark, light {
.v-application.#{$theme}-mode { .v-application.#{$theme}-mode {
@ -22,67 +22,112 @@
position: relative; position: relative;
z-index: 2; z-index: 2;
.v-tabs-bar{
background-color: rgba(0, 0, 0, 0)
}
.v-slide-group__content {
border-bottom: 1px solid map-deep-get($config,
#{$theme},
"v-tabs-items-border-color"
);
}
.v-slide-group__wrapper { .v-slide-group__wrapper {
background-color: map-deep-get($config,
#{$theme},
"card-default-backgroundColor"
);
overflow: visible !important; overflow: visible !important;
contain: initial !important; contain: initial !important;
} }
.v-tab { .v-tab {
border: 1px solid transparent; padding: 16px 0;
border-radius: 6px 6px 0 0; font-size: 14px;
border-bottom-color: map-deep-get( // border-radius: 6px 6px 0 0;
$config, // border-bottom-color: map-deep-get(
#{$theme}, // $config,
"v-tabs-active-border-color" // #{$theme},
); // "v-tabs-active-border-color"
background-color: map-deep-get( // );
$config, // background-color: map-deep-get(
#{$theme}, // $config,
"v-tabs-backgroundColor" // #{$theme},
); // "v-tabs-backgroundColor"
// );
position: relative; position: relative;
z-index: 2; z-index: 2;
transform: translateY(1px); transform: translateY(1px);
letter-spacing: 0; letter-spacing: 0;
+ .v-tab { + .v-tab {
margin-left: 4px; margin-left: 32px;
} }
&::before {
background-color: transparent;
}
&:hover {
color: map-deep-get(
$config,
#{$theme},
"v-tabs-hover-color"
) !important;
}
&:not(.v-tab--active){
color: map-deep-get($config, #{$theme}, "router-tab-item-color") !important;
}
} }
.v-tab--active { .v-tab--active {
border-top-color: map-deep-get( // border-top-color: map-deep-get(
$config, // $config,
#{$theme}, // #{$theme},
"v-tabs-active-border-color" // "v-tabs-active-border-color"
); // );
border-right-color: map-deep-get( // border-right-color: map-deep-get(
$config, // $config,
#{$theme}, // #{$theme},
"v-tabs-active-border-color" // "v-tabs-active-border-color"
); // );
border-left-color: map-deep-get( // border-left-color: map-deep-get(
$config, // $config,
#{$theme}, // #{$theme},
"v-tabs-active-border-color" // "v-tabs-active-border-color"
); // );
border-bottom-color: map-deep-get( // border-bottom-color: map-deep-get(
$config, // $config,
#{$theme}, // #{$theme},
"v-tabs-active-backgroundColor" // "v-tabs-active-backgroundColor"
); // );
background-color: map-deep-get( background-color: map-deep-get(
$config, $config,
#{$theme}, #{$theme},
"v-tabs-active-backgroundColor" "v-tabs-active-backgroundColor"
); );
} }
.v-tabs-slider {
border-bottom: 1px solid;
border-bottom-color: map-deep-get($config,
#{$theme},
"v-tabs-active-border-color"
);
} }
}
.v-tabs-items { .v-tabs-items {
position: relative; position: relative;
z-index: 1; z-index: 1;
border-top: 1px background-color: map-deep-get($config,
solid #{$theme},
map-deep-get($config, #{$theme}, "v-tabs-active-border-color"); "card-default-backgroundColor"
);
// border-top: 1px
// solid
// map-deep-get($config, #{$theme}, "v-tabs-active-border-color");
} }
} }
} }

View File

@ -1,6 +1,7 @@
.txt { .txt {
&__bar { &__bar {
display: flex; display: flex;
&:before { &:before {
content: ""; content: "";
display: inline-block; display: inline-block;
@ -11,6 +12,7 @@
position: relative; position: relative;
top: 3px; top: 3px;
} }
&.log { &.log {
&:before { &:before {
background-color: $--color-primary__green; background-color: $--color-primary__green;
@ -44,15 +46,29 @@
} }
.custom-title-4 { .custom-title-4 {
font-size: 1.125rem !important; font-size: 1.25rem !important;
font-weight: 700 !important; font-weight: 700 !important;
line-height: 1.25 !important; line-height: 1.25 !important;
} }
.custom-title-4-new {
font-size: 1.25rem !important;
font-weight: 600 !important;
line-height: 1.25 !important;
}
.custom-title-6 { .custom-title-6 {
font-size: 1.0rem !important; font-size: 1.0rem !important;
font-weight: 700 !important; font-weight: 700 !important;
line-height: 1.25 !important; line-height: 1.25 !important;
} }
.custom-title-7 {
font-size: 0.875rem !important;
font-weight: 400 !important;
line-height: 22px !important;
}
.custom-title-8 { .custom-title-8 {
font-size: 0.75rem !important; font-size: 0.75rem !important;
font-weight: 700 !important; font-weight: 700 !important;
@ -66,15 +82,15 @@
.custom-text-2 { .custom-text-2 {
opacity: 0.6; opacity: 0.6;
font-family: SpoqaHanSansNeo;
font-size: 14px; font-size: 14px;
font-weight: normal;
font-stretch: normal;
font-style: normal;
line-height: 2.17; line-height: 2.17;
letter-spacing: normal; // font-weight: normal;
text-align: right; // font-stretch: normal;
color: #fff; // font-style: normal;
// letter-spacing: normal;
// text-align: right;
// color: #fff;
// font-family: SpoqaHanSansNeo;
} }
.text-color--white-0 { .text-color--white-0 {
@ -94,5 +110,32 @@
.text-color--sub { .text-color--sub {
color: map-deep-get($config, #{$theme}, "text-subcolor"); color: map-deep-get($config, #{$theme}, "text-subcolor");
} }
.h1-title {
font-weight: 600;
font-size: 24px;
line-height: 32px;
letter-spacing: 0;
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;
font-weight: 600 !important;
color: map-deep-get($config, #{$theme}, "card-title-color");
line-height: 24px !important;
} }
} }
}
}

View File

@ -0,0 +1,80 @@
@each $theme in dark, light {
// @include theme($theme);
.v-application.#{$theme}-mode {
.search-box-label {
margin-bottom: 8px;
}
.datepicker-container {
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
border-radius: 6px;
border: solid 1px;
height: 32px;
// border-color: #424242;
border-color: map-deep-get($config, #{$theme}, "tui-datepicker-border-color");
&.datepicker-large {
height: 40px;
}
.v-input {
// ----------------------
&.v-input--is-readonly {
border-color: rgba(0, 0, 0, 0);
flex-grow: 1;
&:not(.v-input--radio-group) {
&:not(.v-input--checkbox) {
::v-deep {
.v-input__slot {
background-color: rgba(0, 0, 0, 0) !important;
fieldset {
border: none;
}
}
}
}
}
}
// -------------------
.v-input__append-outer {
margin-top: 0;
margin-left: 0;
#startpicker-container,
#endpicker-container {
width: 100%;
position: absolute;
top: 36px;
left: 0;
}
}
}
}
.v-input__custom {
flex: 0 0 auto;
&.half {
width: calc(50% - 20px);
}
&.large {
height: 40px;
}
&.datepicker-timeselect {
border: solid 1px map-deep-get($config, #{$theme}, "tui-datepicker-border-color") !important;
}
}
}
}

View File

@ -8,7 +8,7 @@ $--color-gray_C: #cccccc !important;
$--color-gray_9: #95a0a9 !important; $--color-gray_9: #95a0a9 !important;
$--color-gray_7: #767d83 !important; $--color-gray_7: #767d83 !important;
$--color-gray_999: #999 !important; $--color-gray_999: #999 !important;
$--color-gray_555: #555 !important; $--color-gray_555: #555;
$--color-gray_aaa: #aaa !important; $--color-gray_aaa: #aaa !important;
$--color-hover_d: #47535c !important; $--color-hover_d: #47535c !important;
$--color-hover_l: #f0f5fc !important; $--color-hover_l: #f0f5fc !important;
@ -25,96 +25,101 @@ $--theme-color-g7-g9: "";
$--theme-color-g9-g7: ""; $--theme-color-g9-g7: "";
$scrollbar-width: 11px; // 스크롤 바 $scrollbar-width: 11px; // 스크롤 바
$column-spacer: 20px; // 검색 영역 열 간격 $column-spacer: 16px; // 검색 영역 열 간격
$row-spacer: 14px; // 검색 영역 행 간격 $row-spacer: 14px; // 검색 영역 행 간격
$color: ( $color: (
"black": ( "black": ("0": #000,
"0": #000, "1": #111),
"1": #111 "white": ("0": #fff),
), "week": ("sun": #FF4D4F,
"white": ( "sat": #597EF7)
"0": #fff
),
"week": (
"sun": #fb5a83,
"sat": #2d8cf6
)
); );
$config: ( $config: (
dark: ( dark: (w-g5: $--color-white,
w-g5: $--color-white,
g5-w: $--color-gray_555, g5-w: $--color-gray_555,
gc-g9: $--color-gray_C, gc-g9: $--color-gray_C,
g5-gc: $--color-gray_555, g5-gc: $--color-gray_555,
g7-g9: $--color-gray_7, g7-g9: $--color-gray_7,
g9-g7: $--color-gray_9, g9-g7: $--color-gray_9,
pageBackground: #23272b, pageBackground: #23272b,
cardBackground: #242940, cardBackground: #212224,
hover: #47535c, hover: #47535c,
btnClose: #24282c, btnClose: #24282c,
scrollbar-track: #2f334a, scrollbar-track: #2f334a,
scrollbar-thumb: #575b72, scrollbar-thumb: #575b72,
card-default-color: #fff, card-default-color: #FFFFFFA6,
card-title-color: #FFFFFFD9, // #111,
card-subtitle: rgba(255, 255, 255, 0.6), card-subtitle: rgba(255, 255, 255, 0.6),
card-text-info-color: #1668DC,
card-text-title-color: #FFFFFFA6,
activate: #fff, activate: #fff,
non-activate: rgba(255, 255, 255, 0.6), non-activate: rgba(255, 255, 255, 0.6),
text-subcolor: rgba(255, 255, 255, 0.6), text-subcolor: rgba(255, 255, 255, 0.6),
border-color: rgba(255, 255, 255, 0.1), border-color: rgba(255, 255, 255, 0.1),
router-header: #1d2133, router-header: #212224,
router-tab-item: #2d3355, router-container: #141415,
router-tab-item-active: #18579e, container-fluid: #141415,
router-tab-item-color: #fff, router-tab-item: transparent,
router-tab-item-active-color: #fff, router-tab-item-active: transparent,
router-tab-item-icon-color: rgba(255, 255, 255, 0.5), router-tab-item-color: #FFFFFFD9,
router-tab-item-icon-active-color: #fff, router-tab-item-active-color: #1668DC,
router-tab-item-hover-color: #3896ff, router-tab-item-icon-color: #FFFFFFD9,
router-tab-item-icon-active-color: #1668DC,
router-tab-item-hover-color: #1668DC,
router-tab-slot-end-button-backgroundColor: #144985, router-tab-slot-end-button-backgroundColor: #144985,
v-btn-backgroundColor: #144985, v-btn-backgroundColor: #144985,
v-box: #383f5d, v-box: #212224,
v-banner-border-color: rgba(255, 255, 255, 0.1), v-banner-border-color: rgba(255, 255, 255, 0.1),
v-treeview-node-root-backgroundColor: #18579e, v-treeview-node-root-backgroundColor: #212224,
v-treeview-node-root-label-color: #fff, v-treeview-node-root-label-color: #FFFFFFD9,
v-treeview-node-root-label-active-color: #fff, v-treeview-node-root-label-active-color: #FFFFFFD9,
v-treeview-node-root-icon-color: #fff, v-treeview-node-root-icon-color: #FFFFFFD9,
v-treeview-node-root-icon-active-color: #fff, v-treeview-node-root-icon-active-color: #FFFFFFD9,
v-treeview-node-subroot-backgroundColor: #2d3355, // v-treeview-node-subroot-backgroundColor: #FFFFFF0A,
v-treeview-node-subroot-backgroundColor: transparent,
v-treeview-node-label-color: rgba(255, 255, 255, 0.6), v-treeview-node-label-color: rgba(255, 255, 255, 0.6),
v-treeview-node-label-active-color: #fff, v-treeview-node-label-active-color: #1668DC,
v-treeview-leaf-active-backgroundColor: rgba(45, 51, 85, 0.5), v-treeview-leaf-active-backgroundColor: rgba(45, 51, 85, 0.5),
v-treeview-leaf-active-color: #3896ff, v-treeview-leaf-active-color: #3896ff,
v-treeview-icon-color: rgba(255, 255, 255, 0.6), v-treeview-icon-color: rgba(255, 255, 255, 0.6),
v-treeview-icon-active-color: #fff, v-treeview-icon-active-color: #fff,
v-input-backgroundColor: rgba(13, 15, 23, 0.3), v-treeview-node-label-children-color: #fff,
v-input-fieldset-color: rgba(255, 255, 255, 0.32), v-input-backgroundColor: transparent,
v-input-color: rgba(255, 255, 255, 0.25),
v-input-fieldset-color: #424242,
v-input-fieldset-hover-color: rgba(255, 255, 255, 1), v-input-fieldset-hover-color: rgba(255, 255, 255, 1),
v-input-icon-color: #fff, v-input-icon-color: #fff,
v-input-readonly-border-color: rgba(255, 255, 255, 0.3), v-input-readonly-border-color:#424242,
v-input-readonly-backgroundColor: rgba(57, 64, 94, 0.3), v-input-readonly-backgroundColor: rgba(255, 255, 255, 0.08),
v-input-disabled-backgroundColor: rgba(57, 64, 94, 0.3), v-input-disabled-backgroundColor:rgba(255, 255, 255, 0.08),
v-input-disabled-color: rgba(255, 255, 255, 0.2), v-input-disabled-color: rgba(255, 255, 255, 0.5),
v-select-label-color: #fff, v-select-label-color: rgba(255, 255, 255, 0.85),
v-calendar-weekday-backgroundColor: #383f5d, v-calendar-weekday-backgroundColor: #FFFFFF0A,
v-calendar-weekday-color: #fff, v-calendar-weekday-color: #FFFFFFD9,
v-calendar-weekday-border-color: rgba(255, 255, 255, 0.1), v-calendar-weekday-border-color: #FFFFFF0F,
v-calendar-day-color: #fff, v-calendar-day-color: #FFFFFFD9,
v-calendar-day-in-not-month-color: rgba(255, 255, 255, 0.05), v-calendar-day-in-not-month-color: #FFFFFF14,
v-calendar-is-today-background-color: #2d4571, v-calendar-is-today-background-color: #0A224F,
tui-grid-header-backgroundColor: #383f5d, v-calendar-is-sat: #263EA0,
tui-grid-border-horziontal-color: #383f5d, v-calendar-is-sun:#A61D24,
tui-grid-border-vertical-color: rgba(255, 255, 255, 0.1), tui-grid-title-color: #FFFFFFD9,
tui-grid-cell-backgroundColor: #242940, tui-grid-header-backgroundColor: #2a2b2d,
tui-grid-header-color: #FFFFFFD9,
tui-grid-border-horziontal-color: #212224,
tui-grid-border-vertical-color: #FFFFFF0F,
tui-grid-cell-backgroundColor: #212224,
tui-grid-cell-color: #fff, tui-grid-cell-color: #fff,
tui-grid-cell-insert-color: #13636c, tui-grid-cell-insert-color: #13636c,
tui-grid-cell-selected-color: #1a4e87, tui-grid-cell-selected-color: #0A224F,
tui-grid-cell-modify-color: #13636c, tui-grid-cell-modify-color: #13636c,
tui-grid-cell-removed-color: #f6637b, tui-grid-cell-removed-color: #f6637b,
tui-grid-cell-disabled-color: rgb(170, 170, 170), tui-grid-cell-disabled-color: rgb(170, 170, 170),
tui-grid-cell-hover-backgroundColor: #31375b, tui-grid-cell-hover-backgroundColor: #2d4571,
v-tabs-items-border-color: rgba(255, 255, 255, 0.7), v-tabs-items-border-color: #FFFFFF0F,
v-tabs-backgroundColor: rgba(57, 64, 94, 0.5), v-tabs-backgroundColor: rgba(57, 64, 94, 0.5),
v-tabs-active-backgroundColor: #242940, v-tabs-active-backgroundColor: transparent,
v-tabs-active-border-color: rgba(255, 255, 255, 0.7), v-tabs-active-border-color: rgba(255, 255, 255, 0.7),
v-dialog-card-text-color: #fff, v-dialog-card-text-color: #fff,
tui-datepicker-backgroundColor: #0d0f17, tui-datepicker-backgroundColor: #0d0f17,
@ -122,11 +127,55 @@ $config: (
tui-datepicker-selectable-hover-color: #2d3355, tui-datepicker-selectable-hover-color: #2d3355,
tui-datepicker-selected-color: #1a4e87, tui-datepicker-selected-color: #1a4e87,
tui-datepicker-calendar-color: #fff, tui-datepicker-calendar-color: #fff,
tui-editor-contents-color: #111, tui-editor-contents-color: rgba(0, 0, 0, 0.88),
admin-menu-expanded-list-backgroundColor: #144985 tui-grid-cell-borderStyle: solid,
tui-grid-cell-borderColor: #FFFFFF0f,
admin-menu-expanded-list-backgroundColor: #144985,
h1-title: #1668DC,
v-btn-save: transparent,
v-btn-add-text: #212224,
header-backgroud: #131629,
v-btn-header-background: #212224,
v-btn-header-border: #424242,
v-btn-header-text: #fff,
v-icon-orange:#D87A16,
v-icon-blue:#1668DC,
v-btn-excel-dowload-title: #FFFFFFD9,
v-btn-excel-dowload-bg: #00000026,
basic-button-color: #FFFFFFD9,
basic-button-background: #212224,
search-btn-color: #212224,
card-default-backgroundColor: rgba(155, 155, 155, 0),
v-icon-chevron-down: rgba(255, 255, 255, 0.45),
v-icon-search: rgba(255, 255, 255, 0.45),
icon-color: rgba(255, 255, 255, 0.45),
menu-bg-color:rgba(33, 34, 36, 1),
arow-line-btn-bg-color: #111A2C,
arow-line-color: #1668DC,
search-btn-background: #1668DC,
v-btn-color-default: #FFFFFFD9,
v-btn-bg-default: #FFFFFF2E,
v-input-popup-password-border: #424242,
v-input-textarea-border: #424242,
v-input-textarea-bg: #212224,
v-input-textarea-color: #FFFFFFD9,
v-treeview-node-label-active-bg: #111A2C,
v-treeview-node-label-active-border: #1668DC,
v-treeview-leaf-subchildren-backgroundColor: #2a2b2d,
ant-btn-primary-bg: #1668DC,
ant-btn-primary-color: #212224,
ant-btn-danger-bg:#D32029,
ant-btn-danger-border:#D32029,
ant-btn-danger-color:#212224,
ant-btn-default-border:#FFFFFF2E,
ant-btn-default-bg:#FFFFFF2E,
ant-btn-default-color:#FFFFFFD9,
ant-btn-default-border-outlined:#424242,
btn-header-select-bg: #1F1F1F,
btn-header-select-color:#FFFFFFD9,
subtitle-tab: #FFFFFFA6,
), ),
light: ( light: (w-g5: $--color-gray_555,
w-g5: $--color-gray_555,
g5-w: $--color-white, g5-w: $--color-white,
gc-g9: $--color-gray_999, gc-g9: $--color-gray_999,
g5-gc: $--color-gray_C, g5-gc: $--color-gray_C,
@ -137,67 +186,81 @@ $config: (
cardBackground: #fefefe, cardBackground: #fefefe,
hover: #f0f5fc, hover: #f0f5fc,
btnClose: #f1f0f8, btnClose: #f1f0f8,
scrollbar-track: #e9e9e9, scrollbar-track: rgba(0, 0, 0, 0), // #e9e9e9,
scrollbar-thumb: #bbbbbb, scrollbar-thumb: #bbbbbb,
card-default-color: #111, card-default-color: #00000073, // #111,
card-subtitle: #555, card-subtitle: #1677ff,
card-text-info-color: #1677FF,
card-text-title-color: #00000073,
card-title-color: #000000E0, // #111,
activate: #111, activate: #111,
non-activate: #555, non-activate: #555,
text-subcolor: #999, text-subcolor: #999,
border-color: #ddd, border-color: #ddd,
router-header: #fff, router-header: #fff,
router-tab-item: #e1e7f3, router-container: #f8f8f8,
router-tab-item-active: #4777d9, container-fluid: #f8f8f8,
router-tab-item-color: #111, router-tab-item: #fff,
router-tab-item-active-color: #fff, router-tab-item-active: #fff,
router-tab-item-icon-color: #838aa6, router-tab-item-color: #000000E0,
router-tab-item-icon-active-color: #fff, router-tab-item-active-color: #1677ff,
router-tab-item-hover-color: #366dbe, router-tab-item-icon-color: #000000E0,
router-tab-item-icon-active-color: #1677ff,
router-tab-item-hover-color: #1677ff,
router-tab-slot-end-button-backgroundColor: #3f4d7d, router-tab-slot-end-button-backgroundColor: #3f4d7d,
v-btn-backgroundColor: #4777d9, v-btn-backgroundColor: #1677ff,
v-box: #f0f3fa, // v-btn-backgroundColor: #fff,
v-box: #FFFFFF,
v-banner-border-color: #ddd, v-banner-border-color: #ddd,
v-treeview-node-root-backgroundColor: #4777d9, v-treeview-node-root-backgroundColor: #FFFFFF,
v-treeview-node-root-label-color: #111, v-treeview-node-root-label-color: #000000E0,
v-treeview-node-root-label-active-color: #fff, v-treeview-node-root-label-active-color: #000000E0,
v-treeview-node-root-icon-color: #555, v-treeview-node-root-icon-color: #000000E0,
v-treeview-node-root-icon-active-color: #fff, v-treeview-node-root-icon-active-color: #000000E0,
v-treeview-node-subroot-backgroundColor: #e1e7f3, // v-treeview-node-subroot-backgroundColor: #00000005,
v-treeview-node-subroot-backgroundColor: transparent,
v-treeview-node-label-color: #555, v-treeview-node-label-color: #555,
v-treeview-node-label-active-color: #111, v-treeview-node-label-active-color: #002C8C,
v-treeview-node-label-children-color: #616885,
v-treeview-leaf-active-backgroundColor: #edf1f7, v-treeview-leaf-active-backgroundColor: #edf1f7,
v-treeview-leaf-active-color: #366dbe, v-treeview-leaf-active-color: #366dbe,
v-treeview-icon-color: #a4aac3, v-treeview-icon-color: #a4aac3,
v-treeview-icon-active-color: #616885, v-treeview-icon-active-color: #616885,
v-input-backgroundColor: #ffffff, v-input-backgroundColor: #ffffff,
v-input-fieldset-color: #b4b8c9, v-input-color: rgba(0, 0, 0, 0.25),
v-input-fieldset-hover-color: #b4b8c9, v-input-fieldset-color: #d9d9d9,
v-input-icon-color: #555, v-input-fieldset-hover-color: #1890ff,
v-input-readonly-border-color: #b4b8c9, v-input-icon-color: #d9d9d9,
v-input-readonly-backgroundColor: #f5f5f5, v-input-readonly-border-color: #424242,
v-input-disabled-backgroundColor: #eee, v-input-readonly-backgroundColor: rgba(0, 0, 0, 0.04),
v-input-disabled-color: #bbb, v-input-disabled-backgroundColor: rgba(0, 0, 0, 0.04),
v-select-label-color: #111, v-input-disabled-color: rgba(0, 0, 0, 0.25),
v-calendar-weekday-backgroundColor: #e0e0e0, v-select-label-color: rgba(0, 0, 0, 0.88),
v-calendar-weekday-color: #111, v-calendar-weekday-backgroundColor: #00000005,
v-calendar-weekday-border-color: #d4d4d4, v-calendar-weekday-color: #000000E0,
v-calendar-day-color: #111, v-calendar-weekday-border-color: #0000000F,
v-calendar-day-in-not-month-color: #f8f8f8, v-calendar-day-color: #000000E0,
v-calendar-is-today-background-color: #e3eaf3, v-calendar-day-in-not-month-color: #0000000A,
tui-grid-header-backgroundColor: #e0e0e0, 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-horziontal-color: #e0e0e0,
tui-grid-border-vertical-color: #d4d4d4, tui-grid-border-vertical-color: rgba(0, 0, 0, 0.06), //#d4d4d4,
tui-grid-cell-backgroundColor: #fff, tui-grid-cell-backgroundColor: #fff,
tui-grid-cell-color: #555, tui-grid-cell-color: #000000E0,
tui-grid-cell-insert-color: #13636c, tui-grid-cell-insert-color: #13636c,
tui-grid-cell-selected-color: #ecf2fa, tui-grid-cell-selected-color: #E6F4FF,
tui-grid-cell-modify-color: #e6f5f7, tui-grid-cell-modify-color: #e6f5f7,
tui-grid-cell-removed-color: #fddde1, tui-grid-cell-removed-color: #fddde1,
tui-grid-cell-hover-backgroundColor: #f5f5f5, tui-grid-cell-hover-backgroundColor: #f5f5f5,
v-tabs-items-border-color: #989db1, v-tabs-items-border-color: #0000000F,
v-tabs-backgroundColor: #ddd, v-tabs-backgroundColor: #ddd,
v-tabs-active-backgroundColor: #fff, v-tabs-active-backgroundColor: rgba(0, 0, 0, 0), // #fff,
v-tabs-active-border-color: #989db1, v-tabs-active-border-color: #1677FF,
v-tabs-hover-color: #1677FF,
v-dialog-card-text-color: #111, v-dialog-card-text-color: #111,
tui-datepicker-backgroundColor: #fff, tui-datepicker-backgroundColor: #fff,
tui-datepicker-border-color: #b4b8c9, tui-datepicker-border-color: #b4b8c9,
@ -205,6 +268,49 @@ $config: (
tui-datepicker-selected-color: #4777d9, tui-datepicker-selected-color: #4777d9,
tui-datepicker-calendar-color: #111, tui-datepicker-calendar-color: #111,
tui-editor-contents-color: #111, tui-editor-contents-color: #111,
admin-menu-expanded-list-backgroundColor: #3f4d7d tui-grid-cell-borderStyle: solid,
) tui-grid-cell-borderColor: #0000000F,
admin-menu-expanded-list-backgroundColor: #3f4d7d,
h1-title: #002C8C,
header-backgroud: #F0F5FF,
v-btn-header-background: #FFF,
v-btn-header-border: #D9D9D9,
v-btn-header-text: #000000,
v-icon-orange:#FA8C16,
v-icon-blue:#1677FF,
v-btn-excel-dowload-title: #000000E0,
v-btn-excel-dowload-bg: #00000026,
basic-button-color: #000000E0,
basic-button-background: #FFFFFF,
search-btn-color: #ffffff,
card-default-backgroundColor: rgba(155, 155, 155, 0),
v-icon-chevron-down:rgba(0, 0, 0, 0.45),
v-icon-search:rgba(0, 0, 0, 0.45),
icon-color: rgba(0, 0, 0, 0.45),
menu-bg-color: #fff,
arow-line-btn-bg-color: #E6F4FF,
arow-line-color: #1677FF,
search-btn-background: #1677FF,
v-btn-bg-default: #00000026,
v-btn-color-default: #000000E0,
v-input-popup-password-border: #D9D9D9,
v-input-textarea-border: #D9D9D9,
v-input-textarea-bg: #FFFFFF,
v-input-textarea-color: #000000E0,
v-treeview-node-label-active-bg: #E6F4FF,
v-treeview-node-label-active-border: #1677FF,
v-treeview-leaf-subchildren-backgroundColor: #fafafa,
ant-btn-primary-bg: #1677FF,
ant-btn-primary-color: #FFF,
ant-btn-danger-bg:#FFF,
ant-btn-danger-border:#F5222D,
ant-btn-danger-color:#F5222D,
ant-btn-default-border:#00000026,
ant-btn-default-bg:#00000026,
ant-btn-default-color:#000000E0,
ant-btn-default-border-outlined:#D9D9D9,
btn-header-select-color:#1F1F1F,
btn-header-select-bg:#FFFFFF,
subtitle-tab: #000000A6,
),
); );

BIN
assets/scss/var.zip Normal file

Binary file not shown.

View File

@ -21,8 +21,8 @@ $material-light: (
$treeview-node-padding: 10px; $treeview-node-padding: 10px;
$treeview-node-height: 40px; $treeview-node-height: 40px;
$banner-start-padding: 10px; $banner-start-padding: 0px;
$banner-end-padding: 10px; $banner-end-padding: 0px;
$banner-y-padding: 12px; $banner-y-padding: 12px;
$card-border-radius: 10px; $card-border-radius: 10px;
@ -33,12 +33,12 @@ $card-subtitle-padding: 20px;
$timeline-dot-small-size: 10px; $timeline-dot-small-size: 10px;
$data-table-regular-row-height: 36px; $data-table-regular-row-height: 32px;
$input-font-size: 14px; $input-font-size: 14px;
$input-max-height: 36px; $input-max-height: 32px;
$text-field-filled-full-width-outlined-slot-min-height: 36px; $text-field-filled-full-width-outlined-slot-min-height: 32px;
$text-field-solo-control-min-height: 36px; $text-field-solo-control-min-height: 32px;
$text-field-line-height: 1.285; $text-field-line-height: 1.285;
$text-field-enclosed-prepend-append-margin-top: 0; $text-field-enclosed-prepend-append-margin-top: 0;
$text-field-enclosed-details-padding: 0 8px; $text-field-enclosed-details-padding: 0 8px;
@ -50,7 +50,7 @@ $tabs-item-padding: 12px;
$list-border-radius: 4px; $list-border-radius: 4px;
$list-padding: 0; $list-padding: 0;
$list-item-min-height: 36px; $list-item-min-height: 32px;
$list-item-padding: 0; $list-item-padding: 0;
$list-item-title-font-size: 0.875rem; // 14px; $list-item-title-font-size: 0.875rem; // 14px;
$list-item-content-padding: 10px 7px; $list-item-content-padding: 10px 7px;

View File

@ -170,7 +170,7 @@ export default {
}; };
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.btn-pager { .btn-pager {
margin: 4px; margin: 4px;
input { input {
@ -200,9 +200,9 @@ export default {
// .grey--text { // .grey--text {
// margin-left: 16px; // margin-left: 16px;
// } // }
.mr-4 { // .mr-4 {
margin-left: 14px; // margin-left: 14px;
} // }
.v-btn__content { .v-btn__content {
color: #ffffff; color: #ffffff;
} }

View File

@ -1,19 +1,23 @@
<template> <template>
<v-menu offset-y nudge-bottom="8" :left="true"> <v-menu offset-y nudge-bottom="8" :right="true">
<template v-slot:activator="{ on, attrs }"> <template v-slot:activator="{ on, attrs }">
<v-btn <v-btn
v-bind="attrs" v-bind="attrs"
v-on="on" v-on="on"
depressed
:ripple="false"
:class="{ miniVariant }" :class="{ miniVariant }"
:style="btnStyle" icon
fab
small
> >
<v-icon size="32" :class="{ 'mr-2': !miniVariant }" <!-- depressed
:ripple="false" -->
<!-- :style="btnStyle" -->
<v-icon size="32" color="#fff"
>$icoAdminMenu</v-icon >$icoAdminMenu</v-icon
> >
<span class="body-1 mr-1">{{ userNm }}</span> <!-- <span class="body-1 mr-1">{{ userNm }}</span> -->
<v-icon>mdi-chevron-down</v-icon> <!-- <v-icon>mdi-chevron-down</v-icon> -->
</v-btn> </v-btn>
<!-- <AlertPopup <!-- <AlertPopup
ref="alertPop" ref="alertPop"
@ -23,7 +27,7 @@
/> --> /> -->
</template> </template>
<v-list class="pa-2"> <v-list class="pa-2 btn-close-menu-list" >
<!-- <v-list-item class="mb-1">--> <!-- <v-list-item class="mb-1">-->
<!-- <div class="d-flex align-center">--> <!-- <div class="d-flex align-center">-->
<!-- <v-avatar class="mr-1" size="20">--> <!-- <v-avatar class="mr-1" size="20">-->
@ -155,12 +159,15 @@ export default {
min-width: auto !important; min-width: auto !important;
display: flex; display: flex;
align-items: center; align-items: center;
padding: 0 20px !important; padding: 0 !important;
margin-bottom: 12px; // margin-bottom: 12px;
&, &,
&:before { &:before {
background-color: transparent !important; // background-color: transparent !important;
}
&.v-btn--fab{
height: auto;
} }
::v-deep { ::v-deep {

View File

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

View File

@ -59,7 +59,6 @@ export default {
computed: { computed: {
...mapState({ ...mapState({
isDarkMode: 'isDarkMode', isDarkMode: 'isDarkMode',
chartOption(state) { chartOption(state) {
var dark_Col = [ var dark_Col = [
'#01AE6A', '#01AE6A',
@ -352,21 +351,25 @@ export default {
tmpChrtOp.color = light_Col; tmpChrtOp.color = light_Col;
} }
} }
// console.log('ops11:',tmpChrtOp)
return tmpChrtOp; return tmpChrtOp;
}, },
}), }),
}, },
created() {
// console.log('wd data:',this.widgetData)
},
methods: { methods: {
onClick(event, instance, ECharts) { onClick(event, instance, ECharts) {
console.log('onClick : ', event); // console.log('onClick : ', event);
this.$emit('click', event); this.$emit('click', event);
}, },
onDblClick(event, instance, ECharts) { onDblClick(event, instance, ECharts) {
console.log('onDblClick : ', event); // console.log('onDblClick : ', event);
this.$emit('dblclick', event); this.$emit('dblclick', event);
}, },
onRightClick(event, instance, ECharts) { onRightClick(event, instance, ECharts) {
console.log('onRightClick : ', event); // console.log('onRightClick : ', event);
this.$emit('rclick', event); this.$emit('rclick', event);
}, },
onLegendSelect(params) { onLegendSelect(params) {

View File

@ -2,20 +2,24 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small :color="required ? '#fb8200' : 'primary'" class="mr-1" <v-icon
>mdi-record-circle</v-icon v-if="iconShow"
small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
> >
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? textCols : ''"> <v-col :cols="label ? textCols : ''">
<v-checkbox <v-checkbox
v-model="chkValue" v-model="chkValue"
:disabled="disabledFlag" :disabled="disabledFlag"
:readonly="readonly || false" :readonly="readonly || false"
:required="required || false" :required="required || false"
:false-value="false" :false-value="false"
:color="isDarkMode ? '#fff' : '#4777d9'" :color="isDarkMode ? '#fff' : '#1890ff'"
@change="modifyValue" @change="modifyValue"
></v-checkbox> ></v-checkbox>
</v-col> </v-col>
@ -23,7 +27,7 @@
</template> </template>
<script> <script>
import { mapState, mapMutations } from 'vuex'; import { mapState, mapMutations } from "vuex";
export default { export default {
props: { props: {
parentPrgmId: { parentPrgmId: {
@ -63,6 +67,11 @@ export default {
require: false, require: false,
default: 7, default: 7,
}, },
iconShow: {
type: Boolean,
require: false,
default: true
},
}, },
data() { data() {
return { return {
@ -74,7 +83,7 @@ export default {
computed: { computed: {
...mapState({ ...mapState({
searchParam: state => state.pageData, searchParam: (state) => state.pageData,
myBindingDara(state) { myBindingDara(state) {
return state.pageData[this.parentPrgmId][this.valueNm]; return state.pageData[this.parentPrgmId][this.valueNm];
}, },
@ -92,7 +101,7 @@ export default {
this.chkValue = this.searchParam[this.parentPrgmId][this.valueNm]; this.chkValue = this.searchParam[this.parentPrgmId][this.valueNm];
}, },
methods: { methods: {
...mapMutations({ setPageData: 'setPageData' }), ...mapMutations({ setPageData: "setPageData" }),
modifyValue(e) { modifyValue(e) {
return this.setPageData({ [this.valueNm]: e }); return this.setPageData({ [this.valueNm]: e });
}, },

View File

@ -17,7 +17,6 @@
:false-value="false" :false-value="false"
:color="isDarkMode ? '#fff' : '#4777d9'" :color="isDarkMode ? '#fff' : '#4777d9'"
@change="modifyValue" @change="modifyValue"
></v-checkbox> ></v-checkbox>
</v-col> </v-col>
<v-col v-if="location == 'rear'" :cols="labelCols"> <v-col v-if="location == 'rear'" :cols="labelCols">
@ -32,7 +31,7 @@
</template> </template>
<script> <script>
import { mapState, mapMutations } from 'vuex'; import { mapState, mapMutations } from "vuex";
export default { export default {
props: { props: {
parentPrgmId: { parentPrgmId: {
@ -80,12 +79,12 @@ export default {
location: { location: {
type: String, type: String,
require: false, require: false,
default: 'front' default: "front",
}, },
disabledCheckOption: { disabledCheckOption: {
type: String, type: String,
require: false require: false,
} },
}, },
data() { data() {
return { return {
@ -97,7 +96,7 @@ export default {
computed: { computed: {
...mapState({ ...mapState({
searchParam: state => state.pageData, searchParam: (state) => state.pageData,
myBindingData(state) { myBindingData(state) {
return state.pageData[this.parentPrgmId][this.valueNm]; return state.pageData[this.parentPrgmId][this.valueNm];
}, },
@ -105,8 +104,7 @@ export default {
if (state.pageData[this.parentPrgmId][this.disabledCheckOption] != undefined) { if (state.pageData[this.parentPrgmId][this.disabledCheckOption] != undefined) {
return state.pageData[this.parentPrgmId][this.disabledCheckOption]; return state.pageData[this.parentPrgmId][this.disabledCheckOption];
} }
},
}
}), }),
}, },
watch: { watch: {
@ -118,25 +116,24 @@ export default {
}, },
bindingDisabledCheckOption(val) { bindingDisabledCheckOption(val) {
this.disabledFlag = val; this.disabledFlag = val;
} },
}, },
created() { created() {
this.chkValue = this.searchParam[this.parentPrgmId][this.valueNm]; this.chkValue = this.searchParam[this.parentPrgmId][this.valueNm];
if (this.searchParam[this.parentPrgmId][this.disabledCheckOption] != undefined) { if (this.searchParam[this.parentPrgmId][this.disabledCheckOption] != undefined) {
this.disabledFlag = this.searchParam[this.parentPrgmId][this.disabledCheckOption] this.disabledFlag = this.searchParam[this.parentPrgmId][this.disabledCheckOption];
} }
}, },
methods: { methods: {
...mapMutations({ setPageData: 'setPageData' }), ...mapMutations({ setPageData: "setPageData" }),
modifyValue(e) { modifyValue(e) {
if (this.disabledFlag == true && e.target != undefined) { if (this.disabledFlag == true && e.target != undefined) {
alert('기간이 한 시간 이내일 경우만 선택할 수 있습니다.') alert("기간이 한 시간 이내일 경우만 선택할 수 있습니다.");
} else { } else {
if (e.target == undefined) { if (e.target == undefined) {
return this.setPageData({ [this.valueNm]: e }); return this.setPageData({ [this.valueNm]: e });
} }
} }
}, },
}, },
}; };

View File

@ -0,0 +1,84 @@
<template>
<v-chart class="chart" :option="option" autoresize style="width: 400px; height: 300px;" />
</template>
<script>
import { use } from 'echarts/core';
import { CanvasRenderer } from 'echarts/renderers';
import { PieChart } from 'echarts/charts';
import {
TitleComponent,
TooltipComponent,
LegendComponent,
} from 'echarts/components';
import VChart, { THEME_KEY } from 'vue-echarts';
import { ref } from 'vue';
import { defineComponent } from '@vue/composition-api';
use([
CanvasRenderer,
PieChart,
TitleComponent,
TooltipComponent,
LegendComponent,
]);
export default defineComponent({
name: 'ColumnChart',
components: {
VChart,
},
provide: {
[THEME_KEY]: 'dark',
},
setup() {
const option = ref({
title: {
text: 'Traffic Sources',
left: 'center',
},
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)',
},
legend: {
orient: 'vertical',
left: 'left',
data: ['Direct', 'Email', 'Ad Networks', 'Video Ads', 'Search Engines'],
},
series: [
{
name: 'Traffic Sources',
type: 'pie',
radius: '55%',
center: ['50%', '60%'],
data: [
{ value: 335, name: 'Direct' },
{ value: 310, name: 'Email' },
{ value: 234, name: 'Ad Networks' },
{ value: 135, name: 'Video Ads' },
{ value: 1548, name: 'Search Engines' },
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)',
},
},
},
],
});
return { option };
},
});
</script>
<style scoped>
.chart {
height: 100vh;
}
</style>

View File

@ -2,14 +2,14 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small :color="required ? '#fb8200' : 'primary'" class="mr-1" <v-icon v-if="iconShow" small color="primary"
>mdi-record-circle</v-icon :class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
> >$icoBulletPoint</v-icon>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? textCols : ''"> <v-col :cols="label ? textCols : ''">
<div class="datepicker-container"> <div :class="['datepicker-container', customClass]" >
<v-text-field <v-text-field
id="startpicker" id="startpicker"
ref="startpicker" ref="startpicker"
@ -20,13 +20,15 @@
outlined outlined
> >
<template #append > <template #append >
<v-icon size="20">$icoCalendar</v-icon> <v-icon size="20" v-show="!isRange">$icoCalendar</v-icon>
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="startpicker-container" id="startpicker-container"></div> <div ref="startpicker-container" id="startpicker-container"></div>
</template> </template>
</v-text-field> </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-text-field
v-show="isRange" v-show="isRange"
id="endpicker" id="endpicker"
@ -70,23 +72,33 @@ export default {
labelCols: { labelCols: {
type: Number, type: Number,
require: false, require: false,
default: 4, default: 12,
}, },
textCols: { textCols: {
type: Number, type: Number,
require: false, require: false,
default: 8, default: 12,
}, },
required: { required: {
type: Boolean, type: Boolean,
require: false, require: false,
default: false, default: false,
}, },
iconShow: {
type: Boolean,
require: false,
default: true,
},
isRangeOption:{ isRangeOption:{
type:Boolean, type:Boolean,
require:false, require:false,
default: true default: true
} },
customClass: {
type: String,
require: false,
},
}, },
data() { data() {
return { return {
@ -103,6 +115,7 @@ export default {
searchParam(state) { searchParam(state) {
return state.pageData[this.parentPrgmId]; return state.pageData[this.parentPrgmId];
}, },
isDarkMode: "isDarkMode",
}), }),
myCmCycle() { myCmCycle() {
return this.searchParam.cmCycle; return this.searchParam.cmCycle;
@ -194,6 +207,12 @@ export default {
this.defaultRange === 'no limite' this.defaultRange === 'no limite'
); );
}, },
arrowIcon() {
if(this.isDarkMode){
return require('@/assets/images/arrow_datepicker_dm.png');
}
return require('@/assets/images/arrow_datepicker.png');
}
}, },
watch: { watch: {
myCmCycle() { myCmCycle() {
@ -259,8 +278,10 @@ export default {
}, },
mounted() { mounted() {
const startContainer = document.getElementById('startpicker-container'); const startContainer = document.getElementById('startpicker-container');
// const startContainer = document.getElementById('datepicker-container');
const startTarget = document.getElementById('startpicker'); const startTarget = document.getElementById('startpicker');
const endContainer = document.getElementById('endpicker-container'); const endContainer = document.getElementById('endpicker-container');
// const endContainer = document.getElementById('datepicker-container');
const endTarget = document.getElementById('endpicker'); const endTarget = document.getElementById('endpicker');
// datepicker 생성 // datepicker 생성
@ -304,6 +325,10 @@ export default {
}, },
methods: { methods: {
...mapMutations({ setPageData: 'setPageData' }), ...mapMutations({ setPageData: 'setPageData' }),
onOpenDatepicker() {
this.startDatepickerInstance.open();
this.endDatepickerInstance.open();
},
getStartDt() { getStartDt() {
const dt = this.startDatepickerInstance.getDate(); const dt = this.startDatepickerInstance.getDate();
this.setPageData({ this.setPageData({
@ -401,34 +426,8 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.datepicker-container { @import "@/assets/scss/datepicker.scss";
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
.v-input {
.v-input__append-outer {
margin-top: 0;
margin-left: 0;
#startpicker-container,
#endpicker-container {
width: 100%;
position: absolute;
top: 36px;
left: 0;
}
}
}
}
.v-input__custom {
flex: 0 0 auto;
&.half {
width: calc(50% - 20px);
}
}
::v-deep { ::v-deep {
.tui-timepicker-row { .tui-timepicker-row {
display: flex; display: flex;

View File

@ -2,8 +2,11 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small :color="required ? '#fb8200' : 'primary'" class="mr-1" <v-icon
>mdi-record-circle</v-icon v-if="iconShow"
small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
> >
{{ label }} {{ label }}
</label> </label>
@ -14,41 +17,72 @@
id="startpicker" id="startpicker"
ref="startpicker" ref="startpicker"
v-model="fromDtValue" v-model="fromDtValue"
:class="(isRange && !selectBoxTimeItemList.selectTimeValue1) ? 'v-input__custom half' : 'v-input__custom'" :class="
isRange && !selectBoxTimeItemList.selectTimeValue1
? 'v-input__custom half large datepicker-timeselect'
: 'v-input__custom large datepicker-timeselect'
"
style="border-radius: 8px; width: 170px"
:hide-details="true" :hide-details="true"
readonly readonly
outlined outlined
> >
<template #append> <!-- dark theme border #424242 -->
<!-- <template #append>
<v-icon size="20">$icoCalendar</v-icon> <v-icon size="20">$icoCalendar</v-icon>
</template> -->
<template v-slot:append>
<a-icon class="v-icon" type="calendar" style="width: 14px; height: 14px" />
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="startpicker-container" id="startpicker-container"></div> <div ref="startpicker-container" id="startpicker-container"></div>
</template> </template>
</v-text-field> </v-text-field>
<component <component
class="mx-2"
v-if="selectBoxTimeItemList.selectTimeValue1" v-if="selectBoxTimeItemList.selectTimeValue1"
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
:is="'SelectBoxTime'" :is="'SelectBoxTime'"
ref="SelectBox1" ref="SelectBox1"
:propsValue="selectTimeValue1" :propsValue="selectTimeValue1"
:itemList="selectTimeValueList1" :itemList="selectTimeValueList1"
:minInterval="selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1" :minInterval="
selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1
"
@update:propsValue="selectTimeValue1 = $event" @update:propsValue="selectTimeValue1 = $event"
/> />
<div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }">~</div> <!-- <div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }">~</div> -->
<a-icon
v-show="isRange"
type="arrow-right"
class="mx-3 v-icon"
style="width: 14px; height: 40px; line-height: 0"
/>
<v-text-field <v-text-field
class="mx-2"
v-show="isRange" v-show="isRange"
id="endpicker" id="endpicker"
ref="endpicker" ref="endpicker"
v-model="toDtValue" v-model="toDtValue"
:class="(isRange && !selectBoxTimeItemList.selectTimeValue2) ? 'v-input__custom half' : 'v-input__custom'" :class="
isRange && !selectBoxTimeItemList.selectTimeValue2
? 'v-input__custom half large datepicker-timeselect'
: 'v-input__custom large datepicker-timeselect'
"
style="border-radius: 8px; width: 170px"
:hide-details="true" :hide-details="true"
readonly readonly
outlined outlined
> >
<template #append> <!-- <template #append>
<v-icon size="20">$icoCalendar</v-icon> <v-icon size="20">$icoCalendar</v-icon>
</template> -->
<template v-slot:append>
<a-icon class="v-icon" type="calendar" style="width: 14px; height: 14px" />
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="endpicker-container" id="endpicker-container"></div> <div ref="endpicker-container" id="endpicker-container"></div>
@ -61,7 +95,9 @@
ref="SelectBox2" ref="SelectBox2"
:propsValue="selectTimeValue2" :propsValue="selectTimeValue2"
:itemList="selectTimeValueList2" :itemList="selectTimeValueList2"
:minInterval="selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1" :minInterval="
selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1
"
@update:propsValue="selectTimeValue2 = $event" @update:propsValue="selectTimeValue2 = $event"
/> />
</div> </div>
@ -69,11 +105,11 @@
</v-row> </v-row>
</template> </template>
<script> <script>
import { mapState, mapMutations } from 'vuex'; import { mapState, mapMutations } from "vuex";
import TuiDatepicker from 'tui-date-picker'; import TuiDatepicker from "tui-date-picker";
import Utility from '~/plugins/utility'; import Utility from "~/plugins/utility";
import SelectBoxTime from '@/components/common/select/SelectBoxTime'; import SelectBoxTime from "@/components/common/select/SelectBoxTime";
import DateUtility from '~/plugins/dateUtility' import DateUtility from "~/plugins/dateUtility";
export default { export default {
props: { props: {
parentPrgmId: { parentPrgmId: {
@ -99,6 +135,11 @@ export default {
require: false, require: false,
default: 8, default: 8,
}, },
iconShow: {
type: Boolean,
require: false,
default: false,
},
required: { required: {
type: Boolean, type: Boolean,
require: false, require: false,
@ -107,29 +148,28 @@ export default {
isRangeOption: { isRangeOption: {
type: Boolean, type: Boolean,
require: false, require: false,
default: true default: true,
}, },
selectBoxTimeItemList: { selectBoxTimeItemList: {
type: Object, type: Object,
require: false, require: false,
default: () => { default: () => {
return {}; return {};
} },
}, },
selectFromDtUntilTodayFg: { selectFromDtUntilTodayFg: {
type: Boolean, type: Boolean,
require: false, require: false,
default: false default: false,
}, },
selectToDtUntilTodayFg: { selectToDtUntilTodayFg: {
type: Boolean, type: Boolean,
require: false, require: false,
default: false default: false,
}, },
}, },
components: { components: {
SelectBoxTime SelectBoxTime,
}, },
data() { data() {
return { return {
@ -141,10 +181,22 @@ export default {
fromDtOldVal: null, fromDtOldVal: null,
toDtOldVal: null, toDtOldVal: null,
cmCycleFlag: false, cmCycleFlag: false,
selectTimeValue1: this.selectBoxTimeItemList.selectTimeValue1 != undefined ? this.selectBoxTimeItemList.selectTimeValue1 : null, // selectBoxTime에 필요한 prop selectTimeValue1:
selectTimeValueList1: this.selectBoxTimeItemList.selectTimeValueList1 != undefined ? this.selectBoxTimeItemList.selectTimeValueList1 : [], // selectBoxTime에 필요한 prop this.selectBoxTimeItemList.selectTimeValue1 != undefined
selectTimeValue2: this.selectBoxTimeItemList.selectTimeValue2 != undefined ? this.selectBoxTimeItemList.selectTimeValue2 : null, // selectBoxTime에 필요한 prop ? this.selectBoxTimeItemList.selectTimeValue1
selectTimeValueList2: this.selectBoxTimeItemList.selectTimeValueList2 != undefined ? this.selectBoxTimeItemList.selectTimeValueList2 : [], // selectBoxTime에 필요한 prop : 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: { computed: {
@ -159,39 +211,39 @@ export default {
myOptions() { myOptions() {
let returnObj = {}; let returnObj = {};
switch (this.myCmCycle) { switch (this.myCmCycle) {
case 'CYC_YEAR': case "CYC_YEAR":
returnObj = { returnObj = {
type: 'year', type: "year",
viewFormat: 'YYYY', viewFormat: "YYYY",
pickerFormat: 'YYYY', pickerFormat: "YYYY",
sendFormat: 'YYYY', sendFormat: "YYYY",
}; };
break; break;
case 'CYC_MONTH': case "CYC_MONTH":
returnObj = { returnObj = {
type: 'month', type: "month",
viewFormat: 'YYYY-MM', viewFormat: "YYYY-MM",
pickerFormat: 'YYYY-MM', pickerFormat: "YYYY-MM",
sendFormat: 'YYYYMM', sendFormat: "YYYYMM",
}; };
break; break;
case 'CYC_DAY': case "CYC_DAY":
returnObj = { returnObj = {
type: 'date', type: "date",
viewFormat: 'YYYY-MM-DD', viewFormat: "YYYY-MM-DD",
pickerFormat: 'yyyy-MM-dd', pickerFormat: "yyyy-MM-dd",
sendFormat: 'YYYYMMDD', sendFormat: "YYYYMMDD",
}; };
break; break;
case 'CYC_HOUR': case "CYC_HOUR":
returnObj = { returnObj = {
type: 'date', type: "date",
viewFormat: 'YYYY-MM-DD' + (this.timePicker ? ' HH:mm:ss' : ''), viewFormat: "YYYY-MM-DD" + (this.timePicker ? " HH:mm:ss" : ""),
pickerFormat: 'yyyy-MM-dd' + (this.timePicker ? ' HH:mm A' : ''), pickerFormat: "yyyy-MM-dd" + (this.timePicker ? " HH:mm A" : ""),
sendFormat: this.timePicker ? 'YYYY-MM-DD HH:mm:ss' : 'YYYYMMDD', sendFormat: this.timePicker ? "YYYY-MM-DD HH:mm:ss" : "YYYYMMDD",
}; };
// returnObj = { type: "day", format: "YYYY-MM-DD HH:mm:ss" }; // returnObj = { type: "day", format: "YYYY-MM-DD HH:mm:ss" };
break; break;
@ -207,13 +259,13 @@ export default {
fromDtValue(val) { fromDtValue(val) {
let selectVal = Utility.setFormatDate( let selectVal = Utility.setFormatDate(
this.searchParam.fromDt, this.searchParam.fromDt,
this.myOptions.viewFormat, this.myOptions.viewFormat
); );
if (this.selectFromDtUntilTodayFg) { if (this.selectFromDtUntilTodayFg) {
let today = Utility.setFormatDate(new Date(), "YYYY-MM-DD"); let today = Utility.setFormatDate(new Date(), "YYYY-MM-DD");
let dayDiff = DateUtility.diff(selectVal,today,'days'); let dayDiff = DateUtility.diff(selectVal, today, "days");
if (dayDiff < 0) { if (dayDiff < 0) {
alert('오늘 날짜까지 검색이 가능합니다.'); alert("오늘 날짜까지 검색이 가능합니다.");
selectVal = today; selectVal = today;
if (this.fromDtOldVal == today) { if (this.fromDtOldVal == today) {
this.toDtValueChkRang(selectVal); this.toDtValueChkRang(selectVal);
@ -234,20 +286,19 @@ export default {
toDtValue() { toDtValue() {
let selectVal = Utility.setFormatDate( let selectVal = Utility.setFormatDate(
this.searchParam.toDt, this.searchParam.toDt,
this.myOptions.viewFormat, this.myOptions.viewFormat
); );
if (this.selectToDtUntilTodayFg) { if (this.selectToDtUntilTodayFg) {
let today = Utility.setFormatDate(new Date(), "YYYY-MM-DD"); let today = Utility.setFormatDate(new Date(), "YYYY-MM-DD");
let dayDiff = DateUtility.diff(selectVal,today,'days'); let dayDiff = DateUtility.diff(selectVal, today, "days");
if (dayDiff < 0) { if (dayDiff < 0) {
alert('오늘 날짜까지 검색이 가능합니다.'); alert("오늘 날짜까지 검색이 가능합니다.");
selectVal = today; selectVal = today;
if (this.toDtOldVal == today) { if (this.toDtOldVal == today) {
this.fromDtValueChkRang(selectVal); this.fromDtValueChkRang(selectVal);
this.endDatepickerInstance.setDate(new Date(selectVal)); this.endDatepickerInstance.setDate(new Date(selectVal));
} }
} }
} }
if (this.toDtOldVal == null) { if (this.toDtOldVal == null) {
this.toDtOldVal = selectVal; this.toDtOldVal = selectVal;
@ -266,7 +317,7 @@ export default {
isRange() { isRange() {
return ( return (
(this.defaultRange !== null && this.defaultRange > 0 && this.isRangeOption) || (this.defaultRange !== null && this.defaultRange > 0 && this.isRangeOption) ||
this.defaultRange === 'no limite' this.defaultRange === "no limite"
); );
}, },
}, },
@ -291,15 +342,15 @@ export default {
fromDtValue(newVal, oldVal) { fromDtValue(newVal, oldVal) {
if ( if (
this.isRange && this.isRange &&
this.defaultRange !== 'no limite' && this.defaultRange !== "no limite" &&
newVal !== 'Invalid Date' && newVal !== "Invalid Date" &&
newVal !== oldVal newVal !== oldVal
) { ) {
this.toDtValueChkRang(newVal); this.toDtValueChkRang(newVal);
this.startDatepickerInstance.setDate(new Date(newVal)); this.startDatepickerInstance.setDate(new Date(newVal));
this.fromDtOldVal = newVal; this.fromDtOldVal = newVal;
this.setSelectTimeValue1(this.selectTimeValue2, 'check'); this.setSelectTimeValue1(this.selectTimeValue2, "check");
this.setSelectTimeValue2(this.selectTimeValue1, 'check'); this.setSelectTimeValue2(this.selectTimeValue1, "check");
} else { } else {
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
} }
@ -307,36 +358,36 @@ export default {
toDtValue(newVal, oldVal) { toDtValue(newVal, oldVal) {
if ( if (
this.isRange && this.isRange &&
this.defaultRange !== 'no limite' && this.defaultRange !== "no limite" &&
newVal !== 'Invalid Date' && newVal !== "Invalid Date" &&
newVal !== oldVal newVal !== oldVal
) { ) {
this.fromDtValueChkRang(newVal); this.fromDtValueChkRang(newVal);
this.endDatepickerInstance.setDate(new Date(newVal)); this.endDatepickerInstance.setDate(new Date(newVal));
this.toDtOldVal = newVal; this.toDtOldVal = newVal;
this.setSelectTimeValue1(this.selectTimeValue2, 'check'); this.setSelectTimeValue1(this.selectTimeValue2, "check");
this.setSelectTimeValue2(this.selectTimeValue1, 'check'); this.setSelectTimeValue2(this.selectTimeValue1, "check");
} }
}, },
}, },
created() { created() {
if (this.timePicker) { if (this.timePicker) {
this.setPageData({ this.setPageData({
fromDt: Utility.setFormatDate(this.today, 'YYYY-MM-DD') + ' 00:00:00', fromDt: Utility.setFormatDate(this.today, "YYYY-MM-DD") + " 00:00:00",
toDt: Utility.setFormatDate(this.today, 'YYYY-MM-DD') + ' 23:59:59', toDt: Utility.setFormatDate(this.today, "YYYY-MM-DD") + " 23:59:59",
}); });
} }
}, },
mounted() { mounted() {
const startContainer = document.getElementById('startpicker-container'); const startContainer = document.getElementById("startpicker-container");
const startTarget = document.getElementById('startpicker'); const startTarget = document.getElementById("startpicker");
const endContainer = document.getElementById('endpicker-container'); const endContainer = document.getElementById("endpicker-container");
const endTarget = document.getElementById('endpicker'); const endTarget = document.getElementById("endpicker");
// datepicker 생성 // datepicker 생성
this.startDatepickerInstance = new TuiDatepicker(startContainer, { this.startDatepickerInstance = new TuiDatepicker(startContainer, {
date: this.today, date: this.today,
language: 'ko', language: "ko",
type: this.myOptions.type, // "date", // type: date || month || year type: this.myOptions.type, // "date", // type: date || month || year
input: { input: {
element: startTarget, element: startTarget,
@ -350,7 +401,7 @@ export default {
// datepicker 생성 // datepicker 생성
this.endDatepickerInstance = new TuiDatepicker(endContainer, { this.endDatepickerInstance = new TuiDatepicker(endContainer, {
date: this.today, date: this.today,
language: 'ko', language: "ko",
type: this.myOptions.type, // "date", // type: date || month || year type: this.myOptions.type, // "date", // type: date || month || year
input: { input: {
element: endTarget, element: endTarget,
@ -368,12 +419,12 @@ export default {
// datepicker 초기값 생성 끝 // datepicker 초기값 생성 끝
// datepicker 변경시 이벤트 추가 // datepicker 변경시 이벤트 추가
this.startDatepickerInstance.on('change', () => this.getStartDt()); this.startDatepickerInstance.on("change", () => this.getStartDt());
this.endDatepickerInstance.on('change', () => this.getEndDt()); this.endDatepickerInstance.on("change", () => this.getEndDt());
// datepicker 이벤트는 mount 될때 추가 해주어야 한다. // datepicker 이벤트는 mount 될때 추가 해주어야 한다.
}, },
methods: { methods: {
...mapMutations({ setPageData: 'setPageData' }), ...mapMutations({ setPageData: "setPageData" }),
getStartDt() { getStartDt() {
const dt = this.startDatepickerInstance.getDate(); const dt = this.startDatepickerInstance.getDate();
this.setPageData({ this.setPageData({
@ -389,10 +440,7 @@ export default {
fromDtValueChkRang(newDt) { fromDtValueChkRang(newDt) {
const defaultDt = this.$dayjs(this.fromDtValue); const defaultDt = this.$dayjs(this.fromDtValue);
const compareDt = this.$dayjs(newDt); const compareDt = this.$dayjs(newDt);
const newDefault = Utility.setNewDefaultRange( const newDefault = Utility.setNewDefaultRange(this.myCmCycle, this.defaultRange);
this.myCmCycle,
this.defaultRange,
);
const myRange = newDefault.range; const myRange = newDefault.range;
const rangeKey = newDefault.key; const rangeKey = newDefault.key;
const rangeGap = compareDt.diff(defaultDt, rangeKey); const rangeGap = compareDt.diff(defaultDt, rangeKey);
@ -411,7 +459,7 @@ export default {
fromDt: Utility.setBeforetDate( fromDt: Utility.setBeforetDate(
this.searchParam, this.searchParam,
compareDt, compareDt,
this.myOptions.sendFormat, this.myOptions.sendFormat
), ),
}); });
} }
@ -419,10 +467,7 @@ export default {
toDtValueChkRang(newDt) { toDtValueChkRang(newDt) {
const defaultDt = this.$dayjs(this.toDtValue); const defaultDt = this.$dayjs(this.toDtValue);
const compareDt = this.$dayjs(newDt); const compareDt = this.$dayjs(newDt);
const newDefault = Utility.setNewDefaultRange( const newDefault = Utility.setNewDefaultRange(this.myCmCycle, this.defaultRange);
this.myCmCycle,
this.defaultRange,
);
const myRange = newDefault.range; const myRange = newDefault.range;
const rangeKey = newDefault.key; const rangeKey = newDefault.key;
const rangeGap = defaultDt.diff(compareDt, rangeKey); const rangeGap = defaultDt.diff(compareDt, rangeKey);
@ -438,80 +483,62 @@ export default {
toDt: Utility.setAftertDate( toDt: Utility.setAftertDate(
this.searchParam, this.searchParam,
compareDt, compareDt,
this.myOptions.sendFormat, this.myOptions.sendFormat
), ),
}); });
} }
}, },
setSelectTimeValue2(val, type='default'){ setSelectTimeValue2(val, type = "default") {
this.setPageData({ selectTimeValue1: val }); this.setPageData({ selectTimeValue1: val });
let toDt = this.toDtOldVal; let toDt = this.toDtOldVal;
let fromDt = this.fromDtOldVal; let fromDt = this.fromDtOldVal;
let dayDiff = DateUtility.diff(fromDt,toDt,'days'); let dayDiff = DateUtility.diff(fromDt, toDt, "days");
let selectTimeValueList2 = this.selectTimeValueList2.map(item => { let selectTimeValueList2 = this.selectTimeValueList2.map((item) => {
return item.value; return item.value;
}); });
if(dayDiff <= 0 && selectTimeValueList2.indexOf(this.selectTimeValue2) < selectTimeValueList2.indexOf(val)){ if (
dayDiff <= 0 &&
selectTimeValueList2.indexOf(this.selectTimeValue2) <
selectTimeValueList2.indexOf(val)
) {
// this.selectTimeValue2 = selectTimeValueList2[selectTimeValueList2.indexOf(val)]; // this.selectTimeValue2 = selectTimeValueList2[selectTimeValueList2.indexOf(val)];
this.selectTimeValue2 = val; this.selectTimeValue2 = val;
this.setPageData({ selectTimeValue2: val }); this.setPageData({ selectTimeValue2: val });
} else { } else {
if(type=='default'){ if (type == "default") {
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
} }
} }
}, },
setSelectTimeValue1(val, type='default'){ setSelectTimeValue1(val, type = "default") {
this.setPageData({ selectTimeValue2: val }); this.setPageData({ selectTimeValue2: val });
let toDt = this.toDtOldVal; let toDt = this.toDtOldVal;
let fromDt = this.fromDtOldVal; let fromDt = this.fromDtOldVal;
let dayDiff = DateUtility.diff(fromDt,toDt,'days'); let dayDiff = DateUtility.diff(fromDt, toDt, "days");
let selectTimeValueList2 = this.selectTimeValueList2.map(item => { let selectTimeValueList2 = this.selectTimeValueList2.map((item) => {
return item.value; return item.value;
}); });
if(dayDiff <= 0 && selectTimeValueList2.indexOf(val) < selectTimeValueList2.indexOf(this.selectTimeValue1)){ if (
dayDiff <= 0 &&
selectTimeValueList2.indexOf(val) <
selectTimeValueList2.indexOf(this.selectTimeValue1)
) {
// this.selectTimeValue1 = selectTimeValueList2[selectTimeValueList2.indexOf(val)]; // this.selectTimeValue1 = selectTimeValueList2[selectTimeValueList2.indexOf(val)];
this.selectTimeValue1 = val; this.selectTimeValue1 = val;
// this.selectTimeValue1 = this.selectTimeValueList2[selectTimeValueList2.indexOf(val) + 1] // this.selectTimeValue1 = this.selectTimeValueList2[selectTimeValueList2.indexOf(val) + 1]
this.setPageData({ selectTimeValue1: val }); this.setPageData({ selectTimeValue1: val });
} else { } else {
if(type=='default'){ if (type == "default") {
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
} }
} }
} },
}, },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.datepicker-container { @import "@/assets/scss/datepicker.scss";
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
.v-input {
.v-input__append-outer {
margin-top: 0;
margin-left: 0;
#startpicker-container,
#endpicker-container {
width: 100%;
position: absolute;
top: 36px;
left: 0;
}
}
}
}
.v-input__custom {
flex: 0 0 auto;
&.half {
width: calc(50% - 20px);
}
}
::v-deep { ::v-deep {
.tui-timepicker-row { .tui-timepicker-row {
display: flex; display: flex;

View File

@ -2,9 +2,15 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small :color="required ? '#fb8200' : 'primary'" class="mr-1" <!-- <v-icon x-small :color="required ? '#fb8200' : 'primary'" class="mr-1"
>mdi-record-circle</v-icon >mdi-record-circle</v-icon
> -->
<v-icon
small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
> >
$icoBulletPoint
</v-icon>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
@ -20,13 +26,16 @@
outlined outlined
> >
<template #append > <template #append >
<v-icon size="20">$icoCalendar</v-icon> <v-icon size="20" v-show="!isRange">$icoCalendar</v-icon>
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="startpicker-container" id="startpicker-container"></div> <div ref="startpicker-container" id="startpicker-container"></div>
</template> </template>
</v-text-field> </v-text-field>
<div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }">~</div> <!-- <div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }">~</div> -->
<div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }">
<img :src="arrowIcon" alt="">
</div>
<v-text-field <v-text-field
v-show="isRange" v-show="isRange"
id="endpicker" id="endpicker"
@ -104,6 +113,7 @@ export default {
return state.pageData[this.parentPrgmId]; return state.pageData[this.parentPrgmId];
}, },
}), }),
isDarkMode: "isDarkMode",
myCmCycle() { myCmCycle() {
return this.searchParam.cmCycle; return this.searchParam.cmCycle;
}, },
@ -194,6 +204,12 @@ export default {
this.defaultRange === 'no limite' this.defaultRange === 'no limite'
); );
}, },
arrowIcon() {
if(this.isDarkMode){
return require('@/assets/images/arrow_datepicker_dm.png');
}
return require('@/assets/images/arrow_datepicker.png');
}
}, },
watch: { watch: {
myCmCycle() { myCmCycle() {
@ -401,34 +417,8 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.datepicker-container { @import "@/assets/scss/datepicker.scss";
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
.v-input {
.v-input__append-outer {
margin-top: 0;
margin-left: 0;
#startpicker-container,
#endpicker-container {
width: 100%;
position: absolute;
top: -260px;
left: 0;
}
}
}
}
.v-input__custom {
flex: 0 0 auto;
&.half {
width: calc(50% - 20px);
}
}
::v-deep { ::v-deep {
.tui-timepicker-row { .tui-timepicker-row {
display: flex; display: flex;

View File

@ -355,34 +355,8 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.datepicker-container { @import "@/assets/scss/datepicker.scss";
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
.v-input {
.v-input__append-outer {
margin-top: 0;
margin-left: 0;
#startpicker-container,
#endpicker-container {
width: 100%;
position: absolute;
top: 36px;
left: 0;
}
}
}
}
.v-input__custom {
flex: 0 0 auto;
&.half {
width: calc(50% - 20px);
}
}
::v-deep { ::v-deep {
.tui-timepicker-row { .tui-timepicker-row {
display: flex; display: flex;

View File

@ -4,12 +4,13 @@
:data="chkGridData" :data="chkGridData"
:columns="chkGridColumns" :columns="chkGridColumns"
:options="chkGridOptions" :options="chkGridOptions"
@focusChange="focusChangeEvt" @mousedown="onMousedown"
@click="startEditing" @click="startEditing"
@editingFinish="editingFinish" @editingFinish="editingFinish"
@dblclick="dblClick" @dblclick="dblClick"
@mouseover="mouseoverEvent" @mouseover="mouseoverEvent"
@mouseout="mouseoutEvent" @mouseout="mouseoutEvent"
@focusChange="focusChangeEvt"
/> />
</template> </template>
<script> <script>
@ -183,13 +184,13 @@ export default {
}), }),
// true : 현재 행 혹은 연결된 그리드가 수정중인 상태 // true : 현재 행 혹은 연결된 그리드가 수정중인 상태
checkGridState() { checkGridState() {
var rowStatList = ['I', 'U', 'D']; const rowStatList = ['I', 'U', 'D'];
var row = this.gridInstance.invoke('getFocusedCell'); const row = this.gridInstance.invoke('getFocusedCell');
if (row) { if (row) {
var rowData = this.gridInstance.invoke('getRow', row.rowKey); const rowData = this.gridInstance.invoke('getRow', row.rowKey);
if (rowData) { if (rowData) {
var rowStat = rowData['rowStat']; const rowStat = rowData['rowStat'];
if (rowStatList.includes(rowStat)) { if (rowStatList.includes(rowStat)) {
return true; return true;
} }
@ -197,8 +198,8 @@ export default {
} }
if (this.preventFocusChangeEventTargetGridList) { if (this.preventFocusChangeEventTargetGridList) {
for (var gridInstance of this.preventFocusChangeEventTargetGridList) { for (let gridInstance of this.preventFocusChangeEventTargetGridList) {
var dataArr = gridInstance.save(); const dataArr = gridInstance.save();
if (dataArr.length > 0) { if (dataArr.length > 0) {
return true; return true;
@ -250,9 +251,11 @@ export default {
this.gridInstance.invoke('check', rowData.rowKey, instance); this.gridInstance.invoke('check', rowData.rowKey, instance);
}, },
setSelectionRange(rowKey) { setSelectionRange(rowKey) {
// console.log("------------------DEBUG-------setSelectionRange:", rowKey);
const rowDatas = this.gridInstance.invoke('getData'); const rowDatas = this.gridInstance.invoke('getData');
rowDatas.forEach(item => { rowDatas.forEach(item => {
if (item.rowKey == rowKey) { if (item.rowKey == rowKey) {
// console.log("------------------DEBUG-------setSelectionRange---item:", item);
this.gridInstance.invoke( this.gridInstance.invoke(
'addRowClassName', 'addRowClassName',
item.rowKey, item.rowKey,
@ -267,7 +270,12 @@ export default {
} }
}); });
}, },
onMousedown(evt) {
// console.log("------------------DEBUG-------onMousedown:", evt);
this.focusChangeEvt(evt);
},
focusChangeEvt(e) { focusChangeEvt(e) {
// console.log("------------------DEBUG-------focusChangeEvt:", e);
// console.log('focusChangeEvt1...') // console.log('focusChangeEvt1...')
if (this.preventFocusChangeEvent(e)) { if (this.preventFocusChangeEvent(e)) {
// console.log('prevent focusChangeEvt') // console.log('prevent focusChangeEvt')
@ -288,6 +296,7 @@ export default {
this.sendSelectedRowData(e.rowKey); this.sendSelectedRowData(e.rowKey);
}, },
startEditing(e) { startEditing(e) {
// console.log("------------------DEBUG-------startEditing:", e);
// console.log('startEditing1...') // console.log('startEditing1...')
if (this.preventFocusChangeEvent(e)) { if (this.preventFocusChangeEvent(e)) {
// console.log('prevent startEditing') // console.log('prevent startEditing')
@ -314,6 +323,7 @@ export default {
} }
}, },
async editingFinish(e) { async editingFinish(e) {
// console.log('------------------DEBUG-------editingFinish:', e);
// console.log("Editing END E::", e); // console.log("Editing END E::", e);
// editor 간 이동시 수정되는 문제 수정 // editor 간 이동시 수정되는 문제 수정
// e.rowEditingFg: grid의 한 row를 한번에 수정할 시 각각의 cell 마다 click 이벤트가 발생하지 않아 this.editorStartKey값이 제대로 입력 되지 않는 경우를 대비하여 만든 Fg // e.rowEditingFg: grid의 한 row를 한번에 수정할 시 각각의 cell 마다 click 이벤트가 발생하지 않아 this.editorStartKey값이 제대로 입력 되지 않는 경우를 대비하여 만든 Fg
@ -675,6 +685,7 @@ export default {
? this.gridInstance.invoke('getFocusedCell').rowKey ? this.gridInstance.invoke('getFocusedCell').rowKey
: eventRowKey; : eventRowKey;
var rowData = this.gridInstance.invoke('getRow', rowKey); var rowData = this.gridInstance.invoke('getRow', rowKey);
// console.log('------------------DEBUG-------sendSelectedRowData:', {eventRowKey, rowKey});
this.$emit('sendSelectedRowStatInfo', rowData); this.$emit('sendSelectedRowStatInfo', rowData);
} }
}, },

View File

@ -0,0 +1,47 @@
<template>
<client-only>
<VChart
:option="chartOption"
ref="chart"
style="width:400px; height:300px;"
/>
</client-only>
</template>
<script>
// import Echarts from 'vue-echarts';
// import 'echarts'
export default {
// name: 'Vchart',
// components: {
// 'v-charts': Echarts,
// },
data() {
return {
chartOption: {
series: [
{
type: 'gauge',
progress: {
show:true
},
detail: {
valueAnimation: true,
formatter: '{value}%'
},
data:[{
value: 65,
name: 'Progress'
}]
}
]
},
};
},
created() {
console.log('test chart:')
},
};
</script>

View File

@ -0,0 +1,27 @@
<template>
<h1 class="h1-title">
<v-avatar size="12" :style="{ backgroundColor: 'currentColor' }"></v-avatar>
{{ text ? text : menuNm}}
</h1>
</template>
<script>
import { mapState } from 'vuex';
export default {
name: "PageTitle",
props: {
text: {
type: String,
required: false,
},
},
computed: {
...mapState({
menuNm: state => state.activeMenuInfo.menuNm,
}),
}
};
</script>
<style scoped></style>

View File

@ -2,7 +2,9 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon 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 }}
</label> </label>
</v-col> </v-col>
@ -18,13 +20,15 @@
outlined outlined
> >
<template #append > <template #append >
<v-icon size="20">$icoCalendar</v-icon> <v-icon size="20" v-show="!isRange">$icoCalendar</v-icon>
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="startpicker-container" id="startpicker-container"></div> <div ref="startpicker-container" id="startpicker-container"></div>
</template> </template>
</v-text-field> </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-text-field
v-show="isRange" v-show="isRange"
id="endpicker" id="endpicker"
@ -129,6 +133,12 @@ export default {
this.defaultRange === 'no limite' this.defaultRange === 'no limite'
); );
}, },
arrowIcon() {
if(this.isDarkMode){
return require('@/assets/images/arrow_datepicker_dm.png');
}
return require('@/assets/images/arrow_datepicker.png');
}
}, },
watch: { watch: {
myCmCycle() { myCmCycle() {
@ -313,34 +323,8 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.datepicker-container { @import "@/assets/scss/datepicker.scss";
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
.v-input {
.v-input__append-outer {
margin-top: 0;
margin-left: 0;
#startpicker-container,
#endpicker-container {
width: 100%;
position: absolute;
top: 36px;
left: 0;
}
}
}
}
.v-input__custom {
flex: 0 0 auto;
&.half {
width: calc(50% - 20px);
}
}
::v-deep { ::v-deep {
.tui-timepicker-row { .tui-timepicker-row {
display: flex; display: flex;

View File

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

View File

@ -1,9 +1,12 @@
<template> <template>
<div class="d-flex flex-column justify-center align-center"> <div class="d-flex flex-column justify-center align-center">
<v-btn icon tile :ripple="false" @click="btnActionsFnc('addLeftToRight')"> <!--<v-btn icon tile :ripple="false" @click="btnActionsFnc('addLeftToRight')">
<v-icon>mdi-chevron-right</v-icon> <v-icon>mdi-chevron-right</v-icon>
</v-btn> </v-btn> -->
<v-btn <a-button @click="btnActionsFnc('addLeftToRight')" type="primary" ghost icon="right" >
</a-button>
<!--<v-btn
icon icon
tile tile
:ripple="false" :ripple="false"
@ -11,7 +14,9 @@
@click="btnActionsFnc('removeRightToLeft')" @click="btnActionsFnc('removeRightToLeft')"
> >
<v-icon>mdi-chevron-left</v-icon> <v-icon>mdi-chevron-left</v-icon>
</v-btn> </v-btn> -->
<a-button class="mt-2" @click="btnActionsFnc('removeRightToLeft')" type="primary" ghost icon="left">
</a-button>
</div> </div>
</template> </template>
<script> <script>

View File

@ -1,6 +1,11 @@
<template> <template>
<v-btn :ripple="false" @click="btnActionsFnc('add')">추가</v-btn> <!-- <v-btn :ripple="false" @click="btnActionsFnc('add')">추가</v-btn> -->
<a-button type="primary" @click="btnActionsFnc('add')" class="v-btn-add-text" icon="plus">
추가
</a-button>
</template> </template>
<style>
</style>
<script> <script>
export default { export default {
props: { props: {

View File

@ -1,5 +1,14 @@
<template> <template>
<v-btn :ripple="false" @click="downloadExcelFile">액셀</v-btn> <!--<v-btn :ripple="false" @click="downloadExcelFile">액셀</v-btn>-->
<a-button
@click="downloadExcelFile"
v-bind="$attrs"
type="default"
class="btn-default"
icon="file-excel"
:size="size"
>액셀</a-button>
</template> </template>
<script> <script>
@ -33,6 +42,11 @@ export default {
require: false, require: false,
default: null, default: null,
}, },
size: {
type: String,
require: false,
default: "default", // small, middle, large
}
}, },
data() { data() {
return { return {
@ -134,3 +148,5 @@ export default {
}, },
}; };
</script> </script>
<style scoped lang="scss">
</style>

View File

@ -1,9 +1,10 @@
<template> <template>
<div id="btnExeclUpload"> <div id="btnExeclUpload">
<v-btn class="v-btn__round v-btn__excel" @click="uploadExcelFile"> <!-- <v-btn class="v-btn__round v-btn__excel" @click="uploadExcelFile">
<v-icon>mdi-file-excel</v-icon> <v-icon>mdi-file-excel</v-icon>
엑셀 로드 엑셀 로드
</v-btn> </v-btn> -->
<a-button class="v-btn__round v-btn__excel" type="default" @click="uploadExcelFile">엑셀 로드</a-button>
</div> </div>
</template> </template>

View File

@ -1,5 +1,6 @@
<template> <template>
<v-btn :ripple="false" @click="btnActionsFnc('remove')">삭제</v-btn> <!--<v-btn :ripple="false" @click="btnActionsFnc('remove')">삭제</v-btn>-->
<a-button type="danger" @click="btnActionsFnc('remove')" ghost danger icon="delete">삭제</a-button>
</template> </template>
<script> <script>
export default { export default {

View File

@ -1,5 +1,14 @@
<template> <template>
<v-btn :ripple="false" @click="btnActionsFnc('save')">저장</v-btn> <!--<v-btn :ripple="false" @click="btnActionsFnc('save')">저장</v-btn>-->
<!-- style="color: #1890ff; border-color: #1890ff" -->
<a-button
type="default"
class="btn-default"
@click="btnActionsFnc('save')"
icon="save"
>
저장</a-button
>
</template> </template>
<script> <script>
export default { export default {

View File

@ -1,10 +1,18 @@
<template> <template>
<v-btn :ripple="false" @click="getSearch('prev')">조회</v-btn> <a-button icon="search" type="primary" @click="getSearch('prev')" class="search-button" :size="size">조회</a-button>
</template> </template>
<script> <script>
import { mapMutations } from 'vuex'; import { mapMutations } from 'vuex';
export default { export default {
props: {
size: {
type: String,
require: false,
default: "middle", // small, middle, large
}
},
methods: { methods: {
...mapMutations({ setPageData: 'setPageData' }), ...mapMutations({ setPageData: 'setPageData' }),
getSearch() { getSearch() {
@ -14,4 +22,6 @@ export default {
}; };
</script> </script>
<style scoped lang="scss" scoped></style> <style scoped lang="scss">
</style>

View File

@ -1,5 +1,7 @@
<template> <template>
<v-btn :ripple="false" @click="setTotal()">전체</v-btn> <!-- <v-btn :ripple="false" @click="setTotal()">전체</v-btn> -->
<a-button type="default" @click="setTotal()">전체</a-button>
</template> </template>
<script> <script>
import { mapMutations } from 'vuex'; import { mapMutations } from 'vuex';

View File

@ -1,22 +1,22 @@
<template> <template>
<div> <div class="d-flex" style="gap:8px">
<component <component
:is="buttonAuth.add ? 'BtnAddRow' : null" :is="buttonAuth.add ? 'BtnAddRow' : null"
:btnActionsFnc="btnActionsFnc" :btnActionsFnc="btnActionsFnc"
/> />
<component
:is="buttonAuth.remove ? 'BtnRemoveRow' : null"
:btnActionsFnc="btnActionsFnc"
/>
<component
:is="buttonAuth.save ? 'BtnSave' : null"
:btnActionsFnc="btnActionsFnc"
/>
<component <component
:is="buttonAuth.excel ? 'BtnExcelDownload' : null" :is="buttonAuth.excel ? 'BtnExcelDownload' : null"
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
:gridName="bindingData" :gridName="bindingData"
/> />
<component
:is="buttonAuth.save ? 'BtnSave' : null"
:btnActionsFnc="btnActionsFnc"
/>
<component
:is="buttonAuth.remove ? 'BtnRemoveRow' : null"
:btnActionsFnc="btnActionsFnc"
/>
</div> </div>
</template> </template>
<script> <script>

View File

@ -0,0 +1,34 @@
<template>
<div class="custom-card">
<a-card
:class="['themed-card', cardClass]"
:title="title"
bordered
ref="cardRef"
@click="$emit('click')"
>
<slot />
</a-card>
</div>
</template>
<script>
export default {
name: 'AntCard',
props: {
title: {
type: String,
default: ''
},
cardClass: {
type: [String, Array, Object],
default: ''
}
}
}
</script>
<style scoped>
.custom-card {
border-top: 4px solid #1890ff;
border-radius: 4px;
}
</style>

View File

@ -0,0 +1,143 @@
// Gauge chart options
export default function getGaugeChartOption({ title, min = 0, max = 160, unit = '%', isDarkMode = false, backgroundRadius = 97 }) {
const colorRanges = isDarkMode
? [
[0.375, '#49AA19'], // Dark Green
// [0.5, '#B8860B'], // Dark Yellow
[0.625, '#D89614'], // Dark Orange
[1, '#D32029'], // Dark Red
]
: [
[0.375, '#52C41A'], // Light Green
// [0.5, '#FFD700'], // Light Yellow
[0.625, '#FAAD14'], // Light Orange
[1, '#F5222D'], // Light Red
];
// Old color range
// const gaugeColors = [
// [0, "#ed1c24"],
// [0.6, "#ed1c24"],
// [0.8, "#f7931e"],
// [1.0, "#009245"],
// ];
// const gaugeColors2 = [
// [0, "#009245"],
// [0.6, "#009245"],
// [0.8, "#f7931e"],
// [1.0, "#ed1c24"],
// ];
return {
grid: {
// top: '-10%',
bottom: 0,
},
title: {},
graphic: [
{
type: "circle",
left: "center",
top: "center",
shape: {
r: backgroundRadius, // radius of the background circle
},
style: {
fill: isDarkMode ? "#141415" : "#F5F5F5", // Light grey color
opacity: 0.3, // Semi-transparent
},
z: 0, // make sure it's behind the gauge
},
],
series: [
{
type: "gauge",
radius: "90%",
startAngle: 225,
endAngle: -45,
min: min,
max: max,
// progress: {
// show: true,
// width: 15,
// },
axisLine: {
lineStyle: {
width: 12,
// color: [
// [0.375, "#3CB371"], // Green (060)
// [0.5, "#FFD700"], // Yellow (6080)
// [0.625, "#FFA500"], // Orange (80100)
// [1, "#FF4500"], // Red (100160)
// ],
color: colorRanges
},
},
axisTick: {
distance: -12,
length: 5,
lineStyle: {
color: "#000000",
width: 1,
},
},
splitLine: {
distance: -12,
length: 8,
lineStyle: {
color: "#000000",
width: 2,
},
},
axisLabel: {
color: isDarkMode ? "#fff" : "#333333",
distance: 23,
fontSize: 9,
},
pointer: {
show: true,
length: "70%",
width: 6,
itemStyle: {
color: "#FA8C16", // Set your desired pointer color here
},
},
title: {
show: false,
offsetCenter: [0, "40%"],
fontSize: 18,
},
detail: {
valueAnimation: true,
fontWeight: 500, // or "normal", "lighter", "bolder", or a number like 600
fontFamily: "Oxanium, sans-serif", // or any custom font
fontSize: 30,
lineHeight: 25,
offsetCenter: [0, "60%"],
color: isDarkMode ? "#fff" : "#333333",
formatter: function (value) {
return `{valueStyle|${value}}\n{percentStyle|${unit}}`;
},
rich: {
// valueStyle: {
// fontSize: 25,
// fontWeight: "bold",
// },
percentStyle: {
fontSize: 10,
color: isDarkMode ? "#fff" : "#333333",
// fontWeight: "normal",
},
},
},
data: [
{
value: 16,
name: "에너지사용효율", // "Energy Usage Efficiency"
},
],
},
],
};
}

View File

@ -0,0 +1,79 @@
export default function getLineChartOption({
xAxisData = [],
seriesData = [],
// legendData = [],
isDarkMode = false,
}) {
// const defaultColors = isDarkMode
// ? ['#D32029', '#31B47B', '#D89614'] : ['#F5222D', '#31B47B', '#FAAD14'];
const defaultColors = isDarkMode
? ['#31B47B', '#D89614', '#D32029'] : ['#31B47B', '#FAAD14', '#F5222D'];
const styledSeries = seriesData.map((item, index) => {
const color = item.color || defaultColors[index % defaultColors.length];
return {
...item,
showSymbol: true, // Show symbol at each data point
itemStyle: {
color,
},
};
});
return {
grid: {
left: '3%',
right: '5%',
top: '25%',
bottom: '0%',
containLabel: true,
},
legend: {
// data: legendData,
icon: 'circle',
top: '0%',
right: '5%',
orient: 'horizontal',
textStyle: {
color: isDarkMode ? 'white' : '#676A7B',
},
},
xAxis: {
type: 'category',
boundaryGap: false,
splitLine: {
show: false,
},
data: xAxisData,
axisLine: {
lineStyle: {
color: isDarkMode ? '#AAAAAA' : '#333333',
},
},
axisLabel: {
color: isDarkMode ? '#676A7B' : '#676A7B',
},
},
yAxis: {
type: 'value',
position: 'left',
axisLine: {
lineStyle: {
color: isDarkMode ? '#AAAAAA' : '#333333',
},
},
axisLabel: {
color: isDarkMode ? '#676A7B' : '#676A7B',
},
splitLine: {
lineStyle: {
color: isDarkMode ? '#444444' : '#EEEEEE',
},
},
},
series: styledSeries,
};
}

View File

@ -0,0 +1,119 @@
<template>
<v-row class="search-box" 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
>
{{ 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' : '#4777d9'"
@change="modifyValue"
></v-checkbox> -->
<a-checkbox
v-model:checked="chkValue"
:disabled="disabledFlag"
:readonly="readonly || false"
:required="required || false"
@change="modifyValue"
>
</a-checkbox>
</v-col>
</v-row>
</template>
<script>
import { mapState, mapMutations } from "vuex";
export default {
props: {
parentPrgmId: {
type: String,
require: true,
},
label: {
type: String,
require: true,
},
isDarkMode: {
type: Boolean,
require: false,
default: false,
},
required: {
type: Boolean,
require: false,
default: false,
},
readonly: {
type: Boolean,
require: false,
default: false,
},
valueNm: {
type: String,
require: true,
},
labelCols: {
type: Number,
require: false,
default: 4,
},
textCols: {
type: Number,
require: false,
default: 7,
},
iconShow: {
type: Boolean,
require: false,
default: true
},
},
data() {
return {
chkValue: false,
testData: false,
disabledFlag: false,
};
},
computed: {
...mapState({
searchParam: (state) => state.pageData,
myBindingDara(state) {
return state.pageData[this.parentPrgmId][this.valueNm];
},
}),
},
watch: {
myBindingDara: {
deep: true,
handler(val) {
this.chkValue = val;
},
},
},
created() {
this.chkValue = this.searchParam[this.parentPrgmId][this.valueNm];
},
methods: {
...mapMutations({ setPageData: "setPageData" }),
modifyValue(e) {
return this.setPageData({ [this.valueNm]: e });
},
},
};
</script>
<style></style>

View File

@ -0,0 +1,146 @@
<template>
<v-row class="search-box" align="center" no-gutters>
<v-col v-if="location == 'front'" :cols="labelCols">
<label for="" class="search-box-label">
<v-icon v-if="icon" x-small :color="required ? '#fb8200' : 'primary'" class="mr-1"
>mdi-record-circle</v-icon
>
{{ label }}
</label>
</v-col>
<v-col :cols="textCols" @click="modifyValue">
<v-checkbox
v-model="chkValue"
:disabled="disabledFlag"
:readonly="readonly || false"
:required="required || false"
:false-value="false"
@change="modifyValue"
:class="isDarkMode ? 'checkbox-dark' : 'checkbox-light'"
></v-checkbox>
</v-col>
<v-col
style="margin-left: 5px; margin-top: 5px"
v-if="location == 'rear'"
:cols="labelCols"
>
<label for="" class="search-box-label">
<v-icon v-if="icon" x-small :color="required ? '#fb8200' : 'primary'" class="mr-1"
>mdi-record-circle</v-icon
>
{{ label }}
</label>
</v-col>
</v-row>
</template>
<script>
import { mapState, mapMutations } from "vuex";
export default {
props: {
parentPrgmId: {
type: String,
require: true,
},
label: {
type: String,
require: false,
},
isDarkMode: {
type: Boolean,
require: false,
default: false,
},
required: {
type: Boolean,
require: false,
default: false,
},
readonly: {
type: Boolean,
require: false,
default: false,
},
valueNm: {
type: String,
require: true,
},
labelCols: {
type: Number,
require: false,
default: 4,
},
textCols: {
type: Number,
require: false,
default: 7,
},
icon: {
type: Boolean,
require: false,
default: true,
},
location: {
type: String,
require: false,
default: "front",
},
disabledCheckOption: {
type: String,
require: false,
},
},
data() {
return {
chkValue: false,
testData: false,
disabledFlag: false,
};
},
computed: {
...mapState({
searchParam: (state) => state.pageData,
myBindingData(state) {
return state.pageData[this.parentPrgmId][this.valueNm];
},
bindingDisabledCheckOption(state) {
if (state.pageData[this.parentPrgmId][this.disabledCheckOption] != undefined) {
return state.pageData[this.parentPrgmId][this.disabledCheckOption];
}
},
}),
},
watch: {
myBindingData: {
deep: true,
handler(val) {
this.chkValue = val;
},
},
bindingDisabledCheckOption(val) {
this.disabledFlag = val;
},
},
created() {
this.chkValue = this.searchParam[this.parentPrgmId][this.valueNm];
if (this.searchParam[this.parentPrgmId][this.disabledCheckOption] != undefined) {
this.disabledFlag = this.searchParam[this.parentPrgmId][this.disabledCheckOption];
}
},
methods: {
...mapMutations({ setPageData: "setPageData" }),
modifyValue(e) {
if (this.disabledFlag == true && e.target != undefined) {
alert("기간이 한 시간 이내일 경우만 선택할 수 있습니다.");
} else {
if (e.target == undefined) {
return this.setPageData({ [this.valueNm]: e });
}
}
},
},
};
</script>
<style></style>

View File

@ -1,12 +1,12 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" >
<v-col v-if="item.label" cols="4" > <v-col v-if="item.label" cols="4" >
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon
x-small v-if="item.iconShow"
:color="item.required ? '#fb8200' : 'primary'" small
class="mr-1" :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>mdi-record-circle</v-icon >$icoBulletPoint</v-icon
> >
{{ item.label }} {{ item.label }}
</label> </label>
@ -14,12 +14,11 @@
<v-col :cols="item.label ? 7 : ''" > <v-col :cols="item.label ? 7 : ''" >
<v-checkbox <v-checkbox
v-model="chkValue" v-model="chkValue"
style= "height: 36px; align-items: center;"
:disabled="disabledFlag" :disabled="disabledFlag"
:readonly="item.readonly || false" :readonly="item.readonly || false"
:required="item.required || false" :required="item.required || false"
:false-value="false" :false-value="false"
:color="isDarkMode ? '#fff' : '#4777d9'" :color="isDarkMode ? '#fff' : '#1890ff'"
@change="modifyValue" @change="modifyValue"
></v-checkbox> ></v-checkbox>
</v-col> </v-col>

View File

@ -1,5 +1,5 @@
<template> <template>
<v-row no-gutters> <v-row class="form-row">
<template v-for="(item, index) in detailList"> <template v-for="(item, index) in detailList">
<v-col <v-col
v-if="!item.showValue" v-if="!item.showValue"
@ -44,6 +44,7 @@ import EgrpPysclQtyPop from '../modal/EgrpPysclQtyPop';
import EqpmCalcPop from '../modal/EqpmCalcPop'; import EqpmCalcPop from '../modal/EqpmCalcPop';
import EqpmBaseInfoPop from '../modal/EqpmBaseInfoPop'; import EqpmBaseInfoPop from '../modal/EqpmBaseInfoPop';
import InputTextReg from './InputTextReg'; import InputTextReg from './InputTextReg';
import CustomInput from '../../form/CustomInput.vue';
export default { export default {
props: { props: {
@ -87,7 +88,8 @@ export default {
EgrpPysclQtyPop, EgrpPysclQtyPop,
EqpmCalcPop, EqpmCalcPop,
EqpmBaseInfoPop, EqpmBaseInfoPop,
InputTextReg InputTextReg,
CustomInput
}, },
data() { data() {
return {}; return {};

View File

@ -1,18 +1,22 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center">
<v-col v-if="item.label" :cols="item.cols == 12 ? 2 : 4"> <v-col v-if="item.label"
:cols="item.labelCols !== undefined ? item.labelCols : item.cols == 12 ? 2 : 4"
class="py-0"
>
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon
x-small v-if="item.iconShow"
:color="item.required ? '#fb8200' : 'primary'" small
class="mr-1" :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>mdi-record-circle</v-icon >$icoBulletPoint</v-icon
> >
{{ item.label }} {{ item.label }}
<span v-if="item.essential">*</span> <span v-if="item.essential">*</span>
</label> </label>
</v-col> </v-col>
<v-col :cols="item.label ? 7 : ''"> <v-col v-if="!item.hideText"
:cols="item.textCols !== undefined ? item.textCols : item.label ? 8 : ''" class="py-0">
<!-- v-model="InputValue" --> <!-- v-model="InputValue" -->
<v-text-field <v-text-field
v-model="textValue" v-model="textValue"
@ -121,7 +125,7 @@ export default {
modifyValue(e) { modifyValue(e) {
let val = e.target.value.replace(/[^-.0-9]/g, ''); 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){ if(this.item.min != undefined && parseFloat(val) < this.item.min){
val = this.item.min; val = this.item.min;
@ -130,7 +134,7 @@ export default {
if(this.item.max != undefined && parseFloat(val) > this.item.max){ if(this.item.max != undefined && parseFloat(val) > this.item.max){
val = this.item.max; val = this.item.max;
} }
console.log('val2 : ', val); // console.log('val2 : ', val);
this.textValue = val; this.textValue = val;
// this.textValue = this.validateNumber(val); // this.textValue = this.validateNumber(val);

View File

@ -1,56 +1,39 @@
<template> <template>
<v-row v-if="!item.showValue" class="search-box" align="center" no-gutters> <v-row v-if="!item.showValue" class="search-box" align="center">
<v-col <v-col
v-if="item.label" v-if="item.label"
:cols="item.labelCols !== undefined ? item.labelCols : item.cols == 12 ? 2 : 4" :cols="item.labelCols !== undefined ? item.labelCols : item.cols == 12 ? 2 : 4"
:style="item.padding ? 'padding-left:10px' : ''" :style="item.padding ? 'padding-left:10px' : ''"
class="py-0"
> >
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon
x-small v-if="item.iconShow"
:color="item.required ? '#fb8200' : 'primary'" small
class="mr-1" :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>mdi-record-circle</v-icon >$icoBulletPoint</v-icon
> >
{{ item.label }} {{ item.label }}
<span v-if="item.essential">*</span> <span v-if="item.essential">*</span>
</label> </label>
</v-col> </v-col>
<v-col <v-col class="py-0" v-if="!item.hideText" :cols="item.textCols !== undefined ? item.textCols : item.label ? 8 : ''" :style="item.noText ? 'padding-top:0px' : ''">
v-if="!item.hideText" <v-text-field v-model="InputValue" class="v-input__custom" outlined :type="item.inputType || 'text'"
:cols="item.textCols !== undefined ? item.textCols : item.label ? 7 : ''" :min="item.min || ''" :max="item.max || ''" :onkeyup="item.onkeyup || ''"
> :onkeydown="item.onkeydown || ''" :hide-details="true" :disabled="item.disabled ||
<v-text-field
v-model="InputValue"
class="v-input__custom"
outlined
:type="item.inputType || 'text'"
:min="item.min || ''"
:max="item.max || ''"
:onkeyup="item.onkeyup || ''"
:onkeydown="item.onkeydown || ''"
:hide-details="true"
:disabled="
item.disabled ||
(item.elseDisabled && (item.elseDisabled &&
myBindingData && myBindingData &&
item.elseDisabled !== myBindingData.rowStat) || item.elseDisabled !== myBindingData.rowStat) ||
disabledCondition || disabledCondition ||
false false
" " :readonly="item.readonly ||
:readonly="
item.readonly ||
(item.elseReadonly && (item.elseReadonly &&
myBindingData && myBindingData &&
item.elseReadonly !== myBindingData.rowStat) || item.elseReadonly !== myBindingData.rowStat) ||
readonlyCondition || readonlyCondition ||
false false
" " :required="item.required || false" :placeholder="item.placeholder" @input="modifyValue($event, item.valueNm)"
:required="item.required || false" @click="onClick($event, item, item.valueNm)"></v-text-field>
:placeholder="item.placeholder"
@input="modifyValue($event, item.valueNm)"
@click="onClick($event, item, item.valueNm)"
></v-text-field>
</v-col> </v-col>
<v-col v-if="item.lengthCheckFlag" :cols="1" text-align="center"> <v-col v-if="item.lengthCheckFlag" :cols="1" text-align="center">
<label for="" class="search-box-label px-1"> <label for="" class="search-box-label px-1">

View File

@ -1,28 +1,22 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" >
<v-col v-if="item.label" :cols="item.labelCols"> <v-col v-if="item.label" :cols="item.labelCols" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon v-if="item.iconShow" x-small :color="item.required ? '#fb8200' : 'primary'" class="mr-1" <v-icon
>mdi-record-circle</v-icon v-if="item.iconShow"
small
:color="item.required ? '#fb8200' : 'primary'"
:class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
> >
$icoBulletPoint
</v-icon>
{{ item.label }} {{ item.label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="item.label ? item.textCols : ''"> <v-col :cols="item.label ? item.textCols : ''" class="py-0">
<v-text-field <v-text-field ref="formRef" :value="InputValue" class="v-input__custom" :disabled="item.disabled"
ref="formRef" :readonly="item.readonly" outlined :hide-details="true" @keyup.enter="search" @keydown="keydownEvent"
:value="InputValue" @keyup="keyupEvent" @input="inputEvent($event, item.valueNm)" :placeholder="item.placeholder"></v-text-field>
class="v-input__custom"
:disabled="item.disabled"
:readonly="item.readonly"
outlined
:hide-details="true"
@keyup.enter="search"
@keydown="keydownEvent"
@keyup="keyupEvent"
@input="inputEvent($event, item.valueNm)"
:placeholder="item.placeholder"
></v-text-field>
</v-col> </v-col>
</v-row> </v-row>
</template> </template>

View File

@ -1,35 +1,31 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center">
<v-col <v-col v-if="item.label" :cols="item.label ? (item.textCols ? item.textCols : 4) : ''"
v-if="item.label" :style="item.padding ? 'padding-left:10px' : ''" class="py-0">
cols="4"
:style="item.padding ? 'padding-left:10px' : ''"
>
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon
x-small v-if="item.iconShow"
:color="item.required ? '#fb8200' : 'primary'" small
class="mr-1" :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>mdi-record-circle</v-icon >$icoBulletPoint</v-icon
> >
{{ item.label }} {{ item.label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="item.label ? (item.textCols ? item.textCols : 7) : ''"> <v-col :cols="item.label ? (item.textCols ? item.textCols : 8) : ''" class="py-0">
<v-select <v-select v-model="selectValue" :items="typeof item.list != 'string' ? item.list : myListData"
v-model="selectValue"
:items="typeof item.list != 'string' ? item.list : myListData"
:item-text="typeof item.list != 'string' ? 'text' : item.itemText" :item-text="typeof item.list != 'string' ? 'text' : item.itemText"
:item-value="typeof item.list != 'string' ? 'value' : item.itemValue" :item-value="typeof item.list != 'string' ? 'value' : item.itemValue" outlined :hide-details="true"
outlined class="v-select__custom" :disabled="item.disabled || false" :readonly="item.readonly || false"
:hide-details="true" :required="item.required || false" @change="modifyValue($event, item.valueNm)" append-icon="">
append-icon="mdi-chevron-down"
class="v-select__custom" <template v-slot:append>
:disabled="item.disabled || false" <!-- Custom SVG icon -->
:readonly="item.readonly || false" <v-icon>$icoChevronDown</v-icon>
:required="item.required || false"
@change="modifyValue($event, item.valueNm)"
></v-select> </template>
</v-select>
</v-col> </v-col>
</v-row> </v-row>
</template> </template>
@ -60,6 +56,7 @@ export default {
computed: { computed: {
...mapState({ ...mapState({
myListData(state) { myListData(state) {
try{
let list = [...state.pageData[this.parentPrgmId][this.item.list]]; let list = [...state.pageData[this.parentPrgmId][this.item.list]];
list.forEach((item, idx) => { list.forEach((item, idx) => {
if (item.commCdNm && item.commCdNm == '전체') { if (item.commCdNm && item.commCdNm == '전체') {
@ -75,6 +72,9 @@ export default {
} }
}); });
return list; return list;
}catch(err) {
return [];
}
}, },
myBindingData(state) { myBindingData(state) {
if (!this.bindingData) { if (!this.bindingData) {

View File

@ -4,13 +4,13 @@
v-if="item.label" v-if="item.label"
:cols="item.cols == 12 ? 2 : 4" :cols="item.cols == 12 ? 2 : 4"
:style="item.padding ? 'padding-left:10px' : ''" :style="item.padding ? 'padding-left:10px' : ''"
class="py-0"
> >
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon
x-small small
:color="item.required ? '#fb8200' : 'primary'" :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
class="mr-1" >$icoBulletPoint</v-icon
>mdi-record-circle</v-icon
> >
{{ item.label }} {{ item.label }}
<span v-if="item.essential">*</span> <span v-if="item.essential">*</span>
@ -41,6 +41,7 @@
:required="item.required || false" :required="item.required || false"
:maxlength="item.maxlength" :maxlength="item.maxlength"
@input="modifyValue($event, item.valueNm)" @input="modifyValue($event, item.valueNm)"
outlined
></v-textarea> ></v-textarea>
</v-col> </v-col>
<v-col v-if="item.lengthCheckFlag" :cols="1" text-align="center"> <v-col v-if="item.lengthCheckFlag" :cols="1" text-align="center">

View File

@ -1,9 +1,12 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="end" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon v-if="iconShow" x-small :color="required ? '#fb8200' : 'primary'" class="mr-1" <v-icon
>mdi-record-circle</v-icon v-if="iconShow"
small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
> >
{{ label }} {{ label }}
</label> </label>
@ -12,6 +15,7 @@
<v-text-field <v-text-field
v-model="InputValue" v-model="InputValue"
class="v-input__custom" class="v-input__custom"
:class="customClass"
:disabled="disabled" :disabled="disabled"
:readonly="readonly" :readonly="readonly"
outlined outlined
@ -21,6 +25,9 @@
@keyup="keyupEvent" @keyup="keyupEvent"
:placeholder="placeholder" :placeholder="placeholder"
></v-text-field> ></v-text-field>
<!-- <a-input v-model:value="InputValue" class="v-input__custom" :disabled="disabled" :readonly="readonly"
:placeholder="placeholder" @pressEnter="search" @keydown="keydownEvent" @keyup="keyupEvent" :size="size" /> -->
</v-col> </v-col>
</v-row> </v-row>
</template> </template>
@ -58,12 +65,12 @@ export default {
labelCols: { labelCols: {
type: Number, type: Number,
require: false, require: false,
default: 4, default: 12,
}, },
textCols: { textCols: {
type: Number, type: Number,
require: false, require: false,
default: 7, default: 12,
}, },
searchOption: { searchOption: {
type: Boolean, type: Boolean,
@ -87,6 +94,15 @@ export default {
placeholder: { placeholder: {
type: String, type: String,
require: false require: false
},
size: {
type: String,
require: false,
default: "middle",
},
customClass: {
type: String,
require: false,
} }
}, },
data() { data() {

View File

@ -2,8 +2,11 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon v-if="iconShow" x-small :color="required ? '#fb8200' : 'primary'" class="mr-1" <v-icon
>mdi-record-circle</v-icon v-if="iconShow"
small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
> >
{{ label }} {{ label }}
</label> </label>

View File

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

View File

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

View File

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

View File

@ -1,119 +1,90 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center">
<v-col :cols="option.labelCols"> <v-col :cols="option.labelCols" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon v-if="item.iconShow" small
x-small :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
:color="item.required ? '#fb8200' : 'primary'"
class="mr-1"
>mdi-record-circle</v-icon
>
{{ option.labelContent }} {{ option.labelContent }}
</label> </label>
</v-col> </v-col>
<v-col :cols="option.textCols"> <v-col :cols="option.textCols" class="py-0">
<v-text-field <v-text-field :readonly="item.readonly || false" v-model="selectValue" append-icon=""
:readonly="item.readonly || false" class="v-input__custom" @click="dialogOpenCloseEvent(dialog)" outlined :hide-details="true"
v-model="selectValue" :required="item.required || false" :disabled="item.disabled || false"><template v-slot:append>
append-icon="mdi-magnify" <!-- Custom SVG icon -->
class="v-input__custom" <v-icon>$icoSearch</v-icon>
@click="dialogOpenCloseEvent(dialog)"
outlined
:hide-details="true"
:required="item.required || false"
:disabled="item.disabled || false"
></v-text-field>
</v-col>
<v-dialog v-model="dialog" scrollable width="540px"> </template></v-text-field>
</v-col>
<v-dialog v-model="dialog" scrollable width="800px">
<v-card style="height: 100%"> <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> <span class="custom-title-4">{{ option.modalTitle }}</span>
<v-btn <a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
icon
tile
:ripple="false"
@click="dialogOpenCloseEvent(dialog)"
>
<v-icon>mdi-close</v-icon>
</v-btn>
</v-card-title> </v-card-title>
<div class="pa-5">
<v-row align="center" no-gutters> <div class="px-6 py-4 pt-0">
<v-col :cols="12"> <v-row align="center">
<component <v-col :cols="5">
:is="'SelectBox'" <component :is="'SelectBox'" ref="SelectBox1" :labelCols="12" :textCols="12"
ref="SelectBox1" :disabled="option.eqpmGrpDisableFlag" :propsValue="selectValue01" :iconShow="true"
:labelCols="2" :itemList="selectValueList01" :label="'설비그룹'"
:textCols="6" @update:propsValue="selectValue01 = $event" :readonly="item.selectBoxReadonly != undefined
:disabled="option.eqpmGrpDisableFlag"
:propsValue="selectValue01"
:itemList="selectValueList01"
:label="'설비그룹'"
@update:propsValue="selectValue01 = $event"
:readonly="
item.selectBoxReadonly != undefined
? item.selectBoxReadonly ? item.selectBoxReadonly
: false : false
" " />
/>
</v-col> </v-col>
</v-row> <v-col :cols="7">
<v-row align="center" no-gutters> <v-row align="center" no-gutters>
<v-col :cols="2"> <v-col :cols="12">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1" <v-icon small :class="['mr-1 icon-blue']">$icoBulletPoint</v-icon>
>mdi-record-circle</v-icon
>
물리량명 물리량명
</label> </label>
</v-col> </v-col>
<v-col :cols="6"> <v-col :cols="9">
<v-text-field <v-text-field append-icon="" class="v-input__custom" outlined :hide-details="true"
append-icon="mdi-magnify" v-model="searchWord" @keyup.enter="search"><template v-slot:append>
class="v-input__custom" <!-- Custom SVG icon -->
outlined <v-icon>$icoSearch</v-icon>
:hide-details="true" </template></v-text-field>
v-model="searchWord"
@keyup.enter="search"
></v-text-field>
</v-col> </v-col>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-col cols="4" class="text-right"> <v-col :cols="3" class="text-right">
<v-btn :ripple="false" @click="search()"> <a-button icon="search" type="primary" @click="search()"
조회 class="search-button">조회</a-button>
</v-btn>
<!-- <v-btn :ripple="false" @click="initSearch()"> <!-- <v-btn :ripple="false" @click="initSearch()">
초기화 초기화
</v-btn> --> </v-btn> -->
</v-col> </v-col>
</v-row> </v-row>
</div> </v-col>
<v-divider></v-divider> <v-col :cols="12">
<div :style="'height: 429px;'"> <div style="height: 50vh;">
<!-- <div :style="{ height: 'calc(100% - 213px)' }"> --> <div ref="modalGridParent" class="h100 py-4">
<div ref="modalGridParent" class="h100 w100"> <component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01"
<component :dataPath="searchParam.pyscModalData.egrpPysclQtyPop" :parentPrgmId="parentPrgmId"
:is="loadGrid && dialog ? 'Grid' : null" @getRowsData="getRowData" @dblClick="setUpdate($event)" />
:gridName="grid_01"
:dataPath="searchParam.pyscModalData.egrpPysclQtyPop"
:parentPrgmId="parentPrgmId"
@getRowsData="getRowData"
@dblClick="setUpdate($event)"
/>
</div> </div>
</div> </div>
<v-card-actions class="pa-5 d-flex align-center justify-center"> </v-col>
<v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn> </v-row>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)" </div>
>닫기</v-btn
> <!-- <div style="height: 50vh;">
<v-btn <div ref="modalGridParent" class="h100 px-6 py-4">
v-if="item.closeBtnFg || false" <component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01"
:ripple="false" :dataPath="searchParam.pyscModalData.egrpPysclQtyPop" :parentPrgmId="parentPrgmId"
@click="deleteBtnAction($event)" @getRowsData="getRowData" @dblClick="setUpdate($event)" />
>삭제</v-btn </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 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-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -359,6 +330,7 @@ export default {
this.getGridData(); this.getGridData();
}, },
gridInit() { gridInit() {
// const gridHeight = this.$refs.gridParent.offsetHeight - 30;
const myOptions = { const myOptions = {
columnOptions: { columnOptions: {
resizable: true, resizable: true,
@ -562,33 +534,12 @@ var egrpPysclQtyPop = {
} }
} }
.tui-grid-cell.tui-grid-cell-has-tree .tui-grid-cell.tui-grid-cell-has-tree .tui-grid-tree-extra-content+.tui-grid-cell-content:before {
.tui-grid-tree-extra-content
+ .tui-grid-cell-content:before {
content: none !important; content: none !important;
} }
}
@each $theme in dark, light { .ant-btn-icon-only {
.v-application.#{$theme}-mode { border: none;
.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> </style>

View File

@ -1,8 +1,8 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<!-- <v-col v-if="label" cols="2"> --> <!-- <v-col v-if="label" cols="2"> -->
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="item.labelCols">
<label for="" class="search-box-label"> <!-- <label for="" class="search-box-label">
<v-icon <v-icon
x-small x-small
:color="item.required ? '#fb8200' : 'primary'" :color="item.required ? '#fb8200' : 'primary'"
@ -10,9 +10,14 @@
>mdi-record-circle</v-icon >mdi-record-circle</v-icon
> >
{{ item.label }} {{ item.label }}
</label> -->
<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>
{{ item.label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? textCols : ''"> <v-col :cols="label ? item.textCols : ''">
<!-- <v-col :cols="label ? 9 : ''"> --> <!-- <v-col :cols="label ? 9 : ''"> -->
<!-- :value="textfield" --> <!-- :value="textfield" -->
<v-text-field <v-text-field
@ -644,8 +649,7 @@ const myColumns = [
// 전력량 요금(원/kWh) // 전력량 요금(원/kWh)
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
// @import '@/assets/scss/common.scss';
@import '@/assets/scss/var.scss'; @import '@/assets/scss/var.scss';
@each $theme in dark, light { @each $theme in dark, light {
.v-application.#{$theme}-mode { .v-application.#{$theme}-mode {

View File

@ -27,18 +27,15 @@
</v-col> --> </v-col> -->
<!-- <v-row justify="center"> --> <!-- <v-row justify="center"> -->
<v-dialog <v-dialog ref="popModal" v-model="dialog" width="1200" overlay-color="#000" overlay-opacity="0.8" scrollable>
ref="popModal"
v-model="dialog"
width="1400"
overlay-color="#000"
overlay-opacity="0.8"
scrollable
>
<!-- <template v-slot:activator="{ on, attrs }"> <!-- <template v-slot:activator="{ on, attrs }">
<v-btn color="primary" dark v-bind="attrs" v-on="on">공정/설비</v-btn> <v-btn color="primary" dark v-bind="attrs" v-on="on">공정/설비</v-btn>
</template> --> </template> -->
<v-card style="height: 100%"> <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="closePop()"></a-button>
</v-card-title>
<!-- <v-card-title <!-- <v-card-title
class="v-card__title d-flex align-center justify-space-between" class="v-card__title d-flex align-center justify-space-between"
> >
@ -50,7 +47,7 @@
<!-- <v-card-actions> --> <!-- <v-card-actions> -->
<div class="pa-5"> <div class="pa-5">
<!-- <v-text-field label="위치정보 선택"></v-text-field> --> <!-- <v-text-field label="위치정보 선택"></v-text-field> -->
<v-row align="center" no-gutters> <!-- <v-row align="center" no-gutters>
<v-col :cols="4"> <v-col :cols="4">
<div class="d-flex align-center justify-space-between pb-5"> <div class="d-flex align-center justify-space-between pb-5">
<v-card-title class="pa-0">가이드 알람이력</v-card-title> <v-card-title class="pa-0">가이드 알람이력</v-card-title>
@ -61,91 +58,52 @@
<v-icon>mdi-close</v-icon> <v-icon>mdi-close</v-icon>
</v-btn> </v-btn>
</v-col> </v-col>
</v-row> </v-row> -->
<v-row align="center" no-gutters> <v-row align="center" no-gutters>
<v-col :cols="1"> <v-col :cols="12">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
x-small
:color="'primary'"
class="mr-1"
>mdi-record-circle</v-icon
>
설비 설비
</label> </label>
</v-col> </v-col>
<v-col :cols="2"> <v-col :cols="6" class="pr-2 py-0">
<v-text-field <v-text-field v-if="dialog" v-model="InputValue['eqpmId']" class="v-input__custom"
v-if="dialog" :readonly="true" outlined :hide-details="true">
v-model="InputValue['eqpmId']"
class="v-input__custom"
:readonly="true"
outlined
:hide-details="true"
>
</v-text-field> </v-text-field>
</v-col> </v-col>
<v-col :cols="3"> <v-col :cols="6" class="pl-2 py-0">
<v-text-field <v-text-field v-if="dialog" v-model="InputValue['eqpmNm']" class="v-input__custom"
v-if="dialog" :readonly="true" outlined :hide-details="true">
v-model="InputValue['eqpmNm']"
class="v-input__custom"
:readonly="true"
outlined
:hide-details="true"
>
</v-text-field> </v-text-field>
</v-col> </v-col>
<v-col :cols="6"> </v-row>
</v-col> <v-row align="center" no-gutters class="mt-4">
<v-col :cols="1"> <v-col :cols="12">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
x-small
:color="'primary'"
class="mr-1"
>mdi-record-circle</v-icon
>
가이드지표 가이드지표
</label> </label>
</v-col> </v-col>
<v-col :cols="2"> <v-col :cols="6" class="pr-2 py-0">
<v-text-field <v-text-field v-if="dialog" v-model="InputValue['gdIdxId']" class="v-input__custom"
v-if="dialog" :readonly="true" outlined :hide-details="true">
v-model="InputValue['gdIdxId']"
class="v-input__custom"
:readonly="true"
outlined
:hide-details="true"
>
</v-text-field> </v-text-field>
</v-col> </v-col>
<v-col :cols="3"> <v-col :cols="6" class="pl-2 py-0">
<v-text-field <v-text-field v-if="dialog" v-model="InputValue['gdIdxNm']" class="v-input__custom"
v-if="dialog" :readonly="true" outlined :hide-details="true">
v-model="InputValue['gdIdxNm']"
class="v-input__custom"
:readonly="true"
outlined
:hide-details="true"
>
</v-text-field> </v-text-field>
</v-col> </v-col>
</v-row> </v-row>
</div> </div>
<v-divider></v-divider>
<div class="d-flex align-center justify-space-between pa-4"> <div class="d-flex align-center justify-space-between pa-4">
<v-card-title class="pa-0 custom-title-4"> 설비 가이드 정보</v-card-title> <v-card-title class="py-0 px-2 custom-title-4">설비 가이드 정보</v-card-title>
</div> </div>
<div class="px-5" style="height:calc(100% - 76px)"> <div class="px-5" style="height:calc(100% - 76px)">
<div ref="modalGridParent" class="w100 h100"> <div ref="modalGridParent" class="w100 h100">
<component <component :ref="gridName" :is="loadGrid ? 'Grid' : null"
:ref="gridName" :dataPath="searchParam.modalData.eqpmDetlPop" :gridName="gridName"
:is="loadGrid? 'Grid' : null" :parentPrgmId="parentPrgmId" />
:dataPath="searchParam.modalData.eqpmDetlPop"
:gridName="gridName"
:parentPrgmId="parentPrgmId"
/>
</div> </div>
</div> </div>
<!-- <div id="gridParent" ref="gridParent" style="height: 500px"> <!-- <div id="gridParent" ref="gridParent" style="height: 500px">
@ -161,10 +119,9 @@
/> />
</div> --> </div> -->
<v-divider></v-divider>
<v-card-actions> <v-card-actions>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn color="primary" dark @click="closePop()">확인</v-btn> <a-button color="primary" type="primary" @click="closePop()">확인</a-button>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -323,7 +280,11 @@ export default {
resizable: true, resizable: true,
minWidth: 100 minWidth: 100
}, },
setScroll: true, // setScroll: true,
header: {
height: 37,
},
rowHeight: 'auto',
}; };
@ -394,7 +355,7 @@ export default {
}); });
// this.getRowGridData(); this.getRowGridData();
}, },
async getRowGridData() { async getRowGridData() {
this.loadGrid = false; this.loadGrid = false;
@ -417,6 +378,7 @@ export default {
} }
); );
this.setModalGridData({ this.setModalGridData({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.gridName, gridKey: this.gridName,
@ -441,12 +403,9 @@ var eqpmDetlPop ={
// 전력량 요금(원/kWh) // 전력량 요금(원/kWh)
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
// @import '@/assets/scss/common/grid.scss'; // @import '@/assets/scss/common/grid.scss';
.tui-grid-scrollbar-left-bottom { .tui-grid-scrollbar-left-bottom {
display: none !important; display: none !important;
} }
</style> </style>

View File

@ -0,0 +1,115 @@
<template>
<div>
<!-- Detail Modal -->
<a-modal v-model="showDetailModal" title="가이드 알람이력" width="1200px" :footer="null"
:style="{ borderRadius: '8px', overflow: 'hidden' }" :bodyStyle="{ paddingTop: '0px' }">
<!-- Top Input Fields -->
<a-row :gutter="8" align="middle" style="margin-bottom: 16px;">
<!-- Label on the left -->
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">설비</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="12">
<a-input value="설비명" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
<a-col :span="12">
<a-input value="가이드지표" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
<a-row :gutter="8" align="middle" style="margin-bottom: 16px;">
<!-- Label on the left -->
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">가이드지표</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="12">
<a-input value="설비명" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
<a-col :span="12">
<a-input value="가이드지표" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
<a-divider />
<!-- Table -->
<h3 style=" margin-bottom: 16px">설비 가이드 정보</h3>
<a-table :columns="modalTableColumns" :dataSource="modalTableData" rowKey="No" size="small" bordered
:pagination="false" />
<!-- Footer Buttons -->
<div style="text-align: right; margin-top: 16px;">
<a-button @click="showDetailModal = false">닫기</a-button>
<a-button type="primary" style="margin-left: 8px; color:#fff" @click="confirmModal">확인</a-button>
</div>
</a-modal>
</div>
</template>
<script>
export default {
data() {
return {
showDetailModal: false,
selectedRecord: null,
modalTableColumns: [
{ title: 'No.', dataIndex: 'No', key: 'No', align: 'center' },
{ title: '발생일', dataIndex: '발생일', key: '발생일' },
{ title: '발생시간대', dataIndex: '발생시간대', key: '발생시간대' },
{ title: '가이드지표명', dataIndex: '가이드지표명', key: '가이드지표명' },
{ title: '주의', dataIndex: '주의', key: '주의' },
{ title: '경고', dataIndex: '경고', key: '경고' },
{ title: '가이드값', dataIndex: '가이드값', key: '가이드값' },
{ title: '알랑내용', dataIndex: '알랑내용', key: '알랑내용' },
],
modalTableData: [
{
No: 1,
발생일: '2025-06-01',
발생시간대: '02-03',
가이드지표명: '냉수 출구 온도 평균 편차',
주의: 3,
경고: 2,
가이드값: -1.23,
알랑내용: '[심각]냉수3과 온도차가 7.72°C로 낮음(평균 15.44*C 대비 7.72°C 낮음) - UT_HT_CH1C',
},
{
No: 2,
발생일: '2025-06-02',
발생시간대: '02-03',
가이드지표명: '냉수 출구 온도 평균 편차',
주의: 2,
경고: 1,
가이드값: -1.45,
},
],
};
},
methods: {
handleNgCntClick(record) {
this.selectedRecord = record;
this.showDetailModal = true;
},
confirmModal() {
this.showDetailModal = false;
},
},
};
</script>
<style>
.ant-modal-header {
border-bottom: none;
border-radius: 8px 8px 0 0;
}
.ant-modal-content {
border-radius: 8px;
}
.ant-modal-title,
h3 {
font-weight: 600
}
</style>

View File

@ -27,14 +27,7 @@
</v-col> --> </v-col> -->
<!-- <v-row justify="center"> --> <!-- <v-row justify="center"> -->
<v-dialog <v-dialog ref="popModal" v-model="dialog" width="800" overlay-color="#000" overlay-opacity="0.8" scrollable>
ref="popModal"
v-model="dialog"
width="1400"
overlay-color="#000"
overlay-opacity="0.8"
scrollable
>
<!-- <template v-slot:activator="{ on, attrs }"> <!-- <template v-slot:activator="{ on, attrs }">
<v-btn color="primary" dark v-bind="attrs" v-on="on">공정/설비</v-btn> <v-btn color="primary" dark v-bind="attrs" v-on="on">공정/설비</v-btn>
</template> --> </template> -->
@ -48,9 +41,12 @@
</v-btn> </v-btn>
</v-card-title> --> </v-card-title> -->
<!-- <v-card-actions> --> <!-- <v-card-actions> -->
<div class="pa-5">
<!-- <v-text-field label="위치정보 선택"></v-text-field> --> <!-- <v-text-field label="위치정보 선택"></v-text-field> -->
<v-row align="center" no-gutters> <v-card-title class="pa-5 d-flex align-center justify-space-between">
<span class="custom-title-4">가이드 정보</span>
<a-button icon="close" type="text" @click="closePop()"></a-button>
</v-card-title>
<!-- <v-row align="center" no-gutters>
<v-col :cols="4"> <v-col :cols="4">
<div class="d-flex align-center justify-space-between pb-5"> <div class="d-flex align-center justify-space-between pb-5">
<v-card-title class="pa-0">가이드 정보</v-card-title> <v-card-title class="pa-0">가이드 정보</v-card-title>
@ -61,204 +57,88 @@
<v-icon>mdi-close</v-icon> <v-icon>mdi-close</v-icon>
</v-btn> </v-btn>
</v-col> </v-col>
</v-row> </v-row> -->
<div class="px-5 pb-3">
<v-row align="center" no-gutters> <v-row align="center" no-gutters>
<v-col :cols="2"> <v-col :cols="12">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
x-small
:color="'primary'"
class="mr-1"
>mdi-record-circle</v-icon
>
가이드지표 가이드지표
</label> </label>
</v-col> </v-col>
<v-col :cols="3"> <v-col :cols="6" class="pr-2">
<v-text-field <v-text-field v-if="dialog" v-model="InputValue['gdIdxId']" class="v-input__custom" :readonly="true"
v-if="dialog" outlined :hide-details="true">
v-model="InputValue['gdIdxId']"
class="v-input__custom"
:readonly="true"
outlined
:hide-details="true"
>
</v-text-field> </v-text-field>
</v-col> </v-col>
<v-col :cols="3"> <v-col :cols="6" class="pl-2">
<v-text-field <v-text-field v-if="dialog" v-model="InputValue['gdIdxNm']" class="v-input__custom" :readonly="true"
v-if="dialog" outlined :hide-details="true">
v-model="InputValue['gdIdxNm']"
class="v-input__custom"
:readonly="true"
outlined
:hide-details="true"
>
</v-text-field> </v-text-field>
</v-col> </v-col>
</v-row> </v-row>
<v-divider class="mt-5 mb-2"></v-divider>
</div> </div>
<v-divider></v-divider>
<div class="d-flex align-center justify-space-between pa-4"> <div class="px-5 pb-4">
<v-card-title class="pa-0 custom-title-4">가이드 정보</v-card-title> <v-row align="center">
</div> <v-col :cols="6" class="py-2 pr-2">
<div class="px-5"> <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="계산코드" valueNm="calcProc"
<v-row> :iconShow="true" :readonly="true" :labelCols="12" :textCols="12" />
<v-col :cols="6" class="py-2">
<InputText
id="gdIdx_InputText"
:parentPrgmId="parentPrgmId"
label="계산코드"
valueNm="calcProc"
:iconShow="true"
:readonly="true"
:labelCols="4"
:textCols="6"
/>
</v-col> </v-col>
<v-col :cols="6"> <v-col :cols="6">
</v-col> </v-col>
<v-col :cols="12" class="py-2"> <v-col :cols="12" class="py-2">
<InputText <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="계산설명" valueNm="calcDesc"
id="gdIdx_InputText" :iconShow="true" :labelCols="12" :textCols="12" :readonly="true" />
:parentPrgmId="parentPrgmId"
label="계산설명"
valueNm="calcDesc"
:iconShow="true"
:labelCols="2"
:textCols="9"
:readonly="true"
/>
</v-col> </v-col>
<v-col :cols="6" class="py-2"> <v-col :cols="6" class="py-2 pr-2">
<InputText <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="물리량1" valueNm="pysclQtyId1"
id="gdIdx_InputText" :iconShow="true" :readonly="true" :labelCols="12" :textCols="12" />
:parentPrgmId="parentPrgmId"
label="물리량1"
valueNm="pysclQtyId1"
:iconShow="true"
:readonly="true"
:labelCols="4"
:textCols="6"
/>
</v-col> </v-col>
<v-col :cols="6" class="py-2"> <v-col :cols="6" class="py-2 pl-2">
<InputText <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="물리량2" valueNm="pysclQtyId2"
id="gdIdx_InputText" :iconShow="true" :readonly="true" :labelCols="12" :textCols="12" />
:parentPrgmId="parentPrgmId"
label="물리량2"
valueNm="pysclQtyId2"
:iconShow="true"
:readonly="true"
:labelCols="4"
:textCols="6"
/>
</v-col> </v-col>
<v-col :cols="6" class="py-2"> <v-col :cols="6" class="py-2 pr-2">
<InputText <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="물리량3" valueNm="pysclQtyId3"
id="gdIdx_InputText" :iconShow="true" :readonly="true" :labelCols="12" :textCols="12" />
:parentPrgmId="parentPrgmId"
label="물리량3"
valueNm="pysclQtyId3"
:iconShow="true"
:readonly="true"
:labelCols="4"
:textCols="6"
/>
</v-col> </v-col>
<v-col :cols="6" class="py-2"> <v-col :cols="6" class="py-2 pl-2">
<InputText <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="물리량4" valueNm="pysclQtyId4"
id="gdIdx_InputText" :iconShow="true" :readonly="true" :labelCols="12" :textCols="12" />
:parentPrgmId="parentPrgmId"
label="물리량4"
valueNm="pysclQtyId4"
:iconShow="true"
:readonly="true"
:labelCols="4"
:textCols="6"
/>
</v-col> </v-col>
<v-col :cols="6" class="py-2"> <v-col :cols="6" class="py-2 pr-2">
<InputText <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="카테고리1" valueNm="ctgr1"
id="gdIdx_InputText" :iconShow="true" :readonly="true" :labelCols="12" :textCols="12" />
:parentPrgmId="parentPrgmId"
label="카테고리1"
valueNm="ctgr1"
:iconShow="true"
:readonly="true"
:labelCols="4"
:textCols="6"
/>
</v-col> </v-col>
<v-col :cols="6" class="py-2"> <v-col :cols="6" class="py-2 pl-2">
<InputText <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="카테고리2" valueNm="ctgr2"
id="gdIdx_InputText" :iconShow="true" :readonly="true" :labelCols="12" :textCols="12" />
:parentPrgmId="parentPrgmId"
label="카테고리2"
valueNm="ctgr2"
:iconShow="true"
:readonly="true"
:labelCols="4"
:textCols="6"
/>
</v-col> </v-col>
<v-col :cols="6" class="py-2"> <v-col :cols="6" class="py-2 pr-2">
<InputText <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="주의기준값" valueNm="careStndVal"
id="gdIdx_InputText" :iconShow="true" :readonly="true" :labelCols="12" :textCols="12" />
:parentPrgmId="parentPrgmId"
label="주의기준값"
valueNm="careStndVal"
:iconShow="true"
:readonly="true"
:labelCols="4"
:textCols="6"
/>
</v-col> </v-col>
<v-col :cols="6"> <v-col :cols="6">
</v-col> </v-col>
<v-col :cols="6" class="py-2"> <v-col :cols="6" class="py-2 pr-2">
<InputText <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="경고기준값" valueNm="warnStndVal"
id="gdIdx_InputText" :iconShow="true" :readonly="true" :labelCols="12" :textCols="12" />
:parentPrgmId="parentPrgmId"
label="경고기준값"
valueNm="warnStndVal"
:iconShow="true"
:readonly="true"
:labelCols="4"
:textCols="6"
/>
</v-col> </v-col>
<v-col :cols="12" class="py-2"> <v-col :cols="12" class="py-2">
<InputText <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="알람메세지" valueNm="alrmMsg"
id="gdIdx_InputText" :iconShow="true" :labelCols="12" :textCols="12" :readonly="true" />
:parentPrgmId="parentPrgmId"
label="알람메세지"
valueNm="alrmMsg"
:iconShow="true"
:labelCols="2"
:textCols="9"
:readonly="true"
/>
</v-col> </v-col>
<v-col :cols="12" class="py-2"> <v-col :cols="12" class="py-2">
<InputText <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="가이드방법" valueNm="gdMeth"
id="gdIdx_InputText" :iconShow="true" :labelCols="12" :textCols="12" :readonly="true" />
:parentPrgmId="parentPrgmId"
label="가이드방법"
valueNm="gdMeth"
:iconShow="true"
:labelCols="2"
:textCols="9"
:readonly="true"
/>
</v-col> </v-col>
</v-row> </v-row>
</div> </div>
<div style="height:20px;"></div>
<v-divider></v-divider>
<v-card-actions> <v-card-actions>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn color="primary" dark @click="closePop()">확인</v-btn> <a-button color="primary" type="primary" @click="closePop()">확인</a-button>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -402,13 +282,13 @@ export default {
}), }),
init() { init() {
// this.gridInit(); this.gridInit();
}, },
closePop() { closePop() {
this.popCheck = false; this.popCheck = false;
}, },
search() { search() {
// this.getData(); this.getData();
}, },
async getData() { async getData() {
var res = await this.postApiReturn({ var res = await this.postApiReturn({
@ -453,11 +333,12 @@ var gdIdxDetPop ={
.tui-grid-scrollbar-left-bottom { .tui-grid-scrollbar-left-bottom {
display: none !important; display: none !important;
} }
#gdIdx_InputText::v-deep .v-input__custom{
margin-left:-60px;
}
.v-input__custom{
margin-left:-60px;
}
// #gdIdx_InputText::v-deep .v-input__custom {
// margin-left: -60px;
// }
// .v-input__custom {
// margin-left: -60px;
// }
</style> </style>

View File

@ -0,0 +1,220 @@
<template>
<div>
<!-- Detail Modal -->
<a-modal v-model="showDetailModal" title="가이드 정보" width="800px" :footer="null"
:style="{ borderRadius: '8px', overflow: 'hidden' }" :bodyStyle="{ paddingTop: '0px' }">
<!-- Top Input Fields -->
<a-row :gutter="8" align="middle" style="margin-bottom: 8px;">
<!-- Label on the left -->
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">가이드지표</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="12">
<a-input value="GD00111" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
<a-col :span="12">
<a-input value="냉각수 온도차 평균 편차" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
<a-divider />
<a-row :gutter="8" align="middle" style="margin-bottom: 8px;">
<!-- Label on the left -->
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">계산코드</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="12">
<a-input value="BEF_AVG_DEV_GT" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
<a-row :gutter="8" align="middle" style="margin-bottom: 8px;">
<!-- Label on the left -->
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">계산설명</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="24">
<a-input value="냉각수 온도차" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
<a-row :gutter="8" align="middle" style="margin-bottom: 8px;">
<!-- Label on the left -->
<a-col :span="12">
<a-row>
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">물리랑1</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="24">
<a-input value="냉각수 온도차" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
</a-col>
<a-col :span="12">
<a-row>
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">물리랑2</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="24">
<a-input value="" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
</a-col>
</a-row>
<a-row :gutter="8" align="middle" style="margin-bottom: 8px;">
<!-- Label on the left -->
<a-col :span="12">
<a-row>
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">물리랑3</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="24">
<a-input value="냉각수 온도차" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
</a-col>
<a-col :span="12">
<a-row>
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">물리랑4</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="24">
<a-input value="" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
</a-col>
</a-row>
<a-row :gutter="8" align="middle" style="margin-bottom: 8px;">
<!-- Label on the left -->
<a-col :span="12">
<a-row>
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">카테고리1</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="24">
<a-input value="냉각수 온도차" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
</a-col>
<a-col :span="12">
<a-row>
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">카테고리2</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="24">
<a-input value="" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
</a-col>
</a-row>
<a-row :gutter="8" align="middle" style="margin-bottom: 8px;">
<!-- Label on the left -->
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">주의기준간</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="12">
<a-input value="3" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
<a-row :gutter="8" align="middle" style="margin-bottom: 8px;">
<!-- Label on the left -->
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">경고기준값</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="12">
<a-input value="5" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
<a-row :gutter="8" align="middle" style="margin-bottom: 8px;">
<!-- Label on the left -->
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">열람메세지</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="24">
<a-input value="냉각수 온도차가 @V1C로 낮음(청균@AVG 대비 @RSLTC 낮음]-@EOPM" :style="{ borderRadius: '6px', height: '34px' }"
disabled />
</a-col>
</a-row>
<a-row :gutter="8" align="middle" style="margin-bottom: 8px;">
<!-- Label on the left -->
<a-col :span="24" style="text-align: left;">
<div style="line-height: 32px;">가이드방법</div>
</a-col>
<!-- Two inputs on the right -->
<a-col :span="24">
<a-input value="대비 @RSLTC 낮음]-@EOPM" :style="{ borderRadius: '6px', height: '34px' }" disabled />
</a-col>
</a-row>
<!-- Footer Buttons -->
<div style="text-align: right; margin-top: 16px;">
<a-button @click="showDetailModal = false">닫기</a-button>
<a-button type="primary" style="margin-left: 8px; color:#fff" @click="confirmModal">확인</a-button>
</div>
</a-modal>
</div>
</template>
<script>
export default {
data() {
return {
showDetailModal: false,
selectedRecord: null
};
},
methods: {
handleGdIdxNmClick(record) {
this.selectedRecord = record;
this.showDetailModal = true;
},
confirmModal() {
this.showDetailModal = false;
},
},
};
</script>
<style>
.ant-modal-header {
border-bottom: none;
border-radius: 8px 8px 0 0;
}
.ant-modal-content {
border-radius: 8px;
}
.ant-modal-title,
h3 {
font-weight: 600
}
</style>

View File

@ -9,10 +9,15 @@
scrollable scrollable
> >
<v-card style="height: 100%"> <v-card style="height: 100%">
<v-card-title class="pa-5 pb-0 d-flex align-center justify-space-between">
<span class="custom-title-4">사용량 계획</span>
<v-icon @click="closePop()">mdi-close</v-icon>
</v-card-title>
<div class="pa-5"> <div class="pa-5">
<!-- <v-text-field label="위치정보 선택"></v-text-field> --> <!-- <v-text-field label="위치정보 선택"></v-text-field> -->
<v-row align="center" no-gutters> <v-row align="center" no-gutters>
<v-col :cols="4"> <v-col :cols="4.5">
<InputText <InputText
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
:label="'설비명'" :label="'설비명'"
@ -20,18 +25,43 @@
:readonly="true" :readonly="true"
/> />
</v-col> </v-col>
<v-col :cols="2"> </v-row>
<v-row align="end" no-gutters class="mt-4 d-flex justify-center">
<v-col :cols="5.5" class="mr-2">
<component
:is="'SelectBox'"
ref="SelectBox1"
:labelCols='12'
:textCols='12'
:propsValue="selectValue01"
:itemList="selectValueList01"
:label="'대상월'"
@update:propsValue="selectValue01 = $event"
/>
</v-col> </v-col>
<v-col :cols="3"> <v-col :cols="5.5" class="mr-2">
</v-col> <component
<v-col :cols="3" class="text-right"> :is="'SelectBox'"
<v-btn icon tile :ripple="false" @click="closePop()"> ref="SelectBox2"
<v-icon>mdi-close</v-icon> :labelCols='12'
</v-btn> :textCols='12'
:propsValue="selectValue02"
:itemList="selectValueList02"
:label="'전년대비절감율'"
@update:propsValue="selectValue02 = $event"
/>
</v-col> </v-col>
<a-button color="primary" dark @click="search()" icon="clock-circle" >
<!-- <template #icon>
<ClockCircleOutlined />
</template> -->
적용
</a-button>
<!-- <v-col :cols="2" class="text-right">
</v-col> -->
</v-row> </v-row>
</div> </div>
<v-divider></v-divider> <!-- <v-divider></v-divider> -->
<!-- <div id="chartParent" ref="chartParent" style="height: 100px"> --> <!-- <div id="chartParent" ref="chartParent" style="height: 100px"> -->
<div :style="'height: calc(50vh)'"> <div :style="'height: calc(50vh)'">
@ -50,37 +80,8 @@
:ref="chartName" :ref="chartName"
/> />
</div> </div>
<v-divider></v-divider> <!-- <v-divider></v-divider> -->
<div style="height: 20%; margin: auto; width: 90%; display: flex; align-items: center;"> <!-- <div style="height: 20%; margin: auto; width: 90%; display: flex; align-items: center;"> -->
<v-row align="center" no-gutters class="pa-5 d-flex align-center justify-center;">
<v-col :cols="5">
<component
:is="'SelectBox'"
ref="SelectBox1"
:labelCols='3'
:textCols='6'
:propsValue="selectValue01"
:itemList="selectValueList01"
:label="'대상월'"
@update:propsValue="selectValue01 = $event"
/>
</v-col>
<v-col :cols="5">
<component
:is="'SelectBox'"
ref="SelectBox2"
:labelCols='5'
:textCols='6'
:propsValue="selectValue02"
:itemList="selectValueList02"
:label="'전년대비절감율'"
@update:propsValue="selectValue02 = $event"
/>
</v-col>
<v-col :cols="2" class="text-right">
<v-btn color="primary" dark @click="search()">적용</v-btn>
</v-col>
</v-row>
<!-- <div style="height: 70%; width:10%; float: left; border: 1px solid blue; background-color: #A2A2A2"> <!-- <div style="height: 70%; width:10%; float: left; border: 1px solid blue; background-color: #A2A2A2">
설정 설정
</div> </div>
@ -97,8 +98,6 @@
</v-col> </v-col>
</v-row> </v-row>
</div> --> </div> -->
<!-- <v-row align="center" no-gutters> <!-- <v-row align="center" no-gutters>
<v-row <v-row
:cols="12" :cols="12"
@ -115,7 +114,7 @@
<v-btn color="primary" dark @click="setChart()">적용</v-btn> <v-btn color="primary" dark @click="setChart()">적용</v-btn>
</v-col> </v-col>
</v-row> --> </v-row> -->
</div> <!-- </div> -->
</div> </div>
<!-- <div id="gridParent" ref="gridParent" style="height: 500px"> <!-- <div id="gridParent" ref="gridParent" style="height: 500px">
@ -132,9 +131,9 @@
</div> --> </div> -->
<v-divider></v-divider> <v-divider></v-divider>
<v-card-actions class="pa-5 d-flex align-center justify-center"> <v-card-actions class="pa-5 d-flex align-center justify-end">
<v-btn color="primary" dark @click="setUpdate()">확정</v-btn> <a-button color="primary" type="default" class="mr-2" dark @click="closePop()">취소</a-button>
<v-btn color="primary" dark @click="closePop()">취소</v-btn> <a-button color="primary" type="primary" dark @click="setUpdate()">확정</a-button>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -196,7 +195,7 @@ export default {
selectCodeList, selectCodeList,
InputText, InputText,
Chart, Chart,
SelectBox SelectBox,
// Tree // Tree
}, },
data() { data() {
@ -318,6 +317,9 @@ export default {
// }); // });
// } // }
}, },
mounted(){
// this.initTest(); return;
},
methods: { methods: {
...mapMutations({ ...mapMutations({
setPageData: 'setPageData', setPageData: 'setPageData',
@ -329,6 +331,7 @@ export default {
...mapActions({ ...mapActions({
postApiReturn: 'modules/list/postApiReturn', postApiReturn: 'modules/list/postApiReturn',
}), }),
init() { init() {
this.setChart(); this.setChart();
}, },
@ -406,6 +409,74 @@ export default {
this.nowSeriesData = []; this.nowSeriesData = [];
this.nowModalChartData = []; this.nowModalChartData = [];
}, },
async initTestChart(){
this.loadChart = false;
let xAxisData = [];
let seriesData = [];
let data = [];
let targetMonthList = [];
let _this = this;
const dataItemLine = []; // { gubun: '2PLAN' };
const dataItemBar = []; //{ gubun: '1PLAN' };
const getRanNum = (n) => Math.floor(Math.random()*n + 1);
for(var i=1; i<=12; i++){
let qty = 'qty' + i.toString().padStart(2, '0');
targetMonthList.push(qty);
xAxisData.push(i);
dataItemLine.push(getRanNum(100));
dataItemBar.push(getRanNum(100));
}
data = [
{gubun: '1PLAN'}, {gubun: '2PLAN'},
];
seriesData = data.map(item => ({
name: item.gubun == '2PLAN' ? '계획' : '전년실적',
type: item.gubun == '2PLAN' ? 'line' : 'bar',
data: item.gubun == '2PLAN' ? dataItemLine : dataItemBar
}));
this.nowSeriesData = seriesData;
let option = {
grid: {
top: "3%",
},
xAxis:{
type: 'category',
data: xAxisData
},
yAxis:{
type:'value',
nameLocation : 'middle',
nameGap :45
},
legend: {
icon: 'circle',
},
series: seriesData,
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
}
};
await this.$nextTick(() => { });
this.setModalChartOption({
prgmId: this.$route.query.prgmId,
chartKey: this.chartName,
modalId: this.modalId,
modalDataKey: this.modalDataKey,
value: option,
});
this.loadChart = true;
// this.$nextTick(() => {
// })
},
async setChart(){ async setChart(){
this.loadChart = false; this.loadChart = false;
let xAxisData = []; let xAxisData = [];

View File

@ -1,115 +1,80 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center">
<v-col :cols="option.labelCols"> <v-col :cols="option.labelCols" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon v-if="item.iconShow" small
x-small :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
:color="item.required ? '#fb8200' : 'primary'"
class="mr-1"
>mdi-record-circle</v-icon
>
{{ option.labelContent }} {{ option.labelContent }}
</label> </label>
</v-col> </v-col>
<v-col :cols="option.textCols"> <v-col :cols="option.textCols" class="py-0">
<v-text-field <v-text-field readonly v-model="selectValue" append-icon="" class="v-input__custom"
readonly @click="dialogOpenCloseEvent(dialog)" outlined :hide-details="true" :required="item.required || false"
v-model="selectValue" :disabled="item.disabled || false"><template v-slot:append>
append-icon="mdi-magnify" <!-- Custom SVG icon -->
class="v-input__custom" <v-icon>$icoSearch</v-icon>
@click="dialogOpenCloseEvent(dialog)"
outlined </template></v-text-field>
:hide-details="true"
:required="item.required || false"
:disabled="item.disabled || false"
></v-text-field>
</v-col> </v-col>
<v-dialog v-model="dialog" scrollable width="540px"> <v-dialog v-model="dialog" scrollable width="800px">
<v-card style="height: 100%"> <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> <span class="custom-title-4">{{ option.modalTitle }}</span>
<v-btn <a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
icon
tile
:ripple="false"
@click="dialogOpenCloseEvent(dialog)"
>
<v-icon>mdi-close</v-icon>
</v-btn>
</v-card-title> </v-card-title>
<div class="pa-5"> <div class="pa-6 pt-0">
<v-row align="center" no-gutters> <v-row align="center">
<v-col :cols="12"> <v-col :cols="5">
<component <component :is="'SelectBox'" ref="SelectBox1" :labelCols="12" :textCols="12"
:is="'SelectBox'" :iconShow="true" :propsValue="selectValue01" :itemList="selectValueList01"
ref="SelectBox1" :label="'설비그룹'" @update:propsValue="selectValue01 = $event" :readonly="item.openMode == undefined
:labelCols="2"
:textCols="6"
:propsValue="selectValue01"
:itemList="selectValueList01"
:label="'설비그룹'"
@update:propsValue="selectValue01 = $event"
:readonly="
item.openMode == undefined
? openMode ? openMode
: item.openMode == 'ALL' : item.openMode == 'ALL'
? false ? false
: true : true
" " />
/>
</v-col> </v-col>
</v-row> <v-col :cols="7">
<v-row align="center" no-gutters> <v-row align="center" no-gutters>
<v-col :cols="2"> <v-col :cols="12">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1" <v-icon small :class="['mr-1 icon-blue']">$icoBulletPoint</v-icon>
>mdi-record-circle</v-icon 물리량명
>
설비명
</label> </label>
</v-col> </v-col>
<v-col :cols="6"> <v-col :cols="9"> <v-text-field append-icon="" class="v-input__custom" outlined
<v-text-field :hide-details="true" v-model="searchWord" @keyup.enter="search"><template
append-icon="mdi-magnify" v-slot:append>
class="v-input__custom" <!-- Custom SVG icon -->
outlined <v-icon>$icoSearch</v-icon>
:hide-details="true"
v-model="searchWord"
@keyup.enter="search" </template></v-text-field></v-col>
></v-text-field>
</v-col>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-col cols="4" class="text-right"> <v-col cols="3" class="text-right">
<v-btn :ripple="false" @click="search()"> <a-button icon="search" type="primary" @click="search()"
조회 class="search-button">조회</a-button>
</v-btn>
<!-- <v-btn :ripple="false" @click="initSearch()">
초기화
</v-btn> -->
</v-col> </v-col>
</v-row> </v-row>
</v-col>
</v-row>
</div> </div>
<v-divider></v-divider>
<!-- <div :style="'height: calc(50vh)'"> --> <!-- <div :style="'height: calc(50vh)'"> -->
<div :style="'height: 429px;'"> <div :style="'height: 429px;'">
<!-- <div :style="{ height: 'calc(100% - 213px)' }"> --> <!-- <div :style="{ height: 'calc(100% - 213px)' }"> -->
<div ref="modalGridParent" class="h100 py-3"> <div ref="modalGridParent" class="h100 px-6 py-4">
<component <component :is="loadGrid && dialog ? 'Grid' : null" :gridName="gridName"
:is="loadGrid && dialog ? 'Grid' : null"
:gridName="gridName"
:dataPath="searchParam.modalDataEqpmBaseInfoPop.eqpmBaseInfoPop" :dataPath="searchParam.modalDataEqpmBaseInfoPop.eqpmBaseInfoPop"
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId" @getRowsData="getRowData" @dblClick="setUpdate($event)" />
@getRowsData="getRowData"
@dblClick="setUpdate($event)"
/>
</div> </div>
</div> </div>
<v-card-actions class="pa-5 d-flex align-center justify-center"> <v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn> <a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="mr-2">닫기</a-button>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)" <a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button>
>닫기</v-btn
>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -166,6 +131,11 @@ export default {
require: false, require: false,
default: true, // 'ALL'도 있음 default: true, // 'ALL'도 있음
}, },
iconShow: {
type: Boolean,
require: false,
default: true,
},
// bindingFlag:{ // bindingFlag:{
// type:Boolean, // type:Boolean,
// require: false, // require: false,
@ -181,7 +151,7 @@ export default {
return { return {
dialog: false, dialog: false,
loadGrid: false, loadGrid: true,
gridName: 'gridEqpmBaseInfoPop', gridName: 'gridEqpmBaseInfoPop',
myModalKey: 'eqpmBaseInfoPop', myModalKey: 'eqpmBaseInfoPop',
modalDataKey: 'modalDataEqpmBaseInfoPop', modalDataKey: 'modalDataEqpmBaseInfoPop',
@ -323,6 +293,7 @@ export default {
this.selectValueList01 = []; this.selectValueList01 = [];
this.selectValue01 = null; this.selectValue01 = null;
} }
}, },
search() { search() {
this.getGridData(); this.getGridData();
@ -482,33 +453,29 @@ var eqpmBaseInfoPop = {
} }
} }
.tui-grid-cell.tui-grid-cell-has-tree .tui-grid-cell.tui-grid-cell-has-tree .tui-grid-tree-extra-content+.tui-grid-cell-content:before {
.tui-grid-tree-extra-content
+ .tui-grid-cell-content:before {
content: none !important; content: none !important;
} }
} }
@each $theme in dark, light { @each $theme in dark, light {
.v-application.#{$theme}-mode { // .v-application.#{$theme}-mode {
.v-dialog { // .v-dialog {
.v-card { // .v-card {
&__title { // &__title {
color: map-deep-get($color, 'white', '0');
@if $theme == dark {
background-color: #2d3355; // @if $theme ==dark {
.v-btn { // background-color: #2d3355;
background-color: #2d3355;
} // .v-btn {
} @else { // background-color: #2d3355;
background-color: #3f4d7d; // }
.v-btn { // }
background-color: #3f4d7d;
} // }
} // }
} // }
} // }
}
}
} }
</style> </style>

View File

@ -1,96 +1,74 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col :cols="option.labelCols"> <v-col :cols="option.labelCols" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon
x-small v-if="iconShow"
:color="item.required ? '#fb8200' : 'primary'" small
class="mr-1" :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>mdi-record-circle</v-icon >$icoBulletPoint</v-icon
> >
{{ option.labelContent }} {{ option.labelContent }}
</label> </label>
</v-col> </v-col>
<v-col :cols="option.textCols"> <v-col :cols="option.textCols">
<v-text-field <v-text-field :readonly="item.readonly || false" v-model="selectValue" append-icon=""
:readonly="item.readonly || false" class="v-input__custom" @click="dialogOpenCloseEvent(dialog)" outlined :hide-details="true"
v-model="selectValue" :required="item.required || false" :disabled="item.disabled || false"><template v-slot:append>
append-icon="mdi-magnify" <!-- Custom SVG icon -->
class="v-input__custom" <v-icon>$icoSearch</v-icon>
@click="dialogOpenCloseEvent(dialog)"
outlined
:hide-details="true"
:required="item.required || false"
:disabled="item.disabled || false"
></v-text-field>
</v-col>
<v-dialog v-model="dialog" scrollable width="540px">
</template></v-text-field>
</v-col>
<v-dialog v-model="dialog" scrollable width="800px">
<v-card style="height: 100%"> <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> <span class="custom-title-4">{{ option.modalTitle }}</span>
<v-btn <a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
icon
tile
:ripple="false"
@click="dialogOpenCloseEvent(dialog)"
>
<v-icon>mdi-close</v-icon>
</v-btn>
</v-card-title> </v-card-title>
<div class="pa-5"> <div class="pa-6 pt-0">
<v-row align="center" no-gutters> <v-row align="center">
<v-col :cols="2"> <v-col :cols="12" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1" <v-icon small :class="['mr-1 icon-blue']">$icoBulletPoint</v-icon>
>mdi-record-circle</v-icon
>
계산설명 계산설명
</label> </label>
</v-col> </v-col>
<v-col :cols="6"> <v-col :cols="11" class="pr-8 py-0" >
<v-text-field <v-text-field append-icon="" class="v-input__custom" outlined
append-icon="mdi-magnify" :hide-details="true" v-model="searchWord" @keyup.enter="search"><template v-slot:append>
class="v-input__custom" <!-- Custom SVG icon -->
outlined <v-icon>$icoSearch</v-icon>
:hide-details="true"
v-model="searchWord"
@keyup.enter="search" </template></v-text-field>
></v-text-field>
</v-col> </v-col>
<v-spacer></v-spacer> <v-col cols="1" class="py-0" style="display: flex; justify-content: flex-end;">
<v-col cols="4" class="text-right"> <a-button icon="search" type="primary" @click="search()" class="search-button">조회</a-button>
<v-btn :ripple="false" @click="search()">
조회
</v-btn>
<!-- <v-btn :ripple="false" @click="initSearch()"> <!-- <v-btn :ripple="false" @click="initSearch()">
초기화 초기화
</v-btn> --> </v-btn> -->
</v-col> </v-col>
</v-row> </v-row>
</div> </div>
<v-divider></v-divider> <!-- <v-divider></v-divider> -->
<div :style="'height: calc(50vh)'"> <div :style="'height: calc(50vh)'">
<!-- <div :style="{ height: 'calc(100% - 213px)' }"> --> <!-- <div :style="{ height: 'calc(100% - 213px)' }"> -->
<div ref="modalGridParent" class="h100 py-3"> <div ref="modalGridParent" class="h100 px-6 py-4">
<component <component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01"
:is="loadGrid && dialog ? 'Grid' : null" :dataPath="searchParam.modalData2.eqpmCalcPop" :parentPrgmId="parentPrgmId"
:gridName="grid_01" @getRowsData="getRowData" @dblClick="setUpdate($event)" />
:dataPath="searchParam.modalData2.eqpmCalcPop"
:parentPrgmId="parentPrgmId"
@getRowsData="getRowData"
@dblClick="setUpdate($event)"
/>
</div> </div>
</div> </div>
<v-card-actions class="pa-5 d-flex align-center justify-center"> <v-card-actions class="pa-5 d-flex align-center justify-end">
<v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn> <a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="mr-2">닫기</a-button>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)" <a-button :ripple="false" type="primary" @click="setUpdate($event)" >확인</a-button>
>닫기</v-btn
>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
</v-row> </v-row>
</template> </template>
@ -141,7 +119,17 @@ export default {
openMode: { openMode: {
type: String, type: String,
require: false, require: false,
} },
required: {
type: Boolean,
require: false,
default: false,
},
iconShow:{
type:Boolean,
require:false,
default:true
},
// bindingFlag:{ // bindingFlag:{
// type:Boolean, // type:Boolean,
// require: false, // require: false,
@ -156,7 +144,23 @@ export default {
return { return {
dialog: false, dialog: false,
loadGrid: 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 },
]
}
},
grid_01: 'grid_01', grid_01: 'grid_01',
myModalKey: 'eqpmCalcPop', myModalKey: 'eqpmCalcPop',
modalDataKey: 'modalData2', modalDataKey: 'modalData2',
@ -282,7 +286,7 @@ export default {
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
value: Object.assign( value: Object.assign(
// Utility.defaultGridOption(this.$refs.modalGridParent.offsetHeight - 60, myOptions), // Utility.defaultGridOption(this.$refs.modalGridParent.offsetHeight - 60, myOptions),
Utility.defaultGridOption(400, myOptions), // Utility.defaultGridOption(400, myOptions),
myOptions, myOptions,
), ),
}); });
@ -294,7 +298,6 @@ export default {
value: [ value: [
{ header: '계산코드', name: 'calcProc', width: 150 }, { header: '계산코드', name: 'calcProc', width: 150 },
{ header: '아규먼트갯수', name: 'argCnt', align: 'center', width: 100 }, { header: '아규먼트갯수', name: 'argCnt', align: 'center', width: 100 },
// { header: '계산설명', name : 'calcDesc', width: 286},
{ header: '계산설명', name: 'calcDesc', align: 'left' }, { header: '계산설명', name: 'calcDesc', align: 'left' },
], ],
}); });
@ -317,14 +320,6 @@ export default {
res = newRes; res = newRes;
} }
// const res = [
// {
// 'calcProc' : 'AVG_CNT2',
// 'argCnt' : '2',
// 'calcDesc' : '두개 변수에 대한 평균'
// }
// ]
this.setModalGridData({ this.setModalGridData({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.grid_01, gridKey: this.grid_01,
@ -403,33 +398,10 @@ var eqpmCalcPop = {
} }
} }
.tui-grid-cell.tui-grid-cell-has-tree .tui-grid-cell.tui-grid-cell-has-tree .tui-grid-tree-extra-content+.tui-grid-cell-content:before {
.tui-grid-tree-extra-content
+ .tui-grid-cell-content:before {
content: none !important; content: none !important;
} }
} }
@each $theme in dark, light {
.v-application.#{$theme}-mode {
.v-dialog {
.v-card {
&__title {
color: map-deep-get($color, 'white', '0');
@if $theme == dark {
background-color: #2d3355;
.v-btn {
background-color: #2d3355;
}
} @else {
background-color: #3f4d7d;
.v-btn {
background-color: #3f4d7d;
}
}
}
}
}
}
}
</style> </style>

View File

@ -1,123 +1,97 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon v-if="iconShow" <v-icon v-if="iconShow" small
x-small :class="['mr-1', required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
:color="required ? '#fb8200' : 'primary'"
class="mr-1"
>mdi-record-circle</v-icon
>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="textCols"> <v-col :cols="textCols">
<v-text-field <v-text-field readonly append-icon="" :class="['v-input__custom', customClass]"
readonly @click="dialogOpenCloseEvent(dialog)" outlined :hide-details="true" :required="required || false"
v-model="selectValue" :disabled="disabled || false"><template v-slot:append>
append-icon="mdi-magnify" <!-- Custom SVG icon -->
class="v-input__custom" <v-icon>$icoSearch</v-icon>
@click="dialogOpenCloseEvent(dialog)"
outlined
:hide-details="true"
:required="required || false"
:disabled="disabled || false"
></v-text-field>
</v-col>
<v-dialog </template></v-text-field>
ref="popModal" </v-col>
v-model="dialog" <v-dialog ref="popModal" v-model="dialog" width="800" overlay-color="#000" overlay-opacity="0.8" scrollable>
width="1400"
overlay-color="#000"
overlay-opacity="0.8"
scrollable
>
<v-card style="height: 100%"> <v-card style="height: 100%">
<v-divider></v-divider> <v-card-title class="px-5 py-4 d-flex align-center justify-space-between">
<div class="d-flex align-center justify-space-between pa-4"> <span class="custom-title-4">설비 선택</span>
<v-card-title class="pa-0 custom-title-4"> 설비 선택</v-card-title> <a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
</div> </v-card-title>
<div class="pa-5"> <div class="pa-2 pt-0">
<v-row align="center" no-gutters> <v-card class="searchFilter">
<v-col :cols="3"> <v-row align="end">
<v-col :cols="3.5">
<!-- 설비그룹 --> <!-- 설비그룹 -->
<component <component :is="'SelectBox'" :propsValue="selectValue01" :itemList="selectValueList01"
:is="'SelectBox'" :label="'설비그룹'" :disabled="eqpmGrpDisabled"
:propsValue="selectValue01" @update:propsValue="selectValue01 = $event" :labelCols="12" :textCols="12"
:itemList="selectValueList01" :iconShow="true" />
:label="'설비그룹'"
:disabled="eqpmGrpDisabled"
@update:propsValue="selectValue01 = $event"
/>
</v-col> </v-col>
<v-col :cols="6" style="padding:0px 10px;"> <v-col :cols="3.5">
<!-- FAB --> <!-- FAB -->
<component <component :is="'SelectBoxMulti'" :propsValue="selectValue02"
:is="'SelectBoxMulti'" :itemList="selectValueList02" :label="'FAB'" :labelCols="12" :multiple="true"
:propsValue="selectValue02" :disabled="fabDisabled" @update:propsValue="selectValue02 = $event" :textCols="12"
:itemList="selectValueList02" :iconShow="true" />
:label="'FAB'" </v-col>
:labelCols="2" <v-col :cols="3.5">
:multiple="true" <v-row>
:disabled="fabDisabled" <v-col :cols="12" class="py-0">
@update:propsValue="selectValue02 = $event" <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> </v-col>
<v-spacer></v-spacer>
<v-col cols="3" class="text-right">
<v-btn :ripple="false" @click="search()">
조회
</v-btn>
<!-- <v-btn :ripple="false" @click="initSearch()">
초기화
</v-btn> -->
</v-col>
</v-row> </v-row>
<v-row align="center" no-gutters style="margin-top: 14px;"> </v-col>
<a-button icon="search" type="primary" @click="search()" class="search-button">조회</a-button>
</v-row>
</v-card>
<!-- <v-row align="center" no-gutters style="margin-top: 14px;">
<v-col :cols="1"> <v-col :cols="1">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1" <v-icon x-small color="primary" class="mr-1">mdi-record-circle</v-icon>
>mdi-record-circle</v-icon
>
설비명 설비명
</label> </label>
</v-col> </v-col>
<v-col :cols="3"> <v-col :cols="3">
<v-text-field <v-text-field append-icon="mdi-magnify" class="v-input__custom" outlined
append-icon="mdi-magnify" :hide-details="true" v-model="searchWord" @keyup.enter="search"></v-text-field>
class="v-input__custom"
outlined
:hide-details="true"
v-model="searchWord"
@keyup.enter="search"
></v-text-field>
</v-col> </v-col>
</v-row> </v-row> -->
</div> </div>
<div class="px-5" style="height:429px;"> <div class="px-5" style="height:429px;">
<div ref="modalGridParent" class="w100 h100"> <div ref="modalGridParent" class="w100 h100">
<component <component :ref="gridName" :is="loadGrid ? 'Grid' : null"
:ref="gridName" :dataPath="searchParam.eqpmSelectPopData.eqpmSelectPop" :gridName="gridName"
:is="loadGrid? 'Grid' : null" :parentPrgmId="parentPrgmId" @getRowsData="getRowData" />
:dataPath="searchParam.eqpmSelectPopData.eqpmSelectPop"
:gridName="gridName"
:parentPrgmId="parentPrgmId"
@getRowsData="getRowData"
/>
</div> </div>
</div> </div>
<v-divider></v-divider> <v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<v-card-actions class="pa-5 d-flex align-center justify-center"> <a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="mr-2">닫기</a-button>
<v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn> <a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)"
>닫기</v-btn
>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
</v-row> </v-row>
</template> </template>
@ -200,6 +174,11 @@ export default {
type: Boolean, type: Boolean,
require: false, require: false,
default: false default: false
},
customClass: {
type: String,
require: false,
default: ''
} }
}, },
components: { components: {
@ -217,7 +196,7 @@ export default {
modalDataKey: 'eqpmSelectPopData', modalDataKey: 'eqpmSelectPopData',
myModalKey: 'eqpmSelectPop', myModalKey: 'eqpmSelectPop',
gridName: 'eqpmSelectGrid', gridName: 'eqpmSelectGrid',
loadGrid: false, loadGrid: true,
setGrid: false, setGrid: false,
popCheck: false, popCheck: false,
dialog: false, dialog: false,
@ -405,12 +384,15 @@ export default {
columnOptions: { columnOptions: {
resizable: true, resizable: true,
}, },
header: {
height: 'auto',
},
// rowHeaders:[{ type: 'checkbox' }], // rowHeaders:[{ type: 'checkbox' }],
// rowHeight:'auto' rowHeight: 'auto',
}; };
if (this.isMulti) { if (this.isMulti) {
myOptions['rowHeaders'] = [{type : 'checkbox'}]; // myOptions['rowHeaders'] = [{ type: 'checkbox' }];
myOptions['rowHeight'] = 'auto'; // myOptions['rowHeight'] = 'auto';
} }
@ -495,7 +477,33 @@ export default {
// totDttmTime : Utility.setFormatDate(item.totDttm, 'HH') + "~" + dayjs(item.totDttm).add(1,'h').format('HH') // totDttmTime : Utility.setFormatDate(item.totDttm, 'HH') + "~" + dayjs(item.totDttm).add(1,'h').format('HH')
// } // }
// ); // );
// const res =
// [
// {
// "fabId": "FAB001",
// "fabNm": "Gumi FAB",
// "eqpmId": "EQ001",
// "eqpmNm": "Etcher A12",
// "eccId": "ECC001",
// "eccNm": "Etch Control Center"
// },
// {
// "fabId": "FAB002",
// "fabNm": "Pyeongtaek FAB",
// "eqpmId": "EQ002",
// "eqpmNm": "Deposition B34",
// "eccId": "ECC002",
// "eccNm": "Deposition Control Center"
// },
// {
// "fabId": "FAB003",
// "fabNm": "Hwaseong FAB",
// "eqpmId": "EQ003",
// "eqpmNm": "CMP C56",
// "eccId": "ECC003",
// "eccNm": "CMP Control Center"
// }
// ];
this.setModalGridData({ this.setModalGridData({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.gridName, gridKey: this.gridName,

View File

@ -0,0 +1,375 @@
<template>
<v-row class="search-box" align="center" no-gutters>
<v-col :cols="labelCols">
<label for="" class="search-box-label">
{{ label }}
</label>
</v-col>
<v-col :cols="textCols">
<!-- <a-input :size="size" @click="showDetailModal = true" class="custom-input" suffix-icon placeholder="Search..." v-model="selectValue">
<template #suffix>
<a-icon type="search" />
</template>
</a-input> -->
<!-- append-icon="search" -->
<v-text-field
readonly
v-model="selectValue"
class="v-input__custom"
@click="showDetailModal = true"
outlined
:hide-details="true"
:required="required || false"
>
<!-- :disabled="disabled || false" -->
<template #append >
<a-icon type="search" />
</template>
</v-text-field>
</v-col>
<a-modal v-model="showDetailModal" title="가이드 알람이력" class="text-left" width="800px" :footer="null"
:style="{ borderRadius: '8px', overflow: 'hidden' }" :bodyStyle="{ paddingTop: '0px' }">
<!-- Top Input Fields -->
<v-row :gutters="32" align="end" style="margin-bottom: 16px;">
<!-- Label on the left -->
<!-- Two inputs on the right -->
<v-col :cols="3">
<component :is="'SelectBox'" :label="'실비그룹'" :labelCols="12" :textCols="12"
:propsValue="eqpmGrpSelected" :itemList="eqpmGrpList"
@update:propsValue="eqpmGrpSelected = $event" :disabled="disabled" :iconShow="false" />
</v-col>
<v-col :cols="4" style="text-align: left;">
<component :is="'SelectBox'" :label="'FAB'" :labelCols="12" :textCols="12"
:propsValue="localFabSelected" :itemList="fabList"
@update:propsValue="localFabSelected = $event" :disabled="disabled" :iconShow="false" />
</v-col>
<v-col :cols="5" >
<v-row>
<v-col :cols="12" style="text-align: left;">
<div>실비명</div>
</v-col>
<v-col :cols="8">
<a-input class="custom-input" suffix-icon placeholder="Search..."
:style="{ borderRadius: '6px', }" >
<template #suffix>
<a-icon type="search" />
</template>
</a-input>
</v-col>
<v-col :cols="3" class="text-right">
<!-- 조회버튼 -->
<BtnSearch @click="searchFab()" />
</v-col>
</v-row>
</v-col>
</v-row>
<a-divider />
<!-- Table -->
<a-table :columns="columns" :dataSource="filteredData" rowKey="id" :rowSelection="rowSelection" bordered />
<!-- Footer Buttons -->
<div style="text-align: right; margin-top: 16px;">
<a-button @click="showDetailModal = false">닫기</a-button>
<a-button type="primary" style="margin-left: 8px; color:#fff"
@click="showDetailModal = false">확인</a-button>
</div>
</a-modal>
</v-row>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import Grid from '~/components/common/Grid';
import Utility from '~/plugins/utility';
import selectCodeList from '@/components/common/select/selectCodeList';
import InputText from '~/components/common/input/InputText';
import dateUtility from '~/plugins/dateUtility';
import SelectBox from '@/components/common/select/SelectBox';
import SelectBoxMulti from '@/components/common/select/SelectBoxMulti';
import BtnSearch from '~/components/common/button/BtnSearch';
export default {
props: {
parentPrgmId: {
type: String,
require: true,
default: '비교대상 최대(20개)',
},
label: {
type: String,
require: false,
default: '전력 계약 정보',
},
valueNm: {
type: String,
require: false,
default: '',
},
title: {
type: String,
require: false,
default: '전력 계약 목록',
},
labelCols: {
type: Number,
require: false,
default: 12,
},
textCols: {
type: Number,
require: false,
default: 12,
},
item: {
type: Object,
require: true,
},
bindingData: {
type: String,
require: false,
},
disabled: {
type: Boolean,
default: true
},
required: {
type: Boolean,
require: false,
default: false
},
fabDisabled: {
type: Boolean,
require: false,
default: false
},
eqpmGrpDisabled: {
type: Boolean,
require: false,
default: false
},
iconShow: {
type: Boolean,
require: false,
default: true
},
isMulti: {
type: Boolean,
require: false,
default: false
},
fabSelected: {
type: String, // or Array, depending on your data
required: false
},
eqpmGrpSelected: {
type: String, // or Array, depending on your data
required: false
},
size: {
type: String,
require: false,
default: "middle",
}
},
components: {
Grid,
selectCodeList,
dateUtility,
InputText,
SelectBox,
SelectBoxMulti,
BtnSearch
// Tree
},
data() {
return {
labelPrepend: true,
modalDataKey: 'eqpmSelectPopData',
myModalKey: 'eqpmSelectPop',
gridName: 'eqpmSelectGrid',
loadGrid: false,
setGrid: false,
popCheck: false,
dialog: false,
activeRowData: {},
checkedRowDataList: [],
localFabSelected: this.fabSelected,
localEqpmGrpSelected: this.eqpmGrpSelected,
fabList: [],
eqpmGrpList: [],
searchWord: '',
activeRowData: {},
textFieldData: '',
selectRow: {},
showDetailModal: false,
columns: [
{
title: 'FAB',
dataIndex: 'fab',
key: 'fab',
},
{
title: '설비ID',
dataIndex: 'equipmentId',
key: 'equipmentId',
},
{
title: '설비명',
dataIndex: 'equipmentName',
key: 'equipmentName',
},
],
// Table data
data: [
{
id: 1,
fab: 'FAB001',
equipmentId: 'EQ001',
equipmentName: '냉각기 A',
},
{
id: 2,
fab: 'FAB002',
equipmentId: 'EQ002',
equipmentName: '펌프 B',
},
{
id: 3,
fab: 'FAB003',
equipmentId: 'EQ003',
equipmentName: '히터 C',
},
{
id: 4,
fab: 'FAB001',
equipmentId: 'EQ004',
equipmentName: '냉각기 D',
},
{
id: 5,
fab: 'FAB002',
equipmentId: 'EQ005',
equipmentName: '펌프 E',
},
{
id: 6,
fab: 'FAB003',
equipmentId: 'EQ006',
equipmentName: '히터 F',
},
{
id: 7,
fab: 'FAB001',
equipmentId: 'EQ007',
equipmentName: '냉각기 G',
},
{
id: 8,
fab: 'FAB002',
equipmentId: 'EQ008',
equipmentName: '펌프 H',
},
],
filteredData: [],
// Row selection config
rowSelection: {
onChange: (selectedRowKeys, selectedRows) => {
// console.log('Selected Row Keys:', selectedRowKeys);
// console.log('Selected Rows:', selectedRows);
},
}
};
},
watch: {
fabSelected(newVal) {
this.localFabSelected = newVal;
},
eqpmGrpSelected(newVal) {
this.localEqpmGrpSelected = newVal;
}
},
beforeCreate() {
this.$store.commit('setPageData', {
eqpmSelectPopData: { eqpmSelectPop },
});
},
async created() {
await this.getFab();
await this.getEqpmGrp();
this.init();
},
methods: {
// ...mapMutations({
// setPageData: 'setPageData',
// setModalGridData: 'setModalGridData',
// setModalGridColumn: 'setModalGridColumn',
// setModalGridOption: 'setModalGridOption',
// }),
// ...mapActions({
// postApiReturn: 'modules/list/postApiReturn',
// }),
init() {
this.filteredData = this.data;
// this.activeRowData = {};
// this.gridInit();
},
// search() {
// this.getRowGridData();
// },
searchFab() {
// 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;
// return matchGrp && matchFab;
// });
},
async getFab() {
this.fabList = [
{ label: 'FAB001', value: 'FAB001' },
{ label: 'FAB002', value: 'FAB002' },
{ label: 'FAB003', value: 'FAB003' },
];
// this.fabSelected = 'FAB001';
},
async getEqpmGrp() {
this.eqpmGrpList = [
{ label: 'EQ 1', value: 'EQ001' },
{ label: 'EQ 2', value: 'EQ002' },
{ label: 'EQ 3', value: 'EQ003' },
];
// this.eqpmGrpSelected = 'EQ001';
},
},
};
var eqpmSelectPop = {
eqpmSelectGrid: {
data: [],
column: [],
option: {}
}
}
</script>

View File

@ -1,95 +1,62 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box no-gutters" align="center">
<v-col :cols="option.labelCols"> <v-col :cols="option.labelCols" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon v-if="item.iconShow" small
x-small :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
:color="item.required ? '#fb8200' : 'primary'"
class="mr-1"
>mdi-record-circle</v-icon
>
{{ option.labelContent }} {{ option.labelContent }}
</label> </label>
</v-col> </v-col>
<v-col :cols="option.textCols"> <v-col :cols="option.textCols" class="py-0">
<v-text-field <v-text-field readonly append-icon="" :class="['v-select__custom', customClass]" outlined :hide-details="true"
readonly v-model="selectValue" @keyup.enter="typeEnterKey" @click="dialogOpenCloseEvent(dialog)" style="padding: 0;"
v-model="selectValue" :required="item.required || false"><template v-slot:append>
append-icon="mdi-magnify" <!-- Custom SVG icon -->
class="v-input__custom" <v-icon>$icoSearch</v-icon>
@click="dialogOpenCloseEvent(dialog)" </template></v-text-field>
outlined
:hide-details="true"
:required="item.required || false"
:disabled="item.disabled || false"
></v-text-field>
</v-col> </v-col>
<v-dialog v-model="dialog" scrollable width="1000px"> <v-dialog v-model="dialog" scrollable width="1000px">
<v-card style="height: 100%"> <v-card style="height: 100%">
<v-card-title class="pa-5 d-flex align-center justify-space-between"> <v-card-title class="pa-5 d-flex align-center justify-space-between">
<span class="custom-title-4">{{ option.modalTitle }}</span> <span class="custom-title-4">{{ option.modalTitle }}</span>
<v-btn <v-icon @click="dialogOpenCloseEvent(dialog)">mdi-close</v-icon>
icon
tile
:ripple="false"
@click="dialogOpenCloseEvent(dialog)"
>
<v-icon>mdi-close</v-icon>
</v-btn>
</v-card-title> </v-card-title>
<div class="pa-5"> <v-row align="end" class="px-5 pb-3" no-gutters>
<v-row align="center" no-gutters> <v-col :cols="2.5" class="mr-2">
<v-col :cols="2"> <v-row>
<v-col :cols="12" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1" <!-- <v-icon small
>mdi-record-circle</v-icon :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
> >$icoBulletPoint</v-icon> -->
검색 검색
</label> </label>
</v-col> </v-col>
<v-col :cols="6"> <v-col :cols="11" class="py-0 pr-3">
<v-text-field <v-text-field append-icon="mdi-magnify" class="v-input__custom" outlined
append-icon="mdi-magnify" :hide-details="true" v-model="searchWord" @keyup.enter="search"></v-text-field>
class="v-input__custom"
outlined
:hide-details="true"
v-model="searchWord"
@keyup.enter="search"
></v-text-field>
</v-col> </v-col>
<v-spacer></v-spacer> <a-button icon="search" :ripple="false" type="primary" @click="search()"
<v-col cols="4" class="text-right"> class="search-button">조회</a-button>
<v-btn :ripple="false" @click="search()"> </v-row>
조회
</v-btn>
<!-- <v-btn :ripple="false" @click="initSearch()">
초기화
</v-btn> -->
</v-col> </v-col>
</v-row> </v-row>
</div>
<v-divider></v-divider>
<!-- <div :style="'height: calc(65vh)'"> --> <!-- <div :style="'height: calc(65vh)'"> -->
<div :style="'height: 600px'"> <div :style="'height: 600px'" class="px-5">
<!-- <div :style="{ height: 'calc(100% - 213px)' }"> --> <!-- <div :style="{ height: 'calc(100% - 213px)' }"> -->
<div ref="modalGridParent" class="h100 py-3"> <div ref="modalGridParent" class="h100 py-3">
<component <!-- :is="loadGrid && dialog ? 'Grid' : null" -->
:is="loadGrid && dialog ? 'Grid' : null" <component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01"
:gridName="grid_01" :dataPath="searchParam.modalData2.evtObjPop" :parentPrgmId="parentPrgmId"
:dataPath="searchParam.modalData2.evtObjPop" @getRowsData="getRowData" @dblClick="setUpdate($event)" />
:parentPrgmId="parentPrgmId"
@getRowsData="getRowData"
@dblClick="setUpdate($event)"
/>
</div> </div>
</div> </div>
<v-card-actions class="pa-5 d-flex align-center justify-center"> <v-card-actions class="pa-5 d-flex align-center justify-end">
<v-btn :ripple="false" @click="setUpdate('init')">초기화</v-btn> <a-button type="default" class="mr-2" :ripple="false"
<v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn> @click="dialogOpenCloseEvent(dialog)">닫기</a-button>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)" <a-button type="primary" class="mr-2" :ripple="false" @click="setUpdate('init')">초기화</a-button>
>닫기</v-btn <a-button type="primary" :ripple="false" @click="setUpdate($event)">확인</a-button>
>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -139,7 +106,11 @@ export default {
bindingData: { bindingData: {
type: String, type: String,
require: false, require: false,
} },
customClass: {
type: String,
require: false,
},
// bindingFlag:{ // bindingFlag:{
// type:Boolean, // type:Boolean,
// require: false, // require: false,
@ -278,6 +249,9 @@ export default {
columnOptions: { columnOptions: {
resizable: true, resizable: true,
}, },
header: {
height: 38,
},
}; };
this.setModalGridOption({ this.setModalGridOption({
modalKey: this.myModalKey, modalKey: this.myModalKey,
@ -404,33 +378,8 @@ var evtObjPop = {
} }
} }
.tui-grid-cell.tui-grid-cell-has-tree .tui-grid-cell.tui-grid-cell-has-tree .tui-grid-tree-extra-content+.tui-grid-cell-content:before {
.tui-grid-tree-extra-content
+ .tui-grid-cell-content:before {
content: none !important; content: none !important;
} }
} }
@each $theme in dark, light {
.v-application.#{$theme}-mode {
.v-dialog {
.v-card {
&__title {
color: map-deep-get($color, 'white', '0');
@if $theme == dark {
background-color: #2d3355;
.v-btn {
background-color: #2d3355;
}
} @else {
background-color: #3f4d7d;
.v-btn {
background-color: #3f4d7d;
}
}
}
}
}
}
}
</style> </style>

View File

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

View File

@ -1,52 +1,50 @@
<template> <template>
<v-row class="search-box " align="center" no-gutters > <v-row class="search-box " align="center" no-gutters >
<v-col :cols="option.labelCols"> <v-col :cols="option.labelCols" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon
x-small v-if="iconShow"
small
:color="item.required ? '#fb8200' : 'primary'" :color="item.required ? '#fb8200' : 'primary'"
class="mr-1" :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>mdi-record-circle</v-icon >$icoBulletPoint</v-icon
> >
{{ option.labelContent }} {{ option.labelContent }}
</label> </label>
</v-col> </v-col>
<v-col :cols="option.textCols"> <v-col :cols="option.textCols">
<!-- append-icon="mdi-magnify" -->
<v-text-field <v-text-field
readonly readonly
v-model="selectValue" v-model="selectValue"
append-icon="mdi-magnify"
class="v-input__custom" class="v-input__custom"
@click="dialogOpenCloseEvent(dialog)" @click="dialogOpenCloseEvent(dialog)"
outlined outlined
:hide-details="true" :hide-details="true"
></v-text-field> >
<!-- Custom SVG icon -->
<template v-slot:append>
<v-icon>$icoSearch</v-icon>
</template>
</v-text-field>
</v-col> </v-col>
<v-dialog v-model="dialog" scrollable width="700px"> <v-dialog v-model="dialog" scrollable width="700px">
<v-card style="height: 100%"> <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> <span class="custom-title-4">{{ option.modalTitle }}</span>
<v-btn <a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
icon
tile
:ripple="false"
@click="dialogOpenCloseEvent(dialog)"
>
<v-icon>mdi-close</v-icon>
</v-btn>
</v-card-title> </v-card-title>
<div class="pa-5"> <div class="pa-5">
<v-row align="center" no-gutters> <v-row align="center" no-gutters>
<v-col :cols="3"> <v-col :cols="12">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1" <!-- <v-icon x-small color="primary" class="mr-1">mdi-record-circle</v-icon> -->
>mdi-record-circle</v-icon <v-icon small :class="['mr-1 icon-blue']">$icoBulletPoint</v-icon>
>
검색 검색
</label> </label>
</v-col> </v-col>
<v-col :cols="5"> <v-col :cols="9">
<v-text-field <v-text-field
append-icon="mdi-magnify" append-icon="mdi-magnify"
class="v-input__custom" class="v-input__custom"
@ -57,21 +55,19 @@
></v-text-field> ></v-text-field>
</v-col> </v-col>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-col cols="4" class="text-right"> <v-col :cols="3" class="text-right">
<v-btn :ripple="false" @click="search()"> <a-button type="primary" @click="search()" icon="search">
조회 조회
</v-btn> </a-button>
<v-btn :ripple="false" @click="initSearch()"> <a-button @click="initSearch()">
초기화 초기화
</v-btn> </a-button>
</v-col> </v-col>
</v-row> </v-row>
</div> </div>
<v-divider></v-divider> <!-- <v-divider></v-divider> -->
<!-- <div :style="'height: calc(65vh)'"> --> <div style="height: 429px;" class="py-3 px-5">
<div :style="'height: 429px;'"> <div ref="modalGridParent" class="h100 w100">
<!-- <div :style="{ height: 'calc(100% - 213px)' }"> -->
<div ref="modalGridParent" class="h100 w100 py-3">
<component <component
:is="loadGrid && dialog ? 'Grid' : null" :is="loadGrid && dialog ? 'Grid' : null"
:gridName="grid_01" :gridName="grid_01"
@ -82,11 +78,9 @@
/> />
</div> </div>
</div> </div>
<v-card-actions class="pa-5 d-flex align-center justify-center"> <v-card-actions class="pa-5 d-flex align-center justify-end">
<v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn> <a-button class="mr-2" @click="dialogOpenCloseEvent(dialog)">닫기</a-button>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)" <a-button type="primary" @click="setUpdate($event)">확인</a-button>
>닫기</v-btn
>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -137,6 +131,11 @@ export default {
type: String, type: String,
require: false, require: false,
}, },
iconShow: {
type: Boolean,
require: false,
default: true
},
}, },
components: { components: {
Grid, Grid,
@ -146,7 +145,7 @@ export default {
return { return {
dialog: false, dialog: false,
loadGrid: false, loadGrid: true,
grid_01: 'grid_01', grid_01: 'grid_01',
myModalKey: 'FtnPlcFormPop', myModalKey: 'FtnPlcFormPop',
modalDataKey: 'modalData3', modalDataKey: 'modalData3',
@ -285,26 +284,47 @@ export default {
}); });
}, },
async getGridData() { async getGridData() {
this.loadGrid = false; // this.loadGrid = false;
const res = await this.postApiReturn({ // const res = await this.postApiReturn({
apiKey: 'selectEccBaseInfo', // apiKey: 'selectEccBaseInfo',
resKey: 'eccBaseInfoData', // resKey: 'eccBaseInfoData',
sendParam: { // sendParam: {
blocId: this.myBindingData.blocId, // blocId: this.myBindingData.blocId,
eqpmYn: '0', // eqpmYn: '0',
search: this.searchWord, // search: this.searchWord,
}, // },
}); // });
const setTreeData = await this.setTree({ // const setTreeData = await this.setTree({
gridKey: this.gridNameTree, // gridKey: this.gridNameTree,
treeKey: 'ECC_ID', // treeKey: 'ECC_ID',
value: res.map(item => ({ // 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 => ({
...item, ...item,
eccNm: item.eccNm, eccNm: item.eccNm,
})), }))
}); };
// console.log(res);
this.setModalGridData({ this.setModalGridData({
modalKey: this.myModalKey, modalKey: this.myModalKey,
@ -363,7 +383,31 @@ var FtnPlcFormPop = {
</script> </script>
<style lang="scss" scoped> <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-deep {
.v-dialog { .v-dialog {
overflow-y: hidden !important; overflow-y: hidden !important;
} }
@ -386,26 +430,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> </style>

View File

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

View File

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

View File

@ -1,268 +1,191 @@
<template> <template>
<div> <div>
<!-- <v-btn :ripple="false" @click="dialog = !dialog">경고창</v-btn> --> <!-- <v-btn :ripple="false" @click="dialog = !dialog">경고창</v-btn> -->
<v-dialog <v-dialog v-model="dialog" width="800" overlay-color="#000" overlay-opacity="0.8">
v-model="dialog"
width="700"
overlay-color="#000"
overlay-opacity="0.8"
>
<v-card> <v-card>
<v-toolbar <v-card-title class="px-6 py-4 d-flex align-center justify-space-between">
<span class="custom-title-4">{{ label }}</span>
<a-button icon="close" type="text" @click="dialog = !dialog"></a-button>
</v-card-title>
<!-- <v-toolbar
:color="isDarkMode ? '#2d3355' : '#3f4d7d'" :color="isDarkMode ? '#2d3355' : '#3f4d7d'"
class="py-4 pr-3 pl-5" class="py-4 pr-3 pl-5"
height="auto" height="auto"
> >
<v-toolbar-title>{{ label }}</v-toolbar-title> <v-toolbar-title>{{ label }}</v-toolbar-title>
<!-- <v-btn </v-toolbar> -->
icon
tile
small
:ripple="false"
@click="dialog = !dialog"
:style="{ backgroundColor: isDarkMode ? '#2d3355' : '#3f4d7d' }"
>
<v-icon>mdi-close</v-icon>
</v-btn> -->
</v-toolbar>
<!-- <v-card-title> <!-- <v-card-title>
일정 상세 내용 일정 상세 내용
</v-card-title> --> </v-card-title> -->
<!-- <template v-for="(item, index) in detailList"> --> <!-- <template v-for="(item, index) in detailList"> -->
<template> <template>
<div style="padding : 20px"> <div class="pa-6 pt-0">
<v-row no-gutters class="mb-4">
<v-col :cols="12"> <v-col :cols="12">
<v-row>
<v-col :cols="3">
<v-row class="search-box" align="center" no-gutters>
<label class="search-box-label"> <label class="search-box-label">
<v-icon x-small color="#fb8200" class="mr-1" <v-icon small :class="['mr-1', 'icon-orange']">$icoBulletPoint</v-icon>
>mdi-record-circle</v-icon
>
일정 시작 일정 시작
</label> </label>
</v-row>
</v-col> </v-col>
<v-col :cols="4"> <v-col :cols="6" class="py-0 pr-2">
<!-- <DatePicker v-model="strtDt" :parentPrgmId="parentPrgmId"/> --> <!-- <DatePicker v-model="strtDt" :parentPrgmId="parentPrgmId"/> -->
<div class="startpicker-container2"> <div class="startpicker-container2">
<v-text-field <v-text-field id="startpicker2" ref="startpicker2" v-model="strtDt"
id="startpicker2" :class="'v-input__custom'" :hide-details="true" readonly outlined>
ref="startpicker2"
v-model="strtDt"
:class="'v-input__custom'"
:hide-details="true"
readonly
outlined
>
<template #append> <template #append>
<v-icon size="20">$icoCalendar</v-icon> <v-icon size="20">$icoCalendar</v-icon>
</template> </template>
<template #append-outer> <template #append-outer>
<div <div ref="startpicker-container2" id="startpicker-container2"></div>
ref="startpicker-container2"
id="startpicker-container2"
></div>
</template> </template>
</v-text-field> </v-text-field>
</div> </div>
</v-col> </v-col>
<v-col :cols="2"> <v-col :cols="6" class="py-0 pl-2">
<vue-numeric-input <!-- <DatePicker v-model="strtDt" :parentPrgmId="parentPrgmId"/> -->
v-model="strtHh" <component :parentPrgmId="parentPrgmId" :is="'SelectBoxTime'" ref="SelectBox1"
:min="0" :propsValue="selectTimeValue1" :itemList="selectTimeValueList1" :minInterval="selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1
:max="23" " @update:propsValue="selectTimeValue1 = $event" />
controls-type="updown" <!-- <div class="startpicker-container2">
class="v-input__slot" <v-text-field id="startpicker2" ref="startpicker2" v-model="strtDt"
width="100%" :class="'v-input__custom'" :hide-details="true" readonly outlined>
align="center" <template #append>
> <v-icon size="20">$icoCalendar</v-icon>
</template>
<template #append-outer>
<div ref="startpicker-container2" id="startpicker-container2"></div>
</template>
</v-text-field>
</div> -->
</v-col>
<!-- <v-col :cols="2">
<vue-numeric-input v-model="strtHh" :min="0" :max="23" controls-type="updown"
class="v-input__slot" width="100%" align="center">
</vue-numeric-input> </vue-numeric-input>
</v-col> </v-col>
<v-col :cols="1" style="text-align: center;"> <v-col :cols="1" style="text-align: center;">
: :
</v-col> </v-col>
<v-col :cols="2"> <v-col :cols="2">
<vue-numeric-input <vue-numeric-input v-model="strtMm" :min="0" :max="59" controls-type="updown"
v-model="strtMm" class="v-input__slot" width="100%" align="center">
:min="0"
:max="59"
controls-type="updown"
class="v-input__slot"
width="100%"
align="center"
>
</vue-numeric-input> </vue-numeric-input>
</v-col> </v-col> -->
</v-row> </v-row>
<v-row> <v-row no-gutters class="mb-4">
<v-col :cols="3"> <v-col :cols="12">
<v-row class="search-box" align="center" no-gutters>
<label class="search-box-label"> <label class="search-box-label">
<v-icon x-small color="#fb8200" class="mr-1" <v-icon small :class="['mr-1', 'icon-orange']">$icoBulletPoint</v-icon>
>mdi-record-circle</v-icon
>
일정 종료 일정 종료
</label> </label>
</v-row>
</v-col> </v-col>
<v-col :cols="4"> <v-col :cols="6" class="pr-2">
<!-- <DatePicker v-model="endDt" :parentPrgmId="parentPrgmId"/> --> <!-- <DatePicker v-model="endDt" :parentPrgmId="parentPrgmId"/> -->
<div class="startpicker-container3"> <div class="startpicker-container3">
<v-text-field <v-text-field id="startpicker3" ref="startpicker3" v-model="endDt"
id="startpicker3" :class="'v-input__custom'" :hide-details="true" readonly outlined>
ref="startpicker3"
v-model="endDt"
:class="'v-input__custom'"
:hide-details="true"
readonly
outlined
>
<template #append> <template #append>
<v-icon size="20">$icoCalendar</v-icon> <v-icon size="20">$icoCalendar</v-icon>
</template> </template>
<template #append-outer> <template #append-outer>
<div <div ref="startpicker-container3" id="startpicker-container3"></div>
ref="startpicker-container3"
id="startpicker-container3"
></div>
</template> </template>
</v-text-field> </v-text-field>
</div> </div>
</v-col> </v-col>
<v-col :cols="2"> <v-col :cols="6" class="pl-2">
<vue-numeric-input <component :parentPrgmId="parentPrgmId" :is="'SelectBoxTime'" ref="SelectBox2"
v-model="endHh" :propsValue="selectTimeValue2" :itemList="selectTimeValueList2" :minInterval="selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1
:min="0" " @update:propsValue="selectTimeValue2 = $event" />
:max="23" </v-col>
controls-type="updown" <!-- <v-col :cols="2">
class="v-input__slot" <vue-numeric-input v-model="endHh" :min="0" :max="23" controls-type="updown"
width="100%" class="v-input__slot" width="100%" align="center">
align="center"
>
</vue-numeric-input> </vue-numeric-input>
</v-col> </v-col>
<v-col :cols="1" style="text-align: center;"> <v-col :cols="1" style="text-align: center;">
: :
</v-col> </v-col>
<v-col :cols="2"> <v-col :cols="2">
<vue-numeric-input <vue-numeric-input v-model="endMm" :min="0" :max="59" controls-type="updown"
v-model="endMm" class="v-input__slot" width="100%" align="center">
:min="0"
:max="59"
controls-type="updown"
class="v-input__slot"
width="100%"
align="center"
>
</vue-numeric-input> </vue-numeric-input>
</v-col> </v-col> -->
</v-row> </v-row>
<v-row> <v-row no-gutters class="mb-4">
<v-col :cols="3"> <v-col :cols="12">
<v-row class="search-box" align="center" no-gutters>
<label class="search-box-label"> <label class="search-box-label">
<v-icon x-small color="#fb8200" class="mr-1" <v-icon small :class="['mr-1', 'icon-orange']">$icoBulletPoint</v-icon>
>mdi-record-circle</v-icon
>
일정 제목 일정 제목
</label> </label>
</v-row>
</v-col> </v-col>
<v-col :cols="9"> <v-col :cols="12" class="py-0">
<v-text-field <v-text-field v-model="planTitle" class="v-input__custom" outlined
v-model="planTitle" :hide-details="true"></v-text-field>
class="v-input__custom"
outlined
:hide-details="true"
></v-text-field>
</v-col> </v-col>
</v-row> </v-row>
<v-row> <v-row no-gutters class="mb-4">
<v-col :cols="3"> <v-col :cols="12">
<v-row class="search-box" align="center" no-gutters>
<label class="search-box-label"> <label class="search-box-label">
<v-icon x-small color="#fb8200" class="mr-1" <v-icon small :class="['mr-1', 'icon-orange']">$icoBulletPoint</v-icon>
>mdi-record-circle</v-icon
>
일정 상세 내용 일정 상세 내용
</label> </label>
</v-row>
</v-col> </v-col>
<v-col :cols="9"> <v-col :cols="12" class="py-0">
<v-textarea <v-textarea v-model="planCntn" class="v-input__custom" outlined :hide-details="true"
v-model="planCntn" :maxlength="1000"></v-textarea>
class="v-input__custom"
outlined
:hide-details="true"
:maxlength="1000"
></v-textarea>
</v-col> </v-col>
</v-row> </v-row>
<v-row> <v-row no-gutters class="mb-4">
<v-col :cols="3"> <v-col :cols="12">
<v-row class="search-box" align="center" no-gutters> <label class="search-box-label">
<v-icon x-small color="#fb8200" class="mr-1" <v-icon small :class="['mr-1', 'icon-orange']">$icoBulletPoint</v-icon>
>mdi-record-circle</v-icon
>
표시 색상 표시 색상
</v-row> </label>
</v-col> </v-col>
<v-col :cols="1"> <v-col :cols="6">
<div <div class="d-flex calendar-color" style="gap:16px">
id="redDiv"
class="colPk redBg" <div id="redDiv" class="colPk redBg" @click="colorClick('red')">
@click="colorClick('red')" <div class="inner-color"></div>
></div> </div>
</v-col>
<v-col :cols="1"> <div id="blueDiv" class="colPk blueBg" @click="colorClick('blue')">
<div <div class="inner-color"></div>
id="blueDiv" </div>
class="colPk blueBg"
@click="colorClick('blue')"
></div> <div id="pupleDiv" class="colPk pupleBg" @click="colorClick('puple')">
</v-col> <div class="inner-color"></div>
<v-col :cols="1"> </div>
<div
id="pupleDiv"
class="colPk pupleBg" <div id="greenDiv" class="colPk greenBg" @click="colorClick('green')">
@click="colorClick('puple')" <div class="inner-color"></div>
></div> </div>
</v-col>
<v-col :cols="1">
<div <div id="orangeDiv" class="colPk orangeBg" @click="colorClick('orange')">
id="greenDiv" <div class="inner-color"></div>
class="colPk greenBg" </div>
@click="colorClick('green')"
></div>
</v-col> <div id="pinkDiv" class="colPk pinkBg" @click="colorClick('pink')">
<v-col :cols="1"> <div class="inner-color"></div>
<div </div>
id="orangeDiv"
class="colPk orangeBg" </div>
@click="colorClick('orange')"
></div>
</v-col>
<v-col :cols="1">
<div
id="pinkDiv"
class="colPk pinkBg"
@click="colorClick('pink')"
></div>
</v-col> </v-col>
</v-row> </v-row>
</v-col>
</div> </div>
</template> </template>
<v-card-actions class="justify-end"> <v-card-actions class="justify-end">
<v-btn :ripple="false" @click="btnAction('save')">저장</v-btn> <a-button :ripple="false" @click="btnAction('close')" class="mr-2">닫기</a-button>
<v-btn <a-button type="primary" :ripple="false" @click="btnAction('save')" class="mr-2">저장</a-button>
v-show="popUpAction === 'update'" <a-button v-show="popUpAction === 'update'" type="danger" ghost danger :ripple="false"
:ripple="false" @click="btnAction('delete')">삭제</a-button>
@click="btnAction('delete')"
>삭제</v-btn
>
<v-btn :ripple="false" @click="btnAction('close')">닫기</v-btn>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -283,6 +206,7 @@ import DatePicker from '~/components/common/Datepicker';
import mixinGlobal from '@/mixin/global.js'; import mixinGlobal from '@/mixin/global.js';
import Utility from '~/plugins/utility'; import Utility from '~/plugins/utility';
import TuiDatepicker from 'tui-date-picker'; import TuiDatepicker from 'tui-date-picker';
import SelectBoxTime from "@/components/common/select/SelectBoxTime";
export default { export default {
mixins: [mixinGlobal], mixins: [mixinGlobal],
@ -310,6 +234,13 @@ export default {
type: String, type: String,
require: false, require: false,
}, },
selectBoxTimeItemList: {
type: Object,
require: false,
default: () => {
return {};
},
},
}, },
components: { components: {
InputText, InputText,
@ -323,6 +254,7 @@ export default {
Utility, Utility,
TuiDatepicker, TuiDatepicker,
VueNumericInput, VueNumericInput,
SelectBoxTime,
}, },
data() { data() {
return { return {
@ -345,7 +277,23 @@ export default {
planSeq: '', planSeq: '',
blocId: '', blocId: '',
addPlanData: { 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: { computed: {
@ -369,25 +317,29 @@ export default {
} }
}, },
strtDt(val) { strtDt(val) {
console.log('strtDt : ', val); // console.log('strtDt : ', val);
this.checkStrtAndEndDateTime('start'); this.checkStrtAndEndDateTime('start');
if (this.startDatepickerInstance3) { if (this.startDatepickerInstance3) {
this.startDatepickerInstance3.setDate(new Date(this.endDt)); this.startDatepickerInstance3.setDate(new Date(this.endDt));
} }
}, },
endDt(val) { endDt(val) {
console.log('endDt : ', val); // console.log('endDt : ', val);
this.checkStrtAndEndDateTime('end'); this.checkStrtAndEndDateTime('end');
if (this.startDatepickerInstance) { if (this.startDatepickerInstance) {
this.startDatepickerInstance.setDate(new Date(this.strtDt)); this.startDatepickerInstance.setDate(new Date(this.strtDt));
} }
}, },
strtHh(val) { strtHh(val) {
// const [hh, mm] = selectTimeValue1.split(':');
// console.log(`Hours: ${hh}, Minutes: ${mm}`);
console.log('strtHh : ', val); console.log('strtHh : ', val);
this.checkStrtAndEndDateTime('start'); this.checkStrtAndEndDateTime('start');
}, },
endHh(val) { endHh(val) {
console.log('endHh : ', val); // console.log('endHh : ', val);
this.checkStrtAndEndDateTime('end'); this.checkStrtAndEndDateTime('end');
}, },
strtMm(val) { strtMm(val) {
@ -396,6 +348,12 @@ export default {
endMm(val) { endMm(val) {
this.checkStrtAndEndDateTime('end'); this.checkStrtAndEndDateTime('end');
}, },
selectTimeValue1(val) {
this.setPageData({ selectTimeValue1: val });
},
selectTimeValue2(val) {
this.setPageData({ selectTimeValue2: val });
}
}, },
methods: { methods: {
...mapMutations({ ...mapMutations({
@ -578,10 +536,8 @@ export default {
let returnData = res[0]; let returnData = res[0];
this.strtDt = Utility.setFormatDate(returnData.strtDt, 'YYYY-MM-DD'); this.strtDt = Utility.setFormatDate(returnData.strtDt, 'YYYY-MM-DD');
this.endDt = Utility.setFormatDate(returnData.endDt, 'YYYY-MM-DD'); this.endDt = Utility.setFormatDate(returnData.endDt, 'YYYY-MM-DD');
this.strtHh = returnData.strtHh; this.selectTimeValue1 = returnData.strtHh+' : '+ returnData.strtMm;
this.strtMm = returnData.strtMm; this.selectTimeValue2 = returnData.endHh+' : '+ returnData.endMm;
this.endHh = returnData.endHh;
this.endMm = returnData.endMm;
this.planTitle = returnData.planTitle; this.planTitle = returnData.planTitle;
this.planCntn = returnData.planCntn; this.planCntn = returnData.planCntn;
this.planColor = returnData.planColor; this.planColor = returnData.planColor;
@ -598,10 +554,8 @@ export default {
if ( if (
this.strtDt === '' || this.strtDt === '' ||
this.endDt === '' || this.endDt === '' ||
this.strtHh === '' || this.selectTimeValue1 === '' ||
this.strtMm === '' || this.selectTimeValue2 === '' ||
this.endHh === '' ||
this.endMm === '' ||
this.planTitle === '' || this.planTitle === '' ||
this.planCntn === '' || this.planCntn === '' ||
this.planColor === '' this.planColor === ''
@ -615,10 +569,8 @@ export default {
if ( if (
this.strtDt == '' || this.strtDt == '' ||
this.endDt == '' || this.endDt == '' ||
this.strtHh == '' || this.selectTimeValue1 === '' ||
this.strtMm == '' || this.selectTimeValue2 === '' ||
this.endHh == '' ||
this.endMm == '' ||
this.planTitle == '' || this.planTitle == '' ||
this.planCntn == '' || this.planCntn == '' ||
this.planColor == '' this.planColor == ''
@ -638,13 +590,17 @@ export default {
//console.log(this); //console.log(this);
}, },
async insertDetail() { 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 = { var params = {
strtDt: this.strtDt, strtDt: this.strtDt,
endDt: this.endDt, endDt: this.endDt,
strtHh: this.strtHh.toString(), strtHh: strtHh.trim().toString(),
strtMm: this.strtMm.toString(), strtMm: strtMm.trim().toString(),
endHh: this.endHh.toString(), endHh: endHh.trim().toString(),
endMm: this.endMm.toString(), endMm: endMm.trim().toString(),
blocId: this.blocId, blocId: this.blocId,
planTitle: this.planTitle, planTitle: this.planTitle,
planCntn: this.planCntn, planCntn: this.planCntn,
@ -665,13 +621,16 @@ export default {
}); });
}, },
async updateDetail() { 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 = { var params = {
strtDt: this.strtDt.substr(0, 10), strtDt: this.strtDt.substr(0, 10),
endDt: this.endDt.substr(0, 10), endDt: this.endDt.substr(0, 10),
strtHh: this.strtHh.toString(), strtHh: strtHh.trim().toString(),
strtMm: this.strtMm.toString(), strtMm: strtMm.trim().toString(),
endHh: this.endHh.toString(), endHh: endHh.trim().toString(),
endMm: this.endMm.toString(), endMm: endMm.trim().toString(),
planTitle: this.planTitle, planTitle: this.planTitle,
planCntn: this.planCntn, planCntn: this.planCntn,
planColor: this.planColor, planColor: this.planColor,
@ -786,46 +745,80 @@ export default {
.v-card__actions { .v-card__actions {
padding-bottom: 30px !important; padding-bottom: 30px !important;
} }
.inner-color {
width: 100%;
height: 100%;
border-radius: 4px;
}
.colPk { .colPk {
width: 25px; width: 28px;
height: 25px; height: 28px;
text-align: center; text-align: center;
border-radius: 5px 5px; border-radius: 6px 6px;
cursor: pointer; cursor: pointer;
padding: 4px
} }
.colPkSelect { .colPkSelect {
border: 2px solid; border: 1px solid #00000073;
} }
.redBg {
.redBg .inner-color {
background-color: rgba(229, 62, 62, var(--bg-opacity)); background-color: rgba(229, 62, 62, var(--bg-opacity));
background-color: #e53e3e; background-color: #FF4D4F;
} }
.blueBg {
.blueBg .inner-color {
background-color: rgba(66, 153, 225, var(--bg-opacity)); background-color: rgba(66, 153, 225, var(--bg-opacity));
background-color: #4299e1; background-color: #597EF7;
} }
.pupleBg {
.pupleBg .inner-color {
background-color: rgba(102, 126, 234, var(--bg-opacity)); background-color: rgba(102, 126, 234, var(--bg-opacity));
background-color: #667eea; background-color: #9254DE;
} }
.greenBg {
.greenBg .inner-color {
background-color: rgba(56, 178, 172, var(--bg-opacity)); background-color: rgba(56, 178, 172, var(--bg-opacity));
background-color: #38b2ac; background-color: #73D13D;
} }
.orangeBg {
.orangeBg .inner-color {
background-color: rgba(237, 137, 54, var(--bg-opacity)); background-color: rgba(237, 137, 54, var(--bg-opacity));
background-color: #ed8936; background-color: #FFA940;
} }
.pinkBg {
.pinkBg .inner-color {
background-color: rgba(237, 100, 166, var(--bg-opacity)); background-color: rgba(237, 100, 166, var(--bg-opacity));
background-color: #ed64a6; background-color: #F759AB;
}
}
.v-input__custom {
&.half {
width: calc(50% - 20px);
}
}
::v-deep {
.tui-timepicker-row {
display: flex;
justify-content: space-around;
background-color: #edf4fc;
.tui-timepicker-column.tui-timepicker-colon {
color: #000 !important;
} }
} }
.startpicker-container2 { .startpicker-container2 {
display: flex;
align-items: center;
justify-content: space-between;
position: relative; position: relative;
.v-input { .v-input {
@ -844,10 +837,8 @@ export default {
} }
} }
.startpicker-container3 { .startpicker-container3 {
display: flex;
align-items: center;
justify-content: space-between;
position: relative; position: relative;
.v-input { .v-input {
@ -865,21 +856,5 @@ export default {
} }
} }
} }
.v-input__custom {
flex: 0 0 auto;
&.half {
width: calc(50% - 20px);
}
}
::v-deep {
.tui-timepicker-row {
display: flex;
justify-content: space-around;
background-color: #edf4fc;
.tui-timepicker-column.tui-timepicker-colon {
color: #000 !important;
}
}
} }
</style> </style>

View File

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

View File

@ -1,86 +1,60 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center">
<!-- <v-col v-if="label" cols="2"> --> <!-- <v-col v-if="label" cols="2"> -->
<v-col v-if="label" :cols="labelCols"> <v-col v-if="item.label" :cols="item.labelCols" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon v-if="item.iconShow" small
x-small :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
:color="item.required ? '#fb8200' : 'primary'"
class="mr-1"
>mdi-record-circle</v-icon
>
{{ item.label }} {{ item.label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? textCols : ''"> <v-col :cols="item.label ? item.textCols : ''" class="py-0">
<!-- <v-col :cols="label ? 9 : ''"> --> <!-- <v-col :cols="label ? 9 : ''"> -->
<!-- :value="textfield" --> <!-- :value="textfield" -->
<v-text-field <v-text-field readonly v-model="selectValue" append-icon="" class="v-input__custom"
readonly @click="dialog = !dialog" outlined :hide-details="true" :disabled="item.disabled || false"
v-model="selectValue" :required="item.required || false"><template v-slot:append>
append-icon="mdi-magnify" <!-- Custom SVG icon -->
class="v-input__custom" <v-icon>$icoSearch</v-icon>
@click="dialog = !dialog"
outlined
:hide-details="true" </template></v-text-field>
:disabled="item.disabled || false"
:required="item.required || false"
></v-text-field>
</v-col> </v-col>
<!-- <v-row justify="center"> --> <!-- <v-row justify="center"> -->
<v-dialog <v-dialog v-model="dialog" width="800px" scrollable>
ref="popModal"
v-model="dialog"
width="600"
overlay-color="#000"
overlay-opacity="0.8"
scrollable
>
<!-- <template v-slot:activator="{ on, attrs }"> <!-- <template v-slot:activator="{ on, attrs }">
<v-btn color="primary" dark v-bind="attrs" v-on="on">공정/설비</v-btn> <v-btn color="primary" dark v-bind="attrs" v-on="on">공정/설비</v-btn>
</template> --> </template> -->
<v-card style="height: 100%"> <v-card style="height: 100%">
<v-card-title <v-card-title class="px-6 py-4 d-flex align-center justify-space-between">
class="v-card__title d-flex align-center justify-space-between"
>
<span class="custom-title-4">{{ item.label }}</span> <span class="custom-title-4">{{ item.label }}</span>
<v-btn icon tile :ripple="false" @click="dialog = !dialog"> <a-button icon="close" type="text" @click="dialog = false"></a-button>
<v-icon>mdi-close</v-icon>
</v-btn>
</v-card-title> </v-card-title>
<!-- <v-card-actions> --> <!-- <v-card-actions> -->
<div class="pa-5"> <div class="pa-6 pt-0">
<!-- <v-text-field label="위치정보 선택"></v-text-field> --> <!-- <v-text-field label="위치정보 선택"></v-text-field> -->
<v-row align="center" no-gutters> <v-row align="center">
<v-col v-if="label" cols="3"> <v-col v-if="label" cols="12" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1" <v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
>mdi-record-circle</v-icon
>
{{ item.label }} {{ item.label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? 6 : ''"> <v-col :cols="label ? 8 : ''" class="py-0">
<!-- :value="textfield" --> <!-- :value="textfield" -->
<v-text-field <v-text-field append-icon="" class="v-input__custom" outlined :hide-details="true"
append-icon="mdi-magnify" v-model="searchWord" @keyup.enter="typeEnterKey"><template v-slot:append>
class="v-input__custom" <!-- Custom SVG icon -->
outlined <v-icon>$icoSearch</v-icon>
:hide-details="true"
v-model="searchWord"
@keyup.enter="typeEnterKey" </template></v-text-field>
></v-text-field>
</v-col> </v-col>
<v-spacer></v-spacer> <!-- <v-spacer></v-spacer> -->
<v-col cols="3" class="text-right"> <v-col cols="2" class="text-right">
<v-btn :ripple="false" icon tile @click="btnTreeExpand()"> <a-button icon="search" type="primary" @click="search()" class="search-button">조회</a-button>
<!-- {{ treeExpand }} -->
<v-icon
size="30"
v-text="treeExpandAll ? 'mdi-chevron-up' : 'mdi-chevron-down'"
></v-icon>
</v-btn>
<!-- <v-btn color="primary" dark>펼치기</v-btn> --> <!-- <v-btn color="primary" dark>펼치기</v-btn> -->
<!-- <v-btn color="primary" dark>접기</v-btn> --> <!-- <v-btn color="primary" dark>접기</v-btn> -->
<!-- <v-btn :ripple="false">초기화</v-btn> --> <!-- <v-btn :ripple="false">초기화</v-btn> -->
@ -88,6 +62,10 @@
<v-btn v-if="!searchParam.isMulti" :ripple="false" @click="search()">검색</v-btn> --> <v-btn v-if="!searchParam.isMulti" :ripple="false" @click="search()">검색</v-btn> -->
<!-- as-is 봐도 초기화가 하는 기능을 모르겠음.. --> <!-- as-is 봐도 초기화가 하는 기능을 모르겠음.. -->
</v-col> </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-row>
<!-- <v-btn color="primary" dark @click="btnTreeExpand()">{{ <!-- <v-btn color="primary" dark @click="btnTreeExpand()">{{
@ -98,45 +76,23 @@
<!-- <v-btn color="primary" dark>초기화</v-btn> --> <!-- <v-btn color="primary" dark>초기화</v-btn> -->
<!-- as-is 봐도 초기화가 하는 기능을 모르겠음.. --> <!-- as-is 봐도 초기화가 하는 기능을 모르겠음.. -->
</div> </div>
<!-- </v-card-actions> -->
<v-divider></v-divider>
<v-card-text> <v-card-text>
<div ref="treeGridParent" style="height: 500px"> <div ref="treeGridParent" style="height: 450px">
<component <component :ref="'treeGrid' + parentPrgmId" :is="loadGrid && dialog ? 'Grid' : null"
:ref="'treeGrid' + parentPrgmId" :gridName="gridNameTree" :dataPath="searchParam.modalData.selectReadObjListTree"
:is="loadGrid && dialog ? 'Grid' : null" :parentPrgmId="parentPrgmId" :bindingData="bindingData" @getRowsData="getRowData"
:gridName="gridNameTree" @dblClick="setUpdate()" />
:dataPath="searchParam.modalData.selectReadObjListTree"
:parentPrgmId="parentPrgmId"
:bindingData="bindingData"
@getRowsData="getRowData"
@dblClick="setUpdate()"
/>
</div> </div>
<!-- <component <!-- <component
:is="ftnPlcListTreeData.length > 0 ? 'Tree' : null" :is="ftnPlcListTreeData.length > 0 ? 'Tree' : null"
:tree-data="ftnPlcListTreeData" :tree-data="ftnPlcListTreeData"
/> --> /> -->
</v-card-text> </v-card-text>
<v-divider></v-divider>
<v-card-actions> <v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<v-spacer></v-spacer> <a-button :ripple="false" @click="dialog = false" class="mr-2">닫기</a-button>
<v-btn color="primary" dark @click="setUpdate()">확인</v-btn> <a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button>
<v-btn color="primary" dark @click="dialog = false">닫기</v-btn>
<!-- <v-btn
color="green darken-1"
text
@click="dialog = false"
>
Disagree
</v-btn>
<v-btn
color="green darken-1"
text
@click="dialog = false"
>
Agree
</v-btn> -->
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -308,10 +264,21 @@ export default {
gridKey: this.gridNameTree, gridKey: this.gridNameTree,
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
value: [ value: [
{
header: '',
name: '',
align: 'center',
width: 50,
formatter: (props) => {
return `<label class="custom-radio">
<span class="radio-mark"></span>
</label>`;
}
},
{ {
header: '검침개소명', header: '검침개소명',
name: 'readPlcNm', name: 'readPlcNm',
width: 370, width: 300,
align: 'left', align: 'left',
}, },
{ header: '검침개소', name: 'name', align: 'center' }, { header: '검침개소', name: 'name', align: 'center' },
@ -343,6 +310,10 @@ export default {
treeColumnOptions: { treeColumnOptions: {
name: 'readPlcNm', name: 'readPlcNm',
}, },
header: {
height: 37,
},
rowHeight: 'auto',
}; };
if (this.searchParam.isMulti) { if (this.searchParam.isMulti) {
myOptionsTree['rowHeaders'] = [{ type: 'checkbox' }]; myOptionsTree['rowHeaders'] = [{ type: 'checkbox' }];
@ -381,6 +352,8 @@ export default {
})), })),
}); });
// this.treeData = setTreeData; // this.treeData = setTreeData;
this.setModalGridData({ this.setModalGridData({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.gridNameTree, gridKey: this.gridNameTree,
@ -520,33 +493,9 @@ const selectReadObjListTree = {
} }
} }
.tui-grid-cell.tui-grid-cell-has-tree .tui-grid-cell.tui-grid-cell-has-tree .tui-grid-tree-extra-content+.tui-grid-cell-content:before {
.tui-grid-tree-extra-content
+ .tui-grid-cell-content:before {
content: none !important; content: none !important;
} }
} }
@each $theme in dark, light {
.v-application.#{$theme}-mode {
.v-dialog {
.v-card {
&__title {
color: map-deep-get($color, 'white', '0');
@if $theme == dark {
background-color: #2d3355;
.v-btn {
background-color: #2d3355;
}
} @else {
background-color: #3f4d7d;
.v-btn {
background-color: #3f4d7d;
}
}
}
}
}
}
}
</style> </style>

View File

@ -52,8 +52,8 @@
<v-row align="center"> <v-row align="center">
<v-col :cols="3" style="width: 100%"> <v-col :cols="3" style="width: 100%">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small :color="'primary'" class="mr-1" <v-icon small :color="'primary'" class="mr-1 icon-blue"
>mdi-record-circle</v-icon >$icoBulletPoint</v-icon
> >
TAG명 TAG명
</label> </label>
@ -69,12 +69,7 @@
></v-text-field> ></v-text-field>
</v-col> </v-col>
<v-col :cols="1" style="width: 100%" class="text-right"> <v-col :cols="1" style="width: 100%" class="text-right">
<v-btn <v-btn icon tile :ripple="false" @click="dialogOpenCloseEvent(dialog)">
icon
tile
:ripple="false"
@click="dialogOpenCloseEvent(dialog)"
>
<v-icon>mdi-close</v-icon> <v-icon>mdi-close</v-icon>
</v-btn> </v-btn>
</v-col> </v-col>
@ -93,10 +88,7 @@
<div :style="'height: 550px'" ref="modalGridDiv"> <div :style="'height: 550px'" ref="modalGridDiv">
<!-- <div :style="'height: 50vh'" ref="modalGridDiv"> --> <!-- <div :style="'height: 50vh'" ref="modalGridDiv"> -->
<!-- <div :style="'height: calc(50%)'"> --> <!-- <div :style="'height: calc(50%)'"> -->
<div <div class="d-flex align-center justify-space-between pa-4" style="height: 10%">
class="d-flex align-center justify-space-between pa-4"
style="height: 10%"
>
<v-card-title class="pa-0 custom-title-4">TAG 리스트</v-card-title> <v-card-title class="pa-0 custom-title-4">TAG 리스트</v-card-title>
</div> </div>
<!-- <div id="chartParent" ref="chartParent" :style="'height: 80%'"> --> <!-- <div id="chartParent" ref="chartParent" :style="'height: 80%'"> -->
@ -115,9 +107,7 @@
<v-divider></v-divider> <v-divider></v-divider>
<v-card-actions class="pa-5 d-flex align-center justify-center"> <v-card-actions class="pa-5 d-flex align-center justify-center">
<v-btn color="primary" dark @click="setUpdate()">확인</v-btn> <v-btn color="primary" dark @click="setUpdate()">확인</v-btn>
<v-btn color="primary" dark @click="dialogOpenCloseEvent(dialog)" <v-btn color="primary" dark @click="dialogOpenCloseEvent(dialog)">취소</v-btn>
>취소</v-btn
>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -125,35 +115,35 @@
</template> </template>
<script> <script>
import { mapState, mapMutations, mapActions } from 'vuex'; import { mapState, mapMutations, mapActions } from "vuex";
import Grid from '~/components/common/Grid'; import Grid from "~/components/common/Grid";
import Utility from '~/plugins/utility'; import Utility from "~/plugins/utility";
import selectCodeList from '@/components/common/select/selectCodeList'; import selectCodeList from "@/components/common/select/selectCodeList";
import InputText from '~/components/common/input/InputText'; import InputText from "~/components/common/input/InputText";
import Chart from '~/components/common/Chart'; import Chart from "~/components/common/Chart";
import SelectBox from '@/components/common/select/SelectBox'; import SelectBox from "@/components/common/select/SelectBox";
export default { export default {
props: { props: {
parentPrgmId: { parentPrgmId: {
type: String, type: String,
require: true, require: true,
default: '비교대상 최대(20개)', default: "비교대상 최대(20개)",
}, },
label: { label: {
type: String, type: String,
require: false, require: false,
default: '전력 계약 정보', default: "전력 계약 정보",
}, },
valueNm: { valueNm: {
type: String, type: String,
require: false, require: false,
default: '', default: "",
}, },
title: { title: {
type: String, type: String,
require: false, require: false,
default: '전력 계약 목록', default: "전력 계약 목록",
}, },
labelCols: { labelCols: {
type: Number, type: Number,
@ -185,9 +175,9 @@ export default {
data() { data() {
return { return {
labelPrepend: true, labelPrepend: true,
gridName: 'grid_01', gridName: "grid_01",
myModalKey: 'tagTrndPop', myModalKey: "tagTrndPop",
modalDataKey: 'tagTrndPopModalData', modalDataKey: "tagTrndPopModalData",
// gridName: 'rowElecContGrid', // gridName: 'rowElecContGrid',
loadChart: false, loadChart: false,
// selectedTargetMonth: 'all', // selectedTargetMonth: 'all',
@ -198,11 +188,11 @@ export default {
selectValueList02: [], selectValueList02: [],
selectValue03: null, selectValue03: null,
selectValueList03: [], selectValueList03: [],
searchWord: '', searchWord: "",
loadGrid: false, loadGrid: false,
initFlag: false, initFlag: false,
selectedData: {}, selectedData: {},
totalSelectedTags: '', totalSelectedTags: "",
}; };
}, },
computed: { computed: {
@ -214,18 +204,16 @@ export default {
myBindingData(state) { myBindingData(state) {
//return state.pageData[this.parentPrgmId]["rowGridSelectData"]; //return state.pageData[this.parentPrgmId]["rowGridSelectData"];
if (!this.bindingData) { if (!this.bindingData) {
return state.pageData[this.parentPrgmId]['rowGridSelectData']; return state.pageData[this.parentPrgmId]["rowGridSelectData"];
} else { } else {
return state.pageData[this.parentPrgmId][this.bindingData][ return state.pageData[this.parentPrgmId][this.bindingData]["rowGridSelectData"];
'rowGridSelectData'
];
} }
}, },
// chkTotalSelectedTags(state) { // chkTotalSelectedTags(state) {
// return state.pageData[this.parentPrgmId]['totalSelectedTags']; // return state.pageData[this.parentPrgmId]['totalSelectedTags'];
// } // }
chkTotalSelectedTags(state) { chkTotalSelectedTags(state) {
return this.searchParam['totalSelectedTags']; return this.searchParam["totalSelectedTags"];
}, },
}), }),
chkDialog() { chkDialog() {
@ -280,14 +268,14 @@ export default {
}, },
beforeCreate() { beforeCreate() {
this.$store.commit('setPageData', { this.$store.commit("setPageData", {
tagTrndPopModalData: { tagTrndPop }, tagTrndPopModalData: { tagTrndPop },
}); });
}, },
async created() { async created() {
await this.setSelectValueList01(); // await this.setSelectValueList01();
await this.setSelectValueList02(); // await this.setSelectValueList02();
await this.setSelectValueList03(); // await this.setSelectValueList03();
this.init(); this.init();
// if(this.searchParam.isMulti == true){ // if(this.searchParam.isMulti == true){
// this.setPageData({ // this.setPageData({
@ -301,13 +289,13 @@ export default {
}, },
methods: { methods: {
...mapMutations({ ...mapMutations({
setPageData: 'setPageData', setPageData: "setPageData",
setModalGridData: 'setModalGridData', setModalGridData: "setModalGridData",
setModalGridColumn: 'setModalGridColumn', setModalGridColumn: "setModalGridColumn",
setModalGridOption: 'setModalGridOption', setModalGridOption: "setModalGridOption",
}), }),
...mapActions({ ...mapActions({
postApiReturn: 'modules/list/postApiReturn', postApiReturn: "modules/list/postApiReturn",
}), }),
async init() { async init() {
// this.setChart(); // this.setChart();
@ -317,8 +305,8 @@ export default {
}, },
async setSelectValueList01() { async setSelectValueList01() {
let res = await this.postApiReturn({ let res = await this.postApiReturn({
apiKey: 'selectEqpmKindCodeList', apiKey: "selectEqpmKindCodeList",
resKey: 'eqpmKindCodeLists', resKey: "eqpmKindCodeLists",
sendParam: {}, sendParam: {},
}); });
@ -328,7 +316,7 @@ export default {
// }); // });
if (res.length > 0) { if (res.length > 0) {
this.selectValueList01 = await res.map(item => { this.selectValueList01 = await res.map((item) => {
return { return {
text: item.eqpmKindNm, text: item.eqpmKindNm,
value: item.eqpmKindId, value: item.eqpmKindId,
@ -345,12 +333,12 @@ export default {
}, },
async setSelectValueList02() { async setSelectValueList02() {
let res = await this.postApiReturn({ let res = await this.postApiReturn({
apiKey: 'selectEqpmGrpCodeList', apiKey: "selectEqpmGrpCodeList",
resKey: 'eqpmGrpCodeLists', resKey: "eqpmGrpCodeLists",
sendParam: { eqpmKindId: this.selectValue01 }, sendParam: { eqpmKindId: this.selectValue01 },
}); });
if (res.length > 0) { if (res.length > 0) {
this.selectValueList02 = await res.map(item => { this.selectValueList02 = await res.map((item) => {
return { return {
text: item.eqpmGrpNm, text: item.eqpmGrpNm,
value: item.eqpmGrpId, value: item.eqpmGrpId,
@ -368,14 +356,14 @@ export default {
}, },
async setSelectValueList03() { async setSelectValueList03() {
var res = await this.postApiReturn({ var res = await this.postApiReturn({
apiKey: 'selectEqpmBaseInfo', apiKey: "selectEqpmBaseInfo",
resKey: 'eqpmBaseInfoData', resKey: "eqpmBaseInfoData",
sendParam: { sendParam: {
eqpmGrpId: this.selectValue02, eqpmGrpId: this.selectValue02,
}, },
}); });
if (res.length > 0) { if (res.length > 0) {
this.selectValueList03 = await res.map(item => { this.selectValueList03 = await res.map((item) => {
return { return {
text: item.eqpmNm, text: item.eqpmNm,
value: item.eqpmId, value: item.eqpmId,
@ -385,12 +373,12 @@ export default {
}; };
}); });
this.selectValueList03.unshift({ this.selectValueList03.unshift({
text: '전체', text: "전체",
value: 'all', value: "all",
}); });
// 설비 그룹을 변경하여 설비를 다시 조회하였지만 이전에 조회한 값이 '전체'일 경우 // 설비 그룹을 변경하여 설비를 다시 조회하였지만 이전에 조회한 값이 '전체'일 경우
// watch에서 값 변화를 인지 못하기 때문에 여기서 조회 시킨다. // watch에서 값 변화를 인지 못하기 때문에 여기서 조회 시킨다.
if (this.selectValue03 == 'all' && this.initFlag) { if (this.selectValue03 == "all" && this.initFlag) {
this.search(); this.search();
} }
this.selectValue03 = this.selectValueList03[0].value; this.selectValue03 = this.selectValueList03[0].value;
@ -404,17 +392,17 @@ export default {
if (this.selectedData.tagId != undefined) { if (this.selectedData.tagId != undefined) {
let res = this.chkDuplicateTagId(this.selectedData.tagId); let res = this.chkDuplicateTagId(this.selectedData.tagId);
if (res) { if (res) {
alert('TAG가 중복 됩니다.'); alert("TAG가 중복 됩니다.");
} else { } else {
if (this.selectedData.tagId != undefined) { if (this.selectedData.tagId != undefined) {
} }
this.dialog = false; this.dialog = false;
for (var key in this.searchParam['rowGrid']['defaultRow']) { for (var key in this.searchParam["rowGrid"]["defaultRow"]) {
let dt = { let dt = {
columnName: key, columnName: key,
value: this.selectedData[key], value: this.selectedData[key],
}; };
this.$emit('gridEditingFinish', dt); this.$emit("gridEditingFinish", dt);
this.setPageData({ rowGridSelectData: this.selectedData }); this.setPageData({ rowGridSelectData: this.selectedData });
} }
// this.$emit('gridEditingFinish', dt); // this.$emit('gridEditingFinish', dt);
@ -433,15 +421,15 @@ export default {
this.setPageData({ tagList: tagList }); this.setPageData({ tagList: tagList });
} }
} else { } else {
alert('TAG를 선택해주세요.'); alert("TAG를 선택해주세요.");
} }
}, },
dialogOpenCloseEvent(val) { dialogOpenCloseEvent(val) {
this.searchWord = ''; this.searchWord = "";
if (val) { if (val) {
this.dialog = !val; this.dialog = !val;
} else { } else {
this.$emit('closePopEvent'); this.$emit("closePopEvent");
} }
}, },
async search() { async search() {
@ -453,6 +441,9 @@ export default {
columnOptions: { columnOptions: {
resizable: true, resizable: true,
}, },
header: {
height: 38,
},
}; };
this.setModalGridOption({ this.setModalGridOption({
modalKey: this.myModalKey, modalKey: this.myModalKey,
@ -461,24 +452,24 @@ export default {
value: Object.assign( value: Object.assign(
// Utility.defaultGridOption(this.$refs.modalGridParent.offsetHeight - 60, myOptions), // Utility.defaultGridOption(this.$refs.modalGridParent.offsetHeight - 60, myOptions),
Utility.defaultGridOption(460, myOptions), Utility.defaultGridOption(460, myOptions),
myOptions, myOptions
), ),
}); });
const _this = this; const _this = this;
const myColumns = [ const myColumns = [
// { header: '가이드ID', name: 'gdIdxId', align: 'center', hidden: true}, // { header: '가이드ID', name: 'gdIdxId', align: 'center', hidden: true},
{ header: '설비그룹', name: 'eqpmGrpNm', align: 'center', width: 130 }, { header: "설비그룹", name: "eqpmGrpNm", align: "left", width: 130 },
{ {
header: '설비그룹 ID', header: "설비그룹 ID",
name: 'eqpmGrpId', name: "eqpmGrpId",
align: 'center', align: "center",
hidden: true, hidden: true,
}, },
{ header: '설비ID', name: 'eqpmId', align: 'left', width: 130 }, { header: "설비ID", name: "eqpmId", align: "left", width: 130 },
{ header: '설비명', name: 'eqpmNm', align: 'left', width: 130 }, { header: "설비명", name: "eqpmNm", align: "left", width: 130 },
{ header: 'TAG ID', name: 'tagId', align: 'left', width: 470 }, { header: "TAG ID", name: "tagId", align: "left", width: 470 },
{ header: 'TAG 명', name: 'tagNm', align: 'left' }, { header: "TAG 명", name: "tagNm", align: "left" },
{ header: 'rowStat', name: 'rowStat', align: 'center', hidden: true }, { header: "rowStat", name: "rowStat", align: "center", hidden: true },
]; ];
this.setModalGridColumn({ this.setModalGridColumn({
modalKey: this.myModalKey, modalKey: this.myModalKey,
@ -486,6 +477,7 @@ export default {
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
value: myColumns, value: myColumns,
}); });
this.loadGrid = true; this.loadGrid = true;
}, },
async setGridData() { async setGridData() {
@ -495,16 +487,44 @@ export default {
eqpmId: this.selectValue03, eqpmId: this.selectValue03,
searchWord: this.searchWord, searchWord: this.searchWord,
}; };
let res = []; let res = [
res = await this.postApiReturn({ {
apiKey: 'selectTagAndEqpmList', eqpmGrpNm: "냉각 시스템",
resKey: 'tagTrndDatas', eqpmGrpId: "GRP001",
sendParam: searchParam, 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 newRes = []; let newRes = [];
if (this.searchParam['tagList'].length > 0) { if (this.searchParam["tagList"].length > 0) {
newRes = res.filter(item => { newRes = res.filter((item) => {
return !this.searchParam['tagList'].includes(item.tagId); return !this.searchParam["tagList"].includes(item.tagId);
}); });
res = newRes; res = newRes;
} }

View File

@ -0,0 +1,138 @@
<template>
<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>
{{ label }}
</label>
</v-col>
<v-col :cols="label ? 'auto' : ''">
<v-radio-group
v-model="selected"
required:rules="radioRules"
row
dense
:hide-details="true"
>
<v-radio
label="월별"
value="CYC_YEAR"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
<v-radio
label="일별"
value="CYC_MONTH"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
<v-radio
label="시간별"
value="CYC_DAY"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
</v-radio-group>
<!-- @change="updateBlocCode($event)" -->
</v-col>
</v-row>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import Utility from '~/plugins/utility';
export default {
props: {
parentPrgmId: {
type: String,
require: true,
},
label: {
type: String,
require: false,
default: '주기',
},
labelCols: {
type: Number,
require: false,
default: 4,
},
textCols: {
type: Number,
require: false,
default: 7,
},
},
data() {
return {
labelPrepend: true,
// selected:"CYC_DAY"
};
},
computed: {
...mapState({
searchParam: state => state.pageData,
isDarkMode: 'isDarkMode',
}),
selected: {
get() {
return this.searchParam[this.parentPrgmId].cmCycle;
},
set(value) {
this.setDefaultDate(value);
return this.setPageData({ cmCycle: value });
},
},
},
watch: {},
created() {
// this.setDefaultDate(this.searchParam[this.parentPrgmId].cmCycle);
},
async mounted() {},
methods: {
...mapMutations({ setPageData: 'setPageData' }),
...mapActions({}),
setDefaultDate(value) {
// console.log("주기에 따른 오늘 기준 기본 날짜 세팅");
const today = Utility.setFormatDate('today', 'YYYY-MM-DD');
let srartDate = '';
let endDate = '';
// console.log(value);
switch (value) {
case 'CYC_YEAR':
// endDate = today;
srartDate = Utility.setFormatDate(today, 'YYYY');
break;
case 'CYC_MONTH':
// endDate = today;
srartDate = Utility.setFormatDate(today, 'YYYY-MM');
// endDate = today;
// srartDate = Utility.setBeforetDate(
// this.searchParam[this.parentPrgmId],
// endDate,
// "YYYYMMDD"
// );
break;
case 'CYC_DAY':
// endDate = today;
srartDate = today;
break;
default:
break;
}
this.setPageData({ fromDt: srartDate });
// console.log(this.searchParam[this.parentPrgmId].cmCycle);
// console.log(this.searchParam[this.parentPrgmId].dateRange);
},
},
};
</script>
<style></style>

View File

@ -0,0 +1,113 @@
<template>
<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>
{{ label }}
</label>
</v-col>
<v-col :cols="label ? textCols : ''">
<v-radio-group
v-model="selected"
required:rules="radioRules"
row
hide-details
dense
>
<v-radio
label="태그"
value="tag"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
<v-radio
label="검침개소"
value="readPlc"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
<v-radio
label="공정"
value="ecc"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
<v-radio
label="설비"
value="eqpm"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
</v-radio-group>
<!-- @change="updateBlocCode($event)" -->
</v-col>
</v-row>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import Utility from '~/plugins/utility';
export default {
props: {
parentPrgmId: {
type: String,
require: true,
},
labelCols: {
type: Number,
require: false,
default: 4,
},
textCols: {
type: Number,
require: false,
default: 7,
},
},
data() {
return {
label: '기준',
labelPrepend: true,
// selected:"CYC_DAY"
};
},
computed: {
...mapState({
isDarkMode: 'isDarkMode',
searchParam: state => state.pageData,
}),
selected: {
get() {
return this.searchParam[this.parentPrgmId].rdbStandard;
},
set(value) {
return this.setPageData({ rdbStandard: value });
},
},
},
watch: {
selected(value) {
// 주기에 따른 오늘 기준 기본 날짜 세팅
this.setDefaultDate(value);
},
},
created() {
// this.setDefaultDate(this.searchParam[this.parentPrgmId].cmCycle);
},
async mounted() {},
methods: {
...mapMutations({ setPageData: 'setPageData' }),
...mapActions({}),
setDefaultDate(value) {
this.setPageData({ rdbStandard: value });
},
},
};
</script>
<style></style>

View File

@ -0,0 +1,99 @@
<template>
<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>
{{ label }}
</label>
</v-col>
<v-col :cols="label ? textCols : ''">
<v-radio-group
v-model="selected"
required:rules="radioRules"
row
hide-details
dense
>
<v-radio
label="사용량"
value="use"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
<v-radio
label="비용"
value="cost"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
</v-radio-group>
<!-- @change="updateBlocCode($event)" -->
</v-col>
</v-row>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import Utility from '~/plugins/utility';
export default {
props: {
parentPrgmId: {
type: String,
require: true,
},
labelCols: {
type: Number,
require: false,
default: 4,
},
textCols: {
type: Number,
require: false,
default: 7,
},
},
data() {
return {
label: '구분',
labelPrepend: true,
// selected:"CYC_DAY"
};
},
computed: {
...mapState({
isDarkMode: 'isDarkMode',
searchParam: state => state.pageData,
}),
selected: {
get() {
return this.searchParam[this.parentPrgmId].rdbUseCost;
},
set(value) {
return this.setPageData({ rdbUseCost: value });
},
},
},
watch: {
selected(value) {
// 주기에 따른 오늘 기준 기본 날짜 세팅
this.setDefaultDate(value);
},
},
created() {
// this.setDefaultDate(this.searchParam[this.parentPrgmId].cmCycle);
},
async mounted() {},
methods: {
...mapMutations({ setPageData: 'setPageData' }),
...mapActions({}),
setDefaultDate(value) {
this.setPageData({ rdbUseCost: value });
},
},
};
</script>
<style></style>

View File

@ -0,0 +1,97 @@
<template>
<v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label">
{{ label }}
</label>
</v-col>
<v-col :cols="label ? textCols : ''">
<v-radio-group
v-model="selectedView"
required:rules="radioRules"
row
dense
:hide-details="true"
>
<v-radio
label="전체"
value="viewAll"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
<v-radio
label="차트"
value="viewChart"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
<v-radio
label="그리드"
value="viewGrid"
:ripple="false"
:color="isDarkMode ? '#1b74d7' : '#4777d9'"
on-icon="mdi-record-circle"
></v-radio>
</v-radio-group>
<!-- @change="updateBlocCode($event)" -->
</v-col>
</v-row>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import Utility from '~/plugins/utility';
export default {
props: {
parentPrgmId: {
type: String,
require: true,
},
labelCols: {
type: Number,
require: false,
default: 4,
},
textCols: {
type: Number,
require: false,
default: 8,
},
},
data() {
return {
label: '',
labelPrepend: true,
// selected:"CYC_DAY"
};
},
computed: {
...mapState({
searchParam: state => state.pageData,
isDarkMode: 'isDarkMode',
}),
selectedView: {
get() {
return this.searchParam[this.parentPrgmId].viewCheck;
},
set(value) {
return this.setPageData({ viewCheck: value });
},
},
},
watch: {},
created() {
// this.setDefaultDate(this.searchParam[this.parentPrgmId].cmCycle);
},
async mounted() {},
methods: {
...mapMutations({ setPageData: 'setPageData' }),
...mapActions({}),
},
};
</script>
<style></style>

View File

@ -7,7 +7,12 @@
> >
<v-col v-if="item.label" :cols="labelCol"> <v-col v-if="item.label" :cols="labelCol">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1">mdi-record-circle</v-icon> <v-icon
small
:class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
>
<!-- <v-icon x-small color="primary" class="mr-1">mdi-record-circle</v-icon> -->
{{ item.label }} {{ item.label }}
</label> </label>
</v-col> </v-col>

View File

@ -3,8 +3,12 @@
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<!-- <v-icon x-small :color="'#fb8200'" class="mr-1" --> <!-- <v-icon x-small :color="'#fb8200'" class="mr-1" -->
<v-icon x-small :color="'#4777d9'" class="mr-1" <v-icon
>mdi-record-circle</v-icon v-if="iconShow"
small
:color="'#4777d9'"
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
> >
{{ label }} {{ label }}
</label> </label>
@ -18,7 +22,7 @@
solo solo
outlined outlined
append-icon="mdi-chevron-down" append-icon="mdi-chevron-down"
class="v-select__custom" :class="['v-select__custom', customClass]"
></v-select> ></v-select>
</v-col> </v-col>
</v-row> </v-row>
@ -61,12 +65,21 @@ export default {
textCols: { textCols: {
type: Number, type: Number,
require: false, require: false,
default: 7, default: 12,
}, },
labelCols: { labelCols: {
type: Number, type: Number,
require: false, require: false,
default: 4, default: 12,
},
iconShow: {
type: Boolean,
require: false,
default: true
},
customClass: {
type: String,
require: false,
}, },
}, },
data() { data() {

View File

@ -2,22 +2,16 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1">mdi-record-circle</v-icon> <v-icon v-if="iconShow" small :class="['mr-1', required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? textCols : ''"> <v-col :cols="label ? textCols : ''">
<v-select <v-select v-model="selectValue" :items="searchParam[parentPrgmId].blocMstrList"
v-model="selectValue" item-text="blocNm" item-value="idx" append-icon="" outlined
:items="searchParam[parentPrgmId].blocMstrList" :hide-details="true" :class="['v-select__custom', customClass]">
label="사업장을 선택하세요" <template v-slot:append><v-icon>$icoChevronDown</v-icon></template>
item-text="blocNm" </v-select>
item-value="idx"
solo
append-icon="mdi-chevron-down"
class="v-select__custom"
outlined
></v-select>
</v-col> </v-col>
</v-row> </v-row>
</template> </template>
@ -56,6 +50,21 @@ export default {
require: false, require: false,
default: 4, default: 4,
}, },
required: {
type: Boolean,
require: false,
default: false
},
iconShow: {
type: Boolean,
require: false,
default: true,
},
customClass: {
type: String,
require: false,
default: null,
}
}, },
data() { data() {
return { return {

View File

@ -2,26 +2,24 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon v-if="iconShow" x-small <v-icon
:color="required ? '#fb8200' : 'primary'" v-if="iconShow"
class="mr-1">mdi-record-circle</v-icon> small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? textCols : ''"> <v-col :cols="label ? textCols : ''">
<v-select <v-select v-model="innerValue" :items="itemList" item-text="text" item-value="value" solo outlined
v-model="innerValue" :hide-details="true" append-icon="" :class="['v-select__custom', customClass]" :disabled="disabled"
:items="itemList" :readonly="readonly"><template v-slot:append>
item-text="text" <!-- Custom SVG icon -->
item-value="value" <v-icon>$icoChevronDown</v-icon>
solo
outlined
:hide-details="true" </template></v-select>
append-icon="mdi-chevron-down"
class="v-select__custom"
:disabled="disabled"
:readonly="readonly"
></v-select>
<!-- @change="updateBlocCode($event)" --> <!-- @change="updateBlocCode($event)" -->
</v-col> </v-col>
</v-row> </v-row>
@ -44,12 +42,12 @@ export default {
textCols: { textCols: {
type: Number, type: Number,
require: false, require: false,
default: 8, default: 12,
}, },
labelCols: { labelCols: {
type: Number, type: Number,
require: false, require: false,
default: 4, default: 12,
}, },
itemList: { itemList: {
type: Array, type: Array,
@ -81,6 +79,10 @@ export default {
require: false, require: false,
default: false default: false
}, },
customClass: {
type: String,
require: false,
},
}, },
emits: ['update:propsValue'], emits: ['update:propsValue'],
data() { data() {

View File

@ -2,9 +2,12 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon v-if="iconShow" x-small <v-icon
:color="required ? '#fb8200' : 'primary'" v-if="iconShow"
class="mr-1">mdi-record-circle</v-icon> small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
@ -14,16 +17,16 @@
:items="itemList" :items="itemList"
item-text="text" item-text="text"
item-value="value" item-value="value"
solo
outlined outlined
:multiple="multiple" :multiple="multiple"
:hide-details="true" :hide-details="true"
append-icon="mdi-chevron-down" :class="['v-select__custom', customClass]"
class="v-select__custom"
:disabled="disabled" :disabled="disabled"
:readonly="readonly" :readonly="readonly"
></v-select> append-icon=""
<!-- @change="updateBlocCode($event)" --> ><template v-slot:append>
<v-icon>$icoChevronDown</v-icon>
</template></v-select>
</v-col> </v-col>
</v-row> </v-row>
</template> </template>
@ -87,6 +90,10 @@ export default {
require:false, require:false,
default:false default:false
}, },
customClass: {
type: String,
require: false,
},
}, },
emits: ['update:propsValue'], emits: ['update:propsValue'],
data() { data() {

View File

@ -2,9 +2,13 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon v-if="iconShow" x-small <v-icon
v-if="iconShow"
x-small
:color="required ? '#fb8200' : 'primary'" :color="required ? '#fb8200' : 'primary'"
class="mr-1">mdi-record-circle</v-icon> class="mr-1"
>mdi-record-circle</v-icon
>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
@ -18,20 +22,30 @@
outlined outlined
:menu-props="{ auto: true, offsetY: true }" :menu-props="{ auto: true, offsetY: true }"
:hide-details="true" :hide-details="true"
append-icon="mdi-chevron-down"
:class="'v-select__custom'" :class="'v-select__custom'"
:disabled="disabled" :disabled="disabled"
:readonly="readonly" :readonly="readonly"
@click="setDatepickerHide" @click="setDatepickerHide"
></v-select> style="min-width: 170px;"
>
<template v-slot:append>
<a-icon
class="v-icon"
type="clock-circle"
style="width: 14px; height: 14px; color: #00000073"
/>
</template>
</v-select>
<!-- @change="updateBlocCode($event)" --> <!-- @change="updateBlocCode($event)" -->
</v-col> </v-col>
</v-row> </v-row>
</template> </template>
<script> <script>
import { mapState, mapMutations, mapActions } from 'vuex'; import { mapState, mapMutations, mapActions } from "vuex";
export default { export default {
components: {},
props: { props: {
parentPrgmId: { parentPrgmId: {
type: String, type: String,
@ -70,36 +84,36 @@ export default {
required: { required: {
type: Boolean, type: Boolean,
require: false, require: false,
default:false default: false,
}, },
iconShow: { iconShow: {
type: Boolean, type: Boolean,
require: false, require: false,
default:true default: true,
}, },
disabled: { disabled: {
type: Boolean, type: Boolean,
require: false, require: false,
default:false default: false,
}, },
readonly: { readonly: {
type: Boolean, type: Boolean,
require: false, require: false,
default:false default: false,
}, },
minInterval: { minInterval: {
type: Number, type: Number,
require: false, require: false,
default:1 default: 1,
}
}, },
emits: ['update:propsValue'], },
emits: ["update:propsValue"],
data() { data() {
return {}; return {};
}, },
computed: { computed: {
...mapState({ ...mapState({
searchParam: state => state.pageData, searchParam: (state) => state.pageData,
}), }),
timeInnerValue: { timeInnerValue: {
get() { get() {
@ -107,9 +121,9 @@ export default {
}, },
set(value) { set(value) {
// console.log('value[setValue] : ', value) // console.log('value[setValue] : ', value)
this.$emit('update:propsValue', value); this.$emit("update:propsValue", value);
},
}, },
}
}, },
created() { created() {
this.getTimeList(); this.getTimeList();
@ -118,20 +132,18 @@ export default {
// console.log('propsValue : ', this.propsValue); // console.log('propsValue : ', this.propsValue);
}, },
methods: { methods: {
...mapMutations({ setPageData: 'setPageData' }), ...mapMutations({ setPageData: "setPageData" }),
...mapActions({}), ...mapActions({}),
getTimeList() { getTimeList() {
for (var i = 0; i < 24; i++) { for (var i = 0; i < 24; i++) {
let hour = i.toString().padStart(2, '0'); let hour = i.toString().padStart(2, "0");
for (var j = 0; j < 60; j++) { for (var j = 0; j < 60; j++) {
if (j % this.minInterval === 0) { if (j % this.minInterval === 0) {
let min = j.toString().padStart(2, '0'); let min = j.toString().padStart(2, "0");
this.itemList.push( this.itemList.push({
{ text: hour + " : " + min,
'text' : hour + ' : ' + min, value: hour + " : " + min,
'value': hour + ' : ' + min });
}
)
} }
} }
} }
@ -141,15 +153,14 @@ export default {
// datepicker 선택 중 시간 selectBox를 고를 경우 datepicker를 hidden 시키는 기능 // datepicker 선택 중 시간 selectBox를 고를 경우 datepicker를 hidden 시키는 기능
if (document.querySelector("#startpicker-container > div") != undefined) { if (document.querySelector("#startpicker-container > div") != undefined) {
let datepicker1 = document.querySelector("#startpicker-container > div"); let datepicker1 = document.querySelector("#startpicker-container > div");
datepicker1.classList.add('tui-hidden'); datepicker1.classList.add("tui-hidden");
} }
if (document.querySelector("#endpicker-container > div") != undefined) { if (document.querySelector("#endpicker-container > div") != undefined) {
let datepicker2 = document.querySelector("#endpicker-container > div"); let datepicker2 = document.querySelector("#endpicker-container > div");
datepicker2.classList.add('tui-hidden'); datepicker2.classList.add("tui-hidden");
}
} }
}, },
},
}; };
</script> </script>

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