handleClickConfirmDelete(rowsData)} />\r\n );\r\n } \r\n \r\n return (\r\n \r\n
\r\n onHide()} >\r\n \r\n
{t(\"entreprise.collaborator.delete_confirmation\", { collaborateurName: recruteurToDelete?.nom ? recruteurToDelete.nom : '', collaborateurFirstname: recruteurToDelete?.prenom ? recruteurToDelete.prenom : '' })} \r\n \r\n \r\n \r\n onHide()} />\r\n
\r\n \r\n \r\n \r\n setEmailCollaborateur(e.target.value)} />\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}","import { Card } from 'primereact/card'\r\nimport { Divider } from 'primereact/divider'\r\nimport { Fragment } from 'react'\r\nimport { Trans } from 'react-i18next'\r\nimport { enumStatutFormation } from '../../enums/enumStatutFormation'\r\nimport { FormationListItem } from '../listItem/formationListItem'\r\nimport './cursusThumbnail.css'\r\n\r\nconst header = \r\n \r\n \r\n \r\n\r\nexport const CursusThumbnail = (props) => {\r\n return (\r\n \r\n {props.etudiant.formationAVenir?.map((f, indexF) => (\r\n \r\n \r\n {(indexF < props.etudiant.formationAVenir.length-1 || props.etudiant.formationEnCours.length > 0 || props.etudiant.formationSuivie.length > 0) && }\r\n \r\n ))}\r\n {props.etudiant.formationEnCours?.map((f, indexF) => (\r\n \r\n \r\n {(indexF < props.etudiant.formationEnCours.length-1 || props.etudiant.formationSuivie.length > 0) && }\r\n \r\n ))}\r\n {props.etudiant.formationSuivie?.sort((a, b) => b.anneeDiplome - a.anneeDiplome).map((f, indexF) => (\r\n \r\n \r\n {(indexF < props.etudiant.formationSuivie.length-1) && }\r\n \r\n ))}\r\n \r\n )\r\n}","export const enumValueError = {\r\n UNRECOGNIZED_NIVEAU_LANGUE : \"Niveau de langue non reconnu\",\r\n}","export const enumNiveauLangue = {\r\n LANGUEMATERNELLE : \"Langue maternelle\",\r\n COURANT : \"Courant\",\r\n AVANCE : \"Avancé\",\r\n INTERMEDIAIRE : \"Intermédiaire\",\r\n ELEMENTAIRE : \"Élémentaire\"\r\n}","import { enumNiveauLangue } from \"../enums/enumNiveauLangue\";\r\nimport { enumValueError } from \"../enums/enumValueError\";\r\n\r\nexport default class LangueHelper {\r\n static getNiveauLangueRanking(niveau) {\r\n switch (niveau) {\r\n case enumNiveauLangue.LANGUEMATERNELLE:\r\n return 5;\r\n case enumNiveauLangue.COURANT:\r\n return 4;\r\n case enumNiveauLangue.AVANCE:\r\n return 3;\r\n case enumNiveauLangue.INTERMEDIAIRE:\r\n return 2;\r\n case enumNiveauLangue.ELEMENTAIRE:\r\n return 1;\r\n default:\r\n throw enumValueError.UNRECOGNIZED_NIVEAU_LANGUE;\r\n }\r\n }\r\n\r\n static sortLanguesByNiveau(data) {\r\n return data.sort((a,b) => (this.getNiveauLangueRanking(a.niveauLangue) < this.getNiveauLangueRanking(b.niveauLangue)) ? 1 : -1);\r\n }\r\n}","import { Card } from \"primereact/card\"\r\nimport { Toast } from \"primereact/toast\"\r\nimport { Fragment, useState, useEffect, useRef } from \"react\"\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { enumValueError } from \"../../enums/enumValueError\"\r\nimport LangueHelper from \"../../utils/langueHelper\"\r\nimport './langueThumbnail.css'\r\n\r\nexport const LangueThumbnail = (props) => {\r\n\r\n const {t} = useTranslation();\r\n const [languesOrdonneesParNiveau, setlanguesOrdonneesParNiveau] = useState([])\r\n const toast = useRef(null)\r\n\r\n const header =\r\n \r\n \r\n \r\n\r\n const showUnrecognizedLanguageLevel = () => {\r\n toast.current.show({ severity: 'error', summary: t('errors.unrecognized_language_level_summary'), detail: t('errors.unrecognized_language_level_detail'), life: 6000 });\r\n }\r\n\r\n const showError = () => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.unknown'), life: 3000 });\r\n }\r\n\r\n useEffect(() => {\r\n try {\r\n setlanguesOrdonneesParNiveau(LangueHelper.sortLanguesByNiveau(props.etudiant.etudiantLangue))\r\n } catch (error) {\r\n switch (error) {\r\n case enumValueError.UNRECOGNIZED_NIVEAU_LANGUE:\r\n showUnrecognizedLanguageLevel();\r\n break;\r\n default:\r\n showError();\r\n break;\r\n }\r\n }\r\n\r\n }, [props.etudiant.etudiantLangue])\r\n\r\n\r\n return (\r\n <>\r\n \r\n {languesOrdonneesParNiveau.length > 0 && \r\n \r\n {languesOrdonneesParNiveau.map((l, indexL) => (\r\n
\r\n \r\n {l.langue.libelle} \r\n ({l.niveauLangue}) \r\n
\r\n \r\n ))}\r\n
\r\n }\r\n >\r\n )\r\n}","import { Card } from \"primereact/card\"\r\nimport { useTranslation } from \"react-i18next\"\r\nimport './listeLibelleThumbnail.css'\r\nimport { Listelibelle } from \"../list/listeLibelle\"\r\n\r\nexport const ListeLibelleThumbnail = (props) => {\r\n\r\n const { t } = useTranslation();\r\n\r\n const header =\r\n \r\n {props.tabLibelles.length > 0 && props.titleplural ? props.titleplural : props.title}\r\n \r\n\r\n\r\n return (\r\n <>\r\n \r\n {props.tabLibelles.map((l, indexL) => {\r\n return (\r\n <>\r\n {props.subTitles ? ({props.subTitles[indexL]} ) : ('')}\r\n \r\n {indexL != props.tabLibelles.length - 1 && }\r\n >\r\n )\r\n })}\r\n\r\n \r\n >\r\n )\r\n}","import { Card } from \"primereact/card\"\r\nimport './presentationThumbnail.css'\r\nimport { Trans } from \"react-i18next\";\r\nimport { WysiwygRenderer } from \"../wysiwyg/wysiwygRenderer\";\r\n\r\nexport const PresentationThumbnail = (props) => {\r\n\r\n const header = \r\n \r\n \r\n \r\n \r\n\r\n return(\r\n \r\n \r\n \r\n )\r\n}","import { Button } from \"primereact/button\"\r\nimport { Dialog } from \"primereact/dialog\"\r\nimport { InputText } from \"primereact/inputtext\"\r\nimport { InputTextarea } from \"primereact/inputtextarea\"\r\nimport { classNames } from \"primereact/utils\"\r\nimport { useState } from \"react\"\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport UserService from \"../../services/userService\"\r\nimport { useAuthState } from \"../../context/context\"\r\nimport { Wysiwyg } from \"../wysiwyg/wysiwyg\"\r\nimport EntrepriseService from \"../../services/entrepriseService\"\r\nimport { ProgressSpinner } from \"primereact/progressspinner\"\r\nimport parse from 'html-react-parser';\r\nimport { useHistory, Link } from \"react-router-dom/cjs/react-router-dom.min\"\r\nimport { Tooltip } from \"primereact/tooltip\"\r\n\r\nexport const ContactEtudiantDialog = (props) => {\r\n\r\n const { t } = useTranslation()\r\n const currentUser = useAuthState()\r\n const history = useHistory();\r\n const [contactDialog, setContactDialog] = useState(false)\r\n const [phoneDialog, setPhoneDialog] = useState(false)\r\n const [notesDialog, setNotesDialog] = useState(false)\r\n const [wysiwygContent, setWysiwygContent] = useState(null)\r\n const [form, setForm] = useState({ etudiantId: props.etudiant.id, entrepriseId: currentUser.user.id })\r\n const [isSubmitting, setIsSubmitting] = useState(false)\r\n const [submitted, setSubmitted] = useState(false)\r\n const [loading, setLoading] = useState(false)\r\n const [dialogFreemiumInfo, setDialogFreemiumInfo] = useState(false);\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId;\r\n\r\n const userService = new UserService()\r\n const entrepriseService = new EntrepriseService()\r\n\r\n const onInputChange = (e, name) => {\r\n let val = (e.value || e.target.value) || (typeof e?.target?.getContent === \"function\" && e?.target?.getContent()) || null;\r\n let _form = { ...form };\r\n _form[`${name}`] = val;\r\n setForm(_form);\r\n };\r\n\r\n const onShowNotes = () => {\r\n setLoading(true)\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then(id => {\r\n entrepriseService.getNotes(props.etudiant.id, id)\r\n .then(notes => {\r\n setWysiwygContent(notes)\r\n setNotesDialog(true)\r\n })\r\n .catch(\r\n\r\n )\r\n .finally(\r\n () => { setLoading(false) }\r\n )\r\n })\r\n }\r\n\r\n const onShowContactDialog = () => {\r\n if(props.displayFakeInformation){\r\n setDialogFreemiumInfo(true);\r\n }\r\n else {\r\n let _form = { ...form }\r\n _form.methodeContact = 1\r\n if (props.offreEmploiIntitule) {\r\n _form.objet = t(\"entreprise.contact_object_company_to_student\", { offerTitle: props.offreEmploiIntitule })\r\n _form.message = parse(t(\"entreprise.contact_message_company_to_student\", { firstnameStudent: props.etudiant.prenom, firstnameCompany: props.entreprise.prenom, lastnameCompany: props.entreprise.nom, nameCompany: props.entreprise.recruteurEntreprises[0]?.entreprise?.nom, offerTitle: props.offreEmploiIntitule }))\r\n }\r\n else {\r\n _form.objet = t(\"entreprise.contact_object_company_to_student_no_offer\")\r\n _form.message = parse(t(\"entreprise.contact_message_company_to_student_no_offer\", { firstnameStudent: props.etudiant.prenom, firstnameCompany: props.entreprise.prenom, lastnameCompany: props.entreprise.nom, nameCompany: props.entreprise.recruteurEntreprises[0]?.entreprise?.nom }))\r\n }\r\n setForm(_form)\r\n setContactDialog(true)\r\n }\r\n }\r\n\r\n const onShowPhoneDialog = () => {\r\n if(props.displayFakeInformation){\r\n setDialogFreemiumInfo(true);\r\n }\r\n else {\r\n let _form = { ...form }\r\n _form.methodeContact = 2\r\n setForm(_form)\r\n setPhoneDialog(true)\r\n }\r\n }\r\n\r\n const onWysiwygChange = (content, editor) => {\r\n setWysiwygContent(content);\r\n }\r\n\r\n const onWysiwygSave = () => {\r\n setLoading(true);\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then((id) => {\r\n entrepriseService.postNotes(props.etudiant.id, wysiwygContent, id)\r\n .then((data) => {\r\n setNotesDialog(false)\r\n })\r\n .finally(() => {\r\n setLoading(false)\r\n })\r\n })\r\n }\r\n\r\n const submitForm = () => {\r\n setSubmitted(true);\r\n if (form?.objet && form?.message) {\r\n // remplacer les \\n par des \r\n form.message = form.message.replace(/\\n/g, ' ');\r\n\r\n props.toast.current.show({ severity: 'info', summary: t('general.onGoing'), detail: t('general.onGoing_message'), life: 3000 })\r\n setIsSubmitting(true);\r\n userService.postFormulaireContactEtudiant(form, 3)\r\n .then(() => {\r\n setForm({ etudiantId: props.etudiant.id, entrepriseId: currentUser.user.id });\r\n setSubmitted(false);\r\n props.toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('messagerie.sent_message_confirmation'), life: 3000 });\r\n setContactDialog(false)\r\n })\r\n .catch((err) => {\r\n props.toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.unknown'), life: 3000 });\r\n })\r\n .finally(() => {\r\n setIsSubmitting(false);\r\n })\r\n }\r\n else {\r\n props.toast.current.show({ severity: 'error', summary: t('errors.incomplete_summary'), detail: t('errors.incomplete_detail'), life: 3000 })\r\n }\r\n }\r\n\r\n const submitPhone = (statut) => {\r\n setSubmitted(true);\r\n //props.toast.current.show({ severity: 'info', summary: t('general.onGoing'), detail: t('general.onGoing_message'), life: 3000 })\r\n setIsSubmitting(true);\r\n userService.postFormulaireContactEtudiant(form, statut)\r\n .then(() => {\r\n setForm({ etudiantId: props.etudiant.id, entrepriseId: currentUser.user.id });\r\n setSubmitted(false);\r\n //props.toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('messagerie.sent_message_confirmation'), life: 3000 });\r\n setPhoneDialog(false)\r\n })\r\n .catch((err) => {\r\n props.toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.unknown'), life: 3000 });\r\n })\r\n .finally(() => {\r\n setIsSubmitting(false);\r\n })\r\n }\r\n\r\n return (\r\n \r\n
\r\n {props.etudiant.phoneNumber &&
onShowPhoneDialog()} />}\r\n \r\n onShowContactDialog()} />\r\n \r\n onShowNotes()} />\r\n setDialogFreemiumInfo(false)}>\r\n \r\n
{t('entreprise.feature_required_premium')}
\r\n
\r\n
\r\n \r\n
\r\n \r\n setPhoneDialog(false)}>\r\n
\r\n {t(\"general.contact\") + \" \" + props.etudiant.prenom + \" \" + props.etudiant.nom}\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n {props.etudiant.phoneNumber}\r\n
\r\n
\r\n submitPhone(2)}\r\n />\r\n
\r\n
\r\n submitPhone(3)}\r\n />\r\n
\r\n
\r\n \r\n setContactDialog(false)}>\r\n
\r\n {t(\"general.contact\") + \" \" + props.etudiant.prenom + \" \" + props.etudiant.nom}\r\n \r\n \r\n
\r\n * \r\n onInputChange(e, 'objet')}\r\n disabled={isSubmitting}\r\n required\r\n maxLength=\"80\"\r\n placeholder=\"Votre profil nous intéresse\"\r\n className={classNames({ 'p-invalid': submitted && !form?.objet })} />\r\n {submitted && !form?.objet && . }\r\n
\r\n
\r\n * \r\n onInputChange(e, 'message')}\r\n className={classNames({ 'p-invalid': submitted && !form?.message })}\r\n placeholder=\"Votre message ici\"\r\n />\r\n {submitted && !form?.message && . }\r\n
\r\n
\r\n * \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n { setNotesDialog(false) }} >\r\n {loading ?\r\n \r\n :\r\n <>\r\n \r\n \r\n \r\n
\r\n >}\r\n \r\n \r\n )\r\n}","import { Trans } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\"\r\nimport RoleHelper from \"../../utils/roleHelper\"\r\n\r\nexport const EntrepriseOffreBreadCrumb = (props) => {\r\n\r\n const history = useHistory()\r\n\r\n const onOffersClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/offers');\r\n }\r\n\r\n const onCandidatesClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/candidates',{id:history.location.state.offreEmploiId});\r\n }\r\n\r\n return(\r\n \r\n = 1 && onOffersClick}> \r\n {props.step >= 1 && <>{\" > \"} = 2 && onCandidatesClick}>{props.label ? props.label : } >}\r\n {props.step >= 2 && <>{\" > \"} >}\r\n
\r\n )\r\n}","import { Trans } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\"\r\nimport RoleHelper from \"../../utils/roleHelper\"\r\n\r\nexport const EntrepriseProfilBreadCrumb = (props) => {\r\n\r\n const history = useHistory()\r\n\r\n const onCandidatesClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,\"/seeked_profiles\",{entrepriseId:history.location.state.entrepriseId})\r\n }\r\n\r\n return(\r\n \r\n = 1 && onCandidatesClick}> \r\n {props.step >= 1 && <>{\" > \"} >}\r\n
\r\n )\r\n}","export default __webpack_public_path__ + \"static/media/static-1.14d12311.webp\";","export default __webpack_public_path__ + \"static/media/static-2.6dc08d23.webp\";","export default __webpack_public_path__ + \"static/media/inscription.b52524ca.webp\";","export default __webpack_public_path__ + \"static/media/entreprisePortalPreview.6af44b08.png\";","export default __webpack_public_path__ + \"static/media/entrepriseRetexLogo.5b95c1f4.webp\";","export default __webpack_public_path__ + \"static/media/analyseLogo.ea4e7c64.webp\";","import { InputText } from \"primereact/inputtext\"\r\nimport { InputNumber } from \"primereact/inputnumber\"\r\nimport { classNames } from \"primereact/utils\"\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { SelectButton } from \"primereact/selectbutton\"\r\nimport { useState, useRef } from \"react\"\r\nimport \"./caracteristiquesPoste.css\"\r\nimport { Toast } from 'primereact/toast';\r\nimport { Wysiwyg } from \"../../wysiwyg/wysiwyg\"\r\nimport { Tooltip } from \"primereact/tooltip\"\r\nimport { AutoComplete } from \"primereact/autocomplete\"\r\nimport RechercheService from \"../../../services/rechercheService\"\r\nimport { Button } from \"primereact/button\"\r\nimport { Fragment } from \"react\"\r\nimport { enumConfWysiwyg } from \"../../../enums/enumConfWysiwyg\"\r\n\r\nexport const CaracteristiquesPoste = (props) => {\r\n\r\n const { t } = useTranslation()\r\n const toast = useRef(null)\r\n const [filteredValues, setFilteredValues] = useState(null);\r\n const [selectedValues, setSelectedValues] = useState(null);\r\n\r\n const rechercheService = new RechercheService();\r\n\r\n const privacyOptions = [\r\n { name: t('offers.posted'), value: \"Publique\" },\r\n { name: t('offers.not_posted'), value: \"Privee\", className: \"a-tooltip-private\" }\r\n ]\r\n\r\n const onStatusChange = (e) => {\r\n props.onInputChange(e, 'statut');\r\n }\r\n const searchValues = (event) => {\r\n let query = event.query;\r\n rechercheService.getRechercheAppellation(query).then(res => setFilteredValues(res));\r\n }\r\n\r\n const handleChange = (appellation) => {\r\n setSelectedValues(appellation);\r\n if (typeof (appellation) === 'object') {\r\n setSelectedValues(null);\r\n }\r\n if (typeof (appellation) === \"object\" && appellation !== null) {\r\n let _appellationId = parseInt(appellation.value);\r\n let _annonce = { ...props.annonce }\r\n if (_annonce.offreEmploiAppellations?.length == 0 || _annonce.offreEmploiAppellations?.map(e => e.appellationId).indexOf(_appellationId) == -1) {\r\n let _appellation = {\r\n id: _appellationId,\r\n libelle: appellation.label\r\n }\r\n let _oea = {\r\n appellationId: _appellation.id,\r\n appellation: _appellation,\r\n offreEmploiId: _annonce.id\r\n }\r\n _annonce.offreEmploiAppellations.push(_oea)\r\n props.setAnnonce(_annonce);\r\n }\r\n }\r\n }\r\n\r\n\r\n const handleRemoveValeur = (appellationId) => {\r\n let _annonce = { ...props.annonce }\r\n let _oea = _annonce.offreEmploiAppellations.filter(oea => oea.appellationId != appellationId)\r\n _annonce.offreEmploiAppellations = _oea\r\n props.setAnnonce(_annonce);\r\n }\r\n\r\n const template = (item) => {\r\n return (\r\n \r\n {item.label}\r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n\r\n
\r\n
\r\n
\r\n
\r\n onStatusChange(e)}\r\n options={privacyOptions}\r\n optionLabel=\"name\"\r\n unselectable={false}\r\n required\r\n className={`fai-selectbutton ${classNames({ 'p-invalid': props.submitted && !props.annonce?.active })}`}\r\n />\r\n \r\n \r\n \r\n
\r\n
Diffusée : Créée et visible sur le portail des offres \r\n
\r\n
\r\n
\r\n
\r\n
\r\n * \r\n props.onInputChange(e, 'intitule')}\r\n required\r\n maxLength=\"100\"\r\n className={classNames({ 'p-invalid': props.submitted && !props.annonce?.intitule })} />\r\n {props.submitted && !props.annonce?.intitule && . }\r\n
\r\n
\r\n \r\n props.onInputChange(e, 'salaire')}\r\n mode=\"currency\"\r\n currency=\"EUR\"\r\n locale=\"fr-FR\"\r\n minFractionDigits={2}\r\n />\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
* \r\n
{props.submitted && !props.annonce?.offreEmploiAppellations?.length > 0 && . } \r\n
\r\n
handleChange(e.value)}\r\n className={classNames({ 'p-invalid': props.submitted && !props.annonce?.offreEmploiAppellations?.length > 0})}\r\n />\r\n {props.annonce?.offreEmploiAppellations?.length > 0 && \r\n {props.annonce?.offreEmploiAppellations?.sort((a, b) => (a.appellation?.libelle > b.appellation?.libelle) ? 1 : -1).map((oea, index) => (\r\n
\r\n \r\n
{oea.appellation?.libelle} \r\n
\r\n handleRemoveValeur(oea.appellationId)} />\r\n
\r\n
\r\n \r\n ))}\r\n
}\r\n \r\n
\r\n
\r\n >\r\n )\r\n}","import { Button } from \"primereact/button\"\r\nimport { Dropdown } from \"primereact/dropdown\"\r\nimport { InputText } from \"primereact/inputtext\"\r\nimport { SelectButton } from \"primereact/selectbutton\"\r\nimport { Toast } from \"primereact/toast\"\r\nimport { classNames } from \"primereact/utils\"\r\nimport { Fragment, useEffect, useRef, useState } from \"react\"\r\nimport { useTranslation } from \"react-i18next\"\r\nimport { Trans } from \"react-i18next\"\r\nimport LangueService from \"../../../services/langueService\"\r\nimport { LangueSelector } from \"../../selector/langueSelector\"\r\nimport FormationService from \"../../../services/formationService\"\r\nimport { AutoComplete } from \"primereact/autocomplete\"\r\nimport RechercheService from \"../../../services/rechercheService\"\r\n\r\nexport const CaracteristiquesProfilRecherche = (props) => {\r\n\r\n const { t } = useTranslation();\r\n\r\n const [ddlNiveauxDiplome, setDdlNiveauxDiplome] = useState([])\r\n const [ddlNiveauxLangue, setDdlNiveauxLangue] = useState([])\r\n const [filteredValues, setFilteredValues] = useState(null);\r\n const [selectedValues, setSelectedValues] = useState(null);\r\n const toast = useRef(null)\r\n const langueService = new LangueService();\r\n const formationService = new FormationService();\r\n const rechercheService = new RechercheService();\r\n\r\n const exigenceMasculinOptions = [\r\n { name: t('requirement.required.m'), value: 2 },\r\n { name: t('requirement.wished.m'), value: 1 }\r\n ]\r\n\r\n const exigenceFemininOptions = [\r\n { name: t('requirement.required.f'), value: 2 },\r\n { name: t('requirement.wished.f'), value: 1 }\r\n ]\r\n\r\n const experienceOptions = [\r\n '1-3 ans',\r\n '4-7 ans',\r\n '+7 ans'\r\n ]\r\n\r\n useEffect(() => {\r\n loadData()\r\n }, [])\r\n\r\n const loadData = () => {\r\n langueService\r\n .getNiveauxLangue()\r\n .then((_langues) => {\r\n setDdlNiveauxLangue(_langues);\r\n });\r\n formationService.getNiveauxEntreesDiplome()\r\n .then((_diplomes) => {\r\n setDdlNiveauxDiplome(_diplomes);\r\n })\r\n }\r\n\r\n const searchValues = (event) => {\r\n let query = event.query;\r\n rechercheService.getRechercheCompetence(query).then(res => setFilteredValues(res));\r\n }\r\n\r\n const handleChange = (competence) => {\r\n setSelectedValues(competence);\r\n if (typeof (competence) === 'object') {\r\n setSelectedValues(null);\r\n }\r\n if (typeof (competence) === \"object\" && competence !== null) {\r\n let _competenceId = parseInt(competence.value);\r\n let _annonce = { ...props.annonce }\r\n if (_annonce.competenceOffreEmploi.length == 0 || _annonce.competenceOffreEmploi?.map(e => e.competenceId).indexOf(_competenceId) == -1) {\r\n let _competence = {\r\n id: _competenceId,\r\n libelle: competence.label\r\n }\r\n let _coe = {\r\n competenceId: _competence.id,\r\n competence: _competence,\r\n offreEmploiId: _annonce.id\r\n }\r\n _annonce.competenceOffreEmploi.push(_coe)\r\n props.setAnnonce(_annonce);\r\n }\r\n }\r\n }\r\n\r\n const template = (item) => {\r\n return (\r\n \r\n {item.label}\r\n \r\n );\r\n }\r\n\r\n const handleRemoveValeur = (competenceId) => {\r\n let _annonce = { ...props.annonce }\r\n let _coe = _annonce.competenceOffreEmploi.filter(coe => coe.competenceId != competenceId)\r\n _annonce.competenceOffreEmploi = _coe\r\n props.setAnnonce(_annonce);\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n props.onInputChange(e, 'niveauDiplome')}\r\n required\r\n className=\"dip-flex-grow-1\"\r\n />\r\n props.onInputChange(e, 'niveauDiplomeExigence')}\r\n options={exigenceMasculinOptions}\r\n optionLabel=\"name\"\r\n unselectable={false}\r\n className={`fai-selectbutton p-ml-2`}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n props.onInputChange(e, 'experienceLibelle')}\r\n required\r\n className=\"dip-flex-grow-1\"\r\n />\r\n props.onInputChange(e, 'experienceExigeOffreEmploi')}\r\n options={exigenceFemininOptions}\r\n optionLabel=\"name\"\r\n unselectable={false}\r\n className={`fai-selectbutton p-ml-2`}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n {props.annonce?.offreEmploiLangue.map((langue, indexLangue) => (\r\n
\r\n \r\n
\r\n props.handleLangueChange(indexLangue, event, 'langue')} placeholder={t('profile.please_select_language')} className={classNames({ 'p-invalid': props.submitted && !langue.langue })} />\r\n {props.submitted && !langue.langue && . }\r\n
\r\n
\r\n props.handleLangueChange(indexLangue, event, 'niveau')} placeholder={t('profile.please_select_level')} className={classNames({ 'p-invalid': props.submitted && !langue.niveau })} />\r\n {props.submitted && !langue.niveau && . }\r\n
\r\n
\r\n props.handleLangueChange(indexLangue, e, 'exigence')}\r\n options={exigenceMasculinOptions}\r\n optionLabel=\"name\"\r\n unselectable={false}\r\n className={`fai-selectbutton`}\r\n />\r\n
\r\n
\r\n props.handleRemoveLangue(indexLangue)}\r\n />\r\n
\r\n
\r\n \r\n ))}\r\n
\r\n {/* props.handleAddLangue()}\r\n />\r\n */}\r\n props.handleAddLangue()}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
handleChange(e.value)}\r\n />\r\n {props.annonce?.competenceOffreEmploi?.length > 0 && \r\n {props.annonce?.competenceOffreEmploi?.sort((a, b) => (a.competence?.libelle > b.competence?.libelle) ? 1 : -1).map((coe, index) => (\r\n
\r\n \r\n
{coe.competence?.libelle} \r\n
\r\n handleRemoveValeur(coe.competenceId)} />\r\n
\r\n
\r\n \r\n ))}\r\n
}\r\n \r\n
\r\n\r\n
\r\n )\r\n}","const Pays = [\r\n {alpha2:\"AF\", libelle:\"Afghanistan\"},\r\n {alpha2:\"ZA\", libelle:\"Afrique du Sud\"},\r\n {alpha2:\"AL\", libelle:\"Albanie\"},\r\n {alpha2:\"DZ\", libelle:\"Algérie\"},\r\n {alpha2:\"DE\", libelle:\"Allemagne\"},\r\n {alpha2:\"AD\", libelle:\"Andorre\"},\r\n {alpha2:\"AO\", libelle:\"Angola\"},\r\n {alpha2:\"AI\", libelle:\"Anguilla\"},\r\n {alpha2:\"AQ\", libelle:\"Antarctique\"},\r\n {alpha2:\"AG\", libelle:\"Antigua-et-Barbuda\"},\r\n {alpha2:\"AN\", libelle:\"Antilles néerlandaises\"},\r\n {alpha2:\"SA\", libelle:\"Arabie saoudite\"},\r\n {alpha2:\"AR\", libelle:\"Argentine\"},\r\n {alpha2:\"AM\", libelle:\"Arménie\"},\r\n {alpha2:\"AW\", libelle:\"Aruba\"},\r\n {alpha2:\"AU\", libelle:\"Australie\"},\r\n {alpha2:\"AT\", libelle:\"Autriche\"},\r\n {alpha2:\"AZ\", libelle:\"Azerbaïdjan\"},\r\n {alpha2:\"BS\", libelle:\"Bahamas\"},\r\n {alpha2:\"BH\", libelle:\"Bahreïn\"},\r\n {alpha2:\"BD\", libelle:\"Bangladesh\"},\r\n {alpha2:\"BB\", libelle:\"Barbade\"},\r\n {alpha2:\"BY\", libelle:\"Bélarus\"},\r\n {alpha2:\"BE\", libelle:\"Belgique\"},\r\n {alpha2:\"BZ\", libelle:\"Belize\"},\r\n {alpha2:\"BJ\", libelle:\"Bénin\"},\r\n {alpha2:\"BM\", libelle:\"Bermudes\"},\r\n {alpha2:\"BT\", libelle:\"Bhoutan\"},\r\n {alpha2:\"BO\", libelle:\"Bolivie\"},\r\n {alpha2:\"BA\", libelle:\"Bosnie-Herzégovine\"},\r\n {alpha2:\"BW\", libelle:\"Botswana\"},\r\n {alpha2:\"BR\", libelle:\"Brésil\"},\r\n {alpha2:\"BN\", libelle:\"Brunéi Darussalam\"},\r\n {alpha2:\"BG\", libelle:\"Bulgarie\"},\r\n {alpha2:\"BF\", libelle:\"Burkina Faso\"},\r\n {alpha2:\"BI\", libelle:\"Burundi\"},\r\n {alpha2:\"KH\", libelle:\"Cambodge\"},\r\n {alpha2:\"CM\", libelle:\"Cameroun\"},\r\n {alpha2:\"CA\", libelle:\"Canada\"},\r\n {alpha2:\"CV\", libelle:\"Cap-Vert\"},\r\n {alpha2:\"EA\", libelle:\"Ceuta et Melilla\"},\r\n {alpha2:\"CL\", libelle:\"Chili\"},\r\n {alpha2:\"CN\", libelle:\"Chine\"},\r\n {alpha2:\"CY\", libelle:\"Chypre\"},\r\n {alpha2:\"CO\", libelle:\"Colombie\"},\r\n {alpha2:\"KM\", libelle:\"Comores\"},\r\n {alpha2:\"CG\", libelle:\"Congo-Brazzaville\"},\r\n {alpha2:\"KP\", libelle:\"Corée du Nord\"},\r\n {alpha2:\"KR\", libelle:\"Corée du Sud\"},\r\n {alpha2:\"CR\", libelle:\"Costa Rica\"},\r\n {alpha2:\"CI\", libelle:\"Côte d’Ivoire\"},\r\n {alpha2:\"HR\", libelle:\"Croatie\"},\r\n {alpha2:\"CU\", libelle:\"Cuba\"},\r\n {alpha2:\"DK\", libelle:\"Danemark\"},\r\n {alpha2:\"DG\", libelle:\"Diego Garcia\"},\r\n {alpha2:\"DJ\", libelle:\"Djibouti\"},\r\n {alpha2:\"DM\", libelle:\"Dominique\"},\r\n {alpha2:\"EG\", libelle:\"Égypte\"},\r\n {alpha2:\"SV\", libelle:\"El Salvador\"},\r\n {alpha2:\"AE\", libelle:\"Émirats arabes unis\"},\r\n {alpha2:\"EC\", libelle:\"Équateur\"},\r\n {alpha2:\"ER\", libelle:\"Érythrée\"},\r\n {alpha2:\"ES\", libelle:\"Espagne\"},\r\n {alpha2:\"EE\", libelle:\"Estonie\"},\r\n {alpha2:\"VA\", libelle:\"État de la Cité du Vatican\"},\r\n {alpha2:\"FM\", libelle:\"États fédérés de Micronésie\"},\r\n {alpha2:\"US\", libelle:\"États-Unis\"},\r\n {alpha2:\"ET\", libelle:\"Éthiopie\"},\r\n {alpha2:\"FJ\", libelle:\"Fidji\"},\r\n {alpha2:\"FI\", libelle:\"Finlande\"},\r\n {alpha2:\"FR\", libelle:\"France\"},\r\n {alpha2:\"GA\", libelle:\"Gabon\"},\r\n {alpha2:\"GM\", libelle:\"Gambie\"},\r\n {alpha2:\"GE\", libelle:\"Géorgie\"},\r\n {alpha2:\"GS\", libelle:\"Géorgie du Sud et les îles Sandwich du Sud\"},\r\n {alpha2:\"GH\", libelle:\"Ghana\"},\r\n {alpha2:\"GI\", libelle:\"Gibraltar\"},\r\n {alpha2:\"GR\", libelle:\"Grèce\"},\r\n {alpha2:\"GD\", libelle:\"Grenade\"},\r\n {alpha2:\"GL\", libelle:\"Groenland\"},\r\n {alpha2:\"GP\", libelle:\"Guadeloupe\"},\r\n {alpha2:\"GU\", libelle:\"Guam\"},\r\n {alpha2:\"GT\", libelle:\"Guatemala\"},\r\n {alpha2:\"GG\", libelle:\"Guernesey\"},\r\n {alpha2:\"GN\", libelle:\"Guinée\"},\r\n {alpha2:\"GQ\", libelle:\"Guinée équatoriale\"},\r\n {alpha2:\"GW\", libelle:\"Guinée-Bissau\"},\r\n {alpha2:\"GY\", libelle:\"Guyana\"},\r\n {alpha2:\"GF\", libelle:\"Guyane française\"},\r\n {alpha2:\"HT\", libelle:\"Haïti\"},\r\n {alpha2:\"HN\", libelle:\"Honduras\"},\r\n {alpha2:\"HU\", libelle:\"Hongrie\"},\r\n {alpha2:\"BV\", libelle:\"Île Bouvet\"},\r\n {alpha2:\"CX\", libelle:\"Île Christmas\"},\r\n {alpha2:\"CP\", libelle:\"Île Clipperton\"},\r\n {alpha2:\"AC\", libelle:\"Île de l'Ascension\"},\r\n {alpha2:\"IM\", libelle:\"Île de Man\"},\r\n {alpha2:\"NF\", libelle:\"Île Norfolk\"},\r\n {alpha2:\"AX\", libelle:\"Îles Åland\"},\r\n {alpha2:\"KY\", libelle:\"Îles Caïmans\"},\r\n {alpha2:\"IC\", libelle:\"Îles Canaries\"},\r\n {alpha2:\"CC\", libelle:\"Îles Cocos - Keeling\"},\r\n {alpha2:\"CK\", libelle:\"Îles Cook\"},\r\n {alpha2:\"FO\", libelle:\"Îles Féroé\"},\r\n {alpha2:\"HM\", libelle:\"Îles Heard et MacDonald\"},\r\n {alpha2:\"FK\", libelle:\"Îles Malouines\"},\r\n {alpha2:\"MP\", libelle:\"Îles Mariannes du Nord\"},\r\n {alpha2:\"MH\", libelle:\"Îles Marshall\"},\r\n {alpha2:\"UM\", libelle:\"Îles Mineures Éloignées des États-Unis\"},\r\n {alpha2:\"SB\", libelle:\"Îles Salomon\"},\r\n {alpha2:\"TC\", libelle:\"Îles Turks et Caïques\"},\r\n {alpha2:\"VG\", libelle:\"Îles Vierges britanniques\"},\r\n {alpha2:\"VI\", libelle:\"Îles Vierges des États-Unis\"},\r\n {alpha2:\"IN\", libelle:\"Inde\"},\r\n {alpha2:\"ID\", libelle:\"Indonésie\"},\r\n {alpha2:\"IQ\", libelle:\"Irak\"},\r\n {alpha2:\"IR\", libelle:\"Iran\"},\r\n {alpha2:\"IE\", libelle:\"Irlande\"},\r\n {alpha2:\"IS\", libelle:\"Islande\"},\r\n {alpha2:\"IL\", libelle:\"Israël\"},\r\n {alpha2:\"IT\", libelle:\"Italie\"},\r\n {alpha2:\"JM\", libelle:\"Jamaïque\"},\r\n {alpha2:\"JP\", libelle:\"Japon\"},\r\n {alpha2:\"JE\", libelle:\"Jersey\"},\r\n {alpha2:\"JO\", libelle:\"Jordanie\"},\r\n {alpha2:\"KZ\", libelle:\"Kazakhstan\"},\r\n {alpha2:\"KE\", libelle:\"Kenya\"},\r\n {alpha2:\"KG\", libelle:\"Kirghizistan\"},\r\n {alpha2:\"KI\", libelle:\"Kiribati\"},\r\n {alpha2:\"KW\", libelle:\"Koweït\"},\r\n {alpha2:\"LA\", libelle:\"Laos\"},\r\n {alpha2:\"LS\", libelle:\"Lesotho\"},\r\n {alpha2:\"LV\", libelle:\"Lettonie\"},\r\n {alpha2:\"LB\", libelle:\"Liban\"},\r\n {alpha2:\"LR\", libelle:\"Libéria\"},\r\n {alpha2:\"LY\", libelle:\"Libye\"},\r\n {alpha2:\"LI\", libelle:\"Liechtenstein\"},\r\n {alpha2:\"LT\", libelle:\"Lituanie\"},\r\n {alpha2:\"LU\", libelle:\"Luxembourg\"},\r\n {alpha2:\"MK\", libelle:\"Macédoine\"},\r\n {alpha2:\"MG\", libelle:\"Madagascar\"},\r\n {alpha2:\"MY\", libelle:\"Malaisie\"},\r\n {alpha2:\"MW\", libelle:\"Malawi\"},\r\n {alpha2:\"MV\", libelle:\"Maldives\"},\r\n {alpha2:\"ML\", libelle:\"Mali\"},\r\n {alpha2:\"MT\", libelle:\"Malte\"},\r\n {alpha2:\"MA\", libelle:\"Maroc\"},\r\n {alpha2:\"MQ\", libelle:\"Martinique\"},\r\n {alpha2:\"MU\", libelle:\"Maurice\"},\r\n {alpha2:\"MR\", libelle:\"Mauritanie\"},\r\n {alpha2:\"YT\", libelle:\"Mayotte\"},\r\n {alpha2:\"MX\", libelle:\"Mexique\"},\r\n {alpha2:\"MD\", libelle:\"Moldavie\"},\r\n {alpha2:\"MC\", libelle:\"Monaco\"},\r\n {alpha2:\"MN\", libelle:\"Mongolie\"},\r\n {alpha2:\"ME\", libelle:\"Monténégro\"},\r\n {alpha2:\"MS\", libelle:\"Montserrat\"},\r\n {alpha2:\"MZ\", libelle:\"Mozambique\"},\r\n {alpha2:\"MM\", libelle:\"Myanmar\"},\r\n {alpha2:\"NA\", libelle:\"Namibie\"},\r\n {alpha2:\"NR\", libelle:\"Nauru\"},\r\n {alpha2:\"NP\", libelle:\"Népal\"},\r\n {alpha2:\"NI\", libelle:\"Nicaragua\"},\r\n {alpha2:\"NE\", libelle:\"Niger\"},\r\n {alpha2:\"NG\", libelle:\"Nigéria\"},\r\n {alpha2:\"NU\", libelle:\"Niue\"},\r\n {alpha2:\"NO\", libelle:\"Norvège\"},\r\n {alpha2:\"NC\", libelle:\"Nouvelle-Calédonie\"},\r\n {alpha2:\"NZ\", libelle:\"Nouvelle-Zélande\"},\r\n {alpha2:\"OM\", libelle:\"Oman\"},\r\n {alpha2:\"UG\", libelle:\"Ouganda\"},\r\n {alpha2:\"UZ\", libelle:\"Ouzbékistan\"},\r\n {alpha2:\"PK\", libelle:\"Pakistan\"},\r\n {alpha2:\"PW\", libelle:\"Palaos\"},\r\n {alpha2:\"PA\", libelle:\"Panama\"},\r\n {alpha2:\"PG\", libelle:\"Papouasie-Nouvelle-Guinée\"},\r\n {alpha2:\"PY\", libelle:\"Paraguay\"},\r\n {alpha2:\"NL\", libelle:\"Pays-Bas\"},\r\n {alpha2:\"PE\", libelle:\"Pérou\"},\r\n {alpha2:\"PH\", libelle:\"Philippines\"},\r\n {alpha2:\"PN\", libelle:\"Pitcairn\"},\r\n {alpha2:\"PL\", libelle:\"Pologne\"},\r\n {alpha2:\"PF\", libelle:\"Polynésie française\"},\r\n {alpha2:\"PR\", libelle:\"Porto Rico\"},\r\n {alpha2:\"PT\", libelle:\"Portugal\"},\r\n {alpha2:\"QA\", libelle:\"Qatar\"},\r\n {alpha2:\"HK\", libelle:\"R.A.S. chinoise de Hong Kong\"},\r\n {alpha2:\"MO\", libelle:\"R.A.S. chinoise de Macao\"},\r\n {alpha2:\"QO\", libelle:\"régions éloignées de l’Océanie\"},\r\n {alpha2:\"CF\", libelle:\"République centrafricaine\"},\r\n {alpha2:\"CD\", libelle:\"République démocratique du Congo\"},\r\n {alpha2:\"DO\", libelle:\"République dominicaine\"},\r\n {alpha2:\"CZ\", libelle:\"République tchèque\"},\r\n {alpha2:\"RE\", libelle:\"Réunion\"},\r\n {alpha2:\"RO\", libelle:\"Roumanie\"},\r\n {alpha2:\"GB\", libelle:\"Royaume-Uni\"},\r\n {alpha2:\"RU\", libelle:\"Russie\"},\r\n {alpha2:\"RW\", libelle:\"Rwanda\"},\r\n {alpha2:\"EH\", libelle:\"Sahara occidental\"},\r\n {alpha2:\"BL\", libelle:\"Saint-Barthélémy\"},\r\n {alpha2:\"KN\", libelle:\"Saint-Kitts-et-Nevis\"},\r\n {alpha2:\"SM\", libelle:\"Saint-Marin\"},\r\n {alpha2:\"MF\", libelle:\"Saint-Martin\"},\r\n {alpha2:\"PM\", libelle:\"Saint-Pierre-et-Miquelon\"},\r\n {alpha2:\"VC\", libelle:\"Saint-Vincent-et-les Grenadines\"},\r\n {alpha2:\"SH\", libelle:\"Sainte-Hélène\"},\r\n {alpha2:\"LC\", libelle:\"Sainte-Lucie\"},\r\n {alpha2:\"WS\", libelle:\"Samoa\"},\r\n {alpha2:\"AS\", libelle:\"Samoa américaines\"},\r\n {alpha2:\"ST\", libelle:\"Sao Tomé-et-Principe\"},\r\n {alpha2:\"SN\", libelle:\"Sénégal\"},\r\n {alpha2:\"RS\", libelle:\"Serbie\"},\r\n {alpha2:\"CS\", libelle:\"Serbie-et-Monténégro\"},\r\n {alpha2:\"SC\", libelle:\"Seychelles\"},\r\n {alpha2:\"SL\", libelle:\"Sierra Leone\"},\r\n {alpha2:\"SG\", libelle:\"Singapour\"},\r\n {alpha2:\"SK\", libelle:\"Slovaquie\"},\r\n {alpha2:\"SI\", libelle:\"Slovénie\"},\r\n {alpha2:\"SO\", libelle:\"Somalie\"},\r\n {alpha2:\"SD\", libelle:\"Soudan\"},\r\n {alpha2:\"LK\", libelle:\"Sri Lanka\"},\r\n {alpha2:\"SE\", libelle:\"Suède\"},\r\n {alpha2:\"CH\", libelle:\"Suisse\"},\r\n {alpha2:\"SR\", libelle:\"Suriname\"},\r\n {alpha2:\"SJ\", libelle:\"Svalbard et Île Jan Mayen\"},\r\n {alpha2:\"SZ\", libelle:\"Swaziland\"},\r\n {alpha2:\"SY\", libelle:\"Syrie\"},\r\n {alpha2:\"TJ\", libelle:\"Tadjikistan\"},\r\n {alpha2:\"TW\", libelle:\"Taïwan\"},\r\n {alpha2:\"TZ\", libelle:\"Tanzanie\"},\r\n {alpha2:\"TD\", libelle:\"Tchad\"},\r\n {alpha2:\"TF\", libelle:\"Terres australes françaises\"},\r\n {alpha2:\"IO\", libelle:\"Territoire britannique de l'océan Indien\"},\r\n {alpha2:\"PS\", libelle:\"Territoire palestinien\"},\r\n {alpha2:\"TH\", libelle:\"Thaïlande\"},\r\n {alpha2:\"TL\", libelle:\"Timor oriental\"},\r\n {alpha2:\"TG\", libelle:\"Togo\"},\r\n {alpha2:\"TK\", libelle:\"Tokelau\"},\r\n {alpha2:\"TO\", libelle:\"Tonga\"},\r\n {alpha2:\"TT\", libelle:\"Trinité-et-Tobago\"},\r\n {alpha2:\"TA\", libelle:\"Tristan da Cunha\"},\r\n {alpha2:\"TN\", libelle:\"Tunisie\"},\r\n {alpha2:\"TM\", libelle:\"Turkménistan\"},\r\n {alpha2:\"TR\", libelle:\"Turquie\"},\r\n {alpha2:\"TV\", libelle:\"Tuvalu\"},\r\n {alpha2:\"UA\", libelle:\"Ukraine\"},\r\n {alpha2:\"EU\", libelle:\"Union européenne\"},\r\n {alpha2:\"UY\", libelle:\"Uruguay\"},\r\n {alpha2:\"VU\", libelle:\"Vanuatu\"},\r\n {alpha2:\"VE\", libelle:\"Venezuela\"},\r\n {alpha2:\"VN\", libelle:\"Viêt Nam\"},\r\n {alpha2:\"WF\", libelle:\"Wallis-et-Futuna\"},\r\n {alpha2:\"YE\", libelle:\"Yémen\"},\r\n {alpha2:\"ZM\", libelle:\"Zambie\"},\r\n {alpha2:\"ZW\", libelle:\"Zimbabwe\"}\r\n]\r\n\r\nexport default Pays","import { Dropdown } from \"primereact/dropdown\"\r\nimport { InputText } from \"primereact/inputtext\"\r\nimport { useState } from \"react\"\r\nimport { Trans } from \"react-i18next\"\r\nimport { CommuneSelector } from \"../../location-selector/communeSelector\"\r\nimport Pays from \"../../../utils/pays\"\r\nimport { classNames } from \"primereact/utils\"\r\n\r\nexport const LocalisationPoste = (props) => {\r\n\r\n const [selectedPays, setSelectedPays] = useState({ alpha2: \"FR\", libelle: \"France\" })\r\n const [selectedCity, setSelectedCity] = useState(props.annonce?.lieuTravail?.libelle || null)\r\n\r\n const onPaysChange = (e) => {\r\n setSelectedPays(e.value)\r\n setSelectedCity(null);\r\n if (props.onPaysChange) {\r\n props.onPaysChange(e);\r\n }\r\n }\r\n \r\n const onCityChange = (e) => {\r\n setSelectedCity(e.value)\r\n if (props.onCityChange) {\r\n props.onCityChange(e);\r\n }\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n {props.annonce?.lieuTravail?.paysCodeAlpha2 == 'FR' ? (\r\n onCityChange(e)}\r\n showDepartementNumber\r\n />\r\n ) : (\r\n onCityChange(e)}\r\n disabled={!props.annonce.lieuTravail.paysLibelle}\r\n required\r\n className={classNames({ 'p-invalid': props.submitted && !props.annonce?.lieuTravail?.libelle })}\r\n />\r\n )}\r\n
\r\n
\r\n \r\n onPaysChange(e)}\r\n options={Pays}\r\n optionLabel=\"libelle\"\r\n filter\r\n required\r\n className={classNames({ 'p-invalid': props.submitted && !props.annonce?.lieuTravail?.paysLibelle } , \"no-borders\")}\r\n />\r\n {props.submitted && !props.annonce?.lieuTravail?.paysLibelle && . }\r\n
\r\n
\r\n )\r\n}","import { Calendar } from \"primereact/calendar\"\r\nimport { Dropdown } from \"primereact/dropdown\"\r\nimport { InputNumber } from \"primereact/inputnumber\"\r\nimport { classNames } from \"primereact/utils\"\r\nimport { useState } from \"react\"\r\nimport { useEffect } from \"react\"\r\nimport { Trans } from \"react-i18next\"\r\nimport \"./caracteristiquesContrat.css\"\r\nimport OffreEmploiService from \"../../../services/offreEmploiService\"\r\nimport RecrutementService from \"../../../services/recrutementService\"\r\nimport EntrepriseService from \"../../../services/entrepriseService\"\r\nimport { useAuthState } from \"../../../context/context\"\r\nimport { enumTypeContratRecrutement } from \"../../../enums/enumTypeContratRecrutement\"\r\nimport Helper from \"../../../utils/helper\"\r\nimport { Link } from \"react-router-dom\"\r\nimport { useHistory } from \"react-router-dom/cjs/react-router-dom.min\"\r\n\r\nexport const CaracteristiquesContrat = (props) => {\r\n\r\n const recrutementService = new RecrutementService()\r\n const offreEmploiService = new OffreEmploiService()\r\n const entrepriseService = new EntrepriseService()\r\n\r\n const currentUser = useAuthState()\r\n const [recruteur, setRecruteur] = useState(null)\r\n const [typeContratRecrutementOptions, setTypeContratRecrutementOptions] = useState([])\r\n const [tempsTravailHebdoOptions, setTempsTravailHebdoOptions] = useState([])\r\n const [teletravailOptions, setTeletravailOptions] = useState([])\r\n const history = useHistory();\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId\r\n\r\n useEffect(() => {\r\n loadLazyData()\r\n }, [])\r\n\r\n const loadLazyData = () => {\r\n recrutementService.getAllTypeContratRecrutement()\r\n .then(data => {\r\n entrepriseService.getExtendEntrepriseProfil(adminImpersonatingRecruteurId ? adminImpersonatingRecruteurId : currentUser.user.id, currentUser)\r\n .then((_recruteur) => {\r\n // on calcule part rapport à la date de création de l'entreprise et _entreprise.abonnementEntreprise.nbSemaineEssai si l'entreprise est en période d'essai ou non\r\n let isInPeriodeEssai = Helper.isInPeriodeEssai(_recruteur.creationDate, _recruteur.recruteurEntreprises[0]?.entreprise?.abonnementEntreprise?.nbSemaineEssai);\r\n\r\n _recruteur.isInPeriodeEssai = isInPeriodeEssai;\r\n\r\n // si l'entreprise à un abonnement freemium, on ne lui propose tout les types de contrat mais on disable tout sauf le stage\r\n //if (_recruteur.recruteurEntreprises[0]?.entreprise?.abonnementEntreprise?.isFree && !isInPeriodeEssai) {\r\n // let typeContratRecrutementOptions = []\r\n // data.forEach(typeContrat => {\r\n // if (typeContrat === enumTypeContratRecrutement.STAGE) {\r\n // typeContratRecrutementOptions.push({label:typeContrat, value: typeContrat, disabled: false })\r\n // } else {\r\n // typeContratRecrutementOptions.push({ label:typeContrat, value: typeContrat, disabled: true })\r\n // }\r\n // })\r\n // setTypeContratRecrutementOptions(typeContratRecrutementOptions)\r\n //} else {\r\n // setTypeContratRecrutementOptions(data)\r\n //}\r\n\t\t\t\t\t\tsetTypeContratRecrutementOptions(data)\r\n setRecruteur(_recruteur);\r\n })\r\n })\r\n offreEmploiService.getAllTempsTravailHebdo()\r\n .then(data => {\r\n setTempsTravailHebdoOptions(data)\r\n })\r\n offreEmploiService.getAllTeletravail()\r\n .then(data => {\r\n let _tab = []\r\n data.forEach((e,i) => {\r\n _tab.push({label:e,value:i+1})\r\n });\r\n setTeletravailOptions(_tab)\r\n })\r\n }\r\n\r\n const onCheckTypeContratValid = (e) => {\r\n // // si l'entreprise à un abonnement freemium, on ne lui propose tout les types de contrat mais on disable tout sauf le stage\r\n // if (recruteur.recruteurEntreprises[0]?.entreprise?.abonnementEntreprise?.isFree) {\r\n // if (e.target.value != enumTypeContratRecrutement.STAGE) {\r\n // e.target.value = enumTypeContratRecrutement.STAGE\r\n // e.value = enumTypeContratRecrutement.STAGE\r\n // }\r\n // }\r\n props.onInputChange(e, 'typeContratRecrutement')\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n * \r\n onCheckTypeContratValid(e)}\r\n className={classNames({ 'p-invalid': props.submitted && !props.annonce?.typeContratRecrutement })}\r\n />\r\n {props.submitted && !props.annonce?.typeContratRecrutement && . }\r\n {/* {(recruteur?.recruteurEntreprises[0]?.entreprise?.abonnementEntreprise?.isFree && !recruteur?.isInPeriodeEssai) &&\r\n ici \r\n } */}\r\n
\r\n
\r\n \r\n props.onInputChange(e, 'teletravail')}\r\n required\r\n />\r\n
\r\n
\r\n \r\n props.onInputChange(e, 'tempsTravailHebdo')}\r\n required\r\n />\r\n
\r\n
\r\n \r\n props.onInputChange(e, 'dateDebutSouhaite')}\r\n monthNavigator\r\n yearNavigator yearRange=\"2020:2040\"\r\n dateFormat='dd/mm/yy'\r\n />\r\n
\r\n
\r\n \r\n * \r\n props.onInputChange(e, 'dureeContrat')}\r\n disabled={props.annonce.typeContratRecrutement == 'CDI'}\r\n mode=\"decimal\"\r\n minFractionDigits={1}\r\n maxFractionDigits={1}\r\n locale=\"fr-FR\"\r\n required\r\n className={classNames({ 'p-invalid': props.submitted && !props.annonce?.dureeContrat && props.annonce.typeContratRecrutement != 'CDI' })}\r\n />\r\n {props.submitted && !props.annonce?.dureeContrat && props.annonce.typeContratRecrutement != 'CDI' && . }\r\n
\r\n
\r\n )\r\n}","import { SelectButton } from \"primereact/selectbutton\"\r\nimport { classNames } from \"primereact/utils\"\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport EntrepriseService from \"../../../services/entrepriseService\"\r\nimport { useEffect } from \"react\"\r\nimport { useState } from \"react\"\r\nimport parse from 'html-react-parser';\r\nimport { ProgressSpinner } from \"primereact/progressspinner\"\r\nimport { useHistory } from \"react-router-dom/cjs/react-router-dom.min\"\r\nimport \"./presentationEntrepriseSurOffre.css\";\r\n\r\n\r\nexport const PresentationEntrepriseSurOffre = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const entrepriseService = new EntrepriseService()\r\n const history = useHistory();\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId;\r\n\r\n const [loading, setLoading] = useState(true)\r\n const [entreprise, setEntreprise] = useState(null)\r\n\r\n useEffect(() => {\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then(id => {\r\n entrepriseService.getEntreprisePresentation(id)\r\n .then((entreprise) => {\r\n setEntreprise(entreprise)\r\n if (entreprise?.description == null || entreprise?.description == '') {\r\n props.disabledPresentation('false');\r\n }\r\n })\r\n .finally(() => {\r\n setLoading(false)\r\n })\r\n })\r\n }, [])\r\n\r\n const privacyOptions = [\r\n { name: 'Affichée', value: 'true' },\r\n { name: 'Masquée', value: 'false' }\r\n ]\r\n\r\n const onStatusChange = (e) => {\r\n props.onInputChange(e, 'afficherPresentation');\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n onStatusChange(e)}\r\n options={privacyOptions}\r\n optionLabel=\"name\"\r\n unselectable={false}\r\n required\r\n disabled={entreprise?.description == null || entreprise?.description == '' ? true : false}\r\n className={`fai-selectbutton ${classNames({ 'p-invalid': props.submitted && !props.annonce?.active })}`}\r\n />\r\n
\r\n
\r\n
\r\n {loading == true ?\r\n
\r\n :\r\n (props.annonce?.afficherPresentation == 'true' ?\r\n <>\r\n {entreprise?.nom &&
\r\n
\r\n
{entreprise?.nom}
\r\n
}\r\n {/* {entreprise?.phoneNumberEntreprise &&
\r\n
\r\n
{entreprise?.phoneNumberEntreprise}
\r\n
} */}\r\n {/* {entreprise?.localisation &&
\r\n
\r\n
{entreprise?.localisation}
\r\n
} */}\r\n {/* {entreprise?.secteurActivite &&
\r\n
\r\n
{entreprise?.secteurActivite}
\r\n
} */}\r\n {entreprise?.description &&
\r\n
\r\n
{parse(entreprise?.description)}
\r\n
}\r\n >\r\n :\r\n
\r\n {entreprise?.description == null || entreprise?.description == '' &&\r\n {parse(t('advert.company_presentation_on_ad_not_filled'))} \r\n }\r\n
\r\n )}\r\n
\r\n )\r\n}","import { useState, useRef, useEffect } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { CaracteristiquesPoste } from \"./caracteristiquesPoste\";\r\nimport { CaracteristiquesProfilRecherche } from \"./caracteristiquesProfilRecherche\";\r\nimport \"./formAnnonceInterne.css\";\r\nimport { Toast } from 'primereact/toast';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { useAuthState } from \"../../../context/context\";\r\nimport { Button } from \"primereact/button\";\r\nimport { SplitButton } from \"primereact/splitbutton\";\r\nimport { ConfirmDialog } from \"primereact/confirmdialog\";\r\nimport OffreEmploiService from \"../../../services/offreEmploiService\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { LocalisationPoste } from \"./localisationPoste\";\r\nimport { CaracteristiquesContrat } from \"./caracteristiquesContrat\";\r\nimport { PresentationEntrepriseSurOffre } from \"./presentationEntrepriseSurOffre\";\r\nimport EntrepriseService from \"../../../services/entrepriseService\";\r\n\r\nexport const FormAnnonceInterne = (props) => {\r\n\r\n\r\n const currentUser = useAuthState();\r\n const offreEmploiService = new OffreEmploiService();\r\n const entrepriseService = new EntrepriseService();\r\n const history = useHistory();\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId\r\n\r\n const { t } = useTranslation();\r\n const [loading, setLoading] = useState(false)\r\n\r\n const [annonce, setAnnonce] = useState(\r\n {\r\n id: 0,\r\n afficherPresentation: 'true',\r\n description: null,\r\n offreEmploiRecrutement: {},\r\n niveauDiplomeExigence: 1,\r\n lieuTravail: {\r\n paysCodeAlpha2: 'FR',\r\n paysLibelle: 'France',\r\n libelle: null,\r\n commune: null,\r\n },\r\n salaire: null,\r\n statut: \"Publique\",\r\n experienceExigeOffreEmploi: 1,\r\n offreEmploiLangue: [],\r\n competenceOffreEmploi: [],\r\n offreEmploiAppellations: [],\r\n raisonArchivage: null,\r\n teletravail: null\r\n }\r\n )\r\n const [submitted, setSubmitted] = useState(false)\r\n const [isSubmitting, setIsSubmitting] = useState(false)\r\n\r\n const [confirmDialogVisible, setConfirmDialogVisible] = useState(false)\r\n\r\n // const [tokenOuvertureWindow, setTokenOuvertureWindow] = useState(null)\r\n // const [newTab, setNewTab] = useState(null);\r\n\r\n const toast = useRef(null);\r\n\r\n\r\n\r\n const itemsSave = [\r\n {\r\n label: 'Enregistrer et quitter',\r\n icon: 'pi pi-sign-out',\r\n command: () => {\r\n createOrUpdateAnnonce(false)\r\n }\r\n }\r\n ]\r\n\r\n useEffect(() => {\r\n if (history.location.state?.id) {\r\n loadAnnonce(history.location.state.id);\r\n }\r\n else {\r\n loadEntrepriseId();\r\n }\r\n\r\n }, [])\r\n\r\n const loadEntrepriseId = () => {\r\n setLoading(true);\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then(id => {\r\n let _annonce = { ...annonce }\r\n _annonce.entrepriseId = id\r\n setAnnonce(_annonce);\r\n })\r\n .catch((err) => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_load'), life: 3000 })\r\n })\r\n .finally(() => {\r\n setLoading(false)\r\n })\r\n }\r\n\r\n const loadAnnonce = (id) => {\r\n setLoading(true);\r\n offreEmploiService.getOffreEmploiEditable(id)\r\n .then((data) => {\r\n let _annonce = { ...data }\r\n if (history.location.state?.duplicate) {\r\n _annonce = prepareAnnonceForDuplicate(_annonce)\r\n }\r\n setupAnnonceAfterGet(_annonce)\r\n })\r\n .catch((err) => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_load'), life: 3000 })\r\n })\r\n .finally(() => {\r\n setLoading(false)\r\n })\r\n }\r\n\r\n const prepareAnnonceForDuplicate = (data) => {\r\n data.id = 0;\r\n data.intitule = t('entreprise.copy_of') + \" \" + data.intitule;\r\n data.lieuTravail = {\r\n paysCodeAlpha2: (data.lieuTravail && data.lieuTravail.paysCodeAlpha2) ? data.lieuTravail.paysCodeAlpha2 : 'FR',\r\n paysLibelle: (data.lieuTravail && data.lieuTravail.paysLibelle) ? data.lieuTravail.paysLibelle : 'France',\r\n libelle: (data.lieuTravail && data.lieuTravail.libelle) ? data.lieuTravail.libelle : null,\r\n commune: (data.lieuTravail && data.lieuTravail.commune) ? data.lieuTravail.commune : null,\r\n }\r\n data.salaire = (data.salaire && data.salaire.montantEuro) ? { montantEuro: data.salaire.montantEuro } : null;\r\n\r\n return data;\r\n }\r\n\r\n const createOrUpdateAnnonce = (visualize) => {\r\n setSubmitted(true)\r\n let formIsValid = true;\r\n annonce.offreEmploiLangue.forEach(l => {\r\n if (!l.niveau || !l.langue) {\r\n formIsValid = false;\r\n }\r\n });\r\n if (formIsValid &&\r\n annonce.intitule &&\r\n annonce.typeContratRecrutement &&\r\n (annonce.typeContratRecrutement == \"CDI\" || annonce.dureeContrat) &&\r\n annonce.offreEmploiAppellations?.length > 0\r\n ) {\r\n toast.current.show({ severity: 'info', summary: t('general.onGoing'), detail: t('general.onGoing_message'), life: 3000 })\r\n setIsSubmitting(true);\r\n let _annonce = setAnnonceBeforePost()\r\n offreEmploiService.createOrUpdateOffreEmploi(_annonce)\r\n .then(data => {\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('advert.updated'), life: 3000 });\r\n setupAnnonceAfterGet(data)\r\n if (visualize) {\r\n // setTokenOuvertureWindow(new Date());\r\n seeOffer(data.id)\r\n }\r\n else {\r\n returnToOffers();\r\n }\r\n })\r\n .catch(err => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_save'), life: 3000 })\r\n }).finally(() => {\r\n setIsSubmitting(false)\r\n setSubmitted(false)\r\n })\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('errors.incomplete_summary'), detail: t('errors.incomplete_detail'), life: 3000 })\r\n }\r\n }\r\n\r\n const setAnnonceBeforePost = () => {\r\n let _annonce = { ...annonce };\r\n if (_annonce.afficherPresentation == \"true\") {\r\n _annonce.afficherPresentation = true\r\n }\r\n else if (_annonce.afficherPresentation == \"false\") {\r\n _annonce.afficherPresentation = false\r\n }\r\n _annonce.dateDebutSouhaite = _annonce.dateDebutSouhaite != null ? (_annonce.dateDebutSouhaite.toLocaleString(\"en-US\")) : (null);\r\n return _annonce\r\n }\r\n\r\n const setupAnnonceAfterGet = (annonce) => {\r\n if (annonce.dateDebutSouhaite != null) {\r\n var date = annonce.dateDebutSouhaite;\r\n annonce.dateDebutSouhaite = new Date(Date.parse(date))\r\n }\r\n if (annonce.afficherPresentation == true) {\r\n annonce.afficherPresentation = \"true\"\r\n }\r\n else if (annonce.afficherPresentation == false) {\r\n annonce.afficherPresentation = \"false\"\r\n }\r\n setAnnonce(annonce)\r\n }\r\n\r\n const acceptConfirm = () => {\r\n returnToOffers();\r\n }\r\n\r\n const rejectConfirm = () => {\r\n setConfirmDialogVisible(false);\r\n }\r\n\r\n const onInputChange = (e, name) => {\r\n const val = (e.target && e.target.value) || e.value || null;\r\n let _annonce = { ...annonce };\r\n if (name == \"salaire\") {\r\n if (val == '' || val == null) {\r\n _annonce.salaire = null\r\n }\r\n else {\r\n if (_annonce.salaire == null) {\r\n _annonce.salaire = { montantEuro: val }\r\n }\r\n else {\r\n _annonce.salaire.montantEuro = val;\r\n }\r\n }\r\n } else {\r\n _annonce[`${name}`] = val;\r\n }\r\n if (_annonce.typeContratRecrutement == 'CDI') {\r\n _annonce.dureeContrat = null;\r\n }\r\n setAnnonce(_annonce);\r\n }\r\n\r\n const disabledPresentation = (e) => {\r\n let _annonce = { ...annonce };\r\n _annonce.afficherPresentation = e;\r\n setAnnonce(_annonce);\r\n }\r\n\r\n\r\n const onEditorChange = (content, editor) => {\r\n let _annonce = { ...annonce };\r\n _annonce.description = content\r\n setAnnonce(_annonce)\r\n }\r\n\r\n const onPaysChange = (e) => {\r\n const val = (e.target && e.target.value) || null;\r\n let _annonce = { ...annonce };\r\n _annonce.lieuTravail.paysCodeAlpha2 = val.alpha2;\r\n _annonce.lieuTravail.paysLibelle = val.libelle;\r\n _annonce.lieuTravail.libelle = null;\r\n _annonce.lieuTravail.commune = null;\r\n setAnnonce(_annonce);\r\n }\r\n\r\n const onCityChange = (e) => {\r\n const val = (e.target && e.target.value) || null;\r\n let _annonce = { ...annonce };\r\n if (typeof (val) === 'object' && val != null) {\r\n _annonce.lieuTravail.libelle = val.fullLibelleCommune;\r\n _annonce.lieuTravail.commune = val.code;\r\n _annonce.departementId = val.departementId;\r\n }\r\n else {\r\n _annonce.lieuTravail.libelle = val;\r\n }\r\n setAnnonce(_annonce);\r\n }\r\n\r\n const handleLangueChange = (index, e, name) => {\r\n let _annonce = { ...annonce };\r\n let _offreEmploiLangue = [..._annonce.offreEmploiLangue];\r\n\r\n let val = (e.target && e.target.value) || null;\r\n\r\n let _langue = _offreEmploiLangue[index];\r\n _langue[`${name}`] = val;\r\n if (name == 'langue') {\r\n _langue[`${name}Id`] = val?.id;\r\n }\r\n _offreEmploiLangue[index] = _langue;\r\n _annonce.offreEmploiLangue = _offreEmploiLangue;\r\n setAnnonce(_annonce);\r\n };\r\n\r\n const handleAddLangue = () => {\r\n let _annonce = { ...annonce };\r\n _annonce.offreEmploiLangue.push({ langue: null, niveau: null, exigence: 1, offreEmploiId: annonce.id });\r\n setAnnonce(_annonce);\r\n };\r\n\r\n const handleRemoveLangue = index => {\r\n let _annonce = { ...annonce };\r\n let _offreEmploiLangue = [..._annonce.offreEmploiLangue];\r\n _offreEmploiLangue.splice(index, 1);\r\n _annonce.offreEmploiLangue = _offreEmploiLangue;\r\n setAnnonce(_annonce);\r\n };\r\n\r\n const seeOffer = (id) => {\r\n history.push(\"/vueOffreEmploi?offreEmploiId=\" + id)\r\n }\r\n\r\n const returnToOffers = () => {\r\n history.push(\"/offers\")\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {loading ? (\r\n \r\n ) : (\r\n \r\n
\r\n
setConfirmDialogVisible(false)}\r\n message={t('advert.message.changes_wont_save_confirm')}\r\n header={t('general.confirm')} icon=\"pi pi-exclamation-triangle\"\r\n accept={acceptConfirm}\r\n acceptLabel={t('general.yes')}\r\n reject={rejectConfirm}\r\n rejectLabel={t('general.no')}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {(annonce.id != 0 ?\r\n createOrUpdateAnnonce(true)} model={itemsSave} />\r\n : createOrUpdateAnnonce(true)} />\r\n )}\r\n
\r\n
\r\n )}\r\n >\r\n )\r\n}","export const enumOrganismeFormationCategorie = {\r\n ECOLE : \"ecole\",\r\n COMPOSANTEECOLE : \"composanteEcole\"\r\n}","import { SelectButton } from \"primereact/selectbutton\"\r\nimport { useState } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { Wysiwyg } from \"./wysiwyg\";\r\nimport \"./wysiwygMultiView.css\";\r\n\r\nexport const WysiwygMultiView = (props) => {\r\n\r\n const { t } = useTranslation();\r\n\r\n const [selectValue, setSelectValue] = useState(1)\r\n\r\n const options = [\r\n { value:1,name: t(\"wysiwyg.pc_view\")},\r\n { value: 2,name: t(\"wysiwyg.mobile_view\") }\r\n ]\r\n\r\n return (\r\n <>\r\n \r\n
setSelectValue(e.value)} />\r\n
\r\n \r\n \r\n {selectValue == 1 && }\r\n {selectValue == 2 && }\r\n >\r\n )\r\n}","import { Card } from \"primereact/card\"\r\nimport { FileUpload } from \"primereact/fileupload\"\r\nimport { InputText } from \"primereact/inputtext\"\r\nimport { ProgressSpinner } from \"primereact/progressspinner\"\r\nimport { classNames } from \"primereact/utils\"\r\nimport { useEffect, useRef, useState } from \"react\"\r\nimport { useHistory } from \"react-router-dom\";\r\nimport allowedImageFileType from '../../valueContol/allowedImageFileType.json';\r\nimport { useTranslation } from \"react-i18next\"\r\nimport { Trans } from \"react-i18next\"\r\nimport EcoleService from \"../../services/ecoleService\"\r\nimport { Button } from \"primereact/button\"\r\nimport { Wysiwyg } from \"../wysiwyg/wysiwyg\"\r\nimport \"./formFicheOrganismeFormation.css\"\r\nimport { Toast } from \"primereact/toast\"\r\nimport { useAuthState } from \"../../context/context\"\r\nimport RoleHelper from \"../../utils/roleHelper\"\r\nimport { SplitButton } from \"primereact/splitbutton\"\r\nimport { InputSwitch } from \"primereact/inputswitch\"\r\nimport ComposanteService from \"../../services/composanteService\"\r\nimport { enumOrganismeFormationCategorie } from \"../../enums/enumOrganismeFormationCategorie\"\r\nimport { WysiwygMultiView } from \"../wysiwyg/wysiwygMultiView\"\r\nimport { enumBreakpoint } from \"../../enums/enumBreakpoint\"\r\nimport { enumConfWysiwyg } from \"../../enums/enumConfWysiwyg\"\r\n\r\nexport const FormFicheOrganismeFormation = (props) => {\r\n\r\n const currentUser = useAuthState()\r\n\r\n const history = useHistory()\r\n const ecoleService = new EcoleService()\r\n const composanteService = new ComposanteService()\r\n const [loading, setLoading] = useState(true)\r\n const [submitting, setSubmitting] = useState(false)\r\n const [organismeFormation, setOrganismeFormation] = useState(null)\r\n const [submitted, setSubmitted] = useState(false)\r\n const fileUploaderCouverture = useRef(null);\r\n const [erreurImageCouverture, setErreurImageCouverture] = useState(null)\r\n const [validImageCouvertureType, setValidImageCouvertureType] = useState(false);\r\n\r\n const { t } = useTranslation();\r\n\r\n const toast = useRef(null);\r\n\r\n\r\n const saveItemsAdmin = [\r\n {\r\n label: t('general.save_and_quit'),\r\n icon: 'pi pi-sign-out',\r\n command: () => {\r\n updateFiche(true, false)\r\n }\r\n },\r\n {\r\n label: t('general.save_and_visualize'),\r\n icon: 'pi pi-eye',\r\n command: () => {\r\n updateFiche(false, true)\r\n }\r\n }\r\n ]\r\n\r\n const saveItemsEcole = [\r\n {\r\n label: t('general.save_and_visualize'),\r\n icon: 'pi pi-eye',\r\n command: () => {\r\n updateFiche(false, true)\r\n }\r\n }\r\n ]\r\n\r\n\r\n useEffect(() => {\r\n loadFiche();\r\n }, [])\r\n\r\n const loadFiche = () => {\r\n if (props.organismeFormationCategorie == enumOrganismeFormationCategorie.ECOLE) {\r\n ecoleService.getEcoleFiche(history.location.state?.ecoleId)\r\n .then(ecole => {\r\n if(ecole.descriptionEcole === null){\r\n ecole.descriptionEcole = {}\r\n }\r\n setOrganismeFormation(ecole)\r\n if (ecole.imageCouverture) {\r\n controllImageCouvertureTypeValidity(ecole.imageCouverture.format);\r\n }\r\n })\r\n .catch(err => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 });\r\n })\r\n .finally(() => {\r\n setLoading(false)\r\n })\r\n }\r\n else if (props.organismeFormationCategorie == enumOrganismeFormationCategorie.COMPOSANTEECOLE) {\r\n composanteService.getComposanteEcoleFiche(history.location.state?.composanteEcoleId)\r\n .then(composanteEcole => {\r\n if(composanteEcole.descriptionComposanteEcole === null){\r\n composanteEcole.descriptionComposanteEcole = {}\r\n }\r\n setOrganismeFormation(composanteEcole)\r\n if (composanteEcole.imageCouverture) {\r\n controllImageCouvertureTypeValidity(composanteEcole.imageCouverture.format);\r\n }\r\n })\r\n .catch(err => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 });\r\n })\r\n .finally(() => {\r\n setLoading(false)\r\n })\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 });\r\n }\r\n\r\n }\r\n\r\n const updateFiche = (saveandquit, visualize) => {\r\n setSubmitted(true)\r\n if (props.organismeFormationCategorie == enumOrganismeFormationCategorie.ECOLE) {\r\n if (organismeFormation.nomEcole.trim() &&\r\n (organismeFormation.fileImageCouverture || organismeFormation.imageCouverture) &&\r\n validImageCouvertureType &&\r\n (organismeFormation.descriptionEcole.contenu || organismeFormation.descriptionEcole.contenuMobile) &&\r\n (organismeFormation.referent?.trim() == null || organismeFormation.referent?.trim() == '' || (/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(organismeFormation.referent?.trim())))\r\n ) {\r\n setSubmitting(true)\r\n toast.current.show({ severity: 'info', summary: t('general.onGoing'), detail: t('general.onGoing_message'), life: 3000 })\r\n ecoleService.updateEcoleFiche(currentUser, organismeFormation)\r\n .then((ecole) => {\r\n setOrganismeFormation(ecole)\r\n if (ecole.imageCouverture) {\r\n controllImageCouvertureTypeValidity(ecole.imageCouverture.format);\r\n }\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('school.profile_updated'), life: 3000 });\r\n if (saveandquit) {\r\n history.push('/ecoles')\r\n }\r\n if (visualize) {\r\n history.push('/school/' + ecole.id.toString())\r\n }\r\n })\r\n .catch((err) => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_save'), life: 3000 })\r\n })\r\n .finally(() => {\r\n setSubmitting(false)\r\n })\r\n setSubmitted(false)\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('errors.incomplete_summary'), detail: t('errors.incomplete_detail'), life: 3000 })\r\n }\r\n }\r\n else if (props.organismeFormationCategorie == enumOrganismeFormationCategorie.COMPOSANTEECOLE) {\r\n if (organismeFormation.ecole.nomEcole.trim() &&\r\n organismeFormation.nom.trim() &&\r\n (organismeFormation.fileImageCouverture || organismeFormation.imageCouverture) &&\r\n validImageCouvertureType &&\r\n (organismeFormation.descriptionComposanteEcole.contenu || organismeFormation.descriptionComposanteEcole.contenuMobile) &&\r\n (organismeFormation.referent?.trim() == null || organismeFormation.referent?.trim() == '' || (/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(organismeFormation.referent?.trim())))\r\n ) {\r\n setSubmitting(true)\r\n toast.current.show({ severity: 'info', summary: t('general.onGoing'), detail: t('general.onGoing_message'), life: 3000 })\r\n composanteService.updateComposanteEcoleFiche(currentUser, organismeFormation)\r\n .then((composanteEcole) => {\r\n setOrganismeFormation(composanteEcole)\r\n if (composanteEcole.imageCouverture) {\r\n controllImageCouvertureTypeValidity(composanteEcole.imageCouverture.format);\r\n }\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('school.profile_updated'), life: 3000 });\r\n if (saveandquit) {\r\n history.push('/ecoles')\r\n }\r\n if (visualize) {\r\n history.push('/schoolEntity/' + composanteEcole.id.toString())\r\n }\r\n })\r\n .catch((err) => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_save'), life: 3000 })\r\n })\r\n .finally(() => {\r\n setSubmitting(false)\r\n })\r\n setSubmitted(false)\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('errors.incomplete_summary'), detail: t('errors.incomplete_detail'), life: 3000 })\r\n }\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_load'), life: 3000 })\r\n }\r\n\r\n }\r\n\r\n const onInputChange = (e, name) => {\r\n let val = e.target.value;\r\n let _organismeFormation = { ...organismeFormation };\r\n _organismeFormation[`${name}`] = val;\r\n setOrganismeFormation(_organismeFormation);\r\n };\r\n\r\n // File\r\n const onUploadCouverture = ({ files }) => {\r\n const _organismeFormation = { ...organismeFormation }\r\n _organismeFormation.fileImageCouverture = files[0];\r\n controllImageCouvertureTypeValidity(files[0].type)\r\n setOrganismeFormation(_organismeFormation);\r\n fileUploaderCouverture.current.clear();\r\n };\r\n\r\n const onSelectCouverture = ({ files }) => {\r\n setErreurImageCouverture(files[0].size > 5000000);\r\n };\r\n\r\n const handleRemoveCouverture = () => {\r\n let _organismeFormation = { ...organismeFormation };\r\n _organismeFormation.fileImageCouverture = null;\r\n setOrganismeFormation(_organismeFormation);\r\n }\r\n\r\n const handleRemoveFichierCouverture = () => {\r\n let _organismeFormation = { ...organismeFormation };\r\n _organismeFormation.imageCouverture = null;\r\n setOrganismeFormation(_organismeFormation);\r\n }\r\n\r\n const controllImageCouvertureTypeValidity = (type) => {\r\n if (allowedImageFileType.indexOf(type) > -1) {\r\n setValidImageCouvertureType(true);\r\n }\r\n else {\r\n setValidImageCouvertureType(false)\r\n }\r\n }\r\n\r\n const onEditorChange = (content, editor, view) => {\r\n let _organismeFormation = { ...organismeFormation };\r\n if (props.organismeFormationCategorie == enumOrganismeFormationCategorie.COMPOSANTEECOLE) {\r\n if (view == enumBreakpoint.PC) {\r\n _organismeFormation.descriptionComposanteEcole.contenu = content\r\n }\r\n else if (view == enumBreakpoint.MOBILE) {\r\n _organismeFormation.descriptionComposanteEcole.contenuMobile = content\r\n }\r\n }\r\n else if(props.organismeFormationCategorie == enumOrganismeFormationCategorie.ECOLE){\r\n if (view == enumBreakpoint.PC) {\r\n _organismeFormation.descriptionEcole.contenu = content\r\n }\r\n else if (view == enumBreakpoint.MOBILE) {\r\n _organismeFormation.descriptionEcole.contenuMobile = content\r\n }\r\n }\r\n setOrganismeFormation(_organismeFormation)\r\n }\r\n\r\n const onReturnClick = () => {\r\n if (RoleHelper.isAdmin(currentUser) || RoleHelper.isSuperAdmin(currentUser)) {\r\n history.push('/ecoles')\r\n } else {\r\n if (props.organismeFormationCategorie == enumOrganismeFormationCategorie.COMPOSANTEECOLE) {\r\n history.push('/composantes')\r\n }\r\n else {\r\n history.push('/dashboard')\r\n }\r\n\r\n }\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n {props.organismeFormationCategorie == enumOrganismeFormationCategorie.ECOLE && }\r\n {props.organismeFormationCategorie == enumOrganismeFormationCategorie.COMPOSANTEECOLE && }\r\n \r\n {loading ? (\r\n
\r\n ) : (\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n onInputChange(e, 'estVisible')}\r\n />\r\n
\r\n
\r\n \r\n *\r\n \r\n \r\n {submitted && !organismeFormation?.nomEcole && !organismeFormation?.ecole?.nomEcole && . }\r\n
\r\n {\r\n props.organismeFormationCategorie == enumOrganismeFormationCategorie.COMPOSANTEECOLE &&\r\n <>\r\n
\r\n
\r\n
\r\n \r\n *\r\n \r\n onInputChange(e, 'nom')}\r\n className={classNames({ 'p-invalid': submitted && !organismeFormation?.nom })} />\r\n {submitted && !organismeFormation?.nom && . }\r\n
\r\n >\r\n }\r\n
\r\n \r\n \r\n \r\n onInputChange(e, 'acronyme')}\r\n />\r\n
\r\n
\r\n \r\n \r\n \r\n onInputChange(e, 'referent')}\r\n className={classNames({ 'p-invalid': submitted && (organismeFormation.referent && (!organismeFormation.referent && organismeFormation.referent?.trim() != '' || (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(organismeFormation.referent)))) })}\r\n />\r\n {submitted && (organismeFormation.referent && (organismeFormation.referent?.trim() != '' && (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(organismeFormation.referent)))) && }\r\n
\r\n
\r\n \r\n \r\n \r\n onInputChange(e, 'siteInternetOfficiel')}\r\n />\r\n
\r\n
\r\n \r\n \r\n \r\n onInputChange(e, 'pageFacebook')}\r\n />\r\n
\r\n
\r\n \r\n \r\n \r\n onInputChange(e, 'pageInstagram')}\r\n />\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n onInputChange(e, 'pageLinkedin')}\r\n />\r\n
\r\n
\r\n
\r\n * \r\n
\r\n
\r\n {organismeFormation?.fileImageCouverture?.name &&\r\n
{organismeFormation?.fileImageCouverture?.name} handleRemoveCouverture()}\r\n style={{ left: \"1em\" }}\r\n /> \r\n ||\r\n (organismeFormation?.imageCouverture?.name &&\r\n
{organismeFormation?.imageCouverture?.name} handleRemoveFichierCouverture()}\r\n style={{ left: \"1em\" }}\r\n /> \r\n )}\r\n {submitted && !organismeFormation.fileImageCouverture && !organismeFormation.imageCouverture &&
}\r\n {!validImageCouvertureType && organismeFormation.fileImageCouverture &&
}\r\n
\r\n {erreurImageCouverture && }\r\n
\r\n
\r\n
\r\n * \r\n
\r\n
\r\n onEditorChange(content, editor, enumBreakpoint.PC)}\r\n onChangeMobile={(content, editor) => onEditorChange(content, editor, enumBreakpoint.MOBILE)}\r\n Conf={enumConfWysiwyg.ULTRA}\r\n />\r\n {submitted && ((props.organismeFormationCategorie == enumOrganismeFormationCategorie.COMPOSANTEECOLE && !organismeFormation.descriptionComposanteEcole.contenu && !organismeFormation.descriptionComposanteEcole.contenuMobile) || (props.organismeFormationCategorie == enumOrganismeFormationCategorie.ECOLE && !organismeFormation.descriptionEcole.contenu && !organismeFormation.descriptionEcole.contenuMobile)) && }\r\n
\r\n
\r\n
\r\n
\r\n updateFiche(false, false)}\r\n model={RoleHelper.isSuperAdmin(currentUser) || RoleHelper.isAdmin(currentUser) ? (saveItemsAdmin) : (saveItemsEcole)}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n \r\n )}\r\n
\r\n )\r\n}","import React from 'react';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\n\r\nexport const CampusLocationFormater = (props) => {\r\n\r\n return (\r\n <>\r\n {(props.campus.commune?.libelle || props.campus.ville || props.campus.pays) && }\r\n {props.campus.commune?.libelle ? (\r\n <>\r\n {props.campus.commune?.libelle} \r\n >\r\n ) : (\r\n <>\r\n {props.campus.ville} \r\n >\r\n )}\r\n {(props.campus.commune?.libelle || props.campus.ville) && props.campus.pays && }\r\n {props.campus.pays && {props.campus.pays} }\r\n >\r\n )\r\n}","import { Button } from \"primereact/button\"\r\nimport { useTranslation } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\"\r\nimport './noLongerAvailable.css'\r\n\r\nexport const NoLongerAvailable = () => {\r\n\r\n const { t } = useTranslation()\r\n const history = useHistory()\r\n\r\n const goToHome = () => {\r\n history.push('/')\r\n }\r\n\r\n return (\r\n \r\n
{t('errors.no_longer_available')}
\r\n
\r\n
\r\n
\r\n )\r\n}","import { DisplayImage } from \"../image/displayImage\"\r\nimport \"./backgroundImageBottomEllipsis.css\"\r\n\r\nexport const BackgroundImageBottomEllipsis = (props) => {\r\n return (\r\n \r\n {props.imageId &&
}\r\n \r\n \r\n
\r\n \r\n )\r\n}","import { Button } from \"primereact/button\";\r\nimport { Card } from \"primereact/card\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { Fragment, useEffect, useRef, useState } from \"react\";\r\nimport { Trans } from \"react-i18next\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { DisplayImage } from \"../../components/image/displayImage\";\r\nimport { IoLogoLinkedin } from 'react-icons/io5';\r\nimport { IoLogoFacebook } from 'react-icons/io5';\r\nimport { IoLogoInstagram } from 'react-icons/io5';\r\nimport { IoLogoTwitter } from 'react-icons/io5';\r\nimport EcoleService from \"../../services/ecoleService\"\r\nimport \"./vueOrganismeFormation.css\";\r\nimport { CampusLocationFormater } from \"../../components/formater/campusLocationFormater\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { Mailto } from \"../../components/mailto/mailto\";\r\nimport { NoLongerAvailable } from \"../../scenes/errors/noLongerAvailable\";\r\nimport { enumHttpError } from \"../../enums/enumHttpError\";\r\nimport { WysiwygRenderer } from \"../../components/wysiwyg/wysiwygRenderer\";\r\nimport { WysiwygResponsiveRenderer } from \"../../components/wysiwyg/wysiwygResponsiveRenderer\";\r\nimport ComposanteService from \"../../services/composanteService\";\r\nimport { enumOrganismeFormationCategorie } from \"../../enums/enumOrganismeFormationCategorie\";\r\nimport { BackgroundImageBottomEllipsis } from \"../../components/background/backgroundImageBottomEllipsis\";\r\nimport { useAuthState } from \"../../context/context\";\r\nimport RoleHelper from \"../../utils/roleHelper\";\r\nimport {Helmet} from \"react-helmet\";\r\n\r\nexport const VueOrganismeFormation = (props) => {\r\n\r\n const { t } = useTranslation()\r\n const history = useHistory();\r\n const currentUser = useAuthState();\r\n\r\n const [organismeFormation, setOrganismeFormation] = useState(null)\r\n const [mainTitle, setMainTitle] = useState(null)\r\n const [subTitle, setSubTitle] = useState(null)\r\n const [logoId, setLogoId] = useState(null)\r\n const [campus, setCampus] = useState([])\r\n const [loading, setLoading] = useState(true)\r\n const [available, setAvailable] = useState(false)\r\n const [showMoreCampus, setShowMoreCampus] = useState(false);\r\n const [description, setDescription] = useState(null)\r\n\r\n const ecoleService = new EcoleService();\r\n const composanteEcoleService = new ComposanteService();\r\n\r\n const toast = useRef(null)\r\n\r\n useEffect(() => {\r\n loadData()\r\n }, [])\r\n\r\n const abonnements = {\r\n SANSABONNEMENT: \"Sans abonnement\",\r\n PARTNERSHIP: \"Partnership\",\r\n CLASSIC: \"Classic\",\r\n ANALYTICS: \"Analytics\"\r\n }\r\n\r\n const campusAlphaSort = (a, b) => {\r\n\r\n if (a.commune && b.commune) {\r\n return a.commune.libelle.localeCompare(b.commune.libelle, 'en', { sensitivity: 'base' })\r\n }\r\n else if (a.commune && b.ville) {\r\n return a.commune.libelle.localeCompare(b.ville, 'en', { sensitivity: 'base' })\r\n\r\n }\r\n else if (a.ville && b.commune) {\r\n return a.ville.localeCompare(b.commune.libelle, 'en', { sensitivity: 'base' })\r\n\r\n }\r\n return 0;\r\n }\r\n\r\n const campusFilterDuplicate = (campus) => {\r\n const filtered = [];\r\n\r\n if (campus) {\r\n for (let i = 0; i < campus.length; i++) {\r\n var tmpLibelle = \"\";\r\n\r\n if (campus[i].commune) {\r\n tmpLibelle = campus[i].commune.libelle;\r\n }\r\n else if (campus[i].ville) {\r\n tmpLibelle = campus[i].ville;\r\n }\r\n\r\n if (tmpLibelle != \"\" && !filtered.some(campu => campu.commune?.libelle === tmpLibelle) && !filtered.some(campu => campu.ville === tmpLibelle)) {\r\n filtered.push(campus[i]);\r\n }\r\n }\r\n }\r\n return filtered;\r\n }\r\n\r\n const loadData = () => {\r\n if (props.organismeFormationCategorie == enumOrganismeFormationCategorie.ECOLE) {\r\n ecoleService.getEcoleFicheExtended(props.organismeFormationId)\r\n .then(ecole => {\r\n setOrganismeFormation(ecole)\r\n setLogoId(ecole.logoId)\r\n if (ecole.acronyme) {\r\n setMainTitle(ecole.nomEcole + ' (' + ecole.acronyme + ')')\r\n }\r\n else {\r\n setMainTitle(ecole.nomEcole)\r\n }\r\n setCampus(campusFilterDuplicate(ecole.campus?.sort(campusAlphaSort)))\r\n setDescription(ecole.descriptionEcole)\r\n setAvailable(true)\r\n setLoading(false)\r\n })\r\n .catch(err => {\r\n if (err.message == enumHttpError.NOLONGERAVAILABLE) {\r\n setAvailable(false)\r\n setLoading(false)\r\n } else {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 });\r\n }\r\n })\r\n }\r\n else if (props.organismeFormationCategorie == enumOrganismeFormationCategorie.COMPOSANTEECOLE) {\r\n composanteEcoleService.getComposanteEcoleFicheExtended(props.organismeFormationId)\r\n .then(composanteEcole => {\r\n setOrganismeFormation(composanteEcole)\r\n if (composanteEcole.logoId) {\r\n setLogoId(composanteEcole.logoId)\r\n }\r\n else {\r\n setLogoId(composanteEcole.ecole.logoId)\r\n }\r\n if (composanteEcole.acronyme) {\r\n setMainTitle(composanteEcole.nom + ' (' + composanteEcole.acronyme + ')')\r\n }\r\n else {\r\n setMainTitle(composanteEcole.nom)\r\n }\r\n if (composanteEcole.ecole.acronyme) {\r\n setSubTitle(composanteEcole.ecole.nomEcole + ' (' + composanteEcole.ecole.acronyme + ')')\r\n }\r\n else {\r\n setSubTitle(composanteEcole.ecole.nomEcole)\r\n }\r\n setCampus(campusFilterDuplicate(composanteEcole.ecole.campus?.sort(campusAlphaSort)))\r\n setDescription(composanteEcole.descriptionComposanteEcole)\r\n setAvailable(true)\r\n setLoading(false)\r\n })\r\n .catch(err => {\r\n if (err.message == enumHttpError.NOLONGERAVAILABLE) {\r\n setAvailable(false)\r\n setLoading(false)\r\n } else {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 });\r\n }\r\n })\r\n } else {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 });\r\n }\r\n\r\n }\r\n\r\n const goToOurCourses = () => {\r\n let filters = []\r\n if (props.organismeFormationCategorie == enumOrganismeFormationCategorie.ECOLE) {\r\n filters.push({ label: organismeFormation.nomEcole, value: organismeFormation.id.toString(), categorie: 9 })\r\n }\r\n else if (props.organismeFormationCategorie == enumOrganismeFormationCategorie.COMPOSANTEECOLE) {\r\n filters.push({ label: organismeFormation.nom, value: organismeFormation.id.toString(), categorie: 8 })\r\n }\r\n history.push({\r\n pathname: '/rechercheAffinee',\r\n state: { filters }\r\n });\r\n }\r\n\r\n const goToWebsite = () => {\r\n var win = window.open(organismeFormation.siteInternetOfficiel)\r\n win.focus();\r\n }\r\n\r\n const onLinkedinClick = () => {\r\n var win = window.open(organismeFormation.pageLinkedin)\r\n win.focus();\r\n }\r\n\r\n const onTwitterClick = () => {\r\n var win = window.open(organismeFormation.pageTwitter)\r\n win.focus();\r\n }\r\n\r\n const onFacebookClick = () => {\r\n var win = window.open(organismeFormation.pageFacebook)\r\n win.focus();\r\n }\r\n\r\n const onInstagramClick = () => {\r\n var win = window.open(organismeFormation.pageInstagram)\r\n win.focus();\r\n }\r\n\r\n return (\r\n \r\n {!loading ?
\r\n \r\n \r\n {mainTitle} - DiplomAdvisor \r\n \r\n \r\n : ''}\r\n
\r\n {loading ? (\r\n
\r\n ) : (\r\n available ? (\r\n
\r\n {organismeFormation.imageCouvertureId ? (\r\n
\r\n ) : (\r\n <>\r\n >\r\n )}\r\n
\r\n
\r\n \r\n
\r\n {logoId &&
\r\n \r\n
}\r\n
\r\n
{mainTitle} \r\n {subTitle &&
{subTitle} }\r\n
\r\n {organismeFormation?.pageLinkedin &&
onLinkedinClick()} />
}\r\n {organismeFormation?.pageTwitter &&
onTwitterClick()} />
}\r\n {organismeFormation?.pageFacebook &&
onFacebookClick()} />
}\r\n {organismeFormation?.pageInstagram &&
onInstagramClick()} />
}\r\n
\r\n
\r\n goToOurCourses()} > \r\n
\r\n
\r\n
\r\n
\r\n
\r\n {organismeFormation.referent\r\n && ((props.organismeFormationCategorie == enumOrganismeFormationCategorie.COMPOSANTEECOLE && organismeFormation?.abonnementType != abonnements.SANSABONNEMENT)\r\n || (props.organismeFormationCategorie == enumOrganismeFormationCategorie.ECOLE && organismeFormation?.composanteEcole && organismeFormation?.composanteEcole[0]?.abonnementType != abonnements.SANSABONNEMENT))\r\n && }\r\n
\r\n
\r\n {organismeFormation.siteInternetOfficiel && (\r\n RoleHelper.isSuperAdmin(currentUser)\r\n || RoleHelper.isAdmin(currentUser)\r\n || (props.organismeFormationCategorie == enumOrganismeFormationCategorie.COMPOSANTEECOLE && organismeFormation?.abonnementType != abonnements.SANSABONNEMENT)\r\n || (props.organismeFormationCategorie == enumOrganismeFormationCategorie.ECOLE && organismeFormation?.composanteEcole && organismeFormation?.composanteEcole[0]?.abonnementType != abonnements.SANSABONNEMENT)\r\n )\r\n && goToWebsite()} > }\r\n
\r\n
\r\n
\r\n \r\n\r\n
\r\n\r\n
\r\n \r\n \r\n\r\n
\r\n\r\n
\r\n \r\n \r\n {campus.map((campu, indexCampu) => (\r\n \r\n {indexCampu < 5 &&
}\r\n \r\n ))}\r\n {showMoreCampus && campus.map((campu, indexCampu) => (\r\n \r\n {indexCampu >= 5 &&
}\r\n \r\n ))}\r\n {campus.length > 5 && showMoreCampus == false &&
\r\n setShowMoreCampus(true)} />\r\n
}\r\n \r\n \r\n
\r\n
\r\n
\r\n ) : (\r\n
\r\n ))\r\n }\r\n\r\n\r\n
\r\n )\r\n}","import { useAuthState } from \"../context/context\";\r\nimport Helper from \"../utils/helper\";\r\nimport { Button } from \"primereact/button\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router\";\r\n\r\n\r\nimport MessagerieService from \"../services/messagerieService\";\r\nimport { IoBriefcaseSharp, IoChevronBackCircle } from \"react-icons/io5\";\r\nimport './messagerie-box.css';\r\nimport { AzureCommunicationTokenCredential, CommunicationUserIdentifier } from '@azure/communication-common';\r\nimport {\r\n ChatAdapter,\r\n ChatComposite,\r\n CompositeLocale,\r\n createAzureCommunicationChatAdapter, \r\n useAzureCommunicationChatAdapter,\r\n fromFlatCommunicationIdentifier, \r\n DEFAULT_COMPONENT_ICONS, \r\n COMPOSITE_LOCALE_FR_FR\r\n} from '@azure/communication-react';\r\nimport { PartialTheme, Theme } from '@fluentui/react';\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport { initializeIcons } from '@fluentui/react/lib/Icons';\r\nimport { registerIcons } from '@fluentui/react';\r\n\r\n\r\n\r\n\r\nconst messagerieService = new MessagerieService();\r\n\r\nexport const Messagerie_Box = (props) => {\r\n const { t } = useTranslation();\r\n const currentUser = useAuthState();\r\n const [loading, setLoading] = useState(false);\r\n const [adapter, setAdapter] = useState();\r\n const [informationComplementaire, setInformationComplementaire] = useState(null);\r\n\r\n registerIcons({ icons: DEFAULT_COMPONENT_ICONS });\r\n initializeIcons();\r\n\r\n\r\n const credential = useMemo(() => {\r\n try {\r\n\r\n return new AzureCommunicationTokenCredential(props.token);\r\n } catch {\r\n console.error('Failed to construct token credential');\r\n return undefined;\r\n }\r\n }, [props.token]);\r\n\r\n\r\n\r\n\r\n\r\n useEffect(() => {\r\n\r\n if (!!credential && props && props.threadId) {\r\n setLoading(true);\r\n createAzureCommunicationChatAdapter({\r\n endpoint: props.endpointUrl,\r\n userId: fromFlatCommunicationIdentifier(props.userId),\r\n displayName: props.displayName,\r\n credential,\r\n threadId: props.threadId,\r\n maxPageSize: 5\r\n\r\n })\r\n .then(_datas => {\r\n _datas.on(\"messageReceived\", props.MessageReceivedListener)\r\n _datas.on(\"messageSent\", props.MessageSentListener)\r\n // _datas.fetchInitialData();\r\n // _datas.loadPreviousChatMessages(10);\r\n setAdapter(_datas);\r\n loadInformationComplementaire(props.threadId)\r\n })\r\n .catch((err) => {\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n }\r\n );\r\n }\r\n }, [props, credential]);\r\n\r\n\r\n\r\n const loadInformationComplementaire = (threadsId) => {\r\n if (threadsId) {\r\n //setInformationComplementaireLoading(true);\r\n setInformationComplementaire(null)\r\n let httpPromise;\r\n httpPromise = messagerieService.getMyThreadInfo(currentUser, [threadsId]);\r\n httpPromise\r\n .then(_compInfo => {\r\n setInformationComplementaire(_compInfo[0]);\r\n })\r\n .catch((err) => {\r\n props.toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 })\r\n })\r\n //.finally(() => setInformationComplementaireLoading(false));\r\n }\r\n}\r\n\r\nconst seeProfile = () => {\r\n var win = window.open(\"/Candidat/\" + `${informationComplementaire.interlocuteur.urlCode}` + \"/\" + Helper.clearString(informationComplementaire.interlocuteur.prenom) + \"-\" + Helper.clearString(informationComplementaire.interlocuteur.nom))\r\n win.focus();\r\n}\r\n\r\n const onFetchAvatarPersonaData = (userId) => {\r\n if (informationComplementaire) {\r\n return { imageUrl: window.API_URL + \"/api/image/getProfileImage/\" + informationComplementaire.interlocuteur.pictureId };\r\n }\r\n else {\r\n\r\n return messagerieService.GetUserInfo(currentUser, userId).then(_chatUser => {\r\n\r\n if (_chatUser && _chatUser.pictureId) {\r\n return { imageUrl: window.API_URL + \"/api/image/getProfileImage/\" + _chatUser.pictureId };\r\n }\r\n })\r\n }\r\n\r\n }\r\n\r\n const teamsTheme = {\r\n palette: {\r\n // themePrimary: 'var(--terra-cotta)',\r\n themeLight: '#FADAD6',\r\n neutralLighter: '#E6EFEE', \r\n }\r\n };\r\n\r\n if (adapter) {\r\n \r\n return (\r\n \r\n {loading ? (\r\n
\r\n ) : (\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n {informationComplementaire && informationComplementaire.interlocuteur.typeUser == 0 && <>
{informationComplementaire.interlocuteur.nom} {informationComplementaire.interlocuteur.prenom}
>}\r\n\r\n {informationComplementaire && informationComplementaire.interlocuteur.typeUser == 1 && <>
{informationComplementaire.interlocuteur.nom} {informationComplementaire.interlocuteur.prenom} {informationComplementaire.interlocuteur.nomEntreprise}
>}\r\n {informationComplementaire && informationComplementaire.offreEmploi && informationComplementaire.offreEmploi.length > 0 && <>
{informationComplementaire.offreEmploi?.map(e => e.intitule).join(',')}
>}\r\n
\r\n
\r\n\r\n
\r\n {informationComplementaire && informationComplementaire.interlocuteur.typeUser == 0 && <>\r\n seeProfile()} > {t('general.profile')} >}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
)}\r\n
\r\n )\r\n }\r\n if (credential === undefined) {\r\n return <>Failed to construct credential. Provided token is malformed.>;\r\n }\r\n return <>Initializing...>;\r\n}","import { Avatar } from \"primereact/avatar\"\r\nimport { useEffect, useState } from \"react\"\r\nimport { DisplayProfileImage } from \"../image/displayProfileImage\"\r\nimport \"./avatarRenderer.css\"\r\n\r\nimport ImageService from '../../services/imageService';\r\n\r\n\r\nexport const AvatarRenderer = (props) => {\r\n\r\n const [imageUrl, setImageUrl] = useState(props.imageUrl)\r\n const [color, setColor] = useState(null)\r\n const [colorHexa, setColorHexa] = useState(null)\r\n\r\n useEffect(() => {\r\n if (props.colorSeed) {\r\n let reste = props.colorSeed % 5\r\n switch (reste) {\r\n case 0:\r\n setColor('green')\r\n setColorHexa('#22C55E')\r\n break;\r\n case 1:\r\n setColor('blue')\r\n setColorHexa('#3B82F6')\r\n break;\r\n case 2:\r\n setColor('yellow')\r\n setColorHexa('#F59E0B')\r\n break;\r\n case 3:\r\n setColor('purple')\r\n setColorHexa('#A855F7')\r\n break;\r\n case 4:\r\n setColor('red')\r\n setColorHexa('#EF4444')\r\n break;\r\n default:\r\n setColor('')\r\n setColorHexa('#9bc1bc')\r\n break;\r\n }\r\n }\r\n\r\n \r\n }, [])\r\n\r\n useEffect(() => {\r\n if(props.imageId != null && props.imageId !== \"0\")\r\n {\r\n var imageService = new ImageService();\r\n imageService.getProfileImage(props.imageId)\r\n .then(response => {\r\n let blob = new Blob(\r\n [response.data],\r\n { type: response.headers['content-type'] }\r\n )\r\n let image = URL.createObjectURL(blob);\r\n setImageUrl(image);\r\n });\r\n \r\n return function cleanup() {\r\n URL.revokeObjectURL(imageUrl);\r\n };\r\n }\r\n \r\n }, props.imageId);\r\n\r\n return (\r\n \r\n {/* { {props.display == \"image\" && props.imageId &&
}\r\n {props.display == \"initials\" && props.prenom && props.nom && props.colorSeed &&
{props.prenom[0]}{props.nom[0]}
}\r\n {!props.display &&
} } */}\r\n\r\n {(props.text == null || props.text == \"\") && (imageUrl == null || imageUrl == \"\") &&
}\r\n {(props.text != null && props.text != \"\") && (imageUrl == null || imageUrl == \"\") &&
}\r\n {(imageUrl != null && imageUrl != \"\") &&
}\r\n
\r\n )\r\n}","import { useAuthState } from \"../context/context\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\n\r\nimport { DisplayProfileImage } from '../components/image/displayProfileImage';\r\nimport { AvatarRenderer } from '../components/avatar/avatarRenderer';\r\n\r\nimport { Button } from \"primereact/button\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Avatar } from \"primereact/avatar\";\r\nimport { ProgressBar } from 'primereact/progressbar';\r\nimport { DataView, DataViewLayoutOptions } from 'primereact/dataview';\r\n\r\nimport MessagerieService from \"../services/messagerieService\";\r\n\r\nimport { IoBriefcaseSharp, IoChevronForward } from \"react-icons/io5\";\r\nimport './messagerie-bar.css';\r\n\r\n\r\n\r\nexport const Messagerie_Bar = (props) => {\r\n const { t } = useTranslation();\r\n\r\n const currentUser = useAuthState();\r\n const [threadList, setThreadList] = useState(null);\r\n const [informationComplementaire, setInformationComplementaire] = useState(null);\r\n const [informationComplementaireLoading, setInformationComplementaireLoading] = useState(true);\r\n const [layout, setLayout] = useState('list');\r\n const [loading, setLoading] = useState(false);\r\n\r\n const messagerieService = new MessagerieService();\r\n\r\n useEffect(() => {\r\n loadLazyData(true);\r\n }, []);\r\n\r\n const loadLazyData = (reload) => {\r\n setLoading(true);\r\n let httpPromise;\r\n httpPromise = messagerieService.getMyThread2(currentUser);\r\n httpPromise\r\n .then(_threads => {\r\n setThreadList(_threads);\r\n if (reload && _threads && _threads.length > 0 && props.threadId == null) {\r\n props.onMessagerieBarClick(_threads[0].thread.id)\r\n }\r\n loadInformationComplementaire(_threads.map(x => x.thread.id));\r\n })\r\n .catch((err) => {\r\n props.toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 })\r\n })\r\n .finally(() => setLoading(false));\r\n }\r\n\r\n const loadInformationComplementaire = (threadsIds) => {\r\n if (threadsIds.length > 0) {\r\n setInformationComplementaireLoading(true);\r\n let httpPromise;\r\n httpPromise = messagerieService.getMyThreadInfo(currentUser, threadsIds);\r\n httpPromise\r\n .then(_compInfo => {\r\n setInformationComplementaire(_compInfo);\r\n })\r\n .catch((err) => {\r\n props.toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 })\r\n })\r\n .finally(() => setInformationComplementaireLoading(false));\r\n }\r\n }\r\n\r\n const clickThread = (data) => {\r\n props.onMessagerieBarClick(data);\r\n }\r\n\r\n const clickDeleteThread = (data) => {\r\n let httpPromise;\r\n httpPromise = messagerieService.closeThread(currentUser, data);\r\n httpPromise\r\n .then(_threads => {\r\n loadLazyData();\r\n })\r\n .catch((err) => {\r\n props.toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 })\r\n })\r\n .finally(() => setLoading(false));\r\n }\r\n\r\n\r\n const renderListItem = (data) => {\r\n return (\r\n \r\n
clickThread(data.thread.id)}>\r\n
\r\n\r\n
\r\n \r\n \r\n \r\n
thread.threadId == data.thread.id)?.pictureId} text={!informationComplementaireLoading ? informationComplementaire?.find(thread => thread.threadId == data.thread.id)?.interlocuteur?.nom[0] + informationComplementaire?.find(thread => thread.threadId == data.thread.id)?.interlocuteur?.prenom[0] : \"\"} colorSeed={data.thread.id}> \r\n
\r\n \r\n \r\n \r\n\r\n {/* Topic */}\r\n
Topic : {data.thread.topic}
\r\n\r\n {/* Nom de l'interlocuteur : En bleu */}\r\n\r\n {!informationComplementaireLoading && informationComplementaire && informationComplementaire.find(thread => thread.threadId == data.thread.id)?.interlocuteur.typeUser == 0 &&
{informationComplementaire.find(thread => thread.threadId == data.thread.id)?.interlocuteur?.nom + ' ' + informationComplementaire.find(thread => thread.threadId == data.thread.id)?.interlocuteur?.prenom}
}\r\n {!informationComplementaireLoading && informationComplementaire && informationComplementaire.find(thread => thread.threadId == data.thread.id)?.interlocuteur.typeUser == 1 &&
{informationComplementaire.find(thread => thread.threadId == data.thread.id)?.interlocuteur?.nom + ' ' + informationComplementaire.find(thread => thread.threadId == data.thread.id)?.interlocuteur?.prenom}
}\r\n {!informationComplementaireLoading && informationComplementaire && informationComplementaire.find(thread => thread.threadId == data.thread.id)?.interlocuteur.typeUser == 1 &&
{informationComplementaire.find(thread => thread.threadId == data.thread.id)?.interlocuteur?.nomEntreprise}
}\r\n\r\n {/* Dernier message recu : En gras si non lu */}\r\n
{data.lastMessage.content.message ? (
{data.lastMessage.content.message}
) : (
)}
\r\n\r\n {/* Recrutement/OffreEmploi Liée : Affiché si > 0 : Icone Valise + Concat Intitulé */}\r\n
{informationComplementaireLoading ?\r\n (
)\r\n :\r\n (informationComplementaire.find(thread => thread.threadId == data.thread.id)?.offreEmploi.length > 0 ?\r\n (
\r\n {informationComplementaire.find(thread => thread.threadId == data.thread.id)?.offreEmploi?.map(e => e.intitule).join(',')}
)\r\n : '')}\r\n
\r\n\r\n {/* Bouttons d'action : Commenté */}\r\n {/* {data.deletedOn == null &&
\r\n clickThread(data.thread.id)}> \r\n clickDeleteThread(data.id)}> \r\n\r\n
}\r\n {data.deletedOn != null &&
\r\n Conversation suprimée \r\n\r\n
} */}\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n\r\n const itemTemplate = (product, layout) => {\r\n if (!product) {\r\n return;\r\n }\r\n return renderListItem(product);\r\n }\r\n\r\n const renderHeader = () => {\r\n return (\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n const header = renderHeader();\r\n\r\n return (\r\n \r\n \r\n
\r\n )\r\n}","import { useAuthState } from \"../context/context\";\r\nimport { useHistory } from \"react-router\";\r\nimport { Button } from \"primereact/button\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { Fragment, useEffect, useRef, useState } from \"react\";\r\nimport { Trans } from \"react-i18next\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { enumHttpError } from \"../enums/enumHttpError\";\r\nimport MessagerieService from \"../services/messagerieService\";\r\nimport Helper from \"../utils/helper\";\r\nimport './messagerie.css';\r\nimport { Messagerie_Box } from '../pages/messagerie-box';\r\nimport { Messagerie_Bar } from '../pages/messagerie-bar';\r\nimport { enumBreakpoint } from \"../enums/enumBreakpoint\";\r\n\r\n\r\nexport const Messagerie = () => {\r\n const history = useHistory();\r\n const currentUser = useAuthState();\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [threadId, setThreadId] = useState(null);\r\n const [token, setTokent] = useState(null);\r\n const [endpoint, setEndpoint] = useState(null);\r\n const [communicationId, setCommunicationId] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const { t } = useTranslation();\r\n const toast = useRef(null);\r\n const [displayConv, setDisplayConv] = useState(false);\r\n const [displayMobile, setDisplayMobile] = useState(false);\r\n\r\n const messagerieService = new MessagerieService();\r\n\r\n useEffect(() => {\r\n tryParseJsonFilters();\r\n loadLazyData();\r\n }, []);\r\n\r\n\r\n const tryParseJsonFilters = () => {\r\n var query = new URLSearchParams(history.location.search);\r\n var thread = query.get('Thread');\r\n\r\n if (thread != \"\") {\r\n setThreadId(thread);\r\n }\r\n }\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n let httpPromise;\r\n httpPromise = messagerieService.getMyInfo(currentUser);\r\n httpPromise\r\n .then(_communicationInfo => {\r\n setCommunicationId(_communicationInfo.userCommunicationIdentifier);\r\n setTokent(_communicationInfo.userToken);\r\n setEndpoint(_communicationInfo.communicationEnpoint)\r\n })\r\n .catch((err) => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 })\r\n })\r\n .finally(() => setLoading(false));\r\n }\r\n\r\n const MessageReceivedListener = (message) => {\r\n\r\n }\r\n\r\n const MessageSentListener = (message) => {\r\n\r\n }\r\n\r\n const onMessagerieBarClick = (data) => {\r\n setThreadId(data)\r\n setDisplayConv(true);\r\n let _windowWidth = window.innerWidth;\r\n setDisplayMobile(!(_windowWidth >= enumBreakpoint.PC))\r\n\r\n }\r\n\r\n const onToggleClickMobile = () => {\r\n setDisplayConv(!displayConv);\r\n let _windowWidth = window.innerWidth;\r\n \r\n setDisplayMobile(!(_windowWidth >= enumBreakpoint))\r\n\r\n }\r\n\r\n return (\r\n \r\n
\r\n {loading ? (\r\n
\r\n ) : (\r\n
\r\n {communicationId && token && endpoint &&
\r\n \r\n\r\n \r\n
}\r\n {threadId && communicationId && token && endpoint && ((displayMobile && displayConv) || (!displayMobile)) &&
\r\n \r\n\r\n \r\n
}\r\n
)}\r\n
\r\n )\r\n}","import React, { useEffect, useState } from 'react';\r\nimport { Card } from \"primereact/card\"\r\nimport { Chart } from \"primereact/chart\"\r\nimport { ProgressSpinner } from 'primereact/progressspinner';\r\n\r\nexport const PieChartCard = (props) => {\r\n\r\n const [options] = useState({\r\n plugins: {\r\n legend: {\r\n labels: {\r\n color: '#495057'\r\n },\r\n position: 'bottom'\r\n }\r\n }\r\n });\r\n\r\n return (\r\n \r\n
\r\n {\r\n props.loading ? (\r\n \r\n ) : (\r\n <>\r\n {props.title} \r\n \r\n \r\n
\r\n >\r\n )\r\n }\r\n \r\n
\r\n )\r\n}","export default __webpack_public_path__ + \"static/media/boyStudyingDesk.f605ccff.png\";","export default __webpack_public_path__ + \"static/media/3d-casual-life-looking-through-resumes.63b76730.png\";","import React, { Component, useState, useRef } from 'react';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { Button } from 'primereact/button';\r\nimport { Trans,useTranslation } from 'react-i18next';\r\nimport { InputText } from 'primereact/inputtext';\r\nimport { Toast } from 'primereact/toast';\r\nimport 'primeflex/primeflex.css';\r\nimport AuthService from '../../services/authService';\r\n\r\n\r\nfunction Password_Forgot(props) {\r\n\r\n const [displayForgotPW,setDisplayForgotPW] = useState(false);\r\n const [position,setPosition] = useState('center');\r\n const [email,setEmail] = useState('');\r\n const toast = useRef(null);\r\n const [errorMessage,setErrorMessage] = useState('');\r\n const [loading,setLoading] = useState(false);\r\n const { t } = useTranslation();\r\n const authService = new AuthService();\r\n\r\n const showInfo = () => {\r\n toast.current.show({ severity: 'info', summary: t('password.mail_reset'), detail: t('general.check_mail') });\r\n }\r\n const showError = () => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.try_again') });\r\n }\r\n\r\n const renderFooter = (name) => {\r\n return (\r\n setDisplayForgotPW(false)} className=\"p-button-text\" />\r\n \r\n
);\r\n }\r\n\r\n const handleForgottenPassword = () => {\r\n setLoading(true);\r\n authService.forgotPassword(email)\r\n .then(async response => {\r\n setDisplayForgotPW(false);\r\n if (response==='') {\r\n showInfo();\r\n }\r\n else {\r\n showError();\r\n }\r\n setLoading(false);\r\n })\r\n .catch(error => {\r\n setErrorMessage(error.toString());\r\n console.error('There was an error!', error);\r\n setDisplayForgotPW(false);\r\n showError();\r\n setLoading(false);\r\n });\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n
setDisplayForgotPW(false)}>\r\n \r\n
\r\n \r\n setEmail( e.target.value)} aria-describedby=\"email-help\" />\r\n \r\n
\r\n
\r\n \r\n
\r\n );\r\n\r\n\r\n}\r\n\r\nexport default Password_Forgot;","import React, { useEffect, useState, useRef } from 'react';\r\nimport { InputText } from 'primereact/inputtext';\r\nimport { Password } from 'primereact/password';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { Button } from 'primereact/button';\r\nimport Password_Forgot from '../password/password_forgot';\r\nimport 'primeflex/primeflex.css';\r\nimport './formLoginStudent.css';\r\nimport './formLoginCompany.css';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useAuthState, useAuthDispatch } from '../../context/context';\r\nimport { loginUser } from '../../context/actions';\r\nimport { Toast } from 'primereact/toast';\r\nimport 'primeicons/primeicons.css';\r\nimport { enumRoles } from '../../enums/enumRoles';\r\nimport { enumHttpError } from '../../enums/enumHttpError';\r\nimport RoleHelper from '../../utils/roleHelper';\r\n\r\nexport const FormLogin = (props) => {\r\n const [userEmail, setUserEmail] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const history = useHistory();\r\n const dispatch = useAuthDispatch();\r\n const { loading, errorMessage } = useAuthState();\r\n const toast = useRef(null);\r\n const [cssType, setCssType] = useState('fl-etudiant');\r\n\r\n const { t } = useTranslation();\r\n\r\n useEffect (() => {\r\n if (props.userType == enumRoles.ETUDIANT) {\r\n setCssType('fl-etudiant');\r\n }\r\n else if (props.userType == enumRoles.ENTREPRISE) {\r\n setCssType('fl-entreprise');\r\n }\r\n }, [props.userType]);\r\n\r\n\r\n const showFailedLogin = () => {\r\n toast.current.show({ severity: 'error', summary: t('login.login_failed'), detail: t('login.wrong_credentials'), life: 3000 });\r\n }\r\n\r\n const showDisabled = () => {\r\n toast.current.show({ severity: 'info', summary: t('login.login_failed'), detail: t('login.disabled'), life: 3000 });\r\n }\r\n\r\n const showArchived = () => {\r\n toast.current.show({ severity: 'warn', summary: t('login.login_failed'), detail: t('login.archived'), life: 3000 });\r\n }\r\n\r\n const handleLogin = async (e) => {\r\n let payload = { userEmail, password }\r\n try {\r\n await loginUser(dispatch, payload);\r\n let _currentUser = JSON.parse(localStorage.getItem(\"currentUser\"))\r\n if (_currentUser?.user) {\r\n let _roles = RoleHelper.decodeRoles(_currentUser.token);\r\n _currentUser.roles = _roles\r\n if (RoleHelper.isEtudiant(_currentUser) && (history.location.pathname == \"/entreprise\" || history.location.pathname == \"/\")) {\r\n history.push('/offresCompatibles');\r\n }\r\n else if (RoleHelper.isEtudiant(_currentUser) && _currentUser.user.isRegistrationOnboardingCompleted == false) {\r\n history.push('/offresCompatibles');\r\n props.showOnboarding();\r\n }\r\n else if(RoleHelper.isEtudiant(_currentUser) && history.location.pathname ==\"/register?User=Student\" && _currentUser.user.isRegistrationOnboardingCompleted == true){\r\n history.push('/offresCompatibles');\r\n }\r\n else if (RoleHelper.isEntreprise(_currentUser))\r\n {\r\n if(props.urlBackLogin || history.location.pathname.match(/\\/Candidat\\/[a-zA-Z0-9]+\\/[a-zA-Z0-9-_]+/) != null)\r\n history.push(props.urlBackLogin ? props.urlBackLogin : history.location.pathname);\r\n else\r\n history.push('/offers')\r\n }\r\n }\r\n let _errorMessage = { ...errorMessage };\r\n if (_errorMessage.response.data.message == enumHttpError.BADLOGIN) {\r\n showFailedLogin();\r\n }\r\n else if (_errorMessage.response.data.message == enumHttpError.ACCOUNTDISABLED) {\r\n showDisabled();\r\n }\r\n else if (_errorMessage.response.data.message == enumHttpError.ACCOUNTARCHIVED) {\r\n showArchived();\r\n }\r\n else {\r\n history.push('/');\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n * \r\n setUserEmail(e.target.value)} \r\n />\r\n
\r\n
\r\n
* \r\n
setPassword(e.target.value)} \r\n />\r\n \r\n\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n","export const enumCodePartner = {\r\n NONE : 0,\r\n UPE06 : 1\r\n}","import React, { useEffect, useState, useRef } from 'react';\r\nimport { Form, Field } from 'react-final-form';\r\nimport { InputText } from 'primereact/inputtext';\r\nimport { Button } from 'primereact/button';\r\nimport { Fieldset } from 'primereact/fieldset';\r\nimport { Toast } from 'primereact/toast';\r\nimport { Password } from 'primereact/password';\r\nimport { Checkbox } from 'primereact/checkbox';\r\nimport { Divider } from 'primereact/divider';\r\nimport { classNames } from 'primereact/utils';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router';\r\nimport UserService from '../../services/userService';\r\nimport './formRegisterStudent.css';\r\nimport './formRegisterCompany.css';\r\nimport { Link } from 'react-router-dom';\r\nimport { enumRoles } from '../../enums/enumRoles';\r\nimport { enumCodePartner } from \"../../enums/enumCodePartner\";\r\n\r\nimport { loginUser } from '../../context/actions';\r\nimport { useAuthDispatch } from '../../context/context';\r\n\r\nexport const FormRegister = (props) => {\r\n const [formUser, setFormUser] = useState({});\r\n const [submitting, setSubmitting] = useState(false)\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const toast = useRef(null);\r\n const userService = new UserService();\r\n\r\n const [initialValues, setInitialValues] = useState({ \r\n nom: '', \r\n prenom: '', \r\n nomEntreprise: '', \r\n email: '', \r\n password: '', \r\n password2: '', \r\n phoneNumber: '', \r\n accept: false \r\n });\r\n\r\n const dispatch = useAuthDispatch();\r\n\r\n const [cssType, setCssType] = useState('frs-etudiant');\r\n useEffect(() => {\r\n if (props.userType == enumRoles.ETUDIANT) {\r\n setCssType('frs-etudiant');\r\n }\r\n else if (props.userType == enumRoles.ENTREPRISE) {\r\n setCssType('frs-entreprise');\r\n }\r\n\r\n }, [props.userType]);\r\n\r\n useEffect(() => {\r\n if (props.preSetFormRegister) {\r\n setInitialValues({\r\n nom: props.preSetFormRegister?.nom ? props.preSetFormRegister.nom : '',\r\n prenom: props.preSetFormRegister?.prenom ? props.preSetFormRegister.prenom : '',\r\n nomEntreprise: props.preSetFormRegister?.nomEntreprise ? props.preSetFormRegister.nomEntreprise : '',\r\n email: props.preSetFormRegister?.email ? props.preSetFormRegister.email : '',\r\n password: '',\r\n password2: '',\r\n phoneNumber: props.preSetFormRegister?.telephone ? props.preSetFormRegister.telephone : '',\r\n accept: false\r\n });\r\n }\r\n }, [props.preSetFormRegister]);\r\n\r\n const validate = (user) => {\r\n let errors = {};\r\n\r\n if (!user.nom) {\r\n errors.nom = ;\r\n }\r\n\r\n if (!user.prenom) {\r\n errors.prenom = ;\r\n }\r\n\r\n if (props.userType == enumRoles.ENTREPRISE) {\r\n if (!user.nomEntreprise) {\r\n errors.nomEntreprise = ;\r\n }\r\n }\r\n\r\n if (!user.email) {\r\n errors.email = ;\r\n }\r\n else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(user.email)) {\r\n errors.email = ;\r\n }\r\n\r\n if (!user.password) {\r\n errors.password = ;\r\n }\r\n else if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$/.test(user.password)) {\r\n errors.password = ;\r\n }\r\n\r\n if (props.userType == enumRoles.ENTREPRISE && !user.phoneNumber) {\r\n errors.phoneNumber = ;\r\n }\r\n else if (!/^[0-9]{0,13}$/.test(user.phoneNumber) && user.phoneNumber) {\r\n errors.phoneNumber = ;\r\n }\r\n\r\n if (!user.accept) {\r\n errors.accept = ;\r\n }\r\n\r\n return errors;\r\n };\r\n\r\n const onSubmit = (user, form) => {\r\n setSubmitting(true)\r\n setFormUser(user);\r\n userService.existEmail(user.email).then(reponse => {\r\n let bEmailExist = reponse;\r\n if (bEmailExist) {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('register.account_notcreated_emailexists'), life: 3000 });\r\n setSubmitting(false)\r\n }\r\n else {\r\n try {\r\n creerCompte(user);\r\n form.restart();\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('register.account_created'), life: 3000 });\r\n } catch (error) {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_save'), life: 3000 });\r\n setSubmitting(false)\r\n }\r\n\r\n }\r\n })\r\n };\r\n\r\n const creerCompte = (user) => {\r\n let payload = { userEmail: user.email, password: user.password };\r\n switch (props.userType) {\r\n case enumRoles.ETUDIANT:\r\n userService.createEtudiant(user, history.location.state?.previousUrl).then(_user => {\r\n loginUser(dispatch, payload).then(() => {\r\n setSubmitting(false);\r\n if (_user.isRegistrationOnboardingCompleted == false)\r\n props.showOnboarding();\r\n });\r\n })\r\n break;\r\n case enumRoles.ENTREPRISE:\r\n userService.createEntreprise(user, props.partner ? props.partner : enumCodePartner.NONE).then(_user => {\r\n loginUser(dispatch, payload).then(() => {\r\n // history.push('/');\r\n if(props.partner)\r\n history.push({ pathname: '/profile_company', hash: \"#abonnement\" });\r\n else\r\n history.push({ pathname: '/', state: \"firstConnection\" });\r\n });\r\n })\r\n break;\r\n default:\r\n throw Error;\r\n break;\r\n }\r\n }\r\n\r\n const isFormFieldValid = (meta) => !!(meta.touched && meta.error);\r\n const getFormErrorMessage = (meta) => {\r\n return isFormFieldValid(meta) && {meta.error} ;\r\n };\r\n\r\n const passwordHeader = ;\r\n const passwordFooter = (\r\n \r\n \r\n
\r\n \r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n {props.homeDesign ? (\r\n \r\n ) : (\r\n \r\n
\r\n \r\n {props.hasTitle &&
}\r\n
\r\n )} />\r\n
\r\n \r\n
\r\n )}\r\n >\r\n );\r\n}\r\n","import React, { useEffect, useState, useRef } from 'react';\r\n\r\nimport './register.css';\r\nimport { enumRoles } from '../../enums/enumRoles';\r\nimport { useHistory } from 'react-router-dom';\r\nimport boyStudyingDesk from '../../images/accueil/boyStudyingDesk.png';\r\nimport companyPicture from '../../images/3D/3d-casual-life-looking-through-resumes.png';\r\nimport { TabPanel, TabView } from 'primereact/tabview';\r\nimport { FormLogin } from '../../components/form/formLogin';\r\nimport { FormRegister } from '../../components/form/formRegister';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { ButtonGoBack } from '../../components/buttonGoBack/buttonGoBack';\r\n\r\nexport const Register = (props) => {\r\n\r\n const [userType, setUserType] = useState(null);\r\n const [preSetFormRegister, setPreSetFormRegister] = useState(null);\r\n \r\n \r\n const history = useHistory();\r\n const [activeIndex, setActiveIndex] = useState(history.location.pathname.toLowerCase() == \"/login\" ? 0 : 1);\r\n const [urlCandidate, setUrlCandidate] = useState(null)\r\n const { t } = useTranslation();\r\n\r\n const op = useRef(null)\r\n\r\n useEffect(() => {\r\n const query = new URLSearchParams(history.location.search);\r\n const userType = query.get('User');\r\n\r\n switch (history.location.state?.userType) {\r\n case enumRoles.ETUDIANT:\r\n setUserType(enumRoles.ETUDIANT);\r\n break;\r\n case enumRoles.ENTREPRISE:\r\n setUserType(enumRoles.ENTREPRISE);\r\n break;\r\n default:\r\n if (userType && userType?.toLowerCase() == \"student\") {\r\n setUserType(enumRoles.ETUDIANT);\r\n if(query.get('Email')){\r\n setPreSetFormRegister({\r\n email: decodeURIComponent(query.get('Email')),\r\n prenom: query.get('Prenom'),\r\n nom: query.get('Nom'),\r\n telephone: decodeURIComponent(query.get('Telephone'))\r\n })\r\n }\r\n }\r\n else if (userType && userType?.toLowerCase() == \"company\") {\r\n setUserType(enumRoles.ENTREPRISE);\r\n\r\n const nomEntrepriseUrl = query.get('NomEntreprise') ? decodeURIComponent(query.get('NomEntreprise')) : null;\r\n const emailUrl = query.get('Email') ? decodeURIComponent(query.get('Email')) : null;\r\n if(nomEntrepriseUrl && emailUrl){\r\n setPreSetFormRegister({nomEntreprise: nomEntrepriseUrl, email: emailUrl})\r\n }\r\n }\r\n else {\r\n history.push('/');\r\n }\r\n break;\r\n }\r\n\r\n if(history.location.state?.candidatUrl){\r\n setActiveIndex(0)\r\n setUrlCandidate(history.location.state?.candidatUrl)\r\n }\r\n }, [history.location.state])\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n {userType == enumRoles.ETUDIANT &&
{t('role.youre_not_connected_etudiant_title')}
}\r\n {userType == enumRoles.ENTREPRISE &&
{t('role.youre_not_connected_entreprise_title')}
}\r\n
{t('role.youre_not_connected_subscribe')} \r\n
\r\n
\r\n {userType == enumRoles.ETUDIANT &&
}\r\n {userType == enumRoles.ENTREPRISE &&
}\r\n
\r\n
\r\n
\r\n
\r\n setActiveIndex(e.index)}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { useRef } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { MenuSearchTooltip } from \"../../scenes/rechercheAffinee/menu/menuSearchTooltip\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { FileUpload } from \"primereact/fileupload\";\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { Dialog } from \"primereact/dialog\";\r\nimport { Button } from \"primereact/button\";\r\n\r\nexport const Import = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const fileUploaderRef = useRef(null);\r\n const [loading, setLoading] = useState(false)\r\n const currentUser = useAuthState()\r\n const toast = useRef(null)\r\n const [importFileDialog, setImportFileDialog] = useState(false);\r\n\r\n const onUploadFile = ({ files }) => {\r\n setLoading(true);\r\n toast.current.show({ severity: 'info', summary: t('general.onGoing'), detail: t('general.onGoing_message'), life: 3000 });\r\n props.promise(currentUser, files[0])\r\n .then(data => {\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('general.file_imported') });\r\n if (props.thenPromise) {\r\n props.thenPromise();\r\n }\r\n })\r\n .catch(err => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_import'), life: 3000 })\r\n })\r\n .finally(() => {\r\n setImportFileDialog(false);\r\n setLoading(false);\r\n fileUploaderRef.current.clear();\r\n })\r\n }\r\n\r\n const hideImportFileDialog = () => {\r\n setImportFileDialog(false);\r\n };\r\n\r\n const importFileDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n \r\n
{props.importTitle}{props.tooltipText && } \r\n \r\n \r\n
\r\n {loading &&
}\r\n
} />\r\n \r\n
\r\n \r\n \r\n \r\n { }\r\n
\r\n \r\n >\r\n )\r\n}","import React, { useRef, useState } from 'react';\r\nimport { FileUpload } from 'primereact/fileupload';\r\nimport { Button } from 'primereact/button';\r\nimport { Toast } from 'primereact/toast';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { useAuthState } from \"../../context/context\";\r\nimport 'primeflex/primeflex.css';\r\nimport { MenuSearchTooltip } from '../../scenes/rechercheAffinee/menu/menuSearchTooltip';\r\nimport { ProgressSpinner } from 'primereact/progressspinner';\r\nimport \"./importExport.css\"\r\nimport { Import } from './import';\r\n\r\nexport const ImportExport = (props) => {\r\n const toast = useRef(null);\r\n\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n {/*
\r\n
{props.importTitle}{props.tooltipText && } \r\n \r\n
\r\n
\r\n {loading &&
}\r\n
} />\r\n \r\n
*/}\r\n
\r\n
\r\n
\r\n
\r\n
{props.exportTitle} \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n )\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","export default __webpack_public_path__ + \"static/media/3d-business-man-and-woman-working-at-the-table.abe112f7.png\";","export default __webpack_public_path__ + \"static/media/UPE06.d17fe508.png\";","export const enumHeaderTheme = {\r\n RED : \"red\",\r\n BLUE : \"blue\",\r\n WHITE : \"white\",\r\n IRIS: \"iris\"\r\n}","export const enumBackgroundTheme = {\r\n WHISPER : \"whisper\"\r\n}","import React from \"react\";\r\n\r\nexport default React.createContext({\r\n lazyParams: {},\r\n setLazyParams: () => { },\r\n rechercheApi: () => { },\r\n totalOffresRecords: 0,\r\n tokenResetFilters : null\r\n});","import { Card } from \"primereact/card\"\r\nimport { Dropdown } from \"primereact/dropdown\"\r\nimport { InputText } from \"primereact/inputtext\"\r\nimport { SelectButton } from \"primereact/selectbutton\"\r\nimport { useContext, useEffect, useState } from \"react\"\r\nimport { enumCategorieRecherche } from \"../../enums/enumCategorieRecherche\"\r\nimport RechercheEntrepriseOffres from \"../../pages/entreprise/RechercheEntrepriseOffres\"\r\nimport RechercheService from \"../../services/rechercheService\"\r\nimport \"./filterPanelOffers.css\"\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { MultiSelect } from \"primereact/multiselect\"\r\nimport { useHistory } from \"react-router-dom/cjs/react-router-dom.min\"\r\nimport EntrepriseService from \"../../services/entrepriseService\"\r\n\r\nexport const FilterPanelOffers = () => {\r\n\r\n const history = useHistory()\r\n const { t } = useTranslation();\r\n const [diffusion, setDiffusion] = useState(0);\r\n const [localisation, setLocalisation] = useState(null);\r\n const [projetSelected, setProjetSelected] = useState(history?.location?.state?.filters?.map(x => { return x.value }) || [])\r\n const [localisationOptions, setLocalisationOptions] = useState([])\r\n const [projetOptions, setProjetOptions] = useState([])\r\n const [typeContrat, setTypeContrat] = useState([0]);\r\n const [loadingLocalisation, setLoadingLocalisation] = useState(true)\r\n const [loadingProjet, setLoadingProjet] = useState(true)\r\n const contextRecherche = useContext(RechercheEntrepriseOffres);\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId\r\n\r\n const rechercheService = new RechercheService();\r\n const entrepriseService = new EntrepriseService();\r\n\r\n const diffusionOptions = [\r\n { name: 'Toutes', value: 0 },\r\n { name: 'Diffusées', value: 1 },\r\n { name: 'Non Diffusées', value: 2 }\r\n ]\r\n\r\n const typeContratOptions = [\r\n { name: 'Tous', value: 0 },\r\n { name: 'Stage', value: 4 },\r\n { name: 'Alternance', value: 1 },\r\n { name: 'CDD', value: 2 },\r\n { name: 'CDI', value: 3 },\r\n ]\r\n\r\n const majResults = (_lazyParams) => {\r\n contextRecherche.setLazyParams(_lazyParams);\r\n contextRecherche.rechercheApi(_lazyParams);\r\n }\r\n\r\n const handleChangeProjet = (e) => {\r\n e.preventDefault()\r\n try {\r\n let _filters = [...contextRecherche.lazyParams.filters];\r\n\r\n let _newFilters = _filters.filter((e) => {\r\n return e.categorie !== enumCategorieRecherche.Projet\r\n })\r\n if (e.value) {\r\n e.value.forEach(p => {\r\n _newFilters.push({ categorie: enumCategorieRecherche.Projet, value: p })\r\n });\r\n }\r\n let _lazyParams = { ...contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 1;\r\n _lazyParams.filters = _newFilters;\r\n majResults(_lazyParams);\r\n setProjetSelected(e.value)\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n const handleChangeDiffusion = (e) => {\r\n e.preventDefault()\r\n try {\r\n let _filters = [...contextRecherche.lazyParams.filters];\r\n\r\n let _newFilters = _filters.filter((e) => {\r\n return e.categorie !== enumCategorieRecherche.Diffusion\r\n })\r\n if (e.value) {\r\n _newFilters.push({ categorie: enumCategorieRecherche.Diffusion, value: e.value })\r\n }\r\n let _lazyParams = { ...contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 1;\r\n _lazyParams.filters = _newFilters;\r\n majResults(_lazyParams);\r\n setDiffusion(e.value)\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n const handleChangeLocalisation = (e) => {\r\n e.preventDefault()\r\n try {\r\n let _filters = [...contextRecherche.lazyParams.filters];\r\n\r\n let _newFilters = _filters.filter((e) => {\r\n return e.categorie !== enumCategorieRecherche.Ville\r\n })\r\n if (e.value) {\r\n _newFilters.push({ categorie: enumCategorieRecherche.Ville, value: e.value, label: e.value })\r\n }\r\n let _lazyParams = { ...contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 1;\r\n _lazyParams.filters = _newFilters;\r\n majResults(_lazyParams);\r\n setLocalisation(e.value)\r\n } catch (error) {\r\n }\r\n }\r\n\r\n const handleChangeContrat = (e) => {\r\n e.preventDefault()\r\n try {\r\n let _filters = [...contextRecherche.lazyParams.filters];\r\n\r\n let _newFilters = _filters.filter((e) => {\r\n return e.categorie !== enumCategorieRecherche.TypeContrat\r\n })\r\n let _typeContrat = [...typeContrat]\r\n if ((_typeContrat.indexOf(0) == -1 && e.value.indexOf(0) > -1) || e.value.length === 0) {\r\n setTypeContrat([0])\r\n } else {\r\n let _filtersToPush = []\r\n e.value.forEach(val => {\r\n if (val != 0) {\r\n _filtersToPush.push(val)\r\n }\r\n });\r\n _filtersToPush.forEach(f => {\r\n _newFilters.push({ categorie: enumCategorieRecherche.TypeContrat, value: f, label: f })\r\n });\r\n setTypeContrat(_filtersToPush)\r\n }\r\n\r\n let _lazyParams = { ...contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 1;\r\n _lazyParams.filters = _newFilters;\r\n majResults(_lazyParams);\r\n } catch (error) {\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then((id) => {\r\n rechercheService.getRechercheLocalisationOffreEmploiEntreprise(id)\r\n .then(data => {\r\n setLocalisationOptions(data)\r\n setLoadingLocalisation(false)\r\n })\r\n rechercheService.getRechercheProjetOfEntreprise(id)\r\n .then(data => {\r\n setProjetOptions(data)\r\n setLoadingProjet(false)\r\n })\r\n })\r\n }, [])\r\n\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n handleChangeProjet(e)}\r\n placeholder={t('project.select')}\r\n />\r\n
\r\n
\r\n
\r\n \r\n handleChangeDiffusion(e)}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n handleChangeLocalisation(e)}\r\n showClear\r\n placeholder=\"Choisissez une localisation\"\r\n />\r\n
\r\n
\r\n
\r\n \r\n handleChangeContrat(e)}\r\n />\r\n
\r\n
\r\n )\r\n}","import { SelectButton } from 'primereact/selectbutton';\r\nimport \"./candidatStatutSelectButton.css\"\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const CandidatStatutSelectButton = (props) => {\r\n\r\n const { t } = useTranslation();\r\n\r\n const statutOptions = [\r\n {\r\n label:\r\n <>\r\n {props.entity?.filter(oe => { return oe.statut == 1 }).length}
\r\n {props.entity?.filter(oe => { return oe.statut == 1 }).length == 1 ? t('company.new.singular') : t('company.new.plural')}
\r\n {props.entity?.filter(oe => { return oe.statut == 1 }).length == 1 ? t('company.candidate.singular').toLowerCase() : t('company.candidate.plural').toLowerCase()}
\r\n >,\r\n value: 1\r\n },\r\n {\r\n label:\r\n <>\r\n {props.entity?.filter(oe => { return oe.statut == 2 }).length}
\r\n {props.entity?.filter(oe => { return oe.statut == 2 }).length == 1 ? t('company.candidate.singular') : t('company.candidate.plural')}
\r\n {t('company.waiting').toLowerCase()}
\r\n >,\r\n value: 2\r\n },\r\n {\r\n label:\r\n <>\r\n {props.entity?.filter(oe => { return oe.statut == 3 }).length}
\r\n {props.entity?.filter(oe => { return oe.statut == 3 }).length == 1 ? t('company.candidate.singular') : t('company.candidate.plural')}
\r\n {props.entity?.filter(oe => { return oe.statut == 3 }).length == 1 ? t('company.contacted.singular').toLowerCase() : t('company.contacted.plural').toLowerCase()}
\r\n >,\r\n value: 3\r\n },\r\n {\r\n label:\r\n <>\r\n {props.entity?.filter(oe => { return oe.statut == 4 }).length}
\r\n {props.entity?.filter(oe => { return oe.statut == 4 }).length == 1 ? t('company.interview.singular') : t('company.interview.plural')}
\r\n {props.entity?.filter(oe => { return oe.statut == 4 }).length == 1 ? t('company.done.singular').toLowerCase() : t('company.done.plural').toLowerCase()}
\r\n >,\r\n value: 4\r\n },\r\n {\r\n label:\r\n <>\r\n {props.entity?.filter(oe => { return oe.statut == 5 }).length}
\r\n {props.entity?.filter(oe => { return oe.statut == 5 }).length == 1 ? t('company.candidate.singular') : t('company.candidate.plural')}
\r\n {props.entity?.filter(oe => { return oe.statut == 5 }).length == 1 ? t('company.recruited.singular').toLowerCase() : t('company.recruited.plural').toLowerCase()}
\r\n >,\r\n value: 5\r\n },\r\n {\r\n label:\r\n <>\r\n {props.entity?.filter(oe => { return oe.statut == 6 }).length}
\r\n {props.entity?.filter(oe => { return oe.statut == 6 }).length == 1 ? t('company.candidate.singular') : t('company.candidate.plural')}
\r\n {props.entity?.filter(oe => { return oe.statut == 6 }).length == 1 ? t('company.rejected.singular').toLowerCase() : t('company.rejected.plural').toLowerCase()}
\r\n >,\r\n value: 6\r\n }\r\n ]\r\n\r\n return (\r\n props.setValue(e.value)} options={statutOptions} />\r\n )\r\n}","import { ConfirmDialog, confirmDialog } from \"primereact/confirmdialog\"\r\nimport { InputSwitch } from \"primereact/inputswitch\"\r\nimport { useContext, useState } from \"react\"\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\"\r\nimport parse from 'html-react-parser';\r\nimport \"./entrepriseOffreEmploiThumbnail.css\"\r\nimport OffreEmploiService from \"../../services/offreEmploiService\"\r\nimport { CandidatStatutSelectButton } from \"../selectButton/candidatStatutSelectButton\"\r\nimport { OverlayPanel } from \"primereact/overlaypanel\"\r\nimport { ProjetOverlayPanel } from \"../overlayPanel/projetOverlayPanel\"\r\nimport RoleHelper from \"../../utils/roleHelper\"\r\nimport { Tooltip } from \"primereact/tooltip\"\r\n\r\nexport const EntrepriseOffreEmploiThumbnail = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const [deleteDialog, setDeleteDialog] = useState(false)\r\n const [statut, setStatut] = useState(history.location?.state?.statut)\r\n const [loading, setLoading] = useState(false)\r\n const offreEmploiService = new OffreEmploiService();\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId\r\n\r\n const onViewClick = () => {\r\n const pathname = '/vueOffreEmploi?offreEmploiId=' + props.offreEmploi.id;\r\n RoleHelper.windowOpenadminImpersonatingRecruteurIdStorage(pathname, adminImpersonatingRecruteurId);\r\n }\r\n\r\n const onDuplicateClick = () => {\r\n history.push({ pathname: '/edition_annonce', state: { id: props.offreEmploi.id, adminImpersonatingRecruteurId:adminImpersonatingRecruteurId, duplicate: true } })\r\n }\r\n\r\n const onEditClick = () => {\r\n history.push({ pathname: '/edition_annonce', state: { id: props.offreEmploi.id, adminImpersonatingRecruteurId:adminImpersonatingRecruteurId } })\r\n }\r\n\r\n const onDeleteClick = () => {\r\n confirmDialog({\r\n message: 'Toutes les informations renseignées liées à cette annonce seront perdues.',\r\n header: 'Vous souhaitez supprimer votre annonce ?',\r\n rejctClassName: \"dip-btn-red-outline\",\r\n acceptClassName: 'dip-btn-red-bg',\r\n accept: () => {\r\n setLoading(true)\r\n offreEmploiService.deleteOffreEmploi(props.offreEmploi.id)\r\n .then(\r\n (data) => {\r\n let _lazyParams = { ...props.contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 1;\r\n props.contextRecherche.setLazyParams(_lazyParams);\r\n props.contextRecherche.rechercheApi(_lazyParams);\r\n })\r\n .finally(\r\n () => {\r\n setLoading(false)\r\n })\r\n },\r\n reject: () => { },\r\n acceptLabel: \"Supprimer\",\r\n rejectLabel: \"Annuler\"\r\n });\r\n }\r\n\r\n const handleChangeDiffusion = (e) => {\r\n setLoading(true)\r\n offreEmploiService.toggleDiffusion(props.offreEmploi.id)\r\n .then(\r\n (data) => {\r\n let _lazyParams = { ...props.contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 1;\r\n props.contextRecherche.setLazyParams(_lazyParams);\r\n props.contextRecherche.rechercheApi(_lazyParams);\r\n })\r\n .finally(\r\n () => {\r\n setLoading(false)\r\n })\r\n }\r\n\r\n const handleClickOffer = () => {\r\n history.push({ pathname: '/candidates', state: { id: props.offreEmploi.id,adminImpersonatingRecruteurId:adminImpersonatingRecruteurId } })\r\n }\r\n\r\n const onStatutClick = (value) => {\r\n if (props.isInAList) {\r\n history.push({ pathname: '/candidates', state: { id: props.offreEmploi.id, statut: value,adminImpersonatingRecruteurId:adminImpersonatingRecruteurId } })\r\n }\r\n else {\r\n props.setStatutFilter(value);\r\n }\r\n setStatut(value);\r\n }\r\n\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n handleChangeDiffusion(e)}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {/* onDuplicateClick */}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
handleClickOffer()}>\r\n
\r\n
{props.offreEmploi.intitule} \r\n \r\n
\r\n {props.offreEmploi.entreprise?.nom}\r\n \r\n
\r\n {props.offreEmploi.lieuTravail?.libelle}\r\n
\r\n
\r\n {props.offreEmploi.typeContratRecrutement} \r\n
\r\n
\r\n {props.offreEmploi?.description && parse(props.offreEmploi?.description)}\r\n
\r\n
\r\n
\r\n
\r\n setDeleteDialog(false)} rejectLabel=\"Annuler\" acceptLabel=\"Supprimer\">\r\n \r\n >\r\n )\r\n}","import React from \"react\";\r\n\r\nexport default React.createContext({\r\n lazyParams: {},\r\n setLazyParams: () => { },\r\n rechercheApi: () => { },\r\n totalCandidatsRecords: 0,\r\n tokenResetFilters : null\r\n});","import { Calendar } from \"primereact/calendar\"\r\nimport { Card } from \"primereact/card\"\r\nimport { Dropdown } from \"primereact/dropdown\"\r\nimport { InputText } from \"primereact/inputtext\"\r\nimport { SelectButton } from \"primereact/selectbutton\"\r\nimport { useContext, useEffect, useState } from \"react\"\r\nimport { enumCategorieRecherche } from \"../../enums/enumCategorieRecherche\"\r\nimport RechercheEntrepriseCandidats from \"../../pages/entreprise/RechercheEntrepriseCandidats\"\r\nimport RechercheService from \"../../services/rechercheService\"\r\nimport { Trans } from \"react-i18next\"\r\nimport { MultiSelect } from \"primereact/multiselect\"\r\nimport { useHistory } from \"react-router-dom/cjs/react-router-dom.min\"\r\nimport \"./filterPanelOffers.css\"\r\nimport EntrepriseService from \"../../services/entrepriseService\"\r\n\r\nexport const FilterPanelCandidates = (props) => {\r\n\r\n const history = useHistory()\r\n const [localisation, setLocalisation] = useState(null);\r\n const [localisationOptions, setLocalisationOptions] = useState([])\r\n const [disponibilite, setDisponibilite] = useState(null)\r\n const [loadingLocalisation, setLoadingLocalisation] = useState(true)\r\n const [loadingProjet, setLoadingProjet] = useState(true)\r\n const [projetSelected, setProjetSelected] = useState(history?.location?.state?.filters?.map(x => { return x.value }) || [])\r\n const [projetOptions, setProjetOptions] = useState([])\r\n const contextRecherche = useContext(RechercheEntrepriseCandidats);\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId;\r\n\r\n const rechercheService = new RechercheService();\r\n const entrepriseService = new EntrepriseService();\r\n\r\n const currentYear = new Date().getFullYear()\r\n\r\n const majResults = (_lazyParams) => {\r\n contextRecherche.setLazyParams(_lazyParams);\r\n contextRecherche.rechercheApi(_lazyParams);\r\n }\r\n\r\n const handleChangeProjet = (e) => {\r\n e.preventDefault()\r\n try {\r\n let _filters = [...contextRecherche.lazyParams.filters];\r\n\r\n let _newFilters = _filters.filter((e) => {\r\n return e.categorie !== enumCategorieRecherche.Projet\r\n })\r\n if (e.value) {\r\n e.value.forEach(p => {\r\n _newFilters.push({ categorie: enumCategorieRecherche.Projet, value: p })\r\n });\r\n }\r\n let _lazyParams = { ...contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 1;\r\n _lazyParams.filters = _newFilters;\r\n majResults(_lazyParams);\r\n setProjetSelected(e.value)\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n const handleChangeDisponibilite = (e) => {\r\n e.preventDefault()\r\n try {\r\n let _filters = [...contextRecherche.lazyParams.filters];\r\n\r\n let _newFilters = _filters.filter((e) => {\r\n return e.categorie !== enumCategorieRecherche.APartirDe\r\n })\r\n if (e.value) {\r\n _newFilters.push({ categorie: enumCategorieRecherche.APartirDe, value: e.value })\r\n }\r\n let _lazyParams = { ...contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 0;\r\n _lazyParams.filters = _newFilters;\r\n majResults(_lazyParams);\r\n setDisponibilite(e.value)\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n const handleChangeLocalisation = (e) => {\r\n e.preventDefault()\r\n try {\r\n let _filters = [...contextRecherche.lazyParams.filters];\r\n\r\n let _newFilters = _filters.filter((e) => {\r\n return e.categorie !== enumCategorieRecherche.Ville\r\n })\r\n if (e.value) {\r\n _newFilters.push({ categorie: enumCategorieRecherche.Ville, value: e.value, label: e.value })\r\n }\r\n let _lazyParams = { ...contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 0;\r\n _lazyParams.filters = _newFilters;\r\n majResults(_lazyParams);\r\n setLocalisation(e.value)\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (props.offreEmploiId)\r\n rechercheService.getRechercheLocalisationCandidatsOffreEmploi(props.offreEmploiId)\r\n .then(data => {\r\n setLocalisationOptions(data)\r\n setLoadingLocalisation(false)\r\n })\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then(id => {\r\n rechercheService.getRechercheProjetOfEntreprise(id)\r\n .then(data => {\r\n setProjetOptions(data)\r\n setLoadingProjet(false)\r\n })\r\n })\r\n }, [props.offreEmploiId])\r\n\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n handleChangeProjet(e)}\r\n placeholder=\"Sélectionnez un ou plusieurs projets\"\r\n />\r\n
\r\n
\r\n {props.offreEmploiId &&
\r\n
\r\n
\r\n handleChangeLocalisation(e)}\r\n showClear\r\n placeholder=\"Choisissez une localisation\"\r\n />\r\n
\r\n
}\r\n
\r\n
\r\n
\r\n handleChangeDisponibilite(e)}\r\n monthNavigator\r\n showIcon\r\n yearNavigator yearRange={`${currentYear}:${currentYear + 40}`}\r\n dateFormat='dd/mm/yy'\r\n />\r\n
\r\n
\r\n
\r\n )\r\n}","export const LieuResidenceFormater = (props) => {\r\n\r\n if (props.etudiant.etranger) {\r\n return props.etudiant.lieuResidence + \" (\" + props.etudiant.pays + \")\"\r\n }\r\n else {\r\n if (props.etudiant.commune) {\r\n return props.etudiant.commune?.libelle + \" (\" + props.etudiant.commune?.departement?.code + \")\"\r\n }\r\n else return \"\"\r\n }\r\n\r\n}","import { Dropdown } from \"primereact/dropdown\"\r\n\r\nexport const CandidatStatutDropdown = (props) => {\r\n\r\n const statutOptions = [\r\n { label: \"Nouveau candidat\", value: 1 },\r\n { label: \"Candidat en attente\", value: 2 },\r\n { label: \"Candidat contacté\", value: 3 },\r\n { label: \"Entretien passé\", value: 4 },\r\n { label: \"Candidat recruté\", value: 5 },\r\n { label: \"Candidat rejeté\", value: 6 }\r\n ]\r\n\r\n return (\r\n \r\n
Statut du candidat
\r\n
props.onChange(e)} optionLabel=\"label\" />\r\n \r\n )\r\n}","import { Card } from \"primereact/card\"\r\nimport { ConfirmDialog, confirmDialog } from \"primereact/confirmdialog\"\r\nimport { InputSwitch } from \"primereact/inputswitch\"\r\nimport { useContext, useState } from \"react\"\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\"\r\nimport parse from 'html-react-parser';\r\nimport \"./entrepriseCandidatThumbnail.css\"\r\nimport OffreEmploiService from \"../../services/offreEmploiService\"\r\nimport RechercheEntrepriseCandidats from \"../../pages/entreprise/RechercheEntrepriseCandidats\"\r\nimport { LieuResidenceFormater } from \"../formater/lieuResidenceFormater\"\r\nimport { DisplayProfileImage } from \"../image/displayProfileImage\"\r\nimport { Avatar } from \"primereact/avatar\"\r\nimport DocumentService from \"../../services/documentService\"\r\nimport { Button } from \"primereact/button\"\r\nimport Helper from \"../../utils/helper\"\r\nimport { CandidatStatutDropdown } from \"../dropdown/candidatStatutDropdown\";\r\nimport { Dialog } from \"primereact/dialog\"\r\nimport { Wysiwyg } from \"../wysiwyg/wysiwyg\"\r\nimport EntrepriseService from \"../../services/entrepriseService\"\r\nimport { useAuthState } from \"../../context/context\"\r\nimport RoleHelper from \"../../utils/roleHelper\"\r\nimport { ProjetOverlayPanel } from \"../overlayPanel/projetOverlayPanel\"\r\nimport { LikeEtudiant } from \"../like/likeEtudiant\"\r\n\r\nexport const EntrepriseCandidatThumbnail = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const currentUser = useAuthState();\r\n const [deleteDialog, setDeleteDialog] = useState(false)\r\n const [notesDialog, setNotesDialog] = useState(false)\r\n const [wysiwygContent, setWysiwygContent] = useState(props.candidat.notes)\r\n const [loading, setLoading] = useState(false)\r\n const history = useHistory();\r\n const offreEmploiService = new OffreEmploiService();\r\n const documentService = new DocumentService();\r\n const entrepriseService = new EntrepriseService();\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId;\r\n\r\n const contextRecherche = useContext(RechercheEntrepriseCandidats);\r\n\r\n const onDeleteClick = () => {\r\n confirmDialog({\r\n message: 'Toutes les informations renseignées liées à ce candidat seront perdues.',\r\n header: 'Vous souhaitez supprimer ce candidat ?',\r\n rejctClassName: \"dip-btn-red-outline\",\r\n acceptClassName: 'dip-btn-red-bg',\r\n accept: () => {\r\n let httpPromise = props.candidat.offreEmploiId ?\r\n offreEmploiService.deleteOffreEmploiEtudiant(props.candidat.offreEmploiId, props.candidat.etudiantId)\r\n :\r\n entrepriseService.unlike(props.candidat.etudiantId);\r\n httpPromise\r\n .then(\r\n (data) => {\r\n let _lazyParams = { ...contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 0;\r\n contextRecherche.setLazyParams(_lazyParams);\r\n contextRecherche.rechercheApi(_lazyParams);\r\n })\r\n .finally(\r\n () => {\r\n setLoading(false)\r\n })\r\n },\r\n reject: () => { },\r\n acceptLabel: \"Supprimer\",\r\n rejectLabel: \"Annuler\"\r\n });\r\n }\r\n\r\n const handleChangeStatut = (e) => {\r\n let _candidat = {}\r\n let httpPromise;\r\n _candidat.etudiantId = props.candidat.etudiantId\r\n _candidat.statut = e.value\r\n _candidat.notes = props.candidat.notes\r\n if (props.candidat.offreEmploiId) {\r\n _candidat.offreEmploiId = props.candidat.offreEmploiId\r\n httpPromise = offreEmploiService.updateOffreEmploiEtudiant(_candidat)\r\n }\r\n else {\r\n httpPromise = Promise.resolve();\r\n httpPromise = httpPromise\r\n .then(() => entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId))\r\n .then((id) => {\r\n _candidat.entrepriseId = id;\r\n return entrepriseService.updateEntrepriseEtudiant(_candidat);\r\n });\r\n }\r\n httpPromise\r\n .then((data) => {\r\n let _lazyParams = { ...contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 0;\r\n contextRecherche.setLazyParams(_lazyParams);\r\n contextRecherche.rechercheApi(_lazyParams);\r\n if (props.onStatutChange) {\r\n props.onStatutChange(e.value)\r\n }\r\n })\r\n .finally(\r\n () => {\r\n setLoading(false)\r\n })\r\n }\r\n\r\n const onShowNotes = () => {\r\n setLoading(true)\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then(id => {\r\n entrepriseService.getNotes(props.candidat.etudiantId, id)\r\n .then(notes => {\r\n setWysiwygContent(notes)\r\n setNotesDialog(true)\r\n })\r\n .catch(\r\n\r\n )\r\n .finally(\r\n () => { setLoading(false) }\r\n )\r\n })\r\n }\r\n\r\n const onWysiwygChange = (content, editor) => {\r\n setWysiwygContent(content);\r\n }\r\n\r\n const onWysiwygSave = () => {\r\n setLoading(true);\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then(id => {\r\n entrepriseService.postNotes(props.candidat.etudiantId, wysiwygContent, id)\r\n .then((data) => {\r\n setNotesDialog(false)\r\n })\r\n .finally(() => {\r\n setLoading(false)\r\n })\r\n })\r\n }\r\n\r\n const showCVPdf = () => {\r\n documentService.TelechargerDocumentCandidat(props.candidat.etudiant.fichierCvPdf.id).then(blob => {\r\n Helper.openWindowBlobFile(blob, props.candidat.etudiant.fichierCvPdf.name);\r\n });\r\n }\r\n\r\n const showPortfolio = () => {\r\n documentService.TelechargerDocumentCandidat(props.candidat.etudiant.fichierPortfolio.id).then(blob => {\r\n Helper.openWindowBlobFile(blob, props.candidat.etudiant.fichierPortfolio.name);\r\n });\r\n }\r\n\r\n const onCandidatClick = () => {\r\n if (props.candidat.offreEmploiId) {\r\n history.push({ pathname: '/Candidat/' + props.candidat.etudiant.urlCode + \"/\" + props.candidat.etudiant.prenom + \"-\" + props.candidat.etudiant.nom, state: { etudiantId: props.candidat.etudiantId, offreEmploiId: props.candidat.offreEmploiId, offreEmploiIntitule: props.candidat.offreEmploi?.intitule } })\r\n }\r\n else if (props.candidat.entrepriseId) {\r\n history.push({ pathname: '/Candidat/' + props.candidat.etudiant.urlCode + \"/\" + props.candidat.etudiant.prenom + \"-\" + props.candidat.etudiant.nom, state: { etudiantId: props.candidat.etudiantId, entrepriseId: props.candidat.entrepriseId, offreEmploiIntitule: props.candidat.offreEmploi?.intitule, adminImpersonatingRecruteurId: adminImpersonatingRecruteurId ? adminImpersonatingRecruteurId : null } })\r\n }\r\n\r\n }\r\n\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n {props.candidat.etudiant.fichierPhoto &&
}\r\n {!props.candidat.etudiant.fichierPhoto &&
}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
{props.candidat.etudiant.prenom} {props.candidat.etudiant.nom} \r\n \r\n {props.candidat.etudiant.niveauEtude &&\r\n
\r\n {props.candidat.etudiant.niveauEtude} \r\n \r\n }\r\n
\r\n \r\n
\r\n
\r\n {props.candidat.etudiant.presentation && parse(props.candidat.etudiant.presentation)}\r\n
\r\n
{props.candidat.etudiant.rechercheActiveCalendrier && {props.candidat.etudiant.rechercheActiveCalendrier} }
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {RoleHelper.isEntreprise(currentUser) &&
}\r\n {props.isInAList &&
onShowNotes(true)}>
}\r\n {props.candidat.statut == 6 &&
}\r\n {
}\r\n
\r\n
\r\n {props.candidat.etudiant.fichierCvPdf?.dateValidation && }\r\n
\r\n
\r\n {props.candidat.etudiant.fichierPortfolio?.dateValidation && }\r\n
\r\n
\r\n
\r\n handleChangeStatut(e)} />\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n { setNotesDialog(false); }} >\r\n \r\n \r\n \r\n
\r\n \r\n setDeleteDialog(false)} rejectLabel=\"Annuler\" acceptLabel=\"Supprimer\">\r\n \r\n >\r\n )\r\n}","import { SelectButton } from \"primereact/selectbutton\"\r\nimport { useContext, useState } from \"react\"\r\nimport { enumCategorieRecherche } from \"../../enums/enumCategorieRecherche\"\r\nimport RechercheEntrepriseOffres from \"../../pages/entreprise/RechercheEntrepriseOffres\"\r\nimport \"./filterPanelOffers.css\"\r\nimport { Trans } from \"react-i18next\"\r\n\r\nexport const FilterPanelProjects = () => {\r\n\r\n const [statut, setStatut] = useState('none');\r\n const contextRecherche = useContext(RechercheEntrepriseOffres);\r\n\r\n\r\n const statutOptions = [\r\n { name: 'Tous', value: 'none' },\r\n { name: 'Ouverts', value: 'true' },\r\n { name: 'Fermés', value: 'false' }\r\n ]\r\n \r\n const majResults = (_lazyParams) => {\r\n contextRecherche.setLazyParams(_lazyParams);\r\n contextRecherche.rechercheApi(_lazyParams);\r\n }\r\n\r\n const handleChangeStatut = (e) => {\r\n e.preventDefault()\r\n try {\r\n let _filters = [...contextRecherche.lazyParams.filters];\r\n\r\n let _newFilters = _filters.filter((e) => {\r\n return e.categorie !== enumCategorieRecherche.StatutRecrutement\r\n })\r\n if (e.value && e.value != \"none\") {\r\n _newFilters.push({ categorie: enumCategorieRecherche.StatutRecrutement, value: e.value })\r\n }\r\n let _lazyParams = { ...contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 1;\r\n _lazyParams.filters = _newFilters;\r\n majResults(_lazyParams);\r\n setStatut(e.value)\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n\r\n return (\r\n \r\n
\r\n
\r\n \r\n handleChangeStatut(e)}\r\n />\r\n
\r\n
\r\n )\r\n}","import { Trans } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\"\r\nimport RoleHelper from \"../../utils/roleHelper\"\r\n\r\nexport const EntrepriseProjetBreadCrumb = (props) => {\r\n\r\n const history = useHistory()\r\n\r\n const onProjetsClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,\"/projects\",{entrepriseId:history.location.state.entrepriseId})\r\n }\r\n\r\n return(\r\n \r\n = 1 && onProjetsClick}> \r\n {/* {props.step >= 1 && <>{\" > \"} >} */}\r\n
\r\n )\r\n}","import { Button } from \"primereact/button\";\r\nimport { InputText } from \"primereact/inputtext\";\r\nimport { InputTextarea } from \"primereact/inputtextarea\";\r\nimport { useRef, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\"\r\nimport ProjetService from \"../../services/projetService\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { useHistory } from \"react-router-dom/cjs/react-router-dom.min\";\r\nimport EntrepriseService from \"../../services/entrepriseService\";\r\n\r\nexport const EntrepriseProjetForm = (props) => {\r\n const history = useHistory();\r\n const { t } = useTranslation();\r\n const [projet, setProjet] = useState(props.projet)\r\n const [loadingSave, setLoadingSave] = useState(false)\r\n const toast = useRef(null);\r\n const projetService = new ProjetService();\r\n const entrepriseService = new EntrepriseService();\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId\r\n\r\n const onProjetChange = (e, name) => {\r\n let val = (e.value || e.target.value) || (typeof e?.target?.getContent === \"function\" && e?.target?.getContent()) || null;\r\n let _projet = { ...projet };\r\n _projet[`${name}`] = val;\r\n setProjet(_projet);\r\n }\r\n\r\n const showError = () => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.loading_failed'), life: 3000 });\r\n }\r\n\r\n const saveProject = () => {\r\n setLoadingSave(true);\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then(id => {\r\n projetService.createOrUpdateProjet(projet, id)\r\n .then(() => {\r\n setProjet(null)\r\n if (props.onSave)\r\n props.onSave() \r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoadingSave(false))\r\n })\r\n }\r\n return (\r\n <>\r\n \r\n \r\n
\r\n {t('project.name')} * \r\n onProjetChange(e, \"nom\")} />\r\n
\r\n
\r\n {t('project.description')} \r\n onProjetChange(e, \"description\")} />\r\n
\r\n
\r\n \r\n
\r\n
\r\n >\r\n )\r\n}","import { ConfirmDialog, confirmDialog } from \"primereact/confirmdialog\"\r\nimport { InputSwitch } from \"primereact/inputswitch\"\r\nimport { useContext, useState, useEffect, useRef } from \"react\"\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\"\r\nimport parse from 'html-react-parser';\r\nimport \"./entrepriseProjetThumbnail.css\"\r\nimport OffreEmploiService from \"../../services/offreEmploiService\"\r\nimport { Divider } from \"primereact/divider\"\r\nimport { Dialog } from \"primereact/dialog\"\r\nimport { EntrepriseProjetForm } from \"../../pages/entreprise/entrepriseProjetForm\"\r\nimport { Button } from \"primereact/button\"\r\nimport { Tooltip } from \"primereact/tooltip\"\r\nimport { enumCategorieRecherche } from \"../../enums/enumCategorieRecherche\"\r\nimport ProjetService from \"../../services/projetService\"\r\n\r\nexport const EntrepriseProjetThumbnail = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const [deleteDialog, setDeleteDialog] = useState(false)\r\n const [secondConfirmDeleteDialog, setSecondConfirmDeleteDialog] = useState(false)\r\n const [displayAddProject, setDisplayAddProject] = useState(false);\r\n const [loading, setLoading] = useState(false)\r\n const projetService = new ProjetService();\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId;\r\n\r\n const [isTruncated, setIsTruncated] = useState(false);\r\n const descriptionRef = useRef();\r\n\r\n useEffect(() => {\r\n const element = descriptionRef.current;\r\n\r\n if (element) {\r\n // Vérifier si le texte est tronqué\r\n setIsTruncated(element.scrollHeight > element.clientHeight + 1);\r\n }\r\n }, [props.projet?.description]);\r\n\r\n const onEditClick = () => {\r\n setDisplayAddProject(true);\r\n }\r\n\r\n const onConfirmAllDeleteDialog = () => {\r\n confirmDialog({\r\n message: 'Les éléments profils et formations seront supprimés.',\r\n header: 'Voulez-vous également supprimer tous les éléments qui étaient uniquement liés à ce projet ?',\r\n rejctClassName: \"dip-btn-red-outline\",\r\n acceptClassName: 'dip-btn-red-bg',\r\n accept: () => {\r\n // all delete\r\n setLoading(true)\r\n projetService.deleteProjet(props.projet.id, true)\r\n .then(\r\n (data) => {\r\n let _lazyParams = { ...props.contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 1;\r\n props.contextRecherche.setLazyParams(_lazyParams);\r\n props.contextRecherche.rechercheApi(_lazyParams);\r\n })\r\n .finally(\r\n () => {\r\n setLoading(false)\r\n })\r\n },\r\n reject: () => {\r\n // only projet delete\r\n setLoading(true)\r\n projetService.deleteProjet(props.projet.id, false)\r\n .then(\r\n (data) => {\r\n let _lazyParams = { ...props.contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 1;\r\n props.contextRecherche.setLazyParams(_lazyParams);\r\n props.contextRecherche.rechercheApi(_lazyParams);\r\n })\r\n .finally(\r\n () => {\r\n setLoading(false)\r\n })\r\n },\r\n acceptLabel: \"Supprimer\",\r\n rejectLabel: \"Conserver\"\r\n });\r\n }\r\n\r\n const onDeleteClick = () => {\r\n confirmDialog({\r\n message: 'Etes-vous sûr de vouloir supprimer ce projet ?',\r\n header: 'Confirmez-vous la suppression du projet ' + props.projet.nom + ' ?',\r\n rejctClassName: \"dip-btn-red-outline\",\r\n acceptClassName: 'dip-btn-red-bg',\r\n accept: () => {\r\n // setSecondConfirmDeleteDialog(true)\r\n onConfirmAllDeleteDialog()\r\n // setLoading(true)\r\n // projetService.deleteProjet(props.projet.id)\r\n // .then(\r\n // (data) => {\r\n // let _lazyParams = { ...props.contextRecherche.lazyParams };\r\n // _lazyParams.first = 0;\r\n // _lazyParams.page = 1;\r\n // props.contextRecherche.setLazyParams(_lazyParams);\r\n // props.contextRecherche.rechercheApi(_lazyParams);\r\n // })\r\n // .finally(\r\n // () => {\r\n // setLoading(false)\r\n // })\r\n },\r\n reject: () => { },\r\n acceptLabel: \"Supprimer\",\r\n rejectLabel: \"Annuler\"\r\n });\r\n }\r\n\r\n const handleChangeStatut = (e) => {\r\n setLoading(true)\r\n projetService.toggleStatut(props.projet.id)\r\n .then(\r\n (data) => {\r\n let _lazyParams = { ...props.contextRecherche.lazyParams };\r\n _lazyParams.first = 0;\r\n _lazyParams.page = 1;\r\n props.contextRecherche.setLazyParams(_lazyParams);\r\n props.contextRecherche.rechercheApi(_lazyParams);\r\n })\r\n .finally(\r\n () => {\r\n setLoading(false)\r\n })\r\n }\r\n\r\n const onHideAddProject = () => {\r\n setDisplayAddProject(false)\r\n }\r\n\r\n const onProfilsClick = () => {\r\n history.push({\r\n pathname: \"/seeked_profiles\",\r\n state: {\r\n filters:\r\n [\r\n { value: `${props.projet.id}`, label: props.projet.nom, categorie: enumCategorieRecherche.Projet }\r\n ],\r\n adminImpersonatingRecruteurId: adminImpersonatingRecruteurId\r\n\r\n }\r\n });\r\n }\r\n\r\n const onOffresClick = () => {\r\n history.push({\r\n pathname: \"/offers\",\r\n state: {\r\n filters:\r\n [\r\n { value: `${props.projet.id}`, label: props.projet.nom, categorie: enumCategorieRecherche.Projet }\r\n ],\r\n adminImpersonatingRecruteurId: adminImpersonatingRecruteurId\r\n }\r\n });\r\n }\r\n\r\n const onFormationsClick = () => {\r\n history.push({\r\n pathname: \"/formationsFavorites\",\r\n state: {\r\n filters:\r\n [\r\n { value: `${props.projet.id}`, label: props.projet.nom, categorie: enumCategorieRecherche.Projet }\r\n ],\r\n adminImpersonatingRecruteurId: adminImpersonatingRecruteurId\r\n }\r\n });\r\n }\r\n\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n Ouvert\r\n \r\n handleChangeStatut(e)}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {props.projet.nom}\r\n
\r\n
\r\n
\r\n {props.projet?.description && parse(props.projet?.description)}\r\n
\r\n {isTruncated &&
}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n Profils
\r\n \r\n {props.projet.compteurProjetEtudiants}
\r\n \r\n
\r\n
\r\n
\r\n Offres
\r\n \r\n {props.projet.compteurProjetOffreEmplois}
\r\n \r\n
\r\n
\r\n
\r\n Formations
\r\n \r\n {props.projet.compteurProjetFormations}
\r\n \r\n
\r\n
\r\n
\r\n Recherches
\r\n \r\n 0
\r\n \r\n
\r\n
\r\n
\r\n Alertes
\r\n \r\n 0
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n setDeleteDialog(false)} rejectLabel=\"Annuler\" acceptLabel=\"Supprimer\">\r\n \r\n setSecondConfirmDeleteDialog(false)} rejectLabel=\"Annuler\" acceptLabel=\"Supprimer\" />\r\n >\r\n )\r\n}","import { DT_Administrateur } from \"../components/datatable/dt_administrateurs\"\r\nimport { DT_Editeur } from \"../components/datatable/dt_editeurs\"\r\nimport { DT_CV_Etudiant } from \"../components/datatable/dt_cv_etudiants\"\r\nimport { DT_Etudiant } from \"../components/datatable/dt_etudiants\"\r\nimport { DT_Entreprise } from \"../components/datatable/dt_entreprises\"\r\nimport { DT_DemandeFormation_Etudiant } from \"../components/datatable/dt_demandeFormation_etudiants\"\r\nimport { Advertisements } from \"../scenes/advertisements\"\r\nimport { Companies } from \"../scenes/companies\"\r\nimport { Dashboard } from \"../scenes/dashboard/dashboard\"\r\nimport { Unauthorized } from \"../scenes/errors/unauthorized\"\r\nimport { Home } from \"../scenes/home/home\"\r\nimport { PasswordReset } from \"../scenes/passwordReset\"\r\nimport { ActivateAccount } from \"../scenes/activateAccount\"\r\nimport { ActivateAccountAdmin } from \"../scenes/activateAccountAdmin\"\r\nimport { Students } from \"../scenes/students\"\r\nimport { VueFormation } from \"../pages/vueFiche/vueFormation\"\r\nimport { FormStudentProfile } from \"../components/form/formStudentProfile\"\r\nimport { NotFound } from \"../scenes/errors/notFound\";\r\nimport { OffresCompatibles } from \"../scenes/offresCompatibles\"\r\nimport { RechercheAffinee } from \"../scenes/rechercheAffinee/rechercheAffinee\"\r\nimport { RechercheCandidats } from \"../pages/recrutement/rechercheCandidats\"\r\nimport { DT_Ecoles_Admin } from \"../components/datatable/dt_ecoles_admins\"\r\nimport { VueOffreEmploi } from \"../pages/vueFiche/vueOffreEmploi\"\r\nimport { AdministrationFormationsPage } from \"../pages/administration/formation/administrationFormationsPage\"\r\nimport { AdministrationEcolesPage } from \"../pages/administration/ecole/administrationEcolesPage\"\r\nimport { FormCompanyProfile } from \"../components/form/formCompanyProfile\"\r\nimport { FormationsFavorites } from \"../pages/favoris/formationsFavorites\"\r\nimport { FormationsOrphelinesPage } from \"../pages/administration/formation/formationsOrphelinesPage\"\r\nimport { VueCandidat } from \"../pages/vueFiche/vueCandidat\"\r\nimport { Confidentialite } from \"../pages/confidentialite\"\r\nimport { SavoirPlus_Etudiant } from \"../pages/Informations/savoirplus_etudiant\"\r\nimport { SavoirPlus_Entreprise} from \"../pages/Informations/savoirplus_entreprise\"\r\nimport { SavoirPlus_Ecole} from \"../pages/Informations/savoirplus_ecole\"\r\nimport { AnnonceInterne } from \"../pages/entreprise/annonceInterne\"\r\nimport { EditionFicheEcole } from \"../pages/editionFiche/editionFicheEcole\"\r\nimport { Candidatures } from \"../pages/candidatures\"\r\nimport { VueEcole } from \"../pages/vueFiche/vueEcole\"\r\nimport { AdministrationComposanteEcolesPage } from \"../pages/administration/composanteEcole/administrationComposanteEcolesPage\"\r\nimport { EditionFicheComposante } from \"../pages/editionFiche/editionFicheComposante\"\r\nimport { VueComposanteEcole } from \"../pages/vueFiche/vueComposanteEcole\"\r\nimport { Messagerie } from \"../pages/messagerie\"\r\nimport { AboutUs } from \"../pages/Informations/aboutUs\"\r\nimport { StatistiquesFormation } from \"../pages/statistiques/statistiquesFormation\"\r\nimport { Register } from \"../pages/register/register\"\r\nimport { ImportExportAdminPage } from \"../scenes/importExportAdminPage\"\r\nimport { enumRoles } from \"../enums/enumRoles\"\r\nimport { LandingPageEntreprise } from \"../pages/entreprise/landingPageEntreprise\"\r\nimport { LandingPageEntrepriseUpe06 } from \"../pages/entreprise/landingPageEntrepriseUpe06\"\r\nimport { enumHeaderTheme } from \"../enums/enumHeaderTheme\"\r\nimport { enumBackgroundTheme } from \"../enums/enumBackgroundTheme\"\r\nimport { EntrepriseOffres } from \"../pages/entreprise/entrepriseOffres\"\r\nimport { EntrepriseCandidats } from \"../pages/entreprise/entrepriseCandidats\"\r\nimport { EntrepriseFicheCandidat } from \"../pages/entreprise/entrepriseFicheCandidat\"\r\nimport { ProfilsRecherche } from \"../pages/entreprise/profilsRecherche\"\r\nimport { EntrepriseProjets } from \"../pages/entreprise/entrepriseProjets\"\r\nimport { FormCompanyAbonnementAdmin } from \"../components/form/formCompanyAbonnementAdmin\"\r\n\r\nconst routes = [\r\n {\r\n path: '/about-us',\r\n component: AboutUs,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n hasFooter : true,\r\n },\r\n {\r\n path: '/edition_annonce',\r\n component: AnnonceInterne,\r\n needsLogin: true,\r\n hasDashboard : false,\r\n hasFooter : true,\r\n headerTheme: enumHeaderTheme.WHITE\r\n },\r\n {\r\n path: '/students',\r\n component: Students,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n },\r\n {\r\n path: '/companies',\r\n component: Companies,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n hasWidthLimit : true,\r\n },\r\n {\r\n path: '/confidentiality',\r\n component: Confidentialite,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n },\r\n {\r\n path: '/candidatures',\r\n component: Candidatures,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n hasDashboardOnlyMobile : true,\r\n headerTheme : enumHeaderTheme.IRIS,\r\n hasWidthLimit : true,\r\n },\r\n {\r\n path: '/edition_fiche_ecole',\r\n component: EditionFicheEcole,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n },\r\n {\r\n path: '/edition_fiche_composante',\r\n component: EditionFicheComposante,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n },\r\n {\r\n path: '/advertisements',\r\n component: Advertisements,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n },\r\n {\r\n path : '/Candidat/:candidatUrl/:prenomNom?',\r\n component : VueCandidat,\r\n needsLogin : false,\r\n hasDashboard : false,\r\n className : \"whisper-background\",\r\n hasWidthLimit : true,\r\n headerTheme : enumHeaderTheme.IRIS\r\n },\r\n {\r\n path: '/passwordreset',\r\n component: PasswordReset,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n },\r\n {\r\n path: '/activateaccount',\r\n component: ActivateAccount,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n },\r\n {\r\n path: '/activateaccountadmin',\r\n component: ActivateAccountAdmin,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n },\r\n {\r\n path: '/dashboard',\r\n component: Dashboard,\r\n needsLogin: true,\r\n hasDashboard:true,\r\n headerTheme : enumHeaderTheme.IRIS\r\n },\r\n {\r\n path: '/profile_student',\r\n component: FormStudentProfile,\r\n needsLogin: true,\r\n hasDashboard : false,\r\n headerTheme : enumHeaderTheme.IRIS,\r\n hasWidthLimit : true,\r\n },\r\n {\r\n path: '/profile_company',\r\n component: FormCompanyProfile,\r\n needsLogin: true,\r\n hasDashboard : false,\r\n headerTheme : enumHeaderTheme.WHITE,\r\n hasWidthLimit : true\r\n },\r\n {\r\n path: '/subscription_admin_company',\r\n component: FormCompanyAbonnementAdmin,\r\n needsLogin: true,\r\n hasDashboard : false,\r\n },\r\n {\r\n path: '/administrateurs',\r\n component: DT_Administrateur,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n },\r\n {\r\n path: '/administrateursComposanteEtEcole',\r\n component: DT_Ecoles_Admin,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n },\r\n {\r\n path: '/AdminFormations',\r\n component: AdministrationFormationsPage,\r\n needsLogin: true,\r\n hasDashboard : true\r\n },\r\n {\r\n path: '/formationsOrphelines',\r\n component : FormationsOrphelinesPage,\r\n needsLogin:true,\r\n hasDashboard:true\r\n },\r\n {\r\n path : '/formationsFavorites',\r\n component : FormationsFavorites,\r\n needsLogin : true,\r\n hasDashboard : false,\r\n headerTheme : enumHeaderTheme.IRIS,\r\n hasWidthLimit : true\r\n\r\n },\r\n {\r\n path: '/course/:formationId/:composante?/:desc?',\r\n component: VueFormation,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n hasFooter : true,\r\n hasWidthLimit : true,\r\n headerTheme : enumHeaderTheme.IRIS\r\n },\r\n {\r\n // Doublon de course\r\n path: '/Formation/:formationId/:composante?/:desc?',\r\n component: VueFormation,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n hasFooter : true,\r\n hasWidthLimit : true,\r\n headerTheme : enumHeaderTheme.IRIS\r\n },\r\n {\r\n path: '/Statistiques/Formation/:formationId/:composante?/:desc?',\r\n component: StatistiquesFormation,\r\n needsLogin: true,\r\n hasDashboard : false,\r\n hasFooter : false,\r\n hasWidthLimit : true,\r\n },\r\n {\r\n path: '/vueOffreEmploi',\r\n component: VueOffreEmploi,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n // className : \"main-with-dashboard\",\r\n hasWidthLimit : true,\r\n headerTheme: enumHeaderTheme.IRIS\r\n },\r\n {\r\n path: '/editeurs',\r\n component: DT_Editeur,\r\n needsLogin: true,\r\n hasDashboard : true\r\n },\r\n {\r\n path: '/cv_etudiants',\r\n component: DT_CV_Etudiant,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n },\r\n {\r\n path: '/etudiants',\r\n component: DT_Etudiant,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n },\r\n {\r\n path: '/entreprises',\r\n component: DT_Entreprise,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n },\r\n {\r\n path: '/demandeFormation_etudiants',\r\n component: DT_DemandeFormation_Etudiant,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n },\r\n {\r\n path: '/ecoles',\r\n component: AdministrationEcolesPage,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n },\r\n {\r\n path: '/composantes',\r\n component: AdministrationComposanteEcolesPage,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n },\r\n {\r\n path : '/school/:Id?',\r\n component : VueEcole,\r\n needsLogin : false,\r\n hasDashboard : false,\r\n hasWidthLimit : true,\r\n headerTheme : enumHeaderTheme.IRIS\r\n },\r\n {\r\n path : '/schoolEntity/:Id?',\r\n component : VueComposanteEcole,\r\n needsLogin : false,\r\n hasDashboard : false,\r\n hasWidthLimit : true,\r\n headerTheme : enumHeaderTheme.IRIS\r\n },\r\n {\r\n path: '/unauthorized',\r\n component: Unauthorized,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n },\r\n {\r\n path: '/register:User?',\r\n component: Register,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n hasWidthLimit : true,\r\n headerTheme : enumHeaderTheme.IRIS,\r\n backgroundTheme: enumBackgroundTheme.WHISPER\r\n },\r\n {\r\n path: '/login:User?',\r\n component: Register,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n hasWidthLimit : true,\r\n headerTheme : enumHeaderTheme.IRIS,\r\n backgroundTheme: enumBackgroundTheme.WHISPER\r\n },\r\n {\r\n path: '/import_export',\r\n component: ImportExportAdminPage,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n },\r\n {\r\n path: '/offresCompatibles',\r\n component: OffresCompatibles,\r\n needsLogin: true,\r\n hasDashboard : true,\r\n hasDashboardOnlyMobile : true,\r\n headerTheme : enumHeaderTheme.IRIS,\r\n hasWidthLimit : true,\r\n },\r\n {\r\n path: '/rechercheAffinee:Filters?',\r\n component: RechercheAffinee,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n hasWidthLimit : true,\r\n hasFooter : true,\r\n className: \"whisper-background\",\r\n headerTheme : enumHeaderTheme.IRIS,\r\n backgroundTheme: enumBackgroundTheme.WHISPER\r\n },\r\n {\r\n path: '/rechercheCandidats',\r\n component: RechercheCandidats,\r\n needsLogin: false,\r\n needsRoles: [enumRoles.ENTREPRISE],\r\n hasDashboard : false,\r\n hasFooter : true,\r\n },\r\n {\r\n path: '/about-student',\r\n component: SavoirPlus_Etudiant,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n hasFooter : true,\r\n hasWidthLimit : true,\r\n },\r\n {\r\n path: '/about-companies',\r\n component: SavoirPlus_Entreprise,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n hasFooter : true,\r\n hasWidthLimit : true,\r\n },\r\n {\r\n path: '/about-schools',\r\n component: SavoirPlus_Ecole,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n hasFooter : true,\r\n hasWidthLimit : true,\r\n headerTheme : enumHeaderTheme.IRIS\r\n },\r\n {\r\n path : '/Messagerie:Thread?',\r\n component : Messagerie,\r\n needsLogin : true,\r\n hasDashboard : true\r\n },\r\n {\r\n path : '/Chat:Thread?',\r\n component : Messagerie,\r\n needsLogin : true,\r\n hasDashboard : true\r\n },\r\n {\r\n path : '/entreprise',\r\n component : LandingPageEntreprise,\r\n needsLogin : false,\r\n hasDashboard : false,\r\n hasFooter : true,\r\n hasWidthLimit : true,\r\n headerTheme : enumHeaderTheme.BLUE\r\n },\r\n {\r\n path : '/partner/UPE06',\r\n component : LandingPageEntrepriseUpe06,\r\n needsLogin : false,\r\n hasDashboard : false,\r\n hasFooter : true,\r\n hasWidthLimit : true,\r\n headerTheme : enumHeaderTheme.BLUE\r\n },\r\n {\r\n path : '/offers',\r\n component : EntrepriseOffres,\r\n hasDashboard : false,\r\n needsLogin: true,\r\n needsRoles: [enumRoles.ENTREPRISE],\r\n hasFooter : true,\r\n headerTheme : enumHeaderTheme.WHITE,\r\n hasWidthLimit:true\r\n },\r\n {\r\n path : '/candidates',\r\n component : EntrepriseCandidats,\r\n hasDashboard : false,\r\n needsLogin: true,\r\n needsRoles: [enumRoles.ENTREPRISE],\r\n hasFooter : true,\r\n headerTheme : enumHeaderTheme.WHITE\r\n },\r\n {\r\n path:'/projects',\r\n component:EntrepriseProjets,\r\n hasDashboard:false,\r\n needsLogin:true,\r\n needsRoles:[enumRoles.ENTREPRISE],\r\n hasFooter:true,\r\n headerTheme : enumHeaderTheme.WHITE,\r\n hasWidthLimit:true\r\n },\r\n {\r\n path:'/seeked_profiles',\r\n component : ProfilsRecherche,\r\n hasDashboard:false,\r\n needsLogin:true,\r\n needsRoles: [enumRoles.ENTREPRISE],\r\n hasFooter: true,\r\n headerTheme : enumHeaderTheme.WHITE,\r\n hasWidthLimit:true\r\n },\r\n // {\r\n // path : '/candidate_file',\r\n // component : EntrepriseFicheCandidat,\r\n // hasDashboard : false,\r\n // needsLogin: true,\r\n // needsRoles: [enumRoles.ENTREPRISE],\r\n // hasFooter : true,\r\n // headerTheme : enumHeaderTheme.WHITE\r\n // },\r\n {\r\n path: '/',\r\n component: Home,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n hasFooter : true,\r\n hasWidthLimit : true,\r\n headerTheme : enumHeaderTheme.IRIS\r\n },\r\n {\r\n path: '/*',\r\n component: NotFound,\r\n needsLogin: false,\r\n hasDashboard : false,\r\n }\r\n]\r\nexport default routes\r\n","export const AboutUs = (props) => {\r\n return(\r\n \r\n \r\n
\r\n )\r\n}","import { useTranslation } from \"react-i18next\"\r\nimport { EntrepriseOffreBreadCrumb } from \"../../components/breadCrumb/EntrepriseOffreBreadCrumb\"\r\nimport { FormAnnonceInterne } from \"../../components/form/annonce/formAnnonceInterne\"\r\nimport \"./annonceInterne.css\"\r\n\r\nexport const AnnonceInterne = () => {\r\n\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n )\r\n}","import React from 'react';\r\n\r\nexport const Students = () => {\r\n return (\r\n \r\n
\r\n )\r\n}","import React from 'react';\r\n\r\nexport const Companies = (props) => {\r\n\r\n return (\r\n \r\n
\r\n )\r\n\r\n}","import { useHistory } from \"react-router-dom/cjs/react-router-dom.min\";\r\nimport parse from 'html-react-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Button } from \"primereact/button\";\r\nimport \"./confidentialite.css\";\r\n\r\nexport const Confidentialite = () => {\r\n\r\n const history = useHistory();\r\n const {t} = useTranslation();\r\n\r\n const onRetourAccueilClick = () => {\r\n history.push('/');\r\n }\r\n\r\n return (\r\n \r\n {parse(t('confidentialite.body'))}\r\n
onRetourAccueilClick()}>
\r\n
\r\n )\r\n}","import { Button } from \"primereact/button\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { Fragment, useEffect, useRef, useState } from \"react\";\r\nimport { Trans } from \"react-i18next\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { JobThumbnail } from \"../components/thumbnail/jobThumbnail\";\r\nimport { enumHttpError } from \"../enums/enumHttpError\";\r\nimport OffreEmploiService from \"../services/offreEmploiService\";\r\nimport Helper from \"../utils/helper\";\r\nimport { OffreEmploiThumbnail } from \"../components/thumbnail/offreEmploiThumbnail\";\r\nimport { useHistory } from \"react-router\";\r\n\r\nexport const Candidatures = (props) => {\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [loading, setLoading] = useState(false);\r\n const { t } = useTranslation();\r\n const toast = useRef(null);\r\n const [offresEmploi, setOffresEmploi] = useState([]);\r\n const [error, setError] = useState(null);\r\n const history = useHistory();\r\n const adminImpersonatingEtudiantId = history.location?.state?.adminImpersonatingEtudiantId;\r\n\r\n const offreEmploiService = new OffreEmploiService();\r\n\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 12,\r\n page: 0,\r\n sortField: 'dateCreation'\r\n })\r\n\r\n useEffect(() => {\r\n loadLazyData();\r\n\r\n return () => {\r\n // cleanup\r\n setOffresEmploi([]);\r\n }\r\n }, [lazyParams]);\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n offreEmploiService.getOffreEmploisCandidatures(lazyParams, adminImpersonatingEtudiantId)\r\n .then(_pagedjobOffers => {\r\n _pagedjobOffers.items.forEach(offer => {\r\n offer.dateCreation = Helper.dateTimeToLocaleDateTime(offer.dateCreation)\r\n });\r\n setTotalCount(_pagedjobOffers.totalCount)\r\n setOffresEmploi([...offresEmploi, ..._pagedjobOffers.items]);\r\n setLoading(false);\r\n })\r\n .catch((err) => {\r\n switch (err.message) {\r\n case enumHttpError.CANCELED:\r\n setError(enumHttpError.CANCELED)\r\n break;\r\n default:\r\n setError('failed');\r\n setLoading(false);\r\n break;\r\n }\r\n });\r\n // .finally(() => setLoading(false));\r\n }\r\n\r\n const seeMore = () => {\r\n setLazyParams({\r\n ...lazyParams,\r\n first: lazyParams.first + lazyParams.rows,\r\n page: lazyParams.page + 1\r\n });\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n {offresEmploi.map((offreEmploi, indexOE) => (\r\n
\r\n \r\n \r\n
\r\n \r\n ))}\r\n
\r\n
\r\n {offresEmploi.length > 0 && totalCount > (lazyParams.page + 1) * lazyParams.rows &&\r\n
\r\n \r\n
\r\n }\r\n {loading &&
}\r\n {!loading && offresEmploi.length == 0 && error == 'failed' &&
}\r\n {!loading && offresEmploi.length == 0 && error != 'failed' &&
}\r\n
\r\n
\r\n )\r\n}","import { FormFicheOrganismeFormation } from \"../../components/form/formFicheOrganismeFormation\"\r\nimport { enumOrganismeFormationCategorie } from \"../../enums/enumOrganismeFormationCategorie\"\r\n\r\nexport const EditionFicheEcole = () => {\r\n return (\r\n \r\n )\r\n}","import { FormFicheOrganismeFormation } from \"../../components/form/formFicheOrganismeFormation\"\r\nimport { enumOrganismeFormationCategorie } from \"../../enums/enumOrganismeFormationCategorie\"\r\n\r\nexport const EditionFicheComposante = () => {\r\n return (\r\n \r\n )\r\n}","import React from 'react';\r\n\r\nexport const Advertisements = () => {\r\n return(\r\n \r\n Page annonces\r\n
\r\n )\r\n}","import { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { CursusThumbnail } from \"../../components/thumbnail/cursusThumbnail\";\r\nimport { EtudiantThumbnail } from \"../../components/thumbnail/etudiantThumbnail\";\r\nimport { LangueThumbnail } from \"../../components/thumbnail/langueThumbnail\";\r\nimport { ListeLibelleThumbnail } from \"../../components/thumbnail/listeLibelleThumbnail\";\r\nimport { ListeLibelleThumbnailCompetence } from \"../../components/thumbnail/ListeLibelleThumbnailCompetence\";\r\nimport { PresentationThumbnail } from \"../../components/thumbnail/presentationThumbnail\";\r\nimport { Button } from \"primereact/button\";\r\nimport { useAuthState } from \"../../context/context\";\r\nimport UserService from \"../../services/userService\";\r\nimport './vueCandidat.css';\r\nimport { Card } from \"primereact/card\";\r\nimport { Listelibelle } from \"../../components/list/listeLibelle\";\r\nimport { enumTypeCompetence } from \"../../enums/enumTypeCompetence\";\r\nimport { Helmet } from \"react-helmet\";\r\nimport { ContactEtudiantDialog } from \"../../components/dialog/contactEtudiantDialog\";\r\nimport RoleHelper from \"../../utils/roleHelper\";\r\nimport FormationService from \"../../services/formationService\";\r\nimport { EntrepriseOffreBreadCrumb } from \"../../components/breadCrumb/EntrepriseOffreBreadCrumb\";\r\nimport { EntrepriseProfilBreadCrumb } from \"../../components/breadCrumb/EntrepriseProfilBreadCrumb\";\r\nimport { useHistory } from \"react-router-dom/cjs/react-router-dom.min\";\r\nimport { ProjetOverlayPanel } from \"../../components/overlayPanel/projetOverlayPanel\";\r\nimport { Tooltip } from \"primereact/tooltip\";\r\n\r\nexport const VueCandidat = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const currentUser = useAuthState();\r\n const [etudiant, setEtudiant] = useState(null);\r\n const [entreprise, setEntreprise] = useState(null);\r\n const [loading, setLoading] = useState(true);\r\n const [loadingComptence, setLoadingCompetence] = useState(true);\r\n const [loadingEntreprise, setLoadingEntreprise] = useState(true)\r\n const [refreshToken, setRefreshToken] = useState(null);\r\n const [listeAppellations, setListeAppellations] = useState([])\r\n const [listeSavoir, setListeSavoir] = useState([])\r\n const [listeSavoirFaire, setListeSavoirFaire] = useState([])\r\n const [compteurSavoir, setCompteurSavoir] = useState(0)\r\n const [compteurSavoirFaire, setCompteurSavoirFaire] = useState(0)\r\n const [displayFakeInformation, setDisplayFakeInformation] = useState(true);\r\n const toast = useRef(null);\r\n const history = useHistory();\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId\r\n\r\n const userService = new UserService();\r\n const formationService = new FormationService();\r\n const candidatUrl = props.match.params.candidatUrl;\r\n\r\n useEffect(() => {\r\n if (RoleHelper.isAdminImpersonatingEntreprise(currentUser, history.location.pathname)) {\r\n const storedState = sessionStorage.getItem('myState');\r\n const state = storedState ? JSON.parse(storedState) : null;\r\n if (state && state.adminImpersonatingRecruteurId) {\r\n history.replace(history.location.pathname, { ...history.location.state, adminImpersonatingRecruteurId: state.adminImpersonatingRecruteurId });\r\n }\r\n // on supprime le state de la session storage\r\n sessionStorage.removeItem('myState');\r\n }\r\n setLoading(true);\r\n if(adminImpersonatingRecruteurId){\r\n userService.getEntreprise(adminImpersonatingRecruteurId)\r\n .then(_recruteur => {\r\n if (!_recruteur.recruteurEntreprises[0].entreprise.abonnementEntreprise.isFree) {\r\n setDisplayFakeInformation(false);\r\n }\r\n setEntreprise(_recruteur);\r\n setLoadingEntreprise(false);\r\n })\r\n .catch(err => {\r\n setEntreprise(null);\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.loading_failed'), life: 3000 });\r\n })\r\n }\r\n else if (RoleHelper.isEntreprise(currentUser)) {\r\n userService.getEntreprise(currentUser.user.id)\r\n .then(_recruteur => {\r\n if (!_recruteur.recruteurEntreprises[0].entreprise.abonnementEntreprise.isFree) {\r\n setDisplayFakeInformation(false);\r\n }\r\n setEntreprise(_recruteur);\r\n setLoadingEntreprise(false);\r\n })\r\n .catch(err => {\r\n setEntreprise(null);\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.loading_failed'), life: 3000 });\r\n })\r\n }\r\n userService.getCandidat(candidatUrl)\r\n .then(_candidat => {\r\n setEtudiant(_candidat);\r\n setListeAppellations(_candidat.etudiantAppellations.map(appellation => { return appellation.appellation.libelle }));\r\n // setListeSavoir(_candidat.etudiantCompetences.filter(ec => { return ec.competence.typeCompetence == enumTypeCompetence.SAVOIR }).map(ec => { return ec.competence.libelle }));\r\n // setListeSavoirFaire(_candidat.etudiantCompetences.filter(ec => { return ec.competence.typeCompetence == enumTypeCompetence.SAVOIRFAIRE }).map(ec => { return ec.competence.libelle }));\r\n loadFormationCompetence(_candidat);\r\n })\r\n .catch(err => {\r\n setEtudiant(null);\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.loading_failed'), life: 3000 });\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }, [refreshToken])\r\n\r\n const loadFormationCompetence = (_candidat) => {\r\n formationService.getAllowedFormationsCompetencesEtudiant(_candidat.id)\r\n .then((_formationCompetence) => {\r\n\r\n let _listeSavoir = [];\r\n let _listeSavoirFaire = [];\r\n\r\n // Savoir/Savoir faire : tableau multidimensionnel. Chaque formation a son tableau de savoir/savoir faire\r\n // _formationCompetence.map((formationCompetence) => {\r\n // let _tmpSavoir = [];\r\n // let _tmpSavoirFaire = [];\r\n // formationCompetence.competenceFormation.map((competence) => {\r\n // // on récupère les compétences de la formation si elle sont présente dans les compétences de l'étudiant et si elle sont prit en compte\r\n // if(_candidat.etudiantCompetences.some(o => o.competenceId === competence.competenceId && o.prisEnCompte == true)) {\r\n // if(competence.competence.typeCompetence == enumTypeCompetence.SAVOIR) {\r\n // _tmpSavoir.push(competence.competence.libelle);\r\n // } else if(competence.competence.typeCompetence == enumTypeCompetence.SAVOIRFAIRE) {\r\n // _tmpSavoirFaire.push(competence.competence.libelle);\r\n // }\r\n // }\r\n // });\r\n // _listeSavoir.push(_tmpSavoir);\r\n // _listeSavoirFaire.push(_tmpSavoirFaire);\r\n // });\r\n\r\n // Savoir/Savoir faire : tableau à 1 dimension. Toutes les formations sont dans le même tableau\r\n let _compteurSavoir = [];\r\n let _compteurSavoirFaire = [];\r\n\r\n _formationCompetence.map((formationCompetence) => {\r\n // trier les compétences en fonction de l'ordre de la formation\r\n formationCompetence.competenceFormation.sort((a, b) => (a.ordre > b.ordre) ? 1 : -1);\r\n\r\n let _tmpCompteurSavoir = 0;\r\n let _tmpCompteurSavoirFaire = 0;\r\n formationCompetence.competenceFormation.map((competence) => {\r\n // on récupère les compétences de la formation si elle sont présente dans les compétences de l'étudiant et si elle sont prit en compte\r\n if (_candidat.etudiantCompetences.some(o => o.competenceId === competence.competenceId && o.prisEnCompte == true)) {\r\n if (competence.competence.typeCompetence == enumTypeCompetence.SAVOIR) {\r\n _listeSavoir.push(competence.competence.libelle);\r\n // on incrémente le compteur de savoir temporaire\r\n _tmpCompteurSavoir++;\r\n } else if (competence.competence.typeCompetence == enumTypeCompetence.SAVOIRFAIRE) {\r\n _listeSavoirFaire.push(competence.competence.libelle);\r\n // on incrémente le compteur de savoir faire temporaire\r\n _tmpCompteurSavoirFaire++;\r\n }\r\n }\r\n });\r\n // on incrémente le compteur de savoir et savoir faire\r\n _compteurSavoir.push(_tmpCompteurSavoir);\r\n _compteurSavoirFaire.push(_tmpCompteurSavoirFaire);\r\n });\r\n // on filtre les doublons\r\n _listeSavoir = _listeSavoir.filter((item, index) => _listeSavoir.indexOf(item) === index);\r\n _listeSavoirFaire = _listeSavoirFaire.filter((item, index) => _listeSavoirFaire.indexOf(item) === index);\r\n\r\n setListeSavoir(_listeSavoir);\r\n setListeSavoirFaire(_listeSavoirFaire);\r\n setCompteurSavoir(_compteurSavoir);\r\n setCompteurSavoirFaire(_compteurSavoirFaire);\r\n })\r\n .catch(err => {\r\n setEtudiant(null);\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.loading_failed'), life: 3000 });\r\n })\r\n .finally(() => {\r\n setLoadingCompetence(false);\r\n });\r\n }\r\n\r\n const copyUrlLink = () => {\r\n navigator.clipboard.writeText(window.location.href);\r\n toast.current.show({ severity: 'success', summary: t('profile.share_profile_success'), life: 3000 });\r\n }\r\n\r\n return (\r\n <>\r\n {!loading ? \r\n \r\n {etudiant.prenom} {etudiant.nom.toUpperCase()} - DiplomAdvisor \r\n \r\n \r\n : ''}\r\n \r\n {loading ? (\r\n \r\n ) : (\r\n etudiant ? (\r\n <>\r\n {history.location.state?.offreEmploiId ?\r\n <>\r\n \r\n \r\n >\r\n :\r\n history.location.state?.entrepriseId ?\r\n <> >\r\n :\r\n ''}\r\n \r\n
\r\n
\r\n {(RoleHelper.isEntreprise(currentUser) || adminImpersonatingRecruteurId) && \r\n
\r\n }\r\n {(RoleHelper.isEntreprise(currentUser) || adminImpersonatingRecruteurId) && !loadingEntreprise &&
}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {etudiant.presentation && <>
>}\r\n {(etudiant.formationSuivie.length > 0 || etudiant.formationEnCours.length > 0 || etudiant.formationAVenir.length > 0) && <>
>}\r\n {etudiant.etudiantLangue && <>
>}\r\n {/* {etudiant.etudiantCompetences.length > 0 && <>
>} */}\r\n {loadingComptence ? (\r\n <>
{t(\"skills.skills\")}}>\r\n \r\n >\r\n ) : (\r\n etudiant.etudiantCompetences.length > 0 && listeSavoir && listeSavoirFaire && <>
>\r\n // etudiant.etudiantCompetences.length > 0 && listeSavoir && listeSavoirFaire && <>
>\r\n )}\r\n\r\n {etudiant.rechercheActive && etudiant.etudiantAppellations &&
}\r\n
\r\n
\r\n >\r\n ) : (\r\n \r\n \r\n
\r\n )\r\n )}\r\n >\r\n )\r\n}\r\n","import React, { useState, useRef } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button } from 'primereact/button';\r\nimport { Trans } from 'react-i18next';\r\nimport { Divider } from 'primereact/divider';\r\nimport { Toast } from 'primereact/toast';\r\nimport { Field, Form } from 'react-final-form';\r\nimport 'primeflex/primeflex.css';\r\nimport { classNames } from 'primereact/utils';\r\nimport { Password } from 'primereact/password';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { useHistory } from 'react-router';\r\nimport AuthService from '../services/authService';\r\n\r\n\r\nexport const PasswordReset = (props) => {\r\n const [showMessage, setShowMessage] = useState(false);\r\n const [formData, setFormData] = useState({});\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const search = props.location.search;\r\n const params = new URLSearchParams(search);\r\n const token = encodeURIComponent(params.get('resetToken'));\r\n const email = encodeURIComponent(params.get('email'));\r\n const toast = useRef(null);\r\n const authService = new AuthService();\r\n\r\n const showError = () => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.try_again'), life: 3000 });\r\n }\r\n\r\n const validate = (data) => {\r\n let errors = {};\r\n if (!data.password) {\r\n errors.password = ;\r\n }\r\n else if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$/.test(data.password)) {\r\n errors.password = ;\r\n }\r\n\r\n if (data.password != data.confirmPassword) {\r\n errors.confirmPassword = ;\r\n }\r\n else if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$/.test(data.confirmPassword)) {\r\n errors.confirmPassword = ;\r\n }\r\n return errors;\r\n };\r\n\r\n const onSubmit = (data, form) => {\r\n setFormData(data);\r\n\r\n authService.resetPassword(data).then(response => {\r\n if (response == null) {\r\n form.restart();\r\n showError();\r\n }\r\n else {\r\n setShowMessage(true);\r\n form.restart();\r\n history.push('/');\r\n }\r\n\r\n });\r\n\r\n };\r\n\r\n const isFormFieldValid = (meta) => !!(meta.touched && meta.error);\r\n const getFormErrorMessage = (meta) => {\r\n return isFormFieldValid(meta) && {meta.error} ;\r\n };\r\n\r\n const dialogFooter = setShowMessage(false)} />
;\r\n const passwordHeader = ;\r\n const passwordFooter = (\r\n \r\n \r\n
\r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n
\r\n
setShowMessage(false)} position=\"top\" footer={dialogFooter} showHeader={false} breakpoints={{ '960px': '80vw' }} style={{ width: '30vw' }}>\r\n \r\n
\r\n
\r\n
\r\n {formData.email} \r\n
\r\n
\r\n \r\n\r\n
\r\n
\r\n );\r\n}","import React, { useState, useRef, useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button } from 'primereact/button';\r\nimport { Trans } from 'react-i18next';\r\nimport 'primeflex/primeflex.css';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { useHistory } from 'react-router';\r\nimport UserService from '../services/userService';\r\nimport computerIcon from '../../src/images/GlassComputer.svg';\r\nimport AuthService from '../services/authService';\r\nimport {ActivateAccountDialog} from '../scenes/activateAccountDialog'\r\n\r\n\r\nexport const ActivateAccount = (props) => {\r\n const [showMessage, setShowMessage] = useState(false);\r\n const [showMessageError, setShowMessageError] = useState(false);\r\n const [showDialogActivation, setShowDialogActivation] = useState(false);\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const search = props.location.search;\r\n const params = new URLSearchParams(search);\r\n //const email = params.get('email');\r\n //const token = params.get('token');\r\n const token = encodeURIComponent(params.get('token'));\r\n const email = encodeURIComponent(params.get('email'));\r\n const urlRedirect = encodeURIComponent(params.get('urlRedirect'));\r\n\r\n const authService = new AuthService();\r\n const userService = new UserService();\r\n const [loading, setLoading] = useState(false);\r\n const isMounted = useRef(false);\r\n\r\n\r\n\r\n\r\n\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n if(token == \"null\" || email == \"null\")\r\n {\r\n redirectHome();\r\n return;\r\n }\r\n userService.activateaccount(email, token)\r\n .then(reponse => {\r\n setShowMessage(true);\r\n\r\n })\r\n .catch(error => {\r\n setShowMessageError(true);\r\n\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n isMounted.current = true;\r\n loadLazyData();\r\n }, []);\r\n\r\n const redirectHome = () => {\r\n setShowMessage(false);\r\n\r\n if (urlRedirect != null && urlRedirect != \"\" && urlRedirect != \"null\") { \r\n history.push(decodeURIComponent(urlRedirect)); \r\n }\r\n else {\r\n history.push('/');\r\n }\r\n }\r\n\r\n const redirectNewMail = () => {\r\n setShowMessageError(false);\r\n\r\n if (urlRedirect != null && urlRedirect != \"\" && urlRedirect != \"null\") { \r\n history.push(decodeURIComponent(urlRedirect)); \r\n }\r\n else {\r\n history.push('/');\r\n }\r\n }\r\n\r\n\r\n const askValidationEmail =() => {\r\n setShowMessageError(false)\r\n setShowDialogActivation(true);\r\n authService.askValidationEmail(decodeURIComponent(email))\r\n .then(async response => {\r\n })\r\n .catch(error => {\r\n props.toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.try_again') });\r\n });\r\n }\r\n\r\n const askValidationEmailCLose =() => {\r\n setShowDialogActivation(false);\r\n if (urlRedirect != null && urlRedirect != \"\" && urlRedirect != \"null\") { \r\n history.push(decodeURIComponent(urlRedirect)); \r\n }\r\n else {\r\n history.push('/');\r\n }\r\n }\r\n\r\n\r\n const dialogFooter = redirectHome()} />
;\r\n const dialogFooterError = askValidationEmail()} />
;\r\n\r\n return (\r\n \r\n
setShowMessage(false)} position=\"top\" footer={dialogFooter} showHeader={false} breakpoints={{ '960px': '80vw' }} style={{ width: '30vw' }}>\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n {/*
askValidationEmail()} position=\"top\" footer={dialogFooterError} showHeader={false} breakpoints={{ '960px': '80vw' }} style={{ width: '30vw' }}>\r\n \r\n */}\r\n\r\n { showMessageError &&
\r\n
\r\n {dialogFooterError}\r\n
}\r\n\r\n
askValidationEmailCLose()}> \r\n
\r\n );\r\n}\r\n","import React, { useState, useRef, useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button } from 'primereact/button';\r\nimport { Trans } from 'react-i18next';\r\nimport 'primeflex/primeflex.css';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { useHistory } from 'react-router';\r\nimport UserService from '../services/userService';\r\n\r\n\r\nexport const ActivateAccountAdmin = (props) => {\r\n const [showMessage, setShowMessage] = useState(false);\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const search = props.location.search;\r\n const params = new URLSearchParams(search);\r\n //const email = params.get('email');\r\n //const token = params.get('token');\r\n const token = encodeURIComponent(params.get('token'));\r\n const email = encodeURIComponent(params.get('email'));\r\n\r\n const userService = new UserService();\r\n const [loading, setLoading] = useState(false);\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 10,\r\n page: 1,\r\n });\r\n const isMounted = useRef(false);\r\n\r\n\r\n\r\n\r\n\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n userService.activateaccount(email, token, { lazyEvent: JSON.stringify(lazyParams) }).then(reponse => {\r\n setShowMessage(true);\r\n setLoading(false);\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n isMounted.current = true;\r\n loadLazyData();\r\n }, [lazyParams]);\r\n\r\n const redirectHome = () => {\r\n setShowMessage(false);\r\n history.push('/');\r\n }\r\n\r\n const dialogFooter = redirectHome()} />
;\r\n\r\n return (\r\n \r\n
setShowMessage(false)} position=\"top\" footer={dialogFooter} showHeader={false} breakpoints={{ '960px': '80vw' }} style={{ width: '30vw' }}>\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport { MenuAdministration } from '../../components/menu/menuAdministration';\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { enumRoles } from '../../enums/enumRoles';\r\nimport { OffresCompatibles } from '../offresCompatibles';\r\nimport { DashboardEcoles } from './dashboardEcoles';\r\n\r\n\r\nexport const Dashboard = () => {\r\n\r\n const currentUser = useAuthState();\r\n const isAdmin = currentUser?.roles?.indexOf(enumRoles.ADMINISTRATEUR) > -1;\r\n const isAdminEcole = currentUser?.roles?.indexOf(enumRoles.ADMINISTRATEURECOLE) > -1 && !isAdmin;\r\n const isAdminComposante = currentUser?.roles?.indexOf(enumRoles.ADMINISTRATEURCOMPOSANTE) > -1 && !isAdmin;\r\n const isEtudiant = currentUser?.roles?.indexOf(enumRoles.ETUDIANT) > -1 && !isAdmin;\r\n\r\n return (\r\n \r\n {isAdmin &&\r\n \r\n }\r\n {(isAdminEcole||isAdminComposante) &&\r\n \r\n }\r\n
\r\n )\r\n}","import { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { useAuthState } from \"../../context/context\";\r\nimport UserService from \"../../services/userService\";\r\nimport EntrepriseService from \"../../services/entrepriseService\";\r\nimport StripeService from \"../../services/stripeService\";\r\nimport { PersonnalInfoCompany } from \"./formProfileComponents/company/personnalInfoCompany\";\r\nimport \"./formProfile.css\"\r\nimport \"./formCompanyProfile.css\"\r\nimport { enumRoles } from \"../../enums/enumRoles\";\r\nimport { Button } from \"primereact/button\";\r\nimport { CompanyInfo } from \"./formProfileComponents/company/companyInfo\";\r\nimport { TabPanel, TabView } from \"primereact/tabview\";\r\nimport { useHistory } from 'react-router-dom';\r\nimport { Dialog } from \"primereact/dialog\";\r\nimport { CompanyChooseSubscription } from \"../subscription/companyChooseSubscription\";\r\nimport RoleHelper from \"../../utils/roleHelper\";\r\nimport { DtFactures } from \"../datatable/DtFactures\";\r\nimport { DT_gestionCollaborateurEntreprise } from \"../datatable/dt_gestionCollaborateurEntreprise\";\r\n\r\nexport const FormCompanyProfile = (props) => {\r\n\r\n const [submitted, setSubmitted] = useState(false);\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n // const [siretIsValid, setSiretIsValid] = useState(false)\r\n const [recruteur, setRecruteur] = useState(null);\r\n\r\n const { t } = useTranslation()\r\n const history = useHistory();\r\n const toast = useRef(null)\r\n const currentUser = useAuthState()\r\n const userService = new UserService()\r\n const entrepriseService = new EntrepriseService()\r\n const stripeService = new StripeService()\r\n const [loading, setLoading] = useState(true)\r\n const [displayDialog, setDisplayDialog] = useState(false);\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n const adminImpersonatingRecruteurId = history.location.state?.adminImpersonatingRecruteurId\r\n\r\n useEffect(() => {\r\n loadData()\r\n }, [])\r\n\r\n const loadData = () => {\r\n setLoading(true);\r\n if (history.location.state === \"firstConnection\")\r\n setDisplayDialog(true);\r\n\r\n if (history.location.hash === \"#abonnement\")\r\n setActiveIndex(2);\r\n\r\n entrepriseService\r\n .getExtendEntrepriseProfil(adminImpersonatingRecruteurId)\r\n .then(async (_recruteur) => {\r\n // on vérifie si l'entreprise possède un code promo\r\n setRecruteur(_recruteur);\r\n await searchPartenariatInfo(_recruteur);\r\n })\r\n .catch((err) => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_load'), life: 3000 })\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n })\r\n }\r\n\r\n const searchPartenariatInfo = async (_recruteur) => {\r\n // temporary code for promotion code\r\n let codePartenariat = _recruteur.recruteurEntreprises[0].entreprise.codePartenariat;\r\n if(codePartenariat === \"\" || codePartenariat === null){\r\n _recruteur.recruteurEntreprises[0].entreprise.codePartenariat = \"Decouverte\";\r\n }\r\n if (_recruteur.recruteurEntreprises[0]?.entreprise.codePartenariat) {\r\n await stripeService.getPartenariatInfo(_recruteur.recruteurEntreprises[0].entreprise.codePartenariat)\r\n .then((_codePromo) => {\r\n if (_recruteur.dateSouscription) {\r\n // Calculer la date d'échéance du coupon\r\n const expirationDate = new Date(_recruteur.dateSouscription);\r\n expirationDate.setMonth(expirationDate.getMonth() + _codePromo.value.durationInMonths);\r\n // Comparer la date d'échéance avec la date actuelle\r\n const couponIsStillValid = expirationDate > new Date();\r\n if (couponIsStillValid){\r\n _recruteur.recruteurEntreprises[0].entreprise.codePromo = _codePromo.value;\r\n }\r\n else\r\n _recruteur.recruteurEntreprises[0].entreprise.codePromo = null;\r\n }\r\n else {\r\n _recruteur.recruteurEntreprises[0].entreprise.codePromo = _codePromo.value;\r\n }\r\n setRecruteur(_recruteur);\r\n })\r\n .catch((err) => {\r\n _recruteur.recruteurEntreprises[0].entreprise.codePromo = null;\r\n setRecruteur(_recruteur);\r\n })\r\n }\r\n }\r\n\r\n const onInputRecruteurChange = (e, name) => {\r\n let val = (e.value || e.target.value) || '';\r\n let _recruteur = { ...recruteur };\r\n _recruteur[`${name}`] = val;\r\n // if (name == 'siret') {\r\n // setSiretIsValid(false);\r\n // _entreprise.nomEntreprise = null;\r\n // _entreprise.secteurActivite = null;\r\n // _entreprise.localisation = null;\r\n // _entreprise.taille = null;\r\n // }\r\n setRecruteur(_recruteur);\r\n };\r\n\r\n const onInputEntrepriseChange = (e, name) => {\r\n let val = (e.value || e.target.value) || '';\r\n let _recruteur = { ...recruteur };\r\n _recruteur.recruteurEntreprises[0].entreprise[`${name}`] = val;\r\n if(name=='commune'){\r\n _recruteur.recruteurEntreprises[0].entreprise.communeId = val?.id;\r\n }\r\n // if (name == 'siret') {\r\n // setSiretIsValid(false);\r\n // _entreprise.nomEntreprise = null;\r\n // _entreprise.secteurActivite = null;\r\n // _entreprise.localisation = null;\r\n // _entreprise.taille = null;\r\n // }\r\n setRecruteur(_recruteur);\r\n };\r\n\r\n const onInputRecruteurRBChange = (e, name) => {\r\n let _recruteur = { ...recruteur };\r\n _recruteur[`${name}`] = e;\r\n setRecruteur(_recruteur);\r\n };\r\n\r\n const onWysiwygChange = (content, editor) => {\r\n let _recruteur = { ...recruteur };\r\n _recruteur.recruteurEntreprises[0].entreprise.description = content;\r\n setRecruteur(_recruteur);\r\n }\r\n\r\n const onEtrangerChange = (e, name) => {\r\n let _recruteur = { ...recruteur };\r\n let val = (e.checked) || false;\r\n _recruteur.recruteurEntreprises[0].entreprise.etranger = val;\r\n _recruteur.recruteurEntreprises[0].entreprise.lieuResidence = null;\r\n _recruteur.recruteurEntreprises[0].entreprise.pays = null;\r\n _recruteur.recruteurEntreprises[0].entreprise.commune = null;\r\n setRecruteur(_recruteur);\r\n };\r\n\r\n const majCompte = () => {\r\n setSubmitted(true);\r\n if (recruteur.prenom &&\r\n recruteur.nom &&\r\n recruteur.email &&\r\n recruteur.phoneNumber &&\r\n recruteur.recruteurEntreprises[0]?.entreprise?.nom &&\r\n (recruteur.recruteurEntreprises[0]?.entreprise?.siret?.length == 14 || !recruteur.recruteurEntreprises[0]?.entreprise?.siret)\r\n //&& siretIsValid\r\n ) {\r\n setIsSubmitting(true);\r\n\r\n // avant modification de l'entreprise, on cherche si l'entreprise a déjà complété son profil\r\n let RegistrationOnboardingCompleted = true;\r\n userService.getEntreprise(currentUser.user.id)\r\n .then((_entreprise) => {\r\n RegistrationOnboardingCompleted = _entreprise.isRegistrationOnboardingCompleted;\r\n })\r\n\r\n recruteur.IsRegistrationOnboardingCompleted = true;\r\n userService.updateEntreprise(currentUser, recruteur)\r\n .then((_entreprise) => {\r\n setRecruteur(_entreprise);\r\n searchPartenariatInfo(_entreprise);\r\n\r\n setSubmitted(false);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('profile.account_updated'), life: 3000 });\r\n if (!RegistrationOnboardingCompleted) {\r\n // une fois le profil complété, on load la page afin de recharger les données, on redirige ensuite vers la page des abonnements\r\n setLoading(true);\r\n setActiveIndex(2);\r\n // history.push({ pathname: '/offers', firstConnection : true });\r\n }\r\n })\r\n .catch(err => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_save'), life: 3000 })\r\n })\r\n .finally(() => {\r\n setIsSubmitting(false);\r\n if (!RegistrationOnboardingCompleted) {\r\n setLoading(false);\r\n }\r\n })\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('errors.incomplete_summary'), detail: t('errors.incomplete_detail'), life: 3000 })\r\n }\r\n }\r\n\r\n const onPortalClick = () => {\r\n window.open(window.STRIPE_PORTAL_URL, '_blank')\r\n }\r\n\r\n return (\r\n \r\n
setDisplayDialog(false)}>\r\n \r\n \r\n
\r\n \r\n setDisplayDialog(false)} />\r\n
\r\n \r\n
\r\n {loading ? (\r\n
\r\n ) : (\r\n <>\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* \r\n \r\n \r\n
\r\n */}\r\n \r\n \r\n \r\n \r\n >\r\n )}\r\n
\r\n )\r\n}","import { useEffect, useRef, useState } from \"react\";\r\nimport \"./formCompanyAbonnementAdmin.css\"\r\nimport { Button } from \"primereact/button\";\r\nimport { ButtonGoBack } from \"../buttonGoBack/buttonGoBack\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { enumRoles } from \"../../enums/enumRoles\";\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { Dropdown } from \"primereact/dropdown\";\r\nimport EntrepriseService from \"../../services/entrepriseService\";\r\nimport { enumRythmePaiement } from \"../../enums/enumRythmePaiement\";\r\nimport { enumChooseSubscription } from \"../../enums/enumChooseSubscription\";\r\n\r\nimport { IgrMultiColumnComboBoxModule } from 'igniteui-react-grids';\r\nimport { IgrMultiColumnComboBox } from 'igniteui-react-grids';\r\nimport RoleHelper from \"../../utils/roleHelper\";\r\nimport { useHistory } from \"react-router-dom/cjs/react-router-dom.min\";\r\n\r\n\r\nexport const FormCompanyAbonnementAdmin = () => {\r\n\r\n const { t } = useTranslation()\r\n const toast = useRef(null)\r\n const history = useHistory();\r\n const adminImpersonatingRecruteurId = history.location.state.adminImpersonatingRecruteurId;\r\n const currentUser = useAuthState()\r\n const entrepriseService = new EntrepriseService()\r\n const [loading, setLoading] = useState(true)\r\n const [dialogLoading, setDialogLoading] = useState(false);\r\n const [entreprise, setEntreprise] = useState(null);\r\n const [abonnement, setAbonnement] = useState(null);\r\n const [abonnementOptions, setAbonnementOptions] = useState(null);\r\n const [dialogSubscriptionVisible, setDialogSubscriptionVisible] = useState(false);\r\n IgrMultiColumnComboBoxModule.register();\r\n\r\n useEffect(() => {\r\n loadData()\r\n }, [])\r\n\r\n const loadData = () => {\r\n setLoading(true);\r\n if (RoleHelper.isAdmin(currentUser) && adminImpersonatingRecruteurId !== undefined) {\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then((entrepriseId) => {\r\n entrepriseService\r\n .getEntrepriseAbonnement(entrepriseId)\r\n .then((_entreprise) => {\r\n setEntreprise(_entreprise);\r\n setAbonnement({ abonnementEntrepriseId: _entreprise.abonnementEntreprise.id, rythmePaiement: _entreprise.rythmePaiement });\r\n })\r\n .catch((err) => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_load'), life: 3000 })\r\n });\r\n entrepriseService\r\n .getAbonnementEntreprise()\r\n .then((_abonnement) => {\r\n // créer un tableau contenant le label et la valeur = id abonnement\r\n const options = [];\r\n _abonnement.forEach(element => {\r\n options.push({ id: element.code, label: element.label, tarifMensuel: element.tarifMensuel + t('monnaie.euro'), value: element.id })\r\n });\r\n setAbonnementOptions(options);\r\n })\r\n .catch((err) => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_load'), life: 3000 })\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n })\r\n }\r\n else {\r\n history.push(\"/\")\r\n }\r\n }\r\n\r\n const setDialogSubscription = () => {\r\n setDialogSubscriptionVisible(true);\r\n }\r\n\r\n const hideDialogSubscription = () => {\r\n setDialogSubscriptionVisible(false);\r\n }\r\n\r\n const subscriptionDate = (date) => {\r\n return date && new Date(date).toLocaleDateString();\r\n }\r\n\r\n const onDropdownChange = (e, name) => {\r\n let _abonnement = { ...abonnement };\r\n _abonnement[name] = e;\r\n\r\n setAbonnement(_abonnement);\r\n }\r\n\r\n const updateSubscription = () => {\r\n if (abonnement.abonnementEntrepriseId != entreprise.abonnementEntreprise.id) {\r\n setDialogLoading(true);\r\n entrepriseService\r\n .updateAbonnementEntreprise(entreprise.id, abonnement)\r\n .then(() => {\r\n toast.current.show({ severity: 'success', summary: t('success.success'), detail: t('subscription.subscription_update'), life: 3000 })\r\n loadData();\r\n hideDialogSubscription();\r\n })\r\n .catch((err) => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.cant_save'), life: 3000 })\r\n });\r\n }\r\n setDialogLoading(false);\r\n }\r\n\r\n const echeanceDateIsExpired = (date) => {\r\n let dateEcheance = new Date(date);\r\n dateEcheance.setDate(dateEcheance.getDate() + (entreprise?.abonnementEntreprise?.nbSemaineEssai * 7));\r\n // si la date d'échéance est supérieur à la date du jour on return true\r\n return dateEcheance < new Date();\r\n }\r\n\r\n const echeanceDate = (date) => {\r\n let dateEcheance = new Date(date);\r\n dateEcheance.setDate(dateEcheance.getDate() + (entreprise?.abonnementEntreprise?.nbSemaineEssai * 7));\r\n return dateEcheance.toLocaleDateString();\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {loading ? (\r\n \r\n ) : (\r\n <>\r\n {/* */}\r\n \r\n
: {entreprise?.nom}
\r\n {/*
: {entreprise?.prenom} {entreprise?.nom}
*/}\r\n
\r\n\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n {/*
*/}\r\n
\r\n {/*
*/}\r\n
\r\n {/*
{entreprise?.abonnementEntreprise.isFree ? : }
*/}\r\n
\r\n\r\n {entreprise?.abonnementEntreprise?.isFree ? (\r\n
\r\n
{entreprise?.abonnementEntreprise.code}
\r\n
{entreprise?.abonnementEntreprise.label}
\r\n {/*
*/}\r\n
\r\n {/*
{echeanceDateIsExpired(entreprise?.creationDate) ? : }
*/}\r\n
{entreprise?.dateSouscription ? subscriptionDate(entreprise?.dateSouscription) : }
\r\n {/*
{echeanceDate(entreprise?.creationDate)}
*/}\r\n
\r\n ) : (\r\n
\r\n
{entreprise?.abonnementEntreprise.code}
\r\n
{entreprise?.abonnementEntreprise.label}
\r\n {/*
{entreprise?.rythmePaiement == null ? : entreprise?.rythmePaiement == enumRythmePaiement.Mensuel ? : }
*/}\r\n
{entreprise?.abonnementEntreprise.tarifMensuel}
\r\n {/*
{entreprise?.calculPeriodeEssai ? : }
*/}\r\n
{subscriptionDate(entreprise?.dateSouscription)}
\r\n {/*
{subscriptionDate(entreprise?.calculEcheanceDate)}
*/}\r\n
\r\n )}\r\n
\r\n
\r\n } onClick={setDialogSubscription} />\r\n
\r\n
\r\n } modal className=\"p-fluid fca-dialog-container\" onHide={hideDialogSubscription}>\r\n <>\r\n {dialogLoading ? (\r\n \r\n ) : (\r\n \r\n
\r\n
\r\n
\r\n
\r\n {\r\n // on active la fonction de changement de valeur seulement si la valeur est modifié\r\n if (e.oldValue != null && e.oldValue != e.newValue) {\r\n onDropdownChange(e.newValue, 'abonnementEntrepriseId')\r\n }\r\n }}\r\n value={abonnement?.abonnementEntrepriseId}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n
\r\n } className=\"fca-button-cancel\" onClick={hideDialogSubscription} />\r\n
\r\n
\r\n } className=\"fca-button-confirm\" onClick={updateSubscription} />\r\n
\r\n
\r\n
\r\n )}\r\n >\r\n \r\n >\r\n )}\r\n >\r\n )\r\n}","import React, { useState, useEffect, useRef } from 'react';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { classNames } from 'primereact/utils';\r\nimport { DataTable } from 'primereact/datatable';\r\nimport { Column } from 'primereact/column';\r\nimport UserService from '../../services/userService';\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { Toast } from 'primereact/toast';\r\nimport { Button } from 'primereact/button';\r\nimport { Toolbar } from 'primereact/toolbar';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { InputText } from 'primereact/inputtext';\r\nimport './dt_administrateurs.css';\r\n\r\nexport const DT_Administrateur = () => {\r\n\r\n let emptyAdministrateur = {\r\n id: 0,\r\n nom: '',\r\n prenom: '',\r\n email: '',\r\n ecole: [],\r\n nbFormations: 0\r\n };\r\n\r\n const { t } = useTranslation();\r\n const [newAdministrateurDialog, setNewAdministrateurDialog] = useState(true);\r\n const [administrateurs, setAdministrateurs] = useState([]);\r\n const [administrateurDialog, setAdministrateurDialog] = useState(false);\r\n const [deleteAdministrateurDialog, setDeleteAdministrateurDialog] = useState(false);\r\n const [deleteAdministrateursDialog, setDeleteAdministrateursDialog] = useState(false);\r\n const [administrateur, setAdministrateur] = useState(emptyAdministrateur);\r\n const [selectedAdministrateurs, setSelectedAdministrateurs] = useState(null);\r\n const [submitted, setSubmitted] = useState(false);\r\n const [globalFilter, setGlobalFilter] = useState(null);\r\n const toast = useRef(null);\r\n const dt = useRef(null);\r\n const userService = new UserService();\r\n const currentUser = useAuthState();\r\n const [loading, setLoading] = useState(false);\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 10,\r\n page: 0,\r\n });\r\n const isMounted = useRef(false);\r\n\r\n\r\n\r\n useEffect(() => {\r\n isMounted.current = true;\r\n loadLazyData();\r\n }, [lazyParams]);\r\n\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n\r\n userService.getAdministrateurs(currentUser, { lazyEvent: JSON.stringify(lazyParams) }).then(_administrateurs => {\r\n\r\n setAdministrateurs(_administrateurs);\r\n\r\n setLoading(false);\r\n\r\n setNewAdministrateurDialog(false);\r\n });\r\n\r\n }\r\n\r\n const openNew = () => {\r\n setAdministrateur(emptyAdministrateur);\r\n setSubmitted(false);\r\n setAdministrateurDialog(true);\r\n }\r\n\r\n const hideDialog = () => {\r\n setSubmitted(false);\r\n setAdministrateurDialog(false);\r\n }\r\n\r\n const hideDeleteAdministrateurDialog = () => {\r\n setDeleteAdministrateurDialog(false);\r\n }\r\n\r\n const hideDeleteAdministrateursDialog = () => {\r\n setDeleteAdministrateursDialog(false);\r\n }\r\n\r\n const saveAdministrateur = () => {\r\n setSubmitted(true);\r\n\r\n if (administrateur.nom.trim() && administrateur.prenom.trim() && administrateur.email.trim() && (/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(administrateur.email))) {\r\n let _administrateurs = [];\r\n if (administrateurs !== undefined) {\r\n _administrateurs = [...administrateurs];\r\n }\r\n let _administrateur = { ...administrateur };\r\n if (administrateur.id) {\r\n (async function updateAdmin() {\r\n await userService.edit(_administrateur)\r\n .then(() => {\r\n const index = findIndexById(administrateur.id);\r\n _administrateurs[index] = _administrateur;\r\n\r\n setAdministrateurs(_administrateurs);\r\n setAdministrateur(emptyAdministrateur);\r\n\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('administrator.updated_admin'), life: 3000 });\r\n })\r\n .catch((err) => {\r\n if (err.message.includes(\"User already exists\")) {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.email_already_exists'), life: 3000 });\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.not_created_admin'), life: 3000 });\r\n }\r\n })\r\n .finally(() => {\r\n setAdministrateurDialog(false)\r\n }\r\n )\r\n })();\r\n }\r\n else {\r\n userService\r\n .createOrUpdateAdministrateur(administrateur)\r\n .then((_administrateur) => {\r\n\r\n _administrateurs.push(_administrateur);\r\n setAdministrateurs(_administrateurs);\r\n\r\n setAdministrateurDialog(false);\r\n setAdministrateur(emptyAdministrateur);\r\n\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('administrator.created_admin'), life: 3000 });\r\n\r\n })\r\n .catch((err) => {\r\n if (err.message.includes(\"User already exists\")) {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.email_already_exists'), life: 3000 });\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.not_created_admin'), life: 3000 });\r\n }\r\n })\r\n .finally(() => {\r\n setAdministrateurDialog(false)\r\n }\r\n )\r\n\r\n // let _admin = await userService.createOrUpdateAdministrateur(currentUser, administrateur);\r\n // if (_admin != undefined) {\r\n // _administrateur.id = _admin.id;\r\n // //console.log(JSON.stringify(_administrateur));\r\n // _administrateurs.push(_administrateur);\r\n // setAdministrateurs(_administrateurs);\r\n\r\n // setAdministrateurDialog(false);\r\n // setAdministrateur(emptyAdministrateur);\r\n\r\n // toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('administrator.created_admin'), life: 3000 });\r\n\r\n // }\r\n // else {\r\n // setAdministrateurDialog(false);\r\n // toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.not_created_admin'), life: 3000 });\r\n\r\n // }\r\n\r\n }\r\n }\r\n }\r\n\r\n const editAdministrateur = (administrateur) => {\r\n setAdministrateur({ ...administrateur });\r\n setAdministrateurDialog(true);\r\n }\r\n\r\n const confirmDeleteAdministrateur = (administrateur) => {\r\n setAdministrateur(administrateur);\r\n setDeleteAdministrateurDialog(true);\r\n }\r\n\r\n const deleteAdministrateur = () => {\r\n (async function deleteAdmin() {\r\n let _administrateur = { ...administrateur };\r\n await userService.delete(_administrateur);\r\n let _administrateurs = administrateurs.filter(val => val.id !== administrateur.id);\r\n setAdministrateurs(_administrateurs);\r\n setDeleteAdministrateurDialog(false);\r\n setAdministrateur(emptyAdministrateur);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('administrator.deleted_admin'), life: 3000 });\r\n\r\n })();\r\n }\r\n\r\n const findIndexById = (id) => {\r\n let index = -1;\r\n for (let i = 0; i < administrateurs.length; i++) {\r\n if (administrateurs[i].id === id) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n\r\n return index;\r\n }\r\n\r\n const confirmDeleteSelected = () => {\r\n setDeleteAdministrateursDialog(true);\r\n }\r\n\r\n const deleteSelectedAdministrateurs = () => {\r\n (async function deleteAdmin() {\r\n let _administrateurs = administrateurs.filter(val => !selectedAdministrateurs.includes(val));\r\n selectedAdministrateurs.forEach(admin => {\r\n userService.delete(admin);\r\n });\r\n setAdministrateurs(_administrateurs);\r\n setDeleteAdministrateursDialog(false);\r\n setSelectedAdministrateurs(null);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('administrator.deleted_admins'), life: 3000 });\r\n })();\r\n }\r\n\r\n const onInputChange = (e, name) => {\r\n const val = (e.target && e.target.value) || '';\r\n let _administrateur = { ...administrateur };\r\n _administrateur[`${name}`] = val;\r\n\r\n setAdministrateur(_administrateur);\r\n }\r\n\r\n const leftToolbarTemplate = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const actionBodyTemplate = (rowData) => {\r\n return (\r\n \r\n editAdministrateur(rowData)} />\r\n confirmDeleteAdministrateur(rowData)} />\r\n
\r\n );\r\n }\r\n\r\n const header = (\r\n \r\n
\r\n \r\n \r\n setGlobalFilter(e.target.value)} placeholder={t('general.search')} />\r\n \r\n \r\n );\r\n const administrateurDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n const deleteAdministrateurDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n const deleteAdministrateursDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n\r\n setSelectedAdministrateurs(e.value)}\r\n dataKey=\"id\" paginator rows={10} rowsPerPageOptions={[5, 10, 25]}\r\n paginatorTemplate=\"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown\"\r\n currentPageReportTemplate={t('administrator.footer_count_pagin')}\r\n globalFilter={globalFilter}\r\n header={header}\r\n loading={loading}\r\n >\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n {administrateur.image && e.target.src = 'https://www.primefaces.org/wp-content/uploads/2020/05/placeholder.png'} alt={administrateur.image} className=\"administrateur-image\" />}\r\n \r\n \r\n onInputChange(e, 'nom')} required autoFocus className={classNames({ 'p-invalid': submitted && !administrateur.nom })} />\r\n {submitted && !administrateur.nom && }\r\n
\r\n \r\n \r\n onInputChange(e, 'prenom')} required rows={3} cols={20} className={classNames({ 'p-invalid': submitted && !administrateur.prenom })} />\r\n {submitted && !administrateur.prenom && }\r\n
\r\n \r\n \r\n onInputChange(e, 'email')} required rows={3} cols={20} className={classNames({ 'p-invalid': submitted && (!administrateur.email || (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(administrateur.email))) })} />\r\n {submitted && !administrateur.email && }\r\n {submitted && (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(administrateur.email)) && }\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n {administrateur && }\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n {administrateur && }\r\n
\r\n \r\n
\r\n );\r\n}","import React, { useState, useEffect, useRef } from 'react';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { classNames } from 'primereact/utils';\r\nimport { DataTable } from 'primereact/datatable';\r\nimport { Column } from 'primereact/column';\r\nimport { MultiSelect } from 'primereact/multiselect';\r\nimport { Dropdown } from 'primereact/dropdown';\r\nimport UserService from '../../services/userService';\r\nimport ComposanteService from '../../services/composanteService';\r\nimport EcoleService from '../../services/ecoleService';\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { Toast } from 'primereact/toast';\r\nimport { Button } from 'primereact/button';\r\nimport { SelectButton } from 'primereact/selectbutton';\r\nimport { Toolbar } from 'primereact/toolbar';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { InputText } from 'primereact/inputtext';\r\nimport './dt_ecoles_admins.css';\r\nimport { DT_AdministrateursEcole } from './dt_administrateursEcole';\r\n\r\nexport const DT_Ecoles_Admin = () => {\r\n\r\n let emptyAdministrateur = {\r\n id: 0,\r\n nom: '',\r\n prenom: '',\r\n email: '',\r\n ecole: '',\r\n composanteEcole: []\r\n };\r\n\r\n const { t } = useTranslation();\r\n\r\n const [newAdministrateurDialog, setNewAdministrateurDialog] = useState(true);\r\n\r\n const [administrateurs, setAdministrateurs] = useState([]);\r\n const [ecole, setEcole] = useState(null);\r\n\r\n const [expandedRows, setExpandedRows] = useState(null);\r\n\r\n const [administrateurDialog, setAdministrateurDialog] = useState(false);\r\n const [deleteAdministrateurDialog, setDeleteAdministrateurDialog] = useState(false);\r\n const [deleteAdministrateursDialog, setDeleteAdministrateursDialog] = useState(false);\r\n\r\n const [loadingAdministrateur, setLoadingAdministrateur] = useState(false);\r\n\r\n const [viewTypeAdmin, setViewTypeAdmin] = useState(t('administrator.ecole_admin'));\r\n const [viewTypesAdmin, setViewTypesAdmin] = useState([t('administrator.ecole_admin'), t('administrator.composanteEcole_admin')]);\r\n\r\n const [administrateur, setAdministrateur] = useState(emptyAdministrateur);\r\n const [selectedAdministrateurs, setSelectedAdministrateurs] = useState([]);\r\n\r\n const [submittedEcole, setSubmittedEcole] = useState(false);\r\n const [submittedComposante, setSubmittedComposante] = useState(false);\r\n const [globalFilter, setGlobalFilter] = useState(null);\r\n\r\n const [ddlEcolesAdminEcole, setDdlEcolesAdminEcole] = useState([]);\r\n const [ddlEcolesAdminComposante, setDdlEcolesAdminComposante] = useState([]);\r\n const [ddlComposantes, setDdlComposantes] = useState([]);\r\n\r\n const [composantes, setComposantes] = useState([]);\r\n const [ecoles, setEcoles] = useState([]);\r\n\r\n const toast = useRef(null);\r\n\r\n const userService = new UserService();\r\n const ecoleService = new EcoleService();\r\n const composanteService = new ComposanteService();\r\n\r\n const currentUser = useAuthState();\r\n\r\n const [loading, setLoading] = useState(false);\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 10,\r\n page: 0,\r\n });\r\n const isMounted = useRef(false);\r\n\r\n\r\n\r\n useEffect(() => {\r\n isMounted.current = true;\r\n loadLazyData();\r\n }, [lazyParams]);\r\n\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n\r\n ecoleService.getEcolesAdmin(currentUser).then(_ecoles => {\r\n setEcoles(_ecoles);\r\n setDdlEcolesAdminEcole(_ecoles);\r\n setDdlEcolesAdminComposante(_ecoles);\r\n });\r\n\r\n composanteService.getComposantesAdmin(currentUser).then(_composantes => {\r\n setDdlComposantes(_composantes);\r\n setComposantes(_composantes);\r\n setLoading(false);\r\n setNewAdministrateurDialog(false);\r\n });\r\n\r\n }\r\n\r\n const openNew = () => {\r\n setAdministrateur(emptyAdministrateur);\r\n setSubmittedComposante(false);\r\n setSubmittedEcole(false);\r\n setViewTypesAdmin([t('administrator.ecole_admin'), t('administrator.composanteEcole_admin')]);\r\n setAdministrateurDialog(true);\r\n }\r\n\r\n const hideDialogEcole = () => {\r\n setSubmittedEcole(false);\r\n setAdministrateurDialog(false);\r\n }\r\n const hideDialogComposante = () => {\r\n setSubmittedComposante(false);\r\n setAdministrateurDialog(false);\r\n }\r\n\r\n const hideDeleteAdministrateurDialog = () => {\r\n setDeleteAdministrateurDialog(false);\r\n }\r\n\r\n const hideDeleteAdministrateursDialog = () => {\r\n setDeleteAdministrateursDialog(false);\r\n }\r\n\r\n const onAdministrateurSelect = (administrateur) => {\r\n setSelectedAdministrateurs([...selectedAdministrateurs, administrateur]);\r\n }\r\n\r\n const onAdministrateurUnselect = (administrateur) => {\r\n var index = selectedAdministrateurs.indexOf(administrateur);\r\n if (index !== -1) {\r\n setSelectedAdministrateurs(selectedAdministrateurs.splice(index, 1));\r\n }\r\n }\r\n\r\n const saveAdministrateurEcole = () => {\r\n setSubmittedEcole(true);\r\n\r\n var bOk = (viewTypeAdmin === t('administrator.ecole_admin') && administrateur.ecole !== '')\r\n\r\n if (bOk && administrateur.nom.trim() && administrateur.prenom.trim() && administrateur.email.trim() && (/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(administrateur.email))) {\r\n let _administrateurs = [];\r\n if (administrateurs !== undefined) {\r\n _administrateurs = [...administrateurs];\r\n }\r\n let _administrateur = { ...administrateur };\r\n if (administrateur.id) {\r\n (async function updateAdmin() {\r\n await userService.updateAdministrateurEcole(_administrateur)\r\n .then((_administrateur) => {\r\n const index = findIndexById(administrateur.id);\r\n _administrateurs[index] = _administrateur;\r\n\r\n setAdministrateurs(_administrateurs);\r\n setAdministrateurDialog(false);\r\n setAdministrateur(emptyAdministrateur);\r\n\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('administrator.updated_admin'), life: 3000 });\r\n\r\n loadLazyData();\r\n const _expandedRows = { ...expandedRows };\r\n setExpandedRows(null);\r\n setExpandedRows(_expandedRows);\r\n })\r\n .catch((err) => {\r\n if (err.message.includes(\"User already exists\")) {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.email_already_exists'), life: 3000 });\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.not_created_admin'), life: 3000 });\r\n }\r\n })\r\n .finally(() => {\r\n setAdministrateurDialog(false)\r\n }\r\n )\r\n })();\r\n }\r\n else {\r\n\r\n (async function addAdmin() {\r\n await userService.createAdministrateurEcole(administrateur)\r\n .then((_admin) => {\r\n _administrateur.id = _admin.id;\r\n //console.log(JSON.stringify(_administrateur));\r\n _administrateurs.push(_administrateur);\r\n setAdministrateurs(_administrateurs);\r\n\r\n setAdministrateurDialog(false);\r\n setAdministrateur(emptyAdministrateur);\r\n\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('administrator.created_admin'), life: 3000 });\r\n\r\n loadLazyData();\r\n const _expandedRows = { ...expandedRows };\r\n setExpandedRows(null);\r\n setExpandedRows(_expandedRows);\r\n })\r\n .catch((err) => {\r\n if (err.message.includes(\"User already exists\")) {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.email_already_exists'), life: 3000 });\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.not_created_admin'), life: 3000 });\r\n }\r\n })\r\n .finally(() => {\r\n setAdministrateurDialog(false)\r\n }\r\n )\r\n })();\r\n }\r\n }\r\n }\r\n\r\n const saveAdministrateurComposante = () => {\r\n setSubmittedComposante(true);\r\n\r\n var bOk = (viewTypeAdmin === t('administrator.composanteEcole_admin') && administrateur.composanteEcole?.length > 0)\r\n\r\n if (bOk && administrateur.nom.trim() && administrateur.prenom.trim() && administrateur.email.trim() && (/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(administrateur.email))) {\r\n let _administrateurs = [];\r\n if (administrateurs !== undefined) {\r\n _administrateurs = [...administrateurs];\r\n }\r\n let _administrateur = { ...administrateur };\r\n if (administrateur.id) {\r\n (async function updateAdmin() {\r\n await userService.updateAdministrateurComposante(_administrateur)\r\n .then((_administrateur) => {\r\n const index = findIndexById(administrateur.id);\r\n _administrateurs[index] = _administrateur;\r\n\r\n setAdministrateurs(_administrateurs);\r\n setAdministrateurDialog(false);\r\n setAdministrateur(emptyAdministrateur);\r\n\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('administrator.updated_admin'), life: 3000 });\r\n\r\n loadLazyData();\r\n const _expandedRows = { ...expandedRows };\r\n setExpandedRows(null);\r\n setExpandedRows(_expandedRows);\r\n })\r\n .catch((err) => {\r\n if (err.message.includes(\"User already exists\")) {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.email_already_exists'), life: 3000 });\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.not_created_admin'), life: 3000 });\r\n }\r\n })\r\n .finally(() => {\r\n setAdministrateurDialog(false)\r\n }\r\n )\r\n })();\r\n }\r\n else {\r\n\r\n (async function addAdmin() {\r\n await userService.createAdministrateurComposante(administrateur)\r\n .then((_admin) => {\r\n _administrateur.id = _admin.id;\r\n //console.log(JSON.stringify(_administrateur));\r\n _administrateurs.push(_administrateur);\r\n setAdministrateurs(_administrateurs);\r\n\r\n setAdministrateurDialog(false);\r\n setAdministrateur(emptyAdministrateur);\r\n\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('administrator.created_admin'), life: 3000 });\r\n\r\n loadLazyData();\r\n const _expandedRows = { ...expandedRows };\r\n setExpandedRows(null);\r\n setExpandedRows(_expandedRows);\r\n })\r\n .catch((err) => {\r\n if (err.message.includes(\"User already exists\")) {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.email_already_exists'), life: 3000 });\r\n }\r\n else {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('administrator.not_created_admin'), life: 3000 });\r\n }\r\n })\r\n .finally(() => {\r\n setAdministrateurDialog(false)\r\n }\r\n )\r\n })();\r\n }\r\n }\r\n }\r\n\r\n const deleteAdministrateur = () => {\r\n (async function deleteAdmin() {\r\n let _administrateur = { ...administrateur };\r\n await userService.delete(_administrateur);\r\n let _administrateurs = administrateurs.filter(val => val.id !== administrateur.id);\r\n setAdministrateurs(_administrateurs);\r\n setDeleteAdministrateurDialog(false);\r\n setAdministrateur(emptyAdministrateur);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('administrator.deleted_admin'), life: 3000 });\r\n\r\n })();\r\n }\r\n\r\n const findIndexById = (id) => {\r\n let index = -1;\r\n for (let i = 0; i < administrateurs?.length; i++) {\r\n if (administrateurs[i].id === id) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n\r\n return index;\r\n }\r\n\r\n const confirmDeleteSelected = () => {\r\n setDeleteAdministrateursDialog(true);\r\n }\r\n\r\n const deleteSelectedAdministrateurs = () => {\r\n (async function deleteAdmin() {\r\n let _administrateurs = administrateurs.filter(val => !selectedAdministrateurs.includes(val));\r\n selectedAdministrateurs.forEach(admin => {\r\n userService.delete(admin);\r\n });\r\n setAdministrateurs(_administrateurs);\r\n setDeleteAdministrateursDialog(false);\r\n setSelectedAdministrateurs(null);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('administrator.deleted_admins'), life: 3000 });\r\n })();\r\n }\r\n\r\n const onInputChange = (e, name) => {\r\n const val = (e.target && e.target.value) || '';\r\n let _administrateur = { ...administrateur };\r\n _administrateur[`${name}`] = val;\r\n\r\n setAdministrateur(_administrateur);\r\n }\r\n\r\n const onEcoleChangeC = (e, name) => {\r\n\r\n const val = (e.target && e.target.value) || '';\r\n\r\n //onInputChange(e, name);\r\n\r\n var _ddlComposantes = [...composantes];\r\n var _ddlComposantes = _ddlComposantes.filter(o => o.ecoleId === e.value.id);\r\n setDdlComposantes(_ddlComposantes);\r\n let _administrateur = { ...administrateur };\r\n _administrateur.ecole = val;\r\n _administrateur.composanteEcole = [];\r\n setAdministrateur(_administrateur);\r\n\r\n }\r\n const onEcoleChangeE = (e, name) => {\r\n onInputChange(e, name);\r\n }\r\n\r\n const onComposanteChange = (e, name) => {\r\n onInputChange(e, name);\r\n }\r\n\r\n const onTypeAdminChange = (e) => {\r\n setViewTypeAdmin(e.value);\r\n let _administrateur = { ...administrateur };\r\n if (e.value === t('administrator.ecole_admin')) {\r\n _administrateur.composanteEcole = [];\r\n setAdministrateurDialog(true);\r\n }\r\n _administrateur.ecole = '';\r\n setEcole(null);\r\n setAdministrateurDialog(true);\r\n setAdministrateur(_administrateur);\r\n }\r\n\r\n const leftToolbarTemplate = () => {\r\n return (\r\n \r\n \r\n {/* */}\r\n
\r\n )\r\n }\r\n\r\n const ddlAdminEcole = (\r\n \r\n * \r\n onEcoleChangeE(e, 'ecole')} optionLabel=\"nomEcole\" placeholder={t('administrator.select_school')} filter resetFilterOnHide emptyFilterMessage={t('school.no_school_to_show')} />\r\n {submittedEcole && !administrateur?.ecole && }\r\n
\r\n );\r\n const ddlAdminComposanteEcole = (\r\n \r\n
\r\n * \r\n onEcoleChangeC(e, 'ecole')} optionLabel=\"nomEcole\" placeholder={t('administrator.select_school')} filter resetFilterOnHide emptyFilterMessage={t('school.no_school_to_show')} />\r\n {submittedComposante && !administrateur?.ecole && }\r\n
\r\n
\r\n * \r\n onComposanteChange(e, 'composanteEcole')} optionLabel=\"nom\" placeholder={t('administrator.select_components')} display=\"chip\" filter={true} />\r\n {submittedComposante && administrateur?.composanteEcole?.length < 1 && }\r\n
\r\n
\r\n );\r\n\r\n const formulaireAdminEcole = (\r\n \r\n
\r\n onTypeAdminChange(e)} />\r\n
\r\n
\r\n \r\n onInputChange(e, 'nom')} required autoFocus className={classNames({ 'p-invalid': submittedEcole && !administrateur.nom })} />\r\n {submittedEcole && !administrateur.nom && }\r\n
\r\n
\r\n \r\n onInputChange(e, 'prenom')} required rows={3} cols={20} className={classNames({ 'p-invalid': submittedEcole && !administrateur.prenom })} />\r\n {submittedEcole && !administrateur.prenom && }\r\n
\r\n {ddlAdminEcole}\r\n
\r\n \r\n onInputChange(e, 'fonctions')} rows={3} cols={20} />\r\n
\r\n
\r\n \r\n onInputChange(e, 'email')} required rows={3} cols={20} className={classNames({ 'p-invalid': submittedEcole && (!administrateur.email || (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(administrateur.email))) })} />\r\n {submittedEcole && !administrateur.email && }\r\n {submittedEcole && !administrateur.email && (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(administrateur.email)) && }\r\n {submittedEcole && (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(administrateur.email)) && }\r\n
\r\n
\r\n \r\n onInputChange(e, 'phoneNumber')} required rows={3} cols={20} />\r\n
\r\n
\r\n );\r\n\r\n\r\n const formulaireAdminComposante = (\r\n \r\n
\r\n onTypeAdminChange(e)} />\r\n
\r\n
\r\n \r\n onInputChange(e, 'nom')} required autoFocus className={classNames({ 'p-invalid': submittedComposante && !administrateur.nom })} />\r\n {submittedComposante && !administrateur.nom && }\r\n
\r\n
\r\n \r\n onInputChange(e, 'prenom')} required rows={3} cols={20} className={classNames({ 'p-invalid': submittedComposante && !administrateur.prenom })} />\r\n {submittedComposante && !administrateur.prenom && }\r\n
\r\n {ddlAdminComposanteEcole}\r\n
\r\n \r\n onInputChange(e, 'fonctions')} rows={3} cols={20} />\r\n
\r\n
\r\n \r\n onInputChange(e, 'email')} required rows={3} cols={20} className={classNames({ 'p-invalid': submittedComposante && (!administrateur.email || (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(administrateur.email))) })} />\r\n {submittedComposante && !administrateur.email && }\r\n {submittedComposante && !administrateur.email && (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(administrateur.email)) && }\r\n {submittedComposante && (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(administrateur.email)) && }\r\n
\r\n
\r\n \r\n onInputChange(e, 'phoneNumber')} required rows={3} cols={20} />\r\n
\r\n
\r\n );\r\n\r\n const administrateurComposanteDialogFooter = (\r\n \r\n \r\n \r\n
\r\n );\r\n const administrateurEcoleDialogFooter = (\r\n \r\n \r\n \r\n
\r\n );\r\n const deleteAdministrateurDialogFooter = (\r\n \r\n \r\n \r\n
\r\n );\r\n const deleteAdministrateursDialogFooter = (\r\n \r\n \r\n \r\n
\r\n );\r\n const headerEcole = (\r\n \r\n
\r\n \r\n \r\n setGlobalFilter(e.target.value)} placeholder={t('general.search')} />\r\n \r\n \r\n );\r\n\r\n const dtAdministrateurs = (ecole) => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n setExpandedRows(e.data)}\r\n rowExpansionTemplate={dtAdministrateurs}\r\n dataKey=\"id\" header={headerEcole}\r\n globalFilter={globalFilter}\r\n paginator rows={10} rowsPerPageOptions={[5, 10, 25]}\r\n paginatorTemplate=\"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown\"\r\n currentPageReportTemplate={t('component.footer_count_pagin')}\r\n loading={loading}\r\n >\r\n \r\n \r\n \r\n\r\n
\r\n\r\n
\r\n {viewTypeAdmin === t('administrator.ecole_admin') ?\r\n formulaireAdminEcole : formulaireAdminComposante\r\n }\r\n \r\n\r\n\r\n
\r\n \r\n \r\n {administrateur && {administrateur.email} }\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n {administrateur && }\r\n
\r\n \r\n
\r\n );\r\n}\r\n","\r\nimport React, { useState, useEffect, useRef, Fragment } from 'react';\r\nimport FormationService from '../../../services/formationService';\r\nimport { useAuthState } from '../../../context/context';\r\nimport { Button } from 'primereact/button';\r\nimport { Toolbar } from 'primereact/toolbar';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { Toast } from 'primereact/toast';\r\nimport 'primereact/resources/primereact.css';\r\nimport 'primeflex/primeflex.css';\r\nimport 'primeicons/primeicons.css';\r\nimport { DT_Formation } from '../../../components/datatable/dt_formation';\r\nimport { DT_Ecole } from '../../../components/datatable/dt_ecoles';\r\nimport './administrationFormationsPage.css';\r\nimport { enumRoles } from '../../../enums/enumRoles';\r\nimport { FormationDialog } from '../../../components/dialog/formationDialog';\r\n\r\n\r\nexport const AdministrationFormationsPage = () => {\r\n \r\n const { t } = useTranslation();\r\n const currentUser = useAuthState();\r\n\r\n const [formationDialog, setFormationDialog] = useState(false);\r\n const [deleteFormationsDialog, setDeleteFormationsDialog] = useState(false);\r\n\r\n const [formationIsDuplicate, setFormationIsDuplicate] = useState(false);\r\n\r\n const [formationId, setFormationId] = useState(0);\r\n\r\n\r\n const toast = useRef(null);\r\n\r\n const [refreshToken, setRefreshToken] = useState(new Date());\r\n\r\n const openNewFormationDialog = () => {\r\n setFormationId(0)\r\n setFormationIsDuplicate(false);\r\n setFormationDialog(true);\r\n }\r\n\r\n const openEditFormationDialog = (formationId) => {\r\n setFormationId(formationId);\r\n setFormationIsDuplicate(false);\r\n setFormationDialog(true);\r\n }\r\n\r\n const openDuplicateFormationDialog = (formationId) => {\r\n setFormationId(formationId);\r\n setFormationIsDuplicate(true);\r\n setFormationDialog(true);\r\n }\r\n\r\n const hideDialog = () => {\r\n setFormationDialog(false);\r\n }\r\n\r\n const triggerDataTableRefresh = () => {\r\n setRefreshToken(new Date());\r\n }\r\n\r\n const hideDeleteFormationsDialog = () => {\r\n setDeleteFormationsDialog(false);\r\n }\r\n\r\n const leftToolbarTemplate = () => {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const rowExpansionTemplate = (ecole) => {\r\n return (\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n return (\r\n\r\n \r\n
\r\n\r\n
\r\n {((currentUser.roles.indexOf(enumRoles.SUPERADMINISTRATEUR) > -1) || (currentUser.roles.indexOf(enumRoles.ADMINISTRATEUR) > -1)) &&
}\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n );\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { DT_Formation } from \"../../../components/datatable/dt_formation\"\r\nimport { FormationDialog } from \"../../../components/dialog/formationDialog\"\r\n\r\nexport const FormationsOrphelinesPage = () => {\r\n\r\n const { t } = useTranslation();\r\n const [formationDialog, setFormationDialog] = useState(false);\r\n const [refreshToken, setRefreshToken] = useState(new Date());\r\n const [formationId, setFormationId] = useState(0);\r\n\r\n useEffect(() => {\r\n }, [])\r\n\r\n const hideDialog = () => {\r\n setFormationDialog(false);\r\n }\r\n\r\n const openEditFormationDialog = (formationId) => {\r\n setFormationId(formationId);\r\n setFormationDialog(true);\r\n }\r\n\r\n const triggerDataTableRefresh = () => {\r\n setRefreshToken(new Date());\r\n }\r\n \r\n return (\r\n \r\n \r\n\r\n \r\n
\r\n )\r\n}","import { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { Fragment, useEffect, useRef, useState } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router\";\r\nimport { enumContextFormationThumbnail } from \"../../enums/enumContextFormationThumbnail\";\r\nimport './formationsFavorites.css'\r\nimport { NewFormationThumbnail } from \"../../components/thumbnail/newFormationThumbnail\";\r\nimport { MenuSearchFilter } from \"../../scenes/rechercheAffinee/menu/menuSearchFilter\";\r\nimport RechercheContext from \"../../scenes/rechercheAffinee/RechercheContext\";\r\nimport { enumCategorieRecherche } from \"../../enums/enumCategorieRecherche\";\r\nimport { ThumbnailPaginator } from \"../../components/paginator/thumbnailPaginator\";\r\nimport RechercheService from \"../../services/rechercheService\";\r\nimport { MenuPopUpSearchFilter } from \"../../scenes/rechercheAffinee/menu/menuPopUpSearchFilter\";\r\nimport EntrepriseService from \"../../services/entrepriseService\";\r\nimport RoleHelper from \"../../utils/roleHelper\";\r\nimport { useAuthState } from \"../../context/context\";\r\n\r\nexport const FormationsFavorites = (props) => {\r\n\r\n const history = useHistory();\r\n const currentUser = useAuthState();\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [loading, setLoading] = useState(false);\r\n const { t } = useTranslation();\r\n const toast = useRef(null);\r\n const [formationsFavorites, setFormationsFavorites] = useState([]);\r\n const [filtersActiveIndex, setFiltersActiveIndex] = useState([]);\r\n const [tokenResetFilters, setTokenResetFilters] = useState(null);\r\n\r\n const _lazyParamsDefault = {\r\n first: 0,\r\n rows: 12,\r\n page: 1,\r\n sortField: 'dateMiseEnFavoris',\r\n sortOrder: 1,\r\n filters: history.location?.state?.filters || []\r\n };\r\n\r\n const [lazyParams, setLazyParams] = useState(_lazyParamsDefault);\r\n\r\n const rechercheService = new RechercheService();\r\n const entrepriseService = new EntrepriseService();\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId;\r\n const adminImpersonatingEtudiantId = history.location?.state?.adminImpersonatingEtudiantId;\r\n\r\n useEffect(() => {\r\n loadLazyData(lazyParams);\r\n }, [lazyParams]);\r\n\r\n const loadLazyData = (_lazyParams) => {\r\n setLoading(true);\r\n if(RoleHelper.isEntreprise(currentUser) || (RoleHelper.isAdminImpersonatingEntreprise(currentUser, history.location.pathname) && adminImpersonatingRecruteurId)) {\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then((id) => {\r\n rechercheService.getFormationFavoritesEntreprise(_lazyParams, id).then(_pagedFavorites => {\r\n setTotalCount(_pagedFavorites.totalCount)\r\n setFormationsFavorites(_pagedFavorites.items);\r\n setLoading(false);\r\n })\r\n .catch(() => toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 }))\r\n .finally(() => setLoading(false));\r\n })\r\n }\r\n else {\r\n rechercheService.getFormationFavorites(_lazyParams, adminImpersonatingEtudiantId).then(_pagedFavorites => {\r\n setTotalCount(_pagedFavorites.totalCount)\r\n setFormationsFavorites(_pagedFavorites.items);\r\n setLoading(false);\r\n })\r\n .catch(() => toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('errors.cant_load'), life: 3000 }))\r\n .finally(() => setLoading(false));\r\n }\r\n }\r\n\r\n\r\n const contextRecherche = {\r\n lazyParams,\r\n setLazyParams,\r\n rechercheApi: loadLazyData,\r\n totalFormationsRecords: totalCount,\r\n categorieRecherche: enumCategorieRecherche,\r\n tokenResetFilters\r\n }\r\n\r\n const onClickChangePage = (lazyParams) => {\r\n setLazyParams(lazyParams);\r\n }\r\n\r\n const onLinkClick = () => {\r\n history.push('/rechercheAffinee');\r\n }\r\n\r\n const onUnlike = () => {\r\n loadLazyData(lazyParams)\r\n }\r\n\r\n const handleClicEffacerFiltres = (e) => {\r\n e.preventDefault()\r\n try {\r\n setTokenResetFilters(new Date())\r\n contextRecherche.setLazyParams(_lazyParamsDefault)\r\n contextRecherche.rechercheApi(_lazyParamsDefault)\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n\r\n return (\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n {loading ?\r\n
\r\n :\r\n <>\r\n
\r\n {formationsFavorites.map((ff, indexFF) => (\r\n
\r\n \r\n onUnlike()} context={enumContextFormationThumbnail.FAVORI} loadLazyData={e => loadLazyData(e)} lazyParams={lazyParams} />\r\n
\r\n \r\n ))}\r\n
\r\n {formationsFavorites?.length > 0 &&
\r\n \r\n
}\r\n >\r\n }\r\n {!loading && formationsFavorites.length == 0 &&
\r\n \r\n onLinkClick()} > \r\n . \r\n
}\r\n
\r\n
\r\n {/* \r\n \r\n
*/}\r\n \r\n\r\n
\r\n )\r\n}","import { Dropdown } from \"primereact/dropdown\"\r\nimport { ProgressSpinner } from \"primereact/progressspinner\"\r\nimport { useEffect, useState } from \"react\"\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\"\r\nimport { FormationHeaderCard } from \"../../components/card/formationHeaderCard\"\r\nimport { PieChartCard } from \"../../components/chart/pieChartCard\"\r\nimport FormationService from \"../../services/formationService\"\r\nimport StatistiquesService from \"../../services/statistiquesService\"\r\nimport \"./statistiquesFormation.css\"\r\n\r\nexport const StatistiquesFormation = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const [formation, setFormation] = useState(null)\r\n const [loading, setLoading] = useState(true)\r\n const [fetching, setFetching] = useState(true)\r\n const [values, setValues] = useState([])\r\n const [selectedValue, setSelectedValue] = useState(\"last_30_days\")\r\n const [dataAccueil, setDataAccueil] = useState(null)\r\n const [dataResultat, setDataResultat] = useState(null)\r\n const [dataConsultation, setDataConsultation] = useState(null)\r\n const [totalAccueil, setTotalAccueil] = useState(0)\r\n const [totalConsultation, setTotalConsultation] = useState(0)\r\n const [totalResultat, setTotalResultat] = useState(0)\r\n const formationService = new FormationService();\r\n const statistiquesService = new StatistiquesService();\r\n const history = useHistory();\r\n\r\n\r\n const id = props.match.params.formationId;\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n formationService.getFormationExtraLight(id)\r\n .then(_formation => {\r\n setFormation(_formation);\r\n buildValues(_formation)\r\n })\r\n .catch((err) => {\r\n history.push(\"/\");\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (formation?.id) {\r\n setFetching(true);\r\n if (selectedValue == \"last_30_days\") {\r\n statistiquesService.GetFormationByLast30Jours(formation.id)\r\n .then(data => {\r\n formatingStats(data);\r\n })\r\n .catch((err) => {\r\n history.push(\"/\");\r\n })\r\n .finally(() => {\r\n setFetching(false);\r\n });\r\n }\r\n else {\r\n statistiquesService.GetStatFormationByMois(formation.id, selectedValue)\r\n .then(data => {\r\n formatingStats(data);\r\n })\r\n .catch((err) => {\r\n history.push(\"/\");\r\n })\r\n .finally(() => {\r\n setFetching(false);\r\n });\r\n }\r\n }\r\n }, [selectedValue, formation])\r\n\r\n const buildValues = (formation) => {\r\n let date = new Date();\r\n let endDate = new Date(formation.dateCreation);\r\n let maxEndDate = new Date(\"July 1 2022\");\r\n let resultList = [];\r\n var monthNameList = [t('months.january'), t('months.february'), t('months.march'), t('months.april'), t('months.may'), t('months.june'), t('months.july'), t('months.august'), t('months.september'), t('months.october'), t('months.november'), t('months.december')];\r\n while (date >= endDate && date >= maxEndDate) {\r\n var stringDate = monthNameList[date.getMonth()] + \" \" + date.getFullYear();\r\n let _date = new Date(date);\r\n resultList.push({ label: stringDate, value: _date });\r\n date.setMonth(date.getMonth() - 1);\r\n }\r\n resultList.unshift({ label: t('statistics.last_30_days'), value: \"last_30_days\" })\r\n setValues(resultList);\r\n }\r\n\r\n const formatingStats = (data) => {\r\n // let vuesInconnuAccueil = 0\r\n // let vuesEtudiantAccueil = 0\r\n // let vuesEntrepriseAccueil = 0\r\n let vuesInconnuResultat = 0\r\n let vuesEtudiantResultat = 0\r\n let vuesEntrepriseResultat = 0\r\n let vuesInconnuConsultation = 0\r\n let vuesEtudiantConsultation = 0\r\n let vuesEntrepriseConsultation = 0\r\n data.forEach(e => {\r\n switch (e.consultationType) {\r\n // case 1:\r\n // vuesInconnuAccueil = vuesInconnuAccueil + e.vuesInconnu\r\n // vuesEtudiantAccueil = vuesEtudiantAccueil + e.vuesEtudiant\r\n // vuesEntrepriseAccueil = vuesEntrepriseAccueil + e.vuesEntreprise\r\n // break;\r\n case 2:\r\n vuesInconnuResultat = vuesInconnuResultat + e.vuesInconnu\r\n vuesEtudiantResultat = vuesEtudiantResultat + e.vuesEtudiant\r\n vuesEntrepriseResultat = vuesEntrepriseResultat + e.vuesEntreprise\r\n break;\r\n case 3:\r\n vuesInconnuConsultation = vuesInconnuConsultation + e.vuesInconnu\r\n vuesEtudiantConsultation = vuesEtudiantConsultation + e.vuesEtudiant\r\n vuesEntrepriseConsultation = vuesEntrepriseConsultation + e.vuesEntreprise\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n // setTotalAccueil(vuesInconnuAccueil + vuesEtudiantAccueil + vuesEntrepriseAccueil);\r\n setTotalResultat(vuesInconnuResultat + vuesEtudiantResultat + vuesEntrepriseResultat);\r\n setTotalConsultation(vuesInconnuConsultation + vuesEtudiantConsultation + vuesEntrepriseConsultation);\r\n // setDataAccueil({\r\n // label:\"1\",\r\n // labels: [t('statistics.students', { number: vuesEtudiantAccueil }), t('statistics.companies', { number: vuesEntrepriseAccueil }), t('statistics.user_not_connected', { number: vuesInconnuAccueil })],\r\n // datasets: [\r\n // {\r\n // data: [vuesEtudiantAccueil, vuesEntrepriseAccueil, vuesInconnuAccueil],\r\n // backgroundColor: [\r\n // \"#ed6a5a\",\r\n // \"#04486c\",\r\n // \"#6c757d\"\r\n // ]\r\n // }\r\n // ]\r\n // })\r\n setDataResultat({\r\n label:\"2\",\r\n labels: [t('statistics.students', { number: vuesEtudiantResultat }), t('statistics.companies', { number: vuesEntrepriseResultat }), t('statistics.user_not_connected', { number: vuesInconnuResultat })],\r\n datasets: [\r\n {\r\n data: [vuesEtudiantResultat, vuesEntrepriseResultat, vuesInconnuResultat],\r\n backgroundColor: [\r\n \"#ed6a5a\",\r\n \"#04486c\",\r\n \"#6c757d\"\r\n ]\r\n }\r\n ]\r\n })\r\n setDataConsultation({\r\n label:\"3\",\r\n labels: [t('statistics.students', { number: vuesEtudiantConsultation }), t('statistics.companies', { number: vuesEntrepriseConsultation }), t('statistics.user_not_connected', { number: vuesInconnuConsultation })],\r\n datasets: [\r\n {\r\n data: [vuesEtudiantConsultation, vuesEntrepriseConsultation, vuesInconnuConsultation],\r\n backgroundColor: [\r\n \"#ed6a5a\",\r\n \"#04486c\",\r\n \"#6c757d\"\r\n ]\r\n }\r\n ]\r\n })\r\n }\r\n\r\n return (\r\n loading ? (\r\n \r\n ) : (\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n setSelectedValue(e.value)}\r\n />\r\n
\r\n {/*
*/}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n )\r\n\r\n )\r\n}","import { Card } from 'primereact/card';\r\nimport { ProgressSpinner } from 'primereact/progressspinner';\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport OffreEmploiService from '../../services/offreEmploiService';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { NewLineFormater } from '../../components/formater/newLineFormater';\r\nimport \"./vueOffreEmploi.css\"\r\nimport { Button } from 'primereact/button';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { Toast } from \"primereact/toast\";\r\nimport Helper from '../../utils/helper';\r\nimport { OffreEmploiPrimaryThumbnail } from '../../components/thumbnail/offreEmploiPrimaryThumbnail';\r\nimport { CardPresentationEntrepriseThumbnail } from '../../components/thumbnail/cardPresentationEntrepriseThumbnail';\r\nimport { useAuthState } from \"../../context/context\";\r\nimport RoleHelper from \"../../utils/roleHelper\";\r\nimport { OffreEmploiSeekedProfileThumbnail } from '../../components/thumbnail/offreEmploiSeekedProfileThumbnail';\r\nimport { WysiwygRenderer } from '../../components/wysiwyg/wysiwygRenderer';\r\nimport { WysiwygResponsiveRenderer } from '../../components/wysiwyg/wysiwygResponsiveRenderer';\r\nimport parse from 'html-react-parser';\r\nimport { enumCategorieRecherche } from '../../enums/enumCategorieRecherche';\r\nimport { enumNiveauDiplome } from '../../enums/enumNiveauDiplome';\r\n\r\nexport const VueOffreEmploi = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const toast = useRef(null);\r\n const currentUser = useAuthState();\r\n\r\n const [loading, setLoading] = useState(true);\r\n const [offreEmploi, setOffreEmploi] = useState(null);\r\n\r\n\r\n const history = useHistory();\r\n const offreEmploiService = new OffreEmploiService();\r\n\r\n const search = props.location.search;\r\n const params = new URLSearchParams(search);\r\n const id = params.get('offreEmploiId');\r\n\r\n useEffect(() => {\r\n\r\n // si l'utilisateur est un AdminImpersonatingEntreprise, on récupère son adminImpersonatingRecruteurId pour le placer dans le state courant\r\n if (RoleHelper.isAdminImpersonatingEntreprise(currentUser, history.location.pathname)) {\r\n const storedState = sessionStorage.getItem('myState');\r\n const state = storedState ? JSON.parse(storedState) : null;\r\n if (state && state.adminImpersonatingRecruteurId) {\r\n history.replace(history.location.pathname, { ...history.location.state, adminImpersonatingRecruteurId: state.adminImpersonatingRecruteurId });\r\n }\r\n // on supprime le state de la session storage\r\n sessionStorage.removeItem('myState');\r\n }\r\n\r\n //récupérer l'annonce avec l'id\r\n setLoading(true);\r\n offreEmploiService.getOffreEmploiExtended(id).then(_offreEmploi => {\r\n if (_offreEmploi.dateCreation) { _offreEmploi.dateCreation = Helper.dateTimeToLocaleDateTime(_offreEmploi.dateCreation) }\r\n if (_offreEmploi.dateDebutSouhaite) { _offreEmploi.dateDebutSouhaite = Helper.dateTimeToLocaleDateTime(_offreEmploi.dateDebutSouhaite) }\r\n setOffreEmploi(_offreEmploi);\r\n setLoading(false);\r\n })\r\n .catch(err => {\r\n history.push('/')\r\n });\r\n }, [])\r\n\r\n const handleClickRetourListe = () => {\r\n if (RoleHelper.isEtudiant(currentUser)) {\r\n const pageProfile = history.location?.state?.pageProfil ? history.location.state.pageProfil : 1;\r\n const pageFormation = history.location?.state?.pageFormation ? history.location.state.pageFormation : 1;\r\n const pageFavorites = history.location?.state?.pageFavorites ? history.location.state.pageFavorites : 1;\r\n history.push(`/offresCompatibles?pageProfil=${pageProfile}&pageFormation=${pageFormation}&pageFavorites=${pageFavorites}`);\r\n }\r\n else if (RoleHelper.isEntreprise(currentUser)) {\r\n history.push('/offers');\r\n }\r\n else {\r\n history.push('/');\r\n }\r\n\r\n }\r\n\r\n const handleClickRetourAccueil = () => {\r\n history.push('/');\r\n }\r\n\r\n const handleClickFormationsCompatibles = () => {\r\n let _filters = []\r\n // métier\r\n if (offreEmploi.offreEmploiAppellations?.length > 0) {\r\n offreEmploi.offreEmploiAppellations.forEach(\r\n e => {\r\n _filters.push({ categorie: enumCategorieRecherche.Appellation, label: e.appellation.libelle, value: e.appellation.id })\r\n });\r\n }\r\n else if (offreEmploi.appellation) {\r\n _filters.push({ categorie: enumCategorieRecherche.Appellation, label: offreEmploi.appellation.libelle, value: offreEmploi.appellation.id })\r\n }\r\n // niveau de diplome\r\n switch (offreEmploi.niveauDiplome) {\r\n case parseInt(enumNiveauDiplome.BAC2):\r\n _filters.push({ categorie: enumCategorieRecherche.NiveauSortie, value: enumNiveauDiplome.BAC2 }\r\n , { categorie: enumCategorieRecherche.NiveauSortie, value: enumNiveauDiplome.BAC3 }\r\n , { categorie: enumCategorieRecherche.NiveauSortie, value: enumNiveauDiplome.BAC4 }\r\n , { categorie: enumCategorieRecherche.NiveauSortie, value: enumNiveauDiplome.BAC5 }\r\n )\r\n break;\r\n case parseInt(enumNiveauDiplome.BAC3):\r\n _filters.push({ categorie: enumCategorieRecherche.NiveauSortie, value: enumNiveauDiplome.BAC3 }\r\n , { categorie: enumCategorieRecherche.NiveauSortie, value: enumNiveauDiplome.BAC4 }\r\n , { categorie: enumCategorieRecherche.NiveauSortie, value: enumNiveauDiplome.BAC5 }\r\n )\r\n break;\r\n case parseInt(enumNiveauDiplome.BAC4):\r\n _filters.push({ categorie: enumCategorieRecherche.NiveauSortie, value: enumNiveauDiplome.BAC4 }\r\n , { categorie: enumCategorieRecherche.NiveauSortie, value: enumNiveauDiplome.BAC5 }\r\n )\r\n break;\r\n case parseInt(enumNiveauDiplome.BAC5):\r\n _filters.push({ categorie: enumCategorieRecherche.NiveauSortie, value: enumNiveauDiplome.BAC5 })\r\n break;\r\n default:\r\n break;\r\n }\r\n // compétences\r\n if (offreEmploi.competences?.length > 0) {\r\n if (offreEmploi.competences.length === 1) {\r\n const e = offreEmploi.competences[0];\r\n _filters.push({ label: e.competence.libelle, value: e.competenceId, type: null, categorie: 0, exige: true });\r\n } else {\r\n offreEmploi.competences.forEach(\r\n e => {\r\n _filters.push({ label: e.competence.libelle, value: e.competenceId, type: null, categorie: 0, exige: false });\r\n });\r\n }\r\n }\r\n // type de contrat\r\n if (offreEmploi.typeContrat) {\r\n switch(offreEmploi.natureContrat.code) {\r\n // CDD/CDI\r\n case 'E1':\r\n _filters.push({ categorie: enumCategorieRecherche.ContratCDDCDI, value: true })\r\n break;\r\n // Alternance - contrat d'apprentissage\r\n case 'E2':\r\n _filters.push({ categorie: enumCategorieRecherche.ContratAltApp, value: true })\r\n break;\r\n // Alternance - contrat de professionnalisation\r\n case 'FS':\r\n _filters.push({ categorie: enumCategorieRecherche.ContratAltPro, value: true })\r\n break;\r\n // Stage\r\n case 'ST':\r\n _filters.push({ categorie: enumCategorieRecherche.ContratStage, value: true })\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n history.push({ pathname: '/rechercheAffinee', state: { filters: _filters, adminImpersonatingRecruteurId: history.location?.state?.adminImpersonatingRecruteurId } });\r\n }\r\n\r\n const handlePostuler = () => {\r\n if (offreEmploi.providerId == 1) {\r\n if (offreEmploi.isApplied) {\r\n handleClickAnnulerCandidatureAnnonceInterne();\r\n }\r\n else {\r\n handleClickPostulerAnnonceInterne();\r\n }\r\n } else {\r\n handleClickPostulerAnnonceExterne();\r\n }\r\n\r\n }\r\n\r\n const handleClickPostulerAnnonceInterne = () => {\r\n offreEmploiService.postulerOffreEmploiInterne(offreEmploi.id)\r\n .then(data => {\r\n toast.current.show({ severity: 'success', summary: t('recruitment.message.postuler_candidature'), detail: t('recruitment.message.message_envoye_entreprise'), life: 3000 });\r\n let _offreEmploi = { ...offreEmploi }\r\n _offreEmploi.isApplied = true\r\n setOffreEmploi(_offreEmploi)\r\n })\r\n .catch(err => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.unknown'), life: 3000 })\r\n })\r\n .finally(() => {\r\n\r\n })\r\n }\r\n\r\n const handleClickAnnulerCandidatureAnnonceInterne = () => {\r\n offreEmploiService.annulerCandidatureOffreEmploiInterne(offreEmploi.id)\r\n .then(data => {\r\n toast.current.show({ severity: 'success', summary: t('recruitment.message.annuler_candidature'), detail: t('recruitment.message.message_envoye_entreprise'), life: 3000 });\r\n let _offreEmploi = { ...offreEmploi }\r\n _offreEmploi.isApplied = false\r\n setOffreEmploi(_offreEmploi)\r\n })\r\n .catch(err => {\r\n toast.current.show({ severity: 'error', summary: t('errors.error'), detail: t('errors.unknown'), life: 3000 })\r\n })\r\n .finally(() => {\r\n\r\n })\r\n }\r\n\r\n const handleClickPostulerAnnonceExterne = () => {\r\n let link;\r\n if (offreEmploi.origineOffre.origine == 1) {\r\n link = offreEmploi.origineOffre.urlOrigine;\r\n }\r\n else if (offreEmploi.origineOffre.origine == 2) {\r\n link = offreEmploi.origineOffre.partenaire[0].url\r\n }\r\n\r\n var win = window.open(link)\r\n win.focus();\r\n }\r\n\r\n const renderTeleTravail = () => {\r\n if (offreEmploi.providerId == 1) {\r\n switch (offreEmploi.teletravail) {\r\n case 1:\r\n return ;\r\n case 2:\r\n return ;\r\n case 3:\r\n return ;\r\n case 4:\r\n return ;\r\n case 5:\r\n return ;\r\n case 6:\r\n return ;\r\n case 7:\r\n return ;\r\n default:\r\n return <>>;\r\n }\r\n }\r\n else {\r\n return <>>\r\n }\r\n }\r\n const renderSalaire = () => {\r\n if (offreEmploi.providerId == 1) {\r\n if (offreEmploi?.salaire?.montantEuro)\r\n return <>{offreEmploi?.salaire?.montantEuro} € >\r\n else\r\n return <>>\r\n }\r\n else {\r\n //Fix Temp -> LM\r\n if (offreEmploi?.salaire?.libelle && offreEmploi?.salaire?.libelle != \"De\" && offreEmploi?.salaire?.libelle != \"Mensuel de\" && offreEmploi?.salaire?.libelle != \"Annuel de\")\r\n return <>{offreEmploi?.salaire?.libelle} {offreEmploi?.salaire?.commentaire} >\r\n else\r\n return <>>\r\n }\r\n }\r\n\r\n const renderSecteurActivite = () => {\r\n if (offreEmploi.providerId == 1) {\r\n if (offreEmploi.entreprise?.secteurActivite)\r\n return <>{offreEmploi.entreprise?.secteurActivite} >\r\n else\r\n return <>>\r\n }\r\n else {\r\n if (offreEmploi?.secteurActiviteLibelle)\r\n return <>{offreEmploi.secteurActiviteLibelle} >\r\n else\r\n return <>>\r\n }\r\n }\r\n const notavailable_Student = (\r\n \r\n
\r\n
\r\n
\r\n
\r\n handleClickRetourListe()} />\r\n
\r\n
\r\n
\r\n
)\r\n\r\n\r\n const notavailable_Other = (\r\n \r\n
\r\n
\r\n
\r\n handleClickRetourAccueil()} />\r\n
\r\n
\r\n
\r\n
\r\n
)\r\n\r\n\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n\r\n {loading ? (\r\n
\r\n ) : (\r\n\r\n
\r\n
\r\n handleClickRetourListe()} label={t('offers.goToList')} icon=\"pi pi-arrow-left\" />\r\n
\r\n {offreEmploi?.statut == \"Archivee\" ? (RoleHelper.isEtudiant(currentUser) ? (\r\n
{notavailable_Student}
\r\n ) : (\r\n
{notavailable_Other}
\r\n )\r\n ) : (\r\n
\r\n\r\n
\r\n {offreEmploi.afficherPresentation && offreEmploi.entreprise?.description != null && offreEmploi.entreprise?.description != \"\" &&\r\n <>\r\n
\r\n
\r\n >\r\n }\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n {!RoleHelper.isNotConnected(currentUser) &&\r\n \r\n }\r\n
\r\n {/* please connect */}\r\n {/* {RoleHelper.isNotConnected(currentUser) &&\r\n <>\r\n
\r\n >} \r\n */}\r\n
\r\n
\r\n\r\n
\r\n {/* blur effect */}\r\n {/*
\r\n
\r\n // ligne à commenter //
{offreEmploi?.intitule === offreEmploi?.appellation?.libelle ? (
) : (
{offreEmploi?.intitule}
)}\r\n {currentUser.isAuthenticated ? (offreEmploi.providerId == 1 ? (\r\n offreEmploi?.description && parse(offreEmploi?.description)\r\n ) : (\r\n
\r\n )) : (\r\n
\r\n
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam luctus dapibus efficitur. Aliquam ut arcu sed justo eleifend tincidunt quis eget arcu. Vivamus id lacinia nisl, vel vehicula nulla. Donec sed mi eu purus mollis aliquet. In sed tellus a lorem auctor dapibus eget a massa. Integer feugiat erat sed sem suscipit faucibus. Ut efficitur eu velit ac sagittis. Aenean at euismod nisi. Aenean ullamcorper, velit non elementum laoreet, tellus erat convallis ipsum, ac aliquet lorem odio quis purus.
\r\n
In pretium odio nunc, eu cursus erat dictum ac. Phasellus accumsan molestie pharetra. Pellentesque ullamcorper urna eu dolor tincidunt, vel cursus felis ultrices. Curabitur ut ex facilisis, maximus tellus mattis, accumsan lectus. Morbi accumsan nisi nec turpis blandit, et imperdiet justo congue. Aenean interdum dignissim quam sit amet accumsan. Proin porttitor pretium ullamcorper.
\r\n
Ut posuere, velit quis venenatis maximus, purus magna consequat felis, et vestibulum mi elit sit amet nulla. Sed ut est efficitur, euismod mauris ut, sodales ipsum. Nullam id tortor at metus interdum dignissim eget at leo. Phasellus at malesuada tellus, quis aliquam ligula. Duis id nulla ligula. Cras vel ante arcu. Curabitur interdum ante ut dictum tincidunt. Aenean pharetra lectus et lorem porttitor, id malesuada sem aliquet. Vestibulum posuere nunc eu lorem mattis, eget placerat nibh feugiat. Cras pharetra dapibus purus, id dapibus quam commodo vel. Etiam imperdiet, felis et molestie suscipit, ligula odio hendrerit dui, nec rutrum eros neque faucibus orci. Sed tincidunt eu metus vel vulputate.
\r\n
)}\r\n
*/}\r\n\r\n
\r\n
\r\n {offreEmploi.providerId == 1 ? (\r\n offreEmploi?.description && parse(offreEmploi?.description)\r\n ) : (\r\n \r\n )}\r\n \r\n
\r\n \r\n
\r\n\r\n {(offreEmploi.competences?.length > 0 || offreEmploi.qualiteProfessionnelle?.length > 0 || offreEmploi.offreEmploiLangue?.length > 0) &&\r\n <>\r\n
\r\n
\r\n >}\r\n\r\n {(offreEmploi?.salaire || offreEmploi?.teletravail || offreEmploi?.qualificationLibelle || offreEmploi?.secteurActiviteLibelle || offreEmploi?.entreprise?.secteurActivite) && <>\r\n
\r\n \r\n {offreEmploi?.permisDeConduire?.exigence == 2 && <> \r\n >}
\r\n {renderTeleTravail()}
\r\n {renderSalaire()}
\r\n {offreEmploi?.qualificationLibelle && }{{offreEmploi?.qualificationLibelle} }
\r\n {renderSecteurActivite()}
\r\n {offreEmploi?.secteurActiviteLibelle && }{{offreEmploi?.secteurActiviteLibelle} }
\r\n\r\n >}\r\n\r\n
\r\n <>\r\n
\r\n handleClickRetourListe()} />\r\n
\r\n
\r\n {offreEmploi.providerId == 1 ? (\r\n offreEmploi.isApplied ? (\r\n
handleClickAnnulerCandidatureAnnonceInterne()} />\r\n ) : (\r\n RoleHelper.isNotConnected(currentUser) ? (\r\n <>\r\n
\r\n >\r\n ) :\r\n RoleHelper.isEtudiant(currentUser) && (\r\n handleClickPostulerAnnonceInterne()} >\r\n \r\n \r\n )\r\n )\r\n ) : (\r\n handleClickPostulerAnnonceExterne()} >\r\n \r\n \r\n )}\r\n \r\n >\r\n
\r\n
\r\n )}\r\n
\r\n )\r\n }\r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React, { useState, useEffect, useRef } from 'react';\r\nimport { Form, Field } from 'react-final-form';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { classNames } from 'primereact/utils';\r\nimport { DataTable } from 'primereact/datatable';\r\nimport { Column } from 'primereact/column';\r\nimport UserService from '../../services/userService';\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { Toast } from 'primereact/toast';\r\nimport { Button } from 'primereact/button';\r\nimport { Toolbar } from 'primereact/toolbar';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { InputText } from 'primereact/inputtext';\r\nimport './dt_editeurs.css';\r\n\r\nexport const DT_Editeur = () => {\r\n\r\n let emptyEditeur = {\r\n id: 0,\r\n nom: '',\r\n prenom: '',\r\n email: '',\r\n phoneNumber: '',\r\n fonctions: '',\r\n ecole: [],\r\n nbFormations: 0\r\n };\r\n\r\n const { t } = useTranslation();\r\n const [newFormationDialog, setNewFormationDialog] = useState(true);\r\n const [editeurs, setEditeurs] = useState([]);\r\n const [editeurDialog, setEditeurDialog] = useState(false);\r\n const [deleteEditeurDialog, setDeleteEditeurDialog] = useState(false);\r\n const [deleteEditeursDialog, setDeleteEditeursDialog] = useState(false);\r\n const [editeur, setEditeur] = useState(emptyEditeur);\r\n const [selectedEditeurs, setSelectedEditeurs] = useState(null);\r\n const [submitted, setSubmitted] = useState(false);\r\n const [globalFilter, setGlobalFilter] = useState(null);\r\n const toast = useRef(null);\r\n const dt = useRef(null);\r\n const userService = new UserService();\r\n const currentUser = useAuthState();\r\n const [loading, setLoading] = useState(false);\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 10,\r\n page: 0,\r\n });\r\n const isMounted = useRef(false);\r\n\r\n\r\n\r\n useEffect(() => {\r\n isMounted.current = true;\r\n loadLazyData();\r\n }, [lazyParams]);\r\n\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n\r\n userService.getEditeurs(currentUser, { lazyEvent: JSON.stringify(lazyParams) }).then(_editeurs => {\r\n\r\n setEditeurs(_editeurs);\r\n\r\n setLoading(false);\r\n\r\n setNewFormationDialog(false);\r\n });\r\n }\r\n\r\n const validate = (editor) => {\r\n let errors = {};\r\n\r\n if (!editor.nom) {\r\n errors.nom = ;\r\n }\r\n\r\n if (!editor.prenom) {\r\n errors.prenom = ;\r\n }\r\n\r\n if (!editor.email) {\r\n errors.email = ;\r\n }\r\n else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(editor.email)) {\r\n errors.email = ;\r\n }\r\n\r\n return errors;\r\n };\r\n\r\n const openNew = () => {\r\n setEditeur(emptyEditeur);\r\n setSubmitted(false);\r\n setEditeurDialog(true);\r\n }\r\n\r\n const hideDialog = () => {\r\n setSubmitted(false);\r\n setEditeurDialog(false);\r\n }\r\n\r\n const hideDeleteEditeurDialog = () => {\r\n setDeleteEditeurDialog(false);\r\n }\r\n\r\n const hideDeleteEditeursDialog = () => {\r\n setDeleteEditeursDialog(false);\r\n }\r\n\r\n const saveEditeur = () => {\r\n setSubmitted(true);\r\n\r\n if (editeur.nom.trim() && editeur.prenom.trim() && editeur.email.trim() && (/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(editeur.email))) {\r\n let _editeurs = [...editeurs];\r\n let _editeur = { ...editeur };\r\n if (editeur.id) {\r\n (async function updateAdmin() {\r\n await userService.edit(_editeur);\r\n const index = findIndexById(editeur.id);\r\n _editeurs[index] = _editeur;\r\n\r\n setEditeurs(_editeurs);\r\n setEditeurDialog(false);\r\n setEditeur(emptyEditeur);\r\n\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('editor.updated_editor'), life: 3000 });\r\n\r\n })();\r\n }\r\n else {\r\n\r\n (async function addAdmin() {\r\n let _editor = await userService.createOrUpdateEditeur(currentUser, editeur);\r\n if (_editor != undefined) {\r\n _editeur.id = _editor.id;\r\n //console.log(JSON.stringify(_editeur));\r\n _editeurs.push(_editeur);\r\n setEditeurs(_editeurs);\r\n\r\n setEditeurDialog(false);\r\n setEditeur(emptyEditeur);\r\n\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('editor.created_editor'), life: 3000 });\r\n\r\n }\r\n else {\r\n setEditeurDialog(false);\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('editor.not_created_editor'), life: 3000 });\r\n\r\n }\r\n\r\n })();\r\n\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n const editEditeur = (editeur) => {\r\n setEditeur({ ...editeur });\r\n setEditeurDialog(true);\r\n }\r\n\r\n const confirmDeleteEditeur = (editeur) => {\r\n setEditeur(editeur);\r\n setDeleteEditeurDialog(true);\r\n }\r\n\r\n const deleteEditeur = () => {\r\n (async function deleteAdmin() {\r\n let _editeur = { ...editeur };\r\n await userService.delete(_editeur);\r\n let _editeurs = editeurs.filter(val => val.id !== editeur.id);\r\n setEditeurs(_editeurs);\r\n setDeleteEditeurDialog(false);\r\n setEditeur(emptyEditeur);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('editor.deleted_editor'), life: 3000 });\r\n\r\n })();\r\n }\r\n\r\n const findIndexById = (id) => {\r\n let index = -1;\r\n for (let i = 0; i < editeurs.length; i++) {\r\n if (editeurs[i].id === id) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n\r\n return index;\r\n }\r\n\r\n const confirmDeleteSelected = () => {\r\n setDeleteEditeursDialog(true);\r\n }\r\n\r\n const deleteSelectedEditeurs = () => {\r\n (async function deleteAdmin() {\r\n let _editeurs = editeurs.filter(val => !selectedEditeurs.includes(val));\r\n selectedEditeurs.forEach(editor => {\r\n userService.delete(editor);\r\n });\r\n setEditeurs(_editeurs);\r\n setDeleteEditeursDialog(false);\r\n setSelectedEditeurs(null);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('editor.deleted_editors'), life: 3000 });\r\n })();\r\n }\r\n\r\n const onInputChange = (e, name) => {\r\n const val = (e.target && e.target.value) || '';\r\n let _editeur = { ...editeur };\r\n _editeur[`${name}`] = val;\r\n\r\n setEditeur(_editeur);\r\n }\r\n\r\n const leftToolbarTemplate = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const actionBodyTemplate = (rowData) => {\r\n return (\r\n \r\n editEditeur(rowData)} />\r\n confirmDeleteEditeur(rowData)} />\r\n \r\n );\r\n }\r\n\r\n const header = (\r\n \r\n
\r\n \r\n \r\n setGlobalFilter(e.target.value)} placeholder={t('general.search')} />\r\n \r\n \r\n );\r\n const editeurDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n const deleteEditeurDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n const deleteEditeursDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n\r\n setSelectedEditeurs(e.value)}\r\n dataKey=\"id\" paginator rows={10} rowsPerPageOptions={[5, 10, 25]}\r\n paginatorTemplate=\"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown\"\r\n currentPageReportTemplate={t('editor.footer_count_pagin')}\r\n globalFilter={globalFilter}\r\n header={header}\r\n loading={loading}\r\n >\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n {editeur.image && e.target.src = 'https://www.primefaces.org/wp-content/uploads/2020/05/placeholder.png'} alt={editeur.image} className=\"editeur-image\" />}\r\n \r\n \r\n onInputChange(e, 'nom')} required autoFocus className={classNames({ 'p-invalid': submitted && !editeur.nom })} />\r\n {submitted && !editeur.nom && }\r\n
\r\n \r\n \r\n onInputChange(e, 'prenom')} required rows={3} cols={20} className={classNames({ 'p-invalid': submitted && !editeur.prenom })} />\r\n {submitted && !editeur.prenom && }\r\n
\r\n \r\n \r\n onInputChange(e, 'fonctions')} rows={3} cols={20} />\r\n
\r\n \r\n \r\n onInputChange(e, 'email')} required rows={3} cols={20} className={classNames({ 'p-invalid': submitted && (!editeur.email || (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(editeur.email))) })} />\r\n {submitted && !editeur.email && }\r\n {submitted && (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,12}$/i.test(editeur.email)) && }\r\n
\r\n \r\n \r\n onInputChange(e, 'phoneNumber')} rows={3} cols={20} />\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n {editeur && {editeur.prenom} {editeur.nom.toUpperCase()} ({editeur.email}) }\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n {editeur && }\r\n
\r\n \r\n
\r\n );\r\n}","import React, { useState, useEffect, useRef } from 'react';\r\nimport { Form, Field } from 'react-final-form';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { classNames } from 'primereact/utils';\r\nimport { DataTable } from 'primereact/datatable';\r\nimport { Column } from 'primereact/column';\r\nimport UserService from '../../services/userService';\r\nimport DocumentService from '../../services/documentService';\r\nimport Helper from '../../utils/helper';\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { Toast } from 'primereact/toast';\r\nimport { Button } from 'primereact/button';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { InputText } from 'primereact/inputtext';\r\nimport './dt_cv_etudiants.css';\r\nimport { useHistory } from 'react-router-dom/cjs/react-router-dom.min';\r\n\r\nexport const DT_CV_Etudiant = () => {\r\n\r\n\r\n const { t } = useTranslation();\r\n const [etudiants, setEtudiants] = useState([]);\r\n const [etudiantDialog, setEtudiantDialog] = useState(false);\r\n const [validatePortfolioEtudiantDialog, setValidatePortfolioEtudiantDialog] = useState(false);\r\n const [deletePortfolioEtudiantDialog, setDeletePortfolioEtudiantDialog] = useState(false);\r\n const [validateCvPdfEtudiantDialog, setValidateCvPdfEtudiantDialog] = useState(false);\r\n const [deleteCvPdfEtudiantDialog, setDeleteCvPdfEtudiantDialog] = useState(false);\r\n const [etudiant, setEtudiant] = useState(null);\r\n const [selectedEtudiants, setSelectedEtudiants] = useState(null);\r\n const [submitted, setSubmitted] = useState(false);\r\n const [globalFilter, setGlobalFilter] = useState(null);\r\n const toast = useRef(null);\r\n const dt = useRef(null);\r\n const history = useHistory();\r\n\r\n const userService = new UserService();\r\n const documentService = new DocumentService();\r\n\r\n const currentUser = useAuthState();\r\n const [loading, setLoading] = useState(false);\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 10,\r\n page: 0,\r\n });\r\n const isMounted = useRef(false);\r\n\r\n\r\n\r\n\r\n useEffect(() => {\r\n isMounted.current = true;\r\n loadLazyData();\r\n }, [lazyParams]);\r\n\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n\r\n userService.getEtudiantsDocumentAValider(currentUser, { lazyEvent: JSON.stringify(lazyParams) }).then(_etudiants => {\r\n\r\n setEtudiants(_etudiants);\r\n\r\n setLoading(false);\r\n\r\n setEtudiantDialog(false);\r\n });\r\n\r\n }\r\n\r\n const saveEtudiant = () => {\r\n\r\n }\r\n \r\n const findIndexById = (id) => {\r\n let index = -1;\r\n for (let i = 0; i < etudiants.length; i++) {\r\n if (etudiants[i].id === id) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n return index;\r\n };\r\n\r\n const validateCvPdfEtudiant = () => {\r\n documentService.validerDocument(etudiant.fichierCvPdf.id, etudiant.id).then(_document => {\r\n\r\n const _etudiant = { ...etudiant };\r\n _etudiant.fichierCvPdf = null;\r\n setEtudiant(_etudiant);\r\n const index = findIndexById(_etudiant.id);\r\n const _etudiants = [...etudiants];\r\n _etudiants[index] = _etudiant;\r\n setEtudiants(_etudiants);\r\n\r\n hideValidateCvPdfEtudiantDialog();\r\n if (((_etudiant.fichierCvPdf === null || _etudiant.fichierCvPdf?.dateValidation !== null) && (_etudiant.fichierPortfolio === null || _etudiant.fichierPortfolio?.dateValidation !== null))) {\r\n setEtudiantDialog(false);\r\n const _etudiants = [...etudiants].filter(val => val.id !== _etudiant.id);\r\n setEtudiants(_etudiants);\r\n }\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('general.validated_file'), life: 3000 });\r\n });\r\n }\r\n\r\n const validatePortfolioEtudiant = () => {\r\n documentService.validerDocument(etudiant.fichierPortfolio.id, etudiant.id).then(_document => {\r\n\r\n const _etudiant = { ...etudiant };\r\n _etudiant.fichierPortfolio = null;\r\n setEtudiant(_etudiant);\r\n const index = findIndexById(_etudiant.id);\r\n const _etudiants = [...etudiants];\r\n _etudiants[index] = _etudiant;\r\n setEtudiants(_etudiants);\r\n\r\n hideValidatePortfolioEtudiantDialog();\r\n if (((_etudiant.fichierCvPdf === null || _etudiant.fichierCvPdf?.dateValidation !== null) && (_etudiant.fichierPortfolio === null || _etudiant.fichierPortfolio?.dateValidation !== null))) {\r\n setEtudiantDialog(false);\r\n const _etudiants = [...etudiants].filter(val => val.id !== _etudiant.id);\r\n setEtudiants(_etudiants);\r\n }\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('general.validated_file'), life: 3000 });\r\n });\r\n }\r\n\r\n const deleteCvPdfEtudiant = () => {\r\n documentService.supprimerDocumentValidationEtudiant(etudiant.fichierCvPdf.id, etudiant.id).then(_document => {\r\n\r\n const _etudiant = { ...etudiant };\r\n _etudiant.fichierCvPdf = null;\r\n setEtudiant(_etudiant);\r\n const index = findIndexById(_etudiant.id);\r\n const _etudiants = [...etudiants];\r\n _etudiants[index] = _etudiant;\r\n setEtudiants(_etudiants);\r\n\r\n hideDeleteCvPdfEtudiantDialog();\r\n if (((_etudiant.fichierCvPdf === null || _etudiant.fichierCvPdf?.dateValidation !== null) && (_etudiant.fichierPortfolio === null || _etudiant.fichierPortfolio?.dateValidation !== null))) {\r\n setEtudiantDialog(false);\r\n const _etudiants = [...etudiants].filter(val => val.id !== _etudiant.id);\r\n setEtudiants(_etudiants);\r\n }\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('general.deleted_file'), life: 3000 });\r\n });\r\n\r\n }\r\n\r\n const deletePortfolioEtudiant = () => {\r\n documentService.supprimerDocumentValidationEtudiant(etudiant.fichierPortfolio.id, etudiant.id).then(_document => {\r\n\r\n const _etudiant = { ...etudiant };\r\n _etudiant.fichierPortfolio = null;\r\n setEtudiant(_etudiant);\r\n const index = findIndexById(_etudiant.id);\r\n const _etudiants = [...etudiants];\r\n _etudiants[index] = _etudiant;\r\n setEtudiants(_etudiants);\r\n\r\n hideDeletePortfolioEtudiantDialog();\r\n if (((_etudiant.fichierCvPdf === null || _etudiant.fichierCvPdf?.dateValidation !== null) && (_etudiant.fichierPortfolio === null || _etudiant.fichierPortfolio?.dateValidation !== null))) {\r\n setEtudiantDialog(false);\r\n const _etudiants = [...etudiants].filter(val => val.id !== _etudiant.id);\r\n setEtudiants(_etudiants);\r\n }\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('general.deleted_file'), life: 3000 });\r\n });\r\n }\r\n\r\n const hideDialog = () => {\r\n setSubmitted(false);\r\n setEtudiantDialog(false);\r\n }\r\n\r\n const hideValidateCvPdfEtudiantDialog = () => {\r\n setValidateCvPdfEtudiantDialog(false);\r\n }\r\n\r\n const hideDeleteCvPdfEtudiantDialog = () => {\r\n setDeleteCvPdfEtudiantDialog(false);\r\n }\r\n\r\n const hideValidatePortfolioEtudiantDialog = () => {\r\n setValidatePortfolioEtudiantDialog(false);\r\n }\r\n\r\n const hideDeletePortfolioEtudiantDialog = () => {\r\n setDeletePortfolioEtudiantDialog(false);\r\n }\r\n\r\n const validateEtudiant = (etudiant) => {\r\n setEtudiant({ ...etudiant });\r\n setEtudiantDialog(true);\r\n }\r\n\r\n const lienProfilEtudiant = (etudiant) => {\r\n history.push({pathname:'/profile_student',state:{adminImpersonatingEtudiantId:etudiant.id}})\r\n }\r\n\r\n\r\n const onDownloadCvPdf = () => {\r\n documentService.telechargerDocument(etudiant.fichierCvPdf.id).then(blob => {\r\n\r\n Helper.openWindowBlobFile(blob, etudiant.fichierCvPdf.name);\r\n });\r\n }\r\n\r\n const onConfirmDeleteCvPdf = () => {\r\n setDeleteCvPdfEtudiantDialog(true);\r\n }\r\n\r\n const onConfirmValidateCvPdf = () => {\r\n setValidateCvPdfEtudiantDialog(true);\r\n }\r\n\r\n\r\n const onDownloadPortfolio = () => {\r\n documentService.telechargerDocument(etudiant.fichierPortfolio.id).then(blob => {\r\n\r\n Helper.openWindowBlobFile(blob, etudiant.fichierPortfolio.name);\r\n });\r\n }\r\n\r\n const onConfirmDeletePortfolio = () => {\r\n setDeletePortfolioEtudiantDialog(true);\r\n }\r\n\r\n const onConfirmValidatePortfolio = () => {\r\n setValidatePortfolioEtudiantDialog(true);\r\n }\r\n\r\n const actionBodyTemplate = (rowData) => {\r\n return (\r\n \r\n validateEtudiant(rowData)} />\r\n lienProfilEtudiant(rowData)} />\r\n \r\n );\r\n }\r\n\r\n const header = (\r\n \r\n
\r\n \r\n \r\n setGlobalFilter(e.target.value)} placeholder={t('general.search')} />\r\n \r\n \r\n );\r\n const etudiantDialogFooter = (\r\n \r\n\r\n \r\n );\r\n const validateCvPdfEtudiantDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n const deleteCvPdfEtudiantDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n const validatePortfolioEtudiantDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n const deletePortfolioEtudiantDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n\r\n setSelectedEtudiants(e.value)}\r\n dataKey=\"id\" paginator rows={10} rowsPerPageOptions={[5, 10, 25]}\r\n paginatorTemplate=\"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown\"\r\n currentPageReportTemplate={t('student.footer_count_pagin')}\r\n globalFilter={globalFilter}\r\n header={header}\r\n loading={loading}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n \r\n {etudiant?.fichierCvPdf?.dateValidation === null ? (\r\n
\r\n
\r\n \r\n
\r\n
\r\n {etudiant.fichierCvPdf?.name}\r\n {etudiant.fichierCvPdf?.name.trim() ?\r\n (
\r\n \r\n
)\r\n : (\"\")}\r\n
\r\n
) : (\"\")}\r\n {etudiant?.fichierPortfolio?.dateValidation === null ? (
\r\n
\r\n \r\n
\r\n
\r\n {etudiant.fichierPortfolio?.name}\r\n {etudiant.fichierPortfolio?.name.trim() ?\r\n (
onDownloadPortfolio(e)} />\r\n \r\n
)\r\n : (\"\")}\r\n
\r\n
) : (\"\")}\r\n\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n {etudiant && }\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n {etudiant && }\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n {etudiant && }\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n {etudiant && }\r\n
\r\n \r\n
\r\n );\r\n}","import React, { useState, useEffect, useRef } from 'react';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { DataTable } from 'primereact/datatable';\r\nimport { Column } from 'primereact/column';\r\nimport UserService from '../../services/userService';\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { Toast } from 'primereact/toast';\r\nimport { Button } from 'primereact/button';\r\nimport { InputText } from 'primereact/inputtext';\r\nimport { enumStudentStatus } from '../../enums/enumStudentStatus';\r\nimport './dt_etudiants.css';\r\nimport { Dt_etudiants_action } from './dt_etudiants_actions';\r\nimport { Dt_delete_etudiant } from './dt_delete_etudiant';\r\nimport { useHistory } from 'react-router-dom/cjs/react-router-dom.min';\r\n\r\nexport const DT_Etudiant = () => {\r\n\r\n const { t } = useTranslation();\r\n const [etudiants, setEtudiants] = useState([]);\r\n const [selectedEtudiants, setSelectedEtudiants] = useState(null);\r\n const [globalFilter, setGlobalFilter] = useState(null);\r\n const history = useHistory();\r\n const [totalRecords, setTotalCount] = useState(0);\r\n const toast = useRef(null);\r\n const dt = useRef(null);\r\n const userService = new UserService();\r\n const currentUser = useAuthState();\r\n const [loading, setLoading] = useState(false);\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 25,\r\n page: 0,\r\n sortField: 'dateCreation',\r\n sortOrder: 0\r\n });\r\n\r\n useEffect(() => {\r\n loadLazyData();\r\n }, [lazyParams]);\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n userService.getEtudiants(currentUser, lazyParams)\r\n .then(_data => {\r\n setTotalCount(_data.totalCount);\r\n setEtudiants(_data.items);\r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoading(false))\r\n\r\n }\r\n\r\n const showError = () => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.loading_failed'), life: 3000 });\r\n }\r\n\r\n const onSort = (event) => {\r\n let _lazyParams = { ...lazyParams, ...event };\r\n setLazyParams(_lazyParams);\r\n }\r\n\r\n const onFilter = (event) => {\r\n let _lazyParams = { ...lazyParams, ...event };\r\n _lazyParams['page'] = 0;\r\n _lazyParams['first'] = 0;\r\n setLazyParams(_lazyParams);\r\n }\r\n\r\n const onPage = (event) => {\r\n let _lazyParams = { ...lazyParams, ...event };\r\n setLazyParams(_lazyParams);\r\n }\r\n\r\n const onNewAccountClick = () => {\r\n history.push({pathname:'/profile_student'})\r\n }\r\n\r\n const actionBodyTemplate = (rowData) => {\r\n return (\r\n <>\r\n {/* design position button à vérifier */}\r\n \r\n {rowData?.isInvited != true &&\r\n \r\n }\r\n >\r\n )\r\n }\r\n\r\n const header = (\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n setGlobalFilter(e.target.value)} placeholder={t('general.search')} />\r\n \r\n
\r\n
\r\n );\r\n\r\n const statusBodyTemplate = (rowData) => {\r\n return {t('enums.enumCompanyStatus.' + enumStudentStatus[rowData.status])} ;\r\n }\r\n\r\n const lastConnexionDateBodyTemplate = (rowData) => {\r\n return {rowData.lastConnexionDate && new Date(rowData.lastConnexionDate).toLocaleString()} ;\r\n }\r\n const creationDateBodyTemplate = (rowData) => {\r\n return {rowData.creationDate && new Date(rowData.creationDate).toLocaleString()} ;\r\n }\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n setSelectedEtudiants(e.value)}\r\n dataKey=\"id\"\r\n rowsPerPageOptions={[25, 50, 100]}\r\n paginatorTemplate=\"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown\"\r\n currentPageReportTemplate={t('student.footer_count_pagin')}\r\n globalFilter={globalFilter}\r\n header={header}\r\n loading={loading}\r\n columnResizeMode=\"expand\"\r\n resizableColumns\r\n responsiveLayout=\"auto\"\r\n autoLayout\r\n onSort={onSort}\r\n sortField={lazyParams.sortField}\r\n sortOrder={lazyParams.sortOrder}\r\n onPage={onPage}\r\n onFilter={onFilter}\r\n filters={lazyParams.filters}\r\n totalRecords={totalRecords}\r\n >\r\n {/* */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n );\r\n}","import React, { useState, useEffect, useRef } from 'react';\r\nimport { Form, Field } from 'react-final-form';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { classNames } from 'primereact/utils';\r\nimport { DataTable } from 'primereact/datatable';\r\nimport { Column } from 'primereact/column';\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { Toast } from 'primereact/toast';\r\nimport { Button } from 'primereact/button';\r\nimport { InputText } from 'primereact/inputtext';\r\nimport { enumCompanyStatus } from '../../enums/enumCompanyStatus';\r\n\r\nimport './dt_entreprises.css';\r\nimport { useHistory } from 'react-router-dom/cjs/react-router-dom.min';\r\nimport EntrepriseService from '../../services/entrepriseService';\r\n\r\nexport const DT_Entreprise = () => {\r\n\r\n const history = useHistory();\r\n const { t } = useTranslation();\r\n const [entreprises, setEntreprises] = useState([]);\r\n const [selectedEntreprises, setSelectedEntreprises] = useState(null);\r\n const [globalFilter, setGlobalFilter] = useState(null);\r\n const [totalRecords, setTotalCount] = useState(0);\r\n const toast = useRef(null);\r\n const dt = useRef(null);\r\n const entrepriseService = new EntrepriseService();\r\n const currentUser = useAuthState();\r\n const [loading, setLoading] = useState(false);\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 10,\r\n page: 0,\r\n sortField: 'dateCreation',\r\n sortOrder: 0\r\n });\r\n const isMounted = useRef(false);\r\n\r\n\r\n\r\n\r\n useEffect(() => {\r\n isMounted.current = true;\r\n loadLazyData();\r\n }, [lazyParams]);\r\n\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n entrepriseService.getEntreprisesPaginated(currentUser, lazyParams).then(_entreprises => {\r\n _entreprises.items.forEach(e => {\r\n e.nomEntreprise = e.recruteurEntreprises[0]?.entreprise?.nom\r\n });\r\n setEntreprises(_entreprises.items);\r\n setTotalCount(_entreprises.totalCount);\r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoading(false))\r\n }\r\n\r\n const showError = () => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.loading_failed'), life: 3000 });\r\n }\r\n\r\n const onSort = (event) => {\r\n let _lazyParams = { ...lazyParams, ...event };\r\n setLazyParams(_lazyParams);\r\n }\r\n\r\n const onFilter = (event) => {\r\n let _lazyParams = { ...lazyParams, ...event };\r\n _lazyParams['page'] = 0;\r\n _lazyParams['first'] = 0;\r\n setLazyParams(_lazyParams);\r\n }\r\n\r\n const onPage = (event) => {\r\n let _lazyParams = { ...lazyParams, ...event };\r\n setLazyParams(_lazyParams);\r\n }\r\n\r\n const lienAbonnementEntreprise = (recruteur) => {\r\n history.push({pathname:'/subscription_admin_company',state:{adminImpersonatingRecruteurId:recruteur.id}});\r\n }\r\n\r\n const lienPortailEntreprise = (recruteur) => {\r\n history.push({pathname:'/offers',state:{adminImpersonatingRecruteurId:recruteur.id}});\r\n }\r\n\r\n const actionBodyTemplate = (rowData) => {\r\n return (\r\n \r\n lienAbonnementEntreprise(rowData)} />\r\n lienPortailEntreprise(rowData)} />\r\n \r\n );\r\n }\r\n\r\n const header = (\r\n \r\n
\r\n \r\n \r\n setGlobalFilter(e.target.value)} placeholder={t('general.search')} />\r\n \r\n \r\n );\r\n \r\n const statusBodyTemplate = (rowData) => {\r\n return {t('enums.enumCompanyStatus.'+ enumCompanyStatus[rowData.status])} ;\r\n }\r\n const lastConnexionDateBodyTemplate = (rowData) => {\r\n return {rowData.lastConnexionDate && new Date(rowData.lastConnexionDate).toLocaleString()} ;\r\n }\r\n const creationDateBodyTemplate = (rowData) => {\r\n return {rowData.creationDate && new Date(rowData.creationDate).toLocaleString()} ;\r\n }\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n setSelectedEntreprises(e.value)}\r\n dataKey=\"id\" \r\n rowsPerPageOptions={[5, 10, 25]}\r\n paginatorTemplate=\"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown\"\r\n currentPageReportTemplate={t('company.footer_count_pagin')}\r\n globalFilter={globalFilter}\r\n header={header}\r\n loading={loading}\r\n columnResizeMode=\"expand\"\r\n resizableColumns \r\n responsiveLayout=\"auto\"\r\n autoLayout\r\n onSort={onSort} \r\n sortField={lazyParams.sortField} \r\n sortOrder={lazyParams.sortOrder}\r\n onPage={onPage}\r\n onFilter={onFilter}\r\n filters={lazyParams.filters}\r\n totalRecords={totalRecords} \r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n );\r\n}","import React, { useState, useEffect, useRef } from 'react';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { DataTable } from 'primereact/datatable';\r\nimport { Column } from 'primereact/column';\r\nimport FormationService from \"../../services/formationService\";\r\nimport { Toast } from 'primereact/toast';\r\nimport { Button } from 'primereact/button';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { InputText } from 'primereact/inputtext';\r\nimport './dt_demandeFormation_etudiants.css';\r\nimport { Dropdown } from 'primereact/dropdown';\r\nimport { enumDemandeFormationArchive } from \"../../enums/enumDemandeFormationArchive\";\r\nimport { InputTextarea } from 'primereact/inputtextarea';\r\nimport { ProgressSpinner } from 'primereact/progressspinner';\r\nimport { Tooltip } from 'primereact/tooltip';\r\n\r\nexport const DT_DemandeFormation_Etudiant = () => {\r\n\r\n let emptyEtudiant = {\r\n id: 0,\r\n nom: '',\r\n prenom: '',\r\n email: '',\r\n ecole: [],\r\n nbFormations: 0\r\n };\r\n\r\n const { t } = useTranslation();\r\n const [etudiants, setEtudiants] = useState([]);\r\n const [totalRecords, setTotalRecords] = useState(0);\r\n const [defaultEtudiants, setDefaultEtudiants] = useState([]);\r\n const [formations, setFormations] = useState([]);\r\n const [confirmDeleteFormationEtudiantDialog, setConfirmDeleteFormationEtudiantDialog] = useState(false);\r\n const [deleteFormationEtudiant, setDeleteFormationEtudiant] = useState(null);\r\n const [etudiantDialog, setEtudiantDialog] = useState(false);\r\n const [validateFormationEtudiantDialog, setValidateFormationEtudiantDialog] = useState(false);\r\n const [dialogViewComment, setDialogViewComment] = useState(false);\r\n const [dialogViewCommentContent, setDialogViewCommentContent] = useState({\r\n id: 0,\r\n commentaire: null\r\n });\r\n const [loadingDialogViewCommentContent, setLoadingDialogViewCommentContent] = useState(false);\r\n const [globalFilterFormations, setGlobalFilterFormations] = useState(null);\r\n const [idFormationCliquee, setIdFormationCliquee] = useState(null);\r\n const [etudiant, setEtudiant] = useState(emptyEtudiant);\r\n const [submitted, setSubmitted] = useState(false);\r\n const [globalFilter, setGlobalFilter] = useState(null);\r\n const [selectedOption, setSelectedOption] = useState(enumDemandeFormationArchive.NON_ARCHIVED);\r\n const toast = useRef(null);\r\n const dt = useRef(null);\r\n const formationService = new FormationService();\r\n const [loading, setLoading] = useState(false);\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 25,\r\n page: 0,\r\n sortField: 'dateCreation',\r\n sortOrder: -1\r\n });\r\n const isMounted = useRef(false);\r\n\r\n\r\n\r\n\r\n useEffect(() => {\r\n isMounted.current = true;\r\n loadLazyData();\r\n }, [lazyParams, selectedOption]);\r\n\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n\r\n // formationService.getDemandeFormationEtudiants().then(_etudiants => {\r\n formationService.getDtAdminFormationsDemandees(lazyParams, selectedOption).then(_etudiants => {\r\n _etudiants.items.forEach((item) => {\r\n item.dateCreation = new Date(item.dateCreation).toLocaleDateString();\r\n item.nomComplet = item.etudiant.nom + ' ' + item.etudiant.prenom;\r\n });\r\n setTotalRecords(_etudiants.totalCount);\r\n setEtudiants(_etudiants.items);\r\n setDefaultEtudiants(_etudiants);\r\n })\r\n .finally(() => setLoading(false));\r\n\r\n // formationService\r\n // .getFormationsEtudiantProfile()\r\n // .then((_formations) => {\r\n // setFormations(_formations);\r\n // setLoading(false);\r\n // });\r\n\r\n }\r\n\r\n const onSort = (event) => {\r\n let _lazyParams = { ...lazyParams, ...event };\r\n setLazyParams(_lazyParams);\r\n }\r\n\r\n const onFilter = (event) => {\r\n let _lazyParams = { ...lazyParams, ...event };\r\n _lazyParams['page'] = 0;\r\n _lazyParams['first'] = 0;\r\n setLazyParams(_lazyParams);\r\n }\r\n\r\n const onPage = (event) => {\r\n let _lazyParams = { ...lazyParams, ...event };\r\n setLazyParams(_lazyParams);\r\n }\r\n\r\n // const confirmValidateFormationEtudiant = (e) => {\r\n // setIdFormationCliquee(e.id);\r\n // setValidateFormationEtudiantDialog(true);\r\n // }\r\n\r\n const validateFormationEtudiant = (e) => {\r\n\r\n setSubmitted(true);\r\n\r\n const formationId = idFormationCliquee;\r\n const demandeFormationId = etudiant.demandeFormationId;\r\n\r\n formationService.affecterFormationEtudiant(formationId, demandeFormationId).then(response => {\r\n let _etudiants = etudiants.filter(val => val.demandeFormationId !== demandeFormationId);\r\n setEtudiants(_etudiants);\r\n setValidateFormationEtudiantDialog(false);\r\n setEtudiantDialog(false);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('student.assigned_course'), life: 3000 });\r\n\r\n })\r\n\r\n }\r\n\r\n const updateViewCommentDialog = () => {\r\n setLoadingDialogViewCommentContent(true);\r\n // on met à jour le commentaire dans la base de données grace à la variable dialogViewCommentContent\r\n formationService.updateCommentaireDemandeFormationEtudiant(dialogViewCommentContent.id, dialogViewCommentContent.commentaire)\r\n .then(response => {\r\n // on met à jour le commentaire dans le tableau des etudiants\r\n let index = etudiants.findIndex(val => val.id === dialogViewCommentContent.id);\r\n etudiants[index].commentaire = dialogViewCommentContent.commentaire;\r\n // on met à jour le commentaire dans le tableau par défaut\r\n let indexDefault = defaultEtudiants.items.findIndex(val => val.id === dialogViewCommentContent.id);\r\n defaultEtudiants.items[indexDefault].commentaire = dialogViewCommentContent.commentaire;\r\n setDefaultEtudiants(defaultEtudiants);\r\n setDialogViewComment(false);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('student.comment_updated'), life: 3000 });\r\n })\r\n .catch(error => {\r\n toast.current.show({ severity: 'error', summary: t('general.error'), detail: t('student.comment_not_updated'), life: 3000 });\r\n })\r\n .finally(() => setLoadingDialogViewCommentContent(false));\r\n }\r\n\r\n const archiveFormationEtudiant = () => {\r\n setSubmitted(true);\r\n if (deleteFormationEtudiant) {\r\n archiverDemandeFormationEtudiant(deleteFormationEtudiant);\r\n }\r\n }\r\n\r\n const archiverDemandeFormationEtudiant = (e) => {\r\n setSubmitted(true);\r\n const demandeFormationId = e.id;\r\n\r\n if (e.isArchived === false || e.isArchived === null) {\r\n formationService.archiverDemandeFormationEtudiant(demandeFormationId).then(response => {\r\n // on recupere l'index de l'etudiant dans le tableau etudiants et on modifie son attribut isArchived\r\n let index = etudiants.findIndex(val => val.id === demandeFormationId);\r\n etudiants[index].isArchived = true;\r\n // on recupere le tableau des etudiants non archivés\r\n let _etudiants = [...etudiants].filter(val => val.id !== demandeFormationId);\r\n\r\n setEtudiants(_etudiants);\r\n // setEtudiantDialog(false);\r\n setConfirmDeleteFormationEtudiantDialog(false);\r\n setTotalRecords(totalRecords - 1);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('student.archived_course'), life: 3000 });\r\n })\r\n } else {\r\n formationService.desarchiverDemandeFormationEtudiant(demandeFormationId).then(response => {\r\n // on recupere l'index de l'etudiant dans le tableau etudiants et on modifie son attribut isArchived\r\n let index = etudiants.findIndex(val => val.id === demandeFormationId);\r\n etudiants[index].isArchived = false;\r\n // on recupere le tableau des etudiants non archivés\r\n let _etudiants = [...etudiants].filter(val => val.id !== demandeFormationId);\r\n\r\n setEtudiants(_etudiants);\r\n // setEtudiantDialog(false);\r\n setConfirmDeleteFormationEtudiantDialog(false);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('student.unarchived_course'), life: 3000 });\r\n })\r\n }\r\n\r\n }\r\n\r\n // const hideDialog = () => {\r\n // setSubmitted(false);\r\n // setEtudiantDialog(false);\r\n // }\r\n\r\n const hideValidateFormationEtudiantDialog = () => {\r\n setValidateFormationEtudiantDialog(false);\r\n }\r\n\r\n const hideConfirmDeleteFormationEtudiantDialog = () => {\r\n setConfirmDeleteFormationEtudiantDialog(false);\r\n }\r\n\r\n const hideViewCommentDialog = () => {\r\n setDialogViewComment(false);\r\n }\r\n\r\n // const validateEtudiant = (etudiant) => {\r\n // setEtudiant({ ...etudiant });\r\n // setEtudiantDialog(true);\r\n // }\r\n\r\n const lienProfilEtudiant = (demande) => {\r\n localStorage.setItem(\"adminSeeProfileEtudes\", true);\r\n localStorage.setItem(\"adminImpersonatingEtudiantId\", demande.etudiantId);\r\n\r\n var win = window.open(\"profile_student\", \"_blankProfilEtudiant\" + etudiant.id)\r\n win.focus();\r\n }\r\n\r\n const handleClickDialogViewComment = (demande) => {\r\n setDialogViewCommentContent({\r\n id: demande.id,\r\n commentaire: demande.commentaire\r\n });\r\n setDialogViewComment(true);\r\n }\r\n\r\n const handleClickConfirmDeleteFormationEtudiant = (e) => {\r\n setDeleteFormationEtudiant(e);\r\n setConfirmDeleteFormationEtudiantDialog(true);\r\n }\r\n\r\n const truncateComment = (comment, maxLength = 100) => {\r\n if (!comment) return 'Aucun commentaire';\r\n return comment.length > maxLength ? comment.substring(0, maxLength) + '...' : comment;\r\n };\r\n\r\n const actionBodyTemplate = (rowData) => {\r\n return (\r\n \r\n {/* validateEtudiant(rowData)} /> */}\r\n \r\n handleClickDialogViewComment(rowData)} data-pr-tooltip={truncateComment(rowData.commentaire)} />\r\n lienProfilEtudiant(rowData)} />\r\n handleClickConfirmDeleteFormationEtudiant(rowData)} /> \r\n \r\n );\r\n }\r\n\r\n const options = [\r\n { label: t('student.non_archived'), value: enumDemandeFormationArchive.NON_ARCHIVED },\r\n { label: t('student.archived'), value: enumDemandeFormationArchive.ARCHIVED },\r\n { label: t('skills.all'), value: enumDemandeFormationArchive.ALL }\r\n ];\r\n\r\n const handleChangeArchive = (e) => {\r\n if (e.value === enumDemandeFormationArchive.NON_ARCHIVED)\r\n setSelectedOption(enumDemandeFormationArchive.NON_ARCHIVED);\r\n else if (e.value === enumDemandeFormationArchive.ARCHIVED)\r\n setSelectedOption(enumDemandeFormationArchive.ARCHIVED);\r\n else if (e.value === enumDemandeFormationArchive.ALL)\r\n setSelectedOption(enumDemandeFormationArchive.ALL);\r\n else\r\n setSelectedOption(enumDemandeFormationArchive.NON_ARCHIVED);\r\n }\r\n\r\n const header = (\r\n \r\n
\r\n handleChangeArchive(e)} placeholder=\"archive\" />\r\n \r\n \r\n setGlobalFilter(e.target.value)} placeholder={t('general.search')} />\r\n \r\n \r\n );\r\n const etudiantDialogFooter = (\r\n \r\n {/* \r\n */}\r\n \r\n );\r\n const actionViewCommentDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n const validateFormationEtudiantDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n const deleteFormationEtudiantDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n\r\n // const searchbarFormations = (\r\n // \r\n // \r\n // \r\n // setGlobalFilterFormations(e.target.value)} placeholder={t('general.search')} />\r\n // \r\n //
\r\n // )\r\n\r\n // const actionBodyTemplateFormations = (rowData) => {\r\n // return (\r\n // confirmValidateFormationEtudiant(rowData)} />\r\n // );\r\n // }\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* \r\n */}\r\n \r\n \r\n
\r\n\r\n {/*
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n */}\r\n \r\n
\r\n \r\n { loadingDialogViewCommentContent ?
:\r\n
\r\n
\r\n }\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n {etudiant && {etudiant.email} }\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n {deleteFormationEtudiant && {t('student.confirmation_archive_request')} }\r\n
\r\n \r\n
\r\n );\r\n}\r\n","import React, { useState, useEffect, useRef, Fragment } from 'react';\r\nimport { classNames } from 'primereact/utils';\r\nimport { Divider } from 'primereact/divider';\r\nimport EcoleService from '../../../services/ecoleService';\r\nimport AbonnementService from '../../../services/abonnementService';\r\nimport { useAuthState } from \"../../../context/context\";\r\nimport { Toast } from 'primereact/toast';\r\nimport { Button } from 'primereact/button';\r\nimport { FileUpload } from 'primereact/fileupload';\r\nimport { Toolbar } from 'primereact/toolbar';\r\nimport { Dropdown } from 'primereact/dropdown';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { Checkbox } from 'primereact/checkbox';\r\nimport { InputText } from 'primereact/inputtext';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { CommuneSelector } from '../../../components/location-selector/communeSelector'\r\nimport './administrationEcolesPage.css';\r\nimport { DT_Ecole_BIS } from '../../../components/datatable/dt_ecoles_bis';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { DT_Composante } from '../../../components/datatable/dt_composantes';\r\n\r\n\r\nexport const AdministrationEcolesPage = () => {\r\n let emptyCampus = {\r\n id: 0,\r\n libelle: null,\r\n commune: null,\r\n pays: 'France',\r\n departement: null,\r\n ville: null,\r\n etranger: false,\r\n ecoleId: 0\r\n };\r\n let emptyComposante = {\r\n id: 0,\r\n nom: null,\r\n abonnementType: null,\r\n ecoleId: 0,\r\n codeUAIs: [{ code: null }]\r\n };\r\n let emptyEcole = {\r\n id: 0,\r\n nomEcole: null,\r\n composanteEcole: [emptyComposante],\r\n campus: [emptyCampus],\r\n nbFormations: 0,\r\n nbEtudiants: 0,\r\n descriptionEcole: [],\r\n referent: ''\r\n };\r\n\r\n\r\n const fileUploaderImageEcole = useRef('');\r\n const fileUploaderImageComposante = useRef([]);\r\n const { t } = useTranslation();\r\n const [ecoleDialog, setEcoleDialog] = useState(false);\r\n const [deleteEcoleDialog, setDeleteEcoleDialog] = useState(false);\r\n const [ecole, setEcole] = useState(emptyEcole);\r\n const [ecoleWithCodeUAIStatus, setEcoleWithCodeUAIStatus] = useState(null)\r\n const [campus, setCampus] = useState(null);\r\n const [composanteEcole, setComposanteEcole] = useState(null);\r\n const [erreurImage, setErreurImage] = useState(null);\r\n const [erreurImageCompo, setErreurImageCompo] = useState([]);\r\n\r\n const [ddlTypesAbonnement, setDdlTypesAbonnement] = useState([]);\r\n const [submitted, setSubmitted] = useState(false);\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const toast = useRef(null);\r\n const ecoleService = new EcoleService();\r\n const abonnementService = new AbonnementService();\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n loadLazyData();\r\n }, []);\r\n\r\n\r\n const loadLazyData = () => {\r\n abonnementService.getTypesAbonnement().then(_ddlTypesAbonnement => {\r\n setDdlTypesAbonnement(_ddlTypesAbonnement);\r\n });\r\n };\r\n\r\n const openNew = () => {\r\n fileUploaderImageComposante.current.push(React.createRef());\r\n setEcole(emptyEcole);\r\n setSubmitted(false);\r\n setEcoleDialog(true);\r\n };\r\n\r\n const hideDialog = () => {\r\n setSubmitted(false);\r\n setEcoleDialog(false);\r\n };\r\n\r\n const saveEcole = () => {\r\n setSubmitted(true);\r\n let _ecole = cleanUpEmptyCodeUAI()\r\n let bOk = true;\r\n let doublonSaisieUAI = false;\r\n _ecole.campus.forEach(campu => {\r\n if (!campu.isOnline) {\r\n if (campu.libelle?.trim() === '') {\r\n campu.libelle = null;\r\n }\r\n var commune = campu.commune === null;\r\n var ville = campu.ville?.trim() === '' || campu.ville === null;\r\n var villeCommune = (commune && ville);\r\n var pays = campu.pays?.trim() === '' || campu.pays === null;\r\n var etranger = campu.etranger;\r\n var paysEtranger = (pays && etranger);\r\n if (villeCommune || paysEtranger) {\r\n bOk = false;\r\n }\r\n }\r\n });\r\n let _codeUAIs = []\r\n _ecole.composanteEcole?.forEach(composante => {\r\n if (!composante.nom?.trim() || !composante.abonnementType?.trim()) {\r\n bOk = false;\r\n }\r\n composante.codeUAIs.forEach(codeUAI => {\r\n if (codeUAI.code?.trim() && !/^[0-9]{7}[A-Z]$/.test(codeUAI?.code)) {\r\n bOk = false\r\n }\r\n if (codeUAI.code?.trim())\r\n _codeUAIs.push(codeUAI.code);\r\n });\r\n });\r\n let _uniqueCodesUAIs = [...new Set(_codeUAIs)]\r\n if (_codeUAIs.length != _uniqueCodesUAIs.length) {\r\n bOk = false\r\n doublonSaisieUAI = true\r\n }\r\n if (_ecole.nomEcole.trim() && bOk) {\r\n setIsSubmitting(true);\r\n ecoleService.checkIfCodeUAIsAreAvailable(_ecole).then(_ecoleWithCodeUAIStatus => {\r\n let _oneCodeIsUnavailable = false\r\n setEcoleWithCodeUAIStatus(_ecoleWithCodeUAIStatus)\r\n _ecoleWithCodeUAIStatus.composanteEcole.forEach(ce => {\r\n ce.codeUAIs.forEach(c => {\r\n if (c.isUnavailable == true) {\r\n _oneCodeIsUnavailable = true;\r\n }\r\n });\r\n });\r\n if (_oneCodeIsUnavailable) {\r\n toast.current.show({ severity: 'error', summary: t('errors.uai_code_already_exists_summary'), detail: t('errors.uai_code_already_exists_detail'), life: 3000 });\r\n setIsSubmitting(false);\r\n } else {\r\n ecoleService.createOrUpdateEcole(_ecole)\r\n .then(_ecole => {\r\n setEcole(emptyEcole);\r\n setComposanteEcole([emptyComposante]);\r\n toast.current.show({ severity: 'success', summary: t('general.success'), detail: t('school.created_school'), life: 3000 });\r\n\r\n setEcoleDialog(false);\r\n loadLazyData();\r\n })\r\n .catch((err) => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.failed'), life: 3000 });\r\n })\r\n .finally(() => {\r\n setIsSubmitting(false);\r\n }\r\n )\r\n\r\n }\r\n })\r\n }\r\n else if(!bOk && doublonSaisieUAI){\r\n toast.current.show({ severity: 'error', summary: t('errors.duplicate_summary'), detail: t('errors.duplicate_uai_detail'), life: 3000 })\r\n }\r\n else{\r\n toast.current.show({ severity: 'error', summary: t('errors.incomplete_summary'), detail: t('errors.incomplete_detail'), life: 3000 })\r\n }\r\n };\r\n\r\n const cleanUpEmptyCodeUAI = () => {\r\n let _ecole = { ...ecole };\r\n _ecole.composanteEcole.forEach((ce, index) => {\r\n let _tab = ce.codeUAIs.filter(codeUAI => codeUAI.code != null && codeUAI.code?.trim() != '');\r\n ce.codeUAIs = _tab;\r\n });\r\n setEcole(_ecole)\r\n return _ecole\r\n };\r\n\r\n\r\n const onUploadImageEcole = ({ files }) => {\r\n let _ecole = { ...ecole }\r\n _ecole.fileImage = files[0];\r\n setEcole(_ecole);\r\n fileUploaderImageEcole.current.clear();\r\n };\r\n\r\n const onSelectImageEcole = ({ files }) => {\r\n setErreurImage(files[0].size > 5000000);\r\n };\r\n\r\n const handleRemoveImageEcole = () => {\r\n let _ecole = { ...ecole };\r\n _ecole.fileImage = null;\r\n setEcole(_ecole);\r\n }\r\n\r\n const handleRemoveFichierImageEcole = () => {\r\n let _ecole = { ...ecole };\r\n _ecole.logo = null;\r\n setEcole(_ecole);\r\n }\r\n\r\n const onUploadLogoCampus = (indexComposante, { files }) => {\r\n const _ecole = { ...ecole }\r\n let _composante = [...ecole.composanteEcole]\r\n _composante[indexComposante].fileLogo = files[0];\r\n _ecole.composanteEcole = _composante;\r\n setEcole(_ecole);\r\n fileUploaderImageComposante.current[indexComposante].current.clear();\r\n };\r\n\r\n const onSelectLogoCampus = (indexComposante, { files }) => {\r\n var _erreurImageCompo = [...erreurImageCompo];\r\n let _eC = _erreurImageCompo[indexComposante];\r\n _eC = files[0].size > 5000000;\r\n _erreurImageCompo[indexComposante] = _eC;\r\n setErreurImageCompo(_erreurImageCompo);\r\n };\r\n\r\n const handleRemoveLogoCampus = (indexComposante) => {\r\n let _ecole = { ...ecole };\r\n let _composante = [...ecole.composanteEcole]\r\n _composante[indexComposante].fileLogo = null;\r\n _ecole.composanteEcole = _composante;\r\n setEcole(_ecole);\r\n }\r\n\r\n const handleRemoveFichierLogoCampus = (indexComposante) => {\r\n let _ecole = { ...ecole };\r\n let _composante = [...ecole.composanteEcole]\r\n _composante[indexComposante].logo = null;\r\n _composante[indexComposante].logoId = null;\r\n _ecole.composanteEcole = _composante;\r\n setEcole(_ecole);\r\n }\r\n\r\n\r\n\r\n const editEcole = (ecole) => {\r\n ecole.composanteEcole.forEach(ce => {\r\n if (ce.codeUAIs.length == 0) {\r\n ce.codeUAIs.push({ code: null, composanteEcoleId: ce.id })\r\n }\r\n });\r\n setEcole({ ...ecole });\r\n\r\n // fileUploaderImageComposante.current = fileUploaderImageComposante.current.slice(0, ecole.composanteEcole.length);\r\n for (let i = 0; i < ecole.composanteEcole.length; i++) {\r\n fileUploaderImageComposante.current.push(React.createRef());\r\n var _erreurImageCompo = [...erreurImageCompo];\r\n _erreurImageCompo.push(false);\r\n setErreurImageCompo(_erreurImageCompo);\r\n }\r\n setEcoleDialog(true);\r\n };\r\n\r\n const editFicheEcole = (ecole) => {\r\n history.push('/edition_fiche_ecole', { ecoleId: ecole.id })\r\n };\r\n\r\n const confirmDeleteEcole = (ecole) => {\r\n setEcole(ecole);\r\n setDeleteEcoleDialog(true);\r\n };\r\n\r\n const onInputEcoleChange = (e, name) => {\r\n const val = (e.target && e.target.value) || '';\r\n let _ecole = { ...ecole };\r\n _ecole[`${name}`] = val;\r\n\r\n setEcole(_ecole);\r\n };\r\n\r\n const handleCompChange = (index, e, name) => {\r\n let _ecole = { ...ecole };\r\n let _composantes = [..._ecole.composanteEcole];\r\n\r\n let val = (e.target && e.target.value) || '';\r\n\r\n let _composante = _composantes[index];\r\n _composante[`${name}`] = val;\r\n _composantes[index] = _composante;\r\n\r\n setComposanteEcole(_composantes);\r\n\r\n _ecole.composanteEcole = _composantes;\r\n setEcole(_ecole);\r\n };\r\n\r\n const handleAddComp = () => {\r\n let _ecole = { ...ecole };\r\n let _composantes = [..._ecole.composanteEcole];\r\n _composantes.push({ nom: '', abonnementType: '', ecoleId: ecole.id, codeUAIs: [{ code: null }] });\r\n fileUploaderImageComposante.current.push(React.createRef());\r\n setComposanteEcole(_composantes);\r\n\r\n _ecole.composanteEcole = _composantes;\r\n setEcole(_ecole);\r\n };\r\n\r\n const handleRemoveComp = index => {\r\n let _ecole = { ...ecole };\r\n let _composantes = [..._ecole.composanteEcole];\r\n if (_composantes.length > 1) {\r\n\r\n fileUploaderImageComposante.current.splice(index, 1);\r\n\r\n _composantes.splice(index, 1);\r\n setComposanteEcole(_composantes);\r\n\r\n _ecole.composanteEcole = _composantes;\r\n setEcole(_ecole);\r\n }\r\n };\r\n\r\n const handleCodeUAIChange = (indexCompo, indexCodeUAI, e, name) => {\r\n let _ecole = { ...ecole };\r\n if (ecoleWithCodeUAIStatus) {\r\n let _ecoleWithCodeUAIStatus = { ...ecoleWithCodeUAIStatus }\r\n let _codeUAI = _ecoleWithCodeUAIStatus.composanteEcole[indexCompo].codeUAIs[indexCodeUAI]\r\n if (_codeUAI) {\r\n _codeUAI.isUnavailable = false;\r\n _ecoleWithCodeUAIStatus.composanteEcole[indexCompo].codeUAIs[indexCodeUAI] = _codeUAI;\r\n setEcoleWithCodeUAIStatus(_ecole);\r\n }\r\n }\r\n\r\n let val = (e.target && e.target.value) || '';\r\n\r\n let _codeUAI = _ecole.composanteEcole[indexCompo].codeUAIs[indexCodeUAI]\r\n _codeUAI[`${name}`] = val;\r\n\r\n _ecole.composanteEcole[indexCompo].codeUAIs[indexCodeUAI] = _codeUAI;\r\n setEcole(_ecole);\r\n };\r\n\r\n const handleAddCodeUAI = (indexCompo) => {\r\n let _ecole = { ...ecole };\r\n let _codeUAIs = [..._ecole.composanteEcole[indexCompo].codeUAIs]\r\n _codeUAIs.push({ code: null });\r\n\r\n _ecole.composanteEcole[indexCompo].codeUAIs = _codeUAIs;\r\n setEcole(_ecole);\r\n };\r\n\r\n const handleRemoveCodeUAI = (indexCompo, indexCode) => {\r\n let _ecole = { ...ecole };\r\n let _codeUAIs = [..._ecole.composanteEcole[indexCompo].codeUAIs]\r\n if (_codeUAIs.length > 1) {\r\n _codeUAIs.splice(indexCode, 1);\r\n _ecole.composanteEcole[indexCompo].codeUAIs = _codeUAIs;\r\n setEcole(_ecole);\r\n }\r\n };\r\n\r\n const handleCampChange = (index, e, name) => {\r\n let _ecole = { ...ecole };\r\n let _campus = [..._ecole.campus];\r\n\r\n let val = (e.target && e.target.value) || '';\r\n\r\n if (val === '' && name === 'commune')\r\n val = null;\r\n\r\n let _campu = _campus[index];\r\n _campu[`${name}`] = val;\r\n if(val?.id){\r\n _campu.communeId = val.id\r\n }\r\n else{\r\n _campu.communeId = null;\r\n }\r\n\r\n if (name == 'commune')\r\n _campu.ville = null;\r\n if (name == 'ville')\r\n _campu.commune = null;\r\n\r\n _campus[index] = _campu;\r\n _ecole.campus = _campus;\r\n setEcole(_ecole);\r\n };\r\n\r\n const handleEtrangerCampChange = (index, e, name) => {\r\n let _ecole = { ...ecole };\r\n let _campus = [..._ecole.campus];\r\n\r\n let val = (e.checked) || false;\r\n\r\n let _campu = _campus[index];\r\n _campu[`${name}`] = val;\r\n\r\n if (val) {\r\n _campu.ville = null;\r\n _campu.pays = null;\r\n }\r\n else {\r\n _campu.commune = null;\r\n _campu.pays = 'France';\r\n }\r\n\r\n _campus[index] = _campu;\r\n\r\n _ecole.campus = _campus;\r\n setEcole(_ecole);\r\n };\r\n\r\n const handleOnlineCampChange = (index, e) => {\r\n let _ecole = { ...ecole };\r\n let val = (e.checked) || false;\r\n let _campu = { ..._ecole.campus[index] };\r\n _campu.isOnline = val;\r\n\r\n if (val) {\r\n _campu.ville = null;\r\n _campu.pays = null;\r\n _campu.libelle = \"Online\"\r\n _campu.commune = null\r\n _campu.communeId = null\r\n }\r\n else {\r\n _campu.libelle = '';\r\n }\r\n _ecole.campus[index] = _campu;\r\n setEcole(_ecole);\r\n };\r\n\r\n const handleAddCamp = () => {\r\n let _ecole = { ...ecole };\r\n let _campus = [..._ecole.campus];\r\n _campus.push({ libelle: null, commune: null, etranger: false, ville: null, pays: 'France', ecoleId: ecole.id });\r\n\r\n _ecole.campus = _campus;\r\n setEcole(_ecole);\r\n };\r\n\r\n const handleRemoveCamp = index => {\r\n let _ecole = { ...ecole };\r\n let _campus = [..._ecole.campus];\r\n if (_campus.length > 1) {\r\n _campus.splice(index, 1);\r\n _ecole.campus = _campus;\r\n setEcole(_ecole);\r\n }\r\n };\r\n\r\n const leftToolbarTemplate = () => {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n const ecoleDialogFooter = (\r\n \r\n \r\n \r\n \r\n );\r\n\r\n const rowExpansionTemplate = (ecole) => {\r\n return (\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n return (\r\n \r\n
\r\n\r\n
\r\n \r\n\r\n \r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n * \r\n onInputEcoleChange(e, 'nomEcole')} required autoFocus className={classNames({ 'p-invalid': submitted && !ecole.nomEcole })} />\r\n {submitted && !ecole.nomEcole && . }\r\n
\r\n
\r\n
\r\n {ecole?.fileImage?.name &&\r\n
{ecole?.fileImage?.name} handleRemoveImageEcole()}\r\n style={{ left: \"1em\" }}\r\n /> \r\n ||\r\n (ecole?.logo?.name &&\r\n
{ecole?.logo?.name} handleRemoveFichierImageEcole()}\r\n style={{ left: \"1em\" }}\r\n /> \r\n )}\r\n
\r\n {erreurImage && }\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n handleAddComp()}\r\n style={{ visibility: ecole.composanteEcole?.length === 0 ? \"visible\" : \"hidden\" }}\r\n />\r\n
\r\n {ecole.composanteEcole?.map((compo, indexCompo) => (\r\n
\r\n \r\n
\r\n
\r\n
\r\n * \r\n handleCompChange(indexCompo, event, 'nom')} className={classNames({ 'p-invalid': submitted && !compo.nom })} />\r\n {submitted && !compo.nom && . }\r\n
\r\n
\r\n * \r\n handleCompChange(indexCompo, event, 'abonnementType')} placeholder={t('component.please_select_subscription')} className={classNames({ 'p-invalid': submitted && !compo.abonnementType })} />\r\n {submitted && !compo.abonnementType && . }\r\n
\r\n
\r\n handleRemoveComp(indexCompo)}\r\n style={{ visibility: indexCompo > 0 ? \"visible\" : \"hidden\" }}\r\n />\r\n handleAddComp()}\r\n style={{ visibility: indexCompo == ecole.composanteEcole?.length - 1 ? \"visible\" : \"hidden\" }}\r\n />\r\n
\r\n {compo.codeUAIs.map((codeUAI, indexCodeUAI) => (\r\n
\r\n \r\n \r\n handleCodeUAIChange(indexCompo, indexCodeUAI, event, 'code')}\r\n className={classNames({ 'p-invalid': (submitted && ((ecoleWithCodeUAIStatus?.composanteEcole[indexCompo]?.codeUAIs[indexCodeUAI]?.isUnavailable == true) || (!/^[0-9]{7}[A-Z]$/.test(codeUAI?.code) && codeUAI?.code?.trim()))) })} />\r\n\r\n {submitted && (!/^[0-9]{7}[A-Z]$/.test(codeUAI?.code) && codeUAI?.code?.trim()) && }\r\n {submitted && ecoleWithCodeUAIStatus?.composanteEcole[indexCompo]?.codeUAIs[indexCodeUAI]?.isUnavailable == true && }\r\n
\r\n \r\n handleRemoveCodeUAI(indexCompo, indexCodeUAI)}\r\n style={{ visibility: indexCodeUAI > 0 ? \"visible\" : \"hidden\" }}\r\n />\r\n handleAddCodeUAI(indexCompo)}\r\n style={{ visibility: indexCodeUAI == ecole.composanteEcole[indexCompo].codeUAIs.length - 1 ? \"visible\" : \"hidden\" }}\r\n />\r\n
\r\n \r\n ))}\r\n
\r\n
onUploadLogoCampus(indexCompo, event)}\r\n onSelect={event => onSelectLogoCampus(indexCompo, event)}\r\n accept=\"image/*\" />\r\n {compo?.fileLogo?.name &&\r\n {compo?.fileLogo?.name} handleRemoveLogoCampus(indexCompo, event)}\r\n style={{ left: \"1em\" }}\r\n /> \r\n ||\r\n (compo?.logo?.name &&\r\n {compo?.logo?.name} handleRemoveFichierLogoCampus(indexCompo, event)}\r\n style={{ left: \"1em\" }}\r\n /> \r\n )}\r\n \r\n {erreurImageCompo[indexCompo] && }\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n ))}\r\n
\r\n\r\n \r\n
\r\n \r\n handleAddCamp()}\r\n style={{ visibility: ecole.campus.length === 0 ? \"visible\" : \"hidden\" }}\r\n />\r\n
\r\n\r\n {ecole.campus.map((campu, indexCampu) => (\r\n
\r\n \r\n
\r\n
\r\n
\r\n handleOnlineCampChange(indexCampu, event)} />\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n handleCampChange(indexCampu, event, 'libelle')} />\r\n
\r\n {!ecole.campus[indexCampu].isOnline && <>
\r\n handleEtrangerCampChange(indexCampu, event, 'etranger')} />\r\n \r\n
\r\n {ecole.campus[indexCampu].etranger ? <>\r\n
\r\n * \r\n handleCampChange(indexCampu, event, 'ville')} className={classNames({ 'p-invalid': submitted && !campu.ville })} />\r\n {submitted && !campu.ville && . }\r\n
\r\n
\r\n * \r\n handleCampChange(indexCampu, event, 'pays')} className={classNames({ 'p-invalid': submitted && !campu.pays })} />\r\n {submitted && !campu.pays && . }\r\n
\r\n > : <>\r\n
\r\n * \r\n handleCampChange(indexCampu, event, 'commune')} className={classNames({ 'p-invalid': submitted && !campu.commune })} />\r\n {submitted && !campu.commune && . }\r\n
\r\n
\r\n \r\n \r\n
\r\n >}\r\n >}\r\n\r\n
\r\n handleRemoveCamp(indexCampu)}\r\n style={{ visibility: indexCampu > 0 ? \"visible\" : \"hidden\" }}\r\n />\r\n handleAddCamp()}\r\n style={{ visibility: indexCampu == ecole.campus.length - 1 ? \"visible\" : \"hidden\" }}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n \r\n ))}\r\n
\r\n \r\n
\r\n );\r\n}","import React from 'react';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { DT_Composante } from '../../../components/datatable/dt_composantes';\r\n\r\n\r\nexport const AdministrationComposanteEcolesPage = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n
{t('composante.composante_management.full')} \r\n \r\n \r\n );\r\n}","import { enumOrganismeFormationCategorie } from \"../../enums/enumOrganismeFormationCategorie\"\r\nimport { VueOrganismeFormation } from \"./vueOrganismeFormation\"\r\n\r\nexport const VueEcole = (props) => {\r\n return (\r\n \r\n )\r\n}","import { enumOrganismeFormationCategorie } from \"../../enums/enumOrganismeFormationCategorie\"\r\nimport { VueOrganismeFormation } from \"./vueOrganismeFormation\"\r\n\r\nexport const VueComposanteEcole = (props) => {\r\n\r\n return (\r\n \r\n )\r\n}","import React from 'react';\r\n\r\nexport const Unauthorized = () => {\r\n return(\r\n \r\n \r\n
Unauthorized \r\n \r\n )\r\n}","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ImportExport } from '../components/fileUploader/importExport';\r\nimport ImportExportService from '../services/importExportService';\r\nimport { Import } from '../components/fileUploader/import';\r\n\r\nexport const ImportExportAdminPage = () => {\r\n\r\n const { t } = useTranslation();\r\n\r\n const importExportService = new ImportExportService();\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n )\r\n}","import React, { useRef, useState, useEffect, Fragment } from 'react';\r\nimport './offresCompatibles.css';\r\nimport { useHistory } from \"react-router\";\r\nimport { ProgressSpinner } from 'primereact/progressspinner';\r\nimport { SelectButton } from 'primereact/selectbutton';\r\nimport { Toast } from 'primereact/toast';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { enumHttpError } from '../enums/enumHttpError.js';\r\nimport OffreEmploiService from '../services/offreEmploiService.js';\r\nimport Helper from '../utils/helper.js';\r\nimport parse from 'html-react-parser';\r\nimport { OffreEmploiThumbnail } from '../components/thumbnail/offreEmploiThumbnail.js';\r\nimport { ThumbnailPaginator } from '../components/paginator/thumbnailPaginator';\r\n\r\n\r\nexport const OffresCompatibles = (props) => {\r\n const history = useHistory();\r\n const toast = useRef(null);\r\n const { t } = useTranslation();\r\n const [loading, setLoading] = useState(false);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [offresEmploi, setOffresEmploi] = useState([]);\r\n const [error, setError] = useState(null);\r\n\r\n const offreEmploiService = new OffreEmploiService();\r\n\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const search = parseInt(urlParams.get('pageProfil'));\r\n const itemsPerPage = 12;\r\n const firstItemIndex = (search && !isNaN(search)) ? (itemsPerPage * (search - 1)) : 0;\r\n const adminImpersonatingEtudiantId = history.location?.state?.adminImpersonatingEtudiantId;\r\n\r\n const [lazyParams, setLazyParams] = useState({\r\n first: firstItemIndex,\r\n rows: itemsPerPage,\r\n page: search && !isNaN(search) ? parseInt(search) : 1,\r\n sortField: 'dateCreation'\r\n })\r\n\r\n const [urlPagination, setUrlPagination] = useState({\r\n profil: search ? search : 1,\r\n formation: 1,\r\n favorites: 1\r\n });\r\n\r\n const viewOptions = [\r\n { value: 'profil', name: t('offers.matching_on_profile') },\r\n { value: 'formation', name: t('offers.matching_on_formation') },\r\n { value: 'favorites', name: t('offers.favorites_offers') }\r\n ];\r\n\r\n const [view, setView] = useState(viewOptions[0].value);\r\n\r\n useEffect(() => {\r\n // on vérifie si la recherche est présente dans l'url et que la valeur est un chiffre\r\n if (!search){\r\n window.history.pushState({}, '', window.location.pathname + '?pageProfil=1&pageFormation=1&pageFavorites=1');\r\n }\r\n else{\r\n // si search est un chiffre on met à jour les paramètres de la recherche\r\n setLazyParams({\r\n ...lazyParams,\r\n page: search && !isNaN(search) ? parseInt(search) : 1,\r\n first: firstItemIndex\r\n });\r\n }\r\n\r\n return () => {\r\n // cleanup\r\n setOffresEmploi([]);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadLazyData();\r\n }, [view, lazyParams]);\r\n\r\n const loadLazyData = () => {\r\n setLoading(true);\r\n let httpPromise;\r\n\r\n // on met à jour l'url avec la page courante\r\n const searchParams = new URLSearchParams(window.location.search);\r\n searchParams.set(paginationSwitchName(view), lazyParams.page);\r\n const updatedUrl = window.location.pathname + '?' + searchParams.toString();\r\n window.history.pushState({}, '', updatedUrl);\r\n setUrlPagination({\r\n ...urlPagination,\r\n [view]: lazyParams.page\r\n }); \r\n\r\n if (view === 'profil')\r\n httpPromise = offreEmploiService.getMatchingOffersOnProfile(lazyParams, adminImpersonatingEtudiantId);\r\n else if (view === 'favorites')\r\n httpPromise = offreEmploiService.getMatchingOffersOnFavorite(lazyParams, adminImpersonatingEtudiantId);\r\n else\r\n httpPromise = offreEmploiService.getMatchingOffersOnFormation(lazyParams, adminImpersonatingEtudiantId);\r\n\r\n\r\n\r\n httpPromise\r\n .then(_pagedjobOffers => {\r\n _pagedjobOffers.items.forEach(offer => {\r\n offer.dateCreation = Helper.dateTimeToLocaleDateTime(offer.dateCreation)\r\n });\r\n setTotalCount(_pagedjobOffers.totalCount)\r\n setOffresEmploi(_pagedjobOffers.items);\r\n setLoading(false);\r\n })\r\n .catch((err) => {\r\n switch (err.message) {\r\n // case enumHttpError.USERNOTINACTIVESEARCH:\r\n // setError(enumHttpError.USERNOTINACTIVESEARCH)\r\n // setLoading(false);\r\n // break;\r\n case enumHttpError.CANCELED:\r\n setError(enumHttpError.CANCELED)\r\n break;\r\n default:\r\n setError('failed');\r\n setLoading(false);\r\n break;\r\n }\r\n });\r\n // .finally(() => setLoading(false));\r\n }\r\n\r\n const changeTab = (viewName) => {\r\n setView(viewName);\r\n setOffresEmploi([]);\r\n setError(null)\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const currentUrlPage = parseInt(urlParams.get(paginationSwitchName(viewName)));\r\n if (currentUrlPage && !isNaN(currentUrlPage)) {\r\n setLazyParams({\r\n ...lazyParams,\r\n page: currentUrlPage,\r\n first: itemsPerPage * (currentUrlPage - 1)\r\n });\r\n } else {\r\n setLazyParams({\r\n ...lazyParams,\r\n page: 1,\r\n first: 0\r\n });\r\n }\r\n }\r\n\r\n const paginationSwitchName = (viewName) => {\r\n switch (viewName) {\r\n case 'profil':\r\n return 'pageProfil';\r\n case 'formation':\r\n return 'pageFormation';\r\n case 'favorites':\r\n return 'pageFavorites';\r\n default:\r\n return 'pageProfil';\r\n }\r\n }\r\n\r\n const onUnlike = (indexOE) => {\r\n if (view === 'favorites') {\r\n let _offresEmploi = [...offresEmploi]\r\n _offresEmploi.splice(indexOE, 1);\r\n setOffresEmploi(_offresEmploi)\r\n setTotalCount(totalCount - 1);\r\n }\r\n }\r\n\r\n const gtNbOffreEmploi = () => {\r\n var date = new Date();\r\n\r\n return 270000 + (Number(date.getFullYear()) + (Number(date.getMonth()) * 123) + Number(date.getDay()))\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n changeTab(e.value)} />\r\n
\r\n
\r\n
\r\n
\r\n {offresEmploi.map((offreEmploi, indexOE) => (\r\n
\r\n \r\n onUnlike(indexOE)} urlPagination={urlPagination} />\r\n
\r\n \r\n ))}\r\n
\r\n
\r\n {offresEmploi?.length > 0 &&\r\n
\r\n }\r\n \r\n {loading && view !== 'favorites' &&
{parse(t(\"offers.looking_into_x_offer\", { nbOffreEmploi: gtNbOffreEmploi() }))}
}\r\n {loading && view === 'favorites' &&
}\r\n {/* {!loading && offresEmploi.length == 0 && error == enumHttpError.USERNOTINACTIVESEARCH &&
} */}\r\n {!loading && offresEmploi.length == 0 && error == 'failed' &&
}\r\n {!loading && offresEmploi.length == 0 && view === 'formation' && error != 'failed' && error != enumHttpError.USERNOTINACTIVESEARCH && error != enumHttpError.CANCELED &&
{parse(t(\"offers.no_match\"))}
}\r\n {!loading && offresEmploi.length == 0 && view === 'favorites' && error != 'failed' && error != enumHttpError.USERNOTINACTIVESEARCH && error != enumHttpError.CANCELED &&
{parse(t(\"offers.no_favorites\"))}
}\r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React, { useState, useEffect, useRef } from 'react';\r\nimport { useLocation } from \"react-router-dom\";\r\nimport { useHistory } from 'react-router';\r\nimport { useTranslation } from \"react-i18next\"\r\nimport { Toast } from \"primereact/toast\";\r\nimport { useAuthState } from \"../../context/context\";\r\nimport RechercheService from '../../services/rechercheService';\r\nimport \"../home/home.css\";\r\nimport './rechercheAffinee.css'\r\nimport { MenuSearchFilter } from './menu/menuSearchFilter';\r\nimport { NewNbResultsAndOrder } from './bar/newNbResultsAndOrderBar';\r\nimport RechercheContext from './RechercheContext';\r\nimport { enumBreakpoint } from '../../enums/enumBreakpoint';\r\nimport { MenuPopUpSearchFilter } from './menu/menuPopUpSearchFilter';\r\nimport { RechercheAffineeResultats } from './rechercheAffineeResultats';\r\nimport { enumTypeRechercheAffinee } from '../../enums/enumTypeRechercheAffinee';\r\nimport { enumCategorieRecherche } from '../../enums/enumCategorieRecherche';\r\nimport { ButtonGoBack } from '../../components/buttonGoBack/buttonGoBack';\r\nimport Helper from \"../../utils/helper\";\r\nimport EntrepriseService from \"../../services/entrepriseService\";\r\n\r\nexport const RechercheAffinee = ({ backgroundTheme, className }) => {\r\n\r\n const rechercheService = new RechercheService();\r\n const entrepriseService = new EntrepriseService();\r\n const { t } = useTranslation();\r\n const toast = useRef(null);\r\n const currentUser = useAuthState();\r\n const location = useLocation();\r\n const history = useHistory();\r\n const [formations, setFormations] = useState([]);\r\n const [candidats, setCandidats] = useState([])\r\n const [totalFormationsRecords, setTotalFormationsRecords] = useState(0);\r\n const [totalCandidatsRecords, setTotalCandidatsRecords] = useState(0);\r\n const [loading, setLoading] = useState(true);\r\n const [loadingButton, setLoadingButton] = useState(false);\r\n const [loadingFilter, setLoadingFilter] = useState(false);\r\n const [loadingTotalFormationsRecords, setLoadingTotalFormationsRecords] = useState(false)\r\n const [filtersActiveIndex, setFiltersActiveIndex] = useState([]);\r\n const [matchedAlias, setMatchedAlias] = useState(false);\r\n const [typeRecherche, setTypeRecherche] = useState(enumTypeRechercheAffinee.FORMATION)\r\n const [tokenResetFilters, setTokenResetFilters] = useState(null);\r\n const [displayFakeInformation, setDisplayFakeInformation] = useState(true);\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId\r\n\r\n const _lazyParamsDefault = {\r\n first: 0,\r\n rows: 12,\r\n page: 1,\r\n sortField: 'Pertinence',\r\n sortOrder: 1,\r\n filters: [{ categorie: enumCategorieRecherche.FormationActive, value: true }, { categorie: enumCategorieRecherche.FormationVisible, value: true }]\r\n };\r\n\r\n const [lazyParams, setLazyParams] = useState(_lazyParamsDefault);\r\n\r\n const [fakeCandidats, setFakeCandidats] = useState([\r\n {\r\n prenom: \"Pierre\",\r\n nom: \"Martin\",\r\n urlCode: \"-------\",\r\n email: \"pierremartin@yopmail.com\",\r\n niveauEtude: \"Bac + 5\",\r\n mobiliteInternationale: true,\r\n mobiliteFrancaise: false,\r\n mobiliteRegion: [],\r\n mobiliteDepartement: [],\r\n rechercheActive: true,\r\n suisContratApprentissage: false,\r\n suisContratProfessionnalisation: false,\r\n rechercheActiveCalendrier: \"05/06/2023\",\r\n paireContrats: [\r\n { id: 1, code: \"ALTCA\" }\r\n ],\r\n commune: {\r\n libelle: \"Lyon\",\r\n departement: {\r\n code: \"69\",\r\n libelle: \"Rhône\",\r\n chefLieu: \"64445\",\r\n region: {\r\n libelle: \"Auvergne-Rhône-Alpes\",\r\n },\r\n },\r\n },\r\n fichierCvPdf: {\r\n name: \"Conditions_Factices.pdf\",\r\n path: \"etudiant/36/CvPdfEtudiant/Conditions_Factices.pdf\",\r\n dateValidation: \"2021-12-07T15:22:49.6702956\",\r\n format: \"application/pdf\",\r\n size: 73505\r\n },\r\n fichierPortfolio: {\r\n name: \"Portfolio.pdf\",\r\n dateValidation: \"2021-12-07T14:29:20.6837427\",\r\n format: \"application/pdf\",\r\n size: 73505\r\n },\r\n },\r\n {\r\n urlCode: \"HD9IT1FG\",\r\n nom: \"Léa\",\r\n prenom: \"Petit\",\r\n email: \"leapetit@yopmail.com\",\r\n lieuResidence: \"Londres\",\r\n pays: \"Angleterre\",\r\n etranger: true,\r\n niveauEtude: \"Bac + 3\",\r\n mobiliteInternationale: true,\r\n mobiliteFrancaise: true,\r\n mobiliteRegion: [],\r\n mobiliteDepartement: [],\r\n rechercheActive: true,\r\n suisContratApprentissage: false,\r\n suisContratProfessionnalisation: false,\r\n rechercheActiveCalendrier: \"15/04/2022\",\r\n fichierCvPdf: {\r\n id: 2554,\r\n name: \"Conditions_Factices.pdf\",\r\n path: \"etudiant/36/CvPdfEtudiant/Conditions_Factices.pdf\",\r\n dateValidation: \"2021-12-07T15:22:49.6702956\",\r\n format: \"application/pdf\",\r\n size: 73505\r\n },\r\n },\r\n {\r\n prenom: \"Thomas\",\r\n nom: \"Durand\",\r\n urlCode: \"-------\",\r\n email: \"ThomasDurand@yopmail.com\",\r\n niveauEtude: \"Bac + 2\",\r\n mobiliteInternationale: false,\r\n mobiliteFrancaise: false,\r\n mobiliteRegion: [],\r\n mobiliteDepartement: [],\r\n rechercheActive: true,\r\n suisContratApprentissage: true,\r\n suisContratProfessionnalisation: false,\r\n rechercheActiveCalendrier: \"01/01/2022\",\r\n paireContrats: [\r\n { id: 1, code: \"ALTCA\" }\r\n ],\r\n commune: {\r\n libelle: \"Lyon\",\r\n departement: {\r\n code: \"69\",\r\n libelle: \"Rhône\",\r\n chefLieu: \"64445\",\r\n region: {\r\n libelle: \"Auvergne-Rhône-Alpes\",\r\n },\r\n },\r\n },\r\n fichierCvPdf: {\r\n name: \"Conditions_Factices.pdf\",\r\n path: \"etudiant/36/CvPdfEtudiant/Conditions_Factices.pdf\",\r\n dateValidation: \"2021-12-07T15:22:49.6702956\",\r\n format: \"application/pdf\",\r\n size: 73505\r\n },\r\n },\r\n {\r\n prenom: \"Zoe\",\r\n nom: \"Orlando\",\r\n urlCode: \"-------\",\r\n email: \"ZoeOrlando13@yopmail.com\",\r\n niveauEtude: \"Bac + 2\",\r\n mobiliteInternationale: false,\r\n mobiliteFrancaise: false,\r\n mobiliteRegion: [],\r\n mobiliteDepartement: [],\r\n rechercheActive: true,\r\n suisContratApprentissage: true,\r\n suisContratProfessionnalisation: false,\r\n rechercheActiveCalendrier: \"01/01/2022\",\r\n paireContrats: [\r\n { id: 1, code: \"ALTCA\" }\r\n ],\r\n commune: {\r\n libelle: \"Lyon\",\r\n departement: {\r\n code: \"69\",\r\n libelle: \"Rhône\",\r\n chefLieu: \"64445\",\r\n region: {\r\n libelle: \"Auvergne-Rhône-Alpes\",\r\n },\r\n },\r\n },\r\n fichierCvPdf: {\r\n name: \"Conditions_Factices.pdf\",\r\n path: \"etudiant/36/CvPdfEtudiant/Conditions_Factices.pdf\",\r\n dateValidation: \"2021-12-07T15:22:49.6702956\",\r\n format: \"application/pdf\",\r\n size: 73505\r\n },\r\n },\r\n {\r\n prenom: \"Julien\",\r\n nom: \"Moreau\",\r\n urlCode: \"JLX32F6G\",\r\n email: \"julienmoreau@yopmail.com\",\r\n niveauEtude: \"Bac + 4\",\r\n mobiliteInternationale: true,\r\n mobiliteFrancaise: true,\r\n mobiliteRegion: [\"Île-de-France\"],\r\n mobiliteDepartement: [\"75\"],\r\n rechercheActive: true,\r\n suisContratApprentissage: false,\r\n suisContratProfessionnalisation: true,\r\n rechercheActiveCalendrier: \"12/09/2023\",\r\n commune: {\r\n libelle: \"Paris\",\r\n departement: {\r\n code: \"75\",\r\n libelle: \"Paris\",\r\n chefLieu: \"75000\",\r\n region: {\r\n libelle: \"Île-de-France\",\r\n },\r\n },\r\n },\r\n fichierCvPdf: {\r\n name: \"Julien_Moreau_CV.pdf\",\r\n path: \"etudiant/37/CvPdfEtudiant/Julien_Moreau_CV.pdf\",\r\n dateValidation: \"2022-01-10T12:30:00\",\r\n format: \"application/pdf\",\r\n size: 75600\r\n },\r\n },\r\n {\r\n prenom: \"Amélie\",\r\n nom: \"Giraud\",\r\n urlCode: \"AMP0L9HF\",\r\n email: \"ameliegiraud@yopmail.com\",\r\n niveauEtude: \"Bac + 1\",\r\n mobiliteInternationale: false,\r\n mobiliteFrancaise: true,\r\n mobiliteRegion: [\"Nouvelle-Aquitaine\"],\r\n mobiliteDepartement: [\"33\"],\r\n rechercheActive: false,\r\n suisContratApprentissage: true,\r\n suisContratProfessionnalisation: false,\r\n rechercheActiveCalendrier: \"01/02/2023\",\r\n commune: {\r\n libelle: \"Bordeaux\",\r\n departement: {\r\n code: \"33\",\r\n libelle: \"Gironde\",\r\n chefLieu: \"33000\",\r\n region: {\r\n libelle: \"Nouvelle-Aquitaine\",\r\n },\r\n },\r\n },\r\n fichierCvPdf: {\r\n name: \"Amelie_Giraud_CV.pdf\",\r\n path: \"etudiant/38/CvPdfEtudiant/Amelie_Giraud_CV.pdf\",\r\n dateValidation: \"2022-02-15T10:00:00\",\r\n format: \"application/pdf\",\r\n size: 75450\r\n },\r\n },\r\n {\r\n prenom: \"Lucas\",\r\n nom: \"Bernard\",\r\n urlCode: \"MNT54KFG\",\r\n email: \"lucasbernard@yopmail.com\",\r\n niveauEtude: \"Bac + 2\",\r\n mobiliteInternationale: false,\r\n mobiliteFrancaise: true,\r\n mobiliteRegion: [\"Provence-Alpes-Côte d'Azur\"],\r\n mobiliteDepartement: [\"13\"],\r\n rechercheActive: true,\r\n suisContratApprentissage: false,\r\n suisContratProfessionnalisation: true,\r\n rechercheActiveCalendrier: \"03/03/2023\",\r\n commune: {\r\n libelle: \"Marseille\",\r\n departement: {\r\n code: \"13\",\r\n libelle: \"Bouches-du-Rhône\",\r\n chefLieu: \"13000\",\r\n region: {\r\n libelle: \"Provence-Alpes-Côte d'Azur\",\r\n },\r\n },\r\n },\r\n fichierCvPdf: {\r\n name: \"Lucas_Bernard_CV.pdf\",\r\n path: \"etudiant/39/CvPdfEtudiant/Lucas_Bernard_CV.pdf\",\r\n dateValidation: \"2022-03-20T11:45:00\",\r\n format: \"application/pdf\",\r\n size: 74500\r\n },\r\n },\r\n {\r\n prenom: \"Chloé\",\r\n nom: \"Lefevre\",\r\n urlCode: \"CHL2N0GF\",\r\n email: \"chloelefevre@yopmail.com\",\r\n niveauEtude: \"Bac + 3\",\r\n mobiliteInternationale: true,\r\n mobiliteFrancaise: true,\r\n mobiliteRegion: [\"Occitanie\"],\r\n mobiliteDepartement: [\"31\"],\r\n rechercheActive: true,\r\n suisContratApprentissage: true,\r\n suisContratProfessionnalisation: false,\r\n rechercheActiveCalendrier: \"01/04/2023\",\r\n commune: {\r\n libelle: \"Toulouse\",\r\n departement: {\r\n code: \"31\",\r\n libelle: \"Haute-Garonne\",\r\n chefLieu: \"31000\",\r\n region: {\r\n libelle: \"Occitanie\",\r\n },\r\n },\r\n },\r\n fichierCvPdf: {\r\n name: \"Chloe_Lefevre_CV.pdf\",\r\n path: \"etudiant/40/CvPdfEtudiant/Chloe_Lefevre_CV.pdf\",\r\n dateValidation: \"2022-04-01T09:30:00\",\r\n format: \"application/pdf\",\r\n size: 74800\r\n },\r\n },\r\n {\r\n prenom: \"Emma\",\r\n nom: \"Roux\",\r\n urlCode: \"EMR8P1QR\",\r\n email: \"emmaroux@yopmail.com\",\r\n niveauEtude: \"Bac + 4\",\r\n mobiliteInternationale: true,\r\n mobiliteFrancaise: false,\r\n mobiliteRegion: [],\r\n mobiliteDepartement: [],\r\n rechercheActive: false,\r\n suisContratApprentissage: true,\r\n suisContratProfessionnalisation: true,\r\n rechercheActiveCalendrier: \"12/05/2023\",\r\n commune: {\r\n libelle: \"Nice\",\r\n departement: {\r\n code: \"06\",\r\n libelle: \"Alpes-Maritimes\",\r\n chefLieu: \"06000\",\r\n region: {\r\n libelle: \"Provence-Alpes-Côte d'Azur\",\r\n },\r\n },\r\n },\r\n fichierCvPdf: {\r\n name: \"Emma_Roux_CV.pdf\",\r\n path: \"etudiant/41/CvPdfEtudiant/Emma_Roux_CV.pdf\",\r\n dateValidation: \"2022-05-05T10:15:00\",\r\n format: \"application/pdf\",\r\n size: 74900\r\n },\r\n },\r\n {\r\n prenom: \"Antoine\",\r\n nom: \"Dufour\",\r\n urlCode: \"ANT9Y2WX\",\r\n email: \"antoinedufour@yopmail.com\",\r\n niveauEtude: \"Bac + 5\",\r\n mobiliteInternationale: true,\r\n mobiliteFrancaise: true,\r\n mobiliteRegion: [\"Hauts-de-France\"],\r\n mobiliteDepartement: [\"59\"],\r\n rechercheActive: true,\r\n suisContratApprentissage: false,\r\n suisContratProfessionnalisation: false,\r\n rechercheActiveCalendrier: \"15/06/2023\",\r\n commune: {\r\n libelle: \"Lille\",\r\n departement: {\r\n code: \"59\",\r\n libelle: \"Nord\",\r\n chefLieu: \"59000\",\r\n region: {\r\n libelle: \"Hauts-de-France\",\r\n },\r\n },\r\n },\r\n fichierCvPdf: {\r\n name: \"Antoine_Dufour_CV.pdf\",\r\n path: \"etudiant/42/CvPdfEtudiant/Antoine_Dufour_CV.pdf\",\r\n dateValidation: \"2022-06-10T14:00:00\",\r\n format: \"application/pdf\",\r\n size: 75200\r\n },\r\n },\r\n {\r\n prenom: \"Sophie\",\r\n nom: \"Vidal\",\r\n urlCode: \"SOPH5F7R\",\r\n email: \"sophievidal@yopmail.com\",\r\n niveauEtude: \"Bac + 1\",\r\n mobiliteInternationale: false,\r\n mobiliteFrancaise: true,\r\n mobiliteRegion: [\"Bretagne\"],\r\n mobiliteDepartement: [\"35\"],\r\n rechercheActive: false,\r\n suisContratApprentissage: true,\r\n suisContratProfessionnalisation: true,\r\n rechercheActiveCalendrier: \"10/07/2023\",\r\n commune: {\r\n libelle: \"Rennes\",\r\n departement: {\r\n code: \"35\",\r\n libelle: \"Ille-et-Vilaine\",\r\n chefLieu: \"35000\",\r\n region: {\r\n libelle: \"Bretagne\",\r\n },\r\n },\r\n },\r\n fichierCvPdf: {\r\n name: \"Sophie_Vidal_CV.pdf\",\r\n path: \"etudiant/43/CvPdfEtudiant/Sophie_Vidal_CV.pdf\",\r\n dateValidation: \"2022-07-01T09:45:00\",\r\n format: \"application/pdf\",\r\n size: 74000\r\n },\r\n },\r\n {\r\n prenom: \"Maxime\",\r\n nom: \"Girard\",\r\n urlCode: \"MAX8U9DS\",\r\n email: \"maximegirard@yopmail.com\",\r\n niveauEtude: \"Bac + 2\",\r\n mobiliteInternationale: true,\r\n mobiliteFrancaise: false,\r\n mobiliteRegion: [],\r\n mobiliteDepartement: [],\r\n rechercheActive: true,\r\n suisContratApprentissage: false,\r\n suisContratProfessionnalisation: false,\r\n rechercheActiveCalendrier: \"22/08/2023\",\r\n commune: {\r\n libelle: \"Nantes\",\r\n departement: {\r\n code: \"44\",\r\n libelle: \"Loire-Atlantique\",\r\n chefLieu: \"44000\",\r\n region: {\r\n libelle: \"Pays de la Loire\",\r\n },\r\n },\r\n },\r\n fichierCvPdf: {\r\n name: \"Maxime_Girard_CV.pdf\",\r\n path: \"etudiant/44/CvPdfEtudiant/Maxime_Girard_CV.pdf\",\r\n dateValidation: \"2022-08-15T13:30:00\",\r\n format: \"application/pdf\",\r\n size: 74200\r\n },\r\n },\r\n ]);\r\n\r\n const tryParseJsonFilters = async (_lazyParams) => {\r\n\r\n var query = new URLSearchParams(history.location.search);\r\n var rechercheCode = null;\r\n\r\n try {\r\n rechercheCode = query.get('RechercheCode');\r\n if (rechercheCode) {\r\n return rechercheService.getRechercheAffineeByCode(rechercheCode)\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n catch\r\n {\r\n return null;\r\n }\r\n }\r\n\r\n\r\n const showError = () => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.loading_failed'), life: 3000 });\r\n }\r\n\r\n const loadLazyData = (_lazyParams) => {\r\n onRechercheChanged(_lazyParams);\r\n }\r\n\r\n const onRechercheChanged = (_lazyParams, _typeRecherche) => {\r\n let _newLazyParams = _lazyParams;\r\n setLazyParams(_newLazyParams)\r\n setLoading(true);\r\n setLoadingTotalFormationsRecords(true);\r\n if (_typeRecherche == enumTypeRechercheAffinee.FORMATION || (_typeRecherche == null && contextRecherche.typeRecherche == enumTypeRechercheAffinee.FORMATION)) {\r\n setTotalCandidatsRecords(0);\r\n\r\n var filters = _lazyParams.filters\r\n rechercheService.setRechercheAffineeCode(JSON.stringify(_lazyParams.filters)).then((data) => {\r\n window.history.replaceState(filters, '', \"/rechercheAffinee?RechercheCode=\" + data)\r\n }\r\n )\r\n rechercheService\r\n .getRechercheAffineeFormationPaginated(_newLazyParams)\r\n .then((data) => {\r\n setFormations(data.items);\r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoading(false))\r\n\r\n rechercheService.\r\n getRechercheAffineeFormationCount(_newLazyParams)\r\n .then((totalCount) => {\r\n setTotalFormationsRecords(totalCount);\r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoadingTotalFormationsRecords(false))\r\n }\r\n else if (_typeRecherche == enumTypeRechercheAffinee.CANDIDAT || (_typeRecherche == null && contextRecherche.typeRecherche == enumTypeRechercheAffinee.CANDIDAT)) {\r\n setTotalFormationsRecords(0);\r\n\r\n entrepriseService\r\n .getExtendEntrepriseProfil(adminImpersonatingRecruteurId)\r\n .then((_recruteur) => {\r\n // let isInPeriodeEssai = Helper.isInPeriodeEssai(\r\n // _recruteur.creationDate, \r\n // _recruteur.recruteurEntreprises[0].entreprise.abonnementEntreprise.nbSemaineEssai\r\n // );\r\n // if (!_recruteur.recruteurEntreprises[0].entreprise.abonnementEntreprise.isFree || isInPeriodeEssai) {\r\n // setDisplayFakeInformation(false);\r\n // rechercheService.getRechercheAffineeCandidats(_newLazyParams)\r\n // .then((data) => {\r\n // setTotalCandidatsRecords(data.totalCount);\r\n // setCandidats(data.items);\r\n // })\r\n // .catch(err => {\r\n // showError()\r\n // console.log(err)\r\n // })\r\n // }\r\n // else{\r\n // setTotalCandidatsRecords(fakeCandidats.length);\r\n // setCandidats(fakeCandidats);\r\n // }\r\n if (!_recruteur.recruteurEntreprises[0].entreprise.abonnementEntreprise.isFree) {\r\n setDisplayFakeInformation(false);\r\n }\r\n rechercheService.getRechercheAffineeCandidats(_newLazyParams)\r\n .then((data) => {\r\n setTotalCandidatsRecords(data.totalCount);\r\n setCandidats(data.items);\r\n })\r\n .catch(err => {\r\n showError()\r\n console.log(err)\r\n })\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n setLoadingTotalFormationsRecords(false);\r\n })\r\n }\r\n else {\r\n showError()\r\n setLoading(false)\r\n }\r\n }\r\n\r\n const handleClicEffacerFiltres = (e) => {\r\n e.preventDefault()\r\n try {\r\n setTokenResetFilters(new Date())\r\n contextRecherche.setLazyParams(_lazyParamsDefault)\r\n contextRecherche.rechercheApi(_lazyParamsDefault)\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n const onClickChangePage = (lazyParams) => {\r\n setLoadingButton(true);\r\n\r\n switch (contextRecherche.typeRecherche) {\r\n case enumTypeRechercheAffinee.FORMATION:\r\n setTotalCandidatsRecords(0);\r\n rechercheService\r\n .getRechercheAffineeFormationPaginated(lazyParams)\r\n .then((data) => {\r\n setFormations(data.items);\r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoadingButton(false))\r\n break;\r\n case enumTypeRechercheAffinee.CANDIDAT:\r\n setTotalFormationsRecords(0);\r\n rechercheService.getRechercheAffineeCandidats(lazyParams)\r\n .then((data) => {\r\n setTotalCandidatsRecords(data.totalCount);\r\n setCandidats(data.items);\r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoadingButton(false))\r\n break;\r\n default:\r\n showError()\r\n setLoadingButton(false)\r\n break;\r\n }\r\n }\r\n\r\n const contextRecherche = {\r\n lazyParams,\r\n setLazyParams,\r\n rechercheApi: onRechercheChanged,\r\n totalFormationsRecords,\r\n totalCandidatsRecords,\r\n categorieRecherche: enumCategorieRecherche,\r\n typeRecherche,\r\n setTypeRecherche,\r\n tokenResetFilters\r\n }\r\n\r\n const matchAlias = (filters, filtersNonAlias) => {\r\n if (!matchedAlias) {\r\n setLoadingFilter(true);\r\n\r\n rechercheService.getMatchingAlias(filters).then(_filters => {\r\n\r\n let _lazyParams = { ...lazyParams };\r\n\r\n _filters.forEach(element => {\r\n if (element.categorie === 0)\r\n element.exige = false;\r\n });\r\n //_lazyParams.filters = _lazyParams.filters.concat(filtersNonAlias);\r\n _lazyParams.filters = [...new Set([..._lazyParams.filters, ...filtersNonAlias, ..._filters])];\r\n // _lazyParams.filters = _lazyParams.filters.concat(_filters);\r\n // _lazyParams.filters = [...new Set([..._lazyParams.filters ,..._filters])];\r\n setLazyParams(_lazyParams);\r\n loadLazyData(_lazyParams);\r\n setMatchedAlias(true);\r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoadingFilter(false));\r\n }\r\n }\r\n\r\n const filterGetNonAliasOnly = (filters) => {\r\n return filters.filter(function (item) {\r\n return !item.alias;\r\n });\r\n }\r\n\r\n const filterGetAliasOnly = (filters) => {\r\n return filters.filter(function (item) {\r\n return (item.categorie == enumCategorieRecherche.Competence || item.categorie == enumCategorieRecherche.Appellation) && item.alias;\r\n });\r\n } \r\n\r\n useEffect(() => {\r\n\r\n (async function ueWaiter() {\r\n let rawfilters = await tryParseJsonFilters(lazyParams);\r\n let filters = rawfilters == \"\" ? \"\" : JSON.parse(rawfilters);\r\n\r\n if (filters) {\r\n let _lazyParams = { ...lazyParams };\r\n _lazyParams.filters = filters\r\n setLazyParams(_lazyParams);\r\n loadLazyData(_lazyParams);\r\n }\r\n else if (history.location.state?.filters) {\r\n\r\n let _filtersNonAlias = filterGetNonAliasOnly(history.location?.state?.filters)\r\n if (_filtersNonAlias.map((f) => { return f.categorie; }).indexOf(enumCategorieRecherche.FormationActive) == -1) {\r\n _filtersNonAlias.push({ categorie: enumCategorieRecherche.FormationActive, value: true }) //formation active par defaut\r\n _filtersNonAlias.push({ categorie: enumCategorieRecherche.FormationVisible, value: true }) //formation visible par defaut\r\n\r\n }\r\n let _filtersAlias = filterGetAliasOnly(history.location.state.filters)\r\n if (_filtersAlias.length) {\r\n matchAlias(_filtersAlias, _filtersNonAlias);\r\n let _lazyParams = { ...lazyParams };\r\n _lazyParams.filters = _filtersNonAlias;\r\n setLazyParams(_lazyParams);\r\n }\r\n else {\r\n let _lazyParams = { ...lazyParams };\r\n _lazyParams.filters = _filtersNonAlias;\r\n setLazyParams(_lazyParams);\r\n loadLazyData(_lazyParams);\r\n }\r\n }\r\n else {\r\n loadLazyData(lazyParams);\r\n }\r\n })()\r\n\r\n\r\n }, [location])\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n \r\n )\r\n}","//STD + trans + Auth\r\nimport { Fragment, useContext, useEffect, useRef, useState } from \"react\";\r\nimport { useTranslation, Trans } from \"react-i18next\"\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { useLocation } from \"react-router-dom\";\r\n\r\n//Prime react\r\nimport { Toast } from \"primereact/toast\";\r\n\r\n//Project Module\r\nimport { RechercheCandidatsResultats } from \"./rechercheCandidatsResultats\";\r\nimport { NbResultsAndOrder } from \"./bar/nbResultsAndOrderBar\";\r\n\r\n//Services\r\nimport RechercheService from \"../../services/rechercheService\";\r\n\r\n//CSS + Icon\r\nimport \"./rechercheCandidats.css\"\r\nimport RecrutementRechercheContext from \"./recrutement-RechercheContext\";\r\n\r\n\r\nexport const RechercheCandidats = () => {\r\n\r\n const { t } = useTranslation();\r\n const toast = useRef(null);\r\n const location = useLocation();\r\n const history = useHistory();\r\n\r\n const rechercheService = new RechercheService();\r\n\r\n const [loading, setLoading] = useState(true);\r\n\r\n const [candidats, setCandidats] = useState([]);\r\n\r\n const [recrutementId, setRecrutementId] = useState(null)\r\n const [loadingButton, setLoadingButton] = useState(false);\r\n\r\n const [totalCandidatsRecords, setTotalCandidatsRecords] = useState(0)\r\n const [tokenResetFilters, setTokenResetFilters] = useState(null);\r\n\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 6,\r\n page: 0,\r\n sortField: 'Pertinence',\r\n sortOrder: 1,\r\n filters: [{ categorie: 12, value: true }]\r\n });\r\n\r\n const categorieRecherche = {\r\n Niveau: 100,\r\n TypeContrat: 101,\r\n DebutContrat: 102,\r\n DuréeContrat: 103,\r\n\r\n CompetenceLiee: 104,\r\n\r\n Competence: 0,\r\n Appellation: 1,\r\n Formation: 2,\r\n Diplome: 3,\r\n Ville: 4,\r\n Departement: 5,\r\n Region: 6,\r\n Pays: 7,\r\n Composante: 8,\r\n Ecole: 9,\r\n\r\n Alternance: 13,\r\n FormationContinue: 14,\r\n FormationInitiale: 15,\r\n AccessibleADistance: 16,\r\n\r\n DipDomaine: 25,\r\n DipMetier: 26\r\n }\r\n\r\n const _lazyParamsDefault = {\r\n first: 0,\r\n rows: 8,\r\n page: 0,\r\n sortField: 'Pertinence',\r\n sortOrder: 1,\r\n filters: [{ categorie: 12, value: true }]\r\n };\r\n\r\n useEffect(() => {\r\n if (history.location.state && history.location.state.filters) {\r\n let _lazyParams = { ...lazyParams };\r\n _lazyParams.filters = history.location.state.filters\r\n setLazyParams(_lazyParams);\r\n loadLazyData(_lazyParams);\r\n if (history.location.state.idRecrutement) {\r\n setRecrutementId(history.location.state.idRecrutement)\r\n }\r\n }\r\n else {\r\n\r\n setLazyParams(_lazyParamsDefault);\r\n loadLazyData(_lazyParamsDefault);\r\n }\r\n }, [location]);\r\n\r\n\r\n const loadLazyData = (_lazyParams) => {\r\n onRechercheChanged(_lazyParams);\r\n }\r\n\r\n const showError = () => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.loading_failed'), life: 3000 });\r\n }\r\n\r\n const onRechercheChanged = (_lazyParams, _typeRecherche) => {\r\n let _newLazyParams = _lazyParams\r\n _newLazyParams.first = 0;\r\n _newLazyParams.page = 0;\r\n setLazyParams(_newLazyParams)\r\n setLoading(true);\r\n\r\n rechercheService.getRechercheCandidats(_newLazyParams)\r\n .then((data) => {\r\n setCandidats(data.items);\r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoading(false))\r\n\r\n rechercheService.\r\n getRechercheCandidatsCount(_newLazyParams)\r\n .then((totalCount) => {\r\n setTotalCandidatsRecords(totalCount);\r\n })\r\n .catch(err => showError())\r\n .finally(() => { })\r\n }\r\n\r\n const handleClicEffacerFiltres = (e) => {\r\n e.preventDefault()\r\n try {\r\n // setSelectedMobilite(null)\r\n // setSelectedPosteRecherche(null)\r\n setTokenResetFilters(new Date())\r\n contextRechercheRecrutement.setLazyParams(_lazyParamsDefault)\r\n contextRechercheRecrutement.rechercheApi(_lazyParamsDefault)\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n const onClickMoreCandidats = () => {\r\n setLoadingButton(true);\r\n let _lazyParams = { ...lazyParams };\r\n _lazyParams.page += 1;\r\n _lazyParams.first += _lazyParams.rows;\r\n setLazyParams(_lazyParams);\r\n\r\n\r\n rechercheService.getRechercheCandidats(_lazyParams)\r\n .then((data) => {\r\n const _candidats = [...candidats];\r\n const _totalcandidats = _candidats.concat(data.items);\r\n setCandidats(_totalcandidats);\r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoadingButton(false))\r\n\r\n }\r\n\r\n const contextRechercheRecrutement = {\r\n lazyParams,\r\n setLazyParams,\r\n rechercheApi: onRechercheChanged,\r\n categorieRecherche,\r\n totalCandidatsRecords,\r\n SetInitialValue: () => { },\r\n SetInitialValues: () => { },\r\n OnchangeSingle: () => { },\r\n OnchangeMultiple: () => { },\r\n tokenResetFilters\r\n }\r\n\r\n contextRechercheRecrutement.SetInitialValue = (categorieRecherche) => {\r\n let _value = null\r\n let _filters = [...contextRechercheRecrutement.lazyParams.filters]\r\n _filters.forEach(element => {\r\n if (element.categorie == categorieRecherche) {\r\n if (categorieRecherche == contextRechercheRecrutement.categorieRecherche.DebutContrat) {\r\n _value = new Date(element.value);\r\n }\r\n else {\r\n _value = element.value;\r\n }\r\n }\r\n })\r\n return _value\r\n }\r\n\r\n contextRechercheRecrutement.SetInitialValues = (categorieRecherche) => {\r\n let _values = []\r\n let _filters = [...contextRechercheRecrutement.lazyParams.filters]\r\n _filters.forEach(element => {\r\n if (element.categorie == categorieRecherche) {\r\n _values.push(element.value);\r\n }\r\n })\r\n return _values\r\n }\r\n\r\n contextRechercheRecrutement.OnchangeSingle = (e, categorieRecherche) => {\r\n if (e.target) {\r\n e.preventDefault()\r\n }\r\n try {\r\n let _filters = [...contextRechercheRecrutement.lazyParams.filters];\r\n let _indexToRemove = [];\r\n // seek niveau to remove\r\n _filters.forEach((element, index) => {\r\n if (element.categorie == categorieRecherche) {\r\n _indexToRemove.push(index)\r\n }\r\n });\r\n //remove existing filte\r\n for (var i = _indexToRemove.length - 1; i >= 0; i--) {\r\n _filters.splice(_indexToRemove[i], 1);\r\n }\r\n //push new values\r\n if (e.value !== null) {\r\n _filters.push({ categorie: categorieRecherche, value: e.value });\r\n }\r\n let _lazyParams = { ...contextRechercheRecrutement.lazyParams };\r\n _lazyParams.filters = _filters;\r\n contextRechercheRecrutement.setLazyParams(_lazyParams);\r\n console.log(_lazyParams);\r\n\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n contextRechercheRecrutement.OnchangeMultiple = (e, categorieRecherche) => {\r\n if (e.target) {\r\n e.preventDefault()\r\n }\r\n try {\r\n let _filters = [...contextRechercheRecrutement.lazyParams.filters];\r\n let _indexToRemove = [];\r\n // seek niveau to remove\r\n _filters.forEach((element, index) => {\r\n if (element.categorie == categorieRecherche) {\r\n _indexToRemove.push(index)\r\n }\r\n });\r\n //remove existing filte\r\n for (var i = _indexToRemove.length - 1; i >= 0; i--) {\r\n _filters.splice(_indexToRemove[i], 1);\r\n }\r\n //push new values\r\n if (e.value !== null) {\r\n e.value.forEach(element => {\r\n _filters.push({ categorie: categorieRecherche, value: element });\r\n });\r\n }\r\n let _lazyParams = { ...contextRechercheRecrutement.lazyParams };\r\n _lazyParams.filters = _filters;\r\n contextRechercheRecrutement.setLazyParams(_lazyParams);\r\n console.log(_lazyParams);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n )\r\n}","import { useHistory } from \"react-router-dom/cjs/react-router-dom.min\";\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { enumRoles } from '../../enums/enumRoles';\r\nimport parse from 'html-react-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Button } from \"primereact/button\";\r\nimport Pic3 from \"../../images/savoir-plus/commun/static-1.webp\"\r\nimport Pic1 from \"../../images/savoir-plus/commun/static-2.webp\"\r\nimport Pic2 from \"../../images/savoir-plus/etudiant/inscription.webp\"\r\nimport {Helmet} from \"react-helmet\";\r\nimport { Link } from \"react-router-dom\";\r\nimport \"./savoirplus_etudiant.css\";\r\nimport 'primeflex/primeflex.css';\r\n\r\nexport const SavoirPlus_Etudiant = (props) => {\r\n\r\n const currentUser = useAuthState();\r\n const isAdmin = currentUser?.roles?.indexOf(enumRoles.ADMINISTRATEUR) > -1;\r\n const isEtudiant = currentUser?.roles?.indexOf(enumRoles.ETUDIANT) > -1 && !isAdmin;\r\n\r\n const history = useHistory();\r\n const { t } = useTranslation();\r\n\r\n const onRetourAccueilClick = () => {\r\n history.push('/');\r\n }\r\n\r\n const onRetourCreationEtudianClick = () => {\r\n if (isEtudiant)\r\n history.push('/dashboard');\r\n else {\r\n history.push({ pathname: '/register?User=Student', state :{ userType : enumRoles.ETUDIANT, previousUrl : history.location.pathname} })\r\n }\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n Etudiant - DiplomAdvisor \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
{parse(t(\"information.savoirplus.etudiant.Title1\"))} \r\n \r\n
\r\n
\r\n
\r\n
Vous cherchez un stage, une alternance ou un emploi ? \r\n DiplomAdvisor vous aide à mettre en valeur vos compétences ! \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Comment ça marche ?
\r\n
\r\n Ouvrez un compte (c’est gratuit !) \r\n Indiquez les formations que vous avez suivies \r\n Nous créons automatiquement votre profil de compétences professionnelles pour vous rendre visible auprès des entreprises qui recrutent ! \r\n Vous consultez sur votre tableau de bord les offres d’emploi qui correspondent à votre profil (plus de 250 000 offres mises à jour quotidiennement !) \r\n \r\n
\r\n onRetourCreationEtudianClick()}>
\r\n
\r\n
\r\n
\r\n
\r\n
Vous êtes à la recherche de votre prochaine formation ? \r\n
Utilisez notre moteur de recherche pour trouver les programmes qui correspondent à vos aspirations pro ! \r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import { useHistory } from \"react-router-dom/cjs/react-router-dom.min\";\r\nimport { useAuthState } from \"../../context/context\";\r\nimport parse from 'html-react-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Button } from \"primereact/button\";\r\nimport PicEntreprise from \"../../images/accueil/ecole/entrepriseRetexLogo.webp\";\r\nimport PicEntreprisePortalPreview from \"../../images/savoir-plus/entreprise/entreprisePortalPreview.png\";\r\n\r\nimport RoleHelper from \"../../utils/roleHelper\";\r\nimport { enumRoles } from '../../enums/enumRoles';\r\nimport { Helmet } from \"react-helmet\";\r\nimport { Link } from \"react-router-dom\";\r\nimport \"./savoirplus_entreprise.css\";\r\n\r\nexport const SavoirPlus_Entreprise = (props) => {\r\n\r\n const currentUser = useAuthState();\r\n\r\n const history = useHistory();\r\n const { t } = useTranslation();\r\n\r\n const onTableauDeBord = () => {\r\n history.push('/dashboard');\r\n };\r\n\r\n const onRetourCreationEntrepriseClick = () => {\r\n history.push({ pathname: '/register?User=Company', state: { userType: enumRoles.ENTREPRISE, previousUrl: history.location.pathname } })\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n Entreprise - DiplomAdvisor \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n {/*
{parse(t(\"information.savoirplus.entreprise.Title1\"))} \r\n {parse(t(\"information.savoirplus.entreprise.Title2\"))} */}\r\n {\"Disponible très bientôt\".toUpperCase()} \r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n {/*
*/}\r\n
\r\n
\r\n
\r\n {/*
{t(\"information.savoirplus.entreprise.TextPresentation1\")} */}\r\n {/* {t(\"information.savoirplus.entreprise.TextPresentation2\")} */}\r\n Nouvelle version de la plateforme entreprise disponible prochainement \r\n \r\n
\r\n\r\n {/*
\r\n {(RoleHelper.isEntreprise(currentUser)) ? ( onTableauDeBord()}> )\r\n : ( onRetourCreationEntrepriseClick()} > )}\r\n
*/}\r\n\r\n
\r\n \r\n
\r\n
\r\n \r\n )\r\n}","import { useHistory } from \"react-router-dom/cjs/react-router-dom.min\";\r\nimport { useAuthState } from \"../../context/context\";\r\nimport parse from 'html-react-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Button } from \"primereact/button\";\r\nimport PicEcole from \"../../images/accueil/ecole/analyseLogo.webp\"\r\nimport RoleHelper from \"../../utils/roleHelper\";\r\nimport { Mailto } from \"../../components/mailto/mailto\";\r\nimport {Helmet} from \"react-helmet\";\r\nimport { Link } from \"react-router-dom\";\r\nimport \"./savoirplus_ecole.css\";\r\nimport 'primeflex/primeflex.css';\r\n\r\nexport const SavoirPlus_Ecole = (props) => {\r\n\r\n const currentUser = useAuthState();\r\n\r\n const history = useHistory();\r\n const { t } = useTranslation();\r\n\r\n\r\n const onRetourAccueilClick = () => {\r\n history.push('/');\r\n }\r\n\r\n const onTableauDeBord = () => {\r\n history.push('/dashboard');\r\n }\r\n\r\n\r\n return (\r\n \r\n
\r\n \r\n Ecole - DiplomAdvisor \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n
{parse(t(\"information.savoirplus.ecole.Title1\"))} \r\n \r\n
\r\n\r\n
\r\n
\r\n
{t(\"information.savoirplus.ecole.TextPresentation\")} \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
{t(\"information.savoirplus.ecole.TextDescription1\")} \r\n {t(\"information.savoirplus.ecole.TextDescription2\")} \r\n \r\n\r\n
\r\n
\r\n {(RoleHelper.isAdminEcole(currentUser) || RoleHelper.isAdminComposante(currentUser)) ? ( onTableauDeBord()}> ) : ( )}\r\n
\r\n
\r\n
\r\n
\r\n \r\n )\r\n}","import React, { useEffect, useState } from \"react\";\r\nimport { motion } from \"framer-motion\";\r\nimport { Button } from \"primereact/button\";\r\nimport { Dialog } from \"primereact/dialog\";\r\nimport { FormRegister } from \"../../components/form/formRegister\";\r\nimport \"./landingPageEntreprise.css\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\n\r\nexport const LandingPageEntreprise = () => {\r\n const images = [\r\n {\r\n img: \"https://vbbyzkwiki2m9i1q.public.blob.vercel-storage.com/240_F_249777683_ZxXAzDiCZQhOHYAtDtiSIwHpdZnIKIRj-KeMls3pkrnjuNg0rc5hAxNrirl96Dd.jpg\",\r\n hoverImg:\r\n \"https://vbbyzkwiki2m9i1q.public.blob.vercel-storage.com/240_F_251063662_FkQ3Yt6vybIfqvXFUXHiRcMjHgTZKWdQ-aTTkW8PGYx21zcZ8erpLOLkx6vXxyz.jpg\",\r\n alt: \"Étudiant avec des livres\",\r\n },\r\n {\r\n img: \"https://vbbyzkwiki2m9i1q.public.blob.vercel-storage.com/240_F_272619987_mbt2Yl4bMQu7ZYgJjbtFHqDwQIPvCAvp-idvQGiVO5bf0OkuUd12GxQXokyHVuI.jpg\",\r\n hoverImg:\r\n \"https://vbbyzkwiki2m9i1q.public.blob.vercel-storage.com/240_F_275145513_BGXVojwLqVr1gVhmO1YG2Qf1Kh2hqies-VLnoo908Zz0PgAtwtFpcbeHtqFWy3H.jpg\",\r\n alt: \"Étudiante avec ordinateur portable\",\r\n },\r\n {\r\n img: \"https://vbbyzkwiki2m9i1q.public.blob.vercel-storage.com/240_F_339602256_dBq6bYfHWzlnRQkXgAMFXZfx2r1DPQns-3vTGFAIPUksFMn5OOeZ2Vi7s86Z50L.jpg\",\r\n hoverImg:\r\n \"https://vbbyzkwiki2m9i1q.public.blob.vercel-storage.com/240_F_326977874_aXtSm081zzZHicnRDzbPdbJDP9WJqYIG-BdeHj0RdCcBvlHVJ60t2OQdwf5S1tw.jpg\",\r\n alt: \"Étudiant avec un ordinateur portable\",\r\n },\r\n {\r\n img: \"https://vbbyzkwiki2m9i1q.public.blob.vercel-storage.com/jeune-homme-souriant-elegant-tenant-haut-parleur-sans-fil-ecoutant-musique_285396-9505-svnExopPuwiGAhA6isqMA4qUzZM4Qj.jpg\",\r\n hoverImg:\r\n \"https://vbbyzkwiki2m9i1q.public.blob.vercel-storage.com/240_F_484907348_9tuG9pmOPPfPRnwCB06H9zoJgT5D8UVF-91ZVDJAgyD01Icpi7NbKdKYy3c3ZZ4.jpg\",\r\n alt: \"Jeune homme souriant avec un haut-parleur sans fil\",\r\n },\r\n ];\r\n\r\n const steps = [\r\n {\r\n step: 1,\r\n title: \"Publiez des offres d'emploi\",\r\n description:\r\n \"Diffusion ciblée vers les profils les plus pertinents. Recevez uniquement des candidatures qualifiées.\",\r\n },\r\n {\r\n step: 2,\r\n title: \"Explorez notre CVthèque\",\r\n description:\r\n \"Utilisez notre moteur de recherche pour trouver les profils les plus adaptés et contactez-les immédiatement.\",\r\n },\r\n {\r\n step: 3,\r\n title: \"Soyez alerté\",\r\n description:\r\n \"N'attendez plus le dernier moment pour recruter. Définissez vos critères et recevez une alerte dès l'apparition du profil idéal.\",\r\n },\r\n ];\r\n\r\n const testimonials = [\r\n {\r\n name: \"Anthony Mareschi\",\r\n role: \"Fondateur, Rekto\",\r\n quote:\r\n \"DiplomAdvisor nous a permis d'améliorer considérablement l'efficacité de notre sourcing. Quel gain de temps !\"},\r\n {\r\n name: \"Yann Boyer-Durand\",\r\n role: \"DG, SAS BDG\",\r\n quote:\r\n \"Enfin une plateforme qui nous permet d'avoir accès facilement à des profils juniors qualifiés ! Le moteur de recherche par compétences est particulièrement utile.\"},\r\n {\r\n name: \"Alan T.\",\r\n role: \"Alternant ingénieur en conception mécanique\",\r\n quote:\r\n \"Merci pour votre aide ! Je n'aurais probablement pas pu trouver cette offre de contrat d'alternance sans DiplomAdvisor\"},\r\n ];\r\n\r\n const fadeIn = (delay = 0) => ({\r\n hidden: { opacity: 0, y: 50 },\r\n visible: { opacity: 1, y: 0, transition: { duration: 0.5, delay } },\r\n });\r\n\r\n const [inViewSteps, setInViewSteps] = useState(false);\r\n const [inViewPricing, setInViewPricing] = useState(false);\r\n const [inViewTestimonials, setInViewTestimonials] = useState(false);\r\n const [dialogVisible, setDialogVisible] = useState(false);\r\n const [visibleHubSpot, setVisibleHubSpot] = useState(false);\r\n const [formSubmitted, setFormSubmitted] = useState(false);\r\n\r\n const { t } = useTranslation();\r\n\r\n useEffect(() => {\r\n // Charger le script HubSpot une fois que la popup est visible\r\n if (visibleHubSpot) {\r\n const script1 = document.createElement(\"script\");\r\n script1.src = \"//js.hsforms.net/forms/embed/v2.js\";\r\n script1.charset = \"utf-8\";\r\n script1.type = \"text/javascript\";\r\n script1.onload = () => {\r\n if (window.hbspt) {\r\n window.hbspt.forms.create({\r\n portalId: \"20427377\",\r\n formId: \"84b22816-0ad9-4fdb-95a7-2cdf8b540111\",\r\n target: \"#hubspot-form\",\r\n onFormSubmit: () => {\r\n setFormSubmitted(true); // Activer le bouton après la soumission\r\n },\r\n });\r\n }\r\n };\r\n\r\n document.body.appendChild(script1);\r\n\r\n // Nettoyer le script lorsque le composant est démonté\r\n return () => {\r\n document.body.removeChild(script1);\r\n };\r\n }\r\n }, [visibleHubSpot]);\r\n\r\n useEffect(() => {\r\n const observerSteps = new IntersectionObserver(\r\n ([entry]) => {\r\n if (entry.isIntersecting) {\r\n setInViewSteps(true);\r\n }\r\n },\r\n { threshold: 0.2 }\r\n );\r\n\r\n const observerPricing = new IntersectionObserver(\r\n ([entry]) => {\r\n if (entry.isIntersecting) {\r\n setInViewPricing(true);\r\n }\r\n },\r\n { threshold: 0.2 }\r\n );\r\n\r\n const observer = new IntersectionObserver(\r\n ([entry]) => {\r\n if (entry.isIntersecting) {\r\n setInViewTestimonials(true);\r\n }\r\n },\r\n { threshold: 0.2 }\r\n );\r\n\r\n const stepsSection = document.querySelector(\"#steps-section\");\r\n const pricingSection = document.querySelector(\"#pricing-section\");\r\n const testimonialsSection = document.querySelector(\"#testimonials-section\");\r\n\r\n if (stepsSection) observerSteps.observe(stepsSection);\r\n if (pricingSection) observerPricing.observe(pricingSection);\r\n if (testimonialsSection) observer.observe(testimonialsSection);\r\n\r\n return () => {\r\n observerSteps.disconnect();\r\n observerPricing.disconnect();\r\n observer.disconnect();\r\n };\r\n }, []);\r\n\r\n return (\r\n \r\n Créez gratuitement votre compte
} visible={dialogVisible} onHide={() => setDialogVisible(false)}>\r\n \r\n \r\n setVisibleHubSpot(false)}\r\n >\r\n
\r\n {formSubmitted && (\r\n \r\n {\r\n setVisibleHubSpot(false);\r\n setFormSubmitted(false);\r\n setDialogVisible(true);\r\n }}\r\n />\r\n
\r\n )}\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n setDialogVisible(true)}\r\n />\r\n \r\n
\r\n \r\n \r\n
\r\n {images.map((item, index) => (\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n window.open(\"https://meetings.hubspot.com/patrick-musso/demo-da?uuid=732ac826-a453-4cc3-9bf5-10378fe9fc9f\", \"_blank\")\r\n }\r\n />\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n {steps.map((item, index) => (\r\n
\r\n {item.step}
\r\n {item.title} \r\n {item.description}
\r\n \r\n ))}\r\n
\r\n
\r\n setDialogVisible(true)}\r\n />\r\n \r\n
\r\n \r\n\r\n \r\n \r\n {/* Texte principal et bouton */}\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n :\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n : \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n : \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n setVisibleHubSpot(true)}\r\n />\r\n \r\n \r\n\r\n {/* Image */}\r\n
\r\n \r\n \r\n
\r\n \r\n\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n {testimonials.map((testimonial, index) => (\r\n
\r\n \r\n
\r\n
\r\n \r\n
{testimonial.name}
\r\n
{testimonial.role}
\r\n
\"{testimonial.quote}\"
\r\n
\r\n \r\n ))}\r\n
\r\n
\r\n setDialogVisible(true)}\r\n />\r\n \r\n
\r\n \r\n \r\n );\r\n};","import React, { useRef, useState, useEffect, Fragment } from 'react';\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport workers from \"../../images/3D/3d-business-man-and-woman-working-at-the-table.png\";\r\nimport upe06 from \"../../images/partenariat/UPE06.png\";\r\nimport \"./landingPageEntrepriseUpe06.css\"\r\nimport { Divider } from \"primereact/divider\";\r\nimport parse from 'html-react-parser';\r\nimport { enumRoles } from \"../../enums/enumRoles\";\r\nimport { Button } from \"primereact/button\";\r\nimport { FormRegister } from \"../../components/form/formRegister\";\r\nimport { enumCodePartner } from \"../../enums/enumCodePartner\";\r\n\r\nexport const LandingPageEntrepriseUpe06 = (props) => {\r\n\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n
\r\n
\r\n {parse(t('home.company.catchphrase_first'))}
\r\n {parse(t('home.company.catchphrase_second'))}
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n {/*
*/}\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {/*
\r\n
\r\n */}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {/*
*/}\r\n {/*
*/}\r\n
\r\n
\r\n
\r\n
\r\n {/*
*/}\r\n
\r\n )\r\n}","import { Button } from \"primereact/button\";\r\nimport { Dialog } from \"primereact/dialog\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { Fragment, useEffect, useRef, useState } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { EntrepriseOffreBreadCrumb } from \"../../components/breadCrumb/EntrepriseOffreBreadCrumb\";\r\nimport { FilterPanelOffers } from \"../../components/filterPanel/filterPanelOffers\";\r\nimport { EntrepriseOffreEmploiThumbnail } from \"../../components/thumbnail/entrepriseOffreEmploiThumbnail\";\r\nimport OffreEmploiService from \"../../services/offreEmploiService\";\r\nimport Helper from \"../../utils/helper\";\r\nimport \"./entrepriseOffres.css\"\r\nimport RechercheEntrepriseOffres from \"./RechercheEntrepriseOffres\";\r\nimport { ThumbnailPaginator } from \"../../components/paginator/thumbnailPaginator\";\r\nimport UserService from \"../../services/userService\";\r\nimport { useAuthState } from \"../../context/context\";\r\nimport RoleHelper from \"../../utils/roleHelper\";\r\nimport EntrepriseService from \"../../services/entrepriseService\";\r\n\r\nexport const EntrepriseOffres = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const userService = new UserService()\r\n const currentUser = useAuthState();\r\n const [offres, setOffres] = useState([])\r\n const [totalOffresRecords, setTotalOffresRecords] = useState(null)\r\n const [tokenResetFilters, setTokenResetFilters] = useState(null);\r\n const [displayFilterPanel, setDisplayFilterPanel] = useState(false)\r\n const [displayConfirmPaiment, setDisplayConfirmPaiment] = useState(false)\r\n const [loading, setLoading] = useState(true)\r\n const [displayDialog, setDisplayDialog] = useState(false);\r\n const [entreprise, setEntreprise] = useState(null)\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 6,\r\n page: 1,\r\n sortField: 'Pertinence',\r\n sortOrder: 1,\r\n filters: history.location?.state?.filters || []\r\n });\r\n const offreEmploiService = new OffreEmploiService();\r\n const entrepriseService = new EntrepriseService();\r\n const toast = useRef(null)\r\n\r\n useEffect(() => {\r\n getEntrepriseAndAbonnementInfo();\r\n if (history.location.state?.confirmPaiment)\r\n setDisplayConfirmPaiment(true);\r\n }, [])\r\n useEffect(() => {\r\n loadLazyData(lazyParams);\r\n }, [lazyParams])\r\n\r\n const onAddClick = () => {\r\n history.push({ pathname: '/edition_annonce', state: { adminImpersonatingRecruteurId: adminImpersonatingRecruteurId } })\r\n }\r\n\r\n const showError = () => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.loading_failed'), life: 3000 });\r\n }\r\n\r\n const loadLazyData = (_lazyParams) => {\r\n setLoading(true);\r\n setTotalOffresRecords(null);\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then((id) => {\r\n offreEmploiService.getOffreEmploiPaginated(_lazyParams, id)\r\n .then((data) => {\r\n data.items.forEach(offer => {\r\n offer.dateCreation = Helper.dateTimeToLocaleDateTime(offer.dateCreation)\r\n });\r\n setOffres(data.items);\r\n setTotalOffresRecords(data.totalCount);\r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoading(false));\r\n })\r\n .catch(err => {\r\n showError()\r\n setLoading(false)\r\n })\r\n\r\n }\r\n\r\n const getEntrepriseAndAbonnementInfo = () => {\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then((id) => {\r\n userService.getEntreprise(id)\r\n .then((_entreprise) => {\r\n setEntreprise(_entreprise)\r\n // si c'est une première connection on affiche une popup\r\n if (RoleHelper.isEntreprise(currentUser)) {\r\n // if (_entreprise.isRegistrationOnboardingCompleted == false) {\r\n // setDisplayDialog(true);\r\n // _entreprise.isRegistrationOnboardingCompleted = true;\r\n // userService.updateEntreprise(currentUser, _entreprise)\r\n // .then((_entreprise) => {\r\n // // à modifier et optimiser\r\n // })\r\n // }\r\n }\r\n else if (history.location.hash === '#payment_success') {\r\n setDisplayDialog(true);\r\n }\r\n });\r\n })\r\n }\r\n\r\n const contextRecherche = {\r\n lazyParams,\r\n setLazyParams,\r\n rechercheApi: loadLazyData,\r\n totalOffresRecords,\r\n tokenResetFilters\r\n }\r\n\r\n return (\r\n \r\n \r\n {/* first connection dialog */}\r\n
setDisplayDialog(false)}>\r\n \r\n \r\n
\r\n \r\n setDisplayDialog(false)} />\r\n
\r\n \r\n {/* confirm paiment dialog A MODIFIER */}\r\n
setDisplayConfirmPaiment(false)}>\r\n \r\n \r\n
\r\n \r\n setDisplayConfirmPaiment(false)} />\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {/* 1/1 offre(s) d'emploi créée(s) */}\r\n
\r\n
\r\n
{totalOffresRecords && ({totalOffresRecords}) }\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n {loading ? (\r\n
\r\n ) : offres?.length > 0 ? (\r\n
\r\n {offres?.map((offre, indexOffre) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n
\r\n ) : t('search.no_results_matching')}\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n setDisplayFilterPanel(true)} >\r\n {t('general.filters')} \r\n \r\n setDisplayFilterPanel(false)}>\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n )\r\n}","import { Button } from \"primereact/button\";\r\nimport { Dialog } from \"primereact/dialog\";\r\nimport { InputText } from \"primereact/inputtext\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { Fragment, useEffect, useRef, useState } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { EntrepriseOffreBreadCrumb } from \"../../components/breadCrumb/EntrepriseOffreBreadCrumb\";\r\nimport { FilterPanelCandidates } from \"../../components/filterPanel/filterPanelCandidates\";\r\nimport { EntrepriseCandidatThumbnail } from \"../../components/thumbnail/entrepriseCandidatThumbnail\";\r\nimport { EntrepriseOffreEmploiThumbnail } from \"../../components/thumbnail/entrepriseOffreEmploiThumbnail\";\r\nimport OffreEmploiService from \"../../services/offreEmploiService\";\r\nimport Helper from \"../../utils/helper\";\r\nimport \"./entrepriseCandidats.css\"\r\nimport RechercheEntrepriseCandidats from \"./RechercheEntrepriseCandidats\";\r\nimport { useAuthState } from \"../../context/context\"\r\nimport EntrepriseService from \"../../services/entrepriseService\";\r\n\r\nexport const EntrepriseCandidats = () => {\r\n\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const currentUser = useAuthState();\r\n const [offre, setOffre] = useState(null);\r\n const [offreEmploiEtudiants, setOffreEmploiEtudiants] = useState([])\r\n const [totalCandidatsRecords, setTotalCandidatsRecords] = useState(null);\r\n const [statutFilter, setStatutFilter] = useState(history.location?.state?.statut);\r\n const [tokenResetFilters, setTokenResetFilters] = useState(null);\r\n const [displayFilterPanel, setDisplayFilterPanel] = useState(false);\r\n const [loading, setLoading] = useState(true);\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 6,\r\n page: 0,\r\n sortField: 'Pertinence',\r\n sortOrder: 1,\r\n filters: []\r\n });\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId\r\n const offreEmploiService = new OffreEmploiService();\r\n const entrepriseService = new EntrepriseService();\r\n\r\n const toast = useRef(null)\r\n\r\n useEffect(() => {\r\n setLoading(true)\r\n loadOffreEmploi(lazyParams);\r\n }, [])\r\n\r\n const loadOffreEmploi = (_lazyParams) => {\r\n offreEmploiService.getOffreEmploiEntepriseVignette(history.location.state?.id)\r\n .then(_offre => {\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then((id) => {\r\n offreEmploiService.getOffreEmploiEtudiantsOfOffreEmploi(history.location.state.id, _lazyParams, id).then(oee => {\r\n oee.forEach(e => {\r\n e.dateAjout = Helper.dateTimeToLocaleDateTime(e.dateAjout)\r\n if (e.etudiant.rechercheActiveCalendrier)\r\n e.etudiant.rechercheActiveCalendrier = Helper.dateTimeToLocaleDateTime(e.etudiant.rechercheActiveCalendrier)\r\n });\r\n _offre.dateCreation = _offre?.dateCreation ? (Helper.dateTimeToLocaleDateTime(_offre?.dateCreation)) : null\r\n setTotalCandidatsRecords(oee.length)\r\n _offre.offreEmploiEtudiants = oee\r\n setOffre(_offre)\r\n setOffreEmploiEtudiants(oee)\r\n })\r\n .finally(() => setLoading(false))\r\n })\r\n })\r\n\r\n }\r\n\r\n const contextRecherche = {\r\n lazyParams,\r\n setLazyParams,\r\n rechercheApi: loadOffreEmploi,\r\n totalCandidatsRecords,\r\n tokenResetFilters\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
{({offreEmploiEtudiants?.filter(oee => { if (statutFilter) return oee.statut == statutFilter; else return true }).length}) }\r\n\r\n
\r\n
\r\n {loading ? (\r\n
\r\n ) : (\r\n <>\r\n
\r\n {offreEmploiEtudiants?.filter(oee => { if (statutFilter) return oee.statut == statutFilter; else return true }).map((oee, index) => (\r\n
\r\n \r\n \r\n ))}\r\n >\r\n )}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n setDisplayFilterPanel(true)} >\r\n {t('general.filters')} \r\n \r\n setDisplayFilterPanel(false)}>\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n )\r\n}","import { Button } from \"primereact/button\";\r\nimport { Dialog } from \"primereact/dialog\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { Fragment, useEffect, useRef, useState } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\";\r\nimport \"./entrepriseProjets.css\"\r\nimport RechercheEntrepriseOffres from \"./RechercheEntrepriseOffres\";\r\nimport { ThumbnailPaginator } from \"../../components/paginator/thumbnailPaginator\";\r\nimport { FilterPanelProjects } from \"../../components/filterPanel/filterPanelProjects\";\r\nimport { EntrepriseProjetBreadCrumb } from \"../../components/breadCrumb/EntrepriseProjetBreadCrumb\";\r\nimport { EntrepriseProjetThumbnail } from \"../../components/thumbnail/entrepriseProjetThumbnail\";\r\nimport ProjetService from \"../../services/projetService\";\r\nimport { EntrepriseProjetForm } from \"./entrepriseProjetForm\";\r\nimport EntrepriseService from \"../../services/entrepriseService\";\r\n\r\nexport const EntrepriseProjets = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const [projets, setProjets] = useState([])\r\n const [totalProjetsRecords, setTotalProjetsRecords] = useState(null)\r\n const [tokenResetFilters, setTokenResetFilters] = useState(null);\r\n const [displayFilterPanel, setDisplayFilterPanel] = useState(false)\r\n const [displayAddProject, setDisplayAddProject] = useState(false);\r\n const [loading, setLoading] = useState(true)\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId;\r\n const lazyParamsDefault = {\r\n first: 0,\r\n rows: 6,\r\n page: 1,\r\n sortField: 'Pertinence',\r\n sortOrder: 1,\r\n filters: []\r\n }\r\n const [lazyParams, setLazyParams] = useState(lazyParamsDefault);\r\n const projetService = new ProjetService();\r\n const entrepriseService = new EntrepriseService();\r\n\r\n const toast = useRef(null)\r\n\r\n useEffect(() => {\r\n loadLazyData(lazyParams);\r\n }, [lazyParams])\r\n\r\n const showError = () => {\r\n toast.current.show({ severity: 'error', summary: t('general.failed'), detail: t('general.loading_failed'), life: 3000 });\r\n }\r\n\r\n const loadLazyData = (_lazyParams) => {\r\n setLoading(true);\r\n setTotalProjetsRecords(null);\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then((id) =>{\r\n projetService.getProjetsPaginated(_lazyParams,id)\r\n .then((data) => {\r\n setProjets(data.items);\r\n setTotalProjetsRecords(data.totalCount);\r\n setDisplayAddProject(false)\r\n })\r\n .catch(err => showError())\r\n .finally(() => setLoading(false))\r\n })\r\n .catch(err => showError())\r\n }\r\n\r\n const onShowAddProject = () => {\r\n setDisplayAddProject(true)\r\n }\r\n\r\n const onHideAddProject = () => {\r\n setDisplayAddProject(false)\r\n }\r\n\r\n const onSave = () => {\r\n setLazyParams(lazyParamsDefault)\r\n }\r\n\r\n\r\n const contextRecherche = {\r\n lazyParams,\r\n setLazyParams,\r\n rechercheApi: loadLazyData,\r\n totalProjetsRecords,\r\n tokenResetFilters\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
{totalProjetsRecords && ({totalProjetsRecords}) }\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n {loading ? (\r\n
\r\n ) : projets?.length > 0 ? (\r\n
\r\n
\r\n {projets?.map((projet, indexProjet) => (\r\n
\r\n \r\n \r\n \r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n ) : t('search.no_results_matching')}\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n setDisplayFilterPanel(true)} >\r\n {t('general.filters')} \r\n \r\n setDisplayFilterPanel(false)}>\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n )\r\n}","import { Button } from \"primereact/button\";\r\nimport { Dialog } from \"primereact/dialog\";\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { Toast } from \"primereact/toast\";\r\nimport { Fragment, useEffect, useRef, useState } from \"react\";\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { EntrepriseOffreBreadCrumb } from \"../../components/breadCrumb/EntrepriseOffreBreadCrumb\";\r\nimport { FilterPanelCandidates } from \"../../components/filterPanel/filterPanelCandidates\";\r\nimport { EntrepriseCandidatThumbnail } from \"../../components/thumbnail/entrepriseCandidatThumbnail\";\r\nimport Helper from \"../../utils/helper\";\r\nimport RechercheEntrepriseCandidats from \"./RechercheEntrepriseCandidats\";\r\nimport EntrepriseService from \"../../services/entrepriseService\";\r\nimport ProjetService from \"../../services/projetService\";\r\nimport { CandidatStatutSelectButton } from \"../../components/selectButton/candidatStatutSelectButton\";\r\nimport { EntrepriseProfilBreadCrumb } from \"../../components/breadCrumb/EntrepriseProfilBreadCrumb\";\r\n\r\nexport const ProfilsRecherche = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const [offreEmploiEtudiants, setOffreEmploiEtudiants] = useState([])\r\n const [totalCandidatsRecords, setTotalCandidatsRecords] = useState(null);\r\n const [statutFilter, setStatutFilter] = useState(history.location?.state?.statut);\r\n const [tokenResetFilters, setTokenResetFilters] = useState(null);\r\n const [displayFilterPanel, setDisplayFilterPanel] = useState(false);\r\n const [loading, setLoading] = useState(true);\r\n const [lazyParams, setLazyParams] = useState({\r\n first: 0,\r\n rows: 6,\r\n page: 0,\r\n sortField: 'Pertinence',\r\n sortOrder: 1,\r\n filters: history.location?.state?.filters || []\r\n });\r\n const entrepriseService = new EntrepriseService();\r\n const projetService = new ProjetService();\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId;\r\n\r\n const toast = useRef(null)\r\n\r\n useEffect(() => {\r\n loadOffreEmploi(lazyParams);\r\n }, [])\r\n\r\n function formatDate(inputDate) {\r\n const date = new Date(inputDate);\r\n\r\n // Obtenez le jour, le mois et l'année de la date\r\n const day = date.getDate();\r\n const month = date.getMonth() + 1\r\n const year = date.getFullYear();\r\n\r\n // Formatez les parties de la date pour qu'elles aient toujours deux chiffres\r\n const formattedDay = String(day).padStart(2, '0');\r\n const formattedMonth = String(month).padStart(2, '0');\r\n\r\n // Créez la chaîne de date au format 'JJ/MM/AAAA'\r\n const formattedDate = `${formattedDay}/${formattedMonth}/${year}`;\r\n\r\n return formattedDate;\r\n }\r\n\r\n function parseDate(dateString) {\r\n const parts = dateString.split(\"/\");\r\n const day = parseInt(parts[0], 10);\r\n const month = parseInt(parts[1], 10) - 1;\r\n const year = parseInt(parts[2], 10);\r\n return new Date(year, month, day);\r\n }\r\n\r\n const loadOffreEmploi = (_lazyParams) => {\r\n setLoading(true)\r\n entrepriseService.getEntreprisesOfRecruteur(adminImpersonatingRecruteurId).then((id) => {\r\n entrepriseService.getEntrepriseEtudiant(id)\r\n .then(ee => {\r\n ee.forEach(e => {\r\n e.dateAjout = Helper.dateTimeToLocaleDateTime(e.dateAjout)\r\n if (e.etudiant.rechercheActiveCalendrier)\r\n e.etudiant.rechercheActiveCalendrier = Helper.dateTimeToLocaleDateTime(e.etudiant.rechercheActiveCalendrier)\r\n });\r\n\r\n if (_lazyParams.filters.length > 0) {\r\n // alors on filtre en fonction de la categorie présente dans chaque tableau\r\n _lazyParams.filters.forEach(f => {\r\n switch (f.categorie) {\r\n case 17:\r\n // calendrier\r\n const formattedDate = formatDate(f.value);\r\n ee = ee.filter(e => {\r\n if (!e.etudiant.rechercheActiveCalendrier) {\r\n // Si l'étudiant n'a pas de disponibilité définie, le filtrer\r\n return false;\r\n }\r\n return parseDate(e.etudiant.rechercheActiveCalendrier) <= parseDate(formattedDate);\r\n });\r\n break;\r\n case 206:\r\n // projet \r\n projetService.getEtudiantByProjet(f.value)\r\n .then((data) => {\r\n // on tri les etudiants en fonction de leur projet\r\n ee = ee.filter(e => data.some(d => d.etudiantId === e.etudiantId));\r\n setTotalCandidatsRecords(ee.length)\r\n setOffreEmploiEtudiants(ee)\r\n })\r\n break;\r\n default:\r\n break;\r\n }\r\n })\r\n }\r\n setTotalCandidatsRecords(ee.length)\r\n setOffreEmploiEtudiants(ee)\r\n })\r\n .finally(() => setLoading(false))\r\n })\r\n }\r\n\r\n const contextRecherche = {\r\n lazyParams,\r\n setLazyParams,\r\n rechercheApi: loadOffreEmploi,\r\n totalCandidatsRecords,\r\n tokenResetFilters\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n {({offreEmploiEtudiants?.filter(oee => { if (statutFilter) return oee.statut == statutFilter; else return true }).length}) } \r\n
\r\n
\r\n {loading ? (\r\n
\r\n ) : (\r\n <>\r\n
setStatutFilter(value)}\r\n />\r\n \r\n {offreEmploiEtudiants?.filter(oee => { if (statutFilter) return oee.statut == statutFilter; else return true }).map((oee, index) => (\r\n \r\n loadOffreEmploi(e)} lazyParams={lazyParams} isInAList />\r\n \r\n ))}\r\n >\r\n )}\r\n \r\n
\r\n
\r\n
\r\n
\r\n setDisplayFilterPanel(true)} >\r\n {t('general.filters')} \r\n \r\n setDisplayFilterPanel(false)}>\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n )\r\n}","import React, { useState, useEffect, useRef } from 'react';\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { SimpleSearchBar } from './bar/simpleSearchBar';\r\nimport { HeaderHome } from './headerHome/headerHome';\r\nimport { BodyHomeNotConnected } from './notConnected/bodyHomeNotConnected';\r\nimport { HeaderHomeEcole } from './ecole/headerHomeEcole';\r\nimport { BodyHomeEcole } from './ecole/bodyHomeEcole';\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { Link } from \"react-router-dom\";\r\nimport \"./home.css\";\r\nimport RoleHelper from '../../utils/roleHelper';\r\nimport Helper from '../../utils/helper';\r\nimport { HeaderHomeEntreprise } from './entreprise/headerHomeEntreprise';\r\nimport { BodyHomeEntreprise } from './entreprise/bodyHomeEntreprise';\r\nimport StatistiquesService from '../../services/statistiquesService';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { SecteursPorteurs } from './secteursPorteurs/secteursPorteurs'\r\nimport { DomaineSelector } from './courses/domaineSelector';\r\nimport { CarouselComponent } from '../../components/carouselComponent/carouselComponent';\r\nimport { enumCategorieRechercheAffinee } from \"../../enums/enumCategorieRechercheAffinee\"\r\nimport ComposanteService from \"../../services/composanteService\"\r\nimport OffreEmploiService from '../../services/offreEmploiService';\r\nimport { DisplayImage } from \"../../components/image/displayImage\"\r\nimport { LikeOffreEmploi } from '../../components/likeoffreemploi/likeoffreemploi';\r\nimport { Toast } from \"primereact/toast\";\r\nimport { Button } from 'primereact/button';\r\nimport { JobLocationFormater } from '../../components/formater/jobLocationFormater';\r\nimport { DialogInspireMe } from './dialogInspireMe/dialogInspireMe';\r\nimport { OffreEmploiThumbnail } from '../../components/thumbnail/offreEmploiThumbnail';\r\nimport { DipTag } from '../../components/tag/dipTag';\r\n\r\n\r\nexport const Home = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const currentUser = useAuthState();\r\n const history = useHistory();\r\n const toast = useRef(null)\r\n\r\n const [composanteEcoles, setComposanteEcoles] = useState([]);\r\n const [offreEmploi, setOffresEmploi] = useState([]);\r\n const composanteService = new ComposanteService();\r\n const offreEmploiService = new OffreEmploiService();\r\n const titreCarouselFormations = \"formation.formations_by_school\";\r\n const titreCarouselOffresEmploi = \"formation.last_offers\";\r\n const [visible, setVisible] = useState(false);\r\n\r\n useEffect(() => {\r\n if(RoleHelper.isEntreprise(currentUser)){\r\n // si première connexion grace au register alors state est égal à firstConnection et si c'est la cas, alors on redirige vers /profile_company\r\n const destination = history.location.state === \"firstConnection\" ? { pathname: '/profile_company', state: \"firstConnection\" } : '/offers';\r\n history.push(destination);\r\n }\r\n getComposanteEcoles();\r\n getOffresEmplois();\r\n }, [])\r\n\r\n\r\n const responsiveOptions = [\r\n {\r\n breakpoint: '1120px',\r\n numVisible: 3,\r\n numScroll: 1\r\n },\r\n {\r\n breakpoint: '860px',\r\n numVisible: 2,\r\n numScroll: 1\r\n },\r\n {\r\n breakpoint: '610px',\r\n numVisible: 1,\r\n numScroll: 1\r\n }\r\n ];\r\n\r\n function getComposanteEcoles() {\r\n composanteService.getPartneredSchoolsRandomized()\r\n .then((composantes) => {\r\n setComposanteEcoles(composantes)\r\n })\r\n .catch()\r\n .finally(() => {\r\n })\r\n }\r\n\r\n function getOffresEmplois() {\r\n offreEmploiService.getOffreEmploiMatchingFormationLastFifty()\r\n .then((offreEmploi) => {\r\n offreEmploi.forEach((offre) => {\r\n offre.dateCreation = Helper.dateTimeToLocaleDateTime(offre.dateCreation)\r\n })\r\n setOffresEmploi(offreEmploi)\r\n })\r\n }\r\n\r\n\r\n const searchFormation = (composante) => {\r\n history.push({ pathname: '/rechercheAffinee', state: { filters: [{ label: composante.nom, value: new String(composante.id), categorie: enumCategorieRechercheAffinee.Composante, type: null }] } })\r\n }\r\n\r\n const composantesTemplate = (composante) => {\r\n return (\r\n searchFormation(composante)}>\r\n
\r\n
\r\n
\r\n {composante.logoId ?\r\n
\r\n :\r\n composante.ecole?.logoId ?\r\n
\r\n :\r\n
\r\n }\r\n
\r\n
\r\n
\r\n
\r\n 1 ? (t('formation.see_x_courses', { number: composante.nbFormations })) : (composante.nbFormations == 1 ? t('formation.see_course') : t('formation.see_courses'))} />\r\n
\r\n
\r\n );\r\n }\r\n const offresEmploiTemplate = (offreEmploi) => {\r\n return \r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n {(RoleHelper.isNotConnected(currentUser) || RoleHelper.isEtudiant(currentUser)) &&\r\n
\r\n }\r\n {RoleHelper.isNotConnected(currentUser) &&
}\r\n {(RoleHelper.isAdminEcole(currentUser) || RoleHelper.isAdminComposante(currentUser)) &&
}\r\n {RoleHelper.isEtudiant(currentUser) &&
}\r\n {RoleHelper.isEntreprise(currentUser) && }\r\n \r\n \r\n \r\n {RoleHelper.isNotConnected(currentUser) &&
}\r\n {(RoleHelper.isAdminEcole(currentUser) || RoleHelper.isAdminComposante(currentUser)) &&
}\r\n {RoleHelper.isEntreprise(currentUser) &&
}\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n )\r\n}\r\n","import React from 'react';\r\n\r\nexport const NotFound = () => {\r\n return(\r\n \r\n \r\n
This page could not be found \r\n \r\n )\r\n}","import React, { useRef} from 'react';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { useAuthState } from \"../../context/context\";\r\nimport { enumRoles } from '../../enums/enumRoles';\r\nimport \"./menuDashboard.css\";\r\nimport { Link, NavLink } from 'react-router-dom';\r\nimport { Toast } from 'primereact/toast';\r\nimport { IoSchoolOutline, IoBusinessOutline, IoDocumentTextOutline, IoPerson, IoBriefcaseSharp, IoSearchOutline, IoMailOutline } from \"react-icons/io5\";\r\nimport RoleHelper from '../../utils/roleHelper';\r\n\r\nexport const MenuDashboard = (props) => {\r\n const { t } = useTranslation();\r\n const toast = useRef(null);\r\n const currentUser = useAuthState();\r\n const isAdmin = currentUser?.roles?.indexOf(enumRoles.ADMINISTRATEUR) > -1;\r\n const isSuperAdmin = currentUser?.roles?.indexOf(enumRoles.SUPERADMINISTRATEUR) > -1;\r\n const isAdminEcole = currentUser?.roles?.indexOf(enumRoles.ADMINISTRATEURECOLE) > -1;\r\n const isAdministrateurComposante = RoleHelper.isAdminComposante(currentUser);\r\n const isEditeur = currentUser?.roles?.indexOf(enumRoles.EDITEURECOLE) > -1;\r\n const isEtudiant = currentUser?.roles?.indexOf(enumRoles.ETUDIANT) > -1;\r\n const isEntreprise = currentUser?.roles?.indexOf(enumRoles.ENTREPRISE) > -1;\r\n\r\n const gestionFormations = {\r\n label: t('formation.formations_management'),\r\n lightLabel: t('formation.formations'),\r\n path: 'AdminFormations',\r\n icon: \r\n }\r\n\r\n const ecole = {\r\n label: t('general.school'),\r\n lightLabel: t('general.school'),\r\n path: 'edition_fiche_ecole',\r\n icon: \r\n }\r\n\r\n const composantes = {\r\n label: t('school.components'),\r\n lightLabel: t('school.components'),\r\n path: 'composantes',\r\n icon: \r\n }\r\n\r\n const gestionAdministrateurPlateforme = {\r\n label: t('administrator.admins_management.full'),\r\n lightLabel: t('administrator.admins_management.light'),\r\n path: 'administrateurs'\r\n }\r\n\r\n const gestionFormationsOrphelines = {\r\n label: t('formation.orphans_management.full'),\r\n lightLabel: t('formation.orphans_management.light'),\r\n path: 'formationsOrphelines'\r\n }\r\n\r\n const gestionEcoleEtComposante = {\r\n label: t('school.school_management.full'),\r\n lightLabel: t('school.school_management.light'),\r\n path: 'ecoles',\r\n }\r\n\r\n const gestionAdminsEcoleComposante = {\r\n label: t('administrator.admins_composante_ecole_management.full'),\r\n lightLabel: t('administrator.admins_composante_ecole_management.light'),\r\n path: 'administrateursComposanteEtEcole',\r\n }\r\n\r\n const gestionEditeur = {\r\n label: t('editor.editors_management.full'),\r\n lightLabel: t('editor.editors_management.light'),\r\n path: 'editeurs',\r\n icon: \r\n }\r\n\r\n const gestionEtudiants = {\r\n label: t('student.students_management.full'),\r\n lightLabel: t('student.students_management.light'),\r\n path: 'etudiants'\r\n }\r\n\r\n const gestionCVEtudiants = {\r\n label: t('student.cv_students_management.full'),\r\n lightLabel: t('student.cv_students_management.light'),\r\n path: 'cv_etudiants',\r\n }\r\n\r\n const gestionDemandesDeFormations = {\r\n label: t('student.coursesRequests_students_management.full'),\r\n lightLabel: t('student.coursesRequests_students_management.light'),\r\n path: 'demandeFormation_etudiants'\r\n }\r\n\r\n const gestionEntreprises = {\r\n label: t('company.companies_management.full'),\r\n lightLabel: t('company.companies_management.light'),\r\n path: 'entreprises',\r\n icon: \r\n }\r\n\r\n const importExport = {\r\n label: t('general.import_export.full'),\r\n lightLabel: t('general.import_export.light'),\r\n path: 'import_export'\r\n }\r\n\r\n\r\n\r\n\r\n let itemsAdminEcole = [ecole,composantes, gestionFormations]\r\n\r\n let itemsAdminComposante = [composantes,gestionFormations]\r\n\r\n let itemsAdmin = [gestionFormations,gestionFormationsOrphelines,gestionEcoleEtComposante,gestionAdminsEcoleComposante,gestionEditeur,\r\n gestionEtudiants,gestionCVEtudiants,gestionDemandesDeFormations,gestionEntreprises,importExport]\r\n\r\n let itemsSuperAdmin = [gestionAdministrateurPlateforme,gestionFormations,gestionFormationsOrphelines,gestionEcoleEtComposante,\r\n gestionAdminsEcoleComposante,gestionEditeur,gestionEtudiants,gestionCVEtudiants,gestionDemandesDeFormations,gestionEntreprises,importExport]\r\n\r\n let itemsEtudiant = [\r\n {\r\n label: t('offers.matching_offers.full'),\r\n lightLabel: t('offers.matching_offers.light'),\r\n path: 'offresCompatibles',\r\n icon: \r\n },\r\n {\r\n label: t('application.my_applications.full'),\r\n lightLabel: t('application.my_applications.light'),\r\n path: 'candidatures',\r\n icon: \r\n },\r\n {\r\n label: t('profile.formation.reshearch'),\r\n lightLabel: t('profile.formation.plural'),\r\n path: 'rechercheAffinee',\r\n icon: \r\n },\r\n {\r\n label: t('general.myProfile.full'),\r\n lightLabel: t('general.myProfile.light'),\r\n path: 'profile_student',\r\n icon: \r\n }\r\n // {\r\n // label: t('favorite.myFavorites.full'),\r\n // lightLabel: t('favorite.myFavorites.light'),\r\n // path: 'formationsFavorites',\r\n // icon: \r\n // }\r\n //CHAT-COMMENTE\r\n // ,\r\n // {\r\n // label: t('Messagerie'),\r\n // lightLabel: t('Messagerie'),\r\n // path: 'Messagerie',\r\n // icon: \r\n // }\r\n ]\r\n\r\n let itemsEntreprise = [\r\n {\r\n label: t('general.myAccount.full'),\r\n lightLabel: t('general.myAccount.light'),\r\n path: 'profile_company',\r\n icon: \r\n },\r\n {\r\n label: t('search.formations_search_short.full'),\r\n lightLabel: t('search.formations_search_short.light'),\r\n path: 'rechercheAffinee',\r\n newTab: true,\r\n icon: \r\n },\r\n {\r\n label: t('favorite.myFavorites.full'),\r\n lightLabel: t('favorite.myFavorites.light'),\r\n path: 'formationsFavorites',\r\n icon: \r\n },\r\n {\r\n label: t('company.recruitments.full'),\r\n lightLabel: t('company.recruitments.light'),\r\n path: 'recrutements',\r\n icon: \r\n }\r\n //CHAT-COMMENTE\r\n // ,\r\n // {\r\n // label: t('Messagerie'),\r\n // lightLabel: t('Messagerie'),\r\n // path: 'Messagerie',\r\n // icon: \r\n // }\r\n ]\r\n\r\n let activeItems = isSuperAdmin ?\r\n (itemsSuperAdmin)\r\n :\r\n (isAdmin ?\r\n (\r\n itemsAdmin\r\n )\r\n :\r\n (isAdminEcole ?\r\n (\r\n itemsAdminEcole\r\n )\r\n :\r\n (isAdministrateurComposante ? (\r\n itemsAdminComposante\r\n ) : (\r\n isEtudiant ? (\r\n itemsEtudiant\r\n ) : (\r\n isEntreprise ? (\r\n itemsEntreprise\r\n ) : (\r\n []\r\n )\r\n )\r\n )\r\n )\r\n )\r\n )\r\n\r\n return (\r\n <>\r\n \r\n \r\n
{t('general.myDashboard').toUpperCase()} \r\n {activeItems.map((item) =>\r\n
\r\n \r\n {typeof item.icon == 'string' && }\r\n {typeof item.icon == 'object' && item.icon}\r\n {item.lightLabel.toUpperCase()} \r\n {item.label.toUpperCase()} \r\n \r\n \r\n )}\r\n
\r\n >\r\n )\r\n}\r\n","export const Tel = (props) => {\r\n\r\n const buildTel = () => \r\n {\r\n var toRet = `tel:${props.to}`;\r\n return toRet;\r\n }\r\n\r\n return (<>\r\n {props.label} \r\n >)\r\n}","import { Divider } from \"primereact/divider\"\r\nimport logo from \"../../logo.png\"\r\nimport { IoBusinessOutline } from 'react-icons/io5';\r\nimport { IoCall } from 'react-icons/io5';\r\nimport { IoMailOutline } from 'react-icons/io5';\r\nimport { IoLogoLinkedin } from 'react-icons/io5';\r\nimport { IoLogoFacebook } from 'react-icons/io5';\r\nimport { IoLogoInstagram } from 'react-icons/io5';\r\nimport { Link, useHistory } from 'react-router-dom';\r\nimport { enumRoles } from \"../../enums/enumRoles\";\r\nimport \"./footer.css\"\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { Mailto } from \"../mailto/mailto\";\r\nimport { Tel } from \"../tel/tel\";\r\n\r\n\r\nexport const Footer = (props) => {\r\n\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n const onInscriptionEtudiantClick = () => {\r\n history.push({ pathname: '/register?User=Student', state :{ userType : enumRoles.ETUDIANT, previousUrl : history.location.pathname + history.location.search }});\r\n }\r\n\r\n const onInscriptionEntrepriseClick = () => {\r\n history.push({ pathname: '/register?User=Company', state :{ userType : enumRoles.ENTREPRISE, previousUrl : history.location.pathname + history.location.search }});\r\n }\r\n const onLinkedinClick = () => {\r\n var win = window.open(\"https://www.linkedin.com/company/diplomadvisor\")\r\n win.focus();\r\n }\r\n\r\n const onFacebookClick = () => {\r\n var win = window.open(\"https://www.facebook.com/diplomadvisor/\")\r\n win.focus();\r\n }\r\n\r\n const onInstagramClick = () => {\r\n var win = window.open(\"https://www.instagram.com/diplomadvisor/\")\r\n win.focus();\r\n }\r\n\r\n const onPDCClick = () => {\r\n history.push(\"/confidentiality\");\r\n }\r\n\r\n const onCookiesClick = () => {\r\n props.setCookieRefresh(new Date());\r\n }\r\n\r\n const onGuaraniClick = () => {\r\n var win = window.open(\"https://www.guarani.fr\")\r\n win.focus();\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
Siège : Campus Azur, 250 Rue Albert Einstein
\r\n
Bât. 2. Laboratoire GREDEG
\r\n
06560 Valbonne, France
\r\n
\r\n
DiplomAdvisor SAS
\r\n
Siret : 89489743800012
\r\n
RCS : Grasse B 894 897 438
\r\n
Capital social : 10 000,00 €
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {t('footer.student_register')}\r\n
\r\n
\r\n {t('footer.company_register')}\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
{t('footer.cgu')}
\r\n
{t('footer.pc')}
\r\n
onCookiesClick()}>{t('footer.cookies')}
\r\n
\r\n
© {new Date().getFullYear()} DiplomAdvisor - Créé par
Guarani SAS \r\n
\r\n
\r\n
\r\n
\r\n )\r\n}","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAe4AAABWCAMAAAA+J4XIAAAApVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+4/eNVAAAANnRSTlMAQB/2BdWUGPp+2+2+oAkS6ClzWV5NRw1/8a7fUi/EuIQHj4rJpiTOebJpVZ1uHDOZN+PSO2OdHixhAAALOklEQVR42uzc6XaaUBSG4Y0QIaAyqKDgFMeoMdEYv/u/tC6weoADCHVlmVCef00ssvNSRhuqVFK0ditPnS2p8j+QPfjELVXKr7XCmTikSulNcDGnStnVRFx1qFJyLhjDoUqpCQibUKXUVggTa1QpsQ2iXKqUl64hRqBKaU0Rd6RKWZkKOBuqlNQYPE2nSinZSDKlShlJT0iimFQpIQvJxlQpH72PFF2qlM4eaVSJKiUzRDqLvpE8ECQqQtquRzL9QMvZyCow80M1kK4v07fp9oG5TrnpMwPAD7yXbzcA1IvM/EBbZNnTd2lpAFAv9MjuZ+ZusEFyzvw4LQ+ZhvRNPuBb/Ve52cyP8oxsDfomMnzuf5Wbzfwg7yJu2NI3mQIQP35sbrNhFcpdZOaHWeAWr0UFCGKIoa4a7mRrSpSos6ib9GNzN9HX78mdMfPDHHDbMxVrwhMXNqX4sblrCvBaKPcvMMdt4nvhJuqbr+mOVPxlWL8sdx2A8VKu3B3ksSjcpEkXesfF2dz8TbllEQBOpcrtGMjlUDx3iLlGQGn/otwT+J5KlXuCfObFc0e0xXPvwa/J7fQR6JYod01ETqf7ctNBO/e2f0vuV5yNSpTbRV6Gc19uEhT4NJnCpEFPIEbe9XQK6MJut13my90StrvXUzf6an6RZG6tQeRF+qFtCS1K0jLQn8P3RWmkw3a3ObSK5WYzM5I5sKzOgZi848m7DwrUutbGdm6VyW92Z26ywH2jNjHCV3m2q/yNKcwRmHdv5+6sRZypdfYtbpGO5cHXuObrruFTXJ14G2BmZ94BO+z/7rBGw0tuNqZJcXscIzMzy4WCgDFlvfKMJw3WCibBmCP4+jOdMhyRn7i8Mzc9IfAV+8ozF1Me42pyI3f3CYDxVneDmKKVtjvY9GOLFDxceEPiqBBlOrJ0ce8LAMp8ujYApTdiuR0tcXxdxCk+c0CqKxCb1nZT1wBPICZrPDbdgshZXyM5lG6DItx7c28RWN/KvVQR4joZuaU9gM8v9hASq4+k3LUGfKz3yzT7E7dtYH+5Sn1LeYypbIJV6/RxVg+d/So17sGE8ZKYuw40ZPK1LIWd29wYj003otpTrgtmXUMhwp25yWNbYEZu04Bq2Wb7zUCgkZ7baQBQr3+ewffK5z5o8CZd054pCAzJBUY72+y+sVIRRyhLIukzWGGZ4jYKIF7KvD9dF8Ku16fcqcAzJeU+AZ/OdXU1iAfKMx6bzpBWgDauT10DsCndFMUc781dR6CdmfvgaW0KvKsIdFNzuwA0Of4Gnfi6nERvQIEvA75mD2OTAgMx6RO3NrBgB+JJwr99KKzLULnkZmsh6hR2gqgn5jaAPV0dFKwo13hsujr6VrDBvFhe9n8bKWhzZ+4uAovM3OrTkijS+5iW+xUAesRIx6DdMH4u2nSiBxQlNEovabQRMGQHYs2hiKEY22/2IrlrClsvNuk+ceZl7ChpHd8p33hsOuP6BZ3SjVGUpt+XW0dgnpnbkyleq8PlZk9u+zp/NtKIb//cIwIrspvlPrLzdT3DmMRezlbbJMaMvs0CALRWdG9hJs7cASC2iHGIco8ngOW/pYvi6vflJuUcNDP3F38yP0/OveePkboCn83/hegB8IWYMX8zZQ18hQ/EnxKFnPgTVzHy0xnCt4u8x5ifmS2rRZw84wn5r5AlFcUp5n25DfiU7FM1/lq9z72Czd5Oum/UTF9kh8s9AwCVQoah/G/8L6r55O8yzq+52RbkSeEF2vzMbMsYRYbONR6b7p1ysPAvxvflVhGQMnPzM0OOv4KF+0jaZ2lS6iIHXO4el3sB2NH99JGbT8i6iSrEtpEmjimbuCTCp0xlYvKOJ7Afzg3yn/bOvDtNIAjgo4AYaFCDeMQqRjzwPmLm+3+0vrqpUw73Iq+Ptvz+9EHI8HN3h91xGaIWQSHdLvtvJVs3PbvV0kdQFU4/Nz0YF9G9TKTHa9Z/pvPjA083zBOLaXYTu/kx0xqVsRsDIQpPVfcJ9XDMIrrxhqWge055c/oIh/r5THrQK6L7lOhDr+mH//ebHeDqZlcJ7krb5iPd5oRKQGtA8MNT1D1GXV4K6LY/w5LUTYNVnHcE6588SHKhflRTt20k5APzcU52URe+brCQ8j/PpRgzuuEwxztzEs4PT1H3N9RlaBd+7h4o6G48bN0e3ljm1mJtC+iOEA33NwykTJyu+8bX/YH0lLFBo5XRTZgREg3mVxSemu4t6rMrPKt2VNAdP7Rn5s/srulTPd39bFZDN56u2+HrNi+0PODgCXJ0E+M13rFaIBGekm5vhAU4aummxLwNCrqfqJWkj2jn7uX5TG70dMeIOz8By6ZOyV62x9FNTz5j1qd18nUTZxIegkR4SrqfsAgTLd3Ul08ldVN4TS/viBUN6+kb3wZt3V47U1xujhKT4BZNonB00zroBNfA080Yv1J2JA5PRffBwEL4GropALevovvb41m1KPfLN6KLa+nepKapsgslJzaW83XTOugRscbRTdTeKZMVhKeke4HFuHhaurtIzUJGN2Wice4R5/QgSkNeoK6bWnIzef9oocRLJD5LgW7bYJ8tcAVSusFjCfRQHJ6K7ivm4UyvNX+CUgx0dI8N9nU1Obozt/FAZXJZe1bO5lBnmgPT0t1FPD2q190narVPPN20DnpsYldKN708oC4MT0X3HHPYsRvgowzGQV13naWHTgsEugNIz2dv8uzRjKKX6bm+a+mmsoYMdvP3SfANuwm2QPfydlIbLyZPt2enRw1DGJ6K7i53LnyPMiyUdddclpUvQaQ7Su8Q5JiP7IWZ0aHepGFVR3fwILZdImmx2D3zeLpp0IyBE3NrPn9LzX5NhOEp6O63+c01RBmuarrtWZP15AcQ6nbrKRPbh/ZaDusvk4m809fTTWUNWTqJH+EHmPK9QdKdkodGixfzPHGnevR954SnojvCHAaqNS4rBd1er2HgjakJYt248hJ92wIe2+uMbqnj8fdyrFEHtHXXMmt+mYUSarf3ksL6K2Z0U9NpcGO+Gognk65COjnhyeteGqJUu4EyfIh0W7Mbu/X884rN5w6AjG4csU7zbcom8Xj2vNmtAey92wkNRFzZoKmb+bnyggpT61jG896PQ0THIbHpk5bcmKFm4K+6uX6DXvHECU9F9yvmsFWvT233ebqzOLM6gJRu56fw12kcGojofgDfHpxvf8N9fnpptBGHsQd6uqmsgZfg3l1sDbxjRB6N3emT1sDXDccVIq5j/2PWRsT3GoBkeKRbRQWFqJStRZLXGI7m4a57AEL03O1P6OGwBSLd8Bav6HgKXUf3AjHgLzMsyFKIDGdgZ1M1uliNFzNjY+Enoy4QwvDEut8lJsFNC8XQ80phsm4O3+No9tIdgyT2dj+NXvwO/FEO3XgW+3Xg0euBDPVuHD3559YXh7eRWuLqoQxrSPN37c3w79Ny5Raw1yhDD6DSXWYakuUpyyZKYJmV7jLTacoWn0Uow77SXWZCzCHQ37HFbVW6y0ugUDj+gTI0Kt2lxXRUfhaykvtRSaW7rLwotc8ryhBWukuKPVQbfRcoQ1DpLic7zGFTtKDNMSvdZeSIOVjAYYAyxPB12N2feFBRmInyvJh3QQmGpXwPzP+Or7GVko8y7KCibHgXnTWtCcpwhIqSMdDaBvGIMkygolwcDL1NTncogw8VpSLS3MLYHlbN+y/EwSyrr9vA5QAVZcLALNev255pDBVlYqX9cpEA+VTzYCWkof/qoBCFWFBRKmxX+y3NnSGK2EJFuei52i/tDQzhVkwVZcM+WTTN/e07KNDZXfAhbtiDilJifqJ/ahaoKB0/AN9oF+AdqqeAAAAAAElFTkSuQmCC\"","import React, { useEffect, useState } from \"react\";\r\nimport { useLocation } from \"react-router-dom\";\r\nimport { Dialog } from 'primereact/dialog';\r\nimport CookieConsent, { getCookieConsentValue, resetCookieConsentValue} from \"react-cookie-consent\";\r\nimport { useTranslation } from \"react-i18next\"\r\nimport StatistiquesService from '../../services/statistiquesService';\r\nimport TagManager from 'react-gtm-module';\r\nimport { useHistory } from 'react-router-dom'\r\nimport './cookiesDialog.css';\r\nimport parse from 'html-react-parser';\r\n\r\nexport const CookiesDialog = (props) => {\r\n const { t } = useTranslation();\r\n const location = useLocation();\r\n const history = useHistory()\r\n const statistiqueService = new StatistiquesService();\r\n\r\n const [displayCookie, setDisplayCookies] = useState(getCookieConsentValue() === undefined && location.pathname != \"/confidentiality\");\r\n const [wasResetCookie, setWasResetCookies] = useState(false);\r\n\r\n useEffect(()=> {\r\n tryInitTagManager()\r\n if(props.cookieReset)\r\n onReset();\r\n }, [props.cookieReset])\r\n\r\n const tryInitTagManager = () => {\r\n if (process.env.REACT_APP_GTM_ID) {\r\n window.GTM_ID = process.env.REACT_APP_GTM_ID;\r\n }\r\n\r\n if (window.GTM_ID && getCookieConsentValue() === 'true') {\r\n\r\n const tagManagerArgs = {\r\n gtmId: window.GTM_ID\r\n }\r\n console.log(\"GTM-INIT\");\r\n TagManager.initialize(tagManagerArgs)\r\n }\r\n }\r\n\r\n const onReset = () => {\r\n resetCookieConsentValue()\r\n setDisplayCookies(true);\r\n setWasResetCookies(true);\r\n }\r\n\r\n const onShow = () => {\r\n setDisplayCookies(true);\r\n }\r\n\r\n const onHide = () => {\r\n setDisplayCookies(false);\r\n console.log(getCookieConsentValue() === 'true' ? t('consent.cookiesAccepted') : t('consent.cookiesRefused'));\r\n }\r\n\r\n const onAccept = () => {\r\n onHide();\r\n tryInitTagManager();\r\n statistiqueService.StatCookieChoose(props.currentUser, true, !wasResetCookie, history);\r\n }\r\n\r\n const onDecline = () => {\r\n onHide();\r\n clearCookies();\r\n statistiqueService.StatCookieChoose(props.currentUser, false, !wasResetCookie, history);\r\n }\r\n\r\n const clearCookies = () => { \r\n if(getCookieConsentValue() !== 'true')\r\n {\r\n var cookies = document.cookie.split(';');\r\n cookies.forEach(element => {\r\n const [key, val] = element.trim().split('=').map(decodeURIComponent)\r\n //Suppression des cookies analitics\r\n if (key.startsWith('_ga') || key.startsWith('_hj') || key.startsWith('_fbp') || key.includes('facebook.com')) {\r\n document.cookie = key + '=; Max-Age=-99999999;';\r\n }\r\n });\r\n }\r\n }\r\n\r\n const headerTemplate = () => {\r\n return (\r\n \r\n
\r\n {t('consent.dialogTilte')}\r\n
\r\n
\r\n )\r\n }\r\n\r\n return (\r\n \r\n
onHide()} breakpoints={{ '960px': '75vw', '640px': '100vw' }} style={{ width: '50vw' }}>\r\n onAccept()} disableStyles={true} declineButtonClasses={\"p-button p-component ccb-cancel\"} buttonClasses={\"p-button p-component ccb-ok p-ml-2 p-mr-2\"}\r\n buttonText={t('consent.acceptall')} onDecline={() => onDecline()} enableDeclineButton={true} declineButtonText={t('consent.denyall')} debug={false} expires={182}>\r\n {parse(t('consent.dialogText1'))}
\r\n\r\n {/* \r\n \r\n {parse(t('consent.dialogAccordionText'))}
\r\n \r\n */}\r\n\r\n {parse(t('consent.dialogText2'))}
\r\n \r\n \r\n
\r\n )\r\n}","export default __webpack_public_path__ + \"static/media/logo.0f42929b.webp\";","export default __webpack_public_path__ + \"static/media/dipLogoEntrepriseTC.ae90d4b8.webp\";","export default __webpack_public_path__ + \"static/media/dipLogoEntrepriseW.4cb0a1af.webp\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAm8AAABtCAMAAADAv3aYAAAAV1BMVEUAAAD/Zmb/Zmb/Zmb/Zmb/Zmb/Zmb7Z2P/Zmb/Zmbtalr9ZmT/Zmb/Zmb/Zmb7Z2Ptalrtalrtalrtalrtalrtalrtalrtalrtalrtalrtalr/ZmbtalqDux4FAAAAG3RSTlMAu3dEEe7dIWaZwDLMVaqKEPBA4ICgYNBQcLAGthTRAAAL1ElEQVR42uzbbW6DMBCE4Q1NSwuqMJiQD8/9z1mpcqrQhkZCbEKk9znBamX5x4xt84Q+SvFgwB2Evb4NBvhrlHHDwV+tszYY4KzSj8YAXwddKA1wFXWhMsBTr5HOAD9lq5FogJ+dfjka4KVTRiaCO6j0x84AH4OuqA3wEKIyMhH46zVCjQpPpc7IRODvpAm9AUvrNKWlRsXi9srIROBv0Ag1KjyFVhmZCPw1msBfBiyv1P8iNSrMoTglE4G/Tlet52n5Z1HMH2BbvKWNPa+J+W8tbMUpVtRNJ3uc7Sal9Ppus7x8pJSe+LzVef45C1upo7KVZiJf7JvpstsgDIXZl4Lt6d6p3v892xA7ii2WXqa0duaeXy1xQBy+q9gCL5BkWY8Ars3bGn+PYSfNcFgLqek7+2+Cu8Q7b2817JR6HCI/a03knbdX4i3k8TrR0XIDSe6dt7cZds4buEYt5ASv209wU1SX523mdmT81LAT6gfhamhNhB81CyFkYFU5DcAVuzpvDsAPjx8NOyVupBYyeBsVCop+qvkTFGOX580AaPWP4g/npI0cIh9dE4GKZsnKuj5v6VdOXDf+AS/UN/T5r/HmxaaZA8rciHtV3tJEtbps/ANqIYO3UZG3HVdy0Zjj1KvyJiHJXTX+ARunQ2silDeUcg/iTHhR3vg6v6vGP6AW0tbXAbwlqQVW6fCSvAVY5a4Z/5BD5G2FEbwlOQTuFXnzsCpeM/4hL9S39WEYbyzoDTj1erxZeEheMf5BtZC2fgzgDQsGRXetEORy4fBj+Vu2Y72CvIlk1NI4zB6vxuFVK73FWiy0v9DLGxpGJSUJtcuVye0uDv2HyMceLa/+jQso7DRPMwAc7DQAHA8kJhmh3sKbEjNs4oLQSsZhdjGZcaRfh/e2mt68hLsaizN5DUna2338E0+iIG2fipxhKPeYb3Q55NquoA9x/afXGGvrhfoufRnHG4vZX9TJABzsm59WQWh4SIs/5s36VrkZxyFf0NNjDc1Tq6udSLPb9DzLC/vD6eziVxrdoeIAsmgYtsZ7JybNoMsV/uhdLYBq1kL69NGO401igqNpL0+R4rATV23ekFI/SSnd5rFXJVoR6/1jpuVAWqkSKB4fifIOYn9G3KJKrPNd/Au6k/MuUsNQPnVs7xkUe+lwBZIUY8EAyjdfqO/U13G8MU4SXJU3nDIqqiZvG6UxHKoxOhR4S1+gaE3IYPNGIeBBIV/bZ8ccHSIkYfy2UsPzAK7Cm9+K6di1Z32ubDMNu9lPrUPk3fo0jjdHEkWdN6vXbDB52DS3eVPxSKbUOC79drLWLNPzONqmaLV3UkqhoYKC0luOrD+Au+PqeuRt1+Cyd4imYth0i03h/9WtJ9HnytpmdYrstwxOvHKIvFsfxvHGCDRV3lTELVcbYZVo8aYiXfWAkdFvSw1xOqwBLBLAOOyyiAITW79KY4RUjj5NROStkeAWAFExzJBROQBMXa6sc+C36av7ZTMszRfq+/VtHG/zlj3+iLcIXu39QssqvM30BwBzj6XjGNCC3mQa/byCymSyKy423w9SLgeJbNmOH/xxmRSqVdmwQCesDETV4Qqa8my+swNqIbiNOow3AatCize6Okpja403QZqSeObS7JaHf3pIpRgyIocTVvksiNGb/LYEP4wSM775imEik1XlrPpcgVV+0MYp1ZdhvEly+1njzefv/gzljWI50aEpC7mcx2weGoNTIx+YAz+mlNlFvgbOj+sv6Ri2xRsdtM8VoJ6OqYWg7HDeRJs3+lduaPfUG1H6STN1WlExm8mWwtQcrhZhlUy8VJE5XsfJGDNr8UYTUp8rcJftOETeq5+jeGNv4Y2z/JLDUrlS6ZL3ok4rimd5E4Wp8d1izYXQOWkmEVTSaMSGMm+0lNbhCoY0cOOU6tMpefvF3Bk2tw3CYNhgjE3s2LduXdtr///v3C3tTsuegKiq3qovu8vAwS9PZJCEu8LVs+Ui16/0Lq68jdfebLytwIxRKeMviPVSMKamM/yqQRWK4h0LoT18Sd6GCfs/tNxlBJXe2Yc3ujcuwPkw1vNxmY+zvRKwxK2RuH5VzLzdvzjY05fkLWCTiJYTRoDenryNci/iarj82TTe6OAQ64Vg/IjVBv2qWHlbwY4tJvL/9wuhuthI1ZYJI+Dyb3TkrSCdcDOphXEr++srYEs14UxqUMnSr4qRt9OLix2fy9to400lZmyMIPrzNmNRxKw9g3c98UO5bLogzQbMqYgFGWaXKnbeHl+cbP7UeG8y8XaW3gbeFhfeEK894rXJJtrEm5QlMdZLwaSXlLVxr6qrQt5sReR2O30GbwUh2x7eOG8m3kZ33ubnuk2J37zqvLEsaRJfScFYAMcaPl0VO28/Xtzszo037qOOz+ZtaSg7u/F2PDcsNuaUIyDFE2K9bd6GhBo+gyoYkvVA/cNx/z7f992VNy7f7LxtOm9xoI2O+1MpRIqwXXjBfGu8sSwpQ04RTCFufJcqFt7u20UfT98MaVQf3vg4tfO211smhIRJqxtvEbdaydrPcOscAR1cRqwXgsHSkoW3nCyqoKklcfoTDcwxETtvMzy9bX8a9XzQVD8gdrjwJnWWtFLLSWaNN5YlBVELgqlHJKJBFQzJEgt5MgWD7514o3sz8nZg2Y2WpX5KKrK3nTe6N/6uzgiPzS3e6HMY66VgtCR1wxZVpKv5QP134xuTVjfeWIxkzy9ktmTI5Bhgu/R24S1L10pZG+JAUeENZUkFfSBYI8YxGVTBkAyJ0zvjBvbkyVvKkhq28Za0eksW2HBzvHjxtsgvR40xzAyScAS8QJjZhYI1kgYGVVTedJRO5mKlRzfeJAK+JStvCx9KbLm0S9By8uItY/pwiR2F9LGHN+Fjh0tq8cakmEGVbt7mvlTBo+G4vYU34oZqWoW3fHsWD2W+tkrvgme5iTfWWdKYtR/l7jXehA+5hCbYuiv1dqoqHJL5QP3xgQTrDyfe1owXwGm8sRZDHkktcVZxJfx4H7x42zB5zax9uendU3Vysfho1r9Nz/HWquwwqNLL211vWGN1P25PUPj6N8qt8xZurf/ONWKYESRFW/LibYR7a2ft0ySJTTj9oKQ1FcFmPik3bEebqhh4e1CP9znEREy8rWVCQEjljT/uIldQxIk3jl0VEdaFtyCetpW5i9ydb7O4pUocVvgMXYId/wI3orOmCkUxHqh/+GAB8J2Btzj+sXPcJcUS5qGXNziDVIRAVZzlTdoIYV14Y50ljWftF7mr31M+LxcfpFC19AlWrtmes3x3vyoUxR4L0dlUePV/H77O20WcVYLmIr8aT8hv/3F+dSSXqT3S4Mbbrrg3nrUX4MS29WoEvEDWBJPP5G6HZYIja6pi4O1Qj1qZYyI/PXjbInybvj8Nr8iFEN400Ot5mLneQpgu/wJ3O2+ss6Qd2BDKG2rE0TQm98B3QDCwNIVSwoQ3SemqUBRzLARmSaPaecuhxBH33hd/G3fNPzb8Q9z+7nweBkfeys3i8MaxaeY290WZXMR6lfjbskGsHlVMvJ364xls//X+uv0v9s5mhUEYCMJGBWuDNf60+v5PWlooPQTMuuxhYua7K0QGSWZns/8lt0PdO+f6emir03S/hxuc8T++fkiX4xt/cr23z8vdGK3X+qvMcr82/h8CTre/0C3Kl2SR773i2hfgdHvqDZqDwmn6PIs43Z56QyZMCp28TKPl1FtBPFW1gc2y3Z56Kwcvr33GZwzM6fbUGzAHXkg6T4I53Z56w2XXbrq6CdYTod5gCYsim2seLafeSmHVCySYRcupt1LopmRvVYaeCPWGitQLyauMSr2BIgiR5+iJUG+gbAqD1jxabk/zxVcEi0RDvfXd0hRA2QgKp/l6IgQOtReij5aTgrEoBuyonghBYzZxLu7IQTgCxGpiXHjqjYhYbXZZI/VGJMzaBmW9JxIqUi7vdu3YBIAQCAJg+HDJm4ho/4WamwiiIDhTxO7BbezJoHrpCo7LpDJr071fhhBvb0s1BvlbauYWc7/jDQAAAADgiA7UR5DV7CbuRAAAAABJRU5ErkJggg==\"","import React, { useState, Children } from \"react\";\r\nimport \"./burgerMenu.css\";\r\nimport { Link } from 'react-router-dom'\r\nimport { Sidebar } from 'primereact/sidebar';\r\nimport dip_terra_cotta from \"../../images/dipLogo/dip_terra_cotta.png\"\r\nimport {Trans, useTranslation } from 'react-i18next'\r\n\r\nexport const BurgerMenu = ({ itemsMenu }) => {\r\n\r\n const { t } = useTranslation();\r\n const [visibleLeft, setVisibleLeft] = useState(false);\r\n\r\n return (\r\n <>\r\n setVisibleLeft(false)}>\r\n \r\n
\r\n
\r\n \r\n {Children.toArray(itemsMenu.map((item) => (\r\n \r\n )))}\r\n \r\n \r\n setVisibleLeft(true)}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n >\r\n )\r\n}","import { useTranslation } from 'react-i18next';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useAuthState } from '../../context/context';\r\nimport RoleHelper from '../../utils/roleHelper';\r\nimport { BurgerMenu } from '../burgerMenu/burgerMenu';\r\nimport './newHeaderAccessButtons.css'\r\n\r\nexport const NewHeaderAccessButtons = () => {\r\n const currentUser = useAuthState()\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n\r\n\r\n //TODO: Ajouter les commandes pour rediriger au bon endroit\r\n const itemsMenuLoggin = [\r\n {\r\n label: t('menu.home'),\r\n link: \"/\"\r\n },\r\n {\r\n label: t('menu.search_Formations'),\r\n link: \"/rechercheAffinee\"\r\n },\r\n {\r\n label: t('menu.my_favorites_formations'),\r\n link: \"/formationsFavorites\"\r\n },\r\n {\r\n label: t('menu.my_offers'),\r\n link: \"/offresCompatibles\"\r\n },\r\n {\r\n label: t('menu.my_candidatures'),\r\n link: \"/candidatures\"\r\n },\r\n\r\n ]\r\n\r\n //TODO: Ajouter les commandes pour rediriger au bon endroit\r\n const itemsMenuNotConnected = [\r\n {\r\n label: t('menu.home'),\r\n link: \"/\"\r\n },\r\n {\r\n label: t('menu.formations'),\r\n link: \"/rechercheAffinee\"\r\n },\r\n {\r\n label: t('menu.acces_entreprise'),\r\n link: \"/entreprise\"\r\n },\r\n // {\r\n // label: t('menu.acces_ecole'),\r\n // link: \"/about-schools\"\r\n // },\r\n ]\r\n\r\n\r\n return (\r\n <>\r\n {history.location.pathname != \"/entreprise\" && \r\n
\r\n {RoleHelper.isNotConnected(currentUser) ?\r\n \r\n :\r\n RoleHelper.isEtudiant(currentUser) ?\r\n : \"\"\r\n }\r\n
\r\n
}\r\n >\r\n )\r\n}","import React, { useRef, useEffect } from 'react';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { OverlayPanel } from 'primereact/overlaypanel';\r\nimport { Button } from 'primereact/button';\r\nimport 'primereact/resources/primereact.min.css';\r\nimport 'primeicons/primeicons.css';\r\nimport './headerAuthLogin.css';\r\nimport { FormLogin } from '../../form/formLogin.js';\r\nimport { TabView, TabPanel } from 'primereact/tabview';\r\nimport { FormRegister } from '../../form/formRegister.js';\r\nimport { enumHeaderTheme } from \"../../../enums/enumHeaderTheme\"\r\n\r\nexport const HeaderAuthLogin = (props) => {\r\n const { t } = useTranslation()\r\n\r\n const op = useRef(null)\r\n\r\n useEffect(() => {\r\n op.current.hide();\r\n }, []);\r\n\r\n const toggle = () => {\r\n op.current.toggle();\r\n }\r\n\r\n return (\r\n \r\n op.current.toggle(e)} aria-haspopup aria-controls=\"overlay_panel\" />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n","import React, { useEffect, useRef } from 'react';\r\nimport { Avatar } from 'primereact/avatar';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useAuthDispatch, useAuthState } from '../../../context/context';\r\nimport { logout } from '../../../context/actions';\r\nimport { Menu } from 'primereact/menu';\r\nimport './headerAuthProfile.css'\r\nimport '../../menu/menuSmallPopUp.css'\r\nimport { useTranslation } from 'react-i18next';\r\nimport { DisplayProfileImage } from '../../image/displayProfileImage';\r\nimport RoleHelper from '../../../utils/roleHelper';\r\n\r\nexport const HeaderAuthProfile = (props) => {\r\n const { t } = useTranslation();\r\n const dispatch = useAuthDispatch();\r\n const currentUser = useAuthState();\r\n const history = useHistory();\r\n const menu = useRef(null);\r\n\r\n useEffect(() => {\r\n }, [props.nom, props.prenom])\r\n\r\n const handleLogout = () => {\r\n logout(dispatch)\r\n if(RoleHelper.isEntreprise(currentUser))\r\n {\r\n history.push('/entreprise')\r\n }\r\n else{\r\n history.push('/')\r\n }\r\n \r\n }\r\n\r\n let itemsEntrepriseEtudiant = [\r\n {\r\n label:\r\n RoleHelper.isEtudiant(currentUser) && t('general.myProfile.full') ||\r\n RoleHelper.isEntreprise(currentUser) && t('general.myAccount.full') ||\r\n t('general.dashboard')\r\n ,\r\n command: () => {\r\n if (RoleHelper.isEtudiant(currentUser))\r\n history.push(\"/profile_student\");\r\n else if (RoleHelper.isEntreprise(currentUser))\r\n history.push(\"/profile_company\");\r\n else\r\n history.push(\"/dashboard\");\r\n }\r\n }\r\n //CHAT-COMMENTE\r\n // ,\r\n // {\r\n // label: t('general.messagerie'),\r\n // command: () => { history.push(\"/Messagerie\") }\r\n // }\r\n ,{\r\n label: t('general.disconnect'),\r\n command: () => handleLogout()\r\n }\r\n ];\r\n\r\n let itemsOther = [\r\n {\r\n label: t('general.dashboard'),\r\n command: () => {\r\n history.push(\"/dashboard\");\r\n }\r\n },\r\n {\r\n label: t('general.disconnect'),\r\n command: () => handleLogout()\r\n }\r\n ];\r\n\r\n let items = RoleHelper.isEtudiant(currentUser) || RoleHelper.isEntreprise(currentUser) ? itemsEntrepriseEtudiant : itemsOther;\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n {currentUser.user.avatarId ? (
menu.current.toggle(e)} />) : ( menu.current.toggle(e)}> )}\r\n \r\n
\r\n );\r\n\r\n}","import { Button } from 'primereact/button'\r\nimport { Menu } from 'primereact/menu';\r\nimport { useEffect, useRef } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Link, useHistory } from 'react-router-dom'\r\nimport { useAuthState } from '../../context/context';\r\nimport RoleHelper from '../../utils/roleHelper';\r\nimport './headerAccessButtons.css'\r\n\r\nexport const HeaderAccessButtons = (props) => {\r\n const currentUser = useAuthState()\r\n const history = useHistory();\r\n const { t } = useTranslation();\r\n const menu = useRef(null);\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId;\r\n const adminImpersonatingEtudiantId = history.location?.state?.adminImpersonatingEtudiantId;\r\n\r\n const itemsPortailCompany = [\r\n {\r\n label: t('access.student'),\r\n command: () => { onEtudiantClick() }\r\n }\r\n ]\r\n\r\n const itemsPortailSchool = [\r\n {\r\n label: t('access.company'),\r\n command: () => { onEntrepriseClick() }\r\n },\r\n {\r\n label: t('access.student'),\r\n command: () => { onEtudiantClick() }\r\n }\r\n ]\r\n\r\n const itemsEntreprise = [\r\n {\r\n label: t('entreprise.search_candidat'),\r\n command: () => { onSearchClick()}\r\n },\r\n {\r\n label : t('entreprise.myProjects'),\r\n commande : () => { onProjectsClick()}\r\n },\r\n {\r\n label: t('entreprise.myOffers'),\r\n command: () => { onOffersClick() }\r\n },\r\n {\r\n label: t('entreprise.myProfiles'),\r\n command: () => { onProfilesClick() }\r\n },\r\n {\r\n label: t('entreprise.myFormations'),\r\n command: () => { onFormationsClick() }\r\n },\r\n {\r\n label: t('general.myAccount.full'),\r\n command: () => { onMyAccountClick() }\r\n },\r\n ]\r\n\r\n const onOffersCompatiblesStudentClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/offresCompatibles', { adminImpersonatingEtudiantId: adminImpersonatingEtudiantId })\r\n }\r\n\r\n const onCandidaturesStudentClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/candidatures', { adminImpersonatingEtudiantId: adminImpersonatingEtudiantId })\r\n }\r\n\r\n const onFormationsFavoritesStudentClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/formationsFavorites', { adminImpersonatingEtudiantId: adminImpersonatingEtudiantId })\r\n }\r\n\r\n const onProfileStudentClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/profile_student', { adminImpersonatingEtudiantId: adminImpersonatingEtudiantId})\r\n }\r\n\r\n const onOffersClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/offers')\r\n }\r\n\r\n const onFormationsClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/formationsFavorites')\r\n }\r\n\r\n const onSearchClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/rechercheAffinee')\r\n }\r\n\r\n const onProjectsClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/projects')\r\n }\r\n\r\n const onProfilesClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/seeked_profiles')\r\n }\r\n\r\n const onEntrepriseClick = () => {\r\n history.push('/entreprise')\r\n }\r\n\r\n const onEtudiantClick = () => {\r\n history.push('/')\r\n }\r\n\r\n const onMyAccountClick = () => {\r\n RoleHelper.redirectWithImpersonationCheck(history,'/profile_company')\r\n }\r\n\r\n return (\r\n <>\r\n {history.location.pathname == \"/entreprise\" || history.location.pathname.toLowerCase() == \"/register?user=company\" || (history.location.pathname == \"/register\" && history.location.search.toLowerCase() == \"?user=company\") ? (\r\n <>\r\n \r\n
\r\n {t('access.student')}\r\n
\r\n
\r\n \r\n menu.current.toggle(event)} aria-controls=\"popup_menu\" aria-haspopup />\r\n
\r\n
\r\n >\r\n ) : (\r\n <>\r\n {history.location.pathname == \"/about-schools\" ? (\r\n <>\r\n \r\n
\r\n {t('access.company')}\r\n {t('access.student')}\r\n
\r\n
\r\n \r\n menu.current.toggle(event)} aria-controls=\"popup_menu\" aria-haspopup />\r\n
\r\n
\r\n >\r\n ) : (<>\r\n {RoleHelper.isNotConnected(currentUser) &&\r\n \r\n {t('access.company')}\r\n {/* {t('access.school')} */}\r\n
}\r\n\r\n {(RoleHelper.isEtudiant(currentUser) || (adminImpersonatingEtudiantId && RoleHelper.isAdminImpersonatingEtudiant(currentUser, history.location.pathname))) &&\r\n }\r\n\r\n {(RoleHelper.isEntreprise(currentUser) || (adminImpersonatingRecruteurId && RoleHelper.isAdminImpersonatingEntreprise(currentUser,history.location.pathname))) && \r\n
{/*gestion espace vide pour space-between*/}
\r\n
\r\n
{/*gestion espace vide pour space-between*/}
\r\n
\r\n
\r\n \r\n menu.current.toggle(event)} aria-controls=\"popup_menu\" aria-haspopup />\r\n
\r\n
}\r\n >)}\r\n >)}\r\n >\r\n )\r\n}","import React from 'react';\r\nimport { HeaderAuthLogin } from './header_auth/headerAuthLogin';\r\nimport { HeaderAuthProfile } from './header_auth/headerAuthProfile';\r\nimport {HeaderAccessButtons} from './headerAccessButtons';\r\nimport { useAuthState } from '../../context/context';\r\n\r\n\r\nexport const HeaderAuth = (props) => {\r\n\r\n const currentUser = useAuthState();\r\n\r\n return currentUser.user == '' ? (\r\n <>\r\n \r\n \r\n >\r\n ) : (\r\n <>\r\n \r\n \r\n >\r\n );\r\n\r\n}","import React from 'react';\r\nimport { NavLink, useHistory } from 'react-router-dom';\r\nimport logoWhite from '../../logo.webp';\r\nimport dipLogoEntrepriseTC from '../../images/dipLogo/dipLogoEntrepriseTC.webp'\r\nimport dipLogoEntrepriseW from '../../images/dipLogo/dipLogoEntrepriseW.webp'\r\nimport { NewHeaderAccessButtons } from './newHeaderAccessButtons';\r\nimport { HeaderAuth } from './headerAuth';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { enumHeaderTheme } from \"../../enums/enumHeaderTheme\";\r\nimport { useAuthState } from '../../context/context';\r\nimport RoleHelper from '../../utils/roleHelper';\r\nimport { enumRoles } from '../../enums/enumRoles';\r\nimport \"./header.css\"\r\nimport { useEffect } from 'react';\r\n\r\nexport const Header = (props) => {\r\n const currentUser = useAuthState()\r\n const history = useHistory();\r\n const adminImpersonatingRecruteurId = history.location?.state?.adminImpersonatingRecruteurId;\r\n\r\n const { t } = useTranslation();\r\n\r\n useEffect(() => {\r\n \r\n }, [history.location.pathname])\r\n \r\n\r\n return (\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport { Redirect, Route } from \"react-router-dom\";\r\nimport { useAuthState, useAuthDispatch } from \"../context/context\";\r\nimport { MenuDashboard } from \"./menu/menuDashboard\";\r\nimport { Sidebar } from \"primereact/sidebar\"\r\nimport { Button } from \"primereact/button\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\nimport { useHistory } from \"react-router-dom/cjs/react-router-dom.min\";\r\nimport { Footer } from \"./footer/footer\";\r\nimport { CookiesDialog } from './dialog/cookiesDialog'\r\nimport { RenewUser } from \"../context/actions\";\r\nimport jwt_decode from \"jwt-decode\";\r\nimport { Header } from \"./header/header\";\r\nimport RoleHelper from \"../utils/roleHelper\";\r\n\r\nexport const AppRoutes = ({ component: Component, path, needsLogin, needsRoles, hasDashboard, hasDashboardOnlyMobile, hasAlabasterBackground, className, hasFooter, hasWidthLimit, redirect, showOnboarding, headerTheme, backgroundTheme, ...rest }) => {\r\n let currentUser = useAuthState();\r\n let dispatch = useAuthDispatch();\r\n const [visible, setVisible] = useState(true);\r\n const { t } = useTranslation();\r\n const history = useHistory();\r\n const [doitCompleterProfil, setDoitCompleterProfil] = useState(false)\r\n const [cookieRefresh, setCookieRefresh] = useState(null)\r\n const [tokenRefresh, setTokenRefresh] = useState(false)\r\n const [activeOverlayPanelIndex, setActiveOverlayPanelIndex] = useState(0);\r\n const loginOverlayPanel = useRef(null)\r\n\r\n if (!tokenRefresh) {\r\n const token = localStorage.getItem(\"currentUser\")\r\n ? JSON.parse(localStorage.getItem(\"currentUser\")).token\r\n : \"\";\r\n if (token !== '') {\r\n if (jwt_decode(token).expiration < (Date.now() / 1000) + 518400 && !jwt_decode(token).expiration < Date.now() / 1000) {\r\n setTokenRefresh(true);\r\n RenewUser(dispatch)\r\n }\r\n }\r\n }\r\n \r\n useEffect(() => {\r\n let _currentUser = JSON.parse(localStorage.getItem(\"currentUser\"))\r\n if (_currentUser?.user) {\r\n let _roles = RoleHelper.decodeRoles(_currentUser.token);\r\n _currentUser.roles = _roles\r\n if (RoleHelper.isEntreprise(_currentUser) && history.location.pathname == \"/\") {\r\n history.push('/offers');\r\n }\r\n }\r\n if (_currentUser == null && (currentUser == undefined || !currentUser?.isAuthenticated)) {\r\n setDoitCompleterProfil(false)\r\n }\r\n else {\r\n setDoitCompleterProfil(_currentUser?.user?.doitCompleterProfil || currentUser?.user?.doitCompleterProfil);\r\n }\r\n }, [currentUser])\r\n\r\n const handleClickCompleteProfile = () => {\r\n history.push('/profile_student');\r\n }\r\n\r\n const showLogin = (e) => {\r\n setActiveOverlayPanelIndex(0);\r\n loginOverlayPanel.current.toggle(e);\r\n }\r\n\r\n const showRegister = (e) => {\r\n setActiveOverlayPanelIndex(1)\r\n loginOverlayPanel.current.toggle(e);\r\n }\r\n return (\r\n <>\r\n \r\n \r\n
\r\n (needsLogin && !Boolean(currentUser.isAuthenticated)) || !(needsRoles ? needsRoles.some(it => currentUser.roles.includes(it) || RoleHelper.isAdmin(currentUser)) : true) ?\r\n (\r\n \r\n ) : (\r\n redirect ?\r\n \r\n :\r\n <>\r\n \r\n {hasDashboard &&
}\r\n {!hasDashboard && doitCompleterProfil && path != \"/onboarding\" &&
setVisible(false)} >\r\n
\r\n \r\n handleClickCompleteProfile()} />\r\n }\r\n
\r\n \r\n \r\n
\r\n \r\n {hasFooter && }\r\n >\r\n )\r\n }\r\n {...rest}\r\n />\r\n \r\n >\r\n )\r\n}\r\n","import { useEffect } from \"react\";\r\nimport { useLocation } from \"react-router\";\r\n\r\nconst ScrollToTop = (props) => {\r\n const location = useLocation();\r\n useEffect(() => {\r\n window.scrollTo(0, 0);\r\n }, [location]);\r\n\r\n return <>{props.children}>\r\n};\r\n\r\nexport default ScrollToTop;","import axios from 'axios';\r\nimport BaseService from './baseService';\r\n\r\nexport default class RegistrationOnboardingService extends BaseService {\r\n\r\n RegistrationStepBackward() {\r\n return this.axiosApiInstance.get(window.API_URL + '/api/registrationOnboarding/RegistrationStepBackward')\r\n .then(res => res.data)\r\n .catch(err => console.log(err));\r\n }\r\n\r\n getEtudiantOnboardingSteps() {\r\n return this.axiosApiInstance.get(window.API_URL + '/api/registrationOnboarding/GetEtudiantOnboardingSteps')\r\n .then(res => res.data)\r\n .catch(err => console.log(err));\r\n }\r\n\r\n etudiantRegistrationStepForward(model) {\r\n const jsonModel = JSON.stringify(model, null, 2);\r\n return this.axiosApiInstance.post(window.API_URL + '/api/registrationOnboarding/EtudiantRegistrationStepForward', jsonModel)\r\n .then(res => res.data)\r\n .catch(err => super.handleHttpError(err));\r\n }\r\n\r\n etudiantRegistrationStepForwardWithFiles(currentUser, model) {\r\n const jsonModel = JSON.stringify(model, null, 2);\r\n const options = {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n Authorization: 'Bearer ' + currentUser.token\r\n }\r\n };\r\n\r\n let formData = new FormData()\r\n formData.append('etudiantUserOnboardingStep', jsonModel);\r\n \r\n if (model.etudiant.cvPdf !== undefined)\r\n formData.append('cvPdf', new Blob([model.etudiant.cvPdf], { type: model.etudiant.cvPdf.type }), model.etudiant.cvPdf.name);\r\n if (model.etudiant.portfolio !== undefined)\r\n formData.append('portfolio', new Blob([model.etudiant.portfolio], { type: model.etudiant.portfolio.type }), model.etudiant.portfolio.name);\r\n\r\n return axios.post(window.API_URL + '/api/registrationOnboarding/EtudiantRegistrationStepForwardWithFiles', formData, options)\r\n .then(res => res.data)\r\n .catch(err => super.handleHttpError(err));\r\n\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n","export const enumUserOnboardingStepName = {\r\n INTRO : \"Intro\",\r\n CHOIX : \"Choix\",\r\n OFFREEMPLOIINTRO: \"OffreEmploiIntro\",\r\n FORMATIONINTRO:\"FormationIntro\",\r\n CONTRAT : \"Contrat\",\r\n FORMATION : \"Formation\",\r\n FIN : \"Fin\",\r\n}","export default __webpack_public_path__ + \"static/media/dip_holding_flag.f26aac8f.png\";","export default __webpack_public_path__ + \"static/media/DA_onboarding_photo.3945d91b.jpg\";","import { Button } from \"primereact/button\"\r\nimport { useEffect } from \"react\"\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { useHistory } from \"react-router-dom/cjs/react-router-dom.min\"\r\nimport dip_terra_cotta from \"../../../images/dipLogo/dip_terra_cotta.png\"\r\nimport DA_onboarding_photo from \"../../../images/onBoarding/DA_onboarding_photo.jpg\"\r\nimport dip_holding_flag from \"../../../images/onBoarding/dip_holding_flag.png\"\r\nimport { Mailto } from \"../../mailto/mailto\"\r\n\r\nexport const RobEnd = (props) => {\r\n const { t } = useTranslation()\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n if (props.etudiant.isRegistrationOnboardingCompleted) {\r\n if (!props.etudiant.isDisabled) {\r\n if (props.etudiant.urlInscription) {\r\n history.push(props.etudiant.urlInscription)\r\n }\r\n else {\r\n history.push(\"/\")\r\n }\r\n }\r\n }\r\n else {\r\n props.onReachingOnboardingEnd();\r\n }\r\n }, [])\r\n\r\n // const onRDVClick = () => {\r\n // var win = window.open(\"https://meetings.hubspot.com/patrick-musso/demo-da\")\r\n // win.focus();\r\n // }\r\n\r\n return (\r\n \r\n
\r\n
{t('onboarding.bravo').toUpperCase()} \r\n
\r\n
\r\n {t('onboarding.you_joined')} \r\n {t('onboarding.the_community').toLowerCase()} \r\n DiplomAdvisor \r\n
\r\n
\r\n
\r\n {t('onboarding.max_your_chance')} \r\n {props.onboardingChoice == 2 ? (t('onboarding.our_company')) : (t('onboarding.our_school'))} \r\n {t('onboarding.completing_your_profile').toLowerCase()} \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {/*
\r\n
\r\n
*/}\r\n
\r\n
\r\n {t('onboarding.need_help')} \r\n DiplomAdvisor \r\n
\r\n
\r\n
\r\n {/* */}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n}","export default __webpack_public_path__ + \"static/media/dip_phone_hands.39dc2ff4.png\";","import { Button } from \"primereact/button\"\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport dip_phone_hands from \"../../../images/onBoarding/dip_phone_hands.png\";\r\n\r\nexport const RobIntro = (props) => {\r\n const { t } = useTranslation()\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n )\r\n}","import { Trans, useTranslation } from \"react-i18next\"\r\nimport { Button } from \"primereact/button\";\r\n\r\nexport const RobChoix = (props) => {\r\n\r\n const { t } = useTranslation();\r\n\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n )\r\n}","import { MultiSelect } from \"primereact/multiselect\"\r\nimport { ProgressSpinner } from \"primereact/progressspinner\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { enumContextContratMultiSelect } from \"../../enums/enumContextContratMultiSelect\";\r\nimport ContratService from \"../../services/contratService\";\r\n\r\nexport const ContratMultiSelect = (props) => {\r\n\r\n const {t} = useTranslation()\r\n\r\n const contratService = new ContratService();\r\n\r\n const [ddlContrat, setDdlContrat] = useState([])\r\n const [ddlLoading, setDdlLoading] = useState(true)\r\n\r\n useEffect(() => {\r\n loadLazyData();\r\n }, [])\r\n\r\n const loadLazyData = () => {\r\n switch (props.context) {\r\n case enumContextContratMultiSelect.PROFILETUDIANT:\r\n contratService.getAllContratForProfilEtudiant()\r\n .then((data) => {\r\n data.forEach(e => {\r\n e.libelle = t(`enums.paireContrat.${e.code}`);\r\n if(props.value.length==0){\r\n let e = {value:data}\r\n props.onChange(e,'paireContrats')\r\n }\r\n });\r\n setDdlContrat(data)\r\n setDdlLoading(false)\r\n })\r\n break;\r\n case enumContextContratMultiSelect.ANNONCEINTERNE:\r\n contratService.getAllContratForAnnonceInterne()\r\n .then((data) => {\r\n data.forEach(e => {\r\n e.libelle = t(`enums.paireContrat.${e.code}`);\r\n });\r\n setDdlContrat(data)\r\n setDdlLoading(false)\r\n })\r\n break;\r\n case enumContextContratMultiSelect.RECHERCHEAFFINEE:\r\n contratService.getAllContratForRechercheAffinee()\r\n .then((data) => {\r\n data.forEach(e => {\r\n e.libelle = t(`enums.paireContrat.${e.code}`);\r\n });\r\n setDdlContrat(data)\r\n setDdlLoading(false)\r\n })\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {props.label && {props.label} }\r\n {ddlLoading ? () : ( \r\n )}\r\n >\r\n )\r\n}","import { InputSwitch } from \"primereact/inputswitch\";\r\nimport { TreeSelect } from \"primereact/treeselect\";\r\nimport { Trans, useTranslation } from \"react-i18next\"\r\nimport { enumContextContratMultiSelect } from \"../../../enums/enumContextContratMultiSelect\";\r\nimport { ContratMultiSelect } from \"../../multiselect/contratMultiSelect\";\r\n\r\nexport const RobContrat = (props) => {\r\n const { t } = useTranslation()\r\n\r\n const onSelectionChange = (e) => {\r\n let _tree = [...props.mobiliteTree]\r\n let _res = { ...e.value };\r\n if (_res.France?.checked == true) {\r\n _tree[1].children.forEach(r => {\r\n r.children.forEach(d => {\r\n delete _res[d.key]\r\n })\r\n delete _res[r.key]\r\n });\r\n }\r\n Object.entries(_res).forEach(row => {\r\n if (row[1].checked == true && _tree[1].children?.filter(r => { return r.key == row[0] }).length > 0) {\r\n let _index = _tree[1].children.map(function (e) { return e.key }).indexOf(row[0])\r\n _tree[1].children[_index].children.forEach(d => {\r\n delete _res[d.key]\r\n })\r\n }\r\n }\r\n )\r\n props.setSelectedMobilites(_res)\r\n }\r\n\r\n const onCheckChange = (value) => {\r\n let _etudiant = { ...props.etudiant };\r\n _etudiant.emploiActuel = value;\r\n props.setEtudiant(_etudiant)\r\n }\r\n\r\n const onContractChange = (e) => {\r\n let val = (e.value || e.target.value) || (typeof e?.target?.getContent === \"function\" && e?.target?.getContent()) || '';\r\n if (val == '') {\r\n val = null;\r\n }\r\n let _etudiant = { ...props.etudiant };\r\n _etudiant.paireContrats = val;\r\n props.setEtudiant(_etudiant);\r\n };\r\n\r\n return (\r\n\r\n \r\n
\r\n \r\n \r\n \r\n onCheckChange(e.value)}\r\n />\r\n
\r\n
\r\n \r\n {!props.submitted && (props.etudiant?.paireContrats?.length == 0 || !props.etudiant?.paireContrats) && }\r\n
\r\n
\r\n \r\n \r\n \r\n onSelectionChange(e)} metaKeySelection={false} display=\"chip\" selectionMode=\"checkbox\" placeholder={t('profile.pick_mobility')} > \r\n {!props.submitted && Object.entries(props.selectedMobilites).length == 0 && } \r\n
\r\n
\r\n )\r\n}","import { Button } from \"primereact/button\"\r\nimport { Fragment, useEffect, useState } from \"react\"\r\nimport { Trans } from \"react-i18next\"\r\nimport { useTranslation } from \"react-i18next\"\r\nimport { enumStatutFormation } from \"../../../enums/enumStatutFormation\"\r\nimport FormationService from \"../../../services/formationService\"\r\nimport { FormCourse } from \"../../form/formProfileComponents/student/studiesComponents/formCourse\"\r\nimport { SelectButton } from 'primereact/selectbutton';\r\n\r\nexport const RobFormation = (props) => {\r\n const { t } = useTranslation()\r\n\r\n const formationService = new FormationService()\r\n\r\n const [loading, setLoading] = useState(true)\r\n const [niveauDiplomes, setNiveauDiplomes] = useState([])\r\n\r\n useEffect(() => {\r\n formationService.getNiveauxEtude()\r\n .then((data) => {\r\n setNiveauDiplomes(data);\r\n })\r\n .catch(\r\n\r\n )\r\n .finally(() => {\r\n setLoading(false)\r\n })\r\n }, [])\r\n\r\n const onDiplomaChange = (value) => {\r\n let _etudiant = { ...props.etudiant };\r\n _etudiant.niveauEtude = value;\r\n props.setEtudiant(_etudiant);\r\n }\r\n\r\n\r\n return (\r\n \r\n
\r\n {!loading &&
\r\n onDiplomaChange(e.value)} />\r\n
}\r\n
\r\n
\r\n
\r\n
\r\n )\r\n}","import { Button } from \"primereact/button\"\r\nimport { useTranslation } from \"react-i18next\"\r\nimport dip_terra_cotta from \"../../images/dipLogo/dip_terra_cotta.png\"\r\n\r\nexport const RobFooterButtons = (props) => {\r\n\r\n const { t } = useTranslation()\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n {props.isEnd ? (\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n >\r\n )}\r\n
\r\n
\r\n )\r\n}","import React, { useEffect, useRef, useState } from 'react';\r\nimport { Toast } from 'primereact/toast';\r\nimport RegistrationOnboardingService from '../../services/registrationOnboardingService';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { ProgressSpinner } from 'primereact/progressspinner';\r\nimport { ProgressBar } from 'primereact/progressbar';\r\nimport './StudentRegistrationOnboardingDialog.css';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { enumUserOnboardingStepName } from '../../enums/enumUserOnboardingStepName';\r\nimport { RobEnd } from './steps/RobEnd';\r\nimport FormationHelper from '../../utils/formationHelper';\r\nimport { RobIntro } from './steps/RobIntro';\r\nimport { Dialog } from 'primereact/dialog';\r\nimport { RobChoix } from './steps/RobChoix';\r\nimport { RobContrat } from './steps/RobContrat';\r\nimport { RobFormation } from './steps/RobFormation';\r\nimport { RobFooterButtons } from './RobFooterButtons';\r\nimport CommuneService from '../../services/communeService';\r\n\r\n\r\nexport const StudentRegistrationOnboardingDialog = (props) => {\r\n const toast = useRef(null);\r\n const { t } = useTranslation();\r\n\r\n const history = useHistory()\r\n\r\n const registrationOnboardingService = new RegistrationOnboardingService();\r\n\r\n const communeService = new CommuneService();\r\n\r\n const [loading, setLoading] = useState(true);\r\n const [submitting, setSubmitting] = useState(false)\r\n const [etudiant, setEtudiant] = useState(null);\r\n const [stepIterator, setStepIterator] = useState(0)\r\n const [maxStep, setMaxStep] = useState(3)\r\n const [currentStepName, setCurrentStepName] = useState(enumUserOnboardingStepName.INTRO);\r\n const [mobiliteTree, setMobiliteTree] = useState([])\r\n const [selectedMobilites, setSelectedMobilites] = useState(null)\r\n const [formationToAdd, setFormationToAdd] = useState(null);\r\n const [isFormationSelected, setIsFormationSelected] = useState(false);\r\n\r\n\r\n\r\n useEffect(() => {\r\n registrationOnboardingService.getEtudiantOnboardingSteps()\r\n .then(data => {\r\n setEtudiant(updateContractTranslation(data))\r\n setupSelectedMobilites(data)\r\n setMaxStep(data.onboardingChoice == 2 ? (setMaxStep(3)) : (setMaxStep(2)))\r\n setupCurrentStep(data)\r\n setLoading(false)\r\n })\r\n .catch(err => {\r\n history.push(\"/\")\r\n })\r\n communeService.getMobiliteAsTree()\r\n .then((res) => {\r\n setupMobiliteTree(res)\r\n })\r\n }, [])\r\n\r\n useEffect(() => {\r\n window.scroll(0, 0);\r\n }, [currentStepName])\r\n\r\n const setupSelectedMobilites = (etudiant) => {\r\n let _selectedMobilites = {}\r\n if (etudiant.mobiliteInternationale == true) {\r\n _selectedMobilites.International = { checked: true, partialChecked: false }\r\n }\r\n if (etudiant.mobiliteFrancaise == true) {\r\n _selectedMobilites.France = { checked: true, partialChecked: false }\r\n }\r\n if (etudiant.mobiliteDepartement.length > 0 || etudiant.mobiliteRegion.length > 0) {\r\n _selectedMobilites.France = { checked: false, partialChecked: true }\r\n }\r\n etudiant.mobiliteRegion.forEach(r => {\r\n _selectedMobilites[`${r.id}`] = { checked: true, partialChecked: false }\r\n });\r\n etudiant.mobiliteDepartement.forEach(r => {\r\n _selectedMobilites[`${r.regionId}`] = { checked: false, partialChecked: true };\r\n _selectedMobilites[`${r.regionId}-${r.id}`] = { checked: true, partialChecked: false };\r\n });\r\n setSelectedMobilites(_selectedMobilites);\r\n }\r\n\r\n const setupMobiliteTree = (regions) => {\r\n let tree = [];\r\n tree.push({ key: \"International\", label: t('geography.international_except_france'), data: \"International\" });\r\n let france = { key: \"France\", label: t('geography.france'), data: \"France\" };\r\n let childrenFrance = [];\r\n regions.forEach(r => {\r\n let region = { key: `${r.id}`, label: r.libelle, data: r.id }\r\n let childrenRegion = []\r\n r.departements.forEach(d => {\r\n let departement = { key: r.id + \"-\" + d.id, label: d.code + \" - \" + d.libelle, data: d.id }\r\n childrenRegion.push(departement);\r\n });\r\n region.children = childrenRegion;\r\n childrenFrance.push(region);\r\n });\r\n france.children = childrenFrance;\r\n tree.push(france);\r\n setMobiliteTree(tree);\r\n }\r\n\r\n const setupCurrentStep = (etudiant) => {\r\n if (etudiant.userOnboardingSteps.length > 0) {\r\n let lastStep = etudiant.userOnboardingSteps.reduce((max, obj) => (max.stepOrder > obj.stepOrder) ? max : obj);\r\n switch (lastStep.stepName) {\r\n case enumUserOnboardingStepName.INTRO:\r\n setCurrentStepName(enumUserOnboardingStepName.CHOIX);\r\n updateProgression(enumUserOnboardingStepName.CHOIX);\r\n break;\r\n case enumUserOnboardingStepName.CHOIX:\r\n if (etudiant.onboardingChoice == 1) {\r\n setCurrentStepName(enumUserOnboardingStepName.FORMATION);\r\n updateProgression(enumUserOnboardingStepName.FORMATION, etudiant);\r\n }\r\n else if (etudiant.onboardingChoice == 2) {\r\n setCurrentStepName(enumUserOnboardingStepName.CONTRAT);\r\n updateProgression(enumUserOnboardingStepName.CONTRAT);\r\n }\r\n break;\r\n case enumUserOnboardingStepName.CONTRAT:\r\n setCurrentStepName(enumUserOnboardingStepName.FORMATION);\r\n updateProgression(enumUserOnboardingStepName.FORMATION, etudiant);\r\n break;\r\n case enumUserOnboardingStepName.FORMATION:\r\n setCurrentStepName(enumUserOnboardingStepName.FIN);\r\n updateProgression(enumUserOnboardingStepName.FIN, etudiant);\r\n case enumUserOnboardingStepName.FIN:\r\n setCurrentStepName(enumUserOnboardingStepName.FIN);\r\n updateProgression(enumUserOnboardingStepName.FIN, etudiant);\r\n break;\r\n }\r\n }\r\n else {\r\n setCurrentStepName(enumUserOnboardingStepName.INTRO)\r\n updateProgression(enumUserOnboardingStepName.INTRO);\r\n }\r\n\r\n }\r\n\r\n\r\n const onFormationClick = () => {\r\n setSubmitting(true)\r\n setMaxStep(2)\r\n let _etudiant = { ...etudiant }\r\n _etudiant.onboardingChoice = 1;\r\n let model = {}\r\n model.etudiant = _etudiant\r\n model.userOnBoardingStep = {\r\n userId: _etudiant.id,\r\n onboardingType: 1,\r\n stepName: enumUserOnboardingStepName.CHOIX,\r\n onboardingCompletion: 2\r\n }\r\n registrationOnboardingService.etudiantRegistrationStepForward(model)\r\n .then(data => {\r\n setEtudiant(updateContractTranslation(data))\r\n setCurrentStepName(enumUserOnboardingStepName.FORMATION);\r\n updateProgression(enumUserOnboardingStepName.FORMATION, data);\r\n })\r\n .catch(err => {\r\n\r\n }).finally(() => {\r\n setSubmitting(false)\r\n });\r\n }\r\n\r\n const onEmploiClick = () => {\r\n setSubmitting(true)\r\n setMaxStep(3)\r\n let _etudiant = { ...etudiant }\r\n _etudiant.onboardingChoice = 2;\r\n _etudiant.rechercheActive = true;\r\n let model = {}\r\n model.etudiant = _etudiant\r\n model.userOnBoardingStep = {\r\n userId: _etudiant.id,\r\n onboardingType: 1,\r\n stepName: enumUserOnboardingStepName.CHOIX,\r\n onboardingCompletion: 2\r\n }\r\n registrationOnboardingService.etudiantRegistrationStepForward(model)\r\n .then(data => {\r\n setEtudiant(updateContractTranslation(data))\r\n setCurrentStepName(enumUserOnboardingStepName.CONTRAT);\r\n updateProgression(enumUserOnboardingStepName.CONTRAT);\r\n })\r\n .catch(err => {\r\n\r\n }).finally(() => {\r\n setSubmitting(false)\r\n });\r\n }\r\n\r\n const onAddFormationClick = () => {\r\n setSubmitting(true);\r\n let _etudiant = {...etudiant}\r\n let model = {}\r\n let _userOnBoardingStep = {\r\n userId: _etudiant.id,\r\n onboardingType: 1,\r\n stepName: enumUserOnboardingStepName.FORMATION,\r\n }\r\n if (isFormationSelected) {\r\n _userOnBoardingStep.onboardingCompletion = 2\r\n let _formation = { ...formationToAdd }\r\n if (typeof (_formation.organismeFormation) === 'object' && typeof (_formation.diplome) === 'object' && typeof (_formation.formation) === 'object') {\r\n _formation.organismeFormation = _formation.organismeFormation.nom\r\n _formation.diplome = _formation.diplome.nom\r\n _formation.nomComplet = _formation.formation.nomComplet\r\n _formation.id = _formation.formation.id\r\n _etudiant = FormationHelper.dispatchFormationsOnEtudiant({ ...etudiant }, [_formation], [])\r\n\r\n }\r\n else {\r\n if (typeof (_formation.organismeFormation) === 'object') {\r\n _formation.organismeFormation = _formation.organismeFormation.nom\r\n }\r\n if (typeof (_formation.diplome) === 'object') {\r\n _formation.diplome = _formation.diplome.nom\r\n }\r\n _formation.id = null\r\n _formation.nomComplet = _formation.formation;\r\n _etudiant = FormationHelper.dispatchFormationsOnEtudiant({ ...etudiant }, [], [_formation])\r\n }\r\n\r\n\r\n } else {\r\n _userOnBoardingStep.onboardingCompletion = 1\r\n }\r\n model.etudiant = _etudiant\r\n model.userOnBoardingStep = _userOnBoardingStep\r\n registrationOnboardingService.etudiantRegistrationStepForward(model)\r\n .then(data => {\r\n setEtudiant(updateContractTranslation(data))\r\n setCurrentStepName(enumUserOnboardingStepName.FIN);\r\n updateProgression(enumUserOnboardingStepName.FIN, data);\r\n })\r\n .catch(err => {\r\n\r\n }).finally(() => {\r\n setSubmitting(false)\r\n });\r\n }\r\n\r\n const onPreviousClick = () => {\r\n setSubmitting(true)\r\n registrationOnboardingService.RegistrationStepBackward()\r\n .then(data => {\r\n if (data.stepName) {\r\n setCurrentStepName(data.stepName);\r\n updateProgression(data.stepName,data);\r\n }\r\n else {\r\n setCurrentStepName(enumUserOnboardingStepName.INTRO);\r\n updateProgression(enumUserOnboardingStepName.INTRO);\r\n }\r\n })\r\n .catch(err => {\r\n\r\n }).finally(() => {\r\n setSubmitting(false)\r\n });\r\n }\r\n\r\n const onNextClick = () => {\r\n switch (currentStepName) {\r\n case enumUserOnboardingStepName.CONTRAT:\r\n onContratValidation();\r\n break;\r\n case enumUserOnboardingStepName.FORMATION:\r\n onAddFormationClick();\r\n break;\r\n case enumUserOnboardingStepName.FIN:\r\n if (etudiant.onboardingChoice == 1) {\r\n setStepIterator(3)\r\n }\r\n else if (etudiant.onboardingChoice == 2) {\r\n setStepIterator(4)\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const updateProgression = (currentStep, etudiant) => {\r\n switch (currentStep) {\r\n case enumUserOnboardingStepName.INTRO:\r\n setStepIterator(0)\r\n break;\r\n case enumUserOnboardingStepName.CHOIX:\r\n setStepIterator(0)\r\n break;\r\n case enumUserOnboardingStepName.CONTRAT:\r\n setStepIterator(1)\r\n break;\r\n case enumUserOnboardingStepName.FORMATION:\r\n if (etudiant.onboardingChoice == 1) {\r\n setStepIterator(1)\r\n }\r\n else if (etudiant.onboardingChoice == 2) {\r\n setStepIterator(2)\r\n }\r\n else {\r\n setStepIterator(stepIterator - 1)\r\n }\r\n break;\r\n case enumUserOnboardingStepName.FIN:\r\n if (etudiant.onboardingChoice == 1) {\r\n setStepIterator(2)\r\n }\r\n else if (etudiant.onboardingChoice == 2) {\r\n setStepIterator(3)\r\n }\r\n else {\r\n setStepIterator(stepIterator - 1)\r\n }\r\n break;\r\n default:\r\n setStepIterator(0)\r\n break;\r\n }\r\n }\r\n\r\n const updateContractTranslation = (etudiant) => {\r\n etudiant.paireContrats.forEach(e => {\r\n e.libelle = t(`enums.paireContrat.${e.code}`);\r\n });\r\n return etudiant\r\n }\r\n\r\n const onLetsGoClick = () => {\r\n setSubmitting(true)\r\n let _etudiant = { ...etudiant }\r\n let model = {}\r\n model.etudiant = _etudiant\r\n model.userOnBoardingStep = {\r\n userId: _etudiant.id,\r\n onboardingType: 1,\r\n stepName: enumUserOnboardingStepName.INTRO,\r\n onboardingCompletion: 2\r\n }\r\n registrationOnboardingService.etudiantRegistrationStepForward(model)\r\n .then(data => {\r\n setEtudiant(updateContractTranslation(data))\r\n setCurrentStepName(enumUserOnboardingStepName.CHOIX);\r\n updateProgression(enumUserOnboardingStepName.CHOIX);\r\n })\r\n .catch(err => {\r\n\r\n }).finally(() => {\r\n setSubmitting(false)\r\n });\r\n }\r\n\r\n const onContratValidation = () => {\r\n setSubmitting(true)\r\n let _etudiant = { ...etudiant }\r\n _etudiant.mobiliteInternationale = false;\r\n _etudiant.mobiliteFrancaise = false;\r\n let _mobiliteRegion = [];\r\n let _mobiliteDepartement = [];\r\n Object.entries(selectedMobilites).forEach(row => {\r\n if (row[1].checked == true) {\r\n if (row[0] == \"International\") {\r\n _etudiant.mobiliteInternationale = true;\r\n } else if (row[0] == \"France\") {\r\n _etudiant.mobiliteFrancaise = true;\r\n } else {\r\n let parts = row[0].split('-')\r\n if (parts.length == 1) {\r\n let _id = parseInt(parts[0])\r\n _mobiliteRegion.push({ id: _id });\r\n }\r\n else if (parts.length == 2) {\r\n let _id = parseInt(parts[1])\r\n _mobiliteDepartement.push({ id: _id });\r\n }\r\n }\r\n }\r\n\r\n })\r\n _etudiant.mobiliteRegion = _mobiliteRegion;\r\n _etudiant.mobiliteDepartement = _mobiliteDepartement;\r\n \r\n if (_etudiant.mobiliteInternationale || _etudiant.mobiliteFrancaise || _etudiant.mobiliteRegion.length > 0 || _etudiant.mobiliteDepartement.length > 0) {\r\n let model = {}\r\n model.etudiant = _etudiant\r\n model.userOnBoardingStep = {\r\n userId: _etudiant.id,\r\n onboardingType: 1,\r\n stepName: enumUserOnboardingStepName.CONTRAT,\r\n onboardingCompletion: 2\r\n }\r\n registrationOnboardingService.etudiantRegistrationStepForward(model)\r\n .then(data => {\r\n setEtudiant(updateContractTranslation(data))\r\n setCurrentStepName(enumUserOnboardingStepName.FORMATION);\r\n updateProgression(enumUserOnboardingStepName.FORMATION,data);\r\n })\r\n .catch(err => {\r\n\r\n }).finally(() => {\r\n setSubmitting(false)\r\n });\r\n }\r\n else {\r\n setSubmitting(false)\r\n }\r\n }\r\n\r\n const onReachingOnboardingEnd = () => {\r\n setSubmitting(true)\r\n let _etudiant = { ...etudiant }\r\n _etudiant.isRegistrationOnboardingCompleted = true\r\n let _currentUser = JSON.parse(localStorage.getItem(\"currentUser\"))\r\n _currentUser.user.isRegistrationOnboardingCompleted = true\r\n localStorage.setItem(\"currentUser\", JSON.stringify(_currentUser))\r\n let model = {}\r\n model.etudiant = _etudiant\r\n model.userOnBoardingStep = {\r\n userId: _etudiant.id,\r\n onboardingType: 1,\r\n stepName: enumUserOnboardingStepName.FIN,\r\n onboardingCompletion: 2\r\n }\r\n registrationOnboardingService.etudiantRegistrationStepForward(model)\r\n .then(data => {\r\n setEtudiant(updateContractTranslation(data))\r\n })\r\n .catch(err => {\r\n }).finally(() => {\r\n setSubmitting(false)\r\n });\r\n }\r\n\r\n const onSetEndTracking = () => {\r\n props.setVisible(false)\r\n }\r\n\r\n const footer = (\r\n currentStepName != enumUserOnboardingStepName.INTRO && currentStepName != enumUserOnboardingStepName.CHOIX &&\r\n onSetEndTracking()}\r\n submitting={submitting}\r\n isEnd={currentStepName == enumUserOnboardingStepName.FIN}\r\n />\r\n )\r\n\r\n return (\r\n \r\n
props.setVisible(false)} footer={footer} blockScroll closable={currentStepName !== enumUserOnboardingStepName.FIN}>\r\n \r\n \r\n {loading ? (\r\n
\r\n ) : (\r\n <>\r\n {currentStepName != enumUserOnboardingStepName.INTRO &&
}\r\n
\r\n {currentStepName == enumUserOnboardingStepName.INTRO && }\r\n {currentStepName == enumUserOnboardingStepName.CHOIX && }\r\n {currentStepName == enumUserOnboardingStepName.CONTRAT && }\r\n {currentStepName == enumUserOnboardingStepName.FORMATION && }\r\n {currentStepName == enumUserOnboardingStepName.FIN && onSetEndTracking()}\r\n etudiant={etudiant}\r\n />}\r\n
\r\n >)}\r\n
\r\n \r\n
\r\n\r\n\r\n )\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport { BrowserRouter as Router, Switch } from 'react-router-dom'\r\nimport './App.css';\r\nimport './theme/theme.css'\r\nimport './theme/form.css'\r\nimport './theme/buttons.css'\r\nimport './theme/dip-theme.css'\r\nimport './theme/dip-wysiwyg.css'\r\nimport PrimeReact, { addLocale } from 'primereact/api';\r\nimport 'primereact/resources/primereact.min.css';\r\nimport 'primeicons/primeicons.css';\r\nimport routes from './config/routes';\r\nimport { AuthProvider } from './context/context';\r\nimport { AppRoutes } from './components/appRoutes';\r\nimport ScrollToTop from './components/scrollToTop';\r\nimport { StudentRegistrationOnboardingDialog } from './components/RegistrationOnboarding/StudentRegistrationOnboardingDialog';\r\nimport { Helmet } from \"react-helmet\";\r\nimport TagManager from 'react-gtm-module';\r\n\r\nPrimeReact.ripple = true;\r\nPrimeReact.autoZIndex = true;\r\n\r\nexport const Page = () => {\r\n\r\n addLocale('fr', {\r\n firstDayOfWeek: 1,\r\n dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\r\n dayNamesShort: ['dim', 'lun', 'mar', 'mer', 'jeu', 'ven', 'sam'],\r\n dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],\r\n monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'decembre'],\r\n monthNamesShort: ['jan', 'fev', 'mar', 'avr', 'mai', 'jun', 'jul', 'aou', 'sep', 'oct', 'nov', 'dec'],\r\n today: 'Ajourd\\'hui',\r\n clear: 'Vider'\r\n });\r\n\r\n const [onBoardingDialogVisible, setOnBoardingDialogVisible] = useState(false)\r\n\r\n useEffect(() => {\r\n\r\n if (process.env.REACT_APP_GTM_ID) {\r\n window.GTM_ID = process.env.REACT_APP_GTM_ID;\r\n }\r\n if (window.GTM_ID) {\r\n\r\n const tagManagerArgs = {\r\n gtmId: window.GTM_ID\r\n }\r\n console.log(\"GTM-INIT\");\r\n TagManager.initialize(tagManagerArgs)\r\n }\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n DiplomAdvisor \r\n \r\n \r\n \r\n \r\n \r\n {/* */}\r\n\r\n \r\n \r\n {routes.map((route) => (\r\n setOnBoardingDialogVisible(true)}\r\n headerTheme={route.headerTheme}\r\n backgroundTheme={route.backgroundTheme}\r\n />\r\n ))}\r\n \r\n {onBoardingDialogVisible && }\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n// here app catches the suspense from page in case translations are not yet loaded\r\nexport const App = () => {\r\n return (\r\n \r\n );\r\n}\r\n\r\n","const reportWebVitals = onPerfEntry => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import i18n from 'i18next';\r\nimport { initReactI18next } from 'react-i18next';\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\nimport Backend from 'i18next-http-backend';\r\nimport { DateTime } from 'luxon';\r\n\r\ni18n\r\n // i18next-http-backend\r\n // loads translations from your server\r\n // https://github.com/i18next/i18next-http-backend\r\n .use(Backend)\r\n // detect user language\r\n // learn more: https://github.com/i18next/i18next-browser-languageDetector\r\n .use(LanguageDetector)\r\n // pass the i18n instance to react-i18next.\r\n .use(initReactI18next)\r\n // init i18next\r\n // for all options read: https://www.i18next.com/overview/configuration-options\r\n .init({\r\n debug: true,\r\n fallbackLng: 'fr',\r\n interpolation: {\r\n escapeValue: false, // not needed for react as it escapes by default\r\n format: (value, format, lng) => {\r\n if (value instanceof Date) {\r\n return DateTime.fromJSDate(value).setLocale(lng).toLocaleString(DateTime[format])\r\n }\r\n return value;\r\n }\r\n },\r\n react: {\r\n wait: true,\r\n useSuspense: false\r\n },\r\n });\r\n\r\nexport default i18n;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { App } from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport TagManager from 'react-gtm-module';\r\nimport CookieConsent, { Cookies, getCookieConsentValue } from \"react-cookie-consent\";\r\nimport './i18n';\r\n\r\nimport './index.css';\r\nimport './theme/palette.css';\r\n\r\nif (process.env.REACT_APP_API_URL) {\r\n window.API_URL = process.env.REACT_APP_API_URL;\r\n}\r\nif (!window.API_URL)\r\n throw new Error(\"API_URL not defined\");\r\n\r\nif (process.env.REACT_APP_STRIPE_PUBLIC_KEY) {\r\n window.STRIPE_PUBLIC_KEY = process.env.REACT_APP_STRIPE_PUBLIC_KEY;\r\n}\r\n\r\nif (!window.STRIPE_PUBLIC_KEY)\r\n throw new Error(\"STRIPE_PUBLIC_KEY not defined\");\r\n\r\nif (process.env.REACT_APP_STRIPE_PORTAL_URL) {\r\n window.STRIPE_PORTAL_URL = process.env.REACT_APP_STRIPE_PORTAL_URL;\r\n}\r\n\r\nif (!window.STRIPE_PORTAL_URL)\r\n throw new Error(\"STRIPE_PORTAL_URL not defined\");\r\n\r\nReactDOM.render(\r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""}