Configure Maven repository for unionflow-server-api dependency

This commit is contained in:
dahoud
2025-12-10 01:12:54 +00:00
commit 2910809949
1173 changed files with 435718 additions and 0 deletions

View File

@@ -0,0 +1,381 @@
<!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">Rôles et Permissions - UnionFlow</ui:define>
<ui:define name="content">
<div class="ui-fluid">
<!-- En-tête avec statistiques -->
<div class="grid mb-4">
<div class="col-12">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<div class="flex align-items-center justify-content-between mb-4">
<div>
<h2 class="text-900 font-bold text-4xl mb-2">
<i class="pi pi-shield text-blue-500 mr-3"></i>
Rôles et Permissions
</h2>
<p class="text-600 text-lg mb-0">
Gérez les rôles utilisateur et leurs permissions système
</p>
</div>
<div class="flex gap-2">
<p:commandButton value="Nouveau Rôle"
styleClass="p-button-success"
icon="pi pi-plus"
onclick="PF('nouveauRoleDialog').show()" />
<p:commandButton value="Permissions Globales"
styleClass="p-button-info p-button-outlined"
icon="pi pi-cog" />
</div>
</div>
<!-- KPIs -->
<div class="grid">
<div class="col-12 lg:col-3">
<div class="surface-100 border-round-lg p-4 text-center" style="min-height: 9rem">
<div class="text-2xl font-bold text-blue-500 mb-2">#{rolesBean.totalRoles}</div>
<div class="text-900 font-semibold mb-1">Rôles Totaux</div>
<div class="text-600 text-sm">Système et personnalisés</div>
</div>
</div>
<div class="col-12 lg:col-3">
<div class="surface-100 border-round-lg p-4 text-center" style="min-height: 9rem">
<div class="text-2xl font-bold text-green-500 mb-2">#{rolesBean.rolesActifs}</div>
<div class="text-900 font-semibold mb-1">Rôles Actifs</div>
<div class="text-600 text-sm">Utilisés actuellement</div>
</div>
</div>
<div class="col-12 lg:col-3">
<div class="surface-100 border-round-lg p-4 text-center" style="min-height: 9rem">
<div class="text-2xl font-bold text-orange-500 mb-2">#{rolesBean.utilisateursAvecRoles}</div>
<div class="text-900 font-semibold mb-1">Utilisateurs</div>
<div class="text-600 text-sm">Avec rôles assignés</div>
</div>
</div>
<div class="col-12 lg:col-3">
<div class="surface-100 border-round-lg p-4 text-center" style="min-height: 9rem">
<div class="text-2xl font-bold text-purple-500 mb-2">#{rolesBean.permissionsUniques}</div>
<div class="text-900 font-semibold mb-1">Permissions</div>
<div class="text-600 text-sm">Définies au total</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Filtres et Actions -->
<div class="grid mb-4">
<div class="col-12">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<h:form id="filtresForm">
<div class="formgrid grid">
<div class="field col-12 lg:col-4">
<label for="filtreNom" class="block text-900 font-semibold mb-2">
<i class="pi pi-search mr-2"></i>Recherche
</label>
<p:inputText id="filtreNom"
value="#{rolesBean.filtreNom}"
placeholder="Nom du rôle..."
styleClass="w-full">
<p:ajax event="keyup" update=":tableauForm:tableauRoles" delay="500" />
</p:inputText>
</div>
<div class="field col-12 lg:col-3">
<label for="filtreType" class="block text-900 font-semibold mb-2">
<i class="pi pi-filter mr-2"></i>Type de Rôle
</label>
<p:selectOneMenu id="filtreType"
value="#{rolesBean.filtreType}"
styleClass="w-full">
<f:selectItem itemLabel="Tous les types" itemValue="" />
<f:selectItem itemLabel="Rôle Système" itemValue="SYSTEME" />
<f:selectItem itemLabel="Rôle Personnalisé" itemValue="PERSONNALISE" />
<f:selectItem itemLabel="Rôle Temporaire" itemValue="TEMPORAIRE" />
<p:ajax update=":tableauForm:tableauRoles" />
</p:selectOneMenu>
</div>
<div class="field col-12 lg:col-3">
<label for="filtreStatut" class="block text-900 font-semibold mb-2">
<i class="pi pi-circle mr-2"></i>Statut
</label>
<p:selectOneMenu id="filtreStatut"
value="#{rolesBean.filtreStatut}"
styleClass="w-full">
<f:selectItem itemLabel="Tous les statuts" itemValue="" />
<f:selectItem itemLabel="Actif" itemValue="ACTIF" />
<f:selectItem itemLabel="Inactif" itemValue="INACTIF" />
<f:selectItem itemLabel="Suspendu" itemValue="SUSPENDU" />
<p:ajax update=":tableauForm:tableauRoles" />
</p:selectOneMenu>
</div>
<div class="field col-12 lg:col-2">
<label class="block text-900 font-semibold mb-2">&#160;</label>
<div class="flex gap-2">
<p:commandButton value="Reset"
icon="pi pi-refresh"
styleClass="p-button-outlined w-full"
action="#{rolesBean.reinitialiserFiltres}"
update="@form :tableauForm:tableauRoles" />
</div>
</div>
</div>
</h:form>
</div>
</div>
</div>
<!-- Tableau des Rôles -->
<div class="grid">
<div class="col-12">
<div class="card surface-0 hover:surface-100 border-round-lg transition-all transition-duration-200">
<h:form id="tableauForm">
<p:dataTable id="tableauRoles"
value="#{rolesBean.rolesFiltres}"
var="role"
paginator="true"
rows="10"
paginatorPosition="both"
rowsPerPageTemplate="5,10,15,25,50"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown} {CurrentPageReport}"
currentPageReportTemplate="Affichage {startRecord}-{endRecord} sur {totalRecords} rôles"
emptyMessage="Aucun rôle trouvé"
styleClass="p-datatable-sm p-datatable-striped"
sortMode="multiple"
allowUnsorting="true">
<p:column headerText="Rôle" sortBy="#{role.nom}" style="width: 25%">
<div class="flex align-items-center">
<div class="w-3rem h-3rem border-circle flex align-items-center justify-content-center mr-3"
style="background: #{role.couleurFond}; color: #{role.couleurTexte};">
<i class="#{role.icone}"></i>
</div>
<div>
<div class="font-semibold text-900 mb-1">#{role.nom}</div>
<div class="text-600 text-sm">#{role.description}</div>
</div>
</div>
</p:column>
<p:column headerText="Type" sortBy="#{role.type}" style="width: 15%">
<p:tag value="#{role.typeLibelle}"
severity="#{role.typeSeverity}"
styleClass="font-semibold" />
</p:column>
<p:column headerText="Permissions" style="width: 20%">
<div class="flex flex-wrap gap-1">
<ui:repeat value="#{role.permissionsPrincipales}" var="perm" varStatus="status">
<p:tag value="#{perm}"
severity="info"
styleClass="text-xs"
rendered="#{status.index lt 3}" />
</ui:repeat>
<p:tag value="+#{role.permissionsCount - 3} autres"
severity="secondary"
styleClass="text-xs"
rendered="#{role.permissionsCount gt 3}" />
</div>
</p:column>
<p:column headerText="Utilisateurs" sortBy="#{role.nombreUtilisateurs}" style="width: 10%" styleClass="text-center">
<div class="text-900 font-semibold">#{role.nombreUtilisateurs}</div>
<div class="text-600 text-xs">assignés</div>
</p:column>
<p:column headerText="Statut" sortBy="#{role.statut}" style="width: 10%" styleClass="text-center">
<p:tag value="#{role.statutLibelle}"
severity="#{role.statutSeverity}"
styleClass="font-semibold" />
</p:column>
<p:column headerText="Dernière Modif." sortBy="#{role.dateModification}" style="width: 12%">
<div class="text-900">#{role.dateModificationFormatee}</div>
<div class="text-600 text-xs">#{role.modifiePar}</div>
</p:column>
<p:column headerText="Actions" style="width: 8%" styleClass="text-center">
<div class="flex justify-content-center gap-1">
<p:commandButton icon="pi pi-eye"
styleClass="p-button-sm p-button-rounded"
style="background-color: #17a2b8 !important; border-color: #17a2b8 !important; color: white !important;"
title="Voir les détails"
action="#{rolesBean.voirRole(role)}"
onclick="PF('detailsRoleDialog').show()" />
<p:commandButton icon="pi pi-pencil"
styleClass="p-button-sm p-button-rounded"
style="background-color: #ffc107 !important; border-color: #ffc107 !important; color: #212529 !important;"
title="Modifier"
action="#{rolesBean.modifierRole(role)}"
onclick="PF('modifierRoleDialog').show()"
rendered="#{role.modifiable}" />
<p:commandButton icon="pi pi-users"
styleClass="p-button-sm p-button-rounded"
style="background-color: #28a745 !important; border-color: #28a745 !important; color: white !important;"
title="Gérer les utilisateurs"
action="#{rolesBean.gererUtilisateurs(role)}"
onclick="PF('utilisateursRoleDialog').show()" />
<p:commandButton icon="pi pi-trash"
styleClass="p-button-sm p-button-rounded"
style="background-color: #dc3545 !important; border-color: #dc3545 !important; color: white !important;"
title="Supprimer"
rendered="#{role.supprimable}">
<p:confirm message="Êtes-vous sûr de vouloir supprimer ce rôle ?"
icon="pi pi-exclamation-triangle" />
</p:commandButton>
</div>
</p:column>
</p:dataTable>
</h:form>
</div>
</div>
</div>
<!-- Dialog Nouveau Rôle -->
<p:dialog id="nouveauRoleDialog"
widgetVar="nouveauRoleDialog"
header="Créer un Nouveau Rôle"
modal="true"
width="600"
height="500"
styleClass="surface-0">
<h:form id="nouveauRoleForm">
<div class="ui-fluid">
<div class="formgrid grid">
<div class="field col-12">
<label for="nomRole" class="block text-900 font-semibold mb-2">Nom du Rôle *</label>
<p:inputText id="nomRole"
value="#{rolesBean.nouveauRole.nom}"
required="true"
placeholder="Ex: Gestionnaire Comptabilité"
styleClass="w-full" />
</div>
<div class="field col-12">
<label for="descriptionRole" class="block text-900 font-semibold mb-2">Description</label>
<p:inputTextarea id="descriptionRole"
value="#{rolesBean.nouveauRole.description}"
rows="3"
placeholder="Description des responsabilités de ce rôle..."
styleClass="w-full" />
</div>
<div class="field col-6">
<label for="typeRole" class="block text-900 font-semibold mb-2">Type de Rôle *</label>
<p:selectOneMenu id="typeRole"
value="#{rolesBean.nouveauRole.type}"
required="true"
styleClass="w-full">
<f:selectItem itemLabel="Sélectionner..." itemValue="" />
<f:selectItem itemLabel="Rôle Personnalisé" itemValue="PERSONNALISE" />
<f:selectItem itemLabel="Rôle Temporaire" itemValue="TEMPORAIRE" />
</p:selectOneMenu>
</div>
<div class="field col-6">
<label for="iconeRole" class="block text-900 font-semibold mb-2">Icône</label>
<p:selectOneMenu id="iconeRole"
value="#{rolesBean.nouveauRole.icone}"
styleClass="w-full">
<f:selectItem itemLabel="pi pi-users" itemValue="pi pi-users" />
<f:selectItem itemLabel="pi pi-user-edit" itemValue="pi pi-user-edit" />
<f:selectItem itemLabel="pi pi-cog" itemValue="pi pi-cog" />
<f:selectItem itemLabel="pi pi-briefcase" itemValue="pi pi-briefcase" />
<f:selectItem itemLabel="pi pi-shield" itemValue="pi pi-shield" />
</p:selectOneMenu>
</div>
<div class="field col-12">
<label class="block text-900 font-semibold mb-2">Permissions</label>
<p:selectManyCheckbox id="permissions"
value="#{rolesBean.nouveauRole.permissions}"
layout="grid"
columns="2">
<f:selectItems value="#{rolesBean.permissionsDisponibles}"
var="perm"
itemLabel="#{perm.libelle}"
itemValue="#{perm.code}" />
</p:selectManyCheckbox>
</div>
</div>
<div class="flex justify-content-end gap-2 mt-4">
<p:commandButton value="Annuler"
styleClass="p-button-outlined"
onclick="PF('nouveauRoleDialog').hide()"
type="button" />
<p:commandButton value="Créer le Rôle"
styleClass="p-button-success"
icon="pi pi-save"
action="#{rolesBean.creerRole}"
update="@form :tableauForm:tableauRoles"
oncomplete="if (args &amp;&amp; !args.validationFailed) PF('nouveauRoleDialog').hide()" />
</div>
</div>
</h:form>
</p:dialog>
<!-- Dialog Détails Rôle -->
<p:dialog id="detailsRoleDialog"
widgetVar="detailsRoleDialog"
header="#{rolesBean.roleSelectionne.nom} - Détails"
modal="true"
width="700"
height="600"
styleClass="surface-0">
<div class="ui-fluid">
<div class="grid" rendered="#{rolesBean.roleSelectionne != null}">
<div class="col-12">
<div class="surface-100 border-round-lg p-4 mb-4">
<div class="flex align-items-center mb-3">
<div class="w-4rem h-4rem border-circle flex align-items-center justify-content-center mr-4"
style="background: #{rolesBean.roleSelectionne.couleurFond}; color: #{rolesBean.roleSelectionne.couleurTexte};">
<i class="#{rolesBean.roleSelectionne.icone} text-2xl"></i>
</div>
<div>
<h3 class="text-900 font-bold text-xl mb-1">#{rolesBean.roleSelectionne.nom}</h3>
<p class="text-600 mb-2">#{rolesBean.roleSelectionne.description}</p>
<div class="flex gap-2">
<p:tag value="#{rolesBean.roleSelectionne.typeLibelle}" severity="#{rolesBean.roleSelectionne.typeSeverity}" />
<p:tag value="#{rolesBean.roleSelectionne.statutLibelle}" severity="#{rolesBean.roleSelectionne.statutSeverity}" />
</div>
</div>
</div>
</div>
<div class="grid">
<div class="col-12 lg:col-6">
<h4 class="text-900 font-semibold mb-3">Permissions Accordées</h4>
<div class="surface-100 border-round p-3" style="max-height: 300px; overflow-y: auto;">
<ui:repeat value="#{rolesBean.roleSelectionne.permissionsDetaillees}" var="perm">
<div class="flex align-items-center mb-2">
<i class="pi pi-check text-green-500 mr-2"></i>
<span class="text-900">#{perm.libelle}</span>
</div>
</ui:repeat>
</div>
</div>
<div class="col-12 lg:col-6">
<h4 class="text-900 font-semibold mb-3">Utilisateurs Assignés</h4>
<div class="surface-100 border-round p-3" style="max-height: 300px; overflow-y: auto;">
<ui:repeat value="#{rolesBean.roleSelectionne.utilisateursAssignes}" var="user">
<div class="flex align-items-center mb-2">
<i class="pi pi-user text-blue-500 mr-2"></i>
<span class="text-900">#{user.nom} #{user.prenom}</span>
</div>
</ui:repeat>
</div>
</div>
</div>
</div>
</div>
</div>
</p:dialog>
</div>
</ui:define>
</ui:composition>