RowContextMenu() — supabase Function Reference
Architecture documentation for the RowContextMenu() function in RowContextMenu.tsx from the supabase codebase.
Entity Profile
Dependency Diagram
graph TD 908a5ebe_ce3a_e714_7919_0dc2973b8bf5["RowContextMenu()"] a07b64db_a96e_da6c_ec6f_64cb1f1ba8c9["formatClipboardValue()"] 908a5ebe_ce3a_e714_7919_0dc2973b8bf5 -->|calls| a07b64db_a96e_da6c_ec6f_64cb1f1ba8c9 style 908a5ebe_ce3a_e714_7919_0dc2973b8bf5 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
apps/studio/components/grid/components/menu/RowContextMenu.tsx lines 23–120
export const RowContextMenu = ({ rows }: RowContextMenuProps) => {
const queryClient = useQueryClient()
const { data: project } = useSelectedProjectQuery()
const tableEditorSnap = useTableEditorStateSnapshot()
const snap = useTableEditorTableStateSnapshot()
const isQueueOperationsEnabled = useIsQueueOperationsEnabled()
function onDeleteRow(p: RowContextMenuItemProps) {
const rowIdx = p.props?.rowIdx
if (rowIdx === undefined || rowIdx === null) return
const row = rows[rowIdx]
if (!row) {
toast.error('Row not found')
return
}
if (isQueueOperationsEnabled) {
queueRowDeletesWithOptimisticUpdate({
rows: [row],
table: snap.originalTable,
queryClient,
queueOperation: tableEditorSnap.queueOperation,
projectRef: project?.ref,
})
return
}
tableEditorSnap.onDeleteRows([row])
}
function onEditRowClick(p: RowContextMenuItemProps) {
const rowIdx = p.props?.rowIdx
if (rowIdx === undefined || rowIdx === null) return
const row = rows[rowIdx]
tableEditorSnap.onEditRow(row)
}
const onCopyCellContent = useCallback(
(p: RowContextMenuItemProps) => {
const rowIdx = p.props?.rowIdx
if (!snap.selectedCellPosition || rowIdx === undefined || rowIdx === null) return
const row = rows[rowIdx]
const columnKey = snap.gridColumns[snap.selectedCellPosition.idx as number].key
const value = row[columnKey]
const text = formatClipboardValue(value)
copyToClipboard(text)
toast.success('Copied cell value to clipboard')
},
[rows, snap.gridColumns, snap.selectedCellPosition]
)
const onCopyRowContent = useCallback(
(p: RowContextMenuItemProps) => {
const rowIdx = p.props?.rowIdx
if (rowIdx === undefined || rowIdx === null) return
const row = rows[rowIdx]
copyToClipboard(JSON.stringify(row))
toast.success('Copied row to clipboard')
},
[rows]
)
return (
<Menu id={ROW_CONTEXT_MENU_ID} animation={false} className="!min-w-36">
<Item onClick={onCopyCellContent}>
<Copy size={12} />
<span className="ml-2 text-xs">Copy cell</span>
</Item>
<Item onClick={onCopyRowContent}>
<Copy size={12} />
<span className="ml-2 text-xs">Copy row</span>
</Item>
{/* We can't just wrap this entire section in a fragment conditional
on snap.editable because of a bug in react-contexify. Only the
top-level children of Menu are cloned with the necessary bound props,
so Items must be direct children of Menu:
https://github.com/fkhadra/react-contexify/blob/8d9fc63ac13040d3250e8eefd593d50a3ebdd1e6/src/components/Menu.tsx#L295
*/}
{snap.editable && <DialogSectionSeparator className="my-1.5" />}
<Item onClick={onEditRowClick} hidden={!snap.editable} data="edit">
<Edit size={12} />
<span className="ml-2 text-xs">Edit row</span>
</Item>
{snap.editable && <DialogSectionSeparator className="my-1.5" />}
<Item onClick={onDeleteRow} hidden={!snap.editable} data="delete">
<Trash size={12} />
<span className="ml-2 text-xs">Delete row</span>
</Item>
</Menu>
)
}
Domain
Subdomains
Calls
Source
Frequently Asked Questions
What does RowContextMenu() do?
RowContextMenu() is a function in the supabase codebase.
What does RowContextMenu() call?
RowContextMenu() calls 1 function(s): formatClipboardValue.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free