xref: /aosp_15_r20/external/perfetto/ui/src/public/sidebar.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2024 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker//
3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker//
7*6dbdd20aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker//
9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Worker// For now sections are fixed and cannot be extended by plugins.
16*6dbdd20aSAndroid Build Coastguard Workerexport const SIDEBAR_SECTIONS = {
17*6dbdd20aSAndroid Build Coastguard Worker  navigation: {
18*6dbdd20aSAndroid Build Coastguard Worker    title: 'Navigation',
19*6dbdd20aSAndroid Build Coastguard Worker    summary: 'Open or record a new trace',
20*6dbdd20aSAndroid Build Coastguard Worker  },
21*6dbdd20aSAndroid Build Coastguard Worker  current_trace: {
22*6dbdd20aSAndroid Build Coastguard Worker    title: 'Current Trace',
23*6dbdd20aSAndroid Build Coastguard Worker    summary: 'Actions on the current trace',
24*6dbdd20aSAndroid Build Coastguard Worker  },
25*6dbdd20aSAndroid Build Coastguard Worker  convert_trace: {
26*6dbdd20aSAndroid Build Coastguard Worker    title: 'Convert trace',
27*6dbdd20aSAndroid Build Coastguard Worker    summary: 'Convert to other formats',
28*6dbdd20aSAndroid Build Coastguard Worker  },
29*6dbdd20aSAndroid Build Coastguard Worker  example_traces: {
30*6dbdd20aSAndroid Build Coastguard Worker    title: 'Example Traces',
31*6dbdd20aSAndroid Build Coastguard Worker    summary: 'Open an example trace',
32*6dbdd20aSAndroid Build Coastguard Worker  },
33*6dbdd20aSAndroid Build Coastguard Worker  support: {
34*6dbdd20aSAndroid Build Coastguard Worker    title: 'Support',
35*6dbdd20aSAndroid Build Coastguard Worker    summary: 'Documentation & Bugs',
36*6dbdd20aSAndroid Build Coastguard Worker  },
37*6dbdd20aSAndroid Build Coastguard Worker} as const;
38*6dbdd20aSAndroid Build Coastguard Worker
39*6dbdd20aSAndroid Build Coastguard Workerexport type SidebarSections = keyof typeof SIDEBAR_SECTIONS;
40*6dbdd20aSAndroid Build Coastguard Worker
41*6dbdd20aSAndroid Build Coastguard Workerexport interface SidebarManager {
42*6dbdd20aSAndroid Build Coastguard Worker  readonly enabled: boolean;
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard Worker  /**
45*6dbdd20aSAndroid Build Coastguard Worker   * Adds a new menu item to the sidebar.
46*6dbdd20aSAndroid Build Coastguard Worker   * All entries must map to a command. This will allow the shortcut and
47*6dbdd20aSAndroid Build Coastguard Worker   * optional shortcut to be displayed on the UI.
48*6dbdd20aSAndroid Build Coastguard Worker   */
49*6dbdd20aSAndroid Build Coastguard Worker  addMenuItem(menuItem: SidebarMenuItem): void;
50*6dbdd20aSAndroid Build Coastguard Worker
51*6dbdd20aSAndroid Build Coastguard Worker  /**
52*6dbdd20aSAndroid Build Coastguard Worker   * Gets the current visibility of the sidebar.
53*6dbdd20aSAndroid Build Coastguard Worker   */
54*6dbdd20aSAndroid Build Coastguard Worker  get visible(): boolean;
55*6dbdd20aSAndroid Build Coastguard Worker
56*6dbdd20aSAndroid Build Coastguard Worker  /**
57*6dbdd20aSAndroid Build Coastguard Worker   * Toggles the visibility of the sidebar. Can only be called when
58*6dbdd20aSAndroid Build Coastguard Worker   * `sidebarEnabled` returns `ENABLED`.
59*6dbdd20aSAndroid Build Coastguard Worker   */
60*6dbdd20aSAndroid Build Coastguard Worker  toggleVisibility(): void;
61*6dbdd20aSAndroid Build Coastguard Worker}
62*6dbdd20aSAndroid Build Coastguard Worker
63*6dbdd20aSAndroid Build Coastguard Workerexport type SidebarMenuItem = {
64*6dbdd20aSAndroid Build Coastguard Worker  readonly section: SidebarSections;
65*6dbdd20aSAndroid Build Coastguard Worker  readonly sortOrder?: number;
66*6dbdd20aSAndroid Build Coastguard Worker
67*6dbdd20aSAndroid Build Coastguard Worker  // The properties below can be mutated by passing a callback rather than a
68*6dbdd20aSAndroid Build Coastguard Worker  // direct value. The callback is invoked on every render frame, keep it cheap.
69*6dbdd20aSAndroid Build Coastguard Worker  // readonly text: string | (() => string);
70*6dbdd20aSAndroid Build Coastguard Worker  readonly icon?: string | (() => string);
71*6dbdd20aSAndroid Build Coastguard Worker  readonly tooltip?: string | (() => string);
72*6dbdd20aSAndroid Build Coastguard Worker  readonly cssClass?: string | (() => string); // Without trailing '.'.
73*6dbdd20aSAndroid Build Coastguard Worker
74*6dbdd20aSAndroid Build Coastguard Worker  // If false or omitted the item works normally.
75*6dbdd20aSAndroid Build Coastguard Worker  // If true the item is striken through and the action/href will be a no-op.
76*6dbdd20aSAndroid Build Coastguard Worker  // If a string, the item acts as disabled and clicking on it shows a popup
77*6dbdd20aSAndroid Build Coastguard Worker  // that shows the returned text (the string has "disabled reason" semantic);
78*6dbdd20aSAndroid Build Coastguard Worker  readonly disabled?: string | boolean | (() => string | boolean);
79*6dbdd20aSAndroid Build Coastguard Worker
80*6dbdd20aSAndroid Build Coastguard Worker  // One of the three following arguments must be specified.
81*6dbdd20aSAndroid Build Coastguard Worker} & (
82*6dbdd20aSAndroid Build Coastguard Worker  | {
83*6dbdd20aSAndroid Build Coastguard Worker      /** The text of the menu entry. Required. */
84*6dbdd20aSAndroid Build Coastguard Worker      readonly text: string | (() => string);
85*6dbdd20aSAndroid Build Coastguard Worker
86*6dbdd20aSAndroid Build Coastguard Worker      /**
87*6dbdd20aSAndroid Build Coastguard Worker       * The URL to navigate to. It can be either:
88*6dbdd20aSAndroid Build Coastguard Worker       * - A local route (e.g. ''#!/query').
89*6dbdd20aSAndroid Build Coastguard Worker       * - An absolute URL (e.g. 'https://example.com'). In this case the link will
90*6dbdd20aSAndroid Build Coastguard Worker       *   be open in a target=_blank new tag.
91*6dbdd20aSAndroid Build Coastguard Worker       */
92*6dbdd20aSAndroid Build Coastguard Worker      readonly href: string;
93*6dbdd20aSAndroid Build Coastguard Worker    }
94*6dbdd20aSAndroid Build Coastguard Worker  | {
95*6dbdd20aSAndroid Build Coastguard Worker      /** The text of the menu entry. Required. */
96*6dbdd20aSAndroid Build Coastguard Worker      readonly text: string | (() => string);
97*6dbdd20aSAndroid Build Coastguard Worker
98*6dbdd20aSAndroid Build Coastguard Worker      /**
99*6dbdd20aSAndroid Build Coastguard Worker       * The function that will be invoked when clicking. If the function returns
100*6dbdd20aSAndroid Build Coastguard Worker       * a promise, a spinner will be drawn next to the sidebar entry until the
101*6dbdd20aSAndroid Build Coastguard Worker       * promise resolves.
102*6dbdd20aSAndroid Build Coastguard Worker       */
103*6dbdd20aSAndroid Build Coastguard Worker      readonly action: () => unknown | Promise<unknown>;
104*6dbdd20aSAndroid Build Coastguard Worker
105*6dbdd20aSAndroid Build Coastguard Worker      /** Optional. If omitted href = '#'. */
106*6dbdd20aSAndroid Build Coastguard Worker      readonly href?: string;
107*6dbdd20aSAndroid Build Coastguard Worker    }
108*6dbdd20aSAndroid Build Coastguard Worker  | {
109*6dbdd20aSAndroid Build Coastguard Worker      /** Optional. If omitted uses the command name. */
110*6dbdd20aSAndroid Build Coastguard Worker      readonly text?: string | (() => string);
111*6dbdd20aSAndroid Build Coastguard Worker
112*6dbdd20aSAndroid Build Coastguard Worker      /** The ID of the command that will be invoked when clicking */
113*6dbdd20aSAndroid Build Coastguard Worker      readonly commandId: string;
114*6dbdd20aSAndroid Build Coastguard Worker    }
115*6dbdd20aSAndroid Build Coastguard Worker);
116