Compare commits
32 Commits
V2.9.2_prod
...
V2.11.2
| Author | SHA1 | Date | |
|---|---|---|---|
| 8165d99ff5 | |||
| f7421f55f4 | |||
| 6053655e1d | |||
| 2fd7836c59 | |||
| 68f8f374f4 | |||
| b1bc57b670 | |||
| 83a296fbd6 | |||
| 62f1658bbe | |||
| 7acb3b4aff | |||
| d563cc52f4 | |||
| c9ab5b0c8c | |||
| a4d366ef3e | |||
| 1197b6c144 | |||
| 9371b7a7bc | |||
| 165d888ac1 | |||
| f850cae364 | |||
| 75ae9664cf | |||
| 3c39e8da12 | |||
| d8ded1e8d7 | |||
| 3cb2bc5549 | |||
| ee98e61d97 | |||
| 99e19dfc54 | |||
| 9bc0696d8d | |||
| 580175126b | |||
| 41b89bf4b8 | |||
| f205b571bc | |||
| 57ba629402 | |||
| 6a5657f4ad | |||
| dc0c27d07b | |||
| 8deda05a55 | |||
| 3702f07f44 | |||
| 9844a43312 |
@@ -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,10 +82,16 @@ 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>
|
||||
<section className={classes.grille}>
|
||||
|
||||
<ChatCardMessage side={bubbleSide} firstname={props.message.sender.firstname} lastname={props.message.sender.lastname} picture={userPicture}
|
||||
video={
|
||||
(props.message.video)
|
||||
@@ -77,17 +100,19 @@ export default function ChatCard(props) {
|
||||
message={
|
||||
(props.message.video)
|
||||
? (<VideoVimeo classesOverride={ classes.videoVimeo } videoId={Ar.last(_.split(props.message.video.cdn_url, '/'))} />)
|
||||
: props.message.content}
|
||||
: ""}
|
||||
messageTexte = {props.message.content}
|
||||
messageSenderClass={messageSenderClass} bubbleClass={bubbleClass}/>
|
||||
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>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -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,17 +63,27 @@ 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, messageTexte, 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://recruteur.talentstube.com/uploads/img/${picture}`} className={(side==='left')? classes.first+' '+classes.avatar : classes.second +' '+classes.avatar} />
|
||||
:
|
||||
@@ -75,20 +91,30 @@ export default function ChatCardMessage(props) {
|
||||
}
|
||||
<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}
|
||||
{messageTexte}
|
||||
<br></br>
|
||||
<span className={classes.messageTexteContent}>{messageTexte== message? "" : messageTexte}</span>
|
||||
|
||||
</Typography>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -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 => ({
|
||||
|
||||
@@ -29,9 +29,9 @@ const OgHead = props => {
|
||||
<meta name="twitter:description" content={props.seo_description}/>
|
||||
<meta name="twitter:image" content={props.image}/>
|
||||
|
||||
if (urlEnv=="development") {
|
||||
// <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>
|
||||
|
||||
@@ -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> </Hidden>
|
||||
<Hidden> </Hidden>
|
||||
|
||||
<Hidden> </Hidden>
|
||||
<Hidden> </Hidden>
|
||||
|
||||
<Hidden> </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 d’en savoir plus sur vous.
|
||||
</Typography>
|
||||
|
||||
</div>
|
||||
<Fragment>
|
||||
{ loading ?
|
||||
|
||||
<LoaderVideo textePrincipal="Votre candidature vidéo est en cours d’envoi..." 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> </Hidden>
|
||||
{this.AfficherLienCv(classes)}
|
||||
<Hidden> </Hidden>
|
||||
<Hidden> </Hidden>
|
||||
<Hidden> </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));
|
||||
@@ -519,7 +519,7 @@ class AccountEtape1 extends Component {
|
||||
</span>
|
||||
);
|
||||
refreshPage() {
|
||||
window.location.replace("/profileStep");
|
||||
window.location.replace("/");
|
||||
}
|
||||
|
||||
choisirMetier = (code) =>{
|
||||
@@ -851,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}
|
||||
@@ -886,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
@@ -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))
|
||||
@@ -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 d’envoi..." texteSecondaire="Veuillez rester sur la page pendant le chargement qui peut durer plusieurs minutes."/> : <div></div> }
|
||||
|
||||
<div className={classes.root}>
|
||||
<Hidden xsUp>
|
||||
|
||||
</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>
|
||||
|
||||
</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));
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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 d’informations"]
|
||||
,
|
||||
["CONTACTED"
|
||||
, "Demande d’informations"]
|
||||
,
|
||||
["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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -220,7 +220,7 @@ function Footer(props) {
|
||||
56 000 Vannes
|
||||
</Typography>
|
||||
<Typography gutterBottom 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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 : ''} />
|
||||
|
||||
@@ -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 = () => {
|
||||
|
||||
+1
-1
@@ -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) => {
|
||||
|
||||
@@ -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.9.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/',
|
||||
|
||||
@@ -1,5 +1,30 @@
|
||||
<?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>
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 à l’entreprise "+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 l’entreprise "+nomCompany+"."
|
||||
|
||||
|
||||
],
|
||||
[
|
||||
"EMBAUCHE", "Votre candidature a été acceptée par l’entreprise "+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))
|
||||
@@ -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}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -72,8 +72,9 @@ class Player extends Component {
|
||||
const { classes, id, url, typeEntite, videoId, nameCompany, nameOffre } = this.props
|
||||
const urlEnv = process.env.NODE_ENV;
|
||||
//pour la MEP
|
||||
let nofollow = false;
|
||||
urlEnv == "development" ? nofollow = false : nofollow = false;
|
||||
{/* A ENLEVER EN PROD */}
|
||||
let nofollow = true;
|
||||
// urlEnv == "development" ? nofollow = true : nofollow = true;
|
||||
|
||||
console.log(id);
|
||||
console.log(typeEntite);
|
||||
|
||||
@@ -340,13 +340,13 @@ 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 && (
|
||||
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ class MyDocument extends Document {
|
||||
<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 async src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDYV8IJGtIoWLfXJQQvIuDQ88n2aEuRgpg&libraries=places"></script>
|
||||
<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
|
||||
|
||||
@@ -443,7 +443,7 @@ class Index extends React.Component {
|
||||
]}
|
||||
/>
|
||||
<div className={classes.wrap}>
|
||||
|
||||
{/* PARTIE DESKTOP */}
|
||||
<Hidden smDown>
|
||||
<header className={classes.headerTitre}>
|
||||
<h1 className={classes.titreAccueil}>La rencontre d’offres d’emploi et de candidatures en vidéo</h1>
|
||||
@@ -523,9 +523,6 @@ class Index extends React.Component {
|
||||
</Hidden>
|
||||
</div>
|
||||
<div className={classes.container}>
|
||||
|
||||
{/* <VideoSlider /> */}
|
||||
|
||||
<section className={classes.scrollerSection + ' ' + classes.scrollerSectionOffer}>
|
||||
<div
|
||||
className={classes.HorizontalScrollerOffre}
|
||||
@@ -643,7 +640,7 @@ class Index extends React.Component {
|
||||
|
||||
</section>
|
||||
<section className={classes.scrollerSection + ' ' + classes.scrollerSectionSlider}>
|
||||
{/* PARTIE DEsktop */}
|
||||
{/* PARTIE Desktop Slider des logos d'entreprises*/}
|
||||
<Hidden smDown>
|
||||
<Slider ref={slider => (this.slider = slider)} {...settings}>
|
||||
<a href="/Entreprise/21247-lactalis-logistique-et-transports">
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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 }
|
||||
|
||||
@@ -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`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user