From 64c37ca72b409d00c64fa85cf4e3372833083f80 Mon Sep 17 00:00:00 2001
From: Danny White <3104761+dnywh@users.noreply.github.com>
Date: Thu, 26 Mar 2026 10:48:15 +1100
Subject: [PATCH] chore(studio): database tables UI improvements (#44163)
## What kind of change does this PR introduce?
UI improvements
## What is the current behavior?
- The database tables list and columns list use inconsistent page shells
and table primitives
- The child columns page has weaker information hierarchy and row
actions than the parent tables page
- Responsive column priority on the tables list does not reflect the
most important data on smaller breakpoints
- Table actions and counts are harder to scan than they should be
## What is the new behavior?
- Both pages now use `PageLayout` with matching large-width content
containers
- `ColumnList` now uses the latest `ui` Table primitives instead of the
legacy cleaned-up-later table
- Both pages now show totals in a table footer
- `ColumnList` now uses a tiny filter input, case-insensitive filtering,
inline descriptions under the name, and a primary `Edit` button with
overflow actions
- `TableList` now has improved responsive column priority:
- smallest breakpoint keeps `Rows`
- `Columns` appears from `sm`
- `Size` appears from `lg`
- `Realtime Enabled` appears from `2xl`
- `TableList` now uses `View columns` as the CTA, removes the ambiguous
icon from that CTA, restores the entity icon from `sm` upwards only, and
tightens the name column on the smallest breakpoint only
- Boolean icon columns are right-aligned consistently, with the same
Realtime icon tones applied to both `Realtime Enabled` and `Nullable`
- The columns detail page now uses breadcrumbs for navigation back to
Tables instead of an inline back button
| Before | After |
| --- | --- |
| | |
| | |
---------
Co-authored-by: Joshen Lim
---
.../interfaces/Database/Tables/ColumnList.tsx | 291 +++++++++++-------
.../interfaces/Database/Tables/TableList.tsx | 136 ++++----
.../project/[ref]/database/tables/[id].tsx | 50 +--
.../project/[ref]/database/tables/index.tsx | 58 ++--
e2e/studio/features/database.spec.ts | 96 +++---
e2e/studio/utils/wait-for-response.ts | 18 +-
6 files changed, 355 insertions(+), 294 deletions(-)
diff --git a/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx b/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx
index 8a836b701cc..622161c0f39 100644
--- a/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx
+++ b/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx
@@ -1,12 +1,6 @@
-import { PermissionAction } from '@supabase/shared-types/out/constants'
-import { noop } from 'lodash'
-import { Check, ChevronLeft, Edit, MoreVertical, Plus, Search, Trash, X } from 'lucide-react'
-import Link from 'next/link'
-import { useState } from 'react'
-
import { PostgresColumn } from '@supabase/postgres-meta'
+import { PermissionAction } from '@supabase/shared-types/out/constants'
import { useParams } from 'common'
-import Table from 'components/to-be-cleaned/Table'
import AlertError from 'components/ui/AlertError'
import { ButtonTooltip } from 'components/ui/ButtonTooltip'
import { NoSearchResults } from 'components/ui/NoSearchResults'
@@ -15,18 +9,30 @@ import { isTableLike } from 'data/table-editor/table-editor-types'
import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions'
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
import { useIsProtectedSchema } from 'hooks/useProtectedSchemas'
+import { noop } from 'lodash'
+import { Check, Edit, MoreVertical, Plus, Search, Trash, X } from 'lucide-react'
+import { useState } from 'react'
import {
Button,
+ Card,
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
- Input,
+ Table,
+ TableBody,
+ TableCell,
+ TableFooter,
+ TableHead,
+ TableHeader,
+ TableRow,
Tooltip,
TooltipContent,
TooltipTrigger,
} from 'ui'
+import { Input } from 'ui-patterns/DataInputs/Input'
import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
+
import { ProtectedSchemaWarning } from '../ProtectedSchemaWarning'
interface ColumnListProps {
@@ -40,7 +46,7 @@ export const ColumnList = ({
onEditColumn = noop,
onDeleteColumn = noop,
}: ColumnListProps) => {
- const { id: _id, ref } = useParams()
+ const { id: _id } = useParams()
const id = _id ? Number(_id) : undefined
const { data: project } = useSelectedProjectQuery()
@@ -62,7 +68,9 @@ export const ColumnList = ({
const columns =
(filterString.length === 0
? (selectedTable?.columns ?? [])
- : selectedTable?.columns?.filter((column) => column.name.includes(filterString))) ?? []
+ : selectedTable?.columns?.filter((column) =>
+ column.name.toLowerCase().includes(filterString.toLowerCase())
+ )) ?? []
const { isSchemaLocked } = useIsProtectedSchema({ schema: selectedTable?.schema ?? '' })
const { can: canUpdateColumns } = useAsyncCheckPermissions(
@@ -72,16 +80,13 @@ export const ColumnList = ({
return (