Skip to content

Commit 544c428

Browse files
committed
refactor: hide dialog triggers in controlled mode, use FAB for add actions
Changes: - AddTaskDialog/AddProjectDialog: Hide DialogTrigger when controlled (open prop provided) - Breadcrumbs: Remove add project/task buttons and onAddProject/onAddTask props - Board: Remove passing onAddProject/onAddTask to Breadcrumbs Behavior: - Floating Action Buttons (FAB) in bottom-right corner are the only add entry points - Dialog trigger buttons no longer render in controlled mode - Add Task button disabled when no project selected - Add Project button always enabled Files Modified: - src/components/breadcrumbs.tsx - src/components/kanban/add-task-dialog.tsx - src/components/kanban/add-project-dialog.tsx - src/components/kanban/board.tsx
1 parent fd17a88 commit 544c428

4 files changed

Lines changed: 40 additions & 65 deletions

File tree

src/components/breadcrumbs.tsx

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import { ChevronDown, Folder, FolderPlus, Plus } from 'lucide-react';
1+
import { ChevronDown, Folder } from 'lucide-react';
22
import { useState } from 'react';
33

4-
import { Button } from '@/components/ui/button';
54
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog';
65
import type { Project, Task } from '@/hooks/useKanban';
76

@@ -13,8 +12,6 @@ interface BreadcrumbsProps {
1312
currentProjectId: string | null;
1413
onProjectSelect: (id: string) => void;
1514
onTaskSelect: (id: string) => void;
16-
onAddProject?: () => void;
17-
onAddTask?: () => void;
1815
}
1916

2017
export function Breadcrumbs({
@@ -25,8 +22,6 @@ export function Breadcrumbs({
2522
currentProjectId,
2623
onProjectSelect,
2724
onTaskSelect,
28-
onAddProject,
29-
onAddTask,
3025
}: BreadcrumbsProps) {
3126
const [open, setOpen] = useState(false);
3227
const [activeTab, setActiveTab] = useState<'projects' | 'tasks'>('projects');
@@ -82,28 +77,6 @@ export function Breadcrumbs({
8277
</button>
8378
</div>
8479

85-
<div className="mt-4 flex justify-end">
86-
<Button
87-
size="sm"
88-
onClick={onAddProject}
89-
className="font-mono text-xs uppercase tracking-[0.15em]"
90-
>
91-
<FolderPlus className="h-3 w-3 mr-1" />
92-
[add project]
93-
</Button>
94-
</div>
95-
96-
<div className="mt-4 flex justify-end">
97-
<Button
98-
size="sm"
99-
onClick={onAddTask}
100-
className="font-mono text-xs uppercase tracking-[0.15em]"
101-
>
102-
<Plus className="h-3 w-3 mr-1" />
103-
[add task]
104-
</Button>
105-
</div>
106-
10780
<div className="py-4">
10881
{activeTab === 'projects' && (
10982
<div className="space-y-2">
@@ -133,16 +106,6 @@ export function Breadcrumbs({
133106
))}
134107
</div>
135108
)}
136-
<div className="mt-4 flex justify-end">
137-
<Button
138-
size="sm"
139-
onClick={onAddProject}
140-
className="font-mono text-xs uppercase tracking-[0.15em]"
141-
>
142-
<FolderPlus className="h-3 w-3 mr-1" />
143-
[add project]
144-
</Button>
145-
</div>
146109
</div>
147110
)}
148111

@@ -182,16 +145,6 @@ export function Breadcrumbs({
182145
))}
183146
</div>
184147
)}
185-
<div className="mt-4 flex justify-end">
186-
<Button
187-
size="sm"
188-
onClick={onAddTask}
189-
className="font-mono text-xs uppercase tracking-[0.15em]"
190-
>
191-
<Plus className="h-3 w-3 mr-1" />
192-
[add task]
193-
</Button>
194-
</div>
195148
</div>
196149
)}
197150

