feat: move refresh interval to plugin settings

Register plugin settings via registerPluginSettings so the refresh
interval is configurable from Headlamp's plugin config page instead
of being embedded in the main view header.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-06 21:55:13 -05:00
parent 8b319c0c8a
commit b10d09fd41
4 changed files with 57 additions and 32 deletions
+7
View File
@@ -93,6 +93,13 @@ export function countResults(data: AuditData): ResultCounts {
// --- Settings --- // --- Settings ---
export const INTERVAL_OPTIONS = [
{ label: '1 minute', value: 60 },
{ label: '5 minutes', value: 300 },
{ label: '10 minutes', value: 600 },
{ label: '30 minutes', value: 1800 },
];
const STORAGE_KEY = 'polaris-plugin-refresh-interval'; const STORAGE_KEY = 'polaris-plugin-refresh-interval';
const DEFAULT_INTERVAL_SECONDS = 300; // 5 minutes const DEFAULT_INTERVAL_SECONDS = 300; // 5 minutes
+40
View File
@@ -0,0 +1,40 @@
import { NameValueTable, SectionBox } from '@kinvolk/headlamp-plugin/lib/CommonComponents';
import React from 'react';
import { getRefreshInterval, INTERVAL_OPTIONS, setRefreshInterval } from '../api/polaris';
interface PluginSettingsProps {
data?: { [key: string]: string | number | boolean };
onDataChange?: (data: { [key: string]: string | number | boolean }) => void;
}
export default function PolarisSettings(props: PluginSettingsProps) {
const { data, onDataChange } = props;
const currentInterval = (data?.refreshInterval as number) ?? getRefreshInterval();
function handleChange(e: React.ChangeEvent<HTMLSelectElement>) {
const seconds = Number(e.target.value);
setRefreshInterval(seconds);
onDataChange?.({ ...data, refreshInterval: seconds });
}
return (
<SectionBox title="Polaris Settings">
<NameValueTable
rows={[
{
name: 'Refresh Interval',
value: (
<select value={currentInterval} onChange={handleChange}>
{INTERVAL_OPTIONS.map(opt => (
<option key={opt.value} value={opt.value}>
{opt.label}
</option>
))}
</select>
),
},
]}
/>
</SectionBox>
);
}
+2 -31
View File
@@ -1,5 +1,4 @@
import { import {
HeaderLabel,
Loader, Loader,
NameValueTable, NameValueTable,
SectionBox, SectionBox,
@@ -13,32 +12,15 @@ import {
countResults, countResults,
getRefreshInterval, getRefreshInterval,
ResultCounts, ResultCounts,
setRefreshInterval,
usePolarisData, usePolarisData,
} from '../api/polaris'; } from '../api/polaris';
const INTERVAL_OPTIONS = [
{ label: '1 minute', value: 60 },
{ label: '5 minutes', value: 300 },
{ label: '10 minutes', value: 600 },
{ label: '30 minutes', value: 1800 },
];
function scoreStatus(score: number): 'success' | 'warning' | 'error' { function scoreStatus(score: number): 'success' | 'warning' | 'error' {
if (score >= 80) return 'success'; if (score >= 80) return 'success';
if (score >= 50) return 'warning'; if (score >= 50) return 'warning';
return 'error'; return 'error';
} }
function RefreshSettings(props: { interval: number; onChange: (seconds: number) => void }) {
return (
<HeaderLabel
label="Refresh interval"
value={INTERVAL_OPTIONS.find(o => o.value === props.interval)?.label ?? ''}
/>
);
}
function OverviewSection(props: { data: AuditData; counts: ResultCounts }) { function OverviewSection(props: { data: AuditData; counts: ResultCounts }) {
const score = computeScore(props.counts); const score = computeScore(props.counts);
const status = scoreStatus(score); const status = scoreStatus(score);
@@ -105,13 +87,7 @@ function OverviewSection(props: { data: AuditData; counts: ResultCounts }) {
} }
export default function PolarisView() { export default function PolarisView() {
const [interval, setInterval] = React.useState(getRefreshInterval); const interval = getRefreshInterval();
function handleIntervalChange(seconds: number) {
setInterval(seconds);
setRefreshInterval(seconds);
}
const { data, loading, error } = usePolarisData(interval); const { data, loading, error } = usePolarisData(interval);
if (loading) { if (loading) {
@@ -122,12 +98,7 @@ export default function PolarisView() {
return ( return (
<> <>
<SectionHeader <SectionHeader title="Polaris" />
title="Polaris"
actions={[
<RefreshSettings key="refresh" interval={interval} onChange={handleIntervalChange} />,
]}
/>
{error && ( {error && (
<SectionBox title="Error"> <SectionBox title="Error">
+8 -1
View File
@@ -1,5 +1,10 @@
import { registerRoute, registerSidebarEntry } from '@kinvolk/headlamp-plugin/lib'; import {
registerPluginSettings,
registerRoute,
registerSidebarEntry,
} from '@kinvolk/headlamp-plugin/lib';
import React from 'react'; import React from 'react';
import PolarisSettings from './components/PolarisSettings';
import PolarisView from './components/PolarisView'; import PolarisView from './components/PolarisView';
registerSidebarEntry({ registerSidebarEntry({
@@ -17,3 +22,5 @@ registerRoute({
exact: true, exact: true,
component: () => <PolarisView />, component: () => <PolarisView />,
}); });
registerPluginSettings('polaris-headlamp-plugin', PolarisSettings, true);