diff --git a/public/fonts/font_maps.ttf b/public/fonts/font_maps.ttf new file mode 100644 index 00000000..5c26ed5a Binary files /dev/null and b/public/fonts/font_maps.ttf differ diff --git a/public/fonts/font_maps.woff b/public/fonts/font_maps.woff new file mode 100644 index 00000000..a886dcf1 Binary files /dev/null and b/public/fonts/font_maps.woff differ diff --git a/public/fonts/gogocarto.woff b/public/fonts/gogocarto.woff new file mode 100644 index 00000000..c31a3b6e Binary files /dev/null and b/public/fonts/gogocarto.woff differ diff --git a/src/common/shared_vuejs.ts b/src/common/shared_vuejs.ts index 6f7989dc..49a1f887 100755 --- a/src/common/shared_vuejs.ts +++ b/src/common/shared_vuejs.ts @@ -328,6 +328,8 @@ export const shared_consts = { TABLES_WITH_ADMINS: ['mygroups', 'circuits'], TABLES_DIRECTORY_SINGLE_IMG: ['circuits'], + TABLES_VISU_MAP: 'attivitas', + VISIB_ALL: 0, VISIB_ONLYIF_VERIFIED: 1, VISIB_ONLY_MANAGER: 2, diff --git a/src/components/CGridTableRec/CGridTableRec.vue b/src/components/CGridTableRec/CGridTableRec.vue index 7acce5e8..3642b177 100755 --- a/src/components/CGridTableRec/CGridTableRec.vue +++ b/src/components/CGridTableRec/CGridTableRec.vue @@ -2,10 +2,11 @@
{{ mytitle }}
-
+
- -
+
+
`; + + const markerIcon = L.divIcon({ + className: 'custom-marker', // Classe CSS personalizzata + html: markerHtml, + iconSize: [40, 40], + iconAnchor: [22, 35], + popupAnchor: [-6, -36], + shadowUrl: 'images/marker-shadow.png', + shadowSize: [60, 30], + shadowAnchor: [22, 35] + }); + + // @ts-ignore let each_marker = new L.marker( - [rec.coordinate_gps.coordinates[1], rec.coordinate_gps.coordinates[0]], { icon: myIcon }) - .bindPopup(`${rec.descr}`) - .on('click', () => markerClick(rec._id)); // Collega il click al bottone + [rec.coordinate_gps.coordinates[1], rec.coordinate_gps.coordinates[0]], + { + icon: markerIcon + + }, + ) + .bindPopup(() => { + let container = L.DomUtil.create('div'); + container.innerHTML = ` + ${rec.descr} + `; + + let fakeLink: any = container.querySelector('.fake-link'); + L.DomEvent.on(fakeLink, 'click', (e) => { + L.DomEvent.stopPropagation(e); + ApriScheda(rec._id); + each_marker.closePopup(); + }); + + return container; + }, { closeButton: false }) // Rimuove il pulsante di chiusura dal popup + + .on('click', () => { + if (!$q.screen.lt.sm) { + markerClick(rec._id) + } + }) + .on('mouseover', () => { + if (!$q.screen.lt.sm) { + each_marker.openPopup() + } + }) + .on('mouseout', () => { + if (!$q.screen.lt.sm) { + each_marker.closePopup() + } + }); markers.value.addLayer(each_marker); } } // Aggiungi il gruppo di marker cluster alla mappa - initialMap.value.addLayer(markers.value); + map.value.addLayer(markers.value); } } function markerClick(id: any) { emit('clickMarker', id) + // emit('clickMarker', id) + } + function ApriScheda(id: any) { + emit('clickMarker', id) + } + + const getCurrentPosition = () => { + if (navigator.geolocation) { + isTrackingLocation.value = true; // Setta lo stato a "in tracciamento" + + navigator.geolocation.getCurrentPosition( + position => { + const lat = position.coords.latitude; + const lng = position.coords.longitude; + + if (zoom.value < 12) { + zoom.value = 12; + } + // Centra la mappa sulla posizione attuale + map.value.flyTo([lat, lng], zoom.value, { + animate: true, + duration: 0.5 + }) + // setView([lat, lng], map.getZoom()) + + if (currentMarker.value) { + map.value.removeLayer(currentMarker.value); + } + + // Aggiungi un marker per la posizione attuale, se desiderato + currentMarker.value = L.marker( + [lat, lng], + { icon: currentLocationIcon } + ).addTo(map.value) + .bindPopup('Posizione attuale') + .openPopup(); + + isTrackingLocation.value = false; // Resetta lo stato di tracciamento + }, + error => { + console.error('Errore nel recupero della posizione:', error); + isTrackingLocation.value = false; // Resetta lo stato di tracciamento + } + ); + } else { + console.error('Geolocalizzazione non supportata dal browser.'); + } + } + + const removeCurrentMarker = () => { + if (currentMarker.value) { + map.value.removeLayer(currentMarker.value); // Rimuovi il marker dalla mappa + currentMarker.value = null; // Resetta il riferimento + } } return { @@ -172,6 +366,9 @@ export default defineComponent({ log, getCoordinates, arrcord, + getCurrentPosition, + isTrackingLocation, + visiblePosition, } } }) diff --git a/src/components/CMapByTable/CMapByTable.vue b/src/components/CMapByTable/CMapByTable.vue index 184f9c9d..780367fc 100755 --- a/src/components/CMapByTable/CMapByTable.vue +++ b/src/components/CMapByTable/CMapByTable.vue @@ -1,6 +1,19 @@ diff --git a/src/css/app.scss b/src/css/app.scss index 9b9500aa..5bd4d067 100755 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -324,8 +324,9 @@ h3 { } } -.dialog_annunci{ +.dialog_annunci { max-width: 700px !important; + @media (max-width: 700px) { /* Versione Mobile */ max-width: 100% !important; @@ -1838,6 +1839,7 @@ h3 { min-height: 100% !important; max-width: 700px !important; min-width: 700px !important; + @media (max-width: 700px) { /* Versione Mobile */ max-width: 400px !important; @@ -1933,7 +1935,8 @@ h3 { .aspect-ratio-box { position: relative; width: 100%; - padding-top: 56.25%; /* 16:9 Aspect Ratio */ + padding-top: 56.25%; + /* 16:9 Aspect Ratio */ } .aspect-ratio-box iframe { @@ -1942,4 +1945,95 @@ h3 { left: 0; width: 100%; height: 100%; +} + +.fake-link { + @media (max-width: 600px) { + color: #1976D2; + text-decoration: underline !important; + cursor: pointer; + } + + font-weight: bold; +} + +.fake-link:hover { + color: #0D47A1; +} + +.fixed-toggle { + position: absolute; + /* Posizionamento fisso */ + top: 60px; + /* Distanza dal bordo superiore */ + left: 20px; + /* Distanza dal bordo sinistro */ + z-index: 1000; + /* Assicurati che sia sopra gli altri elementi */ +} + +.marker-mini-icon { + position: absolute; + top: 5px; + left: 9px; + font-size: 20px; +} + +.marker-circle { + position: absolute; + /* Posizionamento assoluto */ + top: 15px; + /* Centra verticalmente */ + left: 50%; + /* Centra orizzontalmente */ + width: 24px; + /* Dimensione del cerchio */ + height: 24px; + /* Dimensione del cerchio */ + background-color: white; + /* Colore bianco del cerchio */ + border-radius: 50%; + /* Rende il cerchio rotondo */ + transform: translate(-50%, -50%); + /* Centra esattamente il cerchio */ + z-index: 0; + /* Assicurati che sia sotto l'icona principale */ +} + +.marker-shadow { + width: 40px; /* Dimensione dell'ombra, dovrebbe corrispondere all'icona principale */ + height: 40px; /* Dimensione dell'ombra */ + position: absolute; /* Posizionamento assoluto per posizionarla correttamente */ + top: 3px; /* Allineata sopra */ + left: 8px; /* Allineata a sinistra */ + z-index: -10; /* Assicurati che l'ombra sia sotto */ + opacity: 1; /* L'opacità dell'ombra per un effetto realistico */ +} + +.custom-icon .material-icons { + position: absolute; /* Posizionamento assoluto per centrare */ + top: 50%; /* Posizionamento verticale */ + left: 50%; /* Posizionamento orizzontale */ + transform: translate(-50%, -50%); /* Centra l'icona */ + font-size: 40px; /* Dimensione dell'icona 20x20 */ + color: blue; /* Colore dell'icona (puoi cambiarlo) */ +} + +.current-location-icon { + background-color: #4A89F3; + border: 3px solid #FFFFFF; + border-radius: 50%; + box-shadow: 0 0 0 4px #4A89F3; +} +.current-location-icon::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 50%; + height: 50%; + background-color: #FFFFFF; + border-radius: 50%; + opacity: 0.4; } \ No newline at end of file diff --git a/src/css/possibile_icons.css b/src/css/possibile_icons.css new file mode 100644 index 00000000..1e6e1217 --- /dev/null +++ b/src/css/possibile_icons.css @@ -0,0 +1,433 @@ +@charset "UTF-8"; + +@font-face { + font-family: "presdecheznous"; + src:url("fonts/presdecheznous.eot"); + src:url("fonts/presdecheznous.eot?#iefix") format("embedded-opentype"), + url("fonts/presdecheznous.woff") format("woff"), + url("fonts/presdecheznous.ttf") format("truetype"), + url("fonts/presdecheznous.svg#presdecheznous") format("svg"); + font-weight: normal; + font-style: normal; + +} + +[data-icon]:before { + font-family: "presdecheznous" !important; + content: attr(data-icon); + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +[class^="icon-"]:before, +[class*=" icon-"]:before { + font-family: "presdecheznous" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-fruits:before { + content: "\61"; +} +.icon-marche:before { + content: "\62"; +} +.icon-pain:before { + content: "\63"; +} +.icon-viande:before { + content: "\64"; +} +.icon-legumes:before { + content: "\65"; +} +.icon-poisson:before { + content: "\66"; +} +.icon-laitier:before { + content: "\67"; +} +.icon-plantes:before { + content: "\68"; +} +.icon-autre:before { + content: "\69"; +} +.icon-miel:before { + content: "\6a"; +} +.icon-transformes:before { + content: "\6b"; +} +.icon-boissons:before { + content: "\6c"; +} +.icon-oeufs:before { + content: "\6d"; +} +.icon-huile:before { + content: "\6e"; +} +.icon-marker:before { + content: "\6f"; +} +.icon-paper-plane:before { + content: "\70"; +} +.icon-legumineuses:before { + content: "\71"; +} +.icon-epicerie:before { + content: "\72"; +} +.icon-bike:before { + content: "\73"; +} +.icon-boat:before { + content: "\74"; +} +.icon-car:before { + content: "\75"; +} +.icon-clothe:before { + content: "\76"; +} +.icon-leaf-1:before { + content: "\77"; +} +.icon-camping:before { + content: "\78"; +} +.icon-partner-3:before { + content: "\79"; +} +.icon-001-scissors-1:before { + content: "\7a"; +} +.icon-echange-1:before { + content: "\41"; +} +.icon-conf:before { + content: "\42"; +} +.icon-atelier-1:before { + content: "\43"; +} +.icon-formation-2:before { + content: "\44"; +} +.icon-skate:before { + content: "\45"; +} +.icon-moto:before { + content: "\46"; +} +.icon-mobilite-2:before { + content: "\47"; +} +.icon-cafe:before { + content: "\48"; +} +.icon-materiaux:before { + content: "\49"; +} +.icon-seeds:before { + content: "\4a"; +} +.icon-plants-1:before { + content: "\4b"; +} +.icon-charpentier:before { + content: "\4c"; +} +.icon-renouvelable-1:before { + content: "\4d"; +} +.icon-electricite:before { + content: "\4e"; +} +.icon-school:before { + content: "\4f"; +} +.icon-architecte:before { + content: "\50"; +} +.icon-maconnerie:before { + content: "\51"; +} +.icon-ressourcerie:before { + content: "\52"; +} +.icon-co2-1:before { + content: "\53"; +} +.icon-jaridnier:before { + content: "\54"; +} +.icon-design:before { + content: "\55"; +} +.icon-temperature-1:before { + content: "\56"; +} +.icon-paper:before { + content: "\57"; +} +.icon-park:before { + content: "\58"; +} +.icon-photo:before { + content: "\59"; +} +.icon-musique:before { + content: "\5a"; +} +.icon-theatre:before { + content: "\30"; +} +.icon-cinema:before { + content: "\31"; +} +.icon-restaurant:before { + content: "\32"; +} +.icon-ferme-1:before { + content: "\33"; +} +.icon-hotel-1:before { + content: "\34"; +} +.icon-gite:before { + content: "\35"; +} +.icon-voyage-1:before { + content: "\36"; +} +.icon-beaute:before { + content: "\37"; +} +.icon-pharmacie-1:before { + content: "\38"; +} +.icon-cosmetique:before { + content: "\39"; +} +.icon-decoration-2:before { + content: "\21"; +} +.icon-accessoire-2:before { + content: "\22"; +} +.icon-vetement-4:before { + content: "\23"; +} +.icon-accessoire-4:before { + content: "\24"; +} +.icon-friperie-1:before { + content: "\25"; +} +.icon-case:before { + content: "\26"; +} +.icon-coffee:before { + content: "\27"; +} +.icon-tags:before { + content: "\28"; +} +.icon-euro:before { + content: "\29"; +} +.icon-paw:before { + content: "\2a"; +} +.icon-education-1:before { + content: "\2b"; +} +.icon-construction:before { + content: "\2c"; +} +.icon-ruche:before { + content: "\2d"; +} +.icon-expo:before { + content: "\2e"; +} +.icon-home:before { + content: "\2f"; +} +.icon-angle-right:before { + content: "\3a"; +} +.icon-recycle:before { + content: "\3b"; +} +.icon-tool:before { + content: "\3c"; +} +.icon-chalet:before { + content: "\3d"; +} +.icon-distrib:before { + content: "\3e"; +} +.icon-palette:before { + content: "\3f"; +} +.icon-activits-culturelles:before { + content: "\5b"; +} +.icon-fablab-3:before { + content: "\7b"; +} +.icon-informatique-1:before { + content: "\5c"; +} +.icon-fablab-1:before { + content: "\e008"; +} +.icon-monnaie-locale:before { + content: "\e009"; +} +.icon-fablab2:before { + content: "\e00b"; +} +.icon-solidarit:before { + content: "\e00c"; +} +.icon-coopratives:before { + content: "\e00f"; +} +.icon-lieu-collaboratif:before { + content: "\e010"; +} +.icon-mobilier:before { + content: "\e012"; +} +.icon-coworking-1:before { + content: "\e014"; +} +.icon-troc-1:before { + content: "\e015"; +} +.icon-troc-2:before { + content: "\e017"; +} +.icon-vivre-ensemble:before { + content: "\e019"; +} +.icon-repair-caf-2:before { + content: "\e01a"; +} +.icon-bote-livredons:before { + content: "\e01c"; +} +.icon-informatique-4:before { + content: "\e01e"; +} +.icon-informatique-3:before { + content: "\e021"; +} +.icon-ateliers-1:before { + content: "\e022"; +} +.icon-repair-caf:before { + content: "\40"; +} +.icon-collectif-citoyen-1:before { + content: "\5f"; +} +.icon-apple:before { + content: "\7d"; +} +.icon-001-support:before { + content: "\60"; +} +.icon-003-hand:before { + content: "\e001"; +} +.icon-004-protest:before { + content: "\e002"; +} +.icon-002-support-1:before { + content: "\e000"; +} +.icon-meeting-2:before { + content: "\e006"; +} +.icon-democratie-1:before { + content: "\e005"; +} +.icon-artisanat-2:before { + content: "\5e"; +} +.icon-ring:before { + content: "\e003"; +} +.icon-artisanat-3:before { + content: "\e004"; +} +.icon-artisanat-4:before { + content: "\e007"; +} +.icon-artisanat-5:before { + content: "\5d"; +} +.icon-de:before { + content: "\e00a"; +} +.icon-radio:before { + content: "\e00d"; +} +.icon-recycle-1:before { + content: "\e00e"; +} +.icon-chambredhote:before { + content: "\e011"; +} +.icon-chaussures:before { + content: "\e013"; +} +.icon-electromnager:before { + content: "\e016"; +} +.icon-renewable:before { + content: "\7c"; +} +.icon-rings:before { + content: "\7e"; +} +.icon-shoe:before { + content: "\e018"; +} +.icon-toaster:before { + content: "\e01b"; +} +.icon-village:before { + content: "\e01d"; +} +.icon-hygiene:before { + content: "\e01f"; +} +.icon-entretien:before { + content: "\e020"; +} +.icon-flash:before { + content: "\e023"; +} +.icon-archive:before { + content: "\e024"; +} diff --git a/src/statics/lang/it.js b/src/statics/lang/it.js index 62157e6f..bc4e2fc9 100755 --- a/src/statics/lang/it.js +++ b/src/statics/lang/it.js @@ -14,8 +14,8 @@ const msg_it = { csv: 'Esporta Movimenti', }, grid: { - showlist: 'Mostra la Lista', - showmap: 'Mostra la Mappa', + showlist: 'Lista', + showmap: 'Mappa', editvalues: 'Modifica Valori', addrecord: 'Aggiungi Riga', showprevedit: 'Mostra Eventi Passati', @@ -24,6 +24,8 @@ const msg_it = { nodata: 'Nessun Dato', showfilters: 'Filtri', hidefilters: 'Nascondi Filtri', + openfilter: 'Apri Filtri', + closefilter: 'Chiudi Filtri', }, gallery: { author_username: 'Utente', diff --git a/src/store/Modules/tools.ts b/src/store/Modules/tools.ts index 5cf19078..4955823b 100644 --- a/src/store/Modules/tools.ts +++ b/src/store/Modules/tools.ts @@ -7658,7 +7658,7 @@ export const tools = { getArrSubSector(table: string, rec: any) { if (table === toolsext.TABMYGOODS) return rec.recGood - else if ((table === toolsext.TABMYBACHECAS) || (table === toolsext.TABMYSKILLS)) + else if ((table === toolsext.TABMYBACHECAS) || (table === toolsext.TABMYSKILLS) || (table === toolsext.TABATTIVITA)) return rec.recSkill else if (table === toolsext.TABMYGROUPS) return [] diff --git a/src/store/globalStore.ts b/src/store/globalStore.ts index 7a6f17a8..9b60a2fc 100644 --- a/src/store/globalStore.ts +++ b/src/store/globalStore.ts @@ -879,8 +879,8 @@ export const useGlobalStore = defineStore('GlobalStore', { console.log('DeleteSubscriptionToServer: ') try { - return Api.SendReq('/subscribe/del', 'DELETE', null) - }catch (e) { + return Api.SendReq('/subscribe/del', 'DELETE', null) + } catch (e) { console.error('deleteSubscriptionToServer') } }, @@ -1667,7 +1667,7 @@ export const useGlobalStore = defineStore('GlobalStore', { return true }).then((res) => res).catch((error) => { if (error.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_TOKEN_EXPIRED) { - + } console.log('error dbLoad', error) // userStore.setErrorCatch(error) @@ -2099,7 +2099,7 @@ export const useGlobalStore = defineStore('GlobalStore', { }, prepareAddNewElem(order: any, $q: any, t: any, myelem: any, newtype: any) { - + const newrec: IMyElem = { _id: undefined, type: newtype, @@ -2130,7 +2130,16 @@ export const useGlobalStore = defineStore('GlobalStore', { return newrec - } + }, - }, + getIconBySector(sectorId: string) { + const myrec = this.sectors.find((rec: any) => rec._id === sectorId) + + if (myrec && myrec.icon) { + return myrec.icon + } else { + return 'fas fa-home' + } + } + } })