blob: 43d07265ecb06ee480adc50d075957a4e4007da1 [file]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {Component, EventEmitter, Input, Output} from '@angular/core';
import {assertDefined} from 'common/assert_utils';
import {
EnableConfiguration,
SelectionConfiguration,
TraceConfiguration,
TraceConfigurationMap,
} from 'trace_collection/trace_collection_utils';
@Component({
selector: 'trace-config',
template: `
<h3 class="mat-subheading-2">Trace targets</h3>
<div class="checkboxes">
<mat-checkbox
*ngFor="let traceKey of objectKeys(this.traceConfig)"
color="primary"
class="trace-checkbox"
[checked]="this.traceConfig[traceKey].run"
[indeterminate]="
this.traceConfig[traceKey].isTraceCollection
? someTraces(this.traceConfig[traceKey])
: false
"
(change)="changeRunTrace($event.checked, this.traceConfig[traceKey])"
>{{ this.traceConfig[traceKey].name }}</mat-checkbox
>
</div>
<ng-container *ngFor="let traceKey of advancedConfigTraces()">
<mat-divider></mat-divider>
<h3 class="mat-subheading-2">{{ this.traceConfig[traceKey].name }} configuration</h3>
<div
*ngIf="this.traceConfig[traceKey].config?.enableConfigs.length > 0"
class="enable-config-opt">
<mat-checkbox
*ngFor="let enableConfig of traceEnableConfigs(this.traceConfig[traceKey])"
color="primary"
class="enable-config"
[disabled]="
!this.traceConfig[traceKey].run && !this.traceConfig[traceKey].isTraceCollection
"
[(ngModel)]="enableConfig.enabled"
(change)="changeTraceCollectionConfig(this.traceConfig[traceKey])"
>{{ enableConfig.name }}</mat-checkbox
>
</div>
<div
*ngIf="this.traceConfig[traceKey].config?.selectionConfigs.length > 0"
class="selection-config-opt">
<mat-form-field
*ngFor="let selectionConfig of traceSelectionConfigs(this.traceConfig[traceKey])"
class="config-selection"
appearance="fill">
<mat-label>{{ selectionConfig.name }}</mat-label>
<mat-select
class="selected-value"
[(value)]="selectionConfig.value"
[disabled]="!this.traceConfig[traceKey].run">
<mat-option *ngFor="let option of selectionConfig.options" value="{{ option }}">{{
option
}}</mat-option>
</mat-select>
</mat-form-field>
</div>
</ng-container>
`,
styles: [
`
.checkboxes {
display: grid;
grid-template-columns: repeat(3, 1fr);
column-gap: 10px;
}
.enable-config-opt,
.selection-config-opt {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 10px;
}
`,
],
})
export class TraceConfigComponent {
objectKeys = Object.keys;
@Input() traceConfig: TraceConfigurationMap | undefined;
@Output() readonly traceConfigChange = new EventEmitter<TraceConfigurationMap>();
advancedConfigTraces() {
const advancedConfigs: string[] = [];
Object.keys(assertDefined(this.traceConfig)).forEach((traceKey: string) => {
if (assertDefined(this.traceConfig)[traceKey].config) {
advancedConfigs.push(traceKey);
}
});
return advancedConfigs;
}
traceEnableConfigs(trace: TraceConfiguration): EnableConfiguration[] {
if (trace.config) {
return trace.config.enableConfigs;
} else {
return [];
}
}
traceSelectionConfigs(trace: TraceConfiguration): SelectionConfiguration[] {
if (trace.config) {
return trace.config.selectionConfigs;
} else {
return [];
}
}
someTraces(trace: TraceConfiguration): boolean {
return !trace.run && this.traceEnableConfigs(trace).filter((trace) => trace.enabled).length > 0;
}
changeRunTrace(run: boolean, trace: TraceConfiguration): void {
trace.run = run;
if (trace.isTraceCollection) {
this.traceEnableConfigs(trace).forEach((c: EnableConfiguration) => (c.enabled = run));
}
}
changeTraceCollectionConfig(trace: TraceConfiguration): void {
if (trace.isTraceCollection) {
trace.run = this.traceEnableConfigs(trace).every((c: EnableConfiguration) => c.enabled);
}
}
}