Ajout de nouveaux composants composites et styles SCSS Lions.dev pour enrichir l'extension Freya. ## Nouveaux composants - confirmDialog: Dialogue de confirmation avec actions - dialog: Dialogue générique personnalisable - menu: Menu de navigation vertical - menubar: Barre de menu horizontale - messages: Composant d'affichage de messages multiples - overlayPanel: Panneau overlay positionnable - sidebar: Panneau latéral collapsible - toast: Notifications toast ## Améliorations composants existants - Amélioration support Ajax pour tous les champs (fieldInput, fieldSelect, etc.) - Correction attributs pour compatibilité avec composite:clientBehavior - Optimisation panel avec support toggleable et collapsed - Amélioration button, commandButton, linkButton avec severities - Amélioration dataTable et dataView avec pagination ## Styles SCSS Lions.dev - Création architecture SCSS modulaire dans sass/lions/ - Variables globales Lions.dev (_variables.scss) - Mixins réutilisables (_mixins.scss) - Styles par catégorie de composants (12 fichiers) - Point d'entrée lions.scss pour compilation ## Tests et démo - Page buttons-showcase pour démonstration boutons - Amélioration components-demo avec nouveaux composants - Styles CSS demo pour tests visuels ## Infrastructure - Mise à jour .gitignore (exclusion docs temporaires) - Mise à jour versions dans pom.xml Tous les composants respectent les patterns PrimeFaces et la charte graphique Lions.dev.
650 lines
17 KiB
Java
650 lines
17 KiB
Java
package dev.lions.freya.demo;
|
|
|
|
import jakarta.annotation.PostConstruct;
|
|
import jakarta.enterprise.context.SessionScoped;
|
|
import jakarta.faces.application.FacesMessage;
|
|
import jakarta.faces.context.FacesContext;
|
|
import jakarta.inject.Named;
|
|
|
|
import org.primefaces.model.menu.DefaultMenuItem;
|
|
import org.primefaces.model.menu.DefaultMenuModel;
|
|
import org.primefaces.model.menu.MenuModel;
|
|
|
|
import java.io.Serializable;
|
|
import java.time.LocalDate;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.stream.Collectors;
|
|
|
|
/**
|
|
* Backing bean pour la page de démonstration des composants Freya Extension.
|
|
*
|
|
* Ce bean illustre l'utilisation des composants composites fr:field* et fr:actionDialog.
|
|
*/
|
|
@Named("demoBean")
|
|
@SessionScoped
|
|
public class DemoBean implements Serializable {
|
|
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
// Données du formulaire principal
|
|
private User user = new User();
|
|
private String passwordConfirm;
|
|
private List<String> availableInterests;
|
|
|
|
// Données du dialog
|
|
private DialogData dialogData = new DialogData();
|
|
private FormDialogData formDialogData = new FormDialogData();
|
|
|
|
// Données pour les nouveaux composants
|
|
private List<SampleUser> sampleUsers;
|
|
private SampleUser selectedUser; // Pour la sélection dans dataTable
|
|
private MenuModel breadcrumbModel;
|
|
private MenuModel stepsModel;
|
|
private MenuModel splitButtonModel;
|
|
private int activeStep = 1;
|
|
private String tabField1;
|
|
private String tabField2;
|
|
private String inplaceValue = "Valeur éditable";
|
|
private List<String> availableCities;
|
|
|
|
public DemoBean() {
|
|
availableInterests = new ArrayList<>();
|
|
availableInterests.add("Sport");
|
|
availableInterests.add("Musique");
|
|
availableInterests.add("Voyage");
|
|
availableInterests.add("Technologie");
|
|
availableInterests.add("Cuisine");
|
|
|
|
// Villes disponibles pour l'autocomplétion
|
|
availableCities = new ArrayList<>();
|
|
availableCities.add("Paris");
|
|
availableCities.add("Lyon");
|
|
availableCities.add("Marseille");
|
|
availableCities.add("Toulouse");
|
|
availableCities.add("Bordeaux");
|
|
availableCities.add("Dakar");
|
|
availableCities.add("Abidjan");
|
|
availableCities.add("Montréal");
|
|
availableCities.add("Québec");
|
|
}
|
|
|
|
@PostConstruct
|
|
public void init() {
|
|
initSampleUsers();
|
|
initBreadcrumbModel();
|
|
initStepsModel();
|
|
initSplitButtonModel();
|
|
}
|
|
|
|
private void initSampleUsers() {
|
|
sampleUsers = new ArrayList<>();
|
|
sampleUsers.add(new SampleUser("Jean Dupont", "jean.dupont@email.com", true));
|
|
sampleUsers.add(new SampleUser("Marie Martin", "marie.martin@email.com", true));
|
|
sampleUsers.add(new SampleUser("Pierre Durand", "pierre.durand@email.com", false));
|
|
sampleUsers.add(new SampleUser("Sophie Bernard", "sophie.bernard@email.com", true));
|
|
sampleUsers.add(new SampleUser("Luc Petit", "luc.petit@email.com", false));
|
|
sampleUsers.add(new SampleUser("Emma Leroy", "emma.leroy@email.com", true));
|
|
sampleUsers.add(new SampleUser("Thomas Moreau", "thomas.moreau@email.com", true));
|
|
}
|
|
|
|
private void initBreadcrumbModel() {
|
|
breadcrumbModel = new DefaultMenuModel();
|
|
breadcrumbModel.getElements().add(DefaultMenuItem.builder().value("Accueil").outcome("/index").build());
|
|
breadcrumbModel.getElements().add(DefaultMenuItem.builder().value("Composants").outcome("/components-demo").build());
|
|
breadcrumbModel.getElements().add(DefaultMenuItem.builder().value("Démonstration").build());
|
|
}
|
|
|
|
private void initStepsModel() {
|
|
stepsModel = new DefaultMenuModel();
|
|
stepsModel.getElements().add(DefaultMenuItem.builder().value("Informations").build());
|
|
stepsModel.getElements().add(DefaultMenuItem.builder().value("Vérification").build());
|
|
stepsModel.getElements().add(DefaultMenuItem.builder().value("Confirmation").build());
|
|
}
|
|
|
|
private void initSplitButtonModel() {
|
|
splitButtonModel = new DefaultMenuModel();
|
|
splitButtonModel.getElements().add(DefaultMenuItem.builder().value("Exporter PDF").icon("pi pi-file-pdf").build());
|
|
splitButtonModel.getElements().add(DefaultMenuItem.builder().value("Exporter Excel").icon("pi pi-file-excel").build());
|
|
splitButtonModel.getElements().add(DefaultMenuItem.builder().value("Imprimer").icon("pi pi-print").build());
|
|
}
|
|
|
|
// ========================================
|
|
// Actions
|
|
// ========================================
|
|
|
|
/**
|
|
* Action d'inscription - valide et enregistre l'utilisateur.
|
|
*/
|
|
public String register() {
|
|
FacesContext context = FacesContext.getCurrentInstance();
|
|
|
|
// Validation du mot de passe
|
|
if (!user.getPassword().equals(passwordConfirm)) {
|
|
context.addMessage(null, new FacesMessage(
|
|
FacesMessage.SEVERITY_ERROR,
|
|
"Erreur",
|
|
"Les mots de passe ne correspondent pas"
|
|
));
|
|
return null;
|
|
}
|
|
|
|
// Validation des conditions
|
|
if (!user.isAcceptTerms()) {
|
|
context.addMessage(null, new FacesMessage(
|
|
FacesMessage.SEVERITY_WARN,
|
|
"Attention",
|
|
"Vous devez accepter les conditions d'utilisation"
|
|
));
|
|
return null;
|
|
}
|
|
|
|
// Succès
|
|
context.addMessage(null, new FacesMessage(
|
|
FacesMessage.SEVERITY_INFO,
|
|
"Succès",
|
|
String.format("Bienvenue %s %s ! Votre compte a été créé.", user.getPrenom(), user.getNom())
|
|
));
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Réinitialise le formulaire.
|
|
*/
|
|
public void reset() {
|
|
this.user = new User();
|
|
this.passwordConfirm = null;
|
|
|
|
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
|
|
FacesMessage.SEVERITY_INFO,
|
|
"Réinitialisé",
|
|
"Le formulaire a été réinitialisé"
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Action de sauvegarde depuis le dialog.
|
|
*/
|
|
public void saveFromDialog() {
|
|
FacesContext context = FacesContext.getCurrentInstance();
|
|
|
|
context.addMessage(null, new FacesMessage(
|
|
FacesMessage.SEVERITY_INFO,
|
|
"Dialog enregistré",
|
|
String.format("Utilisateur '%s' avec rôle '%s' enregistré",
|
|
dialogData.getUsername(),
|
|
dialogData.getRole())
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Action de sauvegarde depuis le formDialog.
|
|
*/
|
|
public void saveFormDialog() {
|
|
FacesContext context = FacesContext.getCurrentInstance();
|
|
|
|
context.addMessage(null, new FacesMessage(
|
|
FacesMessage.SEVERITY_INFO,
|
|
"FormDialog enregistré",
|
|
String.format("Titre: '%s' sauvegardé avec succès",
|
|
formDialogData.getTitle())
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Action générique de sauvegarde.
|
|
*/
|
|
public void save() {
|
|
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
|
|
FacesMessage.SEVERITY_INFO,
|
|
"Sauvegardé",
|
|
"Les données ont été sauvegardées avec succès"
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Autocomplétion des villes.
|
|
*/
|
|
public List<String> completeVille(String query) {
|
|
String lowerQuery = query.toLowerCase();
|
|
return availableCities.stream()
|
|
.filter(city -> city.toLowerCase().startsWith(lowerQuery))
|
|
.collect(Collectors.toList());
|
|
}
|
|
|
|
// ========================================
|
|
// Getters / Setters
|
|
// ========================================
|
|
|
|
public User getUser() {
|
|
return user;
|
|
}
|
|
|
|
public void setUser(User user) {
|
|
this.user = user;
|
|
}
|
|
|
|
public String getPasswordConfirm() {
|
|
return passwordConfirm;
|
|
}
|
|
|
|
public void setPasswordConfirm(String passwordConfirm) {
|
|
this.passwordConfirm = passwordConfirm;
|
|
}
|
|
|
|
public DialogData getDialogData() {
|
|
return dialogData;
|
|
}
|
|
|
|
public void setDialogData(DialogData dialogData) {
|
|
this.dialogData = dialogData;
|
|
}
|
|
|
|
public List<String> getAvailableInterests() {
|
|
return availableInterests;
|
|
}
|
|
|
|
public void setAvailableInterests(List<String> availableInterests) {
|
|
this.availableInterests = availableInterests;
|
|
}
|
|
|
|
public FormDialogData getFormDialogData() {
|
|
return formDialogData;
|
|
}
|
|
|
|
public void setFormDialogData(FormDialogData formDialogData) {
|
|
this.formDialogData = formDialogData;
|
|
}
|
|
|
|
public List<SampleUser> getSampleUsers() {
|
|
return sampleUsers;
|
|
}
|
|
|
|
public void setSampleUsers(List<SampleUser> sampleUsers) {
|
|
this.sampleUsers = sampleUsers;
|
|
}
|
|
|
|
public SampleUser getSelectedUser() {
|
|
return selectedUser;
|
|
}
|
|
|
|
public void setSelectedUser(SampleUser selectedUser) {
|
|
this.selectedUser = selectedUser;
|
|
}
|
|
|
|
public MenuModel getBreadcrumbModel() {
|
|
return breadcrumbModel;
|
|
}
|
|
|
|
public void setBreadcrumbModel(MenuModel breadcrumbModel) {
|
|
this.breadcrumbModel = breadcrumbModel;
|
|
}
|
|
|
|
public MenuModel getStepsModel() {
|
|
return stepsModel;
|
|
}
|
|
|
|
public void setStepsModel(MenuModel stepsModel) {
|
|
this.stepsModel = stepsModel;
|
|
}
|
|
|
|
public MenuModel getSplitButtonModel() {
|
|
return splitButtonModel;
|
|
}
|
|
|
|
public void setSplitButtonModel(MenuModel splitButtonModel) {
|
|
this.splitButtonModel = splitButtonModel;
|
|
}
|
|
|
|
public int getActiveStep() {
|
|
return activeStep;
|
|
}
|
|
|
|
public void setActiveStep(int activeStep) {
|
|
this.activeStep = activeStep;
|
|
}
|
|
|
|
public String getTabField1() {
|
|
return tabField1;
|
|
}
|
|
|
|
public void setTabField1(String tabField1) {
|
|
this.tabField1 = tabField1;
|
|
}
|
|
|
|
public String getTabField2() {
|
|
return tabField2;
|
|
}
|
|
|
|
public void setTabField2(String tabField2) {
|
|
this.tabField2 = tabField2;
|
|
}
|
|
|
|
public String getInplaceValue() {
|
|
return inplaceValue;
|
|
}
|
|
|
|
public void setInplaceValue(String inplaceValue) {
|
|
this.inplaceValue = inplaceValue;
|
|
}
|
|
|
|
public List<String> getAvailableCities() {
|
|
return availableCities;
|
|
}
|
|
|
|
public void setAvailableCities(List<String> availableCities) {
|
|
this.availableCities = availableCities;
|
|
}
|
|
|
|
// ========================================
|
|
// Nested Classes
|
|
// ========================================
|
|
|
|
/**
|
|
* Modèle utilisateur pour le formulaire d'inscription.
|
|
*/
|
|
public static class User implements Serializable {
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
private String prenom;
|
|
private String nom;
|
|
private String email;
|
|
private LocalDate dateNaissance;
|
|
private String password;
|
|
private String pays;
|
|
private String bio;
|
|
private boolean acceptTerms;
|
|
private boolean newsletter;
|
|
private Double solde = 1000.0;
|
|
private boolean notifications = true;
|
|
private List<String> interests = new ArrayList<>();
|
|
private int note = 4;
|
|
private List<String> tags = new ArrayList<>();
|
|
private String favoriteColor = "3f51b5";
|
|
private String genre = "M";
|
|
// Nouveaux champs pour les composants additionnels
|
|
private String telephone;
|
|
private Integer quantity = 1;
|
|
private Integer volume = 50;
|
|
private String ville;
|
|
|
|
// Getters / Setters
|
|
|
|
public String getPrenom() {
|
|
return prenom;
|
|
}
|
|
|
|
public void setPrenom(String prenom) {
|
|
this.prenom = prenom;
|
|
}
|
|
|
|
public String getNom() {
|
|
return nom;
|
|
}
|
|
|
|
public void setNom(String nom) {
|
|
this.nom = nom;
|
|
}
|
|
|
|
public String getEmail() {
|
|
return email;
|
|
}
|
|
|
|
public void setEmail(String email) {
|
|
this.email = email;
|
|
}
|
|
|
|
public LocalDate getDateNaissance() {
|
|
return dateNaissance;
|
|
}
|
|
|
|
public void setDateNaissance(LocalDate dateNaissance) {
|
|
this.dateNaissance = dateNaissance;
|
|
}
|
|
|
|
public String getPassword() {
|
|
return password;
|
|
}
|
|
|
|
public void setPassword(String password) {
|
|
this.password = password;
|
|
}
|
|
|
|
public String getPays() {
|
|
return pays;
|
|
}
|
|
|
|
public void setPays(String pays) {
|
|
this.pays = pays;
|
|
}
|
|
|
|
public String getBio() {
|
|
return bio;
|
|
}
|
|
|
|
public void setBio(String bio) {
|
|
this.bio = bio;
|
|
}
|
|
|
|
public boolean isAcceptTerms() {
|
|
return acceptTerms;
|
|
}
|
|
|
|
public void setAcceptTerms(boolean acceptTerms) {
|
|
this.acceptTerms = acceptTerms;
|
|
}
|
|
|
|
public boolean isNewsletter() {
|
|
return newsletter;
|
|
}
|
|
|
|
public void setNewsletter(boolean newsletter) {
|
|
this.newsletter = newsletter;
|
|
}
|
|
|
|
public Double getSolde() {
|
|
return solde;
|
|
}
|
|
|
|
public void setSolde(Double solde) {
|
|
this.solde = solde;
|
|
}
|
|
|
|
public boolean isNotifications() {
|
|
return notifications;
|
|
}
|
|
|
|
public void setNotifications(boolean notifications) {
|
|
this.notifications = notifications;
|
|
}
|
|
|
|
public List<String> getInterests() {
|
|
return interests;
|
|
}
|
|
|
|
public void setInterests(List<String> interests) {
|
|
this.interests = interests;
|
|
}
|
|
|
|
public int getNote() {
|
|
return note;
|
|
}
|
|
|
|
public void setNote(int note) {
|
|
this.note = note;
|
|
}
|
|
|
|
public List<String> getTags() {
|
|
return tags;
|
|
}
|
|
|
|
public void setTags(List<String> tags) {
|
|
this.tags = tags;
|
|
}
|
|
|
|
public String getFavoriteColor() {
|
|
return favoriteColor;
|
|
}
|
|
|
|
public void setFavoriteColor(String favoriteColor) {
|
|
this.favoriteColor = favoriteColor;
|
|
}
|
|
|
|
public String getGenre() {
|
|
return genre;
|
|
}
|
|
|
|
public void setGenre(String genre) {
|
|
this.genre = genre;
|
|
}
|
|
|
|
public String getTelephone() {
|
|
return telephone;
|
|
}
|
|
|
|
public void setTelephone(String telephone) {
|
|
this.telephone = telephone;
|
|
}
|
|
|
|
public Integer getQuantity() {
|
|
return quantity;
|
|
}
|
|
|
|
public void setQuantity(Integer quantity) {
|
|
this.quantity = quantity;
|
|
}
|
|
|
|
public Integer getVolume() {
|
|
return volume;
|
|
}
|
|
|
|
public void setVolume(Integer volume) {
|
|
this.volume = volume;
|
|
}
|
|
|
|
public String getVille() {
|
|
return ville;
|
|
}
|
|
|
|
public void setVille(String ville) {
|
|
this.ville = ville;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Modèle pour les données du dialog de démonstration.
|
|
*/
|
|
public static class DialogData implements Serializable {
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
private String username;
|
|
private String role;
|
|
private boolean active;
|
|
|
|
// Getters / Setters
|
|
|
|
public String getUsername() {
|
|
return username;
|
|
}
|
|
|
|
public void setUsername(String username) {
|
|
this.username = username;
|
|
}
|
|
|
|
public String getRole() {
|
|
return role;
|
|
}
|
|
|
|
public void setRole(String role) {
|
|
this.role = role;
|
|
}
|
|
|
|
public boolean isActive() {
|
|
return active;
|
|
}
|
|
|
|
public void setActive(boolean active) {
|
|
this.active = active;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Modèle pour les données du formDialog de démonstration.
|
|
*/
|
|
public static class FormDialogData implements Serializable {
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
private String title;
|
|
private String description;
|
|
private LocalDate date;
|
|
|
|
public String getTitle() {
|
|
return title;
|
|
}
|
|
|
|
public void setTitle(String title) {
|
|
this.title = title;
|
|
}
|
|
|
|
public String getDescription() {
|
|
return description;
|
|
}
|
|
|
|
public void setDescription(String description) {
|
|
this.description = description;
|
|
}
|
|
|
|
public LocalDate getDate() {
|
|
return date;
|
|
}
|
|
|
|
public void setDate(LocalDate date) {
|
|
this.date = date;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Modèle utilisateur pour la démonstration du dataTable.
|
|
*/
|
|
public static class SampleUser implements Serializable {
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
private String nom;
|
|
private String email;
|
|
private boolean active;
|
|
|
|
public SampleUser() {}
|
|
|
|
public SampleUser(String nom, String email, boolean active) {
|
|
this.nom = nom;
|
|
this.email = email;
|
|
this.active = active;
|
|
}
|
|
|
|
public String getNom() {
|
|
return nom;
|
|
}
|
|
|
|
public void setNom(String nom) {
|
|
this.nom = nom;
|
|
}
|
|
|
|
public String getEmail() {
|
|
return email;
|
|
}
|
|
|
|
public void setEmail(String email) {
|
|
this.email = email;
|
|
}
|
|
|
|
public boolean isActive() {
|
|
return active;
|
|
}
|
|
|
|
public void setActive(boolean active) {
|
|
this.active = active;
|
|
}
|
|
}
|
|
}
|