This commit is contained in:
kenza 2026-08-17 11:06:56 +01:00
parent f02c250767
commit 66b8798553
8 changed files with 809 additions and 9 deletions

View File

@ -0,0 +1,213 @@
package com.triz.trizservice.bean;
import com.triz.trizservice.modeles.Centre;
import com.triz.trizservice.modeles.Machine;
import com.triz.trizservice.modeles.ServiceUser;
import com.triz.trizservice.modeles.TypeMachine;
import com.triz.trizservice.service.TransactionService;
import com.triz.util.UtilContext;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.PrimeFaces;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component("dicomPacsBean")
@Scope("view")
public class DicomPacsBean implements Serializable {
private static final long serialVersionUID = 1L;
// TODO : remplacer par l'injection du DAO réel (DaoServiceImpl / EJB)
// quand le mapping table sera défini.
private List<Machine> machines;
private Machine selectedMachine;
private Centre centre;
private ServiceUser user;
private Date dernierMajOrthanc;
private String etatMwlScp;
private Date dernierEtudeRecu;
@Autowired
public TransactionService service;
@Autowired
public UtilContext context;
@PostConstruct
public void init() {
centre = context.getCurrentEtablissement();
user = context.getCurrentUser();
machines = new ArrayList<>();
machines = service.getAllByCentre(Machine.class, centre);
selectedMachine = new Machine();
context.saveNewManipulation("Machine", "", "Consulter Machine", new Date(), new Date(), user, "", "");
// Valeurs d'en-tête neutres pour l'instant (pas de source de données branchée)
dernierMajOrthanc = null;
etatMwlScp = "Actif";
dernierEtudeRecu = null;
ping("localhost");
}
public void prepareNew() {
selectedMachine = new Machine();
}
public void prepareEdit(Machine machine) {
selectedMachine = machine;
PrimeFaces.current().ajax().update(":dicomPacsForm:dlgMachine");
}
public void saveMachine() {
try {
if (selectedMachine.getId() == null) {
selectedMachine.setFkCentre(centre);
machines.add(selectedMachine);
addMessage(FacesMessage.SEVERITY_INFO, "Succès", "Machine ajoutée avec succès");
} else {
selectedMachine.setLastUpdate(new Date());
addMessage(FacesMessage.SEVERITY_INFO, "Succès", "Machine modifiée avec succès");
}
service.save(selectedMachine);
if (selectedMachine.getId() == null) {
context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "Ajouter Machine", new Date(), new Date(), user, "", "");
} else {
context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "Modifier Machine", new Date(), new Date(), user, "", "");
}
} catch (Exception e) {
System.out.println(e.getMessage());
addMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Une erreur est survenue lors de l'enregistrement");
}
}
public void deleteMachine() {
try {
selectedMachine.setActif(Boolean.FALSE);
selectedMachine.setLastUpdate(new Date());
service.save(selectedMachine);
context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "Desactiver Machine", new Date(), new Date(), user, "", "");
addMessage(FacesMessage.SEVERITY_INFO, "Succès", "Machine supprimée avec succès");
} catch (Exception e) {
System.out.println(e.getMessage());
addMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Une erreur est survenue lors de la suppression");
}
}
private void addMessage(FacesMessage.Severity severity, String summary, String detail) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(severity, summary, detail));
}
public List<String> getStatutsDisponibles() {
return Arrays.asList("Actif", "Inactif", "Indisponible");
}
public List<TypeMachine> getTypesMachineDisponibles() {
// TODO : brancher sur le tab "Types de machines" de Paramétrage une fois l'entité TypeMachine exposée
return service.findAll(TypeMachine.class);
}
// ===== Getters / Setters =====
public List<Machine> getMachines() {
return machines;
}
public void setMachines(List<Machine> machines) {
this.machines = machines;
}
public Machine getSelectedMachine() {
return selectedMachine;
}
public void setSelectedMachine(Machine selectedMachine) {
this.selectedMachine = selectedMachine;
}
// Supprimer le champ dernierMajOrthanc et son setter, garder seulement ce getter :
public Date getDernierMajOrthanc() {
return machines.stream()
.filter(m -> "Orthanc Principal".equals(m.getNom()))
.map(Machine::getLastUpdate)
.findFirst()
.orElse(null);
}
public String getEtatMwlScp() {
return etatMwlScp;
}
public void setEtatMwlScp(String etatMwlScp) {
this.etatMwlScp = etatMwlScp;
}
public java.util.Date getDernierEtudeRecu() {
return dernierEtudeRecu;
}
public void setDernierEtudeRecu(java.util.Date dernierEtudeRecu) {
this.dernierEtudeRecu = dernierEtudeRecu;
}
public void toggleActif() {
try {
boolean nouvelEtat = !Boolean.TRUE.equals(selectedMachine.getActif());
selectedMachine.setActif(nouvelEtat);
selectedMachine.setLastUpdate(new Date());
service.save(selectedMachine);
context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "reactiver Machine", new Date(), new Date(), user, "", "");
// TODO : persister le changement via le DAO réel (merge)
String msg = nouvelEtat ? "Machine réactivée avec succès" : "Machine désactivée avec succès";
addMessage(FacesMessage.SEVERITY_INFO, "Succès", msg);
} catch (Exception e) {
addMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Une erreur est survenue");
}
}
public void ping(String host) {
System.out.println("ping");
System.out.println("host " + host);
try {
Process process = Runtime.getRuntime()
.exec("ping -n 4 " + host);
BufferedReader reader = new BufferedReader(
new InputStreamReader(
process.getInputStream(),
Charset.forName("CP850")
)
);
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -1,3 +1,5 @@
package com.triz.trizservice.bean.converter;
import com.triz.trizservice.modeles.Machine;
import com.triz.trizservice.service.TransactionService;
import java.util.UUID;

View File

@ -0,0 +1,48 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.triz.trizservice.bean.converter;
import com.triz.trizservice.modeles.TypeMachine;
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;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
*
* @author FORCE TECH
*/
@FacesConverter("typeMachineConverter")
@Component
public class TypeMachineConverter implements Converter{
@Autowired
protected transient TransactionService service;
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
try {
return service.findById(TypeMachine.class, UUID.fromString(value));
} catch (NumberFormatException e)
{
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Centre n'existe pas.");
}
return null;
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
if (object != null) {
return String.valueOf(((TypeMachine) object).getId());
} else {
return null;
}
}
}

View File

@ -5,6 +5,7 @@
package com.triz.trizservice.modeles;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.persistence.Basic;
@ -19,6 +20,8 @@ import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
@ -74,9 +77,15 @@ public class Machine implements Serializable {
@ManyToOne
private TypeMachine fkTypeMachine;
@JoinColumn(name = "fk_salle", referencedColumnName = "id")
@JoinColumn(name = "fk_salle", referencedColumnName = "id")
@ManyToOne
private SalleDeSoin fkSalle;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "last_update")
private Date lastUpdate;
@Column(name = "nom")
private String nom;
public Machine() {
}
@ -125,7 +134,6 @@ public class Machine implements Serializable {
this.disponible = disponible;
}
public Integer getPort() {
return port;
}
@ -208,4 +216,20 @@ public class Machine implements Serializable {
this.fkSalle = fkSalle;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public Date getLastUpdate() {
return lastUpdate;
}
public void setLastUpdate(Date lastUpdate) {
this.lastUpdate = lastUpdate;
}
}

View File

@ -166,8 +166,8 @@ public class UtilControleAccess {
for (ServiceMember member : listMemberShip) {
helpingFonctionGroupe = service.getFonctionGroupByFonctionIdAndGoupe(fonction1, member.getFkGroupe());
if (helpingFonctionGroupe != null) {
list.add(true);
System.out.println("helpingFonctionGroupe.getCanUpdate() : " + helpingFonctionGroupe.getCanUpdate());
list.add(helpingFonctionGroupe.getCanSee());
System.out.println("helpingFonctionGroupe.getCanSee() : " + helpingFonctionGroupe.getCanSee());
}
}
System.out.println("helpingFonctionGroupe: " + helpingFonctionGroupe);

View File

@ -852,3 +852,37 @@ ALTER TABLE medecin_specialiste
ADD CONSTRAINT medecin_specialiste_fk_specialite_fkey
FOREIGN KEY (fk_specialite_id)
REFERENCES specialite_medicale(id);
ALTER TABLE Machine
ADD COLUMN IF NOT EXISTS last_update Date;
ALTER TABLE Machine
ADD COLUMN IF NOT EXISTS nom VARCHAR;
-- 1. Créer le type de machine "OrthancPrincipale" s'il n'existe pas
INSERT INTO type_machine (id, type, code)
SELECT gen_random_uuid(), 'OrthancPrincipale', 'ORTHANC_PRINCIPALE'
WHERE NOT EXISTS (
SELECT 1 FROM type_machine WHERE type = 'OrthancPrincipale'
);
-- 2. Créer la machine "Orthanc Principal" en l'associant au type ci-dessus
INSERT INTO machine (id, nom, actif, disponible, fk_type_machine)
SELECT
gen_random_uuid(),
'Orthanc Principal',
true,
true,
tm.id
FROM type_machine tm
WHERE tm.type = 'OrthancPrincipale'
AND NOT EXISTS (
SELECT 1 FROM machine WHERE nom = 'Orthanc Principal'
);
UPDATE machine
SET fk_centre = (SELECT id FROM centre LIMIT 1)
WHERE nom = 'Orthanc Principal';
ALTER TABLE machine
ALTER COLUMN last_update TYPE TIMESTAMP USING last_update::timestamp;

View File

@ -141,14 +141,14 @@
<p:menuitem id="m_Tiersmouvement"
value="DICOM / PACS"
icon="pi pi-database"
url="#{request.contextPath}/views/client/listeClient.xhtml?idpage=Suivis_flotte"
url="#{request.contextPath}/views/Dicom/form.xhtml?idpage=Suivis_flotte"
rendered="#{utilControleAccess.isshowPrivilegeAdd('pacs')}" />
<p:menuitem id="m_Tiersletterage"
value="Paramètres"
icon="pi pi-cog"
url="#{request.contextPath}/views/parametrage/form.xhtml?idpage=Suivis_flotte"
rendered="#{utilControleAccess.isshowPrivilegeAdd('param')}" />
rendered="#{utilControleAccess.isshow1('param')}" />
</p:submenu>

View File

@ -0,0 +1,479 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
template="/WEB-INF/layout/template.xhtml">
<ui:define name="title">DICOM / PACS</ui:define>
<ui:define name="content">
<style type="text/css">
.dicom-page-header h2 {
font-family: 'DM Sans', sans-serif;
margin-bottom: 20px;
}
.dicom-cards {
display: flex;
gap: 16px;
margin-bottom: 24px;
}
.dicom-card {
flex: 1;
background: #FFFFFF;
border: 0.5px solid #B4B2A9;
border-radius: 8px;
padding: 16px 20px;
}
.dicom-card-title {
font-size: 11px;
text-transform: uppercase;
color: #6B6B6B;
font-family: 'DM Sans', sans-serif;
margin-bottom: 8px;
}
.dicom-card-value {
font-size: 20px;
font-weight: 600;
color: #0D9488;
text-align: right;
}
.dicom-card-value-actif {
color: #0D9488;
display: flex;
align-items: center;
justify-content: flex-end;
gap: 6px;
}
.dicom-table-section {
background: #FFFFFF;
border: 0.5px solid #B4B2A9;
border-radius: 8px;
padding: 20px;
}
.dicom-table-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
}
.dicom-section-title {
font-size: 11px;
text-transform: uppercase;
font-weight: 700;
font-family: 'DM Sans', sans-serif;
}
.dicom-table-actions {
display: flex;
gap: 8px;
}
.btn-icon.btn-edit-row {
background-color: #0D9488 !important;
border-color: #0D9488 !important;
border-radius: 6px !important;
}
.btn-excel {
background-color: #21A366 !important;
border-color: #21A366 !important;
border-radius: 6px !important;
}
.btn-pdf {
background-color: #E23838 !important;
border-color: #E23838 !important;
border-radius: 6px !important;
}
.btn-ajouter {
background-color: #0D9488 !important;
border-color: #0D9488 !important;
border-radius: 6px !important;
}
.dicom-status-badge {
display: inline-block;
padding: 3px 10px;
border-radius: 6px;
font-size: 11px;
font-weight: 600;
color: #FFFFFF;
text-transform: capitalize;
}
.dicom-status-Actif,
.dicom-status-Disponible {
background-color: #378ADD;
}
.dicom-status-Inactif {
background-color: #F16A6A;
}
.dicom-status-Indisponible {
background-color: #F0B93C;
}
.dicom-badge-limite {
display: inline-block;
padding: 1px 6px;
border-radius: 4px;
color: #FFFFFF;
font-size: 11px;
}
.dicom-badge-patients {
background-color: #F0B93C;
}
.dicom-badge-rdv {
background-color: #4CAF50;
}
/* ===== Lien IP:Port ===== */
.dicom-ip-link {
display: inline-flex;
align-items: center;
gap: 6px;
color: #333;
cursor: pointer;
}
.dicom-ip-link:hover {
color: #378ADD;
text-decoration: underline;
}
.dicom-ip-icon {
color: #378ADD;
font-size: 12px;
}
/* ===== Dialogue ===== */
.dlg-machine .ui-dialog-content {
padding: 0 !important;
border-radius: 8px;
}
.dlg-machine-topbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 20px;
border-bottom: 0.5px solid #B4B2A9;
}
.dlg-machine-topbar-right {
display: flex;
gap: 8px;
}
.btn-retour {
background: transparent !important;
color: #333 !important;
border: none !important;
}
.btn-supprimer {
background-color: #F16A6A !important;
border-color: #F16A6A !important;
border-radius: 6px !important;
}
.btn-reactiver,
.btn-enregistrer {
background-color: #0D9488 !important;
border-color: #0D9488 !important;
border-radius: 6px !important;
}
.dlg-machine-body {
padding: 20px;
}
.form-field, .form-field-inline {
margin-bottom: 16px;
}
.form-field label, .form-field-inline label {
display: block;
font-size: 12px;
font-weight: 600;
margin-bottom: 6px;
color: #333;
}
.form-field .ui-selectonemenu,
.form-field .ui-inputtext {
width: 100%;
border: 0.5px solid #B4B2A9;
border-radius: 6px;
}
</style>
<h:form id="dicomPacsForm">
<p:growl id="msgs" showDetail="true" />
<!-- ===== Cartes résumé ===== -->
<div class="dicom-cards">
<div class="dicom-card">
<div class="dicom-card-title">
<span class="pi pi-refresh" /> Dernier Mis a jour Orthanc Principale
</div>
<div class="dicom-card-value">
<h:outputText value="#{dicomPacsBean.dernierMajOrthanc}">
<f:convertDateTime pattern="d/M/yyyy 'à' HH:mm" />
</h:outputText>
</div>
</div>
<div class="dicom-card">
<div class="dicom-card-title">
<span class="pi pi-sync" /> Etat MWL SCP
</div>
<div class="dicom-card-value dicom-card-value-actif">
<span class="pi pi-check-circle" />
<h:outputText value="#{dicomPacsBean.etatMwlScp}" />
</div>
</div>
<div class="dicom-card">
<div class="dicom-card-title">
<span class="pi pi-database" /> Dernier étude Reçu
</div>
<div class="dicom-card-value">
<h:outputText value="#{dicomPacsBean.dernierEtudeRecu}">
<f:convertDateTime pattern="dd/MM/yyyy 'à' HH:mm" />
</h:outputText>
</div>
</div>
</div>
<!-- ===== Tableau des noeuds ===== -->
<div class="dicom-table-section">
<div class="dicom-table-header">
<span class="dicom-section-title">Nœuds DICOM configurés</span>
<div class="dicom-table-actions">
<p:commandButton icon="pi pi-file-excel" styleClass="btn-icon btn-excel"
title="Exporter Excel" ajax="false">
<p:dataExporter type="xls" target="dtMachines" fileName="noeuds_dicom" />
</p:commandButton>
<p:commandButton icon="pi pi-file-pdf" styleClass="btn-icon btn-pdf"
title="Exporter PDF" ajax="false">
<p:dataExporter type="pdf" target="dtMachines" fileName="noeuds_dicom" />
</p:commandButton>
<p:commandButton value="Ajouter" icon="pi pi-plus" styleClass="btn-ajouter"
rendered="#{utilControleAccess.isshowPrivilegeAdd('pacs')}"
actionListener="#{dicomPacsBean.prepareNew}"
update=":dicomPacsForm:dlgMachine"
oncomplete="PF('wDlgMachine').show()" />
</div>
</div>
<p:dataTable id="dtMachines" var="machine" value="#{dicomPacsBean.machines}"
styleClass="dicom-datatable" rowKey="#{machine.id}"
emptyMessage="Aucun nœud DICOM configuré">
<p:column headerText="Nom" sortBy="#{machine.nom}">
<h:outputText value="#{machine.nom}" />
</p:column>
<p:column headerText="Titre AE" sortBy="#{machine.aeTitle}">
<h:outputText value="#{machine.aeTitle}" />
</p:column>
<p:column headerText="IP:Port" sortBy="#{machine.ip}">
<h:panelGroup rendered="#{not empty machine.ip}">
<span class="dicom-ip-link"
onclick="window.open('https://#{machine.ip}:#{machine.port}', '_blank', 'noopener'); return false;">
<h:outputText value="#{machine.ip}:#{machine.port}" />
<span class="pi pi-external-link dicom-ip-icon" />
</span>
</h:panelGroup>
</p:column>
<p:column headerText="Dernier mais a jour" sortBy="#{machine.lastUpdate}">
<h:outputText value="#{machine.lastUpdate}">
<f:convertDateTime pattern="dd/MM/yyyy 'à' HH:mm" />
</h:outputText>
</p:column>
<p:column headerText="Type de machine" sortBy="#{machine.fkTypeMachine.type}">
<h:outputText value="#{machine.fkTypeMachine.type}" />
</p:column>
<p:column headerText="Limite RDV / NB patients">
<h:panelGroup rendered="#{not empty machine.nbPatientMax}">
(
<span class="dicom-badge-limite dicom-badge-patients">#{machine.nbPatientMax}</span>
/
<span class="dicom-badge-limite dicom-badge-rdv">#{machine.nbRdvMax}</span>
) / jour
</h:panelGroup>
<h:outputText value="/" rendered="#{empty machine.nbPatientMax}" />
</p:column>
<p:column headerText="Actif">
<span class="dicom-status-badge #{machine.actif ? 'dicom-status-Actif' : 'dicom-status-Inactif'}">
<h:outputText value="#{machine.actif ? 'Actif' : 'Inactif'}" />
</span>
</p:column>
<p:column headerText="Disponible">
<span class="dicom-status-badge #{machine.disponible ? 'dicom-status-Actif' : 'dicom-status-Indisponible'}">
<h:outputText value="#{machine.disponible ? 'Disponible' : 'Indisponible'}" />
</span>
</p:column>
<p:column style="width:48px;text-align:center;">
<p:commandButton icon="pi pi-pencil" styleClass="btn-icon btn-edit-row"
rendered="#{utilControleAccess.isshowPrivilegeUpdate('pacs')}"
actionListener="#{dicomPacsBean.prepareEdit(machine)}"
oncomplete="PF('wDlgMachine').show()"
process="@this"/>
</p:column>
</p:dataTable>
</div>
<!-- ===== Dialogue Ajout / Modification ===== -->
<p:dialog id="dlgMachine" widgetVar="wDlgMachine" modal="true" resizable="false"
showHeader="false" width="380" styleClass="dlg-machine">
<h:panelGroup layout="block" styleClass="dlg-machine-topbar">
<p:commandButton value="Retour" icon="pi pi-arrow-left" styleClass="btn-retour"
onclick="PF('wDlgMachine').hide(); return false;" />
<h:panelGroup layout="block" styleClass="dlg-machine-topbar-right">
<p:commandButton value="Désactiver" icon="pi pi-ban" styleClass="btn-supprimer"
rendered="#{utilControleAccess.isshowPrivilegeRemove('pacs') and dicomPacsBean.selectedMachine.id != null and dicomPacsBean.selectedMachine.actif}"
onclick="PF('wConfirmToggle').show(); return false;" />
<p:commandButton value="Réactiver" icon="pi pi-refresh" styleClass="btn-reactiver"
rendered="#{utilControleAccess.isshowPrivilegeRemove('pacs') and dicomPacsBean.selectedMachine.id != null and !dicomPacsBean.selectedMachine.actif}"
onclick="PF('wConfirmToggle').show(); return false;" />
<p:commandButton value="Enregistrer" icon="pi pi-save" styleClass="btn-enregistrer"
rendered="#{utilControleAccess.isshowPrivilegeUpdate('pacs')}"
actionListener="#{dicomPacsBean.saveMachine}"
update=":dicomPacsForm:dtMachines :dicomPacsForm:msgs"
oncomplete="if (!args.validationFailed) { PF('wDlgMachine').hide(); }" />
</h:panelGroup>
</h:panelGroup>
<h:panelGroup layout="block" styleClass="dlg-machine-body">
<div class="form-field">
<p:outputLabel value="Nom" for="txtNom" />
<p:inputText id="txtNom" value="#{dicomPacsBean.selectedMachine.nom}">
<p:ajax event="change"/>
</p:inputText>
</div>
<div class="form-field">
<p:outputLabel value="Titre AE" for="txtAeTitle" />
<p:inputText id="txtAeTitle" value="#{dicomPacsBean.selectedMachine.aeTitle}">
<f:convertNumber integerOnly="true" />
<p:ajax event="change"/>
</p:inputText>
</div>
<div class="form-field">
<p:outputLabel value="Adresse IP" for="txtIp" />
<p:inputText id="txtIp" value="#{dicomPacsBean.selectedMachine.ip}">
<p:ajax event="change"/>
</p:inputText>
</div>
<div class="form-field">
<p:outputLabel value="Port" for="txtPort" />
<p:inputText id="txtPort" value="#{dicomPacsBean.selectedMachine.port}">
<f:convertNumber integerOnly="true" />
<p:ajax event="change"/>
</p:inputText>
</div>
<p:separator />
<div class="form-field-inline">
<p:outputLabel value="Actif" for="chkActif" />
<p:selectBooleanCheckbox id="chkActif" value="#{dicomPacsBean.selectedMachine.actif}">
<p:ajax event="change"/>
</p:selectBooleanCheckbox>
</div>
<div class="form-field-inline">
<p:outputLabel value="Disponible" for="chkDisponible" />
<p:selectBooleanCheckbox id="chkDisponible" value="#{dicomPacsBean.selectedMachine.disponible}">
<p:ajax event="change"/>
</p:selectBooleanCheckbox>
</div>
<div class="form-field">
<p:outputLabel value="Type de machine" for="selTypeMachine" />
<p:selectOneMenu id="selTypeMachine" value="#{dicomPacsBean.selectedMachine.fkTypeMachine}"
converter="typeMachineConverter" placeholder="selectionner">
<f:converter binding="#{typeMachineConverter}" />
<f:selectItems value="#{dicomPacsBean.typesMachineDisponibles}" var="tm"
itemLabel="#{tm.type}" itemValue="#{tm}" />
<p:ajax event="change"/>
</p:selectOneMenu>
</div>
<p:separator />
<div class="form-field-inline">
<p:outputLabel value="Nb Max Patients / jour" for="txtNbPatientMax" />
<p:inputText id="txtNbPatientMax" value="#{dicomPacsBean.selectedMachine.nbPatientMax}">
<f:convertNumber integerOnly="true" />
<p:ajax event="change"/>
</p:inputText>
</div>
<div class="form-field-inline">
<p:outputLabel value="Nb Max RDV / jour" for="txtNbRdvMax" />
<p:inputText id="txtNbRdvMax" value="#{dicomPacsBean.selectedMachine.nbRdvMax}">
<f:convertNumber integerOnly="true" />
<p:ajax event="change"/>
</p:inputText>
</div>
</h:panelGroup>
</p:dialog>
<p:confirmDialog widgetVar="wConfirmToggle" showEffect="fade" hideEffect="fade"
message="#{dicomPacsBean.selectedMachine.actif ?
'Voulez-vous vraiment désactiver cette machine ?' :
'Voulez-vous réactiver cette machine ?'}"
header="Confirmation" styleClass="confirm-dialog-machine">
<p:commandButton value="Annuler" icon="pi pi-times" styleClass="btn-retour"
onclick="PF('wConfirmToggle').hide(); return false;" />
<p:commandButton value="Confirmer" icon="pi pi-check" styleClass="btn-enregistrer"
actionListener="#{dicomPacsBean.toggleActif}"
update=":dicomPacsForm:dtMachines :dicomPacsForm:dlgMachine :dicomPacsForm:msgs"
oncomplete="PF('wConfirmToggle').hide(); PF('wDlgMachine').hide();" />
</p:confirmDialog>
</h:form>
</ui:define>
</ui:composition>