diff --git a/jams-react-client/src/views/Blueprint/Blueprint.js b/jams-react-client/src/views/Blueprint/Blueprint.js index 5c81a9e5194a1b59853a08729203a4f9ed9ba363..94cbc25062f189dfb8b95cb400f574983ac4c6c7 100644 --- a/jams-react-client/src/views/Blueprint/Blueprint.js +++ b/jams-react-client/src/views/Blueprint/Blueprint.js @@ -9,6 +9,7 @@ import Box from "@material-ui/core/Box"; import EditBlueprintPermissions from "./EditBlueprintPermissions"; import EditBlueprintConfiguration from "./EditBlueprintConfiguration"; +import EditBlueprintUi from "./EditBlueprintUi"; import { infoColor } from "assets/jss/material-dashboard-react.js"; @@ -69,6 +70,10 @@ export default function Blueprint(props) { label={i18next.t("configuration", "Configuration")} {...a11yProps(1)} /> + <Tab + label={i18next.t("customization", "Customization")} + {...a11yProps(2)} + /> </Tabs> </AppBar> <TabPanel value={value} index={0}> @@ -77,6 +82,9 @@ export default function Blueprint(props) { <TabPanel value={value} index={1}> <EditBlueprintConfiguration blueprintName={props.blueprintName} /> </TabPanel> + <TabPanel value={value} index={2}> + <EditBlueprintUi blueprintName={props.blueprintName} /> + </TabPanel> </div> ); } diff --git a/jams-react-client/src/views/Blueprint/EditBlueprintConfiguration.js b/jams-react-client/src/views/Blueprint/EditBlueprintConfiguration.js index fcacfb569dceb7ad460f9887ac865430595b5f24..c0300566383a318997a4e494e7bfaae34f277823 100644 --- a/jams-react-client/src/views/Blueprint/EditBlueprintConfiguration.js +++ b/jams-react-client/src/views/Blueprint/EditBlueprintConfiguration.js @@ -191,10 +191,14 @@ export default function EditBlueprintConfiguration(props) { const [turnPassowrdVisible, setTurnPasswordVisible] = useState(false); + const [uiCustomization, setUiCustomization] = useState(""); + const [open, setOpen] = useState(false); const [message, setMessage] = useState(false); const [severity, setSeverity] = useState("success"); + const [getRequestDone, setGetRequestDone] = useState(false); + useEffect(() => { axios( configApiCall( @@ -211,6 +215,7 @@ export default function EditBlueprintConfiguration(props) { setAutoAnswer(policyData["autoAnswer"]); setPeerDiscovery(policyData["peerDiscovery"]); setRendezVous(policyData["rendezVous"]); + setUiCustomization(policyData["uiCustomization"]); setUpnpEnabled(policyData["upnpEnabled"]); if (policyData["turnEnabled"] === true) { @@ -244,10 +249,18 @@ export default function EditBlueprintConfiguration(props) { " " + error ); + }) + .finally(() => { + setGetRequestDone(true); }); }, [props.blueprintName, props.username]); const handleUpdateConfiguration = (field, value, selectedOptions = []) => { + // if the get request is not done yet, don't update the configuration + if (!getRequestDone) { + return; + } + let data = { videoEnabled: videoEnabled, publicInCalls: publicInCalls, @@ -264,6 +277,7 @@ export default function EditBlueprintConfiguration(props) { proxyEnabled: proxyEnabled, proxyServer: proxyServer, dhtProxyListUrl: dhtProxyListUrl, + uiCustomization: uiCustomization, }; data[field] = value; diff --git a/jams-react-client/src/views/Blueprint/EditBlueprintPermissions.js b/jams-react-client/src/views/Blueprint/EditBlueprintPermissions.js index a95bcfba2aa37908112d860240417a0c34280846..2adc2a3e0bf5251a7180a12fd205c7d73a722620 100644 --- a/jams-react-client/src/views/Blueprint/EditBlueprintPermissions.js +++ b/jams-react-client/src/views/Blueprint/EditBlueprintPermissions.js @@ -148,6 +148,8 @@ export default function EditBlueprintPermissions(props) { const [allowLookup, setAllowLookup] = useState(true); + const [uiCustomization, setUiCustomization] = useState(""); + const [open, setOpen] = useState(false); const [message, setMessage] = useState(false); const [severity, setSeverity] = useState("success"); @@ -184,6 +186,7 @@ export default function EditBlueprintPermissions(props) { useEffect(() => { searchUsers(); + axios( configApiCall( api_path_blueprints + "?name=" + props.blueprintName, @@ -194,6 +197,7 @@ export default function EditBlueprintPermissions(props) { ) .then((response) => { let policyData = JSON.parse(response.data.policyData); + setVideoEnabled(policyData["videoEnabled"]); setPublicInCalls(policyData["publicInCalls"]); setAutoAnswer(policyData["autoAnswer"]); @@ -211,6 +215,8 @@ export default function EditBlueprintPermissions(props) { setDhtProxyListUrl(); setAllowLookup(policyData["allowLookup"]); + setUiCustomization(policyData["uiCustomization"]); + policyData["defaultModerators"].split("/").forEach((id) => { if (id !== "undefined" && id !== "") { axios( @@ -265,6 +271,7 @@ export default function EditBlueprintPermissions(props) { proxyServer: proxyServer, dhtProxyListUrl: dhtProxyListUrl, allowLookup: allowLookup, + uiCustomization: uiCustomization, }; if (field === "peerDiscovery") { diff --git a/jams-react-client/src/views/Blueprint/EditBlueprintUi.js b/jams-react-client/src/views/Blueprint/EditBlueprintUi.js new file mode 100644 index 0000000000000000000000000000000000000000..ebafec4236aa1b29b81990afbad0baa96a9e9b91 --- /dev/null +++ b/jams-react-client/src/views/Blueprint/EditBlueprintUi.js @@ -0,0 +1,169 @@ +import React, { useState } from "react"; +// @material-ui/core components +import { makeStyles } from "@material-ui/core/styles"; + +// core components +import Grid from "@material-ui/core/Grid"; +import GridItem from "components/Grid/GridItem.js"; +import GridContainer from "components/Grid/GridContainer.js"; +import Card from "components/Card/Card.js"; +import CardHeader from "components/Card/CardHeader.js"; +import CardIcon from "components/Card/CardIcon.js"; +import CardBody from "components/Card/CardBody.js"; + +import SettingsIcon from "@material-ui/icons/Settings"; + +import { hexToRgb, blackColor } from "assets/jss/material-dashboard-react.js"; + +import axios from "axios"; +import configApiCall from "../../api"; +import { + api_path_blueprints, + api_path_get_image, + api_path_post_image, +} from "../../globalUrls"; + +import dashboardStyle from "assets/jss/material-dashboard-react/views/dashboardStyle.js"; + +import Snackbar from "@material-ui/core/Snackbar"; +import MuiAlert from "@material-ui/lab/Alert"; + +import i18next from "i18next"; + +const DEFAULT_UI_CUSTOMIZATION = { + hasTitle: true, + customTitle: "", + hasDescription: true, + customDescription: "", + hasTips: false, + hasBackgroundCustom: false, + customBackgroundColor: "", + customBackgroundImageUrl: "", + hasLogo: true, + customLogoImageUrl: "", +}; + +const styles = { + ...dashboardStyle, + card: { + minWidth: "500px", + }, + cardBody: { + flexGrow: 1, + }, + cardCategoryWhite: { + color: "rgba(255,255,255,.62)", + margin: "0", + fontSize: "14px", + marginTop: "0", + marginBottom: "0", + }, + cardTitleWhite: { + color: "#FFFFFF", + marginTop: "0px", + minHeight: "auto", + fontWeight: "300", + fontFamily: "'Roboto', 'Helvetica', 'Arial', sans-serif", + marginBottom: "3px", + textDecoration: "none", + }, + input: { + display: "none", + }, + profileAsBackground: { + backgroundSize: "100% 100%", + width: "80px", + height: "80px", + }, + centerIconMiddle: { + position: "relative", + top: "20px", + left: "15px", + }, + editProfilePicture: { + borderRadius: "50%", + width: "200px", + height: "200px", + boxShadow: + "0 6px 8px -12px rgba(" + + hexToRgb(blackColor) + + ", 0.56), 0 4px 25px 0px rgba(" + + hexToRgb(blackColor) + + ", 0.12), 0 8px 10px -5px rgba(" + + hexToRgb(blackColor) + + ", 0.2)", + }, + dialogPaper: { + minHeight: "60vh", + maxHeight: "60vh", + minWidth: "80vh", + maxWidth: "80vh", + }, + uploadIconStyle: { + fontSize: "35px", + marginBottom: "10px", + marginRight: "10px", + }, +}; + +const useStyles = makeStyles(styles); + +function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} + +export default function EditBlueprintUi({ blueprintName }) { + const classes = useStyles(); + + const [open, setOpen] = useState(false); + const [message, setMessage] = useState(false); + const [severity, setSeverity] = useState("success"); + + const handleClose = () => { + setOpen(false); + }; + + return ( + <div> + <Snackbar + anchorOrigin={{ vertical: "bottom", horizontal: "right" }} + open={open} + onClose={handleClose} + message={message} + key={"bottomright"} + > + <Alert onClose={handleClose} severity={severity}> + {message} + </Alert> + </Snackbar> + + <GridContainer> + <GridItem xs={12} sm={12} md={6}> + <Card profile className={classes.card}> + <CardHeader color="info" stats icon> + <CardIcon color="info"> + <SettingsIcon /> + </CardIcon> + <p className={classes.cardCategory}> + {i18next.t("customization", "Customization")} + </p> + <h3 className={classes.cardTitle}>{blueprintName}</h3> + </CardHeader> + <CardBody profile> + <div className={classes.cardBody}> + <Grid container spacing={5}> + <Grid item xs={12} sm={12} md={12}> + <Grid container spacing={2}> + {/* TODO */} + Coming soon + </Grid> + </Grid> + </Grid> + </div> + </CardBody> + </Card> + </GridItem> + </GridContainer> + </div> + ); +}