ObservabilityMenuItem.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import { PermissionAction } from '@supabase/shared-types/out/constants'
  2. import { Edit2, MoreVertical, Trash } from 'lucide-react'
  3. import Link from 'next/link'
  4. import {
  5. Button,
  6. DropdownMenu,
  7. DropdownMenuContent,
  8. DropdownMenuItem,
  9. DropdownMenuSeparator,
  10. DropdownMenuTrigger,
  11. Menu,
  12. } from 'ui'
  13. import { ContentBase } from '@/data/content/content-query'
  14. import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions'
  15. import { useProfile } from '@/lib/profile'
  16. import type { Dashboards } from '@/types'
  17. interface ReportMenuItemProps {
  18. item: {
  19. id?: string
  20. name: string
  21. description: string
  22. key: string
  23. url: string
  24. hasDropdownActions: boolean
  25. report: ContentBase & {
  26. type: 'report'
  27. content: Dashboards.Content
  28. }
  29. }
  30. pageKey: string
  31. onSelectEdit: () => void
  32. onSelectDelete: () => void
  33. }
  34. export const ObservabilityMenuItem = ({
  35. item,
  36. pageKey,
  37. onSelectEdit,
  38. onSelectDelete,
  39. }: ReportMenuItemProps) => {
  40. const { profile } = useProfile()
  41. const { can: canUpdateCustomReport } = useAsyncCheckPermissions(
  42. PermissionAction.UPDATE,
  43. 'user_content',
  44. {
  45. resource: {
  46. type: 'report',
  47. visibility: item.report.visibility,
  48. owner_id: item.report.owner_id,
  49. },
  50. subject: { id: profile?.id },
  51. }
  52. )
  53. const menuItem = (
  54. <Menu.Item active={item.key === pageKey}>
  55. <div className="flex w-full items-center justify-between gap-1">
  56. <span className="truncate">{item.name}</span>
  57. {canUpdateCustomReport && (
  58. <DropdownMenu>
  59. <DropdownMenuTrigger asChild>
  60. <Button
  61. type="text"
  62. className="px-1 opacity-50 hover:opacity-100"
  63. icon={<MoreVertical size={12} strokeWidth={2} />}
  64. onClick={(e) => {
  65. e.preventDefault()
  66. e.stopPropagation()
  67. }}
  68. />
  69. </DropdownMenuTrigger>
  70. <DropdownMenuContent align="start" className="w-32 *:gap-x-2">
  71. <DropdownMenuItem
  72. onClick={(e) => {
  73. e.preventDefault()
  74. e.stopPropagation()
  75. if (!item.id) return
  76. onSelectEdit()
  77. }}
  78. >
  79. <Edit2 size={12} />
  80. <div>Rename report</div>
  81. </DropdownMenuItem>
  82. <DropdownMenuSeparator />
  83. <DropdownMenuItem
  84. onClick={(e) => {
  85. e.preventDefault()
  86. e.stopPropagation()
  87. if (!item.id) return
  88. onSelectDelete()
  89. }}
  90. >
  91. <Trash size={12} />
  92. <div>Delete report</div>
  93. </DropdownMenuItem>
  94. </DropdownMenuContent>
  95. </DropdownMenu>
  96. )}
  97. </div>
  98. </Menu.Item>
  99. )
  100. return (
  101. <Link key={item.key + '-menukey'} href={item.url} className="block">
  102. {menuItem}
  103. </Link>
  104. )
  105. }