Skip to content

Commit ddedae5

Browse files
SaxonFjoshenlim
andauthored
Add link to function and table editor (supabase#40068)
* add link to function and table editor * Tiny refactor --------- Co-authored-by: Joshen Lim <[email protected]>
1 parent bf9c996 commit ddedae5

File tree

4 files changed

+52
-32
lines changed

4 files changed

+52
-32
lines changed

apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import { PostgresTrigger } from '@supabase/postgres-meta'
12
import { PermissionAction } from '@supabase/shared-types/out/constants'
23
import { includes, sortBy } from 'lodash'
34
import { Check, Copy, Edit, Edit2, MoreVertical, Trash, X } from 'lucide-react'
45

5-
import { ButtonTooltip } from 'components/ui/ButtonTooltip'
6+
import { useParams } from 'common'
67
import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider'
8+
import { ButtonTooltip } from 'components/ui/ButtonTooltip'
9+
import { InlineLink } from 'components/ui/InlineLink'
710
import { useDatabaseTriggersQuery } from 'data/database-triggers/database-triggers-query'
811
import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions'
912
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
@@ -24,7 +27,6 @@ import {
2427
TooltipTrigger,
2528
} from 'ui'
2629
import { generateTriggerCreateSQL } from './TriggerList.utils'
27-
import { PostgresTrigger } from '@supabase/postgres-meta'
2830

2931
interface TriggerListProps {
3032
schema: string
@@ -35,18 +37,24 @@ interface TriggerListProps {
3537
deleteTrigger: (trigger: PostgresTrigger) => void
3638
}
3739

38-
const TriggerList = ({
40+
export const TriggerList = ({
3941
schema,
4042
filterString,
4143
isLocked,
4244
editTrigger,
4345
duplicateTrigger,
4446
deleteTrigger,
4547
}: TriggerListProps) => {
48+
const { ref: projectRef } = useParams()
4649
const { data: project } = useSelectedProjectQuery()
4750
const aiSnap = useAiAssistantStateSnapshot()
4851
const { openSidebar } = useSidebarManagerSnapshot()
4952

53+
const { can: canUpdateTriggers } = useAsyncCheckPermissions(
54+
PermissionAction.TENANT_SQL_ADMIN_WRITE,
55+
'triggers'
56+
)
57+
5058
const { data: triggers } = useDatabaseTriggersQuery({
5159
projectRef: project?.ref,
5260
connectionString: project?.connectionString,
@@ -56,15 +64,10 @@ const TriggerList = ({
5664
includes(x.name.toLowerCase(), filterString.toLowerCase()) ||
5765
(x.function_name && includes(x.function_name.toLowerCase(), filterString.toLowerCase()))
5866
)
59-
6067
const _triggers = sortBy(
6168
filteredTriggers.filter((x) => x.schema == schema),
6269
(trigger) => trigger.name.toLocaleLowerCase()
6370
)
64-
const { can: canUpdateTriggers } = useAsyncCheckPermissions(
65-
PermissionAction.TENANT_SQL_ADMIN_WRITE,
66-
'triggers'
67-
)
6871

6972
if (_triggers.length === 0 && filterString.length === 0) {
7073
return (
@@ -94,7 +97,7 @@ const TriggerList = ({
9497

9598
return (
9699
<>
97-
{_triggers.map((x: any) => (
100+
{_triggers.map((x) => (
98101
<TableRow key={x.id}>
99102
<TableCell className="space-x-2">
100103
<Tooltip>
@@ -111,15 +114,33 @@ const TriggerList = ({
111114
</TableCell>
112115

113116
<TableCell className="break-all">
114-
<p title={x.table} className="truncate">
115-
{x.table}
116-
</p>
117+
{x.table_id ? (
118+
<InlineLink
119+
title={x.table}
120+
href={`/project/${projectRef}/editor/${x.table_id}`}
121+
className="truncate block max-w-40"
122+
>
123+
{x.table}
124+
</InlineLink>
125+
) : (
126+
<p title={x.table} className="truncate">
127+
{x.table}
128+
</p>
129+
)}
117130
</TableCell>
118131

119132
<TableCell className="space-x-2">
120-
<p title={x.function_name} className="truncate">
121-
{x.function_name}
122-
</p>
133+
{x.function_name ? (
134+
<InlineLink
135+
title={x.function_name}
136+
href={`/project/${projectRef}/database/functions?search=${x.function_name}&schema=${x.function_schema}`}
137+
className="truncate block max-w-40"
138+
>
139+
{x.function_name}
140+
</InlineLink>
141+
) : (
142+
<p className="truncate text-foreground-light">-</p>
143+
)}
123144
</TableCell>
124145

125146
<TableCell>
@@ -176,7 +197,7 @@ const TriggerList = ({
176197
const sql = generateTriggerCreateSQL(x)
177198
openSidebar(SIDEBAR_KEYS.AI_ASSISTANT)
178199
aiSnap.newChat({
179-
name: `Update trigger ${X.name}`,
200+
name: `Update trigger ${x.name}`,
180201
initialInput: `Update this trigger which exists on the ${x.schema}.${x.table} table to...`,
181202
suggestions: {
182203
title:
@@ -237,5 +258,3 @@ const TriggerList = ({
237258
</>
238259
)
239260
}
240-
241-
export default TriggerList

apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@ import { noop } from 'lodash'
44
import { DatabaseZap, FunctionSquare, Plus, Search, Shield } from 'lucide-react'
55
import { parseAsString, useQueryState } from 'nuqs'
66

7-
import AlphaPreview from 'components/to-be-cleaned/AlphaPreview'
8-
import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState'
7+
import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider'
98
import AlertError from 'components/ui/AlertError'
109
import { ButtonTooltip } from 'components/ui/ButtonTooltip'
1110
import SchemaSelector from 'components/ui/SchemaSelector'
1211
import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader'
13-
import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider'
1412
import { useDatabaseTriggersQuery } from 'data/database-triggers/database-triggers-query'
1513
import { useTablesQuery } from 'data/tables/tables-query'
1614
import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions'
@@ -21,10 +19,7 @@ import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state'
2119
import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state'
2220
import {
2321
AiIconAnimation,
24-
Button,
2522
Card,
26-
CardContent,
27-
cn,
2823
Input,
2924
Table,
3025
TableBody,
@@ -33,8 +28,7 @@ import {
3328
TableRow,
3429
} from 'ui'
3530
import { ProtectedSchemaWarning } from '../../ProtectedSchemaWarning'
36-
import TriggerList from './TriggerList'
37-
import Link from 'next/link'
31+
import { TriggerList } from './TriggerList'
3832

3933
interface TriggersListProps {
4034
createTrigger: () => void
@@ -43,7 +37,7 @@ interface TriggersListProps {
4337
deleteTrigger: (trigger: PostgresTrigger) => void
4438
}
4539

46-
const TriggersList = ({
40+
export const TriggersList = ({
4741
createTrigger = noop,
4842
editTrigger = noop,
4943
duplicateTrigger = noop,
@@ -248,5 +242,3 @@ const TriggersList = ({
248242
</div>
249243
)
250244
}
251-
252-
export default TriggersList

apps/studio/components/ui/InlineLink.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ interface InlineLinkProps {
77
className?: string
88
target?: string
99
rel?: string
10+
title?: string
1011
onClick?: () => void
1112
}
1213

@@ -17,18 +18,26 @@ export const InlineLink = ({
1718
href,
1819
className: _className,
1920
children,
21+
title,
2022
...props
2123
}: PropsWithChildren<InlineLinkProps>) => {
2224
const className = cn(InlineLinkClassName, _className)
2325
if (href.startsWith('http')) {
2426
return (
25-
<a className={className} href={href} target="_blank" rel="noreferrer noopener" {...props}>
27+
<a
28+
title={title}
29+
className={className}
30+
href={href}
31+
target="_blank"
32+
rel="noreferrer noopener"
33+
{...props}
34+
>
2635
{children}
2736
</a>
2837
)
2938
}
3039
return (
31-
<Link className={className} href={href} {...props}>
40+
<Link className={className} href={href} title={title} {...props}>
3241
{children}
3342
</Link>
3443
)

apps/studio/pages/project/[ref]/database/triggers.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { useIsInlineEditorEnabled } from 'components/interfaces/App/FeaturePrevi
66
import { DeleteTrigger } from 'components/interfaces/Database/Triggers/DeleteTrigger'
77
import { TriggerSheet } from 'components/interfaces/Database/Triggers/TriggerSheet'
88
import { generateTriggerCreateSQL } from 'components/interfaces/Database/Triggers/TriggersList/TriggerList.utils'
9-
import TriggersList from 'components/interfaces/Database/Triggers/TriggersList/TriggersList'
9+
import { TriggersList } from 'components/interfaces/Database/Triggers/TriggersList/TriggersList'
1010
import DatabaseLayout from 'components/layouts/DatabaseLayout/DatabaseLayout'
1111
import DefaultLayout from 'components/layouts/DefaultLayout'
1212
import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider'

0 commit comments

Comments
 (0)