149149 <!-- Speed Test Tab -->
150150 <v-tab-item >
151151 <v-container class =" d-flex flex-row align-center justify-center fluid" >
152- <v-card min -width =" 390px " class =" ma-5" >
152+ <v-card max -width =" 500px " class =" ma-5" >
153153 <v-card-title class =" justify-center" >
154154 Disk Speed Test
155155 </v-card-title >
159159 <v-col >
160160 <v-col class =" d-flex justify-center" >
161161 <v-progress-circular
162- v-if =" speedTesting"
163162 :rotate =" 90"
164163 :width =" 15"
165- :indeterminate =" speedTesting"
164+ :value =" speedResults.length * 100 / 4"
165+ :indeterminate =" speedTesting && speedResults.length === 0"
166166 ratio =" 1"
167167 color =" primary"
168168 size =" 200"
169169 >
170- <span v-if =" speedTesting" >Testing...</span >
170+ <span v-if =" speedTesting" >{{ speedTestProgress }}</span >
171+ <span v-else-if =" hasResults" >{{ speedResults.length }}/4</span >
171172 <span v-else >Click to start</span >
172173 </v-progress-circular >
173174
174- <v-list v-else >
175+ <v-list >
175176 <v-list-item >
176177 <v-list-item-icon >
177- <v-icon v-tooltip =" 'Write speed'" >
178- mdi-alpha-w-box-outline
178+ <v-icon v-tooltip =" 'Write speed (avg) '" >
179+ mdi-pencil
179180 </v-icon >
180181 </v-list-item-icon >
181182 <v-list-item-subtitle >
182- {{ speedResult?.write_speed_mbps ? speedResult.write_speed_mbps.toFixed(2) : '...' }} MiB/s
183+ {{ avgWriteSpeed }} MiB/s
183184 </v-list-item-subtitle >
184185 </v-list-item >
185186
186187 <v-list-item >
187188 <v-list-item-icon >
188- <v-icon v-tooltip =" 'Read speed'" >
189- mdi-alpha-r-box-outline
189+ <v-icon v-tooltip =" 'Read speed (avg) '" >
190+ mdi-book-open-page-variant
190191 </v-icon >
191192 </v-list-item-icon >
192193 <v-list-item-subtitle >
193- {{ speedResult?.read_speed_mbps ? speedResult.read_speed_mbps.toFixed(2) : '...' }} MiB/s
194+ {{ avgReadSpeed }} MiB/s
194195 </v-list-item-subtitle >
195196 </v-list-item >
196197 </v-list >
197198 </v-col >
198199
200+ <v-col v-if =" hasResults" >
201+ <disk-speed-graph
202+ style =" width : 100% "
203+ :data =" speedResults"
204+ />
205+ </v-col >
206+
199207 <v-alert v-if =" speedError" type =" error" dense outlined class =" ma-4" >
200208 {{ speedError }}
201209 </v-alert >
202210
203- <v-alert
204- v-if =" speedResult && !speedResult.success"
205- type =" warning"
206- dense
207- outlined
208- class =" ma-4"
209- >
210- Test failed: {{ speedResult.error }}
211- </v-alert >
212-
213211 <div
214212 class =" transition-swing pa-6"
215213 align =" center"
238236<script lang="ts">
239237import Vue from ' vue'
240238
239+ import DiskSpeedGraph from ' @/components/disk/DiskSpeedGraph.vue'
241240import disk_store from ' @/store/disk'
242- import { DiskNode , DiskSpeedResult } from ' @/types/disk'
241+ import { DiskNode , DiskSpeedTestPoint } from ' @/types/disk'
243242import { prettifySize } from ' @/utils/helper_functions'
244243
245244export default Vue .extend ({
246245 name: ' DiskView' ,
246+ components: {
247+ DiskSpeedGraph ,
248+ },
247249 data() {
248250 return {
249251 activeTab: 0 ,
@@ -267,12 +269,15 @@ export default Vue.extend({
267269 error(): string | null {
268270 return disk_store .error
269271 },
270- speedResult (): DiskSpeedResult | null {
271- return disk_store .speedResult
272+ speedResults (): DiskSpeedTestPoint [] {
273+ return disk_store .speedResults
272274 },
273275 speedTesting(): boolean {
274276 return disk_store .speedTesting
275277 },
278+ speedTestProgress(): string {
279+ return disk_store .speedTestProgress
280+ },
276281 speedError(): string | null {
277282 return disk_store .speedError
278283 },
@@ -302,16 +307,31 @@ export default Vue.extend({
302307 },
303308 state(): string {
304309 if (this .speedTesting ) {
305- return ' Running test...'
310+ return this . speedTestProgress || ' Running test...'
306311 }
307- if (this .speedResult ?. success ) {
312+ if (this .speedResults . length === 4 ) {
308313 return ' Test complete'
309314 }
310- if (this .speedResult && ! this . speedResult . success ) {
315+ if (this .speedError ) {
311316 return ' Test failed'
312317 }
313318 return ' Click to start'
314319 },
320+ hasResults(): boolean {
321+ return this .speedResults .length > 0
322+ },
323+ avgWriteSpeed(): string {
324+ const speeds = this .speedResults .map ((r ) => r .write_speed ).filter ((s ): s is number => s !== null )
325+ if (speeds .length === 0 ) return ' ...'
326+ const avg = speeds .reduce ((a , b ) => a + b , 0 ) / speeds .length
327+ return avg .toFixed (2 )
328+ },
329+ avgReadSpeed(): string {
330+ const speeds = this .speedResults .map ((r ) => r .read_speed ).filter ((s ): s is number => s !== null )
331+ if (speeds .length === 0 ) return ' ...'
332+ const avg = speeds .reduce ((a , b ) => a + b , 0 ) / speeds .length
333+ return avg .toFixed (2 )
334+ },
315335 },
316336 mounted(): void {
317337 this .fetchUsage ()
@@ -395,7 +415,7 @@ export default Vue.extend({
395415 return sizeBytes / parentSize * 100
396416 },
397417 async runSpeedTest(): Promise <void > {
398- await disk_store .runSpeedTest ( 1024 * 1024 * 1024 )
418+ await disk_store .runMultiSizeSpeedTest ( )
399419 },
400420 prettifySize ,
401421 },
0 commit comments