Skip to content

Commit dabee6a

Browse files
committed
WIP(mr): desc & 1st level dirs.
1 parent b1bfff8 commit dabee6a

File tree

3 files changed

+56
-29
lines changed

3 files changed

+56
-29
lines changed

src/extension.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,13 @@ export async function activate(context: vscode.ExtensionContext) {
3535

3636
const mrDataProvider = new MRTreeDataProvider(context, codingSrv);
3737
const releaseDataProvider = new ReleaseTreeDataProvider(context);
38-
const mrTree = vscode.window.createTreeView(`mrTreeView`, { treeDataProvider: mrDataProvider });
38+
vscode.window.createTreeView(`mrTreeView`, { treeDataProvider: mrDataProvider });
3939
vscode.window.createTreeView(`releaseTreeView`, { treeDataProvider: releaseDataProvider });
4040

4141
context.subscriptions.push(vscode.window.registerUriHandler(uriHandler));
4242
context.subscriptions.push(
4343
vscode.commands.registerCommand('codingPlugin.show', () => {
4444
Panel.createOrShow(context);
45-
mrTree.reveal({} as ListItem);
4645
}),
4746
);
4847
context.subscriptions.push(

src/tree/mr-tree.ts

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ import * as path from 'path';
33

44
import { CodingServer } from '../codingServer';
55
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';
87

98
enum 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
}

src/typings/respResult.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export interface IMRPathItem {
5454
deletions: number;
5555
name: string;
5656
path: string;
57+
childPath: string[];
5758
size: number;
5859
mode: number;
5960
objectId: string;

0 commit comments

Comments
 (0)