diff --git a/AD/LocalAdmins.php b/AD/LocalAdmins.php
index 9401cc7..e5d397d 100644
--- a/AD/LocalAdmins.php
+++ b/AD/LocalAdmins.php
@@ -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
à 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 =
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..f672b2b
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,222 @@
+# AGENTS.md — Instructions Codex
+
+## Contexte
+
+Ce projet est un environnement de développement hébergé sur une infrastructure
+professionnelle.
+
+Le code présent dans ce workspace peut être modifié par Codex.
+
+IMPORTANT :
+Les bases de données auxquelles l'application peut accéder contiennent des
+DONNÉES DE PRODUCTION.
+
+La protection et l'intégrité de ces données sont prioritaires.
+
+---
+
+## 1. Périmètre autorisé
+
+Codex peut :
+
+- Lire tous les fichiers du workspace courant.
+- Rechercher librement dans les fichiers du workspace.
+- Créer, modifier, renommer ou supprimer des fichiers dans le workspace
+ lorsque cela est nécessaire à la tâche demandée.
+- Exécuter des commandes locales nécessaires à l'analyse du projet.
+- Utiliser Git pour examiner :
+ - status
+ - diff
+ - log
+ - historique
+- Analyser et modifier du code PHP, JavaScript, HTML, CSS, SQL et PowerShell
+ présent dans le workspace.
+
+Codex doit rester dans le workspace courant :
+
+ E:\Sites\web-infra-reports
+
+Ne jamais modifier un fichier situé en dehors de ce workspace sans demander
+explicitement l'autorisation.
+
+---
+
+## 2. Bases de données — RÈGLE CRITIQUE
+
+Les bases de données accessibles depuis cette application doivent être
+considérées comme des bases de PRODUCTION.
+
+### Opérations autorisées
+
+Codex peut effectuer des opérations SQL strictement en lecture seule :
+
+ SELECT
+
+Il peut également :
+
+- analyser les requêtes SQL présentes dans le code ;
+- écrire ou modifier du SQL dans les fichiers source ;
+- proposer des requêtes SQL ;
+- examiner la structure des données lorsqu'elle est accessible en lecture.
+
+### Opérations interdites
+
+Codex ne doit JAMAIS exécuter sur une base de données une commande susceptible
+de modifier les données, la structure ou la configuration.
+
+Cela comprend notamment :
+
+ INSERT
+ UPDATE
+ DELETE
+ MERGE
+ TRUNCATE
+ DROP
+ ALTER
+ CREATE
+ GRANT
+ REVOKE
+
+Ne jamais exécuter une procédure stockée ou une fonction SQL susceptible
+d'avoir des effets de bord.
+
+En particulier :
+
+ EXEC
+ EXECUTE
+
+ne doivent être utilisés que s'il est certain que l'opération est strictement
+en lecture seule.
+
+En cas de doute :
+
+ NE PAS EXÉCUTER LA REQUÊTE.
+
+Demander confirmation à l'utilisateur.
+
+---
+
+## 3. Credentials et secrets
+
+Ne jamais :
+
+- afficher inutilement un mot de passe ;
+- recopier un mot de passe dans un nouveau fichier ;
+- ajouter un secret dans Git ;
+- modifier les credentials existants sans demande explicite ;
+- transmettre un credential ou un secret vers Internet.
+
+Si des credentials sont découverts dans le code, les considérer comme
+confidentiels.
+
+Ne pas les inclure dans les réponses sauf nécessité absolue.
+
+---
+
+## 4. Infrastructure externe
+
+Ne jamais modifier directement :
+
+- un autre site IIS ;
+- une configuration IIS externe au workspace ;
+- Active Directory ;
+- DNS ;
+- un serveur distant ;
+- une machine virtuelle ;
+- un partage réseau ;
+- une tâche planifiée ;
+- une configuration système Windows ;
+- une base de données ;
+- une ressource de production.
+
+Codex peut analyser le code qui effectue ces opérations et le modifier dans
+le workspace.
+
+L'exécution réelle d'une opération d'administration doit être laissée à
+l'utilisateur sauf demande explicite.
+
+---
+
+## 5. Commandes PowerShell et shell
+
+Les commandes purement consultatives peuvent être exécutées librement.
+
+Exemples :
+
+ rg
+ Get-Content
+ Select-String
+ Get-ChildItem
+ git status
+ git diff
+ git log
+
+Avant d'exécuter une commande ayant potentiellement des effets de bord,
+vérifier qu'elle ne peut pas modifier une ressource de production.
+
+En cas de doute, demander confirmation.
+
+---
+
+## 6. Modifications du code
+
+Avant une modification importante :
+
+1. comprendre le code existant ;
+2. rechercher les dépendances et les appels concernés ;
+3. conserver le comportement existant qui n'est pas concerné par la demande ;
+4. privilégier une modification minimale plutôt qu'une réécriture inutile.
+
+Après modification :
+
+1. vérifier les fichiers modifiés ;
+2. rechercher les éventuelles références impactées ;
+3. examiner le diff ;
+4. signaler clairement les modifications réalisées ;
+5. signaler les points qui n'ont pas pu être testés.
+
+Ne jamais considérer qu'une modification est déployée en production.
+
+---
+
+## 7. Tests
+
+Les tests locaux sans effet de bord sont autorisés.
+
+Ne jamais utiliser une ressource de production pour tester une opération
+d'écriture.
+
+Si une fonctionnalité nécessite normalement une écriture en base de données,
+modifier le code si demandé mais NE PAS effectuer l'écriture réelle.
+
+Indiquer à l'utilisateur que cette partie doit être testée manuellement dans
+un environnement approprié.
+
+---
+
+## 8. Accès Internet
+
+Ne pas envoyer vers un service externe :
+
+- code source propriétaire ;
+- credentials ;
+- noms d'utilisateurs ;
+- données provenant des bases ;
+- informations internes à l'entreprise.
+
+Si une recherche Internet est nécessaire, demander l'autorisation lorsque
+Codex le requiert et limiter la requête aux informations strictement
+nécessaires.
+
+---
+
+## Principe général
+
+Codex dispose d'une autonomie importante sur le CODE contenu dans ce
+workspace.
+
+Codex ne dispose d'aucune autonomie pour modifier les DONNÉES ou
+l'INFRASTRUCTURE de production.
+
+Si une action peut avoir un effet de bord sur une ressource extérieure au
+workspace, demander confirmation avant de l'exécuter.
\ No newline at end of file
diff --git a/X/Inventory.php b/X/Inventory.php
index dc36e9e..04cd1f6 100644
--- a/X/Inventory.php
+++ b/X/Inventory.php
@@ -68,10 +68,12 @@
$UTDBES = end($versions);
$UTDFI = (Invoke_Infra("select max(Ver) as utd from X_cmdb_Product where Name = 'fi'"))[0]['utd'];
$UTDxs = (Invoke_Infra("select max(Ver) as utd from X_cmdb_Product where Name = 'xs'"))[0]['utd'];
+ $UTDveeam = (Invoke_Infra("select max(Ver) as utd from X_cmdb_Product where Name = 'veeam'"))[0]['utd'];
+ $UTDnetbackup = (Invoke_Infra("select max(Ver) as utd from X_cmdb_Product where Name = 'netbackup'"))[0]['utd'];
?>
-