Skip to content

Commit b456d8e

Browse files
committed
Add pin button back to task hover toolbar
1 parent 800fed1 commit b456d8e

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
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={(taskId) => togglePin(taskId)}
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: 37 additions & 3 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,12 +56,37 @@ function formatRelativeTime(timestamp: number): string {
5556
}
5657

5758
interface TaskHoverToolbarProps {
59+
isPinned: boolean;
60+
onTogglePin: () => void;
5861
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">
71+
{/* biome-ignore lint/a11y/useSemanticElements: Cannot use button inside parent button (SidebarItem) */}
72+
<span
73+
role="button"
74+
tabIndex={0}
75+
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"
76+
onClick={(e) => {
77+
e.stopPropagation();
78+
onTogglePin();
79+
}}
80+
onKeyDown={(e) => {
81+
if (e.key === "Enter" || e.key === " ") {
82+
e.stopPropagation();
83+
onTogglePin();
84+
}
85+
}}
86+
title={isPinned ? "Unpin task" : "Pin task"}
87+
>
88+
<PushPin size={12} weight={isPinned ? "fill" : "regular"} />
89+
</span>
6490
{/* biome-ignore lint/a11y/useSemanticElements: Cannot use button inside parent button (SidebarItem) */}
6591
<span
6692
role="button"
@@ -103,6 +129,7 @@ export function TaskItem({
103129
onDoubleClick,
104130
onContextMenu,
105131
onDelete,
132+
onTogglePin,
106133
onEditSubmit,
107134
onEditCancel,
108135
}: TaskItemProps) {
@@ -161,7 +188,14 @@ export function TaskItem({
161188
</span>
162189
) : null;
163190

164-
const toolbar = onDelete ? <TaskHoverToolbar onDelete={onDelete} /> : null;
191+
const toolbar =
192+
onDelete && onTogglePin ? (
193+
<TaskHoverToolbar
194+
isPinned={isPinned}
195+
onTogglePin={onTogglePin}
196+
onDelete={onDelete}
197+
/>
198+
) : null;
165199

166200
if (!timestampNode && !toolbar) return null;
167201

@@ -171,7 +205,7 @@ export function TaskItem({
171205
{toolbar}
172206
</>
173207
);
174-
}, [timestamp, onDelete]);
208+
}, [timestamp, onDelete, onTogglePin, isPinned]);
175209

176210
if (isEditing) {
177211
return (

0 commit comments

Comments
 (0)