Skip to content

Commit f414db3

Browse files
authored
Add dropdown item to copy name in table editor (supabase#31089)
* Add dropdown item to copy name in table editor * Fix duplicate key
1 parent a70eea0 commit f414db3

File tree

1 file changed

+76
-57
lines changed

1 file changed

+76
-57
lines changed

apps/studio/components/layouts/TableEditorLayout/EntityListItem.tsx

Lines changed: 76 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as Tooltip from '@radix-ui/react-tooltip'
22
import saveAs from 'file-saver'
33
import {
4+
Clipboard,
45
Copy,
56
Download,
67
Edit,
@@ -47,6 +48,7 @@ import {
4748
DropdownMenuTrigger,
4849
} from 'ui'
4950
import { useProjectContext } from '../ProjectLayout/ProjectContext'
51+
import { copyToClipboard } from 'lib/helpers'
5052

5153
export interface EntityListItemProps {
5254
id: number
@@ -65,6 +67,7 @@ const EntityListItem: ItemRenderer<Entity, EntityListItemProps> = ({
6567
const { selectedSchema } = useQuerySchemaState()
6668

6769
const isActive = Number(id) === entity.id
70+
const canEdit = isActive && !isLocked
6871

6972
const { data: lints = [] } = useProjectLintsQuery({
7073
projectRef: project?.ref,
@@ -213,23 +216,21 @@ const EntityListItem: ItemRenderer<Entity, EntityListItemProps> = ({
213216
switch (entity.type) {
214217
case ENTITY_TYPE.TABLE:
215218
if (tableHasLints) {
216-
tooltipContent = 'RLS Disabled'
219+
tooltipContent = 'RLS disabled'
217220
}
218221
break
219222
case ENTITY_TYPE.VIEW:
220223
if (viewHasLints) {
221-
tooltipContent = 'Security Definer view'
224+
tooltipContent = 'Security definer view'
222225
}
223226
break
224227
case ENTITY_TYPE.MATERIALIZED_VIEW:
225228
if (materializedViewHasLints) {
226-
tooltipContent = 'Security Definer view'
229+
tooltipContent = 'Security definer view'
227230
}
228-
229231
break
230232
case ENTITY_TYPE.FOREIGN_TABLE:
231233
tooltipContent = 'RLS is not enforced on foreign tables'
232-
233234
break
234235
default:
235236
break
@@ -355,85 +356,103 @@ const EntityListItem: ItemRenderer<Entity, EntityListItemProps> = ({
355356
<EntityTooltipTrigger entity={entity} />
356357
</div>
357358

358-
{entity.type === ENTITY_TYPE.TABLE && isActive && !isLocked && (
359+
{canEdit && (
359360
<DropdownMenu>
360361
<DropdownMenuTrigger className="text-foreground-lighter transition-all hover:text-foreground data-[state=open]:text-foreground">
361362
<MoreHorizontal size={14} strokeWidth={2} />
362363
</DropdownMenuTrigger>
363364
<DropdownMenuContent side="bottom" align="start" className="w-44">
364365
<DropdownMenuItem
365-
key="edit-table"
366-
className="space-x-2"
367-
onClick={(e) => {
368-
e.stopPropagation()
369-
snap.onEditTable()
370-
}}
371-
>
372-
<Edit size={12} />
373-
<span>Edit Table</span>
374-
</DropdownMenuItem>
375-
<DropdownMenuItem
376-
key="duplicate-table"
366+
key="copy-name"
377367
className="space-x-2"
378368
onClick={(e) => {
379369
e.stopPropagation()
380-
snap.onDuplicateTable()
370+
copyToClipboard(entity.name)
381371
}}
382372
>
383-
<Copy size={12} />
384-
<span>Duplicate Table</span>
385-
</DropdownMenuItem>
386-
<DropdownMenuItem key="view-policies" className="space-x-2" asChild>
387-
<Link
388-
key="view-policies"
389-
href={`/project/${projectRef}/auth/policies?schema=${selectedSchema}&search=${entity.id}`}
390-
>
391-
<Lock size={12} />
392-
<span>View Policies</span>
393-
</Link>
373+
<Clipboard size={12} />
374+
<span>Copy name</span>
394375
</DropdownMenuItem>
395376

396-
<DropdownMenuSub>
397-
<DropdownMenuSubTrigger className="gap-x-2">
398-
<Download size={12} />
399-
Export Data
400-
</DropdownMenuSubTrigger>
401-
<DropdownMenuSubContent>
377+
{entity.type === ENTITY_TYPE.TABLE && (
378+
<>
379+
<DropdownMenuSeparator />
380+
402381
<DropdownMenuItem
403-
key="download-table-csv"
382+
key="edit-table"
404383
className="space-x-2"
405384
onClick={(e) => {
406385
e.stopPropagation()
407-
exportTableAsCSV()
386+
snap.onEditTable()
408387
}}
409388
>
410-
<span>Export table as CSV</span>
389+
<Edit size={12} />
390+
<span>Edit table</span>
411391
</DropdownMenuItem>
412392
<DropdownMenuItem
413-
key="download-table-sql"
414-
className="gap-x-2"
393+
key="duplicate-table"
394+
className="space-x-2"
415395
onClick={(e) => {
416396
e.stopPropagation()
417-
exportTableAsSQL()
397+
snap.onDuplicateTable()
418398
}}
419399
>
420-
<span>Export table as SQL</span>
400+
<Copy size={12} />
401+
<span>Duplicate table</span>
402+
</DropdownMenuItem>
403+
<DropdownMenuItem key="view-policies" className="space-x-2" asChild>
404+
<Link
405+
key="view-policies"
406+
href={`/project/${projectRef}/auth/policies?schema=${selectedSchema}&search=${entity.id}`}
407+
>
408+
<Lock size={12} />
409+
<span>View policies</span>
410+
</Link>
421411
</DropdownMenuItem>
422-
</DropdownMenuSubContent>
423-
</DropdownMenuSub>
424412

425-
<DropdownMenuSeparator />
426-
<DropdownMenuItem
427-
key="delete-table"
428-
className="gap-x-2"
429-
onClick={(e) => {
430-
e.stopPropagation()
431-
snap.onDeleteTable()
432-
}}
433-
>
434-
<Trash size={12} />
435-
<span>Delete Table</span>
436-
</DropdownMenuItem>
413+
<DropdownMenuSub>
414+
<DropdownMenuSubTrigger className="gap-x-2">
415+
<Download size={12} />
416+
Export data
417+
</DropdownMenuSubTrigger>
418+
<DropdownMenuSubContent>
419+
<DropdownMenuItem
420+
key="download-table-csv"
421+
className="space-x-2"
422+
onClick={(e) => {
423+
e.stopPropagation()
424+
exportTableAsCSV()
425+
}}
426+
>
427+
<span>Export table as CSV</span>
428+
</DropdownMenuItem>
429+
<DropdownMenuItem
430+
key="download-table-sql"
431+
className="gap-x-2"
432+
onClick={(e) => {
433+
e.stopPropagation()
434+
exportTableAsSQL()
435+
}}
436+
>
437+
<span>Export table as SQL</span>
438+
</DropdownMenuItem>
439+
</DropdownMenuSubContent>
440+
</DropdownMenuSub>
441+
442+
<DropdownMenuSeparator />
443+
<DropdownMenuItem
444+
key="delete-table"
445+
className="gap-x-2"
446+
onClick={(e) => {
447+
e.stopPropagation()
448+
snap.onDeleteTable()
449+
}}
450+
>
451+
<Trash size={12} />
452+
<span>Delete table</span>
453+
</DropdownMenuItem>
454+
</>
455+
)}
437456
</DropdownMenuContent>
438457
</DropdownMenu>
439458
)}

0 commit comments

Comments
 (0)