diff --git a/web/src/components/dropdowns/topology-display-dropdown.css b/web/src/components/dropdowns/topology-display-dropdown.css index 2af37eb49..faad587aa 100644 --- a/web/src/components/dropdowns/topology-display-dropdown.css +++ b/web/src/components/dropdowns/topology-display-dropdown.css @@ -12,4 +12,8 @@ #truncate>.pf-c-dropdown__menu { top: 0; left: 100%; +} + +#scope ul { + min-width: 105px; } \ No newline at end of file diff --git a/web/src/components/metrics/histogram.tsx b/web/src/components/metrics/histogram.tsx index 655b514d1..f55690ffd 100644 --- a/web/src/components/metrics/histogram.tsx +++ b/web/src/components/metrics/histogram.tsx @@ -235,7 +235,7 @@ export const Histogram: React.FC<{ return (
onKeyDown(e.key)} diff --git a/web/src/components/metrics/metrics-content.css b/web/src/components/metrics/metrics-content.css index 67b44f909..76a8a45c5 100644 --- a/web/src/components/metrics/metrics-content.css +++ b/web/src/components/metrics/metrics-content.css @@ -23,4 +23,8 @@ .small-chart-label>tspan { font-size: 11px !important; +} + +.metrics-content-div.dark tspan { + fill: #fff !important; } \ No newline at end of file diff --git a/web/src/components/metrics/metrics-donut.tsx b/web/src/components/metrics/metrics-donut.tsx index 7bc228dd9..e912bb4be 100644 --- a/web/src/components/metrics/metrics-donut.tsx +++ b/web/src/components/metrics/metrics-donut.tsx @@ -24,6 +24,7 @@ export type MetricsDonutProps = { smallerTexts?: boolean; showLegend?: boolean; animate?: boolean; + isDark?: boolean; }; export const MetricsDonut: React.FC = ({ @@ -40,7 +41,8 @@ export const MetricsDonut: React.FC = ({ showOutOfScope, smallerTexts, showLegend, - animate + animate, + isDark }) => { const { t } = useTranslation('plugin__netobserv-plugin'); @@ -129,7 +131,12 @@ export const MetricsDonut: React.FC = ({ }, [containerRef, dimensions]); return ( -
+
= ({ @@ -68,7 +69,8 @@ export const MetricsGraphWithTotal: React.FC = ({ smallerTexts, topAsBars, showLegend, - animate + animate, + isDark }) => { const { t } = useTranslation('plugin__netobserv-plugin'); @@ -135,7 +137,7 @@ export const MetricsGraphWithTotal: React.FC = ({ return ( <> -
+
= ({ @@ -59,7 +60,8 @@ export const MetricsGraph: React.FC = ({ itemsPerRow, tooltipsTruncate, showLegend, - animate + animate, + isDark }) => { const { t } = useTranslation('plugin__netobserv-plugin'); @@ -94,7 +96,12 @@ export const MetricsGraph: React.FC = ({ }, [containerRef, dimensions]); return ( -
+
= ({ setSaveDisabled(!isExportAll && _.isEmpty(selectedColumns.filter(col => col.isSelected))); }, [isExportAll, selectedColumns]); + React.useEffect(() => { + // reload selected columns when config is loaded + setSelectedColumns( + getLocalStorage(LOCAL_STORAGE_EXPORT_COLS_KEY, columns, { + id: 'id', + criteria: 'isSelected' + }) + ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [columns]); + return ( = ({ smallerTexts={smallerTexts} showLegend={!isFocus} animate={animate} + isDark={isDark} /> ) : ( emptyGraph() @@ -351,6 +352,7 @@ export const NetflowOverview: React.FC = ({ tooltipsTruncate={false} showLegend={!isFocus} animate={animate} + isDark={isDark} /> ) : !_.isEmpty(topKMetrics) || namedTotalMetric || namedTotalDroppedMetric ? ( = ({ showOthers={false} showLegend={!isFocus} animate={animate} + isDark={isDark} /> ) : ( emptyGraph() @@ -410,6 +413,7 @@ export const NetflowOverview: React.FC = ({ smallerTexts={smallerTexts} showLegend={!isFocus} animate={animate} + isDark={isDark} /> ) : showTopOnly ? ( = ({ tooltipsTruncate={false} showLegend={!isFocus} animate={animate} + isDark={isDark} /> ) : namedTotalMetric ? ( = ({ showOthers={false} showLegend={!isFocus} animate={animate} + isDark={isDark} /> ) : ( emptyGraph() @@ -501,6 +507,7 @@ export const NetflowOverview: React.FC = ({ smallerTexts={smallerTexts} showLegend={!isFocus} animate={animate} + isDark={isDark} /> ) : ( = ({ showOthers={false} showLegend={!isFocus} animate={animate} + isDark={isDark} /> ) ) : ( @@ -561,6 +569,7 @@ export const NetflowOverview: React.FC = ({ smallerTexts={smallerTexts} showLegend={!isFocus} animate={animate} + isDark={isDark} /> ) : ( = ({ showTotalDrop={false} showLegend={!isFocus} animate={animate} + isDark={isDark} /> ) ) : ( diff --git a/web/src/components/netflow-topology/element-panel-metrics.tsx b/web/src/components/netflow-topology/element-panel-metrics.tsx index 964db48c2..084b716b6 100644 --- a/web/src/components/netflow-topology/element-panel-metrics.tsx +++ b/web/src/components/netflow-topology/element-panel-metrics.tsx @@ -20,7 +20,8 @@ export const ElementPanelMetrics: React.FC<{ metrics: TopologyMetrics[]; metricType: MetricType; truncateLength: TruncateLength; -}> = ({ aData, bData, isGroup, metrics, metricType, truncateLength }) => { + isDark?: boolean; +}> = ({ aData, bData, isGroup, metrics, metricType, truncateLength, isDark }) => { const { t } = useTranslation('plugin__netobserv-plugin'); const [metricsRadio, setMetricsRadio] = React.useState('both'); @@ -124,6 +125,7 @@ export const ElementPanelMetrics: React.FC<{ showScatter tooltipsTruncate={true} showLegend={true} + isDark={isDark} />
); diff --git a/web/src/components/netflow-topology/element-panel.tsx b/web/src/components/netflow-topology/element-panel.tsx index 674453dbd..513d984fa 100644 --- a/web/src/components/netflow-topology/element-panel.tsx +++ b/web/src/components/netflow-topology/element-panel.tsx @@ -135,6 +135,7 @@ export const ElementPanel: React.FC<{ setFilters: (filters: Filter[]) => void; truncateLength: TruncateLength; id?: string; + isDark?: boolean; }> = ({ id, element, @@ -145,7 +146,8 @@ export const ElementPanel: React.FC<{ filterDefinitions, setFilters, onClose, - truncateLength + truncateLength, + isDark }) => { const { t } = useTranslation('plugin__netobserv-plugin'); const [activeTab, setActiveTab] = React.useState('details'); @@ -217,6 +219,7 @@ export const ElementPanel: React.FC<{ metrics={metrics} metricType={metricType} truncateLength={truncateLength} + isDark={isDark} /> )} @@ -229,6 +232,7 @@ export const ElementPanel: React.FC<{ metrics={droppedMetrics} metricType={metricType} truncateLength={truncateLength} + isDark={isDark} /> )} diff --git a/web/src/components/netflow-traffic.css b/web/src/components/netflow-traffic.css index e74cc13a8..16fe9024a 100644 --- a/web/src/components/netflow-traffic.css +++ b/web/src/components/netflow-traffic.css @@ -69,6 +69,15 @@ span.pf-c-button__icon.pf-m-start { padding: 0; } +/* fix page section color for PF4 compat in OCP 4.15+ */ +#pageSection.light { + background: #fff; +} + +#pageSection.dark { + background: #1b1d21; +} + #filter-toolbar { padding: 0 1.5rem 0 1.5rem; } diff --git a/web/src/components/netflow-traffic.tsx b/web/src/components/netflow-traffic.tsx index e7bccf011..bd96f6aef 100644 --- a/web/src/components/netflow-traffic.tsx +++ b/web/src/components/netflow-traffic.tsx @@ -1084,7 +1084,7 @@ export const NetflowTraffic: React.FC = ({ forcedFilters, i const viewTabs = () => { return ( selectView(eventkey as ViewId)} @@ -1103,8 +1103,14 @@ export const NetflowTraffic: React.FC = ({ forcedFilters, i }; const onOverviewExport = () => { - const overview_flex = document.getElementById('overview-flex'); - exportToPng('overview_page', overview_flex as HTMLElement, isDarkTheme); + const prevFocusState = overviewFocus; + setOverviewFocus(false); + setTimeout(() => { + const overview_flex = document.getElementById('overview-flex'); + exportToPng('overview_page', overview_flex as HTMLElement, isDarkTheme, undefined, () => + setOverviewFocus(prevFocusState) + ); + }, 500); }; const viewOptionsContent = () => { @@ -1356,6 +1362,7 @@ export const NetflowTraffic: React.FC = ({ forcedFilters, i filterDefinitions={getFilterDefs()} setFilters={setFiltersList} onClose={() => onElementSelect(undefined)} + isDark={isDarkTheme} /> ); } else { @@ -1607,7 +1614,7 @@ export const NetflowTraffic: React.FC = ({ forcedFilters, i const isShowViewOptions = selectedViewId === 'table' ? showViewOptions && !showHistogram : showViewOptions; return !_.isEmpty(extensions) ? ( - + { //display title only if forced filters is not set !forcedFilters && ( diff --git a/web/src/utils/export.ts b/web/src/utils/export.ts index 4c8f7d5b0..81fa1a464 100644 --- a/web/src/utils/export.ts +++ b/web/src/utils/export.ts @@ -1,6 +1,12 @@ import { toPng } from 'html-to-image'; -export const exportToPng = (name: string, element: HTMLElement | undefined, isDark?: boolean, id?: string) => { +export const exportToPng = ( + name: string, + element: HTMLElement | undefined, + isDark?: boolean, + id?: string, + callback?: () => void +) => { if (element) { toPng(element, { cacheBust: true, backgroundColor: isDark ? '#0f1214' : '#f0f0f0' }) .then(dataUrl => { @@ -12,6 +18,9 @@ export const exportToPng = (name: string, element: HTMLElement | undefined, isDa } link.href = dataUrl; link.click(); + if (callback) { + callback(); + } }) .catch(err => { console.error(err);