diff --git a/apps/studio/components/grid/components/formatter/JsonFormatter.tsx b/apps/studio/components/grid/components/formatter/JsonFormatter.tsx
index f54c207efbe..985e7e7d94a 100644
--- a/apps/studio/components/grid/components/formatter/JsonFormatter.tsx
+++ b/apps/studio/components/grid/components/formatter/JsonFormatter.tsx
@@ -2,14 +2,23 @@ import { PropsWithChildren } from 'react'
import type { RenderCellProps } from 'react-data-grid'
import type { SupaRow } from '../../types'
+import { isColumnMasked } from '../../utils/sensitive-data'
import { EmptyValue } from '../common/EmptyValue'
import { NullValue } from '../common/NullValue'
+import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table'
export const JsonFormatter = (p: PropsWithChildren
>) => {
+ const snap = useTableEditorTableStateSnapshot()
let value = p.row[p.column.key]
+ const isMasked = isColumnMasked(
+ p.column.key as string,
+ snap.sensitiveDataColumns,
+ snap.temporarilyRevealedColumns
+ )
if (value === null) return
if (value === '') return
+ if (isMasked) return <>••••••••>
// [Joshen] With reference to table-rows-query, we're only pulling max n characters on text/jsonb columns
// If column value is longer, value will be concatenated with ..., and we just want to make sure the JSON
diff --git a/apps/studio/components/grid/components/grid/Grid.tsx b/apps/studio/components/grid/components/grid/Grid.tsx
index 9544be6d7ef..37253f80afd 100644
--- a/apps/studio/components/grid/components/grid/Grid.tsx
+++ b/apps/studio/components/grid/components/grid/Grid.tsx
@@ -429,6 +429,7 @@ export const Grid = memo(
rows: rows ?? [],
columns: snap.table.columns,
onRowsChange,
+ sensitiveDataColumns: snap.sensitiveDataColumns,
})
}
/>
diff --git a/apps/studio/components/grid/components/menu/ColumnMenu.tsx b/apps/studio/components/grid/components/menu/ColumnMenu.tsx
index 968cc98afc7..ba3e891602d 100644
--- a/apps/studio/components/grid/components/menu/ColumnMenu.tsx
+++ b/apps/studio/components/grid/components/menu/ColumnMenu.tsx
@@ -1,5 +1,7 @@
-import { ArrowDown, ArrowUp, ChevronDown, Copy, Edit, Lock, Trash, Unlock } from 'lucide-react'
+import { ArrowDown, ArrowUp, ChevronDown, Copy, Edit, Eye, Lock, Trash, Unlock } from 'lucide-react'
+import { useContext, useEffect, useState } from 'react'
import type { CalculatedColumn } from 'react-data-grid'
+import { toast } from 'sonner'
import {
Button,
cn,
@@ -17,7 +19,10 @@ import {
import { useTableSort } from '@/components/grid/hooks/useTableSort'
import type { Sort } from '@/components/grid/types'
import { useTableEditorStateSnapshot } from '@/state/table-editor'
-import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table'
+import {
+ TableEditorTableStateContext,
+ useTableEditorTableStateSnapshot,
+} from '@/state/table-editor-table'
interface ColumnMenuProps {
column: CalculatedColumn
@@ -27,7 +32,11 @@ interface ColumnMenuProps {
export const ColumnMenu = ({ column, isEncrypted }: ColumnMenuProps) => {
const tableEditorSnap = useTableEditorStateSnapshot()
const snap = useTableEditorTableStateSnapshot()
+ const state = useContext(TableEditorTableStateContext)
const { sorts, addOrUpdateSort, removeSort } = useTableSort()
+ const [tempRevealTimeouts, setTempRevealTimeouts] = useState