Add Veeam and NetBackup support to inventory and reporting

- Introduced Veeam and NetBackup version tracking in `Inventory.php` for backup validation.
- Enhanced backup report in `Backups.php` with improved SQL queries and support for short hostname normalization.
- Updated `navbar.html` and related navigation components for better usability and accessibility.
- Refactored ActiveDirectory scripts for better modularity and event handling.
- Added `AGENTS.md` and `modele.php` as templates for documentation and new page creation.
This commit is contained in:
e025532
2026-09-24 15:36:09 +02:00
parent c185d099d6
commit db223b805c
7 changed files with 847 additions and 127 deletions

View File

@@ -1223,12 +1223,6 @@
true
);
} else {
$table.bootstrapTable(
'resetView'
);
}
@@ -1236,8 +1230,9 @@
/*
* Laisse Bootstrap Table construire son DOM
* avant de mesurer la hauteur disponible.
* Laisse Bootstrap Table construire (ou reconstruire)
* son DOM avant de mesurer la hauteur disponible.
* updateTableHeight fait lui-même le resetView avec la hauteur.
*/
setTimeout(
function () {
@@ -1280,87 +1275,54 @@
}
const $table =
$(target).find('table.report-table');
/*
* On laisse Bootstrap terminer complètement
* l'affichage de l'onglet avant de toucher à Bootstrap Table.
* IMPORTANT : on cible la table par son id.
* En mode hauteur fixe, Bootstrap Table clone le thead dans une
* seconde <table> à laquelle il recopie la classe d'origine
* (report-table). Sélectionner par classe renverrait donc AUSSI ce
* clone (placé avant l'originale dans le DOM), et .data('bt-initialized')
* lirait le clone -> fausse "première init" -> double init -> tableau vidé.
* Le clone ne reçoit jamais d'id : [id] ne matche que la vraie table.
*/
setTimeout(
function () {
const $table =
$(target).find('table.report-table[id]');
function initTable($table) {
if ($table.length === 0) {
return;
}
if ($table.length === 0) {
return;
}
/*
* Important :
* ne jamais initialiser Bootstrap Table
* pendant que la table est cachée.
*/
if (!$table.is(':visible')) {
return;
}
if (!$table.data('bt-initialized')) {
/*
* Première ouverture de l'onglet :
* on initialise et on dimensionne pendant que la table est visible.
*/
initTable($table);
} else {
/*
* Onglet déjà construit : display:none / show conserve tout le rendu
* de Bootstrap Table. On ne refait PAS de resetView, qui viderait
* le corps du tableau.
*/
syncTheme($table);
if (!$table.data('bt-initialized')) {
/*
* Sauf si un resize a eu lieu pendant que l'onglet était masqué :
* dans ce cas seulement, on recalcule la hauteur maintenant.
*/
if ($table.data('needs-resize')) {
/*
* Première ouverture de l'onglet :
* Bootstrap Table construit son DOM.
*/
$table.bootstrapTable();
$table.data('needs-resize', false);
$table.data(
'bt-initialized',
true
);
updateTableHeight($table);
} else {
}
/*
* Table déjà initialisée :
* on force Bootstrap Table à recalculer son affichage.
*/
$table.bootstrapTable(
'resetView'
);
}
syncTheme($table);
/*
* Une fois le DOM Bootstrap Table construit,
* calcul de la hauteur disponible.
*/
setTimeout(
function () {
$table.bootstrapTable(
'resetView'
);
updateTableHeight(
$table
);
},
50
);
}
},
10
);
}
}
);
@@ -1377,7 +1339,7 @@
setTimeout(
function () {
$('table.report-table').each(
$('table.report-table[id]').each(
function () {
syncTheme(
@@ -1518,19 +1480,32 @@
debounce(
function () {
$('table.report-table:visible').each(
$('table.report-table[id]').each(
function () {
const $table =
$(this);
if ($table.data('bt-initialized')) {
if (!$table.data('bt-initialized')) {
return;
}
if ($table.is(':visible')) {
updateTableHeight(
$table
);
} else {
/*
* On ne peut pas mesurer un onglet masqué :
* on marque la table pour recalcul à sa prochaine ouverture.
*/
$table.data('needs-resize', true);
}
}
@@ -1550,7 +1525,7 @@
setTimeout(
function () {
$('table.report-table:visible').each(
$('table.report-table[id]:visible').each(
function () {
const $table =