@@ -5,11 +5,28 @@ import { CodingServer } from './codingServer';
5
5
import { RepoInfo } from './typings/commonTypes' ;
6
6
import { MRData } from './typings/respResult' ;
7
7
8
+ enum MRType {
9
+ Open = `open` ,
10
+ Closed = `close` ,
11
+ All = `all` ,
12
+ }
13
+
14
+ enum FolderType {
15
+ MR = `mr` ,
16
+ Release = `release` ,
17
+ }
18
+
19
+ enum ItemType {
20
+ ListItem = `listItem` ,
21
+ FolderITem = `folderItem` ,
22
+ CategoryItem = `categoryItem` ,
23
+ }
24
+
8
25
export class ListProvider implements vscode . TreeDataProvider < ListItem > {
9
26
private _onDidChangeTreeData : vscode . EventEmitter < ListItem | undefined | void > = new vscode . EventEmitter < ListItem | undefined | void > ( ) ;
10
27
readonly onDidChangeTreeData : vscode . Event < ListItem | undefined | void > = this . _onDidChangeTreeData . event ;
11
28
12
- private _context : vscode . ExtensionContext ;
29
+ private _context : vscode . ExtensionContext ;
13
30
private _service : CodingServer ;
14
31
15
32
constructor ( context : vscode . ExtensionContext , service : CodingServer ) {
@@ -26,76 +43,109 @@ export class ListProvider implements vscode.TreeDataProvider<ListItem> {
26
43
}
27
44
28
45
getChildren ( element ?: ListItem ) : Thenable < ListItem [ ] > {
29
- if ( element ) {
30
- return Promise . resolve ( [ ] ) ;
31
- }
32
-
33
46
if ( ! this . _service . loggedIn ) {
34
47
vscode . window . showErrorMessage ( `[Auth] expired.` ) ;
35
48
return Promise . resolve ( [ ] ) ;
36
49
}
37
50
38
51
const repoInfo = this . _context . workspaceState . get ( `repoInfo` ) as RepoInfo ;
39
52
if ( ! repoInfo ?. team ) {
40
- throw new Error ( `team not exist` ) ;
53
+ throw new Error ( `team not exist. ` ) ;
41
54
}
42
55
43
- return this . _service . getMRList ( )
44
- . then ( resp => {
45
- if ( resp . code ) {
46
- const msg = Object . values ( resp . msg as object ) [ 0 ] ;
47
- vscode . window . showErrorMessage ( `[MR] list: ${ msg } ` ) ;
48
- return [ ] ;
56
+ if ( element ) {
57
+ if ( element . contextValue === ItemType . FolderITem ) {
58
+ if ( element . value === FolderType . Release ) {
59
+ return Promise . resolve ( [ ] ) ;
49
60
}
50
61
51
- const { data : { list } } = resp ;
52
- if ( ! list . length ) {
53
- vscode . commands . executeCommand ( 'setContext' , 'noMRResult' , true ) ;
54
- return [ ] ;
55
- }
62
+ return Promise . resolve ( [
63
+ new CategoryItem ( MRType . Open . toUpperCase ( ) , MRType . Open , vscode . TreeItemCollapsibleState . Collapsed ) ,
64
+ new CategoryItem ( MRType . Closed . toUpperCase ( ) , MRType . Closed , vscode . TreeItemCollapsibleState . Collapsed ) ,
65
+ new CategoryItem ( MRType . All . toUpperCase ( ) , MRType . All , vscode . TreeItemCollapsibleState . Collapsed ) ,
66
+ ] ) ;
67
+ }
68
+
69
+ if ( element . contextValue === ItemType . CategoryItem ) {
70
+ return this . _service . getMRList ( `` , element . value as MRType )
71
+ . then ( resp => {
72
+ if ( resp . code ) {
73
+ const msg = Object . values ( resp . msg || { } as object ) [ 0 ] ;
74
+ vscode . window . showErrorMessage ( `[MR] list: ${ msg } ` ) ;
75
+ return [ ] ;
76
+ }
77
+
78
+ const { data : { list } } = resp ;
79
+ if ( ! list . length ) {
80
+ return [
81
+ new ListItem ( `0 merge requests in this category` , `noData` , vscode . TreeItemCollapsibleState . None ) ,
82
+ ] ;
83
+ }
84
+
85
+ const repoInfo = this . _context . workspaceState . get ( `repoInfo` ) as RepoInfo ;
86
+ if ( ! repoInfo ?. team ) {
87
+ throw new Error ( `team not exist` ) ;
88
+ }
89
+
90
+ return list . map ( ( i : MRData ) => {
91
+ return new MRItem ( i . title , i . iid , vscode . TreeItemCollapsibleState . None , {
92
+ command : 'codingPlugin.showDetail' ,
93
+ title : `${ i . iid } ${ i . title } ` ,
94
+ arguments : [ {
95
+ ...repoInfo ,
96
+ iid : i . iid ,
97
+ type : `mr` ,
98
+ accessToken : this . _service . session ?. accessToken ,
99
+ } ] ,
100
+ } ) ;
101
+ } ) ;
102
+ } )
103
+ . catch ( ( ) => {
104
+ return [ ] ;
105
+ } ) ;
106
+ }
56
107
57
- vscode . commands . executeCommand ( 'setContext' , 'noMRResult' , false ) ;
58
-
59
- const repoInfo = this . _context . workspaceState . get ( `repoInfo` ) as RepoInfo ;
60
- if ( ! repoInfo ?. team ) {
61
- throw new Error ( `team not exist` ) ;
62
- }
108
+ return Promise . resolve ( [ ] ) ;
109
+ }
63
110
64
- return list . map ( ( i : MRData ) => {
65
- return new ListItem ( i . title , i . iid , vscode . TreeItemCollapsibleState . None , {
66
- command : 'codingPlugin.openConvertPage' ,
67
- title : `${ i . iid } ${ i . title } ` ,
68
- arguments : [ {
69
- ...repoInfo ,
70
- iid : i . iid ,
71
- type : `mr` ,
72
- accessToken : this . _service . session ?. accessToken ,
73
- } ] ,
74
- } ) ;
75
- } ) ;
76
- } )
77
- . catch ( ( ) => {
78
- return Promise . resolve ( [ ] ) ;
79
- } ) ;
111
+ return Promise . all ( [
112
+ new FolderItem ( FolderType . MR . toUpperCase ( ) , FolderType . MR , vscode . TreeItemCollapsibleState . Collapsed ) ,
113
+ new FolderItem ( FolderType . Release . toUpperCase ( ) , FolderType . Release , vscode . TreeItemCollapsibleState . Collapsed ) ,
114
+ ] ) ;
80
115
}
81
116
}
82
117
83
118
export class ListItem extends vscode . TreeItem {
84
- contextValue = `listItem` ;
85
-
86
- iconPath = {
87
- light : path . join ( __filename , '../../src/assets/star.light.svg' ) ,
88
- dark : path . join ( __filename , '../../src/assets/star.dark.svg' ) ,
89
- } ;
119
+ contextValue = ItemType . ListItem ;
120
+ private readonly _value : string | number ;
90
121
91
122
constructor (
92
123
public readonly label : string ,
93
- public readonly value : number ,
124
+ public readonly val : number | string ,
94
125
public readonly collapsibleState : vscode . TreeItemCollapsibleState ,
95
126
public readonly command ?: vscode . Command ,
96
127
) {
97
128
super ( label , collapsibleState ) ;
98
129
99
- this . value = value ;
130
+ this . _value = val ;
100
131
}
132
+
133
+ get value ( ) {
134
+ return this . _value ;
135
+ }
136
+ }
137
+
138
+ export class FolderItem extends ListItem {
139
+ contextValue = ItemType . FolderITem ;
140
+ }
141
+
142
+ export class CategoryItem extends ListItem {
143
+ contextValue = ItemType . CategoryItem ;
144
+ }
145
+
146
+ export class MRItem extends ListItem {
147
+ iconPath = {
148
+ light : path . join ( __filename , '../../src/assets/star.light.svg' ) ,
149
+ dark : path . join ( __filename , '../../src/assets/star.dark.svg' ) ,
150
+ } ;
101
151
}
0 commit comments