Skip to content

Commit d1992f9

Browse files
committed
feat(mr): categories.
1 parent bb25d4f commit d1992f9

File tree

4 files changed

+127
-58
lines changed

4 files changed

+127
-58
lines changed

package.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@
4545
"light": "src/assets/refresh.light.svg",
4646
"dark": "src/assets/refresh.dark.svg"
4747
}
48+
},
49+
{
50+
"command": "codingPlugin.switchRepo",
51+
"title": "Switch repo",
52+
"category": "Coding plugin"
4853
}
4954
],
5055
"menus": {
@@ -72,7 +77,7 @@
7277
"activitybar": [
7378
{
7479
"id": "treeview-sample",
75-
"title": "Treeview Sample",
80+
"title": "CODING Merge Requests",
7681
"icon": "src/assets/coding.svg"
7782
}
7883
]
@@ -81,7 +86,7 @@
8186
"treeview-sample": [
8287
{
8388
"id": "treeViewSample",
84-
"name": "Treeview Sample",
89+
"name": "CODING Merge Requests",
8590
"icon": "src/assets/coding.svg",
8691
"contextualTitle": "List"
8792
}

src/codingServer.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ export class CodingServer {
9999
}
100100
}
101101

102-
103102
public async startOAuth(team: string, scopes: string) {
104103
const state = nanoid();
105104
const { name, publisher } = require('../package.json');
@@ -210,27 +209,26 @@ export class CodingServer {
210209
return parseCloneUrl(url || ``);
211210
}
212211

213-
public async getMRList(repo?: string) {
212+
public async getMRList(repo?: string, status?: string): Promise<CodingResponse> {
214213
try {
215214
const repoInfo = this._context.workspaceState.get(`repoInfo`) as RepoInfo;
216215
if (!repoInfo?.team) {
217216
throw new Error(`team not exist`);
218217
}
219218

220-
const result = await got.get(`https://${repoInfo.team}.coding.net/api/user/${repoInfo.team}/project/${repoInfo.project}/depot/${repo || repoInfo.repo}/git/merges/query`, {
219+
const result: CodingResponse = await got.get(`https://${repoInfo.team}.coding.net/api/user/${repoInfo.team}/project/${repoInfo.project}/depot/${repo || repoInfo.repo}/git/merges/query`, {
221220
searchParams: {
222-
status: `all`,
221+
status,
223222
sort: `action_at`,
224223
page: 1,
225-
PageSize: 20,
224+
PageSize: 9999,
226225
sortDirection: `DESC`,
227226
access_token: this._session?.accessToken,
228227
},
229228
}).json();
230-
231229
return result;
232230
} catch (err) {
233-
return err;
231+
return Promise.reject(err);
234232
}
235233
}
236234

src/extension.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export async function activate(context: vscode.ExtensionContext) {
3434
}),
3535
);
3636
context.subscriptions.push(
37-
vscode.commands.registerCommand('codingPlugin.openConvertPage', k => {
37+
vscode.commands.registerCommand('codingPlugin.showDetail', k => {
3838
Panel.createOrShow(context);
3939
Panel.currentPanel?.broadcast(`UPDATE_CURRENCY`, k);
4040
}),
@@ -64,6 +64,22 @@ export async function activate(context: vscode.ExtensionContext) {
6464
treeDataProvider.refresh();
6565
}),
6666
);
67+
context.subscriptions.push(
68+
vscode.commands.registerCommand('codingPlugin.switchRepo', async () => {
69+
vscode.window.showQuickPick([
70+
{
71+
label: `1`,
72+
description: `1`
73+
},
74+
{
75+
label: `2`,
76+
description: `2`
77+
},
78+
]).then((selection) => {
79+
console.log(selection)
80+
})
81+
}),
82+
);
6783

6884
if (vscode.window.registerWebviewPanelSerializer) {
6985
// Make sure we register a serializer in activation event
@@ -75,4 +91,4 @@ export async function activate(context: vscode.ExtensionContext) {
7591
}
7692
}
7793

78-
export function deactivate() {}
94+
export function deactivate() { }

src/tree.ts

Lines changed: 97 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,28 @@ import { CodingServer } from './codingServer';
55
import { RepoInfo } from './typings/commonTypes';
66
import { MRData } from './typings/respResult';
77

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+
825
export class ListProvider implements vscode.TreeDataProvider<ListItem> {
926
private _onDidChangeTreeData: vscode.EventEmitter<ListItem | undefined | void> = new vscode.EventEmitter<ListItem | undefined | void>();
1027
readonly onDidChangeTreeData: vscode.Event<ListItem | undefined | void> = this._onDidChangeTreeData.event;
1128

12-
private _context : vscode.ExtensionContext;
29+
private _context: vscode.ExtensionContext;
1330
private _service: CodingServer;
1431

1532
constructor(context: vscode.ExtensionContext, service: CodingServer) {
@@ -26,76 +43,109 @@ export class ListProvider implements vscode.TreeDataProvider<ListItem> {
2643
}
2744

2845
getChildren(element?: ListItem): Thenable<ListItem[]> {
29-
if (element) {
30-
return Promise.resolve([]);
31-
}
32-
3346
if (!this._service.loggedIn) {
3447
vscode.window.showErrorMessage(`[Auth] expired.`);
3548
return Promise.resolve([]);
3649
}
3750

3851
const repoInfo = this._context.workspaceState.get(`repoInfo`) as RepoInfo;
3952
if (!repoInfo?.team) {
40-
throw new Error(`team not exist`);
53+
throw new Error(`team not exist.`);
4154
}
4255

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([]);
4960
}
5061

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+
}
56107

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+
}
63110

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+
]);
80115
}
81116
}
82117

83118
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;
90121

91122
constructor(
92123
public readonly label: string,
93-
public readonly value: number,
124+
public readonly val: number | string,
94125
public readonly collapsibleState: vscode.TreeItemCollapsibleState,
95126
public readonly command?: vscode.Command,
96127
) {
97128
super(label, collapsibleState);
98129

99-
this.value = value;
130+
this._value = val;
100131
}
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+
};
101151
}

0 commit comments

Comments
 (0)