Compare commits

...

63 Commits

Author SHA1 Message Date
llaniau 8165d99ff5 sitemap 2021-06-28 08:53:16 +02:00
llaniau f7421f55f4 Epuration code avant MEP 2021-06-28 08:46:10 +02:00
llaniau 6053655e1d Epuration code avant MEP 2021-06-28 08:45:44 +02:00
llaniau 2fd7836c59 Correction faute orthographe 2021-06-22 10:37:57 +02:00
llaniau 68f8f374f4 Mise en ligne profil new 2021-06-14 12:40:51 +02:00
llaniau b1bc57b670 Bug messagerie 2021-06-14 12:28:29 +02:00
llaniau 83a296fbd6 Mise en pre prod 2021-06-07 15:39:50 +02:00
llaniau 62f1658bbe US 555 : onglet messagerie 2021-06-07 15:37:12 +02:00
llaniau 7acb3b4aff Bug Helmet 2021-05-31 16:33:53 +02:00
llaniau d563cc52f4 Mise en place du composant Helmet 2021-05-31 14:40:19 +02:00
llaniau c9ab5b0c8c Bug maps 2021-05-31 13:12:51 +02:00
llaniau a4d366ef3e Google maps sans async 2021-05-31 13:00:39 +02:00
llaniau 1197b6c144 Logo defilant 2021-05-31 12:54:49 +02:00
llaniau 9371b7a7bc MEP zvec mise a jour profil 2021-05-31 12:51:03 +02:00
llaniau 165d888ac1 Test vimeo sans retour 2021-05-31 12:07:25 +02:00
llaniau f850cae364 Faute orthographe 2021-05-31 11:23:39 +02:00
llaniau 75ae9664cf MEP V2.10.6_prod (page secrete) 2021-05-31 11:20:08 +02:00
llaniau 3c39e8da12 Mise en forme détail de candiature 2021-05-25 17:41:54 +02:00
llaniau d8ded1e8d7 Profil 6 info + cv 2021-05-25 11:20:13 +02:00
llaniau 3cb2bc5549 profil 5 2021-05-25 10:48:23 +02:00
llaniau ee98e61d97 Mention legales 2021-05-25 10:44:14 +02:00
llaniau 99e19dfc54 Config MEP 2.10.4 2021-05-25 10:40:55 +02:00
llaniau 9bc0696d8d MEP pour test profil 2021-05-25 10:40:10 +02:00
llaniau 580175126b Sitemap 2021-05-17 11:02:39 +02:00
llaniau 41b89bf4b8 MEP V2.10.3 2021-05-17 10:53:12 +02:00
llaniau f205b571bc pb parametrage livraison 2021-05-12 17:20:11 +02:00
llaniau 57ba629402 Bug244, 245, 247, 249 2021-05-10 10:04:08 +02:00
llaniau 6a5657f4ad ancres 2021-05-03 23:03:49 +02:00
llaniau dc0c27d07b faute d'orthographe sur a traiter 2021-05-03 22:06:08 +02:00
llaniau 8deda05a55 US 549/550 2021-05-03 16:45:07 +02:00
llaniau 3702f07f44 US550 : page profil 2021-05-03 13:25:59 +02:00
llaniau 9844a43312 Init V2.10.1 2021-04-26 11:29:46 +02:00
llaniau 9a73c59197 sitemap 2021-04-26 09:01:27 +02:00
llaniau 46950b15d7 Activation referencement 2021-04-19 14:01:37 +02:00
llaniau 48e4108270 sitemap 2021-04-19 10:11:38 +02:00
llaniau 0c70c93d99 MEP V2.9.2 2021-04-19 10:02:44 +02:00
llaniau bae6713dac Bug 239 2021-04-12 20:16:15 +02:00
llaniau 4dc3e224fc Api pole emploi, reglage corentin 2021-04-08 13:02:47 +02:00
llaniau 48a9ca5fe9 US 487 : Api pole emploi app 2021-03-31 19:23:45 +02:00
llaniau 60f8f4e71e Init V2.9.1 pre prod 2021-03-30 15:31:33 +02:00
llaniau b4b2bcd95e Desactiver nofollow 2021-03-30 09:52:17 +02:00
llaniau 5706decd1e MEP V2.8.3 2021-03-29 15:38:27 +02:00
llaniau 47acace2e7 Correctif suite a recette V2.8.2 2021-03-29 14:32:19 +02:00
llaniau 933333b786 V2.8.2 2021-03-25 14:35:16 +01:00
llaniau daf65d5a47 Automatisation referenecement MEP 2021-03-25 10:06:28 +01:00
llaniau 9f1f092259 page accueil webapp 2021-03-23 18:20:23 +01:00
llaniau d47a393eb6 retour recette V2.8.1 2021-03-22 18:29:03 +01:00
llaniau 5421091175 modif de _document.js 2021-03-22 09:58:59 +01:00
llaniau 81bd79ecac Bug push 2021-03-19 10:50:55 +01:00
llaniau 996c2c5728 Message texte ET video 2021-03-16 22:27:03 +01:00
llaniau 605b43a866 MEP V2.7.5 2021-03-10 11:32:45 +01:00
llaniau 3e5d9f2555 V2.7.5 2021-03-10 10:29:45 +01:00
llaniau e8bb1374d9 Reglage page d'accueil 2021-03-10 10:04:38 +01:00
llaniau 8be4c6d08c Image page accueil 2021-03-09 12:30:53 +01:00
llaniau b519451a0c page accueil 2021-03-09 12:25:46 +01:00
llaniau 04d03aa736 page accueil web app 2021-03-08 19:43:14 +01:00
llaniau c71fe2b452 Inscription tel 2021-02-24 15:41:44 +01:00
llaniau ee45ef810b Correction de bugs 2021-02-24 14:01:30 +01:00
llaniau 63bd801281 retour de recette et page accueil 2021-02-22 18:01:33 +01:00
llaniau ddb1abbe70 sitemap 2021-02-18 14:00:35 +01:00
llaniau e7b9298a3b Param pre prod 2021-02-16 17:18:58 +01:00
llaniau ea69a5f308 Nouvelle page accueil redirect 2021-02-16 17:14:19 +01:00
llaniau 8fe612824b referencement , fonts 2021-02-15 18:17:04 +01:00
79 changed files with 6652 additions and 295 deletions
+42 -7
View File
@@ -6,6 +6,8 @@ import VideoVimeo from './VideoVimeo'
import ChatCardMessage from './ChatCardMessage'
import _ from "lodash"
import Ar from "lodash/array"
import {TextField, Button, Grid, Hidden} from '@material-ui/core';
import ButtonBase from '@material-ui/core/ButtonBase';
const useStyles = makeStyles(theme => ({
card: {
@@ -31,14 +33,14 @@ const useStyles = makeStyles(theme => ({
padding: theme.spacing(2,0),
},
currentUserBubble: {
background: theme.palette.primary.important,
alignSelf: 'flex-end',
},
currentMessageSender: {
color: theme.palette.primary.important,
},
otherUserBubble: {
background: theme.palette.primary.main,
alignSelf: 'flex-start',
},
otherMessageSender: {
@@ -55,6 +57,21 @@ const useStyles = makeStyles(theme => ({
},
},
cartoucheChat: {
// display: 'flex',
padding: theme.spacing(2) + 'px 18vw'
}
,
grille: {
paddingTop: theme.spacing(4),
paddingBottom: theme.spacing(4),
paddingLeft : theme.spacing(4),
marginBottom: "30px",
borderRadius: "5px",
border: "1px solid #1E2327",
color: theme.palette.primary.dark
},
}));
export default function ChatCard(props) {
@@ -65,19 +82,37 @@ export default function ChatCard(props) {
const bubbleClass = (userFirstName === props.message.sender.firstname && userLastName === props.message.sender.lastname) ? classes.currentUserBubble : classes.otherUserBubble
const messageSenderClass = (userFirstName === props.message.sender.firstname && userLastName === props.message.sender.lastname) ? classes.currentMessageSender : classes.otherMessageSender
const bubbleSide = (userFirstName === props.message.sender.firstname && userLastName === props.message.sender.lastname) ? 'right' : 'left'
// const logoUrl = (props.answer.ad
// ? (props.answer.ad.company.logo
// ? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + this.props.answer.ad.company.logo
// : publicRuntimeConfig.symphonyUrl + "/img/default_picture_svg")
// : "")
const logoUrl = ""
return (
<Fragment>
<ChatCardMessage side={bubbleSide} firstname={props.message.sender.firstname} lastname={props.message.sender.lastname} picture={userPicture} video={(props.message.video) ? true : false} message={(props.message.video) ? (<VideoVimeo classesOverride={ classes.videoVimeo } videoId={Ar.last(_.split(props.message.video.cdn_url, '/'))} />) : props.message.content} messageSenderClass={messageSenderClass} bubbleClass={bubbleClass}/>
<section className={classes.grille}>
<ChatCardMessage side={bubbleSide} firstname={props.message.sender.firstname} lastname={props.message.sender.lastname} picture={userPicture}
video={
(props.message.video)
? true :
false}
message={
(props.message.video)
? (<VideoVimeo classesOverride={ classes.videoVimeo } videoId={Ar.last(_.split(props.message.video.cdn_url, '/'))} />)
: ""}
messageTexte = {props.message.content}
messageSenderClass={messageSenderClass} bubbleClass={bubbleClass}
envoyeLe={(new Date(props.message.c_time)).toLocaleDateString("fr-FR")}
envoyeA ={(new Date(props.message.c_time)).toLocaleTimeString("fr-FR")}/>
<Typography
className={classes.messageDate}
align="center"
>
Envoyé le {(new Date(props.message.c_time)).toLocaleDateString("fr-FR")} à {(new Date(props.message.c_time)).toLocaleTimeString("fr-FR")}
{/* Envoyé le {(new Date(props.message.c_time)).toLocaleDateString("fr-FR")} à {(new Date(props.message.c_time)).toLocaleTimeString("fr-FR")} */}
</Typography>
</Fragment>
</section>
)
}
+38 -11
View File
@@ -1,5 +1,6 @@
import React from 'react'
import { Typography } from '@material-ui/core';
import { Grid} from '@material-ui/core';
import { makeStyles } from '@material-ui/core/styles';
import _ from "lodash"
@@ -15,13 +16,18 @@ const useStyles = makeStyles(theme => ({
justifyContent: 'flex-end',
},
messageSender: {
fontSize: '0.9em',
fontWeight: '300',
color: theme.palette.primary.important,
fontSize: '1em',
fontWeight: '600',
color: theme.palette.primary.dark,
},
messageContent: {
fontWeight: '300',
color: theme.palette.secondary.main,
fontWeight: '600',
color: theme.palette.primary.dark,
},
messageTexteContent: {
marginTop: theme.spacing(1),
},
userBubble: {
width: 'auto',
@@ -57,37 +63,58 @@ const useStyles = makeStyles(theme => ({
},
second: {
order: 2,
},
grille: {
paddingTop: theme.spacing(4),
paddingBottom: theme.spacing(4),
paddingLeft : theme.spacing(4),
marginBottom: "30px",
borderRadius: "5px",
border: "1px solid #1E2327",
color: theme.palette.primary.dark
}
}));
export default function ChatCardMessage(props) {
const { side, firstname, lastname, picture, message, video, messageSenderClass, bubbleClass } = props;
const { side, firstname, lastname, picture, message, messageTexte, video, messageSenderClass, bubbleClass, envoyeLe, envoyeA } = props;
const classes = useStyles();
const userBubble = (video) ? classes.userBubble +' '+ classes.userBubbleVideo : classes.userBubble
return (
<section className={(side==='left')? classes.userMessageLeft : classes.userMessageRight }>
<div >
{picture ?
<img alt="talents-tube" src={`http://localhost/uploads/img/${picture}`} className={(side==='left')? classes.first+' '+classes.avatar : classes.second +' '+classes.avatar} />
<img alt="talents-tube" src={`http://recruteur.talentstube.com/uploads/img/${picture}`} className={(side==='left')? classes.first+' '+classes.avatar : classes.second +' '+classes.avatar} />
:
<img alt="talents-tube" src='/static/images/default/account-avatar-default.svg' className={(side==='left')? classes.first +' '+ classes.avatar : classes.second+' '+classes.avatar } />
}
<div className={(side==='left')? classes.second : classes.first}>
<Typography
className={classes.messageSender +' '+ messageSenderClass}
className={classes.messageSender }
>
{firstname + ' ' + lastname}
</Typography>
<Typography
className={classes.messageSender }
>
Envoyé le {envoyeLe} à {envoyeA}
</Typography>
<div className={userBubble + ' ' + bubbleClass}>
<Typography
className={classes.messageContent}
>
{message}
<br></br>
<span className={classes.messageTexteContent}>{messageTexte== message? "" : messageTexte}</span>
</Typography>
</div>
</div>
</section>
</div>
)
}
+2
View File
@@ -11,6 +11,7 @@ import Typography from '@material-ui/core/Typography';
import WatchLater from '@material-ui/icons/WatchLater';
import Home from '@material-ui/icons/Home';
import People from '@material-ui/icons/People';
import Place from '@material-ui/icons/Place';
const variantIcon = {
assignment: AssignmentIcon,
@@ -21,6 +22,7 @@ const variantIcon = {
watch_later: WatchLater,
home: Home,
people: People,
place: Place,
};
const styles = theme => ({
@@ -10,6 +10,7 @@ import BusinessCenterIcon from '@material-ui/icons/BusinessCenter';
import People from '@material-ui/icons/People';
import Typography from '@material-ui/core/Typography';
import Business from '@material-ui/icons/Business';
import Place from '@material-ui/icons/Place';
const variantIcon = {
assignment: AssignmentIcon,
@@ -20,6 +21,7 @@ const variantIcon = {
business_center: BusinessCenterIcon,
business: Business,
people: People,
place: Place,
};
const styles = theme => ({
+6 -1
View File
@@ -1,6 +1,7 @@
import React from 'react'
import PropTypes from 'prop-types'
import Head from 'next/head'
const urlEnv = process.env.NODE_ENV;
const OgHead = props => {
return (
@@ -27,7 +28,11 @@ const OgHead = props => {
<meta name="twitter:title" content={props.seo_title}/>
<meta name="twitter:description" content={props.seo_description}/>
<meta name="twitter:image" content={props.image}/>
{/* <meta name="robots" content="noindex, nofollow"></meta> */}
{/* A ENLEVER EN PROD */}
<meta name="robots" content="noindex, nofollow"></meta>
{/* <meta httpEquiv='cache-control' content='no-store,no-cache'></meta>
<meta httpEquiv='expires' content='0'></meta>
<meta httpEquiv='pragma' content='no-cache'></meta> */}
+334
View File
@@ -0,0 +1,334 @@
import React, { Fragment } from 'react';
import { connect } from "react-redux";
import { fetchCurrentUserRequest } from '../../actions/user'
import { fetchCompanyRequest } from '../../actions/companies'
import { uploadMediaCv } from '../../actions/mediaCv'
import { withStyles } from '@material-ui/core/styles'
import { makeStyles } from '@material-ui/styles';
import { Button, Typography, Divider, Hidden } from '@material-ui/core';
import KeyboardArrowRightIcon from '@material-ui/icons/KeyboardArrowRight';
import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';
import LoaderVideo from '../templates/loaderVideo'
import Snack from '../atoms/snack';
import Snackbar from '@material-ui/core/Snackbar';
import { Alert, AlertTitle } from '@material-ui/lab';
import ReactHtmlParser from 'react-html-parser';
import getConfig from 'next/config'
import Card from '@material-ui/core/Card';
import CardActions from '@material-ui/core/CardActions';
import CardContent from '@material-ui/core/CardContent';
import Description from '@material-ui/icons/Description';
import Grid from '@material-ui/core/Grid';
import Container from '@material-ui/core/Container';
const styles = theme => ({
root: {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'flex-start',
margin: theme.spacing(1),
},
rootButton: {
textTransform: 'inherit',
},
underlined: {
textDecoration: 'underline',
},
textButton: {
fontWeight: '700',
fontSize: '1.15em',
paddingLeft: theme.spacing(2),
},
InputKeyboardArrowDownIcon: {
fontSize: '2.5em',
color: theme.palette.primary.dark,
},
importButton: {
color: "#1e2327",
backgroundColor: "#fff",
padding: theme.spacing(3, 2),
margin: theme.spacing(1),
width: "100%",
textAlign: "right",
boxShadow: '0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1' +
'px rgba(0, 0, 0, 0.14)',
'&:hover': {
color: "#1e2327",
backgroundColor: "#fff",
}
},
grille :{
paddingTop:theme.spacing(4),
paddingRight:"30px",
width: "100%",
marginBottom:"30px",
borderRadius: "5px",
border: "1px solid #1E2327",
color:theme.palette.primary.dark
},
grille2 :{
margin:'10px',
width: "100%",
marginBottom:"30px",
},
button: {
width:"200px",
textTransform: 'inherit',
margin: theme.spacing(0, 8),
padding: theme.spacing(1.2, 2),
[theme.breakpoints.up('sm')]: {
margin: 'auto',
},
},
boutonMobile:{
width:"200px",
textAlign :"center",
color: theme.palette.secondary.main,
backgroundColor: theme.palette.primary.important,
margin : "0px !important"
},
lien:{
textDecoration:'none',
color:'#fff'
},
centered:{
textAlign:"center"
}
});
const { publicRuntimeConfig } = getConfig();
class Etape3 extends React.Component {
state = {
loading: true,
openSnack: false,
cv:false,
errors: {},
success : {}
};
componentDidMount() {
localStorage.setItem('loginRedirect', window.location.pathname)
if(!!!localStorage.getItem('ttJWT'))
{
Router.push("/Login")
}
else
this.setState({
loading: false,
cvLink: this.props.user.cv
})
}
UNSAFE_componentWillReceiveProps(nextProps) {
console.log(nextProps);
this.setState({
cvLink: nextProps.cvLink,
loading: nextProps.loading,
openSnack: !!!_.isEmpty(nextProps.errors),
errors: !!!nextProps.errors ? { errors: { message: "" } } : nextProps.errors,
})
if (nextProps.mediaCv.statusCv === 'success') {
const success = {};
success.message ="Profil mis à jour";
console.log("CV mis à jour!!!")
if(nextProps.mediaCv) console.log(nextProps.mediaCv.message)
this.setState({
cvLink: nextProps.mediaCv.message,
})
this.setState({ success });
}
}
inputFilesystemChangeCv = (e) => {
this.uploadMediaCv(e)
}
uploadMediaCv = (e) => {
var file = e.target.files[0]
const data = new FormData()
data.append('upload', file)
console.log ("envoi de cv")
this.props.uploadMediaCv(data)
}
AfficherSuccess() {
if (!this.state.success || !this.state.success.message) {
console.log("Erreur Upload CV");
return "";
} else if (this.state.success.length != 0 && this.state.success.message != "") {
return (
<Snackbar open={open} autoHideDuration={1000} onClose={() => this.setState({open: false})}>
<Alert onClose={() => this.setState({open: false})} severity="success">
{ReactHtmlParser(this.state.success.message)}
</Alert>
</Snackbar>
);
}
return "";
}
AfficherLienCv(classes) {
console.log("afficher lien");
if (this.state.cvLink !="") {
return (
<Fragment>
<Hidden>&nbsp;</Hidden>
<Hidden>&nbsp;</Hidden>
<Hidden>&nbsp;</Hidden>
<Hidden>&nbsp;</Hidden>
<Hidden>&nbsp;</Hidden>
<div className={classes.centered} >
<Typography >
<a href={publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.postedContentCv + this.state.cvLink}
target="_blank" className={classes.lien}
>
<Button
variant="contained"
className={classes.button + ' ' + classes.boutonMobile}
>Visualiser mon CV
</Button>
</a>
<br />
</Typography>
</div>
</Fragment>
);
}
return "";
}
render() {
const { classes, company } = this.props;
const { loading } = this.state;
return (
<Grid
container
direction="row"
alignItems="flex-start"
className={classes.grille}
justify="center"
alignItems="center">
<Grid item lg={12} md={12} xl={12} xs={12} className={classes.grilleGauche}>
<div id="cv">
<Typography
align="center"
gutterBottom
variant="headline"
variant="h6"
component="h2"
className={classes.h6}>
<Description className={classes.menuIcon}></Description> Curriculum vitae
</Typography>
<Typography
align="center">Importez votre CV pour permettre aux recruteurs den savoir plus sur vous.
</Typography>
</div>
<Fragment>
{ loading ?
<LoaderVideo textePrincipal="Votre candidature vidéo est en cours denvoi..." texteSecondaire="Veuillez rester sur la page pendant le chargement qui peut durer plusieurs minutes."/> :
<Grid
container
spacing={4}
direction="row"
alignItems="flex-start"
className={classes.grille2}
justify="center"
alignItems="center">
<Grid item xs={12} sm={12} md={12} lg={12} xl={12}>
<Fragment>
{this.AfficherSuccess()}
<input
type="file"
accept=".doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document, .pdf, .odt"
className={classes.input+' cypButtonImportVid'}
style={{ display: 'none' }}
id="import-button-file-cv"
onChange={this.inputFilesystemChangeCv}
/>
<label htmlFor="import-button-file-cv">
<Button component="span" className={classes.importButton} classes={{ root: classes.rootButton }}>
<img alt="talents-tube" src='/statique/images/Import-cv-candidat.svg' className={classes.iconButton} />
<Typography className={classes.textButton}>
J'<span className={classes.underlined}>importe</span> mon CV
</Typography>
<KeyboardArrowDownIcon className={ classes. InputKeyboardArrowDownIcon }/>
</Button>
</label>
<Hidden>&nbsp;</Hidden>
{this.AfficherLienCv(classes)}
<Hidden>&nbsp;</Hidden>
<Hidden>&nbsp;</Hidden>
<Hidden>&nbsp;</Hidden>
</Fragment>
</Grid>
</Grid>
}
</Fragment>
</Grid>
</Grid>
);
}
}
Etape3.getInitialProps = function (context) {
const { adId, companyId } = context.query
const {res} = context
//TODO :really needed ?
context.store.dispatch(fetchCurrentUserRequest())
if(!!adId)
context.store.dispatch(fetchJobRequest(adId))
else if(!!companyId)
context.store.dispatch(fetchCompanyRequest(companyId))
return {};//leave this please
}
function mapStateToProps(state) {
// console.log("mapStateToProps")
// console.log(state.loading)
// console.log(state.user)
// console.log(state.media.message)
return {
user: state.user ,
cvLink : state.user.cv,
loading: !!state.media.loading,
cv : true,
mediaCv: state.mediaCv,
//errors: errorMessageSelector(state),
user: state.user,
company: state.company
};
}
export default withStyles(styles)(connect(mapStateToProps, { fetchCurrentUserRequest, fetchCompanyRequest, uploadMediaCv })(Etape3));
+418 -32
View File
@@ -12,6 +12,13 @@ import ReactHtmlParser, { processNodes, convertNodeToElement, htmlparser2 } from
import {
Button,
} from '@material-ui/core';
import Link from 'next/link'
//US475
import GooglePlaceAutocomplete from 'mui-places-autocomplete'
import { geocodeByAddress } from 'react-places-autocomplete'
//US487
import Autosuggest from 'react-autosuggest';
const styles = theme => ({
container: {
@@ -56,6 +63,24 @@ const styles = theme => ({
},
padding: '5px',
},
labelGeoloc:{
paddingLeft:"14px",
fontSize: "0.8rem",
color:"#1E2327",
fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
fontWeight: "400",
lineHeight: "1",
letterSpacing: "0.00938em", }
,conteneurGoogle:{
border:"1px solid rgb(200, 200, 200)",
borderRadius :"5px",
padding:"5px 0px",
},
conteneurGoogleComposant:{
paddingLeft:"14px"
}
});
const { publicRuntimeConfig } = getConfig();
@@ -71,6 +96,9 @@ class AccountEtape1 extends Component {
this.handleClose = this.handleClose.bind(this);
this.onBlur = this.onBlur.bind(this)
this.onSubmit = this.onSubmit.bind(this);
this.choisirMetier = this.choisirMetier.bind(this);
this.onSuggestionSelected = this.onSuggestionSelected.bind(this);
this.onChange = this.onChange.bind(this);
}
state = {
@@ -90,7 +118,24 @@ class AccountEtape1 extends Component {
website: '',
mediaId: null,
companyId: null,
geoloc: '',
value:'',
route: '',
street_number: '',
locality: '',
administrative_area_level_2: '',
administrative_area_level_1: '',
country: '',
postal_code: '',
formatted_address:"",
lat:"",
lng:"",
appellationId:"",
appellationLibelle:"",
value: '',
suggestions: [],
valueMetier: '',
suggestionsMetier: [],
};
handleChange = (e) => {
@@ -110,12 +155,7 @@ class AccountEtape1 extends Component {
//setOpen(false);
};
onBlur(e) {
console.log("blur")
this.setState({ [e.target.name]: e.target.value });
this.soumettre(e.target.name, "unitaire");
}
UNSAFE_componentWillReceiveProps(nextProps) {
@@ -124,21 +164,22 @@ class AccountEtape1 extends Component {
lastname: nextProps.user.lastname,
phone: nextProps.user.phone,
email: nextProps.user.email,
currentJob: nextProps.user.currentJob,
address1 : nextProps.user.address1,
address2 : nextProps.user.address2,
zipCode : nextProps.user.zipCode,
city : nextProps.user.city,
country : nextProps.user.country,
linkedin: nextProps.user.linkedin,
twitter: nextProps.user.twitter,
website: nextProps.user.website,
companyId: nextProps.companyId,
value: nextProps.user.geoloc && nextProps.user.geoloc[0].formatted_address ? nextProps.user.geoloc[0].formatted_address :"",
valueMetier: nextProps.user.appellationLibelle ? nextProps.user.appellationLibelle :"",
geoloc: nextProps.user.geoloc && nextProps.user.geoloc[0].formatted_address ? nextProps.user.geoloc[0].formatted_address :"",
formatted_address:nextProps.user.geoloc && nextProps.user.geoloc[0].formatted_address ? nextProps.user.geoloc[0].formatted_address :"",
appellationLibelle:nextProps.user.appellationLibelle ? nextProps.user.appellationLibelle :"",
errors: !!!nextProps.errors ? { errors: { message: "" } } : nextProps.errors,
})
}
componentDidMount() {
console.log("USER ................................");
console.log(this.props.user);
this.setState({
firstname: this.props.user.firstname,
lastname: this.props.user.lastname,
@@ -153,10 +194,144 @@ class AccountEtape1 extends Component {
linkedin: this.props.user.linkedin,
twitter: this.props.user.twitter,
website: this.props.user.website,
value: this.props.user.geoloc && this.props.user.geoloc[0].formatted_address ? this.props.user.geoloc[0].formatted_address :"",
valueMetier: this.props.user.appellationLibelle ? this.props.user.appellationLibelle :"",
geoloc: this.props.user.geoloc && this.props.user.geoloc[0].formatted_address ? this.props.user.geoloc[0].formatted_address :"",
route: "",
street_number: "",
locality: "",
administrative_area_level_2: "",
administrative_area_level_1: "",
country: "",
postal_code: "",
formatted_address:this.props.user.geoloc && this.props.user.geoloc[0].formatted_address ? this.props.user.geoloc[0].formatted_address :"",
lat:"",
lng:"",
appellationId:"",
appellationLibelle:this.props.user.appellationLibelle ? this.props.user.appellationLibelle :"",
})
}
remplirLocation = (typeDonnee, donnee) =>{
console.log("DEBUT remplirLocation");
console.log(typeDonnee);
console.log(donnee);
if(typeDonnee=='"street_number"') {
this.setState({ street_number: donnee.replace('"', '') })
}else if(typeDonnee=='"route"') {
this.setState({ route: donnee.replace('"', '') })
}else if(typeDonnee=='"locality"') {
this.setState({ locality: donnee.replace('"', '') })
}else if(typeDonnee=='"administrative_area_level_2"') {
this.setState({ administrative_area_level_2: donnee.replace('"', '') })
}else if(typeDonnee=='"administrative_area_level_1"') {
this.setState({ administrative_area_level_1: donnee.replace('"', '') })
}else if(typeDonnee=='"country"') {
this.setState({ country: donnee.replace('"', '') })
}else if(typeDonnee=='"postal_code"') {
this.setState({ postal_code: donnee.replace('"', '') })
}
console.log("FIN remplirLocation");
}
onSuggestionSelected = (suggestion) => {
console.log('Selected suggestion:', suggestion)
let address = suggestion.description;
var words = address.split(',');
if(words.length<3){
address = "mairie de "+address;
}
this.setState({ geoloc: address})
this.setState({
value: address
});
geocodeByAddress(address)
.then(address => {
console.log("ADRESSE");
console.log(address);
if(address[0].address_components[0]){
this.remplirLocation(JSON.stringify(address[0].address_components[0].types[0]), JSON.stringify(address[0].address_components[0].long_name))
}
if(address[0].address_components[1]){
this.remplirLocation(JSON.stringify(address[0].address_components[1].types[0]), JSON.stringify(address[0].address_components[1].long_name))
}
if(address[0].address_components[2]){
this.remplirLocation(JSON.stringify(address[0].address_components[2].types[0]), JSON.stringify(address[0].address_components[2].long_name))
}
if(address[0].address_components[3]){
this.remplirLocation(JSON.stringify(address[0].address_components[3].types[0]), JSON.stringify(address[0].address_components[3].long_name))
}
if(address[0].address_components[4]){
this.remplirLocation(JSON.stringify(address[0].address_components[4].types[0]), JSON.stringify(address[0].address_components[4].long_name))
}
if(address[0].address_components[5]){
this.remplirLocation(JSON.stringify(address[0].address_components[5].types[0]), JSON.stringify(address[0].address_components[5].long_name))
}
if(address[0].address_components[6]){
this.remplirLocation(JSON.stringify(address[0].address_components[6].types[0]), JSON.stringify(address[0].address_components[6].long_name))
}
if(address[0].geometry){
console.log(address[0].geometry.location_type);
let gps =JSON.stringify(address[0].geometry.location);
const obj = JSON.parse(gps);
this.setState({ formatted_address: JSON.stringify(address[0].formatted_address) })
this.setState({ lat: obj.lat.toString()})
this.setState({ lng: obj.lng.toString()})
}
// console.log("GEOLOC ON geocodeByAddress")
// console.log(this.state.geoloc)
// document.getElementById("geoloc").value =JSON.stringify(address[0]);
// this.props.onSelectionChanged(address[0]);
})
.catch(error => console.error('Error', error))
}
onSuggestionSelected(suggestion) {
// Add your business logic here. In this case we just log...
console.log('Selected suggestion:', suggestion)
}
renderFunc = ({ getInputProps, getSuggestionItemProps, suggestions, loading }) => (
<div>
<input className={styles.inputSearchBar} {...getInputProps()} />
<div >
{loading && <div>Loading...</div>}
{suggestions.map(suggestion => {
const className = suggestion.active ? 'suggestion-item--active' : 'suggestion-item';
const style = suggestion.active
? { backgroundColor: 'red', cursor: 'pointer',border: '1px solid' }
: { backgroundColor: '#123456', cursor: 'pointer',border: '1px solid' };
return (<div {...getSuggestionItemProps(suggestion,{className,style})}>
<span >{suggestion.description}</span>
</div>
)
})}
</div>
</div>
);
callbackFunc = ( autoCompleteData ) => {
//You can use the address data, passed by autocomplete as you want.
}
handleChange = (e) => {
this.setState({ [e.target.name]: e.target.value })
}
onSubmit = (e) => {
e.preventDefault();
@@ -166,6 +341,28 @@ class AccountEtape1 extends Component {
this.soumettre(e.target.name, "global")
}
onChange = (e) => {
this.setState({
value: e.target.value
});
if (e.target.value === '') {
console.log('cleared');
//this.props.onSelectionChanged('');
}
}
onBlur(e) {
console.log("blur");
console.log(e.target.value);
console.log(e.target.name);
this.setState({ [e.target.name]: e.target.value });
this.soumettre(e.target.name, "unitaire");
}
soumettre(champ, type){
console.log("soumettre");
console.log(champ);
@@ -190,7 +387,25 @@ class AccountEtape1 extends Component {
data.append('linkedin', this.state.linkedin)
data.append('twitter', this.state.twitter)
data.append('website', this.state.website)
console.log("GEOLOC ON SUBMIT")
console.log(this.state)
data.append('geoloc', this.state.geoloc)
data.append('street_number', this.state.street_number.replace('"', ''))
data.append('route', this.state.route.replace('"', ''))
data.append('locality', this.state.locality.replace('"', ''))
data.append('administrative_area_level_2', this.state.administrative_area_level_2.replace('"', ''))
data.append('administrative_area_level_1', this.state.administrative_area_level_1.replace('"', ''))
data.append('country', this.state.country.replace('"', ''))
data.append('postal_code', this.state.postal_code.replace('"', ''))
data.append('formatted_address', this.state.formatted_address.replace('"', ''))
data.append('lat', this.state.lat)
data.append('lng', this.state.lng)
//Compétences
data.append('appellationId', this.state.appellationId)
data.append('appellationLibelle', this.state.appellationLibelle)
//TODO:maybe add this two in a single transactionnal saga
this.props.updateUserRequest(data)
@@ -207,7 +422,7 @@ class AccountEtape1 extends Component {
if (type=="global" || (champ=="lastname" && data.lastname=="")) errors.message += " Veuillez saisir votre nom<br />";
if (type=="global" || (champ=="phone" && data.phone=="")) errors.message += "Veuillez saisir un numéro de téléphone<br />";
if (type=="global" || (champ=="currentJob" && data.currentJob=="")) errors.message += "Veuillez saisir votre intitulé de poste actuel ou poste recherché<br />";
if (type=="global" || (champ=="zipCode" && (data.zipCode && data.zipCode!="") && !Validator.isPostalCode(data.zipCode, "FR"))) errors.message += "Le code postal n'est pas correct<br />";
// if (type=="global" || (champ=="zipCode" && (data.zipCode && data.zipCode!="") && !Validator.isPostalCode(data.zipCode, "FR"))) errors.message += "Le code postal n'est pas correct<br />";
// if ((data.website && data.website!="") && !Validator.isURL(data.website)) errors.message += " Veuillez ajouter un site internet avec une url valide<br />";
if (!Validator.isMobilePhone(data.phone, "fr-FR") && !Validator.isNumeric(data.phone, "fr-FR")) errors.message += "Le téléphone n'est pas correct<br />";
//console.log(errors.email);
@@ -258,10 +473,108 @@ class AccountEtape1 extends Component {
this.props.updateUserPictureRequest(data)
}
// METIER
// Filter logic
getSuggestionsMetier = async (valueMetier) => {
console.log("getSuggestionsMetier");
const inputValue = valueMetier.trim().toLowerCase();
let response = await fetch(publicRuntimeConfig.symphonyUrl+"api/getAppelationsLibelle?q=" + inputValue );
// let response = await fetch("http://www.omdbapi.com/?s=" + inputValue + "&apikey=a591bb53");
let data = await response.json()
return data;
};
// Trigger suggestions
getSuggestionMetierValue = suggestion => {
console.log('getSuggestionMetierValue Le code : '+suggestion.code);
console.log('getSuggestionMetierValue Le libellé : '+suggestion.libelle);
document.getElementById('appellation_id').value =suggestion.code;
document.getElementById('appellation_libelle').value = suggestion.libelle;
this.setState({ appellationId: suggestion.code })
this.setState({ appellationLibelle: suggestion.libelle })
this.soumettre("appellation", "unitaire")
return suggestion.libelle;
}
// Render Each Option
renderSuggestionMetier = suggestion => (
// <div style="position: absolute; right: 0px; z-index: 1; will-change: transform; top: 0px; left: 0px; transform: translate3d(14px, 53px, 0px);" data-placement="bottom-start">
// <div class="MuiPaper-root MuiPaper-elevation1 MuiPaper-rounded" style="opacity: 1; transform: none; transform-origin: 0px 0px 0px; transition: opacity 280ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 186ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;">
// <ul class="MuiList-root MuiList-padding" role="menu" tabindex="-1">
// <div class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root Mui-selected MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button Mui-selected" tabindex="0" role="menuitem" aria-disabled="false" id="downshift-0-item-0">
// <div>
// <strong style="font-weight: 500;">{suggestion.libelle} </strong>
// <span style="font-weight: 300;">, {suggestion.code}</span>
// </div>
// <span class="MuiTouchRipple-root"></span>
// </div>
// </ul>
// </div>
// </div>
<span className="suggestion-content" >
<span className="name" >
{suggestion.libelle}
</span>
</span>
);
refreshPage() {
window.location.replace("/");
}
choisirMetier = (code) =>{
console.log("choisir metier "+code);
}
handleClick(code, libelle) {
//console.log('Le code : '+code);
// document.getElementById('appellation_id').value =code;
// document.getElementById('appellation_libelle').value = libelle;
// this.setState({ appellationId: code })
// this.setState({ appellationLibelle: libelle })
// this.soumettre("appellation", "unitaire")
//console.log('Le libellé : '+libelle);
}
// OnChange event handler
onChangeMetier = (event, { newValue }) => {
console.log("newValue "+newValue);
this.setState({
valueMetier: newValue
});
};
// Suggestion rerender when user types
onSuggestionsMetierFetchRequested = ({ value }) => {
this.getSuggestionsMetier(value)
.then(data => {
if (data.Error) {
this.setState({
suggestionsMetier: []
});
} else {
console.log("onSuggestionsMetierFetchRequested"+data);
console.log("onSuggestionsMetierFetchRequested"+value);
this.setState({
suggestionsMetier: data
});
}
})
};
// Triggered on clear
onSuggestionsMetierClearRequested = () => {
this.setState({
suggestionsMetier: []
});
};
render() {
const { classes, user } = this.props
const { valueMetier, suggestionsMetier } = this.state;
const logoUrl = user.picture;
function refresh() {
document
@@ -269,6 +582,22 @@ class AccountEtape1 extends Component {
.reload(true);
}
const inputPropsMetier = {
placeholder: 'Saisir un métier',
value:this.state.valueMetier,
onChange: this.onChangeMetier
};
const inputProps = {
value: this.state.address,
onChange: this.onChange,
}
const searchOptions = {
componentRestrictions: { country: ['fr'] },
}
return (
<section className={classes.container}>
<form className={classes.form}
@@ -358,9 +687,18 @@ class AccountEtape1 extends Component {
onBlur={this.onBlur}
/>
<Autosuggest
suggestions={suggestionsMetier}
onSuggestionsFetchRequested={this.onSuggestionsMetierFetchRequested}
onSuggestionsClearRequested={this.onSuggestionsMetierClearRequested}
getSuggestionValue={this.getSuggestionMetierValue}
renderSuggestion={this.renderSuggestionMetier}
inputProps={inputPropsMetier}
/>
<input type="hidden" id="appellation_id" value={this.state.appellationId =='null' || this.state.appellationId =='' ? '' :this.state.appellationId}></input>
<input type="hidden" id="appellation_libelle" value={this.state.appellationLibelle =='null' || this.state.appellationLibelle =='' ? '' :this.state.appellationLibelle}></input>
<TextField
{/* <TextField
name="currentJob"
id="outlined"
label="Poste actuel"
@@ -371,9 +709,56 @@ class AccountEtape1 extends Component {
value={this.state.currentJob =='null' || this.state.currentJob =='' ? '' :this.state.currentJob}
onChange={this.handleChange}
onBlur={this.onBlur}
/>
/> */}
<div className={classes.container}>
<div
className={classes.conteneurGoogle}
classes={{ root: classes.rootTextfield }}
style={{ position: 'relative', zIndex:2, width: '100%' }}>
<label htmlFor="outlined-required"
className={classes.labelGeoloc}>
Adresse
</label>
<div className={classes.conteneurGoogleComposant}>
<GooglePlaceAutocomplete
style={{ paddingLeft:'14px !important', left: 0, right: 0, zIndex: '2 !important', width: '100%' }}
name="location"
label="Location"
id="outlined-required"
variant="outlined"
textFieldProps={{ id: "outlined-required" }}
className={classes.textField}
value="test"
classes={{ root: classes.rootTextfield }}
options={this.searchOptions}
onSuggestionSelected={this.onSuggestionSelected}
textFieldProps={{ onChange: (e) => this.onChange(e), value: this.state.value, placeholder: 'Ex : Rue de Rivoli, Paris, France', fullWidth: true, size:"small"}}
types={['(regions)']}
componentRestrictions={{country: 'fr'}}
renderTarget={() => (
<div
style={{
width: '100%',
zIndex:9
}}
>
</div>
)}
/>
</div>
</div>
{/* <Input
name="geoloc"
id="geoloc"
label="geoloc"
ref="geoloc"
onChange={this.handleChange}
value={this.state.geoloc =='null' || this.state.geoloc =='' ? '' :this.state.geoloc}
/> */}
</div>
<TextField
{/* <TextField
name="address1"
id="outlined"
label="Adresse"
@@ -383,9 +768,9 @@ class AccountEtape1 extends Component {
value={this.state.address1 ? this.state.address1 : ''}
onChange={this.handleChange}
onBlur={this.onBlur}
/>
/> */}
<TextField
{/* <TextField
name="address2"
id="outlined"
label="Adresse complémentaire"
@@ -395,9 +780,9 @@ class AccountEtape1 extends Component {
value={this.state.address2 ? this.state.address2 : ''}
onChange={this.handleChange}
onBlur={this.onBlur}
/>
<div className={classes.container}>
<TextField
/> */}
{/* <div className={classes.container}> */}
{/* <TextField
name="zipCode"
id="outlined"
label="Code postal"
@@ -407,9 +792,9 @@ class AccountEtape1 extends Component {
value={this.state.zipCode ? this.state.zipCode : ''}
onChange={this.handleChange}
onBlur={this.onBlur}
/>
/> */}
<TextField
{/* <TextField
name="city"
id="outlined"
label="Ville"
@@ -419,9 +804,9 @@ class AccountEtape1 extends Component {
value={this.state.city ? this.state.city : ''}
onChange={this.handleChange}
onBlur={this.onBlur}
/>
/> */}
<TextField
{/* <TextField
name="country"
id="outlined"
label="Pays"
@@ -431,8 +816,8 @@ class AccountEtape1 extends Component {
value={this.state.country ? this.state.country : ''}
onChange={this.handleChange}
onBlur={this.onBlur}
/>
</div>
/> */}
{/* </div> */}
<TextField
name="linkedin"
@@ -466,7 +851,7 @@ class AccountEtape1 extends Component {
id="outlined"
label="Site internet"
className={classes.textField}
classes={{ root: classes.rootTextfield }}
variant="outlined"
placeholder="http://monsite.fr"
value={this.state.website =='null' || this.state.website =='' ? '' :this.state.website}
@@ -474,13 +859,14 @@ class AccountEtape1 extends Component {
onBlur={this.onBlur}
/>
<Button
type="submit"
onClick={this.refreshPage}
variant="contained"
color="primary"
className={classes.button}>
Enregistrer
</Button>
</form>
{/* <div id="F" className={classes.foot}>
<Button variant="contained" className={classes.button + ' cypButtonSendApplication'} onClick={this.onSubmit}>Mettre à jour!</Button>
@@ -500,4 +886,4 @@ function mapStateToProps(state, ownProps) {
};
}
export default withStyles(styles)(connect(mapStateToProps, { updateUserRequest })(AccountEtape1));
export default withStyles(styles)(connect(mapStateToProps, { updateUserRequest })(AccountEtape1));
@@ -200,6 +200,7 @@ class Etape2 extends React.Component {
render() {
const {classes, company} = this.props;
const {loading, activeStep} = this.state;
if (typeof global.navigator === 'undefined') global.navigator = {};
let video;
if (this.state.videoPres) {
video = <VideoVimeo videoId={Ar.last(_.split(this.state.videoPres, '/'))} autoplay='1' classesOverride="videoPresentation"/>;
File diff suppressed because it is too large Load Diff
@@ -26,7 +26,7 @@ import BottomNavigation from '@material-ui/core/BottomNavigation';
import RefreshIcon from '@material-ui/icons/Refresh';
// import FavoriteIcon from '@material-ui/icons/Favorite'; import LocationOnIcon
// from '@material-ui/icons/LocationOn';
import Link from 'next/link'
import Box from '@material-ui/core/Box';
import {
@@ -0,0 +1,325 @@
import React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
// import AccountStep from "../../components/organisms/AccountStep";
import AccountInfo from '../organisms/AccountInfo';
import AccountVideo from '../organisms/AccountVideo';
import AccountCv from '../organisms/AccountCv';
import {withStyles} from '@material-ui/core/styles';
// import Switch from '@material-ui/core/Switch';
import PhoneIcon from '@material-ui/icons/Phone';
import MailIcon from '@material-ui/icons/Mail';
import PublicIcon from '@material-ui/icons/Public';
import DuoIcon from '@material-ui/icons/Duo';
import LinkedInIcon from '@material-ui/icons/LinkedIn';
import Facebook from '@material-ui/icons/Facebook';
// import FormGroup from '@material-ui/core/FormGroup'; import FormControlLabel
// from '@material-ui/core/FormControlLabel'; import FormControl from
// '@material-ui/core/FormControl';
import {updateUserRequest, updateUserPictureRequest} from '../../actions/user'
import {makeStyles} from '@material-ui/styles';
import {connect} from 'react-redux'
import getConfig from 'next/config'
import BottomNavigation from '@material-ui/core/BottomNavigation';
// import BottomNavigationAction from
// '@material-ui/core/BottomNavigationAction';
import RefreshIcon from '@material-ui/icons/Refresh';
// import FavoriteIcon from '@material-ui/icons/Favorite'; import LocationOnIcon
// from '@material-ui/icons/LocationOn';
import Link from 'next/link'
import Box from '@material-ui/core/Box';
import Tabs from '@material-ui/core/Tabs';
import Tab from '@material-ui/core/Tab';
import {
Card,
CardActions,
CardContent,
Avatar,
Typography,
Divider,
Button,
LinearProgress,
Stepper,
Step,
StepLabel,
StepContent,
StepButton,
Paper,
Grid
} from '@material-ui/core';
const styles = theme => ({
container: {
width: '100%'
},
button: {
textTransform: 'inherit',
marginLeft: theme.spacing(8),
marginRight: theme.spacing(8),
padding: theme.spacing(1.2, 2),
color: theme.palette.secondary.main,
backgroundColor: theme.palette.primary.important
},
stickToBottom: {
width: '100%',
position: 'fixed',
bottom: 0
},
menu: {
backgroundColor: "#DAE8F2"
},
});
const useStyles = makeStyles(theme => ({
root: {},
details: {
display: 'flex'
},
avatar: {
marginLeft: 'auto',
height: 110,
width: 100,
flexShrink: 0,
flexGrow: 0
},
progress: {
marginTop: theme.spacing(2)
},
information: {
display: 'flex',
flexDirection: 'column',
backgroundColor: theme.palette.primary.main,
[
theme
.breakpoints
.up('md')
]: {
display: 'flex',
flexDirection: 'row',
alignItems: 'flex-start',
justifyContent: 'space-around',
backgroundColor: theme.palette.primary.main,
padding: theme.spacing(7, 7)
},
'& a': {
textDecoration: 'none'
}
},
texteBlanc: {
color: "#fff"
},
uploadButton: {
marginRight: theme.spacing(2)
},
button: {
marginTop: theme.spacing(1),
marginRight: theme.spacing(1)
},
actionsContainer: {
marginBottom: theme.spacing(2)
},
resetContainer: {
padding: theme.spacing(3)
},
conteneur:{
backgroundColor: "#f3f3f4",
}
}));
function getSteps() {
return ['Informations personnelles', 'Vidéo de présentation', 'Expériences professionnelles'];
}
function getStepContent(step) {
switch (step) {
case 0:
return <AccountEtape1 ></AccountEtape1>;
case 1:
return <AccountEtape2></AccountEtape2>;
case 2:
return <AccountEtape3></AccountEtape3>;
default:
return 'Unknown step';
}
}
const AccountProfile = props => {
const {
className,
user,
...rest
} = props;
const logoUrl = user.picture;
const classes = useStyles();
// const user = { name: 'Laurent Laniau', city: 'Questembert', country:
// 'France', timezone: '', avatar: '/images/avatars/avatar_11.png' };
const {publicRuntimeConfig} = getConfig()
const [activeStep,
setActiveStep] = React.useState(0);
const [completed,
setCompleted] = React.useState(new Set());
const [skipped,
setSkipped] = React.useState(new Set());
const [state,
setState] = React.useState({checkedA: true, checkedB: true});
const steps = getSteps();
const totalSteps = () => {
return getSteps().length;
};
const isStepOptional = (step) => {
return step === 4;
};
const handleSkip = () => {
if (!isStepOptional(activeStep)) {
// You probably want to guard against something like this it should never occur
// unless someone's actively trying to break something.
throw new Error("You can't skip a step that isn't optional.");
}
setActiveStep((prevActiveStep) => prevActiveStep + 1);
setSkipped((prevSkipped) => {
const newSkipped = new Set(prevSkipped.values());
newSkipped.add(activeStep);
return newSkipped;
});
};
const skippedSteps = () => {
return skipped.size;
};
const completedSteps = () => {
return completed.size;
};
const allStepsCompleted = () => {
return completedSteps() === totalSteps() - skippedSteps();
};
const isLastStep = () => {
return activeStep === totalSteps() - 1;
};
const handleNext = () => {
const newActiveStep = isLastStep() && !allStepsCompleted()
? // It's the last step, but not all steps have been completed
// find the first step that has been completed
steps.findIndex((step, i) => !completed.has(i))
: activeStep + 1;
setActiveStep(newActiveStep);
};
const handleBack = () => {
setActiveStep((prevActiveStep) => prevActiveStep - 1);
};
const handleStep = (step) => () => {
console.log("step");
console.log(step);
setActiveStep(step);
};
const handleComplete = () => {
const newCompleted = new Set(completed);
newCompleted.add(activeStep);
setCompleted(newCompleted);
/**
* Sigh... it would be much nicer to replace the following if conditional with
* `if (!this.allStepsComplete())` however state is not set when we do this,
* thus we have to resort to not being very DRY.
*/
if (completed.size !== totalSteps() - skippedSteps()) {
handleNext();
}
};
const handleReset = () => {
setActiveStep(0);
setCompleted(new Set());
setSkipped(new Set());
};
const isStepSkipped = (step) => {
return skipped.has(step);
};
const handleChange = (event, newValue) => {
};
function isStepComplete(step) {
return completed.has(step);
}
function refresh() {
document
.location
.reload(true);
console.log("refresh")
}
return (
<Grid
container
>
<Grid item lg={12} md={12} xl={12} xs={12} >
<div >
<Paper elevation={0} >
<Tabs
value={1}
onChange={handleChange}
indicatorColor="primary"
textColor="theme.palette.primary.dark"
centered
>
<Link href="/Candidatures"><Tab label="Mes candidatures" /></Link>
<Tab label="Mon profil" />
</Tabs>
</Paper>
</div>
</Grid>
<Grid item lg={3} md={3} xl={4} xs={12}>
</Grid>
<Grid item lg={6} md={6} xl={4} xs={12} >
<AccountInfo ></AccountInfo>
<AccountVideo ></AccountVideo>
<AccountCv ></AccountCv>
</Grid>
<Grid item lg={3} md={3} xl={4} xs={12}>
</Grid>
</Grid>
);
};
AccountProfile.propTypes = {
className: PropTypes.string
};
function mapStateToProps(state, ownProps) {
return {
user: state.user,
loading: !!state.user.loading,
errors: state.user.errors || ownProps.errors
};
}
export default withStyles(styles)(connect(mapStateToProps, {updateUserRequest})(AccountProfile))
+430
View File
@@ -0,0 +1,430 @@
import React, {Fragment} from 'react'
import {connect} from "react-redux";
import {makeStyles} from '@material-ui/styles';
import KeyboardArrowRightIcon from '@material-ui/icons/KeyboardArrowRight';
import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';
import {Button, Typography} from '@material-ui/core';
import dynamic from 'next/dynamic'
import {withStyles} from '@material-ui/core/styles'
import {uploadMediaPres} from '../../actions/media'
import {errorMessageSelector} from '../../reducers/media'
import {fetchCompanyRequest} from '../../actions/companies'
import {fetchCurrentUserRequest} from '../../actions/user'
import VideoVimeo from '../atoms/VideoVimeo'
import Router from 'next/router'
import LoaderVideo from '../templates/loaderVideo'
import Ar from "lodash/array"
import Snackbar from '@material-ui/core/Snackbar';
import { Alert, AlertTitle } from '@material-ui/lab';
import ReactHtmlParser, { processNodes, convertNodeToElement, htmlparser2 } from 'react-html-parser';
import Grid from '@material-ui/core/Grid';
import Container from '@material-ui/core/Container';
import Hidden from '@material-ui/core/Hidden';
import Movie from '@material-ui/icons/Movie';
const styles = theme => ({
container: {
width: '100%',
},
root: {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'flex-start',
margin: theme.spacing(1),
flexWrap: 'wrap',
overflow: 'hidden',
backgroundColor: theme.palette.background.paper,
},
recorderContainer: {
//display: 'flex',
alignItems: 'center',
justifyContent: 'center',
width: '100%'
},
rootButton: {
textTransform: 'inherit'
},
underlined: {
textDecoration: 'underline'
},
textButton: {
fontWeight: '700',
fontSize: '1.15em',
paddingLeft: theme.spacing(2)
},
videoPresentation: {
width: "100%",
height: "100%"
},
conseilButton: {
color: "#1e2327",
backgroundColor: "#fff",
padding: theme.spacing(3, 2),
margin: theme.spacing(1),
width: "100%",
textAlign: "right",
boxShadow: '0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1' +
'px rgba(0, 0, 0, 0.14)',
'&:hover': {
color: "#1e2327",
backgroundColor: "#fff",
}
},
captureButton: {
width:"100%",
color: theme.palette.secondary.main,
backgroundColor: theme.palette.primary.main,
padding: theme.spacing(5, 2),
margin: theme.spacing(1),
boxShadow: '0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 4px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.14)',
'&:hover': {
backgroundColor: theme.palette.primary.main,
},
},
importButton: {
color: "#1e2327",
backgroundColor: "#fff",
padding: theme.spacing(3, 2),
margin: theme.spacing(1),
width: "100%",
textAlign: "right",
boxShadow: '0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1' +
'px rgba(0, 0, 0, 0.14)',
'&:hover': {
color: "#1e2327",
backgroundColor: "#fff",
}
},
InputKeyboardArrowDownIconBlank: {
fontSize: '2.5em',
color: "#ffffff",
textAlign: "right"
},
InputKeyboardArrowDownIcon: {
fontSize: '2.5em',
color: "#1e2327",
textAlign: "right"
},
buttons :{
display: "inline-table",
},
grille :{
paddingTop:theme.spacing(4),
width: "100%",
marginBottom:"30px",
borderRadius: "5px",
border: "1px solid #1E2327",
color:theme.palette.primary.dark
},
});
const Recorder = dynamic(() => import ('./Recorder'), {ssr: false})
class Etape2 extends React.Component {
state = {
loading: true,
activeStep: 0,
data: {},
openSnack: false,
errors: {},
success : {},
openStudio : false
};
componentDidMount() {
localStorage.setItem('loginRedirect', window.location.pathname)
if (!!!localStorage.getItem('ttJWT')) {
Router.push("/Login")
} else
this.setState({loading: false, firstname: this.props.user.firstname, videoPres: this.props.user.videoPres, video: this.props.user.presentation_video_id})
}
UNSAFE_componentWillReceiveProps(nextProps) {
this.setState({
loading: nextProps.loading,
openSnack: !!!_.isEmpty(nextProps.errors),
errors: !!!nextProps.errors
? {
errors: {
message: ""
}
}
: nextProps.errors,
videoPres: nextProps.videoPres ? nextProps.videoPres : this.props.user.videoPres,
video: nextProps.video
})
//window.location.reload(false);
if (nextProps.media.statusPres === 'success') {
const success = {};
success.message ="Profil mise à jour";
this.setState({ success });
this.setActiveStep(1);
}
}
setActiveStep = (step) => {
this.setState({activeStep: step})
}
inputFilesystemChangePres = (e) => {
this.uploadMediaPres(e)
}
inputCamRecorderChange = (e) => {
this.uploadMediaPres(e)
}
uploadMediaPres = (e) => {
var file = e.target.files[0]
console.log ("envoi de video pres")
const data = new FormData()
data.append('upload', file)
//this.setState({ videoPres: videoPres })
console.log("VIDEO PRES OK");
this
.props
.uploadMediaPres(data);
}
AfficherSuccess() {
if (!this.state.success || !this.state.success.message) {
} else if (this.state.success.length != 0 && this.state.success.message != "") {
return (
<Snackbar open={open} autoHideDuration={1000} onClose={() => this.setState({open: false})}>
<Alert onClose={() => this.setState({open: false})} severity="success">
{ReactHtmlParser(this.state.success.message)}
</Alert>
</Snackbar>
);
}
return "";
}
handleClose = (event, reason) => {
this.setState({openSnack: false});
}
realise =() =>{
console.log("realise");
this.setState({ openStudio: true});
}
retour =() =>{
console.log("retour");
this.setState({ openStudio: false});
}
render() {
const {classes, company} = this.props;
const {loading, activeStep} = this.state;
let video;
if (this.props.user.videoPres) {
video = <VideoVimeo videoId={Ar.last(_.split(this.props.user.videoPres, '/'))} autoplay='1' classesOverride="videoPresentation"/>;
} else {
video = "----";
}
if (typeof global.navigator === 'undefined') global.navigator = {};
return (
<Grid
container
direction="row"
justify="space-between"
alignItems="flex-start"
className={classes.grille}
justify="center"
alignItems="center">
<Grid item lg={12} md={12} xl={12} xs={12} >
<div id="video">
<Typography
align="center"
gutterBottom
variant="headline"
variant="h6"
component="h2"
className={classes.h6}>
<Movie className={classes.menuIcon}></Movie> Vidéo de présentation
</Typography>
<Typography
align="center">Donnez envie au recruteur de vous rencontrer grâce à la vidéo !</Typography>
</div>
<Fragment>
{this.AfficherSuccess()}
{ loading ? <LoaderVideo textePrincipal="Votre vidéo est en cours denvoi..." texteSecondaire="Veuillez rester sur la page pendant le chargement qui peut durer plusieurs minutes."/> : <div></div> }
<div className={classes.root}>
<Hidden xsUp>
&nbsp;
</Hidden>
<Container maxWidth="md">
<Grid container
justify="center"
alignItems="center"
spacing={2}
className={classes.buttons}>
<Grid item xs={12} sm={12} md={12} lg={12} xl={12}>
{ /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ?
(
<Fragment >
<input
type="file" accept="video/*" capture="camcorder"
className={classes.input}
style={{ display: 'none' }}
id="record-button-file"
multiple
onChange={this.inputCamRecorderChange}
/>
<label htmlFor="record-button-file">
<Button component="span" className={classes.captureButton} classes={{ root: classes.rootButton }}>
<img alt="talents-tube" src='/static/images/capture.svg' className={classes.iconButton} />
<Typography align="left" className={classes.textButton}>
Je <span className={classes.underlined}>réalise</span> ma vidéo de présentation
</Typography>
<KeyboardArrowRightIcon className={ classes.InputKeyboardArrowRightIcon }/>
</Button>
</label>
</Fragment>
):
(
<Fragment>
{this.state.openStudio == false ?
<Button component="span" className={classes.captureButton} classes={{ root: classes.rootButton }} onClick={this.realise}>
<img alt="talents-tube" src='/statique/images/capture.svg' className={classes.iconButton} />
<Typography align="left" className={classes.textButton}>
Je <span className={classes.underlined}>réalise</span> ma vidéo de présentation
</Typography>
<KeyboardArrowRightIcon className={ classes.InputKeyboardArrowRightIcon }/>
</Button>
:
<div className={classes.recorderContainer}>
<Button onClick={this.retour}>Retour au menu</Button>
<Recorder uploader={this.props.uploadMediaPres} titreBouton="Remplacer ma vidéo" />
</div>
}
</Fragment>
)
}
</Grid>
<Grid item xs={12} sm={12} md={12} lg={12} xl={12}>
<div>
<input
type="file"
accept="video/*"
className={classes.input + ' cypButtonImportVid'}
style={{display: 'none'}}
id="import-button-file-pres"
onChange={this.inputFilesystemChangePres}/>
<label htmlFor="import-button-file-pres">
<Button
component="span"
className={classes.importButton}
classes={{
root: classes.rootButton}}>
<img
alt="talents-tube"
src='/statique/images/Import.svg'
className={classes.iconButton}/>
<Typography align="left" className={classes.textButton}>
J'<span className={classes.underlined}>importe</span> ma vidéo de présentation
</Typography>
<KeyboardArrowDownIcon className={classes.InputKeyboardArrowDownIcon}/>
</Button>
</label>
</div>
<div>
<label htmlFor="import-conseil">
<Button
component="span"
className={classes.importButton}
classes={{
root: classes.rootButton}}
onClick={() => Router.push(`/Conseils`)}>
<img
alt="talents-tube"
src='/statique/images/comment-faire-une-video-reponse.svg'
className={classes.iconButton}/>
<Typography align="left" className={classes.textButton}>
<span className={classes.underlined}>Comment</span> créer ma vidéo de présentation
</Typography>
<KeyboardArrowDownIcon className={classes.InputKeyboardArrowDownIcon}/>
</Button>
</label>
</div>
</Grid>
<Hidden xsUp>
&nbsp;
</Hidden>
<Grid item xs={12} sm={12} md={12} lg={12} xl={12}>
<div className={classes.videoPresentation}>
{video}
</div>
</Grid>
</Grid>
</Container>
</div>
{/* <div className={classes.textContainer}>
</div> */}
</Fragment>
</Grid>
</Grid>
);
}
}
Etape2.getInitialProps = function (context) {
const {companyId} = context.query
const {res} = context
//TODO :really needed ?
context
.store
.dispatch(fetchCurrentUserRequest())
if (!!companyId)
context.store.dispatch(fetchCompanyRequest(companyId))
return {}; //leave this please
}
function mapStateToProps(state) {
return {
loading: !!state.media.loading,
media: state.media,
offre: state.ad,
//errors: errorMessageSelector(state),
user: state.user,
company: state.company
};
}
export default withStyles(styles)(connect(mapStateToProps, {fetchCurrentUserRequest, fetchCompanyRequest, uploadMediaPres})(Etape2));
+30 -33
View File
@@ -383,33 +383,21 @@ class Answer extends Component {
remplirLocation = (typeDonnee, donnee) =>{
console.log("DEBUT remplirLocation");
console.log(typeDonnee);
console.log(donnee);
if(typeDonnee=='"street_number"') {
console.log(typeDonnee);
console.log(donnee);
this.setState({ street_number: donnee.replace('"', '') })
}else if(typeDonnee=='"route"') {
console.log(typeDonnee);
console.log(donnee);
this.setState({ route: donnee.replace('"', '') })
}else if(typeDonnee=='"locality"') {
console.log(typeDonnee);
console.log(donnee);
this.setState({ locality: donnee.replace('"', '') })
}else if(typeDonnee=='"administrative_area_level_2"') {
console.log(typeDonnee);
console.log(donnee);
this.setState({ administrative_area_level_2: donnee.replace('"', '') })
}else if(typeDonnee=='"administrative_area_level_1"') {
console.log(typeDonnee);
console.log(donnee);
this.setState({ administrative_area_level_1: donnee.replace('"', '') })
}else if(typeDonnee=='"country"') {
console.log(typeDonnee);
console.log(donnee);
this.setState({ country: donnee.replace('"', '') })
}else if(typeDonnee=='"postal_code"') {
console.log(typeDonnee);
console.log(donnee);
this.setState({ postal_code: donnee.replace('"', '') })
}
console.log("FIN remplirLocation");
@@ -419,7 +407,11 @@ class Answer extends Component {
onSuggestionSelected = (suggestion) => {
console.log('Selected suggestion:', suggestion)
const address = suggestion.description;
let address = suggestion.description;
var words = address.split(',');
if(words.length<3){
address = "mairie de "+address;
}
this.setState({ geoloc: address})
this.setState({
value: address
@@ -427,7 +419,8 @@ class Answer extends Component {
geocodeByAddress(address)
.then(address => {
console.log("ADRESSE");
console.log(address);
if(address[0].address_components[0]){
this.remplirLocation(JSON.stringify(address[0].address_components[0].types[0]), JSON.stringify(address[0].address_components[0].long_name))
}
@@ -450,11 +443,13 @@ class Answer extends Component {
this.remplirLocation(JSON.stringify(address[0].address_components[6].types[0]), JSON.stringify(address[0].address_components[6].long_name))
}
if(address[0].geometry){
console.log(address[0].geometry.location_type);
let gps =JSON.stringify(address[0].geometry.location);
const obj = JSON.parse(gps);
this.setState({ formatted_address: JSON.stringify(address[0].formatted_address) })
this.setState({ lat: obj.lat.toString()})
this.setState({ lng: obj.lng.toString()})
this.setState({ formatted_address: JSON.stringify(address[0].formatted_address) })
this.setState({ lat: obj.lat.toString()})
this.setState({ lng: obj.lng.toString()})
}
@@ -650,20 +645,7 @@ class Answer extends Component {
</Dialog>
<TextField
name="lastname"
required
id="outlined-required"
label="Nom"
className={classes.textField}
classes={{ root: classes.rootTextfield }}
variant="outlined"
value={this.state.lastname}
onChange={this.handleChange}
error={!!_.isEmpty(this.state.lastname)}
helperText={!!_.isEmpty(this.state.lastname) && "Veuillez saisir votre nom"}
required
/>
<TextField
name="firstname"
@@ -679,6 +661,21 @@ class Answer extends Component {
helperText={!!_.isEmpty(this.state.firstname) && "Veuillez saisir votre prénom"}
/>
<TextField
name="lastname"
required
id="outlined-required"
label="Nom"
className={classes.textField}
classes={{ root: classes.rootTextfield }}
variant="outlined"
value={this.state.lastname}
onChange={this.handleChange}
error={!!_.isEmpty(this.state.lastname)}
helperText={!!_.isEmpty(this.state.lastname) && "Veuillez saisir votre nom"}
required
/>
<div
className={classes.conteneurGoogle}
classes={{ root: classes.rootTextfield }}
@@ -0,0 +1,39 @@
import React, { Fragment } from 'react';
import { makeStyles } from '@material-ui/core/styles';
import _ from "lodash"
import Ar from "lodash/array"
import VideoVimeo from '../atoms/VideoVimeo'
const useStyles = makeStyles(theme => ({
card: {
width: '100%',
},
title: {
fontSize: '1em',
fontWeight: '500',
},
titleBorder: {
'&:after': {
content: '""',
width: '15px',
borderBottom: 'solid 2px',
borderColor: theme.palette.primary.main + '!important',
display: 'flex',
},
},
video: {
[theme.breakpoints.up('md')]: {
paddingBottom: '35%', /* 16:9 */
},
}
}));
export default function CandidatureDetail(props) {
const classes = useStyles();
return (
<Fragment>
<VideoVimeo classes={{ video: classes.video }} videoId={Ar.last(_.split(props.video.cdn_url, '/'))} />
</Fragment>
);
}
+43 -43
View File
@@ -8,7 +8,7 @@ import Chip from '@material-ui/core/Chip';
import CardContent from '@material-ui/core/CardContent';
import CardMedia from '@material-ui/core/CardMedia';
import Typography from '@material-ui/core/Typography';
import IconText from './../atoms/IconText';
import IconText from './../atoms/IconTextInline';
import KeyboardArrowleftIcon from '@material-ui/icons/PlayArrowRounded';
import ArrowForwardIcon from '@material-ui/icons/ArrowForward';
import Link from 'next/link';
@@ -83,11 +83,11 @@ const styles = theme => ({
},
iconTextIcon: {
color: theme.palette.offerlistitem.icon,
fontSize: '0.8em',
fontSize: '1em',
},
iconTextText: {
color: theme.palette.offerlistitem.text,
fontSize: '0.6em',
fontSize: '1em',
paddingLeft: theme.spacing(1),
},
bottomCard: {
@@ -96,8 +96,9 @@ const styles = theme => ({
width: '90%',
},
chip: {
color: theme.palette.secondary.main,
backgroundColor: theme.palette.primary.important,
marginTop :"10px",
backgroundColor:"#E7F3FF",
color:theme.palette.primary.dark,
},
icon: {
color: theme.palette.secondary.dark,
@@ -112,50 +113,30 @@ const { publicRuntimeConfig } = getConfig()
//must go in API
const status = new Map([
["DRAFT"
, "Brouillon"]
["A_TRAITER"
, "Envoyée"]
,
["TO_PUBLISH"
, "En cours de validation"]
["CONTACTE"
, "En cours de traitement"]
,
["VALIDATED"
, "Validée"]
["ENTRETIEN"
, "En cours de traitement"]
,
["PUBLISHED"
, "Publiée"]
["REFUSE"
, "Refusée"]
,
["CLOSED"
, "Cloturée"]
["EMBAUCHE"
, "Embauchée"]
,
["EXPIRED"
, "Expirée"]
,
["SENDED"
[""
, "Envoyée"]
,
["DECLINED"
, "Refusée"]
["Null"
, "Envoyée"]
,
["NEW"
, "Nouveau"]
,
["VIEWED"
, "Visionnée"]
,
["NEGATIVE"
, "Négatif"]
,
["POSITIVE"
, "Positif"]
,
["INFOS"
, "Demande dinformations"]
,
["CONTACTED"
, "Demande dinformations"]
,
["CONTACTED.RDV"
, "Convocation entretien"]
])
class AnswerRowComponent extends React.Component {
@@ -169,14 +150,16 @@ class AnswerRowComponent extends React.Component {
companyR = rowData.ad.company;
else
companyR = company;
console.log(rowData);
const ville = (rowData.ad && rowData.ad.location && rowData.ad.location.gmap_address && rowData.ad.location.gmap_address.address_components[0] )
? rowData.ad.location.gmap_address.address_components[0].long_name
: "ND"
const imgUrl = (rowData.ad && rowData.ad.video && rowData.ad.video.thumbnails[0] && rowData.ad.video.thumbnails[0].sizes[4])
? rowData.ad.video.thumbnails[0].sizes[4].link
: publicRuntimeConfig.adListDefaultUrl
const logoUrl = publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + companyR.logo
return (
<Link href={`/Candidature/${rowData.id}`} >
<Link href={`/Answer/${rowData.id}`} >
<Card className={classes.card} >
{rowData.ad ? (
<CardContent className={classes.content}>
@@ -204,8 +187,18 @@ class AnswerRowComponent extends React.Component {
className={classes.companyTitle}>
{rowData.ad.company.brand_name&&rowData.ad.company.brand_name}
</Typography>
<Typography
variant="headline"
variant="h6"
component="h4"
className={classes.companyTitle}>
<IconText classes={{ root: classes.iconText, icon: classes.iconTextIcon, text: classes.iconTextText }} variant="place" text={ville} />
<IconText classes={{ root: classes.iconText, icon: classes.iconTextIcon, text: classes.iconTextText }} variant="assignment" text={rowData.ad.extra&&rowData.ad.extra.contract_type?rowData.ad.extra.contract_type:"ND"} />
<IconText classes={{ root: classes.iconText, icon: classes.iconTextIcon, text: classes.iconTextText }} variant="watch_later" text={(new Date(rowData.c_time)).toLocaleDateString("fr-FR")} />
</Typography>
<div className={ classes.bottomCard }>
<Chip size="small" label={status.get(rowData.status)} className={classes.chip} />
<Chip size="small" label={status.get(rowData.status_reponse)? status.get(rowData.status_reponse) : "Envoyée" } className={classes.chip} />
<ArrowForwardIcon className={classes.icon} />
</div>
</div>
@@ -236,8 +229,15 @@ class AnswerRowComponent extends React.Component {
className={classes.companyTitle}>
{rowData.company.brand_name&&rowData.company.brand_name}
</Typography>
<Typography
variant="headline"
variant="h6"
component="h4"
className={classes.companyTitle}>
<IconText classes={{ root: classes.iconText, icon: classes.iconTextIcon, text: classes.iconTextText }} variant="watch_later" text={(new Date(rowData.c_time)).toLocaleDateString("fr-FR")} />
</Typography>
<div className={ classes.bottomCard }>
<Chip size="small" label={status.get(rowData.status)} className={classes.chip} />
<Chip size="small" label={status.get(rowData.status_reponse)? status.get(rowData.status_reponse) : "Envoyée" } className={classes.chip} />
<ArrowForwardIcon className={classes.icon} />
</div>
</div>
+150 -44
View File
@@ -9,8 +9,9 @@ import IconAdd from '@material-ui/icons/Add';
import ArrowUpwardIcon from '@material-ui/icons/ArrowUpward';
import { useDispatch } from 'react-redux';
import { useSelector } from 'react-redux'
import { Grid, Hidden} from '@material-ui/core';
import ButtonBase from '@material-ui/core/ButtonBase';
import { Typography } from '@material-ui/core';
const useStyles = makeStyles(theme => ({
card: {
width: '100%',
@@ -44,23 +45,13 @@ const useStyles = makeStyles(theme => ({
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
backgroundColor: theme.palette.input.main,
padding: theme.spacing(1),
width: '100%',
[theme.breakpoints.up('md')]: {
padding: theme.spacing(3),
},
},
button: {
backgroundColor: 'inherit',
borderRadius: '0',
'& svg': {
fontSize: '1.5rem',
[theme.breakpoints.up('sm')]: {
fontSize: '2rem',
},
}
},
icon: {
color: theme.palette.secondary.main,
background: theme.palette.primary.important,
@@ -85,6 +76,68 @@ const useStyles = makeStyles(theme => ({
display: 'flex',
},
},
grille: {
paddingTop: theme.spacing(4),
paddingBottom: theme.spacing(4),
paddingLeft : theme.spacing(4),
marginBottom: "30px",
borderRadius: "5px",
border: "1px solid #1E2327",
color: theme.palette.primary.dark
},
menuLien: {
fontSize: "1em",
textTransform: "uppercase",
fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
color: theme.palette.primary.dark,
textDecoration: "none",
'&:hover': {
color: theme.palette.primary.dark
},
'&:active': {
color: theme.palette.primary.dark
},
'&:visited': {
color: theme.palette.primary.dark
}
},
grilleGauche: {
textAlign: "center"
},
grilleDroite: {
textAlign: "center"
},
grilleBas: {
backgroundColor: theme.palette.secondary.dark
},
chip: {
marginTop: "10px",
backgroundColor: "#E7F3FF",
color: theme.palette.primary.dark
},
icon: {
color: theme.palette.secondary.dark
},
cartoucheEntreprise: {
// display: 'flex',
padding: theme.spacing(2) + 'px ',
[theme.breakpoints.up('md')]: {
padding: theme.spacing(2) + 'px 18vw',
},
},
textField: {
width: '85%',
'&:disabled': {
color: theme.palette.secondary.dark,
},
'& label': {
color: theme.palette.primary.dark,
},
'& fieldset:hover': {
borderColor: theme.palette.primary.main + ' !important',
},
},
}));
@@ -105,42 +158,95 @@ function Chat(props) {
sendMessage(text);
setText('');
}
// const logoUrl = (props.answer.ad
// ? (props.answer.ad.company.logo
// ? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + this.props.answer.ad.company.logo
// : publicRuntimeConfig.symphonyUrl + "/img/default_picture_svg")
// : "")
const logoUrl = props.logoUrl
return (
<Fragment>
<div className={classes.wrapper}>
<div className={classes.contain}>
{
_.orderBy(messages, ['c_time'], ['asc']).map((message, index) => {
return <ChatCard message={message} key={index}></ChatCard>
})
}
<section className={classes.cartoucheEntreprise}>
<Grid container spacing={2} className={classes.grille}>
<Grid item>
<ButtonBase className={classes.image}>
<img alt="talents-tube" src={logoUrl} className={classes.userAvatar}/>
</ButtonBase>
</Grid>
<Grid item lg={12} xl container>
<Grid item xs container direction="column" spacing={2}>
<Grid item xl>
<Typography gutterBottom variant="subtitle1">
{props.nomCompany}
{/* {(this.props.answer.ad
? (this.props.answer.ad.company.brand_name
? this.props.answer.ad.company.brand_name
: "")
: this.props.answer.company.brand_name)} */}
</Typography>
<Typography variant="body2" gutterBottom>
{props.nomAd}
{/* {this.props.answer.ad
? (this.props.answer.ad.title
? this.props.answer.ad.title
: "Candidature spontanée")
: "Candidature spontanée"} */}
</Typography>
</Grid>
</Grid>
</Grid>
</Grid>
</section>
<section className={classes.cartoucheEntreprise}>
<Grid container spacing={2} className={classes.grille} direction="column">
<Grid item >
<TextField
fullWidth
multiline
rows={10}
name="chattext"
id="outlined"
label="Envoyer un email"
value={text}
onChange={(e) => setText(e.target.value)}
placeholder={"Ecrivez un message pour l'entreprise"}
variant="outlined"
className={classes.textField}
</div>
</div>
/>
</Grid>
<Grid item>
<Button
onClick={()=>postMessage()}
variant="contained"
color="primary"
className={classes.button}>
Envoyer
</Button>
</Grid>
</Grid>
<Grid container spacing={2} direction="column">
<div>
{
_.orderBy(messages, ['c_time'], ['desc']).map((message, index) => {
return <ChatCard message={message} key={index}></ChatCard>
})
}
</div>
</Grid>
</section>
<div id="F" className={classes.foot}>
<div className={classes.filterForm}>
<TextField
fullWidth
multiline
rows={isWidthUp('md', props.width) ? 8 : 1}
id="standard-search"
name="chattext"
value={text}
onChange={(e) => setText(e.target.value)}
placeholder={"Message"}
className={classes.textField}
InputLabelProps={{
shrink: true,
}}
/>
<Button onClick={()=>postMessage()}
disabled={loadingMessage}
variant="contained"
className={classes.button}>
<ArrowUpwardIcon className={classes.icon}/>
</Button >
</div>
</div>
</Fragment>
+2 -2
View File
@@ -203,7 +203,7 @@ function Footer(props) {
<Link href="/Offres" >
<a>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
Offre d'emploi
Offres d'emploi
</Typography>
</a>
</Link>
@@ -274,7 +274,7 @@ function Footer(props) {
56 000 Vannes
</Typography>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
<a href="tel:+33230050631" >02.30.05.06.31 </a>
<a href="tel:+33756850954" >07.56.85.09.54 </a>
</Typography>
{/* <Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
contact@talentstube.com
@@ -0,0 +1,246 @@
import Link from 'next/link'
import { withStyles } from '@material-ui/core/styles'
import { Typography } from '@material-ui/core';
import { Fragment } from 'react';
import NewsLetterRegistration from './NewsLetterRegistration'
import dynamic from 'next/dynamic'
import Button from '@material-ui/core/Button'
import getConfig from 'next/config'
const { publicRuntimeConfig } = getConfig();
const styles = theme => ({
root: {
display: 'flex',
flexDirection: 'column',
backgroundColor: "#1E2327",
[theme.breakpoints.up('md')]: {
display: 'flex',
flexDirection: 'row',
alignItems: 'flex-start',
justifyContent: 'space-around',
backgroundColor: "#1E2327",
padding: theme.spacing(10, 18),
},
'& a': {
textDecoration: 'none',
color:"#fff"
},
},
container: {
display: 'flex',
flexDirection: 'column',
alignItems: 'flex-start',
padding: theme.spacing(0, 5),
paddingBottom: theme.spacing(3.5),
'&:first-child': {
paddingTop: theme.spacing(4),
},
[theme.breakpoints.up('md')]: {
padding: 0,
'&:first-child': {
paddingTop: 0,
},
},
},
containerRegion: {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
backgroundColor: theme.palette.secondary.main,
padding: theme.spacing(3),
[theme.breakpoints.up('md')]: {
padding: theme.spacing(8, 0),
},
},
titleContainer: {
color: "#fff",
fontSize: '1.5em',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontWeight: '600',
[theme.breakpoints.up('md')]: {
fontSize: '1.2em',
paddingBottom: theme.spacing(2),
},
},
textContainer: {
fontWeight: '300',
fontSize: '0.9em',
[theme.breakpoints.up('md')]: {
fontWeight: '300',
fontSize: '0.8em',
},
},
textContainerRegion: {
fontWeight: '300',
fontSize: '0.9em',
color: theme.palette.primary.dark,
},
footerLogo: {
width: '15vw',
[theme.breakpoints.up('md')]: {
width: '4vw',
},
},
footerLogoTT: {
width: '70%',
[theme.breakpoints.up('md')]: {
paddingBottom: theme.spacing(1),
width: '100%'
},
},
containerReactApp: {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'space-between',
height: 'auto',
paddingTop: theme.spacing(4),
backgroundColor: "#000",
[theme.breakpoints.down('xs')]: {
height: '100vh',
},
[theme.breakpoints.up('md')]: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-around',
height: '35vh',
padding: theme.spacing(6, 1),
position: 'relative',
},
},
titleReactApp: {
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
paddingTop: theme.spacing(4),
paddingLeft: theme.spacing(4),
paddingRight: theme.spacing(4),
[theme.breakpoints.up('md')]: {
order: 1,
width: '20%',
textAlign: 'left',
},
},
buttonReactApp: {
textTransform: 'inherit',
margin: theme.spacing(0, 8),
padding: theme.spacing(1.2, 2),
[theme.breakpoints.up('md')]: {
order: 3,
margin: 'inherit',
marginRight: '5vw',
},
},
imageReactApp: {
width: '100%',
[theme.breakpoints.up('sm')]: {
width: 'auto',
},
[theme.breakpoints.up('md')]: {
width: '25%',
order: 2,
position: 'absolute',
bottom: 0,
},
},
containerNewsletter: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
padding: theme.spacing(6, 4),
},
version:{
marginTop: '15px',
fontSize: '0.7em',
fontWeight: '300',
}
});
function Footer(props) {
const { classes } = props;
return (
<div>
<section className={classes.containerNewsletter}>
<NewsLetterRegistration />
</section>
<div className={classes.root}>
<section className={classes.container}>
<img alt="talents-tube" src='/static/images/logos/TalentsTube_logo-blanc.svg' className={classes.footerLogoTT} />
</section>
<section className={classes.container}>
<Typography color="secondary" component="p" className={classes.titleContainer}>
Informations
</Typography>
<Link href="/Cgu" >
<a>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
CGU
</Typography>
</a>
</Link>
<Link href="/MentionsLegales" >
<a>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
Mentions légales
</Typography>
</a>
</Link>
<Link href="/Confidentialite" >
<a>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
Politique de confidentialité et Protection <br />des données
</Typography>
</a>
</Link>
<Link href="" >
<a href="https://blog.talentstube.com/contact" target="_blank">
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
Contact
</Typography>
</a>
</Link>
</section>
<section className={classes.container}>
<Typography color="secondary" component="p" className={classes.titleContainer}>
Rencontrons-nous
</Typography>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
3, rue Louis de Broglie
</Typography>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
56 000 Vannes
</Typography>
<Typography gutterBottom component="p" className={classes.textContainer}>
<a href="tel:+33756850954" >*07.56.85.09.54 </a>
</Typography>
{/* <Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
contact@talentstube.com
</Typography> */}
</section>
</div>
<section className={classes.containerRegion}>
<Typography gutterBottom component="p" className={classes.textContainerRegion} align="center" >
Entreprise soutenue par
</Typography>
<a href="https://www.bretagne.bzh/" target="_blank" className={classes.darkMenuItem} rel="noopener">
<img alt="Région Bretagne" src='/static/images/logos/Logo-region.svg' className={classes.footerLogo} />
</a>
<Typography className={classes.version} align="center" >
{publicRuntimeConfig.version}
</Typography>
</section>
</div>
);
}
export default withStyles(styles)(Footer)
+7 -7
View File
@@ -485,12 +485,12 @@ class Header extends React.Component {
<Divider light={true} />
<div className={classes.linkGroup}>
<a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.lightMenuItem}><ListItem classes={{ primary: classes.ListItemText }} classes={{ root: classes.rootListItemIcon }}>
{/* <a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.lightMenuItem}><ListItem classes={{ primary: classes.ListItemText }} classes={{ root: classes.rootListItemIcon }}>
<WorkOutlineIcon className={classes.icon} />
<ListItemText primary='Connexion recruteurs'>
</ListItemText>
</ListItem>
</a>
</a> */}
</div>
</List>
</div>
@@ -525,11 +525,11 @@ class Header extends React.Component {
</ListItemText>
</ListItem></a>
</Link>
<Link href="/profileStep" >
<Link href="/profil2" >
<a className={classes.lightMenuItem}>
<ListItem classes={{ root: classes.rootListItemIcon }}>
<AccountCircleIcon className={classes.icon} />
<ListItemText primary='Mon compte'>
<ListItemText primary='Mon profil'>
</ListItemText>
</ListItem>
</a>
@@ -538,7 +538,7 @@ class Header extends React.Component {
<Link href="/Parametres" >
<a className={classes.lightMenuItem}><ListItem classes={{ root: classes.rootListItemIcon }}>
<SettingsIcon className={classes.icon} />
<ListItemText primary='Paramètres de notification'>
<ListItemText primary='Paramètres'>
</ListItemText>
</ListItem></a>
</Link>
@@ -666,14 +666,14 @@ class Header extends React.Component {
</div>
</List>
</section>
<section className={classes.appBarDesktopSection + ' ' + classes.appBarDesktopSection3}>
{/* <section className={classes.appBarDesktopSection + ' ' + classes.appBarDesktopSection3}>
<a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.desktopMenuItem}>
<ListItemText primary='Espace recruteurs'>
</ListItemText>
<ArrowForward className={classes.icon} />
</a>
</section>
</section> */}
</Toolbar>
</AppBar>)
:
@@ -397,12 +397,12 @@ class HeaderPersonnalise extends React.Component {
<Divider light={true} />
<div className={classes.linkGroup}>
<a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.lightMenuItem}><ListItem classes={{ primary: classes.ListItemText }} classes={{ root: classes.rootListItemIcon }}>
{/* <a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.lightMenuItem}><ListItem classes={{ primary: classes.ListItemText }} classes={{ root: classes.rootListItemIcon }}>
<WorkOutlineIcon className={classes.icon} />
<ListItemText primary='Connexion recruteurs'>
</ListItemText>
</ListItem>
</a>
</a> */}
</div>
</List>
</div>}
@@ -434,11 +434,11 @@ class HeaderPersonnalise extends React.Component {
</ListItemText>
</ListItem></a>
</Link>
<Link href="/profileStep" >
<Link href="/profil2" >
<a className={classes.lightMenuItem}>
<ListItem classes={{ root: classes.rootListItemIcon }}>
<AccountCircleIcon className={classes.icon} />
<ListItemText primary='Mon compte'>
<ListItemText primary='Mon profil'>
</ListItemText>
</ListItem>
</a>
@@ -447,7 +447,7 @@ class HeaderPersonnalise extends React.Component {
<Link href="/Parametres" >
<a className={classes.lightMenuItem}><ListItem classes={{ root: classes.rootListItemIcon }}>
<SettingsIcon className={classes.icon} />
<ListItemText primary='Paramètres de notification'>
<ListItemText primary='Paramètres'>
</ListItemText>
</ListItem></a>
</Link>
@@ -575,14 +575,14 @@ class HeaderPersonnalise extends React.Component {
</div>
</List>
</section>
<section className={classes.appBarDesktopSection + ' ' + classes.appBarDesktopSection3}>
{/* <section className={classes.appBarDesktopSection + ' ' + classes.appBarDesktopSection3}>
<a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.desktopMenuItem}>
<ListItemText primary='Espace recruteurs'>
</ListItemText>
<ArrowForward className={classes.icon} />
</a>
</section>
</section> */}
</Toolbar>
</AppBar>)
:
+9 -7
View File
@@ -750,7 +750,7 @@ function OffreDetail(props) {
{/* <a href={entrepriseLink}> */}
{/* const entrepriseLink = (offre.company && `/Entreprise/${offre.company.id}-${_.kebabCase(offre.company.brand_name)}`); */}
<link rel="preload" as="image" href={isWidthUp('xs', props.width) ? imgUrlDesktop : imgUrl}/>
<Link href={`/Player?id=${offre.company.id}&url=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${Ar.last(_.split(offre.company.presentation_video.cdn_url, '/'))}&typeEntite=Entreprise&nameCompany=${offre.company.brand_name}&nameOffre=`} >
<div className={classes.discoverContainerImage}>
<img src={isWidthUp('sm', props.width) ? imgUrlDesktop : imgUrl} alt={offre.company.brand_name && offre.company.brand_name} />
@@ -831,7 +831,7 @@ function OffreDetail(props) {
{/* <VideoVimeo {...isCandidature == 'true' ? 'classes={{ video: classes.videoOffre }}' : ''} videoId={Ar.last(_.split(offre.video.cdn_url, '/'))} autoplay='1' /> */}
<div className={classes.contentContainer}>
<link rel="preload" as="image" href={isWidthUp('xs', props.width) ? imgUrlDesktopOffre : imgUrlOffre}/>
<Link href={`/Player?id=${offre.id}&url=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${Ar.last(_.split(offre.video.cdn_url, '/'))}&typeEntite=Offre&nameCompany=${offre.company && offre.company.brand_name}&nameOffre=${offre.title}`} >
<div className={classes.discoverContainerImage}>
<img src={isWidthUp('sm', props.width) ? imgUrlDesktopOffre : imgUrlOffre} alt={offre.company.brand_name && offre.company.brand_name} />
@@ -879,7 +879,7 @@ function OffreDetail(props) {
{/* <a href={entrepriseLink}> */}
{/* const entrepriseLink = (offre.company && `/Entreprise/${offre.company.id}-${_.kebabCase(offre.company.brand_name)}`); */}
<link rel="preload" as="image" href={isWidthUp('xs', props.width) ? imgUrlDesktop : imgUrl}/>
<Link href={`/Player?id=${offre.company.id}&url=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${Ar.last(_.split(offre.company.presentation_video.cdn_url, '/'))}&typeEntite=Entreprise&nameCompany=${offre.company.brand_name}&nameOffre=`} >
<div className={classes.discoverContainerImage}>
<img src={isWidthUp('sm', props.width) ? imgUrlDesktop : imgUrl} alt={offre.company.brand_name && offre.company.brand_name} />
@@ -900,6 +900,7 @@ function OffreDetail(props) {
{offre.territories && territoryVideoId && (
<div className={classes.container + ' ' + classes.discoverContainerTerritory}>
<section>
<link rel="preload" as="image" href={isWidthUp('xs', props.width) ? imgUrlDesktopTerritoire : imgUrlTerritoire}/>
<Link href={`/Player?id=${offre.territories[0].territory.id}&url=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${territoryVideoId}&typeEntite=Territoire&nameCompany=${offre.territories[0].territory.brand_name}&nameOffre=`} >
<div className={classes.discoverContainerImage}>
<img src={isWidthUp('sm', props.width) ? imgUrlDesktopTerritoire : imgUrlTerritoire} alt={(!!!offre.territories) ? offre.territories[0].territory.brand_name : ''} />
@@ -984,8 +985,8 @@ function OffreDetail(props) {
</Hidden>
{/* PARTIE MOBILE */}
<Hidden mdUp>
<section className={classes.contentContainerMobile}>
<section className={classes.contentContainerMobile}>
<link rel="preload" as="image" href={isWidthUp('xs', props.width) ? imgUrlDesktopOffre : imgUrlOffre}/>
<Link href={`/Player?id=${offre.id}&url=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${Ar.last(_.split(offre.video && offre.video.cdn_url, '/'))}&typeEntite=Offre&nameCompany=${offre.company && offre.company.brand_name}&nameOffre=${offre.title}`} >
<div className={classes.discoverContainerImage}>
<img src={isWidthUp('xs', props.width) ? imgUrlDesktopOffre : imgUrlOffre} alt={offre.company && offre.company.brand_name && offre.company.brand_name} />
@@ -1046,10 +1047,10 @@ function OffreDetail(props) {
<div className={classes.container + ' ' + classes.discoverContainerCompany}>
<section>
{/* <a href={entrepriseLink}> */}
{/* const entrepriseLink = (offre.company && `/Entreprise/${offre.company.id}-${_.kebabCase(offre.company.brand_name)}`); */}
<link rel="preload" as="image" href={isWidthUp('xs', props.width) ? imgUrlDesktop : imgUrl}/>
<Link href={`/Player?id=${offre.company.id}&url=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${Ar.last(_.split(offre.company.presentation_video.cdn_url, '/'))}&typeEntite=Entreprise&nameCompany=${offre.company.brand_name}&nameOffre=`} >
<div className={classes.discoverContainerImage}>
<img src={isWidthUp('xs', props.width) ? imgUrlDesktop : imgUrl} alt={offre.company.brand_name && offre.company.brand_name} />
@@ -1070,6 +1071,7 @@ function OffreDetail(props) {
{offre.territories && territoryVideoId && (
<div className={classes.container + ' ' + classes.discoverContainerTerritory}>
<section>
<link rel="preload" as="image" href={isWidthUp('xs', props.width) ? imgUrlDesktopTerritoire : imgUrlTerritoire}/>
<Link href={`/Player?id=${offre.territories[0].territory.id}&url=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${territoryVideoId}&typeEntite=Territoire&nameCompany=${offre.territories[0].territory.brand_name}&nameOffre=${offre.title}`} >
<div className={classes.discoverContainerImage}>
<img src={isWidthUp('sm', props.width) ? imgUrlDesktopTerritoire : imgUrlTerritoire} alt={(!!!offre.territories) ? offre.territories[0].territory.brand_name : ''} />
+18 -20
View File
@@ -180,31 +180,24 @@ class Recorder extends Component {
// When you pass text in options it just creates a control text,
// which is displayed as tooltip when hovered on
// this button viz the span in you div,
var myButton = this.player.controlBar.addChild("button");
// which is displayed as tooltip when hovered on
// this button viz the span in you div,
var myButton = this.player.controlBar.addChild("button");
// There are many functions available for button component
// like below mentioned in this docs
// https://docs.videojs.com/button.
// You can set attributes and clasess as well.
// There are many functions available for button component
// like below mentioned in this docs
// https://docs.videojs.com/button.
// You can set attributes and clasess as well.
// Getting html DOM
var myButtonDom = myButton.el();
//var myButtonDom2 = myButton2.el();
// Since now you have the html dom element
// you can add click events
// Getting html DOM
var myButtonDom = myButton.el();
// Now I am setting the text as you needed.
// myButtonDom.innerHTML = "Youi";
myButtonDom.onclick = function(){
//alert("Redirecting");
vid.pause();
}
myButtonDom.onclick = function(){
//alert("Redirecting");
vid.pause();
}
// device is ready
@@ -253,6 +246,11 @@ myButtonDom.onclick = function(){
formData.append('upload', this.player.recordedData, "myupload");
this.props.uploader(formData);
console.log("REDIRECTION OU PAS");
console.log(this.props.retour);
if(this.props.retour=="home"){
window.location.replace("/");
}
}
recordPlayer = () => {
+73 -15
View File
@@ -32,6 +32,26 @@ const styles = theme => ({
display: 'flex',
flexDirection: 'column',
},
connexionRecruteur:{
textAlign : "center",
marginTop:"40px",
backgroundColor:"#1E2327",
padding:"30px 0",
width:"100%",
color:"#fff",
fontSize: '1em',
fontWeight: '300',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
enSavoirPlus:{
textAlign : "center",
textDecoration :"none",
color:"#fff",
fontSize: '1em',
fontWeight: '600',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
formText: {
padding: theme.spacing(0, 2),
paddingTop: theme.spacing(3),
@@ -101,6 +121,18 @@ const styles = theme => ({
marginTop: theme.spacing(6),
marginBottom: theme.spacing(2),
},
titre: {
fontWeight: 600,
fontSize: "1.875em",
marginBottom:"20px",
fontFamily: "Roboto",
},
cgu: {
fontFamily: "Roboto",
fontSize: "1em",
fontWeight: "300",
},
});
class Register extends React.Component {
@@ -108,6 +140,7 @@ class Register extends React.Component {
data: {
firstname: '',
lastname: '',
phone: '',
email: '',
password: '',
checkNewsletter: false,
@@ -118,7 +151,9 @@ class Register extends React.Component {
email:null,
password:null,
firstname:null,
phone:null,
lastname:null,
phone:null,
checkCGU:null
},
loading: false,
@@ -196,19 +231,12 @@ class Register extends React.Component {
<form className={classes.form}>
<TextField
className={classes.champ}
value={data.lastname}
onChange={this.onChange}
id="nom"
name="lastname"
label="Nom"
margin="normal"
variant="outlined"
required
error={!!errors.lastname}
helperText={!!errors.lastname && "Veuillez saisir votre nom."}
/>
<Typography
className={classes.titre}
align="left"
>
Inscription
</Typography>
<TextField
value={data.firstname}
onChange={this.onChange}
@@ -222,6 +250,33 @@ class Register extends React.Component {
helperText={!!errors.firstname && "Veuillez saisir votre prénom."}
/>
<TextField
className={classes.champ}
value={data.lastname}
onChange={this.onChange}
id="nom"
name="lastname"
label="Nom"
margin="normal"
variant="outlined"
required
error={!!errors.lastname}
helperText={!!errors.lastname && "Veuillez saisir votre nom."}
/>
<TextField
className={classes.champ}
value={data.phone}
onChange={this.onChange}
id="telephone"
name="phone"
label="Téléphone"
margin="normal"
variant="outlined"
/>
<TextField
value={data.email}
onChange={this.onChange}
@@ -233,7 +288,6 @@ class Register extends React.Component {
variant="outlined"
required
error={!!errors.email || !!erreurs}
autoComplete="username email"
helperText={!!errors.email ? "Saisissez une adresse e-mail valide." : !!erreurs && erreurs}
/>
@@ -293,7 +347,7 @@ class Register extends React.Component {
label="Je déclare avoir pris connaissance et accepte les termes et les CGU *"
required
/>
<Link href={`/Cgu`} >Lien vers les CGU</Link>
<Link href={`/Cgu`} className={classes.cgu}>Lire les CGU</Link>
<Button type="submit" variant="contained" className={classes.button + ' ' + classes.buttonImportant + ' cypButtonRegister'} onClick={this.onRegister}>
S'inscrire
</Button>
@@ -321,6 +375,9 @@ class Register extends React.Component {
</Link>
</Typography>
</div>
<div className={classes.connexionRecruteur}>
Vous êtes recruteur ? <a className={classes.enSavoirPlus} href='https://recruteur.talentstube.com'><span >En savoir plus</span></a>
</div>
<Snack name= 'snackWarning'
variant= 'warning'
message={errors.message}
@@ -335,6 +392,7 @@ function mapStateToProps(state) {
return {
loading: !!state.user.loading,
errors: !!state.user.errors ?state.user.errors: {
phone:null,
email:null,
password:null,
firstname:null,
+1 -1
View File
@@ -97,7 +97,7 @@ export default {
postAnswer: (payload) => {
return axios.post("/api/answers", { adId: payload.adId, mediaId: payload.mediaId, companyId: payload.companyId }).then(res => res)
},
fetchJobsAnswered: ({ limit = null, order = "", keyword = "", offset = 1 }) => {
fetchJobsAnswered: ({ limit = null, order = "desc", keyword = "", offset = 1 }) => {
return axios.get(`api/answers`, { params: { offset, limit, order, keyword } }).then(res => res.data)
},
fetchAnswer: (payload) => {
+8 -8
View File
@@ -46,16 +46,16 @@ module.exports = withPlugins(
// frontServerUrl: 'http://localhost:3000',
// cvThequeUrl: 'https://recruteur.talentstube.com',
// PROD
symphonyUrl: 'https://recruteur.talentstube.com/',
blogUrl: 'https://blog.talentstube.com',
frontServerUrl: 'https://www.talentstube.com/',
cvThequeUrl: 'https://recruteur.talentstube.com',
// PRE PROD
// symphonyUrl: 'https://pp.talentstube.com/',
// symphonyUrl: 'https://recruteur.talentstube.com/',
// blogUrl: 'https://blog.talentstube.com',
// frontServerUrl: 'https://pp.app.talentstube.com/',
// frontServerUrl: 'https://www.talentstube.com/',
// cvThequeUrl: 'https://recruteur.talentstube.com',
version : 'V2.6.2',
// PRE PROD
symphonyUrl: 'https://pp.talentstube.com/',
blogUrl: 'https://blog.talentstube.com',
frontServerUrl: 'https://pp.app.talentstube.com/',
cvThequeUrl: 'https://recruteur.talentstube.com',
version : 'V2.11.2',
adListDefaultUrl: '/statique/images/default/default_picture_company.jpg',
cachedMediaUrl: '/media/cache/profile_thumb/uploads/img/',
postedContentUrl: '/uploads/img/',
+225
View File
@@ -1,5 +1,225 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.talentstube.com/Offre/152-animateur-des-relais-assistants-maternels-f-h</loc>
<lastmod>2021-06-28</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/147-monteur-de-systemes-mecanises-h-f</loc>
<lastmod>2021-06-28</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/33350-greenyard-frozen</loc>
<lastmod>2021-06-28</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/149-commercial-b-to-b-f-h/</loc>
<lastmod>2021-05-17</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/150-responsable-webmarketing-f-h/</loc>
<lastmod>2021-05-17</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/33190-les-francas-doubs/</loc>
<lastmod>2021-04-26</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/148-educateur-de-jeunes-enfants-f-h</loc>
<lastmod>2021-04-26</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/146-animateur-ado-f-h</loc>
<lastmod>2021-04-17</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/144-soudeur-f-h</loc>
<lastmod>2021-04-19</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/143-dessinateur-3-d-f-h</loc>
<lastmod>2021-04-19</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/142-charge-daffaires-f-h</loc>
<lastmod>2021-03-24</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=146&amp;url=/Offre/146-animateur-ado-f-h&amp;videoId=535772088&amp;typeEntite=Offre&amp;nameCompany=Les%20Francas%20du%20Doubs&amp;nameOffre=Animateur%20Ado%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=135&amp;url=/Offre/135-commercial-b-to-c-f-h&amp;videoId=502499843&amp;typeEntite=Offre&amp;nameCompany=Fym%20Action&amp;nameOffre=Commercial%20B%20to%20C%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=135&amp;url=/Offre/135-commercial-b-to-c-f-h&amp;videoId=502499843&amp;typeEntite=Offre&amp;nameCompany=Fym%20Action&amp;nameOffre=Commercial%20B%20to%20C%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=135&amp;url=/Offre/135-commercial-b-to-c-f-h&amp;videoId=502499843&amp;typeEntite=Offre&amp;nameCompany=Fym%20Action&amp;nameOffre=Commercial%20B%20to%20C%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=133&amp;url=/Offre/133-gestionnaire-de-copropriete-f-h&amp;videoId=500395879&amp;typeEntite=Offre&amp;nameCompany=Cabinet%20JOURDAN&amp;nameOffre=Gestionnaire%20de%20co%20propriete</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=132&amp;url=/Offre/132-comptable-f-h&amp;videoId=495504495&amp;typeEntite=Offre&amp;nameCompany=Cabinet%20JOURDAN&amp;nameOffre=Comptable%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=130&amp;url=/Offre/130-assistant-f-h&amp;videoId=495156742&amp;typeEntite=Offre&amp;nameCompany=Cabinet%20JOURDAN&amp;nameOffre=Assistant%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=131&amp;url=/Offre/131-poseur-f-h&amp;videoId=494089386&amp;typeEntite=Offre&amp;nameCompany=TPC%20Ouest&amp;nameOffre=Poseur%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=131&amp;url=/Offre/140-aide-a-domicile-f-h&amp;videoId=507891163&amp;typeEntite=Offre&amp;nameCompany=ADMR56&amp;nameOffre=Aide%20a%20domicile</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=135&amp;url=/Offre/129-commercial-b-to-b-f-h&amp;videoId=491331138&amp;typeEntite=Offre&amp;nameCompany=Fym%20Action&amp;nameOffre=Commercial%20B%20to%20b%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=122&amp;url=/Offre/122-chauffeurs-spl-f-h&amp;videoId=482599011&amp;typeEntite=Offre&amp;nameCompany=AER%20Recyclage&amp;nameOffre=Chauffeurs%20SPL%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=128&amp;url=/Offre/128-techniciens-poseurs-f-h&amp;videoId=485471109&amp;typeEntite=Offre&amp;nameCompany=Pro%20Fermetures&amp;nameOffre=Techniciens%20Poseurs%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=113&amp;url=/Offre/113-aide-a-domicile-f-h&amp;videoId=440702903&amp;typeEntite=Offre&amp;nameCompany=Onela&amp;nameOffre=Aide%20à%20domicile%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=120&amp;url=/Offre/120-technico-commercial-f-h&amp;videoId=462942715&amp;typeEntite=Offre&amp;nameCompany=Temporis&amp;nameOffre=Technico-Commercial%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=115&amp;url=/Offre/115-technicien-ramoneur-fumiste-f-h&amp;videoId=460206945&amp;typeEntite=Offre&amp;nameCompany=La%20Centrale%20des%20Ramoneurs&amp;nameOffre=Technicien%20Ramoneur%20/%20Fumiste%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=109&amp;url=/Offre/109-equipier-de-plateforme-polyvalent-f-h&amp;videoId=422692890&amp;typeEntite=Offre&amp;nameCompany=AER%20Recyclage&amp;nameOffre=Equipier%20de%20plateforme%20polyvalent%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=112&amp;url=/Offre/112-conseillers-technico-commerciaux-h-f&amp;videoId=438478115&amp;typeEntite=Offre&amp;nameCompany=Pro%20Fermetures&amp;nameOffre=Conseillers%20Technico-Commerciaux%20(H/F)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=111&amp;url=/Offre/111-couvreur-etancheur-f-h&amp;videoId=432410136&amp;typeEntite=Offre&amp;nameCompany=Blandin&amp;nameOffre=Couvreur/Étancheur%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=108&amp;url=/Offre/108-plombier-chauffagiste-f-h&amp;videoId=398509552&amp;typeEntite=Offre&amp;nameCompany=Blandin&amp;nameOffre=Plombier/Chauffagiste%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=107&amp;url=/Offre/107-operateur-soudeur-chaudronnier-f-h&amp;videoId=397982745&amp;typeEntite=Offre&amp;nameCompany=GEIQ%20Industrie%2044&amp;nameOffre=Opérateur%20Soudeur%20/%20Chaudronnier%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=101&amp;url=/Offre/101-conducteurs-routiers-f-h&amp;videoId=391023366&amp;typeEntite=Offre&amp;nameCompany=Lactalis%20Logistique%20et%20Transports&amp;nameOffre=Conducteurs%20routiers%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=103&amp;url=/Offre/103-agents-de-quai-f-h&amp;videoId=391023871&amp;typeEntite=Offre&amp;nameCompany=Lactalis%20Logistique%20et%20Transports&amp;nameOffre=Agents%20de%20quai%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=77&amp;url=/Offre/77-commercial-sedentaire-en-vente-directe-b-to-b-h-f&amp;videoId=343666512&amp;typeEntite=Offre&amp;nameCompany=Télémaque&amp;nameOffre=Commercial%20sédentaire%20en%20vente%20directe%20B%20to%20B%20(H/F)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=102&amp;url=/Offre/102-preparateurs-de-commandes-f-h&amp;videoId=391023988&amp;typeEntite=Offre&amp;nameCompany=Lactalis%20Logistique%20et%20Transports&amp;nameOffre=Préparateurs%20de%20commandes%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=46&amp;url=/Offre/46-conducteurs-routiers-h-f&amp;videoId=273464203&amp;typeEntite=Offre&amp;nameCompany=Groupe%20MOUSSET&amp;nameOffre=Conducteurs%20routiers%20(H/F)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=32518&amp;url=/Entreprise/32518-cabinet-jourdan&amp;videoId=491607083&amp;typeEntite=Entreprise&amp;nameCompany=Cabinet%20JOURDAN&amp;nameOffre=</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=32507&amp;url=/Entreprise/32507-tpc-ouest&amp;videoId=489836459&amp;typeEntite=Entreprise&amp;nameCompany=TPC%20Ouest&amp;nameOffre=</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=32355&amp;url=/Entreprise/32355-hyphae&amp;videoId=478847996&amp;typeEntite=Entreprise&amp;nameCompany=HYPHAE&amp;nameOffre=</loc>
<lastmod>2021-02-04</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=21247&amp;url=/Entreprise/21247-lactalis-logistique-et-transports&amp;videoId=391023777&amp;typeEntite=Entreprise&amp;nameCompany=Lactalis%20Logistique%20et%20Transports&amp;nameOffre=</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=19800&amp;url=/Entreprise/19800-silvadec&amp;videoId=386500340&amp;typeEntite=Entreprise&amp;nameCompany=Silvadec&amp;nameOffre=</loc>
<lastmod>2021-02-04</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=19205&amp;url=/Entreprise/19205-intermarche-logistique-alimentaire-international&amp;videoId=385268706&amp;typeEntite=Entreprise&amp;nameCompany=Intermarché%20Logistique%20Alimentaire%20International&amp;nameOffre=</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=12480&amp;url=/Entreprise/12480-fym-action&amp;videoId=345898361&amp;typeEntite=Entreprise&amp;nameCompany=Fym%20Action&amp;nameOffre=</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/143-dessinateur-3d-f-h</loc>
<lastmod>2021-03-31</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/140-aide-a-domicile-f-h</loc>
<lastmod>2021-02-10</lastmod>
@@ -15,6 +235,11 @@
<lastmod>2021-01-18</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com</loc>
<lastmod>2021-03-09</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offres</loc>
<lastmod>2021-01-18</lastmod>
+2
View File
@@ -54,6 +54,7 @@
"react-facebook-login": "^4.1.1",
"react-ga": "^2.5.7",
"react-google-recaptcha": "^2.0.1",
"react-helmet": "^6.1.0",
"react-html-parser": "^2.0.2",
"react-jss": "latest",
"react-moment": "^0.9.7",
@@ -62,6 +63,7 @@
"react-redux-loading-bar": "^5.0.0",
"react-router-dom": "^5.2.0",
"react-select": "^3.1.1",
"react-slick": "^0.28.1",
"react-sticky-box": "^0.9.3",
"react-swipeable-views": "^0.13.3",
"reactstrap": "^6.4.0",
+443
View File
@@ -0,0 +1,443 @@
import React, {Fragment} from 'react';
import {connect} from "react-redux";
import PropTypes from 'prop-types';
import _ from "lodash"
import {withStyles} from '@material-ui/core/styles';
import Tabs from '@material-ui/core/Tabs';
import Tab from '@material-ui/core/Tab';
import {TextField, Button, Typography, Grid, Hidden} from '@material-ui/core';
import SwipeableViews from 'react-swipeable-views';
import Snack from '../components/atoms/snack'
import Loader from '../components/templates/loader'
import LayoutCandidature from '../components/templates/LayoutCandidature';
import CandidatureDetail from '../components/organisms/AnswerDetail'
import OffreDetail from '../components/organisms/OffreDetail'
import Chat from '../components/organisms/Chat'
import AppBar from '@material-ui/core/AppBar';
import {AnswersSelector} from '../reducers/answers'
import {fetchAnswerRequest} from '../actions/answer'
import Head from 'next/head'
import Chip from '@material-ui/core/Chip';
import getConfig from 'next/config'
import ArrowForwardIcon from '@material-ui/icons/ArrowForward';
import ButtonBase from '@material-ui/core/ButtonBase';
const {publicRuntimeConfig} = getConfig()
const styles = theme => ({
root: {
position: 'relative',
textAlign: 'center',
paddingTop: theme.spacing(20),
justifyContent: 'center'
},
container: {
// display: 'flex',
// flexDirection: 'column',
height: '100%'
},
userDataContainer: {
// display: 'flex',
padding: theme.spacing(2) + 'px ',
[theme.breakpoints.up('md')]: {
padding: theme.spacing(2) + 'px 18vw',
},
},
userTextContainer: {
// display: 'flex',
// flexDirection: 'column',
paddingLeft: theme.spacing(2)
},
AppBar: {
top: '64px',
position: 'fixed'
},
SwipeableViews: {
paddingTop: '64px'
},
tab: {
'& span.MuiTab-wrapper': {
fontSize: '1.1em',
fontWeight: '300',
textTransform: 'none'
}
},
title: {
fontSize: '1em',
fontWeight: '500'
},
titleBorder: {
'&:after': {
content: '""',
width: '15px',
borderBottom: 'solid 2px',
borderColor: theme.palette.primary.main + '!important',
// display: 'flex'
}
},
userTextName: {
fontWeight: '500',
fontSize: '1em'
},
userTextDate: {
fontWeight: '500',
fontSize: '0.9em'
},
texteInfo:{
fontWeight: '300',
fontSize: '0.9em'
},
userAvatar: {
maxWidth: '104px',
},
menuLogo: {
cursor: 'pointer',
[
theme
.breakpoints
.down('md')
]: {
width: '200px'
},
[
theme
.breakpoints
.down('sm')
]: {
width: '130px'
}
},
information: {
padding: "1em",
width: "100%",
backgroundColor: theme.palette.secondary.main,
borderRadius: "5px",
marginBottom: "30px",
borderColor: "1px solid #E5E5E6"
},
grille: {
paddingTop: theme.spacing(4),
paddingBottom: theme.spacing(4),
paddingLeft : theme.spacing(4),
marginBottom: "30px",
borderRadius: "5px",
border: "1px solid #1E2327",
color: theme.palette.primary.dark
},
menuLien: {
fontSize: "1em",
textTransform: "uppercase",
fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
color: theme.palette.primary.dark,
textDecoration: "none",
'&:hover': {
color: theme.palette.primary.dark
},
'&:active': {
color: theme.palette.primary.dark
},
'&:visited': {
color: theme.palette.primary.dark
}
},
grilleGauche: {
textAlign: "center"
},
grilleDroite: {
textAlign: "center"
},
grilleBas: {
backgroundColor: theme.palette.secondary.dark
},
chip: {
marginTop: "10px",
backgroundColor: "#E7F3FF",
color: theme.palette.primary.dark
},
icon: {
color: theme.palette.secondary.dark
}
});
function TabContainer({children, dir}) {
return (
<Typography
component="div"
dir={dir}
style={{
padding: 8 * 3
}}>
{children}
</Typography>
);
}
const status = new Map([
["A_TRAITER"
, "Envoyée"]
,
["CONTACTE"
, "En cours de traitement"]
,
["ENTRETIEN"
, "En cours de traitement"]
,
["REFUSE"
, "Refusée"]
,
["EMBAUCHE"
, "Embauchée"]
,
["EXPIRED"
, "Expirée"]
,
[""
, "Envoyée"]
,
["Null"
, "Envoyée"]
,
])
class Candidature extends React.Component {
state = {
data: {},
errors: {},
loading: true,
tabIndex: 0,
openSnack: false
}
static getInitialProps(context) {
const {id} = context.query
return {
id: id * 1
}
}
componentDidMount() {
this
.props
.fetchAnswerRequest(this.props.id)
}
UNSAFE_componentWillReceiveProps(nextProps) {
this.setState({loading: nextProps.answer.loading})
}
componentWillUnmount() {}
handleChange = (event, newValue) => {
this.setState({tabIndex: newValue});
}
handleChangeIndex = (index) => {
this.setState({tabIndex: index});
}
render() {
const {classes} = this.props;
const {data, errors, loading, openSnack} = this.state;
console.log("test");
const logoUrl = (this.props.answer.ad
? (this.props.answer.ad.company.logo
? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + this.props.answer.ad.company.logo
: publicRuntimeConfig.symphonyUrl + "/img/default_picture_svg")
: this.props.answer.company
? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + this.props.answer.company.logo
: publicRuntimeConfig.symphonyUrl + "/img/default_picture_svg")
const nomCompany = (this.props.answer.ad
? (this.props.answer.ad.company.brand_name
? this.props.answer.ad.company.brand_name
: "")
: this.props.answer.company
? this.props.answer.company.brand_name
: "")
const nomAd = (this.props.answer.ad
? (this.props.answer.ad.title
? this.props.answer.ad.title
: "Candidature spontanée")
: "Candidature spontanée")
//L'entreprise {nomCompany} étudie actuellement votre candidature
const infos = new Map([
[
"A_TRAITER", "Votre candidature a bien été envoyée à lentreprise "+nomCompany
],
[
"CONTACTE", "L'entreprise "+nomCompany+" étudie actuellement votre candidature"
],
[
"ENTRETIEN", "L'entreprise "+nomCompany+" étudie actuellement votre candidature"
],
[
"REFUSE", "Votre candidature a été refusée par lentreprise "+nomCompany+"."
],
[
"EMBAUCHE", "Votre candidature a été acceptée par lentreprise "+nomCompany+"."
],
[
"EXPIRED", "Expirée"
],
[
"", "Envoyée"
],
["Null", "Envoyée"]
])
//brand_name
return (
<LayoutCandidature>
<Head>
<title key="title">Candidature</title>
<meta name="robots" content="noindex, nofollow"></meta>
</Head>
<Fragment>
<div className={classes.container}>
{/* {!!errors && (<div className="alert alert-danger">{errors && errors.message}</div> )} */}
{loading && (<Loader/>)}
{!loading && (
<Fragment>
<AppBar color="default" className={classes.AppBar}>
<Tabs
value={this.state.tabIndex}
onChange={this.handleChange}
indicatorColor="primary"
variant="fullWidth">
<Tab label="Candidature" className={classes.tab}/>
<Tab label="Messagerie" className={classes.tab}/>
<Tab label="Offre d'emploi" className={classes.tab}/>
</Tabs>
</AppBar>
<SwipeableViews
axis={'x'}
index={this.state.tabIndex}
onChangeIndex={() => this.handleChangeIndex()}
className={classes.SwipeableViews}>
<TabContainer dir={'x'}>
<Fragment>
<section className={classes.userDataContainer}>
<Grid container spacing={2} className={classes.grille}>
<Grid item>
<ButtonBase className={classes.image}>
<img alt="talents-tube" src={logoUrl} className={classes.userAvatar}/>
</ButtonBase>
</Grid>
<Grid item lg={12} xl container>
<Grid item xs container direction="column" spacing={2}>
<Grid item xl>
<Typography gutterBottom variant="subtitle1">
{(this.props.answer.ad
? (this.props.answer.ad.company.brand_name
? this.props.answer.ad.company.brand_name
: "")
: this.props.answer.company.brand_name)}
</Typography>
<Typography variant="body2" gutterBottom>
{this.props.answer.ad
? (this.props.answer.ad.title
? this.props.answer.ad.title
: "Candidature spontanée")
: "Candidature spontanée"}
</Typography>
</Grid>
</Grid>
</Grid>
</Grid>
<Grid container spacing={2} className={classes.grille}>
<Grid container >
<Grid item>
<Typography gutterBottom className={classes.userTextDate}>
Envoyé le :
</Typography>
</Grid>
<Grid item xs={12} sm container>
<Typography gutterBottom className={classes.texteInfo}>
{(new Date(this.props.answer.c_time)).toLocaleDateString("fr-FR")}
</Typography>
</Grid>
</Grid>
<Grid container spacing={2} >
<Grid item>
<Typography gutterBottom variant="subtitle1" className={classes.userTextDate}>
Statut :
</Typography>
</Grid>
<Grid item xl={12} xl >
<Grid xl={12} xl container>
<Typography gutterBottom className={classes.texteInfo}>
<Chip size="small" label={status.get(this.props.answer.status_reponse)? status.get(this.props.answer.status_reponse) : "Envoyée" } className={classes.chip} />
</Typography>
</Grid>
<Grid xl={12} xl container>
<Typography gutterBottom className={classes.texteInfo}>
{infos.get(this.props.answer.status_reponse)
? infos.get(this.props.answer.status_reponse)
: "L'entreprise "+nomCompany+" étudie actuellement votre candidature"}
</Typography>
</Grid>
</Grid>
</Grid>
</Grid>
<Grid item className={classes.grille} spacing={2}>
{this.props.answer.video && <CandidatureDetail {...this.props.answer}/>}
</Grid>
</section>
</Fragment>
</TabContainer>
<TabContainer dir={'x'}>
{this.props.answer.messages && <Chat answerId={this.props.answer.id} nomCompany={nomCompany} logoUrl={logoUrl} nomAd={nomAd}></Chat>}
</TabContainer>
<TabContainer dir={'x'}>
{this.props.answer.ad && <OffreDetail isCandidature='true' offre={this.props.answer.ad}/>}
</TabContainer>
</SwipeableViews>
</Fragment>
)}
</div>
<Snack
variant="error"
message={this.state.errors.message}
openSnack={this.state.openSnack}
onClose={this.handleClose}/>
</Fragment>
</LayoutCandidature>
);
}
}
function mapStateToProps(state) {
return {answer: state.answer, user: state.user}
}
Candidature.propTypes = {
classes: PropTypes.object.isRequired,
id: PropTypes.number
};
export default withStyles(styles)(connect(mapStateToProps, {fetchAnswerRequest})(Candidature))
+243 -3
View File
@@ -1,5 +1,5 @@
import React from 'react';
import React, { useState } from 'react'
import { connect } from "react-redux";
import PropTypes from 'prop-types';
import _ from "lodash"
@@ -12,8 +12,34 @@ import { fetchJobsAnsweredRequest } from '../actions/answer'
import { AnswersSelector } from '../reducers/answers'
import Head from 'next/head'
import Link from 'next/link';
import AppBar from '@material-ui/core/AppBar';
import Paper from '@material-ui/core/Paper';
import Tabs from '@material-ui/core/Tabs';
import Tab from '@material-ui/core/Tab';
import Box from '@material-ui/core/Box';
import GridBouton from '@material-ui/core/Grid';
import IconButton from '@material-ui/core/IconButton';
import AccountIcon from '@material-ui/icons/AccountCircle';
import MovieIcon from '@material-ui/icons/Movie';
import DescriptionIcon from '@material-ui/icons/Description';
const styles = theme => ({
menu: {
flexGrow: 1,
},
menu2: {
flexGrow: 1,
textAlign: 'center',
justifyContent: 'center',
padding: theme.spacing(2),
},
indicatorColor:{
backgroundColor: theme.palette.primary.main,
},
textColor:{
color: theme.palette.primary.dark,
},
root: {
position: 'relative',
textAlign: 'center',
@@ -41,13 +67,83 @@ const styles = theme => ({
marginBottom: theme.spacing(3),
padding: theme.spacing(0, 8),
},
boutonAction:{
border: "none",
height: "6em",
padding: "1em",
backgroundColor: theme.palette.primary.main,
textAlign: "left",
borderRadius: "20px",
cursor: "pointer",
boxShadow: "0px 2px 5px rgb(30 35 39 / 5%)",
transition: "background-color 0.3s",
transition: "box-shadow 0.5s",
color: "#fff !important"
},
conteneurbouton:{
width:"100%",
display: "flex",
flexWrap: "wrap",
justifyContent: "space-around"
},
conteneurbouton1:{
width:"30%",
display:"inline-block",
paddingRight:"2em",
},
conteneurbouton2:{
width:"30%",
display:"inline-block",
paddingRight:"2em",
},
conteneurbouton3:{
width:"30%",
display:"inline-block",
paddingRight:"2em",
},
paper: {
width: "100%",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
});
class Candidatures extends React.Component {
constructor(props, context) {
super(props, context);
}
state = {
value: "",
setValue:"",
}
componentDidMount() {
this.setState({
value: 0,
})
}
render() {
const { classes } = this.props;
const tabData = 0;
const handleChange = (event, newValue) => {
this.setState({
value: newValue,
})
if(newValue==0){
document.location.href="/Candidatures";
}else if(newValue==1){
document.location.href="/profil2";
}else if(newValue==2){
document.location.href="/Parametres";
}
//
console.log(newValue);
};
return (
<LayoutGrid backLink="/">
@@ -55,14 +151,158 @@ class Candidatures extends React.Component {
<title key="title">Candidatures</title>
<meta name="robots" content="noindex, nofollow"></meta>
</Head>
{/* <div className={classes.root}>
<AppBar position="static" color="default">
<Tabs
value={this.state.value}
onChange={handleChange}
indicatorColor="primary"
textColor="primary"
variant="scrollable"
scrollButtons="auto"
aria-label="scrollable auto tabs example"
>
<Tab label="Item One" {...a11yProps(0)} />
<Tab label="Item Two" {...a11yProps(1)} />
<Tab label="Item Three" {...a11yProps(2)} />
<Tab label="Item Four" {...a11yProps(3)} />
<Tab label="Item Five" {...a11yProps(4)} />
<Tab label="Item Six" {...a11yProps(5)} />
<Tab label="Item Seven" {...a11yProps(6)} />
</Tabs>
</AppBar>
<TabPanel value={this.state.value} index={0}>
Item One
</TabPanel>
<TabPanel value={this.state.value} index={1}>
Item Two
</TabPanel>
<TabPanel value={this.state.value} index={2}>
Item Three
</TabPanel>
<TabPanel value={this.state.value} index={3}>
Item Four
</TabPanel>
<TabPanel value={this.state.value} index={4}>
Item Five
</TabPanel>
<TabPanel value={this.state.value} index={5}>
Item Six
</TabPanel>
<TabPanel value={this.state.value} index={6}>
Item Seven
</TabPanel>
</div> */}
<div>
<Paper className={classes.menu}>
{/* TODO */}
<Tabs
value={this.state.value}
onChange={handleChange}
indicatorColor="primary"
textColor="primary"
centered
>
<Tab label="Mes candidatures" />
<Tab label="Mon profil" />
</Tabs>
</Paper>
</div>
{/* Boutons d'actions */}
{/* <div className={classes.conteneurbouton}>
<div className={classes.conteneurbouton1}>
<div className={classes.boutonAction}>test</div>
</div>
<div className={classes.conteneurbouton2}>
<div className={classes.boutonAction}>test2</div>
</div>
<div className={classes.conteneurbouton3}>
<div className={classes.boutonAction}>test3</div>
</div>
</div> */}
<GridBouton container className={classes.menu2} spacing={4}>
<GridBouton item xs={12} sm={1} lg={1} >
</GridBouton >
<GridBouton item xs={12} sm={10} lg={10} >
<GridBouton container justify="center" spacing={4}>
<GridBouton key={0} item xs={12} sm={4} >
<Link href={"/profil2#information"} >
<Paper className={classes.paper} elevation={0}>
<div className={classes.boutonAction}>
<div>
<IconButton
key="info"
color="inherit"
className={classes.close}
>
<AccountIcon />
</IconButton>
</div>
Compléter mes informations
</div>
</Paper>
</Link>
</GridBouton>
<GridBouton key={1} item xs={12} sm={4}>
<Link href={"/profil2#video"} >
<Paper className={classes.paper} elevation={0}>
<div className={classes.boutonAction}>
<div>
<IconButton
key="video"
color="inherit"
className={classes.close}
>
<MovieIcon />
</IconButton>
</div>
Ajouter ma vidéo de présentation
</div>
</Paper>
</Link>
</GridBouton>
<GridBouton key={2} item xs={12} sm={4}>
<Link href={"/profil2#cv"} >
<Paper className={classes.paper} elevation={0}>
<div className={classes.boutonAction}>
<div>
<IconButton
key="cv"
color="inherit"
className={classes.close}
>
<DescriptionIcon />
</IconButton>
</div>
Ajouter mon CV
</div>
</Paper>
</Link>
</GridBouton>
</GridBouton>
</GridBouton>
<GridBouton item xs={12} sm={1} lg={1} >
</GridBouton >
</GridBouton>
<Typography component="h1" align="center" className={classes.title} gutterBottom>
Mes candidatures
</Typography>
<div className={classes.container}>
<Grid CustomRowComponent={AnswerRow}
dataFetcher={this.props.fetchJobsAnsweredRequest}
data={this.props.answers}
+4 -10
View File
@@ -136,7 +136,7 @@ const styles = theme => ({
},
buttonImportant: {
marginTop: theme.spacing(6),
},
}
});
const recaptchaRef = React.createRef();
@@ -232,15 +232,9 @@ class LoginPage extends React.Component {
<Loader />
)}
{!loading && (
<Fragment>
<Register linkedInAuth={this.linkedInAuth} facebookAuth={this.facebookAuth} erreurs={errors.message} />
</Fragment>
<Fragment>
<Register linkedInAuth={this.linkedInAuth} facebookAuth={this.facebookAuth} erreurs={errors.message} />
</Fragment>
)}
</div>
{/* <Snack name={success ? 'snackSuccess' : 'snackWarning'}
+48 -10
View File
@@ -83,7 +83,7 @@ const styles = theme => ({
formLink: {
paddingLeft: theme.spacing(1),
fontWeight: '500',
cursor: 'pointer',
color: theme.palette.primary.dark,
},
forgetPasswordText: {
marginTop: theme.spacing(2),
@@ -138,6 +138,32 @@ const styles = theme => ({
buttonImportant: {
marginTop: theme.spacing(6),
},
titre: {
fontWeight: 600,
fontSize: "1.875em",
marginBottom:"20px",
fontFamily: "Roboto",
},
connexionRecruteur:{
textAlign : "center",
marginTop:"40px",
backgroundColor:"#1E2327",
padding:"30px 0",
width:"100%",
color:"#fff",
fontSize: '1em',
fontWeight: '300',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
enSavoirPlus:{
textAlign : "center",
textDecoration :"none",
color:"#fff",
fontSize: '1em',
fontWeight: '600',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
});
const recaptchaRef = React.createRef();
@@ -273,6 +299,12 @@ class LoginPage extends React.Component {
<TabContainer dir={'x'}>
<div className={classes.tabContainer}>
<form className={classes.form} onSubmit={this.onSubmit}>
<Typography
className={classes.titre}
align="left"
>
Connexion
</Typography>
<TextField
value={data.email}
id="email"
@@ -345,16 +377,22 @@ class LoginPage extends React.Component {
{/* <SocialButtonsAuth linkedInAuth={this.linkedInAuth} facebookAuth={this.facebookAuth} /> */}
<div className={classes.form}>
<Typography
paragraph={true}
align="center"
className={classes.formText}
>Je ne possède pas de compte Talents Tube ?
<Link href="/Inscription">S'inscrire</Link>
</Typography>
<Typography
paragraph={true}
align="center"
className={classes.formText}
>Je ne possède pas de compte Talents Tube ?
<Link href={"/Inscription"} >
<span className={classes.formLink}>
S'inscrire
</span>
</Link>
</Typography>
</div>
<div className={classes.connexionRecruteur}>
Vous êtes recruteur ? <a className={classes.enSavoirPlus} href='https://recruteur.talentstube.com'><span >Connexion</span></a>
</div>
<div className={classes.form}>
<Typography
+1 -1
View File
@@ -76,7 +76,7 @@ class MentionsLegales extends Component {
`
TALENTS TUBE est joignable :
- Par internet : via le formulaire de contact sur le site ` }<a href="http://blog.talentstube.com" className={classes.link} target="_blank">blog.talentstube.com</a>{`;
- Par téléphone au 02 30 05 06 31, du lundi au vendredi de 9 h à 18 h;
- Par téléphone au 07 56 85 27 36, du lundi au vendredi de 9 h à 18 h;
- Par voie postale :
TALENTS TUBE
3 Rue Louis de Broglie
+7 -3
View File
@@ -70,7 +70,11 @@ class Player extends Component {
}
render() {
const { classes, id, url, typeEntite, videoId, nameCompany, nameOffre } = this.props
const urlEnv = process.env.NODE_ENV;
//pour la MEP
{/* A ENLEVER EN PROD */}
let nofollow = true;
// urlEnv == "development" ? nofollow = true : nofollow = true;
console.log(id);
console.log(typeEntite);
@@ -94,8 +98,8 @@ class Player extends Component {
<NextSeo
title={titleVideo}
description={descriptionVideo}
// noindex={true}
// nofollow={true}
noindex={nofollow}
nofollow={nofollow}
openGraph={{
title: titleVideo,
description: descriptionVideo,
+7 -5
View File
@@ -328,8 +328,9 @@ class Reponse extends React.Component {
render() {
const { loading, activeStep } = this.state;
const { classes, menu, offre, company } = this.props;
const logoUrl = (offre.company ? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + offre.company.logo : '');
const logoCompanyUrl = ((company && company.logo) ? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + company.logo : '');
const logoUrl = (offre.company ? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + offre.company.logo : logoCompanyUrl);
let rootStepper = activeStep === 0 ? (
classes.rootStepperDefault
@@ -339,19 +340,20 @@ class Reponse extends React.Component {
return (
<LayoutBack text="Candidature" step={this.state.activeStep} openStudio={this.state.openStudio}>
<Head>
<title>Candidature vidéo</title>
<meta name="description" content="Talents tube, postulez en video." />
<title key="title">Candidature vidéo</title>
<meta key="robots" name="robots" content="noindex, nofollow"></meta>
</Head>
{/* https://codesandbox.io/s/ii0us */}
<section className={classes.headerContainer}>
{ !!offre.company && (
<div className={classes.titreContainer}>
<div className={classes.logoContainer}>
<Avatar className={classes.logo} classes={{ img: classes.MuiAvatarImg }} src={logoUrl} alt="companylogo"/>
</div>
<div className={classes.infoContainer}>
<Typography gutterBottom variant="h5" component="h1" className={classes.title}>
@@ -366,7 +368,7 @@ class Reponse extends React.Component {
)
}
{ !!company.brand_name && (<Fragment><div className={classes.logoContainer}>
{/* <Avatar className={classes.logo} classes={{ img: classes.MuiAvatarImg }} src={logoCompanyUrl} alt="companylogo"/> */}
<Avatar className={classes.logo} classes={{ img: classes.MuiAvatarImg }} src={logoCompanyUrl} alt="companylogo"/>
</div>
<div className={classes.infoContainer}>
<Typography gutterBottom variant="h5" component="h1" className={classes.title}>
+1 -1
View File
@@ -116,7 +116,7 @@ class ResetPassword extends Component {
align="center"
variant="h5"
>
Réinitialisation du mot de passe
Modifier mot de passe
</Typography>
{loading && (
+7 -3
View File
@@ -1,5 +1,5 @@
import React from 'react';
import PropTypes from 'prop-types';
// import PropTypes from 'prop-types';
import Document, { Head, Main, NextScript } from 'next/document';
import { ServerStyleSheets } from '@material-ui/styles';
import flush from 'styled-jsx/server';
@@ -31,9 +31,13 @@ class MyDocument extends Document {
/>
{/* PWA primary color */}
<meta name="theme-color" content={theme.palette.primary.main} />
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,600&display=swap" rel="stylesheet">
<link rel="preload" href="/statique/css/fonts.css" rel="stylesheet">
</link>
<script async src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDYV8IJGtIoWLfXJQQvIuDQ88n2aEuRgpg&libraries=places"></script>
<link rel="stylesheet" type="text/css" charset="UTF-8" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.css" />
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick-theme.min.css" />
<link rel="stylesheet" type="text/css" href="/statique/css/autocomplete.css" />
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDYV8IJGtIoWLfXJQQvIuDQ88n2aEuRgpg&libraries=places"></script>
<script async type="text/javascript" src="/static/js/pwaInstaller.js" ></script>
{/* Global Site Tag (gtag.js) - Google Analytics */}
{/* <script
+510 -8
View File
@@ -12,14 +12,16 @@ import { connect } from 'react-redux'
import { fetchEmphasisJobsRequest } from "../actions/ads";
//const fetchEmphasisCompaniesRequest = lazy(() => import('../actions/companies'));
import { fetchEmphasisCompaniesRequest } from "../actions/companies";
import Loader from './../components/templates/loader'
import Loader from '../components/templates/loader'
import { isEmpty } from "lodash"
import NoResult from './../components/atoms/NoResult';
import NoResult from '../components/atoms/NoResult';
// import Head from 'next/head'
import dynamic from 'next/dynamic'
import OgHead from '../components/atoms/OgHead';
import getConfig from 'next/config'
import { BreadcrumbJsonLd } from 'next-seo';
import Slider from "react-slick";
import Hidden from '@material-ui/core/Hidden';
// const VideoSlider = dynamic(() => import('../components/organisms/ShortVideoHooker'), {
// ssr: false
// });
@@ -78,6 +80,9 @@ const styles = theme => ({
scrollerSectionCompany: {
backgroundColor: theme.palette.background.grey,
},
scrollerSectionSlider:{
backgroundColor: theme.palette.secondary.main,
},
card: {
margin: theme.spacing(1),
width: '96%',
@@ -138,7 +143,233 @@ const styles = theme => ({
margin: 'auto',
},
},
choix: {
color:"#fff",
position: "absolute",
top: "0",
bottom: "0",
width: "100%",
height: "100%",
display: "flex",
alignItems: "flex-start"
},
choixMobile: {
color:"#fff",
width: "100%",
height: "100%",
display: "flex",
alignItems: "flex-start",
},
containerVideoGauche :{
position: "relative",
height:"100%",
width:"50%",
backgroundImage: 'url("/statique/images/accueil/trouver-un-job.jpg")',
backgroundRepeat: 'no-repeat',
backgroundPosition: "center",
backgroundSize: "cover",
backgroundBlendMode: 'darken',
backgroundColor: 'rgba(30,35,39,0.4)',
},
containerVideoDroite :{
position: "relative",
backgroundColor:"red",
height:"100%",
width:"50%",
backgroundImage: 'url("/statique/images/accueil/recruter-des-talents.jpg") ',
backgroundRepeat: 'no-repeat',
backgroundPosition: "center",
backgroundSize: "cover",
backgroundBlendMode: 'darken',
backgroundColor: 'rgba(30,35,39,0.5)',
},
containerVideoMobile :{
height:"100%",
width:"100%",
backgroundImage: 'url("/statique/images/accueil/trouver-un-job.jpg")',
padding :"0 30px",
backgroundRepeat: 'no-repeat',
backgroundPosition: "center",
backgroundSize: "cover",
backgroundBlendMode: 'darken',
backgroundColor: 'rgba(30,35,39,0.5)',
},
containerTitre :{
},
wrap :{
[theme.breakpoints.up('md')]: {
height: "85%",
width: "100%",
position: "relative",
},
height: "100%",
width: "100%",
position: "relative",
},
headerTitre :{
backgroundColor:"transparent",
height: "100px",
width: "100%",
position: "absolute",
top: "30px",
textAlign:"center",
color:"#fff",
zIndex : "1000"
},
headerTitreMobile :{
width: "100%",
textAlign:"center",
color:"#fff",
marginBottom:"30px"
},
blocRecruteur:{
backgroundColor:"#fff",
bottom:"40px",
left:"60px",
position: "absolute",
padding:"50px",
fontWeight: "600",
minWidth:"40%",
borderRadius:"5px",
},
blocCandidat:{
backgroundColor:"#fff",
bottom:"40px",
right:"60px",
position: "absolute",
padding:"50px",
fontWeight: "600",
minWidth:"40%",
borderRadius:"5px",
},
blocRecruteurMobile:{
backgroundColor:"#fff",
padding:"20px",
fontWeight: "600",
minWidth:"90%",
borderRadius:"5px",
margin :"15px 0"
},
blocCandidatMobile:{
backgroundColor:"#fff",
padding:"20px",
fontWeight: "600",
minWidth:"90%",
borderRadius:"5px",
margin :"60px 0 15px 0"
},
titreAccueil:{
fontSize:"2.5em",
textAlign:"center",
color:"#fff",
paddingTop:"0px",
fontWeight: "600",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
titreAccueil2:{
fontSize:"1.5em",
textAlign:"center",
color:"#fff",
paddingTop:"40px",
fontWeight: "400",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
titreAccueilMobile:{
fontSize:"2.5em",
textAlign:"center",
color:"#fff",
paddingTop:"0px",
fontWeight: "600",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
titreAccueil2Mobile:{
fontSize:"1.5em",
textAlign:"center",
color:"#fff",
paddingTop:"40px",
fontWeight: "400",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
jeSuis:{
fontSize:"1em",
textTransform: "uppercase",
color:"#1E2327",
textAlign: "left",
fontWeight: "300",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
marginBottom:"1em"
},
jeSuisMobile:{
fontSize:"1em",
textTransform: "uppercase",
color:"#1E2327",
textAlign: "center",
fontWeight: "300",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
marginBottom:"1em"
},
action:{
fontSize:"1.5em",
color:"#1E2327",
textAlign: "left",
fontWeight: "600",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
marginBottom:"1.5em"
},
boutonCandidat:{
width:"100%",
},
boutonRecruteur:{
width:"100%",
color: theme.palette.secondary.main,
backgroundColor: theme.palette.primary.important,
},
boutonCandidatMobile:{
width:"100%",
margin : "0px !important"
},
boutonRecruteurMobile:{
width:"100%",
color: theme.palette.secondary.main,
backgroundColor: theme.palette.primary.important,
margin : "0px !important"
},
temoignage:{
textAlign:"center"
},
lien:{
textDecoration:'none',
color:'#fff'
},
alignVertical:{
verticalAlign:"middle !important",
maxHeight :"80px",
minHeight :"60px",
},
alignVerticalMobile:{
verticalAlign:"middle !important",
maxHeight :"70px",
minHeight :"70px",
},
sliderDiv:{
padding:"30px"
},
sliderDivMobile:{
display: "inline !important",
padding:"10px",
},
sliderContainerMobile:{
textAlign:"center"
}
});
///
class Index extends React.Component {
state = {
@@ -158,7 +389,22 @@ class Index extends React.Component {
}
render() {
const { classes } = this.props;
const settings = {
dots: false,
infinite: true,
slidesToShow: 5,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 2000
};
const settingsMobile = {
dots: false,
infinite: true,
slidesToShow: 2,
slidesToScroll: 2,
autoplay: true,
autoplaySpeed: 2000
};
const socialShareUrl = typeof window !== 'undefined' ? window.location
: publicRuntimeConfig.frontServerUrl ;
const DefaultUrl = publicRuntimeConfig.symphonyUrl + "/img/default_picture_svg"
@@ -196,10 +442,87 @@ class Index extends React.Component {
},
]}
/>
<div className={classes.wrap}>
{/* PARTIE DESKTOP */}
<Hidden smDown>
<header className={classes.headerTitre}>
<h1 className={classes.titreAccueil}>La rencontre doffres demploi et de candidatures en vidéo</h1>
<span className={classes.titreAccueil2}>
Parce que vous méritez mieux que du texte !
</span>
</header>
<section className={classes.choix}>
<div className={classes.containerVideoGauche}>
<div className={classes.blocCandidat}>
<div className={classes.jeSuis}>JE SUIS CANDIDAT</div>
<div className={classes.action}>Je trouve un job</div>
<Button
variant="contained"
color="primary"
onClick={() => Router.push('/Offres')}
className={classes.button + ' ' + classes.boutonCandidat}
>Découvrir les offres
</Button>
</div>
</div>
<div className={classes.containerVideoDroite}>
<div className={classes.blocRecruteur}>
<div className={classes.jeSuis}>JE SUIS recruteur</div>
<div className={classes.action}>Je recrute des talents</div>
<a href='https://recruteur.talentstube.com' className={classes.lien}>
<Button
variant="contained"
className={classes.button + ' ' + classes.boutonRecruteur}
>Déposer une offre
</Button>
</a>
</div>
</div>
</section>
</Hidden>
{/* PARTIE MOBILE */}
<Hidden mdUp>
<section className={classes.choixMobile}>
<div className={classes.containerVideoMobile}>
<div className={classes.headerTitreMobile}>
<h1 className={classes.titreAccueilMobile}>La rencontre doffres demploi et de candidatures en vidéo</h1>
<span className={classes.titreAccueil2Mobile}>
Parce que vous méritez mieux que du texte !
</span>
</div>
<div className={classes.blocCandidatMobile}>
<div className={classes.jeSuisMobile}>JE SUIS CANDIDAT</div>
<Button
variant="contained"
color="primary"
onClick={() => Router.push('/Offres')}
className={classes.button + ' ' + classes.boutonCandidatMobile}
>Je trouve un job
</Button>
</div>
<div className={classes.blocRecruteurMobile}>
<div className={classes.jeSuisMobile}>JE SUIS recruteur</div>
<a href='https://recruteur.talentstube.com' className={classes.lien}>
<Button
variant="contained"
className={classes.button + ' ' + classes.boutonRecruteurMobile}
>Je recrute des talents
</Button>
</a>
</div>
</div>
</section>
</Hidden>
</div>
<div className={classes.container}>
{/* <VideoSlider /> */}
<section className={classes.scrollerSection + ' ' + classes.scrollerSectionOffer}>
<div
className={classes.HorizontalScrollerOffre}
@@ -209,7 +532,7 @@ class Index extends React.Component {
className={classes.beforeTitle}>
à la une
</Typography>
<Typography gutterBottom component="h1"
<Typography gutterBottom component="h2"
className={classes.title}>
Les offres d'emploi en <span className={classes.primary}>vidéo</span>
</Typography>
@@ -248,7 +571,7 @@ class Index extends React.Component {
className={classes.beforeTitle}>
à la une
</Typography>
<Typography gutterBottom component="h1"
<Typography gutterBottom component="h2"
className={classes.title}>
Les entreprises en <span className={classes.primary}>vidéo</span>
</Typography>
@@ -280,6 +603,185 @@ class Index extends React.Component {
</Button>
</section>
<section className={classes.scrollerSection + ' ' + classes.scrollerSectionCompany}>
<div
className={classes.HorizontalScrollerOffre}
>
<div className={classes.titleContainer}>
<Typography gutterBottom
className={classes.beforeTitle}>
Témoignage
</Typography>
<Typography gutterBottom component="h2"
className={classes.title}>
Le recrutement en <span className={classes.primary}>vidéo</span>
</Typography>
</div>
<div className={classes.temoignage}>
{/* PARTIE DEsktop */}
<Hidden smDown>
<iframe width="70%" height="450" src="https://www.youtube.com/embed/sKh0u7Mbdps"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</Hidden>
{/* PARTIE MOBILE */}
<Hidden mdUp>
<iframe width="90%" height="450" src="https://www.youtube.com/embed/sKh0u7Mbdps"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</Hidden>
</div>
</div>
</section>
<section className={classes.scrollerSection + ' ' + classes.scrollerSectionSlider}>
{/* PARTIE Desktop Slider des logos d'entreprises*/}
<Hidden smDown>
<Slider ref={slider => (this.slider = slider)} {...settings}>
<a href="/Entreprise/21247-lactalis-logistique-et-transports">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Lactalis" src="/statique/images/logos/recrutement-video-lactalis.jpg"></img>
</div>
</a>
<a href="/Entreprise/28481-onela">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Onela" src="/statique/images/logos/recrutement-video-onela-service-a-domicile.jpg"></img>
</div>
</a>
<a href="/Entreprise/19205-intermarche-logistique-alimentaire-international">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Intermarché" src="/statique/images/logos/recrutement-video-intermarche.jpg"></img>
</div>
</a>
<a href="/Entreprise/4059-eiffage-construction-grand-ouest">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Eiffage" src="/statique/images/logos/recrutement-video-eiffage.jpg"></img>
</div>
</a>
<a href="/Entreprise/8639-mma-questembert">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi MMA" src="/statique/images/logos/recrutement-video-mma-assurances.jpg"></img>
</div>
</a>
<a href="/Entreprise/32987-admr-56">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi ADMR" src="/statique/images/logos/recrutement-video-ADMR.jpg"></img>
</div>
</a>
<a href="/Entreprise/13464-jpa">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi JPA" src="/statique/images/logos/recrutement-video-jpa.jpg"></img>
</div>
</a>
<a href="/Entreprise/2527-groupe-mousset">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Groupe Mousset" src="/statique/images/logos/recrutement-video-groupe-mousset.jpg"></img>
</div>
</a>
<a href="/Entreprise/1467-groupe-rocher-operations">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Groupe Rocher" src="/statique/images/logos/recrutement-video-groupe-rocher.jpg"></img>
</div>
</a>
<a href="/Entreprise/26064-aer-recyclage">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi AER Recyclage" src="/statique/images/logos/recrutement-video-aer-recyclage.jpg"></img>
</div>
</a>
<a href="/Entreprise/46-actual">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Actual" src="/statique/images/logos/recrutement-video-actual.jpg"></img>
</div>
</a>
<a href="/Entreprise/31934-la-centrale-des-ramoneurs">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi La centrale des ramoneurs" src="/statique/images/logos/recrutement-video-la-centrale-des-ramoneurs.jpg"></img>
</div>
</a>
<a href="/Entreprise/32507-tpc-ouest">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi TPC Ouest" src="/statique/images/logos/recrutement-video-tpc-ouest-btp.jpg"></img>
</div>
</a>
</Slider>
</Hidden>
{/* PARTIE Mobile */}
<Hidden mdUp>
<div className={classes.sliderContainerMobile}>
<a href="/Entreprise/21247-lactalis-logistique-et-transports" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Lactalis" src="/statique/images/logos/recrutement-video-lactalis.jpg"></img>
</div>
</a>
<a href="/Entreprise/28481-onela" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Onela" src="/statique/images/logos/recrutement-video-onela-service-a-domicile.jpg"></img>
</div>
</a>
<a href="/Entreprise/19205-intermarche-logistique-alimentaire-international" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Intermarché" src="/statique/images/logos/recrutement-video-intermarche.jpg"></img>
</div>
</a>
<a href="/Entreprise/4059-eiffage-construction-grand-ouest" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Eiffage" src="/statique/images/logos/recrutement-video-eiffage.jpg"></img>
</div>
</a>
<a href="/Entreprise/8639-mma-questembert" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi MMA" src="/statique/images/logos/recrutement-video-mma-assurances.jpg"></img>
</div>
</a>
<a href="/Entreprise/32987-admr-56" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi ADMR" src="/statique/images/logos/recrutement-video-ADMR.jpg"></img>
</div>
</a>
<a href="/Entreprise/13464-jpa">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi JPA" src="/statique/images/logos/recrutement-video-jpa.jpg"></img>
</div>
</a>
<a href="/Entreprise/2527-groupe-mousset">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Groupe Mousset" src="/statique/images/logos/recrutement-video-groupe-mousset.jpg"></img>
</div>
</a>
<a href="/Entreprise/1467-groupe-rocher-operations">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Groupe Rocher" src="/statique/images/logos/recrutement-video-groupe-rocher.jpg"></img>
</div>
</a>
<a href="/Entreprise/26064-aer-recyclage">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi AER" src="/statique/images/logos/recrutement-video-aer-recyclage.jpg"></img>
</div>
</a>
<a href="/Entreprise/46-actual">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Actual" src="/statique/images/logos/recrutement-video-actual.jpg"></img>
</div>
</a>
<a href="/Entreprise/31934-la-centrale-des-ramoneurs">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi La centrale des ramoneurs" src="/statique/images/logos/recrutement-video-la-centrale-des-ramoneurs.jpg"></img>
</div>
</a>
<a href="/Entreprise/32507-tpc-ouest">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="TPC Ouest" src="/statique/images/logos/recrutement-video-tpc-ouest-btp.jpg"></img>
</div>
</a>
</div>
</Hidden>
</section>
<Footer />
</div>
</Layout>
+80
View File
@@ -0,0 +1,80 @@
import React from 'react';
import {makeStyles} from '@material-ui/core/styles';
import Layout from "../components/templates/Layout";
import AccountProfile2 from "../components/organisms/AccountProfile2";
import { Typography } from '@material-ui/core';
import Head from 'next/head'
import AdBlockDetect from 'react-ad-block-detect';
const useStyles = makeStyles((theme) => ({
root: {
width: '100%'
},
button: {
marginRight: theme.spacing(1)
},
completed: {
display: 'inline-block'
},
instructions: {
marginTop: theme.spacing(1),
marginBottom: theme.spacing(1)
},
information: {
display: 'flex',
flexDirection: 'column',
backgroundColor: theme.palette.primary.main,
color: "#fff",
fontWeight: '700',
fontSize: '1.15em',
fontFamily: 'Roboto',
[
theme
.breakpoints
.up('md')
]: {
display: 'flex',
flexDirection: 'row',
alignItems: 'flex-start',
justifyContent: 'space-around',
backgroundColor: theme.palette.primary.main,
padding: theme.spacing(2, 2)
},
'& a': {
textDecoration: 'none'
},
texteBlanc: {
color: "#fff",
},
},
}));
export default function HorizontalNonLinearStepper() {
const classes = useStyles();
return (
<Layout>
<Head>
<title key="title">Profil Talents Tube..</title>
<meta key="robots" name="robots" content="noindex, nofollow"></meta>
</Head>
<div >
<AdBlockDetect >
<div className={classes.information}>
<p>AdBlocks a été détecté. Pour que Talents Tube puisse fonctionner
correctement, veuillez désactiver Ad Blocks</p>
</div>
</AdBlockDetect>
</div>
<div >
<AccountProfile2/>
</div>
</Layout>
);
}
+4 -2
View File
@@ -6,6 +6,7 @@ import { Typography } from '@material-ui/core';
import Head from 'next/head'
import AdBlockDetect from 'react-ad-block-detect';
const useStyles = makeStyles((theme) => ({
root: {
width: '100%'
@@ -56,7 +57,7 @@ export default function HorizontalNonLinearStepper() {
return (
<Layout>
<Head>
<title key="title">Profil Talents Tube</title>
<title key="title">Profil Talents Tube...</title>
<meta key="robots" name="robots" content="noindex, nofollow"></meta>
</Head>
<div >
@@ -71,9 +72,10 @@ export default function HorizontalNonLinearStepper() {
</AdBlockDetect>
</div>
<div >
<AccountProfile/>
</div>
</Layout>
);
}
}
+33 -9
View File
@@ -136,6 +136,9 @@ const styles = theme => ({
margin: 'auto',
},
},
container: {
},
});
class Index extends React.Component {
@@ -176,12 +179,19 @@ class Index extends React.Component {
getSuggestionValue = suggestion => suggestion.libelle;
// Render Each Option
renderSuggestion = suggestion => (
<span className="sugg-option">
<span className="name">
{suggestion.libelle} ({suggestion.code})
</span>
</span>
<span className={'suggestion-content ' + suggestion.twitter}>
<span className="name">
{
parts.map((part, index) => {
const className = part.highlight ? 'highlight' : null;
return (
<span className={className} key={index}>{part.text}</span>
);
})
}
</span>
</span>
);
// OnChange event handler
@@ -229,10 +239,23 @@ class Index extends React.Component {
getSuggestionMetierValue = suggestion => suggestion.libelle;
// Render Each Option
renderSuggestionMetier = suggestion => (
<span className="sugg-option">
// <div style="position: absolute; right: 0px; z-index: 1; will-change: transform; top: 0px; left: 0px; transform: translate3d(14px, 53px, 0px);" data-placement="bottom-start">
// <div class="MuiPaper-root MuiPaper-elevation1 MuiPaper-rounded" style="opacity: 1; transform: none; transform-origin: 0px 0px 0px; transition: opacity 280ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 186ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;">
// <ul class="MuiList-root MuiList-padding" role="menu" tabindex="-1">
// <div class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root Mui-selected MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button Mui-selected" tabindex="0" role="menuitem" aria-disabled="false" id="downshift-0-item-0">
// <div>
// <strong style="font-weight: 500;">{suggestion.libelle} </strong>
// <span style="font-weight: 300;">, {suggestion.code}</span>
// </div>
// <span class="MuiTouchRipple-root"></span>
// </div>
// </ul>
// </div>
// </div>
<span className="suggestion-content">
<span className="name">
{suggestion.libelle} ({suggestion.code})
{suggestion.libelle}
</span>
</span>
);
@@ -282,10 +305,11 @@ class Index extends React.Component {
getSuggestionMetierCompetenceValue = suggestion => suggestion.libelle;
// Render Each Option
renderSuggestionMetierCompetence = suggestion => (
<span className="sugg-option">
<span className="name">
{suggestion.libelle} ({suggestion.code})
{suggestion.libelle}
</span>
</span>
);
+101
View File
@@ -0,0 +1,101 @@
.react-autosuggest__container {
position: relative;
width: 85%;
}
.react-autosuggest__input {
width: 100%;
height: 30px;
padding: 10px 0;
font-family: Roboto;
font-weight: 400;
font-size: 16px;
border: 1px solid;
border-color: rgba(0, 0, 0, 0.23);
border-radius: 4px;
}
.react-autosuggest__input:focus {
outline: none;
}
.react-autosuggest__container--open .react-autosuggest__input {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.react-autosuggest__suggestions-container {
display: none;
}
.react-autosuggest__container--open .react-autosuggest__suggestions-container {
display: block;
position: absolute;
top: 51px;
width: 280px;
border: 1px solid #aaa;
background-color: #fff;
font-family: Roboto;
font-weight: 300;
font-size: 16px;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
z-index: 10;
}
.react-autosuggest__suggestions-list {
margin: 0;
padding: 0;
list-style-type: none;
}
.react-autosuggest__suggestion {
cursor: pointer;
padding: 10px 20px;
}
.react-autosuggest__suggestion:not(:first-child) {
border-top: 1px solid #ddd;
}
.react-autosuggest__suggestion--focused {
background-color: #0C7EAF;
color: #fff;
}
.suggestion-content {
display: flex;
align-items: center;
background-repeat: no-repeat;
}
.dancounsell {
background-image: url(https://s3.amazonaws.com/uifaces/faces/twitter/dancounsell/48.jpg);
}
.ladylexy {
background-image: url(https://s3.amazonaws.com/uifaces/faces/twitter/ladylexy/48.jpg);
}
.mtnmissy {
background-image: url(https://s3.amazonaws.com/uifaces/faces/twitter/mtnmissy/48.jpg);
}
.steveodom {
background-image: url(https://s3.amazonaws.com/uifaces/faces/twitter/steveodom/48.jpg);
}
.name {
margin-left: 8px;
line-height: 15px;
}
.highlight {
color: #ee0000;
font-weight: bold;
}
.react-autosuggest__suggestion--focused .highlight {
color: #120000;
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+36
View File
@@ -0,0 +1,36 @@
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
font-display: swap;
src: url(KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
font-display: swap;
src: url(KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
File diff suppressed because it is too large Load Diff
+153
View File
@@ -0,0 +1,153 @@
/*
* Core Owl Carousel CSS File
* v1.3.3
*/
/* clearfix */
.owl-carousel .owl-wrapper:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
/* display none until init */
.owl-carousel{
display: none;
position: relative;
width: 100%;
-ms-touch-action: pan-y;
}
.owl-carousel .owl-wrapper{
display: none;
position: relative;
-webkit-transform: translate3d(0px, 0px, 0px);
}
.owl-carousel .owl-wrapper-outer{
overflow: hidden;
position: relative;
width: 100%;
}
.owl-carousel .owl-wrapper-outer.autoHeight{
-webkit-transition: height 500ms ease-in-out;
-moz-transition: height 500ms ease-in-out;
-ms-transition: height 500ms ease-in-out;
-o-transition: height 500ms ease-in-out;
transition: height 500ms ease-in-out;
}
.owl-carousel .owl-item{
float: left;
}
.owl-controls .owl-page,
.owl-controls .owl-buttons div{
cursor: pointer;
}
.owl-controls {
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
/* mouse grab icon */
.grabbing {
cursor:url(../img/grabbing.png) 8 8, move;
}
/* fix */
.owl-carousel .owl-wrapper,
.owl-carousel .owl-item{
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-webkit-transform: translate3d(0,0,0);
-moz-transform: translate3d(0,0,0);
-ms-transform: translate3d(0,0,0);
}
/*
* Owl Carousel Owl Demo Theme
* v1.3.3
*/
.owl-theme .owl-controls{
margin-top: 10px;
text-align: center;
}
/* Styling Next and Prev buttons */
.owl-theme .owl-controls .owl-buttons div{
color: #FFF;
display: inline-block;
zoom: 1;
*display: inline;/*IE7 life-saver */
margin: 5px;
padding: 3px 10px;
font-size: 12px;
-webkit-border-radius: 30px;
-moz-border-radius: 30px;
border-radius: 30px;
background: #869791;
filter: Alpha(Opacity=50);/*IE7 fix*/
opacity: 0.5;
}
/* Clickable class fix problem with hover on touch devices */
/* Use it for non-touch hover action */
.owl-theme .owl-controls.clickable .owl-buttons div:hover{
filter: Alpha(Opacity=100);/*IE7 fix*/
opacity: 1;
text-decoration: none;
}
/* Styling Pagination*/
.owl-theme .owl-controls .owl-page{
display: inline-block;
zoom: 1;
*display: inline;/*IE7 life-saver */
}
.owl-theme .owl-controls .owl-page span{
display: block;
width: 12px;
height: 12px;
margin: 5px 7px;
filter: Alpha(Opacity=50);/*IE7 fix*/
opacity: 0.5;
-webkit-border-radius: 20px;
-moz-border-radius: 20px;
border-radius: 20px;
background: #FF5A5F;
}
.owl-theme .owl-controls .owl-page.active span,
.owl-theme .owl-controls.clickable .owl-page:hover span{
filter: Alpha(Opacity=100);/*IE7 fix*/
opacity: 1;
}
/* If PaginationNumbers is true */
.owl-theme .owl-controls .owl-page span.owl-numbers{
height: auto;
width: auto;
color: #FFF;
padding: 2px 10px;
font-size: 12px;
-webkit-border-radius: 30px;
-moz-border-radius: 30px;
border-radius: 30px;
}
.screenshot-slider .item{
margin: 3px;
}
.screenshot-slider .item img{
display: block;
width: 100%;
height: auto;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

@@ -0,0 +1,31 @@
<svg xmlns="http://www.w3.org/2000/svg" width="207.525" height="43.208" viewBox="0 0 207.525 43.208">
<g id="Logo" transform="translate(-63.142 -208.083)">
<g id="Groupe_7907" data-name="Groupe 7907" transform="translate(63.142 217.603)" style="isolation: isolate">
<g id="Groupe_7904" data-name="Groupe 7904" transform="translate(0 1.508)" style="isolation: isolate">
<path id="Tracé_369" data-name="Tracé 369" d="M65.046,260.631v-7.353h-.529a1.375,1.375,0,0,1,0-2.751h.529v-2.38a1.6,1.6,0,0,1,3.2,0v2.38h2.513a1.376,1.376,0,1,1,0,2.751H68.247v6.85a1.524,1.524,0,0,0,1.719,1.746,7.557,7.557,0,0,0,.793-.079,1.349,1.349,0,0,1,1.349,1.323,1.377,1.377,0,0,1-.846,1.243,6.365,6.365,0,0,1-2.2.37C66.713,264.73,65.046,263.7,65.046,260.631Z" transform="translate(-63.142 -246.56)" fill="#fff"/>
</g>
<g id="Groupe_7905" data-name="Groupe 7905" transform="translate(11.73 5.29)" style="isolation: isolate">
<path id="Tracé_370" data-name="Tracé 370" d="M104.07,269.887v-.053c0-3.015,2.354-4.5,5.766-4.5a11.663,11.663,0,0,1,3.756.582v-.344c0-1.983-1.217-3.041-3.465-3.041a8.3,8.3,0,0,0-3.095.555,1.792,1.792,0,0,1-.5.08,1.332,1.332,0,0,1-1.349-1.322,1.4,1.4,0,0,1,.873-1.27,11.967,11.967,0,0,1,4.5-.82,6.258,6.258,0,0,1,4.629,1.56,5.8,5.8,0,0,1,1.507,4.311V272.5a1.524,1.524,0,0,1-1.561,1.534,1.446,1.446,0,0,1-1.56-1.349v-.529a5.676,5.676,0,0,1-4.549,2.036C106.4,274.2,104.07,272.69,104.07,269.887Zm9.575-1.005v-.952a8.875,8.875,0,0,0-3.174-.555c-2.063,0-3.28.873-3.28,2.327v.053c0,1.349,1.19,2.116,2.724,2.116C112.031,271.87,113.645,270.654,113.645,268.882Z" transform="translate(-104.07 -259.757)" fill="#fff"/>
</g>
<g id="Groupe_7906" data-name="Groupe 7906" transform="translate(28.512)" style="isolation: isolate">
<path id="Tracé_371" data-name="Tracé 371" d="M162.626,242.886a1.575,1.575,0,0,1,1.587-1.587,1.6,1.6,0,0,1,1.613,1.587v16.4a1.6,1.6,0,0,1-3.2,0Z" transform="translate(-162.626 -241.299)" fill="#fff"/>
<path id="Tracé_372" data-name="Tracé 372" d="M192.864,273.96a6.968,6.968,0,0,1-7.168-7.247v-.053c0-3.994,2.83-7.273,6.824-7.273a6.606,6.606,0,0,1,6.638,6.877,1.5,1.5,0,0,1-1.507,1.534H188.9a3.9,3.9,0,0,0,4.02,3.544,5.019,5.019,0,0,0,3.306-1.217,1.192,1.192,0,0,1,.82-.291,1.259,1.259,0,0,1,1.269,1.3,1.4,1.4,0,0,1-.423.979A7.171,7.171,0,0,1,192.864,273.96Zm3.174-8.279c-.212-2.063-1.428-3.676-3.544-3.676-1.957,0-3.333,1.507-3.624,3.676Z" transform="translate(-179.084 -254.203)" fill="#fff"/>
<path id="Tracé_373" data-name="Tracé 373" d="M244.11,261.133a1.581,1.581,0,0,1,1.587-1.613,1.6,1.6,0,0,1,1.614,1.613v.688a5.062,5.062,0,0,1,4.364-2.434c3.147,0,4.972,2.116,4.972,5.343v7.458a1.559,1.559,0,0,1-1.587,1.587,1.581,1.581,0,0,1-1.613-1.587v-6.48c0-2.169-1.084-3.412-2.989-3.412-1.851,0-3.147,1.3-3.147,3.465v6.427a1.6,1.6,0,0,1-3.2,0Z" transform="translate(-220.757 -254.203)" fill="#fff"/>
<path id="Tracé_374" data-name="Tracé 374" d="M298.892,260.631v-7.353h-.529a1.375,1.375,0,0,1,0-2.751h.529v-2.38a1.6,1.6,0,0,1,3.2,0v2.38h2.513a1.376,1.376,0,1,1,0,2.751h-2.513v6.85a1.524,1.524,0,0,0,1.719,1.746,7.566,7.566,0,0,0,.794-.079,1.349,1.349,0,0,1,1.349,1.323,1.377,1.377,0,0,1-.846,1.243,6.362,6.362,0,0,1-2.2.37C300.558,264.73,298.892,263.7,298.892,260.631Z" transform="translate(-258.48 -245.052)" fill="#fff"/>
<path id="Tracé_375" data-name="Tracé 375" d="M335.893,272.373a1.226,1.226,0,0,1-.608-1.111,1.281,1.281,0,0,1,1.3-1.3,1.4,1.4,0,0,1,.688.185,7.372,7.372,0,0,0,4.02,1.349c1.375,0,2.169-.582,2.169-1.508v-.053c0-1.084-1.481-1.454-3.121-1.957-2.063-.582-4.364-1.428-4.364-4.1v-.053c0-2.645,2.2-4.258,4.972-4.258a9.6,9.6,0,0,1,4.39,1.137,1.356,1.356,0,0,1,.767,1.217,1.287,1.287,0,0,1-1.322,1.3,1.256,1.256,0,0,1-.635-.159,7.615,7.615,0,0,0-3.28-.952c-1.243,0-1.957.582-1.957,1.375v.053c0,1.031,1.508,1.455,3.147,1.984,2.037.634,4.337,1.56,4.337,4.073v.053c0,2.936-2.274,4.39-5.184,4.39A9.544,9.544,0,0,1,335.893,272.373Z" transform="translate(-285.802 -254.335)" fill="#fff"/>
<path id="Tracé_376" data-name="Tracé 376" d="M410.736,260.631v-7.353h-.529a1.375,1.375,0,1,1,0-2.751h.529v-2.38a1.6,1.6,0,0,1,3.2,0v2.38h2.513a1.376,1.376,0,1,1,0,2.751h-2.513v6.85a1.524,1.524,0,0,0,1.719,1.746,7.578,7.578,0,0,0,.794-.079,1.349,1.349,0,0,1,1.349,1.323,1.377,1.377,0,0,1-.846,1.243,6.364,6.364,0,0,1-2.2.37C412.4,264.73,410.736,263.7,410.736,260.631Z" transform="translate(-338.27 -245.052)" fill="#fff"/>
<path id="Tracé_377" data-name="Tracé 377" d="M463.107,272.518a1.613,1.613,0,0,1-3.227,0V271.8a5.026,5.026,0,0,1-4.364,2.46c-3.147,0-4.972-2.116-4.972-5.369v-7.432a1.6,1.6,0,1,1,3.2,0v6.48c0,2.169,1.085,3.385,2.989,3.385,1.851,0,3.147-1.27,3.147-3.438v-6.427a1.6,1.6,0,0,1,1.613-1.613,1.62,1.62,0,0,1,1.613,1.613Z" transform="translate(-368.028 -254.533)" fill="#fff"/>
<path id="Tracé_378" data-name="Tracé 378" d="M508.312,242.886A1.559,1.559,0,0,1,509.9,241.3a1.581,1.581,0,0,1,1.613,1.587V249.1a5.59,5.59,0,0,1,4.761-2.619c3.28,0,6.48,2.592,6.48,7.247v.053c0,4.628-3.174,7.247-6.48,7.247a5.7,5.7,0,0,1-4.761-2.46v.714a1.6,1.6,0,0,1-3.2,0Zm11.188,10.9v-.053c0-2.7-1.825-4.47-3.994-4.47a4.211,4.211,0,0,0-4.073,4.47v.053a4.211,4.211,0,0,0,4.073,4.47C517.7,258.253,519.5,256.534,519.5,253.783Z" transform="translate(-409.24 -241.299)" fill="#fff"/>
<path id="Tracé_379" data-name="Tracé 379" d="M574.724,273.96a6.968,6.968,0,0,1-7.167-7.247v-.053c0-3.994,2.83-7.273,6.824-7.273a6.606,6.606,0,0,1,6.638,6.877,1.5,1.5,0,0,1-1.508,1.534h-8.754a3.9,3.9,0,0,0,4.02,3.544,5.02,5.02,0,0,0,3.306-1.217,1.191,1.191,0,0,1,.819-.291,1.259,1.259,0,0,1,1.27,1.3,1.4,1.4,0,0,1-.423.979A7.171,7.171,0,0,1,574.724,273.96Zm3.174-8.279c-.212-2.063-1.428-3.676-3.544-3.676-1.957,0-3.333,1.507-3.623,3.676Z" transform="translate(-451.506 -254.203)" fill="#fff"/>
</g>
</g>
<g id="Groupe_7908" data-name="Groupe 7908" transform="translate(234.216 208.083)">
<circle id="Ellipse_2" data-name="Ellipse 2" cx="5.337" cy="5.337" r="5.337" transform="translate(15.103 23.449)" fill="#fff"/>
<circle id="Ellipse_3" data-name="Ellipse 3" cx="5.337" cy="5.337" r="5.337" transform="translate(15.103 9.198)" fill="#fff"/>
<circle id="Ellipse_4" data-name="Ellipse 4" cx="6.416" cy="6.416" r="6.416" transform="translate(0 15.217)" fill="#fff"/>
<circle id="Ellipse_5" data-name="Ellipse 5" cx="6.416" cy="6.416" r="6.416" fill="#fff"/>
<circle id="Ellipse_6" data-name="Ellipse 6" cx="6.416" cy="6.416" r="6.416" transform="translate(0 30.376)" fill="#fff"/>
<circle id="Ellipse_7" data-name="Ellipse 7" cx="4.429" cy="4.429" r="4.429" transform="translate(27.594 17.204)" fill="#fff"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

+6
View File
@@ -147,6 +147,12 @@ app.prepare()
app.render(req, res, actualPage, queryParams)
})
server.get('/Answer/:id', (req, res) => {
const actualPage = '/Answer'
const queryParams = { id: req.params.id }
app.render(req, res, actualPage, queryParams)
})
server.get('/Offre/:id-:rest', (req, res) => {
const actualPage = '/Offre'
const queryParams = { id: req.params.id }
+1 -1
View File
@@ -17,7 +17,7 @@ Disallow: /Cgu
Disallow: /Confidentialite
Disallow: /Candidature
Disallow: /CandidatureValidation
Disallow: /profileStep
Disallow: /profil2
# Sitemap
Sitemap: https://www.talentstube.com/sitemap_local.xml`