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 { LitTable } from '../../../base-ui/table/lit-table';
20fb726d48Sopenharmony_ciimport { LitProgressBar } from '../../../base-ui/progress-bar/LitProgressBar';
21fb726d48Sopenharmony_ciimport '../../../base-ui/progress-bar/LitProgressBar';
22fb726d48Sopenharmony_ciimport { getDataNo } from './utils/Utils';
23fb726d48Sopenharmony_ciimport './TableNoData';
24fb726d48Sopenharmony_ciimport { TableNoData } from './TableNoData';
25fb726d48Sopenharmony_ciimport { TabCpuDetailsThreadsHtml } from './TabCpuDetailsThreads.html';
26fb726d48Sopenharmony_ci
27fb726d48Sopenharmony_ci@element('tab-cpu-details-threads')
28fb726d48Sopenharmony_ciexport class TabCpuDetailsThreads extends BaseElement {
29fb726d48Sopenharmony_ci  private tableNoData: TableNoData | null | undefined;
30fb726d48Sopenharmony_ci  private cpuDetailsThreadUsageTbl: LitTable | null | undefined;
31fb726d48Sopenharmony_ci  private progress: LitProgressBar | null | undefined;
32fb726d48Sopenharmony_ci  private cpuDetailsThreadPie: LitChartPie | null | undefined;
33fb726d48Sopenharmony_ci  private data: Array<unknown> = [];
34fb726d48Sopenharmony_ci  private cpuDetailsThreadSortColumn: string = '';
35fb726d48Sopenharmony_ci  private sortType: number = 0;
36fb726d48Sopenharmony_ci
37fb726d48Sopenharmony_ci  initElements(): void {
38fb726d48Sopenharmony_ci    this.tableNoData = this.shadowRoot!.querySelector<TableNoData>('#table-no-data');
39fb726d48Sopenharmony_ci    this.progress = this.shadowRoot!.querySelector<LitProgressBar>('#loading');
40fb726d48Sopenharmony_ci    this.cpuDetailsThreadPie = this.shadowRoot!.querySelector<LitChartPie>('#cpu-thread-chart-pie');
41fb726d48Sopenharmony_ci    this.cpuDetailsThreadUsageTbl = this.shadowRoot!.querySelector<LitTable>('#tb-cpu-usage');
42fb726d48Sopenharmony_ci
43fb726d48Sopenharmony_ci    this.shadowRoot!.querySelector<HTMLDivElement>('.cpu-thread-go-back')!.onclick = (e): void => {
44fb726d48Sopenharmony_ci      if (!this.progress!.loading) {
45fb726d48Sopenharmony_ci        this.parentNode!.querySelector<HTMLDivElement>('.d-box')!.style.display = 'flex';
46fb726d48Sopenharmony_ci        this.setShow = false;
47fb726d48Sopenharmony_ci      }
48fb726d48Sopenharmony_ci    };
49fb726d48Sopenharmony_ci
50fb726d48Sopenharmony_ci    this.cpuDetailsThreadUsageTbl!.addEventListener('row-click', (evt: unknown): void => {
51fb726d48Sopenharmony_ci      // @ts-ignore
52fb726d48Sopenharmony_ci      let data = evt.detail.data;
53fb726d48Sopenharmony_ci      data.isSelected = true;
54fb726d48Sopenharmony_ci      // @ts-ignore
55fb726d48Sopenharmony_ci      if ((evt.detail as unknown).callBack) {
56fb726d48Sopenharmony_ci        // @ts-ignore
57fb726d48Sopenharmony_ci        (evt.detail as unknown).callBack(true);
58fb726d48Sopenharmony_ci      }
59fb726d48Sopenharmony_ci    });
60fb726d48Sopenharmony_ci
61fb726d48Sopenharmony_ci    this.cpuDetailsThreadUsageTbl!.addEventListener('column-click', (evt: unknown): void => {
62fb726d48Sopenharmony_ci      //@ts-ignore
63fb726d48Sopenharmony_ci      this.cpuDetailsThreadSortColumn = evt.detail.key; //@ts-ignore
64fb726d48Sopenharmony_ci      this.sortType = evt.detail.sort;
65fb726d48Sopenharmony_ci      // @ts-ignore
66fb726d48Sopenharmony_ci      this.sortByColumn(evt.detail);
67fb726d48Sopenharmony_ci    });
68fb726d48Sopenharmony_ci    this.cpuDetailsThreadUsageTbl!.addEventListener('row-hover', (evt: unknown): void => {
69fb726d48Sopenharmony_ci      //@ts-ignore
70fb726d48Sopenharmony_ci      if (evt.detail.data) {
71fb726d48Sopenharmony_ci        //@ts-ignore
72fb726d48Sopenharmony_ci        let data = evt.detail.data;
73fb726d48Sopenharmony_ci        data.isHover = true; //@ts-ignore
74fb726d48Sopenharmony_ci        if ((evt.detail as unknown).callBack) {
75fb726d48Sopenharmony_ci          //@ts-ignore
76fb726d48Sopenharmony_ci          (evt.detail as unknown).callBack(true);
77fb726d48Sopenharmony_ci        }
78fb726d48Sopenharmony_ci      }
79fb726d48Sopenharmony_ci      this.cpuDetailsThreadPie?.showHover();
80fb726d48Sopenharmony_ci    });
81fb726d48Sopenharmony_ci  }
82fb726d48Sopenharmony_ci
83fb726d48Sopenharmony_ci  init(cpu: number, it: unknown): void {
84fb726d48Sopenharmony_ci    this.shadowRoot!.querySelector<HTMLDivElement>('.cpu-thread-subheading')!.textContent =
85fb726d48Sopenharmony_ci      //@ts-ignore
86fb726d48Sopenharmony_ci      `Threads in Freq ${it.value}`;
87fb726d48Sopenharmony_ci    this.progress!.loading = true;
88fb726d48Sopenharmony_ci    procedurePool.submitWithName(
89fb726d48Sopenharmony_ci      'logic0',
90fb726d48Sopenharmony_ci      'scheduling-CPU Frequency Thread', //@ts-ignore
91fb726d48Sopenharmony_ci      { cpu: cpu, freq: (it as unknown).value },
92fb726d48Sopenharmony_ci      undefined,
93fb726d48Sopenharmony_ci      (res: unknown): void => {
94fb726d48Sopenharmony_ci        this.progress!.loading = false;
95fb726d48Sopenharmony_ci        this.queryPieChartDataByType(res);
96fb726d48Sopenharmony_ci      }
97fb726d48Sopenharmony_ci    );
98fb726d48Sopenharmony_ci  }
99fb726d48Sopenharmony_ci
100fb726d48Sopenharmony_ci  set setShow(v: boolean) {
101fb726d48Sopenharmony_ci    if (v) {
102fb726d48Sopenharmony_ci      this.style.display = 'flex';
103fb726d48Sopenharmony_ci    } else {
104fb726d48Sopenharmony_ci      this.clearData();
105fb726d48Sopenharmony_ci      this.style.display = 'none';
106fb726d48Sopenharmony_ci    }
107fb726d48Sopenharmony_ci  }
108fb726d48Sopenharmony_ci
109fb726d48Sopenharmony_ci  queryPieChartDataByType(res: unknown): void {
110fb726d48Sopenharmony_ci    //@ts-ignore
111fb726d48Sopenharmony_ci    this.data = res || [];
112fb726d48Sopenharmony_ci    this.data = getDataNo(this.data);
113fb726d48Sopenharmony_ci    this.tableNoData!.noData = this.data.length === 0;
114fb726d48Sopenharmony_ci    this.noData(this.data.length === 0);
115fb726d48Sopenharmony_ci    this.cpuDetailsThreadPie!.config = {
116fb726d48Sopenharmony_ci      appendPadding: 0,
117fb726d48Sopenharmony_ci      data: this.data,
118fb726d48Sopenharmony_ci      angleField: 'dur',
119fb726d48Sopenharmony_ci      colorField: 'tName',
120fb726d48Sopenharmony_ci      radius: 1,
121fb726d48Sopenharmony_ci      label: {
122fb726d48Sopenharmony_ci        type: 'outer',
123fb726d48Sopenharmony_ci      },
124fb726d48Sopenharmony_ci      tip: (obj): string => {
125fb726d48Sopenharmony_ci        return `<div>
126fb726d48Sopenharmony_ci                                <div>t_name:${
127fb726d48Sopenharmony_ci          // @ts-ignore
128fb726d48Sopenharmony_ci          obj.obj.tName
129fb726d48Sopenharmony_ci          }</div> 
130fb726d48Sopenharmony_ci                                <div>tid:${
131fb726d48Sopenharmony_ci          // @ts-ignore
132fb726d48Sopenharmony_ci          obj.obj.tid
133fb726d48Sopenharmony_ci          }</div>
134fb726d48Sopenharmony_ci                                <div>p_name:${
135fb726d48Sopenharmony_ci          // @ts-ignore
136fb726d48Sopenharmony_ci          obj.obj.pName
137fb726d48Sopenharmony_ci          }</div>
138fb726d48Sopenharmony_ci                                <div>p_pid:${
139fb726d48Sopenharmony_ci          // @ts-ignore
140fb726d48Sopenharmony_ci          obj.obj.pid
141fb726d48Sopenharmony_ci          }</div>
142fb726d48Sopenharmony_ci                                <div>duration:${
143fb726d48Sopenharmony_ci          // @ts-ignore
144fb726d48Sopenharmony_ci          obj.obj.durStr
145fb726d48Sopenharmony_ci          }</div>
146fb726d48Sopenharmony_ci                                <div>ratio:${
147fb726d48Sopenharmony_ci          // @ts-ignore
148fb726d48Sopenharmony_ci          obj.obj.ratio
149fb726d48Sopenharmony_ci          }%</div>
150fb726d48Sopenharmony_ci                            </div>
151fb726d48Sopenharmony_ci                                `;
152fb726d48Sopenharmony_ci      },
153fb726d48Sopenharmony_ci      hoverHandler: (data): void => {
154fb726d48Sopenharmony_ci        if (data) {
155fb726d48Sopenharmony_ci          this.cpuDetailsThreadUsageTbl!.setCurrentHover(data);
156fb726d48Sopenharmony_ci        } else {
157fb726d48Sopenharmony_ci          this.cpuDetailsThreadUsageTbl!.mouseOut();
158fb726d48Sopenharmony_ci        }
159fb726d48Sopenharmony_ci      },
160fb726d48Sopenharmony_ci      interactions: [
161fb726d48Sopenharmony_ci        {
162fb726d48Sopenharmony_ci          type: 'element-active',
163fb726d48Sopenharmony_ci        },
164fb726d48Sopenharmony_ci      ],
165fb726d48Sopenharmony_ci    };
166fb726d48Sopenharmony_ci    if (this.cpuDetailsThreadSortColumn !== '') {
167fb726d48Sopenharmony_ci      this.sortByColumn({ key: this.cpuDetailsThreadSortColumn, sort: this.sortType });
168fb726d48Sopenharmony_ci    } else {
169fb726d48Sopenharmony_ci      this.cpuDetailsThreadUsageTbl!.recycleDataSource = this.data;
170fb726d48Sopenharmony_ci    }
171fb726d48Sopenharmony_ci    this.cpuDetailsThreadUsageTbl?.reMeauseHeight();
172fb726d48Sopenharmony_ci  }
173fb726d48Sopenharmony_ci
174fb726d48Sopenharmony_ci  noData(value: boolean): void {
175fb726d48Sopenharmony_ci    this.shadowRoot!.querySelector<HTMLDivElement>('.cpu-thread-chart-box')!.style.display = value ? 'none' : 'block';
176fb726d48Sopenharmony_ci    this.shadowRoot!.querySelector<HTMLDivElement>('.cpu-thread-table-box')!.style.width = value ? '100%' : '60%';
177fb726d48Sopenharmony_ci  }
178fb726d48Sopenharmony_ci
179fb726d48Sopenharmony_ci  clearData(): void {
180fb726d48Sopenharmony_ci    this.cpuDetailsThreadPie!.dataSource = [];
181fb726d48Sopenharmony_ci    this.cpuDetailsThreadUsageTbl!.recycleDataSource = [];
182fb726d48Sopenharmony_ci    this.noData(false);
183fb726d48Sopenharmony_ci  }
184fb726d48Sopenharmony_ci
185fb726d48Sopenharmony_ci  sortByColumn(detail: unknown): void {
186fb726d48Sopenharmony_ci    // @ts-ignore
187fb726d48Sopenharmony_ci    function compare(cpuDetailsThreadProperty, sort, type) {
188fb726d48Sopenharmony_ci      return function (a: unknown, b: unknown) {
189fb726d48Sopenharmony_ci        if (type === 'number') {
190fb726d48Sopenharmony_ci          // @ts-ignore
191fb726d48Sopenharmony_ci          return sort === 2
192fb726d48Sopenharmony_ci            // @ts-ignore
193fb726d48Sopenharmony_ci            ? parseFloat(b[cpuDetailsThreadProperty]) - parseFloat(a[cpuDetailsThreadProperty])
194fb726d48Sopenharmony_ci            // @ts-ignore
195fb726d48Sopenharmony_ci            : parseFloat(a[cpuDetailsThreadProperty]) - parseFloat(b[cpuDetailsThreadProperty]);
196fb726d48Sopenharmony_ci        } else {
197fb726d48Sopenharmony_ci          if (sort === 2) {
198fb726d48Sopenharmony_ci            // @ts-ignore
199fb726d48Sopenharmony_ci            return b[cpuDetailsThreadProperty].toString().localeCompare(a[cpuDetailsThreadProperty].toString());
200fb726d48Sopenharmony_ci          } else {
201fb726d48Sopenharmony_ci            // @ts-ignore
202fb726d48Sopenharmony_ci            return a[cpuDetailsThreadProperty].toString().localeCompare(b[cpuDetailsThreadProperty].toString());
203fb726d48Sopenharmony_ci          }
204fb726d48Sopenharmony_ci        }
205fb726d48Sopenharmony_ci      };
206fb726d48Sopenharmony_ci    }
207fb726d48Sopenharmony_ci
208fb726d48Sopenharmony_ci    // @ts-ignore
209fb726d48Sopenharmony_ci    if (detail.key === 'durStr') {
210fb726d48Sopenharmony_ci      // @ts-ignore
211fb726d48Sopenharmony_ci      detail.key = 'dur';
212fb726d48Sopenharmony_ci      // @ts-ignore
213fb726d48Sopenharmony_ci      this.data.sort(compare(detail.key, detail.sort, 'number'));
214fb726d48Sopenharmony_ci    } else if (
215fb726d48Sopenharmony_ci      // @ts-ignore
216fb726d48Sopenharmony_ci      detail.key === 'value' ||
217fb726d48Sopenharmony_ci      // @ts-ignore
218fb726d48Sopenharmony_ci      detail.key === 'ratio' ||
219fb726d48Sopenharmony_ci      // @ts-ignore
220fb726d48Sopenharmony_ci      detail.key === 'index' ||
221fb726d48Sopenharmony_ci      // @ts-ignore
222fb726d48Sopenharmony_ci      detail.key === 'tid' ||
223fb726d48Sopenharmony_ci      // @ts-ignore
224fb726d48Sopenharmony_ci      detail.key === 'pid'
225fb726d48Sopenharmony_ci    ) {
226fb726d48Sopenharmony_ci      // @ts-ignore
227fb726d48Sopenharmony_ci      this.data.sort(compare(detail.key, detail.sort, 'number'));
228fb726d48Sopenharmony_ci    } else {
229fb726d48Sopenharmony_ci      // @ts-ignore
230fb726d48Sopenharmony_ci      this.data.sort(compare(detail.key, detail.sort, 'string'));
231fb726d48Sopenharmony_ci    }
232fb726d48Sopenharmony_ci    this.cpuDetailsThreadUsageTbl!.recycleDataSource = this.data;
233fb726d48Sopenharmony_ci  }
234fb726d48Sopenharmony_ci
235fb726d48Sopenharmony_ci  initHtml(): string {
236fb726d48Sopenharmony_ci    return TabCpuDetailsThreadsHtml;
237fb726d48Sopenharmony_ci  }
238fb726d48Sopenharmony_ci}
239