Skip to content

Commit 01eb485

Browse files
committed
Allow editing trace set labels via Opened Traces widget. Fixes issue #384. Made each menu item into its own react component.
1 parent 3cd0a65 commit 01eb485

File tree

5 files changed

+59
-44
lines changed

5 files changed

+59
-44
lines changed

packages/base/src/signals/signal-manager.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export declare interface SignalManager {
2323
}
2424

2525
export const Signals = {
26-
TABNAME_CHANGED: 'tab changed',
26+
EXPERIMENT_CHANGED: 'tab changed',
2727
TRACE_OPENED: 'trace opened',
2828
TRACE_CLOSED: 'trace closed',
2929
EXPERIMENT_OPENED: 'experiment opened',
@@ -44,8 +44,8 @@ export const Signals = {
4444
};
4545

4646
export class SignalManager extends EventEmitter implements SignalManager {
47-
fireTabChangedSignal(tabName: string, expirementUUID: string): void {
48-
this.emit(Signals.TABNAME_CHANGED, {tabName, expirementUUID});
47+
fireExperimentChangedSignal(tabName: string, experimentUUID: string): void {
48+
this.emit(Signals.EXPERIMENT_CHANGED, { tabName, experimentUUID });
4949
}
5050
fireTraceOpenedSignal(trace: Trace): void {
5151
this.emit(Signals.TRACE_OPENED, trace);

packages/react-components/src/trace-explorer/menu-item-trace.tsx

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ interface MenuItemProps {
99
experimentName: string;
1010
experimentUUID: string;
1111
traces: Trace[];
12-
onTabNameChange: (tabEditingOpen: string, index: number) => void;
12+
onExperimentNameChange: (newExperimentName: string, index: number) => void;
1313
menuItemTraceContainerClassName: string;
1414
handleClickEvent: (event: React.MouseEvent<HTMLDivElement>, experimentName: string) => void;
1515
handleContextMenuEvent: (event: React.MouseEvent<HTMLDivElement>, experimentUUID: string) => void;
1616
}
1717
interface MenuItemState {
1818
editingTab: boolean;
19-
oldexpirementName: string;
20-
expirementNameState: string;
19+
oldExperimentName: string;
20+
experimentNameState: string;
2121
}
2222

2323
export class MenuItemTrace extends React.Component<MenuItemProps, MenuItemState> {
@@ -27,66 +27,66 @@ export class MenuItemTrace extends React.Component<MenuItemProps, MenuItemState>
2727
constructor(menuItemProps: MenuItemProps) {
2828
super(menuItemProps);
2929
this.state = {
30-
oldexpirementName: this.props.experimentName,
31-
expirementNameState: this.props.experimentName,
30+
oldExperimentName: this.props.experimentName,
31+
experimentNameState: this.props.experimentName,
3232
editingTab: false
3333
};
3434
this.wrapper = React.createRef();
3535
this.handleClickOutside = this.handleClickOutside.bind(this);
3636
}
3737

38-
submitNewTab(): void {
39-
if (this.state.expirementNameState.length > 0) {
38+
submitNewExperimentName(): void {
39+
if (this.state.experimentNameState.length > 0) {
4040
this.setState({
4141
editingTab: false,
42-
oldexpirementName: this.state.expirementNameState
42+
oldExperimentName: this.state.experimentNameState
4343
});
44-
this.props.onTabNameChange(this.state.expirementNameState, this.props.index);
44+
this.props.onExperimentNameChange(this.state.experimentNameState, this.props.index);
4545
} else {
4646
this.setState({
4747
editingTab: false,
48-
expirementNameState: this.state.oldexpirementName
48+
experimentNameState: this.state.oldExperimentName
4949
});
50-
const tabName = 'Trace: ' + this.state.oldexpirementName;
51-
signalManager().fireTabChangedSignal(tabName, this.props.experimentUUID);
50+
const tabName = 'Trace: ' + this.state.oldExperimentName;
51+
signalManager().fireExperimentChangedSignal(tabName, this.props.experimentUUID);
5252
}
5353
document.removeEventListener('click', this.handleClickOutside);
5454
}
5555

5656
handleClickOutside = (event: Event): void => {
5757
const node = this.wrapper.current;
5858
if ((!node || !node.contains(event.target as Node)) && this.state.editingTab === true) {
59-
this.submitNewTab();
59+
this.submitNewExperimentName();
6060
}
6161
};
6262

6363
protected handleEnterPress(event: React.KeyboardEvent<HTMLInputElement>): void{
6464
if (event.key === 'Enter' && this.state.editingTab === true){
65-
this.submitNewTab();
65+
this.submitNewExperimentName();
6666
}
6767
}
6868

6969
protected changeText(event: React.ChangeEvent<HTMLInputElement>): void{
7070
let newName = event.target.value.toString();
7171
this.setState({
72-
expirementNameState : newName
72+
experimentNameState : newName
7373
});
7474
newName = 'Trace: ' + newName;
75-
signalManager().fireTabChangedSignal(newName, this.props.experimentUUID);
75+
signalManager().fireExperimentChangedSignal(newName, this.props.experimentUUID);
7676
}
7777
protected inputTab(): React.ReactNode {
7878
if (!this.state.editingTab) {
7979
return (
80-
<div>
81-
{this.state.expirementNameState}
80+
<div className='wrapper'>
81+
{this.state.experimentNameState}
8282
<div className='edit-trace-name' onClick={e => {this.renderEditTraceName(e);}}>
8383
<FontAwesomeIcon icon={faPencilAlt} />
8484
</div>
8585
</div>
8686
);
8787
}
8888
return (<input name="tab-name" className="theia-input name-input-box"
89-
defaultValue = {this.state.expirementNameState}
89+
defaultValue = {this.state.experimentNameState}
9090
onChange = {e => (this.changeText(e))}
9191
onClick = {e => e.stopPropagation()}
9292
onKeyPress = {e => (this.handleEnterPress(e))}

packages/react-components/src/trace-explorer/trace-explorer-opened-traces-widget.tsx

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export class ReactOpenTracesWidget extends React.Component<ReactOpenTracesWidget
4545
signalManager().on(Signals.EXPERIMENT_CLOSED, this._onExperimentClosed);
4646
signalManager().on(Signals.TRACEVIEWERTAB_ACTIVATED, this._onOpenedTracesWidgetActivated);
4747

48-
this.handleTabNameUpdate = this.handleTabNameUpdate.bind(this);
48+
this.handleExperimentNameUpdate = this.handleExperimentNameUpdate.bind(this);
4949
this._experimentManager = this.props.tspClientProvider.getExperimentManager();
5050
this.props.tspClientProvider.addTspClientChangeListener(() => {
5151
this._experimentManager = this.props.tspClientProvider.getExperimentManager();
@@ -111,7 +111,6 @@ export class ReactOpenTracesWidget extends React.Component<ReactOpenTracesWidget
111111
render(): React.ReactNode {
112112
const totalHeight = this.getTotalHeight();
113113
this._forceUpdateKey = !this._forceUpdateKey;
114-
const key = Number(this._forceUpdateKey);
115114
return (
116115
<>
117116
<ReactModal isOpen={this._showShareDialog} onRequestClose={this.handleShareModalClose}
@@ -153,7 +152,7 @@ export class ReactOpenTracesWidget extends React.Component<ReactOpenTracesWidget
153152
traceContainerClassName = traceContainerClassName + ' theia-mod-selected';
154153
}
155154
return <MenuItemTrace
156-
onTabNameChange = {this.handleTabNameUpdate}
155+
onExperimentNameChange = {this.handleExperimentNameUpdate}
157156
menuItemTraceContainerClassName = {traceContainerClassName}
158157
traces={this.state.openedExperiments[props.index].traces}
159158
experimentName={traceName}
@@ -247,17 +246,12 @@ export class ReactOpenTracesWidget extends React.Component<ReactOpenTracesWidget
247246
signalManager().fireOpenedTracesChangedSignal(new OpenedTracesUpdatedSignalPayload(remoteExperiments ? remoteExperiments.length : 0));
248247
}
249248

250-
protected handleTabNameUpdate(tabEditingOpen: string, index: number): void {
251-
this.setState(({openedExperiments}) => ({
252-
openedExperiments: [
253-
...openedExperiments.slice(0,index),
254-
{
255-
...openedExperiments[index],
256-
name: tabEditingOpen,
257-
},
258-
...openedExperiments.slice(index + 1)
259-
]
260-
}));
249+
protected handleExperimentNameUpdate(newExperimentName: string, index: number): void {
250+
const modifiedOpenedExperiments = this.state.openedExperiments.slice();
251+
modifiedOpenedExperiments[index].name = newExperimentName;
252+
this.setState({
253+
openedExperiments: modifiedOpenedExperiments
254+
});
261255
}
262256

263257
protected handleShareButtonClick = (index: number): void => this.doHandleShareButtonClick(index);

packages/react-components/style/trace-explorer.css

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,29 @@
5353

5454
.trace-list-container.theia-mod-selected,
5555
.outputs-list-container.theia-mod-selected {
56-
background-color: var(--theia-selection-background);
56+
background-color: #3b3a4a;
5757
}
5858

59-
.edit-trace-name {
60-
display: inline-block;
59+
.trace-list-container:hover .edit-trace-name {
60+
visibility: visible;
61+
float: right;
62+
}
63+
64+
.trace-list-container:hover .wrapper {
65+
background-color: #151515;
66+
}
67+
68+
.trace-list-container .edit-trace-name {
69+
visibility: hidden;
70+
}
71+
72+
.name-input-box {
73+
background-color: #151515;
74+
margin-bottom: 5px;
75+
width: 100%;
76+
height: 18px;
77+
-webkit-box-sizing: border-box;
78+
box-sizing: border-box;
6179
}
6280

6381
/* Share options have been commented out, grid is disabled to optimize horizontal space */
@@ -79,7 +97,10 @@
7997

8098
.trace-element-name, .outputs-element-name {
8199
font-weight: bold;
82-
margin: unset;
100+
margin-top: unset;
101+
margin-left: unset;
102+
margin-right: unset;
103+
margin-bottom: 2px;
83104
height: var(--trace-extension-list-line-height);
84105
}
85106

theia-extensions/viewer-prototype/src/browser/trace-viewer/trace-viewer.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export class TraceViewerWidget extends ReactWidget {
5454
private onOutputAdded = (payload: OutputAddedSignalPayload): void => this.doHandleOutputAddedSignal(payload);
5555
private onExperimentSelected = (experiment: Experiment): void => this.doHandleExperimentSelectedSignal(experiment);
5656
private onCloseExperiment = (UUID: string): void => this.doHandleCloseExperimentSignal(UUID);
57-
private onTabNameChange = (payload: { tabName: string, expirementUUID: string; }): void => this.doHandleTabeNameChange(payload);
57+
private onExperimentNameChange = (payload: { tabName: string, experimentUUID: string; }): void => this.doHandleExperimentNameChange(payload);
5858

5959
@inject(TraceViewerWidgetOptions) protected readonly options: TraceViewerWidgetOptions;
6060
@inject(TspClientProvider) protected tspClientProvider: TspClientProvider;
@@ -112,16 +112,16 @@ export class TraceViewerWidget extends ReactWidget {
112112
signalManager().on(Signals.OUTPUT_ADDED, this.onOutputAdded);
113113
signalManager().on(Signals.EXPERIMENT_SELECTED, this.onExperimentSelected);
114114
signalManager().on(Signals.CLOSE_TRACEVIEWERTAB, this.onCloseExperiment);
115-
signalManager().on(Signals.TABNAME_CHANGED, this.onTabNameChange);
115+
signalManager().on(Signals.EXPERIMENT_CHANGED, this.onExperimentNameChange);
116116
}
117117

118118
protected updateBackgroundTheme(): void {
119119
const currentThemeType = ThemeService.get().getCurrentTheme().type;
120120
signalManager().fireThemeChangedSignal(currentThemeType);
121121
}
122122

123-
protected doHandleTabeNameChange(payload: { tabName: string, expirementUUID: string; }): void {
124-
if (payload.expirementUUID === this.options.traceUUID) {
123+
protected doHandleExperimentNameChange(payload: { tabName: string, experimentUUID: string; }): void {
124+
if (payload.experimentUUID === this.options.traceUUID) {
125125
this.title.label = payload.tabName;
126126
}
127127
}

0 commit comments

Comments
 (0)