diff --git a/src/components/FilterBar.tsx b/src/components/FilterBar.tsx index 260bc79..69f6a11 100644 --- a/src/components/FilterBar.tsx +++ b/src/components/FilterBar.tsx @@ -1,6 +1,6 @@ import { type Component, createSignal, For, Show } from "solid-js"; -import { Search, X, Tag, ArrowUpCircle, Clock, Minus, Save, Trash2, Bookmark } from "lucide-solid"; -import { store, setFilter, clearFilter, saveFilterTemplate, applyFilterTemplate, removeFilterTemplate, loadAllHistory, setNoteFilter, clearNoteFilter, saveNoteFilterTemplate, applyNoteFilterTemplate, removeNoteFilterTemplate, syncPreferences, type Filter } from "@/store"; +import { Search, X, Tag, ArrowUpCircle, Clock, Minus, Save, Trash2, Bookmark, User, Star } from "lucide-solid"; +import { store, setFilter, clearFilter, saveFilterTemplate, applyFilterTemplate, removeFilterTemplate, loadAllHistory, setNoteFilter, clearNoteFilter, saveNoteFilterTemplate, applyNoteFilterTemplate, removeNoteFilterTemplate, type Filter } from "@/store"; import { Button } from "./ui/button"; import { cn } from "@/lib/utils"; import { Badge } from "./ui/badge"; @@ -26,7 +26,7 @@ export const FilterBar: Component<{ mode?: 'tasks' | 'notes', class?: string, tr const hasActiveFilters = () => { const f = currentFilter(); - const baseActive = (f.query || "") !== "" || (f.tags || []).length > 0 || f.editedToday; + const baseActive = (f.query || "") !== "" || (f.tags || []).length > 0 || f.editedToday || f.ownedByMe || f.starred; if (mode() === 'tasks') { return baseActive || f.priorityMin !== 1 || f.priorityMax !== 10 || f.urgencyMin !== 1 || f.urgencyMax !== 10; } @@ -78,6 +78,30 @@ export const FilterBar: Component<{ mode?: 'tasks' | 'notes', class?: string, tr
Edited Today + +
diff --git a/src/components/NotesSidebar.tsx b/src/components/NotesSidebar.tsx index cc64ebc..8f8bdef 100644 --- a/src/components/NotesSidebar.tsx +++ b/src/components/NotesSidebar.tsx @@ -1,7 +1,7 @@ import { type Component, createMemo, For, Show } from "solid-js"; -import { store } from "@/store"; +import { store, getFavoriteTag } from "@/store"; import { pb } from "@/lib/pocketbase"; -import { Plus, Lock } from "lucide-solid"; +import { Plus, Lock, Star } from "lucide-solid"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import { NOTES_COLLECTION } from "@/lib/constants"; @@ -54,6 +54,16 @@ export const NotesSidebar: Component<{ }); } + // Owned By Me Filter + if (filter.ownedByMe) { + n = n.filter(note => note.user === currentUserId); + } + + // Starred Filter + if (filter.starred) { + n = n.filter(note => note.tags?.includes(getFavoriteTag())); + } + return n; }); @@ -105,23 +115,28 @@ export const NotesSidebar: Component<{ )} >
- {note.title || "Untitled"} +
+ + + + {note.title || "Untitled"} +
- 0}> + !t.endsWith("_favorite__"))}>
- + !t.endsWith("_favorite__")).slice(0, 3)}> {(t) => ( {t} )} - 3}> + !t.endsWith("_favorite__")).length > 3}> - +{note.tags.length - 3} + +{note.tags.filter(t => !t.endsWith("_favorite__")).length - 3}
diff --git a/src/components/QuickEntryForm.tsx b/src/components/QuickEntryForm.tsx index 369da8d..e881fa3 100644 --- a/src/components/QuickEntryForm.tsx +++ b/src/components/QuickEntryForm.tsx @@ -345,7 +345,7 @@ export const QuickEntryForm: Component = (props) => {
- + !t.endsWith("_favorite__"))}> {(tag) => ( = (props) => { }; const allTagNames = () => { - const definedTags = store.tagDefinitions.map(d => d.name); + const definedTags = store.tagDefinitions.filter(d => !d.name.endsWith("_favorite__")).map(d => d.name); const bucketTags = store.buckets.map(b => `@${b.name}`); const noteTags = store.notes.map(n => `#${n.title}`); return [...new Set([...definedTags, ...bucketTags, ...noteTags])].sort(); diff --git a/src/components/TaskCard.tsx b/src/components/TaskCard.tsx index b69c439..305398d 100644 --- a/src/components/TaskCard.tsx +++ b/src/components/TaskCard.tsx @@ -1,7 +1,7 @@ import { type Component, createMemo, For, Show } from "solid-js"; -import { type Task, calculateUrgencyFromDate, setActiveTaskId, store, copyTask, updateTask, currentTaskContext, now } from "@/store"; +import { type Task, calculateUrgencyFromDate, setActiveTaskId, store, copyTask, updateTask, currentTaskContext, now, getFavoriteTag } from "@/store"; import { cn } from "@/lib/utils"; -import { Clock, ArrowUpCircle, Copy, Users2 } from "lucide-solid"; +import { Clock, ArrowUpCircle, Copy, Users2, Star } from "lucide-solid"; import { Badge } from "@/components/ui/badge"; import { useTheme } from "./ThemeProvider"; import { getThemeAdjustedColor } from "@/lib/colors"; @@ -35,10 +35,10 @@ export const TaskCard: Component<{ task: Task, isShaking?: boolean }> = (props) // We are in a bucket view. Hide the tag that matches this bucket's name. // Buckets are now tagged with '@' + name. const bucketTagName = `@${(ctx as { name: string }).name.toLowerCase()}`; - return tags.filter(t => t.toLowerCase() !== bucketTagName); + return tags.filter(t => t.toLowerCase() !== bucketTagName && !t.endsWith("_favorite__")); } - return tags; + return tags.filter(t => !t.endsWith("_favorite__")); }); const isDueWithin12Hours = createMemo(() => { @@ -218,9 +218,9 @@ export const TaskCard: Component<{ task: Task, isShaking?: boolean }> = (props)
-
+
+
); diff --git a/src/components/TaskDetail.tsx b/src/components/TaskDetail.tsx index f51f9fa..26a2d2d 100644 --- a/src/components/TaskDetail.tsx +++ b/src/components/TaskDetail.tsx @@ -1,9 +1,9 @@ import { type Component, createEffect, createSignal, For, createMemo, onCleanup } from "solid-js"; import { Sheet, SheetContent } from "@/components/ui/sheet"; -import { type Task, removeTask, restoreTask, updateTask, saveTaskAsTemplate, shareTask, revokeShare, splitTask, loadTaskContent, currentTaskContext, cleanupTaskAttachments } from "@/store"; +import { type Task, removeTask, restoreTask, updateTask, saveTaskAsTemplate, shareTask, revokeShare, splitTask, loadTaskContent, currentTaskContext, cleanupTaskAttachments, getFavoriteTag } from "@/store"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; -import { ArrowUpCircle, Clock, Calendar, Type, Trash2, X, Copy, MoreHorizontal, Gauge, Share2, UserMinus, GitBranch, Tag, Settings } from "lucide-solid"; +import { ArrowUpCircle, Clock, Calendar, Type, Trash2, X, Copy, MoreHorizontal, Gauge, Share2, UserMinus, GitBranch, Tag, Settings, Star } from "lucide-solid"; import { StatusCircle } from "./StatusCircle"; import { calculateDateFromUrgency, calculateUrgencyFromDate } from "@/store"; import { Button } from "./ui/button"; @@ -201,10 +201,10 @@ export const TaskDetail: Component = (props) => { // We are in a bucket view. Hide the tag that matches this bucket's name. // Buckets are now tagged with '@' + name. const bucketTagName = `@${(ctx as { name: string }).name.toLowerCase()}`; - return tags.filter(t => t.toLowerCase() !== bucketTagName); + return tags.filter(t => t.toLowerCase() !== bucketTagName && !t.endsWith("_favorite__")); } - return tags; + return tags.filter(t => !t.endsWith("_favorite__")); }); const statusOptions = createMemo(() => getStatusOptionsForTask(props.task.recurrence)); @@ -361,6 +361,26 @@ export const TaskDetail: Component = (props) => {
+ {/* Favorite */} +
+ + +
+ {/* Commands Shortcut */}
+