diff --git a/src/model/taskPriority.ts b/src/model/taskPriority.ts index be3adb5..320eb9d 100644 --- a/src/model/taskPriority.ts +++ b/src/model/taskPriority.ts @@ -10,6 +10,11 @@ export type TaskPriority = (typeof TaskPriority)[keyof typeof TaskPriority]; export type TaskPriorityMeta = { label: string; + /** + * Fallback value assigned when the parsed priority is invalid/missing. + * Excluded from editing choices. + */ + fallback?: boolean; }; /** Explicit order for filters / grouping (critical → low → unknown). */ @@ -26,7 +31,7 @@ export const TASK_PRIORITY_META: Record = { [TaskPriority.HIGH]: { label: "High" }, [TaskPriority.MEDIUM]: { label: "Medium" }, [TaskPriority.LOW]: { label: "Low" }, - [TaskPriority.UNKNOWN]: { label: "Unknown" }, + [TaskPriority.UNKNOWN]: { label: "Unknown", fallback: true }, }; export function isTaskPriority(value: unknown): value is TaskPriority { diff --git a/src/model/taskStatus.ts b/src/model/taskStatus.ts index 926d9ec..6f52974 100644 --- a/src/model/taskStatus.ts +++ b/src/model/taskStatus.ts @@ -15,6 +15,11 @@ export type TaskStatusMeta = { defaultHidden: boolean; /** Codicon id for tree; adapters wrap in ThemeIcon. */ icon: string; + /** + * Fallback value assigned when the parsed status is invalid/missing. + * Excluded from editing choices; hidden in tree when empty. + */ + fallback?: boolean; }; /** Explicit display / column order (not Object.values). */ @@ -57,6 +62,7 @@ export const TASK_STATUS_META: Record = { label: "Unknown", defaultHidden: true, icon: "question", + fallback: true, }, }; diff --git a/src/ui/editFrontmatterField.ts b/src/ui/editFrontmatterField.ts index 37bf161..05fc54c 100644 --- a/src/ui/editFrontmatterField.ts +++ b/src/ui/editFrontmatterField.ts @@ -1,4 +1,3 @@ -import * as vscode from "vscode"; import { addProjectTag } from "@/commands/addProjectTag"; import { loadProjectConfig } from "@/commands/loadProjectConfig"; import { resolveTaskLocations } from "@/commands/resolveTaskLocations"; @@ -16,13 +15,16 @@ import { TASK_LANGUAGE_ID, } from "@/model/taskFile"; import { IConfigProvider, IFileSystem } from "@/ports"; +import * as vscode from "vscode"; import { getGitUserName, yamlInlineScalar } from "./getGitUserName"; import { presentError } from "./presentError"; import { resolveTaskFolderForPath } from "./resolveTaskFolder"; import { TASK_PRIORITY_LABELS, + TASK_PRIORITY_META, TASK_PRIORITY_ORDER, TASK_STATUS_LABELS, + TASK_STATUS_META, TASK_STATUS_ORDER, } from "./taskLabels"; @@ -115,7 +117,9 @@ export async function runEditTaskStatus(uriArg?: string): Promise { } const picked = await vscode.window.showQuickPick( - TASK_STATUS_ORDER.map((status) => ({ + TASK_STATUS_ORDER.filter( + (status) => !TASK_STATUS_META[status].fallback, + ).map((status) => ({ label: TASK_STATUS_LABELS[status], description: status, status, @@ -137,7 +141,9 @@ export async function runEditTaskPriority(uriArg?: string): Promise { } const picked = await vscode.window.showQuickPick( - TASK_PRIORITY_ORDER.map((priority) => ({ + TASK_PRIORITY_ORDER.filter( + (priority) => !TASK_PRIORITY_META[priority].fallback, + ).map((priority) => ({ label: TASK_PRIORITY_LABELS[priority], description: priority, priority, diff --git a/src/views/taskTreeProvider.ts b/src/views/taskTreeProvider.ts index c91f3a9..d2b4904 100644 --- a/src/views/taskTreeProvider.ts +++ b/src/views/taskTreeProvider.ts @@ -1,4 +1,3 @@ -import * as vscode from "vscode"; import { listLocatedTasks } from "@/commands/listLocatedTasks"; import { resolveTaskLocations } from "@/commands/resolveTaskLocations"; import { Task } from "@/model/task"; @@ -10,6 +9,7 @@ import { } from "@/model/taskStatus"; import { IConfigProvider, ITaskRepository } from "@/ports"; import { TASK_SCOPE_LABELS, TASK_STATUS_LABELS } from "@/ui/taskLabels"; +import * as vscode from "vscode"; import { TaskTreeItem } from "./taskTreeItem"; class ScopeTreeItem extends vscode.TreeItem { @@ -119,7 +119,10 @@ export class TaskTreeProvider implements vscode.TreeDataProvider item.task); - return TASK_STATUS_ORDER.map((status) => { + return TASK_STATUS_ORDER.filter((status) => { + const groupTasks = tasks.filter((t) => t.status === status); + return !(groupTasks.length === 0 && TASK_STATUS_META[status].fallback); + }).map((status) => { const groupTasks = tasks.filter((t) => t.status === status); return new TaskGroupTreeItem(status, scope.location, groupTasks); });