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,291 @@
1
+ <template>
2
+ <div class="more-option" :style="optionDialogOffset">
3
+ <div
4
+ :class="['more-option-item', { 'more-option-item-danger': option === '移出会议' }]"
5
+ v-for="(option, index) of optionList"
6
+ :key="'o' + index"
7
+ @click="pickOption(option)"
8
+ >
9
+ {{ option }}
10
+ </div>
11
+ </div>
12
+ </template>
13
+
14
+ <script>
15
+ export default {
16
+ name: "MoreOptionDialog",
17
+ props: {
18
+ curBlur: {
19
+ type: String,
20
+ default: "",
21
+ },
22
+ identity: {
23
+ type: String,
24
+ default: "",
25
+ },
26
+ meetingHost: {
27
+ type: Object,
28
+ },
29
+ optionDialogOffset: {
30
+ type: Object,
31
+ default: () => ({
32
+ left: "0px",
33
+ top: "0px",
34
+ }),
35
+ },
36
+ localIdentity: {
37
+ type: String,
38
+ },
39
+ participants: {
40
+ type: Array,
41
+ },
42
+ meetingCoHost: {
43
+ type: Array,
44
+ }
45
+ },
46
+ computed: {
47
+ optionList() {
48
+ const participantItem = this.getUserItemByIdentity(this.identity);
49
+ if (participantItem && participantItem?.metadata) {
50
+ const metadata = participantItem.metadata;
51
+ const isLocalParticipant = this.identity === this.localIdentity; // 判断是否为本地与会者
52
+ console.log("participantMetadata", metadata);
53
+
54
+ if (this.judgeParticipantIsHost(this.localIdentity)) {
55
+ // 本地与会者为会议主持人
56
+ if (metadata?.platformID == 2 || metadata?.platformID == 5 || metadata?.platformID == 6) {
57
+ // 当前与会者为设备
58
+ const options = [
59
+ this.curBlur === this.identity ? "取消设为主屏" : "设为主屏",
60
+ participantItem.isMicrophoneEnabled ? "关闭麦克风" : "打开麦克风",
61
+ participantItem.isCameraEnabled ? "关闭摄像头" : "打开摄像头",
62
+ ];
63
+ // 如果不是本地与会者,添加主持人权限操作
64
+ if (!isLocalParticipant) {
65
+ options.push(
66
+ "修改名称",
67
+ "移出会议"
68
+ );
69
+ } else {
70
+ // 本地与会者只能修改名称
71
+ options.push("修改名称");
72
+ }
73
+ return options;
74
+ } else if(metadata?.platformID == 4) {
75
+ // 当前与会者为volte手机端
76
+ const options = [
77
+ this.curBlur === this.identity ? "取消设为主屏" : "设为主屏",
78
+ participantItem.isMicrophoneEnabled ? "关闭麦克风" : "打开麦克风",
79
+ participantItem.isCameraEnabled ? "关闭摄像头" : "打开摄像头",
80
+ ];
81
+ if (!isLocalParticipant) {
82
+ options.push(
83
+ metadata.isDeafness ? "取消置聋" : "置聋",
84
+ "修改名称",
85
+ "移出会议"
86
+ );
87
+ } else {
88
+ // 本地与会者只能修改名称
89
+ options.push("修改名称");
90
+ }
91
+ return options;
92
+ } else {
93
+ // 当前与会者为app手机端
94
+ const options = [
95
+ this.curBlur === this.identity ? "取消设为主屏" : "设为主屏",
96
+ participantItem.isMicrophoneEnabled ? "关闭麦克风" : "打开麦克风",
97
+ participantItem.isCameraEnabled ? "关闭摄像头" : "打开摄像头",
98
+ ];
99
+ if (!isLocalParticipant) {
100
+ options.push(
101
+ metadata.isDeafness ? "取消置聋" : "置聋",
102
+ "设为主持人",
103
+ metadata.isCoHost ? "取消设为联席主持人" : "设为联席主持人",
104
+ "修改名称",
105
+ "移出会议"
106
+ );
107
+ } else {
108
+ // 本地与会者只能修改名称
109
+ options.push("修改名称");
110
+ }
111
+ return options;
112
+ }
113
+ } else if(this.judgeParticipantIsCoHost(this.localIdentity)) {
114
+ // 本地与会者为联席主持人
115
+ if (metadata?.platformID == 2 || metadata?.platformID == 5 || metadata?.platformID == 6) {
116
+ // 当前与会者为设备
117
+ const options = [
118
+ this.curBlur === this.identity ? "取消设为主屏" : "设为主屏",
119
+ participantItem.isMicrophoneEnabled ? "关闭麦克风" : "打开麦克风",
120
+ participantItem.isCameraEnabled ? "关闭摄像头" : "打开摄像头",
121
+ ];
122
+
123
+ // 如果不是本地与会者,添加联席主持人权限操作
124
+ if (!isLocalParticipant) {
125
+ options.push(
126
+ "修改名称",
127
+ "移出会议"
128
+ );
129
+ } else {
130
+ // 本地与会者只能修改名称
131
+ options.push("修改名称");
132
+ }
133
+ return options;
134
+ } else if(metadata?.platformID == 4) {
135
+ // 当前与会者为volte手机端
136
+ const options = [
137
+ this.curBlur === this.identity ? "取消设为主屏" : "设为主屏",
138
+ participantItem.isMicrophoneEnabled ? "关闭麦克风" : "打开麦克风",
139
+ participantItem.isCameraEnabled ? "关闭摄像头" : "打开摄像头",
140
+ ];
141
+ // 如果不是本地与会者,添加联席主持人权限操作
142
+ if (!isLocalParticipant) {
143
+ options.push(
144
+ metadata.isDeafness ? "取消置聋" : "置聋",
145
+ "修改名称",
146
+ "移出会议"
147
+ );
148
+ } else {
149
+ // 本地与会者只能修改名称
150
+ options.push("修改名称");
151
+ }
152
+ return options;
153
+ } else {
154
+ // 当前与会者非sip账号
155
+ const options = [
156
+ this.curBlur === this.identity ? "取消设为主屏" : "设为主屏",
157
+ participantItem.isMicrophoneEnabled ? "关闭麦克风" : "打开麦克风",
158
+ participantItem.isCameraEnabled ? "关闭摄像头" : "打开摄像头",
159
+ ];
160
+
161
+ // 如果不是本地与会者,添加联席主持人权限操作
162
+ if (!isLocalParticipant) {
163
+ options.push(
164
+ metadata.isDeafness ? "取消置聋" : "置聋",
165
+ metadata.isCoHost ? "取消设为联席主持人" : "设为联席主持人",
166
+ "修改名称",
167
+ "移出会议"
168
+ );
169
+ } else {
170
+ // 本地与会者只能修改名称
171
+ options.push("修改名称");
172
+ }
173
+
174
+ return options;
175
+ }
176
+ }
177
+ }
178
+ return [];
179
+ },
180
+ participantNum() {
181
+ return this.participants.length;
182
+ }
183
+ },
184
+ methods: {
185
+ judgeParticipantIsHost(identity) {
186
+ return this.meetingHost.ownerId === identity;
187
+ },
188
+ judgeParticipantIsCoHost(identity) {
189
+ if(this.meetingCoHost.length > 0) {
190
+ return this.meetingCoHost.some(item => item.coHostId === identity)
191
+ } else {
192
+ return false
193
+ }
194
+ },
195
+ // 根据与会者identity返回与会者
196
+ getUserItemByIdentity(identity) {
197
+ if (this.participantNum > 0) {
198
+ const index = this.participants.findIndex((item) => {
199
+ return item.identity === identity;
200
+ });
201
+ if (index > -1) {
202
+ return this.participants[index];
203
+ } else {
204
+ return null;
205
+ }
206
+ } else {
207
+ return null;
208
+ }
209
+ },
210
+ pickOption(option) {
211
+ switch (option) {
212
+ case "设为主屏":
213
+ this.$emit("setToBlur", this.identity);
214
+ break;
215
+ case "取消设为主屏":
216
+ this.$emit("removeFromBlur", this.identity);
217
+ break;
218
+ case "打开麦克风":
219
+ this.$emit("openMicro", this.identity);
220
+ break;
221
+ case "关闭麦克风":
222
+ this.$emit("closeMicro", this.identity);
223
+ break;
224
+ case "打开摄像头":
225
+ this.$emit("openCamera", this.identity);
226
+ break;
227
+ case "关闭摄像头":
228
+ this.$emit("closeCamera", this.identity);
229
+ break;
230
+ case "设为主持人":
231
+ this.$emit("setToHost", this.identity);
232
+ break;
233
+ case "取消设为联席主持人":
234
+ this.$emit("removeFromCoHost", this.identity);
235
+ break;
236
+ case "设为联席主持人":
237
+ this.$emit("setToCoHost", this.identity);
238
+ break;
239
+ case "置聋":
240
+ this.$emit("setToDeafness", this.identity);
241
+ break;
242
+ case "取消置聋":
243
+ this.$emit("cancelDeafness", this.identity);
244
+ break;
245
+ case "修改名称":
246
+ this.$emit("updateName", this.identity);
247
+ break;
248
+ case "移出会议":
249
+ this.$emit("remove", this.identity);
250
+ break;
251
+ }
252
+ this.$emit("close");
253
+ }
254
+ },
255
+ mounted() {}
256
+ };
257
+ </script>
258
+
259
+ <style lang="scss" scoped>
260
+ .more-option {
261
+ width: 130px;
262
+ background: var(--dialog-bg);
263
+ box-shadow: 0px 0px 8px 0px var(--dialog-shadow-color);
264
+ border-radius: 8px;
265
+ border: 1px solid var(--dialog-border-color);
266
+ padding: 4px 6px;
267
+ position: absolute;
268
+ z-index: 100;
269
+ &-item {
270
+ width: 100%;
271
+ height: 36px;
272
+ line-height: 36px;
273
+ text-align: center;
274
+ white-space: nowrap;
275
+ font-weight: 500;
276
+ font-size: 14px;
277
+ color: var(--theme-font-color);
278
+ cursor: pointer;
279
+ &:hover {
280
+ background: var(--dialog-item-hover);
281
+ border-radius: 8px;
282
+ }
283
+ &:not(:last-child) {
284
+ margin-bottom: 6px;
285
+ }
286
+ &-danger {
287
+ color: var(--btn-danger-bg);
288
+ }
289
+ }
290
+ }
291
+ </style>
@@ -0,0 +1,121 @@
1
+ <template>
2
+ <div class="screen-share-board">
3
+ <div class="screen-share-board-title">您正在共享屏幕</div>
4
+ <div class="screen-share-board-option">
5
+ <div class="option-list" @click="isFluencyPriority = !isFluencyPriority">
6
+ <div
7
+ :class="['option-list-check', { 'option-list-check-active': isFluencyPriority }]"
8
+ ></div>
9
+ <div class="option-list-label">流畅度优先</div>
10
+ </div>
11
+ <div class="option-list" @click="systemAudioInclude = !systemAudioInclude">
12
+ <div
13
+ :class="['option-list-check', { 'option-list-check-active': systemAudioInclude }]"
14
+ ></div>
15
+ <div class="option-list-label">共享电脑中的声音</div>
16
+ </div>
17
+ </div>
18
+ <div class="btn" @click="stopScreenShare">停止共享</div>
19
+ </div>
20
+ </template>
21
+
22
+ <script>
23
+ export default {
24
+ name: "ScreenShareBoard",
25
+ props: {
26
+ screenShareCaptureOption: {
27
+ type: Object,
28
+ default: () => ({}),
29
+ },
30
+ },
31
+ data() {
32
+ return {
33
+ isFluencyPriority: false,
34
+ systemAudioInclude: false,
35
+ };
36
+ },
37
+ watch: {
38
+ isFluencyPriority(newVal) {
39
+ this.$emit("screenShareOptionChange", {
40
+ isFluencyPriority: newVal,
41
+ systemAudioInclude: this.systemAudioInclude,
42
+ });
43
+ },
44
+ systemAudioInclude(newVal) {
45
+ this.$emit("screenShareOptionChange", {
46
+ isFluencyPriority: this.isFluencyPriority,
47
+ systemAudioInclude: newVal,
48
+ });
49
+ }
50
+ },
51
+ mounted() {
52
+ this.isFluencyPriority = (this.screenShareCaptureOption.frameRate === 60);
53
+ this.systemAudioInclude = this.screenShareCaptureOption.systemAudio === "include";
54
+ },
55
+ methods: {
56
+ stopScreenShare() {
57
+ this.$emit("stopScreenShare");
58
+ },
59
+ }
60
+ }
61
+ </script>
62
+
63
+ <style lang="scss" scoped>
64
+ @import "../../assets/style/mixin.scss";
65
+ .screen-share-board {
66
+ position: absolute;
67
+ z-index: 4000;
68
+ left: 0;
69
+ top: 0;
70
+ width: 100%;
71
+ height: 100%;
72
+ // background: var(--meeting-bg);
73
+ background: var(--dialog-bg);
74
+ border-bottom: 1px solid var(--dialog-border-color);
75
+ display: flex;
76
+ flex-direction: column;
77
+ align-items: center;
78
+ justify-content: center;
79
+
80
+ &-title {
81
+ font-size: 30px;
82
+ font-weight: 400;
83
+ color: var(--theme-font-color);
84
+ line-height: 43px;
85
+ margin-bottom: 30px;
86
+ }
87
+ &-option {
88
+ .option-list {
89
+ display: flex;
90
+ align-items: center;
91
+ flex-wrap: nowrap;
92
+ flex: 0 0;
93
+ cursor: pointer;
94
+ margin-bottom: 20px;
95
+ &-check {
96
+ width: 17px;
97
+ height: 17px;
98
+ background: url("../../assets/image/common/selector.png") no-repeat center center / 100% 100%;
99
+ margin-right: 12px;
100
+ &-active {
101
+ background: url("../../assets/image/common/selectorOn.png") no-repeat center center / 100% 100%;
102
+ }
103
+ }
104
+ &-label {
105
+ font-size: 14px;
106
+ font-weight: 400;
107
+ color: var(--theme-font-color);
108
+ line-height: 23px;
109
+ white-space: nowrap;
110
+ }
111
+ }
112
+ }
113
+ .btn {
114
+ width: 112px;
115
+ height: 36px;
116
+ margin-top: 10px;
117
+ @include button;
118
+ @include btnDanger;
119
+ }
120
+ }
121
+ </style>
@@ -0,0 +1,279 @@
1
+ <template>
2
+ <div :class="['check-dialog', {'check-dialog-mini': dialogType === 'other'}]" :style="position">
3
+ <div class="check-dialog-inner">
4
+ <template v-if="dialogType === 'audio'">
5
+ <div class="control-list" style="border: none">
6
+ <div class="control-list-title">麦克风</div>
7
+ <div
8
+ :class="[
9
+ 'control-list-item',
10
+ {
11
+ 'control-list-item-checked':
12
+ activeDevice?.audioInputDevice && item.value == activeDevice?.audioInputDevice,
13
+ },
14
+ ]"
15
+ v-for="item of audioDevices"
16
+ :key="item.value"
17
+ @click="chooseAudioInputDevice(item)"
18
+ >
19
+ <div class="control-list-item-value" :title="item.label">{{ item.label }}</div>
20
+ <div
21
+ :class="[
22
+ 'check',
23
+ {
24
+ 'is-checked':
25
+ activeDevice?.audioInputDevice && item.value == activeDevice?.audioInputDevice,
26
+ },
27
+ ]"
28
+ ></div>
29
+ </div>
30
+ </div>
31
+ <!-- <div class="control-footer">
32
+ <div class="control-link" @click="detectMicroAndOutput">监测麦克风和扬声器</div>
33
+ </div> -->
34
+ </template>
35
+ <template v-else-if="dialogType === 'output'">
36
+ <div class="control-list">
37
+ <div class="control-list-title">扬声器</div>
38
+ <div
39
+ :class="[
40
+ 'control-list-item',
41
+ {
42
+ 'control-list-item-checked':
43
+ activeDevice?.audioOutputDevice && item.value == activeDevice?.audioOutputDevice,
44
+ },
45
+ ]"
46
+ v-for="item of outputDevices"
47
+ :key="item.value"
48
+ @click="chooseAudioOutputDevice(item)"
49
+ >
50
+ <div class="control-list-item-value" :title="item.label">{{ item.label }}</div>
51
+ <div
52
+ :class="[
53
+ 'check',
54
+ {
55
+ 'is-checked':
56
+ activeDevice?.audioOutputDevice &&
57
+ item.value == activeDevice?.audioOutputDevice,
58
+ },
59
+ ]"
60
+ ></div>
61
+ </div>
62
+ </div>
63
+ </template>
64
+ <template v-else-if="dialogType === 'video'">
65
+ <div class="control-list">
66
+ <div class="control-list-title">摄像头</div>
67
+ <div
68
+ :class="[
69
+ 'control-list-item',
70
+ {
71
+ 'control-list-item-checked':
72
+ activeDevice?.videoDevice && item.value == activeDevice?.videoDevice,
73
+ },
74
+ ]"
75
+ v-for="item of videoDevices"
76
+ :key="item.value"
77
+ @click="chooseVideoDevice(item)"
78
+ >
79
+ <div class="control-list-item-value" :title="item.label">{{ item.label }}</div>
80
+ <div
81
+ :class="[
82
+ 'check',
83
+ {
84
+ 'is-checked':
85
+ activeDevice?.videoDevice && item.value == activeDevice?.videoDevice,
86
+ },
87
+ ]"
88
+ ></div>
89
+ </div>
90
+ </div>
91
+ <!-- <div class="control-footer">
92
+ <div class="control-link" @click="detectCamera">视频选项</div>
93
+ </div> -->
94
+ </template>
95
+ <template v-else-if="dialogType === 'other'">
96
+ <div class="control-list">
97
+ <div
98
+ :class="[
99
+ 'control-list-item',
100
+ {
101
+ 'control-list-item-checked': currentRoomMode === item.value,
102
+ },
103
+ ]"
104
+ v-for="item of otherOptionList"
105
+ :key="item.value"
106
+ @click="chooseOtherItem(item)"
107
+ >
108
+ <div class="control-list-item-value">{{ item.label }}</div>
109
+ <!-- <div
110
+ :class="[
111
+ 'check',
112
+ {
113
+ 'is-checked': currentRoomMode === item.value,
114
+ },
115
+ ]"
116
+ ></div> -->
117
+ </div>
118
+ </div>
119
+ </template>
120
+ </div>
121
+ </div>
122
+ </template>
123
+
124
+ <script>
125
+ export default {
126
+ name: "SelectDialog",
127
+ props: {
128
+ position: {
129
+ type: Object,
130
+ default: () => {
131
+ return {
132
+ left: "0px",
133
+ bottom: "30px",
134
+ };
135
+ },
136
+ },
137
+ dialogType: {
138
+ type: String,
139
+ default: "audio",
140
+ },
141
+ otherOptionList: {
142
+ type: Array,
143
+ default: () => {
144
+ return [
145
+ {
146
+ label: "会议模式",
147
+ value: "normal",
148
+ },
149
+ {
150
+ label: "点调模式",
151
+ value: "pointTurn",
152
+ },
153
+ ];
154
+ },
155
+ },
156
+ audioDevices: {
157
+ type: Array,
158
+ default: () => [],
159
+ },
160
+ outputDevices: {
161
+ type: Array,
162
+ default: () => [],
163
+ },
164
+ videoDevices: {
165
+ type: Array,
166
+ default: () => [],
167
+ },
168
+ activeDevice: {
169
+ type: Object,
170
+ default: () => ({}),
171
+ },
172
+ currentRoomMode: {
173
+ type: String,
174
+ default: "normal",
175
+ },
176
+ },
177
+ methods: {
178
+ chooseAudioInputDevice(item) {
179
+ this.$emit("chooseAudioInputDevice", item.value)
180
+ this.$emit('close')
181
+ },
182
+ chooseAudioOutputDevice(item) {
183
+ this.$emit("chooseAudioOutputDevice", item.value)
184
+ this.$emit('close')
185
+ },
186
+ chooseVideoDevice(item) {
187
+ this.$emit("chooseVideoDevice", item.value)
188
+ this.$emit('close')
189
+ },
190
+ chooseOtherItem(item) {
191
+ this.$emit("chooseOtherItem", item.value)
192
+ this.$emit('close')
193
+ }
194
+ }
195
+ }
196
+ </script>
197
+
198
+ <style lang="scss" scoped>
199
+ .check-dialog {
200
+ width: 340px;
201
+ padding-bottom: 10px;
202
+ position: absolute;
203
+ z-index: 1000;
204
+ &-mini {
205
+ width: 110px;
206
+ .control-list-item-value {
207
+ text-align: center !important;
208
+ }
209
+ }
210
+ &-inner {
211
+ width: 100%;
212
+ background: var(--dialog-bg);
213
+ box-shadow: 0px 0px 8px 0px var(--dialog-shadow-color);
214
+ border-radius: 6px;
215
+ border: 1px solid var(--dialog-border-color);
216
+ padding: 4px 6px;
217
+ .control-list {
218
+ width: 100%;
219
+ font-weight: 400;
220
+ color: var(--theme-font-color);
221
+
222
+ &-title {
223
+ text-align: left;
224
+ font-size: 14px;
225
+ line-height: 22px;
226
+ margin-bottom: 19px;
227
+ }
228
+ &-item {
229
+ width: 100%;
230
+ height: 36px;
231
+ cursor: pointer;
232
+ font-size: 12px;
233
+ display: flex;
234
+ align-items: center;
235
+ flex-wrap: nowrap;
236
+ justify-content: space-between;
237
+ padding: 0 12px;
238
+ &-checked {
239
+ background: var(--dialog-item-hover);
240
+ border-radius: 4px;
241
+ }
242
+ &:hover {
243
+ background: var(--dialog-item-hover);
244
+ border-radius: 4px;
245
+ }
246
+ &-value {
247
+ width: 100%;
248
+ text-align: left;
249
+ white-space: nowrap;
250
+ overflow: hidden;
251
+ text-overflow: ellipsis;
252
+ }
253
+ .check {
254
+ width: 20px;
255
+ height: 20px;
256
+ }
257
+ .is-checked {
258
+ background: var(--dialog-item-checked-icon) no-repeat center / 100% 100%;
259
+ }
260
+ &:not(:last-child) {
261
+ margin-bottom: 8px;
262
+ }
263
+ }
264
+ }
265
+ .control-footer {
266
+ width: 100%;
267
+ padding: 10px 0 3px;
268
+ .control-link {
269
+ width: 100%;
270
+ text-align: left;
271
+ cursor: pointer;
272
+ white-space: nowrap;
273
+ color: #5fa7fd;
274
+ font-size: 16px;
275
+ }
276
+ }
277
+ }
278
+ }
279
+ </style>