11<script setup lang="ts">
22import {
3- Document ,
4- Menu as IconMenu ,
5- Histogram ,
6- Location ,
7- Share ,
8- ArrowDown ,
9- Guide ,
10- DataAnalysis ,
11- Help ,
12- Setting
3+ Document ,
4+ Menu as IconMenu ,
5+ Histogram ,
6+ Location ,
7+ Share ,
8+ ArrowDown ,
9+ Guide ,
10+ DataAnalysis , Help , Setting
1311} from ' @element-plus/icons-vue'
1412import { ref , watch } from ' vue'
1513import { API } from ' ./views/net'
@@ -22,10 +20,11 @@ import SecretManager from './views/SecretManager.vue'
2220import WelcomePage from ' ./views/WelcomePage.vue'
2321import DataManager from ' ./views/DataManager.vue'
2422import { useI18n } from ' vue-i18n'
25- import { setAsDarkTheme , getThemes , setTheme , getTheme } from ' ./theme'
2623
2724const { t, locale : i18nLocale } = useI18n ()
2825
26+ import { setAsDarkTheme , getThemes , setTheme , getTheme } from ' ./theme'
27+
2928const allThemes = ref (getThemes ())
3029const asDarkMode = ref (Cache .GetPreference ().darkTheme )
3130setAsDarkTheme (asDarkMode .value )
@@ -41,20 +40,21 @@ API.GetVersion((d) => {
4140 const version = d .version .match (' ^v\\ d*.\\ d*.\\ d*' )
4241 const dirtyVersion = d .version .match (' ^v\\ d*.\\ d*.\\ d*-\\ d*-g' )
4342
44- if (! version && ! dirtyVersion ) return
43+ if (! version && ! dirtyVersion ) {
44+ return
45+ }
4546
4647 if (dirtyVersion && dirtyVersion .length > 0 ) {
47- appVersionLink .value += ' /commit/' + d .message .replace (dirtyVersion [0 ], ' ' )
48+ appVersionLink .value = appVersionLink . value + ' /commit/' + d .message .replace (dirtyVersion [0 ], ' ' )
4849 } else if (version && version .length > 0 ) {
49- appVersionLink .value += ' /releases/tag/' + version [0 ]
50+ appVersionLink .value = appVersionLink . value + ' /releases/tag/' + version [0 ]
5051 }
5152})
5253
5354const isCollapse = ref (true )
5455watch (isCollapse , (v : boolean ) => {
5556 window .localStorage .setItem (' button.style' , v ? ' simple' : ' ' )
5657})
57-
5858const lastActiveMenu = window .localStorage .getItem (' activeMenu' )
5959const activeMenu = ref (lastActiveMenu === ' ' ? ' welcome' : lastActiveMenu )
6060const panelName = ref (activeMenu )
@@ -65,179 +65,158 @@ const handleSelect = (key: string) => {
6565
6666const locale = ref (Cache .GetPreference ().language )
6767i18nLocale .value = locale .value
68- watch (locale , (e : string ) => {
68+
69+ watch (locale , (e : string ) => {
6970 Cache .WithLocale (e )
7071 i18nLocale .value = e
7172})
7273
7374const handleChangeLan = (command : string ) => {
7475 switch (command ) {
75- case ' chinese' :
76- locale .value = ' zh-CN'
77- break
78- case ' english' :
79- locale .value = ' en-US'
80- break
76+ case " chinese" :
77+ locale .value = " zh-CN"
78+ break ;
79+ case " english" :
80+ locale .value = " en-US"
81+ break ;
8182 }
82- }
83+ };
8384
84- const ID = ref (null )
85+ const ID = ref (null );
8586const toHistoryPanel = ({ ID : selectID , panelName : historyPanelName }) => {
86- ID .value = selectID
87- panelName .value = historyPanelName
87+ ID .value = selectID ;
88+ panelName .value = historyPanelName ;
8889}
8990
9091const settingDialogVisible = ref (false )
9192watch (settingDialogVisible , (v : boolean ) => {
92- if (v ) {
93- allThemes .value = getThemes ()
94- }
93+ if (v ) {
94+ allThemes .value = getThemes ()
95+ }
9596})
96-
9797const theme = ref (getTheme ())
9898watch (theme , (e ) => {
99- setTheme (e )
99+ setTheme (e )
100100})
101101 </script >
102102
103103<template >
104- <el-container class =" h-screen" >
105- <!-- Sidebar -->
106- <el-aside class =" flex flex-col border-r border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900" :width =" isCollapse ? '80px' : '200px'" >
107- <!-- Collapse radio buttons, centered -->
108- <el-radio-group v-model =" isCollapse" class =" p-3 flex justify-center space-x-3" >
109- <el-radio-button :value =" false" class =" px-3" >+</el-radio-button >
110- <el-radio-button :value =" true" class =" px-3" >-</el-radio-button >
104+ <el-container style =" height : 100% ;" >
105+ <el-aside width =" auto" style =" display : flex ; flex-direction : column ;" >
106+ <el-radio-group v-model =" isCollapse" >
107+ <el-radio-button :value =" false" >+</el-radio-button >
108+ <el-radio-button :value =" true" >-</el-radio-button >
111109 </el-radio-group >
112-
113- <!-- Menu -->
114110 <el-menu
111+ class =" el-menu-vertical"
112+ style =" height : 100% ;"
115113 :default-active =" activeMenu"
116114 :collapse =" isCollapse"
117115 @select =" handleSelect"
118- class =" el-menu-vertical flex-1 overflow-auto border-r-0"
119116 >
120117 <el-menu-item index =" welcome" >
121- <el-icon ><Share /></el-icon >
118+ <el-icon ><share /></el-icon >
122119 <template #title >{{ t('title.welcome') }}</template >
123120 </el-menu-item >
124121 <el-menu-item index =" testing" test-id =" testing-menu" >
125- <el-icon ><IconMenu /></el-icon >
126- <template #title >{{ t('title.testing') }}</template >
122+ <el-icon ><icon-menu /></el-icon >
123+ <template #title >{{ t('title.testing' ) }}</template >
127124 </el-menu-item >
128125 <el-menu-item index =" history" test-id =" history-menu" >
129- <el-icon ><Histogram /></el-icon >
130- <template #title >{{ t('title.history') }}</template >
126+ <el-icon ><histogram /></el-icon >
127+ <template #title >{{ t('title.history' ) }}</template >
131128 </el-menu-item >
132129 <el-menu-item index =" mock" test-id =" mock-menu" >
133130 <el-icon ><Guide /></el-icon >
134- <template #title >{{ t('title.mock') }}</template >
131+ <template #title >{{ t('title.mock' ) }}</template >
135132 </el-menu-item >
136133 <el-menu-item index =" data" test-id =" data-menu" >
137134 <el-icon ><DataAnalysis /></el-icon >
138- <template #title >{{ t('title.data') }}</template >
135+ <template #title >{{ t('title.data' ) }}</template >
139136 </el-menu-item >
140137 <el-menu-item index =" secret" >
141- <el-icon ><Document /></el-icon >
138+ <el-icon ><document /></el-icon >
142139 <template #title >{{ t('title.secrets') }}</template >
143140 </el-menu-item >
144141 <el-menu-item index =" store" >
145- <el-icon ><Location /></el-icon >
142+ <el-icon ><location /></el-icon >
146143 <template #title >{{ t('title.stores') }}</template >
147144 </el-menu-item >
148145 </el-menu >
149146 </el-aside >
150147
151- <!-- Main content -->
152- <el-main class =" relative flex-1 p-4 bg-white dark:bg-[#1e1e1e] dark:text-white overflow-auto" >
153-
154-
155- <!-- Panels -->
156- <div class =" pr-12" >
157- <TestingPanel v-if =" panelName === 'testing'" @toHistoryPanel =" toHistoryPanel" />
158- <TestingHistoryPanel v-else-if =" panelName === 'history'" :ID =" ID" />
159- <DataManager v-else-if =" panelName === 'data'" />
160- <MockManager v-else-if =" panelName === 'mock'" />
161- <StoreManager v-else-if =" panelName === 'store'" />
162- <SecretManager v-else-if =" panelName === 'secret'" />
163- <WelcomePage v-else />
148+ <el-main style =" padding-top : 0px ;" >
149+ <div class =" top-menu" >
150+ <el-col style =" display : flex ; align-items : center ;" >
151+ <el-icon @click =" settingDialogVisible=true" size =" 20" ><Setting /></el-icon >
152+ </el-col >
164153 </div >
154+ <TestingPanel v-if =" panelName === 'testing'" @toHistoryPanel =" toHistoryPanel" />
155+ <TestingHistoryPanel v-else-if =" panelName === 'history'" :ID =" ID" />
156+ <DataManager v-else-if =" panelName === 'data'" />
157+ <MockManager v-else-if =" panelName === 'mock'" />
158+ <StoreManager v-else-if =" panelName === 'store'" />
159+ <SecretManager v-else-if =" panelName === 'secret'" />
160+ <WelcomePage v-else />
165161 </el-main >
166- <!-- Settings button top-right -->
167- <div class =" absolute top-4 right-4 cursor-pointer z-10" @click =" settingDialogVisible = true" title =" Settings" >
168- <el-icon size =" 20" ><Setting /></el-icon >
169- </div >
170162
171- <!-- Footer version link -->
172- <div class =" absolute bottom-2 right-4 text-sm z-10" >
173- <a
174- :href =" appVersionLink"
175- target =" _blank"
176- rel =" noopener"
177- class =" text-emerald-500 hover:bg-emerald-100 dark:hover:bg-emerald-900 transition rounded px-2 py-1 select-none"
178- >
179- {{ appVersion }}
180- </a >
163+ <div style =" position : absolute ; bottom : 0px ; right : 10px ;" >
164+ <a :href =appVersionLink target =" _blank" rel =" noopener" >{{appVersion}}</a >
181165 </div >
182166 </el-container >
183167
184- <!-- Settings Dialog -->
185- <el-dialog
186- v-model =" settingDialogVisible"
187- :title =" t('title.setting')"
188- width =" 50%"
189- draggable
190- destroy-on-close
191- class =" !p-6"
192- >
193- <el-row class =" mb-6 items-center" >
194- <el-col :span =" 4" class =" font-semibold text-gray-700 dark:text-gray-300" >Theme:</el-col >
195- <el-col :span =" 18" >
196- <el-select v-model =" theme" placeholder =" Select a theme" class =" w-full" >
197- <el-option v-for =" item in allThemes" :key =" item" :label =" item" :value =" item" />
198- </el-select >
199- <el-icon class =" ml-3 align-middle" >
200- <el-link
201- href =" https://github.com/LinuxSuRen/atest-ext-data-swagger/tree/master/data/theme"
202- target =" _blank"
203- class =" text-gray-500 hover:text-gray-700 dark:hover:text-gray-300"
204- > <Help /> </el-link
205- >
206- </el-icon >
207- </el-col >
208- </el-row >
209-
210- <el-row class =" mb-6 items-center" >
211- <el-col :span =" 4" class =" font-semibold text-gray-700 dark:text-gray-300" >Language:</el-col >
212- <el-col :span =" 18" class =" flex items-center gap-3" >
213- <el-tag class =" text-base" >{{ t('language') }}</el-tag >
214- <el-dropdown trigger =" click" @command =" handleChangeLan" >
215- <el-icon ><ArrowDown /></el-icon >
216- <template #dropdown >
217- <el-dropdown-menu >
218- <el-dropdown-item command =" chinese" >中文</el-dropdown-item >
219- <el-dropdown-item command =" english" >English</el-dropdown-item >
220- </el-dropdown-menu >
221- </template >
222- </el-dropdown >
223- </el-col >
224- </el-row >
225-
226- <el-row class =" items-center" >
227- <el-col :span =" 4" class =" font-semibold text-gray-700 dark:text-gray-300" >Dark Mode:</el-col >
228- <el-col :span =" 18" >
229- <el-switch type =" primary" v-model =" asDarkMode" />
230- </el-col >
231- </el-row >
232- </el-dialog >
168+ <el-dialog v-model =" settingDialogVisible" :title =" t('title.setting' )" width =" 50%" draggable destroy-on-close >
169+ <el-row >
170+ <el-col :span =" 4" >
171+ Theme:
172+ </el-col >
173+ <el-col :span =" 18" >
174+ <el-select v-model =" theme" placeholder =" Select a theme" >
175+ <el-option
176+ v-for =" item in allThemes"
177+ :key =" item"
178+ :label =" item"
179+ :value =" item"
180+ />
181+ </el-select >
182+ <el-icon >
183+ <el-link href =" https://github.com/LinuxSuRen/atest-ext-data-swagger/tree/master/data/theme" target =" _blank" >
184+ <Help />
185+ </el-link >
186+ </el-icon >
187+ </el-col >
188+ </el-row >
189+
190+ <el-row >
191+ <el-col :span =" 4" >
192+ Language:
193+ </el-col >
194+ <el-col :span =" 18" >
195+ <el-tag style =" font-size : 18px ;" >{{ t('language') }}</el-tag >
196+ <el-dropdown trigger =" click" @command =" (command: string) => handleChangeLan(command)" >
197+ <el-icon ><arrow-down /></el-icon >
198+ <template #dropdown >
199+ <el-dropdown-menu >
200+ <el-dropdown-item command =" chinese" >中文</el-dropdown-item >
201+ <el-dropdown-item command =" english" >English</el-dropdown-item >
202+ </el-dropdown-menu >
203+ </template >
204+ </el-dropdown >
205+ </el-col >
206+ </el-row >
207+ <el-row >
208+ <el-col :span =" 4" >
209+ Dark Mode:
210+ </el-col >
211+ <el-col :span =" 18" >
212+ <el-switch type =" primary" data-intro =" Switch light and dark modes" v-model =" asDarkMode" />
213+ </el-col >
214+ </el-row >
215+ </el-dialog >
233216</template >
234217
235- <style scoped >
218+ <style >
236219.el-menu-vertical :not (.el-menu--collapse ) {
237220 width : 200px ;
238221}
239-
240- .el-menu-vertical {
241- border-right : none !important ;
242- }
243- </style >
222+ </style >
0 commit comments