Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
5cb3a42
feat(sql): add query workspace with iceberg bridge [UX-1259]
c-julin Jun 5, 2026
b1d7fec
feat(sql): query workspace UI updates [UX-1259]
c-julin Jun 9, 2026
dd6defc
style(sql): replace off-token colours and ad-hoc classes with design …
c-julin Jun 9, 2026
37590af
style(sql): drop redundant inline styles in favour of classes [UX-1259]
c-julin Jun 9, 2026
d3f1b00
chore(frontend): pin zod to ^4.3.6 [UX-1330]
c-julin Jun 11, 2026
17fbb81
style(frontend): apply biome lint fixes [UX-1330]
c-julin Jun 11, 2026
2dfe0d5
chore(frontend): add sql-formatter dependency [UX-1330]
c-julin Jun 11, 2026
c66d17f
refactor(sql): replace hand-rolled SQL helpers with library-backed on…
c-julin Jun 11, 2026
64d1b06
feat(sql): clamp wide result cells behind a full-value popover [UX-1330]
c-julin Jun 11, 2026
d5195e2
test(sql): cover firstKeyword gate and result cell popover [UX-1330]
c-julin Jun 11, 2026
f38c900
revert(debug): drop overlay simulation tab from debug dialog [UX-1330]
c-julin Jun 11, 2026
ef6abf2
feat(sql): derive json and array column kinds with brace/bracket icon…
c-julin Jun 11, 2026
f34323f
refactor(sql): rebuild catalog tree on registry components with ARIA …
c-julin Jun 11, 2026
0008f09
feat(ui): add fill variant to table container [UX-1330]
c-julin Jun 11, 2026
6b92a89
refactor(sql): rebuild results panel on registry components [UX-1330]
c-julin Jun 11, 2026
52705f1
refactor(sql): rebuild editor chrome on registry components [UX-1330]
c-julin Jun 11, 2026
8a845e0
test(sql): cover editor tabs, history popover and run flow [UX-1330]
c-julin Jun 11, 2026
874d53a
refactor(sql): drop dead proto re-exports and inline shortPgType [UX-…
c-julin Jun 11, 2026
8c12c0b
fix(ui): center choicebox radio indicator dot [UX-1330]
c-julin Jun 11, 2026
44334b6
refactor(sql): rebuild add-topic wizard on registry components [UX-1330]
c-julin Jun 11, 2026
071516a
test(sql): cover add-topic wizard flow [UX-1330]
c-julin Jun 11, 2026
631b3e0
refactor(sql): render results with react-data-grid [UX-1330]
c-julin Jun 11, 2026
f97260b
revert(ui): drop table fill variant; keep registry table vanilla [UX-…
c-julin Jun 11, 2026
9800e24
fix(sql): fill leftover grid width with a 1fr spacer column [UX-1330]
c-julin Jun 11, 2026
f44de6f
fix(sql): flex result columns to fill panel width [UX-1330]
c-julin Jun 11, 2026
610e6ce
refactor(sql): migrate SQL editor from Monaco to CodeMirror 6
c-julin Jun 15, 2026
0040605
feat(sql): gate SQL visibility by environment [UX-1330]
c-julin Jun 22, 2026
19b1577
feat(sql): build out SQL studio workspace [UX-1330]
c-julin Jun 22, 2026
6ba70f3
refactor(sql): derive fullscreen routes from staticData, drop hardcod…
c-julin Jun 22, 2026
d6ba2b2
feat(sql): refine SQL studio result and catalog UI [UX-1330]
c-julin Jun 22, 2026
51d7a55
fix(sql): address PR review feedback on SQL workspace [UX-1330]
c-julin Jun 22, 2026
ef9385b
feat(sql): gate SQL on backend capability detection [UX-1330]
c-julin Jun 22, 2026
feb1060
fix(sql): address Ben's review feedback [UX-1330]
c-julin Jun 22, 2026
eeb50e9
chore(sql): dedupe .gitignore, drop redundant codemirror overrides [U…
c-julin Jun 22, 2026
5335491
fix(sql): iceberg pill always renders; clamp + fix cell popovers
c-julin Jun 22, 2026
8569ea8
fix(sql): cell popovers track the cell and clip behind the grid header
c-julin Jun 22, 2026
0e3a02a
fix(sql): always left-align result-grid column headers
c-julin Jun 22, 2026
2a90e38
fix(sql): don't flash login on /sql before capability list loads [UX-…
c-julin Jun 22, 2026
0d9e2b5
fix(sql): uppercase sidebar column types to match results header
c-julin Jun 22, 2026
ae3466a
feat(sql): polish SQL Studio empty state, autocomplete, and header [U…
c-julin Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ fixname.sh
# IDEs
**/.vscode
**/.idea
**/.cursor
**/*.code-workspace

# Helper Scripts
Expand All @@ -17,7 +18,13 @@ requests.txt
.prettierrc

# Local build tools installed via Taskfiles
build
/build
/configs

.cursor
# Go workspace (local dev only)
go.work
go.work.sum

# Claude Code local state
.claude/worktrees/
.claude/settings.local.json
5 changes: 5 additions & 0 deletions backend/pkg/console/endpoint_compatibility.go
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,11 @@ func (s *Service) GetEndpointCompatibility(ctx context.Context) (EndpointCompati
Method: "POST",
IsSupported: false,
},
EndpointCompatibilityEndpoint{
Endpoint: dataplanev1alpha3connect.SQLServiceName,
Method: "POST",
IsSupported: false,
},
)

return EndpointCompatibility{
Expand Down
60 changes: 47 additions & 13 deletions frontend/bun.lock

Large diffs are not rendered by default.

15 changes: 12 additions & 3 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,20 +53,26 @@
"@buf/redpandadata_cloud.connectrpc_query-es": "^2.2.0-20251128173054-b9f9fc6e5a70.1",
"@buf/redpandadata_common.bufbuild_es": "^2.11.0-20260316210807-5d899910f714.1",
"@bufbuild/cel": "^0.4.0",
"@bufbuild/protobuf": "^2.11.0",
"@bufbuild/protobuf": "^2.12.0",
"@bufbuild/protoc-gen-es": "^2.10.0",
"@builder.io/sdk-react": "^4.2.4",
"@chakra-ui/object-utils": "^2.1",
"@chakra-ui/popper": "^2.1",
"@chakra-ui/portal": "^2.1",
"@chakra-ui/react-use-disclosure": "^2.1",
"@chakra-ui/system": "^2.1",
"@codemirror/autocomplete": "^6.20.3",
"@codemirror/lang-sql": "^6.10.0",
"@codemirror/language": "^6.12.3",
"@codemirror/state": "^6.6.0",
"@codemirror/view": "^6.43.1",
Comment thread
c-julin marked this conversation as resolved.
"@connectrpc/connect": "^2.1.0",
"@connectrpc/connect-query": "^2.2.0",
"@connectrpc/connect-web": "^2.1.0",
"@emotion/css": "^11.13.5",
"@hookform/resolvers": "^5.2.2",
"@icons-pack/react-simple-icons": "^13.8.0",
"@lezer/highlight": "^1.2.3",
"@milkdown/kit": "^7.18.0",
"@milkdown/react": "^7.18.0",
"@modelcontextprotocol/sdk": "^1.29.0",
Expand All @@ -84,13 +90,14 @@
"@tanstack/react-virtual": "^3.13.12",
"@tanstack/zod-adapter": "^1.167.0",
"@types/prismjs": "^1.26.5",
"@uiw/react-codemirror": "^4.25.10",
"@xyflow/react": "^12.9.2",
"ai": "^6.0.168",
"array-move": "^4.0.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"date-fns": "^4.1.0",
"date-fns": "^4.3.0",
"dexie": "^4.2.1",
"dotenv": "^17.2.3",
"es-cookie": "^1.5.0",
Expand All @@ -113,11 +120,12 @@
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-compiler-runtime": "^1.0.0",
"react-data-grid": "7.0.0-beta.47",
Comment thread
c-julin marked this conversation as resolved.
"react-day-picker": "^9.14.0",
"react-dom": "^18.3.1",
"react-dropzone": "^15.0.0",
"react-highlight-words": "^0.21.0",
"react-hook-form": "^7.72.0",
"react-hook-form": "^7.76.1",
"react-markdown": "^10.1.0",
"react-resizable-panels": "^3.0.6",
"react-simple-code-editor": "^0.14.1",
Expand All @@ -127,6 +135,7 @@
"remark-gfm": "^4.0.1",
"shiki": "^3.23.0",
"sonner": "^2.0.7",
"sql-formatter": "^15.8.1",
"stacktrace-js": "^2.0.2",
"streamdown": "^2.5.0",
"tailwind-merge": "^3.5.0",
Expand Down
11 changes: 11 additions & 0 deletions frontend/src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import { builderCustomComponents } from 'components/builder-io/builder-custom-co
import { BUILDER_API_KEY } from 'components/constants';
import { CustomFeatureFlagProvider } from 'custom-feature-flag-provider';
import useDeveloperView from 'hooks/use-developer-view';
import type { LucideIcon } from 'lucide-react';
import { protobufRegistry } from 'protobuf-registry';
import queryClient from 'query-client';
import { useEffect } from 'react';
Expand Down Expand Up @@ -98,6 +99,16 @@ declare module '@tanstack/react-router' {
content?: string;
score?: number;
}

// biome-ignore lint/style/useConsistentTypeDefinitions: Required for TanStack Router module augmentation
interface StaticDataRouteOption {
/** Route title shown in the page header/breadcrumbs. */
title?: string;
/** Lucide icon for the route's sidebar entry. */
icon?: LucideIcon;
/** Render the route with minimal chrome (no page header/footer/padding). */
fullscreen?: boolean;
}
}

const EMPTY_SETUP_ARGS = {};
Expand Down
96 changes: 54 additions & 42 deletions frontend/src/components/layout/header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
*/

import { Button, ColorModeSwitch, CopyButton } from '@redpanda-data/ui';
import { Link, useLocation, useMatchRoute } from '@tanstack/react-router';
import { Link, useLocation, useMatches, useMatchRoute } from '@tanstack/react-router';
import { Heading } from 'components/redpanda-ui/components/typography';
import { cn } from 'components/redpanda-ui/lib/utils';
import { ChevronLeft } from 'lucide-react';
Expand Down Expand Up @@ -69,8 +69,14 @@ function BreadcrumbHeaderRow({ useNewSidebar, breadcrumbItems }: BreadcrumbHeade
);
}

function AppPageHeader() {
function AppPageHeader({ breadcrumbOnly = false }: { breadcrumbOnly?: boolean }) {
useApiStoreHook((s) => s.userData); // re-render when userData changes
// Fullscreen routes (e.g. the SQL studio) carry their own title bar/toolbar, so
// they never want the title+actions row — only the breadcrumb. Robust to which
// layout branch renders the header (standalone vs embedded misdetection).
const matches = useMatches();
const isFullscreenRoute = matches.some((m) => m.staticData.fullscreen);
Comment thread
c-julin marked this conversation as resolved.
const hideTitleRow = breadcrumbOnly || isFullscreenRoute;
const showRefresh = useShouldShowRefresh();
const shouldHideHeader = useShouldHideHeader();
const useNewSidebar = !isEmbedded();
Expand Down Expand Up @@ -104,49 +110,55 @@ function AppPageHeader() {
<div>
<BreadcrumbHeaderRow breadcrumbItems={breadcrumbItems} useNewSidebar={useNewSidebar} />

<div className="flex items-center justify-between pt-6">
<div className="flex flex-col gap-1">
{backLink && (
<RegistryButton asChild className="-ml-2 w-fit text-muted-foreground" variant="ghost">
<Link to={backLink.linkTo}>
<ChevronLeft className="h-4 w-4" />
{backLink.title}
{/* Title + actions row. Hidden for breadcrumb-only headers (e.g. the SQL
studio, which carries its own title bar and toolbar). */}
{!hideTitleRow && (
<div className="flex items-center justify-between pt-6">
<div className="flex flex-col gap-1">
{backLink && (
<RegistryButton asChild className="-ml-2 w-fit text-muted-foreground" variant="ghost">
<Link to={backLink.linkTo}>
<ChevronLeft className="h-4 w-4" />
{backLink.title}
</Link>
</RegistryButton>
)}
<div className="flex items-center">
{pageTitle ? (
<Heading
className={cn('mr-2', lastBreadcrumb?.options?.canBeTruncated ? 'break-spaces break-all' : 'nowrap')}
level={1}
>
{pageTitle}
</Heading>
) : null}
{lastBreadcrumb?.options?.canBeCopied ? (
<CopyButton content={lastBreadcrumb.title} variant="ghost" />
) : null}
{Boolean(showRefresh) && <DataRefreshButton />}
</div>
</div>
<div className="flex items-center gap-2">
{!isEmbedded() && api.isRedpanda && (
<Link to="/debug-bundle">
<Button
isDisabled={!api.userData?.canViewDebugBundle}
tooltip={
api.userData?.canViewDebugBundle
? null
: 'You need RedpandaCapability.MANAGE_DEBUG_BUNDLE permission'
}
variant="ghost"
>
Debug bundle
</Button>
</Link>
</RegistryButton>
)}
<div className="flex items-center">
{pageTitle ? (
<Heading
className={cn('mr-2', lastBreadcrumb?.options?.canBeTruncated ? 'break-spaces break-all' : 'nowrap')}
level={1}
>
{pageTitle}
</Heading>
) : null}
{lastBreadcrumb?.options?.canBeCopied ? (
<CopyButton content={lastBreadcrumb.title} variant="ghost" />
) : null}
{Boolean(showRefresh) && <DataRefreshButton />}
)}
<UserPreferencesButton />
{IsDev && !isEmbedded() && <ColorModeSwitch m={0} p={0} variant="ghost" />}
</div>
</div>
<div className="flex items-center gap-2">
{!isEmbedded() && api.isRedpanda && (
<Link to="/debug-bundle">
<Button
isDisabled={!api.userData?.canViewDebugBundle}
tooltip={
api.userData?.canViewDebugBundle ? null : 'You need RedpandaCapability.MANAGE_DEBUG_BUNDLE permission'
}
variant="ghost"
>
Debug bundle
</Button>
</Link>
)}
<UserPreferencesButton />
{IsDev && !isEmbedded() && <ColorModeSwitch m={0} p={0} variant="ghost" />}
</div>
</div>
)}
</div>
);
}
Expand Down
Loading
Loading