blob: 1886c05a71847fa944e7bb56c3b7ada8b710a292 [file]
// Copyright (C) 2025 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 m from 'mithril';
import type {TrackEventDetailsPanel} from '../../public/details_panel';
import type {Trace} from '../../public/trace';
import type {SourceDataset} from '../../trace_processor/dataset';
import {sqlValueToReadableString} from '../../trace_processor/sql_utils';
import {DetailsShell} from '../../widgets/details_shell';
import {GridLayout} from '../../widgets/grid_layout';
import {Section} from '../../widgets/section';
import {Tree, TreeNode} from '../../widgets/tree';
import {DurationWidget} from '../widgets/duration';
import {Timestamp} from '../widgets/timestamp';
import type {RowSchema} from './slice_track';
import {exists} from '../../base/utils';
import {Time} from '../../base/time';
/**
* Default details panel for SliceTrack that displays all fields from
* the dataset query.
*
* This panel provides a "better than nothing" experience when no custom
* details panel is specified. It automatically shows:
* - Common slice fields (name, ts, dur) with appropriate formatting
* - All other dataset columns as readable strings
*/
export class SliceTrackDetailsPanel<T extends RowSchema>
implements TrackEventDetailsPanel
{
constructor(
private readonly trace: Trace,
private readonly dataset: SourceDataset<T>,
private readonly data: T,
) {}
render() {
const data = this.data;
return m(
DetailsShell,
{
title: 'Slice',
},
m(
GridLayout,
m(
Section,
{title: 'Details'},
m(Tree, [
// Special handling for well-known slice fields
exists(data.id) &&
m(TreeNode, {
left: 'ID',
right: data.id,
}),
exists(data.ts) &&
m(TreeNode, {
left: 'Start time',
right: m(Timestamp, {
trace: this.trace,
ts: Time.fromRaw(data.ts),
}),
}),
exists(data.dur) &&
m(TreeNode, {
left: 'Duration',
right: m(DurationWidget, {
trace: this.trace,
dur: data.dur,
}),
}),
// List all other fields from the dataset's schema
...Object.keys(this.dataset.schema)
.filter((key) => !['id', 'ts', 'dur'].includes(key))
.map((key) => {
const value = data[key];
return m(TreeNode, {
left: key,
right: sqlValueToReadableString(value),
});
}),
]),
),
),
);
}
}