Skip to content

Commit 921301c

Browse files
committed
feat: implemented dropdown-menu
1 parent 876fbf2 commit 921301c

File tree

5 files changed

+290
-246
lines changed

5 files changed

+290
-246
lines changed

package-lock.json

Lines changed: 143 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
},
1414
"dependencies": {
1515
"@radix-ui/react-dialog": "^1.1.6",
16+
"@radix-ui/react-dropdown-menu": "^2.1.6",
1617
"@radix-ui/react-label": "^2.1.2",
1718
"@radix-ui/react-popover": "^1.1.6",
1819
"@radix-ui/react-slot": "^1.1.2",

src/components/statements/StatementItem.tsx

Lines changed: 49 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@ import { Input } from '../ui/input';
33
import { Button } from '../ui/button';
44
import SubjectSelector from '../ui/subject-selector';
55
import VerbSelector from '../ui/VerbSelector';
6-
import { Trash2, Edit2, Save, Eye, EyeOff } from 'lucide-react';
6+
import { Trash2, Edit2, Save, Eye, EyeOff, MoreVertical } from 'lucide-react';
77
import type { Statement } from '../../../types/types';
8+
import {
9+
DropdownMenu,
10+
DropdownMenuTrigger,
11+
DropdownMenuContent,
12+
DropdownMenuItem,
13+
} from '../ui/dropdown-menu';
814

915
export interface StatementItemProps {
1016
statement: Statement;
@@ -47,6 +53,19 @@ const StatementItem: React.FC<StatementItemProps> = ({
4753
if (isEditing) {
4854
return (
4955
<div className='flex items-center space-x-2 bg-gray-100 p-2 rounded'>
56+
{/* Privacy toggle button */}
57+
<Button
58+
variant='ghost'
59+
size='sm'
60+
onClick={() => onTogglePublic(statement.id)}
61+
className={`${
62+
statement.isPublic
63+
? 'bg-green-50 text-green-500'
64+
: 'bg-gray-50 text-gray-500'
65+
} hover:bg-opacity-75 rounded-md px-3 py-2`}
66+
>
67+
{statement.isPublic ? <Eye size={16} /> : <EyeOff size={16} />}
68+
</Button>
5069
<div className='flex flex-1 items-center space-x-2'>
5170
{/* Subject */}
5271
<div
@@ -60,7 +79,7 @@ const StatementItem: React.FC<StatementItemProps> = ({
6079
onPartUpdate(statement.id, 'subject', value)
6180
}
6281
onAddDescriptor={() => {}}
63-
// Here we assume the username is derived from the subject string.
82+
// Assume the username is derived from the subject string.
6483
username={statement.subject.split("'s")[0] || statement.subject}
6584
/>
6685
) : (
@@ -103,18 +122,6 @@ const StatementItem: React.FC<StatementItemProps> = ({
103122
</div>
104123
</div>
105124
<div className='flex items-center space-x-2 ml-auto'>
106-
<Button
107-
variant='ghost'
108-
size='sm'
109-
onClick={() => onTogglePublic(statement.id)}
110-
className={`${
111-
statement.isPublic
112-
? 'bg-green-50 text-green-500'
113-
: 'bg-gray-50 text-gray-500'
114-
} hover:bg-opacity-75 rounded-md px-3 py-2`}
115-
>
116-
{statement.isPublic ? <Eye size={16} /> : <EyeOff size={16} />}
117-
</Button>
118125
<Button
119126
variant='ghost'
120127
size='sm'
@@ -136,34 +143,38 @@ const StatementItem: React.FC<StatementItemProps> = ({
136143
);
137144
}
138145

139-
// Static view when not in editing mode
146+
// Static view when not in editing mode with grouped Edit and Delete
140147
return (
141148
<div className='flex justify-between items-center bg-gray-100 p-2 rounded'>
149+
<span
150+
className={`inline-flex items-center justify-center px-3 py-2 ${
151+
statement.isPublic ? 'text-green-500' : 'text-gray-400'
152+
}`}
153+
>
154+
{statement.isPublic ? <Eye size={16} /> : <EyeOff size={16} />}
155+
</span>
142156
<span className='flex-1'>{`${statement.subject} ${statement.verb} ${statement.object}`}</span>
143157
<div className='flex items-center space-x-2 ml-auto'>
144-
<span
145-
className={`inline-flex items-center justify-center px-3 py-2 ${
146-
statement.isPublic ? 'text-green-500' : 'text-gray-400'
147-
}`}
148-
>
149-
{statement.isPublic ? <Eye size={16} /> : <EyeOff size={16} />}
150-
</span>
151-
<Button
152-
variant='ghost'
153-
size='sm'
154-
onClick={() => onEditClick(statement.id)}
155-
className='text-blue-500 hover:text-blue-700'
156-
>
157-
<Edit2 size={16} />
158-
</Button>
159-
<Button
160-
variant='ghost'
161-
size='sm'
162-
onClick={() => onDelete(statement.id)}
163-
className='text-red-500 hover:text-red-700'
164-
>
165-
<Trash2 size={16} />
166-
</Button>
158+
<DropdownMenu>
159+
<DropdownMenuTrigger asChild>
160+
<button onClick={(e) => e.stopPropagation()}>
161+
<MoreVertical size={18} className='text-gray-500' />
162+
</button>
163+
</DropdownMenuTrigger>
164+
<DropdownMenuContent align='end'>
165+
<DropdownMenuItem onClick={() => onEditClick(statement.id)}>
166+
<Edit2 className='mr-2 h-4 w-4' />
167+
Edit
168+
</DropdownMenuItem>
169+
<DropdownMenuItem
170+
onClick={() => onDelete(statement.id)}
171+
className='text-red-600'
172+
>
173+
<Trash2 className='mr-2 h-4 w-4' />
174+
Delete
175+
</DropdownMenuItem>
176+
</DropdownMenuContent>
177+
</DropdownMenu>
167178
</div>
168179
</div>
169180
);

0 commit comments

Comments
 (0)