refacto fonctions

This commit is contained in:
Tykayn 2025-06-06 23:28:35 +02:00 committed by tykayn
parent 1b0d2d425d
commit 9b09b0d59d
8 changed files with 191 additions and 163 deletions

View file

@ -10,19 +10,14 @@ import './styles/app.css';
import './utils.js';
import './opening_hours.js';
import './josm.js';
import './edit.js';
// Attendre le chargement du DOM
document.addEventListener('DOMContentLoaded', () => {
console.log('DOMContentLoaded');
updateMapHeightForLargeScreens()
const randombg = genererCouleurPastel();
// Appliquer la couleur au body
document.body.style.backgroundColor = randombg;
@ -56,61 +51,6 @@ document.addEventListener('DOMContentLoaded', () => {
openingHoursFormManager.init();
// lister les changesets de l'utilisateur osm-commerces
async function listChangesets() {
// const changesets = await fetch('https://api.openstreetmap.org/api/0.6/changesets?display_name=osm-commerce-fr');
// Ajouter le header Accept pour demander du JSON
const options = {
headers: {
'Accept': 'application/json'
}
};
const changesets = await fetch('https://api.openstreetmap.org/api/0.6/changesets?display_name=osm-commerce-fr', options);
const data = await changesets.json();
console.log(data.changesets.length);
// Grouper les changesets par période
const now = new Date();
const last24h = new Date(now - 24 * 60 * 60 * 1000);
const last7days = new Date(now - 7 * 24 * 60 * 60 * 1000);
const last30days = new Date(now - 30 * 24 * 60 * 60 * 1000);
const stats = {
last24h: 0,
last7days: 0,
last30days: 0
};
data.changesets.forEach(changeset => {
const changesetDate = new Date(changeset.closed_at);
if (changesetDate >= last24h) {
stats.last24h++;
}
if (changesetDate >= last7days) {
stats.last7days++;
}
if (changesetDate >= last30days) {
stats.last30days++;
}
});
// Afficher les statistiques
const historyDiv = document.getElementById('userChangesHistory');
if (historyDiv) {
historyDiv.innerHTML = `
<div id="changesets_history">
<p>Changesets créés :</p>
<div class="row">
<div class="col-6">Dernières 24h :</div> <div class="col-6 text-right">${stats.last24h}</div>
<div class="col-6">7 derniers jours :</div> <div class="col-6 text-right">${stats.last7days}</div>
<div class="col-6">30 derniers jours :</div> <div class="col-6 text-right">${stats.last30days}</div>
</div>
</div>
`;
}
}
// Vérifier si l'élément avec l'ID 'userChangesHistory' existe avant d'appeler la fonction
if (document.getElementById('userChangesHistory')) {
listChangesets();
@ -118,32 +58,6 @@ document.addEventListener('DOMContentLoaded', () => {
console.log('userChangesHistory non trouvé');
}
/**
* mettre à jour la barre de progression
* pour le formulaire de modification
*/
function updateCompletionProgress() {
const inputs = document.querySelectorAll('input[type="text"]');
let filledInputs = 0;
let totalInputs = inputs.length;
inputs.forEach(input => {
if (input.value.trim() !== '') {
filledInputs++;
}
});
const completionPercentage = (filledInputs / totalInputs) * 100;
const progressBar = document.querySelector('#completion_progress .progress-bar');
if (progressBar) {
progressBar.style.width = completionPercentage + '%';
progressBar.setAttribute('aria-valuenow', completionPercentage);
document.querySelector('#completion_display').innerHTML = `Votre commerce est complété à ${Math.round(completionPercentage)}%`;
}
}
document.querySelectorAll('input[type="text"]').forEach(input => {
input.addEventListener('blur', updateCompletionProgress);
});
@ -165,24 +79,6 @@ document.addEventListener('DOMContentLoaded', () => {
function parseCuisine() {
const cuisineInput = document.querySelector('input[name="commerce_tag_value__cuisine"]');
// Récupérer tous les checkboxes de type de cuisine
const cuisineCheckboxes = document.querySelectorAll('input[name="cuisine_type"]');
// Ajouter un écouteur d'événement sur chaque checkbox
cuisineCheckboxes.forEach(checkbox => {
checkbox.addEventListener('change', () => {
// Récupérer toutes les checkboxes cochées
const checkedCuisines = Array.from(document.querySelectorAll('input[name="cuisine_type"]:checked'))
.map(input => input.value);
// Mettre à jour l'input avec les valeurs séparées par des points-virgules
cuisineInput.value = checkedCuisines.join(';');
});
});
}
parseCuisine();

46
assets/edit.js Normal file
View file

@ -0,0 +1,46 @@
/**
* mettre à jour la barre de progression
* pour le formulaire de modification
*/
function updateCompletionProgress() {
const inputs = document.querySelectorAll('input[type="text"]');
let filledInputs = 0;
let totalInputs = inputs.length;
inputs.forEach(input => {
if (input.value.trim() !== '') {
filledInputs++;
}
});
const completionPercentage = (filledInputs / totalInputs) * 100;
const progressBar = document.querySelector('#completion_progress .progress-bar');
if (progressBar) {
progressBar.style.width = completionPercentage + '%';
progressBar.setAttribute('aria-valuenow', completionPercentage);
document.querySelector('#completion_display').innerHTML = `Votre commerce est complété à ${Math.round(completionPercentage)}%`;
}
}
function parseCuisine() {
const cuisineInput = document.querySelector('input[name="commerce_tag_value__cuisine"]');
// Récupérer tous les checkboxes de type de cuisine
const cuisineCheckboxes = document.querySelectorAll('input[name="cuisine_type"]');
// Ajouter un écouteur d'événement sur chaque checkbox
cuisineCheckboxes.forEach(checkbox => {
checkbox.addEventListener('change', () => {
// Récupérer toutes les checkboxes cochées
const checkedCuisines = Array.from(document.querySelectorAll('input[name="cuisine_type"]:checked'))
.map(input => input.value);
// Mettre à jour l'input avec les valeurs séparées par des points-virgules
cuisineInput.value = checkedCuisines.join(';');
});
});
}
window.updateCompletionProgress = updateCompletionProgress;
window.parseCuisine = parseCuisine;

View file

@ -74,3 +74,4 @@ function openInJOSM(map, map_is_loaded, osmElements) {
document.body.removeChild(tempLink);
}
window.openInJOSM = openInJOSM;

View file

@ -1,23 +1,35 @@
/**
* Gestion du formulaire d'horaires d'ouverture
*
*/
const openingHoursFormManager = {
defaultOpeningHours: '',
init: function () {
inputSelector: '',
init: function (inputSelector = 'input[name="custom__opening_hours"]') {
// Rechercher l'élément par son attribut name plutôt que par son id
const openingHoursInput = document.querySelector('input[name="custom__opening_hours"]');
this.setInputSelector(inputSelector);
const openingHoursInput = document.querySelector(inputSelector);
if (!openingHoursInput) {
console.warn('Élément input[name="custom__opening_hours"] non trouvé');
console.warn('Élément ', inputSelector, ' non trouvé');
return;
}
this.defaultOpeningHours = openingHoursInput.value;
this.makeForm();
this.makeForm(inputSelector);
if (this.defaultOpeningHours !== '') {
this.parseOpeningHoursValue();
this.parseOpeningHoursValue(inputSelector);
}
},
parseOpeningHoursValue: function () {
setInputSelector: function (inputSelector) {
this.inputSelector = inputSelector;
},
/**
* convertir les checkboxes et inputs en horaires OSM dans l'input de référence
* @param {string} inputSelector
*/
parseOpeningHoursValue: function (inputSelector = 'input[name="custom__opening_hours"]') {
// Analyser la chaîne d'horaires d'ouverture
const parsedOpeningHours = {};
@ -78,8 +90,8 @@ const openingHoursFormManager = {
console.log(parsedOpeningHours);
},
makeForm: function () {
const customOpeningHours = document.querySelector('input[name="custom__opening_hours"]');
makeForm: function (inputSelector = 'input[name="custom__opening_hours"]') {
const customOpeningHours = document.querySelector(inputSelector);
console.log('makeForm customOpeningHours', customOpeningHours);
if (customOpeningHours) {
@ -146,7 +158,7 @@ const openingHoursFormManager = {
// Ajouter l'événement pour afficher/masquer les plages horaires
input.addEventListener('change', (e) => {
horairesContainer.classList.toggle('d-none', !e.target.checked);
this.convertToOSMOpeningHours();
this.convertToOSMOpeningHours(inputSelector);
});
});
@ -318,7 +330,7 @@ const openingHoursFormManager = {
return container;
},
convertToOSMOpeningHours: function () {
convertToOSMOpeningHours: function (inputSelector = 'input[name="custom__opening_hours"]') {
const jours = {
'Lundi': 'Mo',
'Mardi': 'Tu',
@ -363,7 +375,7 @@ const openingHoursFormManager = {
}
// Mettre à jour l'input custom__opening_hours
const customOpeningHours = document.querySelector('input[name="custom__opening_hours"]');
const customOpeningHours = document.querySelector(inputSelector);
if (customOpeningHours) {
customOpeningHours.value = osmFormat;
}
@ -386,3 +398,4 @@ const openingHoursFormManager = {
return null;
}
}
window.openingHoursFormManager = openingHoursFormManager;

View file

@ -61,16 +61,6 @@ const genererCouleurPastel = () => {
};
function updateMapHeightForLargeScreens() {
const mapFound = document.querySelector('#map');
if (mapFound && window.innerHeight > 800 && window.innerWidth > 800) {
mapFound.style.height = '80vh';
} else {
console.log('window.innerHeight', window.innerHeight);
}
}
async function searchInseeCode(query) {
try {
@ -90,4 +80,86 @@ async function searchInseeCode(query) {
console.error('Erreur lors de la recherche du code INSEE:', error);
return [];
}
}
}
function updateMapHeightForLargeScreens() {
const mapFound = document.querySelector('#map');
if (mapFound && window.innerHeight > 800 && window.innerWidth > 800) {
mapFound.style.height = window.innerWidth * 0.8 + 'px';
} else {
console.log('window.innerHeight', window.innerHeight);
}
}
// lister les changesets de l'utilisateur osm-commerces
async function listChangesets() {
// Ajouter le header Accept pour demander du JSON
const options = {
headers: {
'Accept': 'application/json'
}
};
const changesets = await fetch('https://api.openstreetmap.org/api/0.6/changesets?display_name=osm-commerce-fr', options);
const data = await changesets.json();
console.log(data.changesets.length);
// Grouper les changesets par période
const now = new Date();
const last24h = new Date(now - 24 * 60 * 60 * 1000);
const last7days = new Date(now - 7 * 24 * 60 * 60 * 1000);
const last30days = new Date(now - 30 * 24 * 60 * 60 * 1000);
const stats = {
last24h: 0,
last7days: 0,
last30days: 0
};
data.changesets.forEach(changeset => {
const changesetDate = new Date(changeset.closed_at);
if (changesetDate >= last24h) {
stats.last24h++;
}
if (changesetDate >= last7days) {
stats.last7days++;
}
if (changesetDate >= last30days) {
stats.last30days++;
}
});
// Afficher les statistiques
const historyDiv = document.getElementById('userChangesHistory');
if (historyDiv) {
historyDiv.innerHTML = `
<div id="changesets_history">
<p>Changesets créés :</p>
<div class="row">
<div class="col-6">Dernières 24h :</div> <div class="col-6 text-right">${stats.last24h}</div>
<div class="col-6">7 derniers jours :</div> <div class="col-6 text-right">${stats.last7days}</div>
<div class="col-6">30 derniers jours :</div> <div class="col-6 text-right">${stats.last30days}</div>
</div>
</div>
`;
}
}
function openInPanoramax() {
const center = map.getCenter();
const zoom = map.getZoom();
const panoramaxUrl = `https://api.panoramax.xyz/?focus=map&map=${zoom}/${center.lat}/${center.lng}`;
window.open(panoramaxUrl);
}
window.openInPanoramax = openInPanoramax;
window.listChangesets = listChangesets;
window.updateMapHeightForLargeScreens = updateMapHeightForLargeScreens;
window.searchInseeCode = searchInseeCode;
window.genererCouleurPastel = genererCouleurPastel;
window.check_validity = check_validity;

View file

@ -181,17 +181,11 @@
{{ parent() }}
<script src={{asset('js/mapbox/mapbox-gl.js')}}></script>
<script>
function openInJOSM(type, id) {
{# function openInJOSM(type, id) {
const josmUrl = `http://localhost:8111/load_object?objects=${type}${id}`;
window.open(josmUrl);
}
} #}
function openInPanoramax() {
const center = map.getCenter();
const zoom = map.getZoom();
const panoramaxUrl = `https://api.panoramax.xyz/?focus=map&map=${zoom}/${center.lat}/${center.lng}`;
window.open(panoramaxUrl);
}
{% if commerce is not empty and mapbox_token is not empty and maptiler_token is not empty and commerce_overpass['@attributes'].lon is defined and commerce_overpass['@attributes'].lat is defined %}
mapboxgl.accessToken = '{{ mapbox_token }}';
@ -208,5 +202,11 @@
.addTo(map);
{% endif %}
// Ajouter un écouteur d'événement pour le redimensionnement de la fenêtre
window.addEventListener('resize', () => {
updateMapHeightForLargeScreens();
});
</script>
{% endblock %}

View file

@ -3,10 +3,11 @@
{# {{ dump(commerce_overpass)}} #}
<div class="row mb-3">
<div class="col-md-5">
<div class="col-12 col-md-2">
<label for="commerce_tag_value__addr:housenumber">{{'display.keys.contact:housenumber'|trans}}</label>
<input type="text" class="form-control" name="commerce_tag_value__contact:housenumber" value="{% if commerce_overpass.tags_converted['contact:housenumber'] is defined %}{{ commerce_overpass.tags_converted['contact:housenumber'] }}{% endif %}">
<input type="text" class="form-control text-end" name="commerce_tag_value__contact:housenumber" value="{% if commerce_overpass.tags_converted['contact:housenumber'] is defined %}{{ commerce_overpass.tags_converted['contact:housenumber'] }}{% endif %}">
</div>
<div class="col-12 col-md-10">
<label for="commerce_tag_value__contact:street">{{'display.keys.contact:street'|trans}}</label>
<input type="text" class="form-control" name="commerce_tag_value__contact:street" value="{% if commerce_overpass.tags_converted['contact:street'] is defined %}{{ commerce_overpass.tags_converted['contact:street'] }}{% endif %}">
</div>

View file

@ -1,25 +1,24 @@
<div id="opening_hours">
<h2>
<i class="bi bi-clock"></i>
{{ 'display.opening_hours'|trans }}</h2>
<p class="description">{{ 'display.opening_hours_description'|trans }}</p>
<h2>
<i class="bi bi-clock"></i>
{{ 'display.opening_hours'|trans }}</h2>
<p class="description">{{ 'display.opening_hours_description'|trans }}</p>
{% if commerce_overpass.tags_converted.opening_hours is defined and commerce_overpass.tags_converted.opening_hours != '' %}
<input type="text" placeholder="Remplissez" class="form-control" name="custom__opening_hours" value="{{ commerce_overpass.tags_converted.opening_hours }}">
{% else %}
<input type="text" placeholder="Lundi de 10h à 12h et de 14h à 18h" class="form-control" name="custom__opening_hours" value="">
<br>
{% endif %}
{# <div class="examples d-none">
Exemples :
<ul>
<li>Écrivez "24/7" pour indiquer que le commerce est ouvert 24 heures sur 24</li>
<li>Écrivez "Mo-Fr 9:00 - 18:00" pour indiquer que le commerce est ouvert du lundi au vendredi de 9h à 18h</li>
<li>Pour des horaires plus complexes, écrivez "Mo-Fr 9:00 - 18:00; Sa 9:00 - 12:00" pour indiquer que le commerce est ouvert du lundi au vendredi de 9h à 18h et le samedi de 9h à 12h</li>
</ul>
</div> #}
<hr>
<script src="{{ asset('js/main.js') }}"></script>
</script>
</div>
{% if commerce_overpass.tags_converted.opening_hours is defined and commerce_overpass.tags_converted.opening_hours != '' %}
<input type="text"
placeholder="Remplissez"
class="form-control"
name="custom__opening_hours"
id="custom__opening_hours"
value="{{ commerce_overpass.tags_converted.opening_hours }}">
{% else %}
<input type="text"
placeholder="Mo-Fr 10:00-12:00 "
class="form-control"
name="custom__opening_hours"
id="custom__opening_hours"
value="">
<br>
{% endif %}
<hr>
</div>