src/components/kanban/add-project-dialog.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,17 @@ export function AddProjectDialog({
6666

6767
return (
6868
<Dialog open={open} onOpenChange={setOpen}>
69-
<DialogTrigger asChild>
70-
<Button
71-
size="sm"
72-
variant="ghost"
73-
className="font-mono text-xs uppercase tracking-[0.15em] text-[rgba(255,255,255,0.6)] hover:text-[#FFFFFF] hover:bg-[rgba(255,255,255,0.05)]"
74-
>
75-
<FolderPlus className="h-4 w-4" />
76-
</Button>
77-
</DialogTrigger>
69+
{controlledOpen === undefined && (
70+
<DialogTrigger asChild>
71+
<Button
72+
size="sm"
73+
variant="ghost"
74+
className="font-mono text-xs uppercase tracking-[0.15em] text-[rgba(255,255,255,0.6)] hover:text-[#FFFFFF] hover:bg-[rgba(255,255,255,0.05)]"
75+
>
76+
<FolderPlus className="h-4 w-4" />
77+
</Button>
78+
</DialogTrigger>
79+
)}
7880
<DialogContent className="bg-[#0a0a0a] border border-[rgba(255,255,255,0.15)] text-[rgba(255,255,255,0.8)] font-mono">
7981
<form onSubmit={handleSubmit}>
8082
<DialogHeader>

src/components/kanban/add-task-dialog.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,14 @@ export function AddTaskDialog({ open: controlledOpen, onOpenChange, onAdd }: Add
4343

4444
return (
4545
<Dialog open={open} onOpenChange={(v) => !isLoading && setOpen(v)}>
46-
<DialogTrigger asChild>
47-
<Button size="sm" className="font-mono text-xs uppercase tracking-[0.15em]">
48-
<Plus className="h-4 w-4 mr-1" />
49-
[add task]
50-
</Button>
51-
</DialogTrigger>
46+
{controlledOpen === undefined && (
47+
<DialogTrigger asChild>
48+
<Button size="sm" className="font-mono text-xs uppercase tracking-[0.15em]">
49+
<Plus className="h-4 w-4 mr-1" />
50+
[add task]
51+
</Button>
52+
</DialogTrigger>
53+
)}
5254
<DialogContent className="bg-[#0a0a0a] border border-[rgba(255,255,255,0.15)] text-[rgba(255,255,255,0.8)] font-mono">
5355
<form onSubmit={handleSubmit}>
5456
<DialogHeader>

src/components/kanban/board.tsx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { invoke } from '@tauri-apps/api/core';
2+
import { FolderPlus, Plus } from 'lucide-react';
23
import { useCallback, useEffect, useMemo, useState } from 'react';
34

45
import { ActivityBar } from '@/components/activity-bar';
@@ -247,8 +248,6 @@ export function Board() {
247248
currentProjectId={currentProjectId}
248249
onProjectSelect={setCurrentProjectId}
249250
onTaskSelect={handleSelectTask}
250-
onAddProject={() => setAddProjectOpen(true)}
251-
onAddTask={() => setAddTaskOpen(true)}
252251
/>
253252
)}
254253
</header>
@@ -288,6 +287,25 @@ export function Board() {
288287
<p>{currentProjectId ? 'select a task to start' : 'select a project'}</p>
289288
</div>
290289
)}
290+
<div className="absolute bottom-4 right-4 z-10 flex items-center gap-2">
291+
<button
292+
type="button"
293+
onClick={() => setAddProjectOpen(true)}
294+
aria-label="add project"
295+
className="h-11 w-11 cursor-pointer rounded-lg border border-[rgba(255,255,255,0.15)] bg-[rgba(255,255,255,0.06)] text-[rgba(255,255,255,0.7)] transition-all duration-200 hover:border-[rgba(255,255,255,0.35)] hover:bg-[rgba(255,255,255,0.12)] hover:text-[#FFFFFF]"
296+
>
297+
<FolderPlus className="mx-auto h-4 w-4" />
298+
</button>
299+
<button
300+
type="button"
301+
onClick={() => setAddTaskOpen(true)}
302+
aria-label="add task"
303+
disabled={!currentProjectId}
304+
className="h-11 w-11 cursor-pointer rounded-lg border border-[rgba(0,255,0,0.45)] bg-[rgba(0,255,0,0.12)] text-[#00FF00] shadow-[0_0_10px_rgba(0,255,0,0.3)] transition-all duration-200 hover:bg-[rgba(0,255,0,0.2)] hover:shadow-[0_0_16px_rgba(0,255,0,0.45)] disabled:cursor-not-allowed disabled:border-[rgba(255,255,255,0.12)] disabled:bg-[rgba(255,255,255,0.06)] disabled:text-[rgba(255,255,255,0.35)] disabled:shadow-none"
305+
>
306+
<Plus className="mx-auto h-4 w-4" />
307+
</button>
308+
</div>
291309
</div>
292310
</div>
293311

0 commit comments

Comments
 (0)