@utogether/udp-core 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 (343) hide show
  1. package/build/index.ts +90 -0
  2. package/build/plugins.ts +26 -0
  3. package/dist/403-B1R-4vXw.js +64 -0
  4. package/dist/404-fXPl8csw.js +64 -0
  5. package/dist/500-eI5842YB.js +66 -0
  6. package/dist/AuthorityInfo-CfVH6PaB.js +4 -0
  7. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-DbK-f8jH.js +102 -0
  8. package/dist/AuthorityPanel-BaLMwMgW.js +4 -0
  9. package/dist/AuthorityPanel.vue_vue_type_style_index_0_lang-C_bkqLD9.js +107 -0
  10. package/dist/Company-CYC9Avfz.js +25 -0
  11. package/dist/CompanyPanel-B4MzoqN_.js +206 -0
  12. package/dist/DataSet-DT-rGICv.js +147 -0
  13. package/dist/Department-B4BNSiYx.js +25 -0
  14. package/dist/DepartmentPanel-zJO89L2O.js +224 -0
  15. package/dist/DesignPanel-S8P0J97f.js +4 -0
  16. package/dist/DesignPanel.vue_vue_type_style_index_0_lang-DW-_Vqrr.js +1015 -0
  17. package/dist/DictView-bIS5-rK-.js +95 -0
  18. package/dist/InvOrganization-MuM2jtsG.js +66 -0
  19. package/dist/Org-kXHSjsgJ.js +35 -0
  20. package/dist/Preview-CRyiwUIR.js +48 -0
  21. package/dist/ReportDefine-WZYIx8Sm.js +10 -0
  22. package/dist/ReportDesign-D-7GKgpb.js +165 -0
  23. package/dist/ReportQuery-BIIJny6w.js +75 -0
  24. package/dist/ReportQueryFrom-OoUl7N2O.js +4 -0
  25. package/dist/ReportQueryFrom.vue_vue_type_style_index_0_lang-B878fgj8.js +177 -0
  26. package/dist/ReportTemplate-Cfeq9US-.js +161 -0
  27. package/dist/Role-BwTV2QMH.js +25 -0
  28. package/dist/RoleAssign-De1JjOun.js +26 -0
  29. package/dist/RolePanel-E3RcdByM.js +4 -0
  30. package/dist/RolePanel-pUBXsqCM.js +4 -0
  31. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-B2pQwHb0.js +148 -0
  32. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-CTIad9_Q.js +126 -0
  33. package/dist/ScrollPanel.vue_vue_type_style_index_0_lang-vMR1fBi0.js +100 -0
  34. package/dist/Staff-Czm7A8vI.js +25 -0
  35. package/dist/StaffInfo-DJzvBuxy.js +4 -0
  36. package/dist/StaffInfo.vue_vue_type_style_index_0_lang-DMTL7KCh.js +108 -0
  37. package/dist/StaffPanel-CHk60LEz.js +4 -0
  38. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-iPKLb5wG.js +114 -0
  39. package/dist/SysUser-BGwbttRn.js +15 -0
  40. package/dist/SysUserPanel-BCbKoLKt.js +4 -0
  41. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-0QUjnhjF.js +289 -0
  42. package/dist/SystemMenu-BkqZSDKl.js +151 -0
  43. package/dist/UserInfo-BsyAcT2d.js +4 -0
  44. package/dist/UserInfo.vue_vue_type_style_index_0_lang-D0-KDxAh.js +158 -0
  45. package/dist/await-to-js.es5-BtRbN2QH.js +10 -0
  46. package/dist/childView-CF83nhxb.js +4 -0
  47. package/dist/childView-CyuLTUqC.js +4 -0
  48. package/dist/childView.vue_vue_type_style_index_0_lang-CNSgGda3.js +187 -0
  49. package/dist/childView.vue_vue_type_style_index_0_lang-Cch4lE-i.js +144 -0
  50. package/dist/code-rule-Bz-gnktN.js +147 -0
  51. package/dist/core.es.js +13 -0
  52. package/dist/core.umd.js +173 -0
  53. package/dist/cron-task-CIifSUdW.js +135 -0
  54. package/dist/frameView-_d2mqjjQ.js +43 -0
  55. package/dist/img/l_img.svg +1 -0
  56. package/dist/img/minicolors.png +0 -0
  57. package/dist/img/v_img.svg +1 -0
  58. package/dist/index-BKIw8tSn.js +9195 -0
  59. package/dist/layoutView-DLKVepB8.js +3317 -0
  60. package/dist/log-in-e7D5Ss1P.js +110 -0
  61. package/dist/log-out--RRncZhN.js +120 -0
  62. package/dist/login-LREiDfFU.js +251 -0
  63. package/dist/login-log-CvVnyGi3.js +68 -0
  64. package/dist/lov-view-DDrIVILB.js +97 -0
  65. package/dist/menuInfo-B1FUV-Sk.js +4 -0
  66. package/dist/menuInfo.vue_vue_type_style_index_0_lang-Cnk3vdtD.js +338 -0
  67. package/dist/pda-app-CRhVGijN.js +2209 -0
  68. package/dist/redirect-DiaNDu8F.js +15 -0
  69. package/dist/resource-BCwx9fEv.js +97 -0
  70. package/dist/su-welcome-189A7N4r.js +526 -0
  71. package/dist/sys-config-BZ3sejow.js +277 -0
  72. package/dist/udp-core.css +9 -0
  73. package/dist/utogether-r08LNiIZ.js +182 -0
  74. package/index.ts +36 -0
  75. package/package.json +16 -0
  76. package/public/img/l_img.svg +1 -0
  77. package/public/img/minicolors.png +0 -0
  78. package/public/img/v_img.svg +1 -0
  79. package/src/App.vue +70 -0
  80. package/src/api/http.ts +50 -0
  81. package/src/api/index.ts +31 -0
  82. package/src/api/mock.ts +20 -0
  83. package/src/api/user.ts +43 -0
  84. package/src/assets/images/avatars.jpg +0 -0
  85. package/src/assets/images/empty.png +0 -0
  86. package/src/assets/images/login.png +0 -0
  87. package/src/assets/images/logo.png +0 -0
  88. package/src/assets/images/mask-text.jpg +0 -0
  89. package/src/assets/images/minicolors.png +0 -0
  90. package/src/assets/images/utogether.png +0 -0
  91. package/src/assets/images/welcome.png +0 -0
  92. package/src/assets/status/403.svg +1 -0
  93. package/src/assets/status/404.svg +1 -0
  94. package/src/assets/status/500.svg +1 -0
  95. package/src/assets/svg/back_top.svg +1 -0
  96. package/src/assets/svg/bg.svg +1 -0
  97. package/src/assets/svg/close.svg +1 -0
  98. package/src/assets/svg/close_all.svg +1 -0
  99. package/src/assets/svg/close_left.svg +1 -0
  100. package/src/assets/svg/close_other.svg +1 -0
  101. package/src/assets/svg/close_right.svg +1 -0
  102. package/src/assets/svg/dark.svg +1 -0
  103. package/src/assets/svg/day.svg +1 -0
  104. package/src/assets/svg/enter_outlined.svg +1 -0
  105. package/src/assets/svg/exit_screen.svg +1 -0
  106. package/src/assets/svg/full_screen.svg +1 -0
  107. package/src/assets/svg/globalization.svg +1 -0
  108. package/src/assets/svg/loading.svg +17 -0
  109. package/src/assets/svg/mdi_keyboard_esc.svg +1 -0
  110. package/src/assets/svg/refresh.svg +1 -0
  111. package/src/assets/svg/system.svg +1 -0
  112. package/src/components/ReCountTo/README.md +2 -0
  113. package/src/components/ReCountTo/index.ts +18 -0
  114. package/src/components/ReCountTo/src/normal/index.tsx +165 -0
  115. package/src/components/ReCountTo/src/normal/props.ts +37 -0
  116. package/src/components/ReCountTo/src/rebound/index.tsx +67 -0
  117. package/src/components/ReCountTo/src/rebound/props.ts +14 -0
  118. package/src/components/ReCountTo/src/rebound/rebound.css +77 -0
  119. package/src/components/ReCropper/index.ts +14 -0
  120. package/src/components/ReCropper/src/index.tsx +141 -0
  121. package/src/components/ReFlicker/index.css +39 -0
  122. package/src/components/ReFlicker/index.ts +50 -0
  123. package/src/components/ReFlop/index.ts +14 -0
  124. package/src/components/ReFlop/src/Filpper.tsx +99 -0
  125. package/src/components/ReFlop/src/filpper.css +184 -0
  126. package/src/components/ReFlop/src/index.vue +126 -0
  127. package/src/components/ReFlowChart/index.ts +24 -0
  128. package/src/components/ReFlowChart/src/Control.vue +139 -0
  129. package/src/components/ReFlowChart/src/DataDialog.vue +12 -0
  130. package/src/components/ReFlowChart/src/NodePanel.vue +151 -0
  131. package/src/components/ReFlowChart/src/adpterForTurbo.ts +160 -0
  132. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.css +49 -0
  133. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.eot +0 -0
  134. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.js +61 -0
  135. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.json +58 -0
  136. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.svg +47 -0
  137. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.ttf +0 -0
  138. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.woff +0 -0
  139. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.woff2 +0 -0
  140. package/src/components/ReFlowChart/src/config.ts +62 -0
  141. package/src/components/ReIcon/index.ts +12 -0
  142. package/src/components/ReIcon/src/Icon.vue +81 -0
  143. package/src/components/ReIcon/src/hooks.ts +63 -0
  144. package/src/components/ReIcon/src/iconfont.ts +45 -0
  145. package/src/components/ReIcon/src/iconifyIconOffline.ts +36 -0
  146. package/src/components/ReIcon/src/iconifyIconOnline.ts +28 -0
  147. package/src/components/ReIcon/src/offlineIcon.ts +64 -0
  148. package/src/components/ReIcon/src/types.ts +20 -0
  149. package/src/components/ReSplitPane/index.css +49 -0
  150. package/src/components/ReSplitPane/index.tsx +119 -0
  151. package/src/components/ReSplitPane/resizer.css +45 -0
  152. package/src/components/ReSplitPane/resizer.tsx +30 -0
  153. package/src/components/SuCharts/index.ts +36 -0
  154. package/src/components/SuCharts/src/EchartBar.vue +134 -0
  155. package/src/components/SuCharts/src/UserInfo.vue +78 -0
  156. package/src/components/SuCharts/src/echart-line.vue +85 -0
  157. package/src/components/SuCharts/src/echart-pie.vue +95 -0
  158. package/src/components/SuCommon/card/components/Card.vue +148 -0
  159. package/src/components/SuCommon/card/components/DialogForm.vue +127 -0
  160. package/src/components/SuCommon/card/index.vue +142 -0
  161. package/src/components/SuCommon/icon-select/index.vue +241 -0
  162. package/src/components/SuCommon/table/index.vue +208 -0
  163. package/src/components/SuCommon/utils/index.ts +103 -0
  164. package/src/components/SuCommon/utils/slot.tsx +50 -0
  165. package/src/components/SuFloatButton/index.vue +159 -0
  166. package/src/components/SuQrcode/index.ts +14 -0
  167. package/src/components/SuQrcode/src/index.scss +9 -0
  168. package/src/components/SuQrcode/src/index.tsx +236 -0
  169. package/src/components/SuScrollTree/ScrollPanel.vue +175 -0
  170. package/src/components/SuTable/SuTable.vue +334 -0
  171. package/src/components/SuTypeit/index.ts +51 -0
  172. package/src/config/index.ts +35 -0
  173. package/src/contant/index.ts +20 -0
  174. package/src/directives/elResizeDetector/index.ts +33 -0
  175. package/src/directives/index.ts +11 -0
  176. package/src/directives/permission/index.ts +29 -0
  177. package/src/layout/components/lay-chrome/index.vue +30 -0
  178. package/src/layout/components/lay-content/index.vue +143 -0
  179. package/src/layout/components/lay-navbar/index.vue +237 -0
  180. package/src/layout/components/lay-notice/data.ts +59 -0
  181. package/src/layout/components/lay-notice/index.vue +83 -0
  182. package/src/layout/components/lay-notice/noticeItem.vue +160 -0
  183. package/src/layout/components/lay-notice/noticeList.vue +19 -0
  184. package/src/layout/components/lay-panel/index.vue +150 -0
  185. package/src/layout/components/lay-search/components/SearchFooter.vue +67 -0
  186. package/src/layout/components/lay-search/components/SearchModal.vue +189 -0
  187. package/src/layout/components/lay-search/components/SearchResult.vue +132 -0
  188. package/src/layout/components/lay-search/components/index.ts +10 -0
  189. package/src/layout/components/lay-search/index.vue +25 -0
  190. package/src/layout/components/lay-select-org/index.vue +69 -0
  191. package/src/layout/components/lay-setting/index.vue +510 -0
  192. package/src/layout/components/lay-sidebar/breadCrumb.vue +131 -0
  193. package/src/layout/components/lay-sidebar/extraIcon.vue +25 -0
  194. package/src/layout/components/lay-sidebar/hamBurger.vue +72 -0
  195. package/src/layout/components/lay-sidebar/horizontal.vue +191 -0
  196. package/src/layout/components/lay-sidebar/mixNav.vue +258 -0
  197. package/src/layout/components/lay-sidebar/sidebar-logo.vue +98 -0
  198. package/src/layout/components/lay-sidebar/sidebarItem.vue +205 -0
  199. package/src/layout/components/lay-sidebar/vertical.vue +94 -0
  200. package/src/layout/components/lay-tag/index.scss +375 -0
  201. package/src/layout/components/lay-tag/index.vue +625 -0
  202. package/src/layout/frameView.vue +71 -0
  203. package/src/layout/hooks/useBoolean.ts +33 -0
  204. package/src/layout/hooks/useDataThemeChange.ts +142 -0
  205. package/src/layout/hooks/useLayout.ts +65 -0
  206. package/src/layout/hooks/useNav.ts +173 -0
  207. package/src/layout/hooks/useTag.ts +233 -0
  208. package/src/layout/hooks/useTranslationLang.ts +51 -0
  209. package/src/layout/layoutView.vue +215 -0
  210. package/src/layout/redirect.vue +30 -0
  211. package/src/layout/routerView/parent.vue +23 -0
  212. package/src/layout/types.ts +92 -0
  213. package/src/main.ts +108 -0
  214. package/src/plugins/echarts/index.ts +58 -0
  215. package/src/plugins/echarts/theme.json +394 -0
  216. package/src/plugins/i18n/en.ts +289 -0
  217. package/src/plugins/i18n/index.ts +76 -0
  218. package/src/plugins/i18n/module/u-report.ts +64 -0
  219. package/src/plugins/i18n/module/u-workflow.ts +71 -0
  220. package/src/plugins/i18n/module/umsg.ts +28 -0
  221. package/src/plugins/i18n/zh.ts +337 -0
  222. package/src/plugins/vxe-table/index.ts +46 -0
  223. package/src/plugins/vxe-table/render.tsx +397 -0
  224. package/src/router/createComponent.tsx +25 -0
  225. package/src/router/index.ts +183 -0
  226. package/src/router/modules/error.ts +32 -0
  227. package/src/router/modules/home.ts +32 -0
  228. package/src/router/modules/nested.ts +93 -0
  229. package/src/router/modules/remaining.ts +83 -0
  230. package/src/router/modules/tabs.ts +55 -0
  231. package/src/router/utils.ts +377 -0
  232. package/src/store/index.ts +9 -0
  233. package/src/store/modules/app.ts +69 -0
  234. package/src/store/modules/epTheme.ts +49 -0
  235. package/src/store/modules/multiTags.ts +109 -0
  236. package/src/store/modules/permission.ts +103 -0
  237. package/src/store/modules/settings.ts +40 -0
  238. package/src/store/modules/system.ts +180 -0
  239. package/src/store/modules/types.ts +49 -0
  240. package/src/style/button.scss +78 -0
  241. package/src/style/clear-mixin.scss +28 -0
  242. package/src/style/dark.scss +218 -0
  243. package/src/style/element-plus.scss +206 -0
  244. package/src/style/index.scss +76 -0
  245. package/src/style/login.css +336 -0
  246. package/src/style/login2.css +106 -0
  247. package/src/style/print-lock.css +375 -0
  248. package/src/style/reset.scss +272 -0
  249. package/src/style/sidebar.scss +770 -0
  250. package/src/style/suprint.css +985 -0
  251. package/src/style/tailwind.css +68 -0
  252. package/src/style/theme.scss +143 -0
  253. package/src/style/transition.scss +42 -0
  254. package/src/style/vxetable.scss +256 -0
  255. package/src/utils/authority/index.ts +29 -0
  256. package/src/utils/browers.ts +59 -0
  257. package/src/utils/dataFormat/index.ts +223 -0
  258. package/src/utils/http/index.ts +297 -0
  259. package/src/utils/http/types.d.ts +46 -0
  260. package/src/utils/index.ts +47 -0
  261. package/src/utils/lifecycle.ts +20 -0
  262. package/src/utils/mitt.ts +19 -0
  263. package/src/utils/propTypes.ts +47 -0
  264. package/src/utils/storage/index.ts +51 -0
  265. package/src/views/components/contextmenu/basic.vue +74 -0
  266. package/src/views/components/contextmenu/context-menu.vue +40 -0
  267. package/src/views/components/contextmenu/menuDynamic.vue +99 -0
  268. package/src/views/components/contextmenu/menuGroup.vue +71 -0
  269. package/src/views/components/count-to/index.vue +43 -0
  270. package/src/views/components/cropping/index.vue +59 -0
  271. package/src/views/components/cropping/picture.jpeg +0 -0
  272. package/src/views/components/split-pane/index.vue +82 -0
  273. package/src/views/components/video/index.vue +57 -0
  274. package/src/views/error/403.vue +50 -0
  275. package/src/views/error/404.vue +50 -0
  276. package/src/views/error/500.vue +52 -0
  277. package/src/views/login/login-view.vue +314 -0
  278. package/src/views/login/utils/motion.ts +47 -0
  279. package/src/views/login/utils/rule.ts +70 -0
  280. package/src/views/login/utils/verifyCode.ts +52 -0
  281. package/src/views/organization/company/Company.vue +56 -0
  282. package/src/views/organization/company/CompanyPanel.vue +259 -0
  283. package/src/views/organization/department/Department.vue +58 -0
  284. package/src/views/organization/department/DepartmentPanel.vue +283 -0
  285. package/src/views/organization/inv-org/InvOrganization.vue +53 -0
  286. package/src/views/organization/org/Org.vue +43 -0
  287. package/src/views/organization/staff/Staff.vue +58 -0
  288. package/src/views/organization/staff/StaffInfo.vue +163 -0
  289. package/src/views/organization/staff/StaffPanel.vue +144 -0
  290. package/src/views/system/cron/cron-task.vue +157 -0
  291. package/src/views/system/menu/AuthorityPanel.vue +140 -0
  292. package/src/views/system/menu/SystemMenu.vue +191 -0
  293. package/src/views/system/menu/menuInfo.vue +368 -0
  294. package/src/views/system/role/AuthorityInfo.vue +147 -0
  295. package/src/views/system/role/Role.vue +57 -0
  296. package/src/views/system/role/RolePanel.vue +191 -0
  297. package/src/views/system/role/UserInfo.vue +193 -0
  298. package/src/views/system/role-assign/RoleAssign.vue +57 -0
  299. package/src/views/system/role-assign/RolePanel.vue +136 -0
  300. package/src/views/system/sys/sys-config.vue +291 -0
  301. package/src/views/system/sysUser/SysUser.vue +45 -0
  302. package/src/views/system/sysUser/SysUserPanel.vue +278 -0
  303. package/src/views/uapp/pda/pda-app.vue +176 -0
  304. package/src/views/udev/coderule/code-rule.vue +121 -0
  305. package/src/views/udev/dict/DictView.vue +106 -0
  306. package/src/views/udev/dict/childView.vue +222 -0
  307. package/src/views/udev/lov/childView.vue +180 -0
  308. package/src/views/udev/lov/lov-view.vue +91 -0
  309. package/src/views/ufile/aggregation/File.vue +87 -0
  310. package/src/views/ufile/file/water-mark.vue +103 -0
  311. package/src/views/uhome/components/menu-favorite.vue +331 -0
  312. package/src/views/uhome/su-welcome.vue +339 -0
  313. package/src/views/ulogin/login.vue +316 -0
  314. package/src/views/umsg/monitor/msg-monitor.vue +36 -0
  315. package/src/views/umsg/msg/TemplateContent.vue +103 -0
  316. package/src/views/umsg/msg/msg-template.vue +66 -0
  317. package/src/views/umsg/send/childView.vue +142 -0
  318. package/src/views/umsg/send/msg-send.vue +95 -0
  319. package/src/views/upms/interface/log-in.vue +106 -0
  320. package/src/views/upms/interface/log-out.vue +107 -0
  321. package/src/views/upms/user/login-log.vue +60 -0
  322. package/src/views/urpt/dataSet/DataSet.vue +139 -0
  323. package/src/views/urpt/design/DesignPanel.vue +526 -0
  324. package/src/views/urpt/design/Preview.vue +65 -0
  325. package/src/views/urpt/design/ReportDesign.vue +249 -0
  326. package/src/views/urpt/design/bg.png +0 -0
  327. package/src/views/urpt/design/panel.ts +841 -0
  328. package/src/views/urpt/design/print-data.ts +59 -0
  329. package/src/views/urpt/query/ReportQuery.vue +122 -0
  330. package/src/views/urpt/query/ReportQueryFrom.vue +252 -0
  331. package/src/views/urpt/report-request/ReportDefine.vue +10 -0
  332. package/src/views/urpt/static-resource/resource.vue +116 -0
  333. package/src/views/urpt/template/ReportTemplate.vue +198 -0
  334. package/tsconfig.json +30 -0
  335. package/types/env.d.ts +1 -0
  336. package/types/global-components.d.ts +12 -0
  337. package/types/global.d.ts +236 -0
  338. package/types/image.d.ts +7 -0
  339. package/types/index.d.ts +73 -0
  340. package/types/router.d.ts +107 -0
  341. package/types/shims-tsx.d.ts +22 -0
  342. package/types/shims-vue.d.ts +20 -0
  343. package/vite.config.ts +73 -0
@@ -0,0 +1,625 @@
1
+ <script lang="ts">
2
+ export default { name: 'LayoutTag' };
3
+ </script>
4
+ <script setup lang="ts">
5
+ import { ref, watch, unref, nextTick, onBeforeUnmount } from 'vue';
6
+ import { isEqual, isEmpty } from 'xe-utils';
7
+ import { useResizeObserver, useDebounceFn, useFullscreen, onClickOutside } from '@vueuse/core';
8
+ import { delay } from '@utogether/utils';
9
+ import { emitter } from '../../../utils/mitt';
10
+ import { routerArrays } from '../../types';
11
+ import { useSettingStoreHook } from '../../../store/modules/settings';
12
+ import { handleAliveRoute } from '../../../router/utils';
13
+ import { useMultiTagsStoreHook } from '../../../store/modules/multiTags';
14
+ import { usePermissionStoreHook } from '../../../store/modules/permission';
15
+ import { useTags } from '../../hooks/useTag';
16
+ import { RouteConfigs } from '../../types';
17
+ import TagChrome from '../lay-chrome/index.vue';
18
+
19
+ const {
20
+ route,
21
+ router,
22
+ visible,
23
+ showTags,
24
+ instance,
25
+ multiTags,
26
+ tagsViews,
27
+ buttonTop,
28
+ buttonLeft,
29
+ showModel,
30
+ translateX,
31
+ isFixedTag,
32
+ SuSetting,
33
+ activeIndex,
34
+ getTabStyle,
35
+ iconIsActive,
36
+ linkIsActive,
37
+ currentSelect,
38
+ scheduleIsActive,
39
+ getContextMenuStyle,
40
+ closeMenu,
41
+ onMounted,
42
+ onMouseenter,
43
+ onMouseleave,
44
+ transformI18n,
45
+ onContentFullScreen
46
+ } = useTags();
47
+
48
+ const suSetting = useSettingStoreHook();
49
+ const tabDom = ref();
50
+ const containerDom = ref();
51
+ const scrollbarDom = ref();
52
+ const contextmenuRef = ref();
53
+ const isShowArrow = ref(false);
54
+ const { isFullscreen, toggle } = useFullscreen();
55
+
56
+ const fixedTags = [
57
+ ...routerArrays,
58
+ ...usePermissionStoreHook().flatteningRoutes.filter(v => v?.meta?.fixedTag)
59
+ ];
60
+ const dynamicTagView = async () => {
61
+ await nextTick();
62
+ const index = multiTags.value.findIndex(item => {
63
+ if (!isEmpty(route.query)) {
64
+ return isEqual(route.query, item.query);
65
+ } else if (!isEmpty(route.params)) {
66
+ return isEqual(route.params, item.params);
67
+ } else {
68
+ return route.path === item.path;
69
+ }
70
+ });
71
+ moveToView(index);
72
+ };
73
+
74
+ const moveToView = async (index: number): Promise<void> => {
75
+ await nextTick();
76
+ const tabNavPadding = 10;
77
+ if (!instance.refs['dynamic' + index]) return;
78
+ const tabItemEl = instance.refs['dynamic' + index][0];
79
+ const tabItemElOffsetLeft = (tabItemEl as HTMLElement)?.offsetLeft;
80
+ const tabItemOffsetWidth = (tabItemEl as HTMLElement)?.offsetWidth;
81
+ // 标签页导航栏可视长度(不包含溢出部分)
82
+ const scrollbarDomWidth = scrollbarDom.value ? scrollbarDom.value.offsetWidth : 0;
83
+ // 已有标签页总长度(包含溢出部分)
84
+ const tabDomWidth = tabDom.value ? tabDom.value?.offsetWidth : 0;
85
+ scrollbarDomWidth <= tabDomWidth ? (isShowArrow.value = true) : (isShowArrow.value = false);
86
+ if (tabDomWidth < scrollbarDomWidth || tabItemElOffsetLeft === 0) {
87
+ translateX.value = 0;
88
+ } else if (tabItemElOffsetLeft < -translateX.value) {
89
+ // 标签在可视区域左侧
90
+ translateX.value = -tabItemElOffsetLeft + tabNavPadding;
91
+ } else if (
92
+ tabItemElOffsetLeft > -translateX.value &&
93
+ tabItemElOffsetLeft + tabItemOffsetWidth < -translateX.value + scrollbarDomWidth
94
+ ) {
95
+ // 标签在可视区域
96
+ translateX.value = Math.min(
97
+ 0,
98
+ scrollbarDomWidth - tabItemOffsetWidth - tabItemElOffsetLeft - tabNavPadding
99
+ );
100
+ } else {
101
+ // 标签在可视区域右侧
102
+ translateX.value = -(tabItemElOffsetLeft - (scrollbarDomWidth - tabNavPadding - tabItemOffsetWidth));
103
+ }
104
+ };
105
+
106
+ const handleScroll = (offset: number): void => {
107
+ const scrollbarDomWidth = scrollbarDom.value ? scrollbarDom.value?.offsetWidth : 0;
108
+ const tabDomWidth = tabDom.value ? tabDom.value.offsetWidth : 0;
109
+ if (offset > 0) {
110
+ translateX.value = Math.min(0, translateX.value + offset);
111
+ } else {
112
+ if (scrollbarDomWidth < tabDomWidth) {
113
+ if (translateX.value >= -(tabDomWidth - scrollbarDomWidth)) {
114
+ translateX.value = Math.max(translateX.value + offset, scrollbarDomWidth - tabDomWidth);
115
+ }
116
+ } else {
117
+ translateX.value = 0;
118
+ }
119
+ }
120
+ };
121
+
122
+ function dynamicRouteTag(value: string): void {
123
+ const hasValue = multiTags.value.some(item => {
124
+ return item.path === value;
125
+ });
126
+
127
+ function concatPath(arr: object[], value: string) {
128
+ if (!hasValue) {
129
+ arr.forEach((arrItem: any) => {
130
+ if (arrItem.path === value) {
131
+ useMultiTagsStoreHook().handleTags('push', {
132
+ path: value,
133
+ meta: arrItem.meta,
134
+ name: arrItem.name
135
+ });
136
+ } else {
137
+ if (arrItem.children && arrItem.children.length > 0) {
138
+ concatPath(arrItem.children, value);
139
+ }
140
+ }
141
+ });
142
+ }
143
+ }
144
+ concatPath(router.options.routes as any, value);
145
+ }
146
+
147
+ /** 刷新路由 */
148
+ function onFresh() {
149
+ const { fullPath, query } = unref(route);
150
+ router.replace({
151
+ path: '/redirect' + fullPath,
152
+ query: query
153
+ });
154
+ handleAliveRoute(route as ToRouteType, 'refresh');
155
+ }
156
+
157
+ function deleteDynamicTag(obj: any, current: any, tag?: string) {
158
+ const valueIndex: number = multiTags.value.findIndex((item: any) => {
159
+ if (item.query) {
160
+ if (item.path === obj.path) {
161
+ return item.query === obj.query;
162
+ }
163
+ } else if (item.params) {
164
+ if (item.path === obj.path) {
165
+ return item.params === obj.params;
166
+ }
167
+ } else {
168
+ return item.path === obj.path;
169
+ }
170
+ });
171
+
172
+ const spliceRoute = (startIndex?: number, length?: number, other?: boolean): void => {
173
+ if (other) {
174
+ useMultiTagsStoreHook().handleTags('equal', [fixedTags, obj]);
175
+ } else {
176
+ useMultiTagsStoreHook().handleTags('splice', '', {
177
+ startIndex,
178
+ length
179
+ }) as any;
180
+ }
181
+ dynamicTagView();
182
+ };
183
+
184
+ if (tag === 'other') {
185
+ spliceRoute(1, 1, true);
186
+ } else if (tag === 'left') {
187
+ spliceRoute(fixedTags.length, valueIndex - 1);
188
+ } else if (tag === 'right') {
189
+ spliceRoute(valueIndex + 1, multiTags.value.length);
190
+ } else {
191
+ // 从当前匹配到的路径中删除
192
+ spliceRoute(valueIndex, 1);
193
+ }
194
+ const newRoute = useMultiTagsStoreHook().handleTags('slice');
195
+ if (current === route.path) {
196
+ // 如果删除当前激活tag就自动切换到最后一个tag
197
+ if (tag === 'left') return;
198
+ if (newRoute[0]?.query) {
199
+ router.push({ name: newRoute[0].name, query: newRoute[0].query });
200
+ } else if (newRoute[0]?.params) {
201
+ router.push({ name: newRoute[0].name, params: newRoute[0].params });
202
+ } else {
203
+ router.push({ path: newRoute[0].path });
204
+ }
205
+ } else {
206
+ if (!multiTags.value.length) return;
207
+ if (multiTags.value.some(item => item.path === route.path)) return;
208
+ if (newRoute[0]?.query) {
209
+ router.push({ name: newRoute[0].name, query: newRoute[0].query });
210
+ } else if (newRoute[0]?.params) {
211
+ router.push({ name: newRoute[0].name, params: newRoute[0].params });
212
+ } else {
213
+ router.push({ path: newRoute[0].path });
214
+ }
215
+ }
216
+ }
217
+
218
+ function deleteMenu(item, tag?: string) {
219
+ deleteDynamicTag(item, item.path, tag);
220
+ handleAliveRoute(route as ToRouteType);
221
+ }
222
+
223
+ function onClickDrop(key, item, selectRoute?: RouteConfigs) {
224
+ if (item && item.disabled) return;
225
+ let selectTagRoute;
226
+ if (selectRoute) {
227
+ selectTagRoute = {
228
+ path: selectRoute.path,
229
+ meta: selectRoute.meta,
230
+ name: selectRoute.name,
231
+ query: selectRoute?.query,
232
+ params: selectRoute?.params
233
+ };
234
+ } else {
235
+ selectTagRoute = { path: route.path, meta: route.meta };
236
+ }
237
+
238
+ // 当前路由信息
239
+ switch (key) {
240
+ case 0:
241
+ // 刷新路由
242
+ onFresh();
243
+ break;
244
+ case 1:
245
+ // 关闭当前标签页
246
+ deleteMenu(selectTagRoute);
247
+ break;
248
+ case 2:
249
+ // 关闭左侧标签页
250
+ deleteMenu(selectTagRoute, 'left');
251
+ break;
252
+ case 3:
253
+ // 关闭右侧标签页
254
+ deleteMenu(selectTagRoute, 'right');
255
+ break;
256
+ case 4:
257
+ // 关闭其他标签页
258
+ deleteMenu(selectTagRoute, 'other');
259
+ break;
260
+ case 5:
261
+ // 关闭全部标签页
262
+ useMultiTagsStoreHook().handleTags('splice', '', {
263
+ startIndex: fixedTags.length,
264
+ length: multiTags.value.length
265
+ });
266
+ router.push('/welcome');
267
+ handleAliveRoute(route as ToRouteType);
268
+ break;
269
+ case 6:
270
+ // 整体页面全屏
271
+ toggle();
272
+ setTimeout(() => {
273
+ if (isFullscreen.value) {
274
+ tagsViews[6].icon = 'ri:fullscreen-exit-fill';
275
+ tagsViews[6].text = 'message.btn.wholeExitFullScreen';
276
+ } else {
277
+ tagsViews[6].icon = 'ri:fullscreen-fill';
278
+ tagsViews[6].text = 'message.btn.wholeFullScreen';
279
+ }
280
+ }, 100);
281
+ break;
282
+ case 7:
283
+ // 内容区全屏
284
+ onContentFullScreen();
285
+ setTimeout(() => {
286
+ if (SuSetting.hiddenSideBar) {
287
+ tagsViews[7].icon = 'ri:fullscreen-exit-fill';
288
+ tagsViews[7].text = 'message.btn.contentExitFullScreen';
289
+ } else {
290
+ tagsViews[7].icon = 'ri:fullscreen-fill';
291
+ tagsViews[7].text = 'message.btn.contentFullScreen';
292
+ }
293
+ }, 100);
294
+ break;
295
+ }
296
+ setTimeout(() => {
297
+ showMenuModel(route.fullPath, route.query);
298
+ });
299
+ }
300
+
301
+ function handleCommand(command: any) {
302
+ const { key, item } = command;
303
+ onClickDrop(key, item);
304
+ }
305
+
306
+ /** 触发右键中菜单的点击事件 */
307
+ function selectTag(key, item) {
308
+ closeMenu();
309
+ onClickDrop(key, item, currentSelect.value);
310
+ }
311
+
312
+ function showMenus(value: boolean) {
313
+ Array.of(1, 2, 3, 4, 5).forEach(v => {
314
+ tagsViews[v].show = value;
315
+ });
316
+ }
317
+
318
+ function disabledMenus(value: boolean, fixedTag = false) {
319
+ Array.of(1, 2, 3, 4, 5).forEach(v => {
320
+ tagsViews[v].disabled = value;
321
+ });
322
+ if (fixedTag) {
323
+ tagsViews[2].show = false;
324
+ tagsViews[2].disabled = true;
325
+ }
326
+ }
327
+
328
+ /** 检查当前右键的菜单两边是否存在别的菜单,如果左侧的菜单是顶级菜单,则不显示关闭左侧标签页,如果右侧没有菜单,则不显示关闭右侧标签页 */
329
+ function showMenuModel(currentPath: string, query: object = {}, refresh = false) {
330
+ const allRoute = multiTags.value;
331
+ const routeLength = multiTags.value.length;
332
+ let currentIndex = -1;
333
+ if (isEmpty(query)) {
334
+ currentIndex = allRoute.findIndex(v => v.path === currentPath);
335
+ } else {
336
+ currentIndex = allRoute.findIndex(v => isEqual(v.query, query));
337
+ }
338
+
339
+ function fixedTagDisabled() {
340
+ if (allRoute[currentIndex]?.meta?.fixedTag) {
341
+ Array.of(1, 2, 3, 4, 5).forEach(v => {
342
+ tagsViews[v].disabled = true;
343
+ });
344
+ }
345
+ }
346
+
347
+ showMenus(true);
348
+
349
+ if (refresh) {
350
+ tagsViews[0].show = true;
351
+ }
352
+
353
+ /**
354
+ * currentIndex为1时,左侧的菜单顶级菜单,则不显示关闭左侧标签页
355
+ * 如果currentIndex等于routeLength-1,右侧没有菜单,则不显示关闭右侧标签页
356
+ */
357
+ if (currentIndex === 1 && routeLength !== 2) {
358
+ // 左侧的菜单是顶级菜单,右侧存在别的菜单
359
+ tagsViews[2].show = false;
360
+ Array.of(1, 3, 4, 5).forEach(v => {
361
+ tagsViews[v].disabled = false;
362
+ });
363
+ tagsViews[2].disabled = true;
364
+ fixedTagDisabled();
365
+ } else if (currentIndex === 1 && routeLength === 2) {
366
+ disabledMenus(false);
367
+ // 左侧的菜单是顶级菜单,右侧不存在别的菜单
368
+ Array.of(2, 3, 4).forEach(v => {
369
+ tagsViews[v].show = false;
370
+ tagsViews[v].disabled = true;
371
+ });
372
+ fixedTagDisabled();
373
+ } else if (routeLength - 1 === currentIndex && currentIndex !== 0) {
374
+ // 当前路由是所有路由中的最后一个
375
+ tagsViews[3].show = false;
376
+ Array.of(1, 2, 4, 5).forEach(v => {
377
+ tagsViews[v].disabled = false;
378
+ });
379
+ tagsViews[3].disabled = true;
380
+ if (allRoute[currentIndex - 1]?.meta?.fixedTag) {
381
+ tagsViews[2].show = false;
382
+ tagsViews[2].disabled = true;
383
+ }
384
+ fixedTagDisabled();
385
+ } else if (currentIndex === 0 || currentPath === '/redirect/welcome') {
386
+ // 当前路由为首页
387
+ disabledMenus(true);
388
+ } else {
389
+ disabledMenus(false, allRoute[currentIndex - 1]?.meta?.fixedTag);
390
+ fixedTagDisabled();
391
+ }
392
+ }
393
+
394
+ function openMenu(tag, e) {
395
+ closeMenu();
396
+ if (tag.path === '/welcome' || tag?.meta?.fixedTag) {
397
+ // 右键菜单为首页或拥有 fixedTag 属性,只显示刷新
398
+ showMenus(false);
399
+ tagsViews[0].show = true;
400
+ } else if (route.path !== tag.path && route.name !== tag.name) {
401
+ // 右键菜单不匹配当前路由,隐藏刷新
402
+ tagsViews[0].show = false;
403
+ showMenuModel(tag.path, tag.query);
404
+ } else if (multiTags.value.length === 2 && route.path !== tag.path) {
405
+ showMenus(true);
406
+ // 只有两个标签时不显示关闭其他标签页
407
+ tagsViews[4].show = false;
408
+ } else if (route.path === tag.path) {
409
+ // 右键当前激活的菜单
410
+ showMenuModel(tag.path, tag.query, true);
411
+ }
412
+
413
+ currentSelect.value = tag;
414
+ const menuMinWidth = 140;
415
+ const offsetLeft = unref(containerDom).getBoundingClientRect().left;
416
+ const offsetWidth = unref(containerDom).offsetWidth;
417
+ const maxLeft = offsetWidth - menuMinWidth;
418
+ const left = e.clientX - offsetLeft + 5;
419
+ if (left > maxLeft) {
420
+ buttonLeft.value = maxLeft;
421
+ } else {
422
+ buttonLeft.value = left;
423
+ }
424
+ suSetting.hiddenSideBar ? (buttonTop.value = e.clientY) : (buttonTop.value = e.clientY - 40);
425
+ nextTick(() => {
426
+ visible.value = true;
427
+ });
428
+ }
429
+
430
+ /** 触发tags标签切换 */
431
+ function tagOnClick(item) {
432
+ const { name, path } = item;
433
+ if (name) {
434
+ if (item.query) {
435
+ router.push({
436
+ name,
437
+ query: item.query
438
+ });
439
+ } else if (item.params) {
440
+ router.push({
441
+ name,
442
+ params: item.params
443
+ });
444
+ } else {
445
+ router.push({ name });
446
+ }
447
+ } else {
448
+ router.push({ path });
449
+ }
450
+ // showMenuModel(item?.path, item?.query);
451
+ emitter.emit('tagOnClick', item);
452
+ }
453
+
454
+ onClickOutside(contextmenuRef, closeMenu, {
455
+ detectIframe: true
456
+ });
457
+
458
+ watch(route, () => {
459
+ activeIndex.value = -1;
460
+ dynamicTagView();
461
+ });
462
+
463
+ watch(isFullscreen, () => {
464
+ tagsViews[6].icon = 'ri:fullscreen-fill';
465
+ tagsViews[6].text = 'message.wholeFullScreen';
466
+ });
467
+
468
+ onMounted(() => {
469
+ if (!instance) return;
470
+
471
+ // 根据当前路由初始化操作标签页的禁用状态
472
+ showMenuModel(route.fullPath);
473
+
474
+ // 触发隐藏标签页
475
+ emitter.on('tagViewsChange', (key: any) => {
476
+ if (unref(showTags as any) === key) return;
477
+ (showTags as any).value = key;
478
+ });
479
+
480
+ // 改变标签风格
481
+ emitter.on('tagViewsShowModel', key => {
482
+ showModel.value = key;
483
+ });
484
+
485
+ // 接收侧边栏切换传递过来的参数
486
+ emitter.on('changLayoutRoute', indexPath => {
487
+ dynamicRouteTag(indexPath);
488
+ setTimeout(() => {
489
+ showMenuModel(indexPath);
490
+ });
491
+ });
492
+
493
+ useResizeObserver(
494
+ scrollbarDom,
495
+ useDebounceFn(() => {
496
+ dynamicTagView();
497
+ }, 200)
498
+ );
499
+ delay().then(() => dynamicTagView());
500
+ });
501
+
502
+ onBeforeUnmount(() => {
503
+ // 解绑`tagViewsChange`、`tagViewsShowModel`、`changLayoutRoute`公共事件,防止多次触发
504
+ emitter.off('tagViewsChange');
505
+ emitter.off('tagViewsShowModel');
506
+ emitter.off('changLayoutRoute');
507
+ });
508
+ </script>
509
+
510
+ <template>
511
+ <div v-if="!showTags" ref="containerDom" class="tags-view">
512
+ <span v-show="isShowArrow" class="arrow-left">
513
+ <IconifyIconOffline icon="ri:arrow-left-s-line" @click="handleScroll(200)" />
514
+ </span>
515
+ <div
516
+ ref="scrollbarDom"
517
+ class="scroll-container"
518
+ :class="showModel === 'chrome' && 'chrome-scroll-container'"
519
+ >
520
+ <div ref="tabDom" class="select-none tab" :style="getTabStyle">
521
+ <div
522
+ v-for="(item, index) in multiTags"
523
+ :key="index"
524
+ :ref="'dynamic' + index"
525
+ :class="[
526
+ 'scroll-item is-closable',
527
+ linkIsActive(item),
528
+ showModel === 'chrome' && 'chrome-item',
529
+ isFixedTag(item) && 'fixed-tag'
530
+ ]"
531
+ @contextmenu.prevent="openMenu(item, $event)"
532
+ @mouseenter.prevent="onMouseenter(index)"
533
+ @mouseleave.prevent="onMouseleave(index)"
534
+ @click="tagOnClick(item)"
535
+ >
536
+ <template v-if="showModel !== 'chrome'">
537
+ <span class="tag-title dark:text-text_color_primary! dark:hover:text-primary!">
538
+ {{ transformI18n(item.meta.title) }}
539
+ </span>
540
+ <span
541
+ v-if="
542
+ isFixedTag(item)
543
+ ? false
544
+ : iconIsActive(item, index) || (index === activeIndex && index !== 0)
545
+ "
546
+ class="el-icon-close"
547
+ @click.stop="deleteMenu(item)"
548
+ >
549
+ <IconifyIconOffline icon="ri:close-fill" />
550
+ </span>
551
+ <span
552
+ v-if="showModel !== 'card'"
553
+ :ref="'schedule' + index"
554
+ :class="[scheduleIsActive(item)]"
555
+ />
556
+ </template>
557
+ <div v-else class="chrome-tab">
558
+ <div class="chrome-tab__bg">
559
+ <TagChrome />
560
+ </div>
561
+ <span class="tag-title">
562
+ {{ transformI18n(item.meta.title) }}
563
+ </span>
564
+ <span
565
+ v-if="isFixedTag(item) ? false : index !== 0"
566
+ class="chrome-close-btn"
567
+ @click.stop="deleteMenu(item)"
568
+ >
569
+ <IconifyIconOffline icon="ri:close-fill" />
570
+ </span>
571
+ <span class="chrome-tab-divider" />
572
+ </div>
573
+ </div>
574
+ </div>
575
+ </div>
576
+ <span v-show="isShowArrow" class="arrow-right">
577
+ <IconifyIconOffline icon="ri:arrow-right-s-line" @click="handleScroll(-200)" />
578
+ </span>
579
+ <!-- 右键菜单按钮 -->
580
+ <transition name="el-zoom-in-top">
581
+ <ul
582
+ v-show="visible"
583
+ ref="contextmenuRef"
584
+ :key="Math.random()"
585
+ :style="getContextMenuStyle"
586
+ class="contextmenu"
587
+ >
588
+ <div
589
+ v-for="(item, key) in tagsViews.slice(0, 6)"
590
+ :key="key"
591
+ style="display: flex; align-items: center"
592
+ >
593
+ <li v-if="item.show" @click="selectTag(key, item)">
594
+ <IconifyIconOffline :icon="item.icon" />
595
+ {{ $t(item.text) }}
596
+ </li>
597
+ </div>
598
+ </ul>
599
+ </transition>
600
+ <!-- 右侧功能按钮 -->
601
+ <el-dropdown trigger="click" placement="bottom-end" @command="handleCommand">
602
+ <span class="arrow-down">
603
+ <IconifyIconOffline icon="ri:arrow-down-s-line" class="dark:text-white" />
604
+ </span>
605
+ <template #dropdown>
606
+ <el-dropdown-menu>
607
+ <el-dropdown-item
608
+ v-for="(item, key) in tagsViews"
609
+ :key="key"
610
+ :command="{ key, item }"
611
+ :divided="item.divided"
612
+ :disabled="item.disabled"
613
+ >
614
+ <IconifyIconOffline :icon="item.icon" />
615
+ {{ $t(item.text) }}
616
+ </el-dropdown-item>
617
+ </el-dropdown-menu>
618
+ </template>
619
+ </el-dropdown>
620
+ </div>
621
+ </template>
622
+
623
+ <style lang="scss" scoped>
624
+ @import url('./index.scss');
625
+ </style>
@@ -0,0 +1,71 @@
1
+ <!--
2
+ * @Author: levi7754 levi7754@163.com
3
+ * @Date: 2023-06-19 09:14:18
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2023-10-10 10:05:25
6
+ * @FilePath: /sitzone-mes/src/layout/frameView.vue
7
+ * @Description: frameView 页面
8
+ -->
9
+ <template>
10
+ <div v-spinning="loading" class="frame">
11
+ <iframe ref="frameRef" :src="frameSrc" class="frame-iframe" />
12
+ </div>
13
+ </template>
14
+ <script lang="ts" setup>
15
+ import { useRoute } from 'vue-router';
16
+ import { ref, unref, onMounted, nextTick } from 'vue';
17
+
18
+ const loading = ref(false);
19
+ const currentRoute = useRoute();
20
+ const frameSrc = ref<string>('');
21
+ const frameRef = ref<HTMLElement | null>(null);
22
+
23
+ if (unref(currentRoute.meta)?.frameSrc) {
24
+ frameSrc.value = unref(currentRoute.meta)?.frameSrc as string;
25
+ }
26
+
27
+ function hideLoading() {
28
+ loading.value = false;
29
+ }
30
+
31
+ function init() {
32
+ nextTick(() => {
33
+ const iframe = unref(frameRef);
34
+ if (!iframe) return;
35
+ const _frame = iframe as any;
36
+ if (_frame.attachEvent) {
37
+ _frame.attachEvent('onload', () => {
38
+ hideLoading();
39
+ });
40
+ } else {
41
+ iframe.onload = () => {
42
+ hideLoading();
43
+ };
44
+ }
45
+ });
46
+ }
47
+
48
+ onMounted(() => {
49
+ loading.value = true;
50
+ init();
51
+ });
52
+ </script>
53
+
54
+ <style lang="scss" scoped>
55
+ .frame {
56
+ z-index: 998;
57
+ height: 100vh;
58
+
59
+ .frame-iframe {
60
+ box-sizing: border-box;
61
+ width: 100%;
62
+ height: 100%;
63
+ overflow: hidden;
64
+ border: 0;
65
+ }
66
+ }
67
+
68
+ .main-content {
69
+ margin: 0 !important;
70
+ }
71
+ </style>