diff --git a/src/controller/__tests__/problems.test.ts b/src/controller/__tests__/problems.test.ts index be0b38f77..2d0c7fd55 100644 --- a/src/controller/__tests__/problems.test.ts +++ b/src/controller/__tests__/problems.test.ts @@ -1,4 +1,4 @@ -import { Float } from 'mo/model'; +import { Float, IProblemsTreeNode } from 'mo/model'; import { MonacoService } from 'mo/monaco/monacoService'; import { PanelService, @@ -10,6 +10,7 @@ import { constants, modules } from 'mo/services/builtinService/const'; import 'reflect-metadata'; import { container } from 'tsyringe'; import { ProblemsController } from '../problems'; +import { expectFnCalled } from '@test/utils'; const problemsController = container.resolve(ProblemsController); const panelService = container.resolve(PanelService); @@ -88,4 +89,11 @@ describe('The problems controller', () => { ); monacoService.commandService.executeCommand = original; }); + + test('Should support to execute onSelect', () => { + expectFnCalled((fn) => { + problemsService.onSelect(fn); + problemsController.onSelect({} as IProblemsTreeNode); + }); + }); }); diff --git a/src/controller/problems.tsx b/src/controller/problems.tsx index 446db7c19..d53b35137 100644 --- a/src/controller/problems.tsx +++ b/src/controller/problems.tsx @@ -1,6 +1,11 @@ import 'reflect-metadata'; import React from 'react'; -import { Float, IStatusBarItem } from 'mo/model'; +import { + Float, + IStatusBarItem, + ProblemsEvent, + IProblemsTreeNode, +} from 'mo/model'; import { Controller } from 'mo/react/controller'; import { IPanelService, @@ -20,6 +25,7 @@ import { ProblemsPaneView, ProblemsStatusBarView } from 'mo/workbench/problems'; import { connect } from 'mo/react'; export interface IProblemsController extends Partial { onClick?: (e: React.MouseEvent, item: IStatusBarItem) => void; + onSelect?: (node: IProblemsTreeNode) => void; } @singleton() export class ProblemsController @@ -82,7 +88,9 @@ export class ProblemsController ProblemsPaneView ); const problemsPanel = builtInPanelProblems; - problemsPanel.renderPane = () => ; + problemsPanel.renderPane = () => ( + + ); this.panelService.add(problemsPanel); this.panelService.setActive(problemsPanel.id); @@ -96,4 +104,8 @@ export class ProblemsController name: PROBLEM_MODEL_NAME, }); } + + public onSelect = (node: IProblemsTreeNode) => { + this.emit(ProblemsEvent.onSelect, node); + }; } diff --git a/src/model/problems.tsx b/src/model/problems.tsx index 4c8f907d3..ab5a6deb0 100644 --- a/src/model/problems.tsx +++ b/src/model/problems.tsx @@ -7,6 +7,11 @@ export enum MarkerSeverity { Warning = 4, Error = 8, } + +export enum ProblemsEvent { + onSelect = 'problems.onSelect', +} + export interface IRelatedInformation { code: string; message: string; @@ -21,11 +26,17 @@ export interface IProblemsItem extends ITreeNodeItemProps { children: IProblemsItem[]; } +export interface IProblemsTreeNode extends ITreeNodeItemProps { + value?: IRelatedInformation; + children?: IProblemsTreeNode[]; +} + export interface IProblems { id: UniqueId; name: string; data: IProblemsItem[]; show?: boolean; + onSelect?: (node: IProblemsTreeNode) => void; } export class ProblemsModel implements IProblems { diff --git a/src/services/problemsService.ts b/src/services/problemsService.ts index 7a96b0d68..2ad2d8d57 100644 --- a/src/services/problemsService.ts +++ b/src/services/problemsService.ts @@ -4,6 +4,8 @@ import { IProblemsItem, ProblemsModel, MarkerSeverity, + IProblemsTreeNode, + ProblemsEvent, } from 'mo/model/problems'; import { IStatusBarItem } from 'mo/model/workbench/statusBar'; import { @@ -42,6 +44,11 @@ export interface IProblemsService extends Component { * Toggle the Problems view between display or hidden */ toggleProblems(): void; + /** + * Listen to select a problem tree node + * @param callback + */ + onSelect(callback: (node: IProblemsTreeNode) => void): void; } @singleton() @@ -147,6 +154,10 @@ export class ProblemsService } } + public onSelect(callback: (node: IProblemsTreeNode) => void) { + this.subscribe(ProblemsEvent.onSelect, callback); + } + private updateStatusBar(): void { const { data = [] } = this.state; const markersData = this.getProblemsMarkers(data); diff --git a/src/workbench/problems/paneView/index.tsx b/src/workbench/problems/paneView/index.tsx index e0bf9eb07..8c24a04d0 100644 --- a/src/workbench/problems/paneView/index.tsx +++ b/src/workbench/problems/paneView/index.tsx @@ -13,7 +13,7 @@ const treeLeafClassName = getBEMElement(treeClassName, 'treeLeaf'); const treeLeafSubInfoClassName = getBEMElement(treeLeafClassName, 'subInfo'); function ProblemsPaneView(props: IProblems) { - const { data } = props; + const { data, onSelect } = props; if (!data?.length) { return (
@@ -70,6 +70,7 @@ function ProblemsPaneView(props: IProblems) { ); }} + onSelect={onSelect} />