Skip to content

Commit e97cb30

Browse files
authored
feat: Add pin button back to task hover toolbar (#934)
1 parent e8cbd0f commit e97cb30

File tree

3 files changed

+70
-21
lines changed

3 files changed

+70
-21
lines changed

apps/twig/src/renderer/features/sidebar/components/SidebarMenu.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ function SidebarMenuComponent() {
196196
onTaskDoubleClick={handleTaskDoubleClick}
197197
onTaskContextMenu={handleTaskContextMenu}
198198
onTaskDelete={handleTaskDelete}
199+
onTaskTogglePin={togglePin}
199200
onTaskEditSubmit={handleTaskEditSubmit}
200201
onTaskEditCancel={handleTaskEditCancel}
201202
hasMore={sidebarData.hasMore}

apps/twig/src/renderer/features/sidebar/components/TaskListView.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ interface TaskListViewProps {
3535
isPinned: boolean,
3636
) => void;
3737
onTaskDelete: (taskId: string) => void;
38+
onTaskTogglePin: (taskId: string) => void;
3839
onTaskEditSubmit: (taskId: string, newTitle: string) => void;
3940
onTaskEditCancel: () => void;
4041
hasMore: boolean;
@@ -65,6 +66,7 @@ function TaskRow({
6566
onDoubleClick,
6667
onContextMenu,
6768
onDelete,
69+
onTogglePin,
6870
onEditSubmit,
6971
onEditCancel,
7072
timestamp,
@@ -77,6 +79,7 @@ function TaskRow({
7779
onDoubleClick: () => void;
7880
onContextMenu: (e: React.MouseEvent, isPinned: boolean) => void;
7981
onDelete: () => void;
82+
onTogglePin: () => void;
8083
onEditSubmit: (newTitle: string) => void;
8184
onEditCancel: () => void;
8285
timestamp: number;
@@ -101,6 +104,7 @@ function TaskRow({
101104
onDoubleClick={onDoubleClick}
102105
onContextMenu={(e) => onContextMenu(e, task.isPinned)}
103106
onDelete={onDelete}
107+
onTogglePin={onTogglePin}
104108
onEditSubmit={onEditSubmit}
105109
onEditCancel={onEditCancel}
106110
/>
@@ -229,6 +233,7 @@ export function TaskListView({
229233
onTaskDoubleClick,
230234
onTaskContextMenu,
231235
onTaskDelete,
236+
onTaskTogglePin,
232237
onTaskEditSubmit,
233238
onTaskEditCancel,
234239
hasMore,
@@ -291,6 +296,7 @@ export function TaskListView({
291296
onTaskContextMenu(task.id, e, isPinned)
292297
}
293298
onDelete={() => onTaskDelete(task.id)}
299+
onTogglePin={() => onTaskTogglePin(task.id)}
294300
onEditSubmit={(newTitle) => onTaskEditSubmit(task.id, newTitle)}
295301
onEditCancel={onTaskEditCancel}
296302
timestamp={task[timestampKey]}
@@ -353,6 +359,7 @@ export function TaskListView({
353359
onTaskContextMenu(task.id, e, isPinned)
354360
}
355361
onDelete={() => onTaskDelete(task.id)}
362+
onTogglePin={() => onTaskTogglePin(task.id)}
356363
onEditSubmit={(newTitle) =>
357364
onTaskEditSubmit(task.id, newTitle)
358365
}
@@ -381,6 +388,7 @@ export function TaskListView({
381388
onTaskContextMenu(task.id, e, isPinned)
382389
}
383390
onDelete={() => onTaskDelete(task.id)}
391+
onTogglePin={() => onTaskTogglePin(task.id)}
384392
onEditSubmit={(newTitle) => onTaskEditSubmit(task.id, newTitle)}
385393
onEditCancel={onTaskEditCancel}
386394
timestamp={task[timestampKey]}

apps/twig/src/renderer/features/sidebar/components/items/TaskItem.tsx

Lines changed: 61 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ interface TaskItemProps {
3030
onDoubleClick?: () => void;
3131
onContextMenu: (e: React.MouseEvent) => void;
3232
onDelete?: () => void;
33+
onTogglePin?: () => void;
3334
onEditSubmit?: (newTitle: string) => void;
3435
onEditCancel?: () => void;
3536
}
@@ -55,31 +56,62 @@ function formatRelativeTime(timestamp: number): string {
5556
}
5657

5758
interface TaskHoverToolbarProps {
58-
onDelete: () => void;
59+
isPinned: boolean;
60+
onTogglePin?: () => void;
61+
onDelete?: () => void;
5962
}
6063

61-
function TaskHoverToolbar({ onDelete }: TaskHoverToolbarProps) {
64+
function TaskHoverToolbar({
65+
isPinned,
66+
onTogglePin,
67+
onDelete,
68+
}: TaskHoverToolbarProps) {
6269
return (
6370
<span className="hidden shrink-0 items-center gap-0.5 group-hover:flex">
64-
{/* biome-ignore lint/a11y/useSemanticElements: Cannot use button inside parent button (SidebarItem) */}
65-
<span
66-
role="button"
67-
tabIndex={0}
68-
className="flex h-5 w-5 cursor-pointer items-center justify-center rounded text-gray-10 transition-colors hover:bg-red-4 hover:text-red-11"
69-
onClick={(e) => {
70-
e.stopPropagation();
71-
onDelete();
72-
}}
73-
onKeyDown={(e) => {
74-
if (e.key === "Enter" || e.key === " ") {
71+
{onTogglePin && (
72+
// biome-ignore lint/a11y/useSemanticElements: Cannot use button inside parent button (SidebarItem)
73+
<span
74+
role="button"
75+
tabIndex={0}
76+
className="flex h-5 w-5 cursor-pointer items-center justify-center rounded text-gray-10 transition-colors hover:bg-gray-4 hover:text-gray-12"
77+
onClick={(e) => {
78+
e.stopPropagation();
79+
onTogglePin();
80+
}}
81+
onKeyDown={(e) => {
82+
if (e.key === "Enter" || e.key === " ") {
83+
e.preventDefault();
84+
e.stopPropagation();
85+
onTogglePin();
86+
}
87+
}}
88+
title={isPinned ? "Unpin task" : "Pin task"}
89+
>
90+
<PushPin size={12} weight={isPinned ? "fill" : "regular"} />
91+
</span>
92+
)}
93+
{onDelete && (
94+
// biome-ignore lint/a11y/useSemanticElements: Cannot use button inside parent button (SidebarItem)
95+
<span
96+
role="button"
97+
tabIndex={0}
98+
className="flex h-5 w-5 cursor-pointer items-center justify-center rounded text-gray-10 transition-colors hover:bg-red-4 hover:text-red-11"
99+
onClick={(e) => {
75100
e.stopPropagation();
76101
onDelete();
77-
}
78-
}}
79-
title="Delete task"
80-
>
81-
<Trash size={12} />
82-
</span>
102+
}}
103+
onKeyDown={(e) => {
104+
if (e.key === "Enter" || e.key === " ") {
105+
e.preventDefault();
106+
e.stopPropagation();
107+
onDelete();
108+
}
109+
}}
110+
title="Delete task"
111+
>
112+
<Trash size={12} />
113+
</span>
114+
)}
83115
</span>
84116
);
85117
}
@@ -103,6 +135,7 @@ export function TaskItem({
103135
onDoubleClick,
104136
onContextMenu,
105137
onDelete,
138+
onTogglePin,
106139
onEditSubmit,
107140
onEditCancel,
108141
}: TaskItemProps) {
@@ -161,7 +194,14 @@ export function TaskItem({
161194
</span>
162195
) : null;
163196

164-
const toolbar = onDelete ? <TaskHoverToolbar onDelete={onDelete} /> : null;
197+
const toolbar =
198+
onDelete || onTogglePin ? (
199+
<TaskHoverToolbar
200+
isPinned={isPinned}
201+
onTogglePin={onTogglePin}
202+
onDelete={onDelete}
203+
/>
204+
) : null;
165205

166206
if (!timestampNode && !toolbar) return null;
167207

@@ -171,7 +211,7 @@ export function TaskItem({
171211
{toolbar}
172212
</>
173213
);
174-
}, [timestamp, onDelete]);
214+
}, [timestamp, onDelete, onTogglePin, isPinned]);
175215

176216
if (isEditing) {
177217
return (

0 commit comments

Comments
 (0)