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 */}
+
+ Favorite
+
+
+
{/* Commands Shortcut */}
+