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 data 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 */ 15import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; 16import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; 17import { LitTable } from '../../../../../base-ui/table/lit-table.js'; 18import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; 19import { SelectionParam } from '../../../../bean/BoxSelection.js'; 20import { querySysPurgeableSelectionTab } from '../../../../database/SqlLite.js'; 21import { Utils } from '../../base/Utils.js'; 22import { CompareStruct, compare, resizeObserverFromMemory } from '../SheetUtils.js'; 23import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; 24@element('tabpane-purgeable-pin-comparison-ability') 25export class TabPanePurgPinComparisonAbility extends BaseElement { 26 private purgeablePinTable: LitTable | null | undefined; 27 private purgeablePinSource: Array<unknown> = []; 28 private filterEl: TabPaneJsMemoryFilter | undefined | null; 29 private selectEl: LitSelect | undefined | null; 30 31 public initElements(): void { 32 this.purgeablePinTable = this.shadowRoot?.querySelector<LitTable>('#tb-purgeable-pin'); 33 this.filterEl = this.shadowRoot!.querySelector<TabPaneJsMemoryFilter>('#filter'); 34 this.selectEl = this.filterEl?.shadowRoot?.querySelector<LitSelect>('lit-select'); 35 } 36 public totalData(purgePinComParam: SelectionParam | any, dataList: any): void { 37 //@ts-ignore 38 this.purgeablePinTable?.shadowRoot?.querySelector('.table')?.style?.height = `${ 39 this.parentElement!.clientHeight - 45 40 }px`; 41 this.purgeablePinSource = []; 42 let fileArr: any[] = []; 43 for (let file of dataList) { 44 if (file.startNs !== purgePinComParam.startNs) { 45 fileArr.push(file); 46 } 47 } 48 fileArr = fileArr.sort(); 49 this.initSelect(purgePinComParam.startNs, fileArr); 50 this.updateComparisonData(purgePinComParam.startNs, fileArr[0].startNs); 51 } 52 private initSelect(fileStartNs: number, purgePinComFileArr: Array<any>): void { 53 let that = this; 54 let input = this.selectEl!.shadowRoot?.querySelector('input') as HTMLInputElement; 55 this.selectEl!.innerHTML = ''; 56 let option = new LitSelectOption(); 57 option.innerHTML = 'File Name'; 58 option.setAttribute('disabled', 'disabled'); 59 this.selectEl?.appendChild(option); 60 if (purgePinComFileArr[0].name) { 61 option.setAttribute('value', purgePinComFileArr[0].name); 62 } 63 this.selectEl!.defaultValue = purgePinComFileArr[0].name; 64 this.selectEl!.placeholder = purgePinComFileArr[0].name; 65 this.selectEl!.dataSource = purgePinComFileArr; 66 this.selectEl!.querySelectorAll('lit-select-option').forEach((a) => { 67 a.addEventListener('onSelected', (e: any) => { 68 for (let f of purgePinComFileArr) { 69 if (input.value === f.name) { 70 that.updateComparisonData(fileStartNs, f.startNs); 71 } 72 } 73 e.stopPropagation(); 74 }); 75 }); 76 } 77 private async updateComparisonData(baseTime: number, targetTime: number): Promise<any> { 78 this.purgeablePinSource = []; 79 let tableData = await this.queryTableData(baseTime, targetTime); 80 this.purgeablePinSource.push(tableData); 81 if (this.purgeablePinSource.length > 0) { 82 this.purgeablePinTable!.recycleDataSource = this.purgeablePinSource; 83 } else { 84 this.purgeablePinTable!.recycleDataSource = []; 85 } 86 } 87 private async queryTableData(baseTime: number, targetTime: number): Promise<any> { 88 let delta = { 89 purgPinedDelta: '0Bytes', 90 shmPurgPinDelta: '0Bytes', 91 }; 92 const baseArr: CompareStruct[] = []; 93 const targetArr: CompareStruct[] = []; 94 // 点击的 95 await querySysPurgeableSelectionTab(baseTime, true).then(async (results) => { 96 for (let i = 0; i < results.length; i++) { 97 baseArr.push(new CompareStruct(results[i].name, results[i].value)); 98 } 99 // 被比较的 100 await querySysPurgeableSelectionTab(targetTime, true).then((results) => { 101 for (let i = 0; i < results.length; i++) { 102 targetArr.push(new CompareStruct(results[i].name, results[i].value)); 103 } 104 let compareData = compare(baseArr, targetArr); 105 for (let data of compareData) { 106 if (data.key === 'PinedPurg') { 107 delta.purgPinedDelta = Utils.getBinaryByteWithUnit(data.value); 108 } else { 109 delta.shmPurgPinDelta = Utils.getBinaryByteWithUnit(data.value); 110 } 111 } 112 }); 113 }); 114 return delta; 115 } 116 117 public connectedCallback(): void { 118 super.connectedCallback(); 119 resizeObserverFromMemory(this.parentElement!, this.purgeablePinTable!, this.filterEl!); 120 } 121 public initHtml(): string { 122 return ` 123 <style> 124 :host{ 125 display: flex; 126 flex-direction: column; 127 padding: 10px 10px; 128 } 129 </style> 130 <lit-table id="tb-purgeable-pin" style="height: auto"> 131 <lit-table-column width="1fr" title="PurgPinedDelta" data-index="purgPinedDelta" align="flex-start"> 132 </lit-table-column> 133 <lit-table-column width="1fr" title="ShmPurgPinDelta" data-index="shmPurgPinDelta" align="flex-start"> 134 </lit-table-column> 135 </lit-table> 136 <lit-progress-bar class="progress"></lit-progress-bar> 137 <tab-pane-js-memory-filter id="filter" first hideFilter></tab-pane-js-memory-filter> 138 `; 139 } 140} 141