diff --git a/src/kanban/outboundMessages.ts b/src/kanban/outboundMessages.ts index 9aef87c..64017cb 100644 --- a/src/kanban/outboundMessages.ts +++ b/src/kanban/outboundMessages.ts @@ -12,6 +12,7 @@ export type KanbanOutboundMessage = scopeFilter: KanbanScopeFilter; shownHiddenColumns: TaskStatus[]; defaultHiddenStatuses: TaskStatus[]; + dangerStatuses: TaskStatus[]; availableScopes: TaskScope[]; } | { variant: "error"; error: AppError }; diff --git a/src/views/taskKanbanHtml.ts b/src/views/taskKanbanHtml.ts index 92493d1..61a79b4 100644 --- a/src/views/taskKanbanHtml.ts +++ b/src/views/taskKanbanHtml.ts @@ -116,6 +116,13 @@ export function getTaskKanbanHtml( color: var(--vscode-button-foreground); border-color: transparent; } + #visibility-bar button.danger { + border-color: var(--vscode-errorForeground); + border-width: 2px; + } + #visibility-bar button.danger.shown { + background: var(--vscode-errorForeground); + } #status-line { font-size: 0.85em; opacity: 0.85; @@ -210,6 +217,7 @@ export function getTaskKanbanHtml( let scopeFilter = "all"; let shownHiddenColumns = []; let defaultHiddenStatuses = []; + let dangerStatuses = []; let availableScopes = []; let dragTaskId = null; @@ -269,6 +277,9 @@ export function getTaskKanbanHtml( if (shownHiddenColumns.indexOf(status) >= 0) { btn.classList.add("shown"); } + if (dangerStatuses.indexOf(status) >= 0) { + btn.classList.add("danger"); + } btn.addEventListener("click", () => { post({ variant: "toggleHiddenColumn", status: status }); }); @@ -374,6 +385,7 @@ export function getTaskKanbanHtml( scopeFilter = message.scopeFilter || "all"; shownHiddenColumns = message.shownHiddenColumns || []; defaultHiddenStatuses = message.defaultHiddenStatuses || []; + dangerStatuses = message.dangerStatuses || []; availableScopes = message.availableScopes || []; setStatus(""); render(); diff --git a/src/views/taskKanbanPanel.ts b/src/views/taskKanbanPanel.ts index e6814c8..ccd3c57 100644 --- a/src/views/taskKanbanPanel.ts +++ b/src/views/taskKanbanPanel.ts @@ -278,10 +278,12 @@ export class TaskKanbanPanel { } #postState(): void { - const board = buildKanbanBoard( - this.#filteredTasks().map((item) => item.task), - { shownHiddenColumns: this.#shownHiddenColumns }, - ); + const filtered = this.#filteredTasks().map((item) => item.task); + const board = buildKanbanBoard(filtered, { + shownHiddenColumns: this.#shownHiddenColumns, + }); + + const hasUnknown = filtered.some((t) => t.status === TaskStatus.UNKNOWN); this.#post({ variant: "state", @@ -289,9 +291,12 @@ export class TaskKanbanPanel { scopeFilter: this.#scopeFilter, shownHiddenColumns: this.#shownHiddenColumns, defaultHiddenStatuses: TASK_STATUS_ORDER.filter( - (s) => TASK_STATUS_META[s].defaultHidden, + (s) => + TASK_STATUS_META[s].defaultHidden && + (s !== TaskStatus.UNKNOWN || hasUnknown), ), availableScopes: this.#availableScopes(), + dangerStatuses: hasUnknown ? [TaskStatus.UNKNOWN] : [], }); } diff --git a/src/views/taskTreeProvider.ts b/src/views/taskTreeProvider.ts index d2b4904..2cc5324 100644 --- a/src/views/taskTreeProvider.ts +++ b/src/views/taskTreeProvider.ts @@ -3,9 +3,9 @@ import { resolveTaskLocations } from "@/commands/resolveTaskLocations"; import { Task } from "@/model/task"; import { LocatedTask, TaskLocation } from "@/model/taskLocation"; import { + TaskStatus, TASK_STATUS_META, TASK_STATUS_ORDER, - type TaskStatus, } from "@/model/taskStatus"; import { IConfigProvider, ITaskRepository } from "@/ports"; import { TASK_SCOPE_LABELS, TASK_STATUS_LABELS } from "@/ui/taskLabels"; @@ -47,7 +47,12 @@ class TaskGroupTreeItem extends vscode.TreeItem { this.description = `(${tasks.length})`; this.id = `group-${location.scope}-${status}`; this.contextValue = "taskGroup"; - this.iconPath = new vscode.ThemeIcon(TASK_STATUS_META[status].icon); + this.iconPath = new vscode.ThemeIcon( + TASK_STATUS_META[status].icon, + status === TaskStatus.UNKNOWN + ? new vscode.ThemeColor("charts.red") + : undefined, + ); } }