This commit is contained in:
kenza 2026-08-03 13:29:20 +01:00
parent 9d821b9bb1
commit 5197187cf7
16 changed files with 655 additions and 311 deletions

View File

@ -14,6 +14,7 @@ import com.triz.util.UtilContext;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
@ -60,7 +61,8 @@ public class FormGroupBean {
}
if (groupe != null) {
System.out.println("hello 1");
groupeSelected = service.getGroupsById(groupe);
UUID id = UUID.fromString(groupe);
groupeSelected = service.getGroupsById(id);
} else {
System.out.println("hello 2");
if (canEdit) {
@ -95,32 +97,39 @@ public class FormGroupBean {
}
public void ajouterFonctionnalitesAuGroupe() {
System.out.println("target " + Target.size());
if (Target != null && !Target.isEmpty()) {
if (listeFonctionnalite == null) {
listeFonctionnalite = new ArrayList<>();
}
for (ServiceFonctionnaliter f : Target) {
boolean existe = false;
System.out.println("existe " + existe);
for (ServiceFonctiongroupe fg : listeFonctionnalite) {
if (fg.getFkFonctionnalite().getId().equals(f.getId())) {
existe = true;
break;
}
}
System.out.println("existe 2 " + existe);
if (!existe) {
ServiceFonctiongroupe newFg = new ServiceFonctiongroupe();
// newFg.setId(groupeSelected.getId() + f.getId());
// newFg.setId(groupeSelected.getId() + f.getId());
UUID id = UUID.randomUUID();
while (service.getFonctiongroupeById(id) != null) {
id = UUID.randomUUID();
}
newFg.setId(id);
newFg.setFkFonctionnalite(f);
newFg.setFkGroupe(groupeSelected);
newFg.setCanSee(true);
newFg.setCanCreate(true);
newFg.setCanUpdate(true);
newFg.setCanDelete(true);
newFg.setCanUpdateDate(true);
listeFonctionnalite.add(newFg);
System.out.println("listeFonctionnalite " + listeFonctionnalite.size());
}
}
@ -145,25 +154,36 @@ public class FormGroupBean {
public String saveGroupe() {
if (isNew) {
System.out.println("hello from save 1");
UUID id = UUID.randomUUID();
while (service.getGroupsById(id) != null) {
id = UUID.randomUUID();
}
groupeSelected.setId(id);
groupeSelected.setActif("true");
service.save(groupeSelected);
context.saveNewManipulation("Groupe", groupeSelected.getNomGroupe(), "Ajouter Groupe", new Date(), new Date(), user,"", "");
}else{
context.saveNewManipulation("Groupe", groupeSelected.getNomGroupe(), "Ajouter Groupe", new Date(), new Date(), user, "", "");
} else {
System.out.println("hello from save 2");
service.save(groupeSelected);
context.saveNewManipulation("Groupe", groupeSelected.getNomGroupe(), "Modifier Groupe", new Date(), new Date(), user, "", "");
}
// Sauvegarde des fonctionnalités (ajoutées ou modifiées)
if (listeFonctionnalite != null) {
for (ServiceFonctiongroupe fg : listeFonctionnalite) {
System.out.println("ID FG = " + fg.getId());
System.out.println("EXISTE = " + service.getFonctiongroupeById(fg.getId()));
service.saveFonctionsGroupes(fg);
context.saveNewManipulation("Groupe", groupeSelected.getNomGroupe(), "Ajouter Fonction groupe", new Date(), new Date(), user, "", fg.getFkFonctionnalite().getNom());
}
}
// Suppression des fonctionnalités supprimées
if (listeFonctionsASupprimer != null) {
for (ServiceFonctiongroupe fg : listeFonctionsASupprimer) {
System.out.println("DELETE : " + fg.getId());
service.removeFonctionsGroupes(fg);
context.saveNewManipulation("Groupe", groupeSelected.getNomGroupe(), "Supprimer Fonction groupe", new Date(), new Date(), user, fg.getFkFonctionnalite().getNom(), "");
}
listeFonctionsASupprimer.clear(); // Nettoyage
}

View File

@ -20,10 +20,10 @@ import org.springframework.stereotype.Component;
*
* @author Asma
*/
@Component("groupBean")
@Scope("view")
public class GroupBean {
private ServiceUser user;
private ServiceGroupe groupeSelected;
private List<ServiceFonctionnaliter> listeFonctionnalite;
@ -42,8 +42,8 @@ public class GroupBean {
listeGroupe = service.getAllGroups();
listeFonctionnalite = service.getAllFonctionalite();
}
public String ajouterGroupe() {
public String ajouterGroupe() {
return "form.xhtml?faces-redirect=true&canEdit=true";
}
@ -82,4 +82,15 @@ public class GroupBean {
public void setListeGroupe(List<ServiceGroupe> listeGroupe) {
this.listeGroupe = listeGroupe;
}
public int getNbrUtilisateur(ServiceGroupe groupe) {
int nbrUtilisateur = service.getNbrUtilisateurParGroupe(groupe);
return nbrUtilisateur;
}
public int getNbrFonctionnalite(ServiceGroupe groupe) {
int nbrFonctionnalite = service.getNbrFonctionnaliteParGroupe(groupe);
return nbrFonctionnalite;
}
}

View File

@ -6,6 +6,7 @@ package com.triz.trizservice.bean.converter;
import com.triz.trizservice.modeles.ServiceGroupe;
import com.triz.trizservice.service.TransactionService;
import java.util.UUID;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
@ -28,7 +29,8 @@ public class GroupeConverter implements Converter{
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
try {
System.out.println("service "+ service);
return service.getGroupsById(value);
UUID id = UUID.fromString(value);
return service.getGroupsById(id);
} catch (NumberFormatException e) {
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Entreprise n'existe pas.");
}

View File

@ -41,6 +41,8 @@ public class ServiceFonctiongroupe implements Serializable {
@Column(name = "can_create")
private Boolean canCreate;
@Column(name = "can_see")
private Boolean canSee;
@Column(name = "can_update")
private Boolean canUpdate;
@Column(name = "can_update_date")
@ -55,7 +57,6 @@ public class ServiceFonctiongroupe implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private UUID id;
@ -163,6 +164,14 @@ public class ServiceFonctiongroupe implements Serializable {
this.fkFonctionnalite = fkFonctionnalite;
}
public Boolean getCanSee() {
return canSee;
}
public void setCanSee(Boolean canSee) {
this.canSee = canSee;
}

View File

@ -6,9 +6,11 @@ package com.triz.trizservice.modeles;
import java.io.Serializable;
import java.util.Date;
import java.util.UUID;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@ -33,10 +35,8 @@ import javax.xml.bind.annotation.XmlRootElement;
@NamedQuery(name = "ServiceHistoriqueManipulation.findById", query = "SELECT s FROM ServiceHistoriqueManipulation s WHERE s.id = :id"),
@NamedQuery(name = "ServiceHistoriqueManipulation.findByNomTable", query = "SELECT s FROM ServiceHistoriqueManipulation s WHERE s.nomTable = :nomTable"),
@NamedQuery(name = "ServiceHistoriqueManipulation.findByIdLigne", query = "SELECT s FROM ServiceHistoriqueManipulation s WHERE s.idLigne = :idLigne"),
@NamedQuery(name = "ServiceHistoriqueManipulation.findByTypeManipumation", query = "SELECT s FROM ServiceHistoriqueManipulation s WHERE s.typeManipumation = :typeManipumation"),
@NamedQuery(name = "ServiceHistoriqueManipulation.findByDateManipulation", query = "SELECT s FROM ServiceHistoriqueManipulation s WHERE s.dateManipulation = :dateManipulation"),
@NamedQuery(name = "ServiceHistoriqueManipulation.findByHeurManipulation", query = "SELECT s FROM ServiceHistoriqueManipulation s WHERE s.heurManipulation = :heurManipulation"),
@NamedQuery(name = "ServiceHistoriqueManipulation.findByOldValeur", query = "SELECT s FROM ServiceHistoriqueManipulation s WHERE s.oldValeur = :oldValeur"),
@NamedQuery(name = "ServiceHistoriqueManipulation.findByOldValeur", query = "SELECT s FROM ServiceHistoriqueManipulation s WHERE s.oldValeur = :oldValeur"),
@NamedQuery(name = "ServiceHistoriqueManipulation.findByNewValeur", query = "SELECT s FROM ServiceHistoriqueManipulation s WHERE s.newValeur = :newValeur")})
public class ServiceHistoriqueManipulation implements Serializable {
@ -66,33 +66,29 @@ public class ServiceHistoriqueManipulation implements Serializable {
@Id
@Basic(optional = false)
@NotNull
@GeneratedValue
@Column(name = "id")
private Long id;
@Size(max = 2147483647)
@Column(name = "type_manipumation")
private String typeManipumation;
private UUID id;
@Column(name = "date_manipulation")
@Temporal(TemporalType.DATE)
private Date dateManipulation;
@Column(name = "heur_manipulation")
@Temporal(TemporalType.TIME)
private Date heurManipulation;
@JoinColumn(name = "fk_manipulateur", referencedColumnName = "userid")
@ManyToOne
private ServiceUser fkManipulateur;
public ServiceHistoriqueManipulation() {
}
public ServiceHistoriqueManipulation(Long id) {
public ServiceHistoriqueManipulation(UUID id) {
this.id = id;
}
public Long getId() {
public UUID getId() {
return id;
}
public void setId(Long id) {
public void setId(UUID id) {
this.id = id;
}
@ -112,13 +108,6 @@ public class ServiceHistoriqueManipulation implements Serializable {
this.idLigne = idLigne;
}
public String getTypeManipumation() {
return typeManipumation;
}
public void setTypeManipumation(String typeManipumation) {
this.typeManipumation = typeManipumation;
}
public Date getDateManipulation() {
return dateManipulation;
@ -128,21 +117,6 @@ public class ServiceHistoriqueManipulation implements Serializable {
this.dateManipulation = dateManipulation;
}
public Date getHeurManipulation() {
return heurManipulation;
}
public void setHeurManipulation(Date heurManipulation) {
this.heurManipulation = heurManipulation;
}
public ServiceUser getFkManipulateur() {
return fkManipulateur;
}
public void setFkManipulateur(ServiceUser fkManipulateur) {
this.fkManipulateur = fkManipulateur;
}
@Override
public int hashCode() {
@ -169,7 +143,6 @@ public class ServiceHistoriqueManipulation implements Serializable {
return "com.triz.trizservice.modeles.ServiceHistoriqueManipulation[ id=" + id + " ]";
}
public String getNewValeur() {
return newValeur;
}
@ -210,6 +183,4 @@ public class ServiceHistoriqueManipulation implements Serializable {
this.fkUser = fkUser;
}
}

View File

@ -65,7 +65,7 @@ public class ServiceUser implements Serializable {
@Size(max = 2147483647)
@Column(name = "user_pw")
private String userpw;
@OneToMany(mappedBy = "fkManipulateur")
@OneToMany(mappedBy = "fkUser")
private List<ServiceHistoriqueManipulation> serviceHistoriqueManipulationList;
@OneToMany(mappedBy = "fkUser")

View File

@ -18,6 +18,7 @@ import com.triz.trizservice.modeles.ServiceHistoriqueManipulation;
import com.triz.trizservice.modeles.ServiceUserCentre;
import com.triz.trizservice.modeles.Wilaya;
import java.util.List;
import java.util.UUID;
/**
*
@ -39,7 +40,7 @@ public interface DaoService {
public void saveUser(ServiceUser object);
public ServiceGroupe getGroupsById(String id);
public ServiceGroupe getGroupsById(UUID id);
public void saveGroup(ServiceGroupe object);
@ -109,4 +110,10 @@ public interface DaoService {
public List<Wilaya> getAllWilaya();
public int getNbrUtilisateurParGroupe(ServiceGroupe groupe);
public int getNbrFonctionnaliteParGroupe(ServiceGroupe groupe);
public ServiceFonctiongroupe getFonctiongroupeById(UUID id);
}

View File

@ -20,6 +20,7 @@ import com.triz.trizservice.modeles.ServiceHistoriqueManipulation;
import com.triz.trizservice.modeles.ServiceUserCentre;
import com.triz.trizservice.modeles.Wilaya;
import java.util.List;
import java.util.UUID;
/**
*
@ -41,7 +42,7 @@ public interface TransactionService {
public void saveUser(ServiceUser object);
public ServiceGroupe getGroupsById(String id);
public ServiceGroupe getGroupsById(UUID id);
public void saveGroup(ServiceGroupe object);
@ -110,4 +111,10 @@ public interface TransactionService {
public ServicehistoriqueConnection getLastStockHistoriqueConnectionByUsers(ServiceUser user);
public List<Wilaya> getAllWilaya();
public int getNbrUtilisateurParGroupe(ServiceGroupe groupe);
public int getNbrFonctionnaliteParGroupe(ServiceGroupe groupe);
public ServiceFonctiongroupe getFonctiongroupeById(UUID id);
}

View File

@ -19,6 +19,7 @@ import com.triz.trizservice.modeles.ServiceUserCentre;
import com.triz.trizservice.modeles.Wilaya;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.annotation.Resource;
import javax.persistence.NoResultException;
import javax.persistence.criteria.CriteriaBuilder;
@ -95,7 +96,7 @@ public class DaoServiceImpl implements DaoService {
}
@Override
public ServiceGroupe getGroupsById(String id) {
public ServiceGroupe getGroupsById(UUID id) {
return (ServiceGroupe) getCurrentSession().createCriteria(ServiceGroupe.class).add(Restrictions.eq("id", id)).setMaxResults(1).uniqueResult();
}
@ -268,23 +269,39 @@ public class DaoServiceImpl implements DaoService {
}
@Override
public ServiceUserCentre getAllUserCentreByCentreByUser(Centre etablissement,ServiceUser user) {
public ServiceUserCentre getAllUserCentreByCentreByUser(Centre etablissement, ServiceUser user) {
return (ServiceUserCentre) getCurrentSession().createCriteria(ServiceUserCentre.class).add(Restrictions.eq("fkCentre", etablissement)).add(Restrictions.eq("fkUser", user)).setMaxResults(1).uniqueResult();
}
}
@Override
public List<ServiceFonctionnaliter> getFonctionServerByUsersByEtablissement(ServiceUser user, Centre etablissement) {
return getCurrentSession().createQuery("select sf from ServiceFonctionnaliter sf,ServiceFonctiongroupe sfg, ServiceMember mem where sf.id=sfg.fkFonctionnalite and sfg.fkGroupe= mem.fkGroupe and mem.fkUser=:user and mem.fkGroupe.fkCentre=:etab ").setParameter("etab", etablissement).setParameter("user", user).list();
return getCurrentSession().createQuery("select sf from ServiceFonctionnaliter sf,ServiceFonctiongroupe sfg, ServiceMember mem where sf.id=sfg.fkFonctionnalite and sfg.fkGroupe= mem.fkGroupe and mem.fkUser=:user and mem.fkGroupe.fkCentre=:etab ").setParameter("etab", etablissement).setParameter("user", user).list();
}
@Override
public ServicehistoriqueConnection getLastStockHistoriqueConnectionByUsers(ServiceUser user) {
return (ServicehistoriqueConnection) getCurrentSession().createCriteria(ServicehistoriqueConnection.class).add(Restrictions.eq("fkUser", user)).addOrder(Order.desc("id")).setMaxResults(1).uniqueResult();
}
}
@Override
public List<Wilaya> getAllWilaya() {
return getCurrentSession().createQuery("select m from Wilaya m ").list();
return getCurrentSession().createQuery("select m from Wilaya m ").list();
}
@Override
public int getNbrUtilisateurParGroupe(ServiceGroupe groupe) {
Long count = (Long) getCurrentSession().createQuery("select count(m) from ServiceGroupe m, ServiceMember f where m.id=f.fkGroupe.id and m.id=:groupe ").setParameter("groupe", groupe.getId()).uniqueResult();
return count.intValue();
}
@Override
public int getNbrFonctionnaliteParGroupe(ServiceGroupe groupe) {
Long count = (Long) getCurrentSession().createQuery("select count(m) from ServiceGroupe m, ServiceFonctiongroupe f where m.id=f.fkGroupe.id and m.id=:groupe ").setParameter("groupe", groupe.getId()).uniqueResult();
return count.intValue();
}
@Override
public ServiceFonctiongroupe getFonctiongroupeById(UUID id) {
return (ServiceFonctiongroupe)getCurrentSession().createQuery("select m from ServiceFonctiongroupe m where m.id=:id ").setParameter("id", id).setMaxResults(1).uniqueResult();
}
}

View File

@ -20,6 +20,7 @@ import com.triz.trizservice.modeles.Wilaya;
import com.triz.trizservice.service.DaoService;
import com.triz.trizservice.service.TransactionService;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -66,7 +67,7 @@ public class TransactionServiceImpl implements TransactionService {
@Transactional("transactionManager")
@Override
public ServiceGroupe getGroupsById(String id) {
public ServiceGroupe getGroupsById(UUID id) {
return daoService.getGroupsById(id);
}
@ -285,4 +286,22 @@ public class TransactionServiceImpl implements TransactionService {
public List<Wilaya> getAllWilaya() {
return daoService.getAllWilaya();
}
@Transactional("transactionManager")
@Override
public int getNbrUtilisateurParGroupe(ServiceGroupe groupe) {
return daoService.getNbrUtilisateurParGroupe(groupe);
}
@Transactional("transactionManager")
@Override
public int getNbrFonctionnaliteParGroupe(ServiceGroupe groupe) {
return daoService.getNbrFonctionnaliteParGroupe(groupe);
}
@Transactional("transactionManager")
@Override
public ServiceFonctiongroupe getFonctiongroupeById(UUID id) {
return daoService.getFonctiongroupeById(id);
}
}

View File

@ -27,6 +27,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.IOUtils;
@ -100,7 +101,6 @@ public class UtilContext {
}
}
public static ServiceIncrementation remiseAZeroIncr(ServiceIncrementation incr) {
System.out.println(" remiseAZeroIncr ");
Date date = new Date();
@ -323,7 +323,7 @@ public class UtilContext {
}
public String createZipFile(String bakFile, String bakFileName, String folder_name_origine) throws IOException {
System.out.println("createZipFile"+ bakFile);
System.out.println("createZipFile" + bakFile);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMddHHmm");
String fileOutput_name = bakFileName + ".zip";
@ -349,11 +349,12 @@ public class UtilContext {
System.out.println("fileOutput.getPath():" + fileOutput.getPath());
return fileOutput.getPath();
}
String typeContenentBAK = "application/bak";
String typeContenentZip = "application/zip";
public StreamedContent getFileContent(String typeContenent, String pathGet) throws IOException {
System.out.println("get file content --starts");
File file = new File(pathGet);
@ -422,14 +423,15 @@ public class UtilContext {
public void saveNewManipulation(String nomTable, String idLigne, String typeManipulation, Date date, Date heur, ServiceUser user, String oldValour, String newValeur) {
historiqueManipulation = new ServiceHistoriqueManipulation();
historiqueManipulation.setFkManipulateur(user);
historiqueManipulation.setFkUser(user);
historiqueManipulation.setIdLigne(idLigne);
historiqueManipulation.setNomTable(nomTable);
historiqueManipulation.setTypeManipumation(typeManipulation);
historiqueManipulation.setTypeManipulation(typeManipulation);
historiqueManipulation.setOldValeur(oldValour);
historiqueManipulation.setNewValeur(newValeur);
historiqueManipulation.setDateManipulation(new Date());
historiqueManipulation.setHeurManipulation(new Date());
historiqueManipulation.setHeureManipulation(new Date());
service.save(historiqueManipulation);
}
@ -437,13 +439,13 @@ public class UtilContext {
SimpleDateFormat simpleDate = new SimpleDateFormat("yy");
return simpleDate.format(date);
}
public boolean isOnLigneUser() {
ServiceUser user = getCurrentUser();
return false;
}
public Centre getCurrentEtablissement() {
public Centre getCurrentEtablissement() {
System.out.println("UtilURLStock.getStock_CODE_SYSTEM() " + UtilURL.getStock_CODE_SYSTEM());
Centre etablissemnt = service.getEtablissementById(UtilURL.getStock_CODE_SYSTEM());
if (etablissemnt != null) {
@ -451,10 +453,8 @@ public class UtilContext {
}
return null;
}
public boolean canChangeEtablissement() {
public boolean canChangeEtablissement() {
ServiceUser user = getCurrentUser();
List<Centre> listeEtablissement = service.getAllStockEtablissementFromUsersEtablissementByUser(user);
if (listeEtablissement != null) {

View File

@ -620,3 +620,6 @@ INSERT INTO service_fonctionnaliter (id, nom) VALUES
('medecins', 'Médecins'),
('groupes', 'Groupes et fonctionnalités');
ALTER TABLE service_fonctiongroupe
ADD COLUMN can_see boolean;

View File

@ -4305,3 +4305,5 @@ service.page.Telephone.ajouter = Ajouter Telephone
service.page.Telephone.liste.message.non=Pas de telephone enregistr\u00e9 !
distribution.buttons.changerEtablissement=changer Centre
distribution.page.etablissement.selectionner=Veuillez s\u00e9l\u00e9ctionner un centre
distribution.page.fonctionGroup.voir=Voir
distribution.page.fonctionGroup.modifierCeJour=modifier le jour meme

View File

@ -81,103 +81,91 @@
<pu:menu widgetVar="layoutMenuWidget">
<!-- ========================================================= -->
<!-- DASHBOARD -->
<!-- ========================================================= -->
<p:submenu id="m_dashboard"
label=""
rendered="#{utilControleAccess.isshow1('dashboard')}">
rendered="#{utilControleAccess.isshow1('accueil')}">
<p:menuitem id="m_dashboardsales"
value="Statistique"
icon="pi pi-chart-bar"
url="#{request.contextPath}/favorites/dashboard.xhtml"
rendered="#{utilControleAccess.isshowPrivilegeAdd('dashboard')}" />
rendered="#{utilControleAccess.isshowPrivilegeAdd('accueil')}" />
</p:submenu>
<!-- ========================================================= -->
<!-- FLUX PATIENT -->
<!-- ========================================================= -->
<p:submenu id="m_donnee"
label="Flux Patient"
icon="pi pi-fw pi-database"
rendered="#{utilControleAccess.isshow1('rendez_vous')
or utilControleAccess.isshow1('file_attente')
or utilControleAccess.isshow1('examens')
or utilControleAccess.isshow1('dossier_patients')}">
rendered="#{utilControleAccess.isshow1('rdv')
or utilControleAccess.isshow1('attente')
or utilControleAccess.isshow1('exam')
or utilControleAccess.isshow1('dossier')}">
<p:menuitem id="m_rendez_vous"
value="Rendez-vous"
icon="pi pi-calendar"
url="#{request.contextPath}/views/client/listeClient.xhtml?idpage=Suivis_flotte"
rendered="#{utilControleAccess.isshowPrivilegeAdd('rendez_vous')}" />
rendered="#{utilControleAccess.isshowPrivilegeAdd('rdv')}" />
<p:menuitem id="m_file_attente"
value="File d’attente"
icon="pi pi-users"
url="#{request.contextPath}/views/secteur/list.xhtml?idpage=Suivis_flotte"
rendered="#{utilControleAccess.isshowPrivilegeAdd('file_attente')}" />
rendered="#{utilControleAccess.isshowPrivilegeAdd('attente')}" />
<p:menuitem id="m_examen"
value="Examens"
icon="pi pi-heart"
url="#{request.contextPath}/views/secteur/list.xhtml?idpage=Suivis_flotte"
rendered="#{utilControleAccess.isshowPrivilegeAdd('examens')}" />
rendered="#{utilControleAccess.isshowPrivilegeAdd('exam')}" />
<p:menuitem id="m_dossier_patients"
value="Dossier patients"
icon="pi pi-id-card"
url="#{request.contextPath}/views/client/listeClient.xhtml?idpage=Suivis_flotte"
rendered="#{utilControleAccess.isshowPrivilegeAdd('dossier_patients')}" />
rendered="#{utilControleAccess.isshowPrivilegeAdd('dossier')}" />
</p:submenu>
<!-- ========================================================= -->
<!-- SYSTEME -->
<!-- ========================================================= -->
<p:submenu id="m_Traitement"
label="Système"
icon="pi pi-arrow-right-arrow-left"
rendered="#{utilControleAccess.isshow1('dicom')
or utilControleAccess.isshow1('parametres')}">
rendered="#{utilControleAccess.isshow1('pacs')
or utilControleAccess.isshow1('param')}">
<p:menuitem id="m_Tiersmouvement"
value="DICOM / PACS"
icon="pi pi-database"
url="#{request.contextPath}/views/client/listeClient.xhtml?idpage=Suivis_flotte"
rendered="#{utilControleAccess.isshowPrivilegeAdd('dicom')}" />
rendered="#{utilControleAccess.isshowPrivilegeAdd('pacs')}" />
<p:menuitem id="m_Tiersletterage"
value="Paramètres"
icon="pi pi-cog"
url="#{request.contextPath}/views/client/listeClient.xhtml?idpage=Suivis_flotte"
rendered="#{utilControleAccess.isshowPrivilegeAdd('parametres')}" />
rendered="#{utilControleAccess.isshowPrivilegeAdd('param')}" />
</p:submenu>
<!-- ========================================================= -->
<!-- ADMINISTRATION -->
<!-- ========================================================= -->
<p:submenu id="m_admin"
label="Administration"
icon="pi pi-cog"
rendered="#{utilControleAccess.isshow1('user')
rendered="#{utilControleAccess.isshow1('users')
or utilControleAccess.isshow1('medecins')
or utilControleAccess.isshow1('groupe')}">
or utilControleAccess.isshow1('groupes')}">
<p:menuitem id="m_utilisateurs"
value="Utilisateurs &amp; Audit"
icon="pi pi-shield"
url="#{request.contextPath}/views/user/list.xhtml?idpage=Suivis_flotte"
rendered="#{utilControleAccess.isshowPrivilegeAdd('user')}" />
rendered="#{utilControleAccess.isshowPrivilegeAdd('users')}" />
<p:menuitem id="m_medecins"
value="Médecins"
@ -189,10 +177,9 @@
value="Groupes et fonctionnalités"
icon="pi pi-lock"
url="#{request.contextPath}/views/groupe/list.xhtml?idpage=Suivis_flotte"
rendered="#{utilControleAccess.isshowPrivilegeAdd('groupe')}" />
rendered="#{utilControleAccess.isshowPrivilegeAdd('groupes')}" />
</p:submenu>
</pu:menu>
<ui:fragment rendered="#{app.isBottomInlineMenu() or app.isBothInlineMenu()}">
<ui:include src="inlinemenu.xhtml" />

View File

@ -15,207 +15,301 @@
<ui:define name="content">
#{formGroupBean.init()}
<h:form id="form">
<div class="card">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 2rem;">
<style>
.groupe-card {
border-radius: 8px;
border: 0.5px solid #B4B2A9;
box-shadow: none;
}
.groupe-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2rem;
}
.groupe-header .retour-btn.ui-button {
border-radius: 8px;
background: #FFFFFF;
color: #333333;
border: 0.5px solid #B4B2A9;
}
.groupe-header .retour-btn.ui-button:hover {
background: #F1EFE8;
}
.groupe-nom-row {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 1.5rem;
}
.groupe-nom-row label {
font-weight: bold;
min-width: 140px;
}
.groupe-nom-row .ui-inputtext {
width: 300px;
border-radius: 8px;
}
<div style="width: 150px;">
<p:commandButton value="#{msg['distribution.page.etatVGlobal.retour']}" icon="pi pi-arrow-left"
action="#{formGroupBean.voirGroupe()}" ajax="false"
styleClass="ui-button-primary" />
</div>
<div style="flex-grow: 1; text-align: center; font-size: 1.3rem; font-weight: bold; color: #333;">
<h:outputText value="Groupe : #{formGroupBean.groupeSelected.nomGroupe}" />
</div>
<div style=" text-align: right; display: flex; gap: 5px;">
/* Bouton Ajouter (au-dessus du tableau) */
#form\:dataTable .ajouter-btn.ui-button {
background-color: #0D9488;
border-color: #0D9488;
border-radius: 20px;
}
#form\:dataTable .ajouter-btn.ui-button:hover {
background-color: rgba(13, 148, 136, 0.85);
border-color: rgba(13, 148, 136, 0.85);
}
/* Bouton Supprimer par ligne */
.delete-row-btn.ui-button {
background-color: #E74C3C;
border-color: #E74C3C;
border-radius: 8px;
width: 2rem;
height: 2rem;
}
.delete-row-btn.ui-button:hover {
background-color: #c0392b;
border-color: #c0392b;
}
/* Bouton Modifier (header) */
.groupe-header .modifier-btn.ui-button {
background-color: #0D9488 !important;
border-color: #0D9488 !important;
}
.groupe-header .modifier-btn.ui-button:hover {
background-color: rgba(13, 148, 136, 0.85) !important;
border-color: rgba(13, 148, 136, 0.85) !important;
}
/* Checkboxes cochées (mode édition) */
#form\:dataTable .ui-chkbox-box.ui-state-active {
background-color: #0D9488 !important;
border-color: #0D9488 !important;
}
#form\:dataTable .ui-chkbox-box.ui-state-active .ui-chkbox-icon {
color: #FFFFFF !important;
}
#form\:dataTable .ui-chkbox-box:not(.ui-state-disabled):hover {
border-color: #0D9488;
}
/* Checkboxes cochées ET désactivées (mode lecture) - même vert plein */
#form\:dataTable .ui-chkbox-box.ui-state-active.ui-state-disabled {
background-color: #0D9488 !important;
border-color: #0D9488 !important;
opacity: 1 !important;
}
#form\:dataTable .ui-chkbox-box.ui-state-active.ui-state-disabled .ui-chkbox-icon {
color: #FFFFFF !important;
}
.groupe-header .modifier-btn.ui-button:hover {
background-color: rgba(13, 148, 136, 0.85);
border-color: rgba(13, 148, 136, 0.85);
}
/* Boutons verts : teal */
.btn-teal.ui-button {
background: #0D9488 !important;
border-color: #0D9488 !important;
color: #FFFFFF !important;
}
.btn-teal.ui-button:hover {
background: #0B7F74 !important;
border-color: #0B7F74 !important;
}
/* Bouton loupe : radius réduit, pas circulaire */
.btn-teal-round.ui-button {
background: #0D9488 !important;
border-color: #0D9488 !important;
color: #FFFFFF !important;
border-radius: 6px !important;
width: 34px !important;
height: 34px !important;
}
.btn-teal-round.ui-button:hover {
background: #0B7F74 !important;
border-color: #0B7F74 !important;
}
</style>
<div class="card groupe-card">
<div class="groupe-header">
<p:commandButton value="#{msg['distribution.page.etatVGlobal.retour']}" icon="pi pi-arrow-left"
action="#{formGroupBean.voirGroupe()}" ajax="false"
styleClass="retour-btn" />
<div style="display: flex; gap: 5px;">
<p:commandButton value="#{msg['distribution.page.supprimer']}" icon="pi pi-trash"
rendered="#{ formGroupBean.canEdit and !formGroupBean.isNew}"
action="#{formGroupBean.supprimeGroupe()}" ajax="false"
styleClass="ui-button-danger" />
rendered="#{formGroupBean.canEdit and !formGroupBean.isNew}"
action="#{formGroupBean.supprimeGroupe()}" ajax="false"
styleClass="ui-button-danger"
rendered="#{utilControleAccess.isshowPrivilegeRemove('groupes')}"/>
<p:commandButton value="#{msg['distribution.page.enregistrer']}" icon="pi pi-save"
rendered="#{ formGroupBean.canEdit}"
rendered="#{formGroupBean.canEdit}"
action="#{formGroupBean.saveGroupe()}"
styleClass="ui-button-success" />
<p:commandButton value="#{msg['distribution.page.modifier']}" icon="pi pi-pencil"
rendered="#{ !formGroupBean.canEdit}"
rendered="#{!formGroupBean.canEdit}"
action="#{formGroupBean.editGroupe()}"
styleClass="ui-button-primary" />
styleClass="modifier-btn"
rendered="#{utilControleAccess.isshowPrivilegeUpdate('groupes')}"/>
</div>
</div>
<div style="width: 100%; height: 100%; display: flex; margin-bottom: 1px;" >
<p:card id="card" style="width: 35%; height: 750px; text-align: center; max-height: 100%" rendered="#{!formGroupBean.canEdit}">
<div style="flex-grow: 1; text-align: center; font-size: 1.3rem; font-weight: bold; color: #333; color: #3F51B5;">
<h:outputText value="#{formGroupBean.groupeSelected.nomGroupe}" />
<div class="groupe-nom-row">
<p:outputLabel for="idMod" value="#{msg['distribution.page.groupe.nom']} " />
<p:inputText id="idMod"
value="#{formGroupBean.groupeSelected.nomGroupe}"
disabled="#{!formGroupBean.canEdit}"
required="true"
requiredMessage="Le nom du groupe est obligatoire." />
</div>
<div class="groupe-nom-row">
<p:outputLabel for="actif" value="#{msg['distribution.page.user.actf']} " />
<p:selectOneMenu
id="actif"
value="#{formGroupBean.groupeSelected.actif}"
disabled="#{!formGroupBean.canEdit}"
requiredMessage="veuillez definir le statut de ce groupe"
required="true">
<f:selectItem itemLabel="Oui" itemValue="true" />
<f:selectItem itemLabel="Non" itemValue="false" />
<p:ajax event="change" />
</p:selectOneMenu>
</div>
<p:dataTable id="dataTable"
var="fonctionGroup"
value="#{formGroupBean.listeFonctionnalite}"
selection="#{formGroupBean.fonctionSelected}"
rowKey="#{fonctionGroup.id}"
selectionMode="single"
rows="30" paginator="true" draggableColumns="true"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="20,30,40,60,80,100"
styleClass="ui-datatable-striped">
<f:facet name="header">
<div class="flex justify-content-end align-items-center">
<p:commandButton value="#{msg['distribution.page.inventaire.facture.ajouter']}"
icon="pi pi-plus"
rendered="#{formGroupBean.canEdit}"
styleClass="btn-teal"
oncomplete="PF('dlg2').show()" />
</div>
<p:panelGrid columns="2" style="margin-top: 30px; text-align:left">
<p:column>
<i class="pi pi-id-card" style="margin-right: 5px"></i>
<p:outputLabel value="#{msg['distribution.page.groupe.nom']}" style="color: #3F51B5; font-weight: bold" />
</p:column>
<p:column>
<p:outputLabel id="id" value="#{formGroupBean.groupeSelected.nomGroupe}" />
</p:column>
</p:panelGrid>
</f:facet>
</p:card>
<div style="width: 75%; height: 100%; margin-left: 1%;">
<p:card style=" width: 100%; min-height: 750px; top: 160px; height: 100% " rendered="#{!formGroupBean.canEdit}" >
<p:tabView scrollable="true">
<p:tab title="#{msg['distribution.page.groupe.listeDeFonctionaliteGroupe']}" >
<p:dataTable id="dataTable" var="fonctionGroup"
rows="30" paginator="true" draggableColumns="true"
value="#{formGroupBean.listeFonctionnalite}"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="20,30,40,60,80,100"
selectionMode="single"
rowKey="#{fonctionGroup.id}">
<p:column style="text-align: center; width: 40px;" rendered="#{formGroupBean.canEdit}">
<p:commandButton icon="pi pi-trash"
styleClass="delete-row-btn rounded-button"
process="@this"
oncomplete="PF('deleteProductDialog').show()">
<f:setPropertyActionListener value="#{fonctionGroup}" target="#{formGroupBean.fonctionSelected}" />
</p:commandButton>
</p:column>
<p:column style=" text-align: center;" headerText="#{msg['distribution.page.fonctionalite.nom']}"
sortBy="#{fonctionGroup.fkFonction.fonction}" >
<h:outputText value="#{fonctionGroup.fkFonction.nom}" />
</p:column>
<p:column headerText="#{msg['distribution.page.fonctionalite.nom']}"
sortBy="#{fonctionGroup.fkFonctionnalite.nom}"
filterBy="#{fonctionGroup.fkFonctionnalite.nom}" filterMatchMode="contains"
style="text-align: center;">
<h:outputText value="#{fonctionGroup.fkFonctionnalite.nom}" />
</p:column>
<p:column style=" text-align: center;" headerText="#{msg['distribution.page.fonctionGroup.add']}"
>
<h:outputText value="#{fonctionGroup.canCreate=='true'? 'Oui' : 'Non'}" rendered="#{!formGroupBean.canEdit}"/>
</p:column>
<p:column style=" text-align: center;" headerText="#{msg['distribution.page.fonctionGroup.modifier']}"
>
<h:outputText value="#{fonctionGroup.canUpdate=='true'? 'Oui' : 'Non'}" rendered="#{!formGroupBean.canEdit}"/>
</p:column>
<p:column headerText="#{msg['distribution.page.fonctionGroup.voir']}"
style="text-align: center;" sortBy="#{fonctionGroup.canSee}">
<p:selectBooleanCheckbox value="#{fonctionGroup.canSee}" disabled="#{!formGroupBean.canEdit}">
<p:ajax />
</p:selectBooleanCheckbox>
</p:column>
<p:column style=" text-align: center;" headerText="#{msg['distribution.page.fonctionGroup.canChangePrice']}"
>
<h:outputText value="#{fonctionGroup.canDelete=='true'? 'Oui' : 'Non'}" rendered="#{!formGroupBean.canEdit}"/>
</p:column>
<p:column style=" text-align: center;" headerText="#{msg['distribution.page.fonctionGroup.canChangeDate']}"
>
<h:outputText value="#{fonctionGroup.canUpdateDate=='true'? 'Oui' : 'Non'}" rendered="#{!formGroupBean.canEdit}"/>
</p:column>
<p:column headerText="#{msg['distribution.page.fonctionGroup.modifier']}"
sortBy="#{fonctionGroup.canUpdate}" style="text-align: center;">
<p:selectBooleanCheckbox value="#{fonctionGroup.canUpdate}" disabled="#{!formGroupBean.canEdit}">
<p:ajax />
</p:selectBooleanCheckbox>
</p:column>
</p:dataTable>
</p:tab>
</p:tabView>
</p:card>
</div>
</div>
<div style="width: 100%; display: flex; flex-direction: column; margin-bottom: 1px; border: none; box-shadow: none;">
<p:card id="cardModif" style="width: 100%; border: none; box-shadow: none;" rendered="#{formGroupBean.canEdit}">
<p:panelGrid columns="2" style="margin-bottom: 30px; text-align: left;" columnClasses="ui-grid-col-3,ui-grid-col-9">
<p:outputLabel for="idMod" styleClass="ui-outputlabel"
style="font-weight: bold; font-size: 1.3rem;">
#{msg['distribution.page.groupe.nom']}
</p:outputLabel>
<p:inputText id="idMod"
value="#{formGroupBean.groupeSelected.nomGroupe}"
required="true"
requiredMessage="Le nom du groupe est obligatoire." />
</p:panelGrid>
<p:column headerText="#{msg['distribution.page.fonctionGroup.add']}"
sortBy="#{fonctionGroup.canCreate}" style="text-align: center;">
<p:selectBooleanCheckbox value="#{fonctionGroup.canCreate}" disabled="#{!formGroupBean.canEdit}">
<p:ajax />
</p:selectBooleanCheckbox>
</p:column>
<p:divider/>
<p:column headerText="#{msg['distribution.page.supprimer']}"
sortBy="#{fonctionGroup.canDelete}" style="text-align: center;">
<p:selectBooleanCheckbox value="#{fonctionGroup.canDelete}" disabled="#{!formGroupBean.canEdit}">
<p:ajax />
</p:selectBooleanCheckbox>
</p:column>
<p:tabView>
<p:tab title="#{msg['distribution.page.groupe.listeDeFonctionaliteGroupe']}">
<p:dataTable id="dataTable"
var="fonctionGroup"
value="#{formGroupBean.listeFonctionnalite}"
selection="#{formGroupBean.fonctionSelected}"
rowKey="#{fonctionGroup.id}"
selectionMode="single"
styleClass="ui-datatable-striped">
<f:facet name="header">
<div class="flex justify-content-between align-items-center">
<div>
</div>
<div>
<p:commandButton title="#{msg['service.page.Service.ajouter.fonction']}" icon="pi pi-plus" styleClass="ui-button-success mr-2" oncomplete="PF('dlg2').show()" />
</div>
</div>
</f:facet>
<p:column headerText="#{msg['distribution.page.fonctionGroup.modifierCeJour']}"
sortBy="#{fonctionGroup.modifierCeJour}" style="text-align: center;">
<p:selectBooleanCheckbox value="#{fonctionGroup.modifierCeJour}" disabled="#{!formGroupBean.canEdit}">
<p:ajax />
</p:selectBooleanCheckbox>
</p:column>
<p:column style="text-align: center; width: 30px;">
<p:commandButton class="ui-button-warning rounded-button" icon="pi pi-trash"
process="@this"
oncomplete="PF('deleteProductDialog').show()">
<f:setPropertyActionListener value="#{fonctionGroup}" target="#{formGroupBean.fonctionSelected}" />
</p:commandButton>
</p:column>
<p:column headerText="#{msg['distribution.page.fonctionGroup.canChangeDate']}"
sortBy="#{fonctionGroup.canUpdateDate}" style="text-align: center;">
<p:selectBooleanCheckbox value="#{fonctionGroup.canUpdateDate}" disabled="#{!formGroupBean.canEdit}">
<p:ajax />
</p:selectBooleanCheckbox>
</p:column>
<p:column headerText="#{msg['distribution.page.fonctionalite.nom']}" sortBy="#{fonctionGroup.fkFonction.fonction}" style="text-align: center;">
<h:outputText value="#{fonctionGroup.fkFonction.nom}" />
</p:column>
<p:column headerText="#{msg['distribution.page.fonctionGroup.add']}" style="text-align: center;">
<p:selectBooleanCheckbox value="#{fonctionGroup.canCreate}" rendered="#{formGroupBean.canEdit}">
<p:ajax />
</p:selectBooleanCheckbox>
</p:column>
<p:column headerText="#{msg['distribution.page.fonctionGroup.modifier']}" style="text-align: center;">
<p:selectBooleanCheckbox value="#{fonctionGroup.canUpdate}" rendered="#{formGroupBean.canEdit}">
<p:ajax />
</p:selectBooleanCheckbox>
</p:column>
<p:column headerText="#{msg['distribution.page.supprimer']}" style="text-align: center;">
<p:selectBooleanCheckbox value="#{fonctionGroup.canDelete}" rendered="#{formGroupBean.canEdit}">
<p:ajax />
</p:selectBooleanCheckbox>
</p:column>
<p:column headerText="#{msg['distribution.page.fonctionGroup.canChangeDate']}" style="text-align: center;">
<p:selectBooleanCheckbox value="#{fonctionGroup.canUpdateDate}" rendered="#{formGroupBean.canEdit}">
<p:ajax />
</p:selectBooleanCheckbox>
</p:column>
</p:dataTable>
</p:tab>
</p:tabView>
</p:card>
</div>
</p:dataTable>
</div>
<p:confirmDialog widgetVar="deleteProductDialog" showEffect="fade" width="400"
message="#{msg['distribution.page.supprimer.confirmation']}" header="Confirm" severity="warn">
<p:commandButton value="#{msg['distribution.page.oui']}" icon="pi pi-check" actionListener="#{formGroupBean.deletefonction}"
process="@this" update=":form:cardModif"
process="@this" update=":form:dataTable"
oncomplete="PF('deleteProductDialog').hide()" />
<p:commandButton value="#{msg['distribution.page.non']}" type="button" styleClass="ui-button-secondary" icon="pi pi-times"
onclick="PF('deleteProductDialog').hide()" />
</p:confirmDialog>
<p:dialog header="Ajouter des fonctionnalité" widgetVar="dlg2" position="center,top" width="1100" height="550" >
</h:form>
<h:form id="dg">
<p:dialog header="Ajouter des fonctionnalité" widgetVar="dlg2" position="center,top" width="1100" height="550">
<p:dataTable id="dataTableNonVisite" var="fonction"
value="#{formGroupBean.source}"
value="#{formGroupBean.source}"
selection="#{formGroupBean.target}"
emptyMessage="#{msg['service.page.Fonction.liste.message.non']}"
paginator="true" rows="20"
rowKey="#{fonction.id}">
rowKey="#{fonction.id}">
<f:facet name="header">
<div class="flex justify-content-between align-items-center">
<div>
</div>
<div>
<p:commandButton value="#{msg['distribution.page.inventaire.facture.ajouter']}"
icon="pi pi-check"
action="#{formGroupBean.ajouterFonctionnalitesAuGroupe}"
process="@form"
update=":form:cardModif"
oncomplete="PF('dlg2').hide()" />
</div>
<div class="flex justify-content-end align-items-center">
<p:commandButton value="#{msg['distribution.page.inventaire.facture.ajouter']}"
icon="pi pi-check"
action="#{formGroupBean.ajouterFonctionnalitesAuGroupe()}"
process="@form"
update=":form:dataTable"
styleClass="btn-teal"
oncomplete="PF('dlg2').hide()" />
</div>
</f:facet>
<p:column selectionMode="multiple" style="text-align:center;width: 16px;"/>
<p:column style=" text-align: center;width: 150px;" headerText="#{msg['distribution.page.fonctionalite.nom']}" sortBy="#{fonction.nom}" filterBy="#{fonction.nom}" filterMatchMode="contains">
<h:outputText value="#{fonction.nom}" />
<p:column style=" text-align: center;width: 150px;" headerText="#{msg['distribution.page.fonctionalite.nom']}" sortBy="#{fonction.nom}" filterBy="#{fonction.nom}" filterMatchMode="contains">
<h:outputText value="#{fonction.nom}" />
</p:column>
</p:dataTable>
</p:dataTable>
</p:dialog>
</h:form>
</ui:define>
</ui:composition>
</ui:composition>

View File

@ -14,57 +14,252 @@
<f:viewParam name="value" value="Groupes et Fonctionnalités" />
</f:metadata>
</ui:define>
<ui:define name="content">
<h:form>
<div class="card">
<p:tabView id="tabview" scrollable="true">
<p:tab title="#{msg['distribution.page.groupes']}">
<p:dataTable id="dataTable" var="groupe"
rows="30" paginator="true" draggableColumns="true"
value="#{groupBean.listeGroupe}"
selection="#{groupBean.groupeSelected}"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="20,30,40,60,80,100"
emptyMessage="#{msg['distribution.page.groupe.liste.message.non'] }"
selectionMode="single"
rowKey="#{groupe.id}" >
<f:facet name="header">
<div class="flex justify-content-between align-items-center">
<div>
<style type="text/css">
/* --- Wrapper pour centrage vertical --- */
.tabview-vcenter-wrapper {
display: flex !important;
flex-direction: column !important;
justify-content: center !important;
min-height: calc(100vh - 350px) !important; /* ajuste selon hauteur topbar+breadcrumb */
}
/* Conteneur tabview */
.transparent-tabview.ui-tabs {
background: transparent !important;
border: none !important;
box-shadow: none !important;
}
/* Barre de navigation des onglets */
.transparent-tabview .ui-tabs-nav {
background: transparent !important;
border: none !important;
border-bottom: 1px solid #E5E3DB !important;
padding: 0 !important;
}
/* Chaque onglet : li devient le conteneur du hover */
.transparent-tabview .ui-tabs-nav li {
background: transparent !important;
border: none !important;
margin: 0 4px 0 0 !important;
border-radius: 6px 6px 0 0 !important;
overflow: hidden !important;
transition: background-color 0.2s ease !important;
}
/* Hover appliqué sur le li entier, opacité réduite */
.transparent-tabview .ui-tabs-nav li:not(.ui-state-active):hover {
background-color: rgba(13, 148, 136, 0.08) !important;
}
.transparent-tabview .ui-tabs-nav li .ui-tabs-anchor {
background: transparent !important;
border: none !important;
color: #6B7280 !important;
padding: 0.85rem 1.25rem !important;
font-weight: 500 !important;
display: block !important;
transition: color 0.2s ease !important;
border-radius: 0 !important;
}
/* Texte/icône passent en teal au survol, sans re-déclencher de fond sur l'anchor */
.transparent-tabview .ui-tabs-nav li:not(.ui-state-active):hover .ui-tabs-anchor,
.transparent-tabview .ui-tabs-nav li:not(.ui-state-active):hover .ui-tabs-anchor i {
color: #0D9488 !important;
}
/* Onglet actif : figé sur le style hover (fond + texte + icône) */
.transparent-tabview .ui-tabs-nav li.ui-state-active {
background-color: rgba(13, 148, 136, 0.08) !important;
border: none !important;
border-radius: 6px 6px 0 0 !important;
}
.transparent-tabview .ui-tabs-nav li.ui-state-active .ui-tabs-anchor,
.transparent-tabview .ui-tabs-nav li.ui-state-active .ui-tabs-anchor span,
.transparent-tabview .ui-tabs-nav li.ui-state-active .ui-tabs-anchor i,
.transparent-tabview .ui-tabs-nav li.ui-state-active a,
.transparent-tabview .ui-tabs-nav li.ui-state-active a i,
.transparent-tabview .ui-tabs-nav li.ui-state-active a span {
color: #0D9488 !important;
background: transparent !important;
}
.transparent-tabview .ui-tabs-nav li.ui-state-active .ui-tabs-anchor {
box-shadow: inset 0 -2px 0 0 #0D9488 !important;
}
/* Panneaux */
.transparent-tabview .ui-tabs-panel {
background: transparent !important;
border: none !important;
padding: 1rem 0 0 0 !important;
}
.transparent-tabview .ui-tabs-panels {
background: transparent !important;
border: none !important;
padding: 0 !important;
}
/* Boutons verts : teal */
.btn-teal.ui-button {
background: #0D9488 !important;
border-color: #0D9488 !important;
color: #FFFFFF !important;
}
.btn-teal.ui-button:hover {
background: #0B7F74 !important;
border-color: #0B7F74 !important;
}
/* Bouton loupe : radius réduit, pas circulaire */
.btn-teal-round.ui-button {
background: #0D9488 !important;
border-color: #0D9488 !important;
color: #FFFFFF !important;
border-radius: 6px !important;
width: 34px !important;
height: 34px !important;
}
.btn-teal-round.ui-button:hover {
background: #0B7F74 !important;
border-color: #0B7F74 !important;
}
</style>
<div class="tabview-vcenter-wrapper">
<p:tabView id="tabview" scrollable="true" styleClass="transparent-tabview">
<p:tab>
<f:facet name="title">
<i class="pi pi-users mr-2" />
#{msg['distribution.page.groupes']}
</f:facet>
<div class="card">
<p:dataTable id="dataTable" var="groupe"
rows="30" paginator="true" draggableColumns="true"
value="#{groupBean.listeGroupe}"
selection="#{groupBean.groupeSelected}"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="20,30,40,60,80,100"
emptyMessage="#{msg['distribution.page.groupe.liste.message.non'] }"
selectionMode="single"
rowKey="#{groupe.id}" >
<f:facet name="header">
<div class="flex justify-content-between align-items-center">
<div></div>
<div>
<p:commandButton icon="pi pi-file-excel"
styleClass="btn-teal" style="margin-right: 5px"
ajax="false">
<p:dataExporter type="xls" target="dataTable" fileName="groupes" />
</p:commandButton>
<p:commandButton icon="pi pi-file-pdf"
styleClass="ui-button-danger mr-2"
ajax="false">
<p:dataExporter type="pdf" target="dataTable" fileName="groupes" />
</p:commandButton>
<p:commandButton value="#{msg['distribution.page.groupe.ajoutergroupe']}"
icon="pi pi-plus"
styleClass="btn-teal"
action="#{groupBean.ajouterGroupe()}"
rendered="#{utilControleAccess.isshowPrivilegeAdd('groupes')}"/>
</div>
</div>
<div>
<p:commandButton title="#{msg['distribution.page.groupe.ajoutergroupe']}" icon="pi pi-plus" styleClass="ui-button-success mr-2" action="#{groupBean.ajouterGroupe()}" />
</f:facet>
<p:column style="text-align: center;" headerText="#{msg['distribution.page.groupe.nom']}"
filterBy="#{groupe.nomGroupe}" filterMatchMode="contains" sortBy="#{groupe.nomGroupe}">
<h:outputText value="#{groupe.nomGroupe}" />
</p:column>
<p:column style="text-align: center;" headerText="#{msg['distribution.page.Utilisateurs']}"
filterMatchMode="contains" >
<h:outputText value="#{groupBean.getNbrUtilisateur(groupe)}" />
</p:column>
<p:column style="text-align: center;" headerText="#{msg['distribution.page.fonctionnalite']}"
filterMatchMode="contains" >
<h:outputText value="#{groupBean.getNbrFonctionnalite(groupe)}"/>
</p:column>
<p:column style="width:80px; text-align: center;" exportable="false" visible="true" draggable="false" toggleable="false">
<p:commandButton id="buttonSelect" style="height:34px;" styleClass="btn-teal-round"
action="#{groupBean.voirGroupe(groupe)}"
icon="pi pi-search"
title="#{msg['distribution.page.consulter']}" />
</p:column>
</p:dataTable>
</div>
</p:tab>
<p:tab>
<f:facet name="title">
<i class="pi pi-cog mr-2" />
#{msg['distribution.page.fonctionnalite']}
</f:facet>
<div class="card">
<p:dataTable id="dataTable1" var="fonction"
rows="30" paginator="true" draggableColumns="true"
value="#{groupBean.listeFonctionnalite}"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="20,30,40,60,80,100"
emptyMessage="#{msg['distribution.page.groupe.liste.message.non'] }"
selectionMode="single"
rowKey="#{fonction.id}" >
<f:facet name="header">
<div class="flex justify-content-between align-items-center">
<div></div>
<div>
<p:commandButton icon="pi pi-file-excel"
styleClass="btn-teal" style="margin-right: 5px"
ajax="false">
<p:dataExporter type="xls" target="dataTable" fileName="groupes" />
</p:commandButton>
<p:commandButton icon="pi pi-file-pdf"
styleClass="ui-button-danger mr-2"
ajax="false">
<p:dataExporter type="pdf" target="dataTable" fileName="groupes" />
</p:commandButton>
</div>
</div>
</div>
</f:facet>
</f:facet>
<p:column style=" text-align: center;" headerText="#{msg['distribution.page.groupe.nom']}" filterBy="#{groupe.nomGroupe}" filterMatchMode="contains" sortBy="#{groupe.nomGroupe}" >
<h:outputText value="#{groupe.nomGroupe}" />
</p:column>
<p:column style="text-align: center;" headerText="#{msg['distribution.page.fonctionalite.nom']}"
filterBy="#{fonction.nom}" filterMatchMode="contains" sortBy="#{fonction.nom}">
<h:outputText value="#{fonction.nom}" />
</p:column>
<p:column style="width:130px; text-align: center;" exportable="false" visible="true" draggable="false" toggleable="false">
<p:column style="text-align: center;" headerText="#{msg['distribution.page.Utilisateurs']}"
filterBy="#{fonction.nom}" filterMatchMode="contains" sortBy="#{fonction.nom}">
<h:outputText value="#{fonction.nom}" />
</p:column>
<p:commandButton id="buttonSelect" style="height:30px; text-align: center" action="#{groupBean.voirGroupe(groupe)}" icon="pi pi-search" title="#{msg['distribution.page.consulter']}">
</p:commandButton>
</p:column>
</p:dataTable>
<p:column style="text-align: center;" headerText="#{msg['distribution.page.fonctionnalite']}"
filterBy="#{fonction.nom}" filterMatchMode="contains" sortBy="#{fonction.nom}">
<h:outputText value="#{fonction.nom}" />
</p:column>
</p:dataTable>
</div>
</p:tab>
<p:tab title="#{msg['distribution.page.fonctionnalite']}">
<p:dataTable id="dataTable1" var="fonction"
rows="30" paginator="true" draggableColumns="true"
value="#{groupBean.listeFonctionnalite}"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="20,30,40,60,80,100"
emptyMessage="#{msg['distribution.page.groupe.liste.message.non'] }"
selectionMode="single"
rowKey="#{fonction.id}" >
<p:column style=" text-align: center;" headerText="#{msg['distribution.page.fonctionalite.nom']}" filterBy="#{fonction.nom}" filterMatchMode="contains" sortBy="#{fonction.nom}" >
<h:outputText value="#{fonction.nom}" />
</p:column>
</p:dataTable>
</p:tab>
</p:tabView>
</div>
</h:form>