@@ -3,8 +3,7 @@ import * as path from 'path';
33
44import { CodingServer } from '../codingServer' ;
55import { RepoInfo } from '../typings/commonTypes' ;
6- import { MRData } from '../typings/respResult' ;
7- import { PromiseOnly } from 'got' ;
6+ import { IMRDetail , IMRDiffStat , MRData , IMRPathItem } from '../typings/respResult' ;
87
98enum MRType {
109 Open = `open` ,
@@ -19,9 +18,11 @@ enum ItemType {
1918 Node = `node` ,
2019}
2120
22- export class MRTreeDataProvider implements vscode . TreeDataProvider < ListItem > {
23- private _onDidChangeTreeData : vscode . EventEmitter < ListItem | undefined | void > = new vscode . EventEmitter < ListItem | undefined | void > ( ) ;
24- readonly onDidChangeTreeData : vscode . Event < ListItem | undefined | void > = this . _onDidChangeTreeData . event ;
21+ type ITreeNode = string | number | IMRDiffStat | IMRPathItem ;
22+
23+ export class MRTreeDataProvider implements vscode . TreeDataProvider < ListItem < ITreeNode > > {
24+ private _onDidChangeTreeData : vscode . EventEmitter < ListItem < ITreeNode > | undefined | void > = new vscode . EventEmitter < ListItem < ITreeNode > | undefined | void > ( ) ;
25+ readonly onDidChangeTreeData : vscode . Event < ListItem < ITreeNode > | undefined | void > = this . _onDidChangeTreeData . event ;
2526
2627 private _context : vscode . ExtensionContext ;
2728 private _service : CodingServer ;
@@ -32,14 +33,14 @@ export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem> {
3233 }
3334
3435 public refresh ( ) : any {
35- this . _onDidChangeTreeData . fire ( ) ;
36+ this . _onDidChangeTreeData . fire ( undefined ) ;
3637 }
3738
38- getTreeItem ( element : ListItem ) : vscode . TreeItem {
39+ getTreeItem ( element : ListItem < ITreeNode > ) : vscode . TreeItem {
3940 return element ;
4041 }
4142
42- getChildren ( element ?: ListItem ) : Thenable < ListItem [ ] > {
43+ getChildren ( element ?: ListItem < ITreeNode > ) : Thenable < ListItem < ITreeNode > [ ] > {
4344 if ( ! this . _service . loggedIn ) {
4445 vscode . window . showErrorMessage ( `[Auth] expired.` ) ;
4546 return Promise . resolve ( [ ] ) ;
@@ -96,11 +97,11 @@ export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem> {
9697 } else if ( element . contextValue === ItemType . MRItem ) {
9798 return this . _service . getMRDiff ( element . value as number )
9899 . then ( ( { data : { diffStat } } ) => {
99- return [
100- new ListItem ( `Description` , `mr-desc` , vscode . TreeItemCollapsibleState . None ) ,
101- new NodeItem ( `node` , `node` , vscode . TreeItemCollapsibleState . Expanded ) ,
102- ] ;
100+ return ( element as MRItem ) . getChildren ( diffStat ) ;
103101 } ) ;
102+ } else if ( element . contextValue === ItemType . Node ) {
103+ ( element as FileNode ) . makeTree ( ) ;
104+ return ( element as FileNode ) . getChildren ( ) ;
104105 }
105106
106107 return Promise . resolve ( [ ] ) ;
@@ -114,51 +115,77 @@ export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem> {
114115 }
115116}
116117
117- export class ListItem extends vscode . TreeItem {
118+ export class ListItem < T > extends vscode . TreeItem {
118119 contextValue = ItemType . ListItem ;
119- private readonly _value : string | number ;
120120
121121 constructor (
122122 public readonly label : string ,
123- public readonly val : number | string ,
123+ public readonly value : T ,
124124 public readonly collapsibleState : vscode . TreeItemCollapsibleState ,
125125 public readonly command ?: vscode . Command ,
126126 ) {
127127 super ( label , collapsibleState ) ;
128-
129- this . _value = val ;
130128 }
131129
132- get value ( ) {
133- return this . _value ;
130+ async getChildren ( ... args : any [ ] ) : Promise < any [ ] > {
131+ return [ ] ;
134132 }
135133}
136134
137- export class CategoryItem extends ListItem {
135+ export class CategoryItem extends ListItem < string > {
138136 contextValue = ItemType . CategoryItem ;
139137}
140138
141- export class MRItem extends ListItem {
139+ export class MRItem extends ListItem < string | number > {
142140 contextValue = ItemType . MRItem ;
143141
144142 iconPath = {
145143 light : path . join ( __filename , '../../../src/assets/star.light.svg' ) ,
146144 dark : path . join ( __filename , '../../../src/assets/star.dark.svg' ) ,
147145 } ;
146+
147+ async getChildren ( diffStat : IMRDiffStat ) : Promise < ListItem < string | number | IFileNode > [ ] > {
148+ const files = diffStat . paths . map ( p => {
149+ const pathArr = p . path . split ( `/` ) ;
150+ const name = pathArr [ 0 ] ;
151+ const childPath = pathArr . slice ( 1 ) ;
152+ const expandStatus = childPath . length > 0 ? vscode . TreeItemCollapsibleState . Expanded : vscode . TreeItemCollapsibleState . None ;
153+ return new FileNode ( name , { ...p , name, childPath } , expandStatus ) ;
154+ } ) ;
155+
156+ return [
157+ new ListItem ( `Description` , `mr-desc` , vscode . TreeItemCollapsibleState . None ) ,
158+ ...files ,
159+ ] ;
160+ }
148161}
149162
150- export class NodeItem extends ListItem {
163+ type IFileNode = IMRPathItem ;
164+
165+ export class FileNode extends ListItem < IFileNode > {
151166 contextValue = ItemType . Node ;
167+ children : FileNode [ ] = [ ] ;
168+
169+ constructor (
170+ public readonly label : string ,
171+ public readonly value : IFileNode ,
172+ public readonly collapsibleState : vscode . TreeItemCollapsibleState ,
173+ public readonly command ?: vscode . Command ,
174+ ) {
175+ super ( label , value , collapsibleState , command ) ;
176+ }
152177
153- children = [
154- new ListItem ( `children-1` , 1 , vscode . TreeItemCollapsibleState . None ) ,
155- ] ;
178+ public makeTree ( ) {
179+ if ( this . collapsibleState === vscode . TreeItemCollapsibleState . None ) {
180+ return [ ] ;
181+ }
182+ }
156183
157- async getChildren ( ) : Promise < ListItem [ ] > {
184+ async getChildren ( ) {
158185 return this . children ;
159186 }
160187
161- getTreeItem ( ) : vscode . TreeItem {
188+ getTreeItem ( ) : ListItem < IFileNode | string > {
162189 return this ;
163190 }
164191}
0 commit comments