mirror of
https://github.com/coder/code-server.git
synced 2024-11-24 05:29:31 +03:00
Add recents section
This commit is contained in:
parent
88cab27165
commit
c146457de4
@ -30,6 +30,16 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-box">
|
||||
<div class="header">
|
||||
<h2 class="main">Recent</h2>
|
||||
<div class="sub">Choose a recent directory or workspace to launch below.</div>
|
||||
</div>
|
||||
<div class="content">
|
||||
{{APP_LIST:RECENT_PROJECTS}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-box">
|
||||
<div class="header">
|
||||
<h2 class="main">Editors</h2>
|
||||
|
@ -34,6 +34,7 @@ export interface SessionResponse {
|
||||
|
||||
export interface RecentResponse {
|
||||
readonly paths: string[]
|
||||
readonly workspaces: string[]
|
||||
}
|
||||
|
||||
export interface RunningResponse {
|
||||
|
@ -28,7 +28,7 @@ interface ServerSession {
|
||||
}
|
||||
|
||||
interface VsRecents {
|
||||
[key: string]: (string | object)[]
|
||||
[key: string]: (string | { configURIPath: string })[]
|
||||
}
|
||||
|
||||
type VsSettings = [string, string][]
|
||||
@ -322,28 +322,34 @@ export class ApiHttpProvider extends HttpProvider {
|
||||
throw new Error("settings appear malformed")
|
||||
}
|
||||
|
||||
const paths: { [key: string]: Promise<string> } = {}
|
||||
const pathPromises: { [key: string]: Promise<string> } = {}
|
||||
const workspacePromises: { [key: string]: Promise<string> } = {}
|
||||
Object.values(JSON.parse(setting[1]) as VsRecents).forEach((recents) => {
|
||||
recents
|
||||
.filter((recent) => typeof recent === "string")
|
||||
.forEach((recent) => {
|
||||
try {
|
||||
const pathname = url.parse(recent as string).pathname
|
||||
if (pathname && !paths[pathname]) {
|
||||
paths[pathname] = new Promise<string>((resolve) => {
|
||||
fs.stat(pathname)
|
||||
.then(() => resolve(pathname))
|
||||
.catch(() => resolve())
|
||||
})
|
||||
}
|
||||
} catch (error) {
|
||||
logger.debug("invalid path", field("path", recent))
|
||||
recents.forEach((recent) => {
|
||||
try {
|
||||
const target = typeof recent === "string" ? pathPromises : workspacePromises
|
||||
const pathname = url.parse(typeof recent === "string" ? recent : recent.configURIPath).pathname
|
||||
if (pathname && !target[pathname]) {
|
||||
target[pathname] = new Promise<string>((resolve) => {
|
||||
fs.stat(pathname)
|
||||
.then(() => resolve(pathname))
|
||||
.catch(() => resolve())
|
||||
})
|
||||
}
|
||||
})
|
||||
} catch (error) {
|
||||
logger.debug("invalid path", field("path", recent))
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
const [paths, workspaces] = await Promise.all([
|
||||
Promise.all(Object.values(pathPromises)),
|
||||
Promise.all(Object.values(workspacePromises)),
|
||||
])
|
||||
|
||||
return {
|
||||
paths: await Promise.all(Object.values(paths)),
|
||||
paths: paths.filter((p) => !!p),
|
||||
workspaces: workspaces.filter((p) => !!p),
|
||||
}
|
||||
} catch (error) {
|
||||
if (error.code !== "ENOENT") {
|
||||
@ -351,7 +357,7 @@ export class ApiHttpProvider extends HttpProvider {
|
||||
}
|
||||
}
|
||||
|
||||
return { paths: [] }
|
||||
return { paths: [], workspaces: [] }
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,6 +1,6 @@
|
||||
import * as http from "http"
|
||||
import * as querystring from "querystring"
|
||||
import { Application } from "../../common/api"
|
||||
import { Application, RecentResponse } from "../../common/api"
|
||||
import { HttpCode, HttpError } from "../../common/http"
|
||||
import { HttpProvider, HttpProviderOptions, HttpResponse, Route } from "../http"
|
||||
import { ApiHttpProvider } from "./api"
|
||||
@ -86,6 +86,7 @@ export class MainHttpProvider extends HttpProvider {
|
||||
response.content = response.content
|
||||
.replace(/{{UPDATE:NAME}}/, await this.getUpdate())
|
||||
.replace(/{{APP_LIST:RUNNING}}/, this.getAppRows(running.applications))
|
||||
.replace(/{{APP_LIST:RECENT_PROJECTS}}/, this.getRecentProjectRows(await this.api.recent()))
|
||||
.replace(
|
||||
/{{APP_LIST:EDITORS}}/,
|
||||
this.getAppRows(apps.filter((app) => app.categories && app.categories.includes("Editor"))),
|
||||
@ -107,6 +108,21 @@ export class MainHttpProvider extends HttpProvider {
|
||||
return undefined
|
||||
}
|
||||
|
||||
private getRecentProjectRows(recents: RecentResponse): string {
|
||||
return recents.paths.length > 0 || recents.workspaces.length > 0
|
||||
? recents.paths.map((recent) => this.getRecentProjectRow(recent)).join("\n") +
|
||||
recents.workspaces.map((recent) => this.getRecentProjectRow(recent, true)).join("\n")
|
||||
: `<div class="none">No recent directories or workspaces.</div>`
|
||||
}
|
||||
|
||||
private getRecentProjectRow(recent: string, workspace?: boolean): string {
|
||||
return `<div class="block-row">
|
||||
<a class="item -row -link" href="./vscode/?${workspace ? "workspace" : "folder"}=${recent}">
|
||||
<div class="name">${recent}${workspace ? " (workspace)" : ""}</div>
|
||||
</a>
|
||||
</div>`
|
||||
}
|
||||
|
||||
private getAppRows(apps: ReadonlyArray<Application>): string {
|
||||
return apps.length > 0
|
||||
? apps.map((app) => this.getAppRow(app)).join("\n")
|
||||
|
Loading…
Reference in New Issue
Block a user