Compare commits

...

81 Commits

Author SHA1 Message Date
llaniau f205b571bc pb parametrage livraison 2021-05-12 17:20:11 +02:00
llaniau 57ba629402 Bug244, 245, 247, 249 2021-05-10 10:04:08 +02:00
llaniau 6a5657f4ad ancres 2021-05-03 23:03:49 +02:00
llaniau dc0c27d07b faute d'orthographe sur a traiter 2021-05-03 22:06:08 +02:00
llaniau 8deda05a55 US 549/550 2021-05-03 16:45:07 +02:00
llaniau 3702f07f44 US550 : page profil 2021-05-03 13:25:59 +02:00
llaniau 9844a43312 Init V2.10.1 2021-04-26 11:29:46 +02:00
llaniau 9a73c59197 sitemap 2021-04-26 09:01:27 +02:00
llaniau 46950b15d7 Activation referencement 2021-04-19 14:01:37 +02:00
llaniau 48e4108270 sitemap 2021-04-19 10:11:38 +02:00
llaniau 0c70c93d99 MEP V2.9.2 2021-04-19 10:02:44 +02:00
llaniau bae6713dac Bug 239 2021-04-12 20:16:15 +02:00
llaniau 4dc3e224fc Api pole emploi, reglage corentin 2021-04-08 13:02:47 +02:00
llaniau 48a9ca5fe9 US 487 : Api pole emploi app 2021-03-31 19:23:45 +02:00
llaniau 60f8f4e71e Init V2.9.1 pre prod 2021-03-30 15:31:33 +02:00
llaniau b4b2bcd95e Desactiver nofollow 2021-03-30 09:52:17 +02:00
llaniau 5706decd1e MEP V2.8.3 2021-03-29 15:38:27 +02:00
llaniau 47acace2e7 Correctif suite a recette V2.8.2 2021-03-29 14:32:19 +02:00
llaniau 933333b786 V2.8.2 2021-03-25 14:35:16 +01:00
llaniau daf65d5a47 Automatisation referenecement MEP 2021-03-25 10:06:28 +01:00
llaniau 9f1f092259 page accueil webapp 2021-03-23 18:20:23 +01:00
llaniau d47a393eb6 retour recette V2.8.1 2021-03-22 18:29:03 +01:00
llaniau 5421091175 modif de _document.js 2021-03-22 09:58:59 +01:00
llaniau 81bd79ecac Bug push 2021-03-19 10:50:55 +01:00
llaniau 996c2c5728 Message texte ET video 2021-03-16 22:27:03 +01:00
llaniau 605b43a866 MEP V2.7.5 2021-03-10 11:32:45 +01:00
llaniau 3e5d9f2555 V2.7.5 2021-03-10 10:29:45 +01:00
llaniau e8bb1374d9 Reglage page d'accueil 2021-03-10 10:04:38 +01:00
llaniau 8be4c6d08c Image page accueil 2021-03-09 12:30:53 +01:00
llaniau b519451a0c page accueil 2021-03-09 12:25:46 +01:00
llaniau 04d03aa736 page accueil web app 2021-03-08 19:43:14 +01:00
llaniau c71fe2b452 Inscription tel 2021-02-24 15:41:44 +01:00
llaniau ee45ef810b Correction de bugs 2021-02-24 14:01:30 +01:00
llaniau 63bd801281 retour de recette et page accueil 2021-02-22 18:01:33 +01:00
llaniau ddb1abbe70 sitemap 2021-02-18 14:00:35 +01:00
llaniau e7b9298a3b Param pre prod 2021-02-16 17:18:58 +01:00
llaniau ea69a5f308 Nouvelle page accueil redirect 2021-02-16 17:14:19 +01:00
llaniau 8fe612824b referencement , fonts 2021-02-15 18:17:04 +01:00
llaniau e02f90634b sitemap 2021-02-11 14:10:41 +01:00
llaniau c9284e800a sous titre 2021-02-11 10:24:49 +01:00
llaniau 3e26ba8bca MEP V2.6.2 2021-02-10 16:28:54 +01:00
llaniau f53743a03e Version V2.6.2 2021-02-10 15:15:21 +01:00
llaniau d90682c710 Referencement player 2021-02-10 15:03:31 +01:00
llaniau 5456dfd4c4 Optimisation referencement + geoloc 2021-02-08 09:14:31 +01:00
llaniau df81b18194 async defer 2021-02-02 08:37:21 +01:00
llaniau ed9bfff65d Optimisation referencement (typo, et async) 2021-02-02 08:37:05 +01:00
llaniau 39d29567ce Optimisation referencement 2021-02-01 22:38:27 +01:00
llaniau 10897f633d siteMap optimisé 2021-01-24 20:01:23 +01:00
llaniau 41916bc451 sitempa et robots.txt 2021-01-24 12:40:38 +01:00
llaniau 06e6b615b1 MEP V2.5.4 2021-01-21 14:46:23 +01:00
llaniau ce95cb2d66 Ne pas afficher champ geoloc 2021-01-21 13:44:28 +01:00
llaniau fe1747ea90 version V2.5.4 2021-01-20 18:17:32 +01:00
llaniau f6edb107b2 retour recette Corentin 2021-01-20 18:15:39 +01:00
llaniau 28ae59b7e4 lmodif taille image mini 2021-01-20 11:30:14 +01:00
llaniau 65b6a9b9dc Reglage partage facebook 2021-01-20 11:24:46 +01:00
llaniau d0ce6516dc Og head partage image 2021-01-20 11:03:58 +01:00
llaniau 12c3b2e1cd version 2.5.2 2021-01-20 10:21:41 +01:00
llaniau 3fc5bc6424 non referencement test4 2021-01-19 19:39:17 +01:00
llaniau f0fe21a14e Layoutback 2021-01-19 16:28:38 +01:00
llaniau 9c19993bcc Bug Og suite retour pre prod 2021-01-19 15:59:19 +01:00
llaniau 00fdb164af bug og entreprise 2021-01-18 17:33:14 +01:00
llaniau 6e6ac8e440 Correction OgHead 2021-01-18 17:25:43 +01:00
llaniau 8259112aac Bug og suite 2021-01-18 16:10:26 +01:00
llaniau b0f66eb9fd Changement _document.js pour mettre un og par def 2021-01-18 11:12:49 +01:00
llaniau c08f3db680 bug og suite 2021-01-18 10:33:33 +01:00
llaniau de1a56285d Bug og suite 2021-01-18 10:30:23 +01:00
llaniau 1e78256886 Bug Og 2021-01-18 10:20:08 +01:00
llaniau 37c54c4dd0 Pb og facebook sur image 2021-01-18 10:15:07 +01:00
llaniau 21c61e6128 OgHead en haut 2021-01-18 10:03:11 +01:00
llaniau 32e3826c27 facebook id pour poartage og 2021-01-18 09:58:56 +01:00
llaniau 9d647525b3 Mise en place dev@talentstube.com 2021-01-18 09:43:57 +01:00
llaniau ed19b99bba US482.488 Permettre aux d'envoyer plusieurs videos 2021-01-14 17:02:31 +01:00
llaniau 9c38c8c03d Mise en place de stats 2021-01-13 17:28:54 +01:00
llaniau f200235ced LayoutBack avec popup 2021-01-12 18:50:33 +01:00
llaniau 92a93452bb US451 : Chgt mise en page sticky 2021-01-11 15:56:43 +01:00
llaniau 5626e2d592 US451 : refonte page entreprise 2021-01-06 17:25:30 +01:00
llaniau a52c855ec2 Init V2.5.1 2021-01-06 13:39:42 +01:00
llaniau 16e5218f16 MEP V2.5.0 2021-01-05 17:52:08 +01:00
llaniau 68e5abb088 Bug sur le cv papier 2021-01-05 13:37:09 +01:00
llaniau b52f05002b Bug cv papier 2021-01-04 18:13:23 +01:00
llaniau e1bb5de959 Bug reducer Media mediaCv 2021-01-04 17:56:23 +01:00
102 changed files with 6928 additions and 1310 deletions
+1 -17
View File
@@ -5,9 +5,6 @@ import {
UPLOAD_MEDIA_PRES_REQUEST,
UPLOAD_MEDIA_PRES_FAILURE,
UPLOAD_MEDIA_PRES_SUCCESS,
UPLOAD_MEDIA_CV_REQUEST,
UPLOAD_MEDIA_CV_FAILURE,
UPLOAD_MEDIA_CV_SUCCESS,
} from "../types";
@@ -41,19 +38,6 @@ import {
res
});
export const uploadMediaCv = payload => ({
type: UPLOAD_MEDIA_CV_REQUEST,
payload
});
export const uploadMediaCvFailure = errors => ({
type: UPLOAD_MEDIA_CV_FAILURE,
errors
});
export const uploadMediaCvSuccess = res => ({
type: UPLOAD_MEDIA_CV_SUCCESS,
res
});
+25
View File
@@ -0,0 +1,25 @@
import {
UPLOAD_MEDIA_CV_REQUEST,
UPLOAD_MEDIA_CV_FAILURE,
UPLOAD_MEDIA_CV_SUCCESS,
} from "../types";
export const uploadMediaCv = payload => ({
type: UPLOAD_MEDIA_CV_REQUEST,
payload
});
export const uploadMediaCvFailure = errors => ({
type: UPLOAD_MEDIA_CV_FAILURE,
errors
});
export const uploadMediaCvSuccess = res => ({
type: UPLOAD_MEDIA_CV_SUCCESS,
res
});
+11 -1
View File
@@ -69,7 +69,17 @@ export default function ChatCard(props) {
return (
<Fragment>
<ChatCardMessage side={bubbleSide} firstname={props.message.sender.firstname} lastname={props.message.sender.lastname} picture={userPicture} video={(props.message.video) ? true : false} message={(props.message.video) ? (<VideoVimeo classesOverride={ classes.videoVimeo } videoId={Ar.last(_.split(props.message.video.cdn_url, '/'))} />) : props.message.content} messageSenderClass={messageSenderClass} bubbleClass={bubbleClass}/>
<ChatCardMessage side={bubbleSide} firstname={props.message.sender.firstname} lastname={props.message.sender.lastname} picture={userPicture}
video={
(props.message.video)
? true :
false}
message={
(props.message.video)
? (<VideoVimeo classesOverride={ classes.videoVimeo } videoId={Ar.last(_.split(props.message.video.cdn_url, '/'))} />)
: props.message.content}
messageTexte = {props.message.content}
messageSenderClass={messageSenderClass} bubbleClass={bubbleClass}/>
<Typography
className={classes.messageDate}
+3 -2
View File
@@ -61,7 +61,7 @@ const useStyles = makeStyles(theme => ({
}));
export default function ChatCardMessage(props) {
const { side, firstname, lastname, picture, message, video, messageSenderClass, bubbleClass } = props;
const { side, firstname, lastname, picture, message, messageTexte, video, messageSenderClass, bubbleClass } = props;
const classes = useStyles();
const userBubble = (video) ? classes.userBubble +' '+ classes.userBubbleVideo : classes.userBubble
@@ -69,7 +69,7 @@ export default function ChatCardMessage(props) {
<section className={(side==='left')? classes.userMessageLeft : classes.userMessageRight }>
{picture ?
<img alt="talents-tube" src={`http://localhost/uploads/img/${picture}`} className={(side==='left')? classes.first+' '+classes.avatar : classes.second +' '+classes.avatar} />
<img alt="talents-tube" src={`http://recruteur.talentstube.com/uploads/img/${picture}`} className={(side==='left')? classes.first+' '+classes.avatar : classes.second +' '+classes.avatar} />
:
<img alt="talents-tube" src='/static/images/default/account-avatar-default.svg' className={(side==='left')? classes.first +' '+ classes.avatar : classes.second+' '+classes.avatar } />
}
@@ -84,6 +84,7 @@ export default function ChatCardMessage(props) {
className={classes.messageContent}
>
{message}
{messageTexte}
</Typography>
</div>
</div>
+4
View File
@@ -10,6 +10,8 @@ import Business from '@material-ui/icons/Business';
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,
@@ -19,6 +21,8 @@ const variantIcon = {
business: Business,
watch_later: WatchLater,
home: Home,
people: People,
place: Place,
};
const styles = theme => ({
@@ -7,8 +7,10 @@ import LocationOnIcon from '@material-ui/icons/LocationOn';
import HomeOnIcon from '@material-ui/icons/Home';
import WatchLater from '@material-ui/icons/WatchLater';
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,
@@ -18,6 +20,8 @@ const variantIcon = {
watch_later: WatchLater,
business_center: BusinessCenterIcon,
business: Business,
people: People,
place: Place,
};
const styles = theme => ({
+1 -1
View File
@@ -8,7 +8,7 @@ const styles = theme => ({
padding: theme.spacing(0, 4),
},
text: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1,2em',
fontWeight: '500',
color: theme.palette.primary.main,
+12 -4
View File
@@ -1,17 +1,19 @@
import React from 'react'
import PropTypes from 'prop-types'
import Head from 'next/head'
const urlEnv = process.env.NODE_ENV;
const OgHead = props => {
return (
<Head>
<title key="title">{props.seo_title}</title>
<meta name="robots" content="noindex, nofollow"></meta>
<meta name="description" kenoindexy="description" content={props.seo_description} />
<meta name="keywords" content={props.seo_key}/>
<meta key="og:url" property="og:url" content={props.seo_url} />
<meta key="og:type" property="og:type" content="article" />
<meta key="og:title" property="og:title" content={props.seo_title} />
<meta property="fb:app_id" content="1800752833559014" data-react-helmet="true"></meta>
<meta
key="og:description"
property="og:description"
@@ -19,16 +21,22 @@ const OgHead = props => {
/>
<meta name="keywords" content={props.seo_key}/>
<meta key="og:image" property="og:image" content={props.image} />
<meta key="og:image:width" property="og:image:width" content="355" />
<meta key="og:image:height" property="og:image:height" content="200" />
<meta name="twitter:card" content="summary"/>
<meta name="twitter:site" content="@TalentsTube"/>
<meta name="twitter:title" content={props.seo_title}/>
<meta name="twitter:description" content={props.seo_description}/>
<meta name="twitter:image" content={props.image}/>
{/* A ENLEVER EN PROD */}
<meta name="robots" content="noindex, nofollow"></meta>
{/* <meta httpEquiv='cache-control' content='no-store,no-cache'></meta>
<meta httpEquiv='expires' content='0'></meta>
<meta httpEquiv='pragma' content='no-cache'></meta> */}
{/* <link rel="canonical" href={ props.seo_url} /> */}
<link rel="canonical" href={ props.seo_url} />
</Head>
)
+1 -1
View File
@@ -72,7 +72,7 @@ export default function VideoVimeo(props) {
<section className={className +' '+classesOverride}>
<iframe className='player'
src={"https://player.vimeo.com/video/"+ videoId + options+"?autoplay="+autoplay}
src={"https://player.vimeo.com/video/"+ videoId + options+"?texttrack=fr&autoplay="+autoplay}
frameBorder="0"
title={title}
webkitallowfullscreen="true" mozallowfullscreen="true" allowFullScreen></iframe>
+2 -2
View File
@@ -24,8 +24,8 @@ const theme = createMuiTheme({
},
offerlistitem: {
title: '#1E2327',
icon: '#BBBCBD',
text: '#787B7D',
icon: '#1E2327',
text: '#1E2327',
},
answer: {
main: '#E8E8E8',
File diff suppressed because it is too large Load Diff
+178 -114
View File
@@ -20,6 +20,7 @@ import ReactHtmlParser, { processNodes, convertNodeToElement, htmlparser2 } from
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: {
@@ -58,8 +59,8 @@ const styles = theme => ({
height: "100%"
},
conseilButton: {
color: "#ffffff",
backgroundColor: "#25D89A",
color: "#1e2327",
backgroundColor: "#fff",
padding: theme.spacing(3, 2),
margin: theme.spacing(1),
width: "100%",
@@ -67,11 +68,12 @@ const styles = theme => ({
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: "#ffffff",
backgroundColor: "#25D89A",
color: "#1e2327",
backgroundColor: "#fff",
}
},
captureButton: {
width:"100%",
color: theme.palette.secondary.main,
backgroundColor: theme.palette.primary.main,
padding: theme.spacing(5, 2),
@@ -82,8 +84,8 @@ const styles = theme => ({
},
},
importButton: {
color: theme.palette.primary.main,
backgroundColor: theme.palette.secondary.main,
color: "#1e2327",
backgroundColor: "#fff",
padding: theme.spacing(3, 2),
margin: theme.spacing(1),
width: "100%",
@@ -91,8 +93,8 @@ const styles = theme => ({
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: theme.palette.primary.main,
backgroundColor: theme.palette.secondary.main,
color: "#1e2327",
backgroundColor: "#fff",
}
},
InputKeyboardArrowDownIconBlank: {
@@ -102,12 +104,21 @@ const styles = theme => ({
},
InputKeyboardArrowDownIcon: {
fontSize: '2.5em',
color: "#1689FB",
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 ('../organisms/Recorder'), {ssr: false})
class Etape2 extends React.Component {
@@ -117,7 +128,8 @@ class Etape2 extends React.Component {
data: {},
openSnack: false,
errors: {},
success : {}
success : {},
openStudio : false
};
@@ -146,9 +158,9 @@ class Etape2 extends React.Component {
video: nextProps.video
})
//window.location.reload(false);
if (nextProps.media.status === 'success') {
if (nextProps.media.statusPres === 'success') {
const success = {};
success.message ="Vidéo mise à jour";
success.message ="Profil mise à jour.";
this.setState({ success });
this.setActiveStep(1);
}
@@ -158,7 +170,7 @@ class Etape2 extends React.Component {
this.setState({activeStep: step})
}
inputFilesystemChange = (e) => {
inputFilesystemChangePres = (e) => {
this.uploadMediaPres(e)
}
@@ -168,7 +180,7 @@ class Etape2 extends React.Component {
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 })
@@ -196,6 +208,16 @@ class Etape2 extends React.Component {
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;
@@ -206,126 +228,168 @@ class Etape2 extends React.Component {
} else {
video = "";
}
if (typeof global.navigator === 'undefined') global.navigator = {};
if (typeof global.maps === 'undefined') global.maps = {};
return (
<section className={classes.container}>
<Fragment>
{this.AfficherSuccess()}
{ loading ? <LoaderVideo/> : <div></div> }
<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">
<div className={classes.root}>
<Hidden xsUp>
&nbsp;
</Hidden>
<Container maxWidth="md">
<Typography
align="center"
gutterBottom
variant="headline"
variant="h6"
component="h2"
className={classes.h6}>
<Movie className={classes.menuIcon}></Movie> Vidéo de présentation
</Typography>
<Typography
align="center">Donnez envie au recruteur de vous rencontrer grâce à la vidéo !</Typography>
</div>
<Fragment>
{this.AfficherSuccess()}
{ loading ? <LoaderVideo textePrincipal="Votre vidéo est en cours denvoi..." texteSecondaire="Veuillez rester sur la page pendant le chargement qui peut durer plusieurs minutes."/> : <div></div> }
<Grid container
justify="center"
alignItems="center"
spacing={2}
className={classes.buttons}>
<Grid item xs={12} sm={12} md={12} lg={6} lg={6}>
{ /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>
):
(
<div className={classes.recorderContainer}>
<Recorder uploader={this.props.uploadMediaPres} titreBouton="Remplacer ma vidéo"/>
<div className={classes.root}>
<Hidden xsUp>
&nbsp;
</Hidden>
<Container maxWidth="md">
<Grid container
justify="center"
alignItems="center"
spacing={2}
className={classes.buttons}>
<Grid item xs={12} sm={12} md={12} lg={12} xl={12}>
</div>
)
}
</Grid>
<Grid item xs={12} sm={12} md={12} lg={6} xl={6}>
<div>
<label htmlFor="import-conseil">
<Button
component="span"
className={classes.conseilButton}
classes={{
root: classes.rootButton}}
onClick={() => Router.push(`/Conseils`)}>
<img
alt="talents-tube"
src='/statique/images/conseils-talentstube.svg'
className={classes.iconButton}/>
<Typography align="left" className={classes.textButton}>
<span className={classes.underlined}>Comment</span> créer ma vidéo
</Typography>
<KeyboardArrowDownIcon className={classes.InputKeyboardArrowDownIconBlank}/>
</Button>
</label>
</div>
<div>
{ /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ?
(
<Fragment >
<input
type="file"
accept="video/*"
className={classes.input + ' cypButtonImportVid'}
style={{display: 'none'}}
id="import-button-file"
onChange={this.inputFilesystemChange}/>
<label htmlFor="import-button-file">
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}}>
root: classes.rootButton}}
onClick={() => Router.push(`/Conseils`)}>
<img
alt="talents-tube"
src='/statique/images/Import.svg'
src='/statique/images/comment-faire-une-video-reponse.svg'
className={classes.iconButton}/>
<Typography align="left" className={classes.textButton}>
J'<span className={classes.underlined}>importe</span> ma vidéo de présentation
<span className={classes.underlined}>Comment</span> créer ma vidéo de présentation
</Typography>
<KeyboardArrowDownIcon className={classes.InputKeyboardArrowDownIcon}/>
</Button>
</label>
</div>
</Grid>
<Hidden xsUp>
&nbsp;
</Hidden>
</Grid>
<Hidden xsUp>
&nbsp;
</Hidden>
<Grid item xs={12} sm={12} md={12} lg={12} xl={12}>
<div className={classes.videoPresentation}>
{video}
</div>
<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}>
</Grid>
</Container>
</div>
{/* <div className={classes.textContainer}>
</div> */}
</Fragment>
</section>
</div> */}
</Fragment>
</Grid>
</Grid>
);
}
+145 -72
View File
@@ -2,7 +2,7 @@ import React, { Fragment } from 'react';
import { connect } from "react-redux";
import { fetchCurrentUserRequest } from '../../actions/user'
import { fetchCompanyRequest } from '../../actions/companies'
import { uploadMediaCv } from '../../actions/media'
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';
@@ -17,8 +17,9 @@ 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',
@@ -40,21 +41,61 @@ const styles = theme => ({
},
InputKeyboardArrowDownIcon: {
fontSize: '2.5em',
color: theme.palette.primary.main,
color: theme.palette.primary.dark,
},
importButton: {
color: theme.palette.primary.main,
backgroundColor: theme.palette.secondary.main,
color: "#1e2327",
backgroundColor: "#fff",
padding: theme.spacing(3, 2),
margin: theme.spacing(1),
width: "370px",
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: theme.palette.primary.main,
backgroundColor: theme.palette.secondary.main,
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"
}
});
@@ -90,12 +131,12 @@ class Etape3 extends React.Component {
openSnack: !!!_.isEmpty(nextProps.errors),
errors: !!!nextProps.errors ? { errors: { message: "" } } : nextProps.errors,
})
this.state.cvLink = nextProps.cvLink;
if (nextProps.loading) {
if (nextProps.mediaCv.statusCv === 'success') {
const success = {};
success.message ="CV mis à jour";
success.message ="Profil mis à jour";
console.log("CV mis à jour!!!")
if(this.state.cvLink) console.log(this.state.cvLink)
if(nextProps.mediaCv) console.log(nextProps.mediaCv.message)
this.setState({ success });
}
@@ -103,7 +144,7 @@ class Etape3 extends React.Component {
}
inputFilesystemChange = (e) => {
inputFilesystemChangeCv = (e) => {
this.uploadMediaCv(e)
}
@@ -112,7 +153,7 @@ class Etape3 extends React.Component {
const data = new FormData()
data.append('upload', file)
console.log ("envoi de cv")
this.props.uploadMediaCv(data)
}
@@ -122,6 +163,7 @@ class Etape3 extends React.Component {
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)}
@@ -132,7 +174,7 @@ class Etape3 extends React.Component {
return "";
}
AfficherLienCv() {
AfficherLienCv(classes) {
console.log("afficher lien");
if (this.state.cvLink !="") {
@@ -144,39 +186,26 @@ class Etape3 extends React.Component {
<Hidden>&nbsp;</Hidden>
<Hidden>&nbsp;</Hidden>
<Card variant="" style={{
width:370+"px",
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)',
marginLeft : '10px',
marginTop:'10px'
}}>
<Hidden>&nbsp;</Hidden>
<CardActions>
<Button size="small">MON CV</Button>
</CardActions>
<CardContent>
<div className={classes.centered} >
<Typography >
<a href={publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.postedContentCv + this.state.cvLink}
target="_blank"
style={{
color:'#1689FB',
'&:hover': {
color: '#1689FB',
},
fontWeight: '700',
fontSize: '1em',
}}
target="_blank" className={classes.lien}
>
Visualiser mon CV
<Button
variant="contained"
className={classes.button + ' ' + classes.boutonMobile}
>Visualiser mon CV
</Button>
</a>
<br />
{/* <a href="https://www.permatheque.fr/PDF/mansobufukuoka-larevolutiondunseulbrindepaille.pdf" target="_blank">lien</a> */}
</Typography>
</CardContent>
</Card>
</div>
</Fragment>
);
@@ -189,36 +218,79 @@ class Etape3 extends React.Component {
const { classes, company } = this.props;
const { loading } = this.state;
return (
<Fragment>
{ loading ?
<LoaderVideo /> :
<Fragment>
{this.AfficherSuccess()}
<Grid
container
direction="row"
alignItems="flex-start"
className={classes.grille}
justify="center"
alignItems="center">
<Grid item lg={12} md={12} xl={12} xs={12} className={classes.grilleGauche}>
<div id="cv">
<Typography
align="center"
gutterBottom
variant="headline"
variant="h6"
component="h2"
className={classes.h6}>
<Description className={classes.menuIcon}></Description> Curriculum vitae
</Typography>
<Typography
align="center">Importez votre CV pour permettre aux recruteurs den savoir plus sur vous.
.</Typography>
</div>
<Fragment>
{ loading ?
<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"
onChange={this.inputFilesystemChange}
/>
<label htmlFor="import-button-file">
<Button component="span" className={classes.importButton} classes={{ root: classes.rootButton }}>
<img alt="talents-tube" src='/statique/images/Import-cv-candidat.svg' className={classes.iconButton} />
<Typography className={classes.textButton}>
J'<span className={classes.underlined}>importe</span> mon CV
</Typography>
<KeyboardArrowDownIcon className={ classes. InputKeyboardArrowDownIcon }/>
</Button>
</label>
<Hidden>&nbsp;</Hidden>
{this.AfficherLienCv()}
</Fragment>
}
</Fragment>
<LoaderVideo textePrincipal="Votre candidature vidéo est en cours denvoi..." texteSecondaire="Veuillez rester sur la page pendant le chargement qui peut durer plusieurs minutes."/> :
<Grid
container
spacing={4}
direction="row"
alignItems="flex-start"
className={classes.grille2}
justify="center"
alignItems="center">
<Grid item xs={12} sm={12} md={12} lg={12} xl={12}>
<Fragment>
{this.AfficherSuccess()}
<input
type="file"
accept=".doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document, .pdf, .odt"
className={classes.input+' cypButtonImportVid'}
style={{ display: 'none' }}
id="import-button-file-cv"
onChange={this.inputFilesystemChangeCv}
/>
<label htmlFor="import-button-file-cv">
<Button component="span" className={classes.importButton} classes={{ root: classes.rootButton }}>
<img alt="talents-tube" src='/statique/images/Import-cv-candidat.svg' className={classes.iconButton} />
<Typography className={classes.textButton}>
J'<span className={classes.underlined}>importe</span> mon CV
</Typography>
<KeyboardArrowDownIcon className={ classes. InputKeyboardArrowDownIcon }/>
</Button>
</label>
<Hidden>&nbsp;</Hidden>
{this.AfficherLienCv(classes)}
<Hidden>&nbsp;</Hidden>
<Hidden>&nbsp;</Hidden>
<Hidden>&nbsp;</Hidden>
</Fragment>
</Grid>
</Grid>
}
</Fragment>
</Grid>
</Grid>
);
}
@@ -246,9 +318,10 @@ function mapStateToProps(state) {
// console.log(state.media.message)
return {
user: state.user ,
cvLink : state.media.message,
cvLink : state.mediaCv.message,
loading: !!state.media.loading,
cv : true,
mediaCv: state.mediaCv,
//errors: errorMessageSelector(state),
user: state.user,
company: state.company
+46 -206
View File
@@ -26,8 +26,10 @@ import BottomNavigation from '@material-ui/core/BottomNavigation';
import RefreshIcon from '@material-ui/icons/Refresh';
// import FavoriteIcon from '@material-ui/icons/Favorite'; import LocationOnIcon
// from '@material-ui/icons/LocationOn';
import Link from 'next/link'
import Box from '@material-ui/core/Box';
import Tabs from '@material-ui/core/Tabs';
import Tab from '@material-ui/core/Tab';
import {
Card,
@@ -63,7 +65,10 @@ const styles = theme => ({
width: '100%',
position: 'fixed',
bottom: 0
}
},
menu: {
backgroundColor: "#DAE8F2"
},
});
const useStyles = makeStyles(theme => ({
@@ -116,6 +121,9 @@ const useStyles = makeStyles(theme => ({
},
resetContainer: {
padding: theme.spacing(3)
},
conteneur:{
backgroundColor: "#f3f3f4",
}
}));
@@ -242,11 +250,9 @@ const AccountProfile = props => {
return skipped.has(step);
};
const handleChange = (event) => {
setState({
...state,
[event.target.name]: event.target.checked
});
const handleChange = (event, newValue) => {
};
function isStepComplete(step) {
@@ -260,210 +266,44 @@ const AccountProfile = props => {
}
return (
<Grid
container
spacing={4}
direction="row"
justify="space-between"
alignItems="flex-start">
<Grid item lg={3} md={6} xl={4} xs={12}>
<Card {...rest} className={clsx(classes.root, className)}>
<CardContent>
<div id="fb-root"></div>
<script
async
defer
crossorigin="anonymous"
src="https://connect.facebook.net/fr_FR/sdk.js#xfbml=1&version=v8.0&appId=2332071840142634&autoLogAppEvents=1"
nonce="O28M4TTm"></script>
<div className={classes.details}>
<div>
<Typography gutterBottom variant="h5">
{user.lastname}
&nbsp; {user.firstname}
<a href="#" onClick={refresh}><RefreshIcon className={classes.menuButton}/></a>
</Typography>
<Typography
className={classes.locationText}
color="textSecondary"
variant="body1">
<MailIcon className={classes.menuButton}/>
: {user.email}<br/>
<PhoneIcon className={classes.menuButton}/>
: {user.phone}<br/>
<LinkedInIcon className={classes.menuButton}/>
: {(user.linkedin && user.linkedin != '' && user.linkedin != 'null')
? <a href={user.linkedin} target="_blank">Lien sur mon linkedIn</a>
: 'Non renseigné'}<br/>
<PublicIcon className={classes.menuButton}/>
: {(user.website && user.website != '' && user.website != 'null')
? <a href={user.website} target="_blank">Lien sur mon site</a>
: 'Non renseigné'}<br/>
</Typography>
>
<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" />
</div>
{/* <Avatar
className={classes.avatar}
src={publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.postedContentUrl + logoUrl}/> */}
</div>
<div>
<Box m={3}/>
<Divider/>
<Box m={3}/>
<Typography
className={classes.locationText}
color="textSecondary"
variant="body1">
<DuoIcon className={classes.menuButton}/>
: {(user.alias && user.alias != '' && user.alias != 'null')
? <a
href={publicRuntimeConfig.cvThequeUrl + "/talent/" + user.alias}
target="_blank">Voir mon profil TalentsTube
</a>
: 'Non renseigné'}<br/>
<div
class="fb-share-button"
data-href={publicRuntimeConfig.cvThequeUrl + "/talent/" + user.alias}
data-layout="button_count"
data-size="small">
<Facebook className={classes.menuButton}/>
:
<a
target="_blank"
href={"https://www.facebook.com/sharer/sharer.php?u=" + publicRuntimeConfig.cvThequeUrl + "/talent/" + user.alias + "%2F&amp;src=sdkpreparse"}
class="fb-xfbml-parse-ignore"> Partager mon profil
</a>
</div>
</Typography>
</div>
{/* <div className={classes.progress}>
<Typography variant="body1">Etat du Profil: 70%</Typography>
<LinearProgress value={70} variant="determinate"/>
</div> */}
</CardContent>
<Box m={2}/>
<Divider/>
<Box m={2}/>
<div className={classes.information}>
<Typography className={classes.texteBlanc} align="left"></Typography>
</div>
{/* <CardActions>
<Button className={classes.uploadButton} color="primary" variant="text">
Remplacer une photo de profil
</Button>
<Button variant="text">Supprimer photo de profil</Button>
</CardActions> */}
<Box m={1}/>
<Divider/>
{/* <CardContent>
<Typography variant="body1"></Typography>
<FormControlLabel
value="end"
control={< Switch checked = {
state.checkedA
}
onChange = {
handleChange
}
name = "checkedA" color = "primary" />}
label="Je souhaite afficher mon profil sur la CV Vidéothèque Talents Tube"
labelPlacement="start"/>
</CardContent> */}
<CardActions>
<Stepper nonLinear activeStep={activeStep} orientation="vertical">
{steps.map((label, index) => {
const stepProps = {};
const buttonProps = {};
if (isStepOptional(index)) {
buttonProps.optional = <Typography variant="caption">Optional</Typography>;
}
if (isStepSkipped(index)) {
stepProps.completed = false;
}
return (
<Step key={label} className={classes.actionsContainer} {...stepProps}>
<StepButton
onClick={handleStep(index)}
completed={isStepComplete(index)}
{...buttonProps}>
{label}
</StepButton>
</Step>
);
})}
</Stepper>
</CardActions>
<Divider/>
<div>
<div>
<div>
{/* {isStepOptional(activeStep) && !completed.has(activeStep) && (
<Button
variant="contained"
color="primary"
onClick={handleSkip}
className={classes.button}
>
Skip
</Button>
)} */}
{/* {activeStep !== steps.length &&
(completed.has(activeStep) ? (
<Typography variant="caption" className={classes.completed}>
Step {activeStep + 1} already completed
</Typography>
) : (
<Button variant="contained" color="primary" onClick={handleComplete}>
{completedSteps() === totalSteps() - 1 ? 'Finish' : 'Complete Step'}
</Button>
))} */}
</div>
</div>
</div>
<Box m={2}/>
<CardContent>
<BottomNavigation className={classes.stickToBottom}>
<Button
disabled={activeStep === 0}
onClick={handleBack}
className={classes.button}>
Etape précédente
</Button>
<Button
variant="contained"
color="primary"
onClick={handleNext}
className={classes.button}>
Etape suivante
</Button>
{/* <BottomNavigationAction label="Recents" icon={< RestoreIcon />}/>
<BottomNavigationAction label="Favorites" icon={< FavoriteIcon />}/>
<BottomNavigationAction label="Nearby" icon={< LocationOnIcon />}/> */}
</BottomNavigation>
</CardContent>
</Card>
</Tabs>
</Paper>
</div>
</Grid>
<Grid item lg={3} md={3} xl={4} xs={12}>
</Grid>
<Grid item lg={9} md={6} xl={8} xs={12}>
{getStepContent(activeStep)}
<Grid item lg={6} md={6} xl={4} xs={12} >
<AccountEtape1 ></AccountEtape1>
<AccountEtape2 ></AccountEtape2>
<AccountEtape3 ></AccountEtape3>
</Grid>
<Grid item lg={3} md={3} xl={4} xs={12}>
</Grid>
</Grid>
+283 -97
View File
@@ -21,7 +21,7 @@ import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogContentText from '@material-ui/core/DialogContentText';
import DialogTitle from '@material-ui/core/DialogTitle';
import { uploadMediaCv } from '../../actions/media'
import { uploadMediaCv } from '../../actions/mediaCv'
import GetApp from '@material-ui/icons/GetApp';
// import PlacesAutocomplete from 'react-places-autocomplete';
// import {
@@ -31,6 +31,8 @@ import GetApp from '@material-ui/icons/GetApp';
// } from 'react-places-autocomplete';
// import GoogleAutoComplete from 'react-google-autocomplete-address-fields';
const styles = theme => ({
container: {
width: '100%',
@@ -126,6 +128,24 @@ const styles = theme => ({
},
player:{
width:"100px"
},
labelGeoloc:{
paddingLeft:"14px",
fontSize: "0.8rem",
color:"#1E2327",
fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
fontWeight: "400",
lineHeight: "1",
letterSpacing: "0.00938em", }
,conteneurGoogle:{
border:"1px solid rgb(200, 200, 200)",
borderRadius :"5px",
padding:"5px 0px",
},
conteneurGoogleComposant:{
paddingLeft:"14px"
}
});
@@ -157,12 +177,25 @@ class Answer extends Component {
this.onChange = this.onChange.bind(this);
}
state = {
file: null,
firstname: '',
lastname: '',
phone: '',
currentJob: '',
geoloc: '',
value:'',
route: '',
street_number: '',
locality: '',
administrative_area_level_2: '',
administrative_area_level_1: '',
country: '',
postal_code: '',
formatted_address:"",
lat:"",
lng:"",
linkedin: '',
twitter: '',
website: '',
@@ -181,13 +214,25 @@ class Answer extends Component {
UNSAFE_componentWillReceiveProps(nextProps) {
this.setState({
firstname: nextProps.user.firstname,
lastname: nextProps.user.lastname,
phone: nextProps.user.phone,
currentJob: nextProps.user.currentJob,
linkedin: nextProps.user.linkedin,
twitter: nextProps.user.twitter,
website: nextProps.user.website,
firstname: this.state.firstname,
lastname: this.state.lastname,
phone: this.state.phone,
currentJob: this.state.currentJob,
geoloc: this.state.geoloc,
value: this.state.value,
route: this.state.route,
street_number: this.state.street_number,
locality: this.state.locality,
administrative_area_level_2: this.state.administrative_area_level_2,
administrative_area_level_1: this.state.administrative_area_level_1,
country: this.state.country,
postal_code: this.state.postal_code,
formatted_address : this.state.formatted_address,
lat:this.state.lat,
lng: this.state.lng,
linkedin: this.state.linkedin,
twitter: this.state.twitter,
website: this.state.website,
mediaId: nextProps.mediaId,
mediaUrl: nextProps.mediaUrl,
thumbnails: nextProps.thumbnails,
@@ -207,13 +252,25 @@ class Answer extends Component {
}
componentDidMount() {
console.log("ANSWER !!!!!!! !!!!!! !!!!!! ");
console.log("ANSWER ! ");
console.log(this.props);
this.setState({
firstname: this.props.user.firstname,
lastname: this.props.user.lastname,
phone: this.props.user.phone,
currentJob: this.props.user.currentJob,
value: this.props.user.geoloc && this.props.user.geoloc[0].formatted_address ? this.props.user.geoloc[0].formatted_address :"",
geoloc: this.props.user.geoloc && this.props.user.geoloc[0].formatted_address ? this.props.user.geoloc[0].formatted_address :"",
route: "",
street_number: "",
locality: "",
administrative_area_level_2: "",
administrative_area_level_1: "",
country: "",
postal_code: "",
formatted_address:"",
lat:"",
lng:"",
linkedin: this.props.user.linkedin,
twitter: this.props.user.twitter,
website: this.props.user.website,
@@ -222,79 +279,80 @@ class Answer extends Component {
thumbnails : this.props.thumbnails,
heure : this.props.heure,
loading: false,
cvLink: this.props.cvLink instanceof Object ? this.props.user.cv : this.props.cvLink
cvLink: this.props.user.cv
})
console.log(this.state);
}
inputFilesystemChange = (e) => {
this.uploadMediaCv(e)
}
uploadMediaCv = (e) => {
var file = e.target.files[0]
inputFilesystemChange = (e) => {
this.uploadMediaCv(e)
}
const data = new FormData()
data.append('upload', file)
this.props.uploadMediaCv(data)
}
AfficherSuccess() {
uploadMediaCv = (e) => {
var file = e.target.files[0]
const data = new FormData()
data.append('upload', file)
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})}>
<Snackbar open={open} autoHideDuration={1000} onClose={() => this.setState({open: false})}>
<Alert onClose={() => this.setState({open: false})} severity="success">
{ReactHtmlParser(this.state.success.message)}
{ReactHtmlParser(this.state.success.message)}
</Alert>
</Snackbar>
</Snackbar>
);
}
return "";
}
}
AfficherLienCv() {
console.log("afficher lien");
if (this.state.cvLink !="") {
return (
<Fragment>
<Typography >
<a href={publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.postedContentCv + this.state.cvLink}
target="_blank"
style={{
color:'#1E2327',
'&:hover': {
color: '#1E2327',
},
backgroundColor: '#F3F3F4',
width:'100%',
fontWeight: '500',
fontSize: '1em',
padding:'15px',
margin:'20px 0',
}}
>
Visualiser mon CV
</a>
<br />
</Typography>
</Fragment>
AfficherLienCv() {
console.log("afficher lien");
if (this.state.cvLink !="") {
return (
<Fragment>
<Typography >
<a href={publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.postedContentCv + this.state.cvLink}
target="_blank"
style={{
color:'#1E2327',
'&:hover': {
color: '#1E2327',
},
backgroundColor: '#F3F3F4',
width:'100%',
fontWeight: '500',
fontSize: '1em',
padding:'15px',
margin:'20px 0',
}}
>
Visualiser mon CV
</a>
<br />
</Typography>
</Fragment>
);
}
return "";
}
}
@@ -319,27 +377,92 @@ class Answer extends Component {
if (e.target.value === '') {
console.log('cleared');
this.props.onSelectionChanged('');
//this.props.onSelectionChanged('');
}
}
onSuggestionSelected = (suggestion) => {
remplirLocation = (typeDonnee, donnee) =>{
console.log("DEBUT remplirLocation");
console.log(typeDonnee);
console.log(donnee);
if(typeDonnee=='"street_number"') {
this.setState({ street_number: donnee.replace('"', '') })
}else if(typeDonnee=='"route"') {
this.setState({ route: donnee.replace('"', '') })
}else if(typeDonnee=='"locality"') {
this.setState({ locality: donnee.replace('"', '') })
}else if(typeDonnee=='"administrative_area_level_2"') {
this.setState({ administrative_area_level_2: donnee.replace('"', '') })
}else if(typeDonnee=='"administrative_area_level_1"') {
this.setState({ administrative_area_level_1: donnee.replace('"', '') })
}else if(typeDonnee=='"country"') {
this.setState({ country: donnee.replace('"', '') })
}else if(typeDonnee=='"postal_code"') {
this.setState({ postal_code: donnee.replace('"', '') })
}
console.log("FIN remplirLocation");
}
onSuggestionSelected = (suggestion) => {
console.log('Selected suggestion:', suggestion)
const address = suggestion.description;
let address = suggestion.description;
var words = address.split(',');
if(words.length<3){
address = "mairie de "+address;
}
this.setState({ geoloc: address})
this.setState({
value: address
});
geocodeByAddress(address)
.then(address => {
console.log('Selected ' + JSON.stringify(address[0]));
this.props.onSelectionChanged(address[0]);
console.log("ADRESSE");
console.log(address);
if(address[0].address_components[0]){
this.remplirLocation(JSON.stringify(address[0].address_components[0].types[0]), JSON.stringify(address[0].address_components[0].long_name))
}
if(address[0].address_components[1]){
this.remplirLocation(JSON.stringify(address[0].address_components[1].types[0]), JSON.stringify(address[0].address_components[1].long_name))
}
if(address[0].address_components[2]){
this.remplirLocation(JSON.stringify(address[0].address_components[2].types[0]), JSON.stringify(address[0].address_components[2].long_name))
}
if(address[0].address_components[3]){
this.remplirLocation(JSON.stringify(address[0].address_components[3].types[0]), JSON.stringify(address[0].address_components[3].long_name))
}
if(address[0].address_components[4]){
this.remplirLocation(JSON.stringify(address[0].address_components[4].types[0]), JSON.stringify(address[0].address_components[4].long_name))
}
if(address[0].address_components[5]){
this.remplirLocation(JSON.stringify(address[0].address_components[5].types[0]), JSON.stringify(address[0].address_components[5].long_name))
}
if(address[0].address_components[6]){
this.remplirLocation(JSON.stringify(address[0].address_components[6].types[0]), JSON.stringify(address[0].address_components[6].long_name))
}
if(address[0].geometry){
console.log(address[0].geometry.location_type);
let gps =JSON.stringify(address[0].geometry.location);
const obj = JSON.parse(gps);
this.setState({ formatted_address: JSON.stringify(address[0].formatted_address) })
this.setState({ lat: obj.lat.toString()})
this.setState({ lng: obj.lng.toString()})
}
// console.log("GEOLOC ON geocodeByAddress")
// console.log(this.state.geoloc)
// document.getElementById("geoloc").value =JSON.stringify(address[0]);
// this.props.onSelectionChanged(address[0]);
})
.catch(error => console.error('Error', error))
}
onSuggestionSelected(suggestion) {
// Add your business logic here. In this case we just log...
console.log('Selected suggestion:', suggestion)
}
@@ -353,9 +476,9 @@ class Answer extends Component {
const className = suggestion.active ? 'suggestion-item--active' : 'suggestion-item';
const style = suggestion.active
? { backgroundColor: 'red', cursor: 'pointer',border: '1px solid' }
: { backgroundColor: '#ffffff', cursor: 'pointer',border: '1px solid' };
: { backgroundColor: '#123456', cursor: 'pointer',border: '1px solid' };
return (<div {...getSuggestionItemProps(suggestion,{className,style})}>
<span>{suggestion.description}</span>
<span >{suggestion.description}</span>
</div>
)
})}
@@ -370,7 +493,7 @@ class Answer extends Component {
handleChange = (e) => {
handleChange = (e) => {
this.setState({ [e.target.name]: e.target.value })
}
@@ -383,11 +506,26 @@ class Answer extends Component {
console.log("firstname")
console.log(this.state.firstname)
const data = new FormData()
data.append('firstname', this.state.firstname)
data.append('lastname', this.state.lastname)
data.append('phone', this.state.phone)
data.append('currentJob', this.state.currentJob)
console.log("GEOLOC ON SUBMIT")
console.log(this.state)
data.append('geoloc', this.state.geoloc)
data.append('street_number', this.state.street_number.replace('"', ''))
data.append('route', this.state.route.replace('"', ''))
data.append('locality', this.state.locality.replace('"', ''))
data.append('administrative_area_level_2', this.state.administrative_area_level_2.replace('"', ''))
data.append('administrative_area_level_1', this.state.administrative_area_level_1.replace('"', ''))
data.append('country', this.state.country.replace('"', ''))
data.append('postal_code', this.state.postal_code.replace('"', ''))
data.append('formatted_address', this.state.formatted_address.replace('"', ''))
data.append('lat', this.state.lat)
data.append('lng', this.state.lng)
//
data.append('linkedin', this.state.linkedin)
data.append('twitter', this.state.twitter)
data.append('website', this.state.website)
@@ -400,6 +538,9 @@ class Answer extends Component {
// //TODO Envoyer un mail a chaque user
// console.log(user.email)
// )
// US 471 : TODO envoyer le lien du cv pour le mettre dans la candidature (this.state.cvLink)
console.log(this.state.cvLink, "lien CV")
this.props.postAdAnswerRequest(
{
adId: this.props.adId,
@@ -443,6 +584,10 @@ class Answer extends Component {
value: this.state.address,
onChange: this.onChange,
}
const searchOptions = {
componentRestrictions: { country: ['fr'] },
}
return (
<section className={classes.container}>
@@ -481,18 +626,11 @@ class Answer extends Component {
// src="https://media.w3.org/2010/05/sintel/trailer_hd.mp4"
/>
{/* <GooglePlaceAutocomplete
name="location"
label="Location"
onSuggestionSelected={this.onSuggestionSelected}
textFieldProps={{ onChange: (e) => this.onChange(e), value: this.state.value, placeholder: 'Chercher votre adresse'}}
types={['(regions)']}
renderTarget={() => (<div />)}
/> */}
<Button className={classes.remplacerButton} onClick={this.openDialog.bind(this)}>
Remplacer ma vidéo
</Button>
<Dialog open={this.state.open} onEnter={console.log("Hey.")}>
<Dialog open={this.state.open}>
<DialogTitle> Souhaitez-vous remplacer votre vidéo de réponse ?</DialogTitle>
<DialogContent className={classes.popup}> Cette vidéo et tous les éléments de votre candidature seront définitivement supprimés. Vous pourrez importer ou réaliser une nouvelle vidéo de réponse. </DialogContent>
<DialogActions>
@@ -507,6 +645,22 @@ class Answer extends Component {
</Dialog>
<TextField
name="firstname"
required
id="outlined-required"
label="Prénom"
className={classes.textField}
classes={{ root: classes.rootTextfield }}
variant="outlined"
value={this.state.firstname}
onChange={this.handleChange}
error={!!_.isEmpty(this.state.firstname)}
helperText={!!_.isEmpty(this.state.firstname) && "Veuillez saisir votre prénom"}
/>
<TextField
name="lastname"
required
@@ -522,19 +676,51 @@ class Answer extends Component {
required
/>
<TextField
name="firstname"
required
id="outlined-required"
label="Prénom"
className={classes.textField}
classes={{ root: classes.rootTextfield }}
variant="outlined"
value={this.state.firstname}
<div
className={classes.conteneurGoogle}
classes={{ root: classes.rootTextfield }}
style={{ position: 'relative', zIndex:2, width: '100%' }}>
<label htmlFor="outlined-required"
className={classes.labelGeoloc}>
Adresse
</label>
<div className={classes.conteneurGoogleComposant}>
<GooglePlaceAutocomplete
style={{ paddingLeft:'14px !important', left: 0, right: 0, zIndex: '2 !important', width: '100%' }}
name="location"
label="Location"
id="outlined-required"
variant="outlined"
textFieldProps={{ id: "outlined-required" }}
className={classes.textField}
classes={{ root: classes.rootTextfield }}
options={this.searchOptions}
onSuggestionSelected={this.onSuggestionSelected}
textFieldProps={{ onChange: (e) => this.onChange(e), value: this.state.value, placeholder: 'Ex : Rue de Rivoli, Paris, France', fullWidth: true, size:"small"}}
types={['(regions)']}
componentRestrictions={{country: 'fr'}}
renderTarget={() => (
<div
style={{
width: '100%',
zIndex:9
}}
>
</div>
)}
/>
</div>
{/* <Input
name="geoloc"
id="geoloc"
label="geoloc"
ref="geoloc"
onChange={this.handleChange}
error={!!_.isEmpty(this.state.firstname)}
helperText={!!_.isEmpty(this.state.firstname) && "Veuillez saisir votre prénom"}
/>
value={this.state.geoloc =='null' || this.state.geoloc =='' ? '' :this.state.geoloc}
/> */}
</div>
<TextField
name="phone"
@@ -566,7 +752,7 @@ class Answer extends Component {
className={classes.textField}
classes={{ root: classes.rootTextfield }}
variant="outlined"
value={this.state.currentJob}
value={this.state.currentJob =='null' || this.state.currentJob =='' ? '' :this.state.currentJob}
onChange={this.handleChange}
/>
@@ -601,7 +787,7 @@ class Answer extends Component {
classes={{ root: classes.rootTextfield }}
variant="outlined"
placeholder="http://www.linkedin.com/in/"
value={this.state.linkedin}
value={this.state.linkedin =='null' || this.state.linkedin =='' ? '' :this.state.linkedin}
onChange={this.handleChange}
/>
@@ -614,7 +800,7 @@ class Answer extends Component {
classes={{ root: classes.rootTextfield }}
variant="outlined"
placeholder="http://twitter.com/.."
value={this.state.twitter}
value={this.state.twitter =='null' || this.state.twitter =='' ? '' :this.state.twitter}
onChange={this.handleChange}
/>
@@ -626,7 +812,7 @@ class Answer extends Component {
classes={{ root: classes.rootTextfield }}
variant="outlined"
placeholder="http://monsite.fr"
value={this.state.website}
value={this.state.website =='null' || this.state.website =='' ? '' :this.state.website}
onChange={this.handleChange}
/>
@@ -643,10 +829,10 @@ function mapStateToProps(state, ownProps) {
// console.log(state.media.message.heure);
return {
user: state.user ,
cvLink : state.media.message,
cvLink : state.mediaCv.message,
loading: !!state.media.loading,
cv : true,
user: state.user,
// user: state.user,
// loading: !!state.user.loading,
pictureLoading: !!state.user.pictureLoading,
errors: state.user.errors || ownProps.errors,
+42 -42
View File
@@ -8,7 +8,7 @@ import Chip from '@material-ui/core/Chip';
import CardContent from '@material-ui/core/CardContent';
import CardMedia from '@material-ui/core/CardMedia';
import Typography from '@material-ui/core/Typography';
import IconText from './../atoms/IconText';
import IconText from './../atoms/IconTextInline';
import KeyboardArrowleftIcon from '@material-ui/icons/PlayArrowRounded';
import ArrowForwardIcon from '@material-ui/icons/ArrowForward';
import Link from 'next/link';
@@ -83,11 +83,11 @@ const styles = theme => ({
},
iconTextIcon: {
color: theme.palette.offerlistitem.icon,
fontSize: '0.8em',
fontSize: '1em',
},
iconTextText: {
color: theme.palette.offerlistitem.text,
fontSize: '0.6em',
fontSize: '1em',
paddingLeft: theme.spacing(1),
},
bottomCard: {
@@ -96,8 +96,9 @@ const styles = theme => ({
width: '90%',
},
chip: {
color: theme.palette.secondary.main,
backgroundColor: theme.palette.primary.important,
marginTop :"10px",
backgroundColor:"#E7F3FF",
color:theme.palette.primary.dark,
},
icon: {
color: theme.palette.secondary.dark,
@@ -112,50 +113,30 @@ const { publicRuntimeConfig } = getConfig()
//must go in API
const status = new Map([
["DRAFT"
, "Brouillon"]
["A_TRAITER"
, "Envoyée"]
,
["TO_PUBLISH"
, "En cours de validation"]
["CONTACTE"
, "En cours de traitement"]
,
["VALIDATED"
, "Validée"]
["ENTRETIEN"
, "En cours de traitement"]
,
["PUBLISHED"
, "Publiée"]
["REFUSE"
, "Refusée"]
,
["CLOSED"
, "Cloturée"]
["EMBAUCHE"
, "Embauchée"]
,
["EXPIRED"
, "Expirée"]
,
["SENDED"
[""
, "Envoyée"]
,
["DECLINED"
, "Refusée"]
["Null"
, "Envoyée"]
,
["NEW"
, "Nouveau"]
,
["VIEWED"
, "Visionnée"]
,
["NEGATIVE"
, "Négatif"]
,
["POSITIVE"
, "Positif"]
,
["INFOS"
, "Demande dinformations"]
,
["CONTACTED"
, "Demande dinformations"]
,
["CONTACTED.RDV"
, "Convocation entretien"]
])
class AnswerRowComponent extends React.Component {
@@ -169,12 +150,14 @@ 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}`} >
<Card className={classes.card} >
@@ -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>
+1 -1
View File
@@ -139,7 +139,7 @@ class CompanyRowComponent extends React.Component {
render() {
const { classes, theme, rowData } = this.props;
const imgDefaultUrl = "/static/images/default/default_picture_company.svg"
const imgDefaultUrl = "https://blog.talentstube.com/wp-content/uploads/2021/01/default_picture_company.jpg"
const imgUrl = (rowData.presentation_video && rowData.presentation_video.thumbnails[0] && rowData.presentation_video.thumbnails[0].sizes[4]) ? rowData.presentation_video.thumbnails[0].sizes[4].link : imgDefaultUrl
const logoUrl = publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + rowData.logo
+2 -2
View File
@@ -59,7 +59,7 @@ const styles = theme => ({
titleContainer: {
color: theme.palette.primary.darkMain,
fontSize: '1.5em',
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontWeight: '600',
[theme.breakpoints.up('md')]: {
fontSize: '1.2em',
@@ -113,7 +113,7 @@ const styles = theme => ({
},
},
titleReactApp: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
paddingTop: theme.spacing(4),
@@ -0,0 +1,246 @@
import Link from 'next/link'
import { withStyles } from '@material-ui/core/styles'
import { Typography } from '@material-ui/core';
import { Fragment } from 'react';
import NewsLetterRegistration from './NewsLetterRegistration'
import dynamic from 'next/dynamic'
import Button from '@material-ui/core/Button'
import getConfig from 'next/config'
const { publicRuntimeConfig } = getConfig();
const styles = theme => ({
root: {
display: 'flex',
flexDirection: 'column',
backgroundColor: "#1E2327",
[theme.breakpoints.up('md')]: {
display: 'flex',
flexDirection: 'row',
alignItems: 'flex-start',
justifyContent: 'space-around',
backgroundColor: "#1E2327",
padding: theme.spacing(10, 18),
},
'& a': {
textDecoration: 'none',
color:"#fff"
},
},
container: {
display: 'flex',
flexDirection: 'column',
alignItems: 'flex-start',
padding: theme.spacing(0, 5),
paddingBottom: theme.spacing(3.5),
'&:first-child': {
paddingTop: theme.spacing(4),
},
[theme.breakpoints.up('md')]: {
padding: 0,
'&:first-child': {
paddingTop: 0,
},
},
},
containerRegion: {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
backgroundColor: theme.palette.secondary.main,
padding: theme.spacing(3),
[theme.breakpoints.up('md')]: {
padding: theme.spacing(8, 0),
},
},
titleContainer: {
color: "#fff",
fontSize: '1.5em',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontWeight: '600',
[theme.breakpoints.up('md')]: {
fontSize: '1.2em',
paddingBottom: theme.spacing(2),
},
},
textContainer: {
fontWeight: '300',
fontSize: '0.9em',
[theme.breakpoints.up('md')]: {
fontWeight: '300',
fontSize: '0.8em',
},
},
textContainerRegion: {
fontWeight: '300',
fontSize: '0.9em',
color: theme.palette.primary.dark,
},
footerLogo: {
width: '15vw',
[theme.breakpoints.up('md')]: {
width: '4vw',
},
},
footerLogoTT: {
width: '70%',
[theme.breakpoints.up('md')]: {
paddingBottom: theme.spacing(1),
width: '100%'
},
},
containerReactApp: {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'space-between',
height: 'auto',
paddingTop: theme.spacing(4),
backgroundColor: "#000",
[theme.breakpoints.down('xs')]: {
height: '100vh',
},
[theme.breakpoints.up('md')]: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-around',
height: '35vh',
padding: theme.spacing(6, 1),
position: 'relative',
},
},
titleReactApp: {
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
paddingTop: theme.spacing(4),
paddingLeft: theme.spacing(4),
paddingRight: theme.spacing(4),
[theme.breakpoints.up('md')]: {
order: 1,
width: '20%',
textAlign: 'left',
},
},
buttonReactApp: {
textTransform: 'inherit',
margin: theme.spacing(0, 8),
padding: theme.spacing(1.2, 2),
[theme.breakpoints.up('md')]: {
order: 3,
margin: 'inherit',
marginRight: '5vw',
},
},
imageReactApp: {
width: '100%',
[theme.breakpoints.up('sm')]: {
width: 'auto',
},
[theme.breakpoints.up('md')]: {
width: '25%',
order: 2,
position: 'absolute',
bottom: 0,
},
},
containerNewsletter: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
padding: theme.spacing(6, 4),
},
version:{
marginTop: '15px',
fontSize: '0.7em',
fontWeight: '300',
}
});
function Footer(props) {
const { classes } = props;
return (
<div>
<section className={classes.containerNewsletter}>
<NewsLetterRegistration />
</section>
<div className={classes.root}>
<section className={classes.container}>
<img alt="talents-tube" src='/static/images/logos/TalentsTube_logo-blanc.svg' className={classes.footerLogoTT} />
</section>
<section className={classes.container}>
<Typography color="secondary" component="p" className={classes.titleContainer}>
Informations
</Typography>
<Link href="/Cgu" >
<a>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
CGU
</Typography>
</a>
</Link>
<Link href="/MentionsLegales" >
<a>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
Mentions légales
</Typography>
</a>
</Link>
<Link href="/Confidentialite" >
<a>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
Politique de confidentialité et Protection <br />des données
</Typography>
</a>
</Link>
<Link href="" >
<a href="https://blog.talentstube.com/contact" target="_blank">
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
Contact
</Typography>
</a>
</Link>
</section>
<section className={classes.container}>
<Typography color="secondary" component="p" className={classes.titleContainer}>
Rencontrons-nous
</Typography>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
3, rue Louis de Broglie
</Typography>
<Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
56 000 Vannes
</Typography>
<Typography gutterBottom component="p" className={classes.textContainer}>
<a href="tel:+33230050631" >02.30.05.06.31 </a>
</Typography>
{/* <Typography gutterBottom color="secondary" component="p" className={classes.textContainer}>
contact@talentstube.com
</Typography> */}
</section>
</div>
<section className={classes.containerRegion}>
<Typography gutterBottom component="p" className={classes.textContainerRegion} align="center" >
Entreprise soutenue par
</Typography>
<a href="https://www.bretagne.bzh/" target="_blank" className={classes.darkMenuItem} rel="noopener">
<img alt="Région Bretagne" src='/static/images/logos/Logo-region.svg' className={classes.footerLogo} />
</a>
<Typography className={classes.version} align="center" >
{publicRuntimeConfig.version}
</Typography>
</section>
</div>
);
}
export default withStyles(styles)(Footer)
+9 -6
View File
@@ -225,6 +225,9 @@ const styles = theme => ({
justifyContent: 'space-between',
padding: 0,
},
appBar:{
position:'fixed'
},
appBarDesktopSection: {
display: 'flex',
alignItems: 'center',
@@ -482,12 +485,12 @@ class Header extends React.Component {
<Divider light={true} />
<div className={classes.linkGroup}>
<a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.lightMenuItem}><ListItem classes={{ primary: classes.ListItemText }} classes={{ root: classes.rootListItemIcon }}>
{/* <a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.lightMenuItem}><ListItem classes={{ primary: classes.ListItemText }} classes={{ root: classes.rootListItemIcon }}>
<WorkOutlineIcon className={classes.icon} />
<ListItemText primary='Connexion recruteurs'>
</ListItemText>
</ListItem>
</a>
</a> */}
</div>
</List>
</div>
@@ -526,7 +529,7 @@ class Header extends React.Component {
<a className={classes.lightMenuItem}>
<ListItem classes={{ root: classes.rootListItemIcon }}>
<AccountCircleIcon className={classes.icon} />
<ListItemText primary='Mon compte'>
<ListItemText primary='Mon profil'>
</ListItemText>
</ListItem>
</a>
@@ -535,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>
@@ -663,14 +666,14 @@ class Header extends React.Component {
</div>
</List>
</section>
<section className={classes.appBarDesktopSection + ' ' + classes.appBarDesktopSection3}>
{/* <section className={classes.appBarDesktopSection + ' ' + classes.appBarDesktopSection3}>
<a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.desktopMenuItem}>
<ListItemText primary='Espace recruteurs'>
</ListItemText>
<ArrowForward className={classes.icon} />
</a>
</section>
</section> */}
</Toolbar>
</AppBar>)
:
@@ -28,7 +28,7 @@ import ArrowForward from '@material-ui/icons/ArrowForward';
import List from '@material-ui/core/List';
import ListItem from '@material-ui/core/ListItem';
import { ListItemText } from '@material-ui/core';
import Loader from './../templates/loader'
import Loader from '../templates/loader'
import { connect } from 'react-redux'
import { fetchCurrentUserRequest } from "../../actions/user";
import { requestLogout } from "../../actions/auth";
@@ -36,7 +36,7 @@ import Button from '@material-ui/core/Button';
import withWidth, { isWidthUp } from '@material-ui/core/withWidth'
import Typography from '@material-ui/core/Typography';
import { withRouter } from "next/router";
import ActiveLink from "./../atoms/Activelink";
import ActiveLink from "../atoms/Activelink";
import axios from 'axios';
import setAuthorizationHeader from "../../data/setAuthorizationHeader";
import getConfig from 'next/config'
@@ -302,7 +302,7 @@ const styles = theme => ({
});
let urlEnv;
class Header extends React.Component {
class HeaderPersonnalise extends React.Component {
state = {
top: false,
left: false,
@@ -397,12 +397,12 @@ class Header extends React.Component {
<Divider light={true} />
<div className={classes.linkGroup}>
<a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.lightMenuItem}><ListItem classes={{ primary: classes.ListItemText }} classes={{ root: classes.rootListItemIcon }}>
{/* <a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.lightMenuItem}><ListItem classes={{ primary: classes.ListItemText }} classes={{ root: classes.rootListItemIcon }}>
<WorkOutlineIcon className={classes.icon} />
<ListItemText primary='Connexion recruteurs'>
</ListItemText>
</ListItem>
</a>
</a> */}
</div>
</List>
</div>}
@@ -438,7 +438,7 @@ class Header extends React.Component {
<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 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>
@@ -575,14 +575,14 @@ class Header extends React.Component {
</div>
</List>
</section>
<section className={classes.appBarDesktopSection + ' ' + classes.appBarDesktopSection3}>
{/* <section className={classes.appBarDesktopSection + ' ' + classes.appBarDesktopSection3}>
<a href={publicRuntimeConfig.symphonyUrl + "/"} className={classes.desktopMenuItem}>
<ListItemText primary='Espace recruteurs'>
</ListItemText>
<ArrowForward className={classes.icon} />
</a>
</section>
</section> */}
</Toolbar>
</AppBar>)
:
@@ -597,7 +597,7 @@ class Header extends React.Component {
focusRipple
className={classes.back}
focusVisibleClassName={classes.focusVisible}
onClick={() => Router.push("/Offres")}>
onClick={() => Router.push("/"+this.props.retour)}>
<ArrowLeft color="primary" classes={{ root: classes.icon }}></ArrowLeft>
</ButtonBase>
<div className={classes.grow} />
@@ -631,4 +631,4 @@ function mapStateToProps(state) {
loading: !!state.user.loading
};
}
export default (connect(mapStateToProps, { fetchCurrentUserRequest, requestLogout })(withStyles(styles)(withWidth()(Header))));
export default (connect(mapStateToProps, { fetchCurrentUserRequest, requestLogout })(withStyles(styles)(withWidth()(HeaderPersonnalise))));
+63 -86
View File
@@ -1,32 +1,21 @@
import React, { Fragment,lazy, Suspense } from 'react'
import Router from 'next/router'
import React, { Fragment } from 'react'
import { withStyles } from '@material-ui/core/styles';
import getConfig from 'next/config'
import Typography from '@material-ui/core/Typography';
import Button from '@material-ui/core/Button';
import Avatar from '@material-ui/core/Avatar';
import Card from '@material-ui/core/Card';
import Chip from '@material-ui/core/Chip';
import CardContent from '@material-ui/core/CardContent';
import CardMedia from '@material-ui/core/CardMedia';
import CardHeader from '@material-ui/core/CardHeader';
import KeyboardArrowleftIcon from '@material-ui/icons/PlayArrowRounded';
import IconText from '../atoms/IconText';
import IconTextInline from './../atoms/IconTextInline';
import SocialShare from './SocialShare';
import SimpleCollapse from '../atoms/SimpleCollapse';
import _ from "lodash/string";
import Ar from "lodash/array";
import Hidden from '@material-ui/core/Hidden';
import Link from 'next/link'
import withWidth, { isWidthUp } from '@material-ui/core/withWidth'
const VideoVimeo = lazy(() => import('../atoms/VideoVimeo'));
//import VideoVimeo from '../atoms/VideoVimeo'
import OgHead from '../atoms/OgHead'
import { isWidthUp } from '@material-ui/core/withWidth'
import JobPosting from '../atoms/JobPosting'
import Moment from 'react-moment';
import StickyBox from "react-sticky-box";
const renderLoader = () => <p>Chargement</p>;
const styles = theme => ({
primary: {
color: theme.palette.primary.main,
@@ -343,7 +332,7 @@ const styles = theme => ({
padding: theme.spacing(1, 0),
whiteSpace: 'pre-line',
textAlign: 'justify',
lineHeight : '2em',
lineHeight : '1.5em',
color: '#1E2327'
},
ul:{
@@ -677,28 +666,18 @@ const { publicRuntimeConfig } = getConfig()
function OffreDetail(props) {
let { classes, offre, isCandidature } = props;
const logoUrl = (offre.company ? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + offre.company.logo : "/static/images/defaultdefault_picture_company.svg/")
const DefaultUrl = "/static/images/default/default_picture_company.svg"
const imgUrl = (offre.company && offre.company.presentation_video && offre.company.presentation_video.thumbnails && offre.company.presentation_video.thumbnails[0] && offre.company.presentation_video.thumbnails[0].sizes[2]) ? offre.company.presentation_video.thumbnails[0].sizes[2].link : DefaultUrl
const imgUrlDesktop = (offre.company && offre.company.presentation_video && offre.company.presentation_video.thumbnails && offre.company.presentation_video.thumbnails[0] && offre.company.presentation_video.thumbnails[0].sizes[4]) ? offre.company.presentation_video.thumbnails[0].sizes[4].link : DefaultUrl
const imgUrlOffre = (offre && offre.video && offre.video.thumbnails && offre.video.thumbnails[0] && offre.video.thumbnails[0].sizes[2]) ? offre.video.thumbnails[0].sizes[2].link : DefaultUrl
const imgUrlDesktopOffre = (offre && offre.video && offre.video.thumbnails && offre.video.thumbnails[0] && offre.video.thumbnails[0].sizes[4]) ? offre.video.thumbnails[0].sizes[4].link : DefaultUrl
const imgUrlTerritoire = (offre.territories && offre.territories[0] && offre.territories[0].territory && offre.territories[0].territory.presentation_video.thumbnails && offre.territories[0].territory.presentation_video.thumbnails[0] && offre.territories[0].territory.presentation_video.thumbnails[0].sizes[2]) ? offre.territories[0].territory.presentation_video.thumbnails[0].sizes[2].link : DefaultUrl
const imgUrlDesktopTerritoire = (offre.territories && offre.territories[0] && offre.territories[0].territory.presentation_video && offre.territories[0].territory.presentation_video.thumbnails && offre.territories[0].territory.presentation_video.thumbnails[0] && offre.territories[0].territory.presentation_video.thumbnails[0].sizes[4]) ? offre.territories[0].territory.presentation_video.thumbnails[0].sizes[4].link : DefaultUrl
const logoUrl = (offre.company ? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + offre.company.logo : "https://blog.talentstube.com/wp-content/uploads/2021/01/default_picture_company.jpg")
const DefaultUrl = "https://blog.talentstube.com/wp-content/uploads/2021/01/default_picture_company.jpg"
const imgUrl = (offre.company && offre.company.presentation_video && offre.company.presentation_video.thumbnails && offre.company.presentation_video.thumbnails[0] && offre.company.presentation_video.thumbnails[0].sizes[3]) ? offre.company.presentation_video.thumbnails[0].sizes[3].link : DefaultUrl
const imgUrlDesktop = (offre.company && offre.company.presentation_video && offre.company.presentation_video.thumbnails && offre.company.presentation_video.thumbnails[0] && offre.company.presentation_video.thumbnails[0].sizes[3]) ? offre.company.presentation_video.thumbnails[0].sizes[3].link : DefaultUrl
const imgUrlOffre = (offre && offre.video && offre.video.thumbnails && offre.video.thumbnails[0] && offre.video.thumbnails[0].sizes[3]) ? offre.video.thumbnails[0].sizes[3].link : DefaultUrl
const imgUrlDesktopOffre = (offre && offre.video && offre.video.thumbnails && offre.video.thumbnails[0] && offre.video.thumbnails[0].sizes[3]) ? offre.video.thumbnails[0].sizes[3].link : DefaultUrl
const imgUrlTerritoire = (offre.territories && offre.territories[0] && offre.territories[0].territory && offre.territories[0].territory.presentation_video.thumbnails && offre.territories[0].territory.presentation_video.thumbnails[0] && offre.territories[0].territory.presentation_video.thumbnails[0].sizes[3]) ? offre.territories[0].territory.presentation_video.thumbnails[0].sizes[3].link : DefaultUrl
const imgUrlDesktopTerritoire = (offre.territories && offre.territories[0] && offre.territories[0].territory.presentation_video && offre.territories[0].territory.presentation_video.thumbnails && offre.territories[0].territory.presentation_video.thumbnails[0] && offre.territories[0].territory.presentation_video.thumbnails[0].sizes[3]) ? offre.territories[0].territory.presentation_video.thumbnails[0].sizes[3].link : DefaultUrl
const socialShareUrl = typeof window !== 'undefined' ? window.location : publicRuntimeConfig.frontServerUrl + `/Offre/${offre.id}-${_.kebabCase(offre.title)}`;
const entrepriseLink = (offre.company && `/Entreprise/${offre.company.id}-${_.kebabCase(offre.company.brand_name)}`);
const territoryVideoUrlTab = (offre.territories && offre.territories[0] && offre.territories[0].territory) ? offre.territories[0].territory.presentation_video.cdn_url.split('/') : '';
const territoryVideoId = territoryVideoUrlTab[2]
let descriptionSEO = ""
let titleSEO = ""
offre.company.brand_name ? descriptionSEO += offre.company.brand_name : ""
descriptionSEO += " recrute en vidéo un(e) "+offre.title
titleSEO = "Offre d'emploi vidéo "+offre.title
offre.location.gmap_address.formatted_address ? descriptionSEO += ", "+offre.location.gmap_address.formatted_address : ""
offre.location.gmap_address.formatted_address ? titleSEO += ", "+offre.location.gmap_address.formatted_address : ""
offre.company.brand_name ? titleSEO += " - "+offre.company.brand_name : ""
descriptionSEO += ". Envoyez votre candidature en vidéo. "
titleSEO += " | Talents Tube "
let jobVille=""
let jobDpt=""
let jobPays=""
@@ -708,12 +687,12 @@ function OffreDetail(props) {
let nombreHeure =""
let dureeContrat =""
let teletravail =""
offre.location.gmap_address.address_components[0] ? jobVille = offre.location.gmap_address.address_components[0].long_name: jobVille=""
offre.location.gmap_address.address_components[1] ? jobDpt = offre.location.gmap_address.address_components[1].long_name: jobDpt=""
offre.location.gmap_address.address_components[3] ? jobPays = offre.location.gmap_address.address_components[3].long_name: jobPays=""
offre.location && offre.location.gmap_address.address_components[0] ? jobVille = offre.location.gmap_address.address_components[0].long_name: jobVille=""
offre.location && offre.location.gmap_address.address_components[1] ? jobDpt = offre.location.gmap_address.address_components[1].long_name: jobDpt=""
offre.location && offre.location.gmap_address.address_components[3] ? jobPays = offre.location.gmap_address.address_components[3].long_name: jobPays=""
// offre.location.gmap_address ? jobAdr = location.gmap_address.adr_address: jobAdr=""
offre.extra.contract_type ? jobContract = offre.extra.contract_type : jobContract =""
offre.extra.temps_type ? tempsType = offre.extra.temps_type : tempsType =""
offre.extra && offre.extra.contract_type ? jobContract = offre.extra.contract_type : jobContract =""
offre.extra && offre.extra.temps_type ? tempsType = offre.extra.temps_type : tempsType =""
console.log("competences!!");
//console.log(offre.competences);
var competences = [];
@@ -721,8 +700,8 @@ function OffreDetail(props) {
if(offre.competences){
for (var i = 0; i < offre.competences.length; i++) {
//console.log(offre.competences[i]);
console.log("competences "+i);
console.log(offre.competences[i]);
// console.log("competences "+i);
// console.log(offre.competences[i]);
for (const property in offre.competences[i]) {
console.log(` ${offre.competences[i][property]}`);
@@ -734,7 +713,7 @@ function OffreDetail(props) {
const listItems = competences.map((number) =>
<li className={classes.listeCompetences}>{number}</li>
);
offre.extra.teletravail ? teletravail = offre.extra.teletravail : teletravail =""
offre.extra && offre.extra.teletravail ? teletravail = offre.extra.teletravail : teletravail =""
//gestion du type de temps de travail
if(tempsType=="PART_TIME"){
tempsTypeFr="Temps partiel"
@@ -744,35 +723,35 @@ function OffreDetail(props) {
}
//gestion du nombre d'heure
if(offre.extra.nombre_heure && offre.extra.nombre_heure!=0 && tempsType=="PART_TIME"){
if(offre.extra && offre.extra.nombre_heure && offre.extra.nombre_heure!=0 && tempsType=="PART_TIME"){
nombreHeure=" ("+offre.extra.nombre_heure+" h/semaine)";
}
//gestion de la duree de contrat
if(offre.extra.duree_contrat && offre.extra.duree_contrat!=0 && jobContract=="CDD"){
if(offre.extra && offre.extra.duree_contrat && offre.extra.duree_contrat!=0 && jobContract=="CDD"){
dureeContrat=" ("+offre.extra.duree_contrat+" mois)";;
}
//gestion du télétravail
if(offre.extra.teletravail=='tele_occasionel'){
if(offre.extra && offre.extra.teletravail=='tele_occasionel'){
teletravail='Télétravail occasionnel';
}else if(offre.extra.teletravail=='tele_partiel'){
}else if(offre.extra && offre.extra.teletravail=='tele_partiel'){
teletravail='Télétravail partiel';
}else if(offre.extra.teletravail=='tele_total'){
}else if(offre.extra && offre.extra.teletravail=='tele_total'){
teletravail='Télétravail total';
}else{
teletravail=null;
}
const imgDefaultUrl = "/static/images/default/default_picture_company.svg"
const imgDefaultUrl = "https://blog.talentstube.com/wp-content/uploads/2021/01/default_picture_company.jpg"
{/* CONST MARQUE EMPLOYEUR */}
const marqueEmployeur = offre.company.presentation_video && !offre.is_promoted && (
const marqueEmployeur = offre.company && offre.company.presentation_video && !offre.is_promoted && (
<div className={classes.container + ' ' + classes.discoverContainerCompany}>
<section>
{/* <a href={entrepriseLink}> */}
{/* const entrepriseLink = (offre.company && `/Entreprise/${offre.company.id}-${_.kebabCase(offre.company.brand_name)}`); */}
<Link href={`/Player?id=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${Ar.last(_.split(offre.company.presentation_video.cdn_url, '/'))}&type=Entreprise`} >
<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} />
<Typography variant="h3" component="h3" gutterBottom className={ classes.voirEntreprise} align="center">
@@ -822,23 +801,19 @@ function OffreDetail(props) {
{/* {offre.public_tag.map((label, index) => {
descriptionSEO += label+", "
})} */}
{/* PARTIE REFERECEMENT GENERAL (FACEBOOK, GOOGLE, TWITTER LINKENDIN) */}
<OgHead seo_title={titleSEO}
seo_description={descriptionSEO}
seo_url={socialShareUrl}
image={imgUrlDesktop}
></OgHead>
{/* PARTIE REFERENCEMENT GENERAL (FACEBOOK, GOOGLE, TWITTER LINKENDIN) */}
{/* PARTIE REFERENCEMENT GOOGLE JOBS */}
<JobPosting job_title={offre.title}
job_description={offre.description}
job_brand= {offre.company.brand_name && offre.company.brand_name}
job_brand= {offre.company && offre.company.brand_name && offre.company.brand_name}
job_brand_link= {entrepriseLink}
job_title = {offre.title}
job_location = {offre.location.gmap_address.formatted_address}
job_location = {offre.location && offre.location.gmap_address.formatted_address}
job_ville = {jobVille}
job_dept = {jobDpt}
job_pays = {jobPays}
job_adr = {offre.location.gmap_address.formatted_address}
job_adr = {offre.location && offre.location.gmap_address.formatted_address}
job_date = {offre.published_at}
job_date_fin = {offre.unpublished_at}
job_temps_type= {tempsType}
@@ -853,16 +828,16 @@ function OffreDetail(props) {
{offre.video && (
<Fragment>
<Suspense fallback={renderLoader()}>
{/* <VideoVimeo {...isCandidature == 'true' ? 'classes={{ video: classes.videoOffre }}' : ''} videoId={Ar.last(_.split(offre.video.cdn_url, '/'))} autoplay='1' /> */}
<div className={classes.contentContainer}>
<Link href={`/Player?id=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${Ar.last(_.split(offre.video.cdn_url, '/'))}&type=Offre`} >
<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} />
<div className={classes.containerPoste}>
<Typography variant="h1" component="h1" gutterBottom className={classes.poste}>
<Typography variant="h4" component="h1" gutterBottom className={classes.poste}>
{offre.title} <br></br>
<span className={classes.posteEntreprise}>{offre.company.brand_name ? offre.company.brand_name : ""}</span>
</Typography>
@@ -870,12 +845,12 @@ function OffreDetail(props) {
</div>
<KeyboardArrowleftIcon className={classes.iconPlay} />
<Typography variant="h3" component="h3" className={classes.playerTexte}>
Lire la vidéo
Lire la vidéo.
</Typography>
</div>
</Link>
</div>
</Suspense>
<div className={classes.container}>
@@ -904,8 +879,8 @@ function OffreDetail(props) {
{/* <a href={entrepriseLink}> */}
{/* const entrepriseLink = (offre.company && `/Entreprise/${offre.company.id}-${_.kebabCase(offre.company.brand_name)}`); */}
<Link href={`/Player?id=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${Ar.last(_.split(offre.company.presentation_video.cdn_url, '/'))}&type=Entreprise`} >
<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} />
<Typography variant="h3" component="h3" gutterBottom className={ classes.voirEntreprise} align="center">
@@ -925,7 +900,8 @@ function OffreDetail(props) {
{offre.territories && territoryVideoId && (
<div className={classes.container + ' ' + classes.discoverContainerTerritory}>
<section>
<Link href={`/Player?id=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${territoryVideoId}&type=Territoire`} >
<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 : ''} />
<Typography variant="h3" component="h3" gutterBottom className={classes.title + ' ' + classes.voirTerritoire} align="center">
@@ -950,23 +926,23 @@ function OffreDetail(props) {
<section className={classes.stickyContainer}>
<a href={entrepriseLink} className={classes.lien}>
<Avatar className={classes.logo} classes={{ img: classes.MuiAvatarImg }}
src={logoUrl} alt={offre.company.brand_name && offre.company.brand_name} />
src={logoUrl} alt={offre.company && offre.company.brand_name && offre.company.brand_name} />
</a>
<Typography variant="h4" component="h4" className={classes.stickyTitle}>
{offre.title}
</Typography>
<a href={entrepriseLink} className={classes.lien}>
<Typography variant="h5" component="h5" className={classes.stickyEntreprise}>
{offre.company.brand_name && offre.company.brand_name}
{offre.company && offre.company.brand_name && offre.company.brand_name}
</Typography>
</a>
</section>
<section className={classes.IconTextContainerDesktop}>
<IconTextInline classes={{ icon: classes.iconTextIcon, text: classes.iconTextText }} variant="assignment" text={offre.extra.contract_type+dureeContrat} />
<IconTextInline classes={{ icon: classes.iconTextIcon, text: classes.iconTextText }} variant="assignment" text={offre.extra && offre.extra.contract_type+dureeContrat} />
{tempsTypeFr ?<IconTextInline classes={{ icon: classes.iconTextIcon, text: classes.iconTextText }} variant="watch_later" text={tempsTypeFr+nombreHeure } />:""}
<IconTextInline classes={{ icon: classes.iconTextIcon, text: classes.iconTextText }} variant="location_on" text={offre.location.gmap_address.formatted_address} />
<IconTextInline classes={{ icon: classes.iconTextIcon, text: classes.iconTextText }} variant="location_on" text={offre.location && offre.location.gmap_address.formatted_address} />
{teletravail && (<IconTextInline classes={{ icon: classes.iconTextIcon, text: classes.iconTextText }} variant="home" text={teletravail} /> )}
{offre.beneficiaire && (<IconTextInline classes={{ icon: classes.iconTextIcon, text: classes.iconTextText }} variant="business" text={offre.beneficiaire} /> )}
</section>
@@ -979,9 +955,9 @@ function OffreDetail(props) {
<Button
cyp="ButtonApply"
variant="contained"
className={classes.button}
>Postuler </Button>
className={classes.button}>
Postuler
</Button>
</a>
@@ -1009,16 +985,16 @@ function OffreDetail(props) {
</Hidden>
{/* PARTIE MOBILE */}
<Hidden mdUp>
<section className={classes.contentContainerMobile}>
<Link href={`/Player?id=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${Ar.last(_.split(offre.video.cdn_url, '/'))}&type=Offre`} >
<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.brand_name && offre.company.brand_name} />
<img src={isWidthUp('xs', props.width) ? imgUrlDesktopOffre : imgUrlOffre} alt={offre.company && offre.company.brand_name && offre.company.brand_name} />
<div >
<Typography variant="h1" component="h1" gutterBottom className={classes.posteMobile}>
{offre.title} <br></br>
<span className={classes.posteEntreprise}>{offre.company.brand_name ? offre.company.brand_name : ""}</span>
<span className={classes.posteEntreprise}>{offre.company && offre.company.brand_name ? offre.company.brand_name : ""}</span>
</Typography>
</div>
@@ -1044,7 +1020,7 @@ function OffreDetail(props) {
</Typography>
<a href={entrepriseLink} className={classes.lien}>
<Typography gutterBottom variant="subtitle1" className={classes.text}>
{offre.company.brand_name && offre.company.brand_name}
{offre.company && offre.company.brand_name && offre.company.brand_name}
</Typography>
</a>
{/* ville */}
@@ -1067,15 +1043,15 @@ function OffreDetail(props) {
</section>
<section>
{/* PARTIE MARQUE EMPLOYEUR MOBILE*/}
{offre.company.presentation_video && !offre.is_promoted && (
{offre.company && offre.company.presentation_video && !offre.is_promoted && (
<div className={classes.container + ' ' + classes.discoverContainerCompany}>
<section>
{/* <a href={entrepriseLink}> */}
{/* const entrepriseLink = (offre.company && `/Entreprise/${offre.company.id}-${_.kebabCase(offre.company.brand_name)}`); */}
<Link href={`/Player?id=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${Ar.last(_.split(offre.company.presentation_video.cdn_url, '/'))}&type=Entreprise`} >
<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} />
<Typography variant="h3" component="h3" gutterBottom className={ classes.voirEntrepriseMobile} align="center">
@@ -1095,7 +1071,8 @@ function OffreDetail(props) {
{offre.territories && territoryVideoId && (
<div className={classes.container + ' ' + classes.discoverContainerTerritory}>
<section>
<Link href={`/Player?id=/Offre/${offre.id}-${_.kebabCase(offre.title)}&videoId=${territoryVideoId}&type=Territoire`} >
<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 : ''} />
<Typography variant="h3" component="h3" gutterBottom className={classes.title + ' ' + classes.voirTerritoireMobile} align="center">
@@ -1116,4 +1093,4 @@ function OffreDetail(props) {
</Fragment>
)
}
export default withStyles(styles)(withWidth()(OffreDetail));
export default withStyles(styles)(OffreDetail);
+1 -1
View File
@@ -42,7 +42,7 @@ const styles = theme => ({
},
margin: '1vh 2vh 1vh 2vh',
[theme.breakpoints.up('sm')]: {
margin: '1vh 0 1vh 0',
margin: '2vh 0 2vh 0',
},
},
detailsContainer: {
@@ -22,8 +22,8 @@ const styles = theme => ({
},
askToInstallText: {
fontSize: '1.4em',
fontWeight: '500',
fontFamily: 'Dosis',
fontWeight: '600',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
installApp: {
width: '100%',
+74 -16
View File
@@ -32,6 +32,26 @@ const styles = theme => ({
display: 'flex',
flexDirection: 'column',
},
connexionRecruteur:{
textAlign : "center",
marginTop:"40px",
backgroundColor:"#1E2327",
padding:"30px 0",
width:"100%",
color:"#fff",
fontSize: '1em',
fontWeight: '300',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
enSavoirPlus:{
textAlign : "center",
textDecoration :"none",
color:"#fff",
fontSize: '1em',
fontWeight: '600',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
formText: {
padding: theme.spacing(0, 2),
paddingTop: theme.spacing(3),
@@ -101,6 +121,18 @@ const styles = theme => ({
marginTop: theme.spacing(6),
marginBottom: theme.spacing(2),
},
titre: {
fontWeight: 600,
fontSize: "1.875em",
marginBottom:"20px",
fontFamily: "Roboto",
},
cgu: {
fontFamily: "Roboto",
fontSize: "1em",
fontWeight: "300",
},
});
class Register extends React.Component {
@@ -108,6 +140,7 @@ class Register extends React.Component {
data: {
firstname: '',
lastname: '',
phone: '',
email: '',
password: '',
checkNewsletter: false,
@@ -118,7 +151,9 @@ class Register extends React.Component {
email:null,
password:null,
firstname:null,
phone:null,
lastname:null,
phone:null,
checkCGU:null
},
loading: false,
@@ -196,19 +231,12 @@ class Register extends React.Component {
<form className={classes.form}>
<TextField
className={classes.champ}
value={data.lastname}
onChange={this.onChange}
id="nom"
name="lastname"
label="Nom"
margin="normal"
variant="outlined"
required
error={!!errors.lastname}
helperText={!!errors.lastname && "Veuillez saisir votre nom."}
/>
<Typography
className={classes.titre}
align="left"
>
Inscription
</Typography>
<TextField
value={data.firstname}
onChange={this.onChange}
@@ -222,6 +250,33 @@ class Register extends React.Component {
helperText={!!errors.firstname && "Veuillez saisir votre prénom."}
/>
<TextField
className={classes.champ}
value={data.lastname}
onChange={this.onChange}
id="nom"
name="lastname"
label="Nom"
margin="normal"
variant="outlined"
required
error={!!errors.lastname}
helperText={!!errors.lastname && "Veuillez saisir votre nom."}
/>
<TextField
className={classes.champ}
value={data.phone}
onChange={this.onChange}
id="telephone"
name="phone"
label="Téléphone"
margin="normal"
variant="outlined"
/>
<TextField
value={data.email}
onChange={this.onChange}
@@ -233,14 +288,13 @@ class Register extends React.Component {
variant="outlined"
required
error={!!errors.email || !!erreurs}
autoComplete="username email"
helperText={!!errors.email ? "Saisissez une adresse e-mail valide." : !!erreurs && erreurs}
/>
<TextField
className={clsx(classes.margin, classes.textField)}
label="Password"
label="Mot de passe"
name="password"
id="adornment-password"
variant="outlined"
@@ -293,7 +347,7 @@ class Register extends React.Component {
label="Je déclare avoir pris connaissance et accepte les termes et les CGU *"
required
/>
<Link href={`/Cgu`} >Lien vers les CGU</Link>
<Link href={`/Cgu`} className={classes.cgu}>Lire les CGU</Link>
<Button type="submit" variant="contained" className={classes.button + ' ' + classes.buttonImportant + ' cypButtonRegister'} onClick={this.onRegister}>
S'inscrire
</Button>
@@ -321,6 +375,9 @@ class Register extends React.Component {
</Link>
</Typography>
</div>
<div className={classes.connexionRecruteur}>
Vous êtes recruteur ? <a className={classes.enSavoirPlus} href='https://recruteur.talentstube.com'><span >En savoir plus</span></a>
</div>
<Snack name= 'snackWarning'
variant= 'warning'
message={errors.message}
@@ -335,6 +392,7 @@ function mapStateToProps(state) {
return {
loading: !!state.user.loading,
errors: !!state.user.errors ?state.user.errors: {
phone:null,
email:null,
password:null,
firstname:null,
+4 -4
View File
@@ -95,11 +95,11 @@ export default function SocialShare(props) {
<a href={"http://twitter.com/share?url=" + encodeURIComponent(props.url)} target="_blank">
<Icon className={clsx(classes.icon, classes.TwitterIcon, 'fab fa-twitter')} color="secondary" />
</a>
<a href={"https://www.linkedin.com/shareArticle?mini=true&url=" + encodeURIComponent(props.url + "&title=Talent's Tube")} target="_blank">
<a href={"https://www.linkedin.com/shareArticle?mini=true&url=" + encodeURIComponent(props.url + "&title=Talents Tube")} target="_blank">
<Icon className={clsx(classes.icon, classes.LinkedinIcon, 'fab fa-linkedin-in')} color="secondary" />
</a>
{/* change because of https://github.com/zeit/next.js/blob/master/errors/invalid-href-passed.md */}
<a href={"mailto:?subject=Offre d'emploi Talent's Tube&body=Regardez cette offre : " + props.url} target="_blank"s>
<a href={"mailto:?subject=Offre d'emploi Talents Tube&body=Regardez cette offre : " + props.url} target="_blank"s>
<Icon className={clsx(classes.icon, classes.MailIcon, 'fas fa-envelope')} color="secondary" />
</a>
</Hidden>
@@ -110,11 +110,11 @@ export default function SocialShare(props) {
<a href={"http://twitter.com/share?url=" + encodeURIComponent(props.url)} target="_blank">
<Icon className={clsx(classes.icon, classes.TwitterIconMobile, 'fab fa-twitter')} color="secondary" />
</a>
<a href={"https://www.linkedin.com/shareArticle?mini=true&url=" + encodeURIComponent(props.url + "&title=Talent's Tube")} target="_blank">
<a href={"https://www.linkedin.com/shareArticle?mini=true&url=" + encodeURIComponent(props.url + "&title=Talents Tube")} target="_blank">
<Icon className={clsx(classes.icon, classes.LinkedinIconMobile, 'fab fa-linkedin-in')} color="secondary" />
</a>
{/* change because of https://github.com/zeit/next.js/blob/master/errors/invalid-href-passed.md */}
<a href={"mailto:?subject=Offre d'emploi Talent's Tube&body=Regardez cette offre : " + props.url} target="_blank"s>
<a href={"mailto:?subject=Offre d'emploi Talents Tube&body=Regardez cette offre : " + props.url} target="_blank"s>
<Icon className={clsx(classes.icon, classes.MailIconMobile, 'fas fa-envelope')} color="secondary" />
</a>
</Hidden>
+3 -3
View File
@@ -213,7 +213,7 @@ class Grid extends Component {
NextButton: {
fontSize: '0.9em',
fontWeight: '600',
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
textTransform: 'inherit',
marginLeft: '64px',
marginRight: '64px',
@@ -229,7 +229,7 @@ class Grid extends Component {
PreviousButton: {
fontSize: '0.9em',
fontWeight: '600',
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
textTransform: 'inherit',
marginLeft: '64px',
marginRight: '64px',
@@ -245,7 +245,7 @@ class Grid extends Component {
PageDropdown: {
fontSize: '0.9em',
fontWeight: '600',
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
// display: 'none',
},
}
+88 -7
View File
@@ -1,10 +1,17 @@
import React, { Component, useEffect } from 'react'
import { withStyles } from '@material-ui/core/styles'
import Router from 'next/router';
import RootContainer from '../atoms/RootContainer'
import ButtonBase from "@material-ui/core/ButtonBase";
import ArrowLeft from '@material-ui/icons/KeyboardArrowLeft';
import Typography from '@material-ui/core/Typography';
import { Hidden } from '@material-ui/core';
import { Button, Hidden } from '@material-ui/core';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogContentText from '@material-ui/core/DialogContentText';
import DialogTitle from '@material-ui/core/DialogTitle';
const styles = theme => ({
inner: {
@@ -61,14 +68,64 @@ const styles = theme => ({
fontSize: '0.8rem',
fontWeight: '500',
},
popup:{
fontFamily: 'Roboto',
color: '#1E2327',
fontSize: '0.8rem',
fontWeight: '500',
}
});
function LayoutBack(props) {
class LayoutBack extends Component {
constructor(props) {
super(props);
}
const { classes, height} = props;
state = {
open: false,
};
openDialog() {
this.setState({ open: true });
}
closeDialog() {
this.setState({ open: false });
}
refreshDialog() {
this.setState({ open: false });
window.location.reload();
}
// Add a listener to prevent browser page refresh
componentWillMount() {
if (typeof window !== "undefined") {
window.onbeforeunload = (e) => {
console.log('Stop this');
// this.openDialog();
e.preventDefault()
e.returnValue = '';
};
}
}
// Clear listener
componentWillUnmount() {
window.onbeforeunload = null
}
render() {
const { classes, height} = this.props;
//height fixed = height 100vh
var openStudio = this.props.openStudio ? 1 : 0;
const content = (height == 'fixed') ? classes.content+' '+classes.contentFixed : classes.content
return (
<RootContainer align='center'>
@@ -78,26 +135,50 @@ function LayoutBack(props) {
focusRipple
className={classes.back}
focusVisibleClassName={classes.focusVisible}
onClick={() => Router.back()}>
>
<ArrowLeft color="primary" classes={{ root: classes.icon }}></ArrowLeft>
{/* <Hidden mdUp className={classes.retour}></Hidden> */}
<Hidden smDown className={classes.retour}>Retour</Hidden>
<Hidden smDown className={classes.retour}>
<div onClick={this.props.step==1 || openStudio==1 ? this.openDialog.bind(this) : () => Router.back()}>Retour</div>
</Hidden>
<Dialog open={this.state.open}>
<DialogTitle className={classes.popup}> Souhaitez-vous poursuivre votre candidature ?</DialogTitle>
<DialogContent className={classes.popup}> Si vous cliquez sur le bouton Supprimer, tous les éléments associés à votre candidature (vidéo, CV) seront définitivement supprimés. </DialogContent>
<DialogActions className={classes.popup}>
<Button onClick={this.refreshDialog.bind(this)} >
Supprimer
</Button>
<Button onClick={this.closeDialog.bind(this)} autoFocus>
Poursuivre
</Button>
</DialogActions>
</Dialog>
</ButtonBase>
<Typography
component="h1"
align="center"
className={classes.title}
>
{props.text}
{this.props.text}
</Typography>
</div>
</div>
<div id="C" className={content}>
{props.children}
{this.props.children}
</div>
</RootContainer>
)
}
}
LayoutBack.defaultProps = {
step: 0,
openStudio:false
}
export default withStyles(styles)(LayoutBack)
+24 -30
View File
@@ -6,8 +6,9 @@ import RootContainer from '../atoms/RootContainer'
import ButtonBase from "@material-ui/core/ButtonBase";
import ArrowLeft from '@material-ui/icons/KeyboardArrowLeft';
import HideOnScroll from '../atoms/CollapsibleBack';
import SocialShare from '../organisms/SocialShare'
import withWidth, { isWidthUp } from '@material-ui/core/withWidth'
import Header from '../organisms/Header'
import HeaderEntreprise from '../organisms/HeaderPersonnalise'
import {AppBar,CssBaseline,Container,Toolbar,IconButton,Typography} from "@material-ui/core";
import Hidden from '@material-ui/core/Hidden';
import Link from 'next/link'
@@ -80,63 +81,56 @@ const styles = theme => ({
padding: theme.spacing(1.2, 2),
color: '#BBBCBD',
backgroundColor: '#F3F3F4',
},
lien:{
textDecoration:'none',
color:'#fff'
},
})
function LayoutCompany(props) {
const { classes, companyId } = props;
const { classes, companyId, companyLibelle } = props;
const socialShareUrl = typeof window !== 'undefined' ? window.location : publicRuntimeConfig.frontServerUrl + `/Entreprise/${companyId}-${_.kebabCase(companyLibelle)}`;
return (
<React.Fragment>
{isWidthUp('sm', props.width) ?
(<Header />)
:
(<HideOnScroll threshold={50}>
<AppBar className={classes.appBar}>
<Toolbar>
<ButtonBase name='back'
focusRipple
className={classes.back}
focusVisibleClassName={classes.focusVisible}
onClick={() => Router.back()}>
<ArrowLeft classes={{ root: classes.icon }}></ArrowLeft>
</ButtonBase>
</Toolbar>
</AppBar>
</HideOnScroll>)
}
<Container classes={{ root: classes.RootContainer }}>
<RootContainer>
<HeaderEntreprise retour="Entreprises" menu="Entreprises"/>
<div id="C" className={classes.content}>
{props.children}
</div>
<Hidden mdUp>
<div id="F" className={classes.foot}>
<Link href="#discover" >
<Button
variant="contained"
className={classes.button + ' cypButtonApply'}
classes={{ root: classes.rootButton}}
>
<a href={`/Reponse?companyId=${companyId}`} className={classes.lien }>Postuler</a>
</Button>
<SocialShare url={socialShareUrl} />
{/* <Link href="#discover" >
<Button
variant="contained"
className={classes.voirOffre + ' cypButtonApply'}
>Voir les offres</Button>
</Link>
<a
</Link> */}
{/* <a
href={`/Reponse?companyId=${companyId}`}
variant="contained"
className={classes.button}
classes={{ root: classes.rootButton }}
// onClick={() => Router.push(`/Reponse?companyId=${companyId}`)}
>
Candidature spontanée</a>
Candidature spontanée</a> */}
</div>
</Hidden>
</RootContainer>
</Container>
</React.Fragment>
)
}
+8 -14
View File
@@ -5,12 +5,14 @@ import Router from 'next/router';
import RootContainer from '../atoms/RootContainer'
import ButtonBase from "@material-ui/core/ButtonBase";
import ArrowLeft from '@material-ui/icons/KeyboardArrowLeft';
import Header from '../organisms/HeaderOffre'
import HeaderPersonnalise from '../organisms/HeaderPersonnalise'
import SocialShare from '../organisms/SocialShare'
import withWidth, { isWidthUp } from '@material-ui/core/withWidth'
import Hidden from '@material-ui/core/Hidden';
import Link from 'next/link'
import getConfig from 'next/config'
import _ from "lodash/string";
const { publicRuntimeConfig } = getConfig()
const styles = theme => ({
foot: {
display: 'flex',
@@ -90,17 +92,9 @@ function LayoutOffre(props) {
const socialShareUrl = typeof window !== 'undefined' ? window.location : publicRuntimeConfig.frontServerUrl + `/Offre/${offreId}-${_.kebabCase(offre.title)}`;
return (
<RootContainer>
{isWidthUp('xs', props.width) ?
(<Header />)
:
(<ButtonBase name='back'
focusRipple
className={classes.back}
focusVisibleClassName={classes.focusVisible}
onClick={() => Router.back()}>
<ArrowLeft classes={{ root: classes.icon }}></ArrowLeft>
</ButtonBase>)
}
<HeaderPersonnalise retour="Offres" menu="Offres d'emploi"/>
<div id="C" className={contentClass}>
{props.children}
</div>
@@ -154,4 +148,4 @@ LayoutOffre.propTypes = {
offre: PropTypes.object,
};
export default withStyles(styles)(withWidth()(LayoutOffre))
export default withStyles(styles)(LayoutOffre)
+1 -1
View File
@@ -8,7 +8,7 @@ const styles = theme => ({
alignItems: 'center',
textAlign: 'center',
justifyContent: 'center',
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontWeight: '500',
fontSize: '1em',
padding: theme.spacing(6,0),
+18 -6
View File
@@ -9,11 +9,24 @@ const styles = theme => ({
alignItems: 'center',
textAlign: 'center',
justifyContent: 'center',
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontWeight: '500',
fontSize: '1em',
padding: theme.spacing(6,0),
color: theme.palette.primary.main,
margin:'50px 0',
},
loaderGras:{
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
paddingTop:'10px',
fontSize: '1.875em',
fontWeight: '500',
marginBottom:'30px',
},
loaderSecondaire:{
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1em',
fontWeight: '300',
},
root: {
top:"200px",
@@ -26,13 +39,12 @@ const styles = theme => ({
class LoaderVideo extends React.Component {
render() {
const { classes } = this.props;
const { classes, textePrincipal, texteSecondaire } = this.props;
return (
<div className={classes.root}>
<div className={classes.loader + ' ' + 'alert alert-info'}><CircularProgress color="primary" />Veuillez ne pas quitter la page.<br/> Le temps de chargement peut varier de quelques secondes à plusieurs minutes en fonction de la qualité de votre connexion internet.<br/></div>
<div className={classes.loader }><CircularProgress color="primary" /><span className={classes.loaderGras }>{textePrincipal}</span><br/><span className={classes.loaderSecondaire }> {texteSecondaire}</span><br/></div>
<div >
<LinearProgress />
<LinearProgress color="secondary" />
</div>
</div>
)
+27 -4
View File
@@ -129,6 +129,9 @@ export default {
withCredentials: true
}).then(res => res)
},
},
cv:{
uploadMediaCv: (payload) => {
return axios.post("/api/mediaCv", payload, {
headers: {
@@ -142,12 +145,32 @@ export default {
countAdView: id => {
if (!!localStorage.ttJWT)
setAuthorizationHeader(localStorage.ttJWT)
axios.get(`api/adAjaxRecStat/${id}`)
let continuerAds = true;
if (sessionStorage.getItem("ads"+id)){
continuerAds=false;
}
if( continuerAds){
axios.get(`api/adAjaxRecStat/${id}`)
sessionStorage.setItem('ads'+id, id);
}
},
countCompanyView: id => {
if (!!localStorage.ttJWT)
setAuthorizationHeader(localStorage.ttJWT)
axios.get(`api/companyAjaxRecStat/${id}`)
if (!!localStorage.ttJWT){
setAuthorizationHeader(localStorage.ttJWT);
}
let continuer = true;
if (sessionStorage.getItem("companies"+id)){
continuer=false;
}
if( continuer){
axios.get(`api/companyAjaxRecStat/${id}`);
sessionStorage.setItem('companies'+id, id);
}
},
}
+2 -2
View File
@@ -55,8 +55,8 @@ module.exports = withPlugins(
blogUrl: 'https://blog.talentstube.com',
frontServerUrl: 'https://pp.app.talentstube.com/',
cvThequeUrl: 'https://recruteur.talentstube.com',
version : 'V2.4.2',
adListDefaultUrl: '/statique/images/default/default_picture_company.svg',
version : 'V2.10.2',
adListDefaultUrl: '/statique/images/default/default_picture_company.jpg',
cachedMediaUrl: '/media/cache/profile_thumb/uploads/img/',
postedContentUrl: '/uploads/img/',
postedContentCv: '/uploads/cv/',
+555 -24
View File
@@ -1,28 +1,559 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://app.talentstube.com/Candidature</loc>
<lastmod>2019-09-17</lastmod>
</url>,<url>
<loc>https://app.talentstube.com/Cgu</loc>
<lastmod>2019-09-17</lastmod>
</url>,<url>
<loc>https://app.talentstube.com/Confidentialite</loc>
<lastmod>2019-11-04</lastmod>
</url>,<url>
<loc>https://app.talentstube.com/Entreprises</loc>
<lastmod>2019-09-17</lastmod>
</url>,<url>
<loc>https://app.talentstube.com/Help</loc>
<lastmod>2019-10-11</lastmod>
</url>,<url>
<loc>https://app.talentstube.com/Login</loc>
<lastmod>2019-10-14</lastmod>
</url>,<url>
<loc>https://app.talentstube.com/MentionsLegales</loc>
<lastmod>2019-11-04</lastmod>
</url>,<url>
<loc>https://app.talentstube.com/Offres</loc>
<lastmod>2019-10-16</lastmod>
<loc>https://www.talentstube.com/Entreprise/33190-les-francas-doubs/</loc>
<lastmod>2021-04-26</lastmod>
<priority>1.00</priority>
</url>
</urlset>
<url>
<loc>https://www.talentstube.com/Offre/148-educateur-de-jeunes-enfants-f-h</loc>
<lastmod>2021-04-26</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/146-animateur-ado-f-h</loc>
<lastmod>2021-04-17</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/144-soudeur-f-h</loc>
<lastmod>2021-04-19</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/143-dessinateur-3-d-f-h</loc>
<lastmod>2021-04-19</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/142-charge-daffaires-f-h</loc>
<lastmod>2021-03-24</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=146&amp;url=/Offre/146-animateur-ado-f-h&amp;videoId=535772088&amp;typeEntite=Offre&amp;nameCompany=Les%20Francas%20du%20Doubs&amp;nameOffre=Animateur%20Ado%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=135&amp;url=/Offre/135-commercial-b-to-c-f-h&amp;videoId=502499843&amp;typeEntite=Offre&amp;nameCompany=Fym%20Action&amp;nameOffre=Commercial%20B%20to%20C%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=135&amp;url=/Offre/135-commercial-b-to-c-f-h&amp;videoId=502499843&amp;typeEntite=Offre&amp;nameCompany=Fym%20Action&amp;nameOffre=Commercial%20B%20to%20C%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=135&amp;url=/Offre/135-commercial-b-to-c-f-h&amp;videoId=502499843&amp;typeEntite=Offre&amp;nameCompany=Fym%20Action&amp;nameOffre=Commercial%20B%20to%20C%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=133&amp;url=/Offre/133-gestionnaire-de-copropriete-f-h&amp;videoId=500395879&amp;typeEntite=Offre&amp;nameCompany=Cabinet%20JOURDAN&amp;nameOffre=Gestionnaire%20de%20co%20propriete</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=132&amp;url=/Offre/132-comptable-f-h&amp;videoId=495504495&amp;typeEntite=Offre&amp;nameCompany=Cabinet%20JOURDAN&amp;nameOffre=Comptable%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=130&amp;url=/Offre/130-assistant-f-h&amp;videoId=495156742&amp;typeEntite=Offre&amp;nameCompany=Cabinet%20JOURDAN&amp;nameOffre=Assistant%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=131&amp;url=/Offre/131-poseur-f-h&amp;videoId=494089386&amp;typeEntite=Offre&amp;nameCompany=TPC%20Ouest&amp;nameOffre=Poseur%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=131&amp;url=/Offre/140-aide-a-domicile-f-h&amp;videoId=507891163&amp;typeEntite=Offre&amp;nameCompany=ADMR56&amp;nameOffre=Aide%20a%20domicile</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=135&amp;url=/Offre/129-commercial-b-to-b-f-h&amp;videoId=491331138&amp;typeEntite=Offre&amp;nameCompany=Fym%20Action&amp;nameOffre=Commercial%20B%20to%20b%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=122&amp;url=/Offre/122-chauffeurs-spl-f-h&amp;videoId=482599011&amp;typeEntite=Offre&amp;nameCompany=AER%20Recyclage&amp;nameOffre=Chauffeurs%20SPL%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=128&amp;url=/Offre/128-techniciens-poseurs-f-h&amp;videoId=485471109&amp;typeEntite=Offre&amp;nameCompany=Pro%20Fermetures&amp;nameOffre=Techniciens%20Poseurs%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=113&amp;url=/Offre/113-aide-a-domicile-f-h&amp;videoId=440702903&amp;typeEntite=Offre&amp;nameCompany=Onela&amp;nameOffre=Aide%20à%20domicile%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=120&amp;url=/Offre/120-technico-commercial-f-h&amp;videoId=462942715&amp;typeEntite=Offre&amp;nameCompany=Temporis&amp;nameOffre=Technico-Commercial%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=115&amp;url=/Offre/115-technicien-ramoneur-fumiste-f-h&amp;videoId=460206945&amp;typeEntite=Offre&amp;nameCompany=La%20Centrale%20des%20Ramoneurs&amp;nameOffre=Technicien%20Ramoneur%20/%20Fumiste%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=109&amp;url=/Offre/109-equipier-de-plateforme-polyvalent-f-h&amp;videoId=422692890&amp;typeEntite=Offre&amp;nameCompany=AER%20Recyclage&amp;nameOffre=Equipier%20de%20plateforme%20polyvalent%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=112&amp;url=/Offre/112-conseillers-technico-commerciaux-h-f&amp;videoId=438478115&amp;typeEntite=Offre&amp;nameCompany=Pro%20Fermetures&amp;nameOffre=Conseillers%20Technico-Commerciaux%20(H/F)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=111&amp;url=/Offre/111-couvreur-etancheur-f-h&amp;videoId=432410136&amp;typeEntite=Offre&amp;nameCompany=Blandin&amp;nameOffre=Couvreur/Étancheur%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=108&amp;url=/Offre/108-plombier-chauffagiste-f-h&amp;videoId=398509552&amp;typeEntite=Offre&amp;nameCompany=Blandin&amp;nameOffre=Plombier/Chauffagiste%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=107&amp;url=/Offre/107-operateur-soudeur-chaudronnier-f-h&amp;videoId=397982745&amp;typeEntite=Offre&amp;nameCompany=GEIQ%20Industrie%2044&amp;nameOffre=Opérateur%20Soudeur%20/%20Chaudronnier%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=101&amp;url=/Offre/101-conducteurs-routiers-f-h&amp;videoId=391023366&amp;typeEntite=Offre&amp;nameCompany=Lactalis%20Logistique%20et%20Transports&amp;nameOffre=Conducteurs%20routiers%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=103&amp;url=/Offre/103-agents-de-quai-f-h&amp;videoId=391023871&amp;typeEntite=Offre&amp;nameCompany=Lactalis%20Logistique%20et%20Transports&amp;nameOffre=Agents%20de%20quai%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=77&amp;url=/Offre/77-commercial-sedentaire-en-vente-directe-b-to-b-h-f&amp;videoId=343666512&amp;typeEntite=Offre&amp;nameCompany=Télémaque&amp;nameOffre=Commercial%20sédentaire%20en%20vente%20directe%20B%20to%20B%20(H/F)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=102&amp;url=/Offre/102-preparateurs-de-commandes-f-h&amp;videoId=391023988&amp;typeEntite=Offre&amp;nameCompany=Lactalis%20Logistique%20et%20Transports&amp;nameOffre=Préparateurs%20de%20commandes%20(F/H)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=46&amp;url=/Offre/46-conducteurs-routiers-h-f&amp;videoId=273464203&amp;typeEntite=Offre&amp;nameCompany=Groupe%20MOUSSET&amp;nameOffre=Conducteurs%20routiers%20(H/F)</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=32518&amp;url=/Entreprise/32518-cabinet-jourdan&amp;videoId=491607083&amp;typeEntite=Entreprise&amp;nameCompany=Cabinet%20JOURDAN&amp;nameOffre=</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=32507&amp;url=/Entreprise/32507-tpc-ouest&amp;videoId=489836459&amp;typeEntite=Entreprise&amp;nameCompany=TPC%20Ouest&amp;nameOffre=</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=32355&amp;url=/Entreprise/32355-hyphae&amp;videoId=478847996&amp;typeEntite=Entreprise&amp;nameCompany=HYPHAE&amp;nameOffre=</loc>
<lastmod>2021-02-04</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=21247&amp;url=/Entreprise/21247-lactalis-logistique-et-transports&amp;videoId=391023777&amp;typeEntite=Entreprise&amp;nameCompany=Lactalis%20Logistique%20et%20Transports&amp;nameOffre=</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=19800&amp;url=/Entreprise/19800-silvadec&amp;videoId=386500340&amp;typeEntite=Entreprise&amp;nameCompany=Silvadec&amp;nameOffre=</loc>
<lastmod>2021-02-04</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=19205&amp;url=/Entreprise/19205-intermarche-logistique-alimentaire-international&amp;videoId=385268706&amp;typeEntite=Entreprise&amp;nameCompany=Intermarché%20Logistique%20Alimentaire%20International&amp;nameOffre=</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Player?id=12480&amp;url=/Entreprise/12480-fym-action&amp;videoId=345898361&amp;typeEntite=Entreprise&amp;nameCompany=Fym%20Action&amp;nameOffre=</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/143-dessinateur-3d-f-h</loc>
<lastmod>2021-03-31</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/140-aide-a-domicile-f-h</loc>
<lastmod>2021-02-10</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/133-gestionnaire-de-copropriete-f-h</loc>
<lastmod>2021-01-29</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprises</loc>
<lastmod>2021-01-18</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com</loc>
<lastmod>2021-03-09</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offres</loc>
<lastmod>2021-01-18</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/134-assistant-administratif-et-commercial-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/135-commercial-b-to-c-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/130-assistant-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/131-poseur-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/132-comptable-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/129-commerciaux-b-to-b-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/128-techniciens-poseurs-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/122-chauffeurs-spl-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/115-technicien-ramoneur-fumiste-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/109-equipier-de-plateforme-polyvalent-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/111-couvreur-etancheur-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/107-operateur-soudeur-chaudronnier-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/103-agents-de-quai-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/102-preparateurs-de-commandes-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/46-conducteurs-routiers-h-f</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/32507-tpc-ouest</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/32355-hyphae</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/28481-onela</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/28172-pro-fermetures</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/26064-aer-recyclage</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/21247-lactalis-logistique-et-transports</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/19800-silvadec</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/19205-intermarche-logistique-alimentaire-international</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/18143-l-n-u-f-lisieux</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/17467-l-n-u-f-vallet</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/16785-nachos</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/16639-fast-point</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/16247-sasp</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/16015-la-veggisserie</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/16007-bforpu-b</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/15797-sinay</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/15559-monibrand</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/13464-jpa</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/12531-grand-ouest-etiquettes</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/12480-fym-action</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/11592-youston</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/11413-les-vergers-de-chateaubourg</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/11345-telemaque</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/9138-vital-concept</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/8639-mma-questembert</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/7593-opticultures</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/7174-atlantem</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/7004-la-table-de-la-desirade</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/6898-le-ptit-club</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/6555-mazars</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/6363-square-habitat</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/5250-linpac-packaging-pontivy-groupe-klockner-pentaplast</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/4211-progressis-ge</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/4097-a-2-com</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/4088-venetis</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/4059-eiffage-construction-grand-ouest</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/3381-mairie-saint-hilaire-de-riez</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/2958-skiold-acemo</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/2527-groupe-mousset</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/2341-temporis</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/1899-faurecia</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/1691-groupe-syselec</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/1467-groupe-rocher-operations</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/1297-albea</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/438-bouyer-leroux</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/266-mgdis</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/157-medaviz</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/95-multiplast</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/52-talents-tube</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/46-actual</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/18-coriolis-composites</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/17-thibault-bergeron</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
</urlset>
+3 -1
View File
@@ -36,7 +36,7 @@
"next-optimized-images": "^1.4.1",
"next-redux-saga": "^4.0.2",
"next-redux-wrapper": "^3.0.0-alpha.2",
"next-seo": "^4.7.3",
"next-seo": "^4.18.0",
"next-transpile-modules": "^2.3.1",
"node-mailjet": "^3.3.1",
"nodemailer": "^4.6.8",
@@ -61,6 +61,8 @@
"react-redux": "^7.0.3",
"react-redux-loading-bar": "^5.0.0",
"react-router-dom": "^5.2.0",
"react-select": "^3.1.1",
"react-slick": "^0.28.1",
"react-sticky-box": "^0.9.3",
"react-swipeable-views": "^0.13.3",
"reactstrap": "^6.4.0",
+244 -4
View File
@@ -1,5 +1,5 @@
import React from 'react';
import React, { useState } from 'react'
import { connect } from "react-redux";
import PropTypes from 'prop-types';
import _ from "lodash"
@@ -12,8 +12,34 @@ import { fetchJobsAnsweredRequest } from '../actions/answer'
import { AnswersSelector } from '../reducers/answers'
import Head from 'next/head'
import Link from 'next/link';
import AppBar from '@material-ui/core/AppBar';
import Paper from '@material-ui/core/Paper';
import Tabs from '@material-ui/core/Tabs';
import Tab from '@material-ui/core/Tab';
import Box from '@material-ui/core/Box';
import GridBouton from '@material-ui/core/Grid';
import IconButton from '@material-ui/core/IconButton';
import AccountIcon from '@material-ui/icons/AccountCircle';
import MovieIcon from '@material-ui/icons/Movie';
import DescriptionIcon from '@material-ui/icons/Description';
const styles = theme => ({
menu: {
flexGrow: 1,
},
menu2: {
flexGrow: 1,
textAlign: 'center',
justifyContent: 'center',
padding: theme.spacing(2),
},
indicatorColor:{
backgroundColor: theme.palette.primary.main,
},
textColor:{
color: theme.palette.primary.dark,
},
root: {
position: 'relative',
textAlign: 'center',
@@ -33,7 +59,7 @@ const styles = theme => ({
backgroundColor: theme.palette.primary.main,
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
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="/profileStep";
}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={"/profileStep#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={"/profileStep#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={"/profileStep#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}
+1 -1
View File
@@ -22,7 +22,7 @@ const styles = theme => ({
bottom: 0,
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
padding: theme.spacing(3, 0),
+1 -1
View File
@@ -22,7 +22,7 @@ const styles = theme => ({
bottom: 0,
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
padding: theme.spacing(3, 0),
+939 -176
View File
File diff suppressed because it is too large Load Diff
+15 -5
View File
@@ -11,9 +11,8 @@ import CompanyRow from "../components/organisms/CompanyRow"
import { fetchCompaniesRequest } from '../actions/companies'
import { CompaniesSelector } from '../reducers/companies'
import { connect } from "react-redux";
import Head from 'next/head'
import OgHead from '../components/atoms/OgHead';
import { SocialProfileJsonLd } from 'next-seo';
const styles = theme => ({
root: {
position: 'relative',
@@ -45,7 +44,7 @@ const styles = theme => ({
},
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
textAlign: 'center',
@@ -72,7 +71,7 @@ class Entreprises extends React.Component {
const { publicRuntimeConfig } = getConfig();
const socialShareUrl = typeof window !== 'undefined' ? window.location
: publicRuntimeConfig.frontServerUrl + `/Entreprises`;
const DefaultUrl = publicRuntimeConfig.symphonyUrl + "/img/default_picture_svg"
const DefaultUrl = publicRuntimeConfig.symphonyUrl + "img/default_picture_svg"
const imgUrl = DefaultUrl ;
return (
<LayoutGrid backLink="/">
@@ -103,7 +102,18 @@ class Entreprises extends React.Component {
image={imgUrl}
seo_key="Recrutement, video"
></OgHead>
></OgHead>
<SocialProfileJsonLd
type="Talents Tube"
name="Talents Tube"
url="https://www.talentstube.com"
sameAs={[
'https://www.facebook.com/TalentsTuber',
'https://www.instagram.com/talents.tube/',
'https://www.linkedin.com/company/talentstube/',
'https://twitter.com/TalentsTuber',
]}
/>
<Typography gutterBottom component="h1"
className={classes.title}>
Les entreprises en <span className={classes.primary}>vidéo</span>
+1 -1
View File
@@ -25,7 +25,7 @@ const styles = theme => ({
},
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
padding: theme.spacing(3, 0),
+4 -10
View File
@@ -136,7 +136,7 @@ const styles = theme => ({
},
buttonImportant: {
marginTop: theme.spacing(6),
},
}
});
const recaptchaRef = React.createRef();
@@ -232,15 +232,9 @@ class LoginPage extends React.Component {
<Loader />
)}
{!loading && (
<Fragment>
<Register linkedInAuth={this.linkedInAuth} facebookAuth={this.facebookAuth} erreurs={errors.message} />
</Fragment>
<Fragment>
<Register linkedInAuth={this.linkedInAuth} facebookAuth={this.facebookAuth} erreurs={errors.message} />
</Fragment>
)}
</div>
{/* <Snack name={success ? 'snackSuccess' : 'snackWarning'}
+48 -10
View File
@@ -83,7 +83,7 @@ const styles = theme => ({
formLink: {
paddingLeft: theme.spacing(1),
fontWeight: '500',
cursor: 'pointer',
color: theme.palette.primary.dark,
},
forgetPasswordText: {
marginTop: theme.spacing(2),
@@ -138,6 +138,32 @@ const styles = theme => ({
buttonImportant: {
marginTop: theme.spacing(6),
},
titre: {
fontWeight: 600,
fontSize: "1.875em",
marginBottom:"20px",
fontFamily: "Roboto",
},
connexionRecruteur:{
textAlign : "center",
marginTop:"40px",
backgroundColor:"#1E2327",
padding:"30px 0",
width:"100%",
color:"#fff",
fontSize: '1em',
fontWeight: '300',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
enSavoirPlus:{
textAlign : "center",
textDecoration :"none",
color:"#fff",
fontSize: '1em',
fontWeight: '600',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
});
const recaptchaRef = React.createRef();
@@ -273,6 +299,12 @@ class LoginPage extends React.Component {
<TabContainer dir={'x'}>
<div className={classes.tabContainer}>
<form className={classes.form} onSubmit={this.onSubmit}>
<Typography
className={classes.titre}
align="left"
>
Connexion
</Typography>
<TextField
value={data.email}
id="email"
@@ -345,16 +377,22 @@ class LoginPage extends React.Component {
{/* <SocialButtonsAuth linkedInAuth={this.linkedInAuth} facebookAuth={this.facebookAuth} /> */}
<div className={classes.form}>
<Typography
paragraph={true}
align="center"
className={classes.formText}
>Je ne possède pas de compte Talents Tube ?
<Link href="/Inscription">S'inscrire</Link>
</Typography>
<Typography
paragraph={true}
align="center"
className={classes.formText}
>Je ne possède pas de compte Talents Tube ?
<Link href={"/Inscription"} >
<span className={classes.formLink}>
S'inscrire
</span>
</Link>
</Typography>
</div>
<div className={classes.connexionRecruteur}>
Vous êtes recruteur ? <a className={classes.enSavoirPlus} href='https://recruteur.talentstube.com'><span >Connexion</span></a>
</div>
<div className={classes.form}>
<Typography
+1 -1
View File
@@ -22,7 +22,7 @@ const styles = theme => ({
bottom: 0,
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
padding: theme.spacing(3, 0),
+30 -7
View File
@@ -4,9 +4,11 @@ import { connect } from "react-redux";
import PropTypes from 'prop-types';
import getConfig from 'next/config'
import { withStyles } from '@material-ui/core/styles';
import OgHead from '../components/atoms/OgHead'
import RootContainer from '../components/atoms/RootContainer'
import LayoutOffre from "../components/templates/LayoutOffre";
const OffreDetail = lazy(() => import('../components/organisms/OffreDetail'));
//import OffreDetail from "../components/organisms/OffreDetail";
// const OffreDetail = lazy(() => import('../components/organisms/OffreDetail'));
import OffreDetail from "../components/organisms/OffreDetail";
import { fetchJobRequest, clearAd, countAdViewRequest } from '../actions/ads'
import _ from "lodash/string";
const renderLoader = () => <p>Chargement</p>;
@@ -15,9 +17,12 @@ const styles = theme => ({
});
const { publicRuntimeConfig } = getConfig()
let descriptionSEO = ""
let titleSEO = ""
class Offre extends React.Component {
componentDidMount() {
localStorage.setItem('loginRedirect', window.location.pathname)
localStorage.setItem('adId', this.props.offre.id)
@@ -33,12 +38,30 @@ class Offre extends React.Component {
}
render() {
const { classes, offre } = this.props;
const socialShareUrl = typeof window !== 'undefined' ? window.location : publicRuntimeConfig.frontServerUrl + `/Offre/${offre.id}-${_.kebabCase(offre.title)}`;
descriptionSEO=""
offre.company && offre.company.brand_name ? descriptionSEO += offre.company.brand_name : ""
descriptionSEO += " recrute un(e) "+offre.title+", "+(offre.location && offre.location.gmap_address.formatted_address)+". Envoyez votre candidature vidéo"
titleSEO = "Offre d'emploi "+offre && offre.title && offre.title.replace(' (F/H)', '')+", "+(offre.location && offre.location.gmap_address.formatted_address)+". Envoyez votre candidature vidéo"
const socialShareUrl = typeof window !== 'undefined' ? window.location : publicRuntimeConfig.frontServerUrl + `Offre/${offre.id}-${_.kebabCase(offre.title)}`;
const DefaultUrl = "https://blog.talentstube.com/wp-content/uploads/2021/01/default_picture_company.jpg"
const imgUrl = (offre.company && offre.company.presentation_video && offre.company.presentation_video.thumbnails && offre.company.presentation_video.thumbnails[0] && offre.company.presentation_video.thumbnails[0].sizes[3]) ? offre.company.presentation_video.thumbnails[0].sizes[3].link : DefaultUrl
const imgUrlDesktop = (offre.company && offre.company.presentation_video && offre.company.presentation_video.thumbnails && offre.company.presentation_video.thumbnails[0] && offre.company.presentation_video.thumbnails[0].sizes[4]) ? offre.company.presentation_video.thumbnails[0].sizes[4].link : DefaultUrl
const imgUrlOffre = (offre && offre.video && offre.video.thumbnails && offre.video.thumbnails[0] && offre.video.thumbnails[0].sizes[3]) ? offre.video.thumbnails[0].sizes[3].link : DefaultUrl
const imgUrlDesktopOffre = (offre && offre.video && offre.video.thumbnails && offre.video.thumbnails[0] && offre.video.thumbnails[0].sizes[4]) ? offre.video.thumbnails[0].sizes[4].link : DefaultUrl
return (
<LayoutOffre backLink="/Offres" offreId={offre.id} offre={offre} isProvided={offre.is_promoted}>
<RootContainer>
<OgHead seo_title={titleSEO}
seo_description={descriptionSEO}
seo_url={socialShareUrl}
image={imgUrlOffre}
></OgHead>
<LayoutOffre backLink="/Offres" offreId={offre.id} offre={offre} isProvided={offre.is_promoted}>
{/* <Suspense fallback={renderLoader()}><OffreDetail offre={offre}/></Suspense> */}
<Suspense fallback={renderLoader()}><OffreDetail offre={offre}/></Suspense>
</LayoutOffre>
<OffreDetail offre={offre}/>
</LayoutOffre>
</RootContainer>
);
}
+15 -6
View File
@@ -11,11 +11,9 @@ import OffreRow from "../components/organisms/OffreRow"
import Typography from '@material-ui/core/Typography';
import { fetchJobsRequest, togglePromotedFilterRequest} from '../actions/ads'
import { AdsSelector } from '../reducers/ads'
import { TextField } from '@material-ui/core';
import Head from 'next/head'
import OgHead from '../components/atoms/OgHead';
import getConfig from 'next/config'
import { SocialProfileJsonLd } from 'next-seo';
const styles = theme => ({
root: {
@@ -40,7 +38,7 @@ const styles = theme => ({
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
textAlign: 'center',
@@ -104,7 +102,7 @@ class Offres extends React.Component {
const { publicRuntimeConfig } = getConfig();
const socialShareUrl = typeof window !== 'undefined' ? window.location
: publicRuntimeConfig.frontServerUrl + `/Offres`;
const DefaultUrl = publicRuntimeConfig.symphonyUrl + "/img/default_picture_svg"
const DefaultUrl = publicRuntimeConfig.symphonyUrl + "img/default_picture_svg"
const imgUrl = DefaultUrl ;
return (
<LayoutGrid backLink="/">
@@ -114,7 +112,18 @@ class Offres extends React.Component {
image={imgUrl}
seo_key="Recrutement, video"
></OgHead>
></OgHead>
<SocialProfileJsonLd
type="Talents Tube"
name="Talents Tube"
url="https://www.talentstube.com"
sameAs={[
'https://www.facebook.com/TalentsTuber',
'https://www.instagram.com/talents.tube/',
'https://www.linkedin.com/company/talentstube/',
'https://twitter.com/TalentsTuber',
]}
/>
<Typography gutterBottom component="h1"
className={classes.title}>
+1 -1
View File
@@ -39,7 +39,7 @@ const styles = theme => ({
}
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
padding: theme.spacing(3, 0),
+69 -17
View File
@@ -1,13 +1,17 @@
import React, { Component, Fragment,lazy, Suspense } from 'react';
import React, { Component, Fragment,lazy, Suspense, useEffect } from 'react';
import { withStyles } from '@material-ui/core/styles';
import Typography from '@material-ui/core/Typography'
import LayoutBackUrl from '../components/templates/LayoutBackUrl';
import RootContainer from '../components/atoms/RootContainer'
import Router from 'next/router';
import Head from 'next/head'
// const VideoVimeo = lazy(() => import('../components/atoms/VideoVimeo'));
import VideoVimeo from '../components/atoms/VideoVimeo';
import queryString from 'query-string';
import { fetchJobRequest, clearAd, countAdViewRequest } from '../actions/ads'
const renderLoader = () => <p>Chargement</p>;
import { NextSeo } from 'next-seo';
import dynamic from 'next/dynamic'
const styles = theme => ({
player: {
background:'#1E2327',
@@ -29,7 +33,7 @@ const styles = theme => ({
bottom: 0,
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
padding: theme.spacing(3, 0),
@@ -49,31 +53,79 @@ const styles = theme => ({
}
})
let params = dynamic( () => window.location.search, {ssr: false} )
class Player extends Component {
constructor(props)
{
super(props);
var today = new Date(),
date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
this.state = {
date: date
};
console.log("LOCATION SEARCH");
console.log(params);
}
render() {
const { classes } = this.props
const params = queryString.parse(location.search);
console.log(params.id);
console.log(params.type);
console.log(params.videoId);
let url = params.id;
const { classes, id, url, typeEntite, videoId, nameCompany, nameOffre } = this.props
const urlEnv = process.env.NODE_ENV;
//pour la MEP
{/* A ENLEVER EN PROD */}
let nofollow = false;
urlEnv == "development" ? nofollow = true : nofollow = true;
console.log(id);
console.log(typeEntite);
let typeVideo= null;
let titleVideo= null;
let descriptionVideo= null;
if(typeEntite=="Offre"){
titleVideo=nameCompany+" recrute un(e)"+nameOffre
descriptionVideo=nameCompany+" recrute en vidéo un(e)"+nameOffre
}else if(typeEntite=="Entreprise"){
titleVideo="Découvrez l'entreprise "+nameCompany+" et ses offres d'emploi vidéo"
descriptionVideo="Découvrez l'entreprise "+nameCompany+" et ses offres d'emploi vidéo. Envoyez votre candidature spontanée en vidéo"
}else if(typeEntite=="Territoire"){
titleVideo="Découvrez le territoire "+nameCompany
descriptionVideo="Découvrez le territoire "+nameCompany
}
console.log(videoId);
return (
<LayoutBackUrl text="Player" url={url} >
<VideoVimeo classes={{ video: classes.video }} videoId={params.videoId} options="" autoplay='1' />
</LayoutBackUrl>
<RootContainer>
<NextSeo
title={titleVideo}
description={descriptionVideo}
noindex={nofollow}
nofollow={nofollow}
openGraph={{
title: titleVideo,
description: descriptionVideo,
url: "https://www.talentstube.com/Player?id="+id+"&url="+url+"&videoId="+videoId+"&typeEntite="+typeEntite+"&nameCompany="+nameCompany+"&nameOffre="+nameOffre,
type: 'video.movie',
video: {
// Multiple Open Graph actors is only available in version `7.0.2-canary.35`+ of next
releaseDate: this.state.date,
// Multiple Open Graph tags is only available in version `7.0.2-canary.35`+ of next
},
site_name: 'Talents Tube',
}}
/>
<LayoutBackUrl text="Player" url={url} >
<VideoVimeo classes={{ video: classes.video }} videoId={videoId} options="" autoplay='1' />
</LayoutBackUrl>
</RootContainer>
)
}
}
Player.getInitialProps = function (context) {
let { id, videoId,type } = context.query;
let { id, url,videoId,typeEntite, nameCompany, nameOffre } = context.query;
let {res} = context;
return {};
return {id:id, url:url, videoId:videoId, typeEntite:typeEntite, nameCompany:nameCompany, nameOffre:nameOffre};
}
+12 -8
View File
@@ -328,8 +328,9 @@ class Reponse extends React.Component {
render() {
const { loading, activeStep } = this.state;
const { classes, menu, offre, company } = this.props;
const logoUrl = (offre.company ? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + offre.company.logo : '');
const logoCompanyUrl = ((company && company.logo) ? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + company.logo : '');
const logoUrl = (offre.company ? publicRuntimeConfig.symphonyUrl + publicRuntimeConfig.cachedMediaUrl + offre.company.logo : logoCompanyUrl);
let rootStepper = activeStep === 0 ? (
classes.rootStepperDefault
@@ -337,18 +338,14 @@ class Reponse extends React.Component {
classes.rootStepperActive
)
return (
<LayoutBack text="Candidature">
<LayoutBack text="Candidature" step={this.state.activeStep} openStudio={this.state.openStudio}>
<Head>
<title>Candidature vidéo</title>
<meta name="description" content="Talent's tube, postulez en video." />
<meta name="description" content="Talents tube, postulez en video." />
<meta key="robots" name="robots" content="noindex, nofollow"></meta>
</Head>
{/* https://codesandbox.io/s/ii0us */}
{ loading ?
<LoaderVideo /> :
<Fragment>
<section className={classes.headerContainer}>
{ !!offre.company && (
@@ -356,6 +353,7 @@ class Reponse extends React.Component {
<div className={classes.titreContainer}>
<div className={classes.logoContainer}>
<Avatar className={classes.logo} classes={{ img: classes.MuiAvatarImg }} src={logoUrl} alt="companylogo"/>
</div>
<div className={classes.infoContainer}>
<Typography gutterBottom variant="h5" component="h1" className={classes.title}>
@@ -370,7 +368,7 @@ class Reponse extends React.Component {
)
}
{ !!company.brand_name && (<Fragment><div className={classes.logoContainer}>
{/* <Avatar className={classes.logo} classes={{ img: classes.MuiAvatarImg }} src={logoCompanyUrl} alt="companylogo"/> */}
<Avatar className={classes.logo} classes={{ img: classes.MuiAvatarImg }} src={logoCompanyUrl} alt="companylogo"/>
</div>
<div className={classes.infoContainer}>
<Typography gutterBottom variant="h5" component="h1" className={classes.title}>
@@ -384,6 +382,12 @@ class Reponse extends React.Component {
}
</section>
{ loading ?
<LoaderVideo textePrincipal="Votre candidature vidéo est en cours denvoi..." texteSecondaire="Veuillez rester sur la page pendant le chargement qui peut durer plusieurs minutes."/>
:
<Fragment>
<section className={classes.headerContainer}>
<Stepper activeStep={activeStep} classes={{ root: rootStepper }} className={classes.rootStepperContainer} alternativeLabel>
{steps.map((label, index) => {
+2 -2
View File
@@ -25,7 +25,7 @@ const styles = theme => ({
},
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
padding: theme.spacing(3, 0),
@@ -116,7 +116,7 @@ class ResetPassword extends Component {
align="center"
variant="h5"
>
Réinitialisation du mot de passe
Modifier mot de passe
</Typography>
{loading && (
+8 -5
View File
@@ -1,5 +1,5 @@
import React from 'react';
import PropTypes from 'prop-types';
// import PropTypes from 'prop-types';
import Document, { Head, Main, NextScript } from 'next/document';
import { ServerStyleSheets } from '@material-ui/styles';
import flush from 'styled-jsx/server';
@@ -31,11 +31,14 @@ class MyDocument extends Document {
/>
{/* PWA primary color */}
<meta name="theme-color" content={theme.palette.primary.main} />
<link rel="preload" href="/statique/css/fonts.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Dosis:600|Roboto:200,300,400,500,700,900&display=swap" rel="stylesheet">
</link>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDYV8IJGtIoWLfXJQQvIuDQ88n2aEuRgpg&libraries=places"></script>
<script type="text/javascript" src="/static/js/pwaInstaller.js" ></script>
<link rel="stylesheet" type="text/css" charset="UTF-8" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.css" />
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick-theme.min.css" />
<link rel="stylesheet" type="text/css" href="/statique/css/autocomplete.css" />
<script async 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
async
@@ -52,7 +55,7 @@ class MyDocument extends Document {
}}
/> */}
<script
<script defer
dangerouslySetInnerHTML={{
__html: `
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+537 -8
View File
@@ -12,14 +12,16 @@ import { connect } from 'react-redux'
import { fetchEmphasisJobsRequest } from "../actions/ads";
//const fetchEmphasisCompaniesRequest = lazy(() => import('../actions/companies'));
import { fetchEmphasisCompaniesRequest } from "../actions/companies";
import Loader from './../components/templates/loader'
import Loader from '../components/templates/loader'
import { isEmpty } from "lodash"
import NoResult from './../components/atoms/NoResult';
import NoResult from '../components/atoms/NoResult';
// import Head from 'next/head'
import dynamic from 'next/dynamic'
import OgHead from '../components/atoms/OgHead';
import getConfig from 'next/config'
import { BreadcrumbJsonLd } from 'next-seo';
import Slider from "react-slick";
import Hidden from '@material-ui/core/Hidden';
// const VideoSlider = dynamic(() => import('../components/organisms/ShortVideoHooker'), {
// ssr: false
// });
@@ -78,6 +80,9 @@ const styles = theme => ({
scrollerSectionCompany: {
backgroundColor: theme.palette.background.grey,
},
scrollerSectionSlider:{
backgroundColor: theme.palette.secondary.main,
},
card: {
margin: theme.spacing(1),
width: '96%',
@@ -122,7 +127,7 @@ const styles = theme => ({
color: theme.palette.secondary.text,
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
textAlign: 'center',
@@ -138,7 +143,233 @@ const styles = theme => ({
margin: 'auto',
},
},
choix: {
color:"#fff",
position: "absolute",
top: "0",
bottom: "0",
width: "100%",
height: "100%",
display: "flex",
alignItems: "flex-start"
},
choixMobile: {
color:"#fff",
width: "100%",
height: "100%",
display: "flex",
alignItems: "flex-start",
},
containerVideoGauche :{
position: "relative",
height:"100%",
width:"50%",
backgroundImage: 'url("/statique/images/accueil/trouver-un-job.jpg")',
backgroundRepeat: 'no-repeat',
backgroundPosition: "center",
backgroundSize: "cover",
backgroundBlendMode: 'darken',
backgroundColor: 'rgba(30,35,39,0.4)',
},
containerVideoDroite :{
position: "relative",
backgroundColor:"red",
height:"100%",
width:"50%",
backgroundImage: 'url("/statique/images/accueil/recruter-des-talents.jpg") ',
backgroundRepeat: 'no-repeat',
backgroundPosition: "center",
backgroundSize: "cover",
backgroundBlendMode: 'darken',
backgroundColor: 'rgba(30,35,39,0.5)',
},
containerVideoMobile :{
height:"100%",
width:"100%",
backgroundImage: 'url("/statique/images/accueil/trouver-un-job.jpg")',
padding :"0 30px",
backgroundRepeat: 'no-repeat',
backgroundPosition: "center",
backgroundSize: "cover",
backgroundBlendMode: 'darken',
backgroundColor: 'rgba(30,35,39,0.5)',
},
containerTitre :{
},
wrap :{
[theme.breakpoints.up('md')]: {
height: "85%",
width: "100%",
position: "relative",
},
height: "100%",
width: "100%",
position: "relative",
},
headerTitre :{
backgroundColor:"transparent",
height: "100px",
width: "100%",
position: "absolute",
top: "30px",
textAlign:"center",
color:"#fff",
zIndex : "1000"
},
headerTitreMobile :{
width: "100%",
textAlign:"center",
color:"#fff",
marginBottom:"30px"
},
blocRecruteur:{
backgroundColor:"#fff",
bottom:"40px",
left:"60px",
position: "absolute",
padding:"50px",
fontWeight: "600",
minWidth:"40%",
borderRadius:"5px",
},
blocCandidat:{
backgroundColor:"#fff",
bottom:"40px",
right:"60px",
position: "absolute",
padding:"50px",
fontWeight: "600",
minWidth:"40%",
borderRadius:"5px",
},
blocRecruteurMobile:{
backgroundColor:"#fff",
padding:"20px",
fontWeight: "600",
minWidth:"90%",
borderRadius:"5px",
margin :"15px 0"
},
blocCandidatMobile:{
backgroundColor:"#fff",
padding:"20px",
fontWeight: "600",
minWidth:"90%",
borderRadius:"5px",
margin :"60px 0 15px 0"
},
titreAccueil:{
fontSize:"2.5em",
textAlign:"center",
color:"#fff",
paddingTop:"0px",
fontWeight: "600",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
titreAccueil2:{
fontSize:"1.5em",
textAlign:"center",
color:"#fff",
paddingTop:"40px",
fontWeight: "400",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
titreAccueilMobile:{
fontSize:"2.5em",
textAlign:"center",
color:"#fff",
paddingTop:"0px",
fontWeight: "600",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
titreAccueil2Mobile:{
fontSize:"1.5em",
textAlign:"center",
color:"#fff",
paddingTop:"40px",
fontWeight: "400",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
},
jeSuis:{
fontSize:"1em",
textTransform: "uppercase",
color:"#1E2327",
textAlign: "left",
fontWeight: "300",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
marginBottom:"1em"
},
jeSuisMobile:{
fontSize:"1em",
textTransform: "uppercase",
color:"#1E2327",
textAlign: "center",
fontWeight: "300",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
marginBottom:"1em"
},
action:{
fontSize:"1.5em",
color:"#1E2327",
textAlign: "left",
fontWeight: "600",
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
marginBottom:"1.5em"
},
boutonCandidat:{
width:"100%",
},
boutonRecruteur:{
width:"100%",
color: theme.palette.secondary.main,
backgroundColor: theme.palette.primary.important,
},
boutonCandidatMobile:{
width:"100%",
margin : "0px !important"
},
boutonRecruteurMobile:{
width:"100%",
color: theme.palette.secondary.main,
backgroundColor: theme.palette.primary.important,
margin : "0px !important"
},
temoignage:{
textAlign:"center"
},
lien:{
textDecoration:'none',
color:'#fff'
},
alignVertical:{
verticalAlign:"middle !important",
maxHeight :"80px",
minHeight :"60px",
},
alignVerticalMobile:{
verticalAlign:"middle !important",
maxHeight :"70px",
minHeight :"70px",
},
sliderDiv:{
padding:"30px"
},
sliderDivMobile:{
display: "inline !important",
padding:"10px",
},
sliderContainerMobile:{
textAlign:"center"
}
});
///
class Index extends React.Component {
state = {
@@ -158,7 +389,22 @@ class Index extends React.Component {
}
render() {
const { classes } = this.props;
const settings = {
dots: false,
infinite: true,
slidesToShow: 5,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 2000
};
const settingsMobile = {
dots: false,
infinite: true,
slidesToShow: 2,
slidesToScroll: 2,
autoplay: true,
autoplaySpeed: 2000
};
const socialShareUrl = typeof window !== 'undefined' ? window.location
: publicRuntimeConfig.frontServerUrl ;
const DefaultUrl = publicRuntimeConfig.symphonyUrl + "/img/default_picture_svg"
@@ -172,10 +418,114 @@ class Index extends React.Component {
seo_key="Recrutement, video"
></OgHead>
<BreadcrumbJsonLd
itemListElements={[
{
position: 1,
name: 'Offres',
item: 'https://www.talentstube.com/Offres',
},
{
position: 2,
name: 'Entreprises',
item: 'https://www.talentstube.com/Offres',
},
{
position: 3,
name: 'Espace recruteur',
item: 'https://recruteur.talentstube.com/',
},
{
position: 4,
name: "Blog sur l'emploi",
item: 'https://blog.talentstube.com/',
},
]}
/>
<div className={classes.wrap}>
<Hidden smDown>
<header className={classes.headerTitre}>
<h1 className={classes.titreAccueil}>La rencontre doffres demploi et de candidatures en vidéo</h1>
<span className={classes.titreAccueil2}>
Parce que vous méritez mieux que du texte !
</span>
</header>
<section className={classes.choix}>
<div className={classes.containerVideoGauche}>
<div className={classes.blocCandidat}>
<div className={classes.jeSuis}>JE SUIS CANDIDAT</div>
<div className={classes.action}>Je trouve un job</div>
<Button
variant="contained"
color="primary"
onClick={() => Router.push('/Offres')}
className={classes.button + ' ' + classes.boutonCandidat}
>Découvrir les offres
</Button>
</div>
</div>
<div className={classes.containerVideoDroite}>
<div className={classes.blocRecruteur}>
<div className={classes.jeSuis}>JE SUIS recruteur</div>
<div className={classes.action}>Je recrute des talents</div>
<a href='https://recruteur.talentstube.com' className={classes.lien}>
<Button
variant="contained"
className={classes.button + ' ' + classes.boutonRecruteur}
>Déposer une offre
</Button>
</a>
</div>
</div>
</section>
</Hidden>
{/* PARTIE MOBILE */}
<Hidden mdUp>
<section className={classes.choixMobile}>
<div className={classes.containerVideoMobile}>
<div className={classes.headerTitreMobile}>
<h1 className={classes.titreAccueilMobile}>La rencontre doffres demploi et de candidatures en vidéo</h1>
<span className={classes.titreAccueil2Mobile}>
Parce que vous méritez mieux que du texte !
</span>
</div>
<div className={classes.blocCandidatMobile}>
<div className={classes.jeSuisMobile}>JE SUIS CANDIDAT</div>
<Button
variant="contained"
color="primary"
onClick={() => Router.push('/Offres')}
className={classes.button + ' ' + classes.boutonCandidatMobile}
>Je trouve un job
</Button>
</div>
<div className={classes.blocRecruteurMobile}>
<div className={classes.jeSuisMobile}>JE SUIS recruteur</div>
<a href='https://recruteur.talentstube.com' className={classes.lien}>
<Button
variant="contained"
className={classes.button + ' ' + classes.boutonRecruteurMobile}
>Je recrute des talents
</Button>
</a>
</div>
</div>
</section>
</Hidden>
</div>
<div className={classes.container}>
{/* <VideoSlider /> */}
<section className={classes.scrollerSection + ' ' + classes.scrollerSectionOffer}>
<div
className={classes.HorizontalScrollerOffre}
@@ -185,7 +535,7 @@ class Index extends React.Component {
className={classes.beforeTitle}>
à la une
</Typography>
<Typography gutterBottom component="h1"
<Typography gutterBottom component="h2"
className={classes.title}>
Les offres d'emploi en <span className={classes.primary}>vidéo</span>
</Typography>
@@ -224,7 +574,7 @@ class Index extends React.Component {
className={classes.beforeTitle}>
à la une
</Typography>
<Typography gutterBottom component="h1"
<Typography gutterBottom component="h2"
className={classes.title}>
Les entreprises en <span className={classes.primary}>vidéo</span>
</Typography>
@@ -256,6 +606,185 @@ class Index extends React.Component {
</Button>
</section>
<section className={classes.scrollerSection + ' ' + classes.scrollerSectionCompany}>
<div
className={classes.HorizontalScrollerOffre}
>
<div className={classes.titleContainer}>
<Typography gutterBottom
className={classes.beforeTitle}>
Témoignage
</Typography>
<Typography gutterBottom component="h2"
className={classes.title}>
Le recrutement en <span className={classes.primary}>vidéo</span>
</Typography>
</div>
<div className={classes.temoignage}>
{/* PARTIE DEsktop */}
<Hidden smDown>
<iframe width="70%" height="450" src="https://www.youtube.com/embed/sKh0u7Mbdps"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</Hidden>
{/* PARTIE MOBILE */}
<Hidden mdUp>
<iframe width="90%" height="450" src="https://www.youtube.com/embed/sKh0u7Mbdps"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</Hidden>
</div>
</div>
</section>
<section className={classes.scrollerSection + ' ' + classes.scrollerSectionSlider}>
{/* PARTIE DEsktop */}
<Hidden smDown>
<Slider ref={slider => (this.slider = slider)} {...settings}>
<a href="/Entreprise/21247-lactalis-logistique-et-transports">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Lactalis" src="/statique/images/logos/recrutement-video-lactalis.jpg"></img>
</div>
</a>
<a href="/Entreprise/28481-onela">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Onela" src="/statique/images/logos/recrutement-video-onela-service-a-domicile.jpg"></img>
</div>
</a>
<a href="/Entreprise/19205-intermarche-logistique-alimentaire-international">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Intermarché" src="/statique/images/logos/recrutement-video-intermarche.jpg"></img>
</div>
</a>
<a href="/Entreprise/4059-eiffage-construction-grand-ouest">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Eiffage" src="/statique/images/logos/recrutement-video-eiffage.jpg"></img>
</div>
</a>
<a href="/Entreprise/8639-mma-questembert">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi MMA" src="/statique/images/logos/recrutement-video-mma-assurances.jpg"></img>
</div>
</a>
<a href="/Entreprise/32987-admr-56">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi ADMR" src="/statique/images/logos/recrutement-video-ADMR.jpg"></img>
</div>
</a>
<a href="/Entreprise/13464-jpa">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi JPA" src="/statique/images/logos/recrutement-video-jpa.jpg"></img>
</div>
</a>
<a href="/Entreprise/2527-groupe-mousset">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Groupe Mousset" src="/statique/images/logos/recrutement-video-groupe-mousset.jpg"></img>
</div>
</a>
<a href="/Entreprise/1467-groupe-rocher-operations">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Groupe Rocher" src="/statique/images/logos/recrutement-video-groupe-rocher.jpg"></img>
</div>
</a>
<a href="/Entreprise/26064-aer-recyclage">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi AER Recyclage" src="/statique/images/logos/recrutement-video-aer-recyclage.jpg"></img>
</div>
</a>
<a href="/Entreprise/46-actual">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi Actual" src="/statique/images/logos/recrutement-video-actual.jpg"></img>
</div>
</a>
<a href="/Entreprise/31934-la-centrale-des-ramoneurs">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi La centrale des ramoneurs" src="/statique/images/logos/recrutement-video-la-centrale-des-ramoneurs.jpg"></img>
</div>
</a>
<a href="/Entreprise/32507-tpc-ouest">
<div className={classes.sliderDiv}>
<img className={classes.alignVertical} alt="Offres d'emploi TPC Ouest" src="/statique/images/logos/recrutement-video-tpc-ouest-btp.jpg"></img>
</div>
</a>
</Slider>
</Hidden>
{/* PARTIE Mobile */}
<Hidden mdUp>
<div className={classes.sliderContainerMobile}>
<a href="/Entreprise/21247-lactalis-logistique-et-transports" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Lactalis" src="/statique/images/logos/recrutement-video-lactalis.jpg"></img>
</div>
</a>
<a href="/Entreprise/28481-onela" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Onela" src="/statique/images/logos/recrutement-video-onela-service-a-domicile.jpg"></img>
</div>
</a>
<a href="/Entreprise/19205-intermarche-logistique-alimentaire-international" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Intermarché" src="/statique/images/logos/recrutement-video-intermarche.jpg"></img>
</div>
</a>
<a href="/Entreprise/4059-eiffage-construction-grand-ouest" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Eiffage" src="/statique/images/logos/recrutement-video-eiffage.jpg"></img>
</div>
</a>
<a href="/Entreprise/8639-mma-questembert" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi MMA" src="/statique/images/logos/recrutement-video-mma-assurances.jpg"></img>
</div>
</a>
<a href="/Entreprise/32987-admr-56" >
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi ADMR" src="/statique/images/logos/recrutement-video-ADMR.jpg"></img>
</div>
</a>
<a href="/Entreprise/13464-jpa">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi JPA" src="/statique/images/logos/recrutement-video-jpa.jpg"></img>
</div>
</a>
<a href="/Entreprise/2527-groupe-mousset">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Groupe Mousset" src="/statique/images/logos/recrutement-video-groupe-mousset.jpg"></img>
</div>
</a>
<a href="/Entreprise/1467-groupe-rocher-operations">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Groupe Rocher" src="/statique/images/logos/recrutement-video-groupe-rocher.jpg"></img>
</div>
</a>
<a href="/Entreprise/26064-aer-recyclage">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi AER" src="/statique/images/logos/recrutement-video-aer-recyclage.jpg"></img>
</div>
</a>
<a href="/Entreprise/46-actual">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi Actual" src="/statique/images/logos/recrutement-video-actual.jpg"></img>
</div>
</a>
<a href="/Entreprise/31934-la-centrale-des-ramoneurs">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="Offres d'emploi La centrale des ramoneurs" src="/statique/images/logos/recrutement-video-la-centrale-des-ramoneurs.jpg"></img>
</div>
</a>
<a href="/Entreprise/32507-tpc-ouest">
<div className={classes.sliderDivMobile}>
<img className={classes.alignVerticalMobile} alt="TPC Ouest" src="/statique/images/logos/recrutement-video-tpc-ouest-btp.jpg"></img>
</div>
</a>
</div>
</Hidden>
</section>
<Footer />
</div>
</Layout>
+108 -17
View File
@@ -120,7 +120,7 @@ const styles = theme => ({
color: theme.palette.secondary.text,
},
title: {
fontFamily: 'Dosis',
fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
fontSize: '1.5em',
fontWeight: '600',
textAlign: 'center',
@@ -136,6 +136,9 @@ const styles = theme => ({
margin: 'auto',
},
},
container: {
},
});
class Index extends React.Component {
@@ -148,6 +151,8 @@ class Index extends React.Component {
suggestions: [],
valueMetier: '',
suggestionsMetier: [],
valueMetierCompetence: '',
suggestionsMetierCompetence: [],
};
}
@@ -174,12 +179,19 @@ class Index extends React.Component {
getSuggestionValue = suggestion => suggestion.libelle;
// Render Each Option
renderSuggestion = suggestion => (
<span className="sugg-option">
<span className="name">
{suggestion.libelle} ({suggestion.code})
</span>
</span>
<span className={'suggestion-content ' + suggestion.twitter}>
<span className="name">
{
parts.map((part, index) => {
const className = part.highlight ? 'highlight' : null;
return (
<span className={className} key={index}>{part.text}</span>
);
})
}
</span>
</span>
);
// OnChange event handler
@@ -227,10 +239,23 @@ class Index extends React.Component {
getSuggestionMetierValue = suggestion => suggestion.libelle;
// Render Each Option
renderSuggestionMetier = suggestion => (
<span className="sugg-option">
// <div style="position: absolute; right: 0px; z-index: 1; will-change: transform; top: 0px; left: 0px; transform: translate3d(14px, 53px, 0px);" data-placement="bottom-start">
// <div class="MuiPaper-root MuiPaper-elevation1 MuiPaper-rounded" style="opacity: 1; transform: none; transform-origin: 0px 0px 0px; transition: opacity 280ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 186ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;">
// <ul class="MuiList-root MuiList-padding" role="menu" tabindex="-1">
// <div class="MuiButtonBase-root MuiListItem-root MuiMenuItem-root Mui-selected MuiMenuItem-gutters MuiListItem-gutters MuiListItem-button Mui-selected" tabindex="0" role="menuitem" aria-disabled="false" id="downshift-0-item-0">
// <div>
// <strong style="font-weight: 500;">{suggestion.libelle} </strong>
// <span style="font-weight: 300;">, {suggestion.code}</span>
// </div>
// <span class="MuiTouchRipple-root"></span>
// </div>
// </ul>
// </div>
// </div>
<span className="suggestion-content">
<span className="name">
{suggestion.libelle} ({suggestion.code})
{suggestion.libelle}
</span>
</span>
);
@@ -266,10 +291,64 @@ class Index extends React.Component {
};
// METIER COMPETENCE
// Filter logic
getSuggestionsMetierCompetence = async (valueMetierCompetence) => {
const inputValue = valueMetierCompetence.trim().toLowerCase();
let response = await fetch(publicRuntimeConfig.symphonyUrl+"api/getDetailAppelation?q=" + inputValue );
// let response = await fetch("http://www.omdbapi.com/?s=" + inputValue + "&apikey=a591bb53");
let data = await response.json()
return data.competencesDeBase;
};
// Trigger suggestions
getSuggestionMetierCompetenceValue = suggestion => suggestion.libelle;
// Render Each Option
renderSuggestionMetierCompetence = suggestion => (
<span className="sugg-option">
<span className="name">
{suggestion.libelle}
</span>
</span>
);
// OnChange event handler
onChangeMetierCompetence = (event, { newValue }) => {
this.setState({
valueMetierCompetence: newValue
});
};
// Suggestion rerender when user types
onSuggestionsMetierCompetenceFetchRequested = ({ value }) => {
this.getSuggestionsMetierCompetence(value)
.then(data => {
if (data.Error) {
this.setState({
suggestionsMetierCompetence: []
});
} else {
this.setState({
suggestionsMetierCompetence: data
});
}
})
};
// Triggered on clear
onSuggestionsMetierCompetenceClearRequested = () => {
this.setState({
suggestionsMetierCompetence: []
});
};
render() {
const { classes } = this.props;
const { value, suggestions, valueMetier, suggestionsMetier } = this.state;
const { value, suggestions, valueMetier, suggestionsMetier, valueMetierCompetence, suggestionsMetierCompetence } = this.state;
// Option props
const inputProps = {
placeholder: 'Saisir une compétence',
@@ -282,19 +361,22 @@ class Index extends React.Component {
value:valueMetier,
onChange: this.onChangeMetier
};
const inputPropsMetierCompetence = {
placeholder: 'Saisir un id appellation',
value:valueMetierCompetence,
onChange: this.onChangeMetierCompetence
};
const socialShareUrl = typeof window !== 'undefined' ? window.location
: publicRuntimeConfig.frontServerUrl ;
const DefaultUrl = publicRuntimeConfig.symphonyUrl + "/img/default_picture_svg"
const imgUrl = DefaultUrl
return (
<Layout>
<OgHead seo_title="Talents Tube - Plateforme de recrutement en vidéo"
seo_description="Talents Tube est la première plateforme réservée aux offres d'emploi vidéo, vidéo marque employeur et aux CV vidéos. Découvrez une nouvelle méthode de recrutement."
seo_url={socialShareUrl}
image={imgUrl}
seo_key="Recrutement, video"
></OgHead>
<Head>
<title key="title">Recrutement vidéo : fonctionnement Talents Tube</title>
<meta key="robots" name="robots" content="noindex, nofollow"></meta>
</Head>
<div className={classes.container}>
{/* <VideoSlider /> */}
@@ -319,6 +401,15 @@ class Index extends React.Component {
renderSuggestion={this.renderSuggestionMetier}
inputProps={inputPropsMetier}
/>
<Autosuggest
suggestions={suggestionsMetierCompetence}
onSuggestionsFetchRequested={this.onSuggestionsMetierCompetenceFetchRequested}
onSuggestionsClearRequested={this.onSuggestionsMetierCompetenceClearRequested}
getSuggestionValue={this.getSuggestionMetierCompetenceValue}
renderSuggestion={this.renderSuggestionMetierCompetence}
inputProps={inputPropsMetierCompetence}
/>
</section>
+354
View File
@@ -0,0 +1,354 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.talentstube.com/Offre/133-gestionnaire-de-copropriete-f-h</loc>
<lastmod>2021-01-29</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprises</loc>
<lastmod>2021-01-29</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offres</loc>
<lastmod>2021-01-29</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/134-assistant-administratif-et-commercial-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/135-commercial-b-to-c-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/130-assistant-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/131-poseur-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/132-comptable-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/129-commerciaux-b-to-b-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/128-techniciens-poseurs-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/122-chauffeurs-spl-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/115-technicien-ramoneur-fumiste-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/109-equipier-de-plateforme-polyvalent-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/111-couvreur-etancheur-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/107-operateur-soudeur-chaudronnier-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/103-agents-de-quai-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/102-preparateurs-de-commandes-f-h</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://www.talentstube.com/Offre/46-conducteurs-routiers-h-f</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/32507-tpc-ouest</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/32355-hyphae</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/28481-onela</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/28172-pro-fermetures</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/26064-aer-recyclage</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/21247-lactalis-logistique-et-transports</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/19800-silvadec</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/19205-intermarche-logistique-alimentaire-international</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/18143-l-n-u-f-lisieux</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/17467-l-n-u-f-vallet</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/16785-nachos</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/16639-fast-point</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/16247-sasp</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/16015-la-veggisserie</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/16007-bforpu-b</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/15797-sinay</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/15559-monibrand</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/13464-jpa</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/12531-grand-ouest-etiquettes</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/12480-fym-action</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/11592-youston</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/11413-les-vergers-de-chateaubourg</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/11345-telemaque</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/9138-vital-concept</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/8639-mma-questembert</loc>
<lastmod>2021-01-23</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/7593-opticultures</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/7174-atlantem</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/7004-la-table-de-la-desirade</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/6898-le-ptit-club</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/6555-mazars</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/6363-square-habitat</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/5250-linpac-packaging-pontivy-groupe-klockner-pentaplast</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/4211-progressis-ge</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/4097-a-2-com</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/4088-venetis</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/4059-eiffage-construction-grand-ouest</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/3381-mairie-saint-hilaire-de-riez</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/2958-skiold-acemo</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/2527-groupe-mousset</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/2341-temporis</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/1899-faurecia</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/1691-groupe-syselec</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/1467-groupe-rocher-operations</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/1297-albea</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/438-bouyer-leroux</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/266-mgdis</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/157-medaviz</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/95-multiplast</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/52-talents-tube</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/46-actual</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/18-coriolis-composites</loc>
<lastmod>2021-01-23</lastmod>
<priority>0.70</priority>
</url>
<url>
<loc>https://www.talentstube.com/Entreprise/17-thibault-bergeron</loc>
<lastmod>2021-01-24</lastmod>
<priority>0.70</priority>
</url>
</urlset>
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

+101
View File
@@ -0,0 +1,101 @@
.react-autosuggest__container {
position: relative;
width: 85%;
}
.react-autosuggest__input {
width: 100%;
height: 30px;
padding: 10px 0;
font-family: Roboto;
font-weight: 400;
font-size: 16px;
border: 1px solid;
border-color: rgba(0, 0, 0, 0.23);
border-radius: 4px;
}
.react-autosuggest__input:focus {
outline: none;
}
.react-autosuggest__container--open .react-autosuggest__input {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.react-autosuggest__suggestions-container {
display: none;
}
.react-autosuggest__container--open .react-autosuggest__suggestions-container {
display: block;
position: absolute;
top: 51px;
width: 280px;
border: 1px solid #aaa;
background-color: #fff;
font-family: Roboto;
font-weight: 300;
font-size: 16px;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
z-index: 10;
}
.react-autosuggest__suggestions-list {
margin: 0;
padding: 0;
list-style-type: none;
}
.react-autosuggest__suggestion {
cursor: pointer;
padding: 10px 20px;
}
.react-autosuggest__suggestion:not(:first-child) {
border-top: 1px solid #ddd;
}
.react-autosuggest__suggestion--focused {
background-color: #0C7EAF;
color: #fff;
}
.suggestion-content {
display: flex;
align-items: center;
background-repeat: no-repeat;
}
.dancounsell {
background-image: url(https://s3.amazonaws.com/uifaces/faces/twitter/dancounsell/48.jpg);
}
.ladylexy {
background-image: url(https://s3.amazonaws.com/uifaces/faces/twitter/ladylexy/48.jpg);
}
.mtnmissy {
background-image: url(https://s3.amazonaws.com/uifaces/faces/twitter/mtnmissy/48.jpg);
}
.steveodom {
background-image: url(https://s3.amazonaws.com/uifaces/faces/twitter/steveodom/48.jpg);
}
.name {
margin-left: 8px;
line-height: 15px;
}
.highlight {
color: #ee0000;
font-weight: bold;
}
.react-autosuggest__suggestion--focused .highlight {
color: #120000;
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+36
View File
@@ -0,0 +1,36 @@
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
font-display: swap;
src: url(KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 300;
font-display: swap;
src: url(KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
File diff suppressed because it is too large Load Diff
+153
View File
@@ -0,0 +1,153 @@
/*
* Core Owl Carousel CSS File
* v1.3.3
*/
/* clearfix */
.owl-carousel .owl-wrapper:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
/* display none until init */
.owl-carousel{
display: none;
position: relative;
width: 100%;
-ms-touch-action: pan-y;
}
.owl-carousel .owl-wrapper{
display: none;
position: relative;
-webkit-transform: translate3d(0px, 0px, 0px);
}
.owl-carousel .owl-wrapper-outer{
overflow: hidden;
position: relative;
width: 100%;
}
.owl-carousel .owl-wrapper-outer.autoHeight{
-webkit-transition: height 500ms ease-in-out;
-moz-transition: height 500ms ease-in-out;
-ms-transition: height 500ms ease-in-out;
-o-transition: height 500ms ease-in-out;
transition: height 500ms ease-in-out;
}
.owl-carousel .owl-item{
float: left;
}
.owl-controls .owl-page,
.owl-controls .owl-buttons div{
cursor: pointer;
}
.owl-controls {
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
/* mouse grab icon */
.grabbing {
cursor:url(../img/grabbing.png) 8 8, move;
}
/* fix */
.owl-carousel .owl-wrapper,
.owl-carousel .owl-item{
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-webkit-transform: translate3d(0,0,0);
-moz-transform: translate3d(0,0,0);
-ms-transform: translate3d(0,0,0);
}
/*
* Owl Carousel Owl Demo Theme
* v1.3.3
*/
.owl-theme .owl-controls{
margin-top: 10px;
text-align: center;
}
/* Styling Next and Prev buttons */
.owl-theme .owl-controls .owl-buttons div{
color: #FFF;
display: inline-block;
zoom: 1;
*display: inline;/*IE7 life-saver */
margin: 5px;
padding: 3px 10px;
font-size: 12px;
-webkit-border-radius: 30px;
-moz-border-radius: 30px;
border-radius: 30px;
background: #869791;
filter: Alpha(Opacity=50);/*IE7 fix*/
opacity: 0.5;
}
/* Clickable class fix problem with hover on touch devices */
/* Use it for non-touch hover action */
.owl-theme .owl-controls.clickable .owl-buttons div:hover{
filter: Alpha(Opacity=100);/*IE7 fix*/
opacity: 1;
text-decoration: none;
}
/* Styling Pagination*/
.owl-theme .owl-controls .owl-page{
display: inline-block;
zoom: 1;
*display: inline;/*IE7 life-saver */
}
.owl-theme .owl-controls .owl-page span{
display: block;
width: 12px;
height: 12px;
margin: 5px 7px;
filter: Alpha(Opacity=50);/*IE7 fix*/
opacity: 0.5;
-webkit-border-radius: 20px;
-moz-border-radius: 20px;
border-radius: 20px;
background: #FF5A5F;
}
.owl-theme .owl-controls .owl-page.active span,
.owl-theme .owl-controls.clickable .owl-page:hover span{
filter: Alpha(Opacity=100);/*IE7 fix*/
opacity: 1;
}
/* If PaginationNumbers is true */
.owl-theme .owl-controls .owl-page span.owl-numbers{
height: auto;
width: auto;
color: #FFF;
padding: 2px 10px;
font-size: 12px;
-webkit-border-radius: 30px;
-moz-border-radius: 30px;
border-radius: 30px;
}
.screenshot-slider .item{
margin: 3px;
}
.screenshot-slider .item img{
display: block;
width: 100%;
height: auto;
}
@@ -0,0 +1,31 @@
<svg id="Import" xmlns="http://www.w3.org/2000/svg" width="73.762" height="56.425" viewBox="0 0 73.762 56.425">
<g id="Groupe_7895" data-name="Groupe 7895" transform="translate(9.499)">
<rect id="Rectangle_316" data-name="Rectangle 316" width="42.463" height="23.869" transform="translate(0 3.769) rotate(-5.093)"/>
<rect id="Rectangle_317" data-name="Rectangle 317" width="2.656" height="2.656" transform="translate(1.401 6.158) rotate(-5.093)" fill="#fff"/>
<rect id="Rectangle_318" data-name="Rectangle 318" width="2.656" height="2.656" transform="translate(1.866 11.472) rotate(-5.093)" fill="#fff"/>
<rect id="Rectangle_319" data-name="Rectangle 319" width="2.656" height="2.656" transform="translate(2.327 16.747) rotate(-5.093)" fill="#fff"/>
<rect id="Rectangle_320" data-name="Rectangle 320" width="2.656" height="2.656" transform="translate(2.826 22.019) rotate(-5.093)" fill="#fff"/>
<rect id="Rectangle_321" data-name="Rectangle 321" width="2.656" height="2.656" transform="translate(38.67 2.848) rotate(-5.093)" fill="#fff"/>
<rect id="Rectangle_322" data-name="Rectangle 322" width="2.656" height="2.656" transform="translate(39.131 8.123) rotate(-5.093)" fill="#fff"/>
<rect id="Rectangle_323" data-name="Rectangle 323" width="2.656" height="2.656" transform="translate(39.633 13.433) rotate(-5.093)" fill="#fff"/>
<rect id="Rectangle_324" data-name="Rectangle 324" width="2.656" height="2.656" transform="translate(40.094 18.708) rotate(-5.093)" fill="#fff"/>
<path id="Tracé_278" data-name="Tracé 278" d="M229.4,202.9l6.275,3.311-5.582,4.35Z" transform="translate(-210.257 -192.71)" fill="#fff"/>
</g>
<path id="Tracé_279" data-name="Tracé 279" d="M217.367,282.859l-6.93,6.93-48.507-6.93L155,275.93l6.93-6.93h55.437Z" transform="translate(-155 -233.363)" fill="#d0e7fe"/>
<path id="Tracé_280" data-name="Tracé 280" d="M173,269v6.93h48.507l6.93-6.93Z" transform="translate(-166.07 -233.363)" fill="#b8dbfe"/>
<g id="Groupe_7897" data-name="Groupe 7897" transform="translate(28.442 19.099)">
<g id="Groupe_7896" data-name="Groupe 7896" transform="translate(3.551)">
<path id="Tracé_281" data-name="Tracé 281" d="M239.065,257.45a.488.488,0,0,1-.231-.039.939.939,0,0,1-.693-1.155,50.925,50.925,0,0,0,1.463-12.088,51.857,51.857,0,0,0-.346-6.006.969.969,0,0,1,1.925-.231,55.915,55.915,0,0,1,.346,6.237,52.807,52.807,0,0,1-1.5,12.55A.952.952,0,0,1,239.065,257.45Z" transform="translate(-238.104 -232.827)" fill="#25d89a"/>
<path id="Tracé_282" data-name="Tracé 282" d="M240.5,229.337a1.021,1.021,0,0,1-.962-.808c-.077-.462-.154-.885-.27-1.347a.944.944,0,0,1,1.848-.385c.077.462.192.924.269,1.386a.969.969,0,0,1-.77,1.116A.141.141,0,0,1,240.5,229.337Z" transform="translate(-238.804 -226.042)" fill="#25d89a"/>
</g>
<path id="Tracé_283" data-name="Tracé 283" d="M233.084,279.525l-4.042-6.237a.972.972,0,1,1,1.617-1.078l3,4.62,4.62-3a.972.972,0,0,1,1.078,1.617Z" transform="translate(-228.879 -254.171)" fill="#25d89a"/>
</g>
<path id="Tracé_284" data-name="Tracé 284" d="M316.393,300.545h-9.008a.385.385,0,1,1,0-.77h8.7l5.505-5.659a.381.381,0,1,1,.539.539Z" transform="translate(-248.483 -248.739)" fill="#25d89a"/>
<path id="Tracé_285" data-name="Tracé 285" d="M317.93,299.2h-6.545a.385.385,0,0,1,0-.77h6.237l4.2-4.312a.381.381,0,1,1,.539.539Z" transform="translate(-250.943 -248.739)" fill="#fa6362"/>
<g id="Groupe_7899" data-name="Groupe 7899" transform="translate(30.144 40.641)">
<g id="Groupe_7898" data-name="Groupe 7898" transform="translate(0 0)">
<path id="Tracé_286" data-name="Tracé 286" d="M233.3,282l2.5,3.811,5.89-3.811h-3.542l-.654.423a1.636,1.636,0,0,0,.077-.423H233.3Z" transform="translate(-233.3 -282)" fill="#21b77e"/>
</g>
</g>
<rect id="Rectangle_325" data-name="Rectangle 325" width="55.437" height="13.859" transform="translate(0 42.566)" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

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

After

Width:  |  Height:  |  Size: 6.6 KiB

+1 -20
View File
@@ -5,9 +5,6 @@ import {
UPLOAD_MEDIA_PRES_REQUEST,
UPLOAD_MEDIA_PRES_FAILURE,
UPLOAD_MEDIA_PRES_SUCCESS,
UPLOAD_MEDIA_CV_REQUEST,
UPLOAD_MEDIA_CV_FAILURE,
UPLOAD_MEDIA_CV_SUCCESS,
} from "../types";
export function media(state = {
@@ -47,23 +44,7 @@ export function media(state = {
errors: action.errors,
loading: false
};
case UPLOAD_MEDIA_CV_REQUEST:
return {
...state,
loading: true
};
case UPLOAD_MEDIA_CV_SUCCESS:
return {
...state,
...action.res.data,
loading: false
};
case UPLOAD_MEDIA_CV_FAILURE:
return {
...state,
errors: action.errors,
loading: false
};
default:
return state;
}
+43
View File
@@ -0,0 +1,43 @@
import {
UPLOAD_MEDIA_CV_REQUEST,
UPLOAD_MEDIA_CV_FAILURE,
UPLOAD_MEDIA_CV_SUCCESS,
} from "../types";
export function mediaCv(state = {
}, action = {}) {
switch (action.type) {
case UPLOAD_MEDIA_CV_REQUEST:
return {
...state,
loading: true
};
case UPLOAD_MEDIA_CV_SUCCESS:
return {
...state,
...action.res.data,
loading: false
};
case UPLOAD_MEDIA_CV_FAILURE:
return {
...state,
errors: action.errors,
loading: false
};
default:
return state;
}
}
export const mediaCvErrorsSelector = state => {return !!state.mediaCv.errors ?state.mediaCv.errors.response.data:null};
export const errorMessageSelector = (state) => {
let err = mediaCvErrorsSelector(state)
if (!!!err)
return null;
switch(err.code)
{
case 500:
return {message: "Le téléversement de votre video à échoué."}
}
}
+5
View File
@@ -10,6 +10,7 @@ import { emphasisCompanies } from "./reducers/emphasisCompanies";
import { answer } from "./reducers/answer";
import { answers } from "./reducers/answers";
import { media } from "./reducers/media";
import { mediaCv } from "./reducers/mediaCv";
export const exampleInitialState = {
user: {
@@ -41,6 +42,9 @@ export const exampleInitialState = {
},
media:{
},
mediaCv:{
},
answers:{
data: {}
@@ -57,5 +61,6 @@ export default combineReducers({
emphasisCompanies,
answer,
media,
mediaCv,
answers
});
+6 -2
View File
@@ -26,9 +26,13 @@ import {
uploadMediaFailure,
uploadMediaPresSuccess,
uploadMediaPresFailure,
} from "../actions/media";
import {
uploadMediaCvSuccess,
uploadMediaCvFailure
} from "../actions/media";
} from "../actions/mediaCv";
import AuthRouter from "../pages/AuthRouter";
export function* postAdAnswerRequestSaga(action) {
@@ -101,7 +105,7 @@ export function* uploadMediaPresSaga(action) {
export function* uploadMediaCvSaga(action) {
try {
const res = yield call(api.medias.uploadMediaCv, action.payload);
const res = yield call(api.cv.uploadMediaCv, action.payload);
if (!!res.data)
yield put(uploadMediaCvSuccess(res));
+1 -1
View File
@@ -168,7 +168,7 @@ app.prepare()
server.get('/Player', (req, res) => {
const actualPage = '/Player'
const queryParams = { id: req.query.id, videoId:req.query.videoId, type:req.query.type }
const queryParams = { id: req.query.id, url: req.query.url, videoId:req.query.videoId, typeEntite:req.query.typeEntite, nameCompany:req.query.nameCompany, nameOffre:req.query.nameOffre }
app.render(req, res, actualPage, queryParams)
})
+2 -2
View File
@@ -25,12 +25,12 @@ exports.sendTransactionnelEmail = function () {
"Messages":[
{
"From": {
"Email": "l.laniau@talentstube.com",
"Email": "dev@talentstube.com",
"Name": "Laurent"
},
"To": [
{
"Email": "l.laniau@talentstube.com",
"Email": "dev@talentstube.com",
"Name": "Laurent"
}
],

Some files were not shown because too many files have changed in this diff Show More