1/* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { BaseElement, element } from '../../../../../base-ui/BaseElement'; 17import { LitTable } from '../../../../../base-ui/table/lit-table'; 18import { SelectionParam } from '../../../../bean/BoxSelection'; 19import { SystemDiskIOSummary } from '../../../../bean/AbilityMonitor'; 20import { Utils } from '../../base/Utils'; 21import { ColorUtils } from '../../base/ColorUtils'; 22import { log } from '../../../../../log/Log'; 23import { resizeObserver } from '../SheetUtils'; 24import { getTabDiskAbilityData } from '../../../../database/sql/Ability.sql'; 25 26@element('tabpane-disk-ability') 27export class TabPaneDiskAbility extends BaseElement { 28 private diskAbilityTbl: LitTable | null | undefined; 29 private diskAbilitySource: Array<SystemDiskIOSummary> = []; 30 private queryDiskResult: Array<SystemDiskIOSummary> = []; 31 private search: HTMLInputElement | undefined | null; 32 33 set data(diskAbilityValue: SelectionParam) { 34 if (this.diskAbilityTbl) { 35 // @ts-ignore 36 this.diskAbilityTbl.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 45 + 'px'; 37 } 38 this.queryDataByDB(diskAbilityValue); 39 } 40 41 initElements(): void { 42 this.diskAbilityTbl = this.shadowRoot?.querySelector<LitTable>('#tb-disk-ability'); 43 this.diskAbilityTbl!.addEventListener('column-click', (evt) => { 44 // @ts-ignore 45 this.sortByColumn(evt.detail); 46 }); 47 } 48 49 connectedCallback(): void { 50 super.connectedCallback(); 51 resizeObserver(this.parentElement!, this.diskAbilityTbl!); 52 } 53 54 filterData(): void { 55 if (this.queryDiskResult.length > 0) { 56 let filterDisk = this.queryDiskResult.filter((item) => { 57 let array = this.toDiskAbilityArray(item); 58 let isInclude = array.filter((value) => value.indexOf(this.search!.value) > -1); 59 return isInclude.length > 0; 60 }); 61 if (filterDisk.length > 0) { 62 this.diskAbilitySource = filterDisk; 63 this.diskAbilityTbl!.recycleDataSource = this.diskAbilitySource; 64 } else { 65 this.diskAbilitySource = []; 66 this.diskAbilityTbl!.recycleDataSource = []; 67 } 68 } 69 } 70 71 toDiskAbilityArray(systemDiskIOSummary: SystemDiskIOSummary): string[] { 72 let array: Array<string> = []; 73 array.push(systemDiskIOSummary.startTimeStr); 74 array.push(systemDiskIOSummary.durationStr); 75 array.push(systemDiskIOSummary.dataReadStr); 76 array.push(systemDiskIOSummary.dataReadSecStr); 77 array.push(systemDiskIOSummary.dataWriteStr); 78 array.push(systemDiskIOSummary.readsInStr); 79 array.push(systemDiskIOSummary.readsInSecStr); 80 array.push(systemDiskIOSummary.writeOutStr); 81 array.push(systemDiskIOSummary.writeOutSecStr); 82 return array; 83 } 84 85 queryDataByDB(val: SelectionParam): void { 86 getTabDiskAbilityData(val.leftNs, val.rightNs).then((result) => { 87 log('getTabDiskAbilityData result size : ' + result.length); 88 if (result.length !== null && result.length > 0) { 89 for (const systemDiskIOSummary of result) { 90 if (systemDiskIOSummary.startTime <= 0) { 91 systemDiskIOSummary.startTimeStr = '0:000.000.000'; 92 } else { 93 systemDiskIOSummary.startTimeStr = Utils.getTimeStampHMS(systemDiskIOSummary.startTime); 94 } 95 systemDiskIOSummary.durationStr = Utils.getDurString(systemDiskIOSummary.duration); 96 systemDiskIOSummary.dataReadStr = systemDiskIOSummary.dataRead + 'KB'; 97 systemDiskIOSummary.dataReadSecStr = systemDiskIOSummary.dataReadSec + 'KB/S'; 98 systemDiskIOSummary.dataWriteStr = systemDiskIOSummary.dataWrite + 'KB'; 99 systemDiskIOSummary.dataWriteSecStr = systemDiskIOSummary.dataWriteSec + 'KB/S'; 100 systemDiskIOSummary.readsInStr = ColorUtils.formatNumberComma(systemDiskIOSummary.readsIn); 101 systemDiskIOSummary.readsInSecStr = systemDiskIOSummary.readsInSec.toString(); 102 systemDiskIOSummary.writeOutStr = ColorUtils.formatNumberComma(systemDiskIOSummary.writeOut); 103 systemDiskIOSummary.writeOutSecStr = systemDiskIOSummary.writeOutSec.toString(); 104 } 105 this.diskAbilitySource = result; 106 this.queryDiskResult = result; 107 this.diskAbilityTbl!.recycleDataSource = result; 108 } else { 109 this.diskAbilitySource = []; 110 this.queryDiskResult = []; 111 this.diskAbilityTbl!.recycleDataSource = []; 112 } 113 }); 114 } 115 116 initHtml(): string { 117 return ` 118 <style> 119 .disk-ability-table{ 120 height: auto; 121 } 122 :host{ 123 flex-direction: column; 124 display: flex; 125 padding: 10px 10px; 126 } 127 </style> 128 <lit-table id="tb-disk-ability" class="disk-ability-table"> 129 <lit-table-column order width="1fr" 130 title="StartTime" data-index="startTimeStr" key="startTimeStr" align="flex-start"> 131 </lit-table-column> 132 <lit-table-column order width="1fr" 133 title="Duration" data-index="durationStr" key="durationStr" align="flex-start" > 134 </lit-table-column> 135 <lit-table-column order width="1fr" 136 title="Data Read" data-index="dataReadStr" key="dataReadStr" align="flex-start" > 137 </lit-table-column> 138 <lit-table-column order width="1fr" 139 title="Data Read/sec" data-index="dataReadSecStr" key="dataReadSecStr" align="flex-start"> 140 </lit-table-column> 141 <lit-table-column order width="1fr" 142 title="Data Write" data-index="dataWriteStr" key="dataWriteStr" align="flex-start" > 143 </lit-table-column> 144 <lit-table-column order width="1fr" 145 title="Data Write/sec" data-index="dataWriteSecStr" key="dataWriteSecStr" align="flex-start"> 146 </lit-table-column> 147 <lit-table-column order width="1fr" 148 title="Reads In" data-index="readsIn" key="readsInStr" align="flex-startStr" > 149 </lit-table-column> 150 <lit-table-column order width="1fr" 151 title="Reads In/sec" data-index="readsInSecStr" key="readsInSecStr" align="flex-start" > 152 </lit-table-column> 153 <lit-table-column order width="1fr" 154 title="Write Out" data-index="writeOutStr" key="writeOutStr" align="flex-start" > 155 </lit-table-column> 156 <lit-table-column order width="1fr" 157 title="Write Out/sec" data-index="writeOutSecStr" key="writeOutSecStr" align="flex-start" > 158 </lit-table-column> 159 </lit-table> 160 `; 161 } 162 163 getPropertyByType = 164 (property: string, type: string) => 165 (data: SystemDiskIOSummary): number | string => { 166 let typeMap = { 167 // @ts-ignore 168 number: parseFloat(data[property]), 169 durationStr: data.duration, 170 dataReadStr: data.dataRead, 171 dataReadSecStr: data.dataReadSec, 172 dataWriteStr: data.dataWrite, 173 dataWriteSecStr: data.dataWriteSec, 174 readsInStr: data.readsIn, 175 readsInSecStr: data.readsInSec, 176 writeOutStr: data.writeOut, 177 writeOutSecStr: data.writeOutSec, 178 }; 179 // @ts-ignore 180 return typeMap[type] || data[property]; 181 }; 182 183 compareFunction = 184 (sort: number, getProperty: (data: SystemDiskIOSummary) => number | string) => 185 (diskAbilityLeftData: SystemDiskIOSummary, diskAbilityRightData: SystemDiskIOSummary): number => { 186 let leftValue = getProperty(diskAbilityLeftData); 187 let rightValue = getProperty(diskAbilityRightData); 188 let result = 0; 189 if (leftValue > rightValue) { 190 result = sort === 2 ? -1 : 1; 191 } else if (leftValue < rightValue) { 192 result = sort === 2 ? 1 : -1; 193 } 194 return result; 195 }; 196 197 compareDisk( 198 property: string, 199 sort: number, 200 type: string 201 ): (diskAbilityLeftData: SystemDiskIOSummary, diskAbilityRightData: SystemDiskIOSummary) => number { 202 let getProperty = this.getPropertyByType(property, type); 203 return this.compareFunction(sort, getProperty); 204 } 205 206 sortByColumn(detail: unknown): void { 207 let typeMapping = { 208 startTime: 'string', 209 durationStr: 'durationStr', 210 dataReadStr: 'dataReadStr', 211 dataReadSecStr: 'dataReadSecStr', 212 dataWriteStr: 'dataWriteStr', 213 dataWriteSecStr: 'dataWriteSecStr', 214 readsInStr: 'readsInStr', 215 readsInSecStr: 'readsInSecStr', 216 writeOutStr: 'writeOutStr', 217 writeOutSecStr: 'writeOutSecStr', 218 }; 219 // @ts-ignore 220 let type = typeMapping[detail.key] || 'number'; // @ts-ignore 221 this.diskAbilitySource.sort(this.compareDisk(detail.key, detail.sort, type)); 222 this.diskAbilityTbl!.recycleDataSource = this.diskAbilitySource; 223 } 224} 225