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>
63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
import { useTheme } from '@mui/material/styles';
|
|
import React from 'react';
|
|
import { useHistory } from 'react-router-dom';
|
|
import { computeScore, countResults } from '../api/polaris';
|
|
import { usePolarisDataContext } from '../api/PolarisDataContext';
|
|
|
|
/**
|
|
* App bar badge showing cluster Polaris score
|
|
* Clicking navigates to the overview dashboard
|
|
*/
|
|
export default function AppBarScoreBadge() {
|
|
const theme = useTheme();
|
|
const { data, loading } = usePolarisDataContext();
|
|
const history = useHistory();
|
|
|
|
if (loading || !data) {
|
|
return null; // Graceful degradation when Polaris unavailable
|
|
}
|
|
|
|
const counts = countResults(data);
|
|
const score = computeScore(counts);
|
|
|
|
// Color based on score using theme palette
|
|
const getColor = (s: number): string => {
|
|
if (s >= 80) return theme.palette.success.main;
|
|
if (s >= 50) return theme.palette.warning.main;
|
|
return theme.palette.error.main;
|
|
};
|
|
|
|
const getContrastColor = (s: number): string => {
|
|
if (s >= 80) return theme.palette.success.contrastText;
|
|
if (s >= 50) return theme.palette.warning.contrastText;
|
|
return theme.palette.error.contrastText;
|
|
};
|
|
|
|
const handleClick = () => {
|
|
history.push('/polaris');
|
|
};
|
|
|
|
return (
|
|
<button
|
|
onClick={handleClick}
|
|
style={{
|
|
cursor: 'pointer',
|
|
marginRight: '8px',
|
|
padding: '4px 12px',
|
|
borderRadius: '16px',
|
|
border: 'none',
|
|
backgroundColor: getColor(score),
|
|
color: getContrastColor(score),
|
|
fontSize: '13px',
|
|
fontWeight: 500,
|
|
display: 'inline-flex',
|
|
alignItems: 'center',
|
|
gap: '4px',
|
|
}}
|
|
aria-label={`Polaris cluster score: ${score}%`}
|
|
>
|
|
<span>Polaris: {score}%</span>
|
|
</button>
|
|
);
|
|
}
|