Skip to content

Commit 4c809eb

Browse files
authored
feat: the tree in Problems panel supports onSelect event (#712)
1 parent a5134b0 commit 4c809eb

File tree

5 files changed

+47
-4
lines changed

5 files changed

+47
-4
lines changed

src/controller/__tests__/problems.test.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Float } from 'mo/model';
1+
import { Float, IProblemsTreeNode } from 'mo/model';
22
import { MonacoService } from 'mo/monaco/monacoService';
33
import {
44
PanelService,
@@ -10,6 +10,7 @@ import { constants, modules } from 'mo/services/builtinService/const';
1010
import 'reflect-metadata';
1111
import { container } from 'tsyringe';
1212
import { ProblemsController } from '../problems';
13+
import { expectFnCalled } from '@test/utils';
1314

1415
const problemsController = container.resolve(ProblemsController);
1516
const panelService = container.resolve(PanelService);
@@ -88,4 +89,11 @@ describe('The problems controller', () => {
8889
);
8990
monacoService.commandService.executeCommand = original;
9091
});
92+
93+
test('Should support to execute onSelect', () => {
94+
expectFnCalled((fn) => {
95+
problemsService.onSelect(fn);
96+
problemsController.onSelect({} as IProblemsTreeNode);
97+
});
98+
});
9199
});

src/controller/problems.tsx

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import 'reflect-metadata';
22
import React from 'react';
3-
import { Float, IStatusBarItem } from 'mo/model';
3+
import {
4+
Float,
5+
IStatusBarItem,
6+
ProblemsEvent,
7+
IProblemsTreeNode,
8+
} from 'mo/model';
49
import { Controller } from 'mo/react/controller';
510
import {
611
IPanelService,
@@ -20,6 +25,7 @@ import { ProblemsPaneView, ProblemsStatusBarView } from 'mo/workbench/problems';
2025
import { connect } from 'mo/react';
2126
export interface IProblemsController extends Partial<Controller> {
2227
onClick?: (e: React.MouseEvent, item: IStatusBarItem) => void;
28+
onSelect?: (node: IProblemsTreeNode) => void;
2329
}
2430
@singleton()
2531
export class ProblemsController
@@ -82,7 +88,9 @@ export class ProblemsController
8288
ProblemsPaneView
8389
);
8490
const problemsPanel = builtInPanelProblems;
85-
problemsPanel.renderPane = () => <ProblemsView />;
91+
problemsPanel.renderPane = () => (
92+
<ProblemsView onSelect={this.onSelect} />
93+
);
8694

8795
this.panelService.add(problemsPanel);
8896
this.panelService.setActive(problemsPanel.id);
@@ -96,4 +104,8 @@ export class ProblemsController
96104
name: PROBLEM_MODEL_NAME,
97105
});
98106
}
107+
108+
public onSelect = (node: IProblemsTreeNode) => {
109+
this.emit(ProblemsEvent.onSelect, node);
110+
};
99111
}

src/model/problems.tsx

+11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ export enum MarkerSeverity {
77
Warning = 4,
88
Error = 8,
99
}
10+
11+
export enum ProblemsEvent {
12+
onSelect = 'problems.onSelect',
13+
}
14+
1015
export interface IRelatedInformation {
1116
code: string;
1217
message: string;
@@ -21,11 +26,17 @@ export interface IProblemsItem<T = any> extends ITreeNodeItemProps {
2126
children: IProblemsItem[];
2227
}
2328

29+
export interface IProblemsTreeNode<T = any> extends ITreeNodeItemProps {
30+
value?: IRelatedInformation;
31+
children?: IProblemsTreeNode[];
32+
}
33+
2434
export interface IProblems<T = any> {
2535
id: UniqueId;
2636
name: string;
2737
data: IProblemsItem<T>[];
2838
show?: boolean;
39+
onSelect?: (node: IProblemsTreeNode) => void;
2940
}
3041

3142
export class ProblemsModel<T> implements IProblems<T> {

src/services/problemsService.ts

+11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import {
44
IProblemsItem,
55
ProblemsModel,
66
MarkerSeverity,
7+
IProblemsTreeNode,
8+
ProblemsEvent,
79
} from 'mo/model/problems';
810
import { IStatusBarItem } from 'mo/model/workbench/statusBar';
911
import {
@@ -42,6 +44,11 @@ export interface IProblemsService extends Component<IProblems> {
4244
* Toggle the Problems view between display or hidden
4345
*/
4446
toggleProblems(): void;
47+
/**
48+
* Listen to select a problem tree node
49+
* @param callback
50+
*/
51+
onSelect(callback: (node: IProblemsTreeNode) => void): void;
4552
}
4653

4754
@singleton()
@@ -147,6 +154,10 @@ export class ProblemsService
147154
}
148155
}
149156

157+
public onSelect(callback: (node: IProblemsTreeNode) => void) {
158+
this.subscribe(ProblemsEvent.onSelect, callback);
159+
}
160+
150161
private updateStatusBar<T>(): void {
151162
const { data = [] } = this.state;
152163
const markersData = this.getProblemsMarkers(data);

src/workbench/problems/paneView/index.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const treeLeafClassName = getBEMElement(treeClassName, 'treeLeaf');
1313
const treeLeafSubInfoClassName = getBEMElement(treeLeafClassName, 'subInfo');
1414

1515
function ProblemsPaneView(props: IProblems) {
16-
const { data } = props;
16+
const { data, onSelect } = props;
1717
if (!data?.length) {
1818
return (
1919
<div style={{ margin: '0 18px', userSelect: 'none' }}>
@@ -70,6 +70,7 @@ function ProblemsPaneView(props: IProblems) {
7070
</span>
7171
);
7272
}}
73+
onSelect={onSelect}
7374
/>
7475
</div>
7576
</Scrollable>

0 commit comments

Comments
 (0)