feat: stages module, mobility frontend, theme toggle, employeeOnly access control
- Add stages module with full CRUD API and admin overview island - Add mobility overview island (Liste, Kanban, Detail CRUD views) - Add contract PDF upload/download endpoints for mobilites - Add light/dark theme toggle in header - Add employeeOnly flag to hide entire modules from students (admin, students, stages) - Add read-only GET endpoints for modules/ues/ue-modules in notes module - Add [slug].tsx catch-all routes for direct URL navigation - Replace old mobility table with mobilites + stages schema (migration 0004) - Allow students to create mobilites and upload contracts - Redirect authenticated users from / to /apps catalog
This commit is contained in:
@@ -5,7 +5,12 @@ import * as XLSX from "https://cdn.sheetjs.com/xlsx-0.20.3/package/xlsx.mjs";
|
||||
{
|
||||
const wb = XLSX.utils.book_new();
|
||||
const ws = XLSX.utils.aoa_to_sheet([
|
||||
[null, null, null, "Promotion peut etre vide mais doit prealablement Exister"],
|
||||
[
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
"Promotion peut etre vide mais doit prealablement Exister",
|
||||
],
|
||||
["Nom", "Prenom", "Numero-etudiant", "Promotion"],
|
||||
["NOM", "PRENOM", 12345678, "3AFISE24-25"],
|
||||
]);
|
||||
@@ -38,8 +43,26 @@ import * as XLSX from "https://cdn.sheetjs.com/xlsx-0.20.3/package/xlsx.mjs";
|
||||
{
|
||||
const data = [
|
||||
["Intitule du diplome", null, "Informatique - Annee 20.. - 20.."],
|
||||
["Description des UE du diplome", null, null, null, null, null, "Nombre d'heures"],
|
||||
["Annee\nSemestres", "Codes APOGEE", null, null, "Credits\n ECTS", "Coeff.", "CM", "TD", "TP"],
|
||||
[
|
||||
"Description des UE du diplome",
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
"Nombre d'heures",
|
||||
],
|
||||
[
|
||||
"Annee\nSemestres",
|
||||
"Codes APOGEE",
|
||||
null,
|
||||
null,
|
||||
"Credits\n ECTS",
|
||||
"Coeff.",
|
||||
"CM",
|
||||
"TD",
|
||||
"TP",
|
||||
],
|
||||
["INFO3A", null, null, null, "ECTS", "Coef", "CM", "TD", "TP"],
|
||||
["SEM 5", null, null, null, 30],
|
||||
["UE", "CODE_UE1", "Nom de l'UE 1", null, 6],
|
||||
|
||||
@@ -9,7 +9,9 @@ for (const file of ["FISE-INFO-2025.xlsx", "FISA-INFO-2025.xlsx"]) {
|
||||
for (const sheetName of wb.SheetNames) {
|
||||
console.log(`\n--- Sheet: ${sheetName} ---`);
|
||||
const sheet = wb.Sheets[sheetName];
|
||||
const rows = XLSX.utils.sheet_to_json<(string | number | null)[]>(sheet, { header: 1 });
|
||||
const rows = XLSX.utils.sheet_to_json<(string | number | null)[]>(sheet, {
|
||||
header: 1,
|
||||
});
|
||||
// Print first 5 cols of each row, mark rows that look like year/semester headers
|
||||
for (let i = 0; i < rows.length; i++) {
|
||||
const row = rows[i];
|
||||
@@ -17,7 +19,9 @@ for (const file of ["FISE-INFO-2025.xlsx", "FISA-INFO-2025.xlsx"]) {
|
||||
const col0 = row[0] != null ? String(row[0]).trim() : "";
|
||||
// Show rows that are structural (year, semester, UE headers)
|
||||
if (col0 || (row[1] != null && String(row[1]).trim())) {
|
||||
const preview = row.slice(0, 6).map(c => c != null ? String(c).substring(0, 25) : "").join(" | ");
|
||||
const preview = row.slice(0, 6).map((c) =>
|
||||
c != null ? String(c).substring(0, 25) : ""
|
||||
).join(" | ");
|
||||
console.log(` [${i}] ${preview}`);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user