/// /** * Status Module - Pattern for project/task status tracking * * A composable pattern that can be used standalone or embedded in containers * like Record. Provides status selection with predefined options. */ import { computed, type Default, NAME, recipe, UI } from "commontools"; import type { ModuleMetadata } from "./container-protocol.ts"; // ===== Self-Describing Metadata ===== export const MODULE_METADATA: ModuleMetadata = { type: "status", label: "Status", icon: "\u{1F4CA}", // bar chart emoji schema: { status: { type: "string", enum: ["", "planned", "active", "blocked", "done", "archived"], description: "Project status", }, }, fieldMapping: ["status"], }; // ===== Types ===== /** Project/task status values */ type StatusValue = "planned" | "active" | "blocked" | "done" | "archived"; export interface StatusModuleInput { /** Project status */ status: Default; } // ===== Constants ===== const STATUS_OPTIONS = [ { value: "", label: "Not set" }, { value: "planned", label: "📋 Planned" }, { value: "active", label: "🚀 Active" }, { value: "blocked", label: "🚧 Blocked" }, { value: "done", label: "✅ Done" }, { value: "archived", label: "📦 Archived" }, ]; // ===== The Pattern ===== export const StatusModule = recipe( "StatusModule", ({ status }) => { const displayText = computed(() => { const opt = STATUS_OPTIONS.find((o) => o.value === status); return opt?.label || "Not set"; }); return { [NAME]: computed(() => `${MODULE_METADATA.icon} Status: ${displayText}`), [UI]: ( ), status, }; }, ); export default StatusModule;