diff --git a/public/locales/en/translations.json b/public/locales/en/translations.json
index 339658b..d126e16 100644
--- a/public/locales/en/translations.json
+++ b/public/locales/en/translations.json
@@ -92,8 +92,13 @@
},
"Settings": {
"Navigation": {
+ "System": "System",
"Appearance": "Appearance",
"Notifications": "Notifications"
+ },
+ "Cache": {
+ "Title": "Cache settings",
+ "Reset": "Reset"
}
},
"About": {
diff --git a/public/locales/ro/translations.json b/public/locales/ro/translations.json
index a639495..a77107e 100644
--- a/public/locales/ro/translations.json
+++ b/public/locales/ro/translations.json
@@ -83,8 +83,13 @@
},
"Settings": {
"Navigation": {
+ "System": "Sistem",
"Appearance": "Aspect",
"Notifications": "Notificări"
+ },
+ "Cache": {
+ "Title": "Setări cache",
+ "Reset": "Resetați"
}
},
"About": {
diff --git a/src/components/common/PaperTitle.js b/src/components/common/PaperTitle.js
new file mode 100644
index 0000000..8f0313d
--- /dev/null
+++ b/src/components/common/PaperTitle.js
@@ -0,0 +1,27 @@
+import React from "react";
+import PropTypes from "prop-types";
+import { Typography } from "@material-ui/core";
+import { makeStyles } from "@material-ui/core/styles";
+
+const useStyles = makeStyles(theme => ({
+ paper: {
+ margin: theme.spacing(1)
+ }
+}));
+
+const PaperTitle = ({ text }) => {
+ const classes = useStyles();
+ return (
+
+
+ {text}
+
+
+ );
+};
+
+PaperTitle.propTypes = {
+ text: PropTypes.string.isRequired
+};
+
+export default PaperTitle;
diff --git a/src/components/common/index.js b/src/components/common/index.js
index 4db22d3..bef3023 100644
--- a/src/components/common/index.js
+++ b/src/components/common/index.js
@@ -1,3 +1,4 @@
import DataLabel from "./DataLabel";
+import PaperTitle from "./PaperTitle";
-export { DataLabel };
+export { DataLabel, PaperTitle };
diff --git a/src/features/settings/SettingsContainer.js b/src/features/settings/SettingsContainer.js
index 8e1ace8..153533b 100644
--- a/src/features/settings/SettingsContainer.js
+++ b/src/features/settings/SettingsContainer.js
@@ -1,18 +1,25 @@
import React, { useState, useMemo } from "react";
+import BubbleChartIcon from "@material-ui/icons/BubbleChart";
import BrushIcon from "@material-ui/icons/Brush";
import NotificationsIcon from "@material-ui/icons/Notifications";
import { useTranslation } from "react-i18next";
import PageTitle from "../../components/common/PageTitle";
import NavigationButtons from "../../components/common/NavigationButtons";
+import SystemContainer from "./system/SystemContainer";
import AppearanceContainer from "./appearance/AppearanceContainer";
import NotificationsContainer from "./notifications/NotificationsContainer";
const NavigationTabs = {
+ SYSTEM: "Settings.Navigation.System",
APPEARANCE: "Settings.Navigation.Appearance",
NOTIFICATIONS: "Settings.Navigation.Notifications"
};
const tabs = [
+ {
+ code: NavigationTabs.SYSTEM,
+ icon: BubbleChartIcon
+ },
{
code: NavigationTabs.APPEARANCE,
icon: BrushIcon
@@ -24,7 +31,7 @@ const tabs = [
];
const SettingsContainer = () => {
- const [tab, setTab] = useState(NavigationTabs.APPEARANCE);
+ const [tab, setTab] = useState(NavigationTabs.SYSTEM);
const { t } = useTranslation();
const navigationTabs = useMemo(
@@ -40,6 +47,7 @@ const SettingsContainer = () => {
}
/>
+ {tab === NavigationTabs.SYSTEM && }
{tab === NavigationTabs.APPEARANCE && }
{tab === NavigationTabs.NOTIFICATIONS && }
>
diff --git a/src/features/settings/system/ResetCacheComponent.js b/src/features/settings/system/ResetCacheComponent.js
new file mode 100644
index 0000000..7f68eb5
--- /dev/null
+++ b/src/features/settings/system/ResetCacheComponent.js
@@ -0,0 +1,31 @@
+import React from "react";
+import { Paper, Button } from "@material-ui/core";
+import { makeStyles } from "@material-ui/core/styles";
+import { useTranslation } from "react-i18next";
+import { PaperTitle } from "../../../components/common";
+
+const useStyles = makeStyles(theme => ({
+ content: {
+ "& > *": {
+ margin: theme.spacing(1)
+ }
+ }
+}));
+
+const ResetCacheComponent = () => {
+ const classes = useStyles();
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
+
+
+ );
+};
+
+export default ResetCacheComponent;
diff --git a/src/features/settings/system/SystemContainer.js b/src/features/settings/system/SystemContainer.js
new file mode 100644
index 0000000..cd23fec
--- /dev/null
+++ b/src/features/settings/system/SystemContainer.js
@@ -0,0 +1,8 @@
+import React from "react";
+import ResetCacheComponent from "./ResetCacheComponent";
+
+const SystemContainer = () => {
+ return ;
+};
+
+export default SystemContainer;
diff --git a/src/providers/UserPermissionsProvider.js b/src/providers/UserPermissionsProvider.js
index 92dfe45..9d26a09 100644
--- a/src/providers/UserPermissionsProvider.js
+++ b/src/providers/UserPermissionsProvider.js
@@ -9,7 +9,8 @@ const permissionCodes = {
VIEW_MACHINES: "VIEW_MACHINES",
MANAGE_MACHINES: "MANAGE_MACHINES",
OPERATE_MACHINES: "OPERATE_MACHINES",
- GUEST_ACCESS: "GUEST_ACCESS"
+ GUEST_ACCESS: "GUEST_ACCESS",
+ SYSTEM_ADMINISTRATION: "SYSTEM_ADMINISTRATION"
};
const initialState = {
@@ -32,6 +33,8 @@ const getPermissionFlags = permissions => {
permissions.includes(permissionCodes.OPERATE_MACHINES) ?? false;
const guestAccess =
permissions.includes(permissionCodes.GUEST_ACCESS) ?? false;
+ const sysAdmin =
+ permissions.includes(permissionCodes.SYSTEM_ADMINISTRATION) ?? false;
const flags = {
viewDashboard,
@@ -40,7 +43,8 @@ const getPermissionFlags = permissions => {
viewMachines,
manageMachines,
operateMachines,
- guestAccess
+ guestAccess,
+ sysAdmin
};
const isGuest = guestAccess === true;
diff --git a/src/utils/api.js b/src/utils/api.js
index 140db74..529c70c 100644
--- a/src/utils/api.js
+++ b/src/utils/api.js
@@ -11,6 +11,7 @@ const routes = {
permissions: `${securityRoute}/permissions`,
systemVersion: `${systemRoute}/version`,
releaseNotes: `${systemRoute}/release-notes`,
+ resetCache: `${systemRoute}/reset-cache`,
machines: `${networkRoute}/machines`,
wakeMachine: `${powerActionsRoute}/wake`,
pingMachine: `${powerActionsRoute}/ping`,