Compare commits

...

46 Commits

Author SHA1 Message Date
205821fc11 fix ui EvtObjPop 2025-07-30 11:39:45 +09:00
bea1e0889b dev-manhph1-add-pagination-28 2025-07-29 18:30:19 +09:00
34d03b2546 dev-manhph1-fixbug-18-19-21-28 2025-07-29 17:18:41 +09: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
218 changed files with 38400 additions and 28295 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,22 +89,69 @@
} }
} }
} }
.tui-grid-scrollbar-right-top{
z-index:5; .tui-grid-scrollbar-right-top {
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: 1px solid;
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},
"scrollbar-track" "scrollbar-track"
) !important; ) !important;
@ -96,8 +159,7 @@
} }
& ::-webkit-scrollbar-track { & ::-webkit-scrollbar-track {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"scrollbar-track" "scrollbar-track"
) !important; ) !important;
@ -109,6 +171,16 @@
background-color: map-deep-get($config, #{$theme}, "scrollbar-thumb"); background-color: map-deep-get($config, #{$theme}, "scrollbar-thumb");
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,26 +193,28 @@
} }
&-scrollbar-right-top { &-scrollbar-right-top {
background-color: map-deep-get( background-color: rgba(0, 0, 0, 0);
$config, border: none;
#{$theme}, // background-color: map-deep-get(
"tui-grid-header-backgroundColor" // $config,
); // #{$theme},
border-left-color: map-deep-get( // "tui-grid-header-backgroundColor"
$config, // );
#{$theme}, // border-left-color: map-deep-get(
"tui-grid-border-horziontal-color" // $config,
); // #{$theme},
border-right-color: map-deep-get( // "tui-grid-border-horziontal-color"
$config, // );
#{$theme}, // border-right-color: map-deep-get(
"tui-grid-border-horziontal-color" // $config,
); // #{$theme},
border-bottom-color: map-deep-get( // "tui-grid-border-horziontal-color"
$config, // );
#{$theme}, // border-bottom-color: map-deep-get(
"tui-grid-border-vertical-color" // $config,
); // #{$theme},
// "tui-grid-border-vertical-color"
// );
} }
&-scrollbar-right-bottom { &-scrollbar-right-bottom {
@ -162,25 +236,63 @@
border-color: transparent !important; border-color: transparent !important;
} }
&-body-area { // &-body-area {
overflow: auto !important; // overflow: auto !important;
} // }
&-container, &-container,
&-layer-state, &-layer-state,
&-body-area, &-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 {
.custom-radio {
.radio-mark{
border-color: #1677ff;
background-color: #fff;
&::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
height: 11px;
width: 11px;
border-radius: 50%;
background-color: #1677ff;
}
}
}
}
}
}
&-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 +301,27 @@
&-header-area, &-header-area,
&-cell-header { &-cell-header {
background-color: map-deep-get( // font-family: inherit;
$config, font-weight: 600;
font-style: Semi Bold;
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;
} }
&-row-odd, &-row-odd,
@ -209,9 +331,8 @@
} }
&: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 +342,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 +377,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,15 +405,14 @@
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;
left: 0 !important; left: 0 !important;
margin-right: 6px; margin-right: 6px;
} }
} }
&-btn-tree { &-btn-tree {
@ -303,6 +423,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 +432,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 +456,13 @@
width: 16px; width: 16px;
height: 16px; height: 16px;
background-position: 0 0; background-position: 0 0;
@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"); @if $theme ==dark {
} @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%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");
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 +474,13 @@
width: 16px; width: 16px;
height: 16px; height: 16px;
background-position: 0 0; background-position: 0 0;
@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"); @if $theme ==dark {
} @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%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");
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");
} }
} }
} }
@ -373,4 +504,4 @@
padding-left: 0 !important; padding-left: 0 !important;
} }
} }
} }

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,20 +93,21 @@
.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,20 +129,23 @@
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:before { .v-text-field>.v-input__control>.v-input__slot:after,
.v-text-field>.v-input__control>.v-input__slot:before {
display: none; display: none;
} }
.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,127 @@
} }
} }
.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 +285,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 +298,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 +314,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 +337,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,6 +365,7 @@
.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");
@ -241,17 +396,19 @@
.v-input--checkbox { .v-input--checkbox {
.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;
} }
} }
} }
.v-textarea{ .v-textarea {
textarea{ textarea {
padding: 10px; padding: 10px;
} }
} }
} }

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,23 @@
} }
.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-8 { .custom-title-8 {
font-size: 0.75rem !important; font-size: 0.75rem !important;
font-weight: 700 !important; font-weight: 700 !important;
@ -94,5 +104,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,77 @@
@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: 40px;
// border-color: #424242;
border-color: map-deep-get($config, #{$theme}, "tui-datepicker-border-color");
.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,99 @@ $--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": #fb5a83,
"white": ( "sat": #2d8cf6)
"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: #383f5d,
v-calendar-weekday-color: #fff, v-calendar-weekday-color: #fff,
v-calendar-weekday-border-color: rgba(255, 255, 255, 0.1), v-calendar-weekday-border-color: rgba(255, 255, 255, 0.1),
v-calendar-day-color: #fff, v-calendar-day-color: #fff,
v-calendar-day-in-not-month-color: rgba(255, 255, 255, 0.05), v-calendar-day-in-not-month-color: rgba(255, 255, 255, 0.05),
v-calendar-is-today-background-color: #2d4571, v-calendar-is-today-background-color: #2d4571,
tui-grid-header-backgroundColor: #383f5d, tui-grid-title-color: #FFFFFFD9,
tui-grid-border-horziontal-color: #383f5d, tui-grid-header-backgroundColor: #2a2b2d,
tui-grid-border-vertical-color: rgba(255, 255, 255, 0.1), tui-grid-header-color: #FFFFFFD9,
tui-grid-cell-backgroundColor: #242940, tui-grid-border-horziontal-color: #212224,
tui-grid-border-vertical-color: #212224,
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 +125,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 +184,79 @@ $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-select-label-color: rgba(0, 0, 0, 0.88),
v-calendar-weekday-backgroundColor: #e0e0e0, v-calendar-weekday-backgroundColor: #e0e0e0,
v-calendar-weekday-color: #111, v-calendar-weekday-color: #111,
v-calendar-weekday-border-color: #d4d4d4, v-calendar-weekday-border-color: #d4d4d4,
v-calendar-day-color: #111, v-calendar-day-color: #111,
v-calendar-day-in-not-month-color: #f8f8f8, v-calendar-day-in-not-month-color: #f8f8f8,
v-calendar-is-today-background-color: #e3eaf3, v-calendar-is-today-background-color: #e3eaf3,
tui-grid-header-backgroundColor: #e0e0e0, 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 +264,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
<v-icon size="32" :class="{ 'mr-2': !miniVariant }" small
>
<!-- 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

@ -170,9 +170,11 @@ export default {
month : month, month : month,
day : day day : day
} }
this.$refs['planPop'].blocId = this.pageData.blocMstrList[ // BEGIN TEST UI
this.pageData.blocId // this.$refs['planPop'].blocId = this.pageData.blocMstrList[
].blocId; // this.pageData.blocId
// ].blocId;
// END TEST UI
this.$refs['planPop'].dialog = true; this.$refs['planPop'].dialog = true;
}, },
updatePlan(val) { updatePlan(val) {

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

@ -1,102 +1,111 @@
<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="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>
</v-row> </v-row>
</template> </template>
<script> <script>
import { mapState, mapMutations } from 'vuex'; import { mapState, mapMutations } from "vuex";
export default { export default {
props: { props: {
parentPrgmId: { parentPrgmId: {
type: String, type: String,
require: true, require: true,
}, },
label: { label: {
type: String, type: String,
require: true, require: true,
}, },
isDarkMode: { 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, type: Boolean,
require: false, require: false,
default: false, default: true
}, },
required: { },
type: Boolean, data() {
require: false, return {
default: false, chkValue: false,
}, testData: false,
readonly: { disabledFlag: false,
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,
},
},
data() {
return {
chkValue: false,
testData: false,
disabledFlag: false,
};
},
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];
}, },
}), }),
}, },
watch: { watch: {
myBindingDara: { myBindingDara: {
deep: true, deep: true,
handler(val) { handler(val) {
this.chkValue = val; this.chkValue = val;
}, },
}, },
}, },
created() { created() {
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 });
}, },
}, },
}; };
</script> </script>

View File

@ -1,144 +1,141 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="location == 'front'" :cols="labelCols"> <v-col v-if="location == 'front'" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon v-if="icon" x-small :color="required ? '#fb8200' : 'primary'" class="mr-1" <v-icon v-if="icon" x-small :color="required ? '#fb8200' : 'primary'" class="mr-1"
>mdi-record-circle</v-icon >mdi-record-circle</v-icon
> >
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="textCols" @click="modifyValue"> <v-col :cols="textCols" @click="modifyValue">
<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' : '#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"> <label for="" class="search-box-label">
<label for="" class="search-box-label"> <v-icon v-if="icon" x-small :color="required ? '#fb8200' : 'primary'" class="mr-1"
<v-icon v-if="icon" x-small :color="required ? '#fb8200' : 'primary'" class="mr-1" >mdi-record-circle</v-icon
>mdi-record-circle</v-icon >
> {{ label }}
{{ label }} </label>
</label> </v-col>
</v-col> </v-row>
</v-row>
</template> </template>
<script> <script>
import { mapState, mapMutations } from 'vuex'; import { mapState, mapMutations } from "vuex";
export default { export default {
props: { props: {
parentPrgmId: { parentPrgmId: {
type: String, type: String,
require: true, require: true,
}, },
label: { label: {
type: String, type: String,
require: false, require: false,
}, },
isDarkMode: { isDarkMode: {
type: Boolean, type: Boolean,
require: false, require: false,
default: false, default: false,
}, },
required: { required: {
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,
}, },
valueNm: { valueNm: {
type: String, type: String,
require: true, require: true,
}, },
labelCols: { labelCols: {
type: Number, type: Number,
require: false, require: false,
default: 4, default: 4,
}, },
textCols: { textCols: {
type: Number, type: Number,
require: false, require: false,
default: 7, default: 7,
}, },
icon: { icon: {
type: Boolean, type: Boolean,
require: false, require: false,
default: true, default: true,
}, },
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 {
chkValue: false, chkValue: false,
testData: false, testData: false,
disabledFlag: false, disabledFlag: false,
}; };
}, },
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];
}, },
bindingDisabledCheckOption(state) { bindingDisabledCheckOption(state) {
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: { myBindingData: {
myBindingData: { deep: true,
deep: true, handler(val) {
handler(val) { this.chkValue = val;
this.chkValue = val; },
}, },
}, 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 }); }
} }
} },
},
},
},
}; };
</script> </script>

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" >
<v-text-field <v-text-field
id="startpicker" id="startpicker"
ref="startpicker" ref="startpicker"
@ -19,14 +19,16 @@
readonly readonly
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,18 +72,23 @@ 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,
@ -103,6 +110,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 +202,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 +273,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 +320,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 +421,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;

File diff suppressed because it is too large Load Diff

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>
@ -19,14 +25,17 @@
readonly readonly
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

@ -107,13 +107,16 @@ export default {
}, },
chkGridOptions() { chkGridOptions() {
const options = { const options = {
// bodyHeight: 'fitToContent',
scrollX: false,
scrollY: false,
...this.gridData.option, ...this.gridData.option,
useIcon: false,
}; };
options.treeColumnOptions = { options.treeColumnOptions = {
useIcon: false, useIcon: false,
...options.treeColumnOptions, ...options.treeColumnOptions,
}; };
return options; return options;
}, },
defaultRow() { defaultRow() {
@ -160,7 +163,7 @@ export default {
}, },
created() {}, created() {},
async mounted() { async mounted() {
// console.log(this.dataPath); // console.log('--------------DEBUG----gridData: ', this.gridData);
if (this.gridName) { if (this.gridName) {
this.gridInstance = this.$refs['tuigrid' + this.gridName]; this.gridInstance = this.$refs['tuigrid' + this.gridName];
@ -663,6 +666,8 @@ export default {
store.dimension.offsetLeft = offsetLeft; store.dimension.offsetLeft = offsetLeft;
}, },
setHeight(_a,height){ setHeight(_a,height){
return; // setting auto height
// console.log("setHeight"); // console.log("setHeight");
var dimension = _a.dimension; var dimension = _a.dimension;
var headerHeight = dimension.headerHeight, summaryHeight = dimension.summaryHeight, tableBorderWidth = dimension.tableBorderWidth; var headerHeight = dimension.headerHeight, summaryHeight = dimension.summaryHeight, tableBorderWidth = dimension.tableBorderWidth;
@ -700,6 +705,11 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
::v-deep .tui-grid-container { ::v-deep .tui-grid-container {
// .tui-grid-body-area {
// overflow: hidden !important;
// }
.tui-grid-content-area { .tui-grid-content-area {
.tui-grid-cell-content { .tui-grid-cell-content {
input[type='number'] { input[type='number'] {

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>
@ -17,14 +19,16 @@
readonly readonly
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,16 +1,25 @@
<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 {
props: { props: {
myGrid: { myGrid: {
require: true, require: true,
}, },
btnActionsFnc: { btnActionsFnc: {
type: Function, type: Function,
required: true, required: true,
}, },
}, },
}; };
</script> </script>

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,78 @@
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,
itemStyle: {
color,
},
};
});
return {
grid: {
left: '3%',
right: '5%',
top: '25%',
containLabel: true,
},
legend: {
// data: legendData,
icon: 'circle',
top: '0%',
right: '5%',
orient: 'horizontal',
textStyle: {
color: isDarkMode ? '#676A7B' : '#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,25 +1,24 @@
<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>
</v-col> </v-col>
<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"

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 (item.elseDisabled &&
v-model="InputValue" myBindingData &&
class="v-input__custom" item.elseDisabled !== myBindingData.rowStat) ||
outlined disabledCondition ||
:type="item.inputType || 'text'" false
:min="item.min || ''" " :readonly="item.readonly ||
:max="item.max || ''" (item.elseReadonly &&
:onkeyup="item.onkeyup || ''" myBindingData &&
:onkeydown="item.onkeydown || ''" item.elseReadonly !== myBindingData.rowStat) ||
:hide-details="true" readonlyCondition ||
:disabled=" false
item.disabled || " :required="item.required || false" :placeholder="item.placeholder" @input="modifyValue($event, item.valueNm)"
(item.elseDisabled && @click="onClick($event, item, item.valueNm)"></v-text-field>
myBindingData &&
item.elseDisabled !== myBindingData.rowStat) ||
disabledCondition ||
false
"
:readonly="
item.readonly ||
(item.elseReadonly &&
myBindingData &&
item.elseReadonly !== myBindingData.rowStat) ||
readonlyCondition ||
false
"
:required="item.required || false"
: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>
@ -74,7 +68,7 @@ export default {
}, },
}, },
}, },
created() {}, created() { },
methods: { methods: {
...mapMutations({ setPageData: 'setPageData' }), ...mapMutations({ setPageData: 'setPageData' }),
search() { search() {
@ -82,22 +76,22 @@ export default {
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
} }
}, },
inputEvent(str,n){ inputEvent(str, n) {
var temp = str.match(/[^ㄱ-ㅎ|ㅏ-ㅣ|가-힣\s]*/i)[0]; var temp = str.match(/[^ㄱ-ㅎ|ㅏ-ㅣ|가-힣\s]*/i)[0];
var regExp = /[^a-z]*/; var regExp = /[^a-z]*/;
temp = temp.match(regExp)[0]; temp = temp.match(regExp)[0];
this.$refs.formRef.lazyValue = temp; this.$refs.formRef.lazyValue = temp;
const dt = { const dt = {
columnName : n, columnName: n,
value : this.newValue(this.$refs.formRef.lazyValue) value: this.newValue(this.$refs.formRef.lazyValue)
}; };
this.$emit('gridEditingFinish', dt); this.$emit('gridEditingFinish', dt);
}, },
keydownEvent($event){ keydownEvent($event) {
}, },
keyupEvent($event){ keyupEvent($event) {
}, },
newValue(value) { newValue(value) {
let returnVal = value.trim(); let returnVal = value.trim();

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,21 +56,25 @@ export default {
computed: { computed: {
...mapState({ ...mapState({
myListData(state) { myListData(state) {
let list = [...state.pageData[this.parentPrgmId][this.item.list]]; try{
list.forEach((item, idx) => { let list = [...state.pageData[this.parentPrgmId][this.item.list]];
if (item.commCdNm && item.commCdNm == '전체') { list.forEach((item, idx) => {
list.splice(idx, 1); if (item.commCdNm && item.commCdNm == '전체') {
} list.splice(idx, 1);
if (this.item.addNull && idx == 0) { }
list.unshift({ if (this.item.addNull && idx == 0) {
commCd: '', list.unshift({
commCdNm: '', commCd: '',
commCdAbbrnm: '', commCdNm: '',
commGrpCd: 'EM_ECC_KIND', commCdAbbrnm: '',
}); commGrpCd: 'EM_ECC_KIND',
} });
}); }
return list; });
return list;
}catch(err) {
return [];
}
}, },
myBindingData(state) { myBindingData(state) {
if (!this.bindingData) { if (!this.bindingData) {
@ -110,7 +110,7 @@ export default {
}, },
}, },
}, },
created() {}, created() { },
methods: { methods: {
...mapMutations({ setGridDataEdit: 'setGridDataEdit' }), ...mapMutations({ setGridDataEdit: 'setGridDataEdit' }),
modifyValue(v, n) { modifyValue(v, n) {

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,
@ -74,19 +81,28 @@ export default {
require: false, require: false,
default: false, default: false,
}, },
iconShow:{ iconShow: {
type:Boolean, type: Boolean,
require:false, require: false,
default:true default: true
}, },
replaceList:{ replaceList: {
type:Array, type: Array,
require:false, require: false,
default:null default: null
}, },
placeholder:{ placeholder: {
type:String, type: String,
require:false require: false
},
size: {
type: String,
require: false,
default: "middle",
},
customClass: {
type: String,
require: false,
} }
}, },
data() { data() {
@ -103,8 +119,8 @@ export default {
}, },
set(value) { set(value) {
if (!this.diffModel) { if (!this.diffModel) {
if(this.replaceList){ if (this.replaceList) {
for(var i=0; i<this.replaceList; i++){ for (var i = 0; i < this.replaceList; i++) {
value.replaceAll(this.replaceList[i]); value.replaceAll(this.replaceList[i]);
} }
} }
@ -113,7 +129,7 @@ export default {
}, },
}, },
}, },
created() {}, created() { },
methods: { methods: {
...mapMutations({ setPageData: 'setPageData' }), ...mapMutations({ setPageData: 'setPageData' }),
search() { search() {
@ -121,11 +137,11 @@ export default {
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
} }
}, },
keydownEvent($event){ keydownEvent($event) {
}, },
keyupEvent($event){ keyupEvent($event) {
if(this.replaceList){ if (this.replaceList) {
for(var i=0; i<this.replaceList.length; i++){ for (var i = 0; i < this.replaceList.length; i++) {
this.InputValue = this.InputValue.replaceAll(this.replaceList[i], ''); this.InputValue = this.InputValue.replaceAll(this.replaceList[i], '');
} }
} }

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

@ -1,119 +1,82 @@
<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"> <div class="px-6 py-4 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'" :disabled="option.eqpmGrpDisableFlag" :propsValue="selectValue01" :iconShow="true"
ref="SelectBox1" :itemList="selectValueList01" :label="'설비그룹'"
:labelCols="2" @update:propsValue="selectValue01 = $event" :readonly="item.selectBoxReadonly != undefined
:textCols="6" ? item.selectBoxReadonly
:disabled="option.eqpmGrpDisableFlag" : false
:propsValue="selectValue01" " />
:itemList="selectValueList01"
:label="'설비그룹'"
@update:propsValue="selectValue01 = $event"
:readonly="
item.selectBoxReadonly != undefined
? item.selectBoxReadonly
: 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>
물리량명 </v-col>
</label> <v-col :cols="9">
</v-col> <v-text-field append-icon="" class="v-input__custom" outlined :hide-details="true"
<v-col :cols="6"> v-model="searchWord" @keyup.enter="search"><template v-slot:append>
<v-text-field <!-- Custom SVG icon -->
append-icon="mdi-magnify" <v-icon>$icoSearch</v-icon>
class="v-input__custom"
outlined </template></v-text-field>
:hide-details="true" </v-col>
v-model="searchWord" <v-spacer></v-spacer>
@keyup.enter="search" <v-col cols="3" class="text-right">
></v-text-field> <a-button icon="search" type="primary" @click="search()"
</v-col> class="search-button">조회</a-button>
<v-spacer></v-spacer> <!-- <v-btn :ripple="false" @click="initSearch()">
<v-col cols="4" class="text-right">
<v-btn :ripple="false" @click="search()">
조회
</v-btn>
<!-- <v-btn :ripple="false" @click="initSearch()">
초기화 초기화
</v-btn> --> </v-btn> -->
</v-col>
</v-row>
</v-col> </v-col>
</v-row> </v-row>
</div> </div>
<v-divider></v-divider>
<div :style="'height: 429px;'"> <div :style="'height: calc(50vh)'">
<!-- <div :style="{ height: 'calc(100% - 213px)' }"> --> <div ref="modalGridParent" class="h100 px-6 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-card-actions class="px-6 py-4 d-flex align-center justify-end">
<v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)" <a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)"
>닫기</v-btn class="mr-2">닫기</a-button>
> <a-button v-if="item.closeBtnFg || false" :ripple="false" type="danger" ghost danger
<v-btn @click="deleteBtnAction($event)" class="mr-2">삭제</a-button>
v-if="item.closeBtnFg || false" <a-button :ripple="false" type="primary" @click="setUpdate($event)" >확인</a-button>
:ripple="false"
@click="deleteBtnAction($event)"
>삭제</v-btn
>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -165,7 +128,7 @@ export default {
type: String, type: String,
require: false, require: false,
}, },
eqpmGrpDisableFlag:{ eqpmGrpDisableFlag: {
type: Boolean, type: Boolean,
require: false, require: false,
default: false default: false
@ -185,7 +148,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: 'egrpPysclQtyPop', myModalKey: 'egrpPysclQtyPop',
modalDataKey: 'pyscModalData', modalDataKey: 'pyscModalData',
@ -300,7 +279,7 @@ export default {
await this.setSelectValueList01(); await this.setSelectValueList01();
this.init(); this.init();
}, },
mounted() {}, mounted() { },
methods: { methods: {
...mapMutations({ ...mapMutations({
setPageData: 'setPageData', setPageData: 'setPageData',
@ -344,12 +323,19 @@ export default {
this.item.eqpmGrpId != undefined this.item.eqpmGrpId != undefined
? this.item.eqpmGrpId ? this.item.eqpmGrpId
: this.searchParam.eqpmGrpId != undefined : this.searchParam.eqpmGrpId != undefined
? this.searchParam.eqpmGrpId ? this.searchParam.eqpmGrpId
: this.selectValueList01[0].value; : this.selectValueList01[0].value;
} else { } else {
this.selectValueList01 = []; this.selectValueList01 = [];
this.selectValue01 = null; this.selectValue01 = null;
} }
// this.selectValueList01 = [
// { label: '냉동기고온', value: '냉동기고온' },
// { label: '냉동기저온', value: '냉동기저온' },
// { label: '공조기', value: '공조기' },
// { label: '보일러', value: '보일러' }
// ];
}, },
search() { search() {
this.getGridData(); this.getGridData();
@ -359,6 +345,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,
@ -370,7 +357,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(100, myOptions),
myOptions, myOptions,
), ),
}); });
@ -428,15 +415,6 @@ export default {
} }
} }
// res = [
// {
// 'pysclQtyId' : 'PYSCL00001',
// 'pysclQtyCd' : 'AMP_1A',
// 'pysclQtyNm' : '회로1 전류A',
// 'pysclQtyTpNm' : 'TAG'
// }
// ]
this.setModalGridData({ this.setModalGridData({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.grid_01, gridKey: this.grid_01,
@ -491,10 +469,10 @@ export default {
this.dialog = flag; this.dialog = flag;
}, },
async dialogOpenCloseEvent(val) { async dialogOpenCloseEvent(val) {
await this.setSelectValueList01(); // await this.setSelectValueList01();
if (!this.myBindingData) { // if (!this.myBindingData) {
return alert('그리드를 먼저 선택해주세요.'); // return alert('그리드를 먼저 선택해주세요.');
} // }
this.dialog = !val; this.dialog = !val;
}, },
deleteBtnAction(v) { deleteBtnAction(v) {
@ -562,33 +540,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

@ -1,5 +1,5 @@
<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="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
@ -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,105 +47,66 @@
<!-- <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>
</div> </div>
</v-col> </v-col>
<v-col :cols="8" class="text-right"> <v-col :cols="8" class="text-right">
<v-btn icon tile :ripple="false" @click="closePop()"> <v-btn icon tile :ripple="false" @click="closePop()">
<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'" </label>
class="mr-1"
>mdi-record-circle</v-icon
>
설비
</label>
</v-col>
<v-col :cols="2">
<v-text-field
v-if="dialog"
v-model="InputValue['eqpmId']"
class="v-input__custom"
:readonly="true"
outlined
:hide-details="true"
>
</v-text-field>
</v-col> </v-col>
<v-col :cols="3"> <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['eqpmNm']" </v-text-field>
class="v-input__custom"
:readonly="true"
outlined
:hide-details="true"
>
</v-text-field>
</v-col> </v-col>
<v-col :cols="6"> <v-col :cols="6" class="pl-2 py-0">
<v-text-field v-if="dialog" v-model="InputValue['eqpmNm']" class="v-input__custom"
:readonly="true" outlined :hide-details="true">
</v-text-field>
</v-col> </v-col>
<v-col :cols="1"> </v-row>
<label for="" class="search-box-label"> <v-row align="center" no-gutters class="mt-4">
<v-icon <v-col :cols="12">
x-small <label for="" class="search-box-label">
:color="'primary'" <v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
class="mr-1" 가이드지표
>mdi-record-circle</v-icon </label>
>
가이드지표
</label>
</v-col>
<v-col :cols="2">
<v-text-field
v-if="dialog"
v-model="InputValue['gdIdxId']"
class="v-input__custom"
:readonly="true"
outlined
:hide-details="true"
>
</v-text-field>
</v-col> </v-col>
<v-col :cols="3"> <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['gdIdxNm']" </v-text-field>
class="v-input__custom" </v-col>
:readonly="true" <v-col :cols="6" class="pl-2 py-0">
outlined <v-text-field v-if="dialog" v-model="InputValue['gdIdxNm']" class="v-input__custom"
:hide-details="true" :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" </div>
:gridName="gridName" </div>
:parentPrgmId="parentPrgmId" <!-- <div id="gridParent" ref="gridParent" style="height: 500px">
/>
</div>
</div>
<!-- <div id="gridParent" ref="gridParent" style="height: 500px">
<component <component
:ref="'gridName' + parentPrgmId" :ref="'gridName' + parentPrgmId"
:is="loadGrid && dialog ? 'Grid' : null" :is="loadGrid && dialog ? 'Grid' : null"
@ -160,11 +118,10 @@
@dblClick="setUpdate()" @dblClick="setUpdate()"
/> />
</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>
@ -223,19 +180,19 @@ export default {
components: { components: {
Grid, Grid,
selectCodeList, selectCodeList,
dateUtility, dateUtility,
InputText InputText
// Tree // Tree
}, },
data() { data() {
return { return {
labelPrepend: true, labelPrepend: true,
modalDataKey:'modalData', modalDataKey: 'modalData',
myModalKey: 'eqpmDetlPop', myModalKey: 'eqpmDetlPop',
gridName: 'eqpmDetlGrid', gridName: 'eqpmDetlGrid',
loadGrid: false, loadGrid: false,
setGrid:false, setGrid: false,
popCheck:false, popCheck: false,
dialog: false, dialog: false,
activeRowData: {}, activeRowData: {},
checkedRowDataList: [], checkedRowDataList: [],
@ -258,32 +215,32 @@ export default {
} }
}, },
}), }),
InputValue: { InputValue: {
get() { get() {
return this.myBindingData; return this.myBindingData;
} }
}, },
chkDialog(){ chkDialog() {
return this.dialog return this.dialog
}, },
}, },
watch: { watch: {
async chkDialog(val){ async chkDialog(val) {
if(!val){ if (!val) {
this.closePop(); this.closePop();
}else{ } else {
// await this.getRowGridData(); // await this.getRowGridData();
} }
}, },
async popCheck(val){ async popCheck(val) {
if(val){ if (val) {
await this.getRowGridData(); await this.getRowGridData();
this.dialog= true; this.dialog = true;
}else{ } else {
this.dialog=false; this.dialog = false;
} }
} }
}, },
beforeCreate() { beforeCreate() {
@ -297,7 +254,7 @@ export default {
methods: { methods: {
...mapMutations({ ...mapMutations({
setPageData: 'setPageData', setPageData: 'setPageData',
setModalGridData: 'setModalGridData', setModalGridData: 'setModalGridData',
setModalGridColumn: 'setModalGridColumn', setModalGridColumn: 'setModalGridColumn',
setModalGridOption: 'setModalGridOption', setModalGridOption: 'setModalGridOption',
}), }),
@ -306,28 +263,32 @@ export default {
}), }),
init() { init() {
this.gridInit(); this.gridInit();
}, },
closePop(){ closePop() {
this.popCheck= false; this.popCheck = false;
}, },
search() { search() {
// this.getData(); // this.getData();
}, },
gridInit(){ gridInit() {
// const gridHeight = this.$refs.gridParent.offsetHeight - 30; // const gridHeight = this.$refs.gridParent.offsetHeight - 30;
const myOptions = { const myOptions = {
rowHeaders: ['rowNum'], rowHeaders: ['rowNum'],
columnOptions: { columnOptions: {
resizable: true, resizable: true,
minWidth:100 minWidth: 100
}, },
setScroll: true, // setScroll: true,
}; header: {
height: 37,
},
rowHeight: 'auto',
};
this.setModalGridOption({ this.setModalGridOption({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.gridName, gridKey: this.gridName,
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
@ -338,55 +299,55 @@ export default {
), ),
}); });
const myColumns= [ const myColumns = [
{ {
header : '발생일', header: '발생일',
name : 'totDttmDay', name: 'totDttmDay',
align:'center' align: 'center'
}, },
{ {
header : '발생시간대', header: '발생시간대',
name : 'totDttmTime', name: 'totDttmTime',
align:'center' align: 'center'
}, },
{ {
header : '가이드지표명', header: '가이드지표명',
minWidth:200, minWidth: 200,
name : 'gdIdxNm', name: 'gdIdxNm',
}, },
{ {
header : '주의', header: '주의',
width:100, width: 100,
name : 'careStndVal', name: 'careStndVal',
align:'center' align: 'center'
}, },
{ {
header : '경고', header: '경고',
width:100, width: 100,
name : 'warnStndVal', name: 'warnStndVal',
align:'center' align: 'center'
}, },
{ {
header : '가이드값', header: '가이드값',
width:100, width: 100,
name : 'totVal', name: 'totVal',
align:'center' align: 'center'
}, },
{ {
header : '알람내용', header: '알람내용',
minWidth:300, minWidth: 300,
width:'auto', width: 'auto',
name : 'alrmMsg', name: 'alrmMsg',
}, },
{ {
header : '알람종류', header: '알람종류',
name : 'alrmKind', name: 'alrmKind',
hidden:true hidden: true
}, },
] ]
this.setModalGridColumn({ this.setModalGridColumn({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.gridName, gridKey: this.gridName,
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
@ -394,59 +355,57 @@ export default {
}); });
// this.getRowGridData(); this.getRowGridData();
}, },
async getRowGridData(){ async getRowGridData() {
this.loadGrid =false; this.loadGrid = false;
var res = await this.postApiReturn({ var res = await this.postApiReturn({
apiKey: 'selectEqpmDetailPop', apiKey: 'selectEqpmDetailPop',
resKey: 'eqpmDetlPopData', resKey: 'eqpmDetlPopData',
sendParam: { sendParam: {
gdIdxId : this.myBindingData.gdIdxId, gdIdxId: this.myBindingData.gdIdxId,
eqpmId : this.myBindingData.eqpmId, eqpmId: this.myBindingData.eqpmId,
fromDt : this.myBindingData.fromDt, fromDt: this.myBindingData.fromDt,
toDt : this.myBindingData.toDt toDt: this.myBindingData.toDt
}, },
}); });
const dayjs = require('dayjs'); const dayjs = require('dayjs');
var newRes = res.map(item=> var newRes = res.map(item =>
item = { item = {
...item, ...item,
totDttmDay : Utility.setFormatDate(item.totDttm, 'YYYY-MM-DD'), totDttmDay: Utility.setFormatDate(item.totDttm, 'YYYY-MM-DD'),
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'),
} }
); );
this.setModalGridData({
this.setModalGridData({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.gridName, gridKey: this.gridName,
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
value: newRes, value: newRes,
}); });
this.loadGrid=true;
this.setGrid = true; this.loadGrid = true;
}
this.setGrid = true;
}
}, },
}; };
var eqpmDetlPop ={ var eqpmDetlPop = {
eqpmDetlGrid:{ eqpmDetlGrid: {
data:[], data: [],
column:[], column: [],
option:{} option: {}
} }
} }
// 전력량 요금(원/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

@ -1,7 +1,7 @@
<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="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon
x-small x-small
@ -12,7 +12,7 @@
{{ item.label }} {{ item.label }}
</label> </label>
</v-col> --> </v-col> -->
<!-- <v-col :cols="label ? textCols : ''"> <!-- <v-col :cols="label ? textCols : ''">
<v-text-field <v-text-field
readonly readonly
v-model="selectValue" v-model="selectValue"
@ -26,20 +26,13 @@
></v-text-field> ></v-text-field>
</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" <!-- <template v-slot:activator="{ on, attrs }">
v-model="dialog"
width="1400"
overlay-color="#000"
overlay-opacity="0.8"
scrollable
>
<!-- <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="v-card__title d-flex align-center justify-space-between" class="v-card__title d-flex align-center justify-space-between"
> >
<span class="custom-title-4">{{ '' }}</span> <span class="custom-title-4">{{ '' }}</span>
@ -47,10 +40,13 @@
<v-icon>mdi-close</v-icon> <v-icon>mdi-close</v-icon>
</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-card-title class="pa-5 d-flex align-center justify-space-between">
<v-row align="center" no-gutters> <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,208 +57,92 @@
<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> <div class="px-5 pb-3">
<v-col :cols="2"> <v-row align="center" no-gutters>
<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>
</div> <v-divider class="mt-5 mb-2"></v-divider>
<v-divider></v-divider> </div>
<div class="d-flex align-center justify-space-between pa-4">
<v-card-title class="pa-0 custom-title-4">가이드 정보</v-card-title> <div class="px-5 pb-4">
</div> <v-row align="center">
<div class="px-5"> <v-col :cols="6" class="py-2 pr-2">
<v-row> <InputText id="gdIdx_InputText" :parentPrgmId="parentPrgmId" label="계산코드" valueNm="calcProc"
<v-col :cols="6" class="py-2"> :iconShow="true" :readonly="true" :labelCols="12" :textCols="12" />
<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-card-actions>
<v-divider></v-divider> <v-spacer></v-spacer>
<v-card-actions> <a-button color="primary" type="primary" @click="closePop()">확인</a-button>
<v-spacer></v-spacer> </v-card-actions>
<v-btn color="primary" dark @click="closePop()">확인</v-btn> </v-card>
</v-card-actions> </v-dialog>
</v-card> </v-row>
</v-dialog>
</v-row>
</template> </template>
<script> <script>
@ -274,175 +154,175 @@ import InputText from '~/components/common/input/InputText';
import dateUtility from '~/plugins/dateUtility'; import dateUtility from '~/plugins/dateUtility';
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,
require: false, require: false,
default: 4, default: 4,
}, },
textCols: { textCols: {
type: Number, type: Number,
require: false, require: false,
default: 7, default: 7,
}, },
item: { item: {
type: Object, type: Object,
require: true, require: true,
}, },
bindingData: { bindingData: {
type: String, type: String,
require: false, require: false,
} }
}, },
components: { components: {
Grid, Grid,
selectCodeList, selectCodeList,
dateUtility, dateUtility,
InputText InputText
// Tree // Tree
}, },
data() { data() {
return { return {
labelPrepend: true, labelPrepend: true,
modalDataKey:'modalData2', modalDataKey: 'modalData2',
myModalKey: 'gdIdxDetPop', myModalKey: 'gdIdxDetPop',
gridName: 'gdIdxDetPop', gridName: 'gdIdxDetPop',
loadGrid: false, loadGrid: false,
setGrid:false, setGrid: false,
popCheck:false, popCheck: false,
dialog: false, dialog: false,
activeRowData: {}, activeRowData: {},
checkedRowDataList: [], checkedRowDataList: [],
}; };
}, },
computed: { computed: {
...mapState({ ...mapState({
// searchParam: state => state.pageData, // searchParam: state => state.pageData,
searchParam(state) { searchParam(state) {
return state.pageData[this.parentPrgmId]; return state.pageData[this.parentPrgmId];
}, },
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'
]; ];
} }
}, },
}), }),
InputValue: { InputValue: {
get() { get() {
return this.myBindingData; return this.myBindingData;
}
},
chkDialog(){
return this.dialog
},
},
watch: {
async chkDialog(val){
if(!val){
this.closePop();
}else{
// await this.getRowGridData();
} }
}, },
async popCheck(val){ chkDialog() {
if(val){ return this.dialog
},
},
watch: {
async chkDialog(val) {
if (!val) {
this.closePop();
} else {
// await this.getRowGridData();
}
},
async popCheck(val) {
if (val) {
await this.getData(); await this.getData();
this.dialog= true; this.dialog = true;
}else{ } else {
this.dialog=false; this.dialog = false;
} }
} }
}, },
beforeCreate() { beforeCreate() {
this.$store.commit('setPageData', { this.$store.commit('setPageData', {
modalData2: { gdIdxDetPop }, modalData2: { gdIdxDetPop },
}); });
}, },
created() { created() {
}, },
mounted(){ mounted() {
this.init(); this.init();
}, },
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',
}), }),
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({
apiKey: 'selectEnrgEffcGdIdxDetPop', apiKey: 'selectEnrgEffcGdIdxDetPop',
resKey: 'gdIdxDetPopData', resKey: 'gdIdxDetPopData',
sendParam: { sendParam: {
gdIdxId : this.myBindingData.gdIdxId, gdIdxId: this.myBindingData.gdIdxId,
eqpmId : this.myBindingData.eqpmId, eqpmId: this.myBindingData.eqpmId,
}, },
}); });
this.setPageData({ this.setPageData({
calcProc : res[0].calcProc, calcProc: res[0].calcProc,
calcDesc : res[0].calcDesc, calcDesc: res[0].calcDesc,
pysclQtyId1 : res[0].pysclQtyId1Nm, pysclQtyId1: res[0].pysclQtyId1Nm,
pysclQtyId2 : res[0].pysclQtyId2Nm, pysclQtyId2: res[0].pysclQtyId2Nm,
pysclQtyId3 : res[0].pysclQtyId3Nm, pysclQtyId3: res[0].pysclQtyId3Nm,
pysclQtyId4 : res[0].pysclQtyId4Nm, pysclQtyId4: res[0].pysclQtyId4Nm,
ctgr1 : res[0].ctgr1, ctgr1: res[0].ctgr1,
ctgr2 : res[0].ctgr2, ctgr2: res[0].ctgr2,
warnStndVal : res[0].warnStndVal, warnStndVal: res[0].warnStndVal,
careStndVal : res[0].careStndVal, careStndVal: res[0].careStndVal,
alrmMsg : res[0].alrmMsg, alrmMsg: res[0].alrmMsg,
gdMeth : res[0].gdMeth gdMeth: res[0].gdMeth
}); });
} }
}, },
}; };
var gdIdxDetPop ={ var gdIdxDetPop = {
gdIdxDetGrid:{ gdIdxDetGrid: {
data:[], data: [],
column:[], column: [],
option:{} option: {}
} }
} }
@ -451,13 +331,14 @@ var gdIdxDetPop ={
<style lang="scss" scoped> <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;
}
#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" ? openMode
:textCols="6" : item.openMode == 'ALL'
:propsValue="selectValue01"
:itemList="selectValueList01"
:label="'설비그룹'"
@update:propsValue="selectValue01 = $event"
:readonly="
item.openMode == undefined
? openMode
: item.openMode == 'ALL'
? false ? false
: true : true
" " />
/> </v-col>
</v-col> <v-col :cols="7">
</v-row> <v-row align="center" no-gutters>
<v-row align="center" no-gutters> <v-col :cols="12">
<v-col :cols="2"> <label for="" class="search-box-label">
<label for="" class="search-box-label"> <v-icon small :class="['mr-1 icon-blue']">$icoBulletPoint</v-icon>
<v-icon x-small color="primary" class="mr-1" 물리량명
>mdi-record-circle</v-icon </label>
> </v-col>
설비명 <v-col :cols="9"> <v-text-field append-icon="" class="v-input__custom" outlined
</label> :hide-details="true" v-model="searchWord" @keyup.enter="search"><template
</v-col> v-slot:append>
<v-col :cols="6"> <!-- Custom SVG icon -->
<v-text-field <v-icon>$icoSearch</v-icon>
append-icon="mdi-magnify"
class="v-input__custom"
outlined </template></v-text-field></v-col>
:hide-details="true" <v-spacer></v-spacer>
v-model="searchWord" <v-col cols="3" class="text-right">
@keyup.enter="search" <a-button icon="search" type="primary" @click="search()"
></v-text-field> class="search-button">조회</a-button>
</v-col>
<v-spacer></v-spacer> </v-col>
<v-col cols="4" class="text-right"> </v-row>
<v-btn :ripple="false" @click="search()">
조회
</v-btn>
<!-- <v-btn :ripple="false" @click="initSearch()">
초기화
</v-btn> -->
</v-col> </v-col>
</v-row> </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',
@ -283,7 +253,7 @@ export default {
async created() { async created() {
await this.init(); await this.init();
}, },
mounted() {}, mounted() { },
methods: { methods: {
...mapMutations({ ...mapMutations({
setPageData: 'setPageData', setPageData: 'setPageData',
@ -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', 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>
@ -138,10 +116,20 @@ export default {
type: String, type: String,
require: false, require: false,
}, },
openMode:{ openMode: {
type:String, type: String,
require: false,
},
required: {
type: Boolean,
require: false,
default: false,
},
iconShow:{
type:Boolean,
require:false, 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',
@ -247,7 +251,7 @@ export default {
async created() { async created() {
this.init(); this.init();
}, },
mounted() {}, mounted() { },
methods: { methods: {
...mapMutations({ ...mapMutations({
setPageData: 'setPageData', setPageData: 'setPageData',
@ -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,
), ),
}); });
@ -292,10 +296,9 @@ export default {
gridKey: this.grid_01, gridKey: this.grid_01,
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
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'},
], ],
}); });
}, },
@ -306,10 +309,10 @@ export default {
resKey: 'eqpmCalcPopData', resKey: 'eqpmCalcPopData',
sendParam: { sendParam: {
calcDescLike: this.searchWord, calcDescLike: this.searchWord,
openMode:this.item.openMode != undefined ? this.item.openMode : this.openMode openMode: this.item.openMode != undefined ? this.item.openMode : this.openMode
}, },
}); });
if(this.myBindingData['calcProc']!= '' || this.myBindingData['calcProc']!= null || this.myBindingData['calcProc']!=undefined){ if (this.myBindingData['calcProc'] != '' || this.myBindingData['calcProc'] != null || this.myBindingData['calcProc'] != undefined) {
let newRes = []; let newRes = [];
newRes = res.filter(item => { newRes = res.filter(item => {
return item.calcProc != this.myBindingData['calcProc'] return item.calcProc != this.myBindingData['calcProc']
@ -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,
@ -352,14 +347,14 @@ export default {
value: this.selectedData.calcProc, value: this.selectedData.calcProc,
}; };
this.$emit('gridEditingFinish', dt); this.$emit('gridEditingFinish', dt);
this.setPageData({ [this.item.valueNm] : this.selectedData.calcProc}); this.setPageData({ [this.item.valueNm]: this.selectedData.calcProc });
if (this.item.valueNm2 !== undefined) { if (this.item.valueNm2 !== undefined) {
const dt = { const dt = {
columnName: this.item.valueNm2, columnName: this.item.valueNm2,
value: this.selectedData[this.item.valueNm2], value: this.selectedData[this.item.valueNm2],
}; };
this.$emit('gridEditingFinish', dt); this.$emit('gridEditingFinish', dt);
this.setPageData({[this.item.valueNm2] : this.selectedData.argCnt}); this.setPageData({ [this.item.valueNm2]: this.selectedData.argCnt });
} }
if (this.item.bindNm !== undefined) { if (this.item.bindNm !== undefined) {
const dt = { const dt = {
@ -367,7 +362,7 @@ export default {
value: this.selectedData.argCnt, value: this.selectedData.argCnt,
}; };
this.$emit('gridEditingFinish', dt); this.$emit('gridEditingFinish', dt);
this.setPageData({ [this.item.bindNm] : this.selectedData.argCnt}); this.setPageData({ [this.item.bindNm]: this.selectedData.argCnt });
} }
} }
}, },
@ -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 </template></v-text-field>
:hide-details="true"
:required="required || false"
:disabled="disabled || false"
></v-text-field>
</v-col> </v-col>
<v-dialog ref="popModal" v-model="dialog" width="800" overlay-color="#000" overlay-opacity="0.8" scrollable>
<v-dialog
ref="popModal"
v-model="dialog"
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 <!-- 설비그룹 -->
:is="'SelectBox'" <component :is="'SelectBox'" :propsValue="selectValue01" :itemList="selectValueList01"
:propsValue="selectValue01" :label="'설비그룹'" :disabled="eqpmGrpDisabled"
:itemList="selectValueList01" @update:propsValue="selectValue01 = $event" :labelCols="12" :textCols="12"
:label="'설비그룹'" :iconShow="true" />
:disabled="eqpmGrpDisabled" </v-col>
@update:propsValue="selectValue01 = $event" <v-col :cols="3.5">
/> <!-- FAB -->
</v-col> <component :is="'SelectBoxMulti'" :propsValue="selectValue02"
<v-col :cols="6" style="padding:0px 10px;"> :itemList="selectValueList02" :label="'FAB'" :labelCols="12" :multiple="true"
<!-- FAB --> :disabled="fabDisabled" @update:propsValue="selectValue02 = $event" :textCols="12"
<component :iconShow="true" />
:is="'SelectBoxMulti'" </v-col>
:propsValue="selectValue02" <v-col :cols="3.5">
:itemList="selectValueList02" <v-row>
:label="'FAB'" <v-col :cols="12" class="py-0">
:labelCols="2" <label for="" class="search-box-label">
:multiple="true" <v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
:disabled="fabDisabled" 설비명
@update:propsValue="selectValue02 = $event" </label>
/> </v-col>
</v-col> <v-col :cols="12" class="pt-0">
<v-text-field append-icon="" class="v-input__custom" outlined
<v-spacer></v-spacer> :hide-details="true" v-model="searchWord" @keyup.enter="search"><template
<v-col cols="3" class="text-right"> v-slot:append>
<v-btn :ripple="false" @click="search()"> <!-- Custom SVG icon -->
조회 <v-icon>$icoSearch</v-icon>
</v-btn>
<!-- <v-btn :ripple="false" @click="initSearch()"> </template></v-text-field>
초기화 </v-col>
</v-btn> -->
</v-col> </v-row>
</v-row> </v-col>
<v-row align="center" no-gutters style="margin-top: 14px;"> <a-button icon="search" type="primary" @click="search()" class="search-button">조회</a-button>
<v-col :cols="1">
</v-row>
</v-card>
<!-- <v-row align="center" no-gutters style="margin-top: 14px;">
<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" </div>
:gridName="gridName" </div>
:parentPrgmId="parentPrgmId" <v-card-actions class="px-6 py-4 d-flex align-center justify-end">
@getRowsData="getRowData" <a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="mr-2">닫기</a-button>
<a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button>
/>
</div>
</div>
<v-divider></v-divider>
<v-card-actions class="pa-5 d-flex align-center justify-center">
<v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)"
>닫기</v-btn
>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
</v-row> </v-row>
</template> </template>
@ -171,66 +145,71 @@ export default {
type: String, type: String,
require: false, require: false,
}, },
disabled:{ disabled: {
type:Boolean, type: Boolean,
require:false, require: false,
default:false default: false
}, },
required:{ required: {
type:Boolean, type: Boolean,
require:false, require: false,
default:false default: false
}, },
fabDisabled:{ fabDisabled: {
type:Boolean, type: Boolean,
require:false, require: false,
default:false default: false
}, },
eqpmGrpDisabled:{ eqpmGrpDisabled: {
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
}, },
isMulti:{ isMulti: {
type:Boolean, type: Boolean,
require:false, require: false,
default:false default: false
} },
customClass: {
type: String,
require: false,
default: ''
}
}, },
components: { components: {
Grid, Grid,
selectCodeList, selectCodeList,
dateUtility, dateUtility,
InputText, InputText,
SelectBox, SelectBox,
SelectBoxMulti SelectBoxMulti
// Tree // Tree
}, },
data() { data() {
return { return {
labelPrepend: true, labelPrepend: true,
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,
activeRowData: {}, activeRowData: {},
checkedRowDataList: [], checkedRowDataList: [],
selectValue01:null, selectValue01: null,
selectValue02:[], selectValue02: [],
selectValueList01:[], selectValueList01: [],
selectValueList02:[], selectValueList02: [],
searchWord:'', searchWord: '',
activeRowData:{}, activeRowData: {},
textFieldData:'', textFieldData: '',
selectRow:{} selectRow: {}
}; };
}, },
computed: { computed: {
@ -240,28 +219,28 @@ export default {
return state.pageData[this.parentPrgmId]; return state.pageData[this.parentPrgmId];
}, },
myBindingData(state) { myBindingData(state) {
var data = state.pageData[this.parentPrgmId]; var data = state.pageData[this.parentPrgmId];
if(data.fabId == ''){ if (data.fabId == '') {
data.fabId = null data.fabId = null
}else if(typeof(data.fabId)=='string'){ } else if (typeof (data.fabId) == 'string') {
data.fabId = [data.fabId] data.fabId = [data.fabId]
} }
return { return {
fabId : data.fabId, fabId: data.fabId,
eqpmGrpId : data.eqpmGrpId, eqpmGrpId: data.eqpmGrpId,
eqpmId:data.eqpmId, eqpmId: data.eqpmId,
eqpmNm:data.eqpmNm, eqpmNm: data.eqpmNm,
eqpmIdList:data.eqpmIdList, eqpmIdList: data.eqpmIdList,
eqpmKindId:data.eqpmKindId, eqpmKindId: data.eqpmKindId,
} }
}, },
}), }),
selectValue: { selectValue: {
get() { get() {
// return this.searchParam[this.item.valueNm]; // return this.searchParam[this.item.valueNm];
return this.myBindingData return this.myBindingData
? this.myBindingData[this.valueNm] ? this.myBindingData[this.valueNm]
: this.textFieldData; : this.textFieldData;
}, },
set(value) { set(value) {
// if(this.item && this.item.disableContent){ // if(this.item && this.item.disableContent){
@ -270,44 +249,44 @@ export default {
return value; return value;
}, },
}, },
chkDialog(){ chkDialog() {
if(this.isMulti){ if (this.isMulti) {
this.$store.state.pageData[this.parentPrgmId][this.modalDataKey][this.myModalKey][this.gridName].option.rowHeaders = [{type : 'checkbox'}]; this.$store.state.pageData[this.parentPrgmId][this.modalDataKey][this.myModalKey][this.gridName].option.rowHeaders = [{ type: 'checkbox' }];
}else{ } else {
this.$store.state.pageData[this.parentPrgmId][this.modalDataKey][this.myModalKey][this.gridName].option.rowHeaders = []; this.$store.state.pageData[this.parentPrgmId][this.modalDataKey][this.myModalKey][this.gridName].option.rowHeaders = [];
} }
return this.dialog return this.dialog
}, },
}, },
watch: { watch: {
async chkDialog(val){ async chkDialog(val) {
// console.log("val : ", val); // console.log("val : ", val);
if(val){ if (val) {
this.selectValue01 = this.myBindingData.eqpmGrpId; this.selectValue01 = this.myBindingData.eqpmGrpId;
this.selectValue02 = this.myBindingData.fabId; this.selectValue02 = this.myBindingData.fabId;
await this.search(); await this.search();
// if(this.isMulti){ // if(this.isMulti){
// }else{ // }else{
// // 단일 focus용 // // 단일 focus용
// if(this.$refs[this.gridName]){ // if(this.$refs[this.gridName]){
// this.selectRow = this.$refs[this.gridName].getData().filter(item=>{ // this.selectRow = this.$refs[this.gridName].getData().filter(item=>{
// return item.eqpmId == this.myBindingData.eqpmId // return item.eqpmId == this.myBindingData.eqpmId
// }); // });
// this.$refs[this.gridName].focus({ // this.$refs[this.gridName].focus({
// rowKey : this.selectRow[0].rowKey, // rowKey : this.selectRow[0].rowKey,
// setScroll: true // setScroll: true
// }) // })
// } // }
// } // }
}else{ } else {
this.dialog = false; this.dialog = false;
} }
// this.selectValue01 = this.myBindingData.eqpmGrpId; // this.selectValue01 = this.myBindingData.eqpmGrpId;
// this.selectValue02 = this.myBindingData.fabId; // this.selectValue02 = this.myBindingData.fabId;
// await this.search(); // await this.search();
// this.getChecked(); // this.getChecked();
// } // }
}, },
}, },
@ -317,14 +296,14 @@ export default {
}); });
}, },
async created() { async created() {
await this.getFab(); await this.getFab();
await this.getEqpmGrp(); await this.getEqpmGrp();
this.init(); this.init();
}, },
methods: { methods: {
...mapMutations({ ...mapMutations({
setPageData: 'setPageData', setPageData: 'setPageData',
setModalGridData: 'setModalGridData', setModalGridData: 'setModalGridData',
setModalGridColumn: 'setModalGridColumn', setModalGridColumn: 'setModalGridColumn',
setModalGridOption: 'setModalGridOption', setModalGridOption: 'setModalGridOption',
}), }),
@ -332,18 +311,18 @@ export default {
postApiReturn: 'modules/list/postApiReturn', postApiReturn: 'modules/list/postApiReturn',
}), }),
init() { init() {
this.activeRowData = {}; this.activeRowData = {};
this.gridInit(); this.gridInit();
}, },
dialogOpenCloseEvent(val){ dialogOpenCloseEvent(val) {
// this.checkPop = !val; // this.checkPop = !val;
this.dialog=!val; this.dialog = !val;
}, },
search() { search() {
this.getRowGridData(); this.getRowGridData();
}, },
async getFab() { async getFab() {
let res = await this.postApiReturn({ let res = await this.postApiReturn({
apiKey: 'selectFabCodeList', apiKey: 'selectFabCodeList',
resKey: 'fabCodeLists', resKey: 'fabCodeLists',
@ -356,25 +335,25 @@ export default {
value: item.eccId, value: item.eccId,
}; };
}); });
this.selectValueList02.unshift({ this.selectValueList02.unshift({
text:"전체", text: "전체",
value:null value: null
}); });
// if(this.pageData.eccId != null && this.pageData.eccId != ''){ // if(this.pageData.eccId != null && this.pageData.eccId != ''){
// this.selectValue02 = this.pageData.eccId; // this.selectValue02 = this.pageData.eccId;
// }else if(this.pageData.eccId == null || this.pageData.eccId == ''){ // }else if(this.pageData.eccId == null || this.pageData.eccId == ''){
this.selectValue02.push(this.selectValueList02[0].value); this.selectValue02.push(this.selectValueList02[0].value);
// } // }
} else { } else {
this.selectValueList02 = []; this.selectValueList02 = [];
this.selectValue02 = []; this.selectValue02 = [];
} }
}, },
async getEqpmGrp() { async getEqpmGrp() {
let res = await this.postApiReturn({ let res = await this.postApiReturn({
apiKey: 'selectEqpmGrpCodeList', apiKey: 'selectEqpmGrpCodeList',
resKey: 'eqpmGrpCodeLists', resKey: 'eqpmGrpCodeLists',
sendParam: { }, sendParam: {},
}); });
if (res.length > 0) { if (res.length > 0) {
this.selectValueList01 = await res.map(item => { this.selectValueList01 = await res.map(item => {
@ -383,39 +362,42 @@ export default {
value: item.eqpmGrpId, value: item.eqpmGrpId,
}; };
}); });
this.selectValueList01.unshift({ this.selectValueList01.unshift({
text:"전체", text: "전체",
value:null value: null
}); });
// if(this.pageData.eqpmGrpId != null && this.pageData.eqpmGrpId != ''){ // if(this.pageData.eqpmGrpId != null && this.pageData.eqpmGrpId != ''){
// this.selectValue02 = this.pageData.eqpmGrpId; // this.selectValue02 = this.pageData.eqpmGrpId;
// }else if(this.pageData.eqpmGrpId == null || this.pageData.eqpmGrpId == ''){ // }else if(this.pageData.eqpmGrpId == null || this.pageData.eqpmGrpId == ''){
this.selectValue01 = this.selectValueList01[0].value; this.selectValue01 = this.selectValueList01[0].value;
// } // }
} else { } else {
this.selectValueList01 = []; this.selectValueList01 = [];
this.selectValue01 = null; this.selectValue01 = null;
} }
}, },
gridInit(){ gridInit() {
// console.log("modalGridParent : ",this.$refs) // console.log("modalGridParent : ",this.$refs)
// const gridWidth = this.$refs.modalGridParent.offsetWidth/4; // const gridWidth = this.$refs.modalGridParent.offsetWidth/4;
let myOptions = { let myOptions = {
columnOptions: { columnOptions: {
resizable: true, resizable: true,
}, },
// rowHeaders:[{ type: 'checkbox' }], header: {
// rowHeight:'auto' height: 'auto',
}; },
if(this.isMulti){ // rowHeaders:[{ type: 'checkbox' }],
myOptions['rowHeaders'] = [{type : 'checkbox'}]; rowHeight: 'auto',
myOptions['rowHeight'] = 'auto'; };
} if (this.isMulti) {
// myOptions['rowHeaders'] = [{ type: 'checkbox' }];
// myOptions['rowHeight'] = 'auto';
}
this.setModalGridOption({ this.setModalGridOption({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.gridName, gridKey: this.gridName,
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
@ -426,46 +408,46 @@ export default {
), ),
}); });
const myColumns= [ const myColumns = [
{ {
header : 'FAB', header: 'FAB',
name : 'fabId', name: 'fabId',
align:'center', align: 'center',
hidden:true hidden: true
}, },
{ {
header : 'FAB', header: 'FAB',
name : 'fabNm', name: 'fabNm',
align:'center' align: 'center'
}, },
{ {
header : '설비ID', header: '설비ID',
name : 'eqpmId', name: 'eqpmId',
align:'center', align: 'center',
// hidden:true // hidden:true
}, },
{ {
header : '설비명', header: '설비명',
name : 'eqpmNm', name: 'eqpmNm',
align:'center' align: 'center'
}, },
{ {
header : 'eccId', header: 'eccId',
name : 'eccId', name: 'eccId',
align:'center', align: 'center',
hidden:true hidden: true
}, },
{ {
header : 'eccNm', header: 'eccNm',
name : 'eccNm', name: 'eccNm',
align:'center', align: 'center',
hidden:true hidden: true
}, },
] ]
this.setModalGridColumn({ this.setModalGridColumn({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.gridName, gridKey: this.gridName,
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
@ -473,91 +455,117 @@ export default {
}); });
// this.getRowGridData(); // this.getRowGridData();
}, },
async getRowGridData(){ async getRowGridData() {
this.loadGrid =false; this.loadGrid = false;
var res = await this.postApiReturn({ var res = await this.postApiReturn({
apiKey: 'selectEqpmPop', apiKey: 'selectEqpmPop',
resKey: 'eqpmPopData', resKey: 'eqpmPopData',
sendParam: { sendParam: {
fabId:this.selectValue02, fabId: this.selectValue02,
eqpmGrpId:this.selectValue01, eqpmGrpId: this.selectValue01,
searchWord:this.searchWord, searchWord: this.searchWord,
eqpmKindId:this.myBindingData.eqpmKindId, eqpmKindId: this.myBindingData.eqpmKindId,
}, },
}); });
// const dayjs = require('dayjs'); // const dayjs = require('dayjs');
// var newRes = res.map(item=> // var newRes = res.map(item=>
// item = { // item = {
// ...item, // ...item,
// totDttmDay : Utility.setFormatDate(item.totDttm, 'YYYY-MM-DD'), // totDttmDay : Utility.setFormatDate(item.totDttm, 'YYYY-MM-DD'),
// 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 =
this.setModalGridData({ // [
// {
// "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({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.gridName, gridKey: this.gridName,
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
value: res value: res
}); });
this.loadGrid=true;
this.$nextTick(()=>{
if(this.isMulti){
this.getChecked();
}
});
}, this.loadGrid = true;
setUpdate() { this.$nextTick(() => {
if(this.isMulti){ if (this.isMulti) {
var data = this.$refs[this.gridName].getCheckedRowsEvt(); this.getChecked();
this.dialog = false; }
this.setPageData({ });
checkedRows: data,
eqpmId : data.map(item=>{
return item.eqpmId;
}),
eqpmNm : data.map(item=>{
return item.eqpmNm;
}),
eqpmIdList:data,
isFind2:true
});
}else{
this.dialog = false;
this.setPageData({eqpmInfo : this.activeRowData, eqpmNm : this.activeRowData.eqpmNm})
}
}, },
getRowData(data){ setUpdate() {
if(this.isMulti){ if (this.isMulti) {
if(data._attributes.checked){ var data = this.$refs[this.gridName].getCheckedRowsEvt();
this.$refs[this.gridName].uncheckEvt(data, this.$refs[this.gridName]); this.dialog = false;
}else{ this.setPageData({
this.$refs[this.gridName].checkEvt(data, this.$refs[this.gridName]); checkedRows: data,
} eqpmId: data.map(item => {
}else{ return item.eqpmId;
this.activeRowData = data; }),
} eqpmNm: data.map(item => {
}, return item.eqpmNm;
getChecked(){ }),
if(this.myBindingData.eqpmIdList.length>0){ eqpmIdList: data,
this.myBindingData.eqpmIdList.map(item=>{ isFind2: true
this.$refs[this.gridName].checkEvt(item, this.$refs[this.gridName]); });
}); } else {
} this.dialog = false;
} this.setPageData({ eqpmInfo: this.activeRowData, eqpmNm: this.activeRowData.eqpmNm })
}
},
getRowData(data) {
if (this.isMulti) {
if (data._attributes.checked) {
this.$refs[this.gridName].uncheckEvt(data, this.$refs[this.gridName]);
} else {
this.$refs[this.gridName].checkEvt(data, this.$refs[this.gridName]);
}
} else {
this.activeRowData = data;
}
},
getChecked() {
if (this.myBindingData.eqpmIdList.length > 0) {
this.myBindingData.eqpmIdList.map(item => {
this.$refs[this.gridName].checkEvt(item, this.$refs[this.gridName]);
});
}
}
}, },
}; };
var eqpmSelectPop ={ var eqpmSelectPop = {
eqpmSelectGrid:{ eqpmSelectGrid: {
data:[], data: [],
column:[], column: [],
option:{} option: {}
} }
} }
</script> </script>

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>
<label for="" class="search-box-label"> <v-col :cols="12" class="py-0">
<v-icon x-small color="primary" class="mr-1" <label for="" class="search-box-label">
>mdi-record-circle</v-icon <!-- <v-icon small
> :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
검색 >$icoBulletPoint</v-icon> -->
</label> 검색
</v-col> </label>
<v-col :cols="6"> </v-col>
<v-text-field <v-col :cols="11" class="py-0 pr-3">
append-icon="mdi-magnify" <v-text-field append-icon="mdi-magnify" class="v-input__custom" outlined
class="v-input__custom" :hide-details="true" v-model="searchWord" @keyup.enter="search"></v-text-field>
outlined </v-col>
:hide-details="true" <a-button icon="search" :ripple="false" type="primary" @click="search()"
v-model="searchWord" class="search-button">조회</a-button>
@keyup.enter="search" </v-row>
></v-text-field> </v-col>
</v-col> </v-row>
<v-spacer></v-spacer>
<v-col cols="4" class="text-right">
<v-btn :ripple="false" @click="search()">
조회
</v-btn>
<!-- <v-btn :ripple="false" @click="initSearch()">
초기화
</v-btn> -->
</v-col>
</v-row>
</div>
<v-divider></v-divider>
<!-- <div :style="'height: calc(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,
@ -209,7 +180,7 @@ export default {
}), }),
selectValue: { selectValue: {
get() { get() {
if(this.formFlag){ if (this.formFlag) {
if (!this.item) { if (!this.item) {
return this.textFieldData; return this.textFieldData;
} }
@ -217,12 +188,12 @@ export default {
// return "NONE"; // return "NONE";
// } // }
else { else {
return this.myBindingData return this.myBindingData
? this.myBindingData[this.item.valueNm] ? this.myBindingData[this.item.valueNm]
: this.textFieldData; : this.textFieldData;
} }
}else{ } else {
// grid와 바인딩 안했을 때 // grid와 바인딩 안했을 때
return this.textFieldData; return this.textFieldData;
} }
@ -251,7 +222,7 @@ export default {
created() { created() {
this.init(); this.init();
}, },
mounted() {}, mounted() { },
methods: { methods: {
...mapMutations({ ...mapMutations({
setPageData: 'setPageData', setPageData: 'setPageData',
@ -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,
@ -325,7 +299,7 @@ export default {
}, },
setUpdate(v) { setUpdate(v) {
// 초기화 // 초기화
if(v == 'init'){ if (v == 'init') {
this.selectedData.tagId = null; this.selectedData.tagId = null;
this.selectedData.tagNm = null; this.selectedData.tagNm = null;
} }
@ -334,9 +308,9 @@ export default {
this.textFieldData = this.selectedData.tagId; this.textFieldData = this.selectedData.tagId;
} else { } else {
// let formFg = this.item.formFg != undefined ? this.item.formFg : this.formFg; // let formFg = this.item.formFg != undefined ? this.item.formFg : this.formFg;
if(this.formFlag){ if (this.formFlag) {
if (this.item.bindNm) { if (this.item.bindNm) {
this.myBindingData[this.item.bindNm] = this.selectedData.tagNm; this.myBindingData[this.item.bindNm] = this.selectedData.tagNm;
} else { } else {
this.myBindingData.tagNm = this.selectedData.tagNm; this.myBindingData.tagNm = this.selectedData.tagNm;
} }
@ -360,16 +334,16 @@ export default {
}; };
this.$emit('gridEditingFinish', dt); this.$emit('gridEditingFinish', dt);
} }
}else{ } else {
// grid와 binding 안되어있는 경우 // grid와 binding 안되어있는 경우
this.textFieldData = this.selectedData.tagNm; this.textFieldData = this.selectedData.tagNm;
this.setPageData({ this.setPageData({
tagId: this.selectedData.tagId, tagId: this.selectedData.tagId,
// [this.item.tagNm]: this.selectedData.tagNm // [this.item.tagNm]: this.selectedData.tagNm
}); });
} }
} }
}, },
dialogOpenCloseEvent(val) { dialogOpenCloseEvent(val) {
@ -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

@ -1,26 +1,32 @@
<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> >
<template v-slot:append>
<!-- Custom SVG icon -->
<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">
@ -137,6 +143,11 @@ export default {
type: String, type: String,
require: false, require: false,
}, },
iconShow: {
type: Boolean,
require: false,
default: true
},
}, },
components: { components: {
Grid, Grid,
@ -146,7 +157,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,27 +296,48 @@ 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,
gridKey: this.grid_01, gridKey: this.grid_01,

View File

@ -1,268 +1,195 @@
<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-col :cols="12"> <v-row no-gutters class="mb-4">
<v-row> <v-col :cols="12">
<v-col :cols="3"> <label class="search-box-label">
<v-row class="search-box" align="center" no-gutters> <v-icon small :class="['mr-1', 'icon-orange']">$icoBulletPoint</v-icon>
<label class="search-box-label"> 일정 시작
<v-icon x-small color="#fb8200" class="mr-1" </label>
>mdi-record-circle</v-icon </v-col>
> <v-col :cols="6" class="py-0 pr-2">
일정 시작 <!-- <DatePicker v-model="strtDt" :parentPrgmId="parentPrgmId"/> -->
</label> <div class="startpicker-container2">
</v-row> <v-text-field id="startpicker2" ref="startpicker2" v-model="strtDt"
</v-col> :class="'v-input__custom'" :hide-details="true" readonly outlined>
<v-col :cols="4"> <template #append>
<!-- <DatePicker v-model="strtDt" :parentPrgmId="parentPrgmId"/> --> <v-icon size="20">$icoCalendar</v-icon>
<div class="startpicker-container2"> </template>
<v-text-field <template #append-outer>
id="startpicker2" <div ref="startpicker-container2" id="startpicker-container2"></div>
ref="startpicker2" </template>
v-model="strtDt" </v-text-field>
:class="'v-input__custom'" </div>
:hide-details="true" </v-col>
readonly <v-col :cols="6" class="py-0 pl-2">
outlined <!-- <DatePicker v-model="strtDt" :parentPrgmId="parentPrgmId"/> -->
> <div class="startpicker-container2">
<template #append> <v-text-field id="startpicker2" ref="startpicker2" v-model="strtDt"
<v-icon size="20">$icoCalendar</v-icon> :class="'v-input__custom'" :hide-details="true" readonly outlined>
</template> <template #append>
<template #append-outer> <v-icon size="20">$icoCalendar</v-icon>
<div </template>
ref="startpicker-container2" <template #append-outer>
id="startpicker-container2" <div ref="startpicker-container2" id="startpicker-container2"></div>
></div> </template>
</template> </v-text-field>
</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>
</v-col>
<v-col :cols="1" style="text-align: center;">
:
</v-col>
<v-col :cols="2">
<vue-numeric-input v-model="strtMm" :min="0" :max="59" controls-type="updown"
class="v-input__slot" width="100%" align="center">
</vue-numeric-input>
</v-col> -->
</v-row>
<v-row no-gutters class="mb-4">
<v-col :cols="12">
<label class="search-box-label">
<v-icon small :class="['mr-1', 'icon-orange']">$icoBulletPoint</v-icon>
일정 종료
</label>
</v-col>
<v-col :cols="6" class="pr-2">
<!-- <DatePicker v-model="endDt" :parentPrgmId="parentPrgmId"/> -->
<div class="startpicker-container3">
<v-text-field id="startpicker3" ref="startpicker3" v-model="endDt"
:class="'v-input__custom'" :hide-details="true" readonly outlined>
<template #append>
<v-icon size="20">$icoCalendar</v-icon>
</template>
<template #append-outer>
<div ref="startpicker-container3" id="startpicker-container3"></div>
</template>
</v-text-field>
</div>
</v-col>
<v-col :cols="6" class="pl-2">
<div class="startpicker-container3">
<v-text-field id="startpicker3" ref="startpicker3" v-model="endDt"
:class="'v-input__custom'" :hide-details="true" readonly outlined>
<template #append>
<v-icon size="20">$icoCalendar</v-icon>
</template>
<template #append-outer>
<div ref="startpicker-container3" id="startpicker-container3"></div>
</template>
</v-text-field>
</div>
</v-col>
<!-- <v-col :cols="2">
<vue-numeric-input v-model="endHh" :min="0" :max="23" controls-type="updown"
class="v-input__slot" width="100%" align="center">
</vue-numeric-input>
</v-col>
<v-col :cols="1" style="text-align: center;">
:
</v-col>
<v-col :cols="2">
<vue-numeric-input v-model="endMm" :min="0" :max="59" controls-type="updown"
class="v-input__slot" width="100%" align="center">
</vue-numeric-input>
</v-col> -->
</v-row>
<v-row no-gutters class="mb-4">
<v-col :cols="12">
<label class="search-box-label">
<v-icon small :class="['mr-1', 'icon-orange']">$icoBulletPoint</v-icon>
일정 제목
</label>
</v-col>
<v-col :cols="12" class="py-0">
<v-text-field v-model="planTitle" class="v-input__custom" outlined
:hide-details="true"></v-text-field>
</v-col>
</v-row>
<v-row no-gutters class="mb-4">
<v-col :cols="12">
<label class="search-box-label">
<v-icon small :class="['mr-1', 'icon-orange']">$icoBulletPoint</v-icon>
일정 상세 내용
</label>
</v-col>
<v-col :cols="12" class="py-0">
<v-textarea v-model="planCntn" class="v-input__custom" outlined :hide-details="true"
:maxlength="1000"></v-textarea>
</v-col>
</v-row>
<v-row no-gutters class="mb-4">
<v-col :cols="12">
<label class="search-box-label">
<v-icon small :class="['mr-1', 'icon-orange']">$icoBulletPoint</v-icon>
표시 색상
</label>
</v-col>
<v-col :cols="6">
<div class="d-flex calendar-color" style="gap:16px">
<div id="redDiv" class="colPk redBg" @click="colorClick('red')">
<div class="inner-color"></div>
</div> </div>
</v-col>
<v-col :cols="2"> <div id="blueDiv" class="colPk blueBg" @click="colorClick('blue')">
<vue-numeric-input <div class="inner-color"></div>
v-model="strtHh"
:min="0"
:max="23"
controls-type="updown"
class="v-input__slot"
width="100%"
align="center"
>
</vue-numeric-input>
</v-col>
<v-col :cols="1" style="text-align: center;">
:
</v-col>
<v-col :cols="2">
<vue-numeric-input
v-model="strtMm"
:min="0"
:max="59"
controls-type="updown"
class="v-input__slot"
width="100%"
align="center"
>
</vue-numeric-input>
</v-col>
</v-row>
<v-row>
<v-col :cols="3">
<v-row class="search-box" align="center" no-gutters>
<label class="search-box-label">
<v-icon x-small color="#fb8200" class="mr-1"
>mdi-record-circle</v-icon
>
일정 종료
</label>
</v-row>
</v-col>
<v-col :cols="4">
<!-- <DatePicker v-model="endDt" :parentPrgmId="parentPrgmId"/> -->
<div class="startpicker-container3">
<v-text-field
id="startpicker3"
ref="startpicker3"
v-model="endDt"
:class="'v-input__custom'"
:hide-details="true"
readonly
outlined
>
<template #append>
<v-icon size="20">$icoCalendar</v-icon>
</template>
<template #append-outer>
<div
ref="startpicker-container3"
id="startpicker-container3"
></div>
</template>
</v-text-field>
</div> </div>
</v-col>
<v-col :cols="2">
<vue-numeric-input <div id="pupleDiv" class="colPk pupleBg" @click="colorClick('puple')">
v-model="endHh" <div class="inner-color"></div>
:min="0" </div>
:max="23"
controls-type="updown"
class="v-input__slot" <div id="greenDiv" class="colPk greenBg" @click="colorClick('green')">
width="100%" <div class="inner-color"></div>
align="center" </div>
>
</vue-numeric-input>
</v-col> <div id="orangeDiv" class="colPk orangeBg" @click="colorClick('orange')">
<v-col :cols="1" style="text-align: center;"> <div class="inner-color"></div>
: </div>
</v-col>
<v-col :cols="2">
<vue-numeric-input <div id="pinkDiv" class="colPk pinkBg" @click="colorClick('pink')">
v-model="endMm" <div class="inner-color"></div>
:min="0" </div>
:max="59"
controls-type="updown" </div>
class="v-input__slot" </v-col>
width="100%" </v-row>
align="center"
>
</vue-numeric-input>
</v-col>
</v-row>
<v-row>
<v-col :cols="3">
<v-row class="search-box" align="center" no-gutters>
<label class="search-box-label">
<v-icon x-small color="#fb8200" class="mr-1"
>mdi-record-circle</v-icon
>
일정 제목
</label>
</v-row>
</v-col>
<v-col :cols="9">
<v-text-field
v-model="planTitle"
class="v-input__custom"
outlined
:hide-details="true"
></v-text-field>
</v-col>
</v-row>
<v-row>
<v-col :cols="3">
<v-row class="search-box" align="center" no-gutters>
<label class="search-box-label">
<v-icon x-small color="#fb8200" class="mr-1"
>mdi-record-circle</v-icon
>
일정 상세 내용
</label>
</v-row>
</v-col>
<v-col :cols="9">
<v-textarea
v-model="planCntn"
class="v-input__custom"
outlined
:hide-details="true"
:maxlength="1000"
></v-textarea>
</v-col>
</v-row>
<v-row>
<v-col :cols="3">
<v-row class="search-box" align="center" no-gutters>
<v-icon x-small color="#fb8200" class="mr-1"
>mdi-record-circle</v-icon
>
표시 색상
</v-row>
</v-col>
<v-col :cols="1">
<div
id="redDiv"
class="colPk redBg"
@click="colorClick('red')"
></div>
</v-col>
<v-col :cols="1">
<div
id="blueDiv"
class="colPk blueBg"
@click="colorClick('blue')"
></div>
</v-col>
<v-col :cols="1">
<div
id="pupleDiv"
class="colPk pupleBg"
@click="colorClick('puple')"
></div>
</v-col>
<v-col :cols="1">
<div
id="greenDiv"
class="colPk greenBg"
@click="colorClick('green')"
></div>
</v-col>
<v-col :cols="1">
<div
id="orangeDiv"
class="colPk orangeBg"
@click="colorClick('orange')"
></div>
</v-col>
<v-col :cols="1">
<div
id="pinkDiv"
class="colPk pinkBg"
@click="colorClick('pink')"
></div>
</v-col>
</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('save')" class="mr-2">저장</a-button>
<v-btn <a-button v-show="popUpAction === 'update'" type="danger" ghost danger :ripple="false"
v-show="popUpAction === 'update'" @click="btnAction('delete')" class="mr-2">삭제</a-button>
:ripple="false" <a-button :ripple="false" type="primary" @click="btnAction('close')" class="mr-2">닫기</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>
@ -335,8 +262,8 @@ export default {
strtMm: 0, strtMm: 0,
endHh: 1, endHh: 1,
endMm: 0, endMm: 0,
strtDt:null, strtDt: null,
endDt:null, endDt: null,
// strtDt: new Date().toISOString().substr(0, 10), // strtDt: new Date().toISOString().substr(0, 10),
// endDt: new Date().toISOString().substr(0, 10), // endDt: new Date().toISOString().substr(0, 10),
planColor: '', planColor: '',
@ -344,7 +271,7 @@ export default {
startDatepickerInstance3: null, startDatepickerInstance3: null,
planSeq: '', planSeq: '',
blocId: '', blocId: '',
addPlanData:{ addPlanData: {
} }
}; };
}, },
@ -364,21 +291,21 @@ export default {
if (val) { if (val) {
this.openDialog(); this.openDialog();
this.$nextTick(() => {}); this.$nextTick(() => { });
} else { } else {
} }
}, },
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));
} }
}, },
@ -405,18 +332,18 @@ export default {
postUpdateApi: 'modules/list/postUpdateApi', postUpdateApi: 'modules/list/postUpdateApi',
getDomain: 'modules/list/getDomain', getDomain: 'modules/list/getDomain',
}), }),
async checkStrtAndEndDateTime(startEndFlag){ async checkStrtAndEndDateTime(startEndFlag) {
var startDateTime = this.strtDt + ' ' + this.strtHh + ':' + this.strtMm; var startDateTime = this.strtDt + ' ' + this.strtHh + ':' + this.strtMm;
var endDateTime = this.endDt + ' ' + this.endHh + ':' + this.endMm; var endDateTime = this.endDt + ' ' + this.endHh + ':' + this.endMm;
startDateTime = new Date(startDateTime); startDateTime = new Date(startDateTime);
endDateTime = new Date(endDateTime); endDateTime = new Date(endDateTime);
if(startDateTime > endDateTime){ if (startDateTime > endDateTime) {
if(startEndFlag == 'start'){ // 시작 부분이 변경됨 -> 끝 부분 값을 변경 if (startEndFlag == 'start') { // 시작 부분이 변경됨 -> 끝 부분 값을 변경
this.endDt = this.convertDateToString(new Date(new Date().setDate(new Date(this.strtDt).getDate() + 1))); this.endDt = this.convertDateToString(new Date(new Date().setDate(new Date(this.strtDt).getDate() + 1)));
this.startDatepickerInstance3.setDate(new Date(this.endDt)); this.startDatepickerInstance3.setDate(new Date(this.endDt));
}else if(startEndFlag == 'end'){ // 끝 부분이 변경됨 -> 시작 부분 값을 변경 } else if (startEndFlag == 'end') { // 끝 부분이 변경됨 -> 시작 부분 값을 변경
this.strtDt = this.convertDateToString(new Date(new Date().setDate(new Date(this.endDt).getDate() - 1))); this.strtDt = this.convertDateToString(new Date(new Date().setDate(new Date(this.endDt).getDate() - 1)));
this.startDatepickerInstance.setDate(new Date(this.strtDt)); this.startDatepickerInstance.setDate(new Date(this.strtDt));
} }
@ -432,17 +359,17 @@ export default {
var dt1 = new Date(); var dt1 = new Date();
var dt2 = new Date(); var dt2 = new Date();
if(this.strtDt){ if (this.strtDt) {
dt1 = this.strtDt; dt1 = this.strtDt;
} }
if(this.endDt){ if (this.endDt) {
dt2 = this.endDt; dt2 = this.endDt;
} }
this.startDatepickerInstance = new TuiDatepicker(startContainer, { this.startDatepickerInstance = new TuiDatepicker(startContainer, {
// date: new Date(), // date: new Date(),
date : dt1, date: dt1,
language: 'ko', language: 'ko',
type: 'date', type: 'date',
input: { input: {
@ -455,7 +382,7 @@ export default {
this.startDatepickerInstance3 = new TuiDatepicker(startContainer3, { this.startDatepickerInstance3 = new TuiDatepicker(startContainer3, {
// date: new Date(), // date: new Date(),
date : dt2, date: dt2,
language: 'ko', language: 'ko',
type: 'date', type: 'date',
input: { input: {
@ -492,8 +419,8 @@ export default {
this.endDt = this.convertDateToString(dt); this.endDt = this.convertDateToString(dt);
this.startDatepickerInstance3.setDate(new Date(this.endDt)); this.startDatepickerInstance3.setDate(new Date(this.endDt));
}, },
convertDateToString(dt){ convertDateToString(dt) {
return dt.getFullYear() + '-' + String(dt.getMonth()+1).padStart(2, '0') + '-' + String(dt.getDate()).padStart(2, '0'); return dt.getFullYear() + '-' + String(dt.getMonth() + 1).padStart(2, '0') + '-' + String(dt.getDate()).padStart(2, '0');
}, },
convertStringToDateFormat(val) { convertStringToDateFormat(val) {
var result = ''; var result = '';
@ -526,7 +453,7 @@ export default {
} }
}); });
}, },
async insertPlanData(){ async insertPlanData() {
var year = this.addPlanData.year; var year = this.addPlanData.year;
var month = this.addPlanData.month; var month = this.addPlanData.month;
var day = this.addPlanData.day; var day = this.addPlanData.day;
@ -562,8 +489,8 @@ export default {
// this.strtDt = Utility.setFormatDate(this.strtDt, 'YYYY-MM-DD'); // this.strtDt = Utility.setFormatDate(this.strtDt, 'YYYY-MM-DD');
// this.endDt = Utility.setFormatDate(this.endDt, 'YYYY-MM-DD'); // this.endDt = Utility.setFormatDate(this.endDt, 'YYYY-MM-DD');
this.strtDt = year + '-' + String(month).padStart(2, '0') + '-' + String(day).padStart(2, '0'); this.strtDt = year + '-' + String(month).padStart(2, '0') + '-' + String(day).padStart(2, '0');
this.endDt = year + '-' + String(month).padStart(2, '0') + '-' + String(day).padStart(2, '0'); this.endDt = year + '-' + String(month).padStart(2, '0') + '-' + String(day).padStart(2, '0');
}, },
async getPlanData() { async getPlanData() {
let res = await this.postApiReturn({ let res = await this.postApiReturn({
@ -786,100 +713,116 @@ 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;
} }
} }
.startpicker-container2 {
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
.v-input {
.v-input__append-outer {
margin-top: 0;
margin-left: 0;
#startpicker-container2,
#endpicker-container2 {
width: 100%;
position: absolute;
top: 36px;
left: 0;
}
}
}
}
.startpicker-container3 {
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
.v-input {
.v-input__append-outer {
margin-top: 0;
margin-left: 0;
#startpicker-container3,
#endpicker-container3 {
width: 100%;
position: absolute;
top: 36px;
left: 0;
}
}
}
}
.v-input__custom { .v-input__custom {
flex: 0 0 auto;
&.half { &.half {
width: calc(50% - 20px); width: calc(50% - 20px);
} }
} }
::v-deep { ::v-deep {
.tui-timepicker-row { .tui-timepicker-row {
display: flex; display: flex;
justify-content: space-around; justify-content: space-around;
background-color: #edf4fc; background-color: #edf4fc;
.tui-timepicker-column.tui-timepicker-colon { .tui-timepicker-column.tui-timepicker-colon {
color: #000 !important; color: #000 !important;
} }
} }
.startpicker-container2 {
position: relative;
.v-input {
.v-input__append-outer {
margin-top: 0;
margin-left: 0;
#startpicker-container2,
#endpicker-container2 {
width: 100%;
position: absolute;
top: 36px;
left: 0;
}
}
}
}
.startpicker-container3 {
position: relative;
.v-input {
.v-input__append-outer {
margin-top: 0;
margin-left: 0;
#startpicker-container3,
#endpicker-container3 {
width: 100%;
position: absolute;
top: 36px;
left: 0;
}
}
}
}
} }
</style> </style>

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>

File diff suppressed because it is too large Load Diff

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,
@ -61,25 +59,29 @@ export default {
require: true, require: true,
default: null, default: null,
}, },
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
},
customClass: {
type: String,
require: false,
}, },
}, },
emits: ['update:propsValue'], emits: ['update:propsValue'],

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

@ -1,160 +1,171 @@
<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="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> x-small
{{ label }} :color="required ? '#fb8200' : 'primary'"
</label> class="mr-1"
</v-col> >mdi-record-circle</v-icon
<v-col :cols="label ? timeCols : ''"> >
<v-select {{ label }}
v-model="timeInnerValue" </label>
:items="itemList" </v-col>
item-text="text" <v-col :cols="label ? timeCols : ''">
item-value="value" <v-select
solo v-model="timeInnerValue"
outlined :items="itemList"
:menu-props="{auto:true, offsetY: true}" item-text="text"
:hide-details="true" item-value="value"
append-icon="mdi-chevron-down" solo
:class="'v-select__custom'" outlined
:disabled="disabled" :menu-props="{ auto: true, offsetY: true }"
:readonly="readonly" :hide-details="true"
@click="setDatepickerHide" :class="'v-select__custom select-large'"
></v-select> :disabled="disabled"
<!-- @change="updateBlocCode($event)" --> :readonly="readonly"
</v-col> @click="setDatepickerHide"
</v-row> style="width: 170px; border-radius: 6px !important"
>
<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)" -->
</v-col>
</v-row>
</template> </template>
<script> <script>
import { mapState, mapMutations, mapActions } from 'vuex'; import { mapState, mapMutations, mapActions } from "vuex";
export default { export default {
props: { components: {},
parentPrgmId: { props: {
type: String, parentPrgmId: {
require: true, type: String,
}, require: true,
autoLoad: { },
type: Boolean, autoLoad: {
require: false, type: Boolean,
default: true, require: false,
}, default: true,
label: { },
type: String, label: {
require: false, type: String,
default: null, require: false,
}, default: null,
timeCols: { },
type: Number, timeCols: {
require: false, type: Number,
default: 1, require: false,
}, default: 1,
labelCols: { },
type: Number, labelCols: {
require: false, type: Number,
default: 4, require: false,
}, default: 4,
itemList: { },
type: Array, itemList: {
require: true, type: Array,
default: () => [], require: true,
}, default: () => [],
propsValue: { },
type: String, propsValue: {
require: true, type: String,
//데이터 형태: '00 : 00' require: true,
}, //데이터 형태: '00 : 00'
required:{ },
type:Boolean, required: {
require:false, type: Boolean,
default:false require: false,
}, default: false,
iconShow:{ },
type:Boolean, iconShow: {
require:false, type: Boolean,
default:true require: false,
}, default: true,
disabled: { },
type:Boolean, disabled: {
require:false, type: Boolean,
default:false require: false,
}, default: false,
readonly: { },
type:Boolean, readonly: {
require:false, type: Boolean,
default:false require: false,
}, default: false,
minInterval: { },
type:Number, minInterval: {
require:false, type: Number,
default:1 require: false,
} default: 1,
}, },
emits: ['update:propsValue'], },
data() { emits: ["update:propsValue"],
return {}; data() {
}, return {};
computed: { },
...mapState({ computed: {
searchParam: state => state.pageData, ...mapState({
}), searchParam: (state) => state.pageData,
timeInnerValue: { }),
get() { timeInnerValue: {
return this.propsValue; get() {
}, return this.propsValue;
set(value) { },
// console.log('value[setValue] : ', value) set(value) {
this.$emit('update:propsValue', value); // console.log('value[setValue] : ', value)
}, this.$emit("update:propsValue", value);
} },
}, },
created() { },
this.getTimeList(); created() {
// console.log('created SelectBox') this.getTimeList();
// console.log('timeList : ', this.timeList); // console.log('created SelectBox')
// console.log('propsValue : ', this.propsValue); // console.log('timeList : ', this.timeList);
}, // console.log('propsValue : ', this.propsValue);
methods: { },
...mapMutations({ setPageData: 'setPageData' }), methods: {
...mapActions({}), ...mapMutations({ setPageData: "setPageData" }),
getTimeList(){ ...mapActions({}),
for(var i=0; i<24; i++){ getTimeList() {
let hour = i.toString().padStart(2, '0'); for (var i = 0; i < 24; i++) {
for(var j=0; j<60; j++){ let hour = i.toString().padStart(2, "0");
if(j%this.minInterval===0){ for (var j = 0; j < 60; j++) {
let min = j.toString().padStart(2, '0'); if (j % this.minInterval === 0) {
this.itemList.push( let min = j.toString().padStart(2, "0");
{ this.itemList.push({
'text' : hour + ' : ' + min, text: hour + " : " + min,
'value': hour + ' : ' + min value: hour + " : " + min,
} });
) }
} }
} }
} this.propsValue = this.itemList[0].value;
this.propsValue = this.itemList[0].value; },
}, setDatepickerHide(e) {
setDatepickerHide(e){ // 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>
<style lang="scss" scoped> <style lang="scss" scoped>
// .v-select__custom { // .v-select__custom {
// &.time { // &.time {
// width: calc(50%); // width: calc(50%);
// } // }

View File

@ -1,151 +1,170 @@
<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="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
{{ label }} v-if="iconShow"
</label> small
</v-col> :class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
<v-col :cols="label ? textCols : ''"> >$icoBulletPoint</v-icon
<v-select >
v-model="selectValue" {{ label }}
:items="searchParam[parentPrgmId].cmCycleList" </label>
label="주기를 선택하세요" </v-col>
item-text="text" <v-col :cols="label ? textCols : ''">
item-value="value" <v-select
solo v-model="selectValue"
outlined :items="searchParam[parentPrgmId].cmCycleList"
:hide-details="true" label="주기를 선택하세요"
append-icon="mdi-chevron-down" item-text="text"
class="v-select__custom" item-value="value"
></v-select> solo
<!-- @change="updateBlocCode($event)" --> outlined
</v-col> :hide-details="true"
</v-row> append-icon="mdi-chevron-down"
:class="['v-select__custom', customClass]"
></v-select>
<!-- @change="updateBlocCode($event)" -->
</v-col>
</v-row>
</template> </template>
<script> <script>
import { mapState, mapMutations, mapActions } from 'vuex'; import { mapState, mapMutations, mapActions } from "vuex";
import Utility from '~/plugins/utility'; import Utility from "~/plugins/utility";
export default { export default {
props: { props: {
parentPrgmId: { parentPrgmId: {
type: String, type: String,
require: true, require: true,
}, },
pickerMode: { pickerMode: {
type: String, type: String,
require: true, require: true,
}, },
labelCols: { labelCols: {
type: Number, type: Number,
require: false, require: false,
default: 4, default: 4,
}, },
textCols: { textCols: {
type: Number, type: Number,
require: false, require: false,
default: 8, default: 8,
}, },
label:{ label: {
type: String, type: String,
require: false, require: false,
default: '주기' default: "주기",
} },
}, iconShow: {
data() { type: Boolean,
return { require: false,
// label: '주기', default: true,
labelPrepend: true, },
}; required: {
}, type: Boolean,
computed: { require: false,
...mapState({ default: false,
searchParam: state => state.pageData, },
}), customClass: {
selectValue: { type: String,
get() { require: false,
return this.searchParam[this.parentPrgmId].cmCycle; },
}, },
set(value) { data() {
return this.setPageData({ cmCycle: value }); return {
}, // label: '주기',
}, labelPrepend: true,
}, };
watch: { },
selectValue(value) { computed: {
// 주기에 따른 오늘 기준 기본 날짜 세팅 ...mapState({
this.setDefaultDate(value); searchParam: (state) => state.pageData,
}, }),
}, selectValue: {
created() { get() {
this.setDefaultDate(this.searchParam[this.parentPrgmId].cmCycle); return this.searchParam[this.parentPrgmId].cmCycle;
}, },
async mounted() {}, set(value) {
methods: { return this.setPageData({ cmCycle: value });
...mapMutations({ setPageData: 'setPageData' }), },
...mapActions({}), },
setDefaultDate(value) { },
// console.log("주기에 따른 오늘 기준 기본 날짜 세팅"); watch: {
if(this.searchParam[this.parentPrgmId].dateInitedFlag){ selectValue(value) {
return; // 주기에 따른 오늘 기준 기본 날짜 세팅
} this.setDefaultDate(value);
const today = Utility.setFormatDate('today', 'YYYYMMDD'); },
let srartDate = ''; },
let endDate = ''; created() {
// console.log(value); this.setDefaultDate(this.searchParam[this.parentPrgmId].cmCycle);
switch (value) { },
case 'CYC_YEAR': async mounted() {},
endDate = Utility.setFormatDate(today, 'YYYY'); methods: {
srartDate = Utility.setBeforetDate( ...mapMutations({ setPageData: "setPageData" }),
this.searchParam[this.parentPrgmId], ...mapActions({}),
endDate, setDefaultDate(value) {
'YYYY', // console.log("주기에 따른 오늘 기준 기본 날짜 세팅");
); if (this.searchParam[this.parentPrgmId].dateInitedFlag) {
break; return;
}
const today = Utility.setFormatDate("today", "YYYYMMDD");
let srartDate = "";
let endDate = "";
// console.log(value);
switch (value) {
case "CYC_YEAR":
endDate = Utility.setFormatDate(today, "YYYY");
srartDate = Utility.setBeforetDate(
this.searchParam[this.parentPrgmId],
endDate,
"YYYY"
);
break;
case 'CYC_MONTH': case "CYC_MONTH":
endDate = Utility.setFormatDate(today, 'YYYYMM'); endDate = Utility.setFormatDate(today, "YYYYMM");
srartDate = Utility.setBeforetDate( srartDate = Utility.setBeforetDate(
this.searchParam[this.parentPrgmId], this.searchParam[this.parentPrgmId],
endDate, endDate,
'YYYYMM', "YYYYMM"
); );
break; break;
case 'CYC_DAY': case "CYC_DAY":
endDate = today; endDate = today;
srartDate = Utility.setBeforetDate( srartDate = Utility.setBeforetDate(
this.searchParam[this.parentPrgmId], this.searchParam[this.parentPrgmId],
endDate, endDate,
'YYYYMMDD', "YYYYMMDD"
); );
break; break;
case 'CYC_HOUR': case "CYC_HOUR":
endDate = today; endDate = today;
srartDate = today; srartDate = today;
break; break;
default: default:
break; break;
} }
if ( if (
this.pickerMode == undefined || this.pickerMode == undefined ||
this.pickerMode == null || this.pickerMode == null ||
this.pickerMode == '' this.pickerMode == ""
) { ) {
this.setPageData({ fromDt: srartDate, toDt: endDate }); this.setPageData({ fromDt: srartDate, toDt: endDate });
} else if (this.pickerMode == 'single') { } else if (this.pickerMode == "single") {
this.setPageData({ fromDt: endDate, toDt: srartDate }); this.setPageData({ fromDt: endDate, toDt: srartDate });
} else { } else {
this.setPageData({ fromDt: srartDate, toDt: endDate }); this.setPageData({ fromDt: srartDate, toDt: endDate });
} }
// console.log(this.searchParam[this.parentPrgmId].cmCycle); // console.log(this.searchParam[this.parentPrgmId].cmCycle);
// console.log(this.searchParam[this.parentPrgmId].dateRange); // console.log(this.searchParam[this.parentPrgmId].dateRange);
}, },
}, },
}; };
</script> </script>

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 v-if="iconShow" small color="primary"
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
@ -15,7 +17,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>
@ -65,6 +67,20 @@ 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,
},
}, },
data() { data() {
return {}; return {};

View File

@ -1,118 +1,141 @@
<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="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <!-- <label for="" class="search-box-label">
<v-icon small color="primary" class="mr-1">mdi-record-circle</v-icon> <v-icon v-if="iconShow" small color="primary" class="mr-1">mdi-record-circle</v-icon>
{{ label }} {{ label }}
</label> </label> -->
</v-col> <label for="" class="search-box-label">
<v-col :cols="label ? textCols : ''"> <v-icon
<v-select v-if="iconShow"
v-model="selectValue" small
:items="searchParam[parentPrgmId][dataKey + 'List']" :class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
item-text="mttNm" >$icoBulletPoint</v-icon
item-value="mttCd" >
solo {{ label }}
append-icon="mdi-chevron-down" </label>
class="v-select__custom" </v-col>
outlined <v-col :cols="label ? textCols : ''">
hide-details <v-select
></v-select> v-model="selectValue"
<!-- @change="updateBlocCode($event)" --> :items="searchParam[parentPrgmId][dataKey + 'List']"
</v-col> item-text="mttNm"
</v-row> item-value="mttCd"
solo
append-icon="mdi-chevron-down"
:class="['v-select__custom', customClass]"
outlined
hide-details
></v-select>
<!-- @change="updateBlocCode($event)" -->
</v-col>
</v-row>
</template> </template>
<script> <script>
import { mapState, mapMutations, mapActions } from 'vuex'; import { mapState, mapMutations, mapActions } from "vuex";
export default { export default {
props: { props: {
parentPrgmId: { parentPrgmId: {
type: String, type: String,
require: true, require: true,
}, },
dataKey: { dataKey: {
type: String, type: String,
require: true, require: true,
}, },
autoLoad: { autoLoad: {
type: Boolean, type: Boolean,
require: false, require: false,
default: true, default: true,
}, },
label: { label: {
type: String, type: String,
require: false, require: false,
default: null, default: null,
}, },
sendParam: { sendParam: {
type: Object, type: Object,
require: false, require: false,
default: () => { default: () => {
return {}; return {};
}, },
}, },
addAll: { addAll: {
type: Boolean, type: Boolean,
require: false, require: false,
default: false, default: false,
}, },
textCols: { textCols: {
type: Number, type: Number,
require: false, require: false,
default: 7, default: 7,
}, },
labelCols: { labelCols: {
type: Number, type: Number,
require: false, require: false,
default: 4, default: 4,
}, },
}, iconShow: {
data() { type: Boolean,
return { require: false,
// label: "검침대상유형", default: true,
// labelPrepend: true },
}; customClass: {
}, type: String,
computed: { require: false,
...mapState({ },
searchParam: state => state.pageData, required: {
}), type: Boolean,
mySendMttParam() { require: false,
return this.searchParam[this.parentPrgmId]['sendMttParam']; default: false
}, },
selectValue: { },
get() { data() {
return this.searchParam[this.parentPrgmId][this.dataKey]; return {
}, // label: "검침대상유형",
set(value) { // labelPrepend: true
return this.setPageData({ [this.dataKey]: value }); };
}, },
}, computed: {
}, ...mapState({
watch: { searchParam: (state) => state.pageData,
mySendMttParam() { }),
this.getMttList({ mySendMttParam() {
dataKey: this.dataKey, return this.searchParam[this.parentPrgmId]["sendMttParam"];
params: this.searchParam[this.parentPrgmId]['sendMttParam'], },
}); selectValue: {
// this.selectValue(this.searchParam[this.parentPrgmId].mttCdList[0].mttCd); get() {
}, return this.searchParam[this.parentPrgmId][this.dataKey];
}, },
created() { set(value) {
if (this.searchParam[this.parentPrgmId]['sendMttParam'].mttTp!=""){ return this.setPageData({ [this.dataKey]: value });
this.getMttList({ },
dataKey: this.dataKey, },
params: this.searchParam[this.parentPrgmId]['sendMttParam'], },
}); watch: {
} mySendMttParam() {
}, this.getMttList({
methods: { dataKey: this.dataKey,
...mapMutations({ setPageData: 'setPageData' }), params: this.searchParam[this.parentPrgmId]["sendMttParam"],
...mapActions({ });
getMttList: 'modules/search/getMttList', // this.selectValue(this.searchParam[this.parentPrgmId].mttCdList[0].mttCd);
}), },
}, },
created() {
if (this.searchParam[this.parentPrgmId]["sendMttParam"].mttTp != "") {
this.getMttList({
dataKey: this.dataKey,
params: this.searchParam[this.parentPrgmId]["sendMttParam"],
});
}
},
methods: {
...mapMutations({ setPageData: "setPageData" }),
...mapActions({
getMttList: "modules/search/getMttList",
}),
},
}; };
</script> </script>

View File

@ -2,7 +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 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>
@ -14,9 +19,11 @@
item-value="readObjId" item-value="readObjId"
solo solo
outlined outlined
append-icon="mdi-chevron-down" append-icon=""
class="v-select__custom" :class="['v-select__custom', customClass]"
></v-select> ><template v-slot:append>
<v-icon>$icoChevronDown</v-icon>
</template></v-select>
</v-col> </v-col>
</v-row> </v-row>
</template> </template>
@ -65,6 +72,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

@ -146,5 +146,3 @@ export default {
}, },
}; };
</script> </script>
<style></style>

View File

@ -2,7 +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 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>
@ -13,9 +18,12 @@
item-text="commCdNm" item-text="commCdNm"
item-value="commCd" item-value="commCd"
solo solo
append-icon="mdi-chevron-down" outlined
class="v-select__custom" append-icon=""
></v-select> :class="['v-select__custom', customClass]"
><template v-slot:append>
<v-icon>$icoChevronDown</v-icon>
</template></v-select>
</v-col> </v-col>
</v-row> </v-row>
</template> </template>
@ -47,6 +55,16 @@ export default {
require: false, require: false,
default: 4, default: 4,
}, },
iconShow: {
type: Boolean,
require: false,
default: true,
},
customClass: {
type: String,
require: false,
default: null,
}
}, },
data() { data() {
return { return {

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