mdm-client 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/README.md +92 -0
  2. package/index.js +35 -0
  3. package/package.json +41 -0
  4. package/src/App.vue +246 -0
  5. package/src/assets/audio/moon_light.ogg +0 -0
  6. package/src/assets/font/DINPro-Medium.otf +0 -0
  7. package/src/assets/font/FZZhengHeiS-B-GB.ttf +0 -0
  8. package/src/assets/font/PingFang Regular.otf +0 -0
  9. package/src/assets/font/SourceHanSansCN-Regular.otf +0 -0
  10. package/src/assets/image/common/add_other_icon.png +0 -0
  11. package/src/assets/image/common/bottomFrame.png +0 -0
  12. package/src/assets/image/common/broadcastOn.png +0 -0
  13. package/src/assets/image/common/broadcastTask.png +0 -0
  14. package/src/assets/image/common/call.png +0 -0
  15. package/src/assets/image/common/call_user_mic_off_icon.png +0 -0
  16. package/src/assets/image/common/call_user_mic_on_icon.png +0 -0
  17. package/src/assets/image/common/cam-off.png +0 -0
  18. package/src/assets/image/common/cam-on.png +0 -0
  19. package/src/assets/image/common/cam_off_small.png +0 -0
  20. package/src/assets/image/common/camera.png +0 -0
  21. package/src/assets/image/common/cameraBtn1.png +0 -0
  22. package/src/assets/image/common/cameraBtn2.png +0 -0
  23. package/src/assets/image/common/cameraBtn3.png +0 -0
  24. package/src/assets/image/common/cameraBtn4.png +0 -0
  25. package/src/assets/image/common/cameraBtn5.png +0 -0
  26. package/src/assets/image/common/cameraBtn6.png +0 -0
  27. package/src/assets/image/common/cameraBtn7.png +0 -0
  28. package/src/assets/image/common/cameraClose.png +0 -0
  29. package/src/assets/image/common/cameraFull.png +0 -0
  30. package/src/assets/image/common/cameraOff.png +0 -0
  31. package/src/assets/image/common/cancel_icon.png +0 -0
  32. package/src/assets/image/common/card_blue.png +0 -0
  33. package/src/assets/image/common/card_grey.png +0 -0
  34. package/src/assets/image/common/chosen_icon.png +0 -0
  35. package/src/assets/image/common/chosen_icon_slided.png +0 -0
  36. package/src/assets/image/common/custom_layout_equipment_avatar.png +0 -0
  37. package/src/assets/image/common/custom_layout_user_avatar.png +0 -0
  38. package/src/assets/image/common/default_avatar.png +0 -0
  39. package/src/assets/image/common/default_avatar_mini.png +0 -0
  40. package/src/assets/image/common/delete-number.svg +3 -0
  41. package/src/assets/image/common/deviceIcon.png +0 -0
  42. package/src/assets/image/common/fourOff.png +0 -0
  43. package/src/assets/image/common/fourOn.png +0 -0
  44. package/src/assets/image/common/group.png +0 -0
  45. package/src/assets/image/common/groupManage.png +0 -0
  46. package/src/assets/image/common/histroy_meeting_icon.png +0 -0
  47. package/src/assets/image/common/icon-device.svg +12 -0
  48. package/src/assets/image/common/icon-monitor.svg +12 -0
  49. package/src/assets/image/common/icon-/345/260/217/347/250/213/345/272/217.svg +5 -0
  50. package/src/assets/image/common/icon-/345/272/224/347/255/224.svg +5 -0
  51. package/src/assets/image/common/icon-/350/247/206/351/242/221.svg +7 -0
  52. package/src/assets/image/common/input_search_icon.png +0 -0
  53. package/src/assets/image/common/launch_icon.png +0 -0
  54. package/src/assets/image/common/layout-active1.png +0 -0
  55. package/src/assets/image/common/layout-active2.png +0 -0
  56. package/src/assets/image/common/layout1.png +0 -0
  57. package/src/assets/image/common/layout2.png +0 -0
  58. package/src/assets/image/common/loading.png +0 -0
  59. package/src/assets/image/common/login/checked_icon.png +0 -0
  60. package/src/assets/image/common/login/login_bg.png +0 -0
  61. package/src/assets/image/common/login/login_form_left_icon.png +0 -0
  62. package/src/assets/image/common/login/pwd_icon.png +0 -0
  63. package/src/assets/image/common/login/user_icon.png +0 -0
  64. package/src/assets/image/common/login/verify_icon.png +0 -0
  65. package/src/assets/image/common/logo.png +0 -0
  66. package/src/assets/image/common/ltypeOff.png +0 -0
  67. package/src/assets/image/common/ltypeOn.png +0 -0
  68. package/src/assets/image/common/manager_cam_off_icon.png +0 -0
  69. package/src/assets/image/common/manager_mic_off_icon.png +0 -0
  70. package/src/assets/image/common/map-cicle-icon.svg +6 -0
  71. package/src/assets/image/common/map-icon-search-info.svg +11 -0
  72. package/src/assets/image/common/map-location.svg +37 -0
  73. package/src/assets/image/common/map.png +0 -0
  74. package/src/assets/image/common/mic-off.png +0 -0
  75. package/src/assets/image/common/mic-on.png +0 -0
  76. package/src/assets/image/common/mic_off_small.png +0 -0
  77. package/src/assets/image/common/minum_cam_off_icon.png +0 -0
  78. package/src/assets/image/common/minum_cam_on_icon.png +0 -0
  79. package/src/assets/image/common/minum_expand_icon.png +0 -0
  80. package/src/assets/image/common/minum_mic_off_icon.png +0 -0
  81. package/src/assets/image/common/minum_mic_on_icon.png +0 -0
  82. package/src/assets/image/common/minum_reset_icon.png +0 -0
  83. package/src/assets/image/common/minum_slide_icon.png +0 -0
  84. package/src/assets/image/common/more_icon.png +0 -0
  85. package/src/assets/image/common/mute.png +0 -0
  86. package/src/assets/image/common/newFolder.png +0 -0
  87. package/src/assets/image/common/newTask.png +0 -0
  88. package/src/assets/image/common/nineOff.png +0 -0
  89. package/src/assets/image/common/nineOn.png +0 -0
  90. package/src/assets/image/common/none.png +0 -0
  91. package/src/assets/image/common/offline.png +0 -0
  92. package/src/assets/image/common/oneOff.png +0 -0
  93. package/src/assets/image/common/oneOn.png +0 -0
  94. package/src/assets/image/common/online.png +0 -0
  95. package/src/assets/image/common/output_off_small.png +0 -0
  96. package/src/assets/image/common/playOff.png +0 -0
  97. package/src/assets/image/common/playOn.png +0 -0
  98. package/src/assets/image/common/playStop.png +0 -0
  99. package/src/assets/image/common/preview_icon.png +0 -0
  100. package/src/assets/image/common/preview_meet_icon.png +0 -0
  101. package/src/assets/image/common/scan-map.png +0 -0
  102. package/src/assets/image/common/screen_blue.png +0 -0
  103. package/src/assets/image/common/screen_gray.png +0 -0
  104. package/src/assets/image/common/screen_white.png +0 -0
  105. package/src/assets/image/common/select_item_check.png +0 -0
  106. package/src/assets/image/common/select_item_checked.png +0 -0
  107. package/src/assets/image/common/selector.png +0 -0
  108. package/src/assets/image/common/selectorOn.png +0 -0
  109. package/src/assets/image/common/share_icon.png +0 -0
  110. package/src/assets/image/common/signal_good.png +0 -0
  111. package/src/assets/image/common/signal_poor.png +0 -0
  112. package/src/assets/image/common/sixteenOff.png +0 -0
  113. package/src/assets/image/common/sixteenOn.png +0 -0
  114. package/src/assets/image/common/slide-bth-expand.png +0 -0
  115. package/src/assets/image/common/slide_btn.png +0 -0
  116. package/src/assets/image/common/speak.png +0 -0
  117. package/src/assets/image/common/speakOn.png +0 -0
  118. package/src/assets/image/common/speaker-off.png +0 -0
  119. package/src/assets/image/common/speaker-on.png +0 -0
  120. package/src/assets/image/common/speaking.png +0 -0
  121. package/src/assets/image/common/speed-left.svg +5 -0
  122. package/src/assets/image/common/speed-right.svg +5 -0
  123. package/src/assets/image/common/tree_checked_icon.png +0 -0
  124. package/src/assets/image/common/tree_expand_icon.png +0 -0
  125. package/src/assets/image/common/tree_slide_icon.png +0 -0
  126. package/src/assets/image/common/tree_uncheck_icon.png +0 -0
  127. package/src/assets/image/common/unchosen_icon.png +0 -0
  128. package/src/assets/image/common/up.png +0 -0
  129. package/src/assets/image/common/volume.png +0 -0
  130. package/src/assets/image/common/warning.png +0 -0
  131. package/src/assets/image/screenBlue/a1.png +0 -0
  132. package/src/assets/image/screenBlue/a2.png +0 -0
  133. package/src/assets/image/screenBlue/a3.png +0 -0
  134. package/src/assets/image/screenBlue/a4.png +0 -0
  135. package/src/assets/image/screenBlue/a5.png +0 -0
  136. package/src/assets/image/screenBlue/a6.png +0 -0
  137. package/src/assets/image/screenBlue/add.png +0 -0
  138. package/src/assets/image/screenBlue/add_group_icon.png +0 -0
  139. package/src/assets/image/screenBlue/add_to_group_icon.png +0 -0
  140. package/src/assets/image/screenBlue/arrow_icon.png +0 -0
  141. package/src/assets/image/screenBlue/audio_level_icon.png +0 -0
  142. package/src/assets/image/screenBlue/b1.png +0 -0
  143. package/src/assets/image/screenBlue/b2.png +0 -0
  144. package/src/assets/image/screenBlue/b3.png +0 -0
  145. package/src/assets/image/screenBlue/b4.png +0 -0
  146. package/src/assets/image/screenBlue/b5.png +0 -0
  147. package/src/assets/image/screenBlue/b6.png +0 -0
  148. package/src/assets/image/screenBlue/bottom_footer_bg.png +0 -0
  149. package/src/assets/image/screenBlue/call_clear_icon.png +0 -0
  150. package/src/assets/image/screenBlue/call_duration_icon.png +0 -0
  151. package/src/assets/image/screenBlue/call_fullscreen_icon.png +0 -0
  152. package/src/assets/image/screenBlue/call_mini_icon.png +0 -0
  153. package/src/assets/image/screenBlue/call_video_icon.png +0 -0
  154. package/src/assets/image/screenBlue/call_voice_icon.png +0 -0
  155. package/src/assets/image/screenBlue/cam_on_small.png +0 -0
  156. package/src/assets/image/screenBlue/close_icon.png +0 -0
  157. package/src/assets/image/screenBlue/copy-icon.png +0 -0
  158. package/src/assets/image/screenBlue/custom_layout_drag_icon.png +0 -0
  159. package/src/assets/image/screenBlue/custom_layout_grid16_active_icon.png +0 -0
  160. package/src/assets/image/screenBlue/custom_layout_grid16_icon.png +0 -0
  161. package/src/assets/image/screenBlue/custom_layout_grid4_active_icon.png +0 -0
  162. package/src/assets/image/screenBlue/custom_layout_grid4_icon.png +0 -0
  163. package/src/assets/image/screenBlue/custom_layout_grid9_active_icon.png +0 -0
  164. package/src/assets/image/screenBlue/custom_layout_grid9_icon.png +0 -0
  165. package/src/assets/image/screenBlue/custom_layout_header_icon.png +0 -0
  166. package/src/assets/image/screenBlue/custom_layout_placeholder_bg.png +0 -0
  167. package/src/assets/image/screenBlue/custom_layout_refresh_icon.png +0 -0
  168. package/src/assets/image/screenBlue/custom_layout_rightside_active_icon.png +0 -0
  169. package/src/assets/image/screenBlue/custom_layout_rightside_icon.png +0 -0
  170. package/src/assets/image/screenBlue/custom_layout_ring_active_icon.png +0 -0
  171. package/src/assets/image/screenBlue/custom_layout_ring_icon.png +0 -0
  172. package/src/assets/image/screenBlue/custom_layout_topside_active_icon.png +0 -0
  173. package/src/assets/image/screenBlue/custom_layout_topside_icon.png +0 -0
  174. package/src/assets/image/screenBlue/date_picker_icon.png +0 -0
  175. package/src/assets/image/screenBlue/dialog_check_icon.png +0 -0
  176. package/src/assets/image/screenBlue/emoji-logo.png +0 -0
  177. package/src/assets/image/screenBlue/header_alert_icon.png +0 -0
  178. package/src/assets/image/screenBlue/manager_cam_on_icon.png +0 -0
  179. package/src/assets/image/screenBlue/manager_mic_on_icon.png +0 -0
  180. package/src/assets/image/screenBlue/manager_more_icon.png +0 -0
  181. package/src/assets/image/screenBlue/meeting_board_bg.png +0 -0
  182. package/src/assets/image/screenBlue/meeting_chat_emoji_icon.png +0 -0
  183. package/src/assets/image/screenBlue/meeting_chat_icon.png +0 -0
  184. package/src/assets/image/screenBlue/meeting_chat_image_icon.png +0 -0
  185. package/src/assets/image/screenBlue/meeting_chat_logo.png +0 -0
  186. package/src/assets/image/screenBlue/meeting_copy_icon.png +0 -0
  187. package/src/assets/image/screenBlue/meeting_invite_icon.png +0 -0
  188. package/src/assets/image/screenBlue/meeting_layout_icon.png +0 -0
  189. package/src/assets/image/screenBlue/meeting_member_icon.png +0 -0
  190. package/src/assets/image/screenBlue/meeting_mode_icon.png +0 -0
  191. package/src/assets/image/screenBlue/meeting_record_icon.png +0 -0
  192. package/src/assets/image/screenBlue/meeting_setting_icon.png +0 -0
  193. package/src/assets/image/screenBlue/meeting_share_icon.png +0 -0
  194. package/src/assets/image/screenBlue/meeting_slide_small_icon.png +0 -0
  195. package/src/assets/image/screenBlue/mic_on_small.png +0 -0
  196. package/src/assets/image/screenBlue/module_bg1.png +0 -0
  197. package/src/assets/image/screenBlue/module_bg2.png +0 -0
  198. package/src/assets/image/screenBlue/monitor/circle data.png +0 -0
  199. package/src/assets/image/screenBlue/monitor/circle.png +0 -0
  200. package/src/assets/image/screenBlue/output_on_small.png +0 -0
  201. package/src/assets/image/screenBlue/page_bg.png +0 -0
  202. package/src/assets/image/screenBlue/pic-logo.png +0 -0
  203. package/src/assets/image/screenBlue/preview_date_icon.png +0 -0
  204. package/src/assets/image/screenBlue/preview_empty_icon.png +0 -0
  205. package/src/assets/image/screenBlue/preview_more_icon.png +0 -0
  206. package/src/assets/image/screenBlue/receive_hang_off_icon.png +0 -0
  207. package/src/assets/image/screenBlue/receive_hang_on_icon.png +0 -0
  208. package/src/assets/image/screenBlue/receive_video_icon.png +0 -0
  209. package/src/assets/image/screenBlue/receive_voice_icon.png +0 -0
  210. package/src/assets/image/screenBlue/send-logo.png +0 -0
  211. package/src/assets/image/screenBlue/slide_menu_bg.png +0 -0
  212. package/src/assets/image/screenBlue/top_header_bg.png +0 -0
  213. package/src/assets/image/screenBlue/yq.png +0 -0
  214. package/src/assets/json/emoji.json +222 -0
  215. package/src/assets/style/base.scss +217 -0
  216. package/src/assets/style/elForm.scss +80 -0
  217. package/src/assets/style/font.scss +16 -0
  218. package/src/assets/style/index.scss +5 -0
  219. package/src/assets/style/math.scss +11 -0
  220. package/src/assets/style/mixin.scss +69 -0
  221. package/src/components/LiveCallBoard/LiveCallBoard.vue +237 -0
  222. package/src/components/LiveInviteReceive/LiveInviteReceive.vue +150 -0
  223. package/src/components/LiveMulti/LiveMulti.vue +303 -0
  224. package/src/components/LiveMultipleMeeting/LiveMultipleMeeting.vue +4469 -0
  225. package/src/components/LiveMultipleMeeting/style/index.scss +337 -0
  226. package/src/components/LivePoint/LivePoint.vue +372 -0
  227. package/src/components/LivePointMeeting/LivePointMeeting.vue +1134 -0
  228. package/src/components/LivePointMeeting/style/index.scss +202 -0
  229. package/src/components/MeetingReadyDialog/MeetingReadyDialog.vue +583 -0
  230. package/src/components/MiniumVideoDialog/MiniumVideoDialog.vue +449 -0
  231. package/src/components/other/LayoutPlaceholder.vue +184 -0
  232. package/src/components/other/addressBook.vue +1121 -0
  233. package/src/components/other/appointDialog.vue +208 -0
  234. package/src/components/other/callBoard.vue +191 -0
  235. package/src/components/other/chatArea.vue +727 -0
  236. package/src/components/other/customGroupDialog.vue +180 -0
  237. package/src/components/other/customLayout.vue +1112 -0
  238. package/src/components/other/editGroupDialog.vue +290 -0
  239. package/src/components/other/inviteNonContactDialog.vue +160 -0
  240. package/src/components/other/layoutSwitch.vue +183 -0
  241. package/src/components/other/leaveOptionDialog.vue +90 -0
  242. package/src/components/other/memberManage.vue +502 -0
  243. package/src/components/other/moreOptionDialog.vue +291 -0
  244. package/src/components/other/screenShareBoard.vue +121 -0
  245. package/src/components/other/selectDialog.vue +279 -0
  246. package/src/components/other/selectSpecialDialog.vue +234 -0
  247. package/src/components/other/settingDialog.vue +756 -0
  248. package/src/components/other/themeDialog.vue +180 -0
  249. package/src/components/other/updateNameDialog.vue +162 -0
  250. package/src/directive/clickOutside.js +58 -0
  251. package/src/directive/drag.js +165 -0
  252. package/src/directive/scale.js +22 -0
  253. package/src/directive/throttle.js +77 -0
  254. package/src/main.js +21 -0
  255. package/src/request/index.js +27 -0
  256. package/src/utils/api.js +82 -0
  257. package/src/utils/index.js +4 -0
  258. package/src/utils/livekit/live-client-esm-old.js +1 -0
  259. package/src/utils/livekit/live-client-esm.js +1 -0
  260. package/src/utils/message.js +24 -0
  261. package/src/utils/mitt.js +4 -0
  262. package/src/utils/tool.js +154 -0
@@ -0,0 +1,1121 @@
1
+ <template>
2
+ <div class="addressbox">
3
+ <el-dialog :visible.sync="isaddressShow" append-to-body :show-close="false" class="addresslogClass" width="878px">
4
+ <div slot="title" class="dialog-title">
5
+ <div class="tabs">
6
+ <div
7
+ v-for="item in tabList"
8
+ :key="item"
9
+ :class="['tabItem', activeTab == item ? 'activeBorder' : '']"
10
+ @click="activeTab = item"
11
+ >
12
+ {{ item }}
13
+ </div>
14
+ </div>
15
+ <span class="close-icon" @click="isaddressShow = false"></span>
16
+ </div>
17
+ <div class="checkBox">
18
+ <div class="userLeft" ref="treeContainerRef">
19
+ <el-input class="search-input" v-model="filterText" placeholder="请输入名称进行搜索">
20
+ <i slot="suffix" class="el-input__icon el-icon-search"></i>
21
+ </el-input>
22
+
23
+ <!-- 组织架构树 -->
24
+ <div class="tree-content">
25
+ <vue-virtual-tree
26
+ v-show="activeTab === '组织架构'"
27
+ ref="orgTreeRef"
28
+ :data="treeData"
29
+ :props="{ children: 'children', label: 'label' }"
30
+ node-key="id"
31
+ show-checkbox
32
+ :height="dynamicTreeHeight"
33
+ :item-height="36"
34
+ @check="handleNodeCheck"
35
+ :filter-node-method="filterNode"
36
+ >
37
+ <template #default="{ node, data }">
38
+ <span class="custom-tree-node">
39
+ <span class="custom-tree-node-label" :title="node.label" v-if="data.isDept">{{
40
+ node.label
41
+ }}</span>
42
+ <span class="custom-tree-node-user" v-else>
43
+ <span :class="['custom-tree-node-icon']"></span>
44
+ <span class="custom-tree-node-label" :title="node.label">{{ node.label }}</span>
45
+ </span>
46
+ </span>
47
+ </template>
48
+ </vue-virtual-tree>
49
+
50
+ <!-- 应用树 -->
51
+ <vue-virtual-tree
52
+ v-show="activeTab === '人员'"
53
+ ref="appTreeRef"
54
+ :data="appTreeData"
55
+ :props="{ children: 'children', label: 'label' }"
56
+ node-key="id"
57
+ show-checkbox
58
+ :height="dynamicTreeHeight"
59
+ :item-height="36"
60
+ @check="handleNodeCheck"
61
+ :filter-node-method="filterNode"
62
+ >
63
+ <template #default="{ node, data }">
64
+ <span class="custom-tree-node">
65
+ <span class="custom-tree-node-label" :title="node.label" v-if="data.isDept">{{
66
+ node.label
67
+ }}</span>
68
+ <span class="custom-tree-node-user" v-else>
69
+ <span :class="['custom-tree-node-icon']"></span>
70
+ <span class="custom-tree-node-label" :title="node.label">{{ node.label }}</span>
71
+ </span>
72
+ </span>
73
+ </template>
74
+ </vue-virtual-tree>
75
+
76
+ <!-- 常用分组树 -->
77
+ <vue-virtual-tree
78
+ v-show="activeTab === '常用分组'"
79
+ ref="groupTreeRef"
80
+ :data="groupTreeData"
81
+ :props="{ children: 'children', label: 'label' }"
82
+ node-key="id"
83
+ show-checkbox
84
+ :height="dynamicTreeHeight"
85
+ :item-height="36"
86
+ @check="handleNodeCheck"
87
+ :filter-node-method="filterNode"
88
+ >
89
+ <template #default="{ node, data }">
90
+ <span class="custom-tree-node">
91
+ <div class="custom-tree-node-editable" v-if="data.isDept">
92
+ <span class="custom-tree-node-label" :title="node.label">{{ node.label }}</span>
93
+ <div class="node-options">
94
+ <div class="node-option" @click.stop="editUsualGroupItem(data)">编辑</div>
95
+ <div class="node-option" @click.stop="deleteUsualGroupItem(data)">删除</div>
96
+ </div>
97
+ </div>
98
+ <span class="custom-tree-node-user" v-else>
99
+ <span :class="['custom-tree-node-icon']"></span>
100
+ <span class="custom-tree-node-label" :title="node.label">{{ node.label }}</span>
101
+ </span>
102
+ </span>
103
+ </template>
104
+ </vue-virtual-tree>
105
+ <!-- 设备树 -->
106
+ <vue-virtual-tree
107
+ v-show="activeTab === '设备'"
108
+ ref="equipmentTreeRef"
109
+ :data="equipmentTreeData"
110
+ :props="{ children: 'children', label: 'label' }"
111
+ node-key="id"
112
+ show-checkbox
113
+ :height="dynamicTreeHeight"
114
+ :item-height="36"
115
+ @check="handleNodeCheck"
116
+ :filter-node-method="filterNode"
117
+ >
118
+ <template #default="{ node, data }">
119
+ <span class="custom-tree-node">
120
+ <span class="custom-tree-node-label" :title="node.label" v-if="data.isDept">{{
121
+ node.label
122
+ }}</span>
123
+ <span class="custom-tree-node-user" v-else>
124
+ <span :class="['custom-tree-node-icon', getNodeIconClass(data)]"></span>
125
+ <span class="custom-tree-node-label" :title="node.label">{{ node.label }}</span>
126
+ </span>
127
+ </span>
128
+ </template>
129
+ </vue-virtual-tree>
130
+ <!-- 监控树 -->
131
+ <vue-virtual-tree
132
+ v-show="activeTab === '监控'"
133
+ ref="monitorTreeRef"
134
+ :data="monitorTreeData"
135
+ :props="{ children: 'children', label: 'label' }"
136
+ node-key="id"
137
+ show-checkbox
138
+ :height="dynamicTreeHeight"
139
+ :item-height="36"
140
+ @check="handleNodeCheck"
141
+ :filter-node-method="filterNode"
142
+ >
143
+ <template #default="{ node, data }">
144
+ <span class="custom-tree-node">
145
+ <span class="custom-tree-node-label" :title="node.label" v-if="data.isDept">{{
146
+ node.label
147
+ }}</span>
148
+ <span class="custom-tree-node-user" v-else>
149
+ <span :class="['custom-tree-node-icon', getNodeIconClass(data)]"></span>
150
+ <span class="custom-tree-node-label" :title="node.label">{{ node.label }}</span>
151
+ </span>
152
+ </span>
153
+ </template>
154
+ </vue-virtual-tree>
155
+ </div>
156
+ </div>
157
+ <div class="userRight">
158
+ <div class="checkUse">
159
+ <div class="titl">已选</div>
160
+ <div class="count">{{ tempInviteNum }}</div>
161
+ <div class="adds" @click="getinvitation">
162
+ <img src="../../assets/image/screenBlue/yq.png" alt="" />
163
+ </div>
164
+ </div>
165
+ <div class="checkutl">
166
+ <div v-for="item of tempInviteList" :key="item.id" class="userFlex">
167
+ <div class="label">
168
+ <span :class="['custom-item-icon', getInviteItemIconClass(item)]"></span> {{ item.label }}
169
+ </div>
170
+ <div class="close" @click="removeInviteItem(item)"></div>
171
+ </div>
172
+ </div>
173
+ </div>
174
+ </div>
175
+ <div class="footersFull">
176
+ <div class="addfz" @click="addGroup">
177
+ <img src="../../assets/image/screenBlue/add.png" alt="" /> 添加分组
178
+ </div>
179
+ <div class="isokmul">
180
+ <div @click="cancel">取消</div>
181
+ <div @click="confirm">确定</div>
182
+ </div>
183
+ </div>
184
+ </el-dialog>
185
+
186
+ <!-- 使用新的对话框组件 -->
187
+ <CustomGroupDialog
188
+ ref="customGroupDialogRef"
189
+ :baseUrl="baseUrl"
190
+ :token="token"
191
+ @refreshCommonGroupTree="refreshCommonGroupTree"
192
+ />
193
+ <EditGroupDialog
194
+ ref="editGroupDialogRef"
195
+ :baseUrl="baseUrl"
196
+ :token="token"
197
+ @refreshCommonGroupTree="refreshCommonGroupTree"
198
+ />
199
+ <InviteNonContactDialog
200
+ ref="inviteNonContactDialogRef"
201
+ :baseUrl="baseUrl"
202
+ :token="token"
203
+ @addOutterContactToChosenList="addOutterContactToChosenList"
204
+ />
205
+ </div>
206
+ </template>
207
+
208
+ <script>
209
+ import { debounce } from "lodash-es";
210
+ import { mittBus, ShowMessage, deleteCommonGroupAndUser, getAddressOrgTree, getAddressAppTree, getCommonOrgTree, queryEquipmentAddressBook, queryMonitorAddressBook } from "@/utils/index";
211
+ import VueVirtualTree from "@fit2cloud-ui/vue-virtual-tree";
212
+ import CustomGroupDialog from "./customGroupDialog.vue";
213
+ import EditGroupDialog from "./editGroupDialog.vue";
214
+ import InviteNonContactDialog from "./inviteNonContactDialog.vue";
215
+
216
+ export default {
217
+ name: "AddressBook",
218
+ components: {
219
+ VueVirtualTree,
220
+ CustomGroupDialog,
221
+ EditGroupDialog,
222
+ InviteNonContactDialog
223
+ },
224
+ props: {
225
+ inviteList: {
226
+ type: Array,
227
+ default: () => {
228
+ return [];
229
+ },
230
+ },
231
+ baseUrl: {
232
+ type: String,
233
+ default: "",
234
+ },
235
+ token: {
236
+ type: String,
237
+ default: "",
238
+ },
239
+ },
240
+ data() {
241
+ return {
242
+ showMessage: null,
243
+
244
+ // 树数据
245
+ treeData: [],
246
+ appTreeData: [],
247
+ groupTreeData: [],
248
+ equipmentTreeData: [],
249
+ monitorTreeData: [],
250
+
251
+ // 标签页相关
252
+ activeTab: "组织架构",
253
+ tabList: ["组织架构", "人员", "设备", "监控", "常用分组"],
254
+
255
+ // 搜索相关
256
+ filterText: "",
257
+
258
+ // 已选列表相关
259
+ chosenList: [],
260
+
261
+ // 对话框状态
262
+ isaddressShow: false,
263
+ isInner: false,
264
+ tempInviteList: [],
265
+
266
+ // 标记是否正在同步,避免循环更新
267
+ isSyncing: false,
268
+
269
+ // 树容器引用和动态高度
270
+ dynamicTreeHeight: 270,
271
+
272
+ // 防抖函数
273
+ debouncedFilter: null,
274
+
275
+ // 计时器
276
+ resizeTimer: null,
277
+ };
278
+ },
279
+ computed: {
280
+ tempInviteNum() {
281
+ return this.tempInviteList.length;
282
+ },
283
+ },
284
+ watch: {
285
+ // 监听搜索框输入变化 - 使用防抖
286
+ filterText(val) {
287
+ this.debouncedFilter(val);
288
+ },
289
+
290
+ // 监听标签页变化
291
+ activeTab() {
292
+ // 当标签页变化时,重新应用筛选条件
293
+ this.$nextTick(() => {
294
+ if (this.filterText) {
295
+ this.debouncedFilter(this.filterText);
296
+ }
297
+
298
+ // 根据chosenList同步各个树的选中状态
299
+ this.syncTreeSelectionFromChosenList();
300
+ });
301
+ },
302
+
303
+ // 监听chosenList变化,同步到tempInviteList
304
+ chosenList: {
305
+ handler(newVal) {
306
+ if (!this.isSyncing) {
307
+ this.isSyncing = true;
308
+ this.tempInviteList = [...newVal];
309
+ this.$nextTick(() => {
310
+ this.isSyncing = false;
311
+ });
312
+ }
313
+ },
314
+ deep: true
315
+ },
316
+
317
+ // 监听对话框显示状态
318
+ isaddressShow: {
319
+ async handler(newVal) {
320
+ if (newVal) {
321
+ // 初始化选中状态
322
+ this.isSyncing = true;
323
+ this.chosenList = [...this.tempInviteList];
324
+ await this.$nextTick();
325
+ this.syncTreeSelectionFromChosenList();
326
+ // 更新树高度
327
+ await this.$nextTick();
328
+ this.updateTreeHeight();
329
+ this.isSyncing = false;
330
+ }
331
+ }
332
+ }
333
+ },
334
+ created() {
335
+ this.showMessage = new ShowMessage();
336
+
337
+ // 创建防抖的过滤函数
338
+ this.debouncedFilter = debounce((val) => {
339
+ // 根据当前激活的标签页筛选相应的树
340
+ if (this.activeTab === "组织架构" && this.$refs.orgTreeRef) {
341
+ this.$refs.orgTreeRef.filter(val);
342
+ } else if (this.activeTab === "人员" && this.$refs.appTreeRef) {
343
+ this.$refs.appTreeRef.filter(val);
344
+ } else if (this.activeTab === "常用分组" && this.$refs.groupTreeRef) {
345
+ this.$refs.groupTreeRef.filter(val);
346
+ } else if (this.activeTab === "设备" && this.$refs.equipmentTreeRef) {
347
+ this.$refs.equipmentTreeRef.filter(val);
348
+ } else if (this.activeTab === "监控" && this.$refs.monitorTreeRef) {
349
+ this.$refs.monitorTreeRef.filter(val);
350
+ }
351
+ }, 300);
352
+
353
+ // 监听mitt事件
354
+ mittBus.on("getaddressBookUser", (e) => {
355
+ this.filterText = "";
356
+ // 转换props.inviteList的数据格式以适配新的tree结构
357
+ this.tempInviteList = this.inviteList.map((item) => {
358
+ // 如果已经是新格式,直接使用
359
+ return item;
360
+ });
361
+ this.isaddressShow = true;
362
+ if (e) {
363
+ this.isInner = e.isInner;
364
+ } else {
365
+ this.isInner = false;
366
+ }
367
+ });
368
+ },
369
+ async mounted() {
370
+ await this.getAllTreeData();
371
+
372
+ window.addEventListener("resize", this.handleWindowResize);
373
+ // 初始化树高度
374
+ this.$nextTick(() => {
375
+ this.updateTreeHeight();
376
+ });
377
+ },
378
+ beforeDestroy() {
379
+ window.removeEventListener("resize", this.handleWindowResize);
380
+ if (this.resizeTimer) {
381
+ clearTimeout(this.resizeTimer);
382
+ }
383
+ },
384
+ methods: {
385
+ // 获取组织架构树数据
386
+ async getOrgTreeData() {
387
+ const res = await getAddressOrgTree({}, { baseUrl: this.baseUrl, token: this.token });
388
+ if(res.data?.code == 200) {
389
+ this.treeData = res.data.data;
390
+ }
391
+ },
392
+
393
+ // 获取应用树数据
394
+ async getAppTreeData() {
395
+ const res = await getAddressAppTree({}, { baseUrl: this.baseUrl, token: this.token });
396
+ if(res.data?.code == 200) {
397
+ this.appTreeData = res.data.data;
398
+ }
399
+ },
400
+
401
+ // 获取常用分组树数据
402
+ async getGroupTreeData() {
403
+ const res = await getCommonOrgTree({}, { baseUrl: this.baseUrl, token: this.token });
404
+ if(res.data?.code == 200) {
405
+ this.groupTreeData = res.data.data;
406
+ }
407
+ },
408
+
409
+ // 获取设备树数据
410
+ async getEquipmentTreeData() {
411
+ const res = await queryEquipmentAddressBook({}, { baseUrl: this.baseUrl, token: this.token });
412
+ if(res.data?.code == 200) {
413
+ this.equipmentTreeData = res.data.data;
414
+ }
415
+ },
416
+
417
+ // 获取监控树数据
418
+ async getMonitorTreeData() {
419
+ const res = await queryMonitorAddressBook({}, { baseUrl: this.baseUrl, token: this.token });
420
+ if(res.data?.code == 200) {
421
+ this.monitorTreeData = res.data.data;
422
+ }
423
+ },
424
+
425
+ // 获取所有树数据
426
+ async getAllTreeData() {
427
+ await this.getOrgTreeData();
428
+ await this.getAppTreeData();
429
+ await this.getGroupTreeData();
430
+ await this.getEquipmentTreeData();
431
+ await this.getMonitorTreeData();
432
+ },
433
+
434
+ // 过滤树节点的方法 - 虚拟树使用filter-node-method
435
+ filterNode(query, node) {
436
+ if (!query) return true;
437
+ return node.label.includes(query);
438
+ },
439
+
440
+ // 处理节点选择状态变化
441
+ handleNodeCheck(data, checkedInfo) {
442
+ const { checkedNodes } = checkedInfo;
443
+
444
+ // 提取所有选中的叶子节点
445
+ const leafNodes = this.extractLeafNodes(checkedNodes);
446
+
447
+ // 更新chosenList,但保留之前其他树中已选的节点
448
+ this.updateChosenListWithLeafNodes(leafNodes);
449
+ },
450
+
451
+ // 提取叶子节点
452
+ extractLeafNodes(nodes) {
453
+ const leafNodes = [];
454
+
455
+ nodes.forEach((node) => {
456
+ // 修改判断条件,只有当isDept为false时,才是叶子节点
457
+ // isDept为true的节点(即使是空数组)都视为非叶子节点
458
+ if (!node.isDept) {
459
+ leafNodes.push({
460
+ ...node,
461
+ source: this.activeTab, // 记录节点来源于哪个树
462
+ });
463
+ }
464
+ });
465
+
466
+ return leafNodes;
467
+ },
468
+
469
+ // 更新chosenList,保留其他树的选中状态
470
+ updateChosenListWithLeafNodes(newLeafNodes) {
471
+ // 从chosenList中过滤掉当前激活树的节点
472
+ const otherTreeNodes = this.chosenList.filter((item) => item.source !== this.activeTab);
473
+
474
+ // 将当前树的新叶子节点添加进来
475
+ const mergedList = [...otherTreeNodes];
476
+
477
+ // 添加新节点,避免重复
478
+ newLeafNodes.forEach((node) => {
479
+ if (!mergedList.some((item) => item.id === node.id)) {
480
+ mergedList.push(node);
481
+ }
482
+ });
483
+
484
+ this.chosenList = mergedList;
485
+ },
486
+
487
+ // 同步chosenList到树的选中状态
488
+ syncTreeSelectionFromChosenList() {
489
+ // 先清空当前树的选中状态
490
+ if (this.activeTab === "组织架构" && this.$refs.orgTreeRef) {
491
+ this.$refs.orgTreeRef.setCheckedKeys([]);
492
+ } else if (this.activeTab === "人员" && this.$refs.appTreeRef) {
493
+ this.$refs.appTreeRef.setCheckedKeys([]);
494
+ } else if (this.activeTab === "常用分组" && this.$refs.groupTreeRef) {
495
+ this.$refs.groupTreeRef.setCheckedKeys([]);
496
+ } else if (this.activeTab === "设备" && this.$refs.equipmentTreeRef) {
497
+ this.$refs.equipmentTreeRef.setCheckedKeys([]);
498
+ } else if (this.activeTab === "监控" && this.$refs.monitorTreeRef) {
499
+ this.$refs.monitorTreeRef.setCheckedKeys([]);
500
+ }
501
+
502
+ // 然后根据chosenList设置选中状态
503
+ const selectedIds = this.chosenList.map((user) => user.id);
504
+
505
+ if (this.activeTab === "组织架构" && this.$refs.orgTreeRef) {
506
+ selectedIds.forEach((id) => {
507
+ this.$refs.orgTreeRef.setChecked(id, true, false);
508
+ });
509
+ } else if (this.activeTab === "人员" && this.$refs.appTreeRef) {
510
+ selectedIds.forEach((id) => {
511
+ this.$refs.appTreeRef.setChecked(id, true, false);
512
+ });
513
+ } else if (this.activeTab === "常用分组" && this.$refs.groupTreeRef) {
514
+ selectedIds.forEach((id) => {
515
+ this.$refs.groupTreeRef.setChecked(id, true, false);
516
+ });
517
+ } else if (this.activeTab === "设备" && this.$refs.equipmentTreeRef) {
518
+ selectedIds.forEach((id) => {
519
+ this.$refs.equipmentTreeRef.setChecked(id, true, false);
520
+ });
521
+ } else if (this.activeTab === "监控" && this.$refs.monitorTreeRef) {
522
+ selectedIds.forEach((id) => {
523
+ this.$refs.monitorTreeRef.setChecked(id, true, false);
524
+ });
525
+ }
526
+ },
527
+
528
+ // 根据节点类型获取图标类名
529
+ getNodeIconClass(data) {
530
+ if (data.isDept) return '';
531
+
532
+ switch (this.activeTab) {
533
+ case '设备':
534
+ return data.equipmentStatus == 1 ? 'custom-tree-node-icon-device' : 'custom-tree-node-icon-device custom-tree-node-icon-offline';
535
+ case '监控':
536
+ return data.monitorStatus == 1 ? 'custom-tree-node-icon-monitor' : 'custom-tree-node-icon-monitor custom-tree-node-icon-offline';
537
+ default:
538
+ return 'custom-tree-node-icon';
539
+ }
540
+ },
541
+
542
+ // 根据邀请列表项类型获取图标类名
543
+ getInviteItemIconClass(item) {
544
+ if (item.source !== '设备' && item.source !== '监控') return 'custom-item-icon-person';
545
+ return item.source === '设备' ? 'custom-item-icon-device' : 'custom-item-icon-monitor';
546
+ },
547
+
548
+ getinvitation() {
549
+ this.$refs.inviteNonContactDialogRef.open();
550
+ },
551
+
552
+ addOutterContactToChosenList(outterContact) {
553
+ // 检查是否已存在
554
+ if (this.tempInviteList.find((item) => item.id === outterContact.id)) {
555
+ this.showMessage.message("error", "该人员已存在");
556
+ return;
557
+ }
558
+
559
+ // 添加到临时邀请列表
560
+ this.isSyncing = true;
561
+ this.tempInviteList.push(outterContact);
562
+ this.chosenList.push(outterContact);
563
+
564
+ this.$nextTick(() => {
565
+ this.isSyncing = false;
566
+ });
567
+ },
568
+
569
+ addGroup() {
570
+ if (this.tempInviteList.length <= 0) {
571
+ this.showMessage.message("error", "请先选择要添加的人员");
572
+ return;
573
+ }
574
+ if(this.tempInviteList.some((item) => item.source === '设备' || item.source === '监控')) {
575
+ this.showMessage.message("info", "设备和监控人员暂不支持添加分组, 将不会被添加到常用分组");
576
+ }
577
+ // 确保数据格式正确
578
+ const formattedList = this.tempInviteList.filter((item) => item.source !== '设备' && item.source !== '监控').map((item) => {
579
+ return {
580
+ id: item.id,
581
+ label: item.label,
582
+ phone: item.phone,
583
+ loginCode: item.loginCode || "",
584
+ ...item,
585
+ };
586
+ });
587
+ this.$refs.customGroupDialogRef.open(formattedList);
588
+ },
589
+
590
+ editUsualGroupItem(data) {
591
+ this.$refs.editGroupDialogRef.open(data);
592
+ },
593
+
594
+ deleteUsualGroupItem(data) {
595
+ deleteCommonGroupAndUser({
596
+ groupID: data.id,
597
+ }, {
598
+ baseUrl: this.baseUrl,
599
+ token: this.token,
600
+ })
601
+ .then((res) => {
602
+ if (res.data?.code == 200) {
603
+ this.showMessage.message("success", "删除分组成功");
604
+ this.getGroupTreeData();
605
+ } else {
606
+ this.showMessage.message("error", res.data?.msg || "删除失败");
607
+ }
608
+ })
609
+ .catch((err) => {
610
+ this.showMessage.message("error", err.message);
611
+ });
612
+ },
613
+
614
+ removeInviteItem(item) {
615
+ const index = this.tempInviteList.findIndex((user) => user.id === item.id);
616
+ if (index !== -1) {
617
+ this.isSyncing = true;
618
+ this.tempInviteList.splice(index, 1);
619
+
620
+ // 同步到chosenList
621
+ const chosenIndex = this.chosenList.findIndex((user) => user.id === item.id);
622
+ if (chosenIndex !== -1) {
623
+ this.chosenList.splice(chosenIndex, 1);
624
+ }
625
+
626
+ // 同步取消树中对应节点的选中状态
627
+ if (this.$refs.orgTreeRef) {
628
+ this.$refs.orgTreeRef.setChecked(item.id, false);
629
+ }
630
+ if (this.$refs.appTreeRef) {
631
+ this.$refs.appTreeRef.setChecked(item.id, false);
632
+ }
633
+ if (this.$refs.groupTreeRef) {
634
+ this.$refs.groupTreeRef.setChecked(item.id, false);
635
+ }
636
+ if (this.$refs.equipmentTreeRef) {
637
+ this.$refs.equipmentTreeRef.setChecked(item.id, false);
638
+ }
639
+ if (this.$refs.monitorTreeRef) {
640
+ this.$refs.monitorTreeRef.setChecked(item.id, false);
641
+ }
642
+ this.$nextTick(() => {
643
+ this.isSyncing = false;
644
+ });
645
+ }
646
+ },
647
+
648
+ cancel() {
649
+ this.tempInviteList = [];
650
+ this.isaddressShow = false;
651
+ },
652
+
653
+ confirm() {
654
+ // 转换数据格式以保持向后兼容
655
+ const convertedList = this.tempInviteList.filter((item) => item.source !== '设备' && item.source !== '监控').map((item) => {
656
+ return {
657
+ ...item,
658
+ };
659
+ });
660
+ const convertedDeviceList = this.tempInviteList.filter((item) => item.source === '设备' || item.source === '监控').map((item) => {
661
+ return {
662
+ ...item,
663
+ };
664
+ });
665
+
666
+ this.$emit("inviteListUpdate", convertedList);
667
+ if (this.isInner) {
668
+ this.$emit("appendInvitePeople", convertedList);
669
+ this.$emit("appendInviteDevice", convertedDeviceList);
670
+ }
671
+ this.isaddressShow = false;
672
+ },
673
+
674
+ refreshCommonGroupTree() {
675
+ this.getGroupTreeData();
676
+ },
677
+
678
+ // 计算树的动态高度
679
+ calculateTreeHeight() {
680
+ if (!this.$refs.treeContainerRef) return 270;
681
+
682
+ const treeContentEl = this.$refs.treeContainerRef.querySelector(".tree-content");
683
+ if (!treeContentEl) return 270;
684
+
685
+ const treeContentRect = treeContentEl.getBoundingClientRect();
686
+ const availableHeight = treeContentRect.height;
687
+
688
+ // 确保最小高度为200px,最大不超过可用高度
689
+ return Math.max(200, Math.min(availableHeight, 400));
690
+ },
691
+
692
+ // 更新树高度
693
+ updateTreeHeight() {
694
+ const newHeight = this.calculateTreeHeight();
695
+ if (newHeight !== this.dynamicTreeHeight) {
696
+ this.dynamicTreeHeight = newHeight;
697
+ }
698
+ },
699
+
700
+ // 防抖更新函数
701
+ debouncedUpdateTreeHeight() {
702
+ if (this.resizeTimer) {
703
+ clearTimeout(this.resizeTimer);
704
+ }
705
+ this.resizeTimer = setTimeout(() => {
706
+ this.updateTreeHeight();
707
+ }, 100);
708
+ },
709
+
710
+ // 监听窗口大小变化
711
+ handleWindowResize() {
712
+ this.debouncedUpdateTreeHeight();
713
+ },
714
+ }
715
+ }
716
+ </script>
717
+
718
+ <style lang="scss" scoped>
719
+ @import "../../assets/style/mixin.scss";
720
+
721
+ :deep(.el-dialog) {
722
+ width: 878px;
723
+ border-radius: 12px;
724
+ box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4);
725
+ background: var(--dialog-bg) !important;
726
+ border: 1px solid var(--dialog-border-color);
727
+ margin-top: 25vh;
728
+
729
+ .el-dialog__header {
730
+ padding: 0 20px;
731
+ }
732
+
733
+ .el-dialog__body {
734
+ padding: 0 20px 20px;
735
+ }
736
+ }
737
+
738
+ .addresslogClass {
739
+ font-family: var(--sub-font);
740
+
741
+ .dialog-title {
742
+ display: flex;
743
+ align-items: center;
744
+ width: 100%;
745
+ justify-content: space-between;
746
+ height: 43px;
747
+ border-bottom: 1px solid var(--dialog-border-color);
748
+
749
+ .tabs {
750
+ display: flex;
751
+ font-size: 16px;
752
+ color: var(--theme-font-color);
753
+
754
+ .tabItem {
755
+ width: 70px;
756
+ text-align: center;
757
+ margin-right: 0;
758
+ line-height: 22px;
759
+ cursor: pointer;
760
+ }
761
+
762
+ .activeBorder {
763
+ position: relative;
764
+
765
+ &::after {
766
+ content: "";
767
+ display: block;
768
+ position: absolute;
769
+ left: 5px;
770
+ bottom: -12px;
771
+ width: 60px;
772
+ height: 3px;
773
+ background: var(--btn-primary-bg);
774
+ border-radius: 8px 8px 0px 0px;
775
+ }
776
+ }
777
+ }
778
+
779
+ .close-icon {
780
+ width: 16px;
781
+ height: 16px;
782
+ background: var(--close-icon) no-repeat center center / 100% 100%;
783
+ cursor: pointer;
784
+ }
785
+ }
786
+
787
+ .checkBox {
788
+ display: flex;
789
+ justify-content: space-between;
790
+ padding-top: 20px;
791
+
792
+ .userLeft {
793
+ padding: 14px;
794
+ width: 414px;
795
+ height: 350px;
796
+ border-radius: 6px;
797
+ border: 1px solid var(--dialog-border-color);
798
+ overflow-y: auto;
799
+
800
+ &::-webkit-scrollbar {
801
+ width: 2px;
802
+ height: 2px;
803
+ }
804
+
805
+ &::-webkit-scrollbar-track {
806
+ background: transparent;
807
+ }
808
+
809
+ &::-webkit-scrollbar-thumb {
810
+ background: var(--btn-primary-bg);
811
+ border-radius: 4px;
812
+ }
813
+
814
+ :deep(.el-input) {
815
+ width: 100%;
816
+ height: 36px;
817
+ line-height: 36px;
818
+ margin-bottom: 10px;
819
+ @include elInput;
820
+ }
821
+
822
+ .tree-content {
823
+ width: 100%;
824
+ height: calc(100% - 46px);
825
+ overflow: auto;
826
+
827
+ .custom-tree-node {
828
+ font-weight: 400;
829
+ font-size: 16px;
830
+ color: var(--theme-font-color);
831
+ width: 100%;
832
+ padding-left: 10px;
833
+ text-align: left;
834
+
835
+ &-editable {
836
+ width: 100%;
837
+ display: flex;
838
+ align-items: center;
839
+ justify-content: space-between;
840
+ padding-right: 35px;
841
+
842
+ .custom-tree-node-label {
843
+ max-width: 100px;
844
+ }
845
+
846
+ .node-options {
847
+ display: flex;
848
+ align-items: center;
849
+ justify-content: center;
850
+ flex-wrap: nowrap;
851
+
852
+ .node-option {
853
+ font-family: var(--sub-font);
854
+ font-weight: 500;
855
+ font-size: 14px;
856
+ color: var(--btn-primary-bg);
857
+ cursor: pointer;
858
+
859
+ &:not(:last-child) {
860
+ margin-right: 10px;
861
+ }
862
+ }
863
+ }
864
+ }
865
+
866
+ &-label {
867
+ display: inline-block;
868
+ width: fit-content;
869
+ max-width: 200px;
870
+ overflow: hidden;
871
+ text-overflow: ellipsis;
872
+ white-space: nowrap;
873
+ }
874
+
875
+ &-user {
876
+ display: flex;
877
+ justify-content: flex-start;
878
+ align-items: center;
879
+ .custom-tree-node-icon {
880
+ flex-shrink: 0;
881
+ display: inline-block;
882
+ width: 20px;
883
+ height: 20px;
884
+ margin-right: 10px;
885
+ background: url("../../assets/image/common/default_avatar.png") no-repeat
886
+ center / 100% 100%;
887
+ &-device {
888
+ background: url("../../assets/image/common/icon-device.svg") no-repeat center / 100%
889
+ 100%;
890
+ }
891
+ &-monitor {
892
+ background: url("../../assets/image/common/icon-monitor.svg") no-repeat center / 100%
893
+ 100%;
894
+ }
895
+ &-offline {
896
+ filter: grayscale(100%);
897
+ }
898
+ }
899
+ }
900
+ }
901
+ }
902
+
903
+ :deep(.el-tree) {
904
+ background: transparent !important;
905
+
906
+ .el-tree-node {
907
+ height: 36px !important;
908
+ &:focus > .el-tree-node__content {
909
+ background-color: transparent; //当选中树节点时的颜色改变,默认为白色
910
+ }
911
+
912
+ .el-tree-node__content {
913
+ position: relative;
914
+ height: 36px;
915
+
916
+ &:hover {
917
+ background-color: rgba(129, 144, 166, 0.2);
918
+ }
919
+
920
+ .el-tree-node__label {
921
+ font-weight: 400;
922
+ font-size: 16px;
923
+ color: var(--theme-font-color);
924
+ }
925
+
926
+ .el-checkbox {
927
+ position: absolute;
928
+ margin: 0;
929
+ font-size: 17px;
930
+ top: 6px;
931
+ right: 12px;
932
+
933
+ .el-checkbox__inner {
934
+ border: 1px solid var(--input-border-color);
935
+ background: transparent;
936
+ }
937
+
938
+ &.is-checked {
939
+ .el-checkbox__inner {
940
+ background-color: var(--btn-primary-bg) !important;
941
+ }
942
+ }
943
+ }
944
+ .is-leaf {
945
+ &.el-tree-node__expand-icon {
946
+ display: none !important;
947
+ }
948
+ }
949
+ .el-tree-node__expand-icon {
950
+ display: inline-block;
951
+ width: 4px !important;
952
+ height: 4px !important;
953
+ background: url("../../assets/image/common/tree_expand_icon.png") no-repeat
954
+ center / 100% 100%;
955
+ margin-bottom: 0px;
956
+ &::before {
957
+ content: "";
958
+ }
959
+ svg {
960
+ display: none;
961
+ }
962
+ }
963
+ .expanded {
964
+ transform: rotate(0deg) !important;
965
+ background: url("../../assets/image/common/tree_slide_icon.png") no-repeat
966
+ center / 100% 100% !important;
967
+ }
968
+ }
969
+ }
970
+ }
971
+ }
972
+
973
+ .userRight {
974
+ padding: 14px;
975
+ width: 414px;
976
+ height: 350px;
977
+ border-radius: 6px;
978
+ border: 1px solid var(--dialog-border-color);
979
+ overflow-y: auto;
980
+
981
+ .checkUse {
982
+ display: flex;
983
+ align-items: center;
984
+
985
+ div {
986
+ margin-right: 15px;
987
+ }
988
+
989
+ .titl {
990
+ font-size: 16px;
991
+ color: var(--theme-font-color);
992
+ }
993
+
994
+ .count {
995
+ width: 30px;
996
+ height: 18px;
997
+ background: var(--btn-primary-bg);
998
+ border-radius: 9px;
999
+ font-size: 16px;
1000
+ color: var(--theme-font-color);
1001
+ text-align: center;
1002
+ line-height: 18px;
1003
+ }
1004
+
1005
+ .adds {
1006
+ cursor: pointer;
1007
+ }
1008
+ }
1009
+
1010
+ .checkutl {
1011
+ height: calc(100% - 22px);
1012
+ overflow: auto;
1013
+
1014
+ &::-webkit-scrollbar {
1015
+ width: 2px;
1016
+ height: 2px;
1017
+ }
1018
+
1019
+ &::-webkit-scrollbar-track {
1020
+ background: transparent;
1021
+ }
1022
+
1023
+ &::-webkit-scrollbar-thumb {
1024
+ background: var(--btn-primary-bg);
1025
+ border-radius: 4px;
1026
+ }
1027
+
1028
+ .userFlex {
1029
+ margin-top: 5px;
1030
+ display: flex;
1031
+ align-items: center;
1032
+ justify-content: space-between;
1033
+ padding: 5px;
1034
+
1035
+ .label {
1036
+ font-size: 16px;
1037
+ color: var(--theme-font-color);
1038
+
1039
+ .custom-item-icon {
1040
+ width: 20px;
1041
+ height: 20px;
1042
+ vertical-align: middle;
1043
+ margin-right: 5px;
1044
+ display: inline-block;
1045
+ &-person {
1046
+ background: url("../../assets/image/common/default_avatar.png") no-repeat center / 100%
1047
+ 100%;
1048
+ }
1049
+ &-device {
1050
+ background: url("../../assets/image/common/icon-device.svg") no-repeat center / 100%
1051
+ 100%;
1052
+ }
1053
+ &-monitor {
1054
+ background: url("../../assets/image/common/icon-monitor.svg") no-repeat center / 100%
1055
+ 100%;
1056
+ }
1057
+ }
1058
+ }
1059
+
1060
+ .close {
1061
+ cursor: pointer;
1062
+ width: 16px;
1063
+ height: 16px;
1064
+ background: var(--close-icon) no-repeat center / 100% 100%;
1065
+ }
1066
+ }
1067
+ }
1068
+ }
1069
+ }
1070
+
1071
+ .footersFull {
1072
+ margin-top: 20px;
1073
+ display: flex;
1074
+ justify-content: space-between;
1075
+ align-items: center;
1076
+ font-family: var(--sub-font);
1077
+ font-size: 16px;
1078
+ color: var(--theme-font-color);
1079
+
1080
+ .addfz {
1081
+ display: flex;
1082
+ align-items: center;
1083
+ justify-content: center;
1084
+ width: 120px;
1085
+ height: 36px;
1086
+ background: var(--btn-primary-bg);
1087
+ border-radius: 8px;
1088
+ cursor: pointer;
1089
+
1090
+ img {
1091
+ margin-right: 5px;
1092
+ }
1093
+ }
1094
+
1095
+ .isokmul {
1096
+ display: flex;
1097
+
1098
+ div {
1099
+ width: 100px;
1100
+ height: 36px;
1101
+ line-height: 36px;
1102
+ text-align: center;
1103
+ border-radius: 8px;
1104
+ cursor: pointer;
1105
+ @include button;
1106
+
1107
+ &:nth-child(1) {
1108
+ border: 1px solid var(--btn-primary-bg);
1109
+ color: var(--btn-primary-bg);
1110
+ background: transparent;
1111
+ margin-right: 15px;
1112
+ }
1113
+
1114
+ &:nth-child(2) {
1115
+ @include btnPrimary;
1116
+ }
1117
+ }
1118
+ }
1119
+ }
1120
+ }
1121
+ </style>