+
= ({
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);