diff --git a/src/components/QuickEntry.tsx b/src/components/QuickEntry.tsx index 7d5892e..ebcff95 100644 --- a/src/components/QuickEntry.tsx +++ b/src/components/QuickEntry.tsx @@ -1,6 +1,6 @@ -import { type Component, createSignal, createEffect, onCleanup, onMount, For } from "solid-js"; -import { Search, Command, Clock, ArrowUpCircle, Plus } from "lucide-solid"; -import { addTask, calculateDateFromUrgency, calculateUrgencyFromDate, store, upsertMultipleTagDefinitions } from "@/store"; +import { type Component, createSignal, createEffect, onCleanup, onMount, For, Show } from "solid-js"; +import { addTask, calculateDateFromUrgency, calculateUrgencyFromDate, store, upsertMultipleTagDefinitions, type TaskTemplate } from "@/store"; +import { Search, Command, Clock, ArrowUpCircle, Plus, Copy, ChevronDown } from "lucide-solid"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { cn } from "@/lib/utils"; @@ -8,6 +8,8 @@ import { TextField, TextFieldInput } from "@/components/ui/textfield"; import { Select, SelectContent, SelectItem, SelectTrigger } from "@/components/ui/select"; import { TagPicker } from "@/components/TagPicker"; import { lazy, Suspense } from "solid-js"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { toast } from "solid-sonner"; const TaskEditor = lazy(() => import("./TaskEditor").then(m => ({ default: m.TaskEditor }))); @@ -219,6 +221,29 @@ export const QuickEntry: Component = () => { if (instance) instance.commands.setContent(""); }; + const applyTemplate = (template: TaskTemplate) => { + setInput(template.title); + setPriority(template.priority.toString()); + setUrgency(template.urgency.toString()); + setTags([...(template.tags || [])]); + setDescription(template.content || ""); + + // Sync urgency to date + const level = template.urgency; + const newDateIso = calculateDateFromUrgency(level); + const dateObj = new Date(newDateIso); + const localIso = new Date(dateObj.getTime() - (dateObj.getTimezoneOffset() * 60000)).toISOString().slice(0, 16); + setDateString(localIso); + + // Update editor if ready + const instance = editorInstance(); + if (instance) { + instance.commands.setContent(template.content || ""); + } + + toast.info(`Applied template: ${template.name}`); + }; + return ( <> + +
+ 0}> + + + + + + + +
+ + {(template) => ( + + )} + +
+
+
+
+ + +
diff --git a/src/components/TaskDetail.tsx b/src/components/TaskDetail.tsx index f9ad93f..cffa6ea 100644 --- a/src/components/TaskDetail.tsx +++ b/src/components/TaskDetail.tsx @@ -1,8 +1,8 @@ import { type Component, createEffect, createSignal, For } from "solid-js"; import { Sheet, SheetContent } from "@/components/ui/sheet"; -import { type Task, removeTask, restoreTask, updateTask } from "@/store"; +import { type Task, removeTask, restoreTask, updateTask, saveTaskAsTemplate } from "@/store"; import { Select, SelectContent, SelectItem, SelectTrigger } from "@/components/ui/select"; -import { ArrowUpCircle, Clock, Calendar, Type, Trash2, X } from "lucide-solid"; +import { ArrowUpCircle, Clock, Calendar, Type, Trash2, X, Copy } from "lucide-solid"; import { calculateDateFromUrgency, calculateUrgencyFromDate } from "@/store"; import { Button } from "./ui/button"; import { TagPicker } from "./TagPicker"; @@ -81,7 +81,16 @@ export const TaskDetail: Component = (props) => { return ( !open && props.onClose()}> - + { + // Prevent auto-focus on mobile to avoid keyboard popup + if (window.innerWidth < 768) { + e.preventDefault(); + } + }} + class="w-full sm:max-w-2xl px-0 sm:px-0 flex flex-col h-full bg-background border-l border-border shadow-2xl" + > {/* Header Area */}