Compare commits

...

187 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
c3d01c998c update screen 2, 8, 9, 10, 27, 33, 34 2025-07-28 16:12:24 +07:00
136 changed files with 6254 additions and 8430 deletions

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

View File

@ -9,11 +9,13 @@
@import "./common/card.scss"; @import "./common/card.scss";
@import "./common/tabs.scss"; @import "./common/tabs.scss";
@import "./common/numericInput.scss"; @import "./common/numericInput.scss";
@import "./common/pagination.scss";
@import "./common/editor.scss";
html, html,
body { body {
overflow: auto; // overflow: auto;
} }
a { a {
@ -119,217 +121,13 @@ a {
.v-main, .v-main,
.v-main__wrap, .v-main__wrap,
.container { .container {
height: 100%; // height: 100%;
} }
.v-main__wrap>.container { .v-main__wrap>.container {
background: #383f5d; background: #383f5d;
} }
// 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 {
min-height: calc(100% - 72px);
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;
}
}
// v-navigation-drawer (sidebar)
.v-navigation-drawer {
box-shadow: none; // 0 0 10px 0 rgba(0, 0, 0, 0.15);
&--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;
}
&>.v-treeview-node__root:hover:before {
opacity: 1 !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: 1 !important;
}
}
.v-treeview-node[aria-expanded="true"] {
&>.v-treeview-node__root>.v-treeview-node__content>.v-treeview-node__label>button>.v-icon.mdi-chevron-down {
transform: rotate(-180deg);
}
}
.v-treeview-node__label {
&>button {
width: 100%;
display: flex;
align-items: center;
// justify-content: center;
}
& .v-icon.mdi-chevron-down {
margin-left: auto;
}
}
}
.v-treeview-node--active {
&:before {
opacity: 1 !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 {
display: none;
}
.v-navigation-drawer__append {
display: none;
}
}
}
.chart { .chart {
height: 100%; height: 100%;
@ -433,12 +231,47 @@ a {
.v-application.#{$theme}-mode { .v-application.#{$theme}-mode {
min-width: 1000px; min-width: 1000px;
.head-logo{ .ant-checkbox-wrapper.ant-checkbox-wraBapper-disabled,
gap: 8px; .ant-checkbox-disabled .ant-checkbox-input
{
cursor: default !important;
} }
.v-navigation-drawer { .ant-checkbox-disabled .ant-checkbox-inner
background: map-deep-get($config, #{$theme}, "menu-bg-color"); {
background-color: map-deep-get($config, #{$theme}, "ant-checkbox-disabled-bg") !important;
border: map-deep-get($config, #{$theme}, "ant-checkbox-disabled-border") !important;
}
.v-list-item__title {
font-family: var(--desktop-normal-font-family, "Inter-Regular", sans-serif) !important;
}
.btn-close-menu-list {
min-width: 100px;
border-color: transparent;
background-color: map-deep-get($config, #{$theme}, "btn-header-select-bg") !important;
.v-list-item {
min-height: 30px;
}
.v-list-item__title {
color: map-deep-get($config, #{$theme}, "btn-header-select-color") !important;
&:hover {
color: #46c0ff !important;
cursor: pointer;
}
}
}
.icon-datepicker-color {
color: map-deep-get($config, #{$theme}, "icon-datepicker-color");
}
.head-logo {
gap: 8px;
} }
.v-window__container { .v-window__container {
@ -451,42 +284,16 @@ a {
} }
} }
::-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;
}
.search-box-label { .search-box-label {
color: map-deep-get($config, #{$theme}, "v-select-label-color"); color: map-deep-get($config, #{$theme}, "v-select-label-color");
} }
.header { .custom-chart{
background-color: map-deep-get($config, #{$theme}, "header-backgroud"); border: 1px solid map-deep-get($config, #{$theme}, "v-chart-border");
border-color: #D3D6EA;
}
.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");
} }
.v-icon { .v-icon {
color: currentColor;
&.icon-orange { &.icon-orange {
svg { svg {
fill:map-deep-get($config, fill:map-deep-get($config,
@ -507,7 +314,6 @@ a {
} }
&.custom-chevron-down { &.custom-chevron-down {
fill:map-deep-get($config, fill:map-deep-get($config,
@ -529,8 +335,6 @@ a {
} }
} }
.router-tab { .router-tab {
.router-tab__header { .router-tab__header {
background-color: map-deep-get($config, #{$theme}, "router-header"); background-color: map-deep-get($config, #{$theme}, "router-header");
@ -599,48 +403,6 @@ a {
} }
} }
// .v-banner {
// &__wrapper {
// border-bottom-color: map-deep-get($config,
// #{$theme},
// "v-banner-border-color"
// ) !important;
// }
// }
.v-navigation-drawer__append {
>p {
@if $theme ==dark {
color: rgba(255, 255, 255, 0.6);
}
@else {
color: #999;
}
}
}
.v-footer {
@if $theme ==light {
background-color: #dfdfe5;
color: #767d83;
}
}
.bd {
@if $theme ==dark {
&-r-1 {
border-right: 1px #373f45 solid;
}
}
@else {
&-r-1 {
border-right: 1px #efefef solid;
}
}
}
.border-bottom-1 { .border-bottom-1 {
border-bottom: 1px solid map-deep-get($config, #{$theme}, "border-color"); border-bottom: 1px solid map-deep-get($config, #{$theme}, "border-color");
} }
@ -677,269 +439,6 @@ a {
height: 282px; height: 282px;
} }
.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 {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-label-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-icon-color"
);
}
}
&:hover {
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-label-active-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-icon-active-color"
);
}
}
}
}
&>.v-treeview-node__children {
&>.v-treeview-node {
&>.v-treeview-node__root {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-node-subroot-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-icon-color"
);
}
}
&:not(.v-treeview-node--active):hover {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-color"
);
}
}
}
}
&>.v-treeview-node__children {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-subchildren-backgroundColor"
);
}
&>.v-treeview-node--active {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-node-subroot-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-active-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-icon-active-color"
);
}
}
}
&>.v-treeview-node__children {
& .v-treeview-node {
&>.v-treeview-node__root {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-node-subroot-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-icon-color"
);
}
}
&:not(.v-treeview-node--active):hover {
&:before {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-backgroundColor"
);
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-leaf-active-color"
);
}
}
}
}
&>.v-treeview-node--active {
background-color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-active-bg"
);
border: 1px solid map-deep-get($config,
#{$theme},
"v-treeview-node-label-active-border"
);
border-radius: 8px;
&:before {
opacity: 0 !important;
}
&>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-active-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-active-color"
);
}
}
}
}
}
&[aria-expanded="true"] {
& .v-treeview-node__root>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-label-children-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-icon-active-color"
);
}
}
}
}
}
&[aria-expanded="true"] {
& .v-treeview-node__root>.v-treeview-node__content {
.v-treeview-node__label {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-label-active-color"
);
}
.v-icon {
color: map-deep-get($config,
#{$theme},
"v-treeview-node-root-icon-active-color"
);
}
}
}
}
}
.vc-weeks { .vc-weeks {
>.vc-weekday { >.vc-weekday {
background-color: map-deep-get($config, background-color: map-deep-get($config,
@ -947,15 +446,24 @@ a {
"v-calendar-weekday-backgroundColor" "v-calendar-weekday-backgroundColor"
); );
border-right: 1px solid map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color"); border-right: 1px solid map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color");
border-bottom: 1px solid map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color");
border-top: 1px solid map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color");
color: map-deep-get($config, #{$theme}, "v-calendar-weekday-color"); color: map-deep-get($config, #{$theme}, "v-calendar-weekday-color");
&:nth-of-type(1) { &:nth-of-type(1) {
color: map-deep-get($color, "week", "sun"); // color: map-deep-get($config,
// #{$theme},
// "v-calendar-is-sun"
// );
border-left: 1px solid map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color");
} }
&:nth-of-type(7) { // &:nth-of-type(7) {
color: map-deep-get($color, "week", "sat"); // color: map-deep-get($config,
} // #{$theme},
// "v-calendar-is-sat"
// );
// }
} }
>.vc-day { >.vc-day {
@ -964,22 +472,33 @@ a {
.day-hldyNm, .day-hldyNm,
.day-label.is-holiday { .day-label.is-holiday {
color: map-deep-get($color, "week", "sun"); color: map-deep-get($config,
#{$theme},
"v-calendar-is-sun"
);
} }
&.weekday-1 { &.weekday-1 {
.day-label, .day-label,
.day-hldyNm { .day-hldyNm {
color: map-deep-get($color, "week", "sun"); color: map-deep-get($config,
#{$theme},
"v-calendar-is-sun"
);
} }
border-left: 1px solid map-deep-get($config, #{$theme}, "v-calendar-weekday-border-color");
} }
&.weekday-7 { &.weekday-7 {
.day-label, .day-label,
.day-hldyNm { .day-hldyNm {
color: map-deep-get($color, "week", "sat"); color: map-deep-get($config,
#{$theme},
"v-calendar-is-sat"
);
} }
} }
@ -1003,7 +522,7 @@ a {
); );
.day-label { .day-label {
color: map-deep-get($config, #{$theme}, "non-activate"); color: map-deep-get($config, #{$theme}, "card-text-title-color");
} }
} }
} }
@ -1086,6 +605,7 @@ a {
& th, & th,
& td { & td {
height: 48px; height: 48px;
color: map-deep-get($config, #{$theme}, "tui-datepicker-calendar-color");
} }
} }
@ -1181,11 +701,17 @@ a {
} }
th.tui-sun { th.tui-sun {
color: map-deep-get($color, "week", "sun"); color: map-deep-get($config,
#{$theme},
"v-calendar-is-sun"
);
} }
th.tui-sat { th.tui-sat {
color: map-deep-get($color, "week", "sat"); color: map-deep-get($config,
#{$theme},
"v-calendar-is-sat"
);
} }
} }
@ -1201,11 +727,17 @@ a {
} }
td.tui-calendar-sun { td.tui-calendar-sun {
color: map-deep-get($color, "week", "sun"); color: map-deep-get($config,
#{$theme},
"v-calendar-is-sun"
);
} }
td.tui-calendar-sat { td.tui-calendar-sat {
color: map-deep-get($color, "week", "sat"); color: map-deep-get($config,
#{$theme},
"v-calendar-is-sat"
);
} }
} }
} }
@ -1253,19 +785,40 @@ a {
); );
border: 1px solid map-deep-get($config, #{$theme}, "tui-datepicker-border-color"); border: 1px solid map-deep-get($config, #{$theme}, "tui-datepicker-border-color");
border-radius: 4px; border-radius: 4px;
padding: 4px;
&-item--active { &-item--active {
border-radius: 4px;
&:before { &:before {
opacity: 0; opacity: 0;
} }
.v-list-item__title { .v-list-item__title {
color: map-deep-get($config, color: map-deep-get($config, #{$theme}, "tui-datepicker-calendar-color");
#{$theme},
"tui-datepicker-calendar-color"
);
} }
} }
&.v-select-list{
>.v-list-item {
margin-bottom: 4px;
.anticon {
&.anticon-check {
display: none;
}
}
&[aria-selected="true"] {
border-radius: 8px;
background-color: map-deep-get($config, #{$theme}, "v-treeview-node-label-active-bg");
.anticon {
&.anticon-check {
display: block;
color: map-deep-get($config, #{$theme}, "v-icon-blue");
}
}
}
}
}
} }
.theme--white { .theme--white {
@ -1276,20 +829,21 @@ a {
} }
} }
.toastui-editor-contents { // .toastui-editor-contents {
* { // * {
color: map-deep-get($config, // color: map-deep-get($config,
#{$theme}, // #{$theme},
"tui-editor-contents-color" // "tui-editor-contents-color"
) !important; // ) !important;
} // }
} // }
.lnb-logo { .lnb-logo {
color: map-deep-get($config, #{$theme}, "v-dialog-card-text-color"); color: map-deep-get($config, #{$theme}, "v-dialog-card-text-color");
font-size: 2rem; font-size: 2rem;
font-weight: bold; font-weight: bold;
padding-left: 8px; padding-left: 8px;
margin-top: 2px;
img { img {
width: 139px; width: 139px;
@ -1306,19 +860,11 @@ a {
.btn-close-menu-list { .btn-close-menu-list {
min-width: 100px; min-width: 100px;
border-color: transparent; border-color: transparent;
background-color: map-deep-get($config, #{$theme}, "btn-header-select-bg") !important;
.v-list-item { .v-list-item {
min-height: 30px; min-height: 30px;
} }
.v-list-item__title {
color: map-deep-get($config, #{$theme}, "btn-header-select-color");
&:hover {
color: #46c0ff;
}
}
.v-btn { .v-btn {
background-color: transparent !important; background-color: transparent !important;
color: map-deep-get($config, #{$theme}, "btn-header-select-color") !important; color: map-deep-get($config, #{$theme}, "btn-header-select-color") !important;
@ -1383,11 +929,6 @@ a {
} }
} }
} }

View File

@ -66,6 +66,12 @@
} }
} }
.custom-action-btn{
height: 24px;
width: 24px;
font-size: 12px;
}
.v-btn { .v-btn {
background-color: map-deep-get($config, background-color: map-deep-get($config,
#{$theme}, #{$theme},
@ -101,8 +107,7 @@
.v-dialog { .v-dialog {
.ant-btn-icon-only { .ant-btn-icon-only {
color: map-deep-get( color: map-deep-get($config,
$config,
#{$theme}, #{$theme},
"icon-color" "icon-color"
); );
@ -121,6 +126,10 @@
background: map-deep-get($config, #{$theme}, "ant-btn-primary-bg"); background: map-deep-get($config, #{$theme}, "ant-btn-primary-bg");
border-color: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"); 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 { &.ant-btn-default {
@ -128,6 +137,12 @@
color:map-deep-get($config, #{$theme}, "ant-btn-default-color"); 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-danger {
&.ant-btn-background-ghost { &.ant-btn-background-ghost {
color:map-deep-get($config, #{$theme}, "ant-btn-danger-color"); color:map-deep-get($config, #{$theme}, "ant-btn-danger-color");
@ -135,6 +150,16 @@
background: map-deep-get($config, #{$theme}, "ant-btn-danger-bg") !important; 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");
}
}
}
} }
} }
} }
@ -142,9 +167,11 @@
.v-application { .v-application {
.ant-btn { .ant-btn {
border-radius: 6px; border-radius: 6px;
&.ant-btn-lg { &.ant-btn-lg {
border-radius: 8px; border-radius: 8px;
} }
&.ant-btn-default { &.ant-btn-default {
border: none !important border: none !important
} }
@ -162,3 +189,13 @@
background: none; background: none;
} }
} }
.ant-btn {
&.expand-btn {
span {
&.v-icon {
margin-right: 8px;
}
}
}
}

View File

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

View File

@ -17,27 +17,24 @@
border: 0 !important; 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;
} }
&-no-scroll-y {
.tui-grid-rside-area {
.tui-grid-header-area,
.tui-grid-summary-area {
margin-right: 0 !important;
}
}
}
&-rside-area { &-rside-area {
.tui-grid-header-area, .tui-grid-header-area,
.tui-grid-summary-area { .tui-grid-summary-area {
margin-right: $scrollbar-width; margin-right: $scrollbar-width !important;
} }
} }
@ -68,13 +65,84 @@
font-weight: 400; font-weight: 400;
} }
th[data-column-name="_checked"] {
padding-left: 0;
}
} }
.tui-grid-table { .tui-grid-table {
.tui-grid-cell-header, .tui-grid-cell-header,
.tui-grid-cell-has-input .tui-grid-cell-content { .tui-grid-cell-has-input .tui-grid-cell-content {
padding: 8px; 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 {
@ -98,6 +166,50 @@
@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 {
&-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 { .grid-title {
font-weight: 600; font-weight: 600;
font-size: 16px; font-size: 16px;
@ -109,6 +221,15 @@
); );
} }
.grid-toggle-section {
.tui-grid-rside-area {
.tui-grid-body-area {
height: auto !important;
}
}
}
.tui-grid { .tui-grid {
&-table { &-table {
border: 1px solid; border: 1px solid;
@ -126,6 +247,35 @@
#{$theme}, #{$theme},
"tui-grid-cell-borderStyle-darkmode" "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"
);
}
}
}
} }
} }
@ -134,46 +284,37 @@
} }
&-body-container { &-body-container {
border-right: 1px solid; border-right: 0;
border-right-color: map-deep-get($config, // position: relative;
#{$theme},
"tui-grid-cell-borderColor"
);
width: auto !important; width: auto !important;
.tui-grid-table-container {
// width: 100% !important;
.tui-grid-table {
// width: 100% !important;
// table-layout: fixed;
// th, td {
// &:last-child{
// width: auto !important;
// }
// }
}
} }
&-container, .tui-grid-layer-editing {
&-summary-area { border-color: map-deep-get($config,
#{$theme},
"tui-grid-border-vertical-color"
);
}
}
&-summary-area,
&-container {
font-family: Inter; font-family: Inter;
// color: #000000E0;
& ::-webkit-scrollbar {
width: $scrollbar-width !important;
height: $scrollbar-width !important;
-webkit-appearance: initial;
background-color: map-deep-get($config,
#{$theme},
"scrollbar-track"
) !important;
border-radius: 3px !important;
}
& ::-webkit-scrollbar-track {
background-color: map-deep-get($config,
#{$theme},
"scrollbar-track"
) !important;
}
& ::-webkit-scrollbar-thumb {
width: 50px !important;
height: 50px !important;
background-color: map-deep-get($config, #{$theme}, "scrollbar-thumb");
border-radius: 3px;
}
.tui-grid-cell { .tui-grid-cell {
&.tui-grid-cell-summary { &.tui-grid-cell-summary {
color: map-deep-get($config, color: map-deep-get($config,
#{$theme}, #{$theme},
@ -183,6 +324,32 @@
} }
} }
&-body-area {
overflow: auto;
&::-webkit-scrollbar {
width: $scrollbar-width !important;
height: $scrollbar-width !important;
-webkit-appearance: initial;
background-color: rgba(0, 0, 0, 0) !important;
border-radius: 3px !important;
// border-right: 1px solid;
// border-right-color: map-deep-get($config, #{$theme}, "tui-grid-cell-borderColor");
}
&::-webkit-scrollbar-track {
background-color: rgba(0, 0, 0, 0) !important;
}
&::-webkit-scrollbar-thumb {
height: 50px !important;
background-color: map-deep-get($config, #{$theme}, "scrollbar-thumb");
border-radius: 3px;
// width: 50px !important;
// background-color: rgba(0, 0, 0, 0);
}
}
&-rside-area { &-rside-area {
background-color: map-deep-get($config, #{$theme}, "scrollbar-track"); background-color: map-deep-get($config, #{$theme}, "scrollbar-track");
} }
@ -195,6 +362,7 @@
&-scrollbar-right-top { &-scrollbar-right-top {
background-color: rgba(0, 0, 0, 0); background-color: rgba(0, 0, 0, 0);
border: none; border: none;
display: none;
// background-color: map-deep-get( // background-color: map-deep-get(
// $config, // $config,
// #{$theme}, // #{$theme},
@ -220,13 +388,14 @@
&-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,
@ -236,13 +405,9 @@
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($config, background-color: map-deep-get($config,
@ -254,26 +419,78 @@
"tui-grid-border-vertical-color" "tui-grid-border-vertical-color"
); );
&-current-row{ // &-current-row{
td { // }
td.row-selected {
.custom-radio { .custom-radio {
background-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-color"
);
.radio-mark { .radio-mark {
border-color: #1677ff; border-color: map-deep-get($config,
background-color: #fff; #{$theme},
"arow-line-color"
);
background-color: map-deep-get($config,
#{$theme},
"arow-line-btn-bg-color"
);
&::after { &::after {
content: ""; content: "";
position: absolute; position: absolute;
top: 50%; top: 50%;
left: 50%; left: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
height: 11px; height: 8px;
width: 11px; width: 8px;
border-radius: 50%; border-radius: 50%;
background-color: #1677ff; 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"
);
}
}
} }
} }
@ -285,13 +502,13 @@
#{$theme}, #{$theme},
"tui-grid-cell-borderColor" "tui-grid-cell-borderColor"
); );
.tui-grid-cell-content { // .tui-grid-cell-content {
border-right: 1px solid ; // border-right: 1px solid ;
border-right-color: map-deep-get($config, // border-right-color: map-deep-get($config,
#{$theme}, // #{$theme},
"tui-grid-cell-borderColor" // "tui-grid-cell-borderColor"
); // );
} // }
} }
} }
@ -302,8 +519,8 @@
&-header-area, &-header-area,
&-cell-header { &-cell-header {
// font-family: inherit; // font-family: inherit;
// font-style: Semi Bold;
font-weight: 600; font-weight: 600;
font-style: Semi Bold;
background-color: map-deep-get($config, background-color: map-deep-get($config,
#{$theme}, #{$theme},
"tui-grid-header-backgroundColor" "tui-grid-header-backgroundColor"
@ -320,8 +537,17 @@
} }
&-header-area { &-header-area {
background-color: none; // background-color: none;
border: 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,
@ -350,14 +576,14 @@
background-color: map-deep-get($config, background-color: map-deep-get($config,
#{$theme}, #{$theme},
"tui-grid-cell-insert-color" "tui-grid-cell-insert-color"
); ) !important;
} }
&.row-modify { &.row-modify {
background-color: map-deep-get($config, background-color: map-deep-get($config,
#{$theme}, #{$theme},
"tui-grid-cell-modify-color" "tui-grid-cell-modify-color"
); ) !important;
} }
&.row-removed { &.row-removed {
@ -451,6 +677,8 @@
} }
&-tree-button-expand { &-tree-button-expand {
z-index: 9999;
.tui-grid-btn-tree { .tui-grid-btn-tree {
i { i {
width: 16px; width: 16px;
@ -469,6 +697,8 @@
} }
&-tree-button-collapse { &-tree-button-collapse {
z-index: 9999;
.tui-grid-btn-tree { .tui-grid-btn-tree {
i { i {
width: 16px; width: 16px;
@ -496,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

@ -50,6 +50,7 @@
} }
} }
.v-input__custom { .v-input__custom {
.v-input__slot { .v-input__slot {
@ -149,6 +150,11 @@
.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 {
@ -171,25 +177,27 @@
align-items: center; align-items: center;
cursor: pointer; cursor: pointer;
position: relative; position: relative;
padding-left: 28px; padding-left: 0;
margin: 10px; margin: 5px;
font-size: 16px; font-size: 16px;
} }
.custom-radio input[type="radio"] { .custom-radio input[type="radio"] {
position: absolute; position: absolute;
opacity: 0; opacity: 0;
cursor: pointer; cursor: pointer;
} }
/* Custom radio appearance */ /* Custom radio appearance */
.radio-mark { .radio-mark {
position: absolute; position: absolute;
left: 0; left: -8px;
top: 50%; top: 50%;
transform: translateY(-50%); transform: translateY(-50%);
height: 18px; height: 14px;
width: 18px; width: 14px;
background-color: white; // background-color: white;
border: 2px solid #ccc; border: 1px solid #ccc;
border-radius: 50%; border-radius: 50%;
transition: all 0.2s ease; transition: all 0.2s ease;
} }
@ -222,11 +230,43 @@
color: #424242 !important; 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-popup__custom {
.v-input__slot { .v-input__slot {
padding-left: 12px; padding-left: 12px;
@ -244,6 +284,7 @@
#{$theme}, #{$theme},
"v-input-textarea-border" "v-input-textarea-border"
); );
fieldset { fieldset {
background-color: map-deep-get($config, background-color: map-deep-get($config,
#{$theme}, #{$theme},
@ -263,9 +304,6 @@
"v-input-backgroundColor" "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($config, background-color: map-deep-get($config,
@ -372,6 +410,24 @@
} }
} }
} }
.radio-mark {
background-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-color"
);
border-color: map-deep-get($config,
#{$theme},
"v-input-textarea-border"
);
}
input[type="checkbox"] {
accent-color: map-deep-get($config,
#{$theme},
"ant-btn-primary-bg"
);
}
} }
.v-radio { .v-radio {
@ -396,6 +452,12 @@
.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);
} }
@ -406,6 +468,9 @@
} }
} }
.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

@ -63,6 +63,12 @@
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;
@ -76,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 {
@ -113,6 +119,14 @@
color: map-deep-get($config, #{$theme}, "h1-title"); 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 { .v-dialog {
.custom-title-4 { .custom-title-4 {
font-size: 16px !important; font-size: 16px !important;

View File

@ -14,10 +14,21 @@
position: relative; position: relative;
border-radius: 6px; border-radius: 6px;
border: solid 1px; border: solid 1px;
height: 40px; height: 32px;
// border-color: #424242; color: map-deep-get($config, #{$theme}, "v-input-fieldset-color") !important;
border-color: map-deep-get($config, #{$theme}, "tui-datepicker-border-color"); 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 {
@ -55,6 +66,10 @@
} }
} }
} }
.v-icon {
color: map-deep-get($config, #{$theme}, "v-icon-chevron-down") !important;
}
} }
.v-input__custom { .v-input__custom {

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

@ -32,8 +32,8 @@ $color: (
"black": ("0": #000, "black": ("0": #000,
"1": #111), "1": #111),
"white": ("0": #fff), "white": ("0": #fff),
"week": ("sun": #fb5a83, "week": ("sun": #FF4D4F,
"sat": #2d8cf6) "sat": #597EF7)
); );
$config: ( $config: (
@ -96,23 +96,25 @@ $config: (
v-input-disabled-backgroundColor:rgba(255, 255, 255, 0.08), v-input-disabled-backgroundColor:rgba(255, 255, 255, 0.08),
v-input-disabled-color: rgba(255, 255, 255, 0.5), v-input-disabled-color: rgba(255, 255, 255, 0.5),
v-select-label-color: rgba(255, 255, 255, 0.85), 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,
v-calendar-is-sat: #263EA0,
v-calendar-is-sun:#A61D24,
tui-grid-title-color: #FFFFFFD9, tui-grid-title-color: #FFFFFFD9,
tui-grid-header-backgroundColor: #2a2b2d, tui-grid-header-backgroundColor: #2a2b2d,
tui-grid-header-color: #FFFFFFD9, tui-grid-header-color: #FFFFFFD9,
tui-grid-border-horziontal-color: #212224, tui-grid-border-horziontal-color: #212224,
tui-grid-border-vertical-color: #212224, tui-grid-border-vertical-color: #FFFFFF0F,
tui-grid-cell-backgroundColor: #212224, tui-grid-cell-backgroundColor: #212224,
tui-grid-cell-color: #fff, tui-grid-cell-color: #FFFFFFD9,
tui-grid-cell-insert-color: #13636c, tui-grid-cell-insert-color: #2B2111,
tui-grid-cell-selected-color: #0A224F, tui-grid-cell-selected-color: #0A224F,
tui-grid-cell-modify-color: #13636c, tui-grid-cell-modify-color: #2B2111,
tui-grid-cell-removed-color: #f6637b, 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: #2d4571, tui-grid-cell-hover-backgroundColor: #2d4571,
v-tabs-items-border-color: #FFFFFF0F, v-tabs-items-border-color: #FFFFFF0F,
@ -171,6 +173,20 @@ $config: (
ant-btn-default-border-outlined:#424242, ant-btn-default-border-outlined:#424242,
btn-header-select-bg: #1F1F1F, btn-header-select-bg: #1F1F1F,
btn-header-select-color:#FFFFFFD9, 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: (w-g5: $--color-gray_555, light: (w-g5: $--color-gray_555,
g5-w: $--color-white, g5-w: $--color-white,
@ -206,7 +222,6 @@ $config: (
router-tab-item-hover-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: #1677ff, v-btn-backgroundColor: #1677ff,
// v-btn-backgroundColor: #fff,
v-box: #FFFFFF, v-box: #FFFFFF,
v-banner-border-color: #ddd, v-banner-border-color: #ddd,
v-treeview-node-root-backgroundColor: #FFFFFF, v-treeview-node-root-backgroundColor: #FFFFFF,
@ -233,12 +248,14 @@ $config: (
v-input-disabled-backgroundColor: rgba(0, 0, 0, 0.04), v-input-disabled-backgroundColor: rgba(0, 0, 0, 0.04),
v-input-disabled-color: rgba(0, 0, 0, 0.25), v-input-disabled-color: rgba(0, 0, 0, 0.25),
v-select-label-color: rgba(0, 0, 0, 0.88), v-select-label-color: rgba(0, 0, 0, 0.88),
v-calendar-weekday-backgroundColor: #e0e0e0, v-calendar-weekday-backgroundColor: #00000005,
v-calendar-weekday-color: #111, v-calendar-weekday-color: #000000E0,
v-calendar-weekday-border-color: #d4d4d4, v-calendar-weekday-border-color: #0000000F,
v-calendar-day-color: #111, v-calendar-day-color: #000000E0,
v-calendar-day-in-not-month-color: #f8f8f8, v-calendar-day-in-not-month-color: #0000000A,
v-calendar-is-today-background-color: #e3eaf3, v-calendar-is-today-background-color: #E6F4FF,
v-calendar-is-sat: #597EF7,
v-calendar-is-sun:#FF4D4F,
tui-grid-title-color: #000000E0, tui-grid-title-color: #000000E0,
tui-grid-header-backgroundColor: #fafafa, //#e0e0e0, tui-grid-header-backgroundColor: #fafafa, //#e0e0e0,
tui-grid-header-color: rgba(0, 0, 0, 0.88), tui-grid-header-color: rgba(0, 0, 0, 0.88),
@ -246,10 +263,10 @@ $config: (
tui-grid-border-vertical-color: rgba(0, 0, 0, 0.06), //#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: #000000E0, tui-grid-cell-color: #000000E0,
tui-grid-cell-insert-color: #13636c, tui-grid-cell-insert-color: #FFFBE6,
tui-grid-cell-selected-color: #E6F4FF, tui-grid-cell-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: #0000000F, v-tabs-items-border-color: #0000000F,
v-tabs-backgroundColor: #ddd, v-tabs-backgroundColor: #ddd,
@ -306,5 +323,19 @@ $config: (
ant-btn-default-border-outlined:#D9D9D9, ant-btn-default-border-outlined:#D9D9D9,
btn-header-select-color:#1F1F1F, btn-header-select-color:#1F1F1F,
btn-header-select-bg:#FFFFFF, 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,
), ),
); );

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,11 +157,10 @@ export default {
month: month, month: month,
day: day day: day
} }
// BEGIN TEST UI
// this.$refs['planPop'].blocId = this.pageData.blocMstrList[ this.$refs['planPop'].blocId = this.pageData.blocMstrList[
// this.pageData.blocId this.pageData.blocId
// ].blocId; ].blocId;
// END TEST UI
this.$refs['planPop'].dialog = true; this.$refs['planPop'].dialog = true;
}, },
updatePlan(val) { updatePlan(val) {
@ -196,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;
@ -233,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;
@ -241,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;
@ -258,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;
@ -277,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;
@ -287,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;
@ -297,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;
@ -308,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;
@ -318,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;
@ -328,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

@ -61,7 +61,8 @@ export default {
isDarkMode: 'isDarkMode', isDarkMode: 'isDarkMode',
chartOption(state) { chartOption(state) {
var dark_Col = [ var dark_Col = [
'#01AE6A', '#79B100',
// '#01AE6A',
'#FFB046', '#FFB046',
'#F6637B', '#F6637B',
'#944FE9', '#944FE9',
@ -194,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',
@ -351,25 +353,25 @@ export default {
tmpChrtOp.color = light_Col; tmpChrtOp.color = light_Col;
} }
} }
console.log('ops11:',tmpChrtOp) // console.log('ops11:',tmpChrtOp)
return tmpChrtOp; return tmpChrtOp;
}, },
}), }),
}, },
created() { created() {
console.log('wd data:',this.widgetData) // 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,26 +2,15 @@
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :cols="labelCols" > <v-col v-if="label" :cols="labelCols" >
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon <v-icon v-if="iconShow" small :class="['mr-1', required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
v-if="iconShow"
small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon
>
{{ label }} {{ label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? textCols : ''"> <v-col :cols="label ? textCols : ''">
<a-checkbox v-model="chkValue" :disabled="disabledFlag" :readonly="readonly || false"
:required="required || false" @change="modifyValue">
</a-checkbox>
<v-checkbox
v-model="chkValue"
:disabled="disabledFlag"
:readonly="readonly || false"
:required="required || false"
:false-value="false"
:color="isDarkMode ? '#fff' : '#1890ff'"
@change="modifyValue"
></v-checkbox>
</v-col> </v-col>
</v-row> </v-row>
</template> </template>
@ -103,7 +92,8 @@ export default {
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

@ -9,7 +9,7 @@
</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,18 +19,21 @@
readonly readonly
outlined outlined
> >
<template #append > <!-- <template #append >
<v-icon size="20" v-show="!isRange">$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-if="isRange" class="mx-3" :style="{ lineHeight: 0 }"> <div v-if="isRange" class="mx-3" :style="{ lineHeight: 0 }">
<img :src="arrowIcon" alt=""> <img :src="arrowIcon">
</div> </div>
<v-text-field <v-text-field
v-if="isRange" v-show="isRange"
id="endpicker" id="endpicker"
ref="endpicker" ref="endpicker"
v-model="toDtValue" v-model="toDtValue"
@ -40,16 +43,15 @@
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>
</template> </template>
</v-text-field> </v-text-field>
</div> </div>
<!-- test -->
<!-- <a-button @click="onOpenDatepicker()">Open</a-button> -->
<!-- end test -->
</v-col> </v-col>
</v-row> </v-row>
</template> </template>
@ -96,7 +98,12 @@ export default {
type:Boolean, type:Boolean,
require:false, require:false,
default: true default: true
} },
customClass: {
type: String,
require: false,
},
}, },
data() { data() {
return { return {
@ -207,9 +214,9 @@ export default {
}, },
arrowIcon() { arrowIcon() {
if(this.isDarkMode){ if(this.isDarkMode){
return require('@/assets/images/arrow_datepicker_dm.png'); return require('@/assets/images/SwapRight_Dark.svg');
} }
return require('@/assets/images/arrow_datepicker.png'); return require('@/assets/images/SwapRight.svg');
} }
}, },
watch: { watch: {
@ -424,7 +431,7 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/assets/scss/datepicker.scss"; // @import "@/assets/scss/datepicker.scss";
::v-deep { ::v-deep {
.tui-timepicker-row { .tui-timepicker-row {

View File

@ -52,6 +52,7 @@
selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1 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> -->
@ -99,6 +100,7 @@
selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1 selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1
" "
@update:propsValue="selectTimeValue2 = $event" @update:propsValue="selectTimeValue2 = $event"
customClass="select-large"
/> />
</div> </div>
</v-col> </v-col>

View File

@ -5,10 +5,7 @@
<!-- <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 <v-icon small :class="['mr-1', required ? 'icon-orange' : 'icon-blue']">
small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']"
>
$icoBulletPoint $icoBulletPoint
</v-icon> </v-icon>
{{ label }} {{ label }}
@ -16,17 +13,11 @@
</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" 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>
@ -36,18 +27,13 @@
<div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }"> <div v-show="isRange" class="mx-3" :style="{ lineHeight: 0 }">
<img :src="arrowIcon" alt=""> <img :src="arrowIcon" alt="">
</div> </div>
<v-text-field <v-text-field v-show="isRange" id="endpicker" ref="endpicker" v-model="toDtValue"
v-show="isRange" :class="isRange ? 'v-input__custom half' : 'v-input__custom'" :hide-details="true" readonly
id="endpicker" outlined>
ref="endpicker"
v-model="toDtValue"
: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>
@ -183,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 {
@ -191,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
@ -206,9 +194,9 @@ export default {
}, },
arrowIcon() { arrowIcon() {
if (this.isDarkMode) { if (this.isDarkMode) {
return require('@/assets/images/arrow_datepicker_dm.png'); return require('@/assets/images/SwapRight_Dark.svg');
} }
return require('@/assets/images/arrow_datepicker.png'); return require('@/assets/images/SwapRight.svg');
} }
}, },
watch: { watch: {
@ -424,6 +412,7 @@ export default {
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

@ -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>
@ -107,16 +107,13 @@ export default {
}, },
chkGridOptions() { chkGridOptions() {
const options = { const options = {
// bodyHeight: 'fitToContent',
scrollX: false,
scrollY: false,
...this.gridData.option, ...this.gridData.option,
useIcon: false,
}; };
options.treeColumnOptions = { options.treeColumnOptions = {
useIcon: false, useIcon: false,
...options.treeColumnOptions, ...options.treeColumnOptions,
}; };
return options; return options;
}, },
defaultRow() { defaultRow() {
@ -163,7 +160,6 @@ export default {
}, },
created() { }, created() { },
async mounted() { async mounted() {
console.log('--------------DEBUG----gridData: ', this.gridData);
if (this.gridName) { if (this.gridName) {
this.gridInstance = this.$refs['tuigrid' + this.gridName]; this.gridInstance = this.$refs['tuigrid' + this.gridName];
@ -177,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: {
@ -186,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;
} }
@ -200,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;
@ -271,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),
@ -291,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;
} }
@ -302,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),
@ -317,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) {
@ -340,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(
@ -521,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++;
} }
@ -594,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() {
@ -607,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;
@ -636,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)));
@ -648,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;
@ -695,19 +669,14 @@ 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-body-area {
// overflow: hidden !important;
// }
.tui-grid-content-area { .tui-grid-content-area {
.tui-grid-cell-content { .tui-grid-cell-content {
input[type='number'] { input[type='number'] {

View File

@ -0,0 +1,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() {
@ -320,6 +324,7 @@ export default {
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

@ -13,6 +13,7 @@ export default {
data() { data() {
return { return {
mode: null, mode: null,
// isLoading: false
}; };
}, },
computed: { computed: {
@ -28,11 +29,10 @@ export default {
setThemeChange: 'setThemeChange', setThemeChange: 'setThemeChange',
}), }),
themeChange() { themeChange() {
// this.isLoading = true;
this.mode = !this.mode; this.mode = !this.mode;
this.$vuetify.theme.isDark = this.mode; this.$vuetify.theme.isDark = this.mode;
this.setThemeChange(this.mode); this.setThemeChange(this.mode);
console.log(this.mode)
console.log(this.$vuetify.theme.isDark)
}, },
}, },
}; };

View File

@ -1,23 +1,10 @@
<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">
<a-button type="default" @click="btnActionsFnc('addLeftToRight')">
<RightOutlines/>
</a-button> </a-button>
<a-button @click="directionBtn === 'vertically' ? btnActionsFnc('removeRightToLeft') :btnActionsFnc('removeRightToLeft')" type="primary" ghost :icon="directionBtn === 'vertically'? icons.add :icons.remove" class="custom-action-btn">
<!--<v-btn
icon
tile
:ripple="false"
class="mt-2"
@click="btnActionsFnc('removeRightToLeft')"
>
<v-icon>mdi-chevron-left</v-icon>
</v-btn> -->
<a-button class="mt-2" type="default" @click="btnActionsFnc('removeRightToLeft')">
<LeftOutlines/>
</a-button> </a-button>
</div> </div>
</template> </template>
@ -40,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

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

View File

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

View File

@ -2,15 +2,13 @@
export default function getGaugeChartOption({ title, min = 0, max = 160, unit = '%', isDarkMode = false, backgroundRadius = 97 }) { export default function getGaugeChartOption({ title, min = 0, max = 160, unit = '%', isDarkMode = false, backgroundRadius = 97 }) {
const colorRanges = isDarkMode const colorRanges = isDarkMode
? [ ? [
[0.375, '#49AA19'], // Dark Green [60 / 160, '#49AA19'], // Dark Green
// [0.5, '#B8860B'], // Dark Yellow [100 / 160, '#D89614'], // Dark Orange
[0.625, '#D89614'], // Dark Orange
[1, '#D32029'], // Dark Red [1, '#D32029'], // Dark Red
] ]
: [ : [
[0.375, '#52C41A'], // Light Green [60 / 160, '#52C41A'], // Light Green
// [0.5, '#FFD700'], // Light Yellow [100 / 160, '#FAAD14'], // Light Orange
[0.625, '#FAAD14'], // Light Orange
[1, '#F5222D'], // Light Red [1, '#F5222D'], // Light Red
]; ];
// Old color range // Old color range
@ -56,6 +54,7 @@ export default function getGaugeChartOption({ title, min = 0, max = 160, unit =
endAngle: -45, endAngle: -45,
min: min, min: min,
max: max, max: max,
splitNumber: 8,
// progress: { // progress: {
// show: true, // show: true,
// width: 15, // width: 15,

View File

@ -16,6 +16,7 @@ export default function getLineChartOption({
const color = item.color || defaultColors[index % defaultColors.length]; const color = item.color || defaultColors[index % defaultColors.length];
return { return {
...item, ...item,
showSymbol: true, // Show symbol at each data point
itemStyle: { itemStyle: {
color, color,
}, },
@ -27,17 +28,19 @@ export default function getLineChartOption({
left: '3%', left: '3%',
right: '5%', right: '5%',
top: '25%', top: '25%',
bottom: '0%',
containLabel: true, containLabel: true,
}, },
legend: { legend: {
// data: legendData, // data: legendData,
icon: 'circle', icon: 'circle',
itemWidth: 15, // Width of the legend icon
itemHeight: 15,
top: '0%', top: '0%',
right: '5%', right: '5%',
orient: 'horizontal', orient: 'horizontal',
textStyle: { textStyle: {
color: isDarkMode ? '#676A7B' : '#676A7B', color: isDarkMode ? 'white' : '#676A7B',
}, },
}, },
xAxis: { xAxis: {
@ -69,6 +72,7 @@ export default function getLineChartOption({
}, },
splitLine: { splitLine: {
lineStyle: { lineStyle: {
type: 'dashed', // Options: 'solid', 'dashed', 'dotted'
color: isDarkMode ? '#444444' : '#EEEEEE', color: isDarkMode ? '#444444' : '#EEEEEE',
}, },
}, },

View File

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

View File

@ -12,15 +12,26 @@
</label> </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"
: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' : '#1890ff'" :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>
@ -141,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

@ -125,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;
@ -134,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

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

View File

@ -3,12 +3,13 @@
<v-col v-if="item.label" :cols="item.labelCols !== undefined ? item.labelCols : item.cols == 12 ? 2 : 4"> <v-col v-if="item.label" :cols="item.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 }}
@ -39,13 +40,12 @@
</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 }} 비밀번호를 입력하세요
@ -73,12 +73,11 @@
></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> -->
<div> <div class="d-flex" style="gap: 8px">
<a-button @click="close()" class="btn-default">삭제</a-button> <a-button @click="close()" class="ant-btn-popup-default">닫기</a-button>
<a-button type="primary" @click="setUpdate()" class="v-btn-add-text"> <a-button type="primary" @click="setUpdate()" class="v-btn-add-text">
확인 확인
</a-button> </a-button>

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

@ -22,6 +22,7 @@
<span class="custom-title-4">{{ option.modalTitle }}</span> <span class="custom-title-4">{{ option.modalTitle }}</span>
<a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button> <a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
</v-card-title> </v-card-title>
<div class="px-6 py-4 pt-0"> <div class="px-6 py-4 pt-0">
<v-row align="center"> <v-row align="center">
<v-col :cols="5"> <v-col :cols="5">
@ -46,11 +47,10 @@
v-model="searchWord" @keyup.enter="search"><template v-slot:append> v-model="searchWord" @keyup.enter="search"><template v-slot:append>
<!-- Custom SVG icon --> <!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon> <v-icon>$icoSearch</v-icon>
</template></v-text-field> </template></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="3" class="text-right">
<a-button icon="search" type="primary" @click="search()" <a-button icon="search" type="primary" @click="search()"
class="search-button">조회</a-button> class="search-button">조회</a-button>
<!-- <v-btn :ripple="false" @click="initSearch()"> <!-- <v-btn :ripple="false" @click="initSearch()">
@ -59,21 +59,29 @@
</v-col> </v-col>
</v-row> </v-row>
</v-col> </v-col>
</v-row> <v-col :cols="12">
<div style="height: 50vh;">
</div> <div ref="modalGridParent" class="h100 py-4">
<div :style="'height: calc(50vh)'">
<div ref="modalGridParent" class="h100 px-6 py-4">
<component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01" <component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01"
:dataPath="searchParam.pyscModalData.egrpPysclQtyPop" :parentPrgmId="parentPrgmId" :dataPath="searchParam.pyscModalData.egrpPysclQtyPop" :parentPrgmId="parentPrgmId"
@getRowsData="getRowData" @dblClick="setUpdate($event)" /> @getRowsData="getRowData" @dblClick="setUpdate($event)" />
</div> </div>
</div> </div>
</v-col>
</v-row>
</div>
<!-- <div style="height: 50vh;">
<div ref="modalGridParent" class="h100 px-6 py-4">
<component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01"
:dataPath="searchParam.pyscModalData.egrpPysclQtyPop" :parentPrgmId="parentPrgmId"
@getRowsData="getRowData" @dblClick="setUpdate($event)" />
</div>
</div> -->
<v-card-actions class="px-6 py-4 d-flex align-center justify-end"> <v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" <a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="mr-2">닫기</a-button>
class="mr-2">닫기</a-button>
<a-button v-if="item.closeBtnFg || false" :ripple="false" type="danger" ghost danger <a-button v-if="item.closeBtnFg || false" :ripple="false" type="danger" ghost danger
@click="deleteBtnAction($event)" class="mr-2">삭제</a-button> @click="deleteBtnAction($event)" class="mr-2">삭제</a-button>
<a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button> <a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button>
@ -148,23 +156,7 @@ export default {
return { return {
dialog: false, dialog: false,
loadGrid: true, loadGrid: false,
dataPathPopExample: {
"rowGrid": {
data: [
{
'calcProc': 'AVG_CNT2',
'argCnt': '2',
'calcDesc': '두개 변수에 대한 평균'
}
],
column: [
{ header: '계산코드', name: 'calcProc', width: 150 },
{ header: '아규먼트갯수', name: 'argCnt', align: 'center', width: 100 },
]
}
},
grid_01: 'grid_01', grid_01: 'grid_01',
myModalKey: 'egrpPysclQtyPop', myModalKey: 'egrpPysclQtyPop',
modalDataKey: 'pyscModalData', modalDataKey: 'pyscModalData',
@ -329,13 +321,6 @@ export default {
this.selectValueList01 = []; this.selectValueList01 = [];
this.selectValue01 = null; this.selectValue01 = null;
} }
// this.selectValueList01 = [
// { label: '냉동기고온', value: '냉동기고온' },
// { label: '냉동기저온', value: '냉동기저온' },
// { label: '공조기', value: '공조기' },
// { label: '보일러', value: '보일러' }
// ];
}, },
search() { search() {
this.getGridData(); this.getGridData();
@ -357,7 +342,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(100, myOptions), Utility.defaultGridOption(400, myOptions),
myOptions, myOptions,
), ),
}); });
@ -415,6 +400,15 @@ export default {
} }
} }
// res = [
// {
// 'pysclQtyId' : 'PYSCL00001',
// 'pysclQtyCd' : 'AMP_1A',
// 'pysclQtyNm' : '회로1 전류A',
// 'pysclQtyTpNm' : 'TAG'
// }
// ]
this.setModalGridData({ this.setModalGridData({
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.grid_01, gridKey: this.grid_01,
@ -469,10 +463,10 @@ export default {
this.dialog = flag; this.dialog = flag;
}, },
async dialogOpenCloseEvent(val) { async dialogOpenCloseEvent(val) {
// await this.setSelectValueList01(); await this.setSelectValueList01();
// if (!this.myBindingData) { if (!this.myBindingData) {
// return alert('그리드를 먼저 선택해주세요.'); return alert('그리드를 먼저 선택해주세요.');
// } }
this.dialog = !val; this.dialog = !val;
}, },
deleteBtnAction(v) { deleteBtnAction(v) {

View File

@ -17,20 +17,24 @@
{{ item.label }} {{ item.label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? item.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"> -->
@ -58,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"
@ -66,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>
@ -310,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,
@ -606,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',
@ -620,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',

View File

@ -119,8 +119,7 @@
/> />
</div> --> </div> -->
<v-card-actions> <v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<v-spacer></v-spacer>
<a-button color="primary" type="primary" @click="closePop()">확인</a-button> <a-button color="primary" type="primary" @click="closePop()">확인</a-button>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
@ -275,7 +274,12 @@ 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
@ -319,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: '알람내용',

View File

@ -37,6 +37,7 @@
:itemList="selectValueList01" :itemList="selectValueList01"
:label="'대상월'" :label="'대상월'"
@update:propsValue="selectValue01 = $event" @update:propsValue="selectValue01 = $event"
customClass="select-large"
/> />
</v-col> </v-col>
<v-col :cols="5.5" class="mr-2"> <v-col :cols="5.5" class="mr-2">
@ -49,9 +50,10 @@
:itemList="selectValueList02" :itemList="selectValueList02"
:label="'전년대비절감율'" :label="'전년대비절감율'"
@update:propsValue="selectValue02 = $event" @update:propsValue="selectValue02 = $event"
customClass="select-large"
/> />
</v-col> </v-col>
<a-button color="primary" dark @click="search()" icon="clock-circle" > <a-button class="ant-btn-popup-default" color="primary" dark @click="search()" icon="check-circle" size="large">
<!-- <template #icon> <!-- <template #icon>
<ClockCircleOutlined /> <ClockCircleOutlined />
</template> --> </template> -->
@ -65,13 +67,10 @@
<!-- <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"
@ -130,9 +129,8 @@
/> />
</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-end">
<a-button color="primary" type="default" class="mr-2" dark @click="closePop()">취소</a-button> <a-button color="primary" class="mr-2 ant-btn-popup-default" dark @click="closePop()">취소</a-button>
<a-button color="primary" type="primary" dark @click="setUpdate()">확정</a-button> <a-button color="primary" type="primary" dark @click="setUpdate()">확정</a-button>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
@ -318,7 +316,7 @@ export default {
// } // }
}, },
mounted(){ mounted(){
this.initTest(); return; // this.initTest(); return;
}, },
methods: { methods: {
...mapMutations({ ...mapMutations({
@ -478,10 +476,6 @@ export default {
// }) // })
}, },
async setChart(){ async setChart(){
// test
this.initTestChart(); return;
// end test
this.loadChart = false; this.loadChart = false;
let xAxisData = []; let xAxisData = [];
let seriesData = []; let seriesData = [];
@ -537,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;
@ -562,7 +556,6 @@ export default {
series: seriesData, series: seriesData,
tooltip: tooltipData tooltip: tooltipData
}; };
// console.log('option', option);
await this.$nextTick(() => { await this.$nextTick(() => {
}); });
@ -605,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));
} }
@ -614,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

@ -5,7 +5,7 @@
<v-icon <v-icon
v-if="iconShow" v-if="iconShow"
small small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']" :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
>$icoBulletPoint</v-icon >$icoBulletPoint</v-icon
> >
{{ option.labelContent }} {{ option.labelContent }}

View File

@ -1,6 +1,6 @@
<template> <template>
<v-row class="search-box" align="center" no-gutters> <v-row class="search-box" align="center" no-gutters>
<v-col v-if="label" :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" small <v-icon v-if="iconShow" small
:class="['mr-1', required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon> :class="['mr-1', required ? 'icon-orange' : 'icon-blue']">$icoBulletPoint</v-icon>
@ -8,38 +8,40 @@
</label> </label>
</v-col> </v-col>
<v-col :cols="textCols"> <v-col :cols="textCols">
<v-text-field readonly append-icon="" :class="['v-input__custom', customClass]" <v-text-field readonly v-model="selectValue" append-icon="" :class="['v-input__custom', customClass]"
@click="dialogOpenCloseEvent(dialog)" outlined :hide-details="true" :required="required || false" @click="dialogOpenCloseEvent(dialog)" outlined :hide-details="true" :required="required || false"
:disabled="disabled || false"><template v-slot:append> :disabled="disabled || false"
:placeholder="placeholder"
>
<template v-slot:append>
<!-- Custom SVG icon --> <!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon> <v-icon>$icoSearch</v-icon>
</template>
</template></v-text-field> </v-text-field>
</v-col> </v-col>
<v-dialog ref="popModal" v-model="dialog" width="800" overlay-color="#000" overlay-opacity="0.8" scrollable> <v-dialog ref="popModal" v-model="dialog" width="800" content-class="custom-dialog" scrollable>
<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"> <v-card-title class="px-5 py-4 d-flex align-center justify-space-between">
<span class="custom-title-4">설비 선택</span> <span class="custom-title-4">설비 선택</span>
<a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button> <a-button icon="close" type="text" @click="dialogOpenCloseEvent(dialog)"></a-button>
</v-card-title> </v-card-title>
<div class="pa-2 pt-0"> <div class="px-5 pt-2">
<v-card class="searchFilter"> <!-- <v-card class="searchFilter">
</v-card> -->
<v-row align="end"> <v-row align="end">
<v-col :cols="3.5"> <v-col :cols="3.5">
<!-- 설비그룹 --> <!-- 설비그룹 -->
<component :is="'SelectBox'" :propsValue="selectValue01" :itemList="selectValueList01" <component :is="'SelectBox'" :propsValue="selectValue01" :itemList="selectValueList01"
:label="'설비그룹'" :disabled="eqpmGrpDisabled" :label="'설비그룹'" :disabled="eqpmGrpDisabled" @update:propsValue="selectValue01 = $event"
@update:propsValue="selectValue01 = $event" :labelCols="12" :textCols="12" :labelCols="12" :textCols="12" :iconShow="true" />
:iconShow="true" />
</v-col> </v-col>
<v-col :cols="3.5"> <v-col>
<!-- FAB --> <!-- FAB -->
<component :is="'SelectBoxMulti'" :propsValue="selectValue02" <component :is="'SelectBoxMulti'" :propsValue="selectValue02" :itemList="selectValueList02"
:itemList="selectValueList02" :label="'FAB'" :labelCols="12" :multiple="true" :label="'FAB'" :labelCols="12" :multiple="true" :disabled="fabDisabled"
:disabled="fabDisabled" @update:propsValue="selectValue02 = $event" :textCols="12" @update:propsValue="selectValue02 = $event" :textCols="12" :iconShow="true" />
:iconShow="true" />
</v-col> </v-col>
<v-col :cols="3.5"> <v-col >
<v-row> <v-row>
<v-col :cols="12" class="py-0"> <v-col :cols="12" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
@ -48,9 +50,8 @@
</label> </label>
</v-col> </v-col>
<v-col :cols="12" class="pt-0"> <v-col :cols="12" class="pt-0">
<v-text-field append-icon="" class="v-input__custom" outlined <v-text-field append-icon="" class="v-input__custom" outlined :hide-details="true"
:hide-details="true" v-model="searchWord" @keyup.enter="search"><template v-model="searchWord" @keyup.enter="search"><template v-slot:append>
v-slot:append>
<!-- Custom SVG icon --> <!-- Custom SVG icon -->
<v-icon>$icoSearch</v-icon> <v-icon>$icoSearch</v-icon>
@ -59,11 +60,12 @@
</v-row> </v-row>
</v-col> </v-col>
<a-button icon="search" type="primary" @click="search()" class="search-button">조회</a-button> <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>
</v-card>
<!-- <v-row align="center" no-gutters style="margin-top: 14px;"> <!-- <v-row align="center" no-gutters style="margin-top: 14px;">
<v-col :cols="1"> <v-col :cols="1">
@ -77,16 +79,22 @@
:hide-details="true" v-model="searchWord" @keyup.enter="search"></v-text-field> :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"> <div class="pa-5" style="height:calc(100% - 30px)">
<div ref="modalGridParent" class="h100 w100">
<component :ref="gridName" :is="loadGrid ? 'Grid' : null" <component :ref="gridName" :is="loadGrid ? 'Grid' : null"
:dataPath="searchParam.eqpmSelectPopData.eqpmSelectPop" :gridName="gridName" :dataPath="searchParam.eqpmSelectPopData.eqpmSelectPop" :gridName="gridName"
:parentPrgmId="parentPrgmId" @getRowsData="getRowData" /> :parentPrgmId="parentPrgmId" @getRowsData="getRowData" />
</div> </div>
</div> </div>
<v-card-actions class="px-6 py-4 d-flex align-center justify-end"> <v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="mr-2">닫기</a-button> <a-button :ripple="false" @click="dialogOpenCloseEvent(dialog)" class="ant-btn-popup-default mr-2">닫기</a-button>
<a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button> <a-button :ripple="false" type="primary" @click="setUpdate($event)">확인</a-button>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
@ -117,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,
@ -251,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 = [];
} }
@ -391,8 +404,8 @@ export default {
rowHeight: 'auto', rowHeight: 'auto',
}; };
if (this.isMulti) { if (this.isMulti) {
// myOptions['rowHeaders'] = [{ type: 'checkbox' }]; myOptions['rowHeaders'] = [{ type: 'checkbox' }];
// myOptions['rowHeight'] = 'auto'; myOptions['rowHeight'] = 'auto';
} }
@ -418,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',
@ -518,7 +528,6 @@ export default {
this.getChecked(); this.getChecked();
} }
}); });
}, },
setUpdate() { setUpdate() {
if (this.isMulti) { if (this.isMulti) {
@ -569,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

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

View File

@ -7,12 +7,23 @@
{{ 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 readonly v-model="selectValue" append-icon="mdi-magnify" <v-text-field
:class="['v-select__custom', customClass]" readonly
@click="dialogOpenCloseEvent(dialog)" outlined :hide-details="true" v-model="selectValue"
:required="item.required || false"></v-text-field> append-icon="mdi-magnify"
<!-- :disabled="item.disabled || false" --> class="v-input__custom"
@click="dialogOpenCloseEvent(dialog)"
outlined
:hide-details="true"
:required="item.required || false"
:disabled="item.disabled || false"
>
<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">
@ -21,10 +32,10 @@
<span class="custom-title-4">{{ option.modalTitle }}</span> <span class="custom-title-4">{{ option.modalTitle }}</span>
<v-icon @click="dialogOpenCloseEvent(dialog)">mdi-close</v-icon> <v-icon @click="dialogOpenCloseEvent(dialog)">mdi-close</v-icon>
</v-card-title> </v-card-title>
<v-row align="end" class="pa-5" no-gutters> <v-row align="end" class="px-5 pb-3" no-gutters>
<v-col :cols="2.5" class="mr-2"> <v-col :cols="2.5" class="mr-2">
<v-row> <v-row>
<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 small <!-- <v-icon small
:class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']" :class="['mr-1', item.required ? 'icon-orange' : 'icon-blue']"
@ -32,28 +43,28 @@
검색 검색
</label> </label>
</v-col> </v-col>
<v-col :cols="12"> <v-col :cols="11" class="py-0 pr-3">
<v-text-field append-icon="mdi-magnify" class="v-input__custom" outlined :hide-details="true" <v-text-field append-icon="mdi-magnify" class="v-input__custom" outlined
v-model="searchWord" @keyup.enter="search"></v-text-field> :hide-details="true" v-model="searchWord" @keyup.enter="search"></v-text-field>
</v-col> </v-col>
<a-button icon="search" :ripple="false" type="primary" @click="search()"
class="search-button">조회</a-button>
</v-row> </v-row>
</v-col> </v-col>
<a-button type="primary" :ripple="false" @click="search()">
조회
</a-button>
</v-row> </v-row>
<!-- <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">
<!-- :is="loadGrid && dialog ? 'Grid' : null" --> <!-- :is="loadGrid && dialog ? 'Grid' : null" -->
<component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01" <component :is="loadGrid && dialog ? 'Grid' : null" :gridName="grid_01"
:dataPath="searchParam.modalData2.evtObjPop" :parentPrgmId="parentPrgmId" @getRowsData="getRowData" :dataPath="searchParam.modalData2.evtObjPop" :parentPrgmId="parentPrgmId"
@dblClick="setUpdate($event)" /> @getRowsData="getRowData" @dblClick="setUpdate($event)" />
</div> </div>
</div> </div>
<v-card-actions class="pa-5 d-flex align-center justify-end"> <v-card-actions class="pa-5 d-flex align-center justify-end">
<a-button type="default" class="mr-2" :ripple="false" @click="dialogOpenCloseEvent(dialog)">닫기</a-button> <a-button type="default" class="mr-2" :ripple="false"
@click="dialogOpenCloseEvent(dialog)">닫기</a-button>
<a-button type="primary" class="mr-2" :ripple="false" @click="setUpdate('init')">초기화</a-button> <a-button type="primary" class="mr-2" :ripple="false" @click="setUpdate('init')">초기화</a-button>
<a-button type="primary" :ripple="false" @click="setUpdate($event)">확인</a-button> <a-button type="primary" :ripple="false" @click="setUpdate($event)">확인</a-button>
</v-card-actions> </v-card-actions>

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

@ -22,8 +22,8 @@
outlined outlined
:hide-details="true" :hide-details="true"
> >
<template v-slot:append>
<!-- Custom SVG icon --> <!-- Custom SVG icon -->
<template v-slot:append>
<v-icon>$icoSearch</v-icon> <v-icon>$icoSearch</v-icon>
</template> </template>
</v-text-field> </v-text-field>
@ -31,28 +31,20 @@
<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"
@ -63,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"
@ -88,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>
@ -292,51 +280,40 @@ 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() {
// this.loadGrid = false; this.loadGrid = false;
// const res = await this.postApiReturn({ const res = await this.postApiReturn({
// apiKey: 'selectEccBaseInfo', apiKey: 'selectEccBaseInfo',
// resKey: 'eccBaseInfoData', resKey: 'eccBaseInfoData',
// sendParam: { sendParam: {
// blocId: this.myBindingData.blocId, blocId: this.myBindingData.blocId,
// eqpmYn: '0', eqpmYn: '0',
// search: this.searchWord, search: this.searchWord,
// }, },
// }); });
// const setTreeData = await this.setTree({ const setTreeData = await this.setTree({
// gridKey: this.gridNameTree, gridKey: this.gridNameTree,
// treeKey: 'ECC_ID', treeKey: 'ECC_ID',
// value: res.map(item => ({ value: res.map(item => ({
// ...item,
// eccNm: item.eccNm,
// })),
// });
//mockdata eccNm
let res = [
{ ECC_ID: 'ECC001', eccNm: '서울 본사', iconShow: false, align: 'center' },
{ ECC_ID: 'ECC002', eccNm: '부산 지사', useIcon: false, align: 'center' },
{ ECC_ID: 'ECC003', eccNm: '대구 센터', useIcon: false, align: 'center' },
{ ECC_ID: 'ECC004', eccNm: '광주 사무소' , useIcon: false, align: 'center'},
{ ECC_ID: 'ECC005', eccNm: '인천 물류창고' , useIcon: false, align: 'center'},
];
const setTreeData = {
ROOT: res.map(item => ({
...item, ...item,
eccNm: item.eccNm, eccNm: item.eccNm,
})) })),
}; });
console.log(res);
this.setModalGridData({ this.setModalGridData({
modalKey: this.myModalKey, modalKey: this.myModalKey,
@ -395,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;
} }
@ -418,26 +419,4 @@ var FtnPlcFormPop = {
} }
} }
@each $theme in dark, light {
.v-application.#{$theme}-mode {
.v-dialog {
.v-card {
&__title {
color: map-deep-get($color, 'white', '0');
@if $theme == dark {
background-color: #2d3355;
.v-btn {
background-color: #2d3355;
}
} @else {
background-color: #3f4d7d;
.v-btn {
background-color: #3f4d7d;
}
}
}
}
}
}
}
</style> </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

@ -43,7 +43,10 @@
</v-col> </v-col>
<v-col :cols="6" class="py-0 pl-2"> <v-col :cols="6" class="py-0 pl-2">
<!-- <DatePicker v-model="strtDt" :parentPrgmId="parentPrgmId"/> --> <!-- <DatePicker v-model="strtDt" :parentPrgmId="parentPrgmId"/> -->
<div class="startpicker-container2"> <component :parentPrgmId="parentPrgmId" :is="'SelectBoxTime'" ref="SelectBox1"
:propsValue="selectTimeValue1" :itemList="selectTimeValueList1" :minInterval="selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1
" @update:propsValue="selectTimeValue1 = $event" />
<!-- <div class="startpicker-container2">
<v-text-field id="startpicker2" ref="startpicker2" v-model="strtDt" <v-text-field id="startpicker2" ref="startpicker2" v-model="strtDt"
:class="'v-input__custom'" :hide-details="true" readonly outlined> :class="'v-input__custom'" :hide-details="true" readonly outlined>
<template #append> <template #append>
@ -53,7 +56,7 @@
<div ref="startpicker-container2" id="startpicker-container2"></div> <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="2">
<vue-numeric-input v-model="strtHh" :min="0" :max="23" controls-type="updown" <vue-numeric-input v-model="strtHh" :min="0" :max="23" controls-type="updown"
@ -91,17 +94,9 @@
</div> </div>
</v-col> </v-col>
<v-col :cols="6" class="pl-2"> <v-col :cols="6" class="pl-2">
<div class="startpicker-container3"> <component :parentPrgmId="parentPrgmId" :is="'SelectBoxTime'" ref="SelectBox2"
<v-text-field id="startpicker3" ref="startpicker3" v-model="endDt" :propsValue="selectTimeValue2" :itemList="selectTimeValueList2" :minInterval="selectBoxTimeItemList.minInterval ? selectBoxTimeItemList.minInterval : 1
:class="'v-input__custom'" :hide-details="true" readonly outlined> " @update:propsValue="selectTimeValue2 = $event" />
<template #append>
<v-icon size="20">$icoCalendar</v-icon>
</template>
<template #append-outer>
<div ref="startpicker-container3" id="startpicker-container3"></div>
</template>
</v-text-field>
</div>
</v-col> </v-col>
<!-- <v-col :cols="2"> <!-- <v-col :cols="2">
<vue-numeric-input v-model="endHh" :min="0" :max="23" controls-type="updown" <vue-numeric-input v-model="endHh" :min="0" :max="23" controls-type="updown"
@ -186,10 +181,11 @@
</div> </div>
</template> </template>
<v-card-actions class="justify-end"> <v-card-actions class="justify-end">
<a-button :ripple="false" @click="btnAction('save')" class="mr-2">저장</a-button> <a-button :ripple="false" @click="btnAction('close')" class="mr-2">닫기</a-button>
<a-button type="primary" :ripple="false" @click="btnAction('save')" class="mr-2">저장</a-button>
<a-button v-show="popUpAction === 'update'" type="danger" ghost danger :ripple="false" <a-button v-show="popUpAction === 'update'" type="danger" ghost danger :ripple="false"
@click="btnAction('delete')" class="mr-2">삭제</a-button> @click="btnAction('delete')">삭제</a-button>
<a-button :ripple="false" type="primary" @click="btnAction('close')" class="mr-2">닫기</a-button>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@ -210,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],
@ -237,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,
@ -250,6 +260,7 @@ export default {
Utility, Utility,
TuiDatepicker, TuiDatepicker,
VueNumericInput, VueNumericInput,
SelectBoxTime,
}, },
data() { data() {
return { return {
@ -272,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: {
@ -296,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) {
@ -323,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({
@ -505,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;
@ -525,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 === ''
@ -542,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 == ''
@ -565,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,
@ -592,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,

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,5 +1,5 @@
<template> <template>
<v-row class="search-box" align="center" > <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="item.label" :cols="item.labelCols" class="py-0"> <v-col v-if="item.label" :cols="item.labelCols" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
@ -37,12 +37,11 @@
<v-row align="center"> <v-row align="center">
<v-col v-if="label" cols="12" class="py-0"> <v-col v-if="label" cols="12" class="py-0">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
<v-icon small <v-icon small :class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
:class="['mr-1', 'icon-blue']">$icoBulletPoint</v-icon>
{{ item.label }} {{ item.label }}
</label> </label>
</v-col> </v-col>
<v-col :cols="label ? 6 : ''" class="py-0"> <v-col :cols="label ? 8 : ''" class="py-0">
<!-- :value="textfield" --> <!-- :value="textfield" -->
<v-text-field append-icon="" class="v-input__custom" outlined :hide-details="true" <v-text-field append-icon="" class="v-input__custom" outlined :hide-details="true"
v-model="searchWord" @keyup.enter="typeEnterKey"><template v-slot:append> v-model="searchWord" @keyup.enter="typeEnterKey"><template v-slot:append>
@ -52,13 +51,10 @@
</template></v-text-field> </template></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> -->
@ -66,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()">{{
@ -78,7 +78,7 @@
</div> </div>
<v-card-text> <v-card-text>
<div ref="treeGridParent" style="height: 500px"> <div ref="treeGridParent" style="height: 450px">
<component :ref="'treeGrid' + parentPrgmId" :is="loadGrid && dialog ? 'Grid' : null" <component :ref="'treeGrid' + parentPrgmId" :is="loadGrid && dialog ? 'Grid' : null"
:gridName="gridNameTree" :dataPath="searchParam.modalData.selectReadObjListTree" :gridName="gridNameTree" :dataPath="searchParam.modalData.selectReadObjListTree"
:parentPrgmId="parentPrgmId" :bindingData="bindingData" @getRowsData="getRowData" :parentPrgmId="parentPrgmId" :bindingData="bindingData" @getRowsData="getRowData"
@ -89,10 +89,10 @@
:tree-data="ftnPlcListTreeData" :tree-data="ftnPlcListTreeData"
/> --> /> -->
</v-card-text> </v-card-text>
<v-divider></v-divider>
<v-card-actions class="px-6 py-4 d-flex align-center justify-end"> <v-card-actions class="px-6 py-4 d-flex align-center justify-end">
<a-button :ripple="false" @click="setUpdate()" class="mr-2">확인</a-button> <a-button :ripple="false" @click="dialog = false" class="mr-2">닫기</a-button>
<a-button :ripple="false" type="primary" @click="dialog = false" 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>
@ -155,7 +155,7 @@ export default {
myModalKey: 'selectReadObjListTree', myModalKey: 'selectReadObjListTree',
gridNameTree: 'treeGrid', gridNameTree: 'treeGrid',
loadGrid: true, loadGrid: false,
dialog: false, dialog: false,
treeData: [], // 리턴받은 원본 트리 데이터 treeData: [], // 리턴받은 원본 트리 데이터
@ -268,7 +268,7 @@ export default {
header: '', header: '',
name: '', name: '',
align: 'center', align: 'center',
width: 50, width: 20,
formatter: (props) => { formatter: (props) => {
return `<label class="custom-radio"> return `<label class="custom-radio">
<span class="radio-mark"></span> <span class="radio-mark"></span>
@ -278,10 +278,10 @@ export default {
{ {
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 },
], ],
}); });
}, },
@ -289,73 +289,34 @@ export default {
async getTreeData() { async getTreeData() {
this.loadGrid = false; this.loadGrid = false;
// const res = await this.postApiReturn({ const res = await this.postApiReturn({
// apiKey: 'selectReadPlcBaseInfo', apiKey: 'selectReadPlcBaseInfo',
// resKey: 'readPlcBaseInfoData', resKey: 'readPlcBaseInfoData',
// sendParam: { sendParam: {
// blocId: blocId:
// this.searchParam.blocMstrList.length > 0 this.searchParam.blocMstrList.length > 0
// ? this.searchParam.blocMstrList[this.searchParam.blocId].blocId ? this.searchParam.blocMstrList[this.searchParam.blocId].blocId
// : this.searchParam.blocId, //"BL0001", : this.searchParam.blocId, //"BL0001",
// // readObjId: this.searchParam.readObj, // "MTT00001" // 전력 코드 고정 // readObjId: this.searchParam.readObj, // "MTT00001" // 전력 코드 고정
// readObjId: this.searchParam.searchReadObj, // "MTT00001" // 전력 코드 고정 readObjId: this.searchParam.searchReadObj, // "MTT00001" // 전력 코드 고정
// useFg: '1', useFg: '1',
// readPlcNmLike: this.searchWord, readPlcNmLike: this.searchWord,
// }, },
// }); });
const treeData = [ // console.log("treeData", res)
{
readPlcNm: '서울 본사',
name: '본사',
_children: [
{
readPlcNm: '서울 본사 - 1층',
name: '1층',
},
{
readPlcNm: '서울 본사 - 2층',
name: '2층',
},
],
},
{
readPlcNm: '부산 지사',
name: '지사',
_children: [
{
readPlcNm: '부산 지사 - A동',
name: 'A동',
_children: [
{
readPlcNm: '부산 지사 - A동 1층',
name: '1층',
},
{
readPlcNm: '부산 지사 - A동 2층',
name: '2층',
},
],
},
{
readPlcNm: '부산 지사 - B동',
name: 'B동',
},
],
},
{
readPlcNm: '대전 창고',
name: '창고',
},
];
// // console.log("treeData", res)
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' }];
@ -373,26 +334,26 @@ export default {
// 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({
// gridKey: this.gridNameTree, gridKey: this.gridNameTree,
// treeKey: 'READ_PLC_ID', treeKey: 'READ_PLC_ID',
// value: res.map(item => ({ value: res.map(item => ({
// ...item, ...item,
// rowStat: null, rowStat: null,
// readPlcId: item.readPlcId, readPlcId: item.readPlcId,
// readPlcIdNm: item.readPlcId, readPlcIdNm: item.readPlcId,
// upReadPlcId: upReadPlcId:
// item.upReadPlcId == null || item.upReadPlcId == '' item.upReadPlcId == null || item.upReadPlcId == ''
// ? '' ? ''
// : item.upReadPlcId, : item.upReadPlcId,
// upReadPlcNm: upReadPlcNm:
// item.upReadPlcNm == null || item.upReadPlcNm == '' item.upReadPlcNm == null || item.upReadPlcNm == ''
// ? '' ? ''
// : item.upReadPlcNm, : item.upReadPlcNm,
// blocId: item.blocId, blocId: item.blocId,
// useFg: item.useFg === '1' ? true : false, useFg: item.useFg === '1' ? true : false,
// })), })),
// }); });
// this.treeData = setTreeData; // this.treeData = setTreeData;
@ -400,7 +361,7 @@ export default {
modalKey: this.myModalKey, modalKey: this.myModalKey,
gridKey: this.gridNameTree, gridKey: this.gridNameTree,
modalDataKey: this.modalDataKey, modalDataKey: this.modalDataKey,
value: treeData, value: setTreeData.ROOT || [],
}); });
this.loadGrid = true; this.loadGrid = true;
@ -540,22 +501,4 @@ const selectReadObjListTree = {
} }
} }
@each $theme in dark, light {
.v-application.#{$theme}-mode {
.v-dialog {
.v-card {
&__title {
@if $theme ==dark {
background-color: #2d3355;
.v-btn {
background-color: #2d3355;
}
}
}
}
}
}
}
</style> </style>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,7 @@
<template>
<!-- Custom SVG icon -->
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.143 1.42969H1.71443C1.55728 1.42969 1.42871 1.55826 1.42871 1.7154V7.14397C1.42871 7.30112 1.55728 7.42969 1.71443 7.42969H7.143C7.30014 7.42969 7.42871 7.30112 7.42871 7.14397V1.7154C7.42871 1.55826 7.30014 1.42969 7.143 1.42969ZM6.21443 6.2154H2.643V2.64397H6.21443V6.2154ZM14.2859 1.42969H8.85728C8.70014 1.42969 8.57157 1.55826 8.57157 1.7154V7.14397C8.57157 7.30112 8.70014 7.42969 8.85728 7.42969H14.2859C14.443 7.42969 14.5716 7.30112 14.5716 7.14397V1.7154C14.5716 1.55826 14.443 1.42969 14.2859 1.42969ZM13.3573 6.2154H9.78586V2.64397H13.3573V6.2154ZM7.143 8.57255H1.71443C1.55728 8.57255 1.42871 8.70112 1.42871 8.85826V14.2868C1.42871 14.444 1.55728 14.5725 1.71443 14.5725H7.143C7.30014 14.5725 7.42871 14.444 7.42871 14.2868V8.85826C7.42871 8.70112 7.30014 8.57255 7.143 8.57255ZM6.21443 13.3583H2.643V9.78683H6.21443V13.3583ZM14.2859 8.57255H8.85728C8.70014 8.57255 8.57157 8.70112 8.57157 8.85826V14.2868C8.57157 14.444 8.70014 14.5725 8.85728 14.5725H14.2859C14.443 14.5725 14.5716 14.444 14.5716 14.2868V8.85826C14.5716 8.70112 14.443 8.57255 14.2859 8.57255ZM13.3573 13.3583H9.78586V9.78683H13.3573V13.3583Z"
fill="currentColor" />
</svg>
</template>

View File

@ -0,0 +1,6 @@
<template>
<!-- Custom SVG icon -->
<svg width="12" height="16" viewBox="0 0 12 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.14258 14.7143H3.85686C3.77829 14.7143 3.71401 14.7786 3.71401 14.8571V15.4286C3.71401 15.7446 3.96936 16 4.28544 16H7.71401C8.03008 16 8.28544 15.7446 8.28544 15.4286V14.8571C8.28544 14.7786 8.22115 14.7143 8.14258 14.7143ZM5.99972 0C2.76579 0 0.142578 2.62321 0.142578 5.85714C0.142578 8.025 1.32115 9.91786 3.07115 10.9304V13C3.07115 13.3161 3.32651 13.5714 3.64258 13.5714H8.35686C8.67294 13.5714 8.92829 13.3161 8.92829 13V10.9304C10.6783 9.91786 11.8569 8.025 11.8569 5.85714C11.8569 2.62321 9.23365 0 5.99972 0ZM8.28365 9.81786L7.64258 10.1893V12.2857H4.35686V10.1893L3.71579 9.81786C2.31044 9.00536 1.42829 7.50893 1.42829 5.85714C1.42829 3.33214 3.47472 1.28571 5.99972 1.28571C8.52472 1.28571 10.5711 3.33214 10.5711 5.85714C10.5711 7.50893 9.68901 9.00536 8.28365 9.81786Z" fill="currentColor" />
</svg>
</template>

View File

@ -0,0 +1,6 @@
<template>
<!-- Custom SVG icon -->
<svg width="16" height="14" viewBox="0 0 16 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.4286 0.359253H0.571429C0.255357 0.359253 0 0.61461 0 0.930682V9.78782C0 10.1039 0.255357 10.3593 0.571429 10.3593H7.35714V12.3593H4.28571C4.12857 12.3593 4 12.4878 4 12.645V13.5021C4 13.5807 4.06429 13.645 4.14286 13.645H11.8571C11.9357 13.645 12 13.5807 12 13.5021V12.645C12 12.4878 11.8714 12.3593 11.7143 12.3593H8.64286V10.3593H15.4286C15.7446 10.3593 16 10.1039 16 9.78782V0.930682C16 0.61461 15.7446 0.359253 15.4286 0.359253ZM14.7143 9.07354H1.28571V1.64497H14.7143V9.07354Z" fill="currentColor" />
</svg>
</template>

View File

@ -0,0 +1,6 @@
<template>
<!-- Custom SVG icon -->
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.0943 7.89787L12.8157 6.09966C12.7967 6.08466 12.7738 6.07534 12.7496 6.07276C12.7255 6.07018 12.7012 6.07444 12.6794 6.08507C12.6576 6.09569 12.6392 6.11224 12.6264 6.13282C12.6135 6.15341 12.6067 6.17719 12.6068 6.20144V7.3568H8.64251V3.39251H9.79966C9.9068 3.39251 9.96751 3.26751 9.90144 3.18359L8.10144 0.905014C8.08953 0.889595 8.07424 0.877112 8.05675 0.868523C8.03926 0.859935 8.02003 0.855469 8.00055 0.855469C7.98106 0.855469 7.96184 0.859935 7.94435 0.868523C7.92686 0.877112 7.91157 0.889595 7.89966 0.905014L6.09966 3.18359C6.08466 3.20265 6.07534 3.22555 6.07276 3.24967C6.07018 3.27379 6.07444 3.29815 6.08507 3.31995C6.09569 3.34176 6.11224 3.36013 6.13282 3.37296C6.15341 3.3858 6.17719 3.39257 6.20144 3.39251H7.3568V7.3568H3.39251V6.19966C3.39251 6.09252 3.26751 6.0318 3.18359 6.09787L0.905014 7.89787C0.889595 7.90979 0.877112 7.92508 0.868523 7.94256C0.859935 7.96005 0.855469 7.97928 0.855469 7.99877C0.855469 8.01825 0.859935 8.03748 0.868523 8.05497C0.877112 8.07246 0.889595 8.08774 0.905014 8.09966L3.1818 9.89966C3.26573 9.96573 3.39073 9.9068 3.39073 9.79787V8.64252H7.35501V12.6068H6.19787C6.09073 12.6068 6.03001 12.7318 6.09609 12.8157L7.89609 15.0925C7.94787 15.1586 8.04787 15.1586 8.09787 15.0925L9.89787 12.8157C9.96394 12.7318 9.90501 12.6068 9.79608 12.6068H8.64251V8.64252H12.6068V9.79966C12.6068 9.9068 12.7318 9.96752 12.8157 9.90144L15.0925 8.10144C15.1079 8.08937 15.1203 8.07398 15.129 8.05644C15.1376 8.03889 15.1422 8.01964 15.1423 8.00009C15.1425 7.98054 15.1383 7.9612 15.13 7.94351C15.1216 7.92582 15.1095 7.91022 15.0943 7.89787Z" fill="currentColor"/>
</svg>
</template>

View File

@ -0,0 +1,6 @@
<template>
<!-- Custom SVG icon -->
<svg width="14" height="16" viewBox="0 0 14 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.1174 4.01071L9.27458 0.167857C9.16744 0.0607143 9.0228 0 8.87101 0H1.2853C0.969224 0 0.713867 0.255357 0.713867 0.571429V15.4286C0.713867 15.7446 0.969224 16 1.2853 16H12.7139C13.0299 16 13.2853 15.7446 13.2853 15.4286V4.41607C13.2853 4.26429 13.2246 4.11786 13.1174 4.01071ZM11.9674 4.67857H8.60673V1.31786L11.9674 4.67857ZM11.9996 14.7143H1.99958V1.28571H7.39244V5.14286C7.39244 5.34177 7.47146 5.53254 7.61211 5.67319C7.75276 5.81384 7.94353 5.89286 8.14244 5.89286H11.9996V14.7143ZM6.85673 9.89286H3.57101C3.49244 9.89286 3.42815 9.95714 3.42815 10.0357V10.8929C3.42815 10.9714 3.49244 11.0357 3.57101 11.0357H6.85673C6.9353 11.0357 6.99958 10.9714 6.99958 10.8929V10.0357C6.99958 9.95714 6.9353 9.89286 6.85673 9.89286ZM3.42815 7.60714V8.46429C3.42815 8.54286 3.49244 8.60714 3.57101 8.60714H10.4282C10.5067 8.60714 10.571 8.54286 10.571 8.46429V7.60714C10.571 7.52857 10.5067 7.46429 10.4282 7.46429H3.57101C3.49244 7.46429 3.42815 7.52857 3.42815 7.60714Z" fill="currentColor" />
</svg>
</template>

View File

@ -0,0 +1,6 @@
<template>
<!-- Custom SVG icon -->
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.714 12.0006H1.42829V0.857701C1.42829 0.779129 1.36401 0.714844 1.28544 0.714844H0.285435C0.206864 0.714844 0.142578 0.779129 0.142578 0.857701V13.1434C0.142578 13.222 0.206864 13.2863 0.285435 13.2863H13.714C13.7926 13.2863 13.8569 13.222 13.8569 13.1434V12.1434C13.8569 12.0648 13.7926 12.0006 13.714 12.0006ZM3.31758 9.2452C3.37294 9.30056 3.46222 9.30056 3.51936 9.2452L5.98901 6.78806L8.26758 9.08092C8.32294 9.13627 8.41401 9.13627 8.46937 9.08092L13.3872 4.16484C13.4426 4.10949 13.4426 4.01842 13.3872 3.96306L12.6801 3.25592C12.6532 3.22933 12.617 3.21442 12.5792 3.21442C12.5414 3.21442 12.5051 3.22933 12.4783 3.25592L8.37115 7.36127L6.09615 5.07199C6.0693 5.0454 6.03304 5.03049 5.99526 5.03049C5.95747 5.03049 5.92122 5.0454 5.89437 5.07199L2.61222 8.33449C2.58564 8.36134 2.57072 8.39759 2.57072 8.43538C2.57072 8.47316 2.58564 8.50942 2.61222 8.53627L3.31758 9.2452Z" fill="currentColor" />
</svg>
</template>

View File

@ -0,0 +1,6 @@
<template>
<!-- Custom SVG icon -->
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.14296 8C7.14296 8.22733 7.23326 8.44535 7.39401 8.60609C7.55475 8.76684 7.77277 8.85714 8.0001 8.85714C8.22743 8.85714 8.44545 8.76684 8.60619 8.60609C8.76694 8.44535 8.85724 8.22733 8.85724 8C8.85724 7.77267 8.76694 7.55465 8.60619 7.39391C8.44545 7.23316 8.22743 7.14286 8.0001 7.14286C7.77277 7.14286 7.55475 7.23316 7.39401 7.39391C7.23326 7.55465 7.14296 7.77267 7.14296 8ZM10.7144 8C10.7144 8.22733 10.8047 8.44535 10.9654 8.60609C11.1262 8.76684 11.3442 8.85714 11.5715 8.85714C11.7989 8.85714 12.0169 8.76684 12.1776 8.60609C12.3384 8.44535 12.4287 8.22733 12.4287 8C12.4287 7.77267 12.3384 7.55465 12.1776 7.39391C12.0169 7.23316 11.7989 7.14286 11.5715 7.14286C11.3442 7.14286 11.1262 7.23316 10.9654 7.39391C10.8047 7.55465 10.7144 7.77267 10.7144 8ZM3.57153 8C3.57153 8.22733 3.66184 8.44535 3.82258 8.60609C3.98333 8.76684 4.20134 8.85714 4.42867 8.85714C4.656 8.85714 4.87402 8.76684 5.03476 8.60609C5.19551 8.44535 5.28582 8.22733 5.28582 8C5.28582 7.77267 5.19551 7.55465 5.03476 7.39391C4.87402 7.23316 4.656 7.14286 4.42867 7.14286C4.20134 7.14286 3.98333 7.23316 3.82258 7.39391C3.66184 7.55465 3.57153 7.77267 3.57153 8ZM15.3787 4.9C14.9751 3.94107 14.3965 3.08036 13.659 2.34107C12.9267 1.60607 12.0573 1.02182 11.1001 0.621429C10.118 0.208929 9.0751 0 8.0001 0H7.96439C6.88224 0.00535714 5.83403 0.219643 4.84832 0.641071C3.89931 1.04557 3.03807 1.63085 2.3126 2.36429C1.58224 3.10179 1.00903 3.95893 0.612601 4.91429C0.201887 5.90357 -0.00525583 6.95536 0.000101308 8.0375C0.00616068 9.27763 0.299551 10.4995 0.857244 11.6071V14.3214C0.857244 14.5393 0.943787 14.7482 1.09783 14.9023C1.25188 15.0563 1.46082 15.1429 1.67867 15.1429H4.39474C5.50241 15.7006 6.72426 15.9939 7.96439 16H8.00189C9.07153 16 10.109 15.7929 11.0858 15.3875C12.0382 14.9919 12.9043 14.4144 13.6358 13.6875C14.3733 12.9571 14.9537 12.1036 15.359 11.1518C15.7805 10.1661 15.9947 9.11786 16.0001 8.03572C16.0055 6.94821 15.7947 5.89286 15.3787 4.9ZM12.6805 12.7214C11.4287 13.9607 9.76796 14.6429 8.0001 14.6429H7.96974C6.89296 14.6375 5.82332 14.3696 4.87867 13.8661L4.72867 13.7857H2.21439V11.2714L2.13403 11.1214C1.63046 10.1768 1.3626 9.10714 1.35724 8.03036C1.3501 6.25 2.03046 4.57857 3.27867 3.31964C4.5251 2.06071 6.19117 1.36429 7.97153 1.35714H8.00189C8.89474 1.35714 9.76081 1.53036 10.5769 1.87321C11.3733 2.20714 12.0876 2.6875 12.7019 3.30179C13.3144 3.91429 13.7965 4.63036 14.1305 5.42679C14.4769 6.25179 14.6501 7.12679 14.6465 8.03036C14.6358 9.80893 13.9376 11.475 12.6805 12.7214Z" fill="currentColor" />
</svg>
</template>

View File

@ -0,0 +1,6 @@
<template>
<!-- Custom SVG icon -->
<svg width="16" height="14" viewBox="0 0 16 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.8571 8.78318C15.9357 8.78318 16 8.71889 16 8.64032V7.64032C16 7.56175 15.9357 7.49746 15.8571 7.49746H4.17857C4.05067 7.18077 3.83102 6.90955 3.54782 6.71864C3.26463 6.52772 2.93082 6.42582 2.58929 6.42603C1.64286 6.42603 0.875 7.19389 0.875 8.14032C0.875 9.08675 1.64286 9.8546 2.58929 9.8546C3.30893 9.8546 3.925 9.41175 4.17857 8.78318H6.8625V11.4975C6.8625 12.4832 7.6625 13.2832 8.64821 13.2832H15.8571C15.9357 13.2832 16 13.2189 16 13.1403V12.1403C16 12.0617 15.9357 11.9975 15.8571 11.9975H8.64821C8.37143 11.9975 8.14821 11.7742 8.14821 11.4975V8.78318H15.8571ZM7 3.99746H11.7143V5.75103C11.7143 5.89568 11.8839 5.9796 11.9964 5.88853L15.0768 3.45639C15.1661 3.38675 15.1661 3.25282 15.0768 3.18318L11.9964 0.749247C11.8821 0.658175 11.7143 0.740318 11.7143 0.886747V2.64032H7C6.92143 2.64032 6.85714 2.7046 6.85714 2.78318V3.8546C6.85714 3.93318 6.92143 3.99746 7 3.99746Z" fill="currentColor" />
</svg>
</template>

View File

@ -0,0 +1,6 @@
<template>
<!-- Custom SVG icon -->
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.2854 8.10545H7.89259V1.7126C7.89259 1.63402 7.8283 1.56974 7.74973 1.56974H7.28545C6.34741 1.5682 5.41833 1.75216 4.55165 2.11103C3.68497 2.4699 2.89781 2.99659 2.23545 3.66081C1.58314 4.3111 1.06339 5.08193 0.705089 5.93045C0.332241 6.81052 0.140919 7.75681 0.142589 8.7126C0.141053 9.65063 0.32501 10.5797 0.683878 11.4464C1.04275 12.3131 1.56944 13.1002 2.23366 13.7626C2.88902 14.418 3.6533 14.934 4.5033 15.293C5.38337 15.6658 6.32966 15.8571 7.28545 15.8555C8.22348 15.857 9.15257 15.673 10.0192 15.3142C10.8859 14.9553 11.6731 14.4286 12.3354 13.7644C12.9908 13.109 13.5069 12.3447 13.8658 11.4947C14.2387 10.6147 14.43 9.66838 14.4283 8.7126V8.24831C14.4283 8.16974 14.364 8.10545 14.2854 8.10545ZM11.4587 12.9233C10.9057 13.472 10.2499 13.9061 9.52892 14.2009C8.80791 14.4957 8.03581 14.6453 7.25688 14.6412C5.68366 14.634 4.20509 14.018 3.09259 12.9055C1.97295 11.7858 1.35687 10.2965 1.35687 8.7126C1.35687 7.12867 1.97295 5.63938 3.09259 4.51974C4.06759 3.54474 5.32295 2.9501 6.6783 2.81438V9.31974H13.1837C13.0462 10.6822 12.4462 11.9447 11.4587 12.9233ZM15.8569 7.1126L15.8104 6.60903C15.6587 4.96438 14.9283 3.4126 13.7533 2.24117C12.5775 1.06759 11.0289 0.341284 9.37473 0.187596L8.86938 0.141167C8.78545 0.134025 8.71402 0.19831 8.71402 0.282239V7.14117C8.71402 7.21974 8.7783 7.28402 8.85688 7.28402L15.714 7.26617C15.7979 7.26617 15.864 7.19474 15.8569 7.1126ZM9.92473 6.07331V1.49117C11.0496 1.72661 12.0819 2.2837 12.8962 3.09474C13.7122 3.90902 14.2712 4.94474 14.5033 6.06081L9.92473 6.07331Z" fill="currentColor" />
</svg>
</template>

View File

@ -0,0 +1,6 @@
<template>
<!-- Custom SVG icon -->
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.1003 14.1183L10.4628 9.4808C11.1824 8.55045 11.5717 7.41295 11.5717 6.21652C11.5717 4.78438 11.0128 3.44152 10.0021 2.42902C8.99135 1.41652 7.64492 0.859375 6.21456 0.859375C4.78421 0.859375 3.43778 1.4183 2.42706 2.42902C1.41456 3.43973 0.857422 4.78438 0.857422 6.21652C0.857422 7.64688 1.41635 8.9933 2.42706 10.004C3.43778 11.0165 4.78242 11.5737 6.21456 11.5737C7.41099 11.5737 8.54671 11.1844 9.47707 10.4665L14.1146 15.1022C14.1282 15.1158 14.1443 15.1266 14.1621 15.134C14.1799 15.1414 14.1989 15.1452 14.2181 15.1452C14.2374 15.1452 14.2564 15.1414 14.2742 15.134C14.292 15.1266 14.3081 15.1158 14.3217 15.1022L15.1003 14.3254C15.1139 14.3118 15.1247 14.2957 15.132 14.2779C15.1394 14.2602 15.1432 14.2411 15.1432 14.2219C15.1432 14.2026 15.1394 14.1836 15.132 14.1658C15.1247 14.148 15.1139 14.1319 15.1003 14.1183ZM9.04314 9.04509C8.28599 9.80045 7.28242 10.2165 6.21456 10.2165C5.14671 10.2165 4.14314 9.80045 3.38599 9.04509C2.63064 8.28795 2.21456 7.28438 2.21456 6.21652C2.21456 5.14866 2.63064 4.1433 3.38599 3.38795C4.14314 2.63259 5.14671 2.21652 6.21456 2.21652C7.28242 2.21652 8.28778 2.6308 9.04314 3.38795C9.79849 4.14509 10.2146 5.14866 10.2146 6.21652C10.2146 7.28438 9.79849 8.28973 9.04314 9.04509Z" fill="currentColor" />
</svg>
</template>

View File

@ -0,0 +1,6 @@
<template>
<!-- Custom SVG icon -->
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.3712 10.033L14.2016 9.03304C14.257 8.69375 14.2855 8.34732 14.2855 8.00089C14.2855 7.65446 14.257 7.30804 14.2016 6.96875L15.3712 5.96875C15.4595 5.89323 15.5226 5.79264 15.5523 5.68035C15.5819 5.56807 15.5767 5.44942 15.5373 5.34018L15.5212 5.29375C15.1992 4.3938 14.7171 3.55953 14.098 2.83125L14.0659 2.79375C13.9908 2.70545 13.8907 2.64198 13.7788 2.61169C13.6669 2.58141 13.5485 2.58574 13.4391 2.62411L11.9873 3.14018C11.4516 2.70089 10.8534 2.35446 10.207 2.11161L9.92659 0.59375C9.90544 0.47954 9.85004 0.374469 9.76775 0.292496C9.68546 0.210524 9.58017 0.15553 9.46588 0.134821L9.41767 0.125893C8.48731 -0.0419643 7.50874 -0.0419643 6.57838 0.125893L6.53017 0.134821C6.41587 0.15553 6.31059 0.210524 6.2283 0.292496C6.146 0.374469 6.0906 0.47954 6.06945 0.59375L5.78731 2.11875C5.14604 2.36166 4.54886 2.7079 4.01945 3.14375L2.55695 2.62411C2.4476 2.58543 2.32908 2.58095 2.21712 2.61125C2.10516 2.64155 2.00508 2.7052 1.93017 2.79375L1.89802 2.83125C1.27971 3.56004 0.797622 4.39417 0.474808 5.29375L0.458737 5.34018C0.37838 5.56339 0.444451 5.81339 0.624808 5.96875L1.80874 6.97946C1.75338 7.31518 1.72659 7.65804 1.72659 7.99911C1.72659 8.34196 1.75338 8.68482 1.80874 9.01875L0.624808 10.0295C0.536586 10.105 0.473445 10.2056 0.44378 10.3179C0.414115 10.4301 0.419331 10.5488 0.458737 10.658L0.474808 10.7045C0.798023 11.6045 1.27659 12.4348 1.89802 13.167L1.93017 13.2045C2.00526 13.2928 2.10535 13.3562 2.21724 13.3865C2.32913 13.4168 2.44757 13.4125 2.55695 13.3741L4.01945 12.8545C4.55159 13.292 5.14624 13.6384 5.78731 13.8795L6.06945 15.4045C6.0906 15.5187 6.146 15.6237 6.2283 15.7057C6.31059 15.7877 6.41587 15.8427 6.53017 15.8634L6.57838 15.8723C7.51728 16.0411 8.47876 16.0411 9.41767 15.8723L9.46588 15.8634C9.58017 15.8427 9.68546 15.7877 9.76775 15.7057C9.85004 15.6237 9.90544 15.5187 9.92659 15.4045L10.207 13.8866C10.8531 13.6444 11.4547 13.2968 11.9873 12.858L13.4391 13.3741C13.5484 13.4128 13.667 13.4173 13.7789 13.387C13.8909 13.3567 13.991 13.293 14.0659 13.2045L14.098 13.167C14.7194 12.433 15.198 11.6045 15.5212 10.7045L15.5373 10.658C15.6177 10.4384 15.5516 10.1884 15.3712 10.033ZM12.9337 7.17946C12.9784 7.44911 13.0016 7.72589 13.0016 8.00268C13.0016 8.27946 12.9784 8.55625 12.9337 8.82589L12.8159 9.54197L14.1498 10.683C13.9476 11.1489 13.6923 11.5899 13.3891 11.9973L11.732 11.4098L11.1712 11.8705C10.7444 12.2205 10.2695 12.4955 9.75516 12.6884L9.07481 12.9438L8.75516 14.6759C8.25083 14.733 7.74165 14.733 7.23731 14.6759L6.91767 12.9402L6.24267 12.6813C5.73374 12.4884 5.26052 12.2134 4.83731 11.8652L4.27659 11.4027L2.60874 11.9955C2.30517 11.5866 2.05159 11.1455 1.84802 10.6813L3.19624 9.52946L3.08017 8.81518C3.03731 8.54911 3.01409 8.27411 3.01409 8.00268C3.01409 7.72946 3.03552 7.45625 3.08017 7.19018L3.19624 6.47589L1.84802 5.32411C2.04981 4.85804 2.30517 4.41875 2.60874 4.00982L4.27659 4.60268L4.83731 4.14018C5.26052 3.79196 5.73374 3.51696 6.24267 3.32411L6.91945 3.06875L7.23909 1.33304C7.74088 1.27589 8.25338 1.27589 8.75695 1.33304L9.07659 3.06518L9.75695 3.32054C10.2695 3.51339 10.7462 3.78839 11.173 4.13839L11.7337 4.59911L13.3909 4.01161C13.6945 4.42054 13.948 4.86161 14.1516 5.32589L12.8177 6.46696L12.9337 7.17946ZM7.99981 4.68125C6.26409 4.68125 4.85695 6.08839 4.85695 7.82411C4.85695 9.55982 6.26409 10.967 7.99981 10.967C9.73552 10.967 11.1427 9.55982 11.1427 7.82411C11.1427 6.08839 9.73552 4.68125 7.99981 4.68125ZM9.41409 9.23839C9.2286 9.42442 9.00815 9.57194 8.76543 9.67246C8.52271 9.77298 8.26252 9.82452 7.99981 9.82411C7.46588 9.82411 6.96409 9.61518 6.58552 9.23839C6.39949 9.0529 6.25198 8.83245 6.15146 8.58973C6.05094 8.34701 5.9994 8.08682 5.99981 7.82411C5.99981 7.29018 6.20874 6.78839 6.58552 6.40982C6.96409 6.03125 7.46588 5.82411 7.99981 5.82411C8.53374 5.82411 9.03552 6.03125 9.41409 6.40982C9.60012 6.59532 9.74764 6.81577 9.84816 7.05848C9.94868 7.3012 10.0002 7.5614 9.99981 7.82411C9.99981 8.35804 9.79088 8.85982 9.41409 9.23839Z" fill="currentColor" />
</svg>
</template>

View File

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

View File

@ -1,5 +1,5 @@
<template> <template>
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.4899 7.76897L0.552358 0.279682C0.491643 0.249325 0.422 0.242182 0.355929 0.258253C0.282599 0.276381 0.219441 0.322828 0.180282 0.387423C0.141124 0.452017 0.129156 0.529497 0.147 0.602896L1.68629 6.89218C1.7095 6.98682 1.77914 7.06361 1.872 7.09397L4.5095 7.99932L1.87379 8.90468C1.78093 8.93682 1.71129 9.01182 1.68986 9.10647L0.147 15.4047C0.130929 15.4708 0.138072 15.5404 0.168429 15.5993C0.238072 15.7404 0.4095 15.7975 0.552358 15.7279L15.4899 8.28147C15.5452 8.25468 15.5899 8.20825 15.6184 8.15468C15.6881 8.01182 15.6309 7.8404 15.4899 7.76897ZM1.90771 13.6154L2.80593 9.94397L8.07736 8.13504C8.11843 8.12075 8.15236 8.08861 8.16664 8.04575C8.19164 7.97075 8.15236 7.8904 8.07736 7.86361L2.80593 6.05647L1.91129 2.39932L13.1256 8.02254L1.90771 13.6154Z" fill="white"/> <path d="M15.4899 7.76897L0.552358 0.279682C0.491643 0.249325 0.422 0.242182 0.355929 0.258253C0.282599 0.276381 0.219441 0.322828 0.180282 0.387423C0.141124 0.452017 0.129156 0.529497 0.147 0.602896L1.68629 6.89218C1.7095 6.98682 1.77914 7.06361 1.872 7.09397L4.5095 7.99932L1.87379 8.90468C1.78093 8.93682 1.71129 9.01182 1.68986 9.10647L0.147 15.4047C0.130929 15.4708 0.138072 15.5404 0.168429 15.5993C0.238072 15.7404 0.4095 15.7975 0.552358 15.7279L15.4899 8.28147C15.5452 8.25468 15.5899 8.20825 15.6184 8.15468C15.6881 8.01182 15.6309 7.8404 15.4899 7.76897ZM1.90771 13.6154L2.80593 9.94397L8.07736 8.13504C8.11843 8.12075 8.15236 8.08861 8.16664 8.04575C8.19164 7.97075 8.15236 7.8904 8.07736 7.86361L2.80593 6.05647L1.91129 2.39932L13.1256 8.02254L1.90771 13.6154Z" fill="currentColor"/>
</svg> </svg>
</template> </template>

View File

@ -1,11 +1,14 @@
<template> <template>
<div> <div>
<div class="d-flex justify-space-between align-center" style="min-height: 80px;"> <div class="d-flex justify-space-between align-center pb-5" >
<span class="txt custom-title-4-new">Data Set TAG 연결 정보</span> <!-- <span class="txt custom-title-4">Data Set TAG 연결 정보</span> -->
<v-card-title class="pa-0">
Data Set TAG 연결 정보
</v-card-title>
<Buttons :parentPrgmId="parentPrgmId" :bindingData="gridName" :detailList="detailDataSetTagList" <Buttons :parentPrgmId="parentPrgmId" :bindingData="gridName" :detailList="detailDataSetTagList"
:btnActionsFnc="btnActions" /> :btnActionsFnc="btnActions" />
</div> </div>
<div ref="gridParent"> <div ref="gridParent" style="min-height: 30vh;">
<Grid :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName" :parentPrgmId="parentPrgmId" <Grid :ref="gridName" :is="loadGrid ? 'Grid' : null" :gridName="gridName" :parentPrgmId="parentPrgmId"
@getRowsData="getRowData" :innerTabGridInfo="innerTabGridInfo" /> @getRowsData="getRowData" :innerTabGridInfo="innerTabGridInfo" />
</div> </div>
@ -14,22 +17,20 @@
@gridEditingFinish="gridEditingFinish" /> @gridEditingFinish="gridEditingFinish" />
</div> </div>
<div ref="formParent" style="min-height: 100px;" class="w100 h100"> <div ref="formParent" class="h100">
<v-row ref="contents" class="w100"> <v-row align="end" ref="contents" class="">
<v-col :cols="6"> <v-col>
<component :is="'Datepicker'" :parentPrgmId="parentPrgmId" :label="'검색기간'" :labelCols="12" :textCols="12" /> <component :is="'Datepicker'" :parentPrgmId="parentPrgmId" :label="'검색기간'" :labelCols="12" :textCols="12" />
</v-col> </v-col>
<v-col :cols="4"> <v-col >
<component :is="'selectCodeList'" :parentPrgmId="parentPrgmId" :label="'주기'" dataKey="mdlDataTerm" <component :is="'selectCodeList'" :parentPrgmId="parentPrgmId" :label="'주기'" dataKey="mdlDataTerm"
:sendParam="{ commGrpCd: 'MDL_DATA_TERM', useFg: '1' }" :addAll="false" :labelCols="12" :textCols="12" :iconShow="true" /> :sendParam="{ commGrpCd: 'MDL_DATA_TERM', useFg: '1' }" :addAll="false" :labelCols="12" :textCols="12" :iconShow="true" />
</v-col> </v-col>
<v-col class="text-right align-self-end">
<a-button @click="jamoviProcClickEvent('view1')" type="primary" :ripple="false" class="mr-1">데이터 분석</a-button>
</v-col>
<!-- <v-card class="searchFilter w100">
<v-row align="center" no-gutters>
</v-row> </v-row>
</v-card> --> <v-row align="center" no-gutters class="searchFilter mt-2">
<v-col class="d-flex justify-end">
<a-button @click="jamoviProcClickEvent('view1')" type="primary" :ripple="false" class="mb-1">데이터 분석</a-button>
</v-col>
</v-row> </v-row>
</div> </div>
</div> </div>
@ -38,8 +39,6 @@
import { mapState, mapMutations, mapActions } from 'vuex'; import { mapState, mapMutations, mapActions } from 'vuex';
import Buttons from '~/components/common/button/Buttons'; import Buttons from '~/components/common/button/Buttons';
import Grid from '~/components/common/Grid'; import Grid from '~/components/common/Grid';
import { CustumChecbox } from '~/plugins/gridUtility';
import { CustomNumberEditor } from '~/plugins/gridUtility';
import Form from '~/components/common/form/Form'; import Form from '~/components/common/form/Form';
import mixinGlobal from '@/mixin/global.js'; import mixinGlobal from '@/mixin/global.js';
import Utility from '~/plugins/utility'; import Utility from '~/plugins/utility';
@ -66,21 +65,9 @@ export default {
}, },
data() { data() {
return { return {
loadGrid: true, loadGrid: false,
gridName: 'rowDataSetTagRelGrid', gridName: 'rowDataSetTagRelGrid',
detailDataSetTagList: myDataSetTagDetail, detailDataSetTagList: myDataSetTagDetail,
dataPathMock: {
"rowDataSetTagRelGrid": {
column: [
{ header: 'TAG ID', name: 'id', headerAlign: 'left' },
{ header: 'TAG 명', name: 'name', headerAlign: 'left' },
{ header: '모델 Data 구분', name: 'type', headerAlign: 'left' }
],
data: dataPathDataExample,
defaultRow: dataPathDataExample,
option: {}
}
},
}; };
}, },
computed: { computed: {
@ -128,8 +115,6 @@ export default {
const gridHeight = this.$refs['gridParent'].offsetHeight - 36; const gridHeight = this.$refs['gridParent'].offsetHeight - 36;
const myOptions = { const myOptions = {
// bodyHeight: gridHeight,
// minBodyHeight: gridHeight,
header: { header: {
height: 28, height: 28,
}, },
@ -137,14 +122,9 @@ export default {
minRowHeight: 29, minRowHeight: 29,
selectionUnit: 'row', selectionUnit: 'row',
editingEvent: 'click', editingEvent: 'click',
// columnOptions: {
// resizable: true,
// minWidth: 100
// }
}; };
this.setGridOption({ this.setGridOption({
gridKey: this.gridName, gridKey: this.gridName,
// value: myOptions
value: Object.assign(Utility.defaultGridOption(gridHeight), myOptions), value: Object.assign(Utility.defaultGridOption(gridHeight), myOptions),
}); });
@ -163,7 +143,7 @@ export default {
{ {
header: '모델 Data 구분', header: '모델 Data 구분',
name: 'mdlDataTypeCd', name: 'mdlDataTypeCd',
align: 'center', align: 'left',
width: 120, width: 120,
formatter({ value }) { formatter({ value }) {
var retVal = ''; var retVal = '';
@ -180,8 +160,8 @@ export default {
{ {
header: '사용여부', header: '사용여부',
name: 'useFg', name: 'useFg',
align: 'center', align: 'left',
width: 100, minWidth: 80,
formatter({ value }) { formatter({ value }) {
value = value === true ? '1' : '0'; value = value === true ? '1' : '0';
const newValue = _this.pageData.useFgList.filter( const newValue = _this.pageData.useFgList.filter(
@ -196,7 +176,7 @@ export default {
// } // }
// } // }
}, },
{ header: '비고', name: 'rmrk', align: 'center' }, { header: '비고', name: 'rmrk', align: 'left', minWidth: 50, },
]; ];
this.setGridColumn({ this.setGridColumn({
@ -204,16 +184,11 @@ export default {
value: myColumns, value: myColumns,
}); });
this.$nextTick(() => {
this.loadGrid = true; this.loadGrid = true;
})
}, },
async getRowData(data, gridName) { async getRowData(data, gridName) {
// if (data.rowStat === 'I') {
// this.detailDataSetTagList[0].disabled = false;
// this.detailDataSetTagList[1].disabled = false;
// } else {
// this.detailDataSetTagList[0].disabled = true;
// this.detailDataSetTagList[1].disabled = true;
// }
this.setGridSelectData({ this.setGridSelectData({
gridKey: gridName, gridKey: gridName,
gridSelect: true, gridSelect: true,
@ -225,7 +200,7 @@ export default {
let dataArr = []; let dataArr = [];
switch (action) { switch (action) {
case 'add': case 'add':
console.log('add this.pageData : '); // , this.pageData); // console.log('add this.pageData : '); // , this.pageData);
const defaultRow = { const defaultRow = {
dataSetId: this.pageData.dataSetId, dataSetId: this.pageData.dataSetId,
dataSetNm: this.pageData.dataSetNm, dataSetNm: this.pageData.dataSetNm,
@ -308,7 +283,7 @@ export default {
comId: this.selectedComId, comId: this.selectedComId,
dataSetId: this.selectedDataSetId, dataSetId: this.selectedDataSetId,
}; };
console.log('data : ', data); // console.log('data : ', data);
this.$emit('jamoviClickEvent', 'view1', data); this.$emit('jamoviClickEvent', 'view1', data);
}, },
}, },
@ -335,7 +310,7 @@ const myDataSetTagDetail = [
valueNm: 'tagNm', valueNm: 'tagNm',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'py-2 mt-2', class: 'py-2 mt-1',
required: true, required: true,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
@ -361,12 +336,11 @@ const myDataSetTagDetail = [
valueNm: 'useFg', valueNm: 'useFg',
disabled: false, disabled: false,
cols: 5, cols: 5,
class: 'py-2 mt-2', class: 'py-2 mt-1',
value: { '1': true, '0': false }, value: { '1': true, '0': false },
required: true, required: true,
textCols: 12, textCols: 12,
iconShow: true, iconShow: true,
// class: "d-flex align-end"
}, },
{ {
type: 'TextArea', type: 'TextArea',
@ -380,23 +354,4 @@ const myDataSetTagDetail = [
required: false, required: false,
}, },
]; ];
const dataPathDataExample = [
{
id: 'INCHEON.HVAC.EQP_HT_CH001.UT_CH101.CHI_AMP_1A_PV',
name: 'INCHEON 고온 냉동기 101호기 - 호로1',
type: '합계'
},
{
id: 'INCHEON.HVAC.EQP_HT_CH001.UT_CH101.CHI_AMP_1A_PV',
name: 'INCHEON 고온 냉동기 101호기 - 호로1',
type: '합계'
},
{
id: 'INCHEON.HVAC.EQP_HT_CH001.UT_CH101.CHI_AMP_1A_PV',
name: 'INCHEON 고온 냉동기 101호기 - 호로1',
type: '합계'
},
];
</script> </script>

View File

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

View File

@ -4,14 +4,14 @@
class="d-flex justify-space-between align-center" class="d-flex justify-space-between align-center"
style="height: 80px;" style="height: 80px;"
> >
<span class="txt custom-title-4-new">공정 입출력 정보</span> <span class="txt custom-subtitle-tab">공정 입출력 정보</span>
<Buttons <Buttons
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
:bindingData="gridName" :bindingData="gridName"
:btnActionsFnc="btnActions" :btnActionsFnc="btnActions"
/> />
</div> </div>
<div ref="gridParent" style="height: calc(100vh - 760px);"> <div ref="gridParent" style="height: calc(90vh - 700px);">
<component <component
:ref="gridName" :ref="gridName"
:is="loadGrid ? 'Grid' : null" :is="loadGrid ? 'Grid' : null"
@ -19,10 +19,9 @@
:parentPrgmId="parentPrgmId" :parentPrgmId="parentPrgmId"
@getRowsData="getRowData" @getRowsData="getRowData"
:innerTabGridInfo="innerTabGridInfo" :innerTabGridInfo="innerTabGridInfo"
:dataPath="dataPathMock"
/> />
</div> </div>
<div> <div style="height: 25vh;" class="mt-5">
<component <component
:is="'Form'" :is="'Form'"
:bindingData="gridName" :bindingData="gridName"
@ -60,24 +59,11 @@ export default {
}, },
data() { data() {
return { return {
loadGrid: true, loadGrid: false,
gridName: 'rowEccIaoGrid', gridName: 'rowEccIaoGrid',
inputList_emMapDiv: [], inputList_emMapDiv: [],
inputList_cmInOut: [], inputList_cmInOut: [],
detailList: myDetail, detailList: myDetail,
dataPathMock: {
"rowEccIaoGrid": {
column: [
{ header: '검침 대상 ID', name: 'readObjId', align: 'left' },
{ header: '검침 대상 명', name: 'readObjNm', align: 'left' },
{ header: '검침 대상 유형', name: 'readObjKind', align: 'left' },
{ header: '그룹', name: 'grpCd', align: 'left' },
],
data: dataPathDataExample,
defaultRow: dataPathDataExample,
option: {}
}
},
}; };
}, },
computed: { computed: {
@ -112,16 +98,16 @@ export default {
watch: { watch: {
selectedObjId(val) { selectedObjId(val) {
if (val === 'TAG') { if (val === 'TAG') {
this.detailList[2].class = 'py-2 d-none'; this.detailList[1].class = 'd-none ';
this.detailList[3].class = 'py-2 d-none'; this.detailList[2].class = 'd-block pl-4 mt-2';
this.detailList[4].class = 'py-2'; this.detailList[3].class = 'd-block';
this.detailList[5].class = 'py-2'; this.detailList[4].class = 'pl-4 mt-2';
} else { } else {
// }else if(val==="READ_PLC"){ // }else if(val==="READ_PLC"){
this.detailList[5].class = 'py-2 d-none'; this.detailList[4].class = 'pl-4 mt-2';
this.detailList[4].class = 'py-2 d-none'; this.detailList[3].class = 'd-block';
this.detailList[3].class = 'py-2'; this.detailList[2].class = 'd-none';
this.detailList[2].class = 'py-2'; this.detailList[1].class = 'd-block pl-4 mt-1 pb-0';
} }
}, },
}, },
@ -202,6 +188,7 @@ export default {
{ header: '대상 명', name: 'objNm', width: 300, align: 'left' }, { header: '대상 명', name: 'objNm', width: 300, align: 'left' },
{ {
header: '에너지원 명', header: '에너지원 명',
width: 150,
name: 'ercId', name: 'ercId',
align: 'left', align: 'left',
formatter({ value }) { formatter({ value }) {
@ -218,8 +205,9 @@ export default {
}, },
{ {
header: '대상 유형', header: '대상 유형',
width: 150,
name: 'objKind', name: 'objKind',
align: 'center', align: 'left',
formatter({ value }) { formatter({ value }) {
var retVal = ''; var retVal = '';
@ -235,7 +223,8 @@ export default {
{ {
header: '투입 생산 유형', header: '투입 생산 유형',
name: 'inProdKind', name: 'inProdKind',
align: 'center', width: 150,
align: 'left',
formatter({ value }) { formatter({ value }) {
var retVal = ''; var retVal = '';
@ -251,7 +240,8 @@ export default {
{ {
header: '계산 여부', header: '계산 여부',
name: 'calcFg', name: 'calcFg',
align: 'center', width: 150,
align: 'left',
formatter({ value }) { formatter({ value }) {
value = value === true ? '1' : '0'; value = value === true ? '1' : '0';
const newValue = _this.pageData.useFgList.filter( const newValue = _this.pageData.useFgList.filter(
@ -261,7 +251,7 @@ export default {
// return value === true ? "사용" : "사용안함"; // return value === true ? "사용" : "사용안함";
}, },
}, },
{ header: '분배율(1~100)', name: 'distRt', align: 'right' }, { header: '분배율(1~100)', name: 'distRt', align: 'right', width: 150 },
{ header: '사업장', name: 'blocId', align: 'center', hidden: true }, { header: '사업장', name: 'blocId', align: 'center', hidden: true },
{ header: '등록 사용자', name: 'regUserNo', hidden: true }, { header: '등록 사용자', name: 'regUserNo', hidden: true },
{ header: '등록 일자', name: 'regDttm', hidden: true }, { header: '등록 일자', name: 'regDttm', hidden: true },
@ -280,12 +270,14 @@ export default {
async getRowData(data, gridName) { async getRowData(data, gridName) {
if (data.rowStat === 'I') { if (data.rowStat === 'I') {
this.detailList[0].disabled = false; this.detailList[0].disabled = false;
this.detailList[1].disabled = false;
this.detailList[2].disabled = false; this.detailList[2].disabled = false;
this.detailList[3].disabled = false; this.detailList[3].disabled = false;
this.detailList[4].disabled = false; this.detailList[4].disabled = false;
this.detailList[5].disabled = false; this.detailList[5].disabled = false;
} else { } else {
this.detailList[0].disabled = true; this.detailList[0].disabled = true;
this.detailList[1].disabled = true;
this.detailList[2].disabled = true; this.detailList[2].disabled = true;
this.detailList[3].disabled = true; this.detailList[3].disabled = true;
this.detailList[4].disabled = true; this.detailList[4].disabled = true;
@ -304,6 +296,7 @@ export default {
case 'add': case 'add':
this.$refs[this.gridName].addRow(); this.$refs[this.gridName].addRow();
this.detailList[0].disabled = false; this.detailList[0].disabled = false;
this.detailList[1].disabled = false;
this.detailList[2].disabled = false; this.detailList[2].disabled = false;
this.detailList[3].disabled = false; this.detailList[3].disabled = false;
this.detailList[4].disabled = false; this.detailList[4].disabled = false;
@ -386,9 +379,8 @@ const myDetail = [
{ {
type: 'SelectBox', type: 'SelectBox',
label: '대상 유형', label: '대상 유형',
disabled: false,
cols: 6, cols: 6,
class: 'py-2 pr-4', class: 'pr-4 py-2 mt-1',
list: 'emMapDivList', list: 'emMapDivList',
valueNm: 'objKind', valueNm: 'objKind',
itemText: 'commCdNm', itemText: 'commCdNm',
@ -402,34 +394,16 @@ const myDetail = [
{ {
type: 'ReadPlcPop', type: 'ReadPlcPop',
label: '대상 항목', label: '대상 항목',
modalTitle:'대상 항목',
valueNm: 'objId', valueNm: 'objId',
disabled: false, disabled: true,
cols: 6, cols: 6,
class: 'pt-2 pb-0 mb-0 pl-4', class: 'pl-4 py-2',
required: true, required: true,
bindNm: 'objNm', bindNm: 'objNm',
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
iconShow: true, disableContent: true,
noText: true,
iconShow: true,
},
{
// 공백 처리
type: 'Label',
cols: 6,
class: 'py-2 pr-4',
disabled: false,
},
{
type: 'InputText',
valueNm: 'objNm',
readonly: true,
disabled: true,
cols: 6,
class: 'pl-4',
labelCols: 12,
textCols: 12,
iconShow: true, iconShow: true,
}, },
{ {
@ -442,16 +416,23 @@ const myDetail = [
disabled: true, disabled: true,
required: true, required: true,
cols: 6, cols: 6,
class: 'd-none pr-4', class: 'd-none pr-4 py-2',
disableContent: true, disableContent: true,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
iconShow: true, iconShow: true,
}, },
{
// 공백 처리
type: 'Label',
cols: 6,
class: 'py-2 pr-4',
disabled: false,
},
{ {
type: 'InputText', type: 'InputText',
cols: 6, cols: 6,
class: 'd-none pt-0 pl-4', class: 'pt-0 pl-4 mt-2 py-2',
valueNm: 'objNm', valueNm: 'objNm',
readonly: true, readonly: true,
disabled: true, disabled: true,
@ -464,7 +445,7 @@ const myDetail = [
label: '에너지원', label: '에너지원',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
list: 'ercNmList', list: 'ercNmList',
valueNm: 'ercId', valueNm: 'ercId',
itemText: 'text', itemText: 'text',
@ -479,7 +460,7 @@ const myDetail = [
label: '투입생산유형', label: '투입생산유형',
disabled: false, disabled: false,
cols: 6, cols: 6,
class: 'py-2 pl-4', class: 'py-2 pl-4 mt-2',
list: 'cmInoutList', list: 'cmInoutList',
valueNm: 'inProdKind', valueNm: 'inProdKind',
itemText: 'commCdNm', itemText: 'commCdNm',
@ -492,7 +473,7 @@ const myDetail = [
{ {
type: 'CheckBox', type: 'CheckBox',
cols: 6, cols: 6,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
label: '계산 여부', label: '계산 여부',
valueNm: 'calcFg', valueNm: 'calcFg',
disabled: false, disabled: false,
@ -509,19 +490,18 @@ const myDetail = [
valueNm: 'distRt', valueNm: 'distRt',
readonly: false, readonly: false,
cols: 6, cols: 6,
class: 'py-2 pl-4', class: 'py-2 pl-4 mt-2',
required: true, required: true,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
iconShow: true, iconShow: true,
}, },
]; ];
const dataPathDataExample = [
{
readObjId: 'OBJ001',
readObjNm: '서울 본사',
readObjKind: 'TYPE01',
grpCd: 'GRP01',
},
]
</script> </script>
<style lang="scss" scoped>
::v-deep{
.tui-grid-layer-state{
top: 40px !important;
}
}
</style>

View File

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

View File

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

View File

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

View File

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

View File

@ -6,7 +6,7 @@
<v-row> <v-row>
<v-col :cols="8" style="padding:0px"> <v-col :cols="8" style="padding:0px">
<!-- 조회기간 --> <!-- 조회기간 -->
<DatePicker :parentPrgmId="parentPrgmId" label="조회기간" /> <DatePicker :parentPrgmId="parentPrgmId" label="조회기간" customClass="tab-datepicker" />
</v-col> </v-col>
<v-col cols="4" class="d-flex justify-end align-center"> <v-col cols="4" class="d-flex justify-end align-center">
<Buttons <Buttons
@ -20,6 +20,12 @@
</v-card> </v-card>
</v-col> </v-col>
</v-row> </v-row>
<!-- Create the line between date picker and form -->
<v-row class="mt-6 mb-7" no-gutters>
<v-col>
<div style="height: 1px; background-color: #0000000F;"></div>
</v-col>
</v-row>
<v-row class="search-box" align="center" no-gutters style="height: 44px;"> <v-row class="search-box" align="center" no-gutters style="height: 44px;">
<v-col :cols="4"> <v-col :cols="4">
<label for="" class="search-box-label"> <label for="" class="search-box-label">
@ -37,7 +43,7 @@
<div <div
ref="gridParent" ref="gridParent"
class="w100" class="w100"
style="height: calc((100vh - 600px) / 2);" style="height: calc((100vh - 500px) / 2);"
> >
<Grid <Grid
:ref="gridName" :ref="gridName"
@ -51,7 +57,7 @@
</div> </div>
</v-col> </v-col>
</v-row> </v-row>
<v-row class="search-box" align="center" no-gutters style="height: 44px;"> <v-row class="search-box mt-2" align="center" no-gutters style="height: 44px;">
<v-col :cols="4"> <v-col :cols="4">
<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"
@ -71,7 +77,7 @@
<div <div
ref="chartParent" ref="chartParent"
class="h100 w100" class="h100 w100"
style="height: calc((100vh - 600px) / 2 - 30px);" style="height: calc((100vh - 500px) / 2);"
> >
<component <component
class="w100 h100" class="w100 h100"
@ -199,8 +205,8 @@ export default {
header: { header: {
height: 38, height: 38,
}, },
rowHeight: 29, rowHeight: 37,
minRowHeight: 29, minRowHeight: 37,
selectionUnit: 'row', selectionUnit: 'row',
editingEvent: 'click', editingEvent: 'click',
}; };
@ -372,3 +378,20 @@ function numberFormatter({ value }) {
return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
} }
</script> </script>
<style lang="scss" scoped>
::v-deep {
.tab-datepicker {
width: 64% !important;
}
.tui-grid-layer-state {
top: 40px !important;
}
.tui-grid-layer-selection,
.tui-grid-cell-content-editor{
height: 36px !important;
// border: none;
}
}
</style>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -9,7 +9,6 @@
<div class="lnb-logo"> <div class="lnb-logo">
<img v-if="isDarkMode" src="@/assets/images/logo_dm.png" /> <img v-if="isDarkMode" src="@/assets/images/logo_dm.png" />
<img v-else src="@/assets/images/logo_lm.png" /> <img v-else src="@/assets/images/logo_lm.png" />
<!-- <img v-else src="@/assets/images/logo_lm.png" /> -->
</div> </div>
<!-- <div class="lnb-logo">FEMS</div>--> <!-- <div class="lnb-logo">FEMS</div>-->
</router-link> </router-link>
@ -62,10 +61,10 @@
</v-list-item> </v-list-item>
</v-list> </v-list>
</v-menu> </v-menu>
<a-button id="refresh" class="btn-header" @click="removeBookMark" v-if="bookmarkBtn == 1"> <a-button id="removeBm" class="btn-header" @click="removeBookMark" v-if="bookmarkBtn == 1">
<span class="material-icons" style="font-size: 17px">star</span> <span class="material-icons" style="font-size: 17px">star</span>
</a-button> </a-button>
<a-button id="refresh" class="btn-header" :style="{ <a-button id="addBm" class="btn-header" :style="{
display: 'flex', display: 'flex',
alignItems: 'center'}" @click="addBookMark" v-if="bookmarkBtn == 0"> alignItems: 'center'}" @click="addBookMark" v-if="bookmarkBtn == 0">
<span class="material-icons" style="font-size: 17px">star_border</span> <span class="material-icons" style="font-size: 17px">star_border</span>
@ -88,74 +87,58 @@
</v-row> </v-row>
</div> </div>
<v-main> <v-main>
<v-container fluid> <v-container fluid>
<v-row class="flex-nowrap"> <v-row class="flex-nowrap">
<div class="menu-container"> <div class="menu-container">
<v-navigation-drawer ref="navigationdrawer" :value="drawer" :mini-variant="miniVariant" :clipped="clipped" <v-navigation-drawer ref="navigationdrawer"
:absolute="false" mini-variant-width="60"> class="pt-2"
:clipped="clipped"
<div class="d-flex align-center justify-space-between py-4 px-3" v-if="false"> :absolute="false"
<router-link class="home" :to="myHome.root"> :mini-variant="miniVariant"
<div class="lnb-logo"> :value="drawer"
<img v-if="isDarkMode" src="@/assets/images/logo_dm.png" /> mini-variant-width="260"
<img v-else src="@/assets/images/logo_lm.png" /> >
</div>
<!-- <div class="lnb-logo">FEMS</div>-->
</router-link>
<ThemeSwitch style="margin-right: 20px" />
<v-app-bar-nav-icon ref="appbarnavicon" id="appbarnavicon" @click.stop="miniVariant = !miniVariant"
@click="updateTreeview" :style="{
backgroundColor: 'transparent',
color: isDarkMode ? '#fff' : '#111',
}" />
<!-- <router-view :key="$route.fullPath"/> -->
</div>
<!--
v-model="treeValue"
return-object
@input="treeModel"
@update:active="clkTab"
-->
<AdminMenu :miniVariant="miniVariant" :userNm="this.userInfo.userNm" :comId="this.userInfo.comId" v-if="false" />
<component ref="changePswdPop" :is="'ChangePswdPop'" v-show="false" :comId="this.userInfo.comId" /> <component ref="changePswdPop" :is="'ChangePswdPop'" v-show="false" :comId="this.userInfo.comId" />
<v-treeview ref="treeview" :active.sync="activeTree" active-class="v-treeview-node--active" <v-treeview ref="treeview" :active.sync="activeTree" active-class="v-treeview-node--active"
:items="treevieItems" activatable hoverable color="#3896ff" open-on-click @update:open="openNode"> :items="treevieItems" activatable hoverable color="#3896ff" open-on-click @update:open="openNode">
<template slot="label" slot-scope="{ item }"> <template slot="label" slot-scope="{ item }">
<button :class="{ 'justify-center': miniVariant }" @mouseover="doMouseOver"> <button :class="{ 'justify-center': miniVariant }" @mouseover="doMouseOver">
<v-icon v-if="item.lvl === 1 && menuIconKeys.includes(item.menuId)"
v-text="menuIconById[item.menuId]" :class="{ 'mr-2': !miniVariant }" size="20"></v-icon> <v-icon
<v-icon v-else-if="item.lvl === 1 && !menuIconKeys.includes(item.menuId)" v-if="item.lvl === 1 && menuIconKeys.includes(item.menuId)"
:class="{ 'mr-2': !miniVariant }" size="20">mdi-package-variant-closed</v-icon> :class="{ 'mr-2': !miniVariant }"
<v-icon v-else-if="item.lvl === 2" :class="{ 'mr-2': !miniVariant }" size="10"> size="14"
v-text="menuIconById[item.menuId]"
></v-icon>
<v-icon
v-else-if="item.lvl === 1 && !menuIconKeys.includes(item.menuId)"
:class="{ 'mr-2': !miniVariant }"
size="14">mdi-package-variant-closed</v-icon>
<v-icon
v-else-if="item.lvl === 2" :class="{ 'mr-2': !miniVariant }"
size="8">
mdi-checkbox-blank mdi-checkbox-blank
</v-icon> </v-icon>
<v-icon v-else-if="item.lvl >= 3 && item.childeVo.length === 0 && item.url" <v-icon
:class="miniVariant === false ? 'mr-2' : ''" size="9"> v-else-if="item.lvl >= 3 && item.childeVo.length === 0 && item.url"
:class="miniVariant === false ? 'mr-2' : ''"
size="8">
$depth3rdBulletDark $depth3rdBulletDark
</v-icon> </v-icon>
<span v-if="item.url">{{ item.menuNm }} <span v-if="item.url">
{{ item.menuNm }}
<!-- <span v-if="item.bookmark" class="material-icons" style="font-size: 17px; vertical-align: middle;" @click="addBookMark(item.menuId, item.url, item.bookmark)">star</span> <!-- <span v-if="item.bookmark" class="material-icons" style="font-size: 17px; vertical-align: middle;" @click="addBookMark(item.menuId, item.url, item.bookmark)">star</span>
<span v-else-if="!item.bookmark" class="material-icons" style="font-size: 17px; vertical-align: middle;" @click="addBookMark(item.menuId, item.url, item.bookmark)">star_border</span> --> <span v-else-if="!item.bookmark" class="material-icons" style="font-size: 17px; vertical-align: middle;" @click="addBookMark(item.menuId, item.url, item.bookmark)">star_border</span> -->
</span> </span>
<span v-else-if="!item.url">{{ item.menuNm }}</span> <span v-else-if="!item.url">{{ item.menuNm }}</span>
<v-icon v-if="item.lvl >= 1 && item.childeVo && item.childeVo.length > 0 && !item.url"> <!-- <v-icon v-if="item.lvl >= 1 && item.childeVo && item.childeVo.length > 0 && !item.url">
mdi-chevron-down mdi-chevron-down
</v-icon> </v-icon> -->
<a-icon type="down" v-if="item.lvl >= 1 && item.childeVo && item.childeVo.length > 0 && !item.url" />
</button> </button>
</template> </template>
</v-treeview> </v-treeview>
<!-- <template #append>
<p
class="text-caption"
:style="{ letterSpacing: '-0.2px !important' }"
>
&copy; 2022. SK C&C all rights reserved.
</p>
</template> -->
</v-navigation-drawer> </v-navigation-drawer>
</div> </div>
@ -322,19 +305,6 @@
</div> </div>
</div> </div>
</v-main> </v-main>
<!-- <v-footer
:absolute="!fixed"
app
:class="
drawer
? miniVariant
? 'drawerFooter miniFooter'
: 'drawerFooter'
: 'full-size'
"
>
<span>&copy; 2022. SK C&C all rights reserved.</span>
</v-footer> -->
</fullscreen> </fullscreen>
</v-app> </v-app>
</template> </template>
@ -345,6 +315,7 @@ import ThemeSwitch from "@/components/common/ThemeSwitch";
import AdminMenu from "@/components/common/AdminMenu"; import AdminMenu from "@/components/common/AdminMenu";
import FadeLoader from "vue-spinner/src/FadeLoader.vue"; import FadeLoader from "vue-spinner/src/FadeLoader.vue";
import ChangePswdPop from "~/components/common/modal/ChangePswdPop"; import ChangePswdPop from "~/components/common/modal/ChangePswdPop";
export default { export default {
components: { components: {
ThemeSwitch, ThemeSwitch,
@ -365,19 +336,17 @@ export default {
myPrgmId: null, myPrgmId: null,
treeValue: [], treeValue: [],
menuIconById: { menuIconById: {
// MNU0003: 'mdi-chart-line', MNU0110: "$anticonAppStore",
// MNU0004: 'mdi-alarm-light', MNU0002: "$anticonDesktop",
// MNU0005: 'mdi-pencil-box-outline', MNU0003: "$anticonDrag",
// MNU0006: 'mdi-cog-outline', MNU0091: "$anticonLineChart",
MNU0002: "mdi-monitor", MNU0102: "$anticonBulb",
MNU0091: "mdi-chart-box", MNU0103: "$anticonFileText",
MNU0102: "mdi-human-male-board-poll", MNU0104: "$anticonNoteExpand",
MNU0103: "mdi-file-chart-outline", MNU0106: "$anticonPieChart",
MNU0104: "mdi-chart-sankey-variant", MNU0105: "$anticonSearch",
MNU0106: "mdi-database-edit-outline", MNU0006: "$anticonMessage",
MNU0105: "mdi-chart-bell-curve", MNU0007: "$anticonSetting",
MNU0006: "mdi-bulletin-board",
MNU0007: "mdi-cog",
}, },
isLoading: false, isLoading: false,
loadingStackCnt: 0, loadingStackCnt: 0,
@ -833,7 +802,7 @@ export default {
// console.log('if isLoading stmt3'); // console.log('if isLoading stmt3');
// return; // return;
// } // }
alert("move to", url); // alert("move to", url);
this.$router.push({ this.$router.push({
path: url + "?prgmId=" + prgmId, path: url + "?prgmId=" + prgmId,
}); });
@ -876,21 +845,6 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
// @import '@/assets/scss/common.scss'; @import '@/assets/scss/layout.scss';
.loading {
z-index: 99;
position: fixed;
top: 50%;
left: 50%;
width: 100%;
height: 100%;
transform: translate(-50%, -50%);
background-color: rgba(0, 0, 0, 0.4);
//box-shadow: rgba(68, 67, 67, 0.9) 0 0 0 9999px;
}
.v-spinner {
top: 50%;
left: 50%;
}
</style> </style>

View File

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

View File

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

View File

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

View File

@ -57,7 +57,7 @@ module.exports = {
], ],
// Modules: https://go.nuxtjs.dev/config-modules // Modules: https://go.nuxtjs.dev/config-modules
modules: ['@nuxtjs/axios', '@nuxtjs/dayjs', '@nuxtjs/style-resources','@nuxtjs/google-fonts'], modules: ['@nuxtjs/axios', '@nuxtjs/dayjs', '@nuxtjs/style-resources' ],
styleResources: { styleResources: {
scss: ['./assets/scss/*.scss'], scss: ['./assets/scss/*.scss'],
}, },

View File

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

View File

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

View File

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

View File

@ -1,6 +1,7 @@
<template> <template>
<div class="l-layout"> <div class="l-layout">
<!-- 조회조견 --> <!-- 조회조견 -->
<CommonPageTitle />
<v-row ref="searchFilter"> <v-row ref="searchFilter">
<v-col :cols="12"> <v-col :cols="12">
<v-card class="searchFilter"> <v-card class="searchFilter">
@ -12,6 +13,8 @@
:parentPrgmId="myPrgmId" :parentPrgmId="myPrgmId"
:sendParam="{ comId }" :sendParam="{ comId }"
customClass="select-large" customClass="select-large"
:labelCols="12"
:textCols="12"
/> />
<!-- <component <!-- <component
:is="'selectCodeList'" :is="'selectCodeList'"
@ -79,7 +82,6 @@
@getRowsData="getRowData" @getRowsData="getRowData"
@sendSelectedRowStatInfo="getSelectedRowStatInfo" @sendSelectedRowStatInfo="getSelectedRowStatInfo"
:selectedRowDataWatchFlag="true" :selectedRowDataWatchFlag="true"
:dataPath="dataPathMock"
/> />
</div> </div>
</div> </div>
@ -88,7 +90,7 @@
<!-- 사용자 정보 --> <!-- 사용자 정보 -->
<v-col :cols="7" class="h100"> <v-col :cols="7" class="h100">
<v-card class="pb-5 h100"> <v-card class="pb-5 h100">
<v-card-title class="custom-title-4">사용자 정보</v-card-title> <v-card-title class="custom-title-4 pb-0">사용자 정보</v-card-title>
<div class="px-5" :style="{ height: 'calc(100% - 62.5px)' }"> <div class="px-5" :style="{ height: 'calc(100% - 62.5px)' }">
<v-tabs v-model="tab"> <v-tabs v-model="tab">
<v-tab <v-tab
@ -126,13 +128,13 @@
<!-- 역할수정 --> <!-- 역할수정 -->
<template v-else-if="item.id == 'AsgnRoleByUser'"> <template v-else-if="item.id == 'AsgnRoleByUser'">
<v-col :cols="3" class="h100"> <v-col :cols="12" class="overflow-y-scroll grid-toggle-section">
<v-card-title <v-card-title
class="pa-0 custom-title-4" class="pa-0 custom-subtitle-tab"
style="min-height:36px;" style="min-height:36px;"
>역할리스트</v-card-title >역할리스트</v-card-title
> >
<div style="height:calc(100% - 36px)" class="py-5"> <div class="py-5">
<component <component
class="w100" class="w100"
:is="loadGridTab2 ? 'Grid' : null" :is="loadGridTab2 ? 'Grid' : null"
@ -144,17 +146,18 @@
/> />
</div> </div>
</v-col> </v-col>
<v-col :cols="1" class="d-flex justify-center"> <v-col :cols="12" class="d-flex justify-center">
<ActionButtons <ActionButtons
:parentPrgmId="myPrgmId" :parentPrgmId="myPrgmId"
:leftGridName="gridName2" :leftGridName="gridName2"
:rightGridName="gridName3" :rightGridName="gridName3"
:btnActionsFnc="dualGridBtnActions" :btnActionsFnc="dualGridBtnActions"
directionBtn="vertically"
/> />
</v-col> </v-col>
<v-col :cols="8" class="h100"> <v-col :cols="12" class="h100">
<div class="d-flex align-center justify-space-between"> <div class="d-flex align-center justify-space-between">
<v-card-title class="pa-0 custom-title-4"> <v-card-title class="pa-0 custom-subtitle-tab">
사용자 역할</v-card-title 사용자 역할</v-card-title
> >
<div> <div>
@ -307,40 +310,10 @@ export default {
}, },
methods: { methods: {
async init() { async init() {
this.gridInit(); await this.gridInit();
}, },
gridInitTest() {
const rowGrid = {
column: [
{ header: '사용자No', name: 'userNo', align: 'center', hidden: true },
{ header: '사용자명', name: 'userNm' },
{ header: '사용자ID', name: 'userLoginId' },
{ header: '사용자비밀번호', name: 'userPswd', hidden: true },
{ header: '사업장', name: 'blocId', hidden: true },
{ header: 'email', name: 'email', hidden: true },
{ header: '등록자NO', name: 'regUserNo', hidden: true },
{ header: '등록일시', name: 'regDttm', hidden: true },
{ header: '수정자NO', name: 'procUserNo', hidden: true },
{ header: '수정일시', name: 'procDttm', hidden: true },
{ header: 'comId', name: 'comId', hidden: true },
{ header: 'deptId', name: 'deptId', hidden: true },
],
data: dataMockExample,
defaultRow: dataMockExample,
option: [],
}
this.dataPathMock = {rowGrid};
this.$nextTick(() => {
this.loadGrid = true;
});
},
// 사용자 리스트 그리드 세팅 // 사용자 리스트 그리드 세팅
gridInit() { gridInit() {
// this.gridInitTest(); return
const gridHeight = this.$refs.gridParent.offsetHeight - 90; const gridHeight = this.$refs.gridParent.offsetHeight - 90;
const myOptions = { const myOptions = {
@ -923,6 +896,7 @@ const defaultData = {
}; };
const myColumns = [ const myColumns = [
{ header: '사용자No', name: 'userNo', align: 'center', hidden: true }, { header: '사용자No', name: 'userNo', align: 'center', hidden: true },
{ header: '사용자명', name: 'userNm' }, { header: '사용자명', name: 'userNm' },
{ header: '사용자ID', name: 'userLoginId' }, { header: '사용자ID', name: 'userLoginId' },
@ -938,7 +912,7 @@ const myColumns = [
]; ];
const unAsgnRoleByUserColumns = [ const unAsgnRoleByUserColumns = [
{ header: '역할ID', name: 'roleId', align: 'center' }, { header: '역할ID', name: 'roleId', align: 'left' },
{ header: '역할명', name: 'roleNm' }, { header: '역할명', name: 'roleNm' },
{ header: '적용시작일', name: 'aplyStartDt', hidden: true }, { header: '적용시작일', name: 'aplyStartDt', hidden: true },
{ header: '적용종료일', name: 'aplyEndDt', hidden: true }, { header: '적용종료일', name: 'aplyEndDt', hidden: true },
@ -947,7 +921,7 @@ const unAsgnRoleByUserColumns = [
]; ];
const asgnRoleByUserColumns = [ const asgnRoleByUserColumns = [
{ header: '역할ID', name: 'roleId', align: 'center' }, { header: '역할ID', name: 'roleId', align: 'left' },
{ header: '역할명', name: 'roleNm' }, { header: '역할명', name: 'roleNm' },
{ {
header: '적용시작일', header: '적용시작일',
@ -960,7 +934,19 @@ const asgnRoleByUserColumns = [
{ header: 'comId', name: 'comId', hidden: true }, { header: 'comId', name: 'comId', hidden: true },
]; ];
const asgnMenuByUserColumns = [{ header: '메뉴명', name: 'menuNm' }]; const asgnMenuByUserColumns = [
{
header: '',
name: '',
align: 'center',
width: 50,
formatter: (props) => {
return `<label class="custom-radio">
<span class="radio-mark"></span>
</label>`;
}
},
{ header: '메뉴명', name: 'menuNm' }];
const myDetail = blocCdList => { const myDetail = blocCdList => {
return [ return [
@ -973,7 +959,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
iconShow: true, iconShow: true,
required: false, required: false,
placeholder: '시스템 자동입력', placeholder: '시스템 자동입력',
@ -985,7 +971,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pl-4 mt-2',
iconShow: true, iconShow: true,
required: true, required: true,
}, },
@ -998,8 +984,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
iconShow: true,
required: true, required: true,
}, },
{ {
@ -1009,7 +994,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pl-4 mt-2',
iconShow: true, iconShow: true,
required: true, required: true,
}, },
@ -1020,7 +1005,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
iconShow: true, iconShow: true,
list: blocCdList.map(item => ({ list: blocCdList.map(item => ({
text: item.blocNm, text: item.blocNm,
@ -1035,7 +1020,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pl-4 mt-2',
iconShow: true, iconShow: true,
}, },
{ {
@ -1046,7 +1031,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
iconShow: true, iconShow: true,
placeholder: '시스템 자동입력', placeholder: '시스템 자동입력',
}, },
@ -1058,7 +1043,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pl-4 mt-2',
iconShow: true, iconShow: true,
placeholder: '시스템 자동입력', placeholder: '시스템 자동입력',
}, },
@ -1070,7 +1055,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pr-4 mt-2',
iconShow: true, iconShow: true,
placeholder: '시스템 자동입력', placeholder: '시스템 자동입력',
}, },
@ -1082,7 +1067,7 @@ const myDetail = blocCdList => {
cols: 6, cols: 6,
labelCols: 12, labelCols: 12,
textCols: 12, textCols: 12,
class: 'py-2 pr-4', class: 'py-2 pl-4 mt-2',
iconShow: true, iconShow: true,
placeholder: '시스템 자동입력', placeholder: '시스템 자동입력',
}, },
@ -1100,67 +1085,4 @@ function sha512(str) {
.update(str) .update(str)
.digest('hex'); .digest('hex');
} }
const dataMockExample = [
{
userNo: 1,
userNm: '홍길동',
userLoginId: 'hong123',
userPswd: 'password123',
blocId: 'B001',
email: 'hong@example.com',
regUserNo: 100,
regDttm: '2025-07-01 10:00:00',
procUserNo: 101,
procDttm: '2025-07-15 14:30:00',
comId: 'C001',
deptId: 'D001'
},
{
userNo: 2,
userNm: '김영희',
userLoginId: 'kimyh',
userPswd: 'securePass456',
blocId: 'B002',
email: 'kim@example.com',
regUserNo: 102,
regDttm: '2025-07-02 11:20:00',
procUserNo: 103,
procDttm: '2025-07-16 09:45:00',
comId: 'C002',
deptId: 'D002'
},
{
userNo: 3,
userNm: '관리자',
userLoginId: 'user',
userPswd: 'securePass456',
blocId: 'B002',
email: 'kim@example.com',
regUserNo: 102,
regDttm: '2025-07-02 11:20:00',
procUserNo: 103,
procDttm: '2025-07-16 09:45:00',
comId: 'C002',
deptId: 'D002'
},
{
userNo: 4,
userNm: '사용자',
userLoginId: 'admin',
userPswd: 'securePass456',
blocId: 'B002',
email: 'kim@example.com',
regUserNo: 102,
regDttm: '2025-07-02 11:20:00',
procUserNo: 103,
procDttm: '2025-07-16 09:45:00',
comId: 'C002',
deptId: 'D002'
}
];
</script> </script>

View File

@ -1,54 +1,32 @@
<template> <template>
<div class="l-layout"> <div class="l-layout">
<!-- 조회조견 --> <!-- 조회조견 -->
<CommonPageTitle />
<v-row ref="searchFilter"> <v-row ref="searchFilter">
<v-col :cols="12"> <v-col :cols="12">
<v-card class="searchFilter"> <v-card class="searchFilter">
<v-row align="end" no-gutters> <v-row align="end" no-gutters>
<v-col :cols="2.5"> <v-col :cols="2.5">
<InputText <InputText :parentPrgmId="myPrgmId" label="배치ID" valueNm="batchId" :searchOption="true"
:parentPrgmId="myPrgmId" customClass="input-large" />
label="배치ID"
valueNm="batchId"
:searchOption="true"
:iconShow="true"
customClass="input-large"
/>
</v-col> </v-col>
<v-col :cols="2.5"> <v-col :cols="2.5">
<InputText <InputText :parentPrgmId="myPrgmId" label="배치명" valueNm="batchNm" :searchOption="true"
:parentPrgmId="myPrgmId" customClass="input-large" />
label="배치명"
valueNm="batchNm"
:searchOption="true"
:iconShow="true"
customClass="input-large"
/>
</v-col> </v-col>
<v-col :cols="2.5"> <v-col :cols="2.5">
<component <component :is="'selectCodeList'" :parentPrgmId="myPrgmId" :label="'실행 결과'"
:is="'selectCodeList'" :dataKey="'execRsltCd'" :sendParam="{ commGrpCd: 'CO_BATCH_EXEC_RSLT', useFg: '1' }"
:parentPrgmId="myPrgmId" :addAll="true" customClass="select-large" />
:label="'실행 결과'"
:dataKey="'execRsltCd'"
:sendParam="{ commGrpCd: 'CO_BATCH_EXEC_RSLT', useFg: '1' }"
:addAll="true"
:iconShow="true"
customClass="select-large"
/>
</v-col> </v-col>
<v-col :cols="2.5"> <v-col :cols="2.5">
<component <component :is="'Datepicker'" :parentPrgmId="myPrgmId" :label="'조회기간'"
:is="'Datepicker'" customClass="datepicker-large" />
:parentPrgmId="myPrgmId"
:label="'조회기간'"
:customClass="'input-large'"
/>
</v-col> </v-col>
<v-col :cols="2" class="text-right d-flex align-end justify-end ga-1" style="gap: 4px"> <div class="text-right d-flex align-end justify-end pl-9" style="gap: 8px">
<BtnSearch size="large" /> <BtnSearch />
<BtnExcelDownload :parentPrgmId="myPrgmId" :gridName="gridName" size="large" /> <BtnExcelDownload :parentPrgmId="myPrgmId" :gridName="gridName" size="large" />
</v-col> </div>
</v-row> </v-row>
</v-card> </v-card>
</v-col> </v-col>
@ -56,38 +34,30 @@
<v-row ref="contents"> <v-row ref="contents">
<!-- 배치 리스트 --> <!-- 배치 리스트 -->
<v-col :cols="12" style="height:50%"> <v-col :cols="12" style="height:70%">
<v-card class="pb-5 h100"> <v-card class="h100">
<v-card-title>배치 리스트</v-card-title> <v-card-title>배치 리스트</v-card-title>
<div class="h100" style="height:calc(100% - 70px)"> <div class="h100" style="height:calc(100% - 150px)">
<div ref="gridParent" class="px-5 h100"> <div ref="gridParent" class="px-5 h100">
<component <component :ref="gridName" :is="loadGrid ? 'Grid' : null" :parentPrgmId="myPrgmId"
:ref="gridName" :gridName="gridName" @getRowsData="getRowData" />
:is=" 'Grid' " </div>
:parentPrgmId="myPrgmId" <div class="d-flex align-center justify-center pt-7" v-if="loadGrid && totalCount > 0">
:gridName="gridName" <pagination id="pagination" :total-count="totalCount" :page-num="page" :limit="limit"
@getRowsData="getRowData" @loadData="changeGrid" />
:dataPath="dataPathMock"
/>
</div> </div>
</div> </div>
</v-card> </v-card>
</v-col> </v-col>
<!-- 배치 상세 --> <!-- 배치 상세 -->
<v-col :cols="12" style="height:50%"> <v-col :cols="12" style="height:30%">
<v-card class="pb-5 h100"> <v-card class="h100">
<div class="d-flex align-center justify-space-between pa-5"> <div class="d-flex align-center justify-space-between pa-5">
<v-card-title class="pa-0">배치 상세</v-card-title> <v-card-title class="pa-0">배치 상세</v-card-title>
</div> </div>
<div style="height:calc(100% - 50px)"> <div style="height:calc(100% - 50px)" class="px-5">
<div ref="gridParent" class="px-5 h100"> <component :is="'Form'" :parentPrgmId="myPrgmId" :detailList="detailList"
<component @gridEditingFinish="gridEditingFinish" />
:is="'Form'"
:parentPrgmId="myPrgmId"
:detailList="detailList"
@gridEditingFinish="gridEditingFinish"
/>
</div>
</div> </div>
</v-card> </v-card>
</v-col> </v-col>
@ -108,6 +78,7 @@ import Buttons from '~/components/common/button/Buttons';
import Grid from '~/components/common/Grid'; import Grid from '~/components/common/Grid';
import Form from '~/components/common/form/Form'; import Form from '~/components/common/form/Form';
import Utility from '~/plugins/utility'; import Utility from '~/plugins/utility';
import pagination from '~/components/common/Pagination';
let myTitle; let myTitle;
let myPrgmId; let myPrgmId;
@ -136,60 +107,20 @@ export default {
BtnSearch, BtnSearch,
BtnExcelDownload, BtnExcelDownload,
Buttons, Buttons,
pagination,
}, },
data() { data() {
return { return {
myPrgmId: myPrgmId, myPrgmId: myPrgmId,
loadGrid: true, loadGrid: false,
gridName: 'rowGrid', gridName: 'rowGrid',
// rowGridOrigin: [], // rowGridOrigin: [],
detailList: myDetail, detailList: myDetail,
dataPathMock : { itemsPerPage: 20,
'rowGrid': { itemsPerPageArray: [10, 20, 30],
column: [ limit: 20,
{ header: 'No.', name: 'batchLogSeq', align: 'center', width: 100 }, page: 1,
{ header: '배치ID', name: 'batchId', align: 'center', width: 100 }, totalCount: 0,
{ header: '배치명', name: 'batchNm', align: 'left', width: 150 },
{ header: '실행 일자', name: 'execDt', align: 'center', width: 80 },
{
header: '실행 결과',
name: 'execRsltCd',
align: 'center',
width: 80,
// formatter({ value }) {
// let retVal = '';
// const newValue = _this.pageData.execRsltCdList.filter(
// item => item.commCd == value,
// );
// if (newValue.length > 0) {
// retVal = newValue[0].commCdNm;
// }
// return retVal;
// },
}, // "1": 프로그램, "2": 팝업
{ header: '실행 로그', name: 'execLogCont', minWidth: 150 },
{
header: '배치 시작 일시',
name: 'batchStrtDttm',
align: 'center',
width: 160,
},
{
header: '배치 종료 일시',
name: 'batchEndDttm',
align: 'center',
width: 160,
},
{ header: '등록자NO', name: 'regUserNo', width: 120 },
{ header: '등록일시', name: 'regDttm', align: 'center', width: 160 },
{ header: '수정자NO', name: 'procUserNo', width: 120 },
{ header: '수정일시', name: 'procDttm', align: 'center', width: 160 },
],
data: dataMockExample,
defaultRow: dataMockExample,
option: {},
},
},
}; };
}, },
computed: { computed: {
@ -210,7 +141,10 @@ export default {
}, },
watch: { watch: {
chkIsFind(val) { chkIsFind(val) {
if (val) this.search(); if (val) {
this.page = 1;
this.search();
}
}, },
chkExecRsltCd() { chkExecRsltCd() {
this.setPageData({ isFind: true }); this.setPageData({ isFind: true });
@ -246,25 +180,16 @@ export default {
// chkOpenTabList: "chkOpenTabList" // chkOpenTabList: "chkOpenTabList"
// }), // }),
init() { init() {
// this.layoutInit(); this.layoutInit();
this.gridInit(); this.gridInit();
// _this.pageData = {
// execRsltCdList: [
// { commCd: '1', commCdNm: '성공' },
// { commCd: '2', commCdNm: '실패' },
// ],
// };
}, },
// layoutInit() { layoutInit() {
// const searchFilterHeight = this.$refs.searchFilter.offsetHeight; const searchFilterHeight = this.$refs.searchFilter.offsetHeight;
// this.$refs.contents.style.height = `calc(100% - ${searchFilterHeight}px)`; this.$refs.contents.style.height = `calc(100% - 30px - ${searchFilterHeight}px)`;
// }, },
gridInit() { gridInit() {
this.loadGrid = false; this.loadGrid = false;
const gridHeight = this.$refs.gridParent.offsetHeight - 30; const gridHeight = this.$refs.gridParent.offsetHeight - 30;
const myOptions = { const myOptions = {
scrollX: false, scrollX: false,
}; };
@ -276,14 +201,14 @@ export default {
const _this = this; const _this = this;
const myColumns = [ const myColumns = [
{ header: 'No.', name: 'batchLogSeq', align: 'center', width: 100 }, { header: 'No.', name: 'batchLogSeq', align: 'right', width: 90 },
{ header: '배치ID', name: 'batchId', align: 'center', width: 100 }, { header: '배치ID', name: 'batchId', align: 'right', width: 90 },
{ header: '배치명', name: 'batchNm', align: 'left', width: 150 }, { header: '배치명', name: 'batchNm', align: 'left', width: 150 },
{ header: '실행 일자', name: 'execDt', align: 'center', width: 80 }, { header: '실행 일자', name: 'execDt', align: 'right', width: 70 },
{ {
header: '실행 결과', header: '실행 결과',
name: 'execRsltCd', name: 'execRsltCd',
align: 'center', align: 'left',
width: 80, width: 80,
formatter({ value }) { formatter({ value }) {
let retVal = ''; let retVal = '';
@ -300,7 +225,7 @@ export default {
{ {
header: '배치 시작 일시', header: '배치 시작 일시',
name: 'batchStrtDttm', name: 'batchStrtDttm',
align: 'center', align: 'left',
width: 160, width: 160,
}, },
{ {
@ -309,9 +234,9 @@ export default {
align: 'center', align: 'center',
width: 160, width: 160,
}, },
{ header: '등록자NO', name: 'regUserNo', width: 120 }, { header: '등록자NO', name: 'regUserNo', width: 100 },
{ header: '등록일시', name: 'regDttm', align: 'center', width: 160 }, { header: '등록일시', name: 'regDttm', align: 'center', width: 160 },
{ header: '수정자NO', name: 'procUserNo', width: 120 }, { header: '수정자NO', name: 'procUserNo', width: 100 },
{ header: '수정일시', name: 'procDttm', align: 'center', width: 160 }, { header: '수정일시', name: 'procDttm', align: 'center', width: 160 },
]; ];
@ -331,6 +256,11 @@ export default {
}); });
}, },
async getRowGridData() { async getRowGridData() {
this.loadGrid = false;
// this.setGridData({
// gridKey: this.gridName,
// value: [],
// });
const res = await this.postApiReturn({ const res = await this.postApiReturn({
apiKey: 'selectBatchLog', apiKey: 'selectBatchLog',
resKey: 'batchLogData', resKey: 'batchLogData',
@ -339,8 +269,24 @@ export default {
batchNm: this.pageData.batchNm, // 검색키워드: 배치명 batchNm: this.pageData.batchNm, // 검색키워드: 배치명
execRsltCd: this.pageData.execRsltCd, //배치 실행 결과 execRsltCd: this.pageData.execRsltCd, //배치 실행 결과
fromDt: this.pageData.fromDt, fromDt: this.pageData.fromDt,
limit: this.limit,
page: this.page,
offset: (this.page - 1) * this.limit, // MariaDB Query에서 직접 계산이 안됨
}, },
}); });
const res2 = await this.postApiReturn({
apiKey: 'selectBatchLogPageTotal',
resKey: 'batchLogPageTotal',
sendParam: {
batchId: this.pageData.batchId, // 검색키워드: 배치ID
batchNm: this.pageData.batchNm, // 검색키워드: 배치명
execRsltCd: this.pageData.execRsltCd, //배치 실행 결과
fromDt: this.pageData.fromDt,
},
});
this.totalCount = res2[0].totalcount;
const newRes = res.map(item => { const newRes = res.map(item => {
const newObj = { const newObj = {
...item, ...item,
@ -359,6 +305,7 @@ export default {
}); });
this.$nextTick(() => { this.$nextTick(() => {
this.loadGrid = true;
if (newRes.length > 0) { if (newRes.length > 0) {
this.$refs[this.gridName].focus({ this.$refs[this.gridName].focus({
rowKey: this.chkRowGridSelectKey || 0, rowKey: this.chkRowGridSelectKey || 0,
@ -368,13 +315,10 @@ export default {
} }
}); });
}, },
// async getRowData(data) { async getRowData(data) {
async getRowData() {
console.log("something")
this.setPageData({ this.setPageData({
// rowGridSelectKey: data.rowKey, rowGridSelectKey: data.rowKey,
rowGridSelectKey: 1, rowGridSelectData: data,
rowGridSelectData: fakeRowData,
}); });
}, },
compareData(type, newDt) { compareData(type, newDt) {
@ -421,6 +365,12 @@ export default {
} }
return retVal; return retVal;
}, },
changeGrid: async function (pageNum, limit) {
this.page = pageNum;
this.limit = limit;
this.search();
},
}, },
}; };
@ -481,86 +431,21 @@ const defaultData = {
}, },
}; };
const dataMockExample = [
{
batchLogSeq: 1,
batchId: 'BATCH001',
batchNm: '일일 데이터 백업',
execDt: '2025-07-15',
execRsltCd: '1', // sẽ được formatter thành "성공" hoặc tương tự
execLogCont: '백업 완료. 오류 없음.',
batchStrtDttm: '2025-07-15 01:00:00',
batchEndDttm: '2025-07-15 01:30:00',
regUserNo: 'admin01',
regDttm: '2025-07-15 01:00:00',
procUserNo: 'admin02',
procDttm: '2025-07-15 01:35:00',
},
{
batchLogSeq: 2,
batchId: 'BATCH002',
batchNm: '월간 리포트 생성',
execDt: '2025-07-01',
execRsltCd: '2',
execLogCont: '리포트 생성 중 오류 발생: 파일 접근 실패.',
batchStrtDttm: '2025-07-01 03:00:00',
batchEndDttm: '2025-07-01 03:10:00',
regUserNo: 'reportUser',
regDttm: '2025-07-01 03:00:00',
procUserNo: 'admin03',
procDttm: '2025-07-01 03:15:00',
},
{
batchLogSeq: 3,
batchId: 'BATCH003',
batchNm: '사용자 통계 갱신',
execDt: '2025-07-14',
execRsltCd: '1',
execLogCont: '통계 갱신 완료.',
batchStrtDttm: '2025-07-14 23:00:00',
batchEndDttm: '2025-07-14 23:20:00',
regUserNo: 'statUser',
regDttm: '2025-07-14 23:00:00',
procUserNo: 'admin01',
procDttm: '2025-07-14 23:25:00',
},
];
const fakeRowData = {
rowKey: 1,
batchLogSeq: 1,
batchId: 'BATCH001',
batchNm: '일일 데이터 백업',
execDt: '2025-07-15',
execRsltCd: '1',
execLogCont: JSON.stringify({
session: {
userNo: 'admin01',
userNm: '관리자',
comId: 'SKCC',
locale: 'ko_KR',
},
batch: {
comId: 'SKCC',
totStdDt: '20230110',
},
}),
batchStrtDttm: '2025-07-15 01:00:00',
batchEndDttm: '2025-07-15 01:30:00',
regUserNo: 'admin01',
regDttm: '2025-07-15 01:00:00',
procUserNo: 'admin02',
procDttm: '2025-07-15 01:35:00',
};
const myDetail = [ const myDetail = [
{ {
type: 'TextArea', type: 'TextArea',
valueNm: 'execLogCont', valueNm: 'execLogCont',
readonly: true, readonly: true,
cols: 12, cols: 12,
class: 'py-2 transparent', class: 'py-2',
rows: 3
}, },
]; ];
</script> </script>
<style lang="scss" scoped>
::v-deep{
.tui-grid-layer-state{
top: 40px !important;
}
}
</style>

View File

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

View File

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

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="l-layout"> <div class="l-layout">
<PageTitle text="공통코드" /> <CommonPageTitle/>
<v-row ref="searchFilter"> <v-row ref="searchFilter">
<v-col :cols="12"> <v-col :cols="12">
<v-card class="searchFilter"> <v-card class="searchFilter">
@ -56,7 +56,7 @@
</v-col> </v-col>
<v-col :cols="12" class="text-right"> <v-col :cols="12" class="text-right">
<BtnSearch style="margin-top:20px" @click="search" /> <BtnSearch style="margin-top:20px" @click="search" size="large" />
</v-col> </v-col>
</v-row> </v-row>
<!-- <v-row align="center" no-gutters> <!-- <v-row align="center" no-gutters>

View File

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

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