514de78ba7
- Fix ExemptionManager apiVersion bug (apps/batch resources used wrong API path) - Replace resource: any with proper KubeResource interface (strict TypeScript) - Replace all var(--mui-palette-*) CSS variables with useTheme() + theme.palette.* - Replace custom drawer with MUI Drawer component (proper a11y and theming) - Replace alert() calls with StatusLabel-based inline feedback - Add PolarisErrorBoundary wrapping all registered plugin components - Export getPolarisApiPath/isFullUrl from polaris.ts, deduplicate in PolarisSettings - Fix PolarisDataContext test mock missing triggerRefresh - Fix DashboardView test SimpleTable mock using any - Remove dead NamespaceDetailView (replaced by drawer), unused MockPolarisProvider, unused getSeverityColor export - Add tests for InlineAuditSection, AppBarScoreBadge, topIssues, checkMapping (32 new) - Update CLAUDE.md, CHANGELOG.md, README.md for v0.6.0 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
129 lines
3.0 KiB
TypeScript
129 lines
3.0 KiB
TypeScript
import {
|
|
registerAppBarAction,
|
|
registerDetailsViewSection,
|
|
registerPluginSettings,
|
|
registerRoute,
|
|
registerSidebarEntry,
|
|
} from '@kinvolk/headlamp-plugin/lib';
|
|
import { SectionBox, StatusLabel } from '@kinvolk/headlamp-plugin/lib/CommonComponents';
|
|
import React from 'react';
|
|
import { PolarisDataProvider } from './api/PolarisDataContext';
|
|
import AppBarScoreBadge from './components/AppBarScoreBadge';
|
|
import DashboardView from './components/DashboardView';
|
|
import InlineAuditSection from './components/InlineAuditSection';
|
|
import NamespacesListView from './components/NamespacesListView';
|
|
import PolarisSettings from './components/PolarisSettings';
|
|
|
|
// --- Error boundary for plugin components ---
|
|
|
|
interface ErrorBoundaryState {
|
|
error: string | null;
|
|
}
|
|
|
|
class PolarisErrorBoundary extends React.Component<
|
|
{ children: React.ReactNode },
|
|
ErrorBoundaryState
|
|
> {
|
|
state: ErrorBoundaryState = { error: null };
|
|
|
|
static getDerivedStateFromError(error: Error): ErrorBoundaryState {
|
|
return { error: error.message };
|
|
}
|
|
|
|
render() {
|
|
if (this.state.error) {
|
|
return (
|
|
<SectionBox title="Polaris Plugin Error">
|
|
<StatusLabel status="error">{this.state.error}</StatusLabel>
|
|
</SectionBox>
|
|
);
|
|
}
|
|
return this.props.children;
|
|
}
|
|
}
|
|
|
|
// --- Sidebar entries ---
|
|
|
|
registerSidebarEntry({
|
|
parent: null,
|
|
name: 'polaris',
|
|
label: 'Polaris',
|
|
url: '/polaris',
|
|
icon: 'mdi:shield-check',
|
|
});
|
|
|
|
registerSidebarEntry({
|
|
parent: 'polaris',
|
|
name: 'polaris-overview',
|
|
label: 'Overview',
|
|
url: '/polaris',
|
|
icon: 'mdi:view-dashboard',
|
|
});
|
|
|
|
registerSidebarEntry({
|
|
parent: 'polaris',
|
|
name: 'polaris-namespaces',
|
|
label: 'Namespaces',
|
|
url: '/polaris/namespaces',
|
|
icon: 'mdi:dns',
|
|
});
|
|
|
|
// --- Routes ---
|
|
|
|
registerRoute({
|
|
path: '/polaris',
|
|
sidebar: 'polaris-overview',
|
|
name: 'polaris',
|
|
exact: true,
|
|
component: () => (
|
|
<PolarisErrorBoundary>
|
|
<PolarisDataProvider>
|
|
<DashboardView />
|
|
</PolarisDataProvider>
|
|
</PolarisErrorBoundary>
|
|
),
|
|
});
|
|
|
|
registerRoute({
|
|
path: '/polaris/namespaces',
|
|
sidebar: 'polaris-namespaces',
|
|
name: 'polaris-namespaces',
|
|
exact: true,
|
|
component: () => (
|
|
<PolarisErrorBoundary>
|
|
<PolarisDataProvider>
|
|
<NamespacesListView />
|
|
</PolarisDataProvider>
|
|
</PolarisErrorBoundary>
|
|
),
|
|
});
|
|
|
|
// Register plugin settings
|
|
registerPluginSettings('polaris', PolarisSettings, true);
|
|
|
|
// Register details view section for supported controller types
|
|
registerDetailsViewSection(({ resource }) => {
|
|
const supportedKinds = ['Deployment', 'StatefulSet', 'DaemonSet', 'Job', 'CronJob'];
|
|
|
|
if (!supportedKinds.includes(resource?.kind)) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<PolarisErrorBoundary>
|
|
<PolarisDataProvider>
|
|
<InlineAuditSection resource={resource} />
|
|
</PolarisDataProvider>
|
|
</PolarisErrorBoundary>
|
|
);
|
|
});
|
|
|
|
// Register app bar score badge
|
|
registerAppBarAction(() => (
|
|
<PolarisErrorBoundary>
|
|
<PolarisDataProvider>
|
|
<AppBarScoreBadge />
|
|
</PolarisDataProvider>
|
|
</PolarisErrorBoundary>
|
|
));
|