Ci joint les documents demandés :
Déclaration de l’objet Externe :
Script de l’objet externe :
CrbGdrResaAgendaDir.display = function(params) {
this.appendCSSIncludes(HTMLTool.fullcalendarCSS());
this.appendJSIncludes(HTMLTool.fullcalendarJS(this.getGrant().getLang()));
// le service est passé en paramètre au SCRIPT de génération du calendrier pour pouvoir filtrer au moment du search
var service=this.getGrant().getParameter(“CRB_SERVICE”);
return HTMLTool.border(“<div id="resacalendar">”) +
HTMLTool.jsBlock(
“onload_functions.push(function() {” +
this.getName() + “.display('”+service+“',"” + HTMLTool.getFormURL(“CrbGdrResa”, “agenda_CrbGdrResa”, “ROWID”, true) + “");” +
“});”
);
};
Ressource SCRIPT de l’objet externe :
//-----------------------------------------------------------
// Client side JavaScript for agenda des réservations
//-----------------------------------------------------------
CrbGdrResaAgendaDir = (function($) {
var $s, debug = false;
function display(service,url) {
$s = new Simplicite.Ajax();
var resa = $s.getBusinessObject("CrbGdrResa", "agenda_CrbGdrResa");
$j("#resacalendar").fullCalendar({
customButtons: {
addEventButton: {
text: "Créer une réservation",
click: function() {
if (typeof parent.$ui !== "undefined")
parent.$ui.displayForm(null, "CrbGdrResa", "", { nav: "add" });
}
}
},
header: {
left: "prev,next today",
center: "title,addEventButton",
right: "month,agendaWeek,agendaDay"
},
timezone: "local",
defaultView: "agendaWeek",
groupByDateAndResource: true,
editable: true,
firstDay: 1,
minTime: "06:00:00",
maxTime: "22:00:00",
businessHours: {
dow: [ 1, 2, 3, 4, 5 ],
start: '08:00',
end: '20:00'
},
dayClick: function(date, jsEvent, view) {
alert('Clicked on: ' + date.format());
parent.$ui.displayForm(null, "CrbGdrResa", "", { nav: "add" });
},
eventClick: function(e) {
if (debug) console.log("Réservations " + e.id + " clicked");
if (typeof parent.$ui !== "undefined")
parent.$ui.displayForm(null, "CrbGdrResa", e.id, { nav: "add" });
else
document.location.replace(url.replace(/ROWID/, e.id));
},
eventResize: function(e) {
var end = e.end.format( "YYYY-MM-DD HH:mm:ss");
if (debug) console.log("Réservation " + e.id + " redized to " + end);
e.data.gdrReasaDtFin = end;
resa.update(function() {
e.data = resa.item;
if (debug) console.debug("Réservation " + e.data.gdrResaNum + " date end updated to " + s);
}, e.data);
},
eventDrop: function(e) {
var s = e.start.format( "YYYY-MM-DD HH:mm:ss");
var end = e.end.format( "YYYY-MM-DD HH:mm:ss");
if (debug) console.log("Réservations " + e.id + " dropped to " + s);
e.data.gdrResaDtDebut = s;
e.data.gdrResaDtFin = end;
resa.update(function() {
e.data = resa.item;
if (debug) console.debug("Réservations " + e.data.gdrResaNum + " delivery date updated to " + s);
}, e.data);
},
events: function(start, end, tz, callback) {
var f = "YYYY-MM-DD HH:mm:ss Z";
var dmin = start.format(f);
var dmax = end.format(f);
if (debug) console.debug("Calendar view range = " + dmin + " to " + dmax);
resa.setFieldValue("gdrResaSite_fk",1);
resa.search(function() {
if (debug) console.debug(resa.list.length + " réservations trouvées pour "+service+" entre " + dmin + " et " + dmax);
var evts = [];
for (var i = 0; i < resa.list.length; i++) {
var item = resa.list[i];
if (item.gdrResaDtDebut !== ""&&item.gdrResaRessource_fk__gdrRessourceTypeAff=="SERVICE"&&item.gdrResaRessource_fk__gdrRessourceAff.includes(service)) { // ZZZ When using intervals empty values are included !
var s = moment(item.gdrResaDtDebut);
var e = moment(item.gdrResaDtFin);
evts.push({
id: item.row_id,
data: item,
title: item.gdrResaDemandeur + "\n" + item.gdrResaSite_fk__gdrSiteLibelleCourt + "\n " +
item.gdrResaType_fk__gdrTypeLibelle + " : "+item.gdrResaRessource_fk__gdrRessourceLibelle,
start: s,
end: e,
editable: item.gdrResaStatut == "VALIDE" || item.gdrResaStatut == "ATTENTE_VALIDATION",
durationEditable: false,
color: item.gdrResaType_fk__gdrTypeLibelle == "Voiture" ? "green" : (item.gdrResaType_fk__gdrTypeLibelle == "Bureau" ? "blue" : "red"),
borderColor: "lightgray",
textColor: "white"
});
}
}
if (debug) console.debug(evts.length + " resa displayed between " + dmin + " and " + dmax);
callback(evts);
}, { gdrResaDtDebut: dmin + ";" + dmax, gdrResaStatut: "VALIDE;ATTENTE_VALIDATION;REFUSE" }, { inlineDocs: false });
}
});
}
return { display: display};
})(jQuery);
Vue :
Zones :