diff --git a/csharp/App/Backend/Controller.cs b/csharp/App/Backend/Controller.cs index 69d76a324..8e1edc6f5 100644 --- a/csharp/App/Backend/Controller.cs +++ b/csharp/App/Backend/Controller.cs @@ -2309,4 +2309,17 @@ public class Controller : ControllerBase return Ok(); } + [HttpPut(nameof(AcknowledgeTerms))] + public ActionResult AcknowledgeTerms(Int32 version, Token authToken) + { + var session = Db.GetSession(authToken); + if (session is null) return Unauthorized(); + + var user = Db.GetUserById(session.User.Id); + if (user is null) return Unauthorized(); + + user.AcknowledgedTermsVersion = version; + return Db.Update(user) ? Ok() : StatusCode(500); + } + } diff --git a/csharp/App/Backend/DataTypes/User.cs b/csharp/App/Backend/DataTypes/User.cs index a5ec78224..95aebc50a 100644 --- a/csharp/App/Backend/DataTypes/User.cs +++ b/csharp/App/Backend/DataTypes/User.cs @@ -11,6 +11,7 @@ public class User : TreeNode public Boolean MustResetPassword { get; set; } = false; public String? Password { get; set; } = null!; public String Language { get; set; } = "en"; + public Int32? AcknowledgedTermsVersion { get; set; } [Unique] public override String Name { get; set; } = null!; diff --git a/typescript/frontend-marios2/src/components/AcknowledgementDialog.tsx b/typescript/frontend-marios2/src/components/AcknowledgementDialog.tsx new file mode 100644 index 000000000..c4a035747 --- /dev/null +++ b/typescript/frontend-marios2/src/components/AcknowledgementDialog.tsx @@ -0,0 +1,95 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogActions, + Button, + Typography, + Divider, + Box +} from '@mui/material'; +import { FormattedMessage } from 'react-intl'; + +export const CURRENT_TERMS_VERSION = 1; + +interface AcknowledgementDialogProps { + open: boolean; + onAcknowledge: () => void; +} + +const AcknowledgementDialog: React.FC = ({ + open, + onAcknowledge +}) => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default AcknowledgementDialog; diff --git a/typescript/frontend-marios2/src/content/dashboards/Log/Log.tsx b/typescript/frontend-marios2/src/content/dashboards/Log/Log.tsx index f2e7373f1..2e4e5853e 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Log/Log.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Log/Log.tsx @@ -248,9 +248,9 @@ function Log(props: LogProps) { if (source === 'KnowledgeBase') return ; if (source === 'MistralAI') - return ; + return ; if (source === 'MistralFailed') - return ; + return ; return ; }; diff --git a/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/index.tsx b/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/index.tsx index 398959ea3..bd4adaba6 100644 --- a/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/index.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/index.tsx @@ -13,6 +13,8 @@ import TreeView from '../Tree/treeView'; import { ProductIdContext } from '../../../contexts/ProductIdContextProvider'; import { UserType } from '../../../interfaces/UserTypes'; import SodioHomeInstallation from './Installation'; +import AcknowledgementDialog, { CURRENT_TERMS_VERSION } from '../../../components/AcknowledgementDialog'; +import axiosConfig from '../../../Resources/axiosConfig'; interface SodioHomeInstallationTabsProps { product: number; @@ -21,7 +23,25 @@ interface SodioHomeInstallationTabsProps { function SodioHomeInstallationTabs(props: SodioHomeInstallationTabsProps) { const location = useLocation(); const context = useContext(UserContext); - const { currentUser } = context; + const { currentUser, setUser } = context; + + const showTermsDialog = + currentUser?.acknowledgedTermsVersion == null || + currentUser.acknowledgedTermsVersion < CURRENT_TERMS_VERSION; + + const handleAcknowledgeTerms = () => { + axiosConfig + .put('/AcknowledgeTerms', undefined, { + params: { version: CURRENT_TERMS_VERSION } + }) + .then(() => { + const updatedUser = { + ...currentUser, + acknowledgedTermsVersion: CURRENT_TERMS_VERSION + }; + setUser(updatedUser); + }); + }; const tabList = [ 'live', 'overview', @@ -415,6 +435,10 @@ function SodioHomeInstallationTabs(props: SodioHomeInstallationTabsProps) { return sodiohomeInstallations.length > 1 ? ( <> + ) : sodiohomeInstallations.length === 1 ? ( <> - {' '} +