2019-04-09 14:37:58 +02:00
|
|
|
import axios from "axios";
|
2019-04-10 13:45:47 +02:00
|
|
|
import * as vscode from "vscode";
|
|
|
|
|
2019-04-11 14:19:42 +02:00
|
|
|
// const MarkdownIt = require('markdown-it'), md = new MarkdownIt();
|
|
|
|
const marked = require("marked");
|
2019-04-10 13:45:47 +02:00
|
|
|
import { Issue } from "./issue";
|
2019-04-10 08:59:42 +02:00
|
|
|
import { RepositoryInformationManager } from "./configurationProvider";
|
2019-04-09 14:37:58 +02:00
|
|
|
|
2019-04-10 13:45:47 +02:00
|
|
|
export class OpenIssuesProvider implements vscode.TreeDataProvider<Issue> {
|
2019-04-09 14:37:58 +02:00
|
|
|
|
2019-04-09 21:22:33 +02:00
|
|
|
private _onDidChangeTreeData: vscode.EventEmitter<Issue | undefined> = new vscode.EventEmitter<Issue | undefined>();
|
|
|
|
readonly onDidChangeTreeData: vscode.Event<Issue | undefined> = this._onDidChangeTreeData.event;
|
|
|
|
|
2019-04-10 08:59:42 +02:00
|
|
|
issueList: Issue[] = [];
|
2019-04-09 21:22:33 +02:00
|
|
|
|
2019-04-10 08:59:42 +02:00
|
|
|
async refresh() {
|
|
|
|
await this.getChildrenAsync();
|
|
|
|
this._onDidChangeTreeData.fire();
|
2019-04-09 14:37:58 +02:00
|
|
|
}
|
|
|
|
|
2019-04-10 13:45:47 +02:00
|
|
|
constructor() {
|
|
|
|
// Auto update the issuelist after 10 minutes
|
|
|
|
setInterval(() => {
|
|
|
|
this.refresh();
|
|
|
|
}, 10 * 60 * 1000);
|
|
|
|
}
|
2019-04-10 08:59:42 +02:00
|
|
|
|
2019-04-09 14:37:58 +02:00
|
|
|
getTreeItem(element: Issue): vscode.TreeItem | Thenable<vscode.TreeItem> {
|
|
|
|
return element;
|
|
|
|
}
|
2019-04-09 21:22:33 +02:00
|
|
|
|
2019-04-10 13:45:47 +02:00
|
|
|
/**
|
|
|
|
* Returns a list of all open issues;
|
|
|
|
*/
|
2019-04-09 21:22:33 +02:00
|
|
|
async getChildrenAsync() {
|
|
|
|
this.issueList = [];
|
2019-04-10 08:59:42 +02:00
|
|
|
const repoMng = new RepositoryInformationManager();
|
|
|
|
const repoUri = repoMng.repoApiUrl(vscode.workspace.rootPath);
|
|
|
|
const token = repoMng.token(vscode.workspace.rootPath);
|
|
|
|
let stop = false;
|
2019-04-09 21:22:33 +02:00
|
|
|
for (let i = 0; i !== 10; i++) {
|
2019-04-10 08:59:42 +02:00
|
|
|
await axios.get(repoUri + "?page=" + i, { headers: { Authorization: "token " + token } }).then(res => {
|
2019-04-09 21:22:33 +02:00
|
|
|
for (const issue of res.data) {
|
|
|
|
const id = issue["number"];
|
2019-04-10 08:59:42 +02:00
|
|
|
let isAlreadyInList = false;
|
|
|
|
this.issueList.forEach((issueOfList) => {
|
|
|
|
if (id === issueOfList.issueId) {
|
|
|
|
isAlreadyInList = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
if (isAlreadyInList) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
const title = issue["title"];
|
2019-04-11 14:19:42 +02:00
|
|
|
const body = marked(issue["body"]);
|
2019-04-09 21:22:33 +02:00
|
|
|
const state = issue["state"];
|
|
|
|
const assignee = issue["assignee"] === null ? "None" : issue["assignee"]["username"];
|
2019-04-10 08:59:42 +02:00
|
|
|
const tmpIssue = new Issue("#" + id + " - " + title, id, body, state, assignee, "Frontend", vscode.TreeItemCollapsibleState.None);
|
|
|
|
const issueForList = new Issue(tmpIssue.label, tmpIssue.issueId, tmpIssue.body, tmpIssue.issueState,
|
|
|
|
tmpIssue.assignee, tmpIssue.firstlabel, tmpIssue.collapsibleState, {
|
|
|
|
command: 'giteaIssues.openIssue',
|
|
|
|
title: '',
|
|
|
|
arguments: [tmpIssue],
|
|
|
|
});
|
2019-04-09 21:22:33 +02:00
|
|
|
this.issueList.push(issueForList);
|
|
|
|
}
|
2019-04-10 13:45:47 +02:00
|
|
|
}).catch(() => {
|
2019-04-10 08:59:42 +02:00
|
|
|
stop = true;
|
|
|
|
vscode.window.showErrorMessage("Can't fetch issues; HTTP Error!");
|
|
|
|
return;
|
2019-04-09 21:22:33 +02:00
|
|
|
});
|
2019-04-10 08:59:42 +02:00
|
|
|
if (stop) {
|
|
|
|
return;
|
|
|
|
}
|
2019-04-09 21:22:33 +02:00
|
|
|
}
|
|
|
|
}
|
2019-04-09 14:37:58 +02:00
|
|
|
getChildren(element?: Issue): vscode.ProviderResult<any[]> {
|
2019-04-09 21:22:33 +02:00
|
|
|
return this.issueList;
|
2019-04-09 14:37:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2019-04-10 13:45:47 +02:00
|
|
|
export class ClosedIssuesProvider implements vscode.TreeDataProvider<Issue> {
|
|
|
|
|
|
|
|
private _onDidChangeTreeData: vscode.EventEmitter<Issue | undefined> = new vscode.EventEmitter<Issue | undefined>();
|
|
|
|
readonly onDidChangeTreeData: vscode.Event<Issue | undefined> = this._onDidChangeTreeData.event;
|
|
|
|
|
|
|
|
issueList: Issue[] = [];
|
|
|
|
|
|
|
|
async refresh() {
|
|
|
|
await this.getChildrenAsync();
|
|
|
|
this._onDidChangeTreeData.fire();
|
|
|
|
}
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
setInterval(() => {
|
|
|
|
this.refresh();
|
|
|
|
}, 10 * 60 * 1000);
|
2019-04-09 14:37:58 +02:00
|
|
|
}
|
|
|
|
|
2019-04-10 13:45:47 +02:00
|
|
|
getTreeItem(element: Issue): vscode.TreeItem | Thenable<vscode.TreeItem> {
|
|
|
|
return element;
|
|
|
|
}
|
|
|
|
|
|
|
|
async getChildrenAsync() {
|
|
|
|
this.issueList = [];
|
|
|
|
const repoMng = new RepositoryInformationManager();
|
|
|
|
const repoUri = repoMng.repoApiUrl(vscode.workspace.rootPath);
|
|
|
|
const token = repoMng.token(vscode.workspace.rootPath);
|
|
|
|
let stop = false;
|
|
|
|
for (let i = 0; i !== 10; i++) {
|
|
|
|
await axios.get(repoUri + "?state=closed&page=" + i, { headers: { Authorization: "token " + token } }).then(res => {
|
|
|
|
for (const issue of res.data) {
|
|
|
|
const id = issue["number"];
|
|
|
|
let isAlreadyInList = false;
|
|
|
|
this.issueList.forEach((issueOfList) => {
|
|
|
|
if (id === issueOfList.issueId) {
|
|
|
|
isAlreadyInList = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
if (isAlreadyInList) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
const title = issue["title"];
|
2019-04-11 14:19:42 +02:00
|
|
|
const body = marked(issue["body"]);
|
2019-04-10 13:45:47 +02:00
|
|
|
const state = issue["state"];
|
|
|
|
const assignee = issue["assignee"] === null ? "None" : issue["assignee"]["username"];
|
|
|
|
const tmpIssue = new Issue("#" + id + " - " + title, id, body, state, assignee, "Frontend", vscode.TreeItemCollapsibleState.None);
|
|
|
|
const issueForList = new Issue(tmpIssue.label, tmpIssue.issueId, tmpIssue.body, tmpIssue.issueState,
|
|
|
|
tmpIssue.assignee, tmpIssue.firstlabel, tmpIssue.collapsibleState, {
|
|
|
|
command: 'giteaIssues.openIssue',
|
|
|
|
title: '',
|
|
|
|
arguments: [tmpIssue],
|
|
|
|
});
|
|
|
|
this.issueList.push(issueForList);
|
|
|
|
}
|
|
|
|
}).catch(() => {
|
|
|
|
stop = true;
|
|
|
|
vscode.window.showErrorMessage("Can't fetch issues; HTTP Error!");
|
|
|
|
return;
|
|
|
|
});
|
|
|
|
if (stop) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
getChildren(element?: Issue): vscode.ProviderResult<any[]> {
|
|
|
|
return this.issueList;
|
2019-04-09 14:37:58 +02:00
|
|
|
}
|
2019-04-10 13:45:47 +02:00
|
|
|
|
|
|
|
|
2019-04-09 14:37:58 +02:00
|
|
|
}
|