diff --git a/jams-react-client/build_deploy_jams_client.sh b/jams-react-client/build_deploy_jams_client.sh index cc5f14bfb5a22c4fd1d1d3a253c18c0c5159350b..de41b240d804a063972be11dff7c909c38316f97 100755 --- a/jams-react-client/build_deploy_jams_client.sh +++ b/jams-react-client/build_deploy_jams_client.sh @@ -3,24 +3,24 @@ WEBAPP=../jams-server/src/main/resources/webapp/ JAMS_CLIENT=jams-client/ JAMS=jams -npm run build +sudo npm run build -rm -r $WEBAPP* +rm -rf $WEBAPP* cp -r $BUILD_DIRECTORY* $WEBAPP sed -i 's/material-dashboard-react\///g' $WEBAPP"index.html" -cd ../$JAMS -rm -rf jams -rm derby.log -rm oauth.key -rm oauth.pub -rm config.json +#cd ../$JAMS +#rm -rf jams +#rm derby.log +#rm oauth.key +#rm oauth.pub +#rm config.json cd .. -mvn clean package +mvn clean package -DskipTests mvn package -DskipTests cd $JAMS -java -jar jams-launcher.jar \ No newline at end of file +java -jar jams-launcher.jar diff --git a/jams-react-client/src/api.js b/jams-react-client/src/api.js index 47a685b137e2a8a82d23e949b2b2aad4ddbe3542..72de6e6a44e4970ef530a5e387c999f5c58373d5 100644 --- a/jams-react-client/src/api.js +++ b/jams-react-client/src/api.js @@ -89,7 +89,13 @@ export default function configApiCall(api_path, request_type, data, credentials) // search dataType if (isSearch) { - config['data'] = data; + if(request_type == 'post'){ + config['data'] = data; + } + else { + config['params'] = data + } + } else { diff --git a/jams-react-client/src/assets/css/material-dashboard-react.css b/jams-react-client/src/assets/css/material-dashboard-react.css index 95dc3a9a32983f4f267502354d3744407ebb1f5e..52f159f30e971ce0deffe349def3267350ae45f4 100644 --- a/jams-react-client/src/assets/css/material-dashboard-react.css +++ b/jams-react-client/src/assets/css/material-dashboard-react.css @@ -95,18 +95,18 @@ h3 { } h4 { - font-size: 1.3em; + font-size: 1em; line-height: 1.4em; } h5 { - font-size: 1.25em; + font-size: 0.9em; line-height: 1.4em; margin-bottom: 15px; } h6 { - font-size: 1em; + font-size: 0.5em; text-transform: uppercase; font-weight: 500; } diff --git a/jams-react-client/src/assets/img/faces/christophe_villemaire.jpeg b/jams-react-client/src/assets/img/faces/christophe_villemaire.jpeg deleted file mode 100644 index 95f8fc39ddffaa4633ac6c4c5c1ac0cfdc721de6..0000000000000000000000000000000000000000 Binary files a/jams-react-client/src/assets/img/faces/christophe_villemaire.jpeg and /dev/null differ diff --git a/jams-react-client/src/assets/img/faces/cyrille_beraud.jpeg b/jams-react-client/src/assets/img/faces/cyrille_beraud.jpeg deleted file mode 100644 index 355d0359ed1aff19fad6377b8cb09e0472b37831..0000000000000000000000000000000000000000 Binary files a/jams-react-client/src/assets/img/faces/cyrille_beraud.jpeg and /dev/null differ diff --git a/jams-react-client/src/assets/img/faces/jami.png b/jams-react-client/src/assets/img/faces/jami.png new file mode 100644 index 0000000000000000000000000000000000000000..d845c9315365725f7ef717f3c296b60cbe3cb426 Binary files /dev/null and b/jams-react-client/src/assets/img/faces/jami.png differ diff --git a/jams-react-client/src/assets/img/faces/larbi_gharib.jpeg b/jams-react-client/src/assets/img/faces/larbi_gharib.jpeg deleted file mode 100644 index 3f4dd38069354b7de02c2c515a62701ac3592cfc..0000000000000000000000000000000000000000 Binary files a/jams-react-client/src/assets/img/faces/larbi_gharib.jpeg and /dev/null differ diff --git a/jams-react-client/src/assets/img/faces/marc.jpg b/jams-react-client/src/assets/img/faces/marc.jpg deleted file mode 100644 index b84f3f064daabb1f8b2c8c38f6694d7498682b19..0000000000000000000000000000000000000000 Binary files a/jams-react-client/src/assets/img/faces/marc.jpg and /dev/null differ diff --git a/jams-react-client/src/assets/img/faces/no-profile-picture-old-2.png b/jams-react-client/src/assets/img/faces/no-profile-picture-old-2.png new file mode 100644 index 0000000000000000000000000000000000000000..339c74e40f9883fe2fc43283efa7a2afe2eca60f Binary files /dev/null and b/jams-react-client/src/assets/img/faces/no-profile-picture-old-2.png differ diff --git a/jams-react-client/src/assets/img/faces/no-profile-picture.png b/jams-react-client/src/assets/img/faces/no-profile-picture.png new file mode 100644 index 0000000000000000000000000000000000000000..31543b0177943a0be79a64a626b0c2fbfc7258d2 Binary files /dev/null and b/jams-react-client/src/assets/img/faces/no-profile-picture.png differ diff --git a/jams-react-client/src/assets/jss/material-dashboard-react/components/cardAvatarStyle.js b/jams-react-client/src/assets/jss/material-dashboard-react/components/cardAvatarStyle.js index 2be7e5a3ed3a5dde6342d10f5d100447263413e9..422418760772d0e43d7f54dbdda5fd64132ec613 100644 --- a/jams-react-client/src/assets/jss/material-dashboard-react/components/cardAvatarStyle.js +++ b/jams-react-client/src/assets/jss/material-dashboard-react/components/cardAvatarStyle.js @@ -8,14 +8,14 @@ const cardAvatarStyle = { } }, cardAvatarProfile: { - maxWidth: "130px", - maxHeight: "130px", - margin: "-50px auto 0", + maxWidth: "80px", + maxHeight: "80px", + margin: "-50px 10px 0", borderRadius: "50%", overflow: "hidden", padding: "0", boxShadow: - "0 16px 38px -12px rgba(" + + "0 6px 8px -12px rgba(" + hexToRgb(blackColor) + ", 0.56), 0 4px 25px 0px rgba(" + hexToRgb(blackColor) + diff --git a/jams-react-client/src/assets/jss/material-dashboard-react/components/cardStyle.js b/jams-react-client/src/assets/jss/material-dashboard-react/components/cardStyle.js index 1e17494abbaff1bdb6c06a7e34cdcf2c62d205fe..33bc10edc1da2a93e9b44eb19f7729c1aaa880a9 100644 --- a/jams-react-client/src/assets/jss/material-dashboard-react/components/cardStyle.js +++ b/jams-react-client/src/assets/jss/material-dashboard-react/components/cardStyle.js @@ -3,6 +3,7 @@ import { whiteColor, hexToRgb } from "assets/jss/material-dashboard-react.js"; +import { grayColor } from "assets/jss/material-dashboard-react"; const cardStyle = { card: { @@ -19,7 +20,24 @@ const cardStyle = { flexDirection: "column", minWidth: "0", wordWrap: "break-word", - fontSize: ".875rem" + fontSize: ".875rem", + "& ul": { + "list-style": "none", + padding: 0, + "& li" :{ + display: 'flex', + alignItems: 'center', + "& svg": { + marginRight: "10px" + }, + "& img": { + marginRight: "10px" + } + } + }, + "&:hover": { + boxShadow: "0 1px 4px 0 rgba(" + hexToRgb(blackColor) + ", 0.54)", + } }, cardPlain: { background: "transparent", @@ -27,7 +45,7 @@ const cardStyle = { }, cardProfile: { marginTop: "30px", - textAlign: "center" + textAlign: "left" }, cardChart: { "& p": { diff --git a/jams-react-client/src/auth.js b/jams-react-client/src/auth.js index 810ad0cdea602dcfcb1f908b36032ad163f313d4..39c82ead1b293b70efa2a7e0335202213c999501 100644 --- a/jams-react-client/src/auth.js +++ b/jams-react-client/src/auth.js @@ -34,9 +34,7 @@ class Auth { } cb() }).catch((error) => { - //setErrorMessage(true); - console.log("Error: " + error); - cb() + cb(error) }); } @@ -57,7 +55,13 @@ class Auth { } cb() }).catch((error) => { - console.log("Error during API request on checkAdminAccountStatus: " + error) + if(error.response.status == 404){ + this.admin = true + } + else{ + console.log("Error during API request on checkAdminAccountStatus: " + error) + } + cb() }); } @@ -77,15 +81,20 @@ class Auth { } checkLastKnowStep(cb) { - axios(configApiCall(api_path_get_install_lastKnownStep, 'GET', null, null)).then((response) => { - this.uri = response.data['uri'] + if(this.installed){ this.authenticated = true + console.log("Auth: Server is already installed") cb() - }).catch((error) => { - console.log("Error during API request on checkLastKnowStep: " + error); - this.authenticated = false - cb() - }) + }else{ + axios(configApiCall(api_path_get_install_lastKnownStep, 'GET', null, null)).then((response) => { + this.uri = response.data['uri'] + this.authenticated = true + cb() + }).catch((error) => { + console.log("Error during API request on checkLastKnowStep: " + error); + cb() + }) + } } hasAdmin() { diff --git a/jams-react-client/src/components/CaSetup/CaSetup.js b/jams-react-client/src/components/CaSetup/CaSetup.js index 09226fb70401ee700a0d2f4d907bbe4d86326029..b3190eec3636a6b806dc3568f06b8c564b3261c1 100644 --- a/jams-react-client/src/components/CaSetup/CaSetup.js +++ b/jams-react-client/src/components/CaSetup/CaSetup.js @@ -12,7 +12,7 @@ import axios from 'axios'; import configApiCall from '../../api' import { api_path_post_install_ca } from '../../globalUrls' import Select from "@material-ui/core/Select"; -import buildSelectMenuItems from "../../tools"; +import * as tool from "../../tools"; import Input from "@material-ui/core/Input"; import Typography from "@material-ui/core/Typography"; @@ -51,8 +51,8 @@ export default function CaSetup(props) { {value: 315569260000, label: "10 years"}, ]; - const certificateOptionsItems = buildSelectMenuItems(getCertificateOptions); - const validityPeriodsItems = buildSelectMenuItems(validityPeriods); + const certificateOptionsItems = tool.buildSelectMenuItems(getCertificateOptions); + const validityPeriodsItems = tool.buildSelectMenuItems(validityPeriods); const classes = useStyles(); const [commonname, setCommonName] = React.useState(""); @@ -76,7 +76,7 @@ export default function CaSetup(props) { props.setError(true) props.setErrorMessage("An unknown error occurred while installing the CA. Please try again."); } - else if (data.status == 200){ + else if (data.status == 200){ auth.uri = '/api/install/auth'; history.push('/'); } @@ -113,13 +113,15 @@ export default function CaSetup(props) { let jsonData = {}; if(certificateOpt.value == 0){ jsonData = { - 'commonName': commonname, - 'organizationalUnit': organizationUnit, - 'organization': organization, - 'city': city, - 'state': state, - 'country': country, - 'lifetime': validityPeriod.value + 'fields': { + 'commonName': commonname, + 'organizationalUnit': organizationUnit, + 'organization': organization, + 'city': city, + 'state': state, + 'country': country, + 'lifetime': validityPeriod.value + } } } else if(certificateOpt.value == 1){ @@ -136,7 +138,7 @@ export default function CaSetup(props) { console.log(response); }).catch((error)=>{ props.setError(error); - console.log('Error creating admin account: ' + error ); + console.log('Error installing CA Setup: ' + error ); }) } if(certificateOpt.value == 0){ diff --git a/jams-react-client/src/components/Grid/GridItem.js b/jams-react-client/src/components/Grid/GridItem.js index 8072e19a0c45b9c299ca638ea7224f36520e2850..f7a82de03791f8c539f29ad38719d568e89283f4 100644 --- a/jams-react-client/src/components/Grid/GridItem.js +++ b/jams-react-client/src/components/Grid/GridItem.js @@ -7,10 +7,7 @@ import Grid from "@material-ui/core/Grid"; const styles = { grid: { - padding: "0 15px !important", - "&:hover": { - backgroundColor: "hsla(0,0%,78%,.2)", - } + padding: "0 5px !important", } }; diff --git a/jams-react-client/src/components/IdentityManagement/IdentityManagement.js b/jams-react-client/src/components/IdentityManagement/IdentityManagement.js index 16816abdb16167f6cba34ac89130912af515c60c..61da28f46b27d1a0b3fe83a8378637861246d72d 100644 --- a/jams-react-client/src/components/IdentityManagement/IdentityManagement.js +++ b/jams-react-client/src/components/IdentityManagement/IdentityManagement.js @@ -7,7 +7,7 @@ import { makeStyles } from '@material-ui/core/styles'; import MuiAlert from '@material-ui/lab/Alert'; import Select from '@material-ui/core/Select'; -import buildSelectMenuItems from '../../tools' +import {buildSelectMenuItems} from '../../tools' import axios from 'axios'; import configApiCall from '../../api' @@ -51,7 +51,7 @@ export default function IdentityManagement(props) { {value: 1, label: "LDAP Server"}, {value: 2, label: "Active Directory"}, ]; - + const directoryTypesItems = buildSelectMenuItems(directoryTypes); const classes = useStyles(); @@ -76,7 +76,7 @@ export default function IdentityManagement(props) { /** * LDAP storage Config - * + * */ const ldapFiltersTypes = [ {value: 0, label: "UID"}, @@ -93,7 +93,7 @@ export default function IdentityManagement(props) { const handleUseStartTLSChange = (event) => { setUseStartTLS(event.target.value) } - + const handleNameServerChange = (event) => { setNameServerChecked(event.target.checked) } @@ -122,7 +122,7 @@ export default function IdentityManagement(props) { "publicNameServer": "http://ns.jami.net", "publicNames": nameServerChecked }; - + authSource['type'] = 'LOCAL'; authSource['localAuthSettings'] = settings; return authSource; @@ -150,7 +150,7 @@ export default function IdentityManagement(props) { settings['fieldMappings']['extensionName'] = "PhoneNumberExtension"; settings['fieldMappings']['o'] = "Organization"; settings['fieldMappings']['uid'] = "Username"; - + authSource['type'] = 'LDAP'; authSource['ldapSettings'] = settings; return authSource; @@ -166,7 +166,7 @@ export default function IdentityManagement(props) { settings['realm'] = domainName settings['username'] = adminUsername settings['password'] = password - + settings['fieldMappings'] = {}; settings['fieldMappings']['sAMAccountName'] = "Username" settings['fieldMappings']['givenName'] = "FirstName"; @@ -179,7 +179,7 @@ export default function IdentityManagement(props) { settings['fieldMappings']['extensionName'] = "PhoneNumberExtension"; settings['fieldMappings']['o'] = "Organization"; settings['fieldMappings']['uid'] = "Username"; - + authSource['type'] = 'AD'; authSource['activeDirectorySettings'] = settings; return authSource; @@ -249,7 +249,7 @@ export default function IdentityManagement(props) { } return ( - + <form className={classes.form} noValidate onSubmit={handleSubmit}> <Typography variant="h5" gutterBottom color="primary">Identity Management</Typography> <Grid container spacing={3}> @@ -263,7 +263,7 @@ export default function IdentityManagement(props) { variant="outlined" children={directoryTypesItems} /> - </Grid> + </Grid> </Grid> {returnForm()} <Button diff --git a/jams-react-client/src/components/ServerParameters/ServerParameters.js b/jams-react-client/src/components/ServerParameters/ServerParameters.js index d178aff4066a8c2d1798927e102f1f86ed081ade..87e7c6675fa862fb24c539340100b2f4fc3a94a2 100644 --- a/jams-react-client/src/components/ServerParameters/ServerParameters.js +++ b/jams-react-client/src/components/ServerParameters/ServerParameters.js @@ -1,4 +1,5 @@ import React from 'react'; +import { useHistory } from 'react-router-dom'; import Avatar from '@material-ui/core/Avatar'; import Button from '@material-ui/core/Button'; import CssBaseline from '@material-ui/core/CssBaseline'; @@ -17,11 +18,12 @@ import CustomPopupState from '../CustomPopupState/CustomPopupState'; import Select from '@material-ui/core/Select'; import Input from '@material-ui/core/Input'; -import buildSelectMenuItems from "../../tools"; +import * as tool from "../../tools"; import axios from 'axios'; import configApiCall from '../../api' import {api_path_post_install_server} from '../../globalUrls' +import auth from 'auth'; const useStyles = makeStyles((theme) => ({ paper: { @@ -67,12 +69,12 @@ export default function ServerParameters(props) { {value: 315569520000, label: "10 Years"}, ] - const certificateRevocationTypesItems = buildSelectMenuItems(certificateRevocationTypes); - const deviceLifetimeTypesItems = buildSelectMenuItems(deviceLifetimeTypes); - const userAccountLifetimeTypesItems = buildSelectMenuItems(userAccountLifetimeTypes); + const certificateRevocationTypesItems = tool.buildSelectMenuItems(certificateRevocationTypes); + const deviceLifetimeTypesItems = tool.buildSelectMenuItems(deviceLifetimeTypes); + const userAccountLifetimeTypesItems = tool.buildSelectMenuItems(userAccountLifetimeTypes); const classes = useStyles(); - //const history = useHistory(); + const history = useHistory(); const [error, setError] = React.useState(props.error); const [domain, setDomain] = React.useState(""); const [certificateRevocation, setCertificateRevocation] = React.useState(certificateRevocationTypes[0]) @@ -81,6 +83,22 @@ export default function ServerParameters(props) { const [sipConfigurationTemplate, setSIPCertificateTemplate] = React.useState(null); const [userlifeDisabled, setUserlifeDisabled] = React.useState(false); + React.useEffect(() => { + if(deviceLifetime.value <= userAccountLifetime.value){ + setUserlifeDisabled(false); + } + else{ + setUserlifeDisabled(true); + } + }, [deviceLifetime, userAccountLifetime]); + + function callBackServerParameters(){ + auth.installed = true + auth.authenticated = true + auth.admin = true + history.push('/admin'); + } + function handleSubmit(e) { e.preventDefault(); let jsonData = {}; @@ -88,17 +106,17 @@ export default function ServerParameters(props) { if(domain.match(re)){ jsonData = { 'serverDomain': domain, - 'crlLifetime': certificateRevocation, - 'deviceLifetime': deviceLifetime, - 'userLifetime': userAccountLifetime, + 'crlLifetime': certificateRevocation.value, + 'deviceLifetime': deviceLifetime.value, + 'userLifetime': userAccountLifetime.value, 'sipConfig': sipConfigurationTemplate, 'signingAlgorithm': "SHA512WITHRSA" } axios(configApiCall(api_path_post_install_server, "POST", jsonData, null)).then((response)=>{ - console.log(response); + callBackServerParameters() }).catch((error)=>{ setError(error); - console.log('Error creating admin account: ' + error ); + console.log('Error installin server parameters: ' + error ); }) } else{ @@ -109,35 +127,22 @@ export default function ServerParameters(props) { } const handleCertificateRevocationChange = (event) => { - setCertificateRevocation(event.target.value) + setCertificateRevocation(tool.retrieveArrayElement(event.target.value,certificateRevocationTypes)) } const handleDeviceLifetimeChange = (event) => { - setDeviceLifetime(event.target.value) - if(parseInt(deviceLifetime) <= parseInt(userAccountLifetime)){ - setUserlifeDisabled(false); - } - else{ - setUserlifeDisabled(true); - } + setDeviceLifetime(tool.retrieveArrayElement(event.target.value, deviceLifetimeTypes)); } const handleUserAccountLifetimeChange = (event) => { - setUserAccountLifetime(event.target.value) - if(parseInt(deviceLifetime) <= parseInt(userAccountLifetime)){ - setUserlifeDisabled(false); - } - else{ - setUserlifeDisabled(true); - } - + setUserAccountLifetime(tool.retrieveArrayElement(event.target.value, userAccountLifetimeTypes)); } + const handleSipConfigurationTemplateChange = (event) => { setSIPCertificateTemplate(event.target.files[0]) } - return ( <form className={classes.form} noValidate onSubmit={handleSubmit}> <Typography variant="h5" gutterBottom color="primary">Server Parameters</Typography> @@ -160,7 +165,7 @@ export default function ServerParameters(props) { <Select labelId="certificate-revocation-select-label" fullWidth - value={certificateRevocation.id} + value={certificateRevocation.value} onChange={handleCertificateRevocationChange} variant="outlined" children={certificateRevocationTypesItems} @@ -169,7 +174,7 @@ export default function ServerParameters(props) { <Select labelId="device-lifetime-select-label" fullWidth - value={deviceLifetime.id} + value={deviceLifetime.value} onChange={handleDeviceLifetimeChange} variant="outlined" children={deviceLifetimeTypesItems} @@ -178,9 +183,9 @@ export default function ServerParameters(props) { <Select labelId="user-account-lifetime-select-label" fullWidth - value={userAccountLifetime.id} + value={userAccountLifetime.value} onChange={handleUserAccountLifetimeChange} - disabled={userlifeDisabled} + isDisabled={userlifeDisabled} variant="outlined" children={userAccountLifetimeTypesItems} /> diff --git a/jams-react-client/src/configured.route.js b/jams-react-client/src/configured.route.js index 0e10c355082a884dd0311cb70086b1745b20794f..b2e1265a455d10237c8138a7424ef541dca3d8ad 100644 --- a/jams-react-client/src/configured.route.js +++ b/jams-react-client/src/configured.route.js @@ -4,6 +4,7 @@ import { Route, Redirect } from 'react-router-dom' import auth from './auth' import SignUp from "layouts/SignUp"; import SignIn from "layouts/SignIn"; +import Admin from 'layouts/Admin'; export const ConfiguredRoute = ({ component: Component, ...rest }) => { return ( @@ -26,7 +27,13 @@ export const ConfiguredRoute = ({ component: Component, ...rest }) => { } } else{ - return <SignIn /> + if(auth.isAuthenticated()){ + return <Admin /> + } + else { + return <SignIn /> + } + } } else { return <SignUp step={0}/> diff --git a/jams-react-client/src/layouts/SignIn.js b/jams-react-client/src/layouts/SignIn.js index a25a71f275f8d5cee8ba8966575ed86e6d6973b6..2eb818404ca8cadfc1572905dc62fb2796937e94 100644 --- a/jams-react-client/src/layouts/SignIn.js +++ b/jams-react-client/src/layouts/SignIn.js @@ -72,7 +72,13 @@ export default function SignIn(props) { auth.login(jsonData, () => { if(auth.authenticated && auth.access_token != ""){ auth.checkLastKnowStep(()=>{ - history.push('/'); + if(auth.isInstalled){ + history.push('/admin'); + } + else{ + history.push('/'); + } + }) }else{ setError(true) diff --git a/jams-react-client/src/layouts/SignUp.js b/jams-react-client/src/layouts/SignUp.js index ae0c522d5219758255f7890d9e4a76e0d4c7d9af..feba0272e77f56dd3828e8d9e15c1a568535ebcb 100644 --- a/jams-react-client/src/layouts/SignUp.js +++ b/jams-react-client/src/layouts/SignUp.js @@ -42,12 +42,6 @@ function Copyright() { } const useStyles = makeStyles((theme) => ({ - paper: { - marginTop: theme.spacing(8), - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - }, avatar: { margin: theme.spacing(1), backgroundColor: theme.palette.secondary.main, diff --git a/jams-react-client/src/tools.js b/jams-react-client/src/tools.js index 0f0a7075fe343bceae7043c764085afc55f58aa8..3c6fe215281797df5e9e6385aab7345c79674d6b 100644 --- a/jams-react-client/src/tools.js +++ b/jams-react-client/src/tools.js @@ -1,11 +1,33 @@ import React from 'react'; import MenuItem from '@material-ui/core/MenuItem'; -function buildSelectMenuItems(elements) { +export function buildSelectMenuItems(elements) { return elements.map((d) => <MenuItem value={d.value}>{d.label}</MenuItem> ) } +// read file content +export function readSingleFile(evt, fieldContents) { + var f = evt.target.files[0]; + if (f) { + var r = new FileReader(); + r.onload = function (e) { + var contents = e.target.result; + fieldContents=contents; + } + console.log(fieldContents); + r.readAsText(f); + return fieldContents + } +} + +export function retrieveArrayElement(value, elements){ + for(let i=0; i < elements.length;i++){ + if(elements[i].value === value){ + return elements[i]; + } + } +} -export default buildSelectMenuItems; \ No newline at end of file +export default {buildSelectMenuItems, readSingleFile, retrieveArrayElement}; \ No newline at end of file diff --git a/jams-react-client/src/views/Blueprints/Blueprints.js b/jams-react-client/src/views/Blueprints/Blueprints.js index 49c5e8e8da036d7bcc37456ad5e3d685005d5c24..43996fab325d6629cdc75fca366305cfa4ecd285 100644 --- a/jams-react-client/src/views/Blueprints/Blueprints.js +++ b/jams-react-client/src/views/Blueprints/Blueprints.js @@ -13,8 +13,7 @@ import CardAvatar from "components/Card/CardAvatar.js"; import CardBody from "components/Card/CardBody.js"; import CardFooter from "components/Card/CardFooter.js"; -import avatar1 from "assets/img/faces/cyrille_beraud.jpeg"; -import avatar2 from "assets/img/faces/christophe_villemaire.jpeg"; +import noProfilePicture from "assets/img/faces/no-profile-picture.png"; const styles = { cardCategoryWhite: { @@ -46,7 +45,7 @@ export default function Blueprints() { <Card profile> <CardAvatar profile> <a href="#pablo" onClick={e => e.preventDefault()}> - <img src={avatar1} alt="..." /> + <img src={noProfilePicture} alt="..." /> </a> </CardAvatar> <CardBody profile> @@ -65,7 +64,7 @@ export default function Blueprints() { <Card profile> <CardAvatar profile> <a href="#pablo" onClick={e => e.preventDefault()}> - <img src={avatar2} alt="..." /> + <img src={noProfilePicture} alt="..." /> </a> </CardAvatar> <CardBody profile> diff --git a/jams-react-client/src/views/Groups/Groups.js b/jams-react-client/src/views/Groups/Groups.js index 431766275db7531e5b2c35d32760b960374e9e3a..851a83e6872fbddb242b4e49d7f98217d3998853 100644 --- a/jams-react-client/src/views/Groups/Groups.js +++ b/jams-react-client/src/views/Groups/Groups.js @@ -13,8 +13,7 @@ import CardAvatar from "components/Card/CardAvatar.js"; import CardBody from "components/Card/CardBody.js"; import CardFooter from "components/Card/CardFooter.js"; -import avatar1 from "assets/img/faces/cyrille_beraud.jpeg"; -import avatar2 from "assets/img/faces/christophe_villemaire.jpeg"; +import noProfilePicture from "assets/img/faces/no-profile-picture.png"; const styles = { cardCategoryWhite: { @@ -46,7 +45,7 @@ export default function Groups() { <Card profile> <CardAvatar profile> <a href="#pablo" onClick={e => e.preventDefault()}> - <img src={avatar1} alt="..." /> + <img src={noProfilePicture} alt="..." /> </a> </CardAvatar> <CardBody profile> @@ -65,7 +64,7 @@ export default function Groups() { <Card profile> <CardAvatar profile> <a href="#pablo" onClick={e => e.preventDefault()}> - <img src={avatar2} alt="..." /> + <img src={noProfilePicture} alt="..." /> </a> </CardAvatar> <CardBody profile> diff --git a/jams-react-client/src/views/UserProfile/UserProfile.js b/jams-react-client/src/views/UserProfile/UserProfile.js index bff7f37bf882809235081353eb01ad9b5586f9c2..12f4131a310502fa02cb6ade74d3b6130f5a7bb5 100755 --- a/jams-react-client/src/views/UserProfile/UserProfile.js +++ b/jams-react-client/src/views/UserProfile/UserProfile.js @@ -22,10 +22,7 @@ import Tab from '@material-ui/core/Tab'; import Typography from '@material-ui/core/Typography'; import Box from '@material-ui/core/Box'; -import avatar from "assets/img/faces/cyrille_beraud.jpeg"; - -import avatar1 from "assets/img/faces/larbi_gharib.jpeg"; -import avatar2 from "assets/img/faces/christophe_villemaire.jpeg"; +import noProfilePicture from "assets/img/faces/no-profile-picture.png"; import { infoColor @@ -229,7 +226,7 @@ export default function UserProfile() { <Card profile> <CardAvatar profile> <a href="#pablo" onClick={e => e.preventDefault()}> - <img src={avatar} alt="..." /> + <img src={noProfilePicture} alt="..." /> </a> </CardAvatar> <CardBody profile> @@ -274,7 +271,7 @@ export default function UserProfile() { <Card profile> <CardAvatar profile> <a href="#pablo" onClick={e => e.preventDefault()}> - <img src={avatar1} alt="..." /> + <img src={noProfilePicture} alt="..." /> </a> </CardAvatar> <CardBody profile> @@ -293,7 +290,7 @@ export default function UserProfile() { <Card profile> <CardAvatar profile> <a href="#pablo" onClick={e => e.preventDefault()}> - <img src={avatar2} alt="..." /> + <img src={noProfilePicture} alt="..." /> </a> </CardAvatar> <CardBody profile> diff --git a/jams-react-client/src/views/Users/Users.js b/jams-react-client/src/views/Users/Users.js index dd055a29801d1e1745d9bdf7e9dc5a7b00365b8b..bf2a4d0e0e61bcf6a745d80f42a8d5972d8ba973 100644 --- a/jams-react-client/src/views/Users/Users.js +++ b/jams-react-client/src/views/Users/Users.js @@ -14,16 +14,21 @@ import CardAvatar from "components/Card/CardAvatar.js"; import CardBody from "components/Card/CardBody.js"; import CardFooter from "components/Card/CardFooter.js"; import UserProfile from "views/UserProfile/UserProfile.js" +import PersonIcon from '@material-ui/icons/Person'; +import PermIdentityIcon from '@material-ui/icons/PermIdentity'; +import PhoneOutlinedIcon from '@material-ui/icons/PhoneOutlined'; +import BusinessOutlinedIcon from '@material-ui/icons/BusinessOutlined'; -import ajaxApiCall from "api.js"; - -import { api_path_post_auth_login, api_path_get_user_directory_search } from "globalUrls"; +import MailOutlineIcon from '@material-ui/icons/MailOutline'; +import axios from "axios"; +import configApiCall from "api.js"; +import { api_path_get_user_directory_search } from "globalUrls"; import AddCircleOutlineIcon from '@material-ui/icons/AddCircleOutline'; import KeyboardReturnIcon from '@material-ui/icons/KeyboardReturn'; -import avatar1 from "assets/img/faces/cyrille_beraud.jpeg"; -import avatar2 from "assets/img/faces/christophe_villemaire.jpeg"; +import jami from "assets/img/faces/jami.png"; +import noProfilePicture from "assets/img/faces/no-profile-picture.png"; const styles = { cardCategoryWhite: { @@ -48,11 +53,16 @@ const useStyles = makeStyles(styles); export default function Users() { const classes = useStyles(); - + const [users, setUsers] = React.useState([]) useEffect(() => { - - }); + axios(configApiCall(api_path_get_user_directory_search, 'GET', {"queryString":"*"}, null)).then((response)=>{ + setUsers(response.data) + } + ).catch((error) =>{ + console.log(error); + }); + }, []); const [selectedProfile, setSelectedProfile] = useState(false); @@ -65,6 +75,15 @@ export default function Users() { setSelectedProfile(false); } + function dataURLtoFile(dataurl, filename) { + var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], + bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); + while(n--){ + u8arr[n] = bstr.charCodeAt(n); + } + return new File([u8arr], filename, {type:mime}); + } + if (selectedProfile) { return ( <div> @@ -77,43 +96,31 @@ export default function Users() { } else { return ( <div> - <Button variant="contained" color="primary" href="#contained-buttons"> - <AddCircleOutlineIcon /> Create user - </Button> - <br></br><br></br> <GridContainer> - <GridItem xs={12} sm={12} md={2}> - <a href="#" onClick={redirectToUserProfile}> - <Card profile> - <CardAvatar profile> - <img src={avatar1} alt="..." /> - </CardAvatar> - <CardBody profile> - <h6 className={classes.cardCategory}>CEO</h6> - <h4 className={classes.cardTitle}>Cyrille Béraud</h4> - <p className={classes.description}> - 13 devices - </p> - </CardBody> - </Card> - </a> - </GridItem> - <GridItem xs={12} sm={12} md={2}> - <a href="#" onClick={redirectToUserProfile}> - <Card profile> - <CardAvatar profile> - <img src={avatar2} alt="..." /> - </CardAvatar> - <CardBody profile> - <h6 className={classes.cardCategory}>CEO</h6> - <h4 className={classes.cardTitle}>Christophe Villemer</h4> - <p className={classes.description}> - 10 devices - </p> - </CardBody> - </Card> - </a> + <GridItem xs={12} sm={12} md={12}> + <Button variant="contained" color="primary" href="#contained-buttons"> + <AddCircleOutlineIcon /> Create user + </Button> </GridItem> + { + users.map(user => + <GridItem xs={12} sm={12} md={2} key={user.username}> + <a href="#" onClick={redirectToUserProfile}> + <Card profile> + <CardBody profile> + <CardAvatar profile> + <img src={user.profilePicture ? ('data:image/png;base64, ' + user.profilePicture) : noProfilePicture} alt="..." /> + </CardAvatar> + <h4 className={classes.cardTitle}>{user.firstName} {user.lastName}</h4> + <ul> + <li><img src={jami} width="20" alt="Jami" /> {user.username}</li> + <li><BusinessOutlinedIcon fontSize='small' /> {user.organization ? user.organization : 'No organization'}</li> + </ul> + </CardBody> + </Card> + </a> + </GridItem>) + } </GridContainer> </div> );