Configure Maven repository for unionflow-server-api dependency
This commit is contained in:
@@ -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"> </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 && !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>
|
||||
Reference in New Issue
Block a user