diff --git a/portal-ui/src/screens/Console/Configurations/ConfigurationPanels/ConfigurationOptions.tsx b/portal-ui/src/screens/Console/Configurations/ConfigurationPanels/ConfigurationOptions.tsx
index 83041fc5a..57dde72d2 100644
--- a/portal-ui/src/screens/Console/Configurations/ConfigurationPanels/ConfigurationOptions.tsx
+++ b/portal-ui/src/screens/Console/Configurations/ConfigurationPanels/ConfigurationOptions.tsx
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
-import React, { Fragment, useEffect } from "react";
+import React, { Fragment, useCallback, useEffect, useState } from "react";
import { Theme } from "@mui/material/styles";
import createStyles from "@mui/styles/createStyles";
import withStyles from "@mui/styles/withStyles";
@@ -37,8 +37,11 @@ import ExportConfigButton from "./ExportConfigButton";
import ImportConfigButton from "./ImportConfigButton";
import { Box } from "@mui/material";
import HelpMenu from "../../HelpMenu";
-import { setHelpName } from "../../../../systemSlice";
+import { setErrorSnackMessage, setHelpName } from "../../../../systemSlice";
import { useAppDispatch } from "../../../../store";
+import { api } from "../../../../api";
+import { IElement } from "../types";
+import { errorToHandler } from "../../../../api/errors";
interface IConfigurationOptions {
classes: any;
@@ -64,17 +67,56 @@ const getRoutePath = (path: string) => {
return `${IAM_PAGES.SETTINGS}/${path}`;
};
+// region is not part of config subsystem list.
+const NON_SUB_SYS_CONFIG_ITEMS = ["region"];
+const IGNORED_CONFIG_SUB_SYS = ["cache"]; // cache config is not supported.
+
const ConfigurationOptions = ({ classes }: IConfigurationOptions) => {
const { pathname = "" } = useLocation();
+ const dispatch = useAppDispatch();
+
+ const [configSubSysList, setConfigSubSysList] = useState([]);
+ const fetchConfigSubSysList = useCallback(async () => {
+ api.configs
+ .listConfig() // get a list of available config subsystems.
+ .then((res) => {
+ if (res && res?.data && res?.data?.configurations) {
+ const confSubSysList = (res?.data?.configurations || []).reduce(
+ (acc: string[], { key = "" }) => {
+ if (!IGNORED_CONFIG_SUB_SYS.includes(key)) {
+ acc.push(key);
+ }
+ return acc;
+ },
+ [],
+ );
+
+ setConfigSubSysList(confSubSysList);
+ }
+ })
+ .catch((err) => {
+ dispatch(setErrorSnackMessage(errorToHandler(err)));
+ });
+ }, [dispatch]);
let selConfigTab = pathname.substring(pathname.lastIndexOf("/") + 1);
selConfigTab = selConfigTab === "settings" ? "region" : selConfigTab;
- const dispatch = useAppDispatch();
useEffect(() => {
+ fetchConfigSubSysList();
dispatch(setHelpName("settings_Region"));
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
+ const availableConfigSubSys = configurationElements.filter(
+ ({ configuration_id }: IElement) => {
+ return (
+ NON_SUB_SYS_CONFIG_ITEMS.includes(configuration_id) ||
+ configSubSysList.includes(configuration_id) ||
+ !configSubSysList.length
+ );
+ },
+ );
+
return (
} />
@@ -104,7 +146,7 @@ const ConfigurationOptions = ({ classes }: IConfigurationOptions) => {
isRouteTabs
routes={
- {configurationElements.map((element) => (
+ {availableConfigSubSys.map((element) => (
{
}
>
- {configurationElements.map((element) => {
+ {availableConfigSubSys.map((element) => {
const { configuration_id, configuration_label, icon } = element;
return {
tabConfig: {