Formulaire choix de lieu plus clair

This commit is contained in:
Evarin 2018-12-30 20:33:44 +01:00
parent da3ce8f464
commit 5275e9036a
8 changed files with 361 additions and 119 deletions

View file

@ -8,6 +8,7 @@ from django.contrib.gis import geos
from django.urls import reverse
from .models import Lieu, Stage, Normalien, StageMatiere
from .utils import approximate_distance
class EnScolariteAuthentication(SessionAuthentication):
def is_authenticated(self, request, **kwargs):
@ -60,9 +61,10 @@ class LieuResource(ModelResource):
bundle.data['coord'] = {'lat': float(obj.coord.y),
'lng': float(obj.coord.x)}
# Distance au point recherché (inutile en fait)
#if "lat" in bundle.request.GET and "lng" in bundle.request.GET:
# bundle.data['distance'] = self.reference_point.distance(bundle.obj.coord)
# Distance au point recherché
if "lat" in bundle.request.GET and "lng" in bundle.request.GET:
bundle.data['distance'] = approximate_distance(
self.reference_point, bundle.obj.coord)
# Autres infos utiles
bundle.data["pays_nom"] = obj.get_pays_display()

View file

@ -270,8 +270,10 @@ p.warning {
}
}
}
}
}
a.hoverlink {
a.hoverlink {
position: absolute;
display: block;
top: 0;
@ -279,8 +281,6 @@ p.warning {
width: 100%;
height: 100%;
z-index: 2;
}
}
}
ul.infos {
@ -516,15 +516,20 @@ form {
// taggit autosuggest
ul.as-selections {
ul.as-selections,
.selectize-control.multi {
display: flex;
flex-wrap: wrap;
li {
display:inline-block;
}
.as-selection-item {
.selectize-input, .selectize-dropdown {
font-size: 100%;
line-height: 1.1;
}
.as-selection-item,
.selectize-input > div {
padding: 0 5px;
background: $compl;
color: #fff;
@ -648,8 +653,16 @@ div.as-results {
// Widget choix et ajout de lieux
#lieu_widget {
.window-content {
max-width: 800px;
}
.lieu-ui {
position: relative;
width: 100%;
min-width: 150px;
flex: 2;
.map {
height: 400px;
width: 100%;
@ -662,10 +675,67 @@ div.as-results {
}
}
.lieu-choixmodif {
.lieu-choixmodif, .lieu-options {
display: none;
}
.lieu-global {
display: flex;
width: 100%;
flex-wrap: wrap;
&.with-options {
.lieu-options {
display: block;
}
}
}
&.modif, &.edit {
.lieu-global.with-options .lieu-options {
display: none;
}
}
.lieu-options {
padding: 7px;
max-width: 350px;
flex: 3;
.lieu-suggestions {
max-height: 300px;
overflow-y: auto;
li {
position: relative;
background: #fff;
margin: 2px;
padding: 4px;
font-size: 0.9em;
&:hover {
background: #ccc;
}
p {
margin: 2px 0;
}
.lieu-nom {
font-weight: bold;
}
.lieu-infos {
font-size: 0.8em;
display:flex;
width: 100%;
justify-content: space-between;
span {
display: inline-block;
text-overflow: ellipsis;
overlow: hidden;
}
}
}
}
}
&.modif {
.lieu-choixmodif {
display: unset;

View file

@ -399,8 +399,9 @@ p.warning {
.stage-liste li .misc-hdr .dates svg text {
font-size: 0.8;
}
/* line 274, ../../sass/screen.scss */
.stage-liste li a.hoverlink {
/* line 276, ../../sass/screen.scss */
a.hoverlink {
position: absolute;
display: block;
top: 0;
@ -929,16 +930,28 @@ form .field .input {
}
/* line 519, ../../sass/screen.scss */
ul.as-selections {
ul.as-selections,
.selectize-control.multi {
display: flex;
flex-wrap: wrap;
}
/* line 523, ../../sass/screen.scss */
ul.as-selections li {
/* line 524, ../../sass/screen.scss */
ul.as-selections li,
.selectize-control.multi li {
display: inline-block;
}
/* line 527, ../../sass/screen.scss */
ul.as-selections .as-selection-item {
ul.as-selections .selectize-input, ul.as-selections .selectize-dropdown,
.selectize-control.multi .selectize-input,
.selectize-control.multi .selectize-dropdown {
font-size: 100%;
line-height: 1.1;
}
/* line 531, ../../sass/screen.scss */
ul.as-selections .as-selection-item,
ul.as-selections .selectize-input > div,
.selectize-control.multi .as-selection-item,
.selectize-control.multi .selectize-input > div {
padding: 0 5px;
background: #f99b20;
color: #fff;
@ -946,53 +959,61 @@ ul.as-selections .as-selection-item {
border-radius: 2px;
font-weight: 500;
}
/* line 535, ../../sass/screen.scss */
ul.as-selections .as-selection-item a.as-close {
/* line 540, ../../sass/screen.scss */
ul.as-selections .as-selection-item a.as-close,
ul.as-selections .selectize-input > div a.as-close,
.selectize-control.multi .as-selection-item a.as-close,
.selectize-control.multi .selectize-input > div a.as-close {
color: #fff;
-webkit-cursor: pointer;
cursor: pointer;
margin-right: 5px;
}
/* line 542, ../../sass/screen.scss */
ul.as-selections .as-selection-item.selected {
/* line 547, ../../sass/screen.scss */
ul.as-selections .as-selection-item.selected,
ul.as-selections .selectize-input > div.selected,
.selectize-control.multi .as-selection-item.selected,
.selectize-control.multi .selectize-input > div.selected {
background: #8fcc33;
}
/* line 547, ../../sass/screen.scss */
ul.as-selections .as-original {
/* line 552, ../../sass/screen.scss */
ul.as-selections .as-original,
.selectize-control.multi .as-original {
flex-grow: 1;
min-width: 200px;
}
/* line 551, ../../sass/screen.scss */
ul.as-selections .as-original input {
/* line 556, ../../sass/screen.scss */
ul.as-selections .as-original input,
.selectize-control.multi .as-original input {
width: 100%;
}
/* line 557, ../../sass/screen.scss */
/* line 562, ../../sass/screen.scss */
div.as-results {
position: relative;
z-index: 2;
}
/* line 561, ../../sass/screen.scss */
/* line 566, ../../sass/screen.scss */
div.as-results ul {
position: absolute;
width: 100%;
background: #fff;
border: 1px solid #d2ebad;
}
/* line 568, ../../sass/screen.scss */
/* line 573, ../../sass/screen.scss */
div.as-results ul li {
padding: 3px 5px;
}
/* line 574, ../../sass/screen.scss */
/* line 579, ../../sass/screen.scss */
div.as-results ul li.as-result-item.active {
background: #fddeb5;
}
/* line 579, ../../sass/screen.scss */
/* line 584, ../../sass/screen.scss */
div.as-results ul li.as-message {
font-style: italic;
}
/* line 589, ../../sass/screen.scss */
/* line 594, ../../sass/screen.scss */
.window {
display: none;
position: fixed;
@ -1003,11 +1024,11 @@ div.as-results ul li.as-message {
left: 0;
z-index: 50;
}
/* line 599, ../../sass/screen.scss */
/* line 604, ../../sass/screen.scss */
.window.visible {
display: block;
}
/* line 603, ../../sass/screen.scss */
/* line 608, ../../sass/screen.scss */
.window .window-bg {
background: #000;
opacity: 0.7;
@ -1018,7 +1039,7 @@ div.as-results ul li.as-message {
top: 0;
z-index: -1;
}
/* line 614, ../../sass/screen.scss */
/* line 619, ../../sass/screen.scss */
.window .window-content {
position: relative;
margin: 0 auto;
@ -1032,11 +1053,11 @@ div.as-results ul li.as-message {
max-height: 100%;
overflow: auto;
}
/* line 628, ../../sass/screen.scss */
/* line 633, ../../sass/screen.scss */
.window .window-content form label, .window .window-content form .label {
width: 150px;
}
/* line 634, ../../sass/screen.scss */
/* line 639, ../../sass/screen.scss */
.window .window-closer {
position: absolute;
top: 0;
@ -1044,65 +1065,130 @@ div.as-results ul li.as-message {
padding: 12px;
z-index: 3;
}
/* line 640, ../../sass/screen.scss */
/* line 645, ../../sass/screen.scss */
.window .window-closer:after {
content: "×";
}
/* line 651, ../../sass/screen.scss */
/* line 656, ../../sass/screen.scss */
#lieu_widget .window-content {
max-width: 800px;
}
/* line 660, ../../sass/screen.scss */
#lieu_widget .lieu-ui {
position: relative;
width: 100%;
min-width: 150px;
flex: 2;
}
/* line 653, ../../sass/screen.scss */
/* line 666, ../../sass/screen.scss */
#lieu_widget .lieu-ui .map {
height: 400px;
width: 100%;
}
/* line 657, ../../sass/screen.scss */
/* line 670, ../../sass/screen.scss */
#lieu_widget .lieu-ui.hidden {
display: none;
}
/* line 660, ../../sass/screen.scss */
/* line 673, ../../sass/screen.scss */
#lieu_widget .lieu-ui .masked {
visibility: hidden;
}
/* line 665, ../../sass/screen.scss */
#lieu_widget .lieu-choixmodif {
display: none;
}
/* line 670, ../../sass/screen.scss */
#lieu_widget.modif .lieu-choixmodif {
display: unset;
}
/* line 675, ../../sass/screen.scss */
#lieu_widget.modif .lieu-ui, #lieu_widget.attente .lieu-ui {
/* line 678, ../../sass/screen.scss */
#lieu_widget .lieu-choixmodif, #lieu_widget .lieu-options {
display: none;
}
/* line 682, ../../sass/screen.scss */
#lieu_widget .lieu-global {
display: flex;
width: 100%;
flex-wrap: wrap;
}
/* line 687, ../../sass/screen.scss */
#lieu_widget .lieu-global.with-options .lieu-options {
display: block;
}
/* line 694, ../../sass/screen.scss */
#lieu_widget.modif .lieu-global.with-options .lieu-options, #lieu_widget.edit .lieu-global.with-options .lieu-options {
display: none;
}
/* line 699, ../../sass/screen.scss */
#lieu_widget .lieu-options {
padding: 7px;
max-width: 350px;
flex: 3;
}
/* line 704, ../../sass/screen.scss */
#lieu_widget .lieu-options .lieu-suggestions {
max-height: 300px;
overflow-y: auto;
}
/* line 708, ../../sass/screen.scss */
#lieu_widget .lieu-options .lieu-suggestions li {
position: relative;
background: #fff;
margin: 2px;
padding: 4px;
font-size: 0.9em;
}
/* line 714, ../../sass/screen.scss */
#lieu_widget .lieu-options .lieu-suggestions li:hover {
background: #ccc;
}
/* line 717, ../../sass/screen.scss */
#lieu_widget .lieu-options .lieu-suggestions li p {
margin: 2px 0;
}
/* line 720, ../../sass/screen.scss */
#lieu_widget .lieu-options .lieu-suggestions li .lieu-nom {
font-weight: bold;
}
/* line 723, ../../sass/screen.scss */
#lieu_widget .lieu-options .lieu-suggestions li .lieu-infos {
font-size: 0.8em;
display: flex;
width: 100%;
justify-content: space-between;
}
/* line 729, ../../sass/screen.scss */
#lieu_widget .lieu-options .lieu-suggestions li .lieu-infos span {
display: inline-block;
text-overflow: ellipsis;
overlow: hidden;
}
/* line 740, ../../sass/screen.scss */
#lieu_widget.modif .lieu-choixmodif {
display: unset;
}
/* line 745, ../../sass/screen.scss */
#lieu_widget.modif .lieu-ui, #lieu_widget.attente .lieu-ui {
display: none;
}
/* line 752, ../../sass/screen.scss */
#lieu_widget.edit .lieu-ui .lieu-acinput {
display: none;
}
/* line 685, ../../sass/screen.scss */
/* line 755, ../../sass/screen.scss */
#lieu_widget.edit .lieu-ui .map {
height: 200px;
}
/* line 691, ../../sass/screen.scss */
/* line 761, ../../sass/screen.scss */
#lieu_widget #avis_lieu_vide {
display: none;
}
/* line 695, ../../sass/screen.scss */
/* line 765, ../../sass/screen.scss */
#lieu_widget .message {
background: #fddeb5;
padding: 5px;
font-style: italic;
font-size: 0.9em;
}
/* line 701, ../../sass/screen.scss */
/* line 771, ../../sass/screen.scss */
#lieu_widget .message.hidden {
display: none;
}
/* line 707, ../../sass/screen.scss */
/* line 777, ../../sass/screen.scss */
a.lieu-change {
color: #fff;
background: #f99b20;
@ -1115,25 +1201,25 @@ a.lieu-change {
border-radius: 5px;
margin-right: 7px;
}
/* line 719, ../../sass/screen.scss */
/* line 789, ../../sass/screen.scss */
a.lieu-change.ajout:before {
content: "+";
margin-right: 5px;
}
/* line 725, ../../sass/screen.scss */
/* line 795, ../../sass/screen.scss */
#stages-map {
width: 100%;
height: 600px;
max-height: 90vh;
}
/* line 732, ../../sass/screen.scss */
/* line 802, ../../sass/screen.scss */
#id_stage-thematiques {
display: none;
}
/* line 738, ../../sass/screen.scss */
/* line 808, ../../sass/screen.scss */
.homeh1 {
display: flex;
justify-content: space-between;
@ -1143,26 +1229,26 @@ a.lieu-change.ajout:before {
border-bottom: 3px solid #000;
margin-bottom: 15px;
}
/* line 747, ../../sass/screen.scss */
/* line 817, ../../sass/screen.scss */
.homeh1 h1 {
margin-bottom: 3px;
}
/* line 751, ../../sass/screen.scss */
/* line 821, ../../sass/screen.scss */
.homeh1 > * {
display: inline-block;
}
/* line 754, ../../sass/screen.scss */
/* line 824, ../../sass/screen.scss */
.homeh1 p {
text-align: right;
}
/* line 759, ../../sass/screen.scss */
/* line 829, ../../sass/screen.scss */
.betacadre {
background: #fa6cae;
padding: 10px;
}
/* line 764, ../../sass/screen.scss */
/* line 834, ../../sass/screen.scss */
.entrer {
background: #fff;
max-width: 500px;
@ -1170,7 +1256,7 @@ a.lieu-change.ajout:before {
text-align: center;
margin: 15px auto;
}
/* line 771, ../../sass/screen.scss */
/* line 841, ../../sass/screen.scss */
.entrer .archicubes {
border-top: 2px solid #1a82dd;
margin-top: 5px;
@ -1178,84 +1264,84 @@ a.lieu-change.ajout:before {
font-size: 0.9em;
}
/* line 779, ../../sass/screen.scss */
/* line 849, ../../sass/screen.scss */
article.promo {
display: block;
font-size: 1.1em;
}
/* line 783, ../../sass/screen.scss */
/* line 853, ../../sass/screen.scss */
article.promo .explications {
display: table;
}
/* line 786, ../../sass/screen.scss */
/* line 856, ../../sass/screen.scss */
article.promo .explications:first-child {
direction: rtl;
}
/* line 788, ../../sass/screen.scss */
/* line 858, ../../sass/screen.scss */
article.promo .explications:first-child > * {
direction: ltr;
}
/* line 793, ../../sass/screen.scss */
/* line 863, ../../sass/screen.scss */
article.promo .explications > div {
display: table-cell;
vertical-align: middle;
text-align: center;
}
/* line 798, ../../sass/screen.scss */
/* line 868, ../../sass/screen.scss */
article.promo .explications > div p {
margin: 15px 15px;
}
/* line 806, ../../sass/screen.scss */
/* line 876, ../../sass/screen.scss */
.faq-toc {
font-family: "Lato", sans-serif;
display: block;
max-width: 700px;
margin: 0 auto;
}
/* line 811, ../../sass/screen.scss */
/* line 881, ../../sass/screen.scss */
.faq-toc ul {
margin: 20px;
}
/* line 815, ../../sass/screen.scss */
/* line 885, ../../sass/screen.scss */
.faq-toc ul li a {
color: #000;
display: block;
padding: 5px;
}
/* line 821, ../../sass/screen.scss */
/* line 891, ../../sass/screen.scss */
.faq-toc ul li.toc-h1 {
display: none;
}
/* line 825, ../../sass/screen.scss */
/* line 895, ../../sass/screen.scss */
.faq-toc ul li.toc-h2 a {
background: #fcc883;
}
/* line 829, ../../sass/screen.scss */
/* line 899, ../../sass/screen.scss */
.faq-toc ul li.toc-h3 a {
padding-left: 10px;
background: #fff;
font-weight: normal;
}
/* line 835, ../../sass/screen.scss */
/* line 905, ../../sass/screen.scss */
.faq-toc ul li a:hover {
color: #395214;
background: #bce085 !important;
}
/* line 844, ../../sass/screen.scss */
/* line 914, ../../sass/screen.scss */
.faq article {
background: #fff;
padding: 15px;
}
/* line 847, ../../sass/screen.scss */
/* line 917, ../../sass/screen.scss */
.faq article h2 {
background-color: #fcc883;
color: #ae6505;
margin: -15px;
padding: 15px;
}
/* line 854, ../../sass/screen.scss */
/* line 924, ../../sass/screen.scss */
.faq article h3 {
color: #0f4c82;
background-color: #9dcbf3;
@ -1263,19 +1349,19 @@ article.promo .explications > div p {
margin-top: 30px;
padding: 10px 15px;
}
/* line 861, ../../sass/screen.scss */
/* line 931, ../../sass/screen.scss */
.faq article h3:nth-child(2) {
margin-top: 0;
}
/* line 866, ../../sass/screen.scss */
/* line 936, ../../sass/screen.scss */
.faq article ul {
padding-left: 20px;
}
/* line 868, ../../sass/screen.scss */
/* line 938, ../../sass/screen.scss */
.faq article ul li {
list-style: initial;
}
/* line 873, ../../sass/screen.scss */
/* line 943, ../../sass/screen.scss */
.faq article p, .faq article ul {
font-family: "Lato", sans-serif;
font-size: 18px;
@ -1284,20 +1370,20 @@ article.promo .explications > div p {
margin-right: 5%;
}
/* line 887, ../../sass/screen.scss */
/* line 957, ../../sass/screen.scss */
table.stats {
width: 100%;
background: #fff;
margin: 20px 0;
cellspacing: 1px;
}
/* line 892, ../../sass/screen.scss */
/* line 962, ../../sass/screen.scss */
table.stats th {
font-weight: bold;
border-top: 1px solid #000;
border-bottom: 1px solid #999;
}
/* line 897, ../../sass/screen.scss */
/* line 967, ../../sass/screen.scss */
table.stats td, table.stats th {
padding: 5px 3px;
text-align: center;

View file

@ -15,6 +15,10 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
var message_el = $el.find(".lieu-message");
var closer = $el.find(".window-closer");
var cmodif_el = $el.find(".lieu-choixmodif");
var lieuglobal_el = $el.find(".lieu-global");
var lieuoptions_el = $el.find(".lieu-options");
var suggestions_el = $el.find(".lieu-suggestions");
var newlieubtn_el = $el.find(".new-lieu-btn");
var marqueurs = L.markerClusterGroup();
// Variables globales
@ -59,7 +63,12 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
// Affiche la carte
map = L.map(map_el[0]).setView([48.8422411,2.3430553], 15);
var layer = new L.TileLayer("https://korona.geog.uni-heidelberg.de/tiles/roads/x={x}&y={y}&z={z}", {attribution: 'Map tiles by <a href="http://korona.geog.uni-heidelberg.de/">GIScience Heidelberg</a>'});
var layer = new L.TileLayer(
"https://korona.geog.uni-heidelberg.de/"
+ "tiles/roads/x={x}&y={y}&z={z}",
{attribution: 'Map tiles by ' +
'<a href="http://korona.geog.uni-heidelberg.de/">' +
'GIScience Heidelberg</a>'});
map.addLayer(layer);
map.addLayer(marqueurs);
@ -149,8 +158,10 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
lieux_db.suggestion = data;
map.panTo(data.coord);
panMapTo(data.coord);
lieuSurCarte(data, redIcon);
newlieubtn_el.prop("_lieustage_data", data)
.on("click", choixLieuStage);
// Affichage des suggestions
askForSuggestions(place.geometry.location);
@ -166,17 +177,52 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
// Callback suggestions
function showPropositions(data) {
showMessage("Cliquez sur un des lieux déjà existants (en bleu) pour le choisir, ou sur votre recherche (en rouge) pour créer un nouveau lieu");
showMessage("Cliquez sur un des lieux déjà existants (en bleu) " +
"pour le choisir, ou sur votre recherche (en rouge) " +
"pour créer un nouveau lieu");
suggestions_el.html("");
lieuglobal_el.addClass("with-options");
map.invalidateSize();
data.objects.sort(function(a,b){ return a.distance-b.distance; });
function showdistance (dist) {
if(dist<1000) return Math.round(dist) + "m";
else return (Math.round(dist/100)/10) + "km";
}
// Affichage sur la carte
$.each(data.objects, function(i, item) {
var plieu = lieux_db[item.id];
if(plieu !== undefined)
if(plieu !== undefined) {
plieu.distance = item.distance;
item = plieu;
else
} else
lieux_db[item.id] = item;
var option_el = $("<li>", {class: "lieu-option"})
.append($("<p>", {class: "lieu-nom"}).text(item.nom))
.append($("<p>", {class: "lieu-infos"})
.append($("<span>", {class: "numstages"})
.text((item.num_stages || 0) + " stage"
+ (item.num_stages>1 ? "s" : "") + " ici"))
.append($("<span>", {class: "ville"})
.text(item.ville+", "+item.pays_nom))
.append($("<span>", {class: "distance"})
.text("à "+showdistance(item.distance))))
.append($("<a>", {class: "hoverlink",
href: "javascript:void(0)"}))
.prop("_lieustage_data", item)
.on("click", choixLieuStage);
suggestions_el.append(option_el);
lieuSurCarte(item, blueIcon);
});
if (data.objects.length == 0) {
var option_el = $("<li>", {class: "lieu-option"})
.append($("<p>", {class: "lieu-infos"})
.text("Aucun lieu déjà connu à proximité"));
suggestions_el.append(option_el);
}
panMapTo(lieux_db.suggestion.coord);
}
// Affiche un lieu sur la carte
@ -201,10 +247,14 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
data.marqueur = marqueur;
// Création de la description
var desc = $("<div>").append($("<h3>").text(data.nom))
.append($("<p>").text(data.ville+", "+data.pays_nom));
var desc = $("<div>").append($("<h4>").text(data.nom))
.append($("<p>")
.text(data.ville+", "+data.pays_nom));
if (data.num_stages !== undefined)
desc.append($("<p>").text(data.num_stages + (data.num_stages > 1 ? " stages" : " stage") + " à cet endroit"));
desc.append($("<p>")
.text(data.num_stages
+ (data.num_stages > 1 ? " stages" : " stage")
+ " à cet endroit"));
var activeBtn = $("<a>", {href:"javascript:void(0);"})
.prop("_lieustage_data", data)
@ -229,7 +279,7 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
function resetOrigLieu() {
var data = this._lieustage_data;
data.marqueur.setLatLng(data.orig_coord);
map.panTo(data.orig_coord);
panMapTo(data.orig_coord);
}
//
@ -248,12 +298,15 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
if (modification == true) {
setUIMode("ajout");
form_el.find("#id_id").val(choix.id);
form_el.find("h3").text("Modifier un lieu");
form_el.find(".form-title").text("Modifier un lieu");
} else {
setUIMode("edit");
form_el.find("#id_id").val('');
form_el.find("h3").text("Créer un lieu");
form_el.find(".form-title").text("Créer un lieu");
}
map.invalidateSize();
panMapTo(choix.coord);
}
// Envoi du formulaire
@ -306,7 +359,7 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
var lieu = lieux_db[modiflieu_id];
lieu.fromSuggestion = true;
map.panTo(lieu.coord);
panMapTo(lieu.coord);
lieuSurCarte(lieu, greenIcon);
showForm(lieu, true);
@ -318,9 +371,13 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
var lieu = lieux_db[modiflieu_id];
lieu.fromSuggestion = false;
map.panTo(lieu.coord);
lieuSurCarte(lieu, greenIcon);
map.invalidateSize();
panMapTo(lieu.coord);
lieuSurCarte(lieu, greenIcon);
newlieubtn_el.prop("_lieustage_data", lieu)
.on("click", choixLieuStage);
lieux_db.suggestion = lieu;
askForSuggestions(lieu.coord);
}
@ -332,6 +389,7 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
initUI();
input.val('');
lieuglobal_el.removeClass("with-options");
// Nettoyage
hideMessage();
@ -344,14 +402,14 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
if (lieu_id === undefined) {
// Choix d'un nouveau lieu : pas grand-chose à faire
ui_mode_creation = true;
$el.find("h3").text("Ajouter un lieu");
$el.find(".window-title").text("Ajouter un lieu");
map_el.addClass("masked");
} else {
// Lieu déjà existant
lieu_id = lieu_id * 1;
ui_mode_creation = false;
modiflieu_id = lieu_id;
$el.find("h3").text("Modifier le lieu");
$el.find(".window-title").text("Modifier le lieu");
// Chargement des infos
if(lieux_db[lieu_id] === undefined) {
@ -364,6 +422,10 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
}
}
function panMapTo(coord) {
map.panTo(coord);
}
// Fermeture du widget
function closeWidget () {
$el.removeClass("visible");
@ -373,7 +435,7 @@ function SelectLieuWidget(STATIC_ROOT, API_LIEU, target, callback) {
// Le lieu est choisi, on appelle le callback
function choixLieuStage() {
var choix = this._lieustage_data;
if(!choix.fromSuggestion)
if(!choix.fromSuggestion && this !== newlieubtn_el[0])
callback(choix);
else
showForm(choix);

View file

@ -5,8 +5,6 @@
<meta charset="utf-8" />
<title>{% block title %}ExperiENS{% endblock %}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0; maximum-scale=1.0; minimum-scale=1.0;">
<link type="text/css" rel="stylesheet" href="{% static 'css/jquery-ui.min.css' %}" />
<link type="text/css" rel="stylesheet" href="{% static 'css/screen.css' %}" />
<script type="text/javascript" src="{% static "js/jquery-3.2.0.min.js" %}"></script>
<script type="text/javascript" src="{% static "js/jquery-ui.min.js" %}"></script>
{% if request.user.is_authenticated %}
@ -16,6 +14,9 @@
{% endif %}
{% block extra_head %}{% endblock %}
<link type="text/css" rel="stylesheet" href="{% static 'css/jquery-ui.min.css' %}" />
<link type="text/css" rel="stylesheet" href="{% static 'css/screen.css' %}" />
</head>
<body class="{% block bodyclass %}{% endblock %}">

View file

@ -17,7 +17,7 @@
<script type="text/javascript" src="{% static "js/selectize.min.js" %}"></script>
<link rel="stylesheet" type="text/css" href="{% static "css/selectize.css" %}" />
<link href="{% static "jquery-autosuggest/css/autoSuggest-upshot.css" %}" type="text/css" media="all" rel="stylesheet" />
<script type="text/javascript" src="{% static "js/editstage.js" %}"></script>
<script type="text/javascript" src="{% static "js/editstage.js" %}?v2"></script>
<script type="text/javascript">
$(function(){
initEditStage(

View file

@ -4,16 +4,27 @@
<div class="window-bg"></div>
<div class="window-content">
<a class="window-closer" href="javascript:void(0);"></a>
<h2>Choisir un lieu</h2>
<h2 class="window-title">Choisir un lieu</h2>
<p>Restez général dans le lieu : choisissez l'université plutôt que le laboratoire, l'incubateur plutôt que la startup...</p>
<div class="message"></div>
{# UI avec carte et autocomplete #}
<div class="lieu-global">
<div class="lieu-ui">
</div>
<div class="lieu-options">
<h3>Choisir un lieu existant</h3>
<ul class="lieu-suggestions">
</ul>
<h3>Aucune suggestion correcte ?</h3>
<a href="javascript:void(0)" class="btn new-lieu-btn">
Créer un nouveau lieu ici</a>
</div>
</div>
{# En cas de modification #}
<div class="lieu-choixmodif">
<h4>Que voulez-vous faire pour le lieu : <span class="lieu-choixrappel"></span>&nbsp;?</h4>
@ -26,7 +37,7 @@
{# Formulaire de création/modification #}
<div class="lieu-form">{% load staticfiles %}
<form action="{% url 'avisstage:lieu_ajout' %}" method="post" id="lieu_ajout">
<h2>Ajouter un lieu</h2>
<h2 class="form-title">Ajouter un lieu</h2>
<p class="help_text">Vous pouvez déplacer le curseur pour indiquer précisément la bonne position</p>
{% csrf_token %}
{% for field in form.hidden_fields %}

View file

@ -2,9 +2,19 @@
from allauth.socialaccount.models import SocialAccount
from functools import reduce
from math import cos, radians, sqrt
def choices_length (choices):
return reduce (lambda m, choice: max (m, len (choice[0])), choices, 0)
def en_scolarite(user):
return user.profil.en_scolarite
def approximate_distance(a, b):
lat_a = radians(a.y)
lat_b = radians(b.y)
dlon = radians(b.x - a.x)
dlon = dlon * cos((lat_a + lat_b)/2)
dlat = (lat_a - lat_b)
distance = 6371000 * sqrt(dlon*dlon + dlat*dlat)
return distance