Compare commits

...

13 Commits

Author SHA1 Message Date
llaniau f5008ea3de US340 : Modif texte bouton ajout comp 2020-11-09 21:31:53 +01:00
llaniau fc3d9d71a7 US340 : corect bugs sur l'affichage du bouton save 2020-11-09 21:11:51 +01:00
llaniau a3212a5b17 US240 : Mise en page de l'ajout de compétences 2020-11-09 19:38:07 +01:00
llaniau 6760343163 US 340 : suite 2020-11-05 13:13:17 +01:00
llaniau 720e112d3c US340 : Suite (api pole emploi competence) 2020-11-04 15:03:02 +01:00
llaniau 383b129317 US 340 : Suite dev ajour competence Pole emploi 2020-11-03 13:42:45 +01:00
llaniau 886a931221 US340 : Mise en place api pole emploi 2020-11-02 23:13:25 +01:00
llaniau 8cfeb2906b Ajout du champ temps de travail 2020-10-28 17:03:32 +01:00
llaniau f2d8e569a2 Multipage ajax pour candidatures 2020-10-27 18:23:15 +01:00
llaniau d03c1615b1 Mise en place du multi page ajax 2020-10-26 18:19:13 +01:00
llaniau 36fdf82d18 Partage de candidature vue anonyme 2020-10-22 12:23:06 +02:00
llaniau 3bdc692f5d partage de candidat vue anonyme 2020-10-20 18:32:58 +02:00
llaniau 1e81d2835d Mise en place du partage de condidat 2020-10-20 17:32:58 +02:00
27 changed files with 6325 additions and 792 deletions
@@ -0,0 +1,268 @@
{% extends 'admin/base_admin.html.twig' %}
{% block js %}
{# <link rel="stylesheet" href="//cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css">
<link rel="stylesheet" href="https://cdn.datatables.net/buttons/1.4.1/css/buttons.dataTables.min.css"> #}
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.22/css/jquery.dataTables.min.css">
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/buttons/1.6.4/css/buttons.dataTables.min.css">
{# <script type="text/javascript" language="javascript" src="https://code.jquery.com/jquery-3.5.1.js"></script>
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.10.22/js/jquery.dataTables.min.js"></script>
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/buttons/1.6.4/js/dataTables.buttons.min.js"></script>
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/buttons/1.6.4/js/buttons.flash.min.js"></script> #}
<script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/1.10.22/js/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/buttons/1.6.4/js/dataTables.buttons.min.js"></script>
<script type="text/javascript" language="javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script type="text/javascript" language="javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/pdfmake.min.js"></script>
<script type="text/javascript" language="javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/vfs_fonts.js"></script>
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/buttons/1.6.4/js/buttons.html5.min.js"></script>
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/buttons/1.6.4/js/buttons.print.min.js"></script>
{# <script type="text/javascript" src="https://cdn.datatables.net/buttons/1.6.4/js/buttons.flash.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/pdfmake.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/vfs_fonts.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/buttons/1.6.4/js/buttons.html5.min.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/buttons/1.6.4/js/buttons.print.min.js"></script> #}
{% endblock %}
{% block contentHeader %}
<h1>
Liste des Candidatures
</h1>
<ol class="breadcrumb">
<li><a href="{{ path('admin_dashboard') }}"><i class="fa fa-dashboard"></i> Dashboard</a></li>
<li class="active">Annonces</li>
</ol>
{% endblock %}
{% block content %}
<style type="text/css">
/* Hide default search box */
.dataTables_filter {
display: none;
}
</style>
<div class="box box-primary">
<div class="box-body">
<table width="100%" class="table " style="background-color: #3c8dbc">
<thead>
<tr>
<th colspan="5" class="text-center">RECHERCHE</th>
</tr>
</thead>
<tr>
<th width="4%"><input id='input1' type='text' class='form-control' placeholder='par id' style='font-family:Arial, FontAwesome; width:100%'/></th>
<th width="11%"><input id='input3' type='text' class='form-control' placeholder='par nom' style='font-family:Arial, FontAwesome; width:100%'/></th>
<th width="11%"><input id='input4' type='text' class='form-control' placeholder='par prénom' style='font-family:Arial, FontAwesome; width:100%'/></th>
<th width="25%"><input id='input5' type='text' class='form-control' placeholder='par entreprise / offre' style='font-family:Arial, FontAwesome; width:100%'/></th>
<th width="15%"><input id='input7' type='text' class='form-control' placeholder='par statut' style='font-family:Arial, FontAwesome; width:100%'/></th>
</tr>
</table>
<br/>
<table id="towns_dt_table" width="100%" class="table table-hover table-bordered">
{# Add a tfoot which will actually be used to place the individual search boxes #}
<tfoot>
<tr>
<th width="4%">id</th>
<th width="6%">Date d'envoi</th>
<th width="11%">Nom</th>
<th width="11%">Prénom</th>
<th width="25%">Annonce / entreprise</th>
<th width="28%">Vidéo</th>
<th width="15%">Statut</th>
<th width="10%">Actions</th>
</tr>
{# <tr>
<th><input id='input1' type='text' class='form-control' placeholder='' style='font-family:Arial, FontAwesome; width:100%'/></th>
<th></th>
<th><input id='input3' type='text' class='form-control' placeholder='' style='font-family:Arial, FontAwesome; width:100%'/></th>
<th><input id='input4' type='text' class='form-control' placeholder='' style='font-family:Arial, FontAwesome; width:100%'/></th>
<th></th>
<th><input id='input5' type='text' class='form-control' placeholder='' style='font-family:Arial, FontAwesome; width:100%'/></th>
</tr> #}
</tfoot>
<thead>
<tr>
<th>Id</th>
<th>Date d'envoi</th>
<th>Nom</th>
<th>Prénom</th>
<th>Annonce / entreprise</th>
<th>Vidéo</th>
<th>Statut</th>
<th>Actions</th>
</tr>
</thead>
<tbody></tbody>
</table>
{# <table id="answer_list_table" class="table table-hover table-bordered">
<thead>
<tr>
<th class="col-xs-2">Date d'envoi</th>
<th>Utilisateur</th>
<th>Annonce / Entreprise</th>
<th>video</th>
<th>Status</th>
<th>action</th>
</tr>
</thead>
<tbody>
{% for answer in answers if answer.status != "DRAFT" %}
<tr>
<td data-order="{{ answer.sendTime|date('U') }}">{{ answer.sendTime|date('d/m/Y') }}</td>
<td>{{ answer.user.firstname }} {{ answer.user.lastname }}</td>
{% if answer.ad %}
<td>{{ answer.ad.company.brandname }} - {{ answer.ad.title }}</td>
{% else %}
<td>{{ answer.company.brandname }}</td>
{% endif %}
<td>
ID Candidature : {{ answer.id }}<br />
{% if answer.video.cdnUrl is defined %}
<iframe src="https://player.vimeo.com/video/{{ answer.video.cdnUrl|replace({ "/videos/": ""}) }}"
width="auto" height="auto" frameborder="0" webkitallowfullscreen mozallowfullscreen
allowfullscreen></iframe>
{% endif %}
</td>
<td class="status">{{ answer.status }}</td>
<td>
Actions :
<select class="changeStatus" name="changeStatus" data-id="{{ answer.id }}">
<option value="null">choisir</option>
<option value="SENDED">Envoyé</option>
<option value="DRAFT">Brouillon</option>
<option value="REFUSED">Refuser</option>
</select>
<br />
<a class="delete-answer" href='{{ path("admin_answer_delete",{'id':answer.id }) }}' data-toggle="tooltip" title="Supprimer">
Supprimer <i class="fa fa-trash"></i>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table> #}
</div>
</div>
{% endblock %}
{% block javascripts %}
<script>
$(document).ready(function(){
// Add a text input to each footer cell
var pos = 1;
$('#towns_dt_table tfoot th').each( function () {
var title = $(this).text();
//$(this).html( "<input id='input" + pos + "' type='text' class='form-control' placeholder='' style='font-family:Arial, FontAwesome; width:100%'/>" );
pos ++;
});
var table = $('#towns_dt_table').DataTable({
buttons: [
'copy', 'csv', 'excel', 'pdf', 'print'
],
"columnDefs": [
{ "name": "ad_id", "targets": 0 , "searchable": true, "orderable": true},
{ "name": "date_envoi", "targets": 1 , "searchable": true, "orderable": true},
{ "name": "nom", "targets": 2 , "searchable": true, "orderable": true},
{ "name": "prenom", "targets": 3 , "searchable": true, "orderable": true},
{ "name": "entreprise", "targets": 4, "searchable": true, "orderable": true },
{ "name": "video", "targets": 5 },
{ "name": "status", "targets": 6 , "searchable": true, "orderable": true},
{ "name": "actions", "targets": 7 },
],
"processing": true,
"serverSide": true,
"ajax": {
"url": '{{ path('alimenterCandidatures') }}',
"type": 'POST'
},
"paging" : true,
"info" : true,
"searching": true,
"bFilter":true,
"responsive": true,
"pageLength": 10,
"order": [[0, 'desc']],
"language": {
"url": "http://cdn.datatables.net/plug-ins/1.10.11/i18n/French.json"
},
});
// Apply the search
pos = 1;
table.columns().every( function () {
var that = this;
$("#input"+pos).on( 'keyup change', function () {
if ( that.search() !== this.value )
{
that
.search( this.value )
.draw();
}
});
pos++;
});
$('#towns_dt_table_filter').hide();
});
function changerStatut(value, id){
var idAnswer = id;
var route = '/app_dev.php/admin/config/answer/' + idAnswer + '/status/' + value;
var select = $(this);
$.ajax({
type: "POST",
url: route,
dataType: "json",
success: function (msg) {
console.log("ok");
$("#status_"+id).text(value);
}
});
}
</script>
{% endblock %}
@@ -15,10 +15,12 @@
<link rel="stylesheet" href="{{ asset('admin/AdminLTE/dist/css/skins/skin-blue.min.css') }}">
<link rel="stylesheet" href="{{ asset('admin/AdminLTE/plugins/datatables/dataTables.bootstrap.css') }}">
<link rel="stylesheet" href="{{ asset('admin/AdminLTE/plugins/datatables/dataTables.bootstrap.css') }}">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/confirm/3.3.2/jquery-confirm.min.css">
<script type="text/javascript" defer="defer" src="https://extend.vimeocdn.com/ga/64189815.js"></script>
<link href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css" rel="stylesheet">
{% block js %}
{% endblock %}
{% block css %}
{% endblock %}
@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<html lang="fr">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
@@ -28,6 +28,54 @@
<!-- Please remove the file below for production: Contains demo classes -->
<link class="main-stylesheet" href="{{ asset('dashboard/css/style.css') }}" rel="stylesheet" type="text/css" />
<script type="text/javascript">window.$crisp=[];window.CRISP_WEBSITE_ID="08e9d301-ba14-4d69-8b1a-53685114c5af";(function(){d=document;s=d.createElement("script");s.src="https://client.crisp.chat/l.js";s.async=1;d.getElementsByTagName("head")[0].appendChild(s);})();</script>
<!-- BEGIN VENDOR JS -->
<script src="{{ asset('dashboard/plugins/pace/pace.min.js') }}" type="text/javascript"></script>
<!-- A polyfill for browsers that don't support ligatures: remove liga.js if not needed-->
<script src="{{ asset('dashboard/plugins/liga.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery/jquery-3.2.1.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/modernizr.custom.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery-ui/jquery-ui.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/popper/umd/popper.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/bootstrap/js/bootstrap.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery/jquery-easy.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery-unveil/jquery.unveil.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery-ios-list/jquery.ioslist.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery-actual/jquery.actual.min.js') }}"></script>
<script src="{{ asset('dashboard/plugins/jquery-scrollbar/jquery.scrollbar.min.js') }}"></script>
<script type="text/javascript" src="{{ asset('dashboard/plugins/select2/js/select2.full.min.js') }}"></script>
<script type="text/javascript" src="{{ asset('dashboard/plugins/classie/classie.js') }}"></script>
<script src="{{ asset('dashboard/plugins/nvd3/lib/d3.v3.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/nv.d3.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/utils.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/tooltip.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/interactiveLayer.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/models/axis.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/models/line.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/models/lineWithFocusChart.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/mapplic/js/hammer.min.js') }}"></script>
<script src="{{ asset('dashboard/plugins/mapplic/js/jquery.mousewheel.js') }}"></script>
<script src="{{ asset('dashboard/plugins/mapplic/js/mapplic.js') }}"></script>
<script src="{{ asset('dashboard/plugins/rickshaw/rickshaw.min.js') }}"></script>
<script src="{{ asset('dashboard/plugins/jquery-sparkline/jquery.sparkline.min.js') }}" type="text/javascript">
</script>
<script src="{{ asset('dashboard/plugins/skycons/skycons.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/quill/quill.min.js') }}" type="text/javascript"></script>
<script src="https://cdn.jsdelivr.net/gh/xcash/bootstrap-autocomplete@v2.3.7/dist/latest/bootstrap-autocomplete.min.js"></script>
<!-- END VENDOR JS -->
<!-- BEGIN CORE TEMPLATE JS -->
<!-- BEGIN CORE TEMPLATE JS -->
<script src="{{ asset('dashboard/pages/js/pages.js') }}"></script>
<script src="{{ asset('dashboard/pages/js/pages.email.js') }}"></script>
<!-- END CORE TEMPLATE JS -->
<!-- BEGIN PAGE LEVEL JS -->
<script src="{{ asset('dashboard/js/scripts.js') }}" type="text/javascript"></script>
<!-- END PAGE LEVEL JS -->
<!-- END CORE TEMPLATE JS -->
<!-- BEGIN PAGE LEVEL JS -->
<script src="{{ asset('dashboard/js/dashboard.js') }}" type="text/javascript"></script>
{% block javascriptSupl %}
{% endblock %}
<!-- END PAGE LEVEL JS -->
</head>
<body class="fixed-header dashboard menu-pin menu-behind">
@@ -80,52 +128,10 @@
{% endjavascripts %}
{% endblock %}
<!-- BEGIN VENDOR JS -->
<script src="{{ asset('dashboard/plugins/pace/pace.min.js') }}" type="text/javascript"></script>
<!-- A polyfill for browsers that don't support ligatures: remove liga.js if not needed-->
<script src="{{ asset('dashboard/plugins/liga.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery/jquery-3.2.1.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/modernizr.custom.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery-ui/jquery-ui.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/popper/umd/popper.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/bootstrap/js/bootstrap.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery/jquery-easy.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery-unveil/jquery.unveil.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery-ios-list/jquery.ioslist.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/jquery-actual/jquery.actual.min.js') }}"></script>
<script src="{{ asset('dashboard/plugins/jquery-scrollbar/jquery.scrollbar.min.js') }}"></script>
<script type="text/javascript" src="{{ asset('dashboard/plugins/select2/js/select2.full.min.js') }}"></script>
<script type="text/javascript" src="{{ asset('dashboard/plugins/classie/classie.js') }}"></script>
<script src="{{ asset('dashboard/plugins/nvd3/lib/d3.v3.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/nv.d3.min.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/utils.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/tooltip.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/interactiveLayer.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/models/axis.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/models/line.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/nvd3/src/models/lineWithFocusChart.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/mapplic/js/hammer.min.js') }}"></script>
<script src="{{ asset('dashboard/plugins/mapplic/js/jquery.mousewheel.js') }}"></script>
<script src="{{ asset('dashboard/plugins/mapplic/js/mapplic.js') }}"></script>
<script src="{{ asset('dashboard/plugins/rickshaw/rickshaw.min.js') }}"></script>
<script src="{{ asset('dashboard/plugins/jquery-sparkline/jquery.sparkline.min.js') }}" type="text/javascript">
</script>
<script src="{{ asset('dashboard/plugins/skycons/skycons.js') }}" type="text/javascript"></script>
<script src="{{ asset('dashboard/plugins/quill/quill.min.js') }}" type="text/javascript"></script>
<!-- END VENDOR JS -->
<!-- BEGIN CORE TEMPLATE JS -->
<!-- BEGIN CORE TEMPLATE JS -->
<script src="{{ asset('dashboard/pages/js/pages.js') }}"></script>
<script src="{{ asset('dashboard/pages/js/pages.email.js') }}"></script>
<!-- END CORE TEMPLATE JS -->
<!-- BEGIN PAGE LEVEL JS -->
<script src="{{ asset('dashboard/js/scripts.js') }}" type="text/javascript"></script>
<!-- END PAGE LEVEL JS -->
<!-- END CORE TEMPLATE JS -->
<!-- BEGIN PAGE LEVEL JS -->
<script src="{{ asset('dashboard/js/dashboard.js') }}" type="text/javascript"></script>
{% block javascriptsSecondaire %}
<!-- END PAGE LEVEL JS -->
{% endblock %}
</body>
</html>
@@ -28,9 +28,85 @@
'tab' : 2
} %}
{% endif %} #}
<!-- Modal 1 -->
<div class="modal fade bd-example-modal-lg" id="partageModal" tabindex="-1" role="dialog"
aria-labelledby="partageModalLabel" aria-hidden="false">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="partageModalLabel">Vous souhaitez partager les candidatures sélectionnées
dans lespace visiteurs ?</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<h5>&nbsp;</h5>
<p>Pour transmettre les informations aux personnes de votre choix, nous vous invitons à copier-coller le
texte présent dans lencadré ci-dessous dans votre messagerie mail.</p>
<label class="h6 small d-block text-uppercase" for="exampleFormControlTextarea1">texte a copier</label>
<textarea class="form-control" id="codeShare" rows="11">Bonjour,
Dans le cadre du recrutement pour le poste de {{ ad.title }}, nous avons reçu plusieurs candidatures en vidéo.
Parmi ces différentes candidatures, nous souhaitons vous partager notre sélection.
Pour visionner les candidatures vidéo, cliquez sur le lien ci-dessous, puis saisissez le mot de passe indiqué.
Lien : https://recruteur.talentstube.com/partage/{{ ad.id }}
Mot de passe : ######
Au plaisir d’échanger avec vous,
</textarea>
<br/>
<p>* Les données collectées dans les candidatures vidéo sont strictement confidentielles et entrent dans le champ de la protection des données personnelles dun candidat. Les vidéos peuvent être partagées uniquement dans le cadre du processus de recrutement.
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Fermer</button>
</div>
</div>
</div>
</div>
<!-- Modal 2 -->
<div class="modal fade bd-example-modal-lg" id="decocheModal" tabindex="-1" role="dialog"
aria-labelledby="decocheModalLabel" aria-hidden="false">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="decocheModalLabel">Cette candidature est actuellement partagée</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<h5>&nbsp;</h5>
<p>En cliquant sur confirmer, cette candidature ne sera plus accessible dans lespace visiteurs.</p>
</div>
<div class="modal-footer">
<input type="hidden" id="caseRecocher">
<button type="button" class="btn btn-secondary" data-dismiss="modal" onClick="annulerCheckbox()">Annuler</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Confirmer</button>
</div>
</div>
</div>
</div>
{#
<a href="#" data-toggle="tooltip" title="Some tooltip text!">Hover over me</a>
<!-- Generated markup by the plugin -->
<div class="tooltip bs-tooltip-top" role="tooltip">
<div class="arrow"></div>
<div class="tooltip-inner">
Some tooltip text!
</div>
</div> #}
<div class="row bg-bordered p-20">
<!-- START CONTAINER FLUID -->
<div class=" container-fluid container-fixed-lg bg-white">
@@ -38,6 +114,21 @@
<div class="card card-transparent">
<div class="card-header ">
<div class="card-title">Candidatures de l'offre {{ ad.title }}
<br /><br />
<button type="button" class="btn btn-primary" disabled data-toggle="modal"
data-target="#partageModal" id="partageCandidats">
<a href="#" data-toggle="tooltip"
title="Cochez une ou plusieurs candidatures avant de pouvoir les partager.">Partager les
candidatures</a>
</button>
<div class="tooltip bs-tooltip-top" role="tooltip">
<div class="arrow"></div>
<div class="tooltip-inner">
</div>
</div>
</div>
</div>
<div class="card-body">
@@ -48,7 +139,7 @@
<!-- NOTE * : Inline Style Width For Table Cell is Required as it may differ from user to user
Comman Practice Followed
-->
<th></th>
<th>{{ 'profile.talent.lastname'|trans }} {{ 'profile.talent.firstname'|trans }}</th>
<th>{{ 'global.datereception.label'|trans }}</th>
<th>{{ 'ad.company.list.status'|trans }}</th>
@@ -59,33 +150,41 @@
{% for answer in answers %}
<tr>
<td >
<a href="{{ path('company_answer_show',{'id':answer.id }) }}">{{ answer.user.lastname }}
{{ answer.user.firstname }}</a>
<td>
<input type="checkbox" id="answer_{{answer.id}}" name="answers" class="nav-trigger"
onChange="verifierIsChecked({{answer.id}})" {% if answer.isShared %} checked
{% endif %} />
<label for="nav-trigger" class="navicon-button x">
<div class="navicon"></div>
</label>
</td>
<td >
<td>
<a href="{{ path('company_answer_show',{'id':answer.id }) }}">{{ answer.user.lastname }}
{{ answer.user.firstname }}</a>
</td>
<td>
{{ answer.sendTime()|date('d/m/Y') }}
</td>
{% if answer.firstMessage %}
<td>{{ answer.firstMessage.status|trans }}</td>
{% else %}
{% if answer.isViewed %}
{% if answer.isViewed.status == "DRAFT" %}
<td>{{ 'VIEWED'|trans }}</td>
{% endif %}
{% else %}
<td>{{ 'NEW'|trans }}</td>
{% endif %}
{% if answer.isViewed %}
{% if answer.isViewed.status == "DRAFT" %}
<td>{{ 'VIEWED'|trans }}</td>
{% endif %}
{% else %}
<td>{{ 'NEW'|trans }}</td>
{% endif %}
{% endif %}
<td class="v-align-middle">
<a title="{{ad.title}}" href="{{ path('company_answer_show',{'id':answer.id }) }}">
<i class="pg-icon">eye</i>
</a>
<a href="#" class="note-action c-pointer" data-func="add" data-answer="{{ answer.id }}">
<a href="#" class="note-action c-pointer" data-func="add"
data-answer="{{ answer.id }}">
<i class="pg-icon">note</i>
</a>
{% for note in answer.notes %}
@@ -95,11 +194,13 @@
</a>
{% endfor %}
</td>
</tr>
{% endfor %}
{% if answers|length == 0 %}
<tr><th colspan="4" class="text-center">Aucune candidature pour le moment</th></tr>
<tr>
<th colspan="4" class="text-center">Aucune candidature pour le moment</th>
</tr>
{% endif %}
@@ -116,4 +217,95 @@
<div id="note-modal"></div>
{% endblock %}
{% block javascriptsEnd %}
<script type="text/javascript">
function parcourirAllCheckbox() {
var allCheckboxes = $("input[type=checkbox]");
var allCheckboxes = $("input[type=checkbox]");
var auMoinUneCheckboxCoche = false;
// Put all the unique name attributes in an array.
allCheckboxes.each(function () {
var isChecked = $(this).prop('checked');
if (isChecked == true) {
auMoinUneCheckboxCoche = true
}
});
if (auMoinUneCheckboxCoche == true) {
console.log("au moins un checkbox est coché");
$("#partageCandidats").attr("disabled", false);
} else {
console.log("aucuncheckbox n'est coché");
$("#partageCandidats").attr("disabled", true);
}
}
function annulerCheckbox(){
//recuprer l'id de la checkbox
var checkboxId = $("#caseRecocher").val();
//$("#answer_" + checkboxId).prop(checked, true);
document.getElementById("answer_" + checkboxId).checked = true;
console.log("annuler action checkbox "+checkboxId);
verifierIsChecked(checkboxId);
}
function verifierIsChecked(id) {
var auMoinUneCheckboxCoche = false;
parcourirAllCheckbox();
if($("#answer_" + id).prop('checked')==false){
console.log("cette checkbox était cochée avant");
$('#decocheModal').modal('show');
$("#caseRecocher").val(id);
}
//recuperer la valeur de la case coché
// Appel Ajax pour modifier l'answer qui a l'id :id
// Si la case est decocher mettre le champ is_checked à false
// Sinon mettre à true
$.ajax({
//L'URL de la requête
url: "/anwser/share/" + id,
//url: '{{ path("anwser_share", {"id":'+id+'}) }}',
//La méthode d'envoi (type de requête)
method: "GET",
data: 'isShare=' + $("#answer_" + id).prop('checked'),
//Le format de réponse attendu
dataType: "json",
})
//Ce code sera exécuté en cas de succès - La réponse du serveur est passée à done()
/*On peut par exemple convertir cette réponse en chaine JSON et insérer
* cette chaine dans un div id="res"*/
.done(function (response) {
let data = JSON.stringify(response);
//$("div#res").append(data);
console.log(data);
const obj = JSON.parse(data);
console.log(obj.code);
var texteMail = $("#codeShare").val();
$("#codeShare").val(texteMail.replace('######', obj.code));
})
//Ce code sera exécuté en cas d'échec - L'erreur est passée à fail()
//On peut afficher les informations relatives à la requête et à l'erreur
.fail(function (error) {
console.log("La requête s'est terminée en échec. Infos : " + JSON.stringify(error));
})
//Ce code sera exécuté que la requête soit un succès ou un échec
.always(function () {
console.log("Requête effectuée");
});
}
$(function () {
parcourirAllCheckbox();
console.log("ready");
});
</script>
{% endblock %}
@@ -0,0 +1,229 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-98246968-7"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-98246968-7');
</script>
<!-- Title -->
<title>{% block title %}{% endblock %}</title>
<!-- Required Meta Tags Always Come First -->
<meta charset="utf-8">
<meta name="robots" content="noindex,nofollow">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
{% block meta %}
{% endblock %}
<!-- Google Fonts -->
<link href="//fonts.googleapis.com/css?family=Roboto:300,400,500,700" rel="stylesheet">
<!-- CSS Implementing Plugins -->
<link rel="stylesheet" href="{{ asset('v2/vendor/font-awesome/css/all.min.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/hs-megamenu/src/hs.megamenu.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/custombox/dist/custombox.min.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/animate.css/animate.min.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/slick-carousel/slick/slick.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/cubeportfolio/css/cubeportfolio.min.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/fancybox/jquery.fancybox.css') }}">
<!-- CSS Space Template -->
<link rel="stylesheet" href="{{ asset('v2/css/theme.css') }}">
<script type="text/javascript"> window.$crisp=[];window.CRISP_WEBSITE_ID="08e9d301-ba14-4d69-8b1a-53685114c5af";(function(){ d=document;s=d.createElement("script"); s.src="https://client.crisp.chat/l.js"; s.async=1;d.getElementsByTagName("head")[0].appendChild(s);})(); </script>
</head>
<body>
{% block content %}
<main id="content">
<!-- Hero Section -->
<div class="gradient-half-primary-v1">
<div class="bg-img-hero" style="background-image: url('http://localhost/v2/img/partage/candidature-offre-emploi-video.jpg');">
<div class="container space-2 space-2-top--lg space-3-bottom--lg">
<div class=" text-center mx-auto">
<!-- Title -->
<div class="mb-9">
<h3 class="display-4 font-size-36--md-down text-white">Découvrez en vidéo les candidatures sélectionnées pour le poste de <br/><b>{{titreAnnonce}}</b></h3>
</div>
<!-- End Title -->
</div>
</div>
</div>
</div>
<!-- End Hero Section -->
<!-- Cubeportfolio -->
<div class="container u-cubeportfolio space-2 space-3--lg">
<!-- Filter -->
{# <ul id="filterControls" class="list-inline cbp-l-filters-alignCenter mb-5">
<li class="list-inline-item cbp-filter-item cbp-filter-item-active u-cubeportfolio__item" data-filter="*">All</li>
<li class="list-inline-item cbp-filter-item u-cubeportfolio__item" data-filter=".branding">Branding</li>
<li class="list-inline-item cbp-filter-item u-cubeportfolio__item" data-filter=".abstract">Abstract</li>
<li class="list-inline-item cbp-filter-item u-cubeportfolio__item" data-filter=".graphic">Graphic</li>
<li class="list-inline-item cbp-filter-item u-cubeportfolio__item" data-filter=".illustration">Illustration</li>
</ul> #}
<!-- End Filter -->
{% if answers|length == 0 %}
<div class="text-center">
<h1>Aucune candidature pour le moment</h1>
</div>
{% endif %}
<!-- Content -->
<div class="cbp mb-9"
data-controls="#filterControls"
data-animation="quicksand"
data-caption-animation="zoom"
data-x-gap="30"
data-y-gap="30"
data-load-more-selector="#cubeLoadMore"
data-load-more-action="click"
data-load-items-amount="2"
data-media-queries='[
{"width": 1500, "cols": 3},
{"width": 1100, "cols": 3},
{"width": 800, "cols": 3},
{"width": 580, "cols": 2},
{"width": 300, "cols": 1}
]'>
{% for answer in answers %}
<!-- Item -->
<div class="cbp-item branding">
<div class="cbp-caption">
<iframe src="https://player.vimeo.com/video/{{ answer.video.cdnUrl|replace({ "/videos/": ""}) }}"
width="100%" height="100%" frameborder="0" webkitallowfullscreen mozallowfullscreen
allowfullscreen></iframe>
</div>
<div class="p-4 text-center">
<h2 class="h5 mb-0">{{ answer.user.firstname }} {{ answer.user.lastname|slice(0, 1)|capitalize }}.</h2>
{# <p class="small mb-0">by Tiberiu Neamu</p> #}
</div>
</div>
<!-- End Item -->
{% endfor %}
</div>
<!-- End Content -->
<!-- Load More Button -->
<div id="cubeLoadMore" class="text-center">
{# <a href="../../assets/ajax/portfolio-grid-1/load-more.html" class="cbp-l-loadMore-link btn btn-dark btn-wide" rel="nofollow">
<span class="cbp-l-loadMore-defaultText">Load More</span>
<span class="cbp-l-loadMore-loadingText">Loading...</span>
<span class="cbp-l-loadMore-noMoreLoading">No more works</span>
</a> #}
</div>
<!-- End Load More Button -->
</div>
<!-- End Cubeportfolio -->
</main>
{% endblock %}
{% block javascriptsEnd %}
<!-- JS Global Compulsory -->
<script src="{{ asset('v2/vendor/jquery/dist/jquery.min.js') }}"></script>
<script src="{{ asset('v2/vendor/jquery-migrate/dist/jquery-migrate.min.js') }}"></script>
<script src="{{ asset('v2/vendor/popper.js/dist/umd/popper.min.js') }}"></script>
<script src="{{ asset('v2/vendor/bootstrap/bootstrap.min.js') }}"></script>
<!-- JS Implementing Plugins -->
<script src="{{ asset('v2/vendor/hs-megamenu/src/hs.megamenu.js') }}"></script>
<script src="{{ asset('v2/vendor/jquery-validation/dist/jquery.validate.min.js') }}"></script>
<script src="{{ asset('v2/vendor/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js') }}"></script>
<script src="{{ asset('v2/vendor/custombox/dist/custombox.min.js') }}"></script>
<script src="{{ asset('v2/vendor/custombox/dist/custombox.legacy.min.js') }}"></script>
<script src="{{ asset('v2/vendor/cubeportfolio/js/jquery.cubeportfolio.min.js') }}"></script>
<!-- JS Space -->
<script src="{{ asset('v2/js/hs.core.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.header.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.unfold.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.validation.js') }}"></script>
<script src="{{ asset('v2/js/helpers/hs.focus-state.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.malihu-scrollbar.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.modal-window.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.show-animation.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.cubeportfolio.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.go-to.js') }}"></script>
<!-- JS Plugins Init. -->
<script>
// initialization of google map
{# function initMap() {
$.HSCore.components.HSGMap.init('.js-g-map');
} #}
$(document).on('ready', function () {
// initialization of header
$.HSCore.components.HSHeader.init($('#header'));
// initialization of unfold component
$.HSCore.components.HSUnfold.init($('[data-unfold-target]'), {
afterOpen: function () {
if (!$('body').hasClass('IE11')) {
$(this).find('input[type="search"]').focus();
}
}
});
// initialization of form validation
$.HSCore.components.HSValidation.init('.js-validate', {
rules: {
confirmPassword: {
equalTo: '#password'
}
}
});
// initialization of forms
$.HSCore.helpers.HSFocusState.init();
// initialization of malihu scrollbar
$.HSCore.components.HSMalihuScrollBar.init($('.js-scrollbar'));
// initialization of autonomous popups
$.HSCore.components.HSModalWindow.init('[data-modal-target]', '.js-signup-modal', {
autonomous: true
});
// initialization of show animations
$.HSCore.components.HSShowAnimation.init('.js-animation-link');
// initialization of cubeportfolio
$.HSCore.components.HSCubeportfolio.init('.cbp');
// initialization of go to
$.HSCore.components.HSGoTo.init('.js-go-to');
});
</script>
{% endblock %}
</body>
</html>
@@ -0,0 +1,284 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-98246968-7"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'UA-98246968-7');
</script>
<!-- Title -->
<title>{% block title %}{% endblock %}</title>
<!-- Required Meta Tags Always Come First -->
<meta charset="utf-8">
<meta name="robots" content="noindex,nofollow">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
{% block meta %}
{% endblock %}
<!-- Google Fonts -->
<link href="//fonts.googleapis.com/css?family=Roboto:300,400,500,700" rel="stylesheet">
<!-- CSS Implementing Plugins -->
<link rel="stylesheet" href="{{ asset('v2/vendor/font-awesome/css/all.min.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/hs-megamenu/src/hs.megamenu.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/custombox/dist/custombox.min.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/animate.css/animate.min.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/slick-carousel/slick/slick.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/cubeportfolio/css/cubeportfolio.min.css') }}">
<link rel="stylesheet" href="{{ asset('v2/vendor/fancybox/jquery.fancybox.css') }}">
<link class="main-stylesheet" href="{{ asset('dashboard/css/style.css') }}" rel="stylesheet" type="text/css" />
<!-- CSS Space Template -->
<link rel="stylesheet" href="{{ asset('v2/css/theme.css') }}">
<script type="text/javascript">
window.$crisp = [];
window.CRISP_WEBSITE_ID = "08e9d301-ba14-4d69-8b1a-53685114c5af";
(function () {
d = document;
s = d.createElement("script");
s.src = "https://client.crisp.chat/l.js";
s.async = 1;
d.getElementsByTagName("head")[0].appendChild(s);
})();
</script>
</head>
<body>
{% block content %}
<!-- ========== HEADER ========== -->
<header id="header" class="u-header u-header--abs-top">
<div class="u-header__section bg-transparent border-0">
<div id="logoAndNav" class="container-fluid">
<!-- Nav -->
<nav class="navbar navbar-expand justify-content-between u-header__navbar py-3">
<!-- Logo -->
<div class="col-4 col-sm-6">
<a class="navbar-brand u-header__navbar-brand" href="../home/index.html" aria-label="Space">
<img class="u-header__navbar-brand-default" src={{ asset('/v2/svg/logos/talents-tube-logo.svg') }} alt="Talents Tube">
<img class="u-header__navbar-brand-mobile" src={{ asset('/v2/svg/logos/talents-tube-logo.svg') }} alt="Talents Tube">
</a>
</div>
<!-- End Logo -->
<!-- End Button -->
</nav>
<!-- End Nav -->
</div>
</div>
</header>
<!-- ========== END HEADER ========== -->
<main id="content">
<!-- Hero Section -->
<div class="bg-img-hero"
style="background-image: url(/v2/img/partage/partage-candidature-video.jpg);">
<div class="d-sm-flex align-items-sm-center height-100vh--sm">
<div class="container text-center space-3-top space-2-bottom space-3-bottom--lg">
<div class="w-lg-60 text-center mx-lg-auto fondBlanc">
<form class="js-validate form-signin p-5">
<!-- Logo -->
<div class="text-center">
</div>
<!-- End Logo -->
<!-- Title -->
<div class="text-center">
<h1 class="h3 mb-0">Voir les candidatures</h1>
<p>Pour visionner la ou les candidatures, veuillez saisir le mot de passe qui vous a été communiqué.
</p>
</div>
<!-- End Title -->
<!-- Input -->
<div class="js-form-message mb-3">
<div class="js-focus-state input-group form">
<div class="input-group-prepend form__prepend">
<span class="input-group-text form__text">
<i class="fa fa-lock form__text-inner"></i>
</span>
</div>
<input type="hidden" id="adId" name="adId" value="{{adId}}">
<input type="password" class="form-control form__input" id="mdp" name="mdp" required placeholder="Saisissez votre mot de passe"
aria-label="mdp" data-msg="Saisissez votre mot de passe" data-error-class="u-has-error"
data-success-class="u-has-success">
</div>
<div>
{% if error %}
<br/><span class="text-danger">Le mot de passe est incorrect</span>
{% endif %}
</div>
</div>
<!-- End Input -->
<!-- Input -->
<div class="js-form-message mb-3">
</div>
<!-- End Input -->
<div class="row mb-3">
</div>
<div class="mb-3">
<a href="#" onClick="verifierMdp()">
<button type="button" class="btn btn-success">Valider</button>
</a>
</div>
</form>
</div>
<!-- End Countdown -->
</div>
</div>
</div>
</div>
<!-- End Hero Section -->
</main>
{% endblock %}
{% block javascriptsEnd %}
<!-- JS Global Compulsory -->
<script src="{{ asset('v2/vendor/jquery/dist/jquery.min.js') }}"></script>
<script src="{{ asset('v2/vendor/jquery-migrate/dist/jquery-migrate.min.js') }}"></script>
<script src="{{ asset('v2/vendor/popper.js/dist/umd/popper.min.js') }}"></script>
<script src="{{ asset('v2/vendor/bootstrap/bootstrap.min.js') }}"></script>
<!-- JS Implementing Plugins -->
<script src="{{ asset('v2/vendor/hs-megamenu/src/hs.megamenu.js') }}"></script>
<script src="{{ asset('v2/vendor/jquery-validation/dist/jquery.validate.min.js') }}"></script>
<script src="{{ asset('v2/vendor/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js') }}"></script>
<script src="{{ asset('v2/vendor/custombox/dist/custombox.min.js') }}"></script>
<script src="{{ asset('v2/vendor/custombox/dist/custombox.legacy.min.js') }}"></script>
<script src="{{ asset('v2/vendor/cubeportfolio/js/jquery.cubeportfolio.min.js') }}"></script>
<!-- JS Space -->
<script src="{{ asset('v2/js/hs.core.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.header.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.unfold.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.validation.js') }}"></script>
<script src="{{ asset('v2/js/helpers/hs.focus-state.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.malihu-scrollbar.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.modal-window.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.show-animation.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.cubeportfolio.js') }}"></script>
<script src="{{ asset('v2/js/components/hs.go-to.js') }}"></script>
<!-- JS Plugins Init. -->
<script>
// initialization of google map
{
function initMap() {
$.HSCore.components.HSGMap.init('.js-g-map');
}
}
$(document).on('ready', function () {
// initialization of header
$.HSCore.components.HSHeader.init($('#header'));
// initialization of unfold component
$.HSCore.components.HSUnfold.init($('[data-unfold-target]'), {
afterOpen: function () {
if (!$('body').hasClass('IE11')) {
$(this).find('input[type="search"]').focus();
}
}
});
// initialization of form validation
$.HSCore.components.HSValidation.init('.js-validate', {
rules: {
confirmPassword: {
equalTo: '#password'
}
}
});
// initialization of forms
$.HSCore.helpers.HSFocusState.init();
// initialization of malihu scrollbar
$.HSCore.components.HSMalihuScrollBar.init($('.js-scrollbar'));
// initialization of autonomous popups
$.HSCore.components.HSModalWindow.init('[data-modal-target]', '.js-signup-modal', {
autonomous: true
});
// initialization of show animations
$.HSCore.components.HSShowAnimation.init('.js-animation-link');
// initialization of cubeportfolio
$.HSCore.components.HSCubeportfolio.init('.cbp');
// initialization of go to
$.HSCore.components.HSGoTo.init('.js-go-to');
});
</script>
<script type="text/javascript">
function verifierMdp(){
$.ajax({
//L'URL de la requête
url: '{{ path("connectionpartage") }}',
//url: 'http://localhost/app_dev.php/connectionpartage',
//La méthode d'envoi (type de requête)
method: "GET",
data: 'adId=' + $("#adId").val()+"&mdp="+$("#mdp").val(),
//Le format de réponse attendu
dataType: "json",
})
//Ce code sera exécuté en cas de succès - La réponse du serveur est passée à done()
/*On peut par exemple convertir cette réponse en chaine JSON et insérer
* cette chaine dans un div id="res"*/
.done(function (response) {
//let data = JSON.stringify(response)JSON.stringify(response);
//$("div#res").append(data);=
var retour =JSON.stringify(response);
console.log(response);
var url = '{{ path("anwser_share_show", {"id": "id"}) }}';
url = url.replace("id", $("#adId").val());
window.location.replace(url);
})
//Ce code sera exécuté en cas d'échec - L'erreur est passée à fail()
//On peut afficher les informations relatives à la requête et à l'erreur
.fail(function (error) {
//alert(error)
console.log("La requête s'est terminée en échec. Infos : " + JSON.stringify(error));
})
//Ce code sera exécuté que la requête soit un succès ou un échec
.always(function () {
console.log("Requête effectuée");
});
}
</script>
{% endblock %}
</body>
</html>
@@ -1,6 +1,27 @@
{# {% extends 'company/base_dashboard_company.html.twig' %} #}
{% extends 'admin/base_dashboard.html.twig' %}
{% block javascriptSupl %}
<style>
.saisie thead tr th,
.saisie tbody tr td,
.saisie tbody tr td *:not(.dropdown-default) .saisie tr td {
overflow: visible;
}
.modalCompetences {
height: 600px;
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/corejs-typeahead/1.3.1/bloodhound.min.js" type="text/javascript">
</script>
<script src="{{ asset('dashboard/plugins/typeahead/typeahead.bundle.js') }}" type="text/javascript"></script>
{% endblock %}
{% block dashContent %}
<!-- START JUMBOTRON -->
<div class="jumbotron" data-pages="parallax">
@@ -10,23 +31,87 @@
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/">Accueil</a></li>
<li class="breadcrumb-item"><a href="{{ path('company_ad') }}">Offres d'emploi</a></li>
</ol>
<!-- END BREADCRUMB -->
</div>
</div>
</div>
<!-- END JUMBOTRON -->
<!-- MODALS-->
<!-- Modal 1 -->
<div class="modal fade bd-example-modal-lg" id="competencesModal" tabindex="-1" role="dialog"
aria-labelledby="competencesModalLabel" aria-hidden="false">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="competencesModalLabel">Souhaitez-vous remplacer le métier <span class="metierAncienPopup">{aucun}</span> par <span class="metierPopup"></span></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<h5>&nbsp;</h5>
<p>
Les compétences que vous aviez précédemment sélectionnées en lien avec le métier <span class="metierAncienPopup">{aucun}</span> seront remplacées par de nouvelles compétences, correspondant au métier <span class="metierPopup">.
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal"
onclick="chargerCompetences();">Remplacer</button>
</div>
</div>
</div>
</div>
<!-- Modal 2 -->
<div class="modal fade modalCompetences" id="ajoutCompetencesModal" tabindex="-1" role="dialog"
aria-labelledby="ajoutCompetencesModalLabel" aria-hidden="false">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-body">
{# <p>Etes vous sur de charger les compétences du métier <span id="metierPopup"></span></p> #}
<div class="card card-default">
<div class="card-body">
<div class="scrollable">
<div class="demo-card-scrollable">
<div id="competencesAdPopup"></div>
</div>
</div><br/>
<div id="competencesAdMessagePopup" class="text-danger"></div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" id="ajouterCompetenceButtonMdal" class="btn btn-secondary" data-dismiss="modal" onclick="" >Ajouter ces compétences</button>
</div>
</div>
</div>
</div>
<!-- FIN MODALS-->
<!-- START CONTAINER FLUID -->
<div class=" container-fluid container-fixed-lg">
<div id="rootwizard" class="m-t-50">
{% if type is defined and type == 'update' %}
{% include 'company/ad_stepsV2.html.twig' with {'tab':1, 'type':'update'} %}
{% include 'company/ad_stepsV2.html.twig' with {'tab':1, 'type':'update'} %}
{% else %}
{% include 'company/ad_stepsV2.html.twig' with {'tab':1} %}
{% include 'company/ad_stepsV2.html.twig' with {'tab':1} %}
{% endif %}
<div class="tab-content">
{{ form_start(form, {'attr': {'class': ''}}) }}
@@ -37,99 +122,184 @@
<i class="material-icons hint-text">info</i>
<h2>Etape 1 : Je crée une annonce</h2>
<p>Pour trouver le bon profil, renseignez et personnalisez votre annonce.
Plus votre annonce est précise et attractive, plus les candidatures seront ciblées.
Afin de créer votre annonce, renseignez lensemble des champs relatifs au poste proposé.</p>
Plus votre annonce est précise et attractive, plus les candidatures seront ciblées.
Afin de créer votre annonce, renseignez lensemble des champs relatifs au poste proposé.
</p>
{# <p class="small hint-text">Below is a sample page for your cart , Created using pages design
UI Elementes</p> #}
</div>
</div>
<div class="col-md-7">
<div class="padding-30 sm-padding-5">
<table class="table table-condensed ">
{% if form_errors(form) %}
<tr>
<td class="col-lg-12 col-md-12 col-sm-12 ">
<span class="red-text text-darken-2">{{ form_errors(form) }}</span>
</td>
</tr>
{% endif %}
{% endif %}
<tr>
<td class="col-lg-12 col-md-12 col-sm-12 ">
{{ form_row(form.reference) }}
{{ form_row(form.reference) }}
</td>
</tr>
<tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12 ">
{{ form_row(form.title) }}
</td>
{{ form_row(form.title) }}
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.beneficiaire) }}
<br/>
Vous souhaitez recruter pour l'un de vos clients, renseignez ce champ
</td>
{{ form_row(form.beneficiaire) }}
<br />
Vous souhaitez recruter pour l'un de vos clients, renseignez ce champ
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.location_gmap) }}
{{ form_row(form.location) }}
</td>
{{ form_row(form.location_gmap) }}
{{ form_row(form.location) }}
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.description) }}
</td>
{{ form_row(form.description) }}
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.contract_type) }}
</td>
{{ form_row(form.contract_type) }}
</td>
</tr>
{# US 380 : Mise en place du temps de contrat (CDD) #}
<tr id="ligneDureeContrat">
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.duree_contrat) }}
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.temps_type) }}
</td>
{{ form_row(form.temps_type) }}
</td>
</tr>
{# US 329 : Mise en place du temps de travail #}
<tr id='ligneNbHeure'>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.nombre_heure) }}
</td>
</tr>
{# US 295 : Mise en place du télétravail #}
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.teletravail) }}
</td>
{{ form_row(form.teletravail) }}
</td>
</tr>
</table>
<table>
<tr class='bg-contrast-lower'>
<td class="col-lg-12 col-md-12 col-sm-12 bg-contrast-lower">
<h3 class="no-margin p-b-5">Compétences recherchées</h3>
<br />
Recherchez le métier de rattachement le plus proche de lintitulé de poste
que vous avez saisi.
</button>
</td>
</tr>
<tr class='bg-contrast-lower'>
<td class="col-lg-12 col-md-12 col-sm-12 bg-contrast-lower">
<table class='saisie'>
<tr class='saisie'>
<td class='saisie'>
<label for="saisie" class="required">Métier de
rattachement</label><br />
<input class="typeahead form-control sample-typehead tt-input"
id="saisie" type="text" placeholder="Saisir un métier"
autocomplete="off" spellcheck="false" dir="auto"
style="position: relative; vertical-align: top; background-color: transparent;">
<br />
<input type="hidden" name="id_appellation_temporaire"
id="id_appellation_temporaire">
<input type="hidden" name="metier_temporaire"
id="metier_temporaire">
<input type="hidden" name="competences_origine"
id="competences_origine">
<br />Le métier de rattachement sert uniquement à vous proposer des
compétences
et ne sera pas affiché sur votre offre demploi.
</td>
</tr>
</table>
</td>
</tr>
</table>
<table class="table table-condensed ">
<tr class='bg-contrast-lower'>
<td class="col-lg-12 col-md-12 col-sm-12 bg-contrast-lower">
<div id="competencesAd"></div><br />
<div id="competencesAdMessage" class="text-danger">Veuillez choisir un métier de rattachement pour votre annonce.</div><br />
<div class="text-center" id="competencesButtonAd">
<button type="button" class="btn btn-primary" data-toggle="modal"
data-target="#ajoutCompetencesModal" id="ajoutCompetences">
Ajouter des compétences
</button>
<input type="hidden" id ="nbCompetences">
<span id= "nbCompetencesText"></span>
</div>
</td>
{{ form_row(form.appellationId) }}
{{ form_row(form.appellationLibelle) }}
{{ form_row(form.codeRome) }}
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.status) }}
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.status) }}
</td>
{{ form_row(form.publicTag) }}
{{ form_row(form.competences) }}
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.publicTag) }}
</td>
&nbsp;
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12 ">
<button aria-label="" type="submit" class="btn btn-primary btn-cons btn-animated from-left pull-right"
type="button">
<span>{% if type is defined and type == 'update' %}Sauvegarde et étape suivante {% else %}Je crée mon annonce{% endif %}</span>
<button aria-label="" type="submit"
class="btn btn-primary btn-cons btn-animated from-left pull-right"
type="button" id="saveAdButton">
<span>{% if type is defined and type == 'update' %}Sauvegarde et
étape
suivante {% else %}Je crée mon annonce{% endif %}</span>
<span class="hidden-block">
<i class="material-icons fs-16">videocam</i>
</span>
</button>
{# <button class="btn btn-default" type="submit">Je crée mon annonce!</button> #}
</button>
<br />&nbsp;
{# <button class="btn btn-default" type="submit">Je crée mon annonce!</button> #}
</td>
</tr>
</table>
</div>
</div>
</div>
@@ -139,65 +309,18 @@ Afin de créer votre annonce, renseignez lensemble des champs relatifs au pos
<div class="row row-same-height">
<div class="col-md-5 b-r b-dashed b-grey ">
<div class="padding-30 sm-padding-5 sm-m-t-15 m-t-50">
</div>
</div>
<div class="col-md-7">
<div class="padding-30 sm-padding-5">
</div>
</div>
</div>
</div>
<div class="tab-pane slide-left padding-20 sm-no-padding disabled" id="tab3">
<div class="row row-same-height">
<div class="col-md-5 b-r b-dashed b-grey ">
<div class="padding-30 sm-padding-5 sm-m-t-15 m-t-50">
<h2>We Secured Your Line</h2>
<p>Below is a sample page for your cart , Created using pages design UI Elementes</p>
<p class="small hint-text">Below is a sample page for your cart , Created using pages design
UI Elementes</p>
<table class="table table-condensed">
<tr>
<td class=" col-md-9">
<span class="m-l-10 font-montserrat fs-11 all-caps">Webarch UI Framework</span>
<span class="m-l-10 ">Dashboard UI Pack</span>
</td>
<td class=" col-md-3 text-right">
<span>Qty 1</span>
</td>
</tr>
<tr>
<td class=" col-md-9">
<span class="m-l-10 font-montserrat fs-11 all-caps">Pages UI Framework</span>
<span class="m-l-10 ">Next Gen UI Pack</span>
</td>
<td class=" col-md-3 text-right">
<span>Qty 1</span>
</td>
</tr>
<tr>
<td colspan="2" class=" col-md-3 text-right">
<h4 class="text-primary no-margin font-montserrat">$27</h4>
</td>
</tr>
</table>
<p class="small">Invoice are issued on the date of despatch. Payment terms: Pre-orders:
within 10 days of invoice date with 4% discount, from the 11th to the 30th day net.
Re-orders: non-reduced stock items are payable net after 20 days. </p>
<p class="small">By pressing Pay Now You will Agree to the Payment <a href="#">Terms &amp;
Conditions</a></p>
</div>
</div>
<div class="col-md-7">
<div class="padding-30 sm-padding-5">
</div>
</div>
</div>
</div>
<div class="padding-20 sm-padding-5 sm-m-b-20 sm-m-t-20 bg-white clearfix">
{# <ul class="pager wizard no-style">
<li class="next">
@@ -240,10 +363,10 @@ Afin de créer votre annonce, renseignez lensemble des champs relatifs au pos
</div>
<div class="wizard-footer padding-20 bg-contrast-low">
<p class="small hint-text pull-left no-margin">
</p>
<div class="pull-right">
</div>
<div class="clearfix"></div>
</div>
@@ -252,4 +375,324 @@ Afin de créer votre annonce, renseignez lensemble des champs relatifs au pos
</div>
<!-- END CONTAINER FLUID -->
{% endblock %}
{% block javascriptsSecondaire %}
<script type="application/javascript">
//Methode permettant d'afficher le bloc nb d'heure si est en temps partiel
function afficherTempsType() {
if ($("#ad_temps_type").val() == "PART_TIME") {
//$("#ligneNbHeure").show();
$("#ad_nombre_heure").prop("disabled", false);
} else {
//$("#ligneNbHeure").hide().prop('required',false) ;;
$("#ad_nombre_heure").prop("disabled", true);
}
}
//Methode permettant d'afficher le bloc durée de contrat si le contrat est un CDI
function afficherDureeContrat() {
console.log("type de contrat =" + $("#ad_contract_type").val());
if ($("#ad_contract_type").val() == "CDD") {
//$("#ligneDureeContrat").show();
$("#ad_duree_contrat").prop("disabled", false);
} else {
//$("#ligneDureeContrat").hide().prop('required',false) ;
$("#ad_duree_contrat").prop("disabled", true);
}
}
$("#ad_temps_type").change(function () {
afficherTempsType();
});
$("#ad_contract_type").change(function () {
afficherDureeContrat();
});
//methode qui permet de générer le json des competences.
// c'est le champ ad_competences qui sert à l'enregistrement en base
function genererJson() {
var competences = "";
//competences = [];
var nbCompetencesSelect = 0;
//on parcourt toutes les checkbox cochées
$(":checkbox:checked").map(function () {
//on recuperer l'input car l'id du champ est formaté comme suit competence_ ou competencepopup_
var input = this.id.split('_');
// on ne ored=nd que les input de la page pricnipale (pas ceux de la popup)
if (input[0] == "competence") {
var retour = this.value.split('_');
//var competence = [retour[0], parseInt(retour[1])];
console.log(this.value);
//competences.push(competence);
//on remplace la virgule par un esapce car sinon bug (les compétences sont séparés par une virgule)
var chaine = this.value.replace(",", " ");
//On limite a 10 compétences, au dela, on les enregistre pas dans le champ ad_competences
if(nbCompetencesSelect<11){
competences += chaine + ",";
nbCompetencesSelect++;
}
$("#nbCompetencesText").html(nbCompetencesSelect+" compétences sélectionnées");
$("#ajouterCompetenceButtonMdal").html("Ajouter (+"+nbCompetencesSelect+")");
$("#nbCompetences").val(nbCompetencesSelect);
//return competence;
}
}).get();
// on renseigne le champ ad_competences
$("#ad_competences").val(competences);
//Gestion des erreurs si aucune compétence
if(nbCompetencesSelect==0){
$("#nbCompetencesText").html("");
$("#competencesAdMessage").html(
"Vous devez sélectionner au minimum une compétence "
);
$("#ajouterCompetenceButtonMdal").show();
$("#saveAdButton").prop("disabled", true);
}else if(nbCompetencesSelect>9){
//Gestion des erreurs si plusde 10 compétences
$("#saveAdButton").prop("disabled", false);
$("#competencesAdMessage").html(
"Vous avez atteint le nombre maximum de compétences. "
);
$("#competencesAdMessagePopup").html(
"Vous avez atteint le nombre maximum de compétences. "
);
if(nbCompetencesSelect>10){
$("#ajouterCompetenceButtonMdal").hide();
}
}else{
//cas standards, on reinitialise les champs a vide
$("#competencesAdMessage").html(
" "
);
$("#saveAdButton").prop("disabled", false);
$("#ajouterCompetenceButtonMdal").show();
}
console.log("valeur saiisie");
if($("#saisie").val() =="" || !$("#saisie").val() ){
$("#competencesAdMessage").html(
"Veuillez choisir un métier de rattachement pour votre annonce. "
);
}
}
$(document).ready(function () {
afficherTempsType();
afficherDureeContrat();
$("#saveAdButton").prop("disabled", true);
//ad_appellationId
//ad_appellationLibelle
//ad_competences
// renseignement des champs temporaires (champ caché)
$("#id_appellation_temporaire").val($("#ad_appellationId").val());
$("#metier_temporaire").val($("#ad_appellationLibelle").val());
// renseignement du champ visible (init du métier)
$("#saisie").val($("#ad_appellationLibelle").val());
$("#competences_origine").val($("#ad_competences").val());
if ($("#ad_competences").val() !='null' ){
$("#saveAdButton").prop("disabled", false);
}
//charger les compétences en fonction du métier d'origine
chargerCompetences("init");
//cocher les cases par rapport aux compétences d'origine
});
</script>
<script>
$(document)
.ready(function () {
// Construction du champ typeahead d'auto compléetion de métier
$("#competencesButtonAd").hide();
var metiers = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.whitespace,
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
// Ajax qui appelle getAppellionsMetier (API TT qui appelle APi pole emploi)
url: '/app_dev.php/api/getAppelationsLibelle',
wildcar: '%QUERY',
filter: function (metiers) {
return $.map(metiers, function (metier) {
//console.log(metier);
return {
metier_id: metier.code,
metier_libelle: metier.libelle
}
})
},
prepare: function (query, settings) {
//ing%20agro
//query = query.replace(" ", "%20");
settings.url += '?q=' + query;
return settings;
}
},
});
metiers.initialize();
// Initializing the typeahead
$('#saisie').typeahead({
hint: true,
highlight: true
}, {
name: 'metiers',
source: metiers.ttAdapter(),
display: 'metier_libelle',
limit: 10,
templates: {
suggestion: function (data) {
//comment sont formaté les suggestion de l'auto completion
$(".tt-dataset-metiers").show();
var chaine = data.metier_libelle.replace("'", "\\'");
return '<div><a href="#" onclick="chargerDonneesTemp(' + data.metier_id + ',\'' +
chaine +
'\')" data-toggle="modal" data-target="#competencesModal" id="competences">' + data.metier_libelle +
'</a></div>'
},
footer: function (query) {
//return '<div class="text-center">Plus de résultats :' + query.query + '</div>';
},
empty: function (context) {
// cas ou l'on ne trpouve rien
$("#competencesAdMessage").html(
" Aucun résultat ne correspond à votre recherche. <br/>Saisissez un autre mot clé pour trouver votre métier de rattachement."
);
return '<div class="text-center">Aucun résultat</div>';
}
}
});
});
//methode qui charge métier temporaire (en attente validation de la popup)
//En effet, on demande a l'utilsiateur s'il est sur. C'est pour ca qu'on a a ces champs temporaires
function chargerDonneesTemp(codeRome, libelleMetier) {
$("#id_appellation_temporaire").val(codeRome);
console.log(codeRome);
$("#metier_temporaire").val(libelleMetier);
$(".metierPopup").text(libelleMetier);
console.log(libelleMetier);
}
//Charger les compétences, code Rome, d'un métier
//appel de l'api TT getDetailAppelaltion qui appelle une autre Api Pole emploi
function chargerCompetences(type) {
$.ajax({
//L'URL de la requête
url: "/app_dev.php/api/getDetailAppelation",
//url: '{{ path("anwser_share", {"id":'+id+'}) }}',
//La méthode d'envoi (type de requête)
method: "GET",
data: 'q=' + $("#id_appellation_temporaire").val(),
//Le format de réponse attendu
dataType: "json",
})
//Ce code sera exécuté en cas de succès - La réponse du serveur est passée à done()
/*On peut par exemple convertir cette réponse en chaine JSON et insérer
* cette chaine dans un div id="res"*/
.done(function (response) {
let data = JSON.stringify(response);
const obj = JSON.parse(data);
//chargement du code ROme
$("#ad_codeRome").val(obj.metier.code);
//Passage du l'id appelation et de son libelle temporaire
$("#ad_appellationId").val($("#id_appellation_temporaire").val());
$("#ad_appellationLibelle").val($("#metier_temporaire").val());
$('.metierAncienPopup').text($("#metier_temporaire").val());
//Init des champs de compétences
$("#competencesAd").text("");
$("#competencesAdPopup").text("");
$("#competencesAdMessage").html("");
//parcours de l'objet json renvoyé par l'api
obj.competencesDeBase.forEach(function (object) {
// Pour chaque compétences, on crée
//1 checkbox dans la page principal. iL est affiché par défaut si c'est une compétence clé. les compéetences clés sonr cochés
// 1 checkbox dans la popup d'ajout de competences. Par defaut, seul les compétences clé sont cochés
var hidden = "";
var checked = "";
if (object.competenceCle == true && type != "init") {
checked = "checked";
}
var chaine = object.libelle.replace("'", " ");
var chaine = chaine.replace(",", " ");
$("#competencesAd").append("<div id='competence_ad_"+object.code+"' name='competences_ad[]'><input type='checkbox' "+checked+" onChange='genererCompetences(this);' id='competence_" + object
.code + "' value='" +chaine+"_"+ object.code + "'> " + object.libelle + "<br/></div>");
$("#competencesAdPopup").append("<div id='competence_ad_popup_"+object.code+"'><input type='checkbox' "+checked+" onChange='genererCompetences(this);' id='competencepopup_" + object
.code + "' value='" + object.code + "'> " + object.libelle + "<br/></div>");
if (object.competenceCle == false) {
$("#competence_ad_"+object.code).hide();
}
});
$("#competencesButtonAd").show();
//lors de l'init, on affiche et coche les compétences récupérer en base. On désaffiche et decoche celle qui n'y sont plus
// Pareil pour la popup sauf qu'elles sont toutes affichées
if (type == "init") {
const obj = JSON.parse($("#ad_competences").val());
console.log(obj);
for (var key in obj) {
for (var key2 in obj[key]) {
//console.log(obj[key][key2]);
console.log(key2);
$("#competencepopup_" + key2).prop("checked", true);
$("#competence_" + key2).prop("checked", true);
$("#competence_ad_" + key2).show();
}
}
}
//on génere le json qui va remplir le champ ad_competences
genererJson();
})
//Ce code sera exécuté en cas d'échec - L'erreur est passée à fail()
//On peut afficher les informations relatives à la requête et à l'erreur
.fail(function (error) {
$("#competencesAd").text("");
$("#competencesAdPopup").text("");
if ($("#saisie").val() != "") {
// si il y a un pb avec l'api pole emploi, on affiche ce message
$("#competencesAdMessage").html(
"Une erreur est survenue dans la recherche du métier de rattachement. <a href='#' onclick='chargerCompetences();'><i class='fa fa-refresh fa-spin fa-fw'></i>Cliquez ici pour relancer la recherche</a> "
);
}
console.log("La requête s'est terminée en échec. Infos : " + JSON.stringify(error));
})
//Ce code sera exécuté que la requête soit un succès ou un échec
.always(function () {
console.log("Requête effectuée");
});
}
// function qui permet de synchroniser les compétences de la page et celles de la popup
// ca va dans les deux sens.
function genererCompetences(cb) {
console.log("Clicked, new value = " + cb.checked);
console.log("Clicked, target = " + cb.id);
var id = cb.id.split('_');
id = id[1];
if($("#nbCompetences").val()<10){
$("#competence_" + id).prop("checked", cb.checked);
$("#competencepopup_" + id).prop("checked", cb.checked);
if (cb.checked) {
console.log("reaffichage div #competence_ad_" + id);
$("#competence_ad_" + id).show();
} else {
console.log("hidden de div #competence_ad_" + id);
$("#competence_ad_" + id).hide();
}
}else{
$("#competence_" + id).prop("checked", false);
$("#competencepopup_" + id).prop("checked", false);
}
// on génere le json a chaque fois
genererJson();
}
</script>
{% endblock %}
@@ -1,6 +1,23 @@
{# {% extends 'company/base_dashboard_company.html.twig' %} #}
{% extends 'admin/base_dashboard.html.twig' %}
{% block javascriptSupl %}
<style>
.saisie thead tr th,
.saisie tbody tr td,
.saisie tbody tr td *:not(.dropdown-default) .saisie tr td {
overflow: visible;
}
.modalCompetences{
height:600px;
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/corejs-typeahead/1.3.1/bloodhound.min.js" type="text/javascript">
</script>
<script src="{{ asset('dashboard/plugins/typeahead/typeahead.bundle.js') }}" type="text/javascript"></script>
{% endblock %}
{% block dashContent %}
<!-- START JUMBOTRON -->
<div class="jumbotron" data-pages="parallax">
@@ -18,6 +35,66 @@
</div>
</div>
<!-- END JUMBOTRON -->
<!-- MODALS-->
<!-- Modal 1 -->
<div class="modal fade bd-example-modal-lg" id="competencesModal" tabindex="-1" role="dialog"
aria-labelledby="competencesModalLabel" aria-hidden="false">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="competencesModalLabel">Souhaitez-vous remplacer le métier <span class="metierAncienPopup">{aucun}</span> par <span class="metierPopup"></span></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<h5>&nbsp;</h5>
<p>
Les compétences que vous aviez précédemment sélectionnées en lien avec le métier <span class="metierAncienPopup">{aucun}</span> seront remplacées par de nouvelles compétences, correspondant au métier <span class="metierPopup">.
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal"
onclick="chargerCompetences();">Remplacer</button>
</div>
</div>
</div>
</div>
<!-- Modal 2 -->
<div class="modal fade modalCompetences" id="ajoutCompetencesModal" tabindex="-1" role="dialog"
aria-labelledby="ajoutCompetencesModalLabel" aria-hidden="false">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-body">
{# <p>Etes vous sur de charger les compétences du métier <span id="metierPopup"></span></p> #}
<div class="card card-default">
<div class="card-body">
<div class="scrollable">
<div class="demo-card-scrollable">
<div id="competencesAdPopup"></div>
</div>
</div>
<div id="competencesAdMessagePopup" class="text-danger"></div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" id="ajouterCompetenceButtonMdal" class="btn btn-secondary" data-dismiss="modal" onclick="" >Ajouter ces compétences</button>
</div>
</div>
</div>
</div>
<!-- FIN MODALS-->
<!-- START CONTAINER FLUID -->
<div class=" container-fluid container-fixed-lg">
<div id="rootwizard" class="m-t-50">
@@ -29,7 +106,7 @@
<div class="col-md-5 b-r b-dashed b-grey sm-b-b">
<div class="padding-30 sm-padding-5 sm-m-t-15 m-t-50">
<i class="material-icons hint-text">shopping_cart</i>
<h2>Etape 1 : Je crée/modifie une annonce</h2>
<h2>Etape 1 : Je modifie une annonce</h2>
<p>Pour trouver le bon profil, renseignez et personnalisez votre annonce.
Plus votre annonce est précise et attractive, plus les candidatures seront ciblées.
Afin de créer votre annonce, renseignez lensemble des champs relatifs au poste proposé.</p>
@@ -90,32 +167,112 @@ Afin de créer votre annonce, renseignez lensemble des champs relatifs au pos
{{ form_row(form.contract_type) }}
</td>
</tr>
{# US 380 : Mise en place du temps de contrat (CDD) #}
<tr id="ligneDureeContrat">
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.duree_contrat) }}
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.temps_type) }}
</td>
</tr>
{# US 329 : Mise en place du temps de travail #}
<tr id="ligneNbHeure">
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.nombre_heure) }}
</td>
</tr>
{# US 295 : Mise en place du télétravail #}
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.teletravail) }}
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.publicTag) }}
</td>
</table>
<table>
<tr class='bg-contrast-lower'>
<td class="col-lg-12 col-md-12 col-sm-12 bg-contrast-lower">
<h3 class="no-margin p-b-5">Compétences recherchées</h3>
<br />
Recherchez le métier de rattachement le plus proche de lintitulé de poste
que vous avez saisi.
</button>
</td>
</tr>
<tr class='bg-contrast-lower'>
<td class="col-lg-12 col-md-12 col-sm-12 bg-contrast-lower">
<table class='saisie'>
<tr class='saisie'>
<td class='saisie'>
<label for="saisie" class="required">Métier de
rattachement</label><br />
<input class="typeahead form-control sample-typehead tt-input"
id="saisie" type="text" placeholder="Saisir un métier"
autocomplete="off" spellcheck="false" dir="auto"
style="position: relative; vertical-align: top; background-color: transparent;">
<br />
<input type="hidden" name="id_appellation_temporaire"
id="id_appellation_temporaire">
<input type="hidden" name="metier_temporaire"
id="metier_temporaire">
<input type="hidden" name="competences_origine"
id="competences_origine">
<br />Le métier de rattachement sert uniquement à vous proposer des
compétences
et ne sera pas affiché sur votre offre demploi.
</td>
</tr>
</table>
</td>
</tr>
</table>
<table class="table table-condensed ">
<tr class='bg-contrast-lower'>
<td class="col-lg-12 col-md-12 col-sm-12 bg-contrast-lower">
<div id="competencesAd"></div><br />
<div id="competencesAdMessage" class="text-danger">Vous devez
sélectionner un minimum une compétence</div><br />
<div class="text-center" id="competencesButtonAd">
<button type="button" class="btn btn-primary" data-toggle="modal"
data-target="#ajoutCompetencesModal" id="ajoutCompetences">
Ajouter des compétences
</button>
<input type="hidden" id ="nbCompetences">
<span id= "nbCompetencesText"></span>
</div>
</td>
{{ form_row(form.appellationId) }}
{{ form_row(form.appellationLibelle) }}
{{ form_row(form.codeRome) }}
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.status) }}
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
{{ form_row(form.publicTag) }}
{{ form_row(form.competences) }}
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12">
&nbsp;
</td>
</tr>
<tr>
<td class="col-lg-12 col-md-12 col-sm-12 ">
<button aria-label="" type="submit" class="btn btn-primary btn-cons btn-animated from-left pull-right"
<button aria-label="" type="submit" id="saveAdButton" class="btn btn-primary btn-cons btn-animated from-left pull-right"
type="button">
<span>Je crée mon annonce</span>
<span class="hidden-block">
@@ -148,54 +305,7 @@ Afin de créer votre annonce, renseignez lensemble des champs relatifs au pos
</div>
</div>
</div>
<div class="tab-pane slide-left padding-20 sm-no-padding disabled" id="tab3">
<div class="row row-same-height">
<div class="col-md-5 b-r b-dashed b-grey ">
<div class="padding-30 sm-padding-5 sm-m-t-15 m-t-50">
<h2>We Secured Your Line</h2>
<p>Below is a sample page for your cart , Created using pages design UI Elementes</p>
<p class="small hint-text">Below is a sample page for your cart , Created using pages design
UI Elementes</p>
<table class="table table-condensed">
<tr>
<td class=" col-md-9">
<span class="m-l-10 font-montserrat fs-11 all-caps">Webarch UI Framework</span>
<span class="m-l-10 ">Dashboard UI Pack</span>
</td>
<td class=" col-md-3 text-right">
<span>Qty 1</span>
</td>
</tr>
<tr>
<td class=" col-md-9">
<span class="m-l-10 font-montserrat fs-11 all-caps">Pages UI Framework</span>
<span class="m-l-10 ">Next Gen UI Pack</span>
</td>
<td class=" col-md-3 text-right">
<span>Qty 1</span>
</td>
</tr>
<tr>
<td colspan="2" class=" col-md-3 text-right">
<h4 class="text-primary no-margin font-montserrat">$27</h4>
</td>
</tr>
</table>
<p class="small">Invoice are issued on the date of despatch. Payment terms: Pre-orders:
within 10 days of invoice date with 4% discount, from the 11th to the 30th day net.
Re-orders: non-reduced stock items are payable net after 20 days. </p>
<p class="small">By pressing Pay Now You will Agree to the Payment <a href="#">Terms &amp;
Conditions</a></p>
</div>
</div>
<div class="col-md-7">
<div class="padding-30 sm-padding-5">
</div>
</div>
</div>
</div>
<div class="padding-20 sm-padding-5 sm-m-b-20 sm-m-t-20 bg-white clearfix">
{# <ul class="pager wizard no-style">
@@ -251,4 +361,318 @@ Afin de créer votre annonce, renseignez lensemble des champs relatifs au pos
</div>
<!-- END CONTAINER FLUID -->
{% endblock %}
{% block javascriptsSecondaire %}
<script type="application/javascript">
//Methode permettant d'afficher le bloc nb d'heure si est en temps partiel
function afficherTempsType(){
if( $( "#ad_soft_temps_type" ).val()=="PART_TIME" ){
//$("#ligneNbHeure").show();
$("#ad_soft_nombre_heure").prop("disabled", false);
}else{
//$("#ligneNbHeure").hide();
$("#ad_soft_nombre_heure").prop("disabled", true);
}
}
//Methode permettant d'afficher le bloc durée de contrat si le contrat est un CDI
function afficherDureeContrat(){
if( $( "#ad_soft_contract_type" ).val()=="CDD" ){
//$("#ligneDureeContrat").show();
$("#ad_soft_duree_contrat").prop("disabled", false);
}else{
//$("#ligneDureeContrat").hide();
$("#ad_soft_duree_contrat").prop("disabled", true);
}
}
$( "#ad_soft_temps_type" ).change(function() {
afficherTempsType();
});
$( "#ad_soft_contract_type" ).change(function() {
afficherDureeContrat();
});
//methode qui permet de générer le json des competences.
// c'est le champ ad_competences qui sert à l'enregistrement en base
function genererJson() {
var competences = "";
//competences = [];
var nbCompetencesSelect = 0;
//on parcourt toutes les checkbox cochées
$(":checkbox:checked").map(function () {
//on recuperer l'input car l'id du champ est formaté comme suit competence_ ou competencepopup_
var input = this.id.split('_');
// on ne ored=nd que les input de la page pricnipale (pas ceux de la popup)
if (input[0] == "competence") {
var retour = this.value.split('_');
//var competence = [retour[0], parseInt(retour[1])];
console.log(this.value);
//competences.push(competence);
//on remplace la virgule par un esapce car sinon bug (les compétences sont séparés par une virgule)
var chaine = this.value.replace(",", " ");
//On limite a 10 compétences, au dela, on les enregistre pas dans le champ ad_competences
if(nbCompetencesSelect<11){
competences += chaine + ",";
nbCompetencesSelect++;
}
$("#nbCompetencesText").html(nbCompetencesSelect+" compétences sélectionnées");
$("#ajouterCompetenceButtonMdal").html("Ajouter (+"+nbCompetencesSelect+")");
$("#nbCompetences").val(nbCompetencesSelect);
//return competence;
}
}).get();
// on renseigne le champ ad_competences
$("#ad_soft_competences").val(competences);
//Gestion des erreurs si aucune compétence
if(nbCompetencesSelect==0){
$("#nbCompetencesText").html("");
$("#competencesAdMessage").html(
"Vous devez sélectionner au minimum une compétence. "
);
$("#ajouterCompetenceButtonMdal").show();
$("#saveAdButton").prop("disabled", true);
}else if(nbCompetencesSelect>9){
$("#saveAdButton").prop("disabled", false);
//Gestion des erreurs si plusde 10 compétences
$("#competencesAdMessage").html(
"Vous avez atteint le nombre maximum de compétences. "
);
$("#competencesAdMessagePopup").html(
"Vous avez atteint le nombre maximum de compétences. "
);
if(nbCompetencesSelect>10){
$("#ajouterCompetenceButtonMdal").hide();
}
}else{
//cas standards, on reinitialise les champs a vide
$("#saveAdButton").prop("disabled", false);
$("#competencesAdMessage").html(
" "
);
$("#ajouterCompetenceButtonMdal").show();
}
if($("#saisie").val() =="" || !$("#saisie").val() ){
$("#competencesAdMessage").html(
"Veuillez choisir un métier de rattachement pour votre annonce. "
);
}
}
$(document).ready(function () {
afficherTempsType();
afficherDureeContrat();
//ad_appellationId
//ad_appellationLibelle
//ad_competences
// renseignement des champs temporaires (champ caché)
$("#id_appellation_temporaire").val($("#ad_soft_appellationId").val());
$("#metier_temporaire").val($("#ad_soft_appellationLibelle").val());
// renseignement du champ visible (init du métier)
$("#saisie").val($("#ad_soft_appellationLibelle").val());
$("#competences_origine").val($("#ad_soft_competences").val());
//charger les compétences en fonction du métier d'origine
chargerCompetences("init");
//cocher les cases par rapport aux compétences d'origine
});
</script>
<script>
$(document)
.ready(function () {
// Construction du champ typeahead d'auto compléetion de métier
$("#competencesButtonAd").hide();
console.log("metiers!!");
var metiers = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.whitespace,
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
// Ajax qui appelle getAppellionsMetier (API TT qui appelle APi pole emploi)
url: '/app_dev.php/api/getAppelationsLibelle',
wildcar: '%QUERY',
filter: function (metiers) {
console.log("metiers2");
return $.map(metiers, function (metier) {
//console.log(metier);
return {
metier_id: metier.code,
metier_libelle: metier.libelle
}
})
},
prepare: function (query, settings) {
//ing%20agro
//query = query.replace(" ", "%20");
settings.url += '?q=' + query;
return settings;
}
},
});
metiers.initialize();
// Initializing the typeahead
$('#saisie').typeahead({
hint: true,
highlight: true
}, {
name: 'metiers',
source: metiers.ttAdapter(),
display: 'metier_libelle',
limit: 10,
templates: {
suggestion: function (data) {
//comment sont formaté les suggestion de l'auto completion
$(".tt-dataset-metiers").show();
var chaine = data.metier_libelle.replace("'", " ");
return '<div><a href="#" onclick="chargerDonneesTemp(' + data.metier_id + ',\'' +
chaine +
'\')" data-toggle="modal" data-target="#competencesModal" id="competences">' + data.metier_libelle +
'</a></div>'
},
footer: function (query) {
//return '<div class="text-center">Plus de résultats :' + query.query + '</div>';
},
empty: function (context) {
// cas ou l'on ne trpouve rien
$("#competencesAdMessage").html(
" Aucun résultat ne correspond à votre recherche. <br/>Saisissez un autre mot clé pour trouver votre métier de rattachement."
);
return '<div class="text-center">Aucun résultat</div>';
}
}
});
});
//methode qui charge métier temporaire (en attente validation de la popup)
//En effet, on demande a l'utilsiateur s'il est sur. C'est pour ca qu'on a a ces champs temporaires
function chargerDonneesTemp(codeRome, libelleMetier) {
$("#id_appellation_temporaire").val(codeRome);
console.log(codeRome);
$("#metier_temporaire").val(libelleMetier);
$(".metierPopup").text(libelleMetier);
console.log(libelleMetier);
}
function chargerCompetences(type) {
$.ajax({
//L'URL de la requête
url: "/app_dev.php/api/getDetailAppelation",
//url: '{{ path("anwser_share", {"id":'+id+'}) }}',
//La méthode d'envoi (type de requête)
method: "GET",
data: 'q=' + $("#id_appellation_temporaire").val(),
//Le format de réponse attendu
dataType: "json",
})
//Ce code sera exécuté en cas de succès - La réponse du serveur est passée à done()
/*On peut par exemple convertir cette réponse en chaine JSON et insérer
* cette chaine dans un div id="res"*/
.done(function (response) {
let data = JSON.stringify(response);
//$("div#res").append(data);
//console.log(data);
const obj = JSON.parse(data);
//console.log("code ROME");
//console.log(obj.metier.code);
//Passage du l'id appelation et de son libelle temporaire
$("#ad_soft_codeRome").val(obj.metier.code);
$("#ad_soft_appellationId").val($("#id_appellation_temporaire").val());
$("#ad_soft_appellationLibelle").val($("#metier_temporaire").val());
//console.log("competences de base");
//console.log(obj.competencesDeBase);
//Init des champs de compétences
$("#competencesAd").text("");
$("#competencesAdPopup").text("");
$("#competencesAdMessage").html("");
obj.competencesDeBase.forEach(function (object) {
//console.log("Compétence de base");
//console.log(object.code);
//console.log(object.libelle);
//console.log(object.competenceCle);
var hidden = "";
var checked = "";
if (object.competenceCle == true && type!="init") {
checked = "checked";
}
var chaine = object.libelle.replace("'", " ");
var chaine = chaine.replace(",", " ");
$("#competencesAd").append("<div id='competence_ad_"+object.code+"' name='competences_ad[]'><input type='checkbox' "+checked+" onChange='genererCompetences(this);' id='competence_" + object
.code + "' value='" +chaine+"_"+ object.code + "'> " + object.libelle + "<br/></div>");
$("#competencesAdPopup").append("<div id='competence_ad_popup_"+object.code+"'><input type='checkbox' "+checked+" onChange='genererCompetences(this);' id='competencepopup_" + object
.code + "' value='" + object.code + "'> " + object.libelle + "<br/></div>");
if (object.competenceCle == false) {
$("#competence_ad_"+object.code).hide();
}
});
$("#competencesButtonAd").show();
if(type=="init"){
const obj = JSON.parse($("#ad_soft_competences").val());
for (var key in obj) {
for (var key2 in obj[key]) {
//console.log(obj[key][key2]);
console.log(key2);
$("#competencepopup_"+key2).prop("checked", true);
$("#competence_"+key2).prop("checked", true);
$("#competence_ad_"+key2).show();
}
}
}
//on génere le json qui va remplir le champ ad_soft_competences
genererJson();
})
//Ce code sera exécuté en cas d'échec - L'erreur est passée à fail()
//On peut afficher les informations relatives à la requête et à l'erreur
.fail(function (error) {
$("#competencesAd").text("");
$("#competencesAdPopup").text("");
if ($("#saisie").val() != "") {
// si il y a un pb avec l'api pole emploi, on affiche ce message
$("#competencesAdMessage").html(
"Une erreur est survenue dans la recherche du métier de rattachement. <a href='#' onclick='chargerCompetences();'><i class='fa fa-refresh fa-spin fa-fw'></i>Cliquez ici pour relancer la recherche</a> "
);
}
console.log("La requête s'est terminée en échec. Infos : " + JSON.stringify(error));
})
//Ce code sera exécuté que la requête soit un succès ou un échec
.always(function () {
console.log("Requête effectuée");
});
}
// function qui permet de synchroniser les compétences de la page et celles de la popup
// ca va dans les deux sens.
function genererCompetences(cb) {
console.log("Clicked, new value = " + cb.checked);
console.log("Clicked, target = " + cb.id);
var id = cb.id.split('_');
id = id[1];
if($("#nbCompetences").val()<10){
$("#competence_" + id).prop("checked", cb.checked);
$("#competencepopup_" + id).prop("checked", cb.checked);
if (cb.checked) {
console.log("reaffichage div #competence_ad_" + id);
$("#competence_ad_" + id).show();
} else {
console.log("hidden de div #competence_ad_" + id);
$("#competence_ad_" + id).hide();
}
}else{
$("#competence_" + id).prop("checked", false);
$("#competencepopup_" + id).prop("checked", false);
}
// on génere le json a chaque fois
genererJson();
}
</script>
{% endblock %}
@@ -30,52 +30,7 @@
</div>
<!-- END JUMBOTRON -->
<!-- Modal -->
<div class="modal fade " id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
aria-hidden="false">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<h5>Popover in a modal</h5>
<p>This <a href="#" role="button" class="btn btn-secondary popover-test" title="Popover title"
data-content="Popover body content is set in this attribute.">button</a> triggers a popover on
click!</p>
<a href="#" data-toggle="tooltip" title="Some tooltip text!">Hover over me</a>
<div class="tooltip bs-tooltip-top" role="tooltip">
<div class="arrow"></div>
<div class="tooltip-inner">
Some tooltip text!
</div>
</div>
<hr>
<h5>Tooltips in a modal</h5>
<p><a href="#" class="tooltip-test" title="Tooltip">This link</a> and <a href="#" class="tooltip-test"
title="Tooltip">that link</a> have tooltips on hover.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
{#
<a href="#" data-toggle="tooltip" title="Some tooltip text!">Hover over me</a>
<!-- Generated markup by the plugin -->
<div class="tooltip bs-tooltip-top" role="tooltip">
<div class="arrow"></div>
<div class="tooltip-inner">
Some tooltip text!
</div>
</div> #}
<!-- START CONTAINER FLUID -->
<div class=" container-fluid container-fixed-lg bg-white">
@@ -83,9 +38,7 @@
<div class="card card-transparent">
<div class="card-header ">
<div class="card-title">Offres d'emploi
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
Launch demo modal
</button>
</div>
</div>
<div class="card-body">
@@ -0,0 +1,395 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<link
href="{{ asset('dashboard/plugins/bootstrap/css/bootstrap.min.css') }}"
rel="stylesheet"
type="text/css"/>
<script
src="{{ asset('dashboard/plugins/jquery/jquery-3.5.1.min.js') }}"
type="text/javascript"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/corejs-typeahead/1.3.1/bloodhound.min.js"
type="text/javascript"></script>
<script
src="{{ asset('dashboard/plugins/typeahead/typeahead.bundle.js') }}"
type="text/javascript"></script>
<script>
$(document)
.ready(function () {
// Constructing the suggestion engine
console.log("metiers!!!");
var metiers = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.whitespace,
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: 'http://localhost/app_dev.php/api/getAppelationsLibelle',
wildcar: '%QUERY',
filter: function (metiers) {
console.log("metiers2");
return $.map(metiers, function (metier) {
console.log(metier);
return {metier_id: metier.code, metier_libelle: metier.libelle}
})
},
prepare: function (query, settings) {
//ing%20agro
//query = query.replace(" ", "%20");
settings.url += '?q=' + query;
return settings;
}
},
});
metiers.initialize();
// Initializing the typeahead
$('.typeahead').typeahead({
hint: true,
highlight: true
}, {
name: 'metiers',
source: metiers.ttAdapter(),
display: 'metier_libelle',
limit: 10,
templates: {
suggestion: function (data) {
return '<div><strong>' + data.metier_id + '</strong> ' + data.metier_libelle + '</div>'
},
footer: function (query) {
//return '<div class="text-center">Plus de résultats :' + query.query + '</div>';
},
empty: function (context) {
// console.log(1) // put here your code when result not found
return '<div class="text-center">Aucun résultat</div>';
}
}
});
});
</script>
<style>
.bs-example {
font-family: sans-serif;
position: relative;
margin: 100px;
}
.tt-hint,
.tt-query,
.typeahead {
border: 2px solid #CCCCCC;
border-radius: 8px;
font-size: 22px;
/* Set input font size */
height: 30px;
line-height: 30px;
outline: medium none;
padding: 8px 12px;
width: 396px;
}
.typeahead {
background-color: #FFFFFF;
}
.typeahead:focus {
border: 2px solid #0097CF;
}
.tt-query {
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset;
}
.tt-hint {
color: #999999;
}
.tt-menu {
background-color: #FFFFFF;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 8px;
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
margin-top: 12px;
padding: 8px 0;
width: 422px;
}
.tt-suggestion {
font-size: 22px;
/* Set suggestion dropdown font size */
padding: 3px 20px;
}
.tt-suggestion:hover {
cursor: pointer;
background-color: #0097CF;
color: #FFFFFF;
}
.tt-suggestion p {
margin: 0;
}
.tt-suggestions {
min-height: 300px;
max-height: 600px;
overflow-y: auto;
}
</style>
<style type="text/css">
/* Copyright 2014-present Evernote Corporation. All rights reserved. */
@keyframes caretBlink {
from {
opacity: 1.0;
}
to {
opacity: 0.0;
}
}
@keyframes rotateSpinner {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
#text-tool-caret {
animation-name: caretBlink;
animation-iteration-count: infinite;
animation-timing-function: cubic-bezier(1.0, 0, 0, 1.0);
animation-duration: 1s;
}
#en-markup-loading-spinner {
position: absolute;
top: calc(50% - 16px);
left: calc(50% - 16px);
width: 32px;
height: 32px;
}
#en-markup-loading-spinner img {
position: relative;
top: 0;
left: 0;
animation-name: rotateSpinner;
animation-duration: 0.6s;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
</style>
<style type="text/css">
/* Copyright 2014-present Evernote Corporation. All rights reserved. */
.skitchToastBoxContainer {
position: absolute;
width: 100%;
text-align: center;
top: 30px;
-webkit-user-select: none;
-moz-user-select: none;
pointer-events: none;
}
.skitchToastBox {
width: 200px;
height: 16px;
padding: 12px;
background-color: rgba(47, 55, 61, 0.95);
border-radius: 4px;
color: white;
cursor: default;
font-size: 10pt;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.32);
font-family: 'Soleil', Helvetica, Arial, sans-serif;
border: 2px rgba(255, 255, 255, 0.38) solid;
}
.lang-zh-cn .skitchToastBox {
font-family: '微软雅黑', 'Microsoft YaHei', SimSun, '&#x30E1;&#x30A4;&#x30EA;&#x30AA;', Meiryo, 'MS PGothic', 'Soleil', Helvetica, Arial, sans-serif;
}
.lang-ja-jp .skitchToastBox {
font-family: '&#x30E1;&#x30A4;&#x30EA;&#x30AA;', Meiryo, 'MS PGothic', '微软雅黑', 'Microsoft YaHei', SimSun, 'Soleil', Helvetica, Arial, sans-serif;
}
.skitchToast {
padding-left: 20px;
padding-right: 20px;
display: inline-block;
height: 10px;
color: #f1f5f8;
text-align: center;
}
.skitchVisible {
/* Don't remove this class it's a hack used by the Evernote Clipper */
}
</style>
<style type="text/css">
/* Copyright 2019-present Evernote Corporation. All rights reserved. */
#en-markup-disabled {
position: fixed;
z-index: 9999;
width: 100%;
height: 100%;
top: 0;
left: 0;
cursor: default;
-webkit-user-select: none;
}
#en-markup-alert-container {
position: absolute;
z-index: 9999;
width: 450px;
left: calc(50% - 225px);
top: calc(50% - 85px);
background-color: white;
box-shadow: 0 2px 7px 1px rgba(0, 0, 0, 0.35);
-webkit-user-select: none;
}
#en-markup-alert-container .cell-2 {
position: relative;
float: left;
width: 345px;
margin-top: 29px;
margin-bottom: 20px;
}
#en-markup-alert-container .cell-2 .cell-2-title {
margin-bottom: 5px;
padding-right: 30px;
font-size: 12pt;
font-family: Tahoma, Arial;
}
#en-markup-alert-container .cell-2 .cell-2-message {
padding-right: 30px;
font-size: 9.5pt;
font-family: Tahoma, Arial;
}
#en-markup-alert-container .cell-3 {
position: relative;
width: 450px;
height: 60px;
float: left;
background-color: rgb(240, 240, 240);
}
#en-markup-alert-container .cell-3 button {
position: absolute;
top: 12px;
right: 15px;
width: 110px;
height: 36px;
}
#en-markup-alert-container .cell-3 button.alt-button {
position: absolute;
top: 12px;
right: 140px;
width: 110px;
height: 36px;
}
</style>
<style>
[touch-action="none"] {
-ms-touch-action: none;
touch-action: none;
}
[touch-action="auto"] {
-ms-touch-action: auto;
touch-action: auto;
}
[touch-action~="pan-x"] {
-ms-touch-action: pan-x;
touch-action: pan-x;
}
[touch-action~="pan-y"] {
-ms-touch-action: pan-y;
touch-action: pan-y;
}
[touch-action~="pan-up"] {
-ms-touch-action: pan-up;
touch-action: pan-up;
}
[touch-action~="pan-down"] {
-ms-touch-action: pan-down;
touch-action: pan-down;
}
[touch-action~="pan-left"] {
-ms-touch-action: pan-left;
touch-action: pan-left;
}
[touch-action~="pan-right"] {
-ms-touch-action: pan-right;
touch-action: pan-right;
}
</style>
</head>
<body class="fixed-header dashboard menu-pin menu-behind">
{# {{ include('default/user_switch.html.twig') }} #}
<!-- START PAGE-CONTAINER -->
<div class="page-container ">
<!-- START PAGE CONTENT WRAPPER -->
<div class="page-content-wrapper ">
<div class="content ">
{% block dashContent %}
<h2>choisir un métier</h2>
<span
class="twitter-typeahead"
style="position: relative; display: inline-block;"><input
type="text"
class="typeahead tt-query tt-hint"
autocomplete="off"
spellcheck="false"
readonly=""
tabindex="-1"
dir="ltr"
style="position: absolute; top: 0px; left: 0px; border-color: transparent; box-shadow: none; opacity: 1; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255);"><input
type="text"
id="saisie"
class="typeahead tt-query tt-input"
autocomplete="off"
spellcheck="false"
dir="auto"
style="position: relative; vertical-align: top; background-color: transparent;">
<pre aria-hidden="true"
style="position: absolute; visibility: hidden; white-space: pre; font-family: Arial; font-size: 22px; font-style: normal; font-variant: normal; font-weight: 400; word-spacing: 0px; letter-spacing: 0px; text-indent: 0px; text-rendering: auto; text-transform: none;"></pre>
<div
class="tt-menu"
style="position: absolute; top: 100%; left: 0px; z-index: 100; display: none;">
<div class="tt-dataset tt-dataset-cars"></div>
</div>
</span>
{% endblock %}
</div>
</div>
</div>
</body>
</html>
@@ -9,7 +9,14 @@
<div class="list-group list-group-flush list-group-transparent">
<!-- Links -->
<ul class="list-unstyled">
<li><a class="list-group-item list-group-item-action" href="/">Espace recruteurs</a></li>
<li><a class="list-group-item list-group-item-action" href="/">Accueil</a></li>
<li>
<a class="list-group-item list-group-item-action" href="#signupModal" role="button"
data-modal-target="#signupModal"
data-overlay-color="#151b26">
Espace recruteurs
</a>
</li>
<li><a class="list-group-item list-group-item-action"href="https://www.talentstube.com/" target="_blank">Jobs</a></li>
{# <li><a class="list-group-item list-group-item-action" href="#" target="_blank">CV Vidéothèque (En cours)</a></li> #}
</ul>
@@ -239,7 +239,7 @@
<h2>Vous souhaitez partager votre profil à d'autres entreprises?</h2>
<h3>Copiez et ajoutez l'adresse ci-dessous lors de vos candidatures</h3>
<input id="linkToCopy" type="text" value="https://www.talentstube.com{{ path("talent_show", {"alias": app.user.company.alias }) }}">
<input id="linkToCopy" type="text" value="https://recruteur.talentstube.com{{ path("talent_show", {"alias": app.user.company.alias }) }}">
<a class="btn btn-default btn-round" id="copyLink">Copier</a><br />
<a class="modal-action modal-close">Fermer</a>
</div>
@@ -28,6 +28,65 @@ class AdController extends Controller
/***********************
* Ad - Company
***********************/
/**
* @Route("/partage/show/{id}", name="anwser_share_show")
*/
public function answerShowAction(Request $request, Ad $ad)
{
$session = $request->getSession();
$ad_authorisation = $session->get('ad_authorisation');
if($ad_authorisation == $ad->getId()){
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$answers = $em->getRepository('AppBundle:Answer')->getAnswerByAdsShare( $ad->getId());
return $this->render('company/ad_answers.html.twig', array(
'answers' => $answers,
'titreAnnonce' => $ad->getTitle(),
));
}else{
return $this->redirectToRoute('anwser_share_show_connect', array(
'id' => $ad->getId(),
'error' => true
));
}
}
/**
* @Route("/partage/{id}", name="anwser_share_show_connect")
*/
public function answersConnectShowAction(Request $request, Ad $ad)
{
$error= $request->query->get('error');
return $this->render('company/ad_answers_connect.html.twig', array(
'adId' => $ad->getId(),
'error' => $error,
));
}
/**
* @Route("/connectionpartage", name="connectionpartage")
*/
public function answersConnectAction(Request $request)
{
$adId= $request->query->get('adId');
$mdp= $request->query->get('mdp');
$session = $request->getSession();
//verifier si le mot de passe est valide pour l'annonce
$em = $this->getDoctrine()->getManager();
$retour = $em->getRepository('AppBundle:Ad')->findBy(array('id' => $adId, 'code'=>$mdp));
if(count($retour)>0){
$session->set('ad_authorisation', $adId);
return new JsonResponse(array('retour' => "true"));
}else{
$session->set('ad_authorisation', null);
//TODO redirection vers page de connexion avec message d'erreur
//return $this->redirectToRoute('anwser_share_show');
return new JsonResponse(array('retour' => "false"));
}
}
/**
* @Route("/entreprise/me/espace-oe/annonce", name="company_ad")
@@ -61,7 +120,13 @@ class AdController extends Controller
//LLAN Ajout de la notion de temps partiel, plein temps (5 oct 2020)
$temps_type = $form['temps_type']->getData();
$arrayExtra['temps_type'] = $temps_type;
//LLAN US 295 :mise en place du télétravail
//LLAN US 380 :mise en place du nb de mois de contrat (CDD)
$duree_contrat = $form['duree_contrat']->getData();
$arrayExtra['duree_contrat'] = $duree_contrat;
//LLAN US 329 :mise en place du nb d'heure
$nombre_heure = $form['nombre_heure']->getData();
$arrayExtra['nombre_heure'] = $nombre_heure;
//LLAN US 295 :mise en place du télétravail
$teletravail = $form['teletravail']->getData();
$arrayExtra['teletravail'] = $teletravail;
$ad->setExtra($arrayExtra);
@@ -117,7 +182,39 @@ class AdController extends Controller
$arrayExtra['contract_type'] = $type_contract;
$arrayExtra['temps_type'] = $temps_type;
$arrayExtra['teletravail'] = $teletravail;
//LLAN US 380 :mise en place du nb de mois de contrat (CDD)
$duree_contrat = $form['duree_contrat']->getData();
$arrayExtra['duree_contrat'] = $duree_contrat;
//LLAN US 329 :mise en place du nb d'heure
$nombre_heure = $form['nombre_heure']->getData();
$arrayExtra['nombre_heure'] = $nombre_heure;
$ad->setExtra($arrayExtra);
//US 340
$competences = $form['competences']->getData();
$competencesList = explode(",", $competences);
//dump($competencesList);
//$competencesJson = "{";
$array = Array ();
for ($i = 0; $i < count($competencesList)-1; $i++) {
//dump($i);
//$competence = split("_", $competencesList);
//dump($competencesList[$i]);
list($competenceLibelle, $competenceId) =
explode("_", $competencesList[$i]);
if($competenceLibelle && $competenceId){
$array[] = Array (
intval($competenceId) => $competenceLibelle);
}
}
$ad->setCompetences(
$array
);
$adManager = $this->get('app.ad_manager');
$adManager->updateAd($ad);
return $this->redirectToRoute('create_media', array('id' => $ad->getId()));
@@ -140,10 +237,44 @@ class AdController extends Controller
$type_contract = $form['contract_type']->getData();
$temps_type = $form['temps_type']->getData();
$teletravail = $form['teletravail']->getData();
//LLAN US 380 :mise en place du nb de mois de contrat (CDD)
$duree_contrat = $form['duree_contrat']->getData();
//LLAN US 329 :mise en place du nb d'heure
$nombre_heure = $form['nombre_heure']->getData();
//US 340
$competences = $form['competences']->getData();
$competencesList = explode(",", $competences);
//dump($competencesList);
//$competencesJson = "{";
$array = Array ();
for ($i = 0; $i < count($competencesList)-1; $i++) {
//dump($i);
//$competence = split("_", $competencesList);
//dump($competencesList[$i]);
list($competenceLibelle, $competenceId) =
explode("_", $competencesList[$i]);
if($competenceLibelle && $competenceId){
$array[] = Array (
intval($competenceId) => $competenceLibelle);
}
}
$ad->setCompetences(
$array
);
$arrayExtra = $ad->getExtra();
$arrayExtra['contract_type'] = $type_contract;
$arrayExtra['temps_type'] = $temps_type;
$arrayExtra['teletravail'] = $teletravail;
$arrayExtra['duree_contrat'] = $duree_contrat;
$arrayExtra['nombre_heure'] = $nombre_heure;
$ad->setExtra($arrayExtra);
$adManager = $this->get('app.ad_manager');
$adManager->updateAd($ad);
@@ -9,10 +9,13 @@ use AppBundle\Form\Admin\ModerationDeclineType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
class AnswerController extends Controller
class AnswerController extends AbstractController
{
/***********************
@@ -24,14 +27,224 @@ class AnswerController extends Controller
*/
public function adminAnswerModerationListAction()
{
$em = $this->getDoctrine()->getManager();
$answers = $em->getRepository('AppBundle:Answer')->findAll();
// Passage en multipage ajax
// $em = $this->getDoctrine()->getManager();
// $answers = $em->getRepository('AppBundle:Answer')->findAll();
return $this->render('admin/answer_list_moderation.html.twig', array(
'answers' => $answers,
return $this->render('admin/answer_list_moderation_v2.html.twig', array(
));
}
/**
* @Route("/admin/moderation/anwser/list/test", name="admin_anwser_moderation_list_test")
*/
public function adminAnswerModerationListTestAction(Request $request)
{
// $em = $this->getDoctrine()->getManager();
// $answers = $em->getRepository('AppBundle:Answer')->findAll();
return $this->render('admin/answer_list_moderation_v2.html.twig', array(
// 'answers' => $answers,
));
}
//
/**
* @Route("/admin/alimenterCandidatures", name="alimenterCandidatures")
*/
public function listDatatablesAction(Request $request)
{
// Set up required variables
$this->entityManager = $this->getDoctrine()->getManager();
$this->repository = $this->entityManager->getRepository('AppBundle:Answer');
//$this->translator = $this->get('translator');
// Get the parameters from DataTable Ajax Call
if ($request->getMethod() == 'POST')
{
$draw = intval($request->request->get('draw'));
$start = $request->request->get('start');
$length = $request->request->get('length');
$search = $request->request->get('search');
$orders = $request->request->get('order');
$columns = $request->request->get('columns');
}
else // If the request is not a POST one, die hard
die;
// Process Parameters
// Orders
foreach ($orders as $key => $order)
{
// Orders does not contain the name of the column, but its number,
// so add the name so we can handle it just like the $columns array
$orders[$key]['name'] = $columns[$order['column']]['name'];
}
// Further filtering can be done in the Repository by passing necessary arguments
$otherConditions = "array or whatever is needed";
// Get results from the Repository
$results = $this->repository->getRequiredDTData($start, $length, $orders, $search, $columns, $otherConditions = null);
// Returned objects are of type Town
$objects = $results["results"];
// Get total number of objects
$total_objects_count = $this->repository->comptage();
// Get total number of results
$selected_objects_count = count($objects);
// Get total number of filtered data
$filtered_objects_count = $results["countResult"];
// Construct response
$response = '{
"draw": '.$draw.',
"recordsTotal": '.$total_objects_count.',
"recordsFiltered": '.$filtered_objects_count.',
"data": [';
$i = 0;
foreach ($objects as $key => $answer)
{
$response .= '["';
$j = 0;
$nbColumn = count($columns);
foreach ($columns as $key => $column)
{
// In all cases where something does not exist or went wrong, return -
$responseTemp = "-";
switch($column['name'])
{
case 'ad_id':
{
$name = $answer->getId();
// Do this kind of treatments if you suspect that the string is not JS compatible
$name = htmlentities(str_replace(array("\r\n", "\n", "\r"), ' ', $name));
// // View permission ?
// if ($this->get('security.authorization_checker')->isGranted('view_town', $town))
// {
// // Get the ID
// $id = $answer->getId();
// // Construct the route
// $url = $this->generateUrl('playground_town_view', array('id' => $id));
// // Construct the html code to send back to datatables
// $responseTemp = "<a href='".$url."' target='_self'>".$ref."</a>";
// }
// else
// {
$responseTemp = $name;
//}
break;
}
case 'nom':
{
// We know from the class definition that the postal code cannot be null
// But if that werent't the case, its value should have been tested
// before assigning it to $responseTemp
$responseTemp = $answer->getUser()->getLastname();
break;
}
case 'prenom':
{
// We know from the class definition that the postal code cannot be null
// But if that werent't the case, its value should have been tested
// before assigning it to $responseTemp
$responseTemp = $answer->getUser()->getFirstname();
break;
}
case 'entreprise':
{
// We know from the class definition that the postal code cannot be null
// But if that werent't the case, its value should have been tested
// before assigning it to $responseTemp
if($answer->getCompany()){
$responseTemp = $answer->getCompany()->getBrandName()." / ";
if($answer->getAd()){
$responseTemp .= $answer->getAd()->getTitle();
}
}else{
$responseTemp = "ND";
}
break;
}
case 'date_envoi':
{
if($answer->getSendTime()){
$responseTemp = date_format($answer->getSendTime(), 'd-m-Y H:i:s');;
}else{
$responseTemp ="ND";
}
// This cannot happen if inner join is used
// However it can happen if left or right joins are used
break;
}
case 'video':
{
$video = $answer->getVideo();
$responseTemp ="ND";
if($video){
$responseTemp = 'ID Candidature :'.$answer->getId().'<br />';
$videoRenommee = str_replace("/videos/", "", $video->getCdnUrl());
//TODO : revoir ca car une vue dans un controller ca n'est pas top!!!!!
$responseTemp .= "<iframe src='https://player.vimeo.com/video/".$videoRenommee."?embedparameter=value' width='auto' height='auto' frameborder='0' allowfullscreen></iframe>";
}
break;
}
case 'status':
{
$responseTemp = "<span id='status_".$answer->getId()."'> ".$answer->getstatus()."</span> ";
break;
}
case 'actions':
{
$responseTemp = "Actions :<select class='changeStatus' onChange='changerStatut(this.value, ".$answer->getId().")' name='changeStatus' data-id=".$answer->getId()."><option value='null'>choisir</option><option value='SENDED'>Envoyé</option><option value='DRAFT'>Brouillon</option><option value='REFUSED'>Refuser</option></select>";
break;
}
}
// Add the found data to the json
$response .= $responseTemp;
if(++$j !== $nbColumn)
$response .='","';
}
$response .= '"]';
// Not on the last item
if(++$i !== $selected_objects_count)
$response .= ',';
}
$response .= ']}';
// Send all this stuff back to DataTables
$returnResponse = new JsonResponse();
$returnResponse->setJson($response);
return $returnResponse;
}
/**
* @Route("/admin/config/answer/{id}/status/{status}", name="admin_answer_status")
*/
@@ -21,6 +21,31 @@ use AppBundle\Entity\Media;
class AnswerController extends Controller
{
/**
* @Route("/anwser/share/{id}", name="anwser_share")
*/
public function anwserShareAction(Request $request, Answer $answer)
{
if ($answer) {
$em = $this->getDoctrine()->getManager();
$answer->setIsShared($request->query->get('isShare'));
$ad = $answer->getAd();
if($ad->getCode()==null){
$ad->generateCode();
//$em->persist($ad);
}
$em->persist($ad);
$em->persist($answer);
$em->flush();
}
return new JsonResponse(array('success' => "true", 'code' => $ad->getCode()));
}
/**
* @Route("/anwser/edit/comment/{id}", name="anwser_edit_comment")
*/
@@ -178,6 +178,11 @@ class CompanyController extends FOSRestController
'Accept : application/json',
'Authorization: Bearer ' . $token
));
$q =str_replace(" ","%20",$q);
$search = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'à', 'á', 'â', 'ã', 'ä', 'å', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ò', 'ó', 'ô', 'õ', 'ö', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ');
$replace = array('A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y');
$q = str_replace($search, $replace, $q);
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.emploi-store.fr/partenaire/rome/v1/appellation?q=".$q,
CURLOPT_RETURNTRANSFER => true,
@@ -202,7 +207,7 @@ class CompanyController extends FOSRestController
curl_close($curl);
}
return new JsonResponse($response, 200, [], true);
}
@@ -128,6 +128,27 @@ class DefaultController extends Controller
);
}
/**
* @Route("/autocomplete", name="autocomplete")
*/
public function autocompleteAction(Request $request)
{
//var_dump($mailManager);
return $this->render(
'defaultv2/accueil/autocomplete.html.twig', [
//'ads' => $ads,
//'companies' => $arrayCompany,
//'talents' => $arrayTalents,
//'territories' => $territories,
//'searchform' => $form->createView(),
]
);
}
/**
* @Route("/cvtheque", name="talent_index")
*/
@@ -85,6 +85,7 @@ class Ad
*/
private $title;
/**
* @var string
*
@@ -101,6 +102,15 @@ class Ad
*/
private $description;
/**
* @var string
*
* @ORM\Column(name="code", type="text", nullable=true)
*
* @Groups({"ad_detail", "answer_detail"})
*/
private $code;
/**
* @var string
*
@@ -409,6 +419,43 @@ class Ad
return $contract_type;
}
/**
* @return array|null
*
* Search duree_contrat in the extra field
*/
public function getDureeContrat()
{
$duree_contrat = null;
$extra = $this->extra;
if ($extra) {
if (array_key_exists('duree_contrat', $extra)) {
$duree_contrat = $extra['duree_contrat'];
}
}
return $duree_contrat;
}
/**
* @return array|null
*
* Search nombre_heure in the extra field
*/
public function getNombreHeure()
{
$nombre_heure = null;
$extra = $this->extra;
if ($extra) {
if (array_key_exists('nombre_heure', $extra)) {
$nombre_heure = $extra['nombre_heure'];
}
}
return $nombre_heure;
}
/**
* @return array|null
*
@@ -668,6 +715,10 @@ class Ad
return $this->title;
}
/**
* Set description.
*
@@ -692,6 +743,42 @@ class Ad
return $this->description;
}
/**
* Set code.
*
* @param string|null $code
*
* @return Ad
*/
public function setCode($code = null)
{
$this->code = $code;
return $this;
}
/**
* Get code.
*
* @return string|null
*/
public function getCode()
{
return $this->code;
}
/**
* Generate code.
*
* @return Ad
*/
public function generateCode()
{
$six_digit_random_number = mt_rand(100000, 999999);
$this->setCode($six_digit_random_number);
return $this;
}
/**
* Set beneficiaire.
*
@@ -758,11 +845,11 @@ class Ad
/**
* Get appellationLibelle.
*
* @return int|null
* @return string|null
*/
public function getAppellationLibelle()
{
return $this->AppellationLibelle;
return $this->appellationLibelle;
}
/**
@@ -781,7 +868,7 @@ class Ad
/**
* Get codeRome.
*
* @return int|null
* @return string|null
*/
public function getCodeRome()
{
@@ -90,6 +90,13 @@ class Answer
*/
private $video;
/**
* @var boolean
*
* @ORM\Column(name="is_shared", type="boolean", nullable=true)
*/
private $isShared;
/**
* @var int
*
@@ -204,6 +211,29 @@ class Answer
{
return $this->id;
}
/**
* Set isShared.
*
* @param bool|null $isShared
*
* @return Answer
*/
public function setIsShared($isShared = null)
{
$this->isShared = $isShared;
return $this;
}
/**
* Get isShared.
*
* @return bool|null
*/
public function getIsShared()
{
return $this->isShared;
}
/**
* Set vote.
@@ -8,6 +8,7 @@ use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
class AdSoftType extends AbstractType
{
@@ -19,10 +20,15 @@ class AdSoftType extends AbstractType
$publicTags = implode(',', $publicTags);
}
}
$competences = json_encode($options['data']->getCompetences());
$contract_type = "";
//US 380 : mise en place de la durée de contrat pour un CDD
$duree_contrat="0";
$temps_type = "";
// US 488 : mise en place Télétravail
$teletravail="";
// * US 329 : mise en place du nombre d'heure
$nombre_heure="0";
$extra = $options['data']->getExtra();
if ($extra != null) {
if(is_array($extra)){
@@ -30,10 +36,18 @@ class AdSoftType extends AbstractType
if (array_key_exists("temps_type",$extra)){
$temps_type = $extra['temps_type'];
}
// * US 380 : mise en place du nombre de mois de contrat de CDD
if (array_key_exists("duree_contrat",$extra)){
$duree_contrat = $extra['duree_contrat'];
}
// US 488 : mise en place Télétravail
if (array_key_exists("teletravail",$extra)){
$teletravail = $extra['teletravail'];
}
// * US 329 : mise en place du nombre d'heure
if (array_key_exists("nombre_heure",$extra)){
$nombre_heure = $extra['nombre_heure'];
}
}
}
@@ -93,12 +107,46 @@ class AdSoftType extends AbstractType
'Interim' => 'Interim'
),
'attr' => array(
'class' => 'cs-select cs-skin-slide'
'class' => 'form-control',
//'data-init-plugin' => 'cs-select'
)
))
->add('duree_contrat', IntegerType::class, array(
'mapped' => false,
'label' => 'Durée du contrat en mois',
'empty_data' => "0",
'required' => false,
'attr' => array(
'value' => $duree_contrat,
'class' => 'form-control',
'min' => '0',
'max' => '50',
)
))
->add('appellationId', HiddenType::class, array(
'mapped' => true,
'label' => 'Id de l appellation',
'attr' => array(
'class' => 'form-control',
)
))
->add('appellationLibelle', HiddenType::class, array(
'mapped' => true,
'label' => 'Libellé de l appellation',
'attr' => array(
'class' => 'form-control',
)
))
->add('codeRome', HiddenType::class, array(
'mapped' => true,
'label' => 'code ROME',
'attr' => array(
'class' => 'form-control',
)
))
->add('temps_type', ChoiceType::class, array(
'mapped' => false,
'label' => 'Type d\'emploi',
'label' => 'Type d\'emploi ',
'data' => $temps_type,
'choices' => array(
'Temps plein ' => 'FULL_TIME',
@@ -106,10 +154,23 @@ class AdSoftType extends AbstractType
'Temps plein ou temps partiel' => 'MIX_TIME',
),
'attr' => array(
'class' => 'cs-select cs-skin-slide',
'class' => 'form-control',
//'data-init-plugin' => 'cs-select'
)
))
->add('nombre_heure', IntegerType::class, array(
'mapped' => false,
'label' => 'Temps de travail',
'empty_data' => "0",
'required' => false,
'attr' => array(
'value' => $nombre_heure,
'class' => 'form-control',
'min' => '0',
'max' => '35',
)
))
->add('teletravail', ChoiceType::class, array(
'mapped' => false,
'label' => 'Possibilité de faire du Télétravail?',
@@ -121,7 +182,8 @@ class AdSoftType extends AbstractType
'Non' => 'tele_non',
),
'attr' => array(
'class' => 'cs-select cs-skin-slide',
'class' => 'form-control',
//'data-init-plugin' => 'cs-select'
)
))
@@ -132,7 +194,7 @@ class AdSoftType extends AbstractType
'A publier (Validation par Talents Tube)' => 'TO_PUBLISH',
),
'attr' => array(
'class' => 'cs-select cs-skin-slide',
'class' => 'form-control',
)
))
@@ -140,8 +202,18 @@ class AdSoftType extends AbstractType
'label' => 'profile.company.tags',
'data' => $publicTags,
'attr' => array(
'class' => 'form-control'
'class' => 'tag label label-info'
)
)
));
)
->add('competences', HiddenType::class, array(
'label' => 'competences:',
'data' => $competences,
'attr' => array(
'class' => 'form-control'
)
)
)
;
}
}
@@ -7,6 +7,8 @@ use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\FormBuilderInterface;
class AdType extends AbstractType
@@ -19,20 +21,35 @@ class AdType extends AbstractType
$publicTags = implode(',', $publicTags);
}
}
$competences = json_encode($options['data']->getCompetences());
//dump($competences);
$contract_type = "";
//US 380 : mise en place de la durée de contrat pour un CDD
$duree_contrat="0";
$temps_type = "";
// * US 295 : mise en place du champ télétravail
$teletravail="";
// * US 329 : mise en place du nombre d'heure
$nombre_heure="0";
$extra = $options['data']->getExtra();
if ($extra != null) {
if(is_array($extra)){
if (array_key_exists("contract_type",$extra)){
$contract_type = $extra['contract_type'];
}
// * US 380 : mise en place du nombre de mois de contrat de CDD
if (array_key_exists("duree_contrat",$extra)){
$duree_contrat = $extra['duree_contrat'];
}
if (array_key_exists("temps_type",$extra)){
$temps_type = $extra['temps_type'];
}
// * US 329 : mise en place du nombre d'heure
if (array_key_exists("nombre_heure",$extra)){
$nombre_heure = $extra['nombre_heure'];
}
// * US 295 : mise en place du champ télétravail
if (array_key_exists("teletravail",$extra)){
$teletravail = $extra['teletravail'];
@@ -94,7 +111,7 @@ class AdType extends AbstractType
))
->add('contract_type', ChoiceType::class, array(
'mapped' => false,
'label' => 'Type de contrat',
'label' => 'Type de contrat:',
'data' => $contract_type,
'choices' => array(
'CDI' => 'CDI',
@@ -106,13 +123,47 @@ class AdType extends AbstractType
'Interim' => 'Interim'
),
'attr' => array(
'class' => 'cs-select cs-skin-slide',
'class' => 'form-control',
//'data-init-plugin' => 'cs-select'
)
))
->add('duree_contrat', IntegerType::class, array(
'mapped' => false,
'label' => 'Durée du contrat en mois',
'empty_data' => "0",
'required' => false,
'attr' => array(
'value' => $duree_contrat,
'class' => 'form-control',
'min' => '0',
'max' => '50',
)
))
->add('appellationId', HiddenType::class, array(
'mapped' => true,
'label' => 'Id de l appellation',
'attr' => array(
'class' => 'form-control',
)
))
->add('appellationLibelle', HiddenType::class, array(
'mapped' => true,
'label' => 'Libellé de l appellation',
'attr' => array(
'class' => 'form-control',
)
))
->add('codeRome', HiddenType::class, array(
'mapped' => true,
'label' => 'code ROME',
'attr' => array(
'class' => 'form-control',
)
))
->add('temps_type', ChoiceType::class, array(
'mapped' => false,
'label' => 'Type d\'emploi',
'label' => 'Type d\'emploi ',
'data' => $temps_type,
'choices' => array(
'Temps plein ' => 'FULL_TIME',
@@ -120,13 +171,26 @@ class AdType extends AbstractType
'Temps plein ou temps partiel' => 'MIX_TIME',
),
'attr' => array(
'class' => 'cs-select cs-skin-slide',
'class' => 'form-control',
//'data-init-plugin' => 'cs-select'
)
))
->add('nombre_heure', IntegerType::class, array(
'mapped' => false,
'label' => 'Temps de travail',
'empty_data' => "0",
'required' => false,
'attr' => array(
'value' => $nombre_heure,
'class' => 'form-control',
'min' => '0',
'max' => '35',
)
))
->add('teletravail', ChoiceType::class, array(
'mapped' => false,
'label' => 'Télétravail',
'label' => 'Possibilité de faire du Télétravail?',
'data' => $teletravail,
'choices' => array(
'Occasionnel ' => 'tele_occassionel',
@@ -135,7 +199,8 @@ class AdType extends AbstractType
'Non' => 'tele_non',
),
'attr' => array(
'class' => 'cs-select cs-skin-slide',
'class' => 'form-control',
//'data-init-plugin' => 'cs-select'
)
))
->add('publicTag', TextType::class, array(
@@ -143,7 +208,9 @@ class AdType extends AbstractType
'data' => $publicTags,
'attr' => array(
'value' => $publicTags,
'class' => 'form-control'
'class' => 'tag label label-info',
'data-role'=>"tagsinput"
)
))
->add('status', ChoiceType::class, array(
@@ -153,10 +220,19 @@ class AdType extends AbstractType
'A publier (Validation par Talents Tube)' => 'TO_PUBLISH',
),
'attr' => array(
'class' => 'cs-select cs-skin-slide',
'class' => 'form-control',
)
));
))
->add('competences', HiddenType::class, array(
'label' =>'Compétences :',
'data' => $competences,
'attr' => array(
'class' => 'form-control',
)
))
;
// ->add('privateTag', TextType::class, array(
// 'label' => 'private Tags',
// 'data' => $privateTags
@@ -53,4 +53,17 @@ class AdRepository extends AbstractRepository
return $this->paginate($qb, $limit, $offset);
}
public function verifierParIdMdp($adId, $mdp ) {
$qb = $this
->createQueryBuilder('a')
->select('a')
->where('a.code = "'.$mdp.'"')
->andWhere('a.id = '.$adId);
return $qb
->getQuery()
->getResult();
}
}
@@ -112,4 +112,210 @@ class AnswerRepository extends AbstractRepository
->getQuery()
->getResult();
}
public function getAnswerByAdsShare( $adId)
{
$qb = $this
->createQueryBuilder('a')
->select('a')
->where('a.ad IN (
SELECT p.id
FROM AppBundle:Ad p
WHERE p.id = :id
)')
->setParameter(':id', $adId)
->andWhere('a.status = :status')
->andWhere('a.isShared = true')
->setParameter(':status', 'SENDED')
->orderBy('a.uTime','DESC');
return $qb
->getQuery()
->getResult();
}
// Get the total number of elements
public function comptage()
{
return $this
->createQueryBuilder('object')
->select("count(object.id)")
->getQuery()
->getSingleScalarResult();
}
// Get the total number of elements
// public function count()
// {
// return $this
// ->createQueryBuilder('object')
// ->select("count(object.id)")
// ->getQuery()
// ->getSingleScalarResult();
// }
public function getRequiredDTData($start, $length, $orders, $search, $columns, $otherConditions)
{
// Create Main Query
$query = $this->createQueryBuilder('a');
// Create Count Query
$countQuery = $this->createQueryBuilder('a');
$countQuery->select('COUNT(a)');
// Create inner joins
$query
->select(['a','user'])
->join('a.user', 'user')
->join('a.ad', 'ad')
->leftjoin('a.video', 'video')
->leftjoin('a.company', 'company');
$countQuery
->join('a.user', 'user')
->join('a.ad', 'ad')
->leftjoin('a.video', 'video')
->leftjoin('a.company', 'company');
// $countQuery
// ->join('town.department', 'department')
// ->join('department.region', 'region');
// Other conditions than the ones sent by the Ajax call ?
if ($otherConditions === null)
{
// No
// However, add a "always true" condition to keep an uniform treatment in all cases
$query->where("1=1");
$countQuery->where("1=1");
}
else
{
// Add condition
$query->where($otherConditions);
$countQuery->where($otherConditions);
}
// Fields Search
foreach ($columns as $key => $column)
{
if ($column['search']['value'] != '')
{
// $searchItem is what we are looking for
$searchItem = $column['search']['value'];
$searchQuery = null;
// $column['name'] is the name of the column as sent by the JS
switch($column['name'])
{
case 'nom':
{
// $searchQuery = 'town.name LIKE \'%'.$searchItem.'%\'';
$searchQuery = 'lower(user.lastname) LIKE \'%'.$searchItem.'%\'';
break;
}
case 'status':
{
// $searchQuery = 'town.postalCode LIKE \'%'.$searchItem.'%\'';
$searchQuery = 'lower(a.status) LIKE \'%'.$searchItem.'%\'';
break;
}
case 'prenom':
{
// $searchQuery = 'department.name LIKE \'%'.$searchItem.'%\'';
$searchQuery = 'lower(user.firstname) LIKE \'%'.$searchItem.'%\'';
break;
}
case 'entreprise':
{
// $searchQuery = 'department.name LIKE \'%'.$searchItem.'%\'';
$searchQuery = 'lower(company.brandName) LIKE \'%'.$searchItem.'%\' or lower(ad.title) LIKE \'%'.$searchItem.'%\'';
break;
}
case 'ad_id':
{
// $searchQuery = 'region.name LIKE \'%'.$searchItem.'%\'';
$searchQuery = 'a.id = '.$searchItem;
break;
}
}
if ($searchQuery !== null)
{
$query->andWhere($searchQuery);
$countQuery->andWhere($searchQuery);
}
}
}
// Limit
$query->setFirstResult($start)->setMaxResults($length);
// Order
$orderColumn = 'a.id';
foreach ($orders as $key => $order)
{
// $order['name'] is the name of the order column as sent by the JS
if ($order['name'] != '')
{
$orderColumn = 'a.id';
switch($order['name'])
{
case 'ad_id':
{
// $orderColumn = 'town.name';
$orderColumn = 'a.id';
break;
}
case 'date_envoi':
{
// $orderColumn = 'town.postalCode';
$orderColumn = 'a.sendTime';
break;
}
case 'status':
{
//$orderColumn = 'department.name';
$orderColumn = 'a.status';
break;
}
case 'nom':
{
// $orderColumn = 'region.name';
$orderColumn = 'user.lastname';
break;
}
case 'prenom':
{
// $orderColumn = 'region.name';
$orderColumn = 'user.firstname';
break;
}
case 'entreprise':
{
// $orderColumn = 'region.name';
$orderColumn = 'company.brandName';
break;
}
}
if ($orderColumn !== null)
{
$query->orderBy($orderColumn, $order['dir']);
}
}else{
}
}
// Execute
$results = $query->getQuery()->getResult();
$countResult = $countQuery->getQuery()->getSingleScalarResult();
return array(
"results" => $results,
"countResult" => $countResult
);
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB