Files

461 lines
27 KiB
HTML

<!DOCTYPE html>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
template="/templates/main-template.xhtml">
<ui:define name="title">Journal d'Audit - UnionFlow</ui:define>
<ui:define name="content">
<!-- En-tête -->
<ui:include src="/templates/components/layout/page-header.xhtml">
<ui:param name="icon" value="pi pi-history text-indigo-500" />
<ui:param name="title" value="Journal d'Audit" />
<ui:param name="description" value="Traçabilité complète des actions et modifications système" />
<ui:define name="actions">
<h:form id="formActions">
<div class="flex gap-2">
<ui:include src="/templates/components/buttons/button-secondary.xhtml">
<ui:param name="value" value="Exporter" />
<ui:param name="icon" value="pi pi-download" />
<ui:param name="onclick" value="PF('exportDialog').show(); return false;" />
<ui:param name="outlined" value="true" />
</ui:include>
<ui:include src="/templates/components/buttons/button-secondary.xhtml">
<ui:param name="value" value="" />
<ui:param name="icon" value="pi pi-refresh" />
<ui:param name="action" value="#{auditBean.actualiser}" />
<ui:param name="update" value=":formFiltres :formTableau:tableauAudit" />
<ui:param name="title" value="Actualiser" />
<ui:param name="outlined" value="true" />
<ui:param name="styleClass" value="ui-button-sm" />
</ui:include>
</div>
</h:form>
</ui:define>
</ui:include>
<!-- Statistiques -->
<div class="grid">
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Événements Totaux" />
<ui:param name="value" value="#{auditBean.totalEvenements}" />
<ui:param name="icon" value="pi-history" />
<ui:param name="iconColor" value="blue-600" />
<ui:param name="showGrowth" value="false" />
<ui:param name="showProgress" value="false" />
<ui:param name="colSize" value="col-12 md:col-6 lg:col-3" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Connexions Réussies" />
<ui:param name="value" value="#{auditBean.connexionsReussies}" />
<ui:param name="icon" value="pi-check-circle" />
<ui:param name="iconColor" value="green-600" />
<ui:param name="showGrowth" value="false" />
<ui:param name="showProgress" value="false" />
<ui:param name="colSize" value="col-12 md:col-6 lg:col-3" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Tentatives Échouées" />
<ui:param name="value" value="#{auditBean.tentativesEchouees}" />
<ui:param name="icon" value="pi-times-circle" />
<ui:param name="iconColor" value="orange-600" />
<ui:param name="showGrowth" value="false" />
<ui:param name="showProgress" value="false" />
<ui:param name="colSize" value="col-12 md:col-6 lg:col-3" />
</ui:include>
<ui:include src="/templates/components/cards/kpi-card.xhtml">
<ui:param name="title" value="Alertes Sécurité" />
<ui:param name="value" value="#{auditBean.alertesSecurite}" />
<ui:param name="icon" value="pi-exclamation-triangle" />
<ui:param name="iconColor" value="red-600" />
<ui:param name="showGrowth" value="false" />
<ui:param name="showProgress" value="false" />
<ui:param name="colSize" value="col-12 md:col-6 lg:col-3" />
</ui:include>
</div>
<!-- Filtres -->
<div class="card">
<h:form id="formFiltres">
<h5>Filtres de Recherche</h5>
<div class="grid">
<div class="col-12 md:col-3">
<ui:include src="/templates/components/forms/form-field-calendar.xhtml">
<ui:param name="id" value="dateDebut" />
<ui:param name="label" value="Date Début" />
<ui:param name="value" value="#{auditBean.dateDebut}" />
<ui:param name="update" value=":formTableau:tableauAudit" />
</ui:include>
</div>
<div class="col-12 md:col-3">
<ui:include src="/templates/components/forms/form-field-calendar.xhtml">
<ui:param name="id" value="dateFin" />
<ui:param name="label" value="Date Fin" />
<ui:param name="value" value="#{auditBean.dateFin}" />
<ui:param name="update" value=":formTableau:tableauAudit" />
</ui:include>
</div>
<div class="col-12 md:col-3">
<ui:include src="/templates/components/forms/form-field-select.xhtml">
<ui:param name="id" value="typeAction" />
<ui:param name="label" value="Type d'Action" />
<ui:param name="value" value="#{auditBean.typeAction}" />
<ui:param name="update" value=":formTableau:tableauAudit" />
<ui:define name="items">
<f:selectItem itemLabel="Tous les types" itemValue="" />
<f:selectItem itemLabel="Connexion" itemValue="CONNEXION" />
<f:selectItem itemLabel="Déconnexion" itemValue="DECONNEXION" />
<f:selectItem itemLabel="Création" itemValue="CREATION" />
<f:selectItem itemLabel="Modification" itemValue="MODIFICATION" />
<f:selectItem itemLabel="Suppression" itemValue="SUPPRESSION" />
<f:selectItem itemLabel="Consultation" itemValue="CONSULTATION" />
<f:selectItem itemLabel="Export" itemValue="EXPORT" />
<f:selectItem itemLabel="Configuration" itemValue="CONFIGURATION" />
</ui:define>
</ui:include>
</div>
<div class="col-12 md:col-3">
<ui:include src="/templates/components/forms/form-field-select.xhtml">
<ui:param name="id" value="severite" />
<ui:param name="label" value="Sévérité" />
<ui:param name="value" value="#{auditBean.severite}" />
<ui:param name="update" value=":formTableau:tableauAudit" />
<ui:define name="items">
<f:selectItem itemLabel="Toutes" itemValue="" />
<f:selectItem itemLabel="Info" itemValue="INFO" />
<f:selectItem itemLabel="Succès" itemValue="SUCCESS" />
<f:selectItem itemLabel="Avertissement" itemValue="WARNING" />
<f:selectItem itemLabel="Erreur" itemValue="ERROR" />
<f:selectItem itemLabel="Critique" itemValue="CRITICAL" />
</ui:define>
</ui:include>
</div>
<div class="col-12 md:col-3">
<ui:include src="/templates/components/forms/form-field-search-text.xhtml">
<ui:param name="id" value="utilisateur" />
<ui:param name="label" value="Utilisateur" />
<ui:param name="value" value="#{auditBean.utilisateur}" />
<ui:param name="placeholder" value="Nom ou email..." />
<ui:param name="update" value=":formTableau:tableauAudit" />
</ui:include>
</div>
<div class="col-12 md:col-3">
<ui:include src="/templates/components/forms/form-field-select.xhtml">
<ui:param name="id" value="module" />
<ui:param name="label" value="Module" />
<ui:param name="value" value="#{auditBean.module}" />
<ui:param name="update" value=":formTableau:tableauAudit" />
<ui:define name="items">
<f:selectItem itemLabel="Tous les modules" itemValue="" />
<f:selectItem itemLabel="Authentification" itemValue="AUTH" />
<f:selectItem itemLabel="Membres" itemValue="MEMBRES" />
<f:selectItem itemLabel="Cotisations" itemValue="COTISATIONS" />
<f:selectItem itemLabel="Événements" itemValue="EVENTS" />
<f:selectItem itemLabel="Documents" itemValue="DOCUMENTS" />
<f:selectItem itemLabel="Configuration" itemValue="CONFIG" />
<f:selectItem itemLabel="Rapports" itemValue="RAPPORTS" />
</ui:define>
</ui:include>
</div>
<div class="col-12 md:col-3">
<ui:include src="/templates/components/forms/form-field-search-text.xhtml">
<ui:param name="id" value="ipAddress" />
<ui:param name="label" value="Adresse IP" />
<ui:param name="value" value="#{auditBean.ipAddress}" />
<ui:param name="placeholder" value="Ex: 192.168.1.1" />
<ui:param name="update" value=":formTableau:tableauAudit" />
</ui:include>
</div>
<div class="col-12 md:col-3">
<div class="field">
<p:outputLabel />
<div class="flex gap-2">
<ui:include src="/templates/components/buttons/button-primary.xhtml">
<ui:param name="value" value="Rechercher" />
<ui:param name="icon" value="pi pi-search" />
<ui:param name="action" value="#{auditBean.rechercher}" />
<ui:param name="update" value=":formTableau:tableauAudit" />
</ui:include>
<ui:include src="/templates/components/buttons/button-secondary.xhtml">
<ui:param name="value" value="Réinitialiser" />
<ui:param name="icon" value="pi pi-refresh" />
<ui:param name="action" value="#{auditBean.reinitialiserFiltres}" />
<ui:param name="update" value=":formFiltres :formTableau:tableauAudit" />
<ui:param name="outlined" value="true" />
</ui:include>
</div>
</div>
</div>
</div>
</h:form>
</div>
<!-- Tableau du journal d'audit -->
<div class="card">
<h:form id="formTableau">
<h5>Journal d'Audit</h5>
<p:dataTable id="tableauAudit"
value="#{auditBean.evenementsFiltres}"
var="log"
paginator="true"
rows="20"
rowsPerPageTemplate="10,20,50,100"
emptyMessage="Aucun événement trouvé"
styleClass="p-datatable-sm p-datatable-striped"
sortMode="multiple"
rowKey="#{log.id}">
<p:column headerText="Date/Heure" sortBy="#{log.dateHeure}" style="width: 12%">
<div>
<div class="font-semibold">#{log.dateFormatee}</div>
<div class="text-sm text-600">#{log.heureFormatee}</div>
</div>
</p:column>
<p:column headerText="Sévérité" sortBy="#{log.severite}" style="width: 8%" styleClass="text-center">
<p:tag value="#{log.severiteLibelle}"
severity="#{log.severiteSeverity}"
icon="#{log.severiteIcon}" />
</p:column>
<p:column headerText="Utilisateur" sortBy="#{log.utilisateur}" style="width: 15%">
<div class="flex align-items-center gap-2">
<i class="pi pi-user text-blue-500"></i>
<div>
<div class="font-semibold">#{log.utilisateur}</div>
<div class="text-sm text-600">#{log.role}</div>
</div>
</div>
</p:column>
<p:column headerText="Action" sortBy="#{log.typeAction}" style="width: 12%">
<div class="flex align-items-center gap-2">
<i class="#{log.actionIcon} text-lg"></i>
<span class="font-semibold">#{log.actionLibelle}</span>
</div>
</p:column>
<p:column headerText="Module" sortBy="#{log.module}" style="width: 10%">
<p:tag value="#{log.moduleLibelle}"
severity="info" />
</p:column>
<p:column headerText="Description" style="width: 25%">
<div>#{log.description}</div>
<div class="text-sm text-600 mt-1" rendered="#{not empty log.details}">
<i class="pi pi-info-circle"></i> #{log.details}
</div>
</p:column>
<p:column headerText="IP/Appareil" style="width: 12%">
<div class="text-sm">
<i class="pi pi-globe"></i> #{log.ipAddress}
</div>
<div class="text-xs text-600">#{log.userAgentCourt}</div>
</p:column>
<p:column headerText="Actions" style="width: 6%" styleClass="text-center">
<div class="flex justify-content-center gap-1">
<ui:include src="/templates/components/buttons/button-info.xhtml">
<ui:param name="value" value="" />
<ui:param name="icon" value="pi pi-eye" />
<ui:param name="action" value="#{auditBean.selectionnerLog(log)}" />
<ui:param name="update" value=":formDetails:dlgDetails" />
<ui:param name="oncomplete" value="PF('dlgDetails').show();" />
<ui:param name="title" value="Voir les détails" />
<ui:param name="styleClass" value="p-button-sm p-button-rounded" />
</ui:include>
</div>
</p:column>
</p:dataTable>
</h:form>
</div>
<!-- Dialog Détails -->
<h:form id="formDetails">
<p:dialog id="dlgDetails"
widgetVar="dlgDetails"
header="Détails de l'Événement"
modal="true"
resizable="false"
style="width: 90vw; max-width: 800px;">
<div class="grid" rendered="#{auditBean.evenementSelectionne != null}">
<div class="col-12">
<ui:include src="/templates/components/forms/form-section.xhtml">
<ui:define name="title">Informations Générales</ui:define>
<ui:define name="content">
<div class="grid">
<div class="col-12 md:col-6">
<div class="field">
<label class="font-semibold">Date/Heure</label>
<div>#{auditBean.evenementSelectionne.dateHeureComplete}</div>
</div>
</div>
<div class="col-12 md:col-6">
<div class="field">
<label class="font-semibold">Sévérité</label>
<div>
<p:tag value="#{auditBean.evenementSelectionne.severiteLibelle}"
severity="#{auditBean.evenementSelectionne.severiteSeverity}" />
</div>
</div>
</div>
<div class="col-12 md:col-6">
<div class="field">
<label class="font-semibold">Utilisateur</label>
<div>#{auditBean.evenementSelectionne.utilisateur}</div>
</div>
</div>
<div class="col-12 md:col-6">
<div class="field">
<label class="font-semibold">Rôle</label>
<div>#{auditBean.evenementSelectionne.role}</div>
</div>
</div>
</div>
</ui:define>
</ui:include>
</div>
<div class="col-12">
<ui:include src="/templates/components/forms/form-section.xhtml">
<ui:define name="title">Détails de l'Action</ui:define>
<ui:define name="content">
<div class="grid">
<div class="col-12">
<div class="field">
<label class="font-semibold">Description</label>
<div>#{auditBean.evenementSelectionne.description}</div>
</div>
</div>
<div class="col-12" rendered="#{not empty auditBean.evenementSelectionne.details}">
<div class="field">
<label class="font-semibold">Détails</label>
<div class="surface-50 p-3 border-round">#{auditBean.evenementSelectionne.details}</div>
</div>
</div>
<div class="col-12" rendered="#{not empty auditBean.evenementSelectionne.donneesAvant}">
<div class="field">
<label class="font-semibold">Données Avant</label>
<pre class="surface-200 border-round p-2 text-sm">#{auditBean.evenementSelectionne.donneesAvant}</pre>
</div>
</div>
<div class="col-12" rendered="#{not empty auditBean.evenementSelectionne.donneesApres}">
<div class="field">
<label class="font-semibold">Données Après</label>
<pre class="surface-200 border-round p-2 text-sm">#{auditBean.evenementSelectionne.donneesApres}</pre>
</div>
</div>
</div>
</ui:define>
</ui:include>
</div>
<div class="col-12">
<ui:include src="/templates/components/forms/form-section.xhtml">
<ui:define name="title">Informations Techniques</ui:define>
<ui:define name="content">
<div class="grid">
<div class="col-12 md:col-6">
<div class="field">
<label class="font-semibold">Adresse IP</label>
<div>#{auditBean.evenementSelectionne.ipAddress}</div>
</div>
</div>
<div class="col-12 md:col-6">
<div class="field">
<label class="font-semibold">Session ID</label>
<div class="text-sm">#{auditBean.evenementSelectionne.sessionId}</div>
</div>
</div>
<div class="col-12">
<div class="field">
<label class="font-semibold">User Agent</label>
<div class="text-sm">#{auditBean.evenementSelectionne.userAgent}</div>
</div>
</div>
</div>
</ui:define>
</ui:include>
</div>
</div>
<f:facet name="footer">
<ui:include src="/templates/components/buttons/button-secondary.xhtml">
<ui:param name="value" value="Fermer" />
<ui:param name="icon" value="pi pi-times" />
<ui:param name="onclick" value="PF('dlgDetails').hide();" />
<ui:param name="outlined" value="true" />
</ui:include>
</f:facet>
</p:dialog>
</h:form>
<!-- Dialog Export -->
<h:form id="formExport">
<p:dialog id="exportDialog"
widgetVar="exportDialog"
header="Exporter le Journal d'Audit"
modal="true"
resizable="false"
style="width: 90vw; max-width: 500px;">
<div class="grid">
<div class="col-12">
<div class="field">
<p:outputLabel for="formatExport" value="Format d'Export" />
<p:selectOneRadio id="formatExport"
value="#{auditBean.formatExport}"
layout="grid"
columns="1">
<f:selectItem itemLabel="Excel (.xlsx)" itemValue="EXCEL" />
<f:selectItem itemLabel="PDF" itemValue="PDF" />
<f:selectItem itemLabel="CSV" itemValue="CSV" />
<f:selectItem itemLabel="JSON" itemValue="JSON" />
</p:selectOneRadio>
</div>
</div>
<div class="col-12">
<div class="field">
<p:selectBooleanCheckbox id="inclureFiltres"
value="#{auditBean.inclureFiltresExport}"
itemLabel="Inclure uniquement les données filtrées" />
</div>
</div>
</div>
<f:facet name="footer">
<div class="flex justify-content-end gap-2">
<ui:include src="/templates/components/buttons/button-secondary.xhtml">
<ui:param name="value" value="Annuler" />
<ui:param name="onclick" value="PF('exportDialog').hide();" />
<ui:param name="outlined" value="true" />
</ui:include>
<ui:include src="/templates/components/buttons/button-success.xhtml">
<ui:param name="value" value="Exporter" />
<ui:param name="icon" value="pi pi-download" />
<ui:param name="action" value="#{auditBean.exporter}" />
<ui:param name="update" value="none" />
</ui:include>
</div>
</f:facet>
</p:dialog>
</h:form>
</ui:define>
</ui:composition>