Update opolka/ScoDoc from ScoDoc/ScoDoc #2

Merged
opolka merged 1272 commits from ScoDoc/ScoDoc:master into master 2024-05-27 09:11:04 +02:00
15 changed files with 391 additions and 1770 deletions
Showing only changes of commit a40768e33b - Show all commits

View File

@ -53,34 +53,6 @@ Object.defineProperty(Array.prototype, "reversed", {
// <= Gestion des dates => // <= Gestion des dates =>
Object.defineProperty(Date.prototype, "isBetween", {
/**
* Vérifie si la date est comprise dans une période avec une précision et une inclusivité optionnelles
* @param {Date} deb - La date de début de la période
* @param {Date} fin - La date de fin de la période
* @param {String} precision - La précision pour la comparaison (année, mois, jour, etc.)
* @param {String} bornes - L'inclusivité/exclusivité de la comparaison ("[]", "()", "[)", "(]")
*/
value: function (deb, fin, precision, bornes = "[]") {
// Ajuste la date actuelle, la date de début et la date de fin à la précision spécifiée
const thisPrecision = this.toPrecision(precision);
const debPrecision = deb.toPrecision(precision);
const finPrecision = fin.toPrecision(precision);
// Vérifie les bornes en fonction de l'inclusivité/exclusivité spécifiée dans 'bornes'
const check_deb =
bornes[0] === "("
? thisPrecision > debPrecision
: thisPrecision >= debPrecision;
const check_fin =
bornes[1] === ")"
? finPrecision > thisPrecision
: finPrecision >= thisPrecision;
return check_deb && check_fin;
},
});
Object.defineProperty(Date.prototype, "toPrecision", { Object.defineProperty(Date.prototype, "toPrecision", {
/** /**
* Ajuste la date à la précision donnée. * Ajuste la date à la précision donnée.
@ -128,12 +100,12 @@ Object.defineProperty(Date.prototype, "toPrecision", {
Object.defineProperty(Date.prototype, "isBefore", { Object.defineProperty(Date.prototype, "isBefore", {
value: function (date) { value: function (date) {
return this < date; return this.valueOf() < date.valueOf();
}, },
}); });
Object.defineProperty(Date.prototype, "isAfter", { Object.defineProperty(Date.prototype, "isAfter", {
value: function (date) { value: function (date) {
return this > date; return this.valueOf() > date.valueOf();
}, },
}); });
@ -144,11 +116,42 @@ Object.defineProperty(Date.prototype, "isSame", {
* @returns boolean * @returns boolean
*/ */
value: function (date) { value: function (date) {
return this == date; return this.valueOf() == date.valueOf();
},
});
Object.defineProperty(Date.prototype, "isBetween", {
/**
* Vérifie si la date est comprise dans une période avec une précision et une inclusivité optionnelles
* @param {Date} deb - La date de début de la période
* @param {Date} fin - La date de fin de la période
* @param {String} precision - La précision pour la comparaison (année, mois, jour, etc.)
* @param {String} bornes - L'inclusivité/exclusivité de la comparaison ("[]", "()", "[)", "(]")
*/
value: function (deb, fin, precision, bornes = "[]") {
// Ajuste la date actuelle, la date de début et la date de fin à la précision spécifiée
const thisPrecision = this.toPrecision(precision);
const debPrecision = deb.toPrecision(precision);
const finPrecision = fin.toPrecision(precision);
// Vérifie les bornes en fonction de l'inclusivité/exclusivité spécifiée dans 'bornes'
const check_deb =
bornes[0] === "("
? thisPrecision > debPrecision
: thisPrecision >= debPrecision;
const check_fin =
bornes[1] === ")"
? finPrecision > thisPrecision
: finPrecision >= thisPrecision;
return check_deb && check_fin;
}, },
}); });
Object.defineProperty(Date.prototype, "toIsoUtcString", { Object.defineProperty(Date.prototype, "toIsoUtcString", {
/**
* @returns date au format iso utc (yyyy-mm-ddThh:MM±oo:oo:oo)
*/
value: function () { value: function () {
const date = this; const date = this;
var tzo = -date.getTimezoneOffset(), var tzo = -date.getTimezoneOffset(),
@ -177,6 +180,231 @@ Object.defineProperty(Date.prototype, "toIsoUtcString", {
}, },
}); });
Object.defineProperty(Date.prototype, "clone", {
/**
* @returns Retourne une copie de la date (copie non liée)
*/
value: function () {
return structuredClone(this);
},
});
Object.defineProperty(Date.prototype, "format", {
value: function (formatString) {
switch (formatString) {
case "DD/MM/Y HH:mm":
return this.toLocaleString("fr-FR", {
day: "2-digit",
month: "2-digit",
year: "2-digit",
hour: "2-digit",
minute: "2-digit",
hour12: false,
});
case "DD/MM/YYYY HH:mm":
return this.toLocaleString("fr-FR", {
day: "2-digit",
month: "2-digit",
year: "numeric",
hour: "2-digit",
minute: "2-digit",
hour12: false,
});
case "YYYY-MM-DDTHH:mm":
let iso = this.toIsoUtcString();
// slice : YYYY-MM-DDTHH
// slice + 3 : YYYY-MM-DDTHH:mm
return iso.slice(0, iso.indexOf(":") + 3);
default:
return this.toIsoUtcString();
}
},
});
Object.defineProperty(Date.prototype, "add", {
/**
* Ajoute une valeur spécifiée à un élément de la date.
* @param {number} value - La valeur à ajouter.
* @param {string} type - Le type de la valeur (year, month, day, hours, minutes, seconds).
*/
value: function (value, type) {
switch (type) {
case "years":
this.setFullYear(this.getFullYear() + value);
break;
case "months":
this.setMonth(this.getMonth() + value);
break;
case "days":
this.setDate(this.getDate() + value);
break;
case "hours":
this.setHours(this.getHours() + value);
break;
case "minutes":
this.setMinutes(this.getMinutes() + value);
break;
case "seconds":
this.setSeconds(this.getSeconds() + value);
break;
default:
throw new Error(
`Invalid type for adding to date | type : ${type} value : ${value}`
);
}
return this; // Return the modified date
},
});
Object.defineProperty(Date.prototype, "startOf", {
/**
* Ajuste la date à la plus petite valeur pour la précision donnée.
* @param {string} precision - La précision souhaitée (year, month, day, hours, minutes, seconds, milliseconds).
* @returns {Date} - Une nouvelle date ajustée.
*/
value: function (precision) {
const newDate = this.clone();
switch (precision) {
case "year":
newDate.setMonth(0);
case "month":
newDate.setDate(1);
case "day":
newDate.setHours(0);
case "hours":
newDate.setMinutes(0);
case "minutes":
newDate.setSeconds(0);
case "seconds":
newDate.setMilliseconds(0);
break;
case "milliseconds":
break;
default:
throw new Error("Invalid precision for startOf function");
}
return newDate;
},
});
Object.defineProperty(Date.prototype, "endOf", {
/**
* Ajuste la date à la plus grande valeur pour la précision donnée.
* @param {string} precision - La précision souhaitée (year, month, day, hours, minutes, seconds, milliseconds).
* @returns {Date} - Une nouvelle date ajustée.
*/
value: function (precision) {
const newDate = this.clone();
switch (precision) {
case "year":
newDate.setMonth(11); // Décembre est le 11ème mois (0-indexé)
case "month":
newDate.setDate(0); // Le jour 0 du mois suivant est le dernier jour du mois courant
newDate.setMonth(newDate.getMonth() + 1);
case "day":
newDate.setHours(23); // 23 heures est la dernière heure de la journée
case "hours":
newDate.setMinutes(59); // 59 minutes est la dernière minute de l'heure
case "minutes":
newDate.setSeconds(59); // 59 secondes est la dernière seconde de la minute
case "seconds":
newDate.setMilliseconds(999); // 999 millisecondes est la dernière milliseconde de la seconde
break;
case "milliseconds":
// Rien à faire pour les millisecondes
break;
default:
throw new Error("Invalid precision for endOf function");
}
return newDate;
},
});
class Duration {
/**
* Constructeur de la classe Duration.
* @param {Date} start - La date de début de la période.
* @param {Date} end - La date de fin de la période.
*/
constructor(start, end) {
this.start = start; // Stocke la date de début.
this.end = end; // Stocke la date de fin.
this.duration = end - start; // Calcule la durée en millisecondes entre les deux dates.
}
/**
* Calcule le nombre d'années entre les deux dates et arrondit le résultat à quatre décimales.
* @return {number} Le nombre d'années arrondi à quatre décimales.
*/
get years() {
const startYear = this.start.getFullYear(); // Obtient l'année de la date de début.
const endYear = this.end.getFullYear(); // Obtient l'année de la date de fin.
// Calcule la différence en années et arrondit à quatre décimales.
return parseFloat((endYear - startYear).toFixed(4));
}
/**
* Calcule le nombre de mois entre les deux dates, en tenant compte des années et des jours, et arrondit le résultat à quatre décimales.
* @return {number} Le nombre de mois arrondi à quatre décimales.
*/
get months() {
const years = this.years; // Nombre d'années complètes.
// Calcule la différence en mois, en ajoutant la différence en jours divisée par 30 pour une approximation.
const months =
years * 12 +
(this.end.getMonth() - this.start.getMonth()) +
(this.end.getDate() - this.start.getDate()) / 30;
// Arrondit à quatre décimales.
return parseFloat(months.toFixed(4));
}
/**
* Calcule le nombre de jours entre les deux dates et arrondit le résultat à quatre décimales.
* @return {number} Le nombre de jours arrondi à quatre décimales.
*/
get days() {
// Convertit la durée en millisecondes en jours et arrondit à quatre décimales.
return parseFloat((this.duration / (24 * 60 * 60 * 1000)).toFixed(4));
}
/**
* Calcule le nombre d'heures entre les deux dates et arrondit le résultat à quatre décimales.
* @return {number} Le nombre d'heures arrondi à quatre décimales.
*/
get hours() {
// Convertit la durée en millisecondes en heures et arrondit à quatre décimales.
return parseFloat((this.duration / (60 * 60 * 1000)).toFixed(4));
}
/**
* Calcule le nombre de minutes entre les deux dates et arrondit le résultat à quatre décimales.
* @return {number} Le nombre de minutes arrondi à quatre décimales.
*/
get minutes() {
// Convertit la durée en millisecondes en minutes et arrondit à quatre décimales.
return parseFloat((this.duration / (60 * 1000)).toFixed(4));
}
/**
* Calcule le nombre de secondes entre les deux dates et arrondit le résultat à quatre décimales.
* @return {number} Le nombre de secondes arrondi à quatre décimales.
*/
get seconds() {
// Convertit la durée en millisecondes en secondes et arrondit à quatre décimales.
return parseFloat((this.duration / 1000).toFixed(4));
}
/**
* Obtient le nombre de millisecondes entre les deux dates et arrondit le résultat à quatre décimales.
* @return {number} Le nombre de millisecondes arrondi à quatre décimales.
*/
get milliseconds() {
// Arrondit la durée totale en millisecondes à quatre décimales.
return parseFloat(this.duration.toFixed(4));
}
}
/** /**
* Ajout des évents sur les boutons d'assiduité * Ajout des évents sur les boutons d'assiduité
* @param {Document | HTMLFieldSetElement} parent par défaut le document, un field sinon * @param {Document | HTMLFieldSetElement} parent par défaut le document, un field sinon
@ -753,7 +981,6 @@ function verifyDateInSemester() {
const date = getDate(); const date = getDate();
const periodSemester = getFormSemestreDates(); const periodSemester = getFormSemestreDates();
return date.isBetween(periodSemester.deb, periodSemester.fin, "[]"); return date.isBetween(periodSemester.deb, periodSemester.fin, "[]");
} }
@ -793,8 +1020,8 @@ function getAssiduitesOnDateChange() {
* @param {String} separator le séparateur de la date intelligible (01/01/2000 {separtor} 10:00) * @param {String} separator le séparateur de la date intelligible (01/01/2000 {separtor} 10:00)
* @returns {String} la date intelligible * @returns {String} la date intelligible
*/ */
function formatDateModal(str) { function formatDateModal(str, separator = " ") {
return new Date(str).toLocaleString("fr-FR"); return new Date(str).format("DD/MM/Y HH:mm").replace(" ", separator);
} }
/** /**
@ -1197,9 +1424,10 @@ function getAssiduitesConflict(etudid, periode) {
return etudAssiduites.filter((assi) => { return etudAssiduites.filter((assi) => {
const interval = { const interval = {
deb: new Date(assi.date_debut), deb: new Date(assi.date_debut),
fin: new Date(assi.date_debut), fin: new Date(assi.date_fin),
}; };
return hasTimeConflict(periode, interval); const test = hasTimeConflict(periode, interval);
return test;
}); });
} }
@ -1506,7 +1734,6 @@ function insertEtudRow(etud, index, output = false) {
date_fin: null, date_fin: null,
prevAssiduites: prevAssiduite, prevAssiduites: prevAssiduite,
}; };
if (conflict.length > 0) { if (conflict.length > 0) {
assiduite.etatAssiduite = conflict[0].etat; assiduite.etatAssiduite = conflict[0].etat;
@ -1742,9 +1969,9 @@ function getJustificatifFromPeriod(date, etudid, update) {
url: url:
getUrl() + getUrl() +
`/api/justificatifs/${etudid}/query?date_debut=${date.deb `/api/justificatifs/${etudid}/query?date_debut=${date.deb
.add(1, "s") .add(1, "seconds")
.toIsoUtcString()}&date_fin=${date.fin .toIsoUtcString()}&date_fin=${date.fin
.subtract(1, "s") .add(-1, "seconds")
.toIsoUtcString()}`, .toIsoUtcString()}`,
success: (data) => { success: (data) => {
update(data); update(data);

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -101,8 +101,7 @@
return; return;
} }
countAssiduites(date_debut.toIsoUtcString(), date_fin.toIsoUtcString())
countAssiduites(date_debut.toIsoUtcString()(), date_fin.toIsoUtcString()())
} }

View File

@ -111,10 +111,11 @@
<script> <script>
function getDaysBetweenDates(start, end) { function getDaysBetweenDates(start, end) {
let now = moment(start); let now = new Date(start);
end = new Date(end);
let dates = []; let dates = [];
while (now.isSameOrBefore(end)) { while (now.isBefore(end) || now.isSame(end)) {
dates.push(now.clone()); dates.push(now.clone());
now.add(1, "days"); now.add(1, "days");
} }
@ -135,7 +136,6 @@
datesByMonth[month].push(date); datesByMonth[month].push(date);
}); });
console.log(Object.keys(datesByMonth))
return datesByMonth; return datesByMonth;
} }
@ -164,7 +164,7 @@
) )
}); });
assiduitiesByDay[month][date.format("YYYY-MM-DD")] = { assiduitiesByDay[month][date.toLocaleDateString("en-US")] = {
assiduites: dayAssiduities, assiduites: dayAssiduities,
justificatifs: dayJustificatifs justificatifs: dayJustificatifs
}; };
@ -201,35 +201,20 @@
calendar.innerHTML = "" calendar.innerHTML = ""
const days = { const days = {
Mon: "Lun", 1: "Lun",
Tue: "Mar", 2: "Mar",
Wed: "Mer", 3: "Mer",
Thu: "Jeu", 4: "Jeu",
Fri: "Ven", 5: "Ven",
Sat: "Sam", 6: "Sam",
Sun: "Dim", 0: "Dim",
};
const months = {
January: "Jan.",
February: "Fev.",
March: "Mar.",
April: "Avr.",
May: "Mai",
June: "Juin",
July: "Juil.",
August: "Août",
September: "Sep.",
October: "Oct.",
November: "Nov.",
December: "Déc.",
}; };
Object.keys(assiduitiesByDay).forEach((month) => { Object.keys(assiduitiesByDay).forEach((month) => {
const monthEl = document.createElement('div') const monthEl = document.createElement('div')
monthEl.classList.add("month") monthEl.classList.add("month")
const title = document.createElement('h2'); const title = document.createElement('h2');
title.textContent = `${months[month]}`; title.textContent = `${month.capitalize()}`;
monthEl.appendChild(title) monthEl.appendChild(title)
const daysEl = document.createElement('div') const daysEl = document.createElement('div')
@ -252,11 +237,11 @@
est_just = "est_just invalide"; est_just = "est_just invalide";
} }
const momentDate = new Date(date); const momentDate = new Date(date);
let dayOfMonth = momentDate.format("D"); let dayOfMonth = momentDate.getDate();
let dayOfWeek = momentDate.format("ddd"); let dayOfWeek = momentDate.getDay();
dayOfWeek = days[dayOfWeek]; dayOfWeek = days[dayOfWeek];
if (nonWorkdays.includes(dayOfWeek.toLowerCase())) color = "nonwork"; if (nonWorkdays.includes(dayOfWeek.toLowerCase())) color = "nonwork";
const day = document.createElement('div'); const day = document.createElement('div');

View File

@ -41,7 +41,7 @@
if (defaultDates != null) { if (defaultDates != null) {
defaultDates.forEach((dateString) => { defaultDates.forEach((dateString) => {
d = moment(dateString).weekday(); d = new Date(dateString).getDay();
if (verifyNonWorkDays(d, nonWorkDays)) return; if (verifyNonWorkDays(d, nonWorkDays)) return;

View File

@ -5,8 +5,8 @@
* @returns {String} un déplacement par rapport à la gauche en % * @returns {String} un déplacement par rapport à la gauche en %
*/ */
function getLeftPosition(start) { function getLeftPosition(start) {
const startTime = new moment.tz(start, TIMEZONE); const startTime = new Date(start);
const startMins = (startTime.hours() - 8) * 60 + startTime.minutes(); const startMins = (startTime.getHours() - 8) * 60 + startTime.getMinutes();
return (startMins / (18 * 60 - 8 * 60)) * 100 + "%"; return (startMins / (18 * 60 - 8 * 60)) * 100 + "%";
} }
/** /**
@ -21,8 +21,8 @@
return a.start < b.end && a.end > b.start; return a.start < b.end && a.end > b.start;
}; };
const startTime = new moment.tz(start, TIMEZONE); const startTime = new Date(start);
const endTime = new moment.tz(end, TIMEZONE); const endTime = new Date(end);
const assiduiteDuration = { start: startTime, end: endTime }; const assiduiteDuration = { start: startTime, end: endTime };
let position = 0; let position = 0;
@ -31,8 +31,8 @@
while (hasOverlap) { while (hasOverlap) {
hasOverlap = false; hasOverlap = false;
Array.from(container.children).some((el) => { Array.from(container.children).some((el) => {
const elStart = new moment.tz(el.getAttribute("data-start")); const elStart = new Date(el.getAttribute("data-start"));
const elEnd = new moment.tz(el.getAttribute("data-end")); const elEnd = new Date(el.getAttribute("data-end"));
const elDuration = { start: elStart, end: elEnd }; const elDuration = { start: elStart, end: elEnd };
if (overlaps(assiduiteDuration, elDuration)) { if (overlaps(assiduiteDuration, elDuration)) {
@ -71,8 +71,8 @@
* @returns {String} la taille en % * @returns {String} la taille en %
*/ */
function getWidth(start, end) { function getWidth(start, end) {
const startTime = new moment.tz(start, TIMEZONE); const startTime = new Date(start);
const endTime = new moment.tz(end, TIMEZONE); const endTime = new Date(end);
const duration = (endTime - startTime) / 1000 / 60; const duration = (endTime - startTime) / 1000 / 60;
@ -259,10 +259,10 @@
const separatorTime = document.getElementById("promptTime").value; const separatorTime = document.getElementById("promptTime").value;
const dateString = const dateString =
document.querySelector("#tl_date").value + `T${separatorTime}`; document.querySelector("#tl_date").value + `T${separatorTime}`;
const separtorDate = new moment.tz(dateString, TIMEZONE); const separtorDate = new Date(dateString);
const assiduite_debut = new moment.tz(this.selectedAssiduite.date_debut, TIMEZONE); const assiduite_debut = new Date(this.selectedAssiduite.date_debut);
const assiduite_fin = new moment.tz(this.selectedAssiduite.date_fin, TIMEZONE); const assiduite_fin = new Date(this.selectedAssiduite.date_fin);
if ( if (
separtorDate.isAfter(assiduite_debut) && separtorDate.isAfter(assiduite_debut) &&
@ -270,14 +270,14 @@
) { ) {
const assiduite_avant = { const assiduite_avant = {
etat: this.selectedAssiduite.etat, etat: this.selectedAssiduite.etat,
date_debut: assiduite_debut.format(), date_debut: assiduite_debut.toIsoUtcString()(),
date_fin: separtorDate.format(), date_fin: separtorDate.toIsoUtcString()(),
}; };
const assiduite_apres = { const assiduite_apres = {
etat: this.selectedAssiduite.etat, etat: this.selectedAssiduite.etat,
date_debut: separtorDate.format(), date_debut: separtorDate.toIsoUtcString()(),
date_fin: assiduite_fin.format(), date_fin: assiduite_fin.toIsoUtcString()(),
}; };
if (this.selectedAssiduite.moduleimpl_id) { if (this.selectedAssiduite.moduleimpl_id) {
@ -396,8 +396,8 @@
//Placement des assiduités sur la timeline //Placement des assiduités sur la timeline
this.list.forEach((assiduite) => { this.list.forEach((assiduite) => {
const period = { const period = {
deb: new moment.tz(assiduite.date_debut, TIMEZONE), deb: new Date(assiduite.date_debut),
fin: new moment.tz(assiduite.date_fin, TIMEZONE), fin: new Date(assiduite.date_fin),
}; };
if (!hasTimeConflict(period, this.interval)) { if (!hasTimeConflict(period, this.interval)) {
return; return;

View File

@ -274,17 +274,21 @@
<script> <script>
const assi_etat_defaut = "{{assi_etat_defaut}}"; const assi_etat_defaut = "{{assi_etat_defaut}}";
{% if scu.is_assiduites_module_forced(request.args.get('formsemestre_id', None)) %}
window.forceModule = "{{ forcer_module }}" window.forceModule = true;
window.forceModule = window.forceModule == "True" ? true : false {% else %}
window.forceModule = false;
{% endif %}
let colCount = 1; let colCount = 1;
let currentDate = "{{date}}"; let currentDate = "{{date}}";
if (currentDate == "") { if (currentDate == "") {
currentDate = moment().tz(TIMEZONE).format("YYYY-MM-DDTHH:mm"); currentDate = new Date();
currentDate = currentDate.format("YYYY-MM-DDTHH:mm");
} else { } else {
currentDate = moment(currentDate).tz(TIMEZONE).format("YYYY-MM-DDTHH:mm"); currentDate = new Date(currentDate);
currentDate = currentDate.format("YYYY-MM-DDTHH:mm");
} }
@ -432,7 +436,10 @@
const last = document.querySelector(`[col='${num}'] #dateEnd`); const last = document.querySelector(`[col='${num}'] #dateEnd`);
let date = undefined; let date = undefined;
if (last == undefined) { if (last == undefined) {
date = currentDate; date = new Date(currentDate);
const start = typeof mt_start !== 'undefined' ? mt_start : 0
date.setHours(start);
date = date.format("YYYY-MM-DDTHH:mm")
} else { } else {
date = last.value; date = last.value;
} }
@ -444,9 +451,10 @@
() => { () => {
const el = element.parentElement.querySelector("#dateEnd"); const el = element.parentElement.querySelector("#dateEnd");
const el2 = element.parentElement.querySelector("#dateStart"); const el2 = element.parentElement.querySelector("#dateStart");
el.value = moment(el2.valueAsDate).tz(TIMEZONE).utc() const newDate = new Date(el2.valueAsDate)
.add(2, "hours") .add(2, "hours");
.format("YYYY-MM-DDTHH:mm"); el.valueAsDate = newDate;
const colid = element.parentElement.parentElement.getAttribute('col'); const colid = element.parentElement.parentElement.getAttribute('col');
getAndUpdateCol(colid); getAndUpdateCol(colid);
}, },
@ -517,8 +525,8 @@
const inputDeb = col.querySelector("#dateStart").value; const inputDeb = col.querySelector("#dateStart").value;
const inputFin = col.querySelector("#dateEnd").value; const inputFin = col.querySelector("#dateEnd").value;
const moduleSelect = col.querySelector("#moduleimpl_select,.dynaSelect").value; const moduleSelect = col.querySelector("#moduleimpl_select,.dynaSelect").value;
const d_debut = moment(inputDeb).tz(TIMEZONE); const d_debut = new Date(inputDeb);
const d_fin = moment(inputFin).tz(TIMEZONE); const d_fin = new Date(inputFin);
if (inputDeb == "" || inputFin == "" || d_debut >= d_fin) { if (inputDeb == "" || inputFin == "" || d_debut >= d_fin) {
@ -547,14 +555,14 @@
} }
if (get) { if (get) {
getAssiduitesFromEtuds(false, d_debut.format(), d_fin.format()) getAssiduitesFromEtuds(false, d_debut.toIsoUtcString(), d_fin.toIsoUtcString())
return 0x0; return 0x0;
} }
return { return {
moduleimpl: moduleSelect, moduleimpl: moduleSelect,
deb: d_debut.format(), deb: d_debut.toIsoUtcString(),
fin: d_fin.format(), fin: d_fin.toIsoUtcString(),
} }
@ -568,8 +576,8 @@
const inputDeb = col.querySelector("#dateStart").value; const inputDeb = col.querySelector("#dateStart").value;
const inputFin = col.querySelector("#dateEnd").value; const inputFin = col.querySelector("#dateEnd").value;
const d_debut = moment(inputDeb).tz(TIMEZONE); const d_debut = new Date(inputDeb);
const d_fin = moment(inputFin).tz(TIMEZONE); const d_fin = new Date(inputFin);
const moduleimpl_id = col.querySelector("#moduleimpl_select,.dynaSelect").value; const moduleimpl_id = col.querySelector("#moduleimpl_select,.dynaSelect").value;
@ -715,15 +723,27 @@
assiduites[etudid].push(assiduite); assiduites[etudid].push(assiduite);
updateAllCol() updateAllCol()
launchToast(etudid, etat); launchToast(etudid, etat);
} else {
let error = data.errors[Object.keys(data.errors)[0]];
if (error.message.indexOf("Module") != -1) {
const html = `
<h3>Aucun module n'a été spécifié (préférence du semestre concerné)</h3>
`;
const div = document.createElement("div");
div.innerHTML = html;
openAlertModal("Erreur Module", div);
rbtn.checked = false;
} }
}
}) })
break; break;
case "conflit": case "conflit":
// Conflit, afficher résolveur // Conflit, afficher résolveur
const assiduitesList = assiduites[etudid]; const assiduitesList = assiduites[etudid];
const d_debut = new moment.tz(deb, TIMEZONE); const d_debut = new Date(deb);
const d_fin = new moment.tz(fin, TIMEZONE); const d_fin = new Date(fin);
const period = { const period = {
deb: deb, deb: deb,
@ -733,8 +753,8 @@
assiduites[etudid], assiduites[etudid],
period, period,
{ {
deb: new moment.tz(d_debut.startOf('day'), TIMEZONE), deb: d_debut.startOf('day'),
fin: new moment.tz(d_fin.endOf('day'), TIMEZONE), fin: d_fin.endOf('day'),
} }
); );
const update = () => { const update = () => {
@ -944,11 +964,24 @@
}) })
).done((c, e) => { ).done((c, e) => {
let error;
Object.keys(c[0].success).forEach((k) => { Object.keys(c[0].success).forEach((k) => {
const assiduite = createList[Number.parseInt(k)]; const assiduite = createList[Number.parseInt(k)];
assiduite["assiduite_id"] = c[0].success[k].message.assiduite_id; assiduite["assiduite_id"] = c[0].success[k].message.assiduite_id;
assiduites[assiduite.etudid].push(assiduite); assiduites[assiduite.etudid].push(assiduite);
}) })
if (c[0].errors.length > 0) {
error = c[0].errors[Object.keys(c[0].errors)[0]];
if (error.message.indexOf("Module") != -1) {
const html = `
<h3>Aucun module n'a été spécifié (préférence du semestre concerné)</h3>
`;
const div = document.createElement("div");
div.innerHTML = html;
openAlertModal("Erreur Module", div);
toCreate.length = 0
}
}
Object.keys(e[0].success).forEach((k) => { Object.keys(e[0].success).forEach((k) => {
const { etudid, assiduite_id, moduleimpl_id, etat } = editList[Number.parseInt(k)] const { etudid, assiduite_id, moduleimpl_id, etat } = editList[Number.parseInt(k)]
assiduites[etudid].map((a) => { assiduites[etudid].map((a) => {

View File

@ -19,10 +19,10 @@
if (isSingleEtud()) { if (isSingleEtud()) {
timeline.classList.add("single"); timeline.classList.add("single");
} }
const timelineDate = moment(dateiso).startOf("day"); const timelineDate = new Date(dateiso).startOf("day");
const dayStart = timelineDate.clone().add(mt_start, "hours"); const dayStart = timelineDate.clone().add(mt_start, "hours");
const dayEnd = timelineDate.clone().add(mt_end, "hours"); const dayEnd = timelineDate.clone().add(mt_end, "hours");
const dayDuration = moment.duration(dayEnd.diff(dayStart)).asMinutes(); const dayDuration = new Duration(dayStart, dayEnd).minutes;
timeline.appendChild(setMiniTick(timelineDate, dayStart, dayDuration)); timeline.appendChild(setMiniTick(timelineDate, dayStart, dayDuration));
@ -38,8 +38,8 @@
} }
array.forEach((assiduité) => { array.forEach((assiduité) => {
let startDate = moment(assiduité.date_debut); let startDate = new Date(assiduité.date_debut);
let endDate = moment(assiduité.date_fin); let endDate = new Date(assiduité.date_fin);
if (startDate.isBefore(dayStart)) { if (startDate.isBefore(dayStart)) {
startDate = dayEnd.clone().startOf("day").add(mt_start, "hours"); startDate = dayEnd.clone().startOf("day").add(mt_start, "hours");
@ -51,8 +51,8 @@
const block = document.createElement("div"); const block = document.createElement("div");
block.className = "mini-timeline-block"; block.className = "mini-timeline-block";
const duration = moment.duration(endDate.diff(startDate)).asMinutes(); const duration = new Duration(startDate, endDate).minutes;
const startOffset = moment.duration(startDate.diff(dayStart)).asMinutes(); const startOffset = new Duration(dayStart, startDate).minutes;
const leftPercentage = (startOffset / dayDuration) * 100; const leftPercentage = (startOffset / dayDuration) * 100;
const widthPercentage = (duration / dayDuration) * 100; const widthPercentage = (duration / dayDuration) * 100;
@ -61,8 +61,8 @@
if (assiduité.etat != "CRENEAU") { if (assiduité.etat != "CRENEAU") {
block.addEventListener("click", () => { block.addEventListener("click", () => {
let deb = startDate.hours() + startDate.minutes() / 60; let deb = startDate.getHours() + startDate.getMinutes() / 60;
let fin = endDate.hours() + endDate.minutes() / 60; let fin = endDate.getHours() + endDate.getMinutes() / 60;
deb = Math.max(mt_start, deb); deb = Math.max(mt_start, deb);
fin = Math.min(mt_end, fin); fin = Math.min(mt_end, fin);
@ -98,8 +98,8 @@
if (assiduité.etudid) { if (assiduité.etudid) {
getJustificatifFromPeriod( getJustificatifFromPeriod(
{ {
deb: new moment.tz(assiduité.date_debut, TIMEZONE), deb: new Date(assiduité.date_debut),
fin: new moment.tz(assiduité.date_fin, TIMEZONE), fin: new Date(assiduité.date_fin),
}, },
assiduité.etudid, assiduité.etudid,
action action
@ -184,8 +184,9 @@
} }
function setMiniTick(timelineDate, dayStart, dayDuration) { function setMiniTick(timelineDate, dayStart, dayDuration) {
const endDate = timelineDate.clone().set({ 'hour': 13, 'minute': 0 }); const endDate = timelineDate.clone().startOf("day");
const duration = moment.duration(endDate.diff(dayStart)).asMinutes(); endDate.setHours(13, 0);
const duration = new Duration(dayStart, endDate).minutes;
const widthPercentage = (duration / dayDuration) * 100; const widthPercentage = (duration / dayDuration) * 100;
const tick = document.createElement('span'); const tick = document.createElement('span');
tick.className = "mini_tick" tick.className = "mini_tick"

View File

@ -21,13 +21,9 @@
} }
function filterFormSemestres(semestres, dateIso) { function filterFormSemestres(semestres, dateIso) {
const date = new moment.tz( const date = new Date(dateIso);
dateIso,
TIMEZONE
);
semestres = semestres.filter((fm) => { semestres = semestres.filter((fm) => {
return date.isBetween(fm.date_debut_iso, fm.date_fin_iso, null, '[]') return date.isBetween(new Date(fm.date_debut_iso), new Date(fm.date_fin_iso), null, '[]');
}) })
return semestres; return semestres;

View File

@ -83,7 +83,7 @@
filterAssiduites.columns.forEach((k) => { filterAssiduites.columns.forEach((k) => {
const td = document.createElement('td'); const td = document.createElement('td');
if (k.indexOf('date') != -1) { if (k.indexOf('date') != -1) {
td.textContent = moment.tz(assiduite[k], TIMEZONE).format(`DD/MM/Y HH:mm`) td.textContent = new Date(assiduite[k]).format(`DD/MM/Y HH:mm`)
} else if (k.indexOf("module") != -1) { } else if (k.indexOf("module") != -1) {
td.textContent = getModuleImpl(assiduite); td.textContent = getModuleImpl(assiduite);
} else if (k.indexOf('est_just') != -1) { } else if (k.indexOf('est_just') != -1) {
@ -115,9 +115,9 @@
const user = getUser(data); const user = getUser(data);
const module = getModuleImpl(data); const module = getModuleImpl(data);
const date_debut = moment.tz(data.date_debut, TIMEZONE).format("DD/MM/YYYY HH:mm"); const date_debut = new Date(data.date_debut).format("DD/MM/YYYY HH:mm");
const date_fin = moment.tz(data.date_fin, TIMEZONE).format("DD/MM/YYYY HH:mm"); const date_fin = new Date(data.date_fin).format("DD/MM/YYYY HH:mm");
const entry_date = moment.tz(data.entry_date, TIMEZONE).format("DD/MM/YYYY HH:mm"); const entry_date = new Date(data.entry_date).format("DD/MM/YYYY HH:mm");
const etat = data.etat.capitalize(); const etat = data.etat.capitalize();
const desc = data.desc == null ? "" : data.desc; const desc = data.desc == null ? "" : data.desc;
@ -433,7 +433,7 @@
if (l.querySelector(`#${key}_time`).value != "") { if (l.querySelector(`#${key}_time`).value != "") {
filterAssiduites.filters[key] = { filterAssiduites.filters[key] = {
pref: pref, pref: pref,
time: new moment.tz(time, TIMEZONE) time: new Date(time)
} }
} }
} else if (key.indexOf('etat') != -1) { } else if (key.indexOf('etat') != -1) {

View File

@ -75,7 +75,7 @@
} }
} }
if (k.indexOf('date') != -1) { if (k.indexOf('date') != -1) {
const assi_time = moment.tz(el[k], TIMEZONE); const assi_time = new Date(el[k]);
const filter_time = f[k].time; const filter_time = f[k].time;
switch (f[k].pref) { switch (f[k].pref) {
@ -262,8 +262,8 @@
let keyValueB = b[keyword]; let keyValueB = b[keyword];
if (keyword.indexOf("date") != -1) { if (keyword.indexOf("date") != -1) {
keyValueA = moment.tz(keyValueA, TIMEZONE) keyValueA = new Date(keyValueA)
keyValueB = moment.tz(keyValueB, TIMEZONE) keyValueB = new Date(keyValueB)
} }
if (keyword.indexOf("module") != -1) { if (keyword.indexOf("module") != -1) {

View File

@ -82,7 +82,7 @@
filterJustificatifs.columns.forEach((k) => { filterJustificatifs.columns.forEach((k) => {
const td = document.createElement('td'); const td = document.createElement('td');
if (k.indexOf('date') != -1) { if (k.indexOf('date') != -1) {
td.textContent = moment.tz(justificatif[k], TIMEZONE).format(`DD/MM/Y HH:mm`) td.textContent = new Date(justificatif[k]).format(`DD/MM/Y HH:mm`)
} else if (k.indexOf('fichier') != -1) { } else if (k.indexOf('fichier') != -1) {
td.textContent = justificatif.fichier ? "Oui" : "Non"; td.textContent = justificatif.fichier ? "Oui" : "Non";
} else if (k.indexOf('etudid') != -1) { } else if (k.indexOf('etudid') != -1) {
@ -120,9 +120,9 @@
path, path,
(data) => { (data) => {
const user = getUser(data); const user = getUser(data);
const date_debut = moment.tz(data.date_debut, TIMEZONE).format("DD/MM/YYYY HH:mm"); const date_debut = new Date(data.date_debut).format("DD/MM/YYYY HH:mm");
const date_fin = moment.tz(data.date_fin, TIMEZONE).format("DD/MM/YYYY HH:mm"); const date_fin = new Date(data.date_fin).format("DD/MM/YYYY HH:mm");
const entry_date = moment.tz(data.entry_date, TIMEZONE).format("DD/MM/YYYY HH:mm"); const entry_date = new Date(data.entry_date).format("DD/MM/YYYY HH:mm");
const etat = data.etat.capitalize(); const etat = data.etat.capitalize();
const desc = data.raison == null ? "" : data.raison; const desc = data.raison == null ? "" : data.raison;
@ -305,9 +305,8 @@
assiEdit.querySelector('#justi_etat').value = data.etat.toLowerCase(); assiEdit.querySelector('#justi_etat').value = data.etat.toLowerCase();
assiEdit.querySelector('#justi_raison').value = desc; assiEdit.querySelector('#justi_raison').value = desc;
const d_deb = moment.tz(data.date_debut, TIMEZONE).format("YYYY-MM-DDTHH:mm") const d_deb = new Date(data.date_debut).format("YYYY-MM-DDTHH:mm")
const d_fin = moment.tz(data.date_fin, TIMEZONE).format("YYYY-MM-DDTHH:mm") const d_fin = new Date(data.date_fin).format("YYYY-MM-DDTHH:mm")
console.warn(d_deb, d_fin, data.date_debut, data.date_fin)
assiEdit.querySelector('#justi_date_debut').value = d_deb assiEdit.querySelector('#justi_date_debut').value = d_deb
assiEdit.querySelector('#justi_date_fin').value = d_fin assiEdit.querySelector('#justi_date_fin').value = d_fin
@ -357,8 +356,8 @@
openAlertModal("Dates erronées", document.createTextNode('Les dates sont invalides')); openAlertModal("Dates erronées", document.createTextNode('Les dates sont invalides'));
return true return true
} }
date_debut = moment.tz(date_debut, TIMEZONE) date_debut = new Date(date_debut)
date_fin = moment.tz(date_fin, TIMEZONE) date_fin = new Date(date_fin)
if (date_debut >= date_fin) { if (date_debut >= date_fin) {
openAlertModal("Dates erronées", document.createTextNode('La date de fin doit être après la date de début')); openAlertModal("Dates erronées", document.createTextNode('La date de fin doit être après la date de début'));
@ -626,7 +625,7 @@
if (l.querySelector(`#${key}_time`).value != "") { if (l.querySelector(`#${key}_time`).value != "") {
filterJustificatifs.filters[key] = { filterJustificatifs.filters[key] = {
pref: pref, pref: pref,
time: new moment.tz(time, TIMEZONE) time: new Date(time)
} }
} }
} else if (key.indexOf('etat') != -1) { } else if (key.indexOf('etat') != -1) {

View File

@ -144,7 +144,6 @@
const startLeft = parseFloat(periodTimeLine.style.left); const startLeft = parseFloat(periodTimeLine.style.left);
const onMouseMove = (moveEvent) => { const onMouseMove = (moveEvent) => {
console.warn("move Period")
if (handleMoving) return; if (handleMoving) return;
const deltaX = (moveEvent.clientX || moveEvent.changedTouches[0].clientX) - startX; const deltaX = (moveEvent.clientX || moveEvent.changedTouches[0].clientX) - startX;
const containerWidth = timelineContainer.clientWidth; const containerWidth = timelineContainer.clientWidth;

View File

@ -167,8 +167,6 @@ def bilan_dept():
page_title="Saisie de l'assiduité", page_title="Saisie de l'assiduité",
javascripts=[ javascripts=[
"js/assiduites.js", "js/assiduites.js",
"libjs/moment-2.29.4.min.js",
"libjs/moment-timezone.js",
], ],
cssstyles=[ cssstyles=[
"css/assiduites.css", "css/assiduites.css",
@ -286,8 +284,6 @@ def signal_assiduites_etud():
init_qtip=True, init_qtip=True,
javascripts=[ javascripts=[
"js/assiduites.js", "js/assiduites.js",
"libjs/moment-2.29.4.min.js",
"libjs/moment-timezone.js",
"js/etud_info.js", "js/etud_info.js",
], ],
cssstyles=[ cssstyles=[
@ -367,8 +363,6 @@ def liste_assiduites_etud():
init_qtip=True, init_qtip=True,
javascripts=[ javascripts=[
"js/assiduites.js", "js/assiduites.js",
"libjs/moment-2.29.4.min.js",
"libjs/moment-timezone.js",
], ],
cssstyles=CSSSTYLES cssstyles=CSSSTYLES
+ [ + [
@ -415,8 +409,6 @@ def bilan_etud():
init_qtip=True, init_qtip=True,
javascripts=[ javascripts=[
"js/assiduites.js", "js/assiduites.js",
"libjs/moment-2.29.4.min.js",
"libjs/moment-timezone.js",
], ],
cssstyles=CSSSTYLES cssstyles=CSSSTYLES
+ [ + [
@ -476,8 +468,6 @@ def ajout_justificatif_etud():
init_qtip=True, init_qtip=True,
javascripts=[ javascripts=[
"js/assiduites.js", "js/assiduites.js",
"libjs/moment-2.29.4.min.js",
"libjs/moment-timezone.js",
], ],
cssstyles=CSSSTYLES cssstyles=CSSSTYLES
+ [ + [
@ -526,8 +516,6 @@ def calendrier_etud():
init_qtip=True, init_qtip=True,
javascripts=[ javascripts=[
"js/assiduites.js", "js/assiduites.js",
"libjs/moment-2.29.4.min.js",
"libjs/moment-timezone.js",
], ],
cssstyles=CSSSTYLES cssstyles=CSSSTYLES
+ [ + [
@ -673,12 +661,9 @@ def signal_assiduites_group():
javascripts=html_sco_header.BOOTSTRAP_MULTISELECT_JS javascripts=html_sco_header.BOOTSTRAP_MULTISELECT_JS
+ [ + [
# Voir fonctionnement JS # Voir fonctionnement JS
# XXX Retirer moment
"js/etud_info.js", "js/etud_info.js",
"js/groups_view.js", "js/groups_view.js",
"js/assiduites.js", "js/assiduites.js",
"libjs/moment-2.29.4.min.js",
"libjs/moment-timezone.js",
], ],
cssstyles=CSSSTYLES cssstyles=CSSSTYLES
+ [ + [
@ -825,8 +810,6 @@ def visu_assiduites_group():
"js/etud_info.js", "js/etud_info.js",
"js/groups_view.js", "js/groups_view.js",
"js/assiduites.js", "js/assiduites.js",
"libjs/moment-2.29.4.min.js",
"libjs/moment-timezone.js",
], ],
cssstyles=CSSSTYLES cssstyles=CSSSTYLES
+ [ + [
@ -1105,8 +1088,6 @@ def signal_assiduites_diff():
javascripts=html_sco_header.BOOTSTRAP_MULTISELECT_JS javascripts=html_sco_header.BOOTSTRAP_MULTISELECT_JS
+ [ + [
"js/assiduites.js", "js/assiduites.js",
"libjs/moment-2.29.4.min.js",
"libjs/moment-timezone.js",
"js/etud_info.js", "js/etud_info.js",
], ],
) )