Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
fe1faab
Move Security components to UI registry
jvorcak Apr 23, 2026
0853f6a
Security page rewrite
jvorcak Apr 28, 2026
5b6df25
Tables consistency
jvorcak Apr 28, 2026
8922949
fix(security): address review feedback on security page refactor
jvorcak Apr 29, 2026
c09f648
Adds loading for tables in Security
jvorcak Apr 29, 2026
59fccb3
fix integration tests
jvorcak Apr 30, 2026
2e13876
Fixes tests
jvorcak Apr 30, 2026
64ae92a
Fixes empty state when filtering is set
jvorcak May 1, 2026
1dbc687
Put new security page behind a feature flag
jvorcak May 5, 2026
81c12cc
fix e2e test for users
jvorcak May 5, 2026
3820618
Update connect page title
jvorcak May 5, 2026
eaf6f85
Fixes integration tests after changes in the routing / CTA buttons
jvorcak May 5, 2026
3736e09
Fixes console e2e ACL test
jvorcak May 5, 2026
c49ed91
Fix e2e filter input selector and remove redundant step
jvorcak May 5, 2026
db1e01e
Fix e2e URL query param: users tab uses q= not name=
jvorcak May 5, 2026
2fc6064
Fix e2e strict-mode violations and role test timeout
jvorcak May 5, 2026
95fc7f9
Fix strict mode violation in connect-cluster e2e test
jvorcak May 5, 2026
25db591
Adjust headers spacings in cloud version
jvorcak May 6, 2026
07631fd
Remove ablity to show License banner as a badge
jvorcak May 7, 2026
25bee05
Better data fetchin in roles + ACL fix
jvorcak May 7, 2026
ed17ef8
Ask for confirmation before unassigning a role from the user
jvorcak May 7, 2026
d12a9fb
Merge branch 'master' into security-page-refactor-2
jvorcak May 10, 2026
2f52e6a
Provide ACL popover preview
jvorcak May 10, 2026
082d237
Change Copy button in Create user modal to the UI registry verison
jvorcak May 10, 2026
bfd0614
User create modal - move username to an input in a success mode
jvorcak May 10, 2026
f81fb67
Dropdown menu has danger variant for destructive actions + confirmati…
jvorcak May 10, 2026
582801e
Larger "Allow all operations" modal
jvorcak May 10, 2026
37d4f07
Removed size="sm" from the "Delete selected" button at acls-card.tsx …
jvorcak May 10, 2026
0bc29f6
Change the header in the user detail
jvorcak May 10, 2026
963c999
Remove check for username text
jvorcak May 10, 2026
bf77e43
Merge branch 'master' into security-page-refactor-2
jvorcak May 13, 2026
415e6fc
Fixes typescript after recent tanstack upgrade
jvorcak May 13, 2026
1d00dba
Fix e2e pipeline
jvorcak May 13, 2026
7c9fb6d
Add DialogBody to the new modals (after base UI changes)
jvorcak May 13, 2026
ec4ee45
Changes to Add ACL modal - creatable user
jvorcak May 14, 2026
b37f419
Fixes disabled states after BaseUI migration
jvorcak May 14, 2026
61f22fb
Merge branch 'master' into security-page-refactor-2
jvorcak May 14, 2026
18ab2fd
enableNewSecurityPage: true for non-embedded mode
jvorcak May 15, 2026
4d416d2
Update list-layout + add manual margins
jvorcak May 15, 2026
c024e3b
Merge branch 'master' into security-page-refactor-2
jvorcak May 15, 2026
c171caa
fix Roles tab integration test
jvorcak May 15, 2026
a74f7b7
Allow to specify feature flags for e2e tests
jvorcak May 17, 2026
cf55091
Display Resource Type as a badge
jvorcak May 17, 2026
92cbdcd
Provide feature correct feature flag to all e2e suites
jvorcak May 17, 2026
2be7f3b
Enable kafka auth
jvorcak May 18, 2026
b2a1326
Better ACL handling in Kafka mode
jvorcak May 18, 2026
e46c993
Type check
jvorcak May 18, 2026
63ce53f
fix: address review feedback -- Redpanda-only ACL resource types, con…
jvorcak May 19, 2026
0d8113a
Fixes ACL with Pattern Type = Any
jvorcak May 20, 2026
2b5f229
Updates all modals to use Dialog from the UI registry
jvorcak May 20, 2026
62a78f4
Fix documentation links
jvorcak May 20, 2026
8e97aa0
Fix /permissions path under feature flag
jvorcak May 20, 2026
6229c50
Add DialogBody to remove Permission modal
jvorcak May 20, 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
1 change: 1 addition & 0 deletions frontend/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -162,3 +162,4 @@ dist
.gemini/settings.json

tests/**/playwright-report/
tests/**/*.js
Comment thread
SpicyPete marked this conversation as resolved.
8 changes: 7 additions & 1 deletion frontend/src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@ const router = createRouter({
defaultNotFoundComponent: NotFoundPage,
});

declare global {
interface Window {
__E2E_FEATURE_FLAGS__?: Record<string, boolean>;
}
}

// Register router for type safety
declare module '@tanstack/react-router' {
// biome-ignore lint/style/useConsistentTypeDefinitions: Required for TanStack Router module augmentation
Expand Down Expand Up @@ -109,7 +115,7 @@ const App = () => {

// Need to use CustomFeatureFlagProvider for completeness with EmbeddedApp
return (
<CustomFeatureFlagProvider initialFlags={{}}>
<CustomFeatureFlagProvider initialFlags={window.__E2E_FEATURE_FLAGS__ ?? {}}>
<Content apiKey={BUILDER_API_KEY} content={null} customComponents={builderCustomComponents} model={''} />
<ChakraProvider resetCSS={false} theme={redpandaTheme} toastOptions={redpandaToastOptions}>
<TransportProvider transport={dataplaneTransport}>
Expand Down
1 change: 1 addition & 0 deletions frontend/src/components/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export const FEATURE_FLAGS = {
enableNewPipelineLogs: false,
enablePipelineDiagrams: false,
enableConnectSlashMenu: false,
enableNewSecurityPage: true,
enableTeamsBridge: false,
};

Expand Down
88 changes: 49 additions & 39 deletions frontend/src/components/layout/header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@
* by the Apache License, Version 2.0
*/

import { Box, Button, ColorModeSwitch, CopyButton, Flex } from '@redpanda-data/ui';
import { Button, ColorModeSwitch, CopyButton } from '@redpanda-data/ui';
import { Link, useLocation, 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';
import { Fragment, useMemo } from 'react';

import { isEmbedded, isFeatureFlagEnabled } from '../../config';
Expand All @@ -28,6 +29,7 @@ import {
BreadcrumbList,
BreadcrumbSeparator,
} from '../redpanda-ui/components/breadcrumb';
import { Button as RegistryButton } from '../redpanda-ui/components/button';
import { Separator } from '../redpanda-ui/components/separator';
import { SidebarTrigger } from '../redpanda-ui/components/sidebar';

Expand All @@ -38,8 +40,8 @@ type BreadcrumbHeaderRowProps = {

function BreadcrumbHeaderRow({ useNewSidebar, breadcrumbItems }: BreadcrumbHeaderRowProps) {
return (
<Flex alignItems="center" justifyContent="space-between">
<Flex alignItems="center" gap={2}>
<div className={cn('w-full border-b', useNewSidebar && 'py-4')}>
<div className="flex items-center gap-2">
{useNewSidebar ? (
<>
<SidebarTrigger />
Expand All @@ -50,7 +52,7 @@ function BreadcrumbHeaderRow({ useNewSidebar, breadcrumbItems }: BreadcrumbHeade
<Breadcrumb>
<BreadcrumbList>
{breadcrumbItems.map((item, index) => (
<Fragment key={item.linkTo}>
<Fragment key={`${index}-${item.linkTo}`}>
{index > 0 && <BreadcrumbSeparator />}
<BreadcrumbItem>
<BreadcrumbLink asChild>
Expand All @@ -62,8 +64,8 @@ function BreadcrumbHeaderRow({ useNewSidebar, breadcrumbItems }: BreadcrumbHeade
</BreadcrumbList>
</Breadcrumb>
)}
</Flex>
</Flex>
</div>
</div>
);
}

Expand All @@ -74,9 +76,10 @@ function AppPageHeader() {
const useNewSidebar = !isEmbedded();

const pageBreadcrumbs = useUIStateStore((s) => s.pageBreadcrumbs);
const pageTitle = useUIStateStore((s) => s._pageTitle);
const backLink = useUIStateStore((s) => s.backLink);
const selectedClusterName = useUIStateStore((s) => s.selectedClusterName);
const shouldHidePageHeader = useUIStateStore((s) => s.shouldHidePageHeader);

const breadcrumbItems = useMemo(() => {
const items: BreadcrumbEntry[] = [...pageBreadcrumbs];

Expand All @@ -92,38 +95,41 @@ function AppPageHeader() {
}, [pageBreadcrumbs, selectedClusterName]);

const lastBreadcrumb = breadcrumbItems.at(-1);
const breadcrumbsExceptLast = breadcrumbItems.slice(0, -1);

if (shouldHideHeader || shouldHidePageHeader) {
return null;
}

return (
<Box>
{/* we need to refactor out #mainLayout > div rule, for now I've added this box as a workaround */}
<BreadcrumbHeaderRow breadcrumbItems={breadcrumbsExceptLast} useNewSidebar={useNewSidebar} />

<Flex alignItems="center" justifyContent="space-between" pb={2}>
<Flex alignItems="center">
{lastBreadcrumb ? (
<Heading
// as="span"
className={cn('mr-2', lastBreadcrumb.options?.canBeTruncated ? 'break-spaces break-all' : 'nowrap')}
level={1}
>
{lastBreadcrumb.titleNode ?? lastBreadcrumb.title}
</Heading>
) : null}
{lastBreadcrumb ? (
<Box>
{lastBreadcrumb.options?.canBeCopied ? (
<CopyButton content={lastBreadcrumb.title} variant="ghost" />
) : null}
</Box>
) : null}
{Boolean(showRefresh) && <DataRefreshButton />}
</Flex>
<Flex alignItems="center" gap={2}>
<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}
</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
Expand All @@ -139,9 +145,9 @@ function AppPageHeader() {
)}
<UserPreferencesButton />
{IsDev && !isEmbedded() && <ColorModeSwitch m={0} p={0} variant="ghost" />}
</Flex>
</Flex>
</Box>
</div>
</div>
</div>
);
}

Expand All @@ -165,17 +171,18 @@ function useShouldShowRefresh() {
const getStartedApiMatch = matchRoute({ to: '/get-started/api' });

// matches acls
const aclCreateMatch = matchRoute({ to: '/security/acls/create' });
const aclUpdateMatch = matchRoute({ to: '/security/acls/$aclName/update' });
const aclDetailMatch = matchRoute({ to: '/security/acls/$aclName/details' });
const isACLRelated = aclCreateMatch || aclUpdateMatch || aclDetailMatch;
const isACLRelated = aclDetailMatch;

// matches roles
const roleCreateMatch = matchRoute({ to: '/security/roles/create' });
const roleUpdateMatch = matchRoute({ to: '/security/roles/$roleName/update' });
const roleDetailMatch = matchRoute({ to: '/security/roles/$roleName/details' });
const isRoleRelated = roleCreateMatch || roleUpdateMatch || roleDetailMatch;

// matches user detail
const userDetailMatch = matchRoute({ to: '/security/users/$userName/details' });

if (connectClusterMatch && connectClusterMatch.connector === 'create-connector') {
return false;
}
Expand All @@ -194,6 +201,9 @@ function useShouldShowRefresh() {
if (isRoleRelated) {
return false;
}
if (userDetailMatch) {
return false;
}
if (connectWizardPagesMatch) {
return false;
}
Expand Down
Loading
Loading