openstamanager/modules/dashboard/edit.php

815 lines
31 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Carbon\Carbon;
include_once __DIR__.'/../../core.php';
// Individuazione dati selezionabili
// Stati interventi
$stati_intervento = $dbo->fetchArray('SELECT `in_statiintervento`.`id`, `name` as descrizione, `colore` FROM `in_statiintervento` LEFT JOIN `in_statiintervento_lang` ON (`in_statiintervento_lang`.`id_record` = `in_statiintervento`.`id` AND `in_statiintervento_lang`.`id_lang` = '.prepare(setting('Lingua')).') WHERE `deleted_at` IS NULL ORDER BY `name` ASC');
// Tipi intervento
$tipi_intervento = $dbo->fetchArray('SELECT `idtipointervento` AS id, `descrizione` FROM `in_tipiintervento` WHERE `deleted_at` IS NULL ORDER BY `descrizione` ASC');
// Tecnici disponibili
$tecnici_disponibili = $dbo->fetchArray('SELECT
`an_anagrafiche`.`idanagrafica` AS id, `ragione_sociale`, `colore`
FROM
`an_anagrafiche`
INNER JOIN `an_tipianagrafiche_anagrafiche` ON `an_anagrafiche`.`idanagrafica`=`an_tipianagrafiche_anagrafiche`.`idanagrafica`
INNER JOIN `an_tipianagrafiche` ON `an_tipianagrafiche_anagrafiche`.`idtipoanagrafica`=`an_tipianagrafiche`.`id`
LEFT JOIN `an_tipianagrafiche_lang` ON (`an_tipianagrafiche`.`id`=`an_tipianagrafiche_lang`.`id_record` AND `an_tipianagrafiche_lang`.`id_lang`='.prepare(setting('Lingua')).")
LEFT JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idtecnico` = `an_anagrafiche`.`idanagrafica`
INNER JOIN `in_interventi` ON `in_interventi_tecnici`.`idintervento`=`in_interventi`.`id`
WHERE
`an_anagrafiche`.`deleted_at` IS NULL AND `an_tipianagrafiche_lang`.`name`='Tecnico' ".Modules::getAdditionalsQuery('Interventi', null, false).'
GROUP BY
`an_anagrafiche`.`idanagrafica`
ORDER BY
`ragione_sociale` ASC');
// Zone
$zone = $dbo->fetchArray('(SELECT 0 AS ordine, \'0\' AS id, \'Nessuna zona\' AS descrizione) UNION (SELECT 1 AS ordine, id, descrizione FROM an_zone) ORDER BY ordine, descrizione ASC');
// Prima selezione globale per tutti i filtri
if (!isset($_SESSION['dashboard']['idtecnici'])) {
$_SESSION['dashboard']['idtecnici'] = ["'-1'"];
foreach ($tecnici_disponibili as $tecnico) {
if (($user['gruppo'] == 'Tecnici' && $user['idanagrafica'] == $tecnico['id']) || $user['gruppo'] != 'Tecnici') {
$_SESSION['dashboard']['idtecnici'][] = "'".$tecnico['id']."'";
}
}
}
if (!isset($_SESSION['dashboard']['idstatiintervento'])) {
$_SESSION['dashboard']['idstatiintervento'] = ["'-1'"];
foreach ($stati_intervento as $stato) {
$_SESSION['dashboard']['idstatiintervento'][] = "'".$stato['id']."'";
}
}
if (!isset($_SESSION['dashboard']['idtipiintervento'])) {
$_SESSION['dashboard']['idtipiintervento'] = ["'-1'"];
foreach ($tipi_intervento as $tipo) {
$_SESSION['dashboard']['idtipiintervento'][] = "'".$tipo['id']."'";
}
}
if (!isset($_SESSION['dashboard']['idzone'])) {
$_SESSION['dashboard']['idzone'] = ["'-1'"];
foreach ($zone as $zona) {
$_SESSION['dashboard']['idzone'][] = "'".$zona['id']."'";
}
}
echo '
<!-- Filtri -->
<div class="row">
<!-- STATI INTERVENTO -->
<div class="dropdown col-md-3" id="dashboard_stati">
<button type="button" class="btn btn-block counter_object" data-toggle="dropdown">
<i class="fa fa-filter"></i> '.tr('Stati attività').'
(<span class="selected_counter"></span>/<span class="total_counter"></span>) <i class="caret"></i>
</button>
<ul class="dropdown-menu" role="menu">';
// Stati intervento
$stati_sessione = session_get('dashboard.idstatiintervento', []);
foreach ($stati_intervento as $stato) {
$attr = '';
if (in_array("'".$stato['id']."'", $stati_sessione)) {
$attr = 'checked="checked"';
}
echo '
<li>
<input type="checkbox" id="stato_'.$stato['id'].'" class="dashboard_stato" value="'.$stato['id'].'" '.$attr.'>
<label for="stato_'.$stato['id'].'">
'.$stato['descrizione'].'<span style="position:relative;right:-7px;bottom:-3px;width:15px;height:15px;display:inline-block;border-radius:50%;background-color:'.$stato['colore'].';"></span>
</label>
</li>';
}
echo '
<div class="btn-group float-right">
<button type="button" class="btn btn-primary btn-sm seleziona_tutto">
'.tr('Tutti').'
</button>
<button type="button" class="btn btn-danger btn-sm deseleziona_tutto">
<i class="fa fa-times"></i>
</button>
</div>
</ul>
</div>
<!-- TIPI INTERVENTO -->
<div class="dropdown col-md-3" id="dashboard_tipi">
<button type="button" class="btn btn-block counter_object" data-toggle="dropdown">
<i class="fa fa-filter"></i> '.tr('Tipi attività').'
(<span class="selected_counter"></span>/<span class="total_counter"></span>) <i class="caret"></i>
</button>
<ul class="dropdown-menu" role="menu">';
// Tipi intervento
$tipi_sessione = session_get('dashboard.idtipiintervento', []);
foreach ($tipi_intervento as $tipo) {
$attr = '';
if (in_array("'".$tipo['id']."'", $tipi_sessione)) {
$attr = 'checked="checked"';
}
echo '
<li>
<input type="checkbox" id="tipo_'.$tipo['id'].'" class="dashboard_tipo" value="'.$tipo['id'].'" '.$attr.'>
<label for="tipo_'.$tipo['id'].'">
'.$tipo['descrizione'].'
</label>
</li>';
}
echo '
<div class="btn-group float-right">
<button type="button" class="btn btn-primary btn-sm seleziona_tutto">
'.tr('Tutti').'
</button>
<button type="button" class="btn btn-danger btn-sm deseleziona_tutto">
<i class="fa fa-times"></i>
</button>
</div>
</ul>
</div>
<!-- TECNICI -->
<div class="dropdown col-md-3" id="dashboard_tecnici">
<button type="button" class="btn btn-block counter_object" data-toggle="dropdown">
<i class="fa fa-filter"></i> '.tr('Tecnici').'
(<span class="selected_counter"></span>/<span class="total_counter"></span>) <i class="caret"></i>
</button>
<ul class="dropdown-menu" role="menu">';
$tecnici_sessione = session_get('dashboard.idtecnici', []);
foreach ($tecnici_disponibili as $tecnico) {
$attr = '';
if (in_array("'".$tecnico['id']."'", $tecnici_sessione)) {
$attr = 'checked="checked"';
}
echo '
<li>
<input type="checkbox" id="tecnico_'.$tecnico['id'].'" class="dashboard_tecnico" value="'.$tecnico['id'].'" '.$attr.'>
<label for="tecnico_'.$tecnico['id'].'">
'.$tecnico['ragione_sociale'].'<span style="position:relative;right:-7px;bottom:-3px;width:15px;height:15px;display:inline-block;border-radius:50%;background-color:'.$tecnico['colore'].';"></span>
</label>
</li>';
}
echo '
<div class="btn-group float-right">
<button type="button" class="btn btn-primary btn-sm seleziona_tutto">
'.tr('Tutti').'
</button>
<button type="button" class="btn btn-danger btn-sm deseleziona_tutto">
<i class="fa fa-times"></i>
</button>
</div>
</ul>
</div>
<!-- ZONE -->
<div class="dropdown col-md-3" id="dashboard_zone">
<button type="button" class="btn btn-block counter_object" data-toggle="dropdown">
<i class="fa fa-filter"></i> '.tr('Zone').'
(<span class="selected_counter"></span>/<span class="total_counter"></span>) <i class="caret"></i>
</button>
<ul class="dropdown-menu" role="menu">';
// Zone
$zone_sessione = session_get('dashboard.idzone', []);
foreach ($zone as $zona) {
$attr = '';
if (in_array("'".$zona['id']."'", $zone_sessione)) {
$attr = 'checked="checked"';
}
echo '
<li>
<input type="checkbox" id="zona_'.$zona['id'].'" class="dashboard_zona" value="'.$zona['id'].'" '.$attr.'>
<label for="zona_'.$zona['id'].'">
'.$zona['descrizione'].'
</label>
</li>';
}
echo '
<div class="btn-group float-right">
<button type="button" class="btn btn-primary btn-sm seleziona_tutto">
'.tr('Tutti').'
</button>
<button type="button" class="btn btn-danger btn-sm deseleziona_tutto">
<i class="fa fa-times"></i>
</button>
</div>
</ul>
</div>
</div>
<br>';
$solo_promemoria_assegnati = setting('Visualizza solo promemoria assegnati');
$id_tecnico = null;
if ($user['gruppo'] == 'Tecnici' && !empty($user['idanagrafica'])) {
$id_tecnico = $user['idanagrafica'];
}
$query_da_programmare = 'SELECT
`data_richiesta` AS data
FROM
`co_promemoria`
INNER JOIN `co_contratti` ON `co_promemoria`.`idcontratto` = `co_contratti`.`id`
INNER JOIN `co_staticontratti` ON `co_contratti`.`idstato` = `co_staticontratti`.`id`
LEFT JOIN `co_staticontratti_lang` ON (`co_staticontratti`.`id` = `co_staticontratti_lang`.`id_record` AND `co_staticontratti_lang`.`id_lang` = '.prepare(setting('Lingua')).')
INNER JOIN `an_anagrafiche` ON `co_contratti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`
WHERE
`co_staticontratti`.`is_pianificabile` = 1 AND `idintervento` IS NULL
UNION
SELECT
IF(`data_scadenza` IS NULL, `data_richiesta`, `data_scadenza`) AS data
FROM
`in_interventi`
INNER JOIN `an_anagrafiche` ON `in_interventi`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`';
// Visualizzo solo promemoria del tecnico loggato
if (!empty($id_tecnico) && !empty($solo_promemoria_assegnati)) {
$query_da_programmare .= '
INNER JOIN `in_interventi_tecnici_assegnati` ON `in_interventi`.`id` = `in_interventi_tecnici_assegnati`.`id_intervento` AND `id_tecnico` = '.prepare($id_tecnico);
}
$query_da_programmare .= '
WHERE
(SELECT COUNT(*) FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`) = 0 AND
`in_interventi`.`idstatointervento` IN(SELECT `id` FROM `in_statiintervento` WHERE `is_completato` = 0)';
$risultati_da_programmare = $dbo->fetchArray($query_da_programmare);
if (!empty($risultati_da_programmare)) {
echo '
<div class="row">
<div class="col-md-10">';
}
echo '
<div id="calendar"></div>';
if (!empty($risultati_da_programmare)) {
echo '
</div>
<div id="external-events" class="hidden-xs hidden-sm col-md-2">
<h4>'.tr('Promemoria da pianificare').'</h4>';
// Controllo pianificazioni mesi precedenti
// Promemoria contratti + promemoria interventi
$query_mesi_precenti = 'SELECT
`co_promemoria`.`id`
FROM
`co_promemoria`
INNER JOIN `co_contratti` ON `co_promemoria`.`idcontratto`=`co_contratti`.`id`
WHERE
`idstato` IN(SELECT `id` FROM `co_staticontratti` WHERE `is_pianificabile` = 1)
AND `idintervento` IS NULL
AND DATE_ADD(`co_promemoria`.`data_richiesta`, INTERVAL 1 DAY) <= NOW()
UNION
SELECT
`in_interventi`.`id`
FROM
`in_interventi`
INNER JOIN `an_anagrafiche` ON `in_interventi`.`idanagrafica`=`an_anagrafiche`.`idanagrafica`';
// Visualizzo solo promemoria del tecnico loggato
if (!empty($id_tecnico) && !empty($solo_promemoria_assegnati)) {
$query_mesi_precenti .= '
INNER JOIN `in_interventi_tecnici_assegnati` ON `in_interventi`.`id` = `in_interventi_tecnici_assegnati`.`id_intervento` AND `id_tecnico` = '.prepare($id_tecnico);
}
$query_mesi_precenti .= '
WHERE
(SELECT COUNT(*) FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`) = 0
AND `in_interventi`.`idstatointervento` IN(SELECT `id` FROM `in_statiintervento` WHERE `is_completato` = 0)
AND DATE_ADD(IF(`in_interventi`.`data_scadenza` IS NULL, `in_interventi`.`data_richiesta`, `in_interventi`.`data_scadenza`), INTERVAL 1 DAY) <= NOW()';
$numero_mesi_precenti = $dbo->fetchNum($query_mesi_precenti);
if ($numero_mesi_precenti > 0) {
echo '<div class="alert alert-warning alert-dismissible" role="alert"><button class="close" type="button" data-dismiss="alert" aria-hidden="true"><span aria-hidden="true">×</span><span class="sr-only">'.tr('Chiudi').'</span></button><i class="fa fa-exclamation-triangle"></i><span class="text-sm"> '.tr('Ci sono _NUM_ promemoria scaduti', [
'_NUM_' => $numero_mesi_precenti,
]).'.</span></div>';
}
// Aggiunta della data corrente per visualizzare il mese corrente
$risultati_da_programmare[] = [
'data' => date('Y-m-d H:i:s'),
];
$mesi = collect($risultati_da_programmare)
->unique(function ($item) {
$data = Carbon::parse($item['data']);
return $data->format('m-Y');
})
->sortBy('data');
echo '
<select class="superselect openstamanager-input select-input" id="mese-promemoria">
<option value="all">'.tr('Tutti').'</option>';
foreach ($mesi as $mese) {
$data = Carbon::parse($mese['data']);
$chiave = $data->format('mY');
$testo = $data->formatLocalized('%B %Y');
if (checkdate($data->format('m'), $data->format('d'), $data->format('Y'))) {
echo '
<option value="'.$chiave.'">'.ucfirst($testo).'</option>';
}
}
echo '
</select>
<div id="elenco-promemoria"></div>
</div>
</div>';
}
$vista = setting('Vista dashboard');
if ($vista == 'mese') {
$def = 'dayGridMonth';
} elseif ($vista == 'giorno') {
$def = 'timeGridDay';
} elseif ($vista == 'settimana') {
$def = 'timeGridWeek';
} else {
$def = 'listWeek';
}
$days = [
1 => 'Lunedì',
2 => 'Martedì',
3 => 'Mercoledì',
4 => 'Giovedì',
5 => 'Venerdì',
6 => 'Sabato',
0 => 'Domenica',
];
$working_days = explode(',', setting('Giorni lavorativi'));
$non_working_days = [];
foreach ($days as $key => $day) {
if (!in_array($day, $working_days)) {
array_push($non_working_days, $key);
}
}
$modulo_interventi = Modules::get('Interventi');
echo '
<script type="text/javascript">
var Draggable = FullCalendar.Draggable;
globals.dashboard = {
load_url: "'.$structure->fileurl('ajax.php').'",
style: "'.$def.'",
show_sunday: '.intval(setting('Visualizzare la domenica sul calendario')).',
start_time: "'.setting('Ora inizio sul calendario').'",
end_time: "'.((setting('Ora fine sul calendario') != '00:00:00' && !empty(setting('Ora fine sul calendario'))) ? setting('Ora fine sul calendario') : '23:59:59').'",
write_permission: '.intval($modulo_interventi->permission == 'rw').',
tooltip: '.intval(setting('Utilizzare i tooltip sul calendario')).',
calendar: null,
timeFormat: "H:mm",
select: {
title: "'.tr('Aggiungi intervento').'",
url: globals.rootdir + "/add.php?id_module='.$modulo_interventi->id.'",
},
drop: {
title: "'.tr('Pianifica intervento').'",
url: globals.rootdir + "/add.php?id_module='.$modulo_interventi->id.'",
},
error: "'.tr('Errore durante la creazione degli eventi').'",
genericError: "'.tr('Errore').'",
genericWarning: "'.tr('Attenzione').'",
informazioni_aggiuntive: '.intval(setting('Visualizza informazioni aggiuntive sul calendario')).',
};
function aggiorna_contatore(counter_id) {
let counter = $(counter_id);
let dropdown = counter.find(".dropdown-menu");
let selected = dropdown.find("input:checked").length;
let total = dropdown.find("input").length;
counter.find(".selected_counter").html(selected);
counter.find(".total_counter").html(total);
let object = counter.find(".counter_object");
if (total === 0) {
object.addClass("btn-primary disabled");
return;
} else {
object.removeClass("btn-primary disabled");
}
if (selected === total) {
object.removeClass("btn-warning btn-danger").addClass("btn-success");
} else if (selected === 0) {
object.removeClass("btn-warning btn-success").addClass("btn-danger");
} else {
object.removeClass("btn-success btn-danger").addClass("btn-warning");
}
}
function carica_interventi_da_pianificare(mese) {
if (mese === undefined) {
// Seleziono il mese corrente per gli interventi da pianificare
let date = new Date();
date.setDate(date.getDate());
//Note: January is 0, February is 1, and so on.
mese = ("0" + (date.getMonth() + 1)).slice(-2) + date.getFullYear();
$("#mese-promemoria option[value=" + mese + "]").attr("selected", "selected").trigger("change");
}
$("#elenco-promemoria").html("<center><br><br><i class=\"fa fa-refresh fa-spin fa-2x fa-fw\"></i></center>");
$.get(globals.dashboard.load_url, {
op: "carica_interventi",
mese: mese
}).done(function (data) {
$("#elenco-promemoria").html(data);
$("#external-events .fc-event").each(function () {
new Draggable( this, {
create: false,
revert: true,
eventData: {
title: $.trim($(this).text()),
stick: false
}
} );
});
});
}
$(document).ready(function () {
// Aggiornamento contatori iniziale
aggiorna_contatore("#dashboard_stati");
aggiorna_contatore("#dashboard_tipi");
aggiorna_contatore("#dashboard_tecnici");
aggiorna_contatore("#dashboard_zone");
// Selezione di uno stato intervento
$(".dashboard_stato").click(function (event) {
let id = $(this).val();
session_set_array("dashboard,idstatiintervento", id).then(function () {
aggiorna_contatore("#dashboard_stati");
globals.dashboard.calendar.refetchEvents();
});
});
// Selezione di un tipo intervento
$(".dashboard_tipo").click(function (event) {
let id = $(this).val();
session_set_array("dashboard,idtipiintervento", id).then(function () {
aggiorna_contatore("#dashboard_tipi");
globals.dashboard.calendar.refetchEvents();
});
});
// Selezione di un tecnico
$(".dashboard_tecnico").click(function (event) {
let id = $(this).val();
session_set_array("dashboard,idtecnici", id).then(function () {
aggiorna_contatore("#dashboard_tecnici");
globals.dashboard.calendar.refetchEvents();
});
});
// Selezione di una zona
$(".dashboard_zona").click(function (event) {
let id = $(this).val();
session_set_array("dashboard,idzone", id).then(function () {
aggiorna_contatore("#dashboard_zone");
globals.dashboard.calendar.refetchEvents();
});
});
// Selezione di tutti gli elementi
$(".seleziona_tutto").click(function () {
$(this).closest("ul").find("input:not(:checked)").each(function () {
$(this).click();
});
});
// Deselezione di tutti gli elementi
$(".deseleziona_tutto").click(function () {
$(this).closest("ul").find("input:checked").each(function () {
$(this).click();
});
});
$("#mese-promemoria").change(function () {
let mese = $(this).val();
carica_interventi_da_pianificare(mese);
});
// Caricamento interventi da pianificare
carica_interventi_da_pianificare();
// Creazione del calendario
create_calendar();
});
function create_calendar() {
var calendarElement = document.getElementById("calendar");
var clickCnt = 0;
var calendar = new FullCalendar.Calendar(calendarElement, {
/* locales: allLocales, */
locale: globals.locale,
slotEventOverlap: false,
weekNumbers: true,
weekText: "W",
nowIndicator: true,
//height: "auto",
//aspectRatio: 1.8,
defaultTimedEventDuration: "00:15",
stickyHeaderDates: true,
expandRows: true,
//themeSystem: "bootstrap5",
showNonCurrentDates: false,
dayMaxEvents: false,
eventMaxStack: 4,
schedulerLicenseKey: "GPL-My-Project-Is-Open-Source",
hiddenDays: globals.dashboard.show_sunday ? [] : [0],
headerToolbar: {
left: "prev,next today",
center: "title",
right: "dayGridMonth,timeGridWeek,timeGridDay,listWeek"
},
eventDisplay: "block",
timeFormat: globals.dashboard.timeFormat,
slotLabelFormat: globals.dashboard.timeFormat,
slotDuration: "00:15:00",
snapDuration: globals.snapDuration,
initialView: globals.dashboard.style,
slotMinTime: globals.dashboard.start_time,
slotMaxTime: globals.dashboard.end_time,
lazyFetching: true,
selectMirror: true,
eventLimit: false, // allow "more" link when too many events
allDaySlot: globals.dashboard.informazioni_aggiuntive,
showNonCurrentDates: true,
loading: function (isLoading, view) {
if (isLoading) {
$("#tiny-loader").show();
} else {
$("#tiny-loader").hide();
}
},
droppable: globals.dashboard.write_permission,
drop: function (info) {
let date = info.date;
let data = moment(date).format("YYYY-MM-DD");
let ora_dal = moment(date).format("HH:mm");
let ora_al = moment(date).add(1, "hours").format("HH:mm");
let ref = info.draggedEl.dataset.ref;
let name;
if (ref === "promemoria") {
name = "idcontratto_riga";
} else {
name = "id_intervento";
}
openModal(globals.dashboard.drop.title, globals.dashboard.drop.url + "&data=" + data + "&orario_inizio=" + ora_dal + "&orario_fine=" + ora_al + "&ref=dashboard&idcontratto=" + info.draggedEl.dataset.idcontratto + "&" + name + "=" + info.draggedEl.dataset.id + "&id_tecnico=" + info.draggedEl.dataset.id_tecnico);
// Ricaricamento dei dati alla chiusura del modal
$("#modals > div").on("hidden.bs.modal", function () {
globals.dashboard.calendar.refetchEvents();
let mese = $("#mese-promemoria").val();
carica_interventi_da_pianificare(mese);
});
},
eventReceive: function(info){
info.revert();
},
selectable: globals.dashboard.write_permission,
select: function (info) { // info
let start = info.start;
let end = info.end;
let data = moment(start).format("YYYY-MM-DD");
let data_fine = moment(end).format("YYYY-MM-DD");
let orario_inizio = moment(start).format("HH:mm");
let orario_fine = moment(end).format("HH:mm");
// Fix selezione di un giorno avanti per vista mensile
if (globals.dashboard.calendar.view == "dayGridMonth") {
data_fine = moment(end).subtract(1, "days").format("YYYY-MM-DD");
}
openModal(globals.dashboard.select.title, globals.dashboard.select.url + "&ref=dashboard&data=" + data + "&data_fine=" + data_fine + "&orario_inizio=" + orario_inizio + "&orario_fine=" + orario_fine);
},
editable: globals.dashboard.write_permission,
eventDrop: function (info) {// info
let event = info.event;
if (event.allDay !== true) {
let start = event.start;
let end = (event.end!=null ? event.end : event.start);
$.post(globals.dashboard.load_url, {
op: "modifica_intervento",
id: event.id,
idintervento: event.extendedProps.idintervento,
timeStart: moment(start).format("YYYY-MM-DD HH:mm"),
timeEnd: moment(end).format("YYYY-MM-DD HH:mm")
}, function (data, responseType) {
data = $.trim(data);
if (responseType === "success" && data !== "ok") {
swal(globals.dashboard.genericWarning, data, "warning");
} else if (responseType !== "success") {
swal(globals.dashboard.genericError, data, "error");
}
if (data !== "ok") {
info.revert();
}
});
} else {
info.revert();
}
},
eventResize: function (info) {
let event = info.event;
let start = event.start;
let end = (event.end!=null ? event.end : event.start);
$.post(globals.dashboard.load_url, {
op: "modifica_intervento",
id: event.id,
idintervento: event.extendedProps.idintervento,
timeStart: moment(start).format("YYYY-MM-DD HH:mm"),
timeEnd: moment(end).format("YYYY-MM-DD HH:mm")
}, function (data, responseType) {
data = $.trim(data);
if (responseType === "success" && data !== "ok") {
swal(globals.dashboard.genericWarning, data, "warning");
} else if (responseType !== "success") {
swal(globals.dashboard.genericError, data, "error");
}
if (data !== "ok") {
info.revert();
}
});
},';
if (isMobile() && setting('Utilizzare i tooltip sul calendario')) {
echo '
eventClick: function(info) {
let link = info.event.extendedProps.link;
let element = $(this);
clickCnt++;
if (clickCnt === 1) {
oneClickTimer = setTimeout(function() {
clickCnt = 0;
element.trigger("mouseenter");
}, 400);
} else if (clickCnt === 2) {
clearTimeout(oneClickTimer);
clickCnt = 0;
location.href = link;
}
},';
} else {
echo '
eventClick: function(info) {
if (info.event.extendedProps.link !== undefined) {
info.jsEvent.preventDefault();
location.href = info.event.extendedProps.link;
}
},';
}
echo '
eventContent: function (info) {
return { html: info.event.title };
},
eventDidMount: function(info){
let element = $(info.el);
let id_record = info.event.extendedProps.idintervento;
if (globals.dashboard.tooltip == 1 && element[0].childElementCount > 0 ) {
element.tooltipster({
content: globals.translations.loading + "...",
animation: "grow",
updateAnimation: "grow",
contentAsHTML: true,
hideOnClick: true,
speed: 200,
delay: 300,
maxWidth: 400,
theme: "tooltipster-shadow",
touchDevices: true,
trigger: "hover",
position: "left",
functionBefore: function (instance, helper) {
let $origin = $(helper.origin);
if ($origin.data("loaded") !== true) {
$.post(globals.dashboard.load_url, {
op: "tooltip_info",
id_record: id_record,
allDay: info.event.allDay,
}, function (data, response) {
if (data !== "") {
instance.content(data);
$origin.data("loaded", true);
}
});
}
}
});
}
},
eventSources: [
{
url: globals.dashboard.load_url,
type: "POST",
extraParams: {
op: "interventi_periodo",
id_module: "'.$id_module.'"
},
failure: function () {
swal(globals.dashboard.genericError, globals.dashboard.error, "error");
}
},
{
url: globals.dashboard.load_url,
method: "POST",
extraParams: {
op: "calendario_eventi",
id_module: "'.$id_module.'"
},
failure: function () {
swal(globals.dashboard.genericError, globals.dashboard.error, "error");
}
}
]
});
calendar.addEvent({
daysOfWeek: "'.implode(',', $non_working_days).'",
display: "background",
overlap: true,
allDay: true
});
calendar.render();
globals.dashboard.calendar = calendar;
}
</script>';