@@ -3,8 +3,7 @@ import * as path from 'path';
3
3
4
4
import { CodingServer } from '../codingServer' ;
5
5
import { RepoInfo } from '../typings/commonTypes' ;
6
- import { MRData } from '../typings/respResult' ;
7
- import { PromiseOnly } from 'got' ;
6
+ import { IMRDetail , IMRDiffStat , MRData , IMRPathItem } from '../typings/respResult' ;
8
7
9
8
enum MRType {
10
9
Open = `open` ,
@@ -19,9 +18,11 @@ enum ItemType {
19
18
Node = `node` ,
20
19
}
21
20
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 ;
25
26
26
27
private _context : vscode . ExtensionContext ;
27
28
private _service : CodingServer ;
@@ -32,14 +33,14 @@ export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem> {
32
33
}
33
34
34
35
public refresh ( ) : any {
35
- this . _onDidChangeTreeData . fire ( ) ;
36
+ this . _onDidChangeTreeData . fire ( undefined ) ;
36
37
}
37
38
38
- getTreeItem ( element : ListItem ) : vscode . TreeItem {
39
+ getTreeItem ( element : ListItem < ITreeNode > ) : vscode . TreeItem {
39
40
return element ;
40
41
}
41
42
42
- getChildren ( element ?: ListItem ) : Thenable < ListItem [ ] > {
43
+ getChildren ( element ?: ListItem < ITreeNode > ) : Thenable < ListItem < ITreeNode > [ ] > {
43
44
if ( ! this . _service . loggedIn ) {
44
45
vscode . window . showErrorMessage ( `[Auth] expired.` ) ;
45
46
return Promise . resolve ( [ ] ) ;
@@ -96,11 +97,11 @@ export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem> {
96
97
} else if ( element . contextValue === ItemType . MRItem ) {
97
98
return this . _service . getMRDiff ( element . value as number )
98
99
. 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 ) ;
103
101
} ) ;
102
+ } else if ( element . contextValue === ItemType . Node ) {
103
+ ( element as FileNode ) . makeTree ( ) ;
104
+ return ( element as FileNode ) . getChildren ( ) ;
104
105
}
105
106
106
107
return Promise . resolve ( [ ] ) ;
@@ -114,51 +115,77 @@ export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem> {
114
115
}
115
116
}
116
117
117
- export class ListItem extends vscode . TreeItem {
118
+ export class ListItem < T > extends vscode . TreeItem {
118
119
contextValue = ItemType . ListItem ;
119
- private readonly _value : string | number ;
120
120
121
121
constructor (
122
122
public readonly label : string ,
123
- public readonly val : number | string ,
123
+ public readonly value : T ,
124
124
public readonly collapsibleState : vscode . TreeItemCollapsibleState ,
125
125
public readonly command ?: vscode . Command ,
126
126
) {
127
127
super ( label , collapsibleState ) ;
128
-
129
- this . _value = val ;
130
128
}
131
129
132
- get value ( ) {
133
- return this . _value ;
130
+ async getChildren ( ... args : any [ ] ) : Promise < any [ ] > {
131
+ return [ ] ;
134
132
}
135
133
}
136
134
137
- export class CategoryItem extends ListItem {
135
+ export class CategoryItem extends ListItem < string > {
138
136
contextValue = ItemType . CategoryItem ;
139
137
}
140
138
141
- export class MRItem extends ListItem {
139
+ export class MRItem extends ListItem < string | number > {
142
140
contextValue = ItemType . MRItem ;
143
141
144
142
iconPath = {
145
143
light : path . join ( __filename , '../../../src/assets/star.light.svg' ) ,
146
144
dark : path . join ( __filename , '../../../src/assets/star.dark.svg' ) ,
147
145
} ;
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
+ }
148
161
}
149
162
150
- export class NodeItem extends ListItem {
163
+ type IFileNode = IMRPathItem ;
164
+
165
+ export class FileNode extends ListItem < IFileNode > {
151
166
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
+ }
152
177
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
+ }
156
183
157
- async getChildren ( ) : Promise < ListItem [ ] > {
184
+ async getChildren ( ) {
158
185
return this . children ;
159
186
}
160
187
161
- getTreeItem ( ) : vscode . TreeItem {
188
+ getTreeItem ( ) : ListItem < IFileNode | string > {
162
189
return this ;
163
190
}
164
191
}
0 commit comments