Compare commits

..

219 Commits

Author SHA1 Message Date
2fcc719721 update 2025-08-19 16:44:01 +09:00
06f16f82ff update code 2025-08-19 16:41:01 +09:00
dev
a074e0e6e9 Merge pull request 'update code' (#75) from dev-luannv24-fixbug-17 into dev
Reviewed-on: #75
2025-08-19 12:45:53 +09:00
a5c35809fa refactor code 2025-08-19 12:45:19 +09:00
7e9bd540ed update code 2025-08-19 12:32:34 +09:00
dev
08637f6321 Merge pull request 'Update screen 7, 33, 16' (#74) from dev-trungvq7-0729 into dev
Reviewed-on: #74
2025-08-18 17:57:22 +09:00
dev
ce2c3c6c0e Merge pull request 'Fix selection grid s14 + Remove border legend dashboard' (#73) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #73
2025-08-18 17:56:13 +09:00
dev
9d35712f58 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-08-18 17:50:07 +09:00
dev
41370aa4df Update 1808 2025-08-18 17:50:04 +09:00
d3022582b6 Fix selection grid s14 + Remove border legend dashboard 2025-08-18 17:41:42 +09:00
dev
3c49bd36e9 Merge pull request 'fix bug grid no scroll y margin right' (#72) from dev-manhph1-figbug into dev
Reviewed-on: #72
2025-08-18 16:45:07 +09:00
c6eb2b57b2 fix bug grid no scroll y margin right 2025-08-18 16:31:29 +09:00
dev
5088769914 Merge pull request 'hotfix bug screen 10' (#71) from dev-dungtv-0818 into dev
Reviewed-on: #71
2025-08-18 11:27:28 +09:00
50698ac661 hotfix bug screen 10 2025-08-18 09:25:41 +07:00
dev
c815eae2ca Merge pull request 'Fix bug Screen 13' (#70) from dev-trungvq7-0729 into dev
Reviewed-on: #70
2025-08-18 10:50:01 +09:00
dev
8a9dfd9949 Merge pull request 'fix desgin screen 38' (#69) from dev-manhph1-figbug into dev
Reviewed-on: #69
2025-08-18 10:47:00 +09:00
dev
3155258656 Update 1508 2025-08-18 10:44:55 +09:00
dev
68916550e5 Update 1508 2025-08-18 10:40:46 +09:00
1250b3d3af fix desgin screen 38 2025-08-15 15:52:52 +09:00
dev
be1e0426e0 Merge pull request 'Add paging and button view detail for S1 dashboard + Fix bugs 156 163' (#68) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #68
2025-08-15 10:10:47 +09:00
81a20d2851 Add paging and button view detail for S1 dashboard + Fix bugs 156 163 2025-08-14 17:09:19 +09:00
dev
6353ffba57 Merge pull request 'dev-manhph1-figbug' (#67) from dev-manhph1-figbug into dev
Reviewed-on: #67
2025-08-14 16:00:15 +09:00
dev
ed9150aae8 Merge pull request 'fix bug grid + buttons' (#66) from dev-dungtv-0814 into dev
Reviewed-on: #66
lgtm
2025-08-14 15:54:22 +09:00
270279b0c2 add paging for page 38 2025-08-14 15:51:06 +09:00
9a42291cf4 add paging for page 38 2025-08-14 15:50:01 +09:00
c810139554 fix bug grid + buttons 2025-08-14 12:30:55 +07:00
dev
1a5ec4c6a3 Merge pull request 'fixbug' (#65) from dev-luannv24-fixbug-common-screen17 into dev
Reviewed-on: #65
2025-08-14 12:03:40 +09:00
856d0db130 updatecode 2025-08-14 12:01:07 +09:00
6973321137 fixbug 2025-08-14 11:34:02 +09:00
dev
2cea34dbab Merge pull request 'Update screen 13, grid color' (#64) from dev-trungvq7-0729 into dev
Reviewed-on: #64
2025-08-13 19:02:06 +09:00
dev
f41bd1283a Update 1308 2025-08-13 18:20:59 +09:00
dev
d5c59286ad Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-08-13 17:14:44 +09:00
dev
287c68252b Update 1108 2025-08-13 17:14:39 +09:00
dev
59ec2eda59 Merge pull request 'dev-dungtv-0813' (#63) from dev-dungtv-0813 into dev
Reviewed-on: #63
2025-08-13 16:12:46 +09:00
f6c071bdf0 fix menu item:hover style 2025-08-13 13:37:51 +07:00
24882a21a5 fix bugs style button delete 2025-08-13 13:20:58 +07:00
9aa9939a43 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv-0813 2025-08-13 11:47:03 +07:00
dev
0760bde4e1 Merge pull request 'add pagination for screen 27 move pagination screen 28' (#62) from dev-manhph1-figbug into dev
Reviewed-on: #62
2025-08-13 13:46:53 +09:00
de99b30485 fix bugs css menu 2025-08-13 11:43:43 +07:00
2802e93a44 add pagination for screen 27 move pagination screen 28 2025-08-13 13:38:12 +09:00
68f3f0f381 fix bugs 2025-08-13 08:18:27 +07:00
dev
39905e6f80 Merge pull request 'update code s32 s17' (#61) from dev-luannv24-s32-s17fixbug into dev
Reviewed-on: #61
2025-08-12 18:47:56 +09:00
dev
0825663c64 Merge pull request 'fix icon datepicker' (#60) from dev-manhph1-figbug into dev
Reviewed-on: #60
2025-08-12 18:47:08 +09:00
dev
8d444eafcd Merge pull request 'Update pagination UI + Fix bugs gauge chart line chart + Fix bugs s14' (#59) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #59
2025-08-12 18:43:04 +09:00
71e90064a2 update code s32 s17 2025-08-12 18:37:21 +09:00
7d2bcb9496 fix icon datepicker 2025-08-12 18:00:01 +09:00
84c7e61254 Update pagination UI + Fix bugs gauge chart line chart + Fix bugs s14 2025-08-12 17:07:52 +09:00
dev
ffdc56b8f1 Merge pull request 'fix bug screen17 tab3' (#58) from dev-luannv27-s17 into dev
Reviewed-on: #58
2025-08-12 16:42:35 +09:00
245444d5fa fix bug screen17 tab3 2025-08-12 16:38:22 +09:00
dev
541ae86068 Merge pull request 'fixbug screen 2 , screen 17 , screen 15' (#57) from dev-luannv24-fixbug-8/12 into dev
Reviewed-on: #57
2025-08-12 15:14:30 +09:00
5c43496282 refactor code 2025-08-12 15:12:06 +09:00
31413d1e48 update code 2025-08-12 12:58:41 +09:00
dev
dd24592eca Merge pull request 'Fix datepicker icon + add dash line in line chart' (#56) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #56
2025-08-11 18:29:55 +09:00
e59078a19c Fix datepicker icon + add dash line in line chart 2025-08-11 17:58:25 +09:00
dev
bc96d2ae45 Merge pull request 'fix bug grid not load when change menu tab' (#55) from dev-manhph1-figbug into dev
Reviewed-on: #55
2025-08-11 16:55:41 +09:00
4fd2eac344 add check direction for actionbutton 2025-08-11 16:12:19 +09:00
c40352e37c fix bug grid not load when change menu tab 2025-08-11 15:12:01 +09:00
dev
6583d68ea7 Merge pull request 'fix bugs 47, 145' (#54) from dev-dungtv-0811 into dev
Reviewed-on: #54
2025-08-11 14:06:24 +09:00
dev
5859c5d681 Merge pull request 'Add pagination + fix bugs tooltip + fix bugs line chart' (#53) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #53
2025-08-11 13:54:33 +09:00
d6dd66c4b3 fix bugs 47, 145 2025-08-11 11:51:28 +07:00
f666110a1a Add pagination + fix bugs tooltip + fix bugs line chart 2025-08-11 11:55:32 +09:00
dev
d22b09cc47 Merge pull request 'fixbug' (#52) from dev-luannv24-fixbug1 into dev
Reviewed-on: #52
2025-08-11 11:25:42 +09:00
ecfbeb3afa fixbug 2025-08-08 19:22:33 +09:00
dev
1ece377457 Merge pull request 'update code' (#51) from dev-luannv24-screen36-32-31-26-17-15 into dev
Reviewed-on: #51
2025-08-08 11:35:28 +09:00
335f93e6cf resovel conflix 2025-08-08 11:30:10 +09:00
dev
9979f32f8c Merge pull request 'dev-trungvq7-0729' (#50) from dev-trungvq7-0729 into dev
Reviewed-on: #50
2025-08-08 10:25:21 +09:00
71394443ac update code 2025-08-07 19:04:13 +09:00
dev
d8c5bd5323 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-08-07 18:54:21 +09:00
dev
c9bc9d3186 Merge 0729 2025-08-07 18:54:14 +09:00
dev
a06d2e553d Merge pull request 'dev-dungtv-0807' (#49) from dev-dungtv-0807 into dev
Reviewed-on: #49
2025-08-07 18:43:05 +09:00
dev
6a894df6ec Merge pull request 'add dark mode for editor' (#47) from dev-manhph1-figbug into dev
Reviewed-on: #47
2025-08-07 18:15:02 +09:00
dev
e194557753 Merge pull request 'dev-dungtv-0807' (#48) from dev-dungtv-0807 into dev
Reviewed-on: #48
2025-08-07 17:46:32 +09:00
d0572dc07c fixbug grid 2025-08-07 15:26:53 +07:00
ea4910db79 fix bugs screen 10, 20 2025-08-07 15:18:06 +07:00
c636db83bd fix bug screen 8 bug-32 2025-08-07 13:57:24 +07:00
6871d6034d fix bugs screen 20.1~20.4 2025-08-07 13:50:37 +07:00
dev
1352223416 Merge pull request 'Fix checkboxes in form' (#46) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #46
2025-08-07 15:42:38 +09:00
fa68aa31e6 add dark mode for editor 2025-08-07 13:33:35 +07:00
439079eee8 Fix checkboxes in form 2025-08-07 12:49:14 +09:00
dev
93dd46c225 Merge pull request 'fixbugs screen 10' (#45) from dev-dungtv-0807 into dev
Reviewed-on: #45
2025-08-07 12:45:25 +09:00
537a16fbc7 fixbugs screen 10 2025-08-07 10:40:23 +07:00
dev
6f6f19349f Merge pull request 'fix bug 07/08/25' (#44) from dev-manhph1-figbug into dev
Reviewed-on: #44
2025-08-07 12:23:53 +09:00
2533d5bb7a fix bug 07/08/25 2025-08-07 09:58:49 +07:00
dev
19a634e3a5 Merge pull request 'dev-luannv24-s2s17s15-fixbug' (#41) from dev-luannv24-s2s17s15-fixbug into dev
Reviewed-on: #41
2025-08-07 11:42:33 +09:00
dev
e4331ad79f Merge pull request 'fix bug screen 10' (#42) from dev-dungtv-0807 into dev
Reviewed-on: #42
2025-08-07 11:37:15 +09:00
8c7a8d5b29 resolve commit code 2025-08-07 09:36:18 +07:00
140f73814f update 2025-08-07 11:29:24 +09:00
b53ce8bd83 refactor code 2025-08-07 11:27:51 +09:00
8bb0d56a80 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-luannv24-s2s17s15-fixbug 2025-08-07 11:23:58 +09:00
dev
f715405ad2 Merge pull request 'dev-trungvq7-0729' (#40) from dev-trungvq7-0729 into dev
Reviewed-on: #40
2025-08-07 10:58:23 +09:00
f80bfc5c71 fix bug screen 10 2025-08-07 08:37:59 +07:00
56607d0770 update code 2025-08-06 19:08:06 +09:00
dev
6db0ff96c0 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-08-06 19:03:14 +09:00
2cf00c0880 update code fixbug 2025-08-06 19:02:19 +09:00
dev
9155a2b55e commit 0608 2025-08-06 19:00:29 +09:00
dev
484d8879aa Merge pull request 'fix bugs' (#39) from dev-dungtv-0806 into dev
Reviewed-on: #39
2025-08-06 18:50:46 +09:00
38585f7b4f hotfix layout 2025-08-06 16:43:12 +07:00
b0ad70d33e fix bugs 2025-08-06 16:31:44 +07:00
dev
3f89707a01 Merge pull request 'fixbugs grid' (#38) from dev-dungtv-0805 into dev
Reviewed-on: #38
2025-08-06 12:13:45 +09:00
a4007d5697 resolve comment 2025-08-06 10:12:34 +07:00
3b6c05c70a Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv-0805 2025-08-06 09:27:47 +07:00
dev
550659475f Merge pull request 'fix bug 18 33 34' (#37) from dev-manhph1-figbug into dev
Reviewed-on: #37
2025-08-06 11:27:22 +09:00
4a7077336d resolve confict 2025-08-06 09:26:53 +07:00
dev
ca27167d3d Merge pull request 'Update tooltip s4 + add view button to switch page' (#36) from dev-nghiantt-fix-bugs into dev
Reviewed-on: #36
2025-08-06 10:32:48 +09:00
bf6d03df63 fixbugs grid 2025-08-05 17:28:12 +07:00
8cadade514 fix bug 18 33 34 2025-08-05 15:00:22 +07:00
f929ad2c28 Update tooltip s4 + add view button to switch page 2025-08-05 15:29:25 +09:00
dev
53b8b89e68 Merge pull request 'dev-trungvq7-0729' (#35) from dev-trungvq7-0729 into dev
Reviewed-on: #35
2025-08-05 11:15:47 +09:00
dev
b32aa1d5bb Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-08-04 19:40:08 +09:00
dev
8f7f5c598d Update 0408 2025-08-04 19:39:58 +09:00
dev
e96d012d17 Merge pull request 'fixbug' (#34) from dev-luannv24-fixbugs32s2 into dev
Reviewed-on: #34
2025-08-04 19:01:26 +09:00
dev
efee1098ba Merge pull request 'dev-manhph1-figbug' (#33) from dev-manhph1-figbug into dev
Reviewed-on: #33
2025-08-04 18:56:50 +09:00
5735777bb1 fixbug 2025-08-04 18:53:30 +09:00
2253ddef0a conflic 2025-08-04 16:41:29 +07:00
41095098e2 fixbug-scrren-12 2025-08-04 16:37:00 +07:00
28fe49d39f fixbug-scrren-12 2025-08-04 16:35:12 +07:00
dev
f180f22324 Merge pull request 'fix bug screen 8, 10, menu' (#32) from dev-dungtv44-0804 into dev
Reviewed-on: #32
2025-08-04 18:06:52 +09:00
a7968774c3 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv44-0804 2025-08-04 15:03:03 +07:00
dev
195c48ff25 Merge pull request 'Update s1 s29 - Remove mock data s5 s11' (#31) from dev-nghiantt-s1s29 into dev
Reviewed-on: #31
2025-08-04 17:02:41 +09:00
7bca077859 fix bug screen 8, 10, menu 2025-08-04 15:00:22 +07:00
6dfda50ebd Change style to built in class + Add missing titlte 2025-08-04 11:21:29 +09:00
df678daedf Fix duplicate id not reload page date 2025-08-01 16:03:54 +09:00
06308055ef Remove mock data popup s11 2025-08-01 12:08:43 +09:00
1284d5b14f Update s1 s29 - Remove mock data s5 s11 2025-08-01 11:41:32 +09:00
dev
cd7a6362a5 Merge pull request 'dev-luannv24-s32s17s2' (#30) from dev-luannv24-s32s17 into dev
Reviewed-on: #30
2025-07-31 18:49:01 +09:00
3ae3ff8167 refactor code 2025-07-31 18:47:42 +09:00
dev
39cb5d2883 Merge pull request 'dev-dungtv-0731' (#28) from dev-dungtv-0731 into dev
Reviewed-on: #28
2025-07-31 18:22:10 +09:00
dcdcf772ce fixbug screen 20.4 2025-07-31 16:18:44 +07:00
881a5ceb2d merge code 2025-07-31 17:44:19 +09:00
e4074201e4 update screen 32 vs 2 2025-07-31 17:43:45 +09:00
40addfe639 fixbug active menu item 2025-07-31 15:05:33 +07:00
dev
a557130c15 Merge pull request 'fixbug ui 20 21' (#29) from dev-manhph1-fixbugui-21-28 into dev
Reviewed-on: #29
2025-07-31 16:44:05 +09:00
34d5a1eeb7 fixbug ui 20 21 2025-07-31 16:18:33 +09:00
238fdb5fc5 remove console 2025-07-31 14:18:29 +07:00
3c249aa476 update code 2025-07-31 15:57:07 +09:00
bfe206a2bf Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv-0731 2025-07-31 13:52:37 +07:00
a6e8e6cf86 fixbug screen 20 2025-07-31 13:52:28 +07:00
dev
f9643f46a0 Merge pull request 'Commit 3107' (#27) from dev-trungvq7-0729 into dev
Reviewed-on: #27
2025-07-31 15:39:36 +09:00
dev
056d1a1e17 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-07-31 15:03:33 +09:00
dev
a58062a7b7 Commit 3107 2025-07-31 14:54:02 +09:00
dev
44077048e6 Merge pull request 'dev-trungvq7-0729' (#26) from dev-trungvq7-0729 into dev
Reviewed-on: #26
2025-07-31 14:43:43 +09:00
dev
e32f03c9ae Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-07-31 11:33:52 +09:00
dev
58bb7f915c Update screen 30, 13, 22 2025-07-31 11:31:53 +09:00
dev
a85f9f98f6 Merge pull request 'fix style grid' (#25) from dev-dungtv44-0730 into dev
Reviewed-on: #25
2025-07-31 10:49:24 +09:00
dev
791b291c30 Merge pull request 'dev-luannv24-s32s17' (#24) from dev-luannv24-s32s17 into dev
Reviewed-on: #24
2025-07-30 19:18:37 +09:00
e6e1703942 update date pickker 2025-07-30 19:16:42 +09:00
719e7cee69 fix style grid 2025-07-30 17:09:09 +07:00
9b89a5625b update code fix bug and revert screen 2 2025-07-30 18:34:46 +09:00
e600089f7e fix bug 2025-07-30 18:15:08 +09:00
adbf220770 merge file 2025-07-30 18:14:21 +09:00
dev
51b59bf4c9 Merge pull request 'dev-dungtv44-0730' (#23) from dev-dungtv44-0730 into dev
Reviewed-on: #23
2025-07-30 17:41:07 +09:00
b2e50837fd update code 2025-07-30 16:21:52 +09:00
88b59f5f33 update code merge 2025-07-30 16:19:54 +09:00
a2e7e8d74e pull dev 2025-07-30 14:07:08 +07:00
dev
d37f23512a Merge pull request 'Update s14 s29 + Fix bugs s1 + Update datepicker height' (#22) from dev-nghiantt-s1s29 into dev
Reviewed-on: #22
2025-07-30 16:05:38 +09:00
1a23077421 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv44-0730 2025-07-30 14:04:11 +07:00
9603353ab3 update screen 33, 44, 20, fix bug Grid 2025-07-30 14:03:41 +07:00
6077dddb74 Remove mockdata screen 5 2025-07-30 15:35:41 +09:00
2338bbf2ec Remove log + fix click chart top 10 2025-07-30 15:01:44 +09:00
c2e2c10a8a Update s14 s29 + Fix bugs s1 + Update datepicker height 2025-07-30 12:35:12 +09:00
dev
d790249743 Merge pull request 'fix ui EvtObjPop' (#21) from dev-manhph1-fixbug-18-19-21-28 into dev
Reviewed-on: #21
2025-07-30 11:43:21 +09:00
205821fc11 fix ui EvtObjPop 2025-07-30 11:39:45 +09:00
dev
fade079b06 Merge pull request 'dev-manhph1-fixbug-18-19-21-28' (#18) from dev-manhph1-fixbug-18-19-21-28 into dev
Reviewed-on: #18
2025-07-30 11:24:55 +09:00
dev
98c26a156e Merge pull request 'update screen 34, fix bug grid - select item' (#20) from dev-dungtv44-0730 into dev
Reviewed-on: #20
2025-07-30 11:22:38 +09:00
b4f8e41c7e update screen 34, fix bug grid - select item 2025-07-30 09:15:11 +07:00
dev
e9bdd80f14 Merge pull request 'update screen 34, 20' (#19) from dev-dungtv44-0730 into dev
Reviewed-on: #19
2025-07-30 10:35:21 +09:00
eeadcd254d remove console log 2025-07-30 08:32:27 +07:00
b56bd12bb7 update screen 34, 20 2025-07-30 08:23:13 +07:00
bea1e0889b dev-manhph1-add-pagination-28 2025-07-29 18:30:19 +09:00
dev
0f66d84b48 Merge pull request 'hotfix grid' (#17) from dev-dungtv-fix-grid into dev
Reviewed-on: #17
2025-07-29 17:45:00 +09:00
34d03b2546 dev-manhph1-fixbug-18-19-21-28 2025-07-29 17:18:41 +09:00
8f83e1d60c hotfix grid 2025-07-29 14:58:37 +07:00
dev
1faf49056d Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-0729 2025-07-29 15:59:34 +09:00
dev
e9ab3faa51 update 2025-07-29 15:59:32 +09:00
dev
54220aa4eb Merge pull request 'update screen 12, 20' (#15) from dev-dungtv-0729 into dev
Reviewed-on: #15
2025-07-29 15:39:16 +09:00
315aafc528 update screen 12, 20 2025-07-29 13:20:29 +07:00
8963a92475 update screen15-screen31 2025-07-29 12:06:11 +09:00
d66a03626b updatenew-code-new 2025-07-29 12:04:09 +09:00
dev
665a178f82 Merge pull request 'update screen 2, 8, 9, 10, 27, 33, 34' (#12) from dev-dungtv-0728 into dev
Reviewed-on: #12
2025-07-29 11:52:11 +09:00
7e2383efda update-subtitle-screen15 2025-07-29 11:39:05 +09:00
13cedc7337 resolve conflict 2025-07-29 09:36:40 +07:00
dev
e128375aeb Merge pull request 'Update Screen 16, 22' (#13) from dev-trungvq7-2207 into dev
Reviewed-on: #13
2025-07-29 11:30:56 +09:00
dev
710714116e Remove inline style 2025-07-29 11:30:05 +09:00
dev
33dbe93290 Merge pull request '- Update screen 14 29 - Remove mock data dashboard' (#11) from dev-nghiantt-s14 into dev
Reviewed-on: #11
2025-07-29 11:25:51 +09:00
708b648080 updatecode 2025-07-29 11:20:59 +09:00
dev
2845672723 Update 16, 22 2025-07-29 10:51:49 +09:00
bbaf26af86 Fix comment 2025-07-28 18:34:29 +09:00
c3d01c998c update screen 2, 8, 9, 10, 27, 33, 34 2025-07-28 16:12:24 +07:00
aec9353ab2 - Update screen 14 29 - Remove mock data dashboard 2025-07-28 17:22:38 +09:00
dev
2dd0c6a72c Merge pull request 'dev-trungvq7-2207' (#10) from dev-trungvq7-2207 into dev
Reviewed-on: #10
2025-07-28 14:39:36 +09:00
dev
631637a8e1 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-trungvq7-2207 2025-07-28 14:31:49 +09:00
dev
3ff87852e5 Update 2507 2025-07-28 14:31:41 +09:00
dev
117e0adeb9 Merge pull request 'dev-dungtv-0725' (#9) from dev-dungtv-0725 into dev
Reviewed-on: #9
2025-07-28 10:59:55 +09:00
402b09440f fix code comment 2025-07-28 08:59:17 +07:00
71f7cf4d30 Merge branch 'dev' of http://218.237.212.51:30003/gitadmin/sk_fems_ui into dev-dungtv-0725 2025-07-28 08:45:04 +07:00
d3984182e8 update screen 8, 10 2025-07-28 08:44:51 +07:00
dev
933d4b751f Merge pull request 'dev-luannv27-2407' (#7) from dev-luannv27-2407 into dev
Reviewed-on: #7
2025-07-28 10:35:21 +09:00
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
246 changed files with 40616 additions and 30455 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.

View File

@ -0,0 +1,3 @@
<svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.4369 8.15117L10.1947 5.30742C10.1538 5.25551 10.1017 5.21353 10.0423 5.18464C9.98285 5.15575 9.91764 5.14071 9.85156 5.14062H8.96562C8.87402 5.14062 8.82344 5.2459 8.87949 5.31836L10.8523 7.82031H2.57812C2.51797 7.82031 2.46875 7.86953 2.46875 7.92969V8.75C2.46875 8.81016 2.51797 8.85938 2.57812 8.85938H12.0924C12.4588 8.85938 12.6625 8.43828 12.4369 8.15117Z" fill="black" fill-opacity="0.45"/>
</svg>

After

Width:  |  Height:  |  Size: 514 B

View File

@ -0,0 +1,3 @@
<svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.4369 8.15117L10.1947 5.30742C10.1538 5.25551 10.1017 5.21353 10.0423 5.18464C9.98285 5.15575 9.91764 5.14071 9.85156 5.14062H8.96562C8.87402 5.14062 8.82344 5.2459 8.87949 5.31836L10.8523 7.82031H2.57812C2.51797 7.82031 2.46875 7.86953 2.46875 7.92969V8.75C2.46875 8.81016 2.51797 8.85938 2.57812 8.85938H12.0924C12.4588 8.85938 12.6625 8.43828 12.4369 8.15117Z" fill="white" fill-opacity="0.45"/>
</svg>

After

Width:  |  Height:  |  Size: 514 B

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,24 @@
@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;
} }
} }
.custom-action-btn{
height: 24px;
width: 24px;
font-size: 12px;
}
.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 +81,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 +92,110 @@
} }
} }
} }
.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-popup-default {
background:map-deep-get($config, #{$theme}, "ant-btn-popup-bg");
color:map-deep-get($config, #{$theme}, "ant-btn-popup-color");
border: 1px solid map-deep-get($config, #{$theme}, "ant-btn-popup-border");
}
&.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 {
span {
&.v-icon {
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

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

View File

@ -11,56 +11,140 @@
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 {
// width: 100% !important;
// }
// &-table {
// width: 100% !important;
// }
// &-lside-area .tui-grid-body-area {
// margin-right: -11px;
// }
&-lside-area .tui-grid-scrollbar-left-bottom { &-lside-area .tui-grid-scrollbar-left-bottom {
display: none; display: none;
} }
&-rside-area { &-no-scroll-y {
.tui-grid-rside-area {
.tui-grid-header-area, .tui-grid-header-area,
.tui-grid-summary-area { .tui-grid-summary-area {
margin-right: $scrollbar-width; margin-right: 0 !important;
}
}
}
&-rside-area {
.tui-grid-header-area,
.tui-grid-summary-area {
margin-right: $scrollbar-width !important;
} }
} }
&-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;
} }
th[data-column-name="_checked"] {
padding-left: 0;
}
}
.tui-grid-table {
.tui-grid-cell-header,
.tui-grid-cell-has-input .tui-grid-cell-content {
padding: 8px;
}
th[data-column-name="_checked"] {
&.tui-grid-cell-header {
padding-left: 0;
}
}
.tui-grid-cell {
input[type=checkbox] {
margin-top: 8px;
appearance: none;
-webkit-appearance: none;
width: 16px;
height: 16px;
border: 1px solid;
border-radius: 2px;
cursor: pointer;
position: relative;
&:checked {
&::after {
content: "";
position: absolute;
left: 5px;
top: 1px;
width: 5px;
height: 9px;
border: solid;
border-width: 0 2px 2px 0;
transform: rotate(45deg);
}
}
}
}
}
.tui-grid-layer-editing {
input[type=checkbox] {
margin-top: 8px;
appearance: none;
-webkit-appearance: none;
width: 16px;
height: 16px;
border: 1px solid;
border-radius: 2px;
cursor: pointer;
position: relative;
&:checked {
&::after {
content: "";
position: absolute;
left: 5px;
top: 1px;
width: 5px;
height: 9px;
border: solid;
border-width: 0 2px 2px 0;
transform: rotate(45deg);
}
}
}
}
.treeGrid { .treeGrid {
.tui-grid { .tui-grid {
&-header-area { &-header-area {
@ -73,41 +157,196 @@
} }
} }
} }
.tui-grid-scrollbar-right-top { .tui-grid-scrollbar-right-top {
z-index: 5; z-index: 5;
} }
@each $theme in dark, light { @each $theme in dark, light {
@include theme($theme); @include theme($theme);
.v-application.#{$theme}-mode { .v-application.#{$theme}-mode {
.enrg-effc {
.tui-grid-rside-area {
.tui-grid-table {
tr {
td:nth-child(4),
td:nth-child(10) {
.tui-grid-cell-content {
color: map-deep-get($config,
#{$theme},
"router-tab-item-active-color"
);
}
}
}
.tui-grid { .tui-grid {
&-container,
&-summary-area { &-row-odd,
&-row-even {
&:hover {
>td:nth-child(4),
td:nth-child(10) {
.tui-grid-cell-content {
color: map-deep-get($config,
#{$theme},
"router-tab-item-active-color"
);
}
}
}
}
}
}
}
}
.tui-grid-content-area {
.tui-grid-header-area {
height: auto !important;
}
}
.grid-title {
font-weight: 600;
font-size: 16px;
line-height: 24px;
letter-spacing: 0;
color: map-deep-get($config,
#{$theme},
"tui-grid-title-color"
);
}
.grid-toggle-section {
.tui-grid-rside-area {
.tui-grid-body-area {
height: auto !important;
}
}
}
.tui-grid {
&-table {
border: 1px solid;
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"
);
input[type=checkbox] {
border-color: map-deep-get($config,
#{$theme},
"ant-checkbox-border"
);
background: map-deep-get($config,
#{$theme},
"ant-checkbox-bg"
);
&:checked {
background-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-bg"
);
border-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-bg"
);
&::after {
border-color: map-deep-get($config,
#{$theme},
"ant-checkbox-bg"
);
}
}
}
}
}
&-border-line-right {
opacity: 0;
}
&-body-container {
border-right: 0;
// position: relative;
width: auto !important;
.tui-grid-table-container {
// width: 100% !important;
.tui-grid-table {
// width: 100% !important;
// table-layout: fixed;
// th, td {
// &:last-child{
// width: auto !important;
// }
// }
}
}
.tui-grid-layer-editing {
border-color: map-deep-get($config,
#{$theme},
"tui-grid-border-vertical-color"
);
}
}
&-summary-area,
&-container {
font-family: Inter;
.tui-grid-cell {
&.tui-grid-cell-summary {
color: map-deep-get($config,
#{$theme},
"tui-grid-cell-color"
);
}
}
}
&-body-area {
overflow: auto;
&::-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: rgba(0, 0, 0, 0) !important;
$config,
#{$theme},
"scrollbar-track"
) !important;
border-radius: 3px !important; border-radius: 3px !important;
// border-right: 1px solid;
// border-right-color: map-deep-get($config, #{$theme}, "tui-grid-cell-borderColor");
} }
&::-webkit-scrollbar-track { &::-webkit-scrollbar-track {
background-color: map-deep-get( background-color: rgba(0, 0, 0, 0) !important;
$config,
#{$theme},
"scrollbar-track"
) !important;
} }
&::-webkit-scrollbar-thumb { &::-webkit-scrollbar-thumb {
width: 50px !important;
height: 50px !important; height: 50px !important;
background-color: map-deep-get($config, #{$theme}, "scrollbar-thumb"); background-color: map-deep-get($config, #{$theme}, "scrollbar-thumb");
border-radius: 3px; border-radius: 3px;
// width: 50px !important;
// background-color: rgba(0, 0, 0, 0);
} }
} }
@ -121,38 +360,42 @@
} }
&-scrollbar-right-top { &-scrollbar-right-top {
background-color: map-deep-get( background-color: rgba(0, 0, 0, 0);
$config, border: none;
#{$theme}, display: none;
"tui-grid-header-backgroundColor" // background-color: map-deep-get(
); // $config,
border-left-color: map-deep-get( // #{$theme},
$config, // "tui-grid-header-backgroundColor"
#{$theme}, // );
"tui-grid-border-horziontal-color" // border-left-color: map-deep-get(
); // $config,
border-right-color: map-deep-get( // #{$theme},
$config, // "tui-grid-border-horziontal-color"
#{$theme}, // );
"tui-grid-border-horziontal-color" // border-right-color: map-deep-get(
); // $config,
border-bottom-color: map-deep-get( // #{$theme},
$config, // "tui-grid-border-horziontal-color"
#{$theme}, // );
"tui-grid-border-vertical-color" // border-bottom-color: map-deep-get(
); // $config,
// #{$theme},
// "tui-grid-border-vertical-color"
// );
} }
&-scrollbar-right-bottom { &-scrollbar-right-bottom {
width: $scrollbar-width !important; width: $scrollbar-width !important;
height: $scrollbar-width !important; height: $scrollbar-width !important;
border-color: map-deep-get($config, #{$theme}, "cardBackground");
background-color: map-deep-get($config, #{$theme}, "cardBackground");
box-sizing: border-box;
// display: none !important; // display: none !important;
border-color: map-deep-get($config, #{$theme}, "scrollbar-track");
background-color: map-deep-get($config, #{$theme}, "scrollbar-track");
// border: none !important; // border: none !important;
// bottom: -1px; // bottom: -1px;
// right: -2px; // right: -2px;
box-sizing: border-box; // display: none;
} }
&-scrollbar-frozen-border, &-scrollbar-frozen-border,
@ -162,25 +405,111 @@
border-color: transparent !important; border-color: transparent !important;
} }
&-body-area { &-body-area,
overflow: auto !important;
}
&-container, &-container,
&-layer-state, &-layer-state,
&-body-area,
&-summary-area, &-summary-area,
&-cell { &-cell {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-cell-backgroundColor" "tui-grid-cell-backgroundColor"
); );
border-color: map-deep-get( border-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-border-vertical-color" "tui-grid-border-vertical-color"
); );
// &-current-row{
// }
td.row-selected {
.custom-radio {
background-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-color"
);
.radio-mark {
border-color: map-deep-get($config,
#{$theme},
"arow-line-color"
);
background-color: map-deep-get($config,
#{$theme},
"arow-line-btn-bg-color"
);
&::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
height: 8px;
width: 8px;
border-radius: 50%;
background-color: map-deep-get($config,
#{$theme},
"arow-line-color"
);
}
}
}
}
.tui-grid-cell-content {
input[type='text'],
input[type='password'] {
border-color: map-deep-get($config,
#{$theme},
"v-input-fieldset-color"
);
background: map-deep-get($config,
#{$theme},
"v-input-backgroundColor"
);
border-radius: 4px;
color: map-deep-get($config,
#{$theme},
"tui-grid-cell-color"
);
}
&.tui-grid-layer-editing {
background: transparent;
// background:map-deep-get($config,
// #{$theme},
// "tui-grid-cell-insert-color"
// );
}
span {
&.custom-link {
color: map-deep-get($config,
#{$theme},
"router-tab-item-active-color"
);
}
}
}
}
&-cell {
&:last-child {
padding-right: 1px;
border-right: 1px solid;
border-right-color: map-deep-get($config,
#{$theme},
"tui-grid-cell-borderColor"
);
// .tui-grid-cell-content {
// border-right: 1px solid ;
// border-right-color: map-deep-get($config,
// #{$theme},
// "tui-grid-cell-borderColor"
// );
// }
}
} }
&-cell-summary { &-cell-summary {
@ -189,17 +518,36 @@
&-header-area, &-header-area,
&-cell-header { &-cell-header {
background-color: map-deep-get( // font-family: inherit;
$config, // font-style: Semi Bold;
font-weight: 600;
background-color: map-deep-get($config,
#{$theme}, #{$theme},
"tui-grid-header-backgroundColor" "tui-grid-header-backgroundColor"
); );
border-color: map-deep-get( border-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-border-vertical-color" "tui-grid-border-vertical-color"
); );
color: map-deep-get($config, #{$theme}, "activate"); color: map-deep-get($config,
#{$theme},
"tui-grid-header-color"
);
}
&-header-area {
// background-color: none;
border: none;
// margin-right: 0 !important;
background-color: map-deep-get($config,
#{$theme},
"tui-grid-cell-backgroundColor"
);
// width: 100% !important;
// .tui-grid-table {
// width: 100% !important;
// }
} }
&-row-odd, &-row-odd,
@ -210,8 +558,7 @@
&:hover { &:hover {
>.tui-grid-cell { >.tui-grid-cell {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-cell-hover-backgroundColor" "tui-grid-cell-hover-backgroundColor"
); );
@ -221,33 +568,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"
); ) !important;
} }
&.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"
); ) !important;
} }
&.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 +603,9 @@
color: map-deep-get($config, #{$theme}, "tui-grid-cell-disabled-color"); color: map-deep-get($config, #{$theme}, "tui-grid-cell-disabled-color");
} }
} }
&.row-selected { &.row-selected {
background-color: map-deep-get( background-color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"tui-grid-cell-selected-color" "tui-grid-cell-selected-color"
); );
@ -284,8 +631,7 @@
align-items: center; align-items: center;
position: relative; position: relative;
.tui-grid-tree-depth .tui-grid-tree-depth {
{
width: 16px; width: 16px;
height: 16px; height: 16px;
position: relative; position: relative;
@ -303,6 +649,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,45 +658,59 @@
&-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");
} }
} }
} }
&-tree-button-expand { &-tree-button-expand {
z-index: 9999;
.tui-grid-btn-tree { .tui-grid-btn-tree {
i { i {
width: 16px; width: 16px;
height: 16px; height: 16px;
background-position: 0 0; background-position: 0 0;
@if $theme ==dark { @if $theme ==dark {
background-image: url("data:image/svg+xml,%3Csvg id='btn_tree_item_close' xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cdefs%3E%3Cstyle%3E .cls-1 %7B fill: %230d0f17; stroke: %23fff; opacity: 0.3; %7D .cls-2 %7B fill: %23fff; %7D .cls-3 %7B stroke: none; %7D .cls-4 %7B fill: none; %7D %3C/style%3E%3C/defs%3E%3Cg id='사각형_703' data-name='사각형 703' class='cls-1'%3E%3Crect class='cls-3' width='16' height='16' rx='3'/%3E%3Crect class='cls-4' x='0.5' y='0.5' width='15' height='15' rx='2.5'/%3E%3C/g%3E%3Crect id='사각형_1384' data-name='사각형 1384' class='cls-2' width='8' height='2' rx='1' transform='translate(4 7)'/%3E%3C/svg%3E%0A"); background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22none%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Crect%20width%3D%2216%22%20height%3D%2216%22%20rx%3D%224%22%20fill%3D%22%23212224%22/%3E%3Crect%20x%3D%220.5%22%20y%3D%220.5%22%20width%3D%2215%22%20height%3D%2215%22%20rx%3D%223.5%22%20stroke%3D%22white%22%20stroke-opacity%3D%220.06%22/%3E%3Cpath%20d%3D%22M12.5998%208H2.99979%22%20stroke%3D%22white%22%20stroke-opacity%3D%220.85%22/%3E%3C/svg%3E");
} @else { }
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cg data-name='사각형 703' style='fill:%23f1f3f9;stroke:%23a4aac3'%3E%3Crect width='16' height='16' rx='3' style='stroke:none'/%3E%3Crect x='.5' y='.5' width='15' height='15' rx='2.5' style='fill:none'/%3E%3C/g%3E%3Crect data-name='사각형 1384' width='8' height='2' rx='1' transform='translate(4 7)' style='fill:%23a4aac3'/%3E%3C/svg%3E ");
@else {
background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22none%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Crect%20width%3D%2216%22%20height%3D%2216%22%20rx%3D%224%22%20fill%3D%22white%22/%3E%3Crect%20x%3D%220.5%22%20y%3D%220.5%22%20width%3D%2215%22%20height%3D%2215%22%20rx%3D%223.5%22%20stroke%3D%22black%22%20stroke-opacity%3D%220.06%22/%3E%3Cpath%20d%3D%22M12.5997%208H2.99973%22%20stroke%3D%22black%22%20stroke-opacity%3D%220.88%22/%3E%3C/svg%3E");
} }
} }
} }
} }
&-tree-button-collapse { &-tree-button-collapse {
z-index: 9999;
.tui-grid-btn-tree { .tui-grid-btn-tree {
i { i {
width: 16px; width: 16px;
height: 16px; height: 16px;
background-position: 0 0; background-position: 0 0;
@if $theme ==dark { @if $theme ==dark {
background-image: url("data:image/svg+xml,%3Csvg id='btn_tree_item_open' xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cdefs%3E%3Cstyle%3E .cls-2%7Bfill:%23fff%7D %3C/style%3E%3C/defs%3E%3Cg id='사각형_703' data-name='사각형 703' style='fill:%230d0f17;stroke:%23fff;opacity:.3'%3E%3Crect width='16' height='16' rx='3' style='stroke:none'/%3E%3Crect x='.5' y='.5' width='15' height='15' rx='2.5' style='fill:none'/%3E%3C/g%3E%3Crect id='사각형_1384' data-name='사각형 1384' class='cls-2' width='8' height='2' rx='1' transform='translate(4 7)'/%3E%3Crect id='_1385' data-name=' 1385' class='cls-2' width='2' height='8' rx='1' transform='translate(7 4)'/%3E%3C/svg%3E%0A"); background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22none%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Crect%20width%3D%2216%22%20height%3D%2216%22%20rx%3D%224%22%20fill%3D%22%23212224%22/%3E%3Crect%20x%3D%220.5%22%20y%3D%220.5%22%20width%3D%2215%22%20height%3D%2215%22%20rx%3D%223.5%22%20stroke%3D%22white%22%20stroke-opacity%3D%220.06%22/%3E%3Cpath%20d%3D%22M7.7998%203.00073V12.6007%22%20stroke%3D%22white%22%20stroke-opacity%3D%220.85%22/%3E%3Cpath%20d%3D%22M12.5999%207.80078L2.99985%207.80078%22%20stroke%3D%22white%22%20stroke-opacity%3D%220.85%22/%3E%3C/svg%3E");
} @else { }
background-image: url("data:image/svg+xml,%3Csvg id='btn_tree_item_open' xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cdefs%3E%3Cstyle%3E .cls-2%7Bfill:%23a4aac3%7D %3C/style%3E%3C/defs%3E%3Cg id='사각형_703' data-name='사각형 703' style='fill:%23f1f3f9;stroke:%23a4aac3'%3E%3Crect width='16' height='16' rx='3' style='stroke:none'/%3E%3Crect x='.5' y='.5' width='15' height='15' rx='2.5' style='fill:none'/%3E%3C/g%3E%3Crect id='사각형_1384' data-name='사각형 1384' class='cls-2' width='8' height='2' rx='1' transform='translate(4 7)'/%3E%3Crect id='_1385' data-name=' 1385' class='cls-2' width='2' height='8' rx='1' transform='translate(7 4)'/%3E%3C/svg%3E ");
@else {
background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22none%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Crect%20width%3D%2216%22%20height%3D%2216%22%20rx%3D%224%22%20fill%3D%22white%22/%3E%3Crect%20x%3D%220.5%22%20y%3D%220.5%22%20width%3D%2215%22%20height%3D%2215%22%20rx%3D%223.5%22%20stroke%3D%22black%22%20stroke-opacity%3D%220.06%22/%3E%3Cpath%20d%3D%22M7.7998%203.00073V12.6007%22%20stroke%3D%22black%22%20stroke-opacity%3D%220.88%22/%3E%3Cpath%20d%3D%22M12.5997%207.80078L2.99973%207.80078%22%20stroke%3D%22black%22%20stroke-opacity%3D%220.88%22/%3E%3C/svg%3E");
} }
} }
} }
@ -365,6 +726,37 @@
&-frozen-border { &-frozen-border {
background-color: transparent; background-color: transparent;
} }
&-layer-editing {
input[type=checkbox] {
border-color: map-deep-get($config,
#{$theme},
"ant-checkbox-border"
);
background: map-deep-get($config,
#{$theme},
"ant-checkbox-bg"
);
&:checked {
background-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-bg"
);
border-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-bg"
);
&::after {
border-color: map-deep-get($config,
#{$theme},
"ant-checkbox-bg"
);
}
}
}
}
} }
[class*="tui-grid-tree-wrapper"] { [class*="tui-grid-tree-wrapper"] {

View File

@ -1,40 +1,89 @@
.v-select__custom { .v-select__custom {
&.v-text-field.v-text-field--solo:not(.v-text-field--solo-flat) padding: 0.125rem;
> .v-input__control
> .v-input__slot { &.v-text-field.v-text-field--solo:not(.v-text-field--solo-flat)>.v-input__control>.v-input__slot {
box-shadow: none; box-shadow: none;
} }
&.v-text-field.v-text-field--solo .v-input__control { &.v-text-field.v-text-field--solo .v-input__control {
min-height: 36px; min-height: 32px;
height: 36px; height: 32px;
} }
&.v-input input { &.v-input input {
min-height: 36px; min-height: 32px;
height: 36px; height: 32px;
} }
.v-input--selection-controls { .v-input--selection-controls {
margin-top: 0; margin-top: 0;
padding-top: 0; padding-top: 0;
} }
.v-input__slot { .v-input__slot {
overflow: hidden; overflow: hidden;
position: relative; position: relative;
height: 36px; height: 32px;
}
&.v-text-field .v-input__control {
border-color: #d9d9d9;
}
&.select-large {
.v-input__slot,
.v-input__control {
height: 40px !important;
// border: solid 1px #D9D9D9;
border-radius: 8px !important;
}
}
legend {
width: 0;
}
.v-select-list {
padding: 0 1rem;
} }
} }
.v-input__custom { .v-input__custom {
.v-input__slot { .v-input__slot {
&:before, &:before,
&:after { &:after {
display: none; display: none;
} }
} }
.v-input__slot { .v-input__slot {
overflow: hidden; overflow: hidden;
position: relative; position: relative;
} }
&.input-large {
border-radius: 8px !important;
input {
max-height: 40px;
height: 40px;
}
}
&.v-text-field .v-input__control {
border-color: #d9d9d9;
}
&.surface-name {
fieldset {
max-width: 345px;
}
}
} }
.v-text-field .v-input__append-inner, .v-text-field .v-input__append-inner,
@ -45,19 +94,20 @@
.v-select__widget { .v-select__widget {
&.v-text-field.v-text-field--solo:not(.v-text-field--solo-flat) &.v-text-field.v-text-field--solo:not(.v-text-field--solo-flat)>.v-input__control>.v-input__slot {
> .v-input__control
> .v-input__slot {
box-shadow: none; box-shadow: none;
} }
&.v-text-field.v-text-field--solo .v-input__control { &.v-text-field.v-text-field--solo .v-input__control {
min-height: 30px !important; min-height: 30px !important;
height: 30px !important; height: 30px !important;
} }
&.v-input input { &.v-input input {
min-height: 30px !important; min-height: 30px !important;
height: 30px !important; height: 30px !important;
} }
&.v-text-field--outlined>.v-input__control>.v-input__slot { &.v-text-field--outlined>.v-input__control>.v-input__slot {
align-items: stretch; align-items: stretch;
min-height: 30px; min-height: 30px;
@ -67,6 +117,7 @@
margin-top: 0; margin-top: 0;
padding-top: 0; padding-top: 0;
} }
.v-input__slot { .v-input__slot {
overflow: hidden; overflow: hidden;
position: relative; position: relative;
@ -79,12 +130,14 @@
width: 110px; width: 110px;
height: 30px; height: 30px;
flex: 0 0 auto; flex: 0 0 auto;
&.v-text-field.v-text-field--solo .v-input__control { &.v-text-field.v-text-field--solo .v-input__control {
min-height: 30px; min-height: 30px;
height: 30px; height: 30px;
} }
} }
} }
.v-text-field>.v-input__control>.v-input__slot:after, .v-text-field>.v-input__control>.v-input__slot:after,
.v-text-field>.v-input__control>.v-input__slot:before { .v-text-field>.v-input__control>.v-input__slot:before {
display: none; display: none;
@ -93,9 +146,15 @@
.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;
&.v-text-field--outlined {
fieldset {
top: -4px
}
}
} }
.v-input__append-inner { .v-input__append-inner {
@ -104,25 +163,159 @@
} }
} }
.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: 0;
margin: 5px;
font-size: 16px;
}
.custom-radio input[type="radio"] {
position: absolute;
opacity: 0;
cursor: pointer;
}
/* Custom radio appearance */
.radio-mark {
position: absolute;
left: -8px;
top: 50%;
transform: translateY(-50%);
height: 14px;
width: 14px;
// background-color: white;
border: 1px 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;
}
.ant-checkbox {
.ant-checkbox-inner {
border-radius: 4px
}
}
input[type="checkbox"] {
width: 16px;
height: 16px
}
@each $theme in dark, light { @each $theme in dark, light {
@include theme($theme); @include theme($theme);
.v-application.#{$theme}-mode { .v-application.#{$theme}-mode {
.ant-checkbox-wrapper {
.ant-checkbox {
.ant-checkbox-inner {
background-color: map-deep-get($config, #{$theme}, "ant-checkbox-bg"); // background for unchecked checkbox
border-color: map-deep-get($config, #{$theme}, "ant-checkbox-border");
}
}
.ant-checkbox-checked {
.ant-checkbox-inner {
background: map-deep-get($config, #{$theme}, "ant-btn-primary-bg"); // background for checked checkbox
border-color:map-deep-get($config, #{$theme}, "ant-btn-primary-bg");
color:map-deep-get($config, #{$theme}, "ant-btn-primary-color");
&.ant-checkbox-inner::after {
border-color: map-deep-get($config, #{$theme}, "ant-btn-primary-color");
}
}
}
}
.v-input-popup__custom {
.v-input__slot {
padding-left: 12px;
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 +323,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 +336,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 +352,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 +375,23 @@
.v-select { .v-select {
.v-label { .v-label {
color: map-deep-get($config, #{$theme}, "v-select-label-color"); color: map-deep-get($config, #{$theme}, "v-select-label-color");
position: static !important;
} }
&.v-input--is-disabled { &.v-input--is-disabled {
.v-label { .v-label {
color: map-deep-get($config, #{$theme}, "v-input-disabled-color"); color: map-deep-get($config, #{$theme}, "v-input-disabled-color");
} }
.v-icon.v-icon--disabled { .v-icon.v-icon--disabled {
color: map-deep-get( color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-input-disabled-color" "v-input-disabled-color"
) !important; ) !important;
} }
.v-select__selection--disabled { .v-select__selection--disabled {
color: map-deep-get( color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"v-input-disabled-color" "v-input-disabled-color"
) !important; ) !important;
@ -211,12 +403,31 @@
.v-label { .v-label {
color: map-deep-get($config, #{$theme}, "non-activate"); color: map-deep-get($config, #{$theme}, "non-activate");
} }
&.v-item--active { &.v-item--active {
.v-label { .v-label {
color: map-deep-get($config, #{$theme}, "activate"); color: map-deep-get($config, #{$theme}, "activate");
} }
} }
} }
.radio-mark {
background-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-color"
);
border-color: map-deep-get($config,
#{$theme},
"v-input-textarea-border"
);
}
input[type="checkbox"] {
accent-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-bg"
);
}
} }
.v-radio { .v-radio {
@ -241,14 +452,25 @@
.v-input--checkbox { .v-input--checkbox {
.v-icon { .v-icon {
transform: none;
&.mdi:before {
font-size: 20px;
}
@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

@ -0,0 +1,50 @@
@each $theme in dark, light {
// @include theme($theme);
.v-application.#{$theme}-mode {
.pagination-wrapper {
display: flex;
justify-content: center;
align-items: center;
padding: 12px 0;
margin-top: 10px;
}
.ant-pagination-item,
.ant-pagination-prev,
.ant-pagination-next {
// border: none !important;
// box-shadow: none !important;
background-color: map-deep-get($config, #{$theme}, "paging-background") !important;
color: map-deep-get($config, #{$theme}, "paging-text") !important;
border: none;
.ant-pagination-item-link {
border: none;
background-color: map-deep-get($config, #{$theme}, "paging-background") !important;
}
}
.ant-pagination-item-active {
border: 1px solid #1890ff !important;
color: #1890ff !important
}
.ant-pagination-options-size-changer {
.ant-select-selection {
border: 0.5px solid map-deep-get($config, #{$theme}, "v-input-fieldset-color") !important;
background: map-deep-get($config, #{$theme}, "paging-background") !important;
color: map-deep-get($config, #{$theme}, "paging-text") !important;
}
.ant-select-arrow {
color: map-deep-get($config, #{$theme}, "paging-text") !important;
}
.ant-select-selection__rendered {
margin-right: 30px;
}
}
}
}

View File

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

View File

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

View File

@ -0,0 +1,92 @@
@each $theme in dark, light {
// @include theme($theme);
.v-application.#{$theme}-mode {
.search-box-label {
margin-bottom: 8px;
}
.datepicker-container {
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
border-radius: 6px;
border: solid 1px;
height: 32px;
color: map-deep-get($config, #{$theme}, "v-input-fieldset-color") !important;
border-color: currentColor;
// border-color: map-deep-get($config, #{$theme}, "tui-datepicker-border-color");
&:hover {
border-color: map-deep-get($config, #{$theme}, "v-input-fieldset-hover-color" ) !important;
}
&:has(.v-input--is-focused){
border-width: 2px;
}
&.datepicker-large {
height: 40px;
}
.v-input {
// ----------------------
&.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-icon {
color: map-deep-get($config, #{$theme}, "v-icon-chevron-down") !important;
}
}
.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;
}
}
}
}

441
assets/scss/layout.scss Normal file
View File

@ -0,0 +1,441 @@
.loading {
z-index: 99;
position: fixed;
top: 50%;
left: 50%;
width: 100%;
height: 100%;
transform: translate(-50%, -50%);
background-color: rgba(0, 0, 0, 0.4);
//box-shadow: rgba(68, 67, 67, 0.9) 0 0 0 9999px;
}
.v-spinner {
top: 50%;
left: 50%;
}
::v-deep {
.container--fluid {
.menu-container {
height:calc(100vh - 60px);
overflow-y: auto;
min-width: 200px;
// v-navigation-drawer (sidebar)
.v-navigation-drawer {
box-shadow: none; // 0 0 10px 0 rgba(0, 0, 0, 0.15);
min-width: 200px !important;
// transform: none !important;
// visibility: visible !important;
&--fixed {
z-index: 20;
}
.home {
display: block;
line-height: 0;
}
&__border {
display: none;
}
&__append {
padding: 0 17px;
margin: 0 0 26px;
>p {
margin-bottom: 0;
}
}
.v-treeview {
padding: 0 10px;
box-sizing: border-box;
.v-treeview-node__level {
width: 9px;
}
>.v-treeview-node {
margin-top: 10px;
&:first-child {
margin-top: 0;
}
>.v-treeview-node__root {
min-height: 44px !important;
}
}
.v-treeview-node {
.v-treeview-node__toggle {
display: none !important;
}
&>.v-treeview-node__root:before {
border-radius: 6px;
z-index: -1;
background-color: rgba(0, 0, 0, 0);
transition-duration: 0s;
}
&>.v-treeview-node__root:hover:before {
opacity: 0 !important;
}
.v-treeview-node__children {
.v-treeview-node__label {
>button>span {
font-size: 0.875rem;
}
}
}
}
.v-treeview-node--click[aria-expanded="true"] {
&>.v-treeview-node__root:before {
opacity: 0 !important;
}
}
.v-treeview-node[aria-expanded="true"] {
&>.v-treeview-node__root>.v-treeview-node__content
>.v-treeview-node__label>button {
>.anticon,
>.v-icon.mdi-chevron-down {
transform: rotate(-180deg);
}
}
}
.v-treeview-node__label {
&>button {
width: 100%;
display: flex;
align-items: center;
// justify-content: center;
}
& .anticon,
& .v-icon.mdi-chevron-down {
margin-left: auto;
animation-duration: 0.5s;
font-size: 12px;
}
}
}
.v-treeview-node--active {
&:before {
opacity: 0 !important;
}
}
&.v-navigation-drawer--mini-variant {
.home {
display: none;
}
.v-treeview-node__content {
margin-left: 0;
}
.v-treeview-node__content span:not(.v-icon),
.v-treeview-node__root>button,
.v-treeview-node__level,
.v-treeview-node__content .v-icon.mdi-chevron-down,
.v-treeview-node__content .anticon {
display: none;
}
.v-navigation-drawer__append {
display: none;
}
}
}
}
}
// router-tab header
.router-tab {
height: 100%;
&__header {
align-items: flex-end;
height: 52px;
margin: -5px -5px 0;
padding: 0 20px;
box-sizing: border-box;
border-bottom: none !important;
}
&-page {
height: 100%;
}
& .router-tab__container {
overflow-y: auto;
height: calc(100vh - 110px);
max-height: calc(100vh - 115px);
padding: 20px;
}
.router-tab__slot-end {
align-self: center;
display: flex;
align-items: center;
>* {
flex: none;
margin-right: 6px;
&:last-child {
margin-right: 0;
}
}
.v-menu+.v-btn {
padding: 0 3px;
}
.v-btn {
border-radius: 4px;
}
}
.router-tab__nav {
padding-left: 0;
}
.router-tab__scroll {
height: 46px;
}
.router-tab__item {
height: 46px;
padding: 0 !important;
&:first-child {
border-left: none
}
&>span {
font-size: 14px;
}
&.is-active {
border-bottom: 2px solid;
&>span {
font-weight: 400;
}
}
&+.router-tab__item {
margin-left: 16px;
}
border:none;
}
}
}
@each $theme in dark, light {
@include theme($theme);
.v-application.#{$theme}-mode {
::v-deep {
::-webkit-scrollbar {
width: 4px;
border-radius: 3px;
}
::-webkit-scrollbar-track {
background-color: map-deep-get($config, #{$theme}, "scrollbar-track");
}
::-webkit-scrollbar-thumb {
width: 4px;
border-radius: 3px;
background-color: map-deep-get($config, #{$theme}, "scrollbar-thumb");
background-clip: content-box;
}
.header {
background-color: map-deep-get($config, #{$theme}, "header-backgroud");
border-bottom: 1px solid map-deep-get($config, #{$theme}, "v-header-border");
}
.btn-header {
background-color: map-deep-get($config, #{$theme}, "v-btn-header-background");
border:1px solid map-deep-get($config, #{$theme}, "v-btn-header-border");
color: map-deep-get($config, #{$theme}, "v-btn-header-text");
}
.container--fluid {
background-color: map-deep-get($config, #{$theme}, "container-fluid");
.menu-container {
border-right: 1px solid map-deep-get($config, #{$theme}, "v-sidebar-border") ;
.v-navigation-drawer__append {
>p {
color: map-deep-get($config, #{$theme}, "v-banner-border-color" ) !important;
}
}
}
}
.v-navigation-drawer {
background: map-deep-get($config, #{$theme}, "menu-bg-color");
}
.v-treeview {
.v-treeview-node+.v-treeview-node {
margin-top: 2px;
}
.v-treeview-node__root+.v-treeview-node__children {
margin-top: 2px;
}
&>.v-treeview-node {
.v-treeview-node__root {
border-radius: 8px;
&:hover {
background-color: map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color" );
}
.v-treeview-node__content {
.v-icon,
.v-treeview-node__label {
color: map-deep-get($config, #{$theme}, "tui-grid-title-color");
}
.anticon.anticon-down {
color: map-deep-get($config, #{$theme}, "icon-datepicker-color");
}
}
}
&[aria-expanded="true"]{
// Level 1
&>.v-treeview-node__root {
background-color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-bg" );
border: 1px solid map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border" );
color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border");
&:before {
background-color: map-deep-get($config, #{$theme}, "v-treeview-node-subroot-backgroundColor");
}
.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border");
}
.v-icon:first-child,
.v-icon:first-child::before,
.anticon.anticon-down {
color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border" );
}
}
}
&>.v-treeview-node__children {
// Level 2
.v-treeview-node__root {
color: map-deep-get($config, #{$theme}, "v-treeview-node-root-label-color");
&:hover {
background-color: map-deep-get($config, #{$theme}, "v-calendar-weekday-backgroundColor");
}
.v-treeview-node__content {
.v-icon,
.v-icon::before {
color: map-deep-get($config, #{$theme}, "icon-datepicker-color");
}
}
}
&>[aria-expanded="true"] >.v-treeview-node__root,
.v-treeview-node__root.v-treeview-node--active {
background-color: map-deep-get($config, #{$theme}, "v-calendar-day-in-not-month-color" );
.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config, #{$theme}, "card-title-color");
}
.v-icon,
.v-icon::before,
.anticon.anticon-down {
color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border" );
}
}
}
// Level 3
.v-treeview-node__children {
.v-treeview-node {
>.v-treeview-node__root {
*:hover,
:hover {
border-width: 0;
}
&:hover {
background-color: rgba(0, 0, 0, 0);
&:before {
opacity: 1 !important;
border: 1px solid map-deep-get($config, #{$theme}, "v-input-textarea-border");
border-radius: 8px;
}
.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config, #{$theme}, "tui-grid-title-color");
}
}
}
&.v-treeview-node--active {
// color: map-deep-get($config, #{$theme}, "card-title-color");
background-color: rgba(0, 0, 0, 0);
.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config, #{$theme}, "tui-grid-title-color");
}
.v-icon,
.v-icon::before,
.anticon {
color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-border" );
}
}
}
.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config, #{$theme}, "card-default-color");
}
}
}
}
}
}
}
}
}
}
}
}

View File

@ -8,7 +8,7 @@ $--color-gray_C: #cccccc !important;
$--color-gray_9: #95a0a9 !important; $--color-gray_9: #95a0a9 !important;
$--color-gray_7: #767d83 !important; $--color-gray_7: #767d83 !important;
$--color-gray_999: #999 !important; $--color-gray_999: #999 !important;
$--color-gray_555: #555 !important; $--color-gray_555: #555;
$--color-gray_aaa: #aaa !important; $--color-gray_aaa: #aaa !important;
$--color-hover_d: #47535c !important; $--color-hover_d: #47535c !important;
$--color-hover_l: #f0f5fc !important; $--color-hover_l: #f0f5fc !important;
@ -25,96 +25,101 @@ $--theme-color-g7-g9: "";
$--theme-color-g9-g7: ""; $--theme-color-g9-g7: "";
$scrollbar-width: 11px; // 스크롤 바 $scrollbar-width: 11px; // 스크롤 바
$column-spacer: 20px; // 검색 영역 열 간격 $column-spacer: 16px; // 검색 영역 열 간격
$row-spacer: 14px; // 검색 영역 행 간격 $row-spacer: 14px; // 검색 영역 행 간격
$color: ( $color: (
"black": ( "black": ("0": #000,
"0": #000, "1": #111),
"1": #111 "white": ("0": #fff),
), "week": ("sun": #FF4D4F,
"white": ( "sat": #597EF7)
"0": #fff
),
"week": (
"sun": #fb5a83,
"sat": #2d8cf6
)
); );
$config: ( $config: (
dark: ( dark: (w-g5: $--color-white,
w-g5: $--color-white,
g5-w: $--color-gray_555, g5-w: $--color-gray_555,
gc-g9: $--color-gray_C, gc-g9: $--color-gray_C,
g5-gc: $--color-gray_555, g5-gc: $--color-gray_555,
g7-g9: $--color-gray_7, g7-g9: $--color-gray_7,
g9-g7: $--color-gray_9, g9-g7: $--color-gray_9,
pageBackground: #23272b, pageBackground: #23272b,
cardBackground: #242940, cardBackground: #212224,
hover: #47535c, hover: #47535c,
btnClose: #24282c, btnClose: #24282c,
scrollbar-track: #2f334a, scrollbar-track: #2f334a,
scrollbar-thumb: #575b72, scrollbar-thumb: #575b72,
card-default-color: #fff, card-default-color: #FFFFFFA6,
card-title-color: #FFFFFFD9, // #111,
card-subtitle: rgba(255, 255, 255, 0.6), card-subtitle: rgba(255, 255, 255, 0.6),
card-text-info-color: #1668DC,
card-text-title-color: #FFFFFFA6,
activate: #fff, activate: #fff,
non-activate: rgba(255, 255, 255, 0.6), non-activate: rgba(255, 255, 255, 0.6),
text-subcolor: rgba(255, 255, 255, 0.6), text-subcolor: rgba(255, 255, 255, 0.6),
border-color: rgba(255, 255, 255, 0.1), border-color: rgba(255, 255, 255, 0.1),
router-header: #1d2133, router-header: #212224,
router-tab-item: #2d3355, router-container: #141415,
router-tab-item-active: #18579e, container-fluid: #141415,
router-tab-item-color: #fff, router-tab-item: transparent,
router-tab-item-active-color: #fff, router-tab-item-active: transparent,
router-tab-item-icon-color: rgba(255, 255, 255, 0.5), router-tab-item-color: #FFFFFFD9,
router-tab-item-icon-active-color: #fff, router-tab-item-active-color: #1668DC,
router-tab-item-hover-color: #3896ff, router-tab-item-icon-color: #FFFFFFD9,
router-tab-item-icon-active-color: #1668DC,
router-tab-item-hover-color: #1668DC,
router-tab-slot-end-button-backgroundColor: #144985, router-tab-slot-end-button-backgroundColor: #144985,
v-btn-backgroundColor: #144985, v-btn-backgroundColor: #144985,
v-box: #383f5d, v-box: #212224,
v-banner-border-color: rgba(255, 255, 255, 0.1), v-banner-border-color: rgba(255, 255, 255, 0.1),
v-treeview-node-root-backgroundColor: #18579e, v-treeview-node-root-backgroundColor: #212224,
v-treeview-node-root-label-color: #fff, v-treeview-node-root-label-color: #FFFFFFD9,
v-treeview-node-root-label-active-color: #fff, v-treeview-node-root-label-active-color: #FFFFFFD9,
v-treeview-node-root-icon-color: #fff, v-treeview-node-root-icon-color: #FFFFFFD9,
v-treeview-node-root-icon-active-color: #fff, v-treeview-node-root-icon-active-color: #FFFFFFD9,
v-treeview-node-subroot-backgroundColor: #2d3355, // v-treeview-node-subroot-backgroundColor: #FFFFFF0A,
v-treeview-node-subroot-backgroundColor: transparent,
v-treeview-node-label-color: rgba(255, 255, 255, 0.6), v-treeview-node-label-color: rgba(255, 255, 255, 0.6),
v-treeview-node-label-active-color: #fff, v-treeview-node-label-active-color: #1668DC,
v-treeview-leaf-active-backgroundColor: rgba(45, 51, 85, 0.5), v-treeview-leaf-active-backgroundColor: rgba(45, 51, 85, 0.5),
v-treeview-leaf-active-color: #3896ff, v-treeview-leaf-active-color: #3896ff,
v-treeview-icon-color: rgba(255, 255, 255, 0.6), v-treeview-icon-color: rgba(255, 255, 255, 0.6),
v-treeview-icon-active-color: #fff, v-treeview-icon-active-color: #fff,
v-input-backgroundColor: rgba(13, 15, 23, 0.3), v-treeview-node-label-children-color: #fff,
v-input-fieldset-color: rgba(255, 255, 255, 0.32), v-input-backgroundColor: transparent,
v-input-color: rgba(255, 255, 255, 0.25),
v-input-fieldset-color: #424242,
v-input-fieldset-hover-color: rgba(255, 255, 255, 1), v-input-fieldset-hover-color: rgba(255, 255, 255, 1),
v-input-icon-color: #fff, v-input-icon-color: #fff,
v-input-readonly-border-color: rgba(255, 255, 255, 0.3), v-input-readonly-border-color:#424242,
v-input-readonly-backgroundColor: rgba(57, 64, 94, 0.3), v-input-readonly-backgroundColor: rgba(255, 255, 255, 0.08),
v-input-disabled-backgroundColor: rgba(57, 64, 94, 0.3), v-input-disabled-backgroundColor:rgba(255, 255, 255, 0.08),
v-input-disabled-color: rgba(255, 255, 255, 0.2), v-input-disabled-color: rgba(255, 255, 255, 0.5),
v-select-label-color: #fff, v-select-label-color: rgba(255, 255, 255, 0.85),
v-calendar-weekday-backgroundColor: #383f5d, v-calendar-weekday-backgroundColor: #FFFFFF0A,
v-calendar-weekday-color: #fff, v-calendar-weekday-color: #FFFFFFD9,
v-calendar-weekday-border-color: rgba(255, 255, 255, 0.1), v-calendar-weekday-border-color: #FFFFFF0F,
v-calendar-day-color: #fff, v-calendar-day-color: #FFFFFFD9,
v-calendar-day-in-not-month-color: rgba(255, 255, 255, 0.05), v-calendar-day-in-not-month-color: #FFFFFF14,
v-calendar-is-today-background-color: #2d4571, v-calendar-is-today-background-color: #0A224F,
tui-grid-header-backgroundColor: #383f5d, v-calendar-is-sat: #263EA0,
tui-grid-border-horziontal-color: #383f5d, v-calendar-is-sun:#A61D24,
tui-grid-border-vertical-color: rgba(255, 255, 255, 0.1), tui-grid-title-color: #FFFFFFD9,
tui-grid-cell-backgroundColor: #242940, tui-grid-header-backgroundColor: #2a2b2d,
tui-grid-cell-color: #fff, tui-grid-header-color: #FFFFFFD9,
tui-grid-cell-insert-color: #13636c, tui-grid-border-horziontal-color: #212224,
tui-grid-cell-selected-color: #1a4e87, tui-grid-border-vertical-color: #FFFFFF0F,
tui-grid-cell-modify-color: #13636c, tui-grid-cell-backgroundColor: #212224,
tui-grid-cell-removed-color: #f6637b, tui-grid-cell-color: #FFFFFFD9,
tui-grid-cell-insert-color: #2B2111,
tui-grid-cell-selected-color: #0A224F,
tui-grid-cell-modify-color: #2B2111,
tui-grid-cell-removed-color: #2A1215,
tui-grid-cell-disabled-color: rgb(170, 170, 170), tui-grid-cell-disabled-color: rgb(170, 170, 170),
tui-grid-cell-hover-backgroundColor: #31375b, tui-grid-cell-hover-backgroundColor: #2d4571,
v-tabs-items-border-color: rgba(255, 255, 255, 0.7), v-tabs-items-border-color: #FFFFFF0F,
v-tabs-backgroundColor: rgba(57, 64, 94, 0.5), v-tabs-backgroundColor: rgba(57, 64, 94, 0.5),
v-tabs-active-backgroundColor: #242940, v-tabs-active-backgroundColor: transparent,
v-tabs-active-border-color: rgba(255, 255, 255, 0.7), v-tabs-active-border-color: rgba(255, 255, 255, 0.7),
v-dialog-card-text-color: #fff, v-dialog-card-text-color: #fff,
tui-datepicker-backgroundColor: #0d0f17, tui-datepicker-backgroundColor: #0d0f17,
@ -122,11 +127,68 @@ $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,
v-header-border: #424242,
v-chart-border: #424242,
v-sidebar-border: #303030,
ant-checkbox-bg: #212224,
ant-checkbox-border: #424242,
ant-btn-popup-bg: #212224,
ant-btn-popup-color: #FFFFFFD9,
ant-btn-popup-border: #424242,
paging-background: #212224,
paging-text: #FFFFFFD9,
icon-datepicker-color: #FFFFFF73,
ant-checkbox-disabled-bg: #FFFFFF14,
ant-checkbox-disabled-border: #424242,
), ),
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 +199,80 @@ $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-box: #FFFFFF,
v-banner-border-color: #ddd, v-banner-border-color: #ddd,
v-treeview-node-root-backgroundColor: #4777d9, v-treeview-node-root-backgroundColor: #FFFFFF,
v-treeview-node-root-label-color: #111, v-treeview-node-root-label-color: #000000E0,
v-treeview-node-root-label-active-color: #fff, v-treeview-node-root-label-active-color: #000000E0,
v-treeview-node-root-icon-color: #555, v-treeview-node-root-icon-color: #000000E0,
v-treeview-node-root-icon-active-color: #fff, v-treeview-node-root-icon-active-color: #000000E0,
v-treeview-node-subroot-backgroundColor: #e1e7f3, // v-treeview-node-subroot-backgroundColor: #00000005,
v-treeview-node-subroot-backgroundColor: transparent,
v-treeview-node-label-color: #555, v-treeview-node-label-color: #555,
v-treeview-node-label-active-color: #111, v-treeview-node-label-active-color: #002C8C,
v-treeview-node-label-children-color: #616885,
v-treeview-leaf-active-backgroundColor: #edf1f7, v-treeview-leaf-active-backgroundColor: #edf1f7,
v-treeview-leaf-active-color: #366dbe, v-treeview-leaf-active-color: #366dbe,
v-treeview-icon-color: #a4aac3, v-treeview-icon-color: #a4aac3,
v-treeview-icon-active-color: #616885, v-treeview-icon-active-color: #616885,
v-input-backgroundColor: #ffffff, v-input-backgroundColor: #ffffff,
v-input-fieldset-color: #b4b8c9, v-input-color: rgba(0, 0, 0, 0.25),
v-input-fieldset-hover-color: #b4b8c9, v-input-fieldset-color: #d9d9d9,
v-input-icon-color: #555, v-input-fieldset-hover-color: #1890ff,
v-input-readonly-border-color: #b4b8c9, v-input-icon-color: #d9d9d9,
v-input-readonly-backgroundColor: #f5f5f5, v-input-readonly-border-color: #424242,
v-input-disabled-backgroundColor: #eee, v-input-readonly-backgroundColor: rgba(0, 0, 0, 0.04),
v-input-disabled-color: #bbb, v-input-disabled-backgroundColor: rgba(0, 0, 0, 0.04),
v-select-label-color: #111, v-input-disabled-color: rgba(0, 0, 0, 0.25),
v-calendar-weekday-backgroundColor: #e0e0e0, v-select-label-color: rgba(0, 0, 0, 0.88),
v-calendar-weekday-color: #111, v-calendar-weekday-backgroundColor: #00000005,
v-calendar-weekday-border-color: #d4d4d4, v-calendar-weekday-color: #000000E0,
v-calendar-day-color: #111, v-calendar-weekday-border-color: #0000000F,
v-calendar-day-in-not-month-color: #f8f8f8, v-calendar-day-color: #000000E0,
v-calendar-is-today-background-color: #e3eaf3, v-calendar-day-in-not-month-color: #0000000A,
tui-grid-header-backgroundColor: #e0e0e0, v-calendar-is-today-background-color: #E6F4FF,
v-calendar-is-sat: #597EF7,
v-calendar-is-sun:#FF4D4F,
tui-grid-title-color: #000000E0,
tui-grid-header-backgroundColor: #fafafa, //#e0e0e0,
tui-grid-header-color: rgba(0, 0, 0, 0.88),
tui-grid-border-horziontal-color: #e0e0e0, tui-grid-border-horziontal-color: #e0e0e0,
tui-grid-border-vertical-color: #d4d4d4, tui-grid-border-vertical-color: rgba(0, 0, 0, 0.06), //#d4d4d4,
tui-grid-cell-backgroundColor: #fff, tui-grid-cell-backgroundColor: #fff,
tui-grid-cell-color: #555, tui-grid-cell-color: #000000E0,
tui-grid-cell-insert-color: #13636c, tui-grid-cell-insert-color: #FFFBE6,
tui-grid-cell-selected-color: #ecf2fa, tui-grid-cell-selected-color: #E6F4FF,
tui-grid-cell-modify-color: #e6f5f7, tui-grid-cell-modify-color: #FFFBE6,
tui-grid-cell-removed-color: #fddde1, tui-grid-cell-removed-color: #FFF1F0,
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 +280,62 @@ $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,
v-header-border: #D9D9D9,
v-chart-border: #D9D9D9,
v-sidebar-border: #F0F0F0,
ant-checkbox-bg: #FFFFFF,
ant-checkbox-border: #D9D9D9,
ant-btn-popup-bg: #FFFFFF,
ant-btn-popup-color: #000000E0,
ant-btn-popup-border: #D9D9D9,
paging-background: #FFFFFF,
paging-text: #000000E0,
icon-datepicker-color: #00000073,
ant-checkbox-disabled-bg: #0000000A,
ant-checkbox-disabled-border: #D9D9D9,
),
); );

BIN
assets/scss/var.zip Normal file

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,28 +2,21 @@
<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 :class="['mr-1', required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
>mdi-record-circle</v-icon
>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? textCols : ''"> <v-col :cols="label ? textCols : ''">
<v-checkbox <a-checkbox v-model="chkValue" :disabled="disabledFlag" :readonly="readonly || false"
v-model="chkValue" :required="required || false" @change="modifyValue">
:disabled="disabledFlag" </a-checkbox>
:readonly="readonly || false"
:required="required || false"
:false-value="false"
:color="isDarkMode ? '#fff' : '#4777d9'"
@change="modifyValue"
></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: {
@ -63,6 +56,11 @@ export default {
require: false, require: false,
default: 7, default: 7,
}, },
iconShow: {
type: Boolean,
require: false,
default: true
},
}, },
data() { data() {
return { return {
@ -74,7 +72,7 @@ export default {
computed: { computed: {
...mapState({ ...mapState({
searchParam: state => state.pageData, searchParam: (state) => state.pageData,
myBindingDara(state) { myBindingDara(state) {
return state.pageData[this.parentPrgmId][this.valueNm]; return state.pageData[this.parentPrgmId][this.valueNm];
}, },
@ -92,9 +90,10 @@ export default {
this.chkValue = this.searchParam[this.parentPrgmId][this.valueNm]; this.chkValue = this.searchParam[this.parentPrgmId][this.valueNm];
}, },
methods: { methods: {
...mapMutations({ setPageData: 'setPageData' }), ...mapMutations({ setPageData: "setPageData" }),
modifyValue(e) { modifyValue(e) {
return this.setPageData({ [this.valueNm]: e }); const isChecked = e.target.checked;
return this.setPageData({ [this.valueNm]: isChecked });
}, },
}, },
}; };

View File

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

View File

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

View File

@ -2,14 +2,14 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="labelCols">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small :color="required ? '#fb8200' : 'primary'" class="mr-1" <v-icon v-if="iconShow" small color="primary"
>mdi-record-circle</v-icon :class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
> >$icoBulletPoint</v-icon>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? textCols : ''"> <v-col :cols="label ? textCols : ''">
<div class="datepicker-container"> <div :class="['datepicker-container', customClass]" >
<v-text-field <v-text-field
id="startpicker" id="startpicker"
ref="startpicker" ref="startpicker"
@ -19,14 +19,19 @@
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 v-slot:append>
<a-icon v-show="!isRange" class="v-icon" type="calendar" style="width: 14px; height: 14px;" />
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="startpicker-container" id="startpicker-container"></div> <div ref="startpicker-container" id="startpicker-container"></div>
</template> </template>
</v-text-field> </v-text-field>
<div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }">~</div> <div v-if="isRange" class="mx-3" :style="{ lineHeight: 0 }">
<img :src="arrowIcon">
</div>
<v-text-field <v-text-field
v-show="isRange" v-show="isRange"
id="endpicker" id="endpicker"
@ -38,7 +43,9 @@
outlined outlined
> >
<template #append> <template #append>
<v-icon size="20">$icoCalendar</v-icon> <div class="pr-1">
<a-icon class="v-icon" type="calendar" style="width: 14px; height: 14px;" />
</div>
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="endpicker-container" id="endpicker-container"></div> <div ref="endpicker-container" id="endpicker-container"></div>
@ -70,23 +77,33 @@ export default {
labelCols: { labelCols: {
type: Number, type: Number,
require: false, require: false,
default: 4, default: 12,
}, },
textCols: { textCols: {
type: Number, type: Number,
require: false, require: false,
default: 8, default: 12,
}, },
required: { required: {
type: Boolean, type: Boolean,
require: false, require: false,
default: false, default: false,
}, },
iconShow: {
type: Boolean,
require: false,
default: true,
},
isRangeOption:{ isRangeOption:{
type:Boolean, type:Boolean,
require:false, require:false,
default: true default: true
} },
customClass: {
type: String,
require: false,
},
}, },
data() { data() {
return { return {
@ -103,6 +120,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 +212,12 @@ export default {
this.defaultRange === 'no limite' this.defaultRange === 'no limite'
); );
}, },
arrowIcon() {
if(this.isDarkMode){
return require('@/assets/images/SwapRight_Dark.svg');
}
return require('@/assets/images/SwapRight.svg');
}
}, },
watch: { watch: {
myCmCycle() { myCmCycle() {
@ -259,8 +283,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 +330,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 +431,8 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.datepicker-container { // @import "@/assets/scss/datepicker.scss";
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
.v-input {
.v-input__append-outer {
margin-top: 0;
margin-left: 0;
#startpicker-container,
#endpicker-container {
width: 100%;
position: absolute;
top: 36px;
left: 0;
}
}
}
}
.v-input__custom {
flex: 0 0 auto;
&.half {
width: calc(50% - 20px);
}
}
::v-deep { ::v-deep {
.tui-timepicker-row { .tui-timepicker-row {
display: flex; display: flex;

View File

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

View File

@ -2,43 +2,38 @@
<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>
<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" ref="startpicker" v-model="fromDtValue"
id="startpicker" :class="isRange ? 'v-input__custom half' : 'v-input__custom'" :hide-details="true" readonly
ref="startpicker" outlined>
v-model="fromDtValue" <template v-slot:append>
:class="isRange ? 'v-input__custom half' : 'v-input__custom'" <a-icon v-show="!isRange" class="v-icon" type="calendar" style="width: 14px; height: 14px;" />
:hide-details="true"
readonly
outlined
>
<template #append>
<v-icon size="20">$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> -->
<v-text-field <div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }">
v-show="isRange" <img :src="arrowIcon" alt="">
id="endpicker" </div>
ref="endpicker" <v-text-field v-show="isRange" id="endpicker" ref="endpicker" v-model="toDtValue"
v-model="toDtValue" :class="isRange ? 'v-input__custom half' : 'v-input__custom'" :hide-details="true" readonly
:class="isRange ? 'v-input__custom half' : 'v-input__custom'" outlined>
:hide-details="true"
readonly
outlined
>
<template #append> <template #append>
<v-icon size="20">$icoCalendar</v-icon> <div class="pr-1">
<a-icon class="v-icon" type="calendar" style="width: 14px; height: 14px;" />
</div>
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="endpicker-container" id="endpicker-container"></div> <div ref="endpicker-container" id="endpicker-container"></div>
@ -104,6 +99,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;
}, },
@ -173,7 +169,8 @@ export default {
toDt: Utility.setFormatDate( toDt: Utility.setFormatDate(
this.searchParam.toDt, this.searchParam.toDt,
this.myOptions.viewFormat, this.myOptions.viewFormat,
)}; )
};
}, },
fromDtChange() { fromDtChange() {
return { return {
@ -181,7 +178,8 @@ export default {
fromDt: Utility.setFormatDate( fromDt: Utility.setFormatDate(
this.searchParam.fromDt, this.searchParam.fromDt,
this.myOptions.viewFormat, this.myOptions.viewFormat,
)}; )
};
}, },
defaultRange() { defaultRange() {
return this.searchParam.defaultRange return this.searchParam.defaultRange
@ -194,6 +192,12 @@ export default {
this.defaultRange === 'no limite' this.defaultRange === 'no limite'
); );
}, },
arrowIcon() {
if (this.isDarkMode) {
return require('@/assets/images/SwapRight_Dark.svg');
}
return require('@/assets/images/SwapRight.svg');
}
}, },
watch: { watch: {
myCmCycle() { myCmCycle() {
@ -401,39 +405,14 @@ 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;
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;
} }

View File

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

View File

@ -4,12 +4,12 @@
:data="chkGridData" :data="chkGridData"
:columns="chkGridColumns" :columns="chkGridColumns"
:options="chkGridOptions" :options="chkGridOptions"
@focusChange="focusChangeEvt"
@click="startEditing" @click="startEditing"
@editingFinish="editingFinish" @editingFinish="editingFinish"
@dblclick="dblClick" @dblclick="dblClick"
@mouseover="mouseoverEvent" @mouseover="mouseoverEvent"
@mouseout="mouseoutEvent" @mouseout="mouseoutEvent"
@focusChange="focusChangeEvt"
/> />
</template> </template>
<script> <script>
@ -160,7 +160,6 @@ export default {
}, },
created() { }, created() { },
async mounted() { async mounted() {
// console.log(this.dataPath);
if (this.gridName) { if (this.gridName) {
this.gridInstance = this.$refs['tuigrid' + this.gridName]; this.gridInstance = this.$refs['tuigrid' + this.gridName];
@ -174,6 +173,10 @@ export default {
this.gridScrollTop = e.target.scrollTop; this.gridScrollTop = e.target.scrollTop;
this.gridScrollLeft = e.target.scrollLeft; this.gridScrollLeft = e.target.scrollLeft;
}); });
if (!(this.scrollBody.scrollHeight > this.scrollBody.clientHeight)) {
this.gridInstance.$el.getElementsByClassName('tui-grid-content-area')[0].classList.add('tui-grid-no-scroll-y');
}
} }
}, },
methods: { methods: {
@ -183,13 +186,13 @@ export default {
}), }),
// true : 현재 행 혹은 연결된 그리드가 수정중인 상태 // true : 현재 행 혹은 연결된 그리드가 수정중인 상태
checkGridState() { checkGridState() {
var rowStatList = ['I', 'U', 'D']; const rowStatList = ['I', 'U', 'D'];
var row = this.gridInstance.invoke('getFocusedCell'); const row = this.gridInstance.invoke('getFocusedCell');
if (row) { if (row) {
var rowData = this.gridInstance.invoke('getRow', row.rowKey); const rowData = this.gridInstance.invoke('getRow', row.rowKey);
if (rowData) { if (rowData) {
var rowStat = rowData['rowStat']; const rowStat = rowData['rowStat'];
if (rowStatList.includes(rowStat)) { if (rowStatList.includes(rowStat)) {
return true; return true;
} }
@ -197,8 +200,8 @@ export default {
} }
if (this.preventFocusChangeEventTargetGridList) { if (this.preventFocusChangeEventTargetGridList) {
for (var gridInstance of this.preventFocusChangeEventTargetGridList) { for (let gridInstance of this.preventFocusChangeEventTargetGridList) {
var dataArr = gridInstance.save(); const dataArr = gridInstance.save();
if (dataArr.length > 0) { if (dataArr.length > 0) {
return true; return true;
@ -268,14 +271,11 @@ export default {
}); });
}, },
focusChangeEvt(e) { focusChangeEvt(e) {
// console.log('focusChangeEvt1...')
if (this.preventFocusChangeEvent(e)) { if (this.preventFocusChangeEvent(e)) {
// console.log('prevent focusChangeEvt')
return; return;
} }
// console.log('focusChangeEvt2...')
// cell 선택시 row 선택 method // cell 선택시 row 선택 method
if (e.rowKey >= 0) { if (e.rowKey > -1) {
this.$emit( this.$emit(
'getRowsData', 'getRowsData',
this.gridInstance.invoke('getRow', e.rowKey), this.gridInstance.invoke('getRow', e.rowKey),
@ -288,9 +288,7 @@ export default {
this.sendSelectedRowData(e.rowKey); this.sendSelectedRowData(e.rowKey);
}, },
startEditing(e) { startEditing(e) {
// console.log('startEditing1...')
if (this.preventFocusChangeEvent(e)) { if (this.preventFocusChangeEvent(e)) {
// console.log('prevent startEditing')
return; return;
} }
@ -299,11 +297,9 @@ export default {
return; return;
} }
// console.log('startEditing2...')
if (this.editorGrid && e.rowKey >= 0) { if (this.editorGrid && e.rowKey >= 0) {
this.editorStartKey = e.rowKey; this.editorStartKey = e.rowKey;
// console.log("E::", this.gridInstance.invoke("getRow", e.rowKey)); this.gridInstance.invoke('startEditing', e.rowKey, e.columnName, 'row-modify');
this.gridInstance.invoke('startEditing', e.rowKey, e.columnName);
this.$emit( this.$emit(
'getRowsData', 'getRowsData',
this.gridInstance.invoke('getRow', e.rowKey), this.gridInstance.invoke('getRow', e.rowKey),
@ -314,7 +310,6 @@ export default {
} }
}, },
async editingFinish(e) { async editingFinish(e) {
// console.log("Editing END E::", e);
// editor 간 이동시 수정되는 문제 수정 // editor 간 이동시 수정되는 문제 수정
// e.rowEditingFg: grid의 한 row를 한번에 수정할 시 각각의 cell 마다 click 이벤트가 발생하지 않아 this.editorStartKey값이 제대로 입력 되지 않는 경우를 대비하여 만든 Fg // e.rowEditingFg: grid의 한 row를 한번에 수정할 시 각각의 cell 마다 click 이벤트가 발생하지 않아 this.editorStartKey값이 제대로 입력 되지 않는 경우를 대비하여 만든 Fg
if (this.editorGrid) { if (this.editorGrid) {
@ -337,7 +332,6 @@ export default {
rowKey: rowIdxKey, rowKey: rowIdxKey,
}; };
const isBaseRow = this.isBaseDataRow(rowIdxKey); const isBaseRow = this.isBaseDataRow(rowIdxKey);
// console.log("END E::", rowIdxKey, e);
const rowStat = this.gridInstance.invoke('getRow', rowIdxKey).rowStat; const rowStat = this.gridInstance.invoke('getRow', rowIdxKey).rowStat;
if (rowStat == 'D') { if (rowStat == 'D') {
this.gridInstance.invoke( this.gridInstance.invoke(
@ -518,10 +512,7 @@ export default {
return item.rowKey == data.rowKey; return item.rowKey == data.rowKey;
}); });
let count = 0; let count = 0;
// console.log("dataKeyArr", dataKeyArr);
// console.log("selectedRowData", selectedRowData);
for (let i = 0; i < dataKeyArr.length; i++) { for (let i = 0; i < dataKeyArr.length; i++) {
// console.log(dataKeyArr[i], selectedRowData[dataKeyArr[i]], rowData[dataKeyArr[i]]);
if (selectedRowData[dataKeyArr[i]] == rowData[dataKeyArr[i]]) { if (selectedRowData[dataKeyArr[i]] == rowData[dataKeyArr[i]]) {
count++; count++;
} }
@ -591,7 +582,6 @@ export default {
delete item.rowKey; delete item.rowKey;
return item; return item;
}); });
// console.log("dataArr::", dataArr, saveTargetRows);
return dataArr; return dataArr;
}, },
getData() { getData() {
@ -604,23 +594,20 @@ export default {
return this.gridInstance.invoke('getCheckedRowKeys'); return this.gridInstance.invoke('getCheckedRowKeys');
}, },
setCheck(list) { setCheck(list) {
// console.log("setCheck:: ", list);
list.map(item => this.gridInstance.invoke('check', item)); list.map(item => this.gridInstance.invoke('check', item));
}, },
refreshLayout() { refreshLayout() {
setTimeout(() => {
this.gridInstance.invoke('refreshLayout'); this.gridInstance.invoke('refreshLayout');
}, 150);
// this.gridInstance.invoke('refreshLayout');
}, },
refreshGrid() { refreshGrid() {
// console.log("refreshLayout",this.$refs['tuigrid' + this.gridName])
var store = this.$refs['tuigrid' + this.gridName].gridInstance.store; var store = this.$refs['tuigrid' + this.gridName].gridInstance.store;
var containerEl = this.$refs['tuigrid' + this.gridName].$el; var containerEl = this.$refs['tuigrid' + this.gridName].$el;
// var containerEl = document.querySelector('.tui-grid-container') // var containerEl = document.querySelector('.tui-grid-container')
var parentEl = containerEl.parentElement; var parentEl = containerEl.parentElement;
// console.log("containerEl : ",containerEl);
// console.log('parentEl : ', parentEl)
// function refreshLayout(store, containerEl, parentEl) { // function refreshLayout(store, containerEl, parentEl) {
var dimension = store.dimension; var dimension = store.dimension;
var autoWidth = dimension.autoWidth, fitToParentHeight = dimension.fitToParentHeight; var autoWidth = dimension.autoWidth, fitToParentHeight = dimension.fitToParentHeight;
@ -633,11 +620,6 @@ export default {
this.setWidth(store, clientWidth, autoWidth); this.setWidth(store, clientWidth, autoWidth);
// store.dimension.autoWidth = autoWidth; // store.dimension.autoWidth = autoWidth;
// store.dimension.width = clientWidth; // store.dimension.width = clientWidth;
// console.log("###",getComputedStyle(parentEl));
// console.log("fitToParentHeight : ",fitToParentHeight);
// console.log("parentEl : ",parentEl)
// console.log("parentEl.clientHeight" , parentEl.clientHeight)
// console.log("clientHeight : ",clientHeight);
if (parentEl && parentEl.clientHeight !== clientHeight) { if (parentEl && parentEl.clientHeight !== clientHeight) {
var _b = getComputedStyle(parentEl), paddingTop = _b.paddingTop, paddingBottom = _b.paddingBottom; var _b = getComputedStyle(parentEl), paddingTop = _b.paddingTop, paddingBottom = _b.paddingBottom;
this.setHeight(store, parentEl.clientHeight - (parseFloat(paddingTop) + parseFloat(paddingBottom))); this.setHeight(store, parentEl.clientHeight - (parseFloat(paddingTop) + parseFloat(paddingBottom)));
@ -645,25 +627,20 @@ export default {
// } // }
}, },
setOffsetTop(store, offsetTop) { setOffsetTop(store, offsetTop) {
// console.log("setOffsetTop");
store.dimension.offsetTop = offsetTop; store.dimension.offsetTop = offsetTop;
}, },
setWidth(_a, width, autoWidth) { setWidth(_a, width, autoWidth) {
// console.log("setWidth");
var dimension = _a.dimension; var dimension = _a.dimension;
dimension.autoWidth = autoWidth; dimension.autoWidth = autoWidth;
dimension.width = width; dimension.width = width;
}, },
setHeaderHeight(store, height) { setHeaderHeight(store, height) {
// console.log("setHeaderHeight")
store.dimension.headerHeight = height; store.dimension.headerHeight = height;
}, },
setOffsetLeft(store, offsetLeft) { setOffsetLeft(store, offsetLeft) {
// console.log("setOffsetLeft")
store.dimension.offsetLeft = offsetLeft; store.dimension.offsetLeft = offsetLeft;
}, },
setHeight(_a, height) { setHeight(_a, height) {
// 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;
dimension.bodyHeight = height - headerHeight - summaryHeight - tableBorderWidth; dimension.bodyHeight = height - headerHeight - summaryHeight - tableBorderWidth;
@ -692,12 +669,12 @@ export default {
}); });
}, },
// resetData() { // resetData() {
// // console.log("resetData = ", this.tuigridProps.data);
// this.$refs.tuigrid.invoke("resetData", this.tuigridProps.data); // this.$refs.tuigrid.invoke("resetData", this.tuigridProps.data);
// } // },
}, },
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
::v-deep .tui-grid-container { ::v-deep .tui-grid-container {
.tui-grid-content-area { .tui-grid-content-area {

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

@ -0,0 +1,93 @@
<template>
<div class="custom-pagination">
<a-pagination
:current="pageNum"
:total="totalCount"
:page-size="itemsPerPage"
:show-size-changer="useLimit"
:page-size-options="itemsPerPageArray.map(String)"
@change="handlePageChange"
@showSizeChange="changePageLeng"
/>
</div>
</template>
<script>
export default {
props: {
useLimit: {
type: Boolean,
default: true,
},
totalCount: {
type: Number,
default: 0,
},
pageNum: {
type: Number,
default: 0,
},
limit: {
type: Number,
default: 0,
},
itemsPerPageArray: {
type: Array,
default: () => [20, 50, 100],
},
},
data() {
return {
moveToPage: '',
};
},
computed: {
page: function() {
return this.numberOfPages + '-' + this.lastPage;
},
lastPage: function() {
//grid data가 없을 경우 1 리턴
if (this.totalCount == 0) return 1;
let pageLength = Math.floor(this.totalCount / this.itemsPerPage);
if (this.totalCount % this.itemsPerPage > 0) {
pageLength++;
}
return pageLength;
},
itemsPerPage: function() {
return this.limit;
},
numberOfPages: function() {
return Number(this.pageNum);
},
plusPage: function() {
return Number(this.pageNum) + 1;
},
minusPage: function() {
return Number(this.pageNum) - 1;
},
},
watch: {
totalCount: function(newData) {
return (this.moveToPage = newData > 0 ? this.moveToPage : '');
},
moveToPage: function() {
return (this.moveToPage = this.moveToPage.replaceAll(/[^0-9]/g, ''));
},
},
methods: {
handlePageChange(newPage) {
// Emit an event to the parent to load data for the selected page
this.$emit('loadData', newPage, this.itemsPerPage);
},
changePageLeng: function(current, newLimit) {
//부모 컴포넌트에서 loadData(데이터 조회) 구현
//this.$emit('loadData', this.pageNum, limit);
// limit 변경 시 1 페이지로 초기화
this.$emit('loadData', 1, newLimit);
},
},
};
</script>

View File

@ -2,41 +2,34 @@
<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>
<v-col :cols="label ? textCols : ''"> <v-col :cols="label ? textCols : ''">
<div class="datepicker-container"> <div :class="['datepicker-container', customClass]">
<v-text-field <v-text-field id="startpicker" ref="startpicker" v-model="fromDtValue"
id="startpicker" :class="isRange ? 'v-input__custom half' : 'v-input__custom'" :hide-details="true" readonly
ref="startpicker" outlined>
v-model="fromDtValue"
:class="isRange ? 'v-input__custom half' : 'v-input__custom'"
:hide-details="true"
readonly
outlined
>
<template #append> <template #append>
<v-icon size="20">$icoCalendar</v-icon> <a-icon class="v-icon" v-show="!isRange" type="calendar" style="width: 14px; height: 14px;" />
<!-- <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 }">
<v-text-field <img :src="arrowIcon" alt="">
v-show="isRange" </div>
id="endpicker" <v-text-field v-show="isRange" id="endpicker" ref="endpicker" v-model="toDtValue"
ref="endpicker" :class="isRange ? 'v-input__custom half' : 'v-input__custom'" :hide-details="true" readonly
v-model="toDtValue" outlined>
:class="isRange ? 'v-input__custom half' : 'v-input__custom'"
:hide-details="true"
readonly
outlined
>
<template #append> <template #append>
<v-icon size="20">$icoCalendar</v-icon> <div class="pr-1">
<a-icon class="v-icon" type="calendar" style="width: 14px; height: 14px;" />
</div>
</template> </template>
<template #append-outer> <template #append-outer>
<div ref="endpicker-container" id="endpicker-container"></div> <div ref="endpicker-container" id="endpicker-container"></div>
@ -75,6 +68,10 @@ export default {
require: false, require: false,
default: 8, default: 8,
}, },
customClass: {
type: String,
require: false,
},
}, },
data() { data() {
return { return {
@ -90,6 +87,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;
@ -129,6 +127,12 @@ export default {
this.defaultRange === 'no limite' this.defaultRange === 'no limite'
); );
}, },
arrowIcon() {
if (this.isDarkMode) {
return require('@/assets/images/SwapRight_Dark.svg');
}
return require('@/assets/images/SwapRight.svg');
}
}, },
watch: { watch: {
myCmCycle() { myCmCycle() {
@ -313,39 +317,14 @@ 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;
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;
} }

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';
@ -11,6 +13,7 @@ export default {
data() { data() {
return { return {
mode: null, mode: null,
// isLoading: false
}; };
}, },
computed: { computed: {
@ -26,6 +29,8 @@ export default {
setThemeChange: 'setThemeChange', setThemeChange: 'setThemeChange',
}), }),
themeChange() { themeChange() {
// this.isLoading = true;
this.mode = !this.mode;
this.$vuetify.theme.isDark = this.mode; this.$vuetify.theme.isDark = this.mode;
this.setThemeChange(this.mode); this.setThemeChange(this.mode);
}, },
@ -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,17 +1,11 @@
<template> <template>
<div class="d-flex flex-column justify-center align-center"> <div class="d-flex justify-center align-center"
<v-btn icon tile :ripple="false" @click="btnActionsFnc('addLeftToRight')"> :class="directionBtn === 'vertically'?'flex-row':'flex-column'"
<v-icon>mdi-chevron-right</v-icon> style="gap: 12px">
</v-btn> <a-button @click="directionBtn === 'vertically' ? btnActionsFnc('removeRightToLeft') : btnActionsFnc('addLeftToRight')" type="primary" ghost :icon="directionBtn === 'vertically'? icons.remove :icons.add " class="custom-action-btn">
<v-btn </a-button>
icon <a-button @click="directionBtn === 'vertically' ? btnActionsFnc('removeRightToLeft') :btnActionsFnc('removeRightToLeft')" type="primary" ghost :icon="directionBtn === 'vertically'? icons.add :icons.remove" class="custom-action-btn">
tile </a-button>
:ripple="false"
class="mt-2"
@click="btnActionsFnc('removeRightToLeft')"
>
<v-icon>mdi-chevron-left</v-icon>
</v-btn>
</div> </div>
</template> </template>
<script> <script>
@ -33,8 +27,18 @@ export default {
type: Function, type: Function,
required: true, required: true,
}, },
directionBtn: {
type: String,
default: "horizontally" //horizontally, vertically.
}
},
computed: {
icons() {
return this.directionBtn === "vertically"
? { remove: "up", add: "down" }
: { remove: "left", add: "right" };
},
}, },
computed: {},
data() { data() {
return {}; return {};
}, },

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, default, large
}
}, },
data() { data() {
return { return {
@ -134,3 +148,5 @@ export default {
}, },
}; };
</script> </script>
<style scoped lang="scss">
</style>

View File

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

View File

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

View File

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

View File

@ -1,10 +1,18 @@
<template> <template>
<v-btn :ripple="false" @click="getSearch('prev')">조회</v-btn> <a-button icon="search" type="primary" @click="getSearch('prev')" class="search-button" :size="size">조회</a-button>
</template> </template>
<script> <script>
import { mapMutations } from 'vuex'; import { mapMutations } from 'vuex';
export default { export default {
props: {
size: {
type: String,
require: false,
default: "default", // small, default, 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,142 @@
// Gauge chart options
export default function getGaugeChartOption({ title, min = 0, max = 160, unit = '%', isDarkMode = false, backgroundRadius = 97 }) {
const colorRanges = isDarkMode
? [
[60 / 160, '#49AA19'], // Dark Green
[100 / 160, '#D89614'], // Dark Orange
[1, '#D32029'], // Dark Red
]
: [
[60 / 160, '#52C41A'], // Light Green
[100 / 160, '#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,
splitNumber: 8,
// 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,82 @@
export default function getLineChartOption({
xAxisData = [],
seriesData = [],
// legendData = [],
isDarkMode = false,
}) {
// const defaultColors = isDarkMode
// ? ['#D32029', '#31B47B', '#D89614'] : ['#F5222D', '#31B47B', '#FAAD14'];
const defaultColors = isDarkMode
? ['#31B47B', '#D89614', '#D32029'] : ['#31B47B', '#FAAD14', '#F5222D'];
const styledSeries = seriesData.map((item, index) => {
const color = item.color || defaultColors[index % defaultColors.length];
return {
...item,
showSymbol: true, // Show symbol at each data point
itemStyle: {
color,
},
};
});
return {
grid: {
left: '3%',
right: '5%',
top: '25%',
bottom: '0%',
containLabel: true,
},
legend: {
// data: legendData,
icon: 'circle',
itemWidth: 15, // Width of the legend icon
itemHeight: 15,
top: '0%',
right: '5%',
orient: 'horizontal',
textStyle: {
color: isDarkMode ? 'white' : '#676A7B',
},
},
xAxis: {
type: 'category',
boundaryGap: false,
splitLine: {
show: false,
},
data: xAxisData,
axisLine: {
lineStyle: {
color: isDarkMode ? '#AAAAAA' : '#333333',
},
},
axisLabel: {
color: isDarkMode ? '#676A7B' : '#676A7B',
},
},
yAxis: {
type: 'value',
position: 'left',
axisLine: {
lineStyle: {
color: isDarkMode ? '#AAAAAA' : '#333333',
},
},
axisLabel: {
color: isDarkMode ? '#676A7B' : '#676A7B',
},
splitLine: {
lineStyle: {
type: 'dashed', // Options: 'solid', 'dashed', 'dotted'
color: isDarkMode ? '#444444' : '#EEEEEE',
},
},
},
series: styledSeries,
};
}

View File

@ -0,0 +1,46 @@
// Sankey chart options
export function getSankeyChartOption({ isDarkMode = false, data = [], links = [] }) {
const chartOption = {
backgroundColor: '#FFFFFF',
series: [
{
data,
links,
layoutIterations: 0,
type: 'sankey',
left: 25.0,
top: 20.0,
right: 120,
bottom: 50.0,
nodeGap: 10,
nodeAlign: 'left',
lineStyle: {
color: 'source',
curveness: 0.5,
},
// nodeWidth:10,
// triggerEvent: true,
itemStyle: {
//color: '#1f77b4',
//borderColor: '#1f77b4'
},
label: {
color: isDarkMode
? '#FFFFFFD9'
: '#000000E0',
// fontFamily: 'Arial',
fontSize: 14,
},
},
],
tooltip: {
trigger: 'item',
},
};
return chartOption;
}
export default getSankeyChartOption;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,35 +1,33 @@
<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" :menu-props="{ top: false, offsetY: true }"
class="v-select__custom" >
:disabled="item.disabled || false"
:readonly="item.readonly || false" <template v-slot:append>
:required="item.required || false" <!-- Custom SVG icon -->
@change="modifyValue($event, item.valueNm)" <v-icon>$icoChevronDown</v-icon>
></v-select>
</template>
</v-select>
</v-col> </v-col>
</v-row> </v-row>
</template> </template>
@ -60,6 +58,7 @@ export default {
computed: { computed: {
...mapState({ ...mapState({
myListData(state) { myListData(state) {
try{
let list = [...state.pageData[this.parentPrgmId][this.item.list]]; let list = [...state.pageData[this.parentPrgmId][this.item.list]];
list.forEach((item, idx) => { list.forEach((item, idx) => {
if (item.commCdNm && item.commCdNm == '전체') { if (item.commCdNm && item.commCdNm == '전체') {
@ -75,6 +74,9 @@ export default {
} }
}); });
return list; return list;
}catch(err) {
return [];
}
}, },
myBindingData(state) { myBindingData(state) {
if (!this.bindingData) { if (!this.bindingData) {

View File

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

View File

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

View File

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

View File

@ -1,14 +1,15 @@
<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 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>
</label> </label>
<!-- <label for="" class="search-box-label ft-size_14 ft-clr_g-c"> <!-- <label for="" class="search-box-label ft-size_14 ft-clr_g-c">
{{ item.label }} {{ item.label }}
@ -28,27 +29,30 @@
></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>
<v-dialog v-model="dialog" scrollable width="540px"> <v-dialog v-model="dialog" scrollable width="504px">
<v-card style="height: 100%"> <v-card style="height: 100%">
<v-card-title> <v-card-title class="px-4">
<span class="custom-title-4">비밀번호 {{ isPassword }}</span> <span class="custom-title-4" style="padding-left: 1px;">비밀번호 {{ isPassword }}</span>
</v-card-title> </v-card-title>
<v-divider></v-divider> <v-card-text class="pb-4 px-3">
<v-card-text>
<v-col> <v-col>
<label for="" class="search-box-label"> <label for="" class="search-box-label">
{{ isPassword }} 비밀번호를 입력하세요 {{ isPassword }} 비밀번호를 입력하세요
</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"
@ -69,11 +73,17 @@
></v-text-field> ></v-text-field>
</v-col> </v-col>
</v-card-text> </v-card-text>
<v-divider></v-divider> <v-card-actions class="pb-4">
<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 class="d-flex" style="gap: 8px">
<a-button @click="close()" class="ant-btn-popup-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 +145,10 @@ export default {
} else { } else {
return ''; return '';
} }
console.log(value)
}, },
set(value) { set(value) {
console.log(value)
return value; return value;
}, },
}, },

View File

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

View File

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

View File

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

View File

@ -1,8 +1,8 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<!-- <v-col v-if="label" cols="2"> --> <!-- <v-col v-if="label" cols="2"> -->
<v-col v-if="label" :cols="labelCols"> <v-col v-if="label" :cols="item.labelCols">
<label for="" class="search-box-label"> <!-- <label for="" class="search-box-label">
<v-icon <v-icon
x-small x-small
:color="item.required ? '#fb8200' : 'primary'" :color="item.required ? '#fb8200' : 'primary'"
@ -10,22 +10,31 @@
>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 : ''" class="py-0">
<!-- <v-col :cols="label ? 9 : ''"> --> <!-- <v-col :cols="label ? 9 : ''"> -->
<!-- :value="textfield" --> <!-- :value="textfield" -->
<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="dialog = !dialog" @click="dialog = !dialog"
outlined outlined
:hide-details="true" :hide-details="true"
:disabled="item.disabled || false" :disabled="item.disabled || false"
:required="item.required || false" :required="item.required || false"
></v-text-field> >
<template v-slot:append>
<!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon>
</template>
</v-text-field>
</v-col> </v-col>
<!-- <v-row justify="center"> --> <!-- <v-row justify="center"> -->
@ -53,7 +62,7 @@
<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="label ? 3 : ''"> <v-col :cols="label ? 3 : ''" class="pr-3" >
<component <component
:is="'selectCodeList'" :is="'selectCodeList'"
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
@ -61,41 +70,66 @@
dataKey="searchElecContKind" dataKey="searchElecContKind"
:sendParam="{ commGrpCd: 'EM_CONT', useFg: '1' }" :sendParam="{ commGrpCd: 'EM_CONT', useFg: '1' }"
:addAll="true" :addAll="true"
:customClass="'select-large'"
/> />
</v-col> </v-col>
<v-col :cols="label ? 3 : ''"> <v-col :cols="label ? 3 : ''" class="pr-3" >
<component <component
:is="'selectCodeList'" :is="'selectCodeList'"
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
:label="'전압구분'" :label="'전압구분'"
dataKey="searchVoltKind" dataKey="searchVoltKind"
:sendParam="{ commGrpCd: 'EM_VOLT_KIND', useFg: '1' }" :sendParam="{ commGrpCd: 'EM_VOLT_KIND', useFg: '1' }"
:customClass="'select-large'"
:addAll="true" :addAll="true"
/> />
</v-col> </v-col>
<v-col :cols="label ? 3 : ''"> <v-col :cols="label ? 3 : ''" class="pr-3" >
<component <component
:is="'selectCodeList'" :is="'selectCodeList'"
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
:label="'전압구분'" :label="'전압구분'"
dataKey="searchOptKind" dataKey="searchOptKind"
:sendParam="{ commGrpCd: 'EM_VOLT_OPT', useFg: '1' }" :sendParam="{ commGrpCd: 'EM_VOLT_OPT', useFg: '1' }"
:customClass="'select-large'"
:addAll="true" :addAll="true"
/> />
</v-col> </v-col>
<v-col cols="3" class="text-right"> <v-col cols="3" class="text-right">
<v-btn <div style="height: 25px"></div>
<!-- <v-btn
v-if="!searchParam.isMulti" v-if="!searchParam.isMulti"
:ripple="false" :ripple="false"
@click="search()" @click="search()"
>검색</v-btn >검색</v-btn
> -->
<a-button
v-if="!searchParam.isMulti"
type="primary"
class="mr-1"
icon="search"
:ripple="false"
@click="search"
style="height: 40px"
> >
<v-btn 검색
</a-button>
<!-- <v-btn
v-if="!searchParam.isMulti" v-if="!searchParam.isMulti"
:ripple="false" :ripple="false"
@click="initVal()" @click="initVal()"
>초기화</v-btn >초기화</v-btn
> -->
<a-button
v-if="!searchParam.isMulti"
type="primary"
class="mr-1"
:ripple="false"
@click="initVal"
style="height: 40px"
> >
초기화
</a-button>
</v-col> </v-col>
</v-row> </v-row>
</div> </div>
@ -305,7 +339,11 @@ export default {
}, },
// 공정/설비 트리 그리드 세팅 // 공정/설비 트리 그리드 세팅
gridInit() { gridInit() {
const myOptions = {}; const myOptions = {
header: {
height: 38,
},
};
this.setModalGridOption({ this.setModalGridOption({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.gridName, gridKey: this.gridName,
@ -601,11 +639,11 @@ const myColumns = [
{ header: '전력계약 ID', name: 'eleclContId', hidden: true}, { header: '전력계약 ID', name: 'eleclContId', hidden: true},
{ header: '전력계약 명', name: 'eleclContNm', hidden: true}, { header: '전력계약 명', name: 'eleclContNm', hidden: true},
{ header: '전력계약구분CD', name: 'elecContKind', hidden: true}, { header: '전력계약구분CD', name: 'elecContKind', hidden: true},
{ header: '전력계약구분', name: 'elecContKindNm', align: 'center'}, { header: '전력계약구분', name: 'elecContKindNm', align: 'left'},
{ header: '전압구분CD', name: 'voltKind', hidden: true }, { header: '전압구분CD', name: 'voltKind', hidden: true },
{ header: '전압구분', name: 'voltKindNm', align: 'center' }, { header: '전압구분', name: 'voltKindNm', align: 'left' },
{ header: '옵션CD', name: 'optKind', hidden: true }, { header: '옵션CD', name: 'optKind', hidden: true },
{ header: '옵션', name: 'optKindNm', align: 'center' }, { header: '옵션', name: 'optKindNm', align: 'left' },
{ {
header: '기본요금(원/kW)', header: '기본요금(원/kW)',
name: 'baseChrg', name: 'baseChrg',
@ -615,7 +653,7 @@ const myColumns = [
}, },
}, },
{ header: '시간대CD', name: 'peakKind', hidden: true }, { header: '시간대CD', name: 'peakKind', hidden: true },
{ header: '시간대', name: 'peakKindNm', align: 'center' }, { header: '시간대', name: 'peakKindNm', align: 'left' },
{ {
header: '여름철(6~8월)', header: '여름철(6~8월)',
name: 'unitPrcSum', name: 'unitPrcSum',
@ -644,8 +682,7 @@ const myColumns = [
// 전력량 요금(원/kWh) // 전력량 요금(원/kWh)
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
// @import '@/assets/scss/common.scss';
@import '@/assets/scss/var.scss'; @import '@/assets/scss/var.scss';
@each $theme in dark, light { @each $theme in dark, light {
.v-application.#{$theme}-mode { .v-application.#{$theme}-mode {

View File

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

View File

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

View File

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

View File

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

View File

@ -9,10 +9,15 @@
scrollable scrollable
> >
<v-card style="height: 100%"> <v-card style="height: 100%">
<v-card-title class="pa-5 pb-0 d-flex align-center justify-space-between">
<span class="custom-title-4">사용량 계획</span>
<v-icon @click="closePop()">mdi-close</v-icon>
</v-card-title>
<div class="pa-5"> <div class="pa-5">
<!-- <v-text-field label="위치정보 선택"></v-text-field> --> <!-- <v-text-field label="위치정보 선택"></v-text-field> -->
<v-row align="center" no-gutters> <v-row align="center" no-gutters>
<v-col :cols="4"> <v-col :cols="4.5">
<InputText <InputText
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
:label="'설비명'" :label="'설비명'"
@ -20,28 +25,52 @@
: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"
customClass="select-large"
/>
</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"
customClass="select-large"
/>
</v-col> </v-col>
<a-button class="ant-btn-popup-default" color="primary" dark @click="search()" icon="check-circle" size="large">
<!-- <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)'">
<div class="d-flex align-center justify-space-between pa-4" style="height: 10%">
<v-card-title class="pa-0 custom-title-4">사용량 계획</v-card-title>
</div>
<!-- <div id="chartParent" ref="chartParent" :style="'height: 80%'"> --> <!-- <div id="chartParent" ref="chartParent" :style="'height: 80%'"> -->
<div id="chartParent" ref="chartParent" style="height: 70%"> <div id="chartParent" ref="chartParent" style="height: 100%" class="px-6">
<component <component
class="w100 h100" class="w100 h100 py-7 custom-chart"
:is="loadChart ? 'Chart' : null" :is="loadChart ? 'Chart' : null"
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
:modalId="modalId" :modalId="modalId"
@ -50,37 +79,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 +97,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 +113,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">
@ -131,10 +129,9 @@
/> />
</div> --> </div> -->
<v-divider></v-divider> <v-card-actions class="pa-5 d-flex align-center justify-end">
<v-card-actions class="pa-5 d-flex align-center justify-center"> <a-button color="primary" class="mr-2 ant-btn-popup-default" dark @click="closePop()">취소</a-button>
<v-btn color="primary" dark @click="setUpdate()">확정</v-btn> <a-button color="primary" type="primary" dark @click="setUpdate()">확정</a-button>
<v-btn color="primary" dark @click="closePop()">취소</v-btn>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -196,7 +193,7 @@ export default {
selectCodeList, selectCodeList,
InputText, InputText,
Chart, Chart,
SelectBox SelectBox,
// Tree // Tree
}, },
data() { data() {
@ -318,6 +315,9 @@ export default {
// }); // });
// } // }
}, },
mounted(){
// this.initTest(); return;
},
methods: { methods: {
...mapMutations({ ...mapMutations({
setPageData: 'setPageData', setPageData: 'setPageData',
@ -329,6 +329,7 @@ export default {
...mapActions({ ...mapActions({
postApiReturn: 'modules/list/postApiReturn', postApiReturn: 'modules/list/postApiReturn',
}), }),
init() { init() {
this.setChart(); this.setChart();
}, },
@ -406,6 +407,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 = [];
@ -462,7 +531,7 @@ export default {
seriesData = data.map(item => ({ seriesData = data.map(item => ({
name: item.gubun == '2PLAN' ? '계획' : '전년실적', name: item.gubun == '2PLAN' ? '계획' : '전년실적',
type: item.gubun == '2PLAN' ? 'line' : 'bar', type: item.gubun == '2PLAN' ? 'line' : 'bar',
data: targetMonthList.map(obj => item[obj] || null) data: targetMonthList.map(obj => item[obj] || null),
// data: targetMonthList.map(obj => item[obj] || 0) // data: targetMonthList.map(obj => item[obj] || 0)
})); }));
this.nowSeriesData = seriesData; this.nowSeriesData = seriesData;
@ -487,7 +556,6 @@ export default {
series: seriesData, series: seriesData,
tooltip: tooltipData tooltip: tooltipData
}; };
// console.log('option', option);
await this.$nextTick(() => { await this.$nextTick(() => {
}); });
@ -530,7 +598,6 @@ export default {
sData2 = nowSeriesData.filter(item => { sData2 = nowSeriesData.filter(item => {
return item.name == '계획'; return item.name == '계획';
})[0]['data']; })[0]['data'];
// console.log('sData1', sData);
if(targetMonth.includes('qty')){ if(targetMonth.includes('qty')){
targetMonth = parseInt(targetMonth.slice(-2)); targetMonth = parseInt(targetMonth.slice(-2));
} }
@ -539,13 +606,11 @@ export default {
sData2[i] = sData[i] * targetRatio; sData2[i] = sData[i] * targetRatio;
} }
} }
// console.log('sData2', sData2);
seriesData = nowSeriesData.map(item => ({ seriesData = nowSeriesData.map(item => ({
...item, ...item,
data: item.name == '계획' ? sData2 : item.data data: item.name == '계획' ? sData2 : item.data
})); }));
// console.log('seriesData', seriesData);
await this.$nextTick(() => { await this.$nextTick(() => {
}); });

View File

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

View File

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

View File

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

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

View File

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

View File

@ -1,52 +1,50 @@
<template> <template>
<v-row class="search-box " align="center" no-gutters > <v-row class="search-box " align="center" no-gutters >
<v-col :cols="option.labelCols"> <v-col :cols="option.labelCols" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon
x-small v-if="iconShow"
small
:color="item.required ? '#fb8200' : 'primary'" :color="item.required ? '#fb8200' : 'primary'"
class="mr-1" :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>mdi-record-circle</v-icon >$icoBulletPoint</v-icon
> >
{{ option.labelContent }} {{ option.labelContent }}
</label> </label>
</v-col> </v-col>
<v-col :cols="option.textCols"> <v-col :cols="option.textCols">
<!-- append-icon="mdi-magnify" -->
<v-text-field <v-text-field
readonly readonly
v-model="selectValue" v-model="selectValue"
append-icon="mdi-magnify"
class="v-input__custom" class="v-input__custom"
@click="dialogOpenCloseEvent(dialog)" @click="dialogOpenCloseEvent(dialog)"
outlined outlined
:hide-details="true" :hide-details="true"
></v-text-field> >
<!-- Custom SVG icon -->
<template v-slot:append>
<v-icon>$icoSearch</v-icon>
</template>
</v-text-field>
</v-col> </v-col>
<v-dialog v-model="dialog" scrollable width="700px"> <v-dialog v-model="dialog" scrollable width="700px">
<v-card style="height: 100%"> <v-card style="height: 100%">
<v-card-title class="pa-5 d-flex align-center justify-space-between"> <v-card-title class="px-6 py-4 d-flex align-center justify-space-between">
<span class="custom-title-4">{{ option.modalTitle }}</span> <span class="custom-title-4">{{ option.modalTitle }}</span>
<v-btn <a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
icon
tile
:ripple="false"
@click="dialogOpenCloseEvent(dialog)"
>
<v-icon>mdi-close</v-icon>
</v-btn>
</v-card-title> </v-card-title>
<div class="pa-5"> <div class="pa-5">
<v-row align="center" no-gutters> <v-row align="center" no-gutters>
<v-col :cols="3"> <v-col :cols="12">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon x-small color="primary" class="mr-1" <!-- <v-icon x-small color="primary" class="mr-1">mdi-record-circle</v-icon> -->
>mdi-record-circle</v-icon <v-icon small :class="['mr-1 icon-blue']">$icoBulletPoint</v-icon>
>
검색 검색
</label> </label>
</v-col> </v-col>
<v-col :cols="5"> <v-col :cols="9">
<v-text-field <v-text-field
append-icon="mdi-magnify" append-icon="mdi-magnify"
class="v-input__custom" class="v-input__custom"
@ -57,21 +55,19 @@
></v-text-field> ></v-text-field>
</v-col> </v-col>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-col cols="4" class="text-right"> <v-col :cols="3" class="text-right">
<v-btn :ripple="false" @click="search()"> <a-button type="primary" @click="search()" icon="search">
조회 조회
</v-btn> </a-button>
<v-btn :ripple="false" @click="initSearch()"> <a-button @click="initSearch()">
초기화 초기화
</v-btn> </a-button>
</v-col> </v-col>
</v-row> </v-row>
</div> </div>
<v-divider></v-divider> <!-- <v-divider></v-divider> -->
<!-- <div :style="'height: calc(65vh)'"> --> <div style="height: 429px;" class="py-3 px-5">
<div :style="'height: 429px;'"> <div ref="modalGridParent" class="h100 w100">
<!-- <div :style="{ height: 'calc(100% - 213px)' }"> -->
<div ref="modalGridParent" class="h100 w100 py-3">
<component <component
:is="loadGrid && dialog ? 'Grid' : null" :is="loadGrid && dialog ? 'Grid' : null"
:gridName="grid_01" :gridName="grid_01"
@ -82,11 +78,9 @@
/> />
</div> </div>
</div> </div>
<v-card-actions class="pa-5 d-flex align-center justify-center"> <v-card-actions class="pa-5 d-flex align-center justify-end">
<v-btn :ripple="false" @click="setUpdate($event)">확인</v-btn> <a-button class="mr-2" @click="dialogOpenCloseEvent(dialog)">닫기</a-button>
<v-btn :ripple="false" @click="dialogOpenCloseEvent(dialog)" <a-button type="primary" @click="setUpdate($event)">확인</a-button>
>닫기</v-btn
>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -137,6 +131,11 @@ export default {
type: String, type: String,
require: false, require: false,
}, },
iconShow: {
type: Boolean,
require: false,
default: true
},
}, },
components: { components: {
Grid, Grid,
@ -146,7 +145,7 @@ export default {
return { return {
dialog: false, dialog: false,
loadGrid: false, loadGrid: true,
grid_01: 'grid_01', grid_01: 'grid_01',
myModalKey: 'FtnPlcFormPop', myModalKey: 'FtnPlcFormPop',
modalDataKey: 'modalData3', modalDataKey: 'modalData3',
@ -281,7 +280,17 @@ export default {
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.grid_01, gridKey: this.grid_01,
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
value: [{ header: '위치정보', name: 'eccNm' }], value: [
{
align: 'center',
width: 30,
minWidth: 60,
formatter: (props) => {
return `<span class="custom-radio"><span class="radio-mark"></span></span>`;
}
},
{ header: '위치정보', name: 'eccNm' }
],
}); });
}, },
async getGridData() { async getGridData() {
@ -363,7 +372,31 @@ var FtnPlcFormPop = {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
// @each $theme in dark, light {
// @include theme($theme);
// .v-application.#{$theme}-mode {
// .v-input--is-readonly {
// border-color: map-deep-get($config,
// #{$theme},
// "v-input-readonly-border-color"
// );
// ::v-deep {
// &:not(.v-input--radio-group, .v-input--checkbox) {
// .v-input__slot {
// background-color: map-deep-get($config,
// #{$theme},
// "v-input-backgroundColor"
// ) !important;
// }
// }
// }
// }
// }
// }
::v-deep { ::v-deep {
.v-dialog { .v-dialog {
overflow-y: hidden !important; overflow-y: hidden !important;
} }
@ -386,26 +419,4 @@ var FtnPlcFormPop = {
} }
} }
@each $theme in dark, light {
.v-application.#{$theme}-mode {
.v-dialog {
.v-card {
&__title {
color: map-deep-get($color, 'white', '0');
@if $theme == dark {
background-color: #2d3355;
.v-btn {
background-color: #2d3355;
}
} @else {
background-color: #3f4d7d;
.v-btn {
background-color: #3f4d7d;
}
}
}
}
}
}
}
</style> </style>

View File

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

View File

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

View File

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

View File

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

View File

@ -1,86 +1,60 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" 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="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,13 +264,24 @@ export default {
gridKey: this.gridNameTree, gridKey: this.gridNameTree,
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
value: [ value: [
{
header: '',
name: '',
align: 'center',
width: 20,
formatter: (props) => {
return `<label class="custom-radio">
<span class="radio-mark"></span>
</label>`;
}
},
{ {
header: '검침개소명', header: '검침개소명',
name: 'readPlcNm', name: 'readPlcNm',
width: 370, width: 500,
align: 'left', align: 'left',
}, },
{ header: '검침개소', name: 'name', align: 'center' }, { header: '검침개소', name: 'name', align: 'left', width: 200 },
], ],
}); });
}, },
@ -340,9 +307,16 @@ export default {
// console.log("treeData", res) // console.log("treeData", res)
let myOptionsTree = { let myOptionsTree = {
columnOptions: {
resizable: true,
},
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 +355,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 +496,9 @@ const selectReadObjListTree = {
} }
} }
.tui-grid-cell.tui-grid-cell-has-tree .tui-grid-cell.tui-grid-cell-has-tree .tui-grid-tree-extra-content+.tui-grid-cell-content:before {
.tui-grid-tree-extra-content
+ .tui-grid-cell-content:before {
content: none !important; content: none !important;
} }
} }
@each $theme in dark, light {
.v-application.#{$theme}-mode {
.v-dialog {
.v-card {
&__title {
color: map-deep-get($color, 'white', '0');
@if $theme == dark {
background-color: #2d3355;
.v-btn {
background-color: #2d3355;
}
} @else {
background-color: #3f4d7d;
.v-btn {
background-color: #3f4d7d;
}
}
}
}
}
}
}
</style> </style>

View File

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

View File

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

View File

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

View File

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

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