✨ feat(vscode): 选工单也列「进行中」列里已经有 PR 的工单(开发完了没走自动审查的),弹框按「审查」「进行中」分组,进审查、刷新、重开窗口按同一条列规则判断
This commit is contained in:
1 parent
f2b17e5389
commit
489d0ef41f
7 files changed
+159
-68
No files matched your search
@@ -5,13 +5,13 @@ import type { Issue } from '../../gitea/types'
|
||||
import type { FileNode, FileTreeProvider } from '../explorer/fileTree'
|
||||
import type { FileCount } from './pickList'
|
||||
import * as path from 'node:path'
|
||||
import { commands, Uri, window, workspace } from 'vscode'
|
||||
import { commands, QuickPickItemKind, Uri, window, workspace } from 'vscode'
|
||||
import { logger } from '../../logging/logger'
|
||||
import { ChangeDecorations } from './changeDecorations'
|
||||
import { buildChangedTree, changeOf } from './changedFiles'
|
||||
import { countingFiles, pickEntries, pickItemText, withFileCount } from './pickList'
|
||||
import { reviewableIssue, reviewablePullRequest, reviewDescription, reviewMessage } from './reviewRules'
|
||||
import { loadIssue, loadPullRequest, loadPullRequestFiles, requireRepo, reviewColumnIssues } from './reviewSource'
|
||||
import { countingFiles, pickEntries, pickItemText, pickRows, withFileCount } from './pickList'
|
||||
import { columnLabel, REVIEW_COLUMNS_TEXT, reviewableIssue, reviewablePullRequest, reviewDescription, reviewMessage } from './reviewRules'
|
||||
import { loadIssue, loadPullRequest, loadPullRequestFiles, requireRepo, reviewCandidateIssues } from './reviewSource'
|
||||
import { localWorktree, prepareWorktree } from './reviewWorktree'
|
||||
|
||||
/** workspaceState:正在审查的工单号,重开窗口接着审查。 */
|
||||
@@ -33,8 +33,9 @@ interface Loaded {
|
||||
worktree: string
|
||||
}
|
||||
|
||||
interface IssuePick extends QuickPickItem {
|
||||
issue: Issue
|
||||
/** 弹框里的一行:工单的一项带着工单,分组标题(列名)没有。 */
|
||||
interface PickerItem extends QuickPickItem {
|
||||
issue?: Issue
|
||||
}
|
||||
|
||||
function errorText(err: unknown): string {
|
||||
@@ -42,7 +43,7 @@ function errorText(err: unknown): string {
|
||||
}
|
||||
|
||||
/**
|
||||
* 侧栏按审查工单筛文件:「选工单」列出看板「审查」列的工单,选中后树里只剩这张工单的 PR 改过的文件(按改动着色),
|
||||
* 侧栏按审查工单筛文件:「选工单」列出看板「审查」「进行中」列里能审查的工单,选中后树里只剩这张工单的 PR 改过的文件(按改动着色),
|
||||
* 点开的是本机这张工单的工作副本里 PR 最新的代码;「显示全部」回到工作区文件树。选的工单按工作区记住。
|
||||
*/
|
||||
export class ReviewMode implements Disposable {
|
||||
@@ -80,14 +81,13 @@ export class ReviewMode implements Disposable {
|
||||
return this.reviewing !== undefined
|
||||
}
|
||||
|
||||
/** 「选工单」:顶部弹出快速选择,读看板「审查」列的工单和各自改了几个文件时转圈。 */
|
||||
/**
|
||||
* 「选工单」:顶部弹出快速选择,列出看板上现在摆着的「审查」列工单,马上就有;
|
||||
* 「选工单」:顶部弹出快速选择,列出看板上现在摆着的「审查」「进行中」列里能审查的工单(按列分组),马上就有;
|
||||
* 各 PR 改了几个文件一起去读,读到一个换一项,都读完才停止转圈。
|
||||
*/
|
||||
async pick(): Promise<void> {
|
||||
const picker = window.createQuickPick<IssuePick>()
|
||||
picker.title = '选工单 · 看板「审查」列'
|
||||
const picker = window.createQuickPick<PickerItem>()
|
||||
picker.title = `选工单 · 看板${REVIEW_COLUMNS_TEXT}列`
|
||||
picker.placeholder = '输入工单号或标题筛选'
|
||||
picker.busy = true
|
||||
let open = true
|
||||
@@ -96,11 +96,11 @@ export class ReviewMode implements Disposable {
|
||||
picker.dispose()
|
||||
})
|
||||
picker.onDidAccept(() => {
|
||||
const chosen = picker.selectedItems[0]
|
||||
const chosen = picker.selectedItems[0]?.issue
|
||||
if (!chosen)
|
||||
return
|
||||
picker.hide()
|
||||
void this.review(chosen.issue.number, 'pick')
|
||||
void this.review(chosen.number, 'pick')
|
||||
})
|
||||
picker.show()
|
||||
|
||||
@@ -114,7 +114,7 @@ export class ReviewMode implements Disposable {
|
||||
void window.showErrorMessage(`没法选工单:${errorText(err)}`)
|
||||
return
|
||||
}
|
||||
const board = reviewColumnIssues(this.context)
|
||||
const board = reviewCandidateIssues(this.context)
|
||||
if (!open)
|
||||
return
|
||||
if (!board) {
|
||||
@@ -126,21 +126,23 @@ export class ReviewMode implements Disposable {
|
||||
logger.add({
|
||||
level: 'info',
|
||||
source: 'codeReader',
|
||||
message: `选工单:看板「审查」列 ${board.issues.length} 张(${board.from === 'loaded' ? '看板这次加载的' : '上次存下的看板快照'})`,
|
||||
details: board.issues.map(issue => `#${issue.number} PR ${issue.pr ?? '无'}`).join('\n'),
|
||||
message: `选工单:看板${REVIEW_COLUMNS_TEXT}列能审查的 ${board.issues.length} 张(${board.from === 'loaded' ? '看板这次加载的' : '上次存下的看板快照'})`,
|
||||
details: board.issues.map(issue => `#${issue.number} ${columnLabel(issue.column)} PR ${issue.pr ?? '无'}`).join('\n'),
|
||||
})
|
||||
if (board.issues.length === 0)
|
||||
picker.placeholder = '看板「审查」列里没有工单'
|
||||
picker.placeholder = `看板${REVIEW_COLUMNS_TEXT}列里没有能审查的工单`
|
||||
|
||||
let entries = pickEntries(board.issues, issue => localWorktree(this.context, repo.workspaceRoot, issue) !== undefined)
|
||||
// 换 items 时 VS Code 会把光标挪回第一项:按工单号挪回用户停着的那一项
|
||||
const render = (): void => {
|
||||
if (!open)
|
||||
return
|
||||
const active = picker.activeItems[0]?.issue.number
|
||||
const items = entries.map(entry => ({ issue: entry.issue, ...pickItemText(entry) }))
|
||||
const active = picker.activeItems[0]?.issue?.number
|
||||
const items: PickerItem[] = pickRows(entries).map(row => 'separator' in row
|
||||
? { label: row.separator, kind: QuickPickItemKind.Separator }
|
||||
: { issue: row.entry.issue, ...pickItemText(row.entry) })
|
||||
picker.items = items
|
||||
const stay = items.find(item => item.issue.number === active)
|
||||
const stay = items.find(item => item.issue !== undefined && item.issue.number === active)
|
||||
if (stay)
|
||||
picker.activeItems = [stay]
|
||||
picker.busy = countingFiles(entries)
|
||||
|
||||
Reference in new issue
Block a user