1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { BaseElement, element } from '../../../base-ui/BaseElement';
17fb726d48Sopenharmony_ciimport { LitChartPie } from '../../../base-ui/chart/pie/LitChartPie';
18fb726d48Sopenharmony_ciimport { procedurePool } from '../../database/Procedure';
19fb726d48Sopenharmony_ciimport { SpSchedulingAnalysis } from './SpSchedulingAnalysis';
20fb726d48Sopenharmony_ciimport { info } from '../../../log/Log';
21fb726d48Sopenharmony_ciimport { LitTable } from '../../../base-ui/table/lit-table';
22fb726d48Sopenharmony_ciimport '../../../base-ui/progress-bar/LitProgressBar';
23fb726d48Sopenharmony_ciimport { LitProgressBar } from '../../../base-ui/progress-bar/LitProgressBar';
24fb726d48Sopenharmony_ciimport { getDataNo } from './utils/Utils';
25fb726d48Sopenharmony_ciimport './TableNoData';
26fb726d48Sopenharmony_ciimport { TableNoData } from './TableNoData';
27fb726d48Sopenharmony_ciimport { pieChartColors } from '../../../base-ui/chart/pie/LitChartPieData';
28fb726d48Sopenharmony_ciimport { TabCpuDetailsIdleHtml } from './TabCpuDetailsIdle.html';
29fb726d48Sopenharmony_ci
30fb726d48Sopenharmony_ci@element('tab-cpu-details-idle')
31fb726d48Sopenharmony_ciexport class TabCpuDetailsIdle extends BaseElement {
32fb726d48Sopenharmony_ci  private tableNoData: TableNoData | null | undefined;
33fb726d48Sopenharmony_ci  private cpuDetailsLdlUsageTbl: LitTable | null | undefined;
34fb726d48Sopenharmony_ci  private cpuDetailsLdlProgress: LitProgressBar | null | undefined;
35fb726d48Sopenharmony_ci  traceChange: boolean = false;
36fb726d48Sopenharmony_ci  private cpuDetailsLdlPie: LitChartPie | null | undefined;
37fb726d48Sopenharmony_ci  private cpuDetailsLdlData: Array<unknown> = [];
38fb726d48Sopenharmony_ci  private cpuDetailsLdlSortColumn: string = '';
39fb726d48Sopenharmony_ci  private sortType: number = 0;
40fb726d48Sopenharmony_ci
41fb726d48Sopenharmony_ci  initElements(): void {
42fb726d48Sopenharmony_ci    this.tableNoData = this.shadowRoot!.querySelector<TableNoData>('#table-no-data');
43fb726d48Sopenharmony_ci    this.cpuDetailsLdlProgress = this.shadowRoot!.querySelector<LitProgressBar>('#loading');
44fb726d48Sopenharmony_ci    this.cpuDetailsLdlPie = this.shadowRoot!.querySelector<LitChartPie>('#cpu_idle_chart-pie');
45fb726d48Sopenharmony_ci    this.cpuDetailsLdlUsageTbl = this.shadowRoot!.querySelector<LitTable>('#idle-tb-cpu-usage');
46fb726d48Sopenharmony_ci
47fb726d48Sopenharmony_ci    this.cpuDetailsLdlUsageTbl!.addEventListener('row-click', (evt: unknown): void => {
48fb726d48Sopenharmony_ci      // @ts-ignore
49fb726d48Sopenharmony_ci      let data = evt.detail.data;
50fb726d48Sopenharmony_ci      data.isSelected = true;
51fb726d48Sopenharmony_ci      // @ts-ignore
52fb726d48Sopenharmony_ci      if ((evt.detail as unknown).callBack) {
53fb726d48Sopenharmony_ci        // @ts-ignore
54fb726d48Sopenharmony_ci        (evt.detail as unknown).callBack(true);
55fb726d48Sopenharmony_ci      }
56fb726d48Sopenharmony_ci    });
57fb726d48Sopenharmony_ci
58fb726d48Sopenharmony_ci    this.cpuDetailsLdlUsageTbl!.addEventListener('column-click', (evt: unknown): void => {
59fb726d48Sopenharmony_ci      //@ts-ignore
60fb726d48Sopenharmony_ci      this.cpuDetailsLdlSortColumn = evt.detail.key; //@ts-ignore
61fb726d48Sopenharmony_ci      this.sortType = evt.detail.sort;
62fb726d48Sopenharmony_ci      // @ts-ignore
63fb726d48Sopenharmony_ci      this.sortByColumn(evt.detail);
64fb726d48Sopenharmony_ci    });
65fb726d48Sopenharmony_ci    this.cpuDetailsLdlUsageTbl!.addEventListener('row-hover', (evt: unknown): void => {
66fb726d48Sopenharmony_ci      //@ts-ignore
67fb726d48Sopenharmony_ci      if (evt.detail.data) {
68fb726d48Sopenharmony_ci        //@ts-ignore
69fb726d48Sopenharmony_ci        let data = evt.detail.data;
70fb726d48Sopenharmony_ci        data.isHover = true; //@ts-ignore
71fb726d48Sopenharmony_ci        if ((evt.detail as unknown).callBack) {
72fb726d48Sopenharmony_ci          //@ts-ignore
73fb726d48Sopenharmony_ci          (evt.detail as unknown).callBack(true);
74fb726d48Sopenharmony_ci        }
75fb726d48Sopenharmony_ci      }
76fb726d48Sopenharmony_ci      this.cpuDetailsLdlPie?.showHover();
77fb726d48Sopenharmony_ci    });
78fb726d48Sopenharmony_ci  }
79fb726d48Sopenharmony_ci
80fb726d48Sopenharmony_ci  init(cpu: number): void {
81fb726d48Sopenharmony_ci    this.queryPieChartDataByType('CPU Idle', cpu);
82fb726d48Sopenharmony_ci  }
83fb726d48Sopenharmony_ci
84fb726d48Sopenharmony_ci  queryPieChartDataByType(type: string, cpu: number): void {
85fb726d48Sopenharmony_ci    if (this.traceChange) {
86fb726d48Sopenharmony_ci      return;
87fb726d48Sopenharmony_ci    }
88fb726d48Sopenharmony_ci    this.cpuDetailsLdlProgress!.loading = true;
89fb726d48Sopenharmony_ci    this.queryLoginWorker(`scheduling-${type}`, 'query Cpu Frequency Analysis Time:', (res): void => {
90fb726d48Sopenharmony_ci      this.traceChange = true;
91fb726d48Sopenharmony_ci      this.cpuDetailsLdlProgress!.loading = false; //@ts-ignore
92fb726d48Sopenharmony_ci      this.cpuDetailsLdlData = res.get(cpu) || [];
93fb726d48Sopenharmony_ci      this.cpuDetailsLdlData = getDataNo(this.cpuDetailsLdlData);
94fb726d48Sopenharmony_ci      this.tableNoData!.noData = this.cpuDetailsLdlData.length === 0;
95fb726d48Sopenharmony_ci      this.noData(this.cpuDetailsLdlData.length === 0);
96fb726d48Sopenharmony_ci      this.setLdlPieConfig(type);
97fb726d48Sopenharmony_ci      if (this.cpuDetailsLdlSortColumn !== '') {
98fb726d48Sopenharmony_ci        this.sortByColumn({
99fb726d48Sopenharmony_ci          key: this.cpuDetailsLdlSortColumn,
100fb726d48Sopenharmony_ci          sort: this.sortType,
101fb726d48Sopenharmony_ci        });
102fb726d48Sopenharmony_ci      } else {
103fb726d48Sopenharmony_ci        this.cpuDetailsLdlUsageTbl!.recycleDataSource = this.cpuDetailsLdlData;
104fb726d48Sopenharmony_ci      }
105fb726d48Sopenharmony_ci      this.cpuDetailsLdlUsageTbl?.reMeauseHeight();
106fb726d48Sopenharmony_ci    });
107fb726d48Sopenharmony_ci  }
108fb726d48Sopenharmony_ci
109fb726d48Sopenharmony_ci  private setLdlPieConfig(type: string): void {
110fb726d48Sopenharmony_ci    this.cpuDetailsLdlPie!.config = {
111fb726d48Sopenharmony_ci      appendPadding: 0,
112fb726d48Sopenharmony_ci      data: this.cpuDetailsLdlData,
113fb726d48Sopenharmony_ci      angleField: 'sum',
114fb726d48Sopenharmony_ci      colorField: 'value',
115fb726d48Sopenharmony_ci      radius: 1,
116fb726d48Sopenharmony_ci      label: {
117fb726d48Sopenharmony_ci        type: 'outer',
118fb726d48Sopenharmony_ci        color:
119fb726d48Sopenharmony_ci          type !== 'CPU Idle'
120fb726d48Sopenharmony_ci            ? undefined
121fb726d48Sopenharmony_ci            : (it): string => {
122fb726d48Sopenharmony_ci                //@ts-ignore
123fb726d48Sopenharmony_ci                return pieChartColors[(it as unknown).value];
124fb726d48Sopenharmony_ci              },
125fb726d48Sopenharmony_ci      },
126fb726d48Sopenharmony_ci      hoverHandler: (data): void => {
127fb726d48Sopenharmony_ci        if (data) {
128fb726d48Sopenharmony_ci          this.cpuDetailsLdlUsageTbl!.setCurrentHover(data);
129fb726d48Sopenharmony_ci        } else {
130fb726d48Sopenharmony_ci          this.cpuDetailsLdlUsageTbl!.mouseOut();
131fb726d48Sopenharmony_ci        }
132fb726d48Sopenharmony_ci      },
133fb726d48Sopenharmony_ci      tip: (idleObj): string => {
134fb726d48Sopenharmony_ci        return `<div>
135fb726d48Sopenharmony_ci                                <div>idle:${
136fb726d48Sopenharmony_ci                                  // @ts-ignore
137fb726d48Sopenharmony_ci                                  idleObj.obj.value
138fb726d48Sopenharmony_ci                                }</div> 
139fb726d48Sopenharmony_ci                                <div>min:${
140fb726d48Sopenharmony_ci                                  // @ts-ignore
141fb726d48Sopenharmony_ci                                  idleObj.obj.min
142fb726d48Sopenharmony_ci                                }</div>
143fb726d48Sopenharmony_ci                                <div>max:${
144fb726d48Sopenharmony_ci                                  // @ts-ignore
145fb726d48Sopenharmony_ci                                  idleObj.obj.max
146fb726d48Sopenharmony_ci                                }</div>
147fb726d48Sopenharmony_ci                                <div>average:${
148fb726d48Sopenharmony_ci                                  // @ts-ignore
149fb726d48Sopenharmony_ci                                  idleObj.obj.avg
150fb726d48Sopenharmony_ci                                }</div>
151fb726d48Sopenharmony_ci                                <div>duration:${
152fb726d48Sopenharmony_ci                                  // @ts-ignore
153fb726d48Sopenharmony_ci                                  idleObj.obj.sumTimeStr
154fb726d48Sopenharmony_ci                                }</div>
155fb726d48Sopenharmony_ci                                <div>ratio:${
156fb726d48Sopenharmony_ci                                  // @ts-ignore
157fb726d48Sopenharmony_ci                                  idleObj.obj.ratio
158fb726d48Sopenharmony_ci                                }%</div>
159fb726d48Sopenharmony_ci                            </div>
160fb726d48Sopenharmony_ci                                `;
161fb726d48Sopenharmony_ci      },
162fb726d48Sopenharmony_ci      interactions: [
163fb726d48Sopenharmony_ci        {
164fb726d48Sopenharmony_ci          type: 'element-active',
165fb726d48Sopenharmony_ci        },
166fb726d48Sopenharmony_ci      ],
167fb726d48Sopenharmony_ci    };
168fb726d48Sopenharmony_ci  }
169fb726d48Sopenharmony_ci
170fb726d48Sopenharmony_ci  noData(value: boolean): void {
171fb726d48Sopenharmony_ci    this.shadowRoot!.querySelector<HTMLDivElement>('.idle-chart-box')!.style.display = value ? 'none' : 'block';
172fb726d48Sopenharmony_ci    this.shadowRoot!.querySelector<HTMLDivElement>('.cpu_idle_table-box')!.style.width = value ? '100%' : '60%';
173fb726d48Sopenharmony_ci  }
174fb726d48Sopenharmony_ci
175fb726d48Sopenharmony_ci  clearData(): void {
176fb726d48Sopenharmony_ci    this.traceChange = false;
177fb726d48Sopenharmony_ci    this.cpuDetailsLdlPie!.dataSource = [];
178fb726d48Sopenharmony_ci    this.cpuDetailsLdlUsageTbl!.recycleDataSource = [];
179fb726d48Sopenharmony_ci    this.noData(false);
180fb726d48Sopenharmony_ci  }
181fb726d48Sopenharmony_ci
182fb726d48Sopenharmony_ci  queryLoginWorker(idleType: string, log: string, handler: (res: unknown) => void): void {
183fb726d48Sopenharmony_ci    let cpuDetailsldleTime = new Date().getTime();
184fb726d48Sopenharmony_ci    procedurePool.submitWithName(
185fb726d48Sopenharmony_ci      'logic0',
186fb726d48Sopenharmony_ci      idleType,
187fb726d48Sopenharmony_ci      {
188fb726d48Sopenharmony_ci        endTs: SpSchedulingAnalysis.endTs,
189fb726d48Sopenharmony_ci        total: SpSchedulingAnalysis.totalDur,
190fb726d48Sopenharmony_ci      },
191fb726d48Sopenharmony_ci      undefined,
192fb726d48Sopenharmony_ci      handler
193fb726d48Sopenharmony_ci    );
194fb726d48Sopenharmony_ci    let durTime = new Date().getTime() - cpuDetailsldleTime;
195fb726d48Sopenharmony_ci    info(log, durTime);
196fb726d48Sopenharmony_ci  }
197fb726d48Sopenharmony_ci
198fb726d48Sopenharmony_ci  sortByColumn(detail: unknown): void {
199fb726d48Sopenharmony_ci    // @ts-ignore
200fb726d48Sopenharmony_ci    function compare(cpuDetailsLdlProperty, sort, type) {
201fb726d48Sopenharmony_ci      return function (a: unknown, b: unknown) {
202fb726d48Sopenharmony_ci        if (type === 'number') {
203fb726d48Sopenharmony_ci          return sort === 2
204fb726d48Sopenharmony_ci            ? // @ts-ignore
205fb726d48Sopenharmony_ci              parseFloat(b[cpuDetailsLdlProperty]) - parseFloat(a[cpuDetailsLdlProperty])
206fb726d48Sopenharmony_ci            : //@ts-ignore
207fb726d48Sopenharmony_ci              parseFloat(a[cpuDetailsLdlProperty]) - parseFloat(b[cpuDetailsLdlProperty]);
208fb726d48Sopenharmony_ci        } else {
209fb726d48Sopenharmony_ci          if (sort === 2) {
210fb726d48Sopenharmony_ci            //@ts-ignore
211fb726d48Sopenharmony_ci            return b[cpuDetailsLdlProperty].toString().localeCompare(a[cpuDetailsLdlProperty].toString());
212fb726d48Sopenharmony_ci          } else {
213fb726d48Sopenharmony_ci            //@ts-ignore
214fb726d48Sopenharmony_ci            return a[cpuDetailsLdlProperty].toString().localeCompare(b[cpuDetailsLdlProperty].toString());
215fb726d48Sopenharmony_ci          }
216fb726d48Sopenharmony_ci        }
217fb726d48Sopenharmony_ci      };
218fb726d48Sopenharmony_ci    }
219fb726d48Sopenharmony_ci
220fb726d48Sopenharmony_ci    //@ts-ignore
221fb726d48Sopenharmony_ci    if (detail.key === 'min') {
222fb726d48Sopenharmony_ci      //@ts-ignore
223fb726d48Sopenharmony_ci      detail.key = 'minValue'; //@ts-ignore
224fb726d48Sopenharmony_ci      this.cpuDetailsLdlData.sort(compare(detail.key, detail.sort, 'number')); //@ts-ignore
225fb726d48Sopenharmony_ci    } else if (detail.key === 'max') {
226fb726d48Sopenharmony_ci      //@ts-ignore
227fb726d48Sopenharmony_ci      detail.key = 'maxValue'; //@ts-ignore
228fb726d48Sopenharmony_ci      this.cpuDetailsLdlData.sort(compare(detail.key, detail.sort, 'number')); //@ts-ignore
229fb726d48Sopenharmony_ci    } else if (detail.key === 'avg') {
230fb726d48Sopenharmony_ci      //@ts-ignore
231fb726d48Sopenharmony_ci      detail.key = 'avgValue'; //@ts-ignore
232fb726d48Sopenharmony_ci      this.cpuDetailsLdlData.sort(compare(detail.key, detail.sort, 'number')); //@ts-ignore
233fb726d48Sopenharmony_ci    } else if (detail.key === 'sumTimeStr') {
234fb726d48Sopenharmony_ci      //@ts-ignore
235fb726d48Sopenharmony_ci      detail.key = 'sum'; //@ts-ignore
236fb726d48Sopenharmony_ci      this.cpuDetailsLdlData.sort(compare(detail.key, detail.sort, 'number')); //@ts-ignore
237fb726d48Sopenharmony_ci    } else if (detail.key === 'value' || detail.key === 'ratio' || detail.key === 'index') {
238fb726d48Sopenharmony_ci      //@ts-ignore
239fb726d48Sopenharmony_ci      this.cpuDetailsLdlData.sort(compare(detail.key, detail.sort, 'number'));
240fb726d48Sopenharmony_ci    } else {
241fb726d48Sopenharmony_ci      //@ts-ignore
242fb726d48Sopenharmony_ci      this.cpuDetailsLdlData.sort(compare(detail.key, detail.sort, 'string'));
243fb726d48Sopenharmony_ci    }
244fb726d48Sopenharmony_ci    this.cpuDetailsLdlUsageTbl!.recycleDataSource = this.cpuDetailsLdlData;
245fb726d48Sopenharmony_ci  }
246fb726d48Sopenharmony_ci
247fb726d48Sopenharmony_ci  initHtml(): string {
248fb726d48Sopenharmony_ci    return TabCpuDetailsIdleHtml;
249fb726d48Sopenharmony_ci  }
250fb726d48Sopenharmony_ci}
251