templates/offer/index.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block page_contents %}
  3. <section class="section section-page-title bg-gradient py-xl-5 py-4" data-aos='fade-down'>
  4.   <div class="container">
  5.     <div class="row">
  6.       <div class="col-12 text-center text-white">
  7.         <h1 class="page-name font-weight-bold my-2">{% trans %}Soumettre une offre d’emploi{% endtrans %}</h1>
  8.       </div>
  9.     </div>
  10.   </div>
  11. </section>
  12. <section class="section section-form-information my-4">
  13.   <div class="container">
  14.     <div class="row">
  15.       <div class="col-xl-10 mx-auto">
  16.         <div class="i-box pt-4 pb-3 px-4" data-aos='zoom-in'>
  17.           <div class="font-weight-bold text-center text-purple mb-3 font-20">{% trans %}Vous souhaitez déposer une offre d’emploi pour une alternance, un stage ou une embauche ?{% endtrans %}</div>
  18.           <div class="row text-dark-purple">
  19.             <div class="col-lg-6">
  20.               <div class="font-weight-bold mb-2">{% trans %}Comment intégrer nos étudiants ?{% endtrans %}</div>
  21.               <ul class="pl-4">
  22.                 <li>{% trans %}Alternance (disponibles 4 jours/semaine en entreprise, 1 jour à l’école){% endtrans %}</li>
  23.                 <li>{% trans %}Stage pour l’été ou en stage alterné toute l’année{% endtrans %}</li>
  24.                 <li>{% trans %}CDI pour les étudiants en fin d’études{% endtrans %}</li>
  25.               </ul>
  26.             </div>
  27.             <div class="col-lg-6">
  28.               <div class="font-weight-bold mb-2">{% trans %}3 Spécialisations technologiques et 2 MBA :{% endtrans %}</div>
  29.               <ul class="pl-4">
  30.                 {% for expertise in expertises %}
  31.                   <li>{{ expertise.name }}</li>
  32.                 {% endfor %}
  33.               </ul>
  34.             </div>
  35.           </div>
  36.         </div>
  37.       </div>
  38.     </div>
  39.   </div>
  40. </section>
  41. <section class="section section-form section-form-2">
  42.   <div class="container">
  43.     <div class="row">
  44.       <div class="col-xl-10 mx-auto mb-4" data-aos='fade-up'>
  45.         <div class="section-title mb-3"><span>/</span> {% trans %}Déposer une offre{% endtrans %}</div>
  46.         <p class="text-center text-dark-purple">{% trans %}Merci de remplir le formulaire ci-dessous, suite auquel nous vous recontacterons.{% endtrans %}</p>
  47.         <form id="form-offer" data-aos='fade-up'>
  48.           <div class="row">
  49.             <div class="col-lg-3 col-md-4">
  50.               <div class="box-logo d-flex flex-column h-100">
  51.                 <div class="mb-1 text-md-left text-center">{% trans %}Logo{% endtrans %}</div>
  52.                 <div class="text-center b-user-img mb-3">
  53.                   <div class="ml-md-0 mx-auto">
  54.                     <img id='item-img-output' class="img-photo rounded" src="{{ asset('assets/images/no-img/mask-logo.png') }}">
  55.                     <input hidden id="file_photo" name="logo" accept=".jpg, .jpeg, .png" type="file">
  56.                     <i class="fa-solid fa-camera" aria-hidden="true"></i>
  57.                   </div>
  58.                 </div>
  59.               </div>
  60.             </div>
  61.             <div class="col-lg-9 col-md-8 d-flex flex-column justify-content-center">
  62.               <div class="form-group">
  63.                 <input type="text" class="form-control" name="companyName" placeholder="{% trans %}Nom de l'entreprise *{% endtrans %}" required>
  64.               </div>
  65.               <div class="form-group">
  66.                 <input type="text" class="form-control" name="website" placeholder="Site web">
  67.               </div>
  68.             </div>
  69.           </div>
  70.           <div class="form-group">
  71.             <textarea class="form-control" name="presentation" placeholder="{% trans %}Bref présentaion de l'entreprise{% endtrans %}"></textarea>
  72.           </div>
  73.           <div class="form-header font-weight-bold text-dark-purple mb-3">{% trans %}Information de contact{% endtrans %}</div>
  74.           <div class="row">
  75.             <div class="col-lg-4 d-flex flex-column">
  76.               <div class="form-group row row-gender align-items-center mt-2">
  77.                 <label class="col-form-label font-weight-normal col-4 pt-0 pb-0">{% trans %}Civilité{% endtrans %}<span class="text-orange">*</span> :</label>
  78.                 <div class="col-8 pl-0">
  79.                     <div class="form-check form-check-inline mr-0">
  80.                       <div class="custom-control custom-radio">
  81.                           <input type="radio" class="custom-control-input" id="mrs" name="gender" value="1" required>
  82.                           <label class="custom-control-label text-dark-purple" for="mrs">{% trans %}Madame{% endtrans %}</label>
  83.                       </div>
  84.                     </div>
  85.                     <div class="form-check form-check-inline ml-3 mr-0">
  86.                       <div class="custom-control custom-radio">
  87.                           <input type="radio" class="custom-control-input" id="mr" name="gender" value="0" required>
  88.                           <label class="custom-control-label text-dark-purple" for="mr">{% trans %}Monsieur{% endtrans %}</label>
  89.                       </div>
  90.                     </div>
  91.                 </div>
  92.               </div>
  93.               <div class="form-group mt-auto">
  94.                 <input type="text" class="form-control" name="position" placeholder="{% trans %}Fonction{% endtrans %}*" required>
  95.               </div>
  96.             </div>
  97.             <div class="col-lg-4">
  98.               <div class="form-group">
  99.                 <input type="text" class="form-control" name="firstName" placeholder="{% trans %}Prénom{% endtrans %}*" required>
  100.               </div>
  101.               <div class="form-group">
  102.                 <input type="text" class="form-control" name="email" placeholder="Email*" required>
  103.               </div>
  104.             </div>
  105.             <div class="col-lg-4">
  106.               <div class="form-group">
  107.                 <input type="text" class="form-control" name="lastName" placeholder="Nom*" required>
  108.               </div>
  109.               <div class="form-group">
  110.                 <input type="text" class="form-control" name="phone" placeholder="{% trans %}Téléphone{% endtrans %}*" required>
  111.               </div>
  112.             </div>
  113.           </div>
  114.           <div class="form-group row row-gender align-items-center mt-2">
  115.             <label class="col-form-label font-weight-normal pl-3 pt-0 pb-0 text-nowrap">{% trans %}De quelle manière préférez-vous être contactée ?{% endtrans %}</label>
  116.             <div class="col pl-0 ml-3">
  117.               <div class="form-check form-check-inline mr-0">
  118.                 <div class="custom-control custom-checkbox">
  119.                     <input type="checkbox" class="custom-control-input" id="offerType-phone" name="offerType[0]" value="0">
  120.                     <label class="custom-control-label text-dark-purple" for="offerType-phone">{% trans %}Téléphone{% endtrans %}</label>
  121.                 </div>
  122.               </div>
  123.               <div class="form-check form-check-inline ml-3 mr-0">
  124.                 <div class="custom-control custom-checkbox">
  125.                     <input type="checkbox" class="custom-control-input" id="offerType-email" name="offerType[1]" value="1">
  126.                     <label class="custom-control-label text-dark-purple" for="offerType-email">{% trans %}Email{% endtrans %}</label>
  127.                 </div>
  128.               </div>
  129.             </div>
  130.           </div>
  131.           <div class="form-header font-weight-bold text-purple mb-3">{% trans %}Votre offre d’emploi{% endtrans %}</div>
  132.           <div class="form-group">
  133.             <input type="text" class="form-control" name="offerTitle" placeholder="{% trans %}Intitulé de l'offre *{% endtrans %}" required>
  134.           </div>
  135.           <div class="form-header font-weight-bold text-dark-purple mb-3">{% trans %}Type de contrat{% endtrans %}</div>
  136.           <div class="form-group row">
  137.             <div class="col-lg-2">
  138.               <div class="form-check mx-0 px-0 mb-2">
  139.                 <div class="custom-control custom-radio">
  140.                     <input type="radio" class="custom-control-input" id="contract-1" name="contract" value="1">
  141.                     <label class="custom-control-label text-dark-purple font-weight-normal" for="contract-1">CDI</label>
  142.                 </div>
  143.               </div>
  144.               <div class="form-check mx-0 px-0 mb-2">
  145.                 <div class="custom-control custom-radio">
  146.                     <input type="radio" class="custom-control-input" id="contract-2" name="contract" value="2">
  147.                     <label class="custom-control-label text-dark-purple font-weight-normal" for="contract-2">CDD</label>
  148.                 </div>
  149.               </div>
  150.             </div>
  151.             <div class="col-lg-4">
  152.               <div class="form-check mx-0 px-0 mb-2">
  153.                 <div class="custom-control custom-radio">
  154.                     <input type="radio" class="custom-control-input" id="contract-3" name="contract" value="3">
  155.                     <label class="custom-control-label text-dark-purple font-weight-normal" for="contract-3">Stage d’été</label>
  156.                 </div>
  157.               </div>
  158.               <div class="form-check mx-0 px-0 mb-2">
  159.                 <div class="custom-control custom-radio">
  160.                     <input type="radio" class="custom-control-input" id="contract-4" name="contract" value="4">
  161.                     <label class="custom-control-label text-dark-purple font-weight-normal" for="contract-4">Stage alterné • 4j/semaine</label>
  162.                 </div>
  163.               </div>
  164.             </div>
  165.             <div class="col-lg-6">
  166.               <div class="form-check mx-0 px-0 mb-2">
  167.                 <div class="custom-control custom-radio">
  168.                     <input type="radio" class="custom-control-input" id="contract-5" name="contract" value="5">
  169.                     <label class="custom-control-label text-dark-purple font-weight-normal" for="contract-5">Contrat d’apprentissage • 4j/semaine</label>
  170.                 </div>
  171.               </div>
  172.               <div class="form-check mx-0 px-0 mb-2">
  173.                 <div class="custom-control custom-radio">
  174.                     <input type="radio" class="custom-control-input" id="contract-6" name="contract" value="6">
  175.                     <label class="custom-control-label text-dark-purple font-weight-normal" for="contract-6">Contrat de professionnalisation • 4j/semaine</label>
  176.                 </div>
  177.               </div>
  178.             </div>
  179.           </div>
  180.           <div class="form-header font-weight-bold text-dark-purple mb-3">{% trans %}Domaine/Expertise <span class="text-orange">*</span>{% endtrans %}</div>
  181.           <div class="form-group checkbox-expertise-required">
  182.             {% for i,expertise in expertises %}
  183.             <div class="form-check mx-0 px-0 mb-2">
  184.               <div class="custom-control custom-checkbox">
  185.                   <input type="checkbox" class="custom-control-input" id="expertise-{{ expertise.id }}" name="expertise[{{i}}]" value="{{ expertise.id }}">
  186.                   <label class="custom-control-label text-dark-purple font-weight-normal" for="expertise-{{ expertise.id }}">{{ expertise.name }}</label>
  187.               </div>
  188.             </div>
  189.             {% endfor %}
  190.           </div>
  191.           <div class="form-header font-weight-bold text-dark-purple mb-3">{% trans %}À proximité du campus{% endtrans %}</div>
  192.           <div class="form-group row">
  193.             {% for i,campus in campuses %}
  194.             <div class="col-lg-3 col-md-6">
  195.               <div class="form-check mx-0 px-0 mb-2">
  196.                 <div class="custom-control custom-checkbox">
  197.                   <input type="checkbox" class="custom-control-input" id="campuses-{{ campus.id }}" name="campuses[{{i}}]" value="{{ campus.id }}">
  198.                   <label class="custom-control-label text-dark-purple font-weight-normal" for="campuses-{{ campus.id }}">{{ campus.name }}</label>
  199.                 </div>
  200.               </div>
  201.             </div>
  202.             {% endfor %}
  203.           </div>
  204.           <div class="form-group row">
  205.             <div class="col-lg-6 mb-lg-0 mb-3">
  206.               <select class="form-control" name="studyLevel">
  207.                 <option value>{% trans %}Niveau minimum requis{% endtrans %}</option>
  208.                 {% for studyLevel in studyLevels %}
  209.                   <option value="{{ studyLevel.id }}">{{ studyLevel.name }}</option>
  210.                 {% endfor %}
  211.               </select>
  212.             </div>
  213.             <div class="col-lg-6">
  214.               <input type="number" class="form-control" min="0" name="duration" placeholder="{% trans %}Durée du contrat (par mois){% endtrans %}">
  215.             </div>
  216.           </div>
  217.           <div class="form-group">
  218.             <textarea class="form-control" name="description" placeholder="{% trans %}Description de votre offre{% endtrans %}"></textarea>
  219.           </div>
  220.           <div class="form-group">
  221.             <textarea class="form-control" name="expectProfile" placeholder="{% trans %}Profil recherché{% endtrans %}"></textarea>
  222.           </div>
  223.           <div class="form-header font-weight-bold text-dark-purple mb-3">
  224.             {% trans %}Sélectionnez les compétences nécessaires pour cette offre <span class="font-weight-normal font-italic">(<span id="skill-selected">0</span> compétence(s) sélectionnée(s))</span>{% endtrans %}
  225.           </div>
  226.           <div class="list-offre-checkbox mb-3">
  227.             {% for i,skill in skills %}
  228.             <label class="switch">
  229.               <input type="checkbox" name="skill[{{i}}]" value="{{ skill.id }}">
  230.               <span class="slider">{{ skill.name }}</span>
  231.             </label>
  232.             {% endfor %}
  233.           </div>
  234.           <div class="form-group row">
  235.             <div class="col-lg-6 mb-lg-0 mb-3">
  236.               <div class="offre-date position-relative mt-1">
  237.                 <input type="text" class="form-control" id="datepicker-min" name="validDate" placeholder="{% trans %}Date de validité{% endtrans %}" required>
  238.               </div>
  239.             </div>
  240.             <div class="col-lg-6 field-upload">
  241.               <div class="group-item">
  242.                 <input id="curriculumVitae" type="file" class="form-control" name="descriptionFile" accept=".pdf,.docx,.doc"/>
  243.                 <label class="d-flex flex-column" for="curriculumVitae">
  244.                   <div class="d-flex flex-sm-row flex-column">
  245.                     <div class="flex-1 text-dark-purple line-height-normal">
  246.                       <div class="font-weight-bold">{% trans %}Pièce jointe de la fiche du poste{% endtrans %}</div>
  247.                       <div class="font-weight-normal font-14">{% trans %}(format accepté : pdf, word. Taille max : 10 MB){% endtrans %}</div>
  248.                     </div>
  249.                     <span class="upload-btn cursor bg-dark-purple ml-sm-auto mx-auto mt-sm-0 mt-3">{% trans %}Télécharger{% endtrans %}</span>
  250.                   </div>
  251.                   <div class="file-desc flex-1 d-flex align-items-center mt-2 mb-4 pl-0">
  252.                     <i class="fa-solid fa-paperclip-vertical text-orange mr-2"></i>
  253.                     <span class="upload-file-name"></span>
  254.                     <i class="far fa-xmark ml-3 text-red cursor" data-id></i>
  255.                   </div>
  256.                 </label>
  257.               </div>
  258.             </div>
  259.           </div>
  260.           {% if captcha_enabled %}
  261.             <div class="captcha-row mb-4 d-flex justify-content-center">
  262.                 <div class="g-recaptcha animate__animated" data-sitekey="{{captcha_key}}"></div>
  263.             </div>
  264.           {% endif %}
  265.           <div class="notification-error mb-4 text-center text-danger font-weight-bold" style="display: none;"></div>
  266.           <div class="text-center form-submit">
  267.             <button type="submit" id="btn-submit" class="link-gradient"><span>{% trans %}Soumettre votre offre{% endtrans %}</span><i class="far fa-arrow-right"></i></button>
  268.           </div>
  269.         </form>
  270.       </div>
  271.     </div>
  272.   </div>
  273. </section>
  274. <div class="modal fade" id="uploadModal" tabindex="-1" role="dialog" aria-labelledby="uploadModalTitle" aria-hidden="true">
  275.   <div class="modal-dialog" role="document">
  276.     <div class="modal-content">
  277.       <div class="modal-header">
  278.         <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  279.           <span aria-hidden="true">&times;</span>
  280.         </button>
  281.       </div>
  282.       <div class="modal-body">
  283.         <div class="container px-0">
  284.           <div class="row">
  285.             <div class="col-12">
  286.               <div id="upload-demo"></div>
  287.             </div>
  288.           </div>
  289.         </div>
  290.         <div class="text-center mt-3">
  291.           <button type="button" id="cancelCropBtn" class="common-btn btn-cancel" data-dismiss="modal">{% trans %}Annuler{% endtrans %}</button>
  292.           <button type="button" id="cropImageBtn" class="common-btn">{% trans %}Recadrer{% endtrans %}</button>
  293.         </div>
  294.       </div>
  295.     </div>
  296.   </div>
  297. </div>
  298. <div class="modal fade" id="thankYouModal" tabindex="-1" role="dialog" aria-labelledby="thankYouModalTitle" aria-hidden="true">
  299.   <div class="modal-dialog modal-dialog-centered" role="document">
  300.     <div class="modal-content">
  301.       <div class="modal-header">
  302.         <a href="{{ path('home') }}">
  303.           <img src="{{ asset('assets/images/logo.svg') }}" alt="Estiam France">
  304.         </a>
  305.       </div>
  306.       <div class="modal-body">
  307.         <div class="text-center mb-4">
  308.           {% trans %}Merci ! Votre offre a été bien envoyée.{% endtrans %}<br/>
  309.           {% trans %}Notre service dédié va vous contacter très bientôt.{% endtrans %}<br/>
  310.           {% trans %}L'équipe ÉSTIAM.{% endtrans %}
  311.         </div>
  312.         <div class="text-center">
  313.           <button type="button" class="common-btn clean-form" data-dismiss="modal">{% trans %}Fermer{% endtrans %}</button>
  314.         </div>
  315.       </div>
  316.     </div>
  317.   </div>
  318. </div>
  319. {% endblock %}
  320. {% block custom_javascripts %}
  321. <script src="{{ asset('assets/js/croppie.js') }}"></script>
  322. <script type="text/javascript">
  323. $(document).ready(function(){
  324.   /* === Crop logo --- */
  325.   $('.img-photo').on('click', function () {
  326.       $('#file_photo').click();
  327.     });
  328.     $('.b-user-img i').on('click', function () {
  329.       $('#file_photo').click();
  330.     });
  331.     $('#file_photo').change(function(){
  332.       $('#uploadModal').modal('show');
  333.       $('.close').click(function () {
  334.           $("#myModal").modal('hide');
  335.       });
  336.       $('#cancelCropBtn').click(function () {
  337.           $("#myModal").modal('hide');
  338.       });
  339.   });
  340.   var $uploadCrop,
  341.       tempFilename,
  342.       rawImg,
  343.       imageId,
  344.       base64ImageContent;
  345.   function readFile(input) {
  346.     if (input.files && input.files[0]) {
  347.       var reader = new FileReader();
  348.       reader.onload = function (e) {
  349.         $('.upload-demo').addClass('ready');
  350.         $('#uploadModal').modal('show');
  351.         rawImg = e.target.result;
  352.       }
  353.       reader.readAsDataURL(input.files[0]);
  354.     }
  355.     else {
  356.       swal("Sorry - you're browser doesn't support the FileReader API");
  357.     }
  358.   }
  359.   $uploadCrop = $('#upload-demo').croppie({
  360.     viewport: {
  361.       width: 150,
  362.       height: 150,
  363.       type: 'square'
  364.     },
  365.     boundary: {
  366.         width: 300,
  367.         height: 300
  368.     },
  369.     enforceBoundary: false,
  370.     enableExif: true
  371.   });
  372.   $('#uploadModal').on('shown.bs.modal', function(){
  373.     $uploadCrop.croppie('bind', {
  374.       url: rawImg
  375.     }).then(function(){
  376.       console.log('jQuery bind complete');
  377.     });
  378.   });
  379.   $('#file_photo').on('change', function () { 
  380.     readFile(this); 
  381.   });
  382.   $('#cropImageBtn').on('click', function (ev) {
  383.     $uploadCrop.croppie('result', {
  384.       type: 'base64',
  385.       format: 'png',
  386.       fill: '#fff',
  387.       size: {
  388.         width: 160, 
  389.         height: 160
  390.       }
  391.     }).then(function (resp) {
  392.       $('#item-img-output').attr('src', resp);
  393.       var image = $('#item-img-output').attr('src');
  394.       // base64ImageContent = image.replace(/^data:image\/(jpeg|jpg);base64,/, "");
  395.       base64ImageContent = image;
  396.     });
  397.     $('#uploadModal').modal('hide');
  398.   });
  399.   /* === Upload file --- */
  400.   var input = $('.field-upload input[type=file]');
  401.   input.each(function(event){
  402.     $(this).change(function(event) {
  403.       let result = checkFile($(this));
  404.       if(result){
  405.         $(this).val('');
  406.         $('.notification-error').text(result).show();
  407.         handleNotification($('.notification-error'));
  408.         return false;
  409.       }
  410.       $(this).addClass('selected');
  411.       $('.upload-file-name').html(event.target.files[0].name);
  412.     });
  413.   });
  414.   var current_input;
  415.   $('.fa-xmark').click(function (event) {
  416.     current_input = $(this).closest('.group-item').find('input[type=file]');
  417.     event.preventDefault();
  418.     event.stopPropagation();
  419.     current_input.val('');
  420.     current_input.removeClass('selected');
  421.   });
  422.   $('.switch input').click(function(){
  423.     let selectedSkill = $('.switch input:checked').length;
  424.     // if(selectedSkill > 5){
  425.     //   this.checked = false;
  426.     //   $('.notification-error').text(`{% trans %}Vous avez la possibilité de choisir 5 options au maximum{% endtrans %}`).show();
  427.     //   handleNotification($('.notification-error'));
  428.     //   return false;
  429.     // }
  430.     $('#skill-selected').text(selectedSkill);
  431.   });
  432.   
  433.  
  434.   
  435.   $('#form-offer').on('submit', function (e) {
  436.       event.preventDefault();
  437.       let $button = $(this).find('#btn-submit');
  438.       loadButton($button);
  439.       {% if captcha_enabled %}
  440.         if (grecaptcha.getResponse().length == 0) {
  441.           $('.notification-error').text('{% trans %}Veuillez vérifier le recaptcha{% endtrans %}').show();
  442.           handleNotification($('.notification-error'));
  443.           removeLoadButton($button);
  444.  
  445.           e.preventDefault();
  446.           return false;
  447.         }
  448.       {% endif %}
  449.       if(isChecked('.checkbox-expertise-required')){
  450.         showMessage('{% trans %}Veuillez sélectionner Domaine/Expertise{% endtrans %}');
  451.         return false;
  452.       }
  453.       // Cover form data
  454.       let data = {};
  455.       var formData = new FormData();
  456.       $(this).serializeArray().forEach((object)=>{
  457.           data[object.name] = object.value;
  458.       });
  459.       if(base64ImageContent){
  460.         const file = DataURIToBlob(base64ImageContent);
  461.         formData.append('logo', file, 'image.jpg') ;
  462.       }
  463.       if($("input[name=descriptionFile]")[0].files[0]){
  464.         formData.append(`descriptionFile`, $("input[name=descriptionFile]")[0].files[0]);
  465.       }
  466.       for (var key in data ) {
  467.         formData.append(key, data[key]);
  468.       }
  469.       // End cover form data
  470.       $.ajax({
  471.         url: "{{ path('offer.save') }}",
  472.         type: "POST",
  473.         dataType: 'json',
  474.         data : formData,
  475.         contentType: false,
  476.         processData: false,
  477.         success: function(result) {
  478.           if(result.status == 'success'){
  479.             base64ImageContent = null;
  480.             resetForm();
  481.             $('#thankYouModal').modal();
  482.             removeLoadButton($button)
  483.           }else{
  484.             $('.notification-error').text(result.errors.errorMessage).show();
  485.           }
  486.           grecaptcha.reset();
  487.         }
  488.       }).always(function () {
  489.         removeLoadButton($button)
  490.       });
  491.   });
  492. }) ;
  493. function resetForm(){
  494.   $('#form-offer').each(function(){
  495.     this.reset();
  496.     $('.fa-xmark').trigger('click');
  497.     $('#item-img-output').attr('src','');
  498.     $('#skill-selected').text(0);
  499.   });
  500. }
  501. </script>
  502. {% endblock %}