import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { includes, sortBy } from 'lodash' import { Check, Copy, Edit, Edit2, MoreVertical, Trash, X } from 'lucide-react' import Link from 'next/link' import { parseAsJson, parseAsString, useQueryState } from 'nuqs' import { Badge, Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, TableCell, TableRow, } from 'ui' import { generateTriggerCreateSQL, getDatabaseFunctionsHref, type PostgresTrigger, } from './TriggerList.utils' import { selectFilterSchema } from '@/components/interfaces/Reports/v2/ReportsSelectFilter' import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { useDatabaseTriggersQuery } from '@/data/database-triggers/database-triggers-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface TriggerListProps { editTrigger: (trigger: PostgresTrigger) => void duplicateTrigger: (trigger: PostgresTrigger) => void deleteTrigger: (trigger: PostgresTrigger) => void } export const TriggerList = ({ editTrigger, duplicateTrigger, deleteTrigger }: TriggerListProps) => { const { ref: projectRef } = useParams() const { data: project } = useSelectedProjectQuery() const aiSnap = useAiAssistantStateSnapshot() const { openSidebar } = useSidebarManagerSnapshot() const { can: canUpdateTriggers } = useAsyncCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'triggers' ) const { selectedSchema: schema } = useQuerySchemaState() const { isSchemaLocked: isLocked } = useIsProtectedSchema({ schema }) const [filterString] = useQueryState('search', parseAsString.withDefault('')) const [tablesFilter] = useQueryState( 'tables', parseAsJson(selectFilterSchema.parse).withDefault([]) ) const { data: triggers } = useDatabaseTriggersQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) const filteredTriggers = (triggers ?? []).filter((x) => { const search = filterString?.toLowerCase() const matchesSearch = !search || x.name.toLowerCase().includes(search) || (!!x.function_name && includes(x.function_name.toLowerCase(), search)) const matchesTables = !tablesFilter?.length || tablesFilter.includes(x.table) return matchesSearch && matchesTables }) const _triggers = sortBy( filteredTriggers.filter((x) => x.schema == schema), (trigger) => trigger.name.toLocaleLowerCase() ) if (_triggers.length === 0 && filterString.length === 0) { return (

No triggers created yet

There are no triggers found in the schema "{schema}"

) } if (_triggers.length === 0 && filterString.length > 0) { return (

No results found

Your search for "{filterString}" did not return any results

) } return ( <> {_triggers.map((x) => ( {x.table_id ? ( {x.table} ) : (

{x.table}

)}
{x.function_name ? ( {x.function_name} ) : (

-

)}
{x.events.map((event: string) => ( {`${x.activation} ${event}`} ))}

{x.orientation}

{x.enabled_mode !== 'DISABLED' ? ( ) : ( )}
{!isLocked && (
{canUpdateTriggers ? (
)}
))} ) }