diff --git a/modules/mappa/actions.php b/modules/mappa/actions.php new file mode 100644 index 000000000..7fa32200f --- /dev/null +++ b/modules/mappa/actions.php @@ -0,0 +1,128 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +use Util\Query; + + switch( get('op') ){ + + case "get_markers": + + $idanagrafica = get('idanagrafica'); + $checks = get('check'); + + $where = []; + //Filtro per anagrafica + if(!empty($idanagrafica) && $idanagrafica!='null'){ + $where[] = "in_interventi.idanagrafica=".prepare($idanagrafica); + } + + //Filtri per stato + $checks = explode(',', $checks); + $where[] = "in_statiintervento.descrizione IN ('".implode("','", $checks)."')"; + + $add_query = "WHERE 1=1 AND ".implode(' AND ', $where); + + //Filtri per data + $add_query .= " |date_period(`orario_inizio`,`data_richiesta`)|"; + + $query = "SELECT *, in_interventi.id AS idintervento, an_anagrafiche.lat AS lat_anagrafica, an_anagrafiche.lng AS lng_anagrafica, an_anagrafiche.indirizzo AS indirizzo_anagrafica, an_anagrafiche.cap AS cap_anagrafica, an_anagrafiche.citta AS citta_anagrafica, an_anagrafiche.provincia AS provincia_anagrafica, an_sedi.lat AS lat_sede, an_sedi.lng AS lng_sede, an_sedi.indirizzo AS indirizzo_sede, an_sedi.cap AS cap_sede, an_sedi.citta AS citta_sede, an_sedi.provincia AS provincia_sede, in_statiintervento.descrizione AS stato FROM in_interventi INNER JOIN an_anagrafiche ON in_interventi.idanagrafica=an_anagrafiche.idanagrafica LEFT JOIN an_sedi ON in_interventi.idsede_destinazione=an_sedi.id INNER JOIN in_statiintervento ON in_interventi.idstatointervento=in_statiintervento.idstatointervento LEFT JOIN in_interventi_tecnici ON in_interventi_tecnici.idintervento = in_interventi.id ".$add_query; + + $query = Query::replacePlaceholder($query); + $query = Modules::replaceAdditionals(Modules::get('Interventi')['id'], $query); + + $records = $dbo->fetchArray($query); + + $rs = []; + + if(sizeof($records)>0){ + + for( $i=0; $i '.$records[$i]['ragione_sociale'].' '."\n
"; + + if(!empty($indirizzo)){ + $descrizione .= ' Indirizzo: '.$indirizzo."\n
"; + } + if(!empty($cap)){ + $descrizione .= ' '.$cap; + } + if(!empty($citta)){ + $descrizione .= ', '.$citta; + } + if(!empty($provincia)){ + $descrizione .= ' '.$provincia; + } + + $descrizione .= '
'; + + $descrizione .= ' + Calcola percorso + '; + + //dettagli intervento + $rs_sessioni = $dbo->fetchOne("SELECT MIN(orario_inizio) AS data, GROUP_CONCAT(DISTINCT ragione_sociale SEPARATOR ', ') AS tecnici FROM in_interventi_tecnici INNER JOIN an_anagrafiche ON in_interventi_tecnici.idtecnico=an_anagrafiche.idanagrafica WHERE idintervento=".prepare($records[$i]['idintervento'])." GROUP BY idintervento"); + + $descrizione .= '
'; + $descrizione .= 'Data: '.(!empty($rs_sessioni['data'])?Translator::dateToLocale($rs_sessioni['data']):Translator::dateToLocale($records[$i]['data_richiesta'])).'
'; + $descrizione .= 'Stato: '.$records[$i]['stato']."
"; + $descrizione .= 'Richiesta: '.substr(strip_tags($records[$i]['richiesta']), 0, 200)."
"; + if(!empty($rs_sessioni['tecnici'])){ + $descrizione .= 'Tecnici: '.$rs_sessioni['tecnici']; + } + + $descrizione .= '
'; + + $descrizione .= ' + Apri attività + '; + + $descrizione .= '
'; + + $rs[] = ['descrizione'=>$descrizione, 'lat'=>$lat, 'lng'=>$lng]; + } + } + } + + echo json_encode($rs); + + break; + } +?> \ No newline at end of file diff --git a/modules/mappa/css/app.css b/modules/mappa/css/app.css new file mode 100644 index 000000000..645b041b5 --- /dev/null +++ b/modules/mappa/css/app.css @@ -0,0 +1,104 @@ +#mappa { + width: 100%; + height: 835px; +} + +#menu-filtri { + width:600px; + height:700px; + position:fixed; + top:100px; + +} + +.open-menu{ + right:0px; + background-color:#FFFFFFEB; +} + +.closed-menu{ + right:-560px; + background-color:#FFFFFF00; +} + +.row{ + margin-bottom: 5px; +} + +hr { + margin-top: 5px; + margin-bottom: 5px; +} + +.material-switch > input[type="checkbox"] { + display: none; +} + +.material-switch > label { + cursor: pointer; + height: 0px; + position: relative; + width: 40px; +} + +.material-switch > label::before { + background: rgb(0, 0, 0); + box-shadow: inset 0px 0px 10px rgba(0, 0, 0, 0.5); + border-radius: 8px; + content: ''; + height: 16px; + margin-top: -8px; + position:absolute; + opacity: 0.3; + transition: all 0.4s ease-in-out; + width: 40px; +} +.material-switch > label::after { + background: rgb(255, 255, 255); + border-radius: 16px; + box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3); + content: ''; + height: 24px; + left: -4px; + margin-top: -8px; + position: absolute; + top: -4px; + transition: all 0.3s ease-in-out; + width: 24px; +} +.material-switch > input[type="checkbox"]:checked + label::before { + background: inherit; + opacity: 0.5; +} +.material-switch > input[type="checkbox"]:checked + label::after { + background: inherit; + left: 20px; +} + +.material-switch { + margin-bottom:10px; +} + +.btn-black{ + background-color: #505050; + color: #fff; + border-color: #353535; + border-bottom-color: #353535; +} + +.btn-black:hover{ + background-color: #414141; + color: #fff; + border-color: #353535; + border-bottom-color: #353535; +} + +.btn-black:focus{ + color: #fff; +} + +a:active, a:hover, a:focus { + outline: 0; + text-decoration: none; + outline: 0 !important; +} \ No newline at end of file diff --git a/modules/mappa/edit.php b/modules/mappa/edit.php new file mode 100644 index 000000000..b3a08f559 --- /dev/null +++ b/modules/mappa/edit.php @@ -0,0 +1,100 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +?> + + + + + + +
+ + + + + + + + + + + '.Modules::link('Impostazioni', null, tr('Per abilitare la visualizzazione della mappa, inserire la Google Maps API Key nella scheda Impostazioni'), true, null, true, null, '&search=Google Maps API key').'. + '; +} +?> \ No newline at end of file diff --git a/modules/mappa/js/app.js b/modules/mappa/js/app.js new file mode 100644 index 000000000..08a4502b9 --- /dev/null +++ b/modules/mappa/js/app.js @@ -0,0 +1,131 @@ +$(document).ready(function(){ + if(!$('body').hasClass('sidebar-collapse')){ + $('.sidebar-toggle').trigger('click'); + $('.nav').hide(); + } + + reload_pointers(); +}); + +let map; +var markers = []; + +function initialize(startLat, startLon) { + + if (startLat==undefined){ + startLat = 43.45291889; + } + if (startLon==undefined){ + startLon = 11.96411133; + } + + var myLatlng = new google.maps.LatLng(startLat, startLon); + + var mapOptions = { + zoom: 7, + center: myLatlng, + mapTypeId: google.maps.MapTypeId.ROADMAP, + mapTypeControl: false, + streetViewControl: false, + panControl: false, + scaleControl: false, + rotateControl: false + } + + map = new google.maps.Map(document.getElementById('mappa'), mapOptions); + +} + +$('#menu-filtri-toggle').click(function(){ + + if($(this).parent().parent().parent().hasClass("open-menu")){ + $(this).parent().parent().parent().removeClass("open-menu"); + $(this).parent().parent().parent().addClass("closed-menu"); + + $(this).removeClass('fa-forward'); + $(this).addClass('fa-backward'); + + $('#lista-filtri').hide(); + }else{ + $(this).parent().parent().parent().removeClass("closed-menu"); + $(this).parent().parent().parent().addClass("open-menu"); + + $(this).removeClass('fa-backward'); + $(this).addClass('fa-forward'); + + $('#lista-filtri').show(); + } +}); + +function reload_pointers(){ + + clearMarkers(); + + var check = []; + + $("input[type='checkbox']").each(function(){ + if($(this).is(':checked')){ + id = $(this).attr('id'); + + check.push(id); + + } + }); + + $.get(ROOTDIR+'/modules/mappa/actions.php?op=get_markers&idanagrafica='+$('#idanagrafica').val()+'&check='+check, function(data){ + + var infowindow = new google.maps.InfoWindow(); + var bounds = new google.maps.LatLngBounds (); + + var dettagli = JSON.parse(data); + + var marker, i; + var counter = 0; + + dettagli.forEach(function(dettaglio) { + + const posizione = new google.maps.LatLng(dettaglio.lat, dettaglio.lng); + + marker = new google.maps.Marker({ + position: posizione, + map: map, + }); + + markers.push(marker); + bounds.extend(posizione); + + google.maps.event.addListener(marker, 'click', (function(marker, i) { + return function() { + infowindow.setContent(dettaglio.descrizione); + infowindow.open(map, marker); + } + })(marker, i)); + + counter++; + }); + + if(counter>0){ + map.setCenter(bounds.getCenter()); // this will set the center of map to center of all markers + map.fitBounds(bounds); // this will fit all the markers to screen + } + }); +} + +function setMapOnAll(map) { + for (let i = 0; i < markers.length; i++) { + markers[i].setMap(map); + } +} + +function clearMarkers() { + setMapOnAll(null); +} + +$("input[type='checkbox']").change(function(){ + reload_pointers(); +}); + +$('#idanagrafica').change(function(){ + reload_pointers(); +}); + diff --git a/update/2_4_37.sql b/update/2_4_37.sql new file mode 100644 index 000000000..422f3cc58 --- /dev/null +++ b/update/2_4_37.sql @@ -0,0 +1 @@ +INSERT INTO `zz_modules` (`id`, `name`, `title`, `directory`, `options`, `options2`, `icon`, `version`, `compatibility`, `order`, `parent`, `default`, `enabled`, `created_at`, `updated_at`, `use_notes`, `use_checklists`) VALUES (NULL, 'Mappa', 'Mappa', 'mappa', 'custom', '', 'fa fa-map', '2.4.36', '2.4.36', '10', NULL, '1', '1', '2022-10-12 17:22:11', '2022-10-12 17:23:52', '0', '0'); \ No newline at end of file