Skip to content

Commit 3fbfc19

Browse files
committed
fix: display folder name and color in note cards
1 parent da5ff9a commit 3fbfc19

3 files changed

Lines changed: 56 additions & 22 deletions

File tree

src/components/notes/NotesPanel/NoteCard.tsx

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import { memo, useMemo } from 'react';
2-
import { Star } from 'lucide-react';
3-
import type { Note } from '@/types/note.ts';
2+
import { Star, Folder } from 'lucide-react';
3+
import type { Note, Folder as FolderType } from '@/types/note.ts';
44

55
interface NoteCardProps {
66
note: Note;
77
isSelected: boolean;
88
onSelect: (note: Note) => void;
99
onToggleStar: (noteId: string) => void;
10+
folders?: FolderType[];
1011
}
1112

12-
function NoteCard({ note, isSelected, onSelect, onToggleStar }: NoteCardProps) {
13+
function NoteCard({ note, isSelected, onSelect, onToggleStar, folders }: NoteCardProps) {
1314
const formatDateTime = (date: Date) => {
1415
try {
1516
const noteDate = new Date(date);
@@ -49,6 +50,17 @@ function NoteCard({ note, isSelected, onSelect, onToggleStar }: NoteCardProps) {
4950
return note?.updatedAt ? formatDateTime(note.updatedAt) : 'No date';
5051
}, [note?.updatedAt]);
5152

53+
const folder = useMemo(() => {
54+
// First check if note has embedded folder data
55+
if (note?.folder) {
56+
return note.folder;
57+
}
58+
59+
// Fallback to looking up in folders array
60+
if (!note?.folderId || !folders || folders.length === 0) return null;
61+
return folders.find(f => f.id === note.folderId) || null;
62+
}, [note?.folder, note?.folderId, folders]);
63+
5264
if (!note) {
5365
return null;
5466
}
@@ -100,17 +112,35 @@ function NoteCard({ note, isSelected, onSelect, onToggleStar }: NoteCardProps) {
100112
{previewText}
101113
</p>
102114

103-
<div className="flex items-center justify-between">
104-
<span
105-
className={`text-xs ${
106-
isSelected ? 'text-accent-foreground/70' : 'text-muted-foreground'
107-
}`}
108-
>
109-
{formattedDate}
110-
</span>
111-
115+
<div className="space-y-1">
116+
{/* Date and Folder */}
117+
<div className="flex flex-col gap-1">
118+
<span
119+
className={`text-xs ${
120+
isSelected ? 'text-accent-foreground/70' : 'text-muted-foreground'
121+
}`}
122+
>
123+
{formattedDate}
124+
</span>
125+
126+
{folder && (
127+
<div
128+
className={`flex items-center gap-1.5 text-xs ${
129+
isSelected ? 'text-accent-foreground/60' : 'text-muted-foreground/80'
130+
}`}
131+
>
132+
<div
133+
className="h-2 w-2 rounded-sm shrink-0"
134+
style={{ backgroundColor: folder.color || '#6b7280' }}
135+
/>
136+
<span className="truncate">{folder.name}</span>
137+
</div>
138+
)}
139+
</div>
140+
141+
{/* Tags */}
112142
{note.tags && note.tags.length > 0 && (
113-
<div className="flex gap-1">
143+
<div className="flex gap-1 pt-1">
114144
{note.tags.slice(0, 1).map((tag) => (
115145
<span
116146
key={tag}
@@ -149,6 +179,8 @@ export default memo(NoteCard, (prevProps, nextProps) => {
149179
prevProps.note.content === nextProps.note.content &&
150180
prevProps.note.starred === nextProps.note.starred &&
151181
prevProps.note.updatedAt === nextProps.note.updatedAt &&
152-
prevProps.isSelected === nextProps.isSelected
182+
prevProps.note.folderId === nextProps.note.folderId &&
183+
prevProps.isSelected === nextProps.isSelected &&
184+
prevProps.folders === nextProps.folders
153185
);
154-
});
186+
});

src/components/notes/NotesPanel/NotesList.tsx

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
AlertDialogTitle,
1414
} from '@/components/ui/alert-dialog.tsx';
1515
import { Button } from '@/components/ui/button.tsx';
16-
import type { Note } from '@/types/note.ts';
16+
import type { Note, Folder } from '@/types/note.ts';
1717

1818
import NoteCard from './NoteCard.tsx';
1919

@@ -25,6 +25,7 @@ interface NotesListProps {
2525
onEmptyTrash?: () => Promise<void>;
2626
isTrashView?: boolean;
2727
emptyMessage?: string;
28+
folders?: Folder[];
2829
}
2930

3031
export default function NotesList({
@@ -35,6 +36,7 @@ export default function NotesList({
3536
onEmptyTrash,
3637
isTrashView = false,
3738
emptyMessage,
39+
folders,
3840
}: NotesListProps) {
3941
const [showEmptyTrashDialog, setShowEmptyTrashDialog] = useState(false);
4042
const [isEmptyingTrash, setIsEmptyingTrash] = useState(false);
@@ -56,7 +58,6 @@ export default function NotesList({
5658
return (
5759
<>
5860
<div className="divide-y divide-slate-100 dark:divide-slate-700">
59-
{/* Empty Trash Button - Only show when in trash view and there are notes */}
6061
{isTrashView && notes.length > 0 && onEmptyTrash && (
6162
<div className="border-border bg-muted/20 border-b p-4">
6263
<div className="flex items-center justify-between">
@@ -79,18 +80,17 @@ export default function NotesList({
7980
</div>
8081
)}
8182

82-
{/* Notes List */}
8383
{notes.map((note) => (
8484
<NoteCard
8585
key={note.id}
8686
note={note}
8787
isSelected={selectedNote?.id === note.id}
8888
onSelect={onSelectNote}
8989
onToggleStar={onToggleStar}
90+
folders={folders}
9091
/>
9192
))}
9293

93-
{/* Empty State */}
9494
{notes.length === 0 && emptyMessage && (
9595
<div className="text-muted-foreground p-8 text-center">
9696
<Trash2 className="mx-auto mb-4 h-12 w-12 opacity-20" />
@@ -99,7 +99,6 @@ export default function NotesList({
9999
)}
100100
</div>
101101

102-
{/* Empty Trash Confirmation Dialog */}
103102
<AlertDialog
104103
open={showEmptyTrashDialog}
105104
onOpenChange={setShowEmptyTrashDialog}
@@ -142,4 +141,4 @@ export default function NotesList({
142141
</AlertDialog>
143142
</>
144143
);
145-
}
144+
}

src/components/notes/NotesPanel/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ interface FilesPanelProps {
88
notes: Note[];
99
selectedNote: Note | null;
1010
selectedFolder: FolderType | null;
11+
folders?: FolderType[];
1112
currentView: ViewMode;
1213
isFolderPanelOpen: boolean;
1314
onSelectNote: (note: Note) => void;
@@ -24,6 +25,7 @@ export default function FilesPanel({
2425
notes,
2526
selectedNote,
2627
selectedFolder,
28+
folders,
2729
currentView,
2830
isFolderPanelOpen,
2931
onSelectNote,
@@ -149,8 +151,9 @@ export default function FilesPanel({
149151
isTrashView={isTrashView}
150152
onEmptyTrash={onEmptyTrash}
151153
emptyMessage={getEmptyMessage()}
154+
folders={folders}
152155
/>
153156
</div>
154157
</div>
155158
);
156-
}
159+
}

0 commit comments

Comments
 (0)