42 Commits

Author SHA1 Message Date
David Alvarez Gonzalez
cec37b8edd Revert "Modificación y borrado de especialidades"
This reverts commit 4aeec0c31b
2019-12-22 11:46:11 +01:00
dalvarezgon
ed1938f44a Merge branch 'master' of https://pdp-pds.eimt.uoc.edu/pds19-grupo2/myhealth.git 2019-12-21 23:12:16 +01:00
dalvarezgon
4aeec0c31b Modificación y borrado de especialidades 2019-12-21 23:10:13 +01:00
Gabriel Paradiso
917e128d7e actualizar install.md y ejecutar script de creación de datos de prueba al levantar el ambiente 2019-12-21 22:37:04 +01:00
Marcos Garcia Nuñez
a65e7fb885 Corregido action no existente. 2019-12-21 20:42:13 +01:00
Marcos Garcia Nuñez
18f2524412 Añadida cabecera y espacios de nombres. 2019-12-21 20:41:50 +01:00
Marcos Garcia Nuñez
26c3ec6a33 Incluir atributo source en el comando javac de ant. 2019-12-21 18:53:26 +01:00
Marcos Garcia Nuñez
b75199840e Eliminación de clases de interfaz del Jar EJB. 2019-12-21 18:49:40 +01:00
Marcos Garcia Nuñez
a8dd4f2674 Quitados imports innecesarios. 2019-12-21 18:47:31 +01:00
Marcos Garcia Nuñez
06388f9449 Merge branch 'master' of https://pdp-pds.eimt.uoc.edu/pds19-grupo2/myhealth.git 2019-12-21 12:56:45 +01:00
Marcos Garcia Nuñez
f62f4df779 Asociación de mensajes de validación a cada componente JSF. 2019-12-21 12:56:34 +01:00
Marcos Garcia Nuñez
14f4ac42ac Quitado código Javascript, retoques en el layout. 2019-12-21 12:56:04 +01:00
Marcos Garcia Nuñez
aee0f9deaf Corección de layout de la pagina 2019-12-21 12:55:21 +01:00
Marcos Garcia Nuñez
6a413357e5 Corrección de NIF duplicado en datos de prueba. 2019-12-21 12:54:39 +01:00
Marcos Garcia Nuñez
45c9de6546 Unificación de funciones Javscript en un fichero. 2019-12-21 12:54:23 +01:00
Marcos Garcia Nuñez
03f34d4a83 Merge branch 'docker' into 'master'
Docker env

See merge request pds19-grupo2/myhealth!2
2019-12-21 10:21:04 +01:00
Marcos Garcia Nuñez
b6d68df139 Establecer width:auto para las opciones de menú. 2019-12-20 20:14:50 +01:00
Marcos Garcia Nuñez
b815680649 Configuración de opciones de menú para evitar word-wrap. 2019-12-20 19:05:36 +01:00
Marcos Garcia Nuñez
992fc3e25a Configruación de excepciones y redirección a página de errores. 2019-12-20 17:58:34 +01:00
Marcos Garcia Nuñez
ed78633291 Nuevo método para obtener la causa raiz de una excepción. 2019-12-20 17:57:56 +01:00
Marcos Garcia Nuñez
c8a3f1e933 Adaptación de página general de errores para mostrar diferentes tipos de
excepciones.
2019-12-20 17:57:40 +01:00
Marcos Garcia Nuñez
02ea97195f Gestión de excepciones en el filtro de autorización. 2019-12-20 17:57:07 +01:00
Marcos Garcia Nuñez
ebc33396c7 Ignorar si el archivo existe o no a la hora de eliminarlo .gitlab-ci.yml 2019-12-20 08:19:04 +01:00
Marcos Garcia Nuñez
2dc7c9b8b7 Eliminación de ear anterior desplegado, previo al despliegue del nuevo. 2019-12-20 08:14:21 +01:00
Marcos Garcia Nuñez
83e3fb9867 Update .gitlab-ci.yml 2019-12-20 08:07:58 +01:00
Marcos Garcia Nuñez
a83b273955 Renombrado a nombre sin espacio 02.Datos_prueba.sql 2019-12-20 07:50:20 +01:00
dalvarezgon
310aae76ef Mensajes tipo growl 2019-12-20 00:34:55 +01:00
Marcos Garcia Nuñez
06114b7e2f Redirección de excepciones a la página de error. 2019-12-20 00:19:58 +01:00
Marcos Garcia Nuñez
952417c6ce Control de error con sessión expirada (propiedad nula) 2019-12-20 00:05:22 +01:00
Marcos Garcia Nuñez
1dff9b09e8 Control de parametros nulos. 2019-12-20 00:04:58 +01:00
Marcos Garcia Nuñez
aeb1d300a4 Mejora en el control de excepciones. 2019-12-20 00:04:41 +01:00
Marcos Garcia Nuñez
66a00616e5 Filtro para peticiones AJAX y detección de sesión expirada. 2019-12-20 00:04:17 +01:00
Marcos Garcia Nuñez
318680d5c0 Mensajes diferentes en función del tipo de error. 2019-12-19 23:59:40 +01:00
Marcos Garcia Nuñez
8482b660c1 funcion AJAX para interceptar errores en peticiones AJAX (no funciona). 2019-12-19 23:59:11 +01:00
Marcos Garcia Nuñez
e789cb57d2 omnifaces AjaxExceptionHandler para gestionar las excpeciones AJAX. 2019-12-19 23:57:40 +01:00
Marcos Garcia Nuñez
ffe56f3c68 Cambiados mensajes a tipo growl (superpuestos sobre la interfaz). 2019-12-19 20:48:03 +01:00
dalvarezgon
b2e55231ea Mensajes movidos al pie con autoclose 2019-12-19 16:48:55 +01:00
dalvarezgon
1e3886cc54 Especialidades médicas editables 2019-12-19 13:15:11 +01:00
Marcos Garcia Nuñez
492ddad057 Creación de instrucciones de instalación y despliegue. 2019-12-19 11:30:32 +01:00
Marcos Garcia Nuñez
7891777ecf Update README.md 2019-12-19 11:28:51 +01:00
Marcos Garcia Nuñez
01f0f5627f Gestión de excepciones y fin de sesión 2019-12-19 00:09:48 +01:00
Marcos Garcia Nuñez
25a4896426 Corrección de datos, campo enumerado como string en los datos de prueba. 2019-12-19 00:09:01 +01:00
45 changed files with 610 additions and 464 deletions

View File

@@ -14,7 +14,7 @@ ci_build:
script: script:
- cd 1.sources/MyHealth - cd 1.sources/MyHealth
- ant clean - ant clean
- ant all - ant ear
ci_test: ci_test:
stage: test stage: test
@@ -25,10 +25,13 @@ ci_test:
deploy_pre: deploy_pre:
stage: deploy stage: deploy
script: script:
- echo "Eliminamos archivo ear anterior..."
- rm -f $JBOSS_HOME/standalone/deployments/MyHealth.*
- echo "Despliegue al servidor de PRE" - echo "Despliegue al servidor de PRE"
- cd 1.sources/MyHealth - cd 1.sources/MyHealth
- ant deployear - ant deployear
environment: environment:
name: pre name: pre
url: https://localhost:8080/MyHealth url: https://localhost:8080/MyHealth
@@ -38,6 +41,8 @@ deploy_pre:
deploy_pro: deploy_pro:
stage: deploy stage: deploy
script: script:
- echo "Eliminamos archivo ear anterior..."
- rm -f $JBOSS_HOME/standalone/deployments/MyHealth.*
- echo "Despliegue al servidor de PRO" - echo "Despliegue al servidor de PRO"
- cd 1.sources/MyHealth - cd 1.sources/MyHealth
- ant deployear - ant deployear

View File

@@ -1,13 +1,13 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.compiler.source=1.8

View File

@@ -49,8 +49,17 @@
<target name="compileEjb" depends="init"> <target name="compileEjb" depends="init">
<copy file="${sourcesrc}/META-INF/persistence.xml" todir="${buildjar}/META-INF" /> <copy file="${sourcesrc}/META-INF/persistence.xml" todir="${buildjar}/META-INF" />
<copy file="${sourcesrc}/log4j.properties" todir="${buildjar}" /> <copy file="${sourcesrc}/log4j.properties" todir="${buildjar}" />
<javac encoding="${java.encoding}" srcdir="${sourcesrc}" destdir="${buildjar}" includes="ejb/**/*.java, jpa/**/*.java, TO/**/*.java, common/**/*.java" classpathref="jboss.classpath" <javac encoding="${java.encoding}" srcdir="${sourcesrc}" destdir="${buildjar}" includeantruntime="true" source="1.8" target="1.8">
includeantruntime="true" /> <classpath>
<path refid="jboss.classpath" />
</classpath>
<include name="ejb/**/*.java" />
<include name="jpa/**/*.java" />
<include name="TO/**/*.java" />
<include name="common/**/*.java" />
<exclude name="managedbean/**/*.java" />
</javac>
<delete verbose="true" dir="${buildjar}/managedbean" />
</target> </target>
<!-- Update the EJB jar file and create if not exist --> <!-- Update the EJB jar file and create if not exist -->
@@ -63,11 +72,16 @@
<copy todir="${buildwar}"> <copy todir="${buildwar}">
<fileset dir="${docroot}" /> <fileset dir="${docroot}" />
</copy> </copy>
<javac encoding="${java.encoding}" srcdir="${sourcesrc}" destdir="${buildwar}/WEB-INF/classes" includes="managedbean/**/*.java" includeantruntime="true"> <javac encoding="${java.encoding}" srcdir="${sourcesrc}" destdir="${buildwar}/WEB-INF/classes" includeantruntime="true" source="1.8" target="1.8">
<classpath> <classpath>
<path refid="jboss.classpath" /> <path refid="jboss.classpath" />
<path refid="lib.dir" /> <path refid="lib.dir" />
</classpath> </classpath>
<include name="managedbean/**/*.java" />
<exclude name="ejb/**/*.java" />
<exclude name="jpa/**/*.java" />
<exclude name="TO/**/*.java" />
<exclude name="common/**/*.java" />
</javac> </javac>
<delete verbose="true" dir="${buildwar}/WEB-INF/classes/ejb" /> <delete verbose="true" dir="${buildwar}/WEB-INF/classes/ejb" />
<delete verbose="true" dir="${buildwar}/WEB-INF/classes/jpa" /> <delete verbose="true" dir="${buildwar}/WEB-INF/classes/jpa" />

View File

@@ -2,4 +2,7 @@
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd" version="2.3"> xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd" version="2.3">
<factory>
<exception-handler-factory>org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory</exception-handler-factory>
</factory>
</faces-config> </faces-config>

View File

@@ -18,7 +18,10 @@
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value> <param-value>true</param-value>
</context-param> </context-param>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param> <context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value> <param-value>.xhtml</param-value>
@@ -27,8 +30,6 @@
<param-name>primefaces.FONT_AWESOME</param-name> <param-name>primefaces.FONT_AWESOME</param-name>
<param-value>true</param-value> <param-value>true</param-value>
</context-param> </context-param>
<context-param> <context-param>
<param-name>primefaces.THEME</param-name> <param-name>primefaces.THEME</param-name>
<param-value>#{sessionPreferences.currentTheme}</param-value> <param-value>#{sessionPreferences.currentTheme}</param-value>
@@ -42,36 +43,59 @@
</servlet> </servlet>
<!-- Map these files with JSF --> <!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping> <servlet-mapping>
<servlet-name>Faces Servlet</servlet-name> <servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern> <url-pattern>*.xhtml</url-pattern>
</servlet-mapping> </servlet-mapping>
<!-- Filters -->
<filter>
<filter-name>facesExceptionFilter</filter-name>
<filter-class>org.omnifaces.filter.FacesExceptionFilter</filter-class>
</filter>
<!-- Filter mappings -->
<filter-mapping>
<filter-name>facesExceptionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Error pages mapping -->
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/error.xhtml?type=expired</location>
</error-page>
<error-page>
<exception-type>java.sql.SQLException</exception-type>
<exception-type>org.hibernate.exception.GenericJDBCException</exception-type>
<exception-type>java.net.ConnectException</exception-type>
<exception-type>javax.persistence.PersistenceException</exception-type>
<location>/error.xhtml?type=sql</location>
</error-page>
<error-page>
<exception-type>javax.persistence.PersistenceException</exception-type>
<location>/error.xhtml?type=runtime</location>
</error-page>
<error-page>
<exception-type>java.net.ConnectException</exception-type>
<location>/error.xhtml?type=sql</location>
</error-page>
<error-page> <error-page>
<error-code>500</error-code> <error-code>500</error-code>
<location>/error.xhtml</location> <location>/error.xhtml</location>
</error-page> </error-page>
<error-page>
<error-code>401</error-code>
<location>/error.xhtml?type=expired</location>
</error-page>
<session-config> <session-config>
<session-timeout>30</session-timeout> <session-timeout>30</session-timeout>
</session-config> </session-config>
<!-- The Welcome File List --> <!-- The Welcome File List -->
<welcome-file-list> <welcome-file-list>
<welcome-file>home.xhtml</welcome-file> <welcome-file>/home.xhtml</welcome-file>
</welcome-file-list> </welcome-file-list>
</web-app> </web-app>

View File

@@ -2,7 +2,7 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"> xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui">
<ui:composition template="./header.xhtml"> <ui:composition template="./header.xhtml">
<ui:define name="content"> <ui:define name="content">
@@ -12,16 +12,23 @@
<div class="ui-g-8 ui-md-8"> <div class="ui-g-8 ui-md-8">
<p:panel id="ErrorPanel"> <p:panel id="ErrorPanel">
<f:facet name="header"> <f:facet name="header">
<p:outputLabel value="Se ha producido un error de autorización" rendered="#{param.type == 'auth'}" /> <p:outputLabel rendered="#{param.type == 'sql'}" value="No se puede conectar con la base de datos" />
<p:outputLabel value="Se ha producido un error desconocido" rendered="#{param.type == null}" /> <p:outputLabel rendered="#{param.type == 'auth'}" value="Se ha producido un error de autorización" />
<p:outputLabel rendered="#{param.type == 'expired'}" value="Su sesión ha caducado" />
<p:outputLabel rendered="#{param.type == 'runtime'}" value="Se producido un error en tiempo de ejecución" />
<p:outputLabel rendered="#{param.type == '' or param.type == null}" value="Se ha producido un error desconocido" />
</f:facet> </f:facet>
<div class="ui-g ui-fluid"> <div class="ui-g ui-fluid">
<div class="ui-g-12">La acción que estaba realizando a causado un error inesperado en el sistema. A continuación podrá ver un descripción detallada del error para que <div class="ui-g-12">
pueda comunicarlo al equipo de soporte.</div> <p:outputLabel rendered="#{param.type == 'sql'}"
value="No ha sido posible realizar una conexión con el servidor de base de datos subyante, o ha ocurrido un error grave cuando se intentaba realizar la conexión. Por favor contacte con el equipo de soporte." />
<div class="ui-g-12" style="font-weight: bold;"> <p:outputLabel rendered="#{param.type == 'auth'}"
<!-- <p:outputLabel value="No está autorizado a acceder a la página solicitada. Por favor, utilice el menú principal de la aplicación." rendered="#{param.type == 'auth'}" /> --> value="No está autorizado a ver la url consultada. Por favor, vaya a la página principal y utilice el menú de la aplicación para acceder las funcionalidades disponibles." />
<!-- <p:outputLabel value="Se ha producido un error desconocido. Si vuelve a repetirse, por favor, contacte con el equipo de soporte." rendered="#{param.type == null}" /> --> <p:outputLabel rendered="#{param.type == 'expired'}" value="Su sesión ha caducado. Por favor, incie sesión de nuevo en el sistema." />
<p:outputLabel rendered="#{param.type == 'runtime'}"
value="Se ha producido un error en el servidor durante la ejecución de la última acción. Por favor, intentelo de nuevo o contacte con el equipo de soporte." />
<p:outputLabel rendered="#{param.type == '' or param.type == null}"
value="La acción que estaba realizando a causado un error inesperado en el sistema. A continuación podrá ver un descripción detallada del error para que pueda comunicarlo al equipo de soporte." />
</div> </div>
<div class="ui-g-12"> <div class="ui-g-12">

View File

@@ -2,45 +2,35 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"> xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui">
<h:head> <h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>MyHealth Online Services</title> <title>MyHealth Online Services</title>
<h:outputStylesheet name="primeicons/primeicons.css" library="primefaces" /> <h:outputStylesheet name="primeicons/primeicons.css" library="primefaces" />
<h:outputStylesheet library="css" name="estilos.css" /> <h:outputStylesheet library="css" name="estilos.css" />
<h:outputScript library="js" name="common.js" />
</h:head> </h:head>
<h:outputScript> <h:outputScript>
function handleLoginRequest(xhr, status, args) { // Si hay un error AJAX, lo más probable es que la sesión expirase, vamos a la página de error
if(args.validationFailed || !args.loggedIn) { function onAjaxError() {
PF('dlgLogin').jq.effect("shake", {times:5}, 100); window.location.href = "#{request.contextPath}/error.xhtml?type=expired";
PF('btnLogin').enable();
}
else {
PF('btnLogin').enable();
PF('dlgLogin').hide();
}
}
function startLogin() {
PF('btnLogin').disable();
} }
</h:outputScript> </h:outputScript>
<h:body> <h:body>
<p:growl id="messages" globalOnly="true" sticky="false" showDetail="true" life="15000" />
<div id="layout"> <div id="layout">
<div id="top" class="top"> <div id="top" class="top">
<p:growl id="messages" globalOnly="true" sticky="false" showDetail="true" life="15000" />
<h:graphicImage library="images" name="logo-small.png" /> <h:graphicImage library="images" name="logo-small.png" />
</div> </div>
<hr /> <div id="menuDiv" style="margin-bottom: 10px;">
<div id="menuDiv"> <p:ajaxStatus style="width:32px; height:32px; position:fixed; right:32px; bottom:32px" onerror="onAjaxError()">
<p:ajaxStatus style="width:32px; height:32px; position:fixed; right:32px; bottom:32px">
<f:facet name="start"> <f:facet name="start">
<i id="loginSpin" class="pi pi-spin pi-spinner" style="font-size: 3em"></i> <i id="loginSpin" class="pi pi-spin pi-spinner" style="font-size: 3em" />
</f:facet> </f:facet>
<f:facet name="complete"> <f:facet name="error">
<h:outputText value="" /> <i class="pi pi-exclamation-triangle" style="font-size: 3em" />
</f:facet> </f:facet>
</p:ajaxStatus> </p:ajaxStatus>

View File

@@ -2,34 +2,27 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"> xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui">
<f:metadata>
<f:viewParam name="refresh" value="#{home.refresh}" />
</f:metadata>
<ui:composition template="./header.xhtml"> <ui:composition template="./header.xhtml">
<ui:define name="content"> <ui:define name="content">
<h:form> <h:form>
<p:messages id="mesgs" showDetail="true" closable="true" autoupdate="true" /> <p:growl id="mesgs" showDetail="true" closable="true" autoupdate="true" />
<p:panel header="Pagina principal"> <p:panel header="Pagina principal">
<div class="ui-g ui-fluid"> <div class="ui-g ui-fluid">
<div class="ui-g-2 ui-md-2"> <div class="ui-g-2 ui-md-2">
<p:outputLabel for="selectorTema" value="Cambio de tema" /> <p:outputLabel for="selectorTema" value="Cambio de tema" />
</div> </div>
<div class="ui-g-6 ui-md-6"> <div class="ui-g-3 ui-md-3">
<p:themeSwitcher id="selectorTema" style="width:300px" value="#{sessionPreferences.currentTheme}"> <p:themeSwitcher id="selectorTema" style="width:300px" value="#{sessionPreferences.currentTheme}">
<f:selectItem itemLabel="Seleccione un tema" itemValue="" noSelectionOption="true" /> <f:selectItem itemLabel="Seleccione un tema" itemValue="" noSelectionOption="true" />
<f:selectItems value="#{home.themes}" var="theme" itemLabel="#{theme.displayName}" itemValue="#{theme.name}" /> <f:selectItems value="#{home.themes}" var="theme" itemLabel="#{theme.displayName}" itemValue="#{theme.name}" />
<p:ajax listener="#{sessionPreferences.updateCurrentTheme}" /> <p:ajax listener="#{sessionPreferences.updateCurrentTheme}" />
</p:themeSwitcher> </p:themeSwitcher>
</div> </div>
<div class="ui-g-4 ui-md-1" /> <div class="ui-g-2 ui-md-2">
<div class="ui-g-4 ui-md-4" />
<div class="ui-g-4 ui-md-4 ">
<p:commandButton value="Usar tema en este sesión" update="mesgs" action="#{sessionPreferences.updateCurrentTheme}" icon="pi pi-save" /> <p:commandButton value="Usar tema en este sesión" update="mesgs" action="#{sessionPreferences.updateCurrentTheme}" icon="pi pi-save" />
</div> </div>
<div class="ui-g-4 ui-md-4" /> <div class="ui-g-5 ui-md-5" />
<div class="ui-g-2 ui-md-2"> <div class="ui-g-2 ui-md-2">
<div class="ui-inputgroup"> <div class="ui-inputgroup">

View File

@@ -2,24 +2,7 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"> xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui">
<h:head>
<title>login</title>
</h:head>
<h:outputScript>
<script type="text/javascript">
function handleLoginRequest(xhr, status, args) {
if(args.validationFailed || !args.loggedIn) {
PF('dlg').jq.effect("shake", {times:5}, 100);
}
else {
PF('dlg').hide();
$('#loginLink').fadeOut();
}
}
</script>
</h:outputScript>
<ui:composition template="./header.xhtml"> <ui:composition template="./header.xhtml">
<ui:define name="content"> <ui:define name="content">
<h:form> <h:form>

View File

@@ -70,7 +70,7 @@
<div class="ui-g-12 ui-g-nopad"> <div class="ui-g-12 ui-g-nopad">
<div class="ui-g-4 ui-md-4" /> <div class="ui-g-4 ui-md-4" />
<div class="ui-g-2 ui-md-2 "> <div class="ui-g-2 ui-md-2 ">
<p:commandButton validateClient="true" value="Guardar" update="TestForm" action="#{BeanName.actionMethod}" icon="pi pi-check" /> <p:commandButton validateClient="true" value="Guardar" update="TestForm" action="#{PendingQuestions.saveData}" icon="pi pi-check" />
</div> </div>
<div class="ui-g-2 ui-md-2"> <div class="ui-g-2 ui-md-2">
<p:button value="Volver" outcome="/home" icon="pi pi-home" /> <p:button value="Volver" outcome="/home" icon="pi pi-home" />

View File

@@ -1,51 +0,0 @@
<h:form>
<p:growl id="messages" />
<p:menubar>
<p:submenu label="File" icon="pi pi-file">
<p:submenu label="New" icon="pi pi-briefcase">
<p:menuitem value="Project" url="#" />
<p:menuitem value="Other" url="#" />
</p:submenu>
<p:menuitem value="Open" url="#" />
<p:separator />
<p:menuitem value="Quit" url="#" />
</p:submenu>
<p:submenu label="Edit" icon="pi pi-pencil">
<p:menuitem value="Undo" url="#" icon="pi pi-angle-double-left" />
<p:menuitem value="Redo" url="#" icon="pi pi-angle-double-right" />
</p:submenu>
<p:submenu label="Help" icon="pi pi-question">
<p:menuitem value="Contents" url="#" />
<p:submenu label="Search" icon="pi pi-search">
<p:submenu label="Text">
<p:menuitem value="Workspace" url="#" />
</p:submenu>
<p:menuitem value="File" url="#" />
</p:submenu>
</p:submenu>
<p:submenu label="Actions" icon="pi pi-cog">
<p:submenu label="Ajax" icon="pi pi-refresh">
<p:menuitem value="Save" action="#{menuView.save}" icon="pi pi-save"
update="messages" />
<p:menuitem value="Update" action="#{menuView.update}"
icon="pi pi-refresh" update="messages" />
</p:submenu>
<p:submenu label="Non-Ajax" icon="pi pi-clone">
<p:menuitem value="Delete" action="#{menuView.delete}"
icon="pi pi-times" update="messages" ajax="false" />
</p:submenu>
</p:submenu>
<p:menuitem value="Quit" url="http://www.primefaces.org"
icon="pi pi-times" />
<f:facet name="options">
<p:inputText style="margin:1px 10px 1px 1px;" placeholder="Search" />
<p:commandButton type="button" value="Logout" icon="pi pi-home" />
</f:facet>
</p:menubar>
</h:form>

View File

@@ -7,7 +7,7 @@
<ui:composition template="../header.xhtml"> <ui:composition template="../header.xhtml">
<ui:define name="content"> <ui:define name="content">
<h:form id="frmChangeFD"> <h:form id="frmChangeFD">
<p:messages id="mesgs" showDetail="true" closable="true" autoupdate="true" /> <p:growl id="mesgs" showDetail="true" closable="true" autoupdate="true" />
<p:panel id="badProfile" rendered="#{not home.patient}"> <p:panel id="badProfile" rendered="#{not home.patient}">
<div class="ui-g-3 ui-md-3" /> <div class="ui-g-3 ui-md-3" />
<div class="ui-g-6 ui-md-6"> <div class="ui-g-6 ui-md-6">
@@ -31,18 +31,18 @@
<p:panel id="PanelPHC" header="Cambiar médico de familia asignado" rendered="#{home.patient}"> <p:panel id="PanelPHC" header="Cambiar médico de familia asignado" rendered="#{home.patient}">
<div class="ui-g ui-fluid"> <div class="ui-g ui-fluid">
<div class="ui-g-4 ui-md-4"> <div class="ui-g-2">
<p:outputLabel value="Médico de familia actualmente asignado:" /> <p:outputLabel value="Médico de familia actualmente asignado:" />
</div> </div>
<div class="ui-g-4 ui-md-4"> <div class="ui-g-4">
<p:outputLabel id="lblCurrentCenter" style="font-weight: bold;" value="#{ChangeFD.currentFamilyDoctor.displayName}" /> <p:outputLabel id="lblCurrentCenter" style="font-weight: bold;" value="#{ChangeFD.currentFamilyDoctor.displayName}" />
</div> </div>
<div class="ui-g-4 ui-md-4" /> <div class="ui-g-6" />
<div class="ui-g-4 ui-md-4"> <div class="ui-g-2">
<p:outputLabel value="Nuevo médico de familia:" for="newFamilyDocAC" /> <p:outputLabel value="Nuevo médico de familia:" for="newFamilyDocAC" />
</div> </div>
<div class="ui-g-4 ui-md-4"> <div class="ui-g-4">
<p:autoComplete id="newFamilyDocAC" dropdown="true" required="true" value="#{ChangeFD.newFamilyDoctor}" completeMethod="#{ChangeFD.completeFamilyDoctor}" var="fd" <p:autoComplete id="newFamilyDocAC" dropdown="true" required="true" value="#{ChangeFD.newFamilyDoctor}" completeMethod="#{ChangeFD.completeFamilyDoctor}" var="fd"
itemLabel="#{fd.displayName}" itemValue="#{fd}" forceSelection="true" requiredMessage="Por favor, selecciona un médico de familia" itemLabel="#{fd.displayName}" itemValue="#{fd}" forceSelection="true" requiredMessage="Por favor, selecciona un médico de familia"
placeholder="Seleccione su nuevo médico de familia o teclee para buscar..."> placeholder="Seleccione su nuevo médico de familia o teclee para buscar...">
@@ -58,7 +58,7 @@
</p:column> </p:column>
</p:autoComplete> </p:autoComplete>
</div> </div>
<div class="ui-g-4 ui-md-4"> <div class="ui-g-6">
<p:message for="newFamilyDocAC" /> <p:message for="newFamilyDocAC" />
</div> </div>
@@ -73,7 +73,6 @@
<div class="ui-g-4 ui-md-4" /> <div class="ui-g-4 ui-md-4" />
</div> </div>
</div> </div>
</p:panel> </p:panel>
</h:form> </h:form>
</ui:define> </ui:define>

View File

@@ -7,7 +7,7 @@
<ui:composition template="../header.xhtml"> <ui:composition template="../header.xhtml">
<ui:define name="content"> <ui:define name="content">
<h:form id="frmChangePHCC"> <h:form id="frmChangePHCC">
<p:messages id="mesgs" showDetail="true" closable="true" autoupdate="true" /> <p:growl id="mesgs" showDetail="true" closable="true" autoupdate="true" />
<p:panel id="badProfile" rendered="#{not home.familyDoctor}"> <p:panel id="badProfile" rendered="#{not home.familyDoctor}">
<div class="ui-g-3 ui-md-3" /> <div class="ui-g-3 ui-md-3" />
<div class="ui-g-6 ui-md-6"> <div class="ui-g-6 ui-md-6">
@@ -31,18 +31,18 @@
<p:panel id="PanelPHC" header="Cambiar centro de antención primaria asignado" rendered="#{home.familyDoctor}"> <p:panel id="PanelPHC" header="Cambiar centro de antención primaria asignado" rendered="#{home.familyDoctor}">
<div class="ui-g ui-fluid"> <div class="ui-g ui-fluid">
<div class="ui-g-4 ui-md-4"> <div class="ui-g-2">
<p:outputLabel value="Centro de antención primaria actualmente asignado:" /> <p:outputLabel value="Centro de antención primaria actual:" />
</div> </div>
<div class="ui-g-4 ui-md-4"> <div class="ui-g-4">
<p:outputLabel id="lblCurrentCenter" style="font-weight: bold;" value="#{ChangeCAP.currentCenter.displayName}" /> <p:outputLabel id="lblCurrentCenter" style="font-weight: bold;" value="#{ChangeCAP.currentCenter.displayName}" />
</div> </div>
<div class="ui-g-4 ui-md-4" /> <div class="ui-g-6" />
<div class="ui-g-4 ui-md-4"> <div class="ui-g-2">
<p:outputLabel value="Nuevo centro de atención primaria:" for="newCenter" /> <p:outputLabel value="Nuevo centro de atención primaria:" for="newCenter" />
</div> </div>
<div class="ui-g-4 ui-md-4"> <div class="ui-g-4">
<p:autoComplete id="newCenter" dropdown="true" required="true" value="#{ChangeCAP.newCenter}" completeMethod="#{ChangeCAP.completePrimaryHealCareCenter}" var="phc" <p:autoComplete id="newCenter" dropdown="true" required="true" value="#{ChangeCAP.newCenter}" completeMethod="#{ChangeCAP.completePrimaryHealCareCenter}" var="phc"
itemLabel="#{phc.displayName}" itemValue="#{phc}" forceSelection="true" requiredMessage="Por favor, selecciona un nuevo centro de antención primaria" itemLabel="#{phc.displayName}" itemValue="#{phc}" forceSelection="true" requiredMessage="Por favor, selecciona un nuevo centro de antención primaria"
placeholder="Seleccione una CAP o teclee para buscar..."> placeholder="Seleccione una CAP o teclee para buscar...">
@@ -55,7 +55,7 @@
</p:column> </p:column>
</p:autoComplete> </p:autoComplete>
</div> </div>
<div class="ui-g-4 ui-md-4"> <div class="ui-g-6">
<p:message for="newCenter" /> <p:message for="newCenter" />
</div> </div>

View File

@@ -44,26 +44,7 @@
</h:form> </h:form>
<h:form id="frmRegisterUser" rendered="#{not RegisterUser.registered}"> <h:form id="frmRegisterUser" rendered="#{not RegisterUser.registered}">
<h:outputScript> <p:growl id="mesgs" globalOnly="true" showDetail="true" closable="true" autoupdate="true" />
function handleRequest(xhr, status, args) {
var nif = PF('nifButton');
if ( args.NIFisDupe == false ) {
nif.jq.children(".ui-icon").removeClass("pi pi-times");
nif.jq.removeClass('red-button');
nif.jq.children(".ui-icon").addClass("pi pi-check");
nif.jq.addClass('green-button');
}
else if (nif.jq.hasClass('red-button') == false) {
nif.jq.children(".ui-icon").removeClass("pi pi-check");
nif.jq.removeClass('green-button');
nif.jq.children(".ui-icon").addClass("pi pi-times");
nif.jq.addClass('red-button');
}
}
</h:outputScript>
<p:messages id="mesgs" globalOnly="true" showDetail="true" closable="true" autoupdate="true" />
<p:panel id="tipoUsuario" header="Especifique el tipo de usuario que desea registrarse"> <p:panel id="tipoUsuario" header="Especifique el tipo de usuario que desea registrarse">
<div class="ui-g ui-fluid"> <div class="ui-g ui-fluid">
<div class="ui-g-2 ui-md-2"> <div class="ui-g-2 ui-md-2">
@@ -86,7 +67,7 @@
<div class="ui-g-4 ui-md-4"> <div class="ui-g-4 ui-md-4">
<div class="ui-inputgroup"> <div class="ui-inputgroup">
<p:inputText id="nif" value="#{RegisterUser.nif}" validator="nifValidator" maxlength="20" required="true" requiredMessage="Por favor, indque su NIF"> <p:inputText id="nif" value="#{RegisterUser.nif}" validator="nifValidator" maxlength="20" required="true" requiredMessage="Por favor, indque su NIF">
<p:ajax event="blur" update="nifmsg" listener="#{RegisterUser.hadleNIFValueChange}" oncomplete="handleRequest(xhr, status, args)" /> <p:ajax event="blur" update="nifmsg" listener="#{RegisterUser.hadleNIFValueChange}" oncomplete="handleNIFResponse(xhr, status, args)" />
</p:inputText> </p:inputText>
<p:commandButton widgetVar="nifButton" icon="pi pi-times" styleClass="red-button" /> <p:commandButton widgetVar="nifButton" icon="pi pi-times" styleClass="red-button" />
</div> </div>

View File

@@ -7,26 +7,7 @@
<ui:composition template="../header.xhtml"> <ui:composition template="../header.xhtml">
<ui:define name="content"> <ui:define name="content">
<h:form id="frmUpdateProfile"> <h:form id="frmUpdateProfile">
<h:outputScript> <p:growl id="mesgs" showDetail="true" closable="true" autoupdate="true" />
function handleRequest(xhr, status, args) {
var nif = PF('nifButton');
if ( args.NIFisDupe == false ) {
nif.jq.children(".ui-icon").removeClass("pi pi-times");
nif.jq.removeClass('red-button');
nif.jq.children(".ui-icon").addClass("pi pi-check");
nif.jq.addClass('green-button');
}
else if (nif.jq.hasClass('red-button') == false) {
nif.jq.children(".ui-icon").removeClass("pi pi-check");
nif.jq.removeClass('green-button');
nif.jq.children(".ui-icon").addClass("pi pi-times");
nif.jq.addClass('red-button');
}
}
</h:outputScript>
<p:messages id="mesgs" showDetail="true" closable="true" autoupdate="true" />
<p:panel id="tipoUsuario" header="Tipo de usuario registrado"> <p:panel id="tipoUsuario" header="Tipo de usuario registrado">
<div class="ui-g ui-fluid"> <div class="ui-g ui-fluid">
@@ -61,7 +42,7 @@
<div class="ui-g-4 ui-md-4"> <div class="ui-g-4 ui-md-4">
<div class="ui-inputgroup"> <div class="ui-inputgroup">
<p:inputText id="nif" value="#{UpdateProfile.nif}" validator="nifValidator" maxlength="20" required="true" requiredMessage="Por favor, indque su NIF"> <p:inputText id="nif" value="#{UpdateProfile.nif}" validator="nifValidator" maxlength="20" required="true" requiredMessage="Por favor, indque su NIF">
<p:ajax event="blur" update="nifmsg" listener="#{UpdateProfile.hadleNIFValueChange}" oncomplete="handleRequest(xhr, status, args)" /> <p:ajax event="blur" update="nifmsg" listener="#{UpdateProfile.hadleNIFValueChange}" oncomplete="handleNIFResponse(xhr, status, args)" />
</p:inputText> </p:inputText>
<p:commandButton widgetVar="nifButton" icon="pi pi-check" styleClass="green-button" /> <p:commandButton widgetVar="nifButton" icon="pi pi-check" styleClass="green-button" />
</div> </div>
@@ -138,7 +119,7 @@
</div> </div>
<div class="ui-g-4 ui-md-4"> <div class="ui-g-4 ui-md-4">
<p:autoComplete id="selPHC" dropdown="true" value="#{UpdateProfile.primaryHealthCareCenter}" completeMethod="#{UpdateProfile.completePrimaryHealCareCenter}" var="phc" <p:autoComplete id="selPHC" dropdown="true" value="#{UpdateProfile.primaryHealthCareCenter}" completeMethod="#{UpdateProfile.completePrimaryHealCareCenter}" var="phc"
itemLabel="#{phc.displayName}" itemValue="#{phc}" forceSelection="true" requiredMessage="Por favor, selecciona un nuevo centro de antención primaria"> itemLabel="#{phc.displayName}" itemValue="#{phc}" forceSelection="true" required="true" requiredMessage="Por favor, selecciona un nuevo centro de antención primaria">
<o:converter converterId="omnifaces.ListConverter" list="#{UpdateProfile.phcList}" /> <o:converter converterId="omnifaces.ListConverter" list="#{UpdateProfile.phcList}" />
<p:column headerText="Nombre"> <p:column headerText="Nombre">
<h:outputText value="#{phc.name}" /> <h:outputText value="#{phc.name}" />
@@ -159,7 +140,7 @@
</div> </div>
<div class="ui-g-4 ui-md-4"> <div class="ui-g-4 ui-md-4">
<p:autoComplete id="selMS" dropdown="true" value="#{UpdateProfile.medicalSpecialty}" completeMethod="#{UpdateProfile.completeMedicalSpecialty}" var="ms" <p:autoComplete id="selMS" dropdown="true" value="#{UpdateProfile.medicalSpecialty}" completeMethod="#{UpdateProfile.completeMedicalSpecialty}" var="ms"
itemLabel="#{ms.displayName}" itemValue="#{ms}" forceSelection="true" requiredMessage="Por favor, selecciona una especialidad médica"> itemLabel="#{ms.displayName}" itemValue="#{ms}" forceSelection="true" required="true" requiredMessage="Por favor, selecciona una especialidad médica">
<o:converter converterId="omnifaces.ListConverter" list="#{UpdateProfile.medicalSpecialtiesList}" /> <o:converter converterId="omnifaces.ListConverter" list="#{UpdateProfile.medicalSpecialtiesList}" />
<p:column headerText="Nombre"> <p:column headerText="Nombre">
<h:outputText value="#{ms.name}" /> <h:outputText value="#{ms.name}" />

View File

@@ -11,6 +11,11 @@ BODY {
margin: 0 !important; margin: 0 !important;
} }
ul.ui-menu-list {
white-space: nowrap;
width: auto !important;
}
.green-button.ui-button.ui-state-default { .green-button.ui-button.ui-state-default {
background-color: #5cb85c; background-color: #5cb85c;
border-color: #5cb85c; border-color: #5cb85c;

View File

@@ -0,0 +1,41 @@
/**
* Funciones comunes JavaScript para el proyecto MyHealth
*
*
*/
// Gestiona la ventana de login
function handleLoginRequest(xhr, status, args) {
if (args.validationFailed || !args.loggedIn) {
PF('dlgLogin').jq.effect("shake", {
times : 5
}, 100);
PF('btnLogin').enable();
} else {
PF('btnLogin').enable();
PF('dlgLogin').hide();
}
}
// Tras empezar la petición AJAX de login desabilita el botón para evitar doble login
function startLogin() {
PF('btnLogin').disable();
}
// Valida si un NIF está duplicado.
function handleNIFResponse(xhr, status, args) {
var nif = PF('nifButton');
if (args.NIFisDupe == false) {
nif.jq.children(".ui-icon").removeClass("pi pi-times");
nif.jq.removeClass('red-button');
nif.jq.children(".ui-icon").addClass("pi pi-check");
nif.jq.addClass('green-button');
} else if (nif.jq.hasClass('red-button') == false) {
nif.jq.children(".ui-icon").removeClass("pi pi-check");
nif.jq.removeClass('green-button');
nif.jq.children(".ui-icon").addClass("pi pi-times");
nif.jq.addClass('red-button');
}
}

View File

@@ -7,21 +7,32 @@
<ui:composition template="../header.xhtml"> <ui:composition template="../header.xhtml">
<ui:define name="content"> <ui:define name="content">
<h:form id="frmManageSpecialties"> <h:form id="frmManageSpecialties">
<p:messages id="mesgs" showDetail="true" closable="true" autoupdate="true" /> <p:growl id="mesgs" showDetail="true" closable="true" autoupdate="true" />
<p:panel id="PanelMS" header="Página Gestión de Especialidades"> <p:panel id="PanelMS" header="Página Gestión de Especialidades">
<div class="ui-g ui-fluid"> <div class="ui-g ui-fluid">
<div class="ui-g-2 ui-md-2"> <div class="ui-g-2 ui-md-2">
<p:autoComplete id="specialty" dropdown="true" required="true" <p:outputLabel for="ms"/>
value="#{SystemAdmin.medicalSpecialty}" completeMethod="#{SystemAdmin.completeMedicalSpecialty}" var="ms" <p:selectOneMenu id="ms" value="#{ManageSpecialities.medicalSpecialty}" converter="omnifaces.SelectItemsIndexConverter"
placeholder="----- Selecciona una especialidad -----" itemLabel="#{ms.name}" itemValue="#{ms.name}" forceSelection="true"> effect="fold" editable="true" filter="true" filterMatchMode="startsWith"
<o:converter converterId="omnifaces.ListConverter" list="#{RegisterUser.medicalSpecialtiesList}" /> placeholder="- Selecciona una especialidad -">
<p:column> <f:selectItems value="#{ManageSpecialities.medicalSpecialtiesList}" var="ms" itemValue="#{ms}" itemLabel="#{ms.name}" />
<h:outputText value="#{ms.name}" /> <f:ajax render="name description" />
</p:column> </p:selectOneMenu>
</p:autoComplete> </div>
<div class="ui-g-1 ui-md-1" >
<p:outputLabel value="Editar nombre" for="name"/>
</div>
<div class="ui-g-2 ui-md-2">
<p:inputText id="name" value="#{ManageSpecialities.medicalSpecialty.name}" readonly="false" required="true" requiredMessage="Es necesario un nombre" />
</div>
<div class="ui-g-1 ui-md-1">
<p:outputLabel value="Editar descripción" for="description" />
</div> </div>
<div class="ui-g-4 ui-md-4"> <div class="ui-g-4 ui-md-4">
<p:message for="specialty" /> <p:inputText id="description" value="#{ManageSpecialities.medicalSpecialty.description}" readonly="false" required="true" requiredMessage="Es necesaria una descripción" />
</div>
<div class="ui-g-2 ui-md-2 ">
<p:commandButton validateClient="true" value="Guardar" update="mesgs" action="#{ManageSpecialities.saveData}" icon="pi pi-check" />
</div> </div>
</div> </div>
</p:panel> </p:panel>

View File

@@ -1,4 +1,7 @@
<application> <?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6">
<application-name>MyHealth</application-name>
<display-name>MyHealth</display-name> <display-name>MyHealth</display-name>
<module> <module>
<web> <web>
@@ -10,4 +13,3 @@
<ejb>MyHealth.jar</ejb> <ejb>MyHealth.jar</ejb>
</module> </module>
</application> </application>

View File

@@ -9,7 +9,7 @@ import javax.xml.bind.annotation.XmlRootElement;
* @author Marcos García Núñez (mgarcianun@uoc.edu) * @author Marcos García Núñez (mgarcianun@uoc.edu)
* *
*/ */
@XmlRootElement(name = "medicalspeciality") @XmlRootElement(name = "medicalSpecialty")
public class MedicalSpecialtyTO implements Serializable { public class MedicalSpecialtyTO implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@@ -4,8 +4,6 @@ import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import jpa.FamilyDoctorJPA;
/** /**
* *
* @author Marcos García Núñez (mgarcianun@uoc.edu) * @author Marcos García Núñez (mgarcianun@uoc.edu)

View File

@@ -1,6 +1,7 @@
package common; package common;
import java.text.Normalizer; import java.text.Normalizer;
import java.util.Objects;
/** /**
* *
@@ -13,7 +14,16 @@ public class Utils {
} }
public static String normalizeTerm(String input) { public static String normalizeTerm(String input) {
//return stripAccents(input).toLowerCase(); // return stripAccents(input).toLowerCase();
return input.toLowerCase(); return input.toLowerCase();
} }
public static Throwable getExceptionRootCause(Throwable throwable) {
Objects.requireNonNull(throwable);
Throwable rootCause = throwable;
while (rootCause.getCause() != null && rootCause.getCause() != rootCause) {
rootCause = rootCause.getCause();
}
return rootCause;
}
} }

View File

@@ -1,6 +1,5 @@
package ejb.common; package ejb.common;
import java.util.Collection;
import java.util.List; import java.util.List;
import javax.ejb.Remote; import javax.ejb.Remote;
@@ -10,9 +9,6 @@ import TO.MedicalSpecialtyTO;
import TO.PatientTO; import TO.PatientTO;
import TO.PrimaryHealthCareCenterTO; import TO.PrimaryHealthCareCenterTO;
import TO.SpecialistDoctorTO; import TO.SpecialistDoctorTO;
import jpa.FamilyDoctorJPA;
import jpa.PatientJPA;
import jpa.SpecialistDoctorJPA;
/** /**
* *

View File

@@ -278,8 +278,6 @@ public class ProfileFacadeBean implements ProfileFacadeRemote {
* @return FamilyDoctorTO (Transfer Object del médico de familia al que se la ha cambiado el CAP). * @return FamilyDoctorTO (Transfer Object del médico de familia al que se la ha cambiado el CAP).
*/ */
public FamilyDoctorTO changePrimaryHealthCareCenter(int professionalId, PrimaryHealthCareCenterTO newCenter) throws Exception { public FamilyDoctorTO changePrimaryHealthCareCenter(int professionalId, PrimaryHealthCareCenterTO newCenter) throws Exception {
FamilyDoctorTO fdTO = null;
FamilyDoctorJPA fd = entman.find(FamilyDoctorJPA.class, professionalId); FamilyDoctorJPA fd = entman.find(FamilyDoctorJPA.class, professionalId);
if (fd == null) { if (fd == null) {
throw new Exception("No se encuentra en la base de datos ningún médico de familia con id: " + String.valueOf(professionalId)); throw new Exception("No se encuentra en la base de datos ningún médico de familia con id: " + String.valueOf(professionalId));

View File

@@ -7,6 +7,7 @@ import javax.persistence.PersistenceContext;
import TO.FamilyDoctorTO; import TO.FamilyDoctorTO;
import TO.LoggedUserTO; import TO.LoggedUserTO;
import TO.MedicalSpecialtyTO;
import TO.PatientTO; import TO.PatientTO;
import TO.SpecialistDoctorTO; import TO.SpecialistDoctorTO;
import common.Constants; import common.Constants;
@@ -14,6 +15,8 @@ import common.HashUtils;
import common.UserType; import common.UserType;
import ejb.common.CommonFacadeLocal; import ejb.common.CommonFacadeLocal;
import jpa.AdministratorJPA; import jpa.AdministratorJPA;
import jpa.MedicalSpecialtyJPA;
import jpa.PatientJPA;
/** /**
* *
@@ -107,4 +110,20 @@ public class SystemAdminFacadeBean implements SystemAdminFacadeRemote {
return usr; return usr;
} }
@Override
public MedicalSpecialtyTO updateSpecialtyData(int id, String name, String description) throws Exception {
MedicalSpecialtyJPA ms = entman.find(MedicalSpecialtyJPA.class, id);
if (ms == null) {
throw new Exception("No se pueden actualizar los datos de la especialidad porque no se encuentra en la base de datos ningún registro con id: " + String.valueOf(id));
}
ms.setName(name);
ms.setDescription(description);
entman.persist(ms);
return this.commonServices.getPOJOforMedicalSpecialtyJPA(ms);
}
} }

View File

@@ -6,6 +6,7 @@ import javax.ejb.Remote;
import TO.LoggedUserTO; import TO.LoggedUserTO;
import TO.MedicalSpecialtyTO; import TO.MedicalSpecialtyTO;
import TO.PatientTO;
import TO.PrimaryHealthCareCenterTO; import TO.PrimaryHealthCareCenterTO;
/** /**
@@ -19,6 +20,7 @@ public interface SystemAdminFacadeRemote {
* Definimos la interfaz remota * Definimos la interfaz remota
*/ */
public LoggedUserTO login(String id, String pwd); public LoggedUserTO login(String id, String pwd);
public MedicalSpecialtyTO updateSpecialtyData(int id, String name, String description) throws Exception;
} }

View File

@@ -2,11 +2,9 @@
package managedbean.common; package managedbean.common;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.List;
import javax.faces.application.FacesMessage; import javax.faces.application.FacesMessage;
import javax.persistence.PersistenceException;
import javax.servlet.Filter; import javax.servlet.Filter;
import javax.servlet.FilterChain; import javax.servlet.FilterChain;
import javax.servlet.FilterConfig; import javax.servlet.FilterConfig;
@@ -18,10 +16,10 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import org.primefaces.model.menu.DefaultSeparator; import org.omnifaces.util.Exceptions;
import org.primefaces.model.menu.DefaultSubMenu;
import common.UserType; import common.UserType;
import common.Utils;
@WebFilter(filterName = "AuthFilter", urlPatterns = { "*.xhtml" }) @WebFilter(filterName = "AuthFilter", urlPatterns = { "*.xhtml" })
public class AuthorizationFilter implements Filter { public class AuthorizationFilter implements Filter {
@@ -34,25 +32,47 @@ public class AuthorizationFilter implements Filter {
} }
private boolean isAJAXRequest(HttpServletRequest request) {
boolean check = false;
String facesRequest = request.getHeader("Faces-Request");
if (facesRequest != null && facesRequest.equals("partial/ajax")) {
check = true;
}
return check;
}
@Override @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = null;
HttpServletResponse resp = null;
HttpSession ses = null;
try { try {
HttpServletRequest req = (HttpServletRequest) request; req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
HttpSession ses = req.getSession(false);
String reqURI = req.getRequestURI(); String reqURI = req.getRequestURI();
// Para recursos publicos permitimos el acceso resp = (HttpServletResponse) response;
ses = req.getSession(false);
// Para recursos publicos permitimos el acceso exista sesión o no.
if (reqURI.indexOf("/login.xhtml") >= 0 || reqURI.indexOf("/profile/RegisterUser.xhtml") >= 0 || reqURI.indexOf("/home.xhtml") >= 0 if (reqURI.indexOf("/login.xhtml") >= 0 || reqURI.indexOf("/profile/RegisterUser.xhtml") >= 0 || reqURI.indexOf("/home.xhtml") >= 0
|| reqURI.indexOf("/error.xhtml") >= 0 || reqURI.indexOf("/public/") >= 0 || reqURI.contains("javax.faces.resource")) { || reqURI.indexOf("/error.xhtml") >= 0 || reqURI.indexOf("/public/") >= 0 || reqURI.contains("javax.faces.resource")) {
chain.doFilter(request, response); chain.doFilter(request, response);
return; return;
} }
// Si el usuario está logeado comprobamos si está autorizado a ver la página if (this.isAJAXRequest(req) == true) {
// solicitada. chain.doFilter(request, response);
return;
}
// Sesión expirada
if (req.isRequestedSessionIdValid() == false && req.getRequestedSessionId() != null) {
resp.sendRedirect(req.getContextPath() + "/error.xhtml?type=expired");
return;
}
// Si el usuario está logeado comprobamos si está autorizado a ver la página solicitada.
if (SessionUtils.isLogedIn(ses) == true) { if (SessionUtils.isLogedIn(ses) == true) {
UserType tipoUsuario = SessionUtils.getUserType(ses); UserType tipoUsuario = SessionUtils.getUserType(ses);
boolean authorized = false; boolean authorized = false;
@@ -130,21 +150,29 @@ public class AuthorizationFilter implements Filter {
chain.doFilter(request, response); chain.doFilter(request, response);
return; return;
} else { } else {
SessionUtils.addMessage(ses, FacesMessage.SEVERITY_ERROR, "No está autorizado a acceder a la página solicitada. Por favor, utilice el menú principal de la aplicación.", String.format("Se ha producido una expción de autorización, su usuario no está autorizado a acceder a la página: (%s).", reqURI)); SessionUtils.addMessage(ses, FacesMessage.SEVERITY_ERROR,
"No está autorizado a acceder a la página solicitada. Por favor, utilice el menú principal de la aplicación.",
String.format("Se ha producido una expción de autorización, su usuario no está autorizado a acceder a la página: (%s).", reqURI));
resp.sendRedirect(req.getContextPath() + "/error.xhtml?type=auth"); resp.sendRedirect(req.getContextPath() + "/error.xhtml?type=auth");
return; return;
} }
} }
resp.sendRedirect(req.getContextPath() + "/login.xhtml"); resp.sendRedirect(req.getContextPath() + "/home.xhtml");
} catch (Exception e) { } catch (Exception e) {
System.out.println(e.getMessage()); if (Exceptions.is(e, PersistenceException.class) == true) {
if (ses != null)
SessionUtils.addMessage(ses, FacesMessage.SEVERITY_ERROR, "Error al intentar acceder a la base de datos", Utils.getExceptionRootCause(e).getLocalizedMessage());
resp.sendRedirect(req.getContextPath() + "/error.xhtml?type=sql");
} else
resp.sendRedirect(req.getContextPath() + "/error.xhtml");
} }
} }
@Override @Override
public void destroy() { public void destroy() {
System.out.println("Sessión destruida");
} }
} }

View File

@@ -1,9 +1,12 @@
package managedbean.common; package managedbean.common;
import java.io.IOException;
import java.util.Properties; import java.util.Properties;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.faces.application.FacesMessage; import javax.faces.application.FacesMessage;
import javax.faces.application.ViewExpiredException;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import javax.naming.Context; import javax.naming.Context;
import javax.naming.InitialContext; import javax.naming.InitialContext;
@@ -121,6 +124,24 @@ public class ManagedBeanBase {
} }
protected void manageException(Exception ex) { protected void manageException(Exception ex) {
String strType = "";
if (ex.getClass().equals(ViewExpiredException.class)) {
// Sessión expired
strType = "expired";
this.addFacesMessage(FacesMessage.SEVERITY_ERROR, "Su sesión ha caducado", "Su sesión ha caducado, vuelva a logarse en el sistema.");
} else {
this.addFacesMessage(FacesMessage.SEVERITY_ERROR, "Se ha producido un error inesperado", "Descripción del error: " + ex.getLocalizedMessage()); this.addFacesMessage(FacesMessage.SEVERITY_ERROR, "Se ha producido un error inesperado", "Descripción del error: " + ex.getLocalizedMessage());
} }
try {
ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext();
ctx.redirect(ctx.getApplicationContextPath() + "/error.xhtml?type=" + strType);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }

View File

@@ -4,8 +4,6 @@ import java.io.Serializable;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named; import javax.inject.Named;
import org.primefaces.model.menu.DefaultMenuItem; import org.primefaces.model.menu.DefaultMenuItem;

View File

@@ -1,16 +1,16 @@
package managedbean.common; package managedbean.common;
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ThemeService { public class ThemeService implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public static final String DEFAULT_THEME = "nova-light"; public static final String DEFAULT_THEME = "nova-light";
public static final List<Theme> THEMES = new ArrayList<Theme>() { public static final List<Theme> THEMES = new ArrayList<Theme>() {
private static final long serialVersionUID = 1L;
{ {
int i = 1; int i = 1;
add(new Theme(i++, "afterdark", "afterdark")); add(new Theme(i++, "afterdark", "afterdark"));

View File

@@ -70,6 +70,9 @@ public class ValidationUtils {
public static boolean checkIfNifAlreadyRegistered(CommonFacadeRemote remoteSvc, UserType userType, String nif, Integer id) { public static boolean checkIfNifAlreadyRegistered(CommonFacadeRemote remoteSvc, UserType userType, String nif, Integer id) {
boolean nifExists = false; boolean nifExists = false;
if (userType == null || remoteSvc == null)
return nifExists;
switch (userType) { switch (userType) {
case ADMINISTRATOR: case ADMINISTRATOR:
break; break;

View File

@@ -12,8 +12,6 @@ import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder; import org.primefaces.model.SortOrder;
import TO.QuestionTO; import TO.QuestionTO;
import common.Constants;
import ejb.medicalTest.MedicalTestFacadeRemote;
import managedbean.common.ManagedBeanBase; import managedbean.common.ManagedBeanBase;
import managedbean.common.SessionUtils; import managedbean.common.SessionUtils;
@@ -50,4 +48,8 @@ public class PendingQuestionsMBean extends ManagedBeanBase implements Serializab
public LazyDataModel<QuestionTO> getLazyDataModelQuestionList() { public LazyDataModel<QuestionTO> getLazyDataModelQuestionList() {
return lazyDataModelQuestionList; return lazyDataModelQuestionList;
} }
public void saveData() {
}
} }

View File

@@ -84,12 +84,13 @@ public class ChangeFamilyDoctorMBean extends ManagedBeanBase implements Serializ
int error = 0; int error = 0;
if (this.getNewFamilyDoctor() == null) { if (this.getNewFamilyDoctor() == null) {
this.addFacesMessage(FacesMessage.SEVERITY_WARN, "Nuevo médico de familia no seleccionado", "Por favor, especifique un nuevvo médico de familia."); this.addFacesMessage("frmChangeFD:newFamilyDocAC", FacesMessage.SEVERITY_WARN, "Nuevo médico de familia no seleccionado",
"Por favor, especifique un nuevvo médico de familia.");
error++; error++;
} }
if (this.getCurrentFamilyDoctor() != null && this.getNewFamilyDoctor().getId() == this.getCurrentFamilyDoctor().getId()) { if (this.getCurrentFamilyDoctor() != null && this.getNewFamilyDoctor().getId() == this.getCurrentFamilyDoctor().getId()) {
this.addFacesMessage(FacesMessage.SEVERITY_WARN, "El médico de familia debe ser diferente", this.addFacesMessage("frmChangeFD:newFamilyDocAC", FacesMessage.SEVERITY_WARN, "El médico de familia debe ser diferente",
"Por favor, seleccione un médico de familia diferente al que tiene actualmente asignado."); "Por favor, seleccione un médico de familia diferente al que tiene actualmente asignado.");
error++; error++;
} }

View File

@@ -1,7 +1,6 @@
package managedbean.profile; package managedbean.profile;
import java.io.Serializable; import java.io.Serializable;
import java.util.Collection;
import java.util.List; import java.util.List;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
@@ -86,12 +85,12 @@ public class ChangePrimaryHealthCareCenterMBean extends ManagedBeanBase implemen
int error = 0; int error = 0;
if (this.getNewCenter() == null) { if (this.getNewCenter() == null) {
this.addFacesMessage(FacesMessage.SEVERITY_WARN, "Centro de atención primaria no seleccionado", "Por favor, especifique un nuevvo centro de atención primaria."); this.addFacesMessage("frmChangePHCC:newCenter", FacesMessage.SEVERITY_WARN, "Centro de atención primaria no seleccionado", "Por favor, especifique un nuevvo centro de atención primaria.");
error++; error++;
} }
if (this.getNewCenter().getName().equals(this.getCurrentCenter().getName())) { if (this.getNewCenter().getName().equals(this.getCurrentCenter().getName())) {
this.addFacesMessage(FacesMessage.SEVERITY_WARN, "El centro de atención primeria debe ser diferente", "Por favor, seleccione un centro de atención primaria diferente al cual está actualmente asignado."); this.addFacesMessage("frmChangePHCC:newCenter", FacesMessage.SEVERITY_WARN, "El centro de atención primeria debe ser diferente", "Por favor, seleccione un centro de atención primaria diferente al cual está actualmente asignado.");
error++; error++;
} }

View File

@@ -198,11 +198,11 @@ public class RegisterUserMBean extends ManagedBeanBase implements Serializable {
int error = 0; int error = 0;
if (this.isFamilyDoctor() && this.primaryHealthCareCenter == null) { if (this.isFamilyDoctor() && this.primaryHealthCareCenter == null) {
this.addFacesMessage(FacesMessage.SEVERITY_WARN, "Centro de atención primaria no seleccionado", "Por favor, especifique un centro de atención primaria."); this.addFacesMessage("frmRegisterUser:selPHC", FacesMessage.SEVERITY_WARN, "Centro de atención primaria no seleccionado", "Por favor, especifique un centro de atención primaria.");
error++; error++;
} }
if (this.isSpecialistDoctor() && this.medicalSpecialty == null) { if (this.isSpecialistDoctor() && this.medicalSpecialty == null) {
this.addFacesMessage(FacesMessage.SEVERITY_WARN, "Especialidad médica no seleccionada", "Por favor, especifique una especialidad médica."); this.addFacesMessage("frmRegisterUser:selMS", FacesMessage.SEVERITY_WARN, "Especialidad médica no seleccionada", "Por favor, especifique una especialidad médica.");
error++; error++;
} }
if (ValidationUtils.isValid(nif) == false) { if (ValidationUtils.isValid(nif) == false) {

View File

@@ -257,6 +257,11 @@ public class UpdateProfileMBean extends ManagedBeanBase implements Serializable
public void saveData() { public void saveData() {
int error = 0; int error = 0;
// Si no hay tipo de usuario, es que algo raro ha pasado (sesión caducada?). salimos.
if (this.userType == null)
return;
boolean changePassword = (this.oldPassword != null && this.oldPassword.equals("") == false) || (this.password != null && this.password.equals("") == false); boolean changePassword = (this.oldPassword != null && this.oldPassword.equals("") == false) || (this.password != null && this.password.equals("") == false);
if (this.isUserTypeFamilyDoctor() && this.primaryHealthCareCenter == null) { if (this.isUserTypeFamilyDoctor() && this.primaryHealthCareCenter == null) {

View File

@@ -1,19 +1,12 @@
package managedbean.systemAdmin; package managedbean.systemAdmin;
import java.util.Properties;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage; import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named; import javax.inject.Named;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.http.HttpSession;
import org.primefaces.PrimeFaces; import org.primefaces.PrimeFaces;
import TO.LoggedUserTO; import TO.LoggedUserTO;
import ejb.systemAdmin.SystemAdminFacadeRemote;
import managedbean.common.ManagedBeanBase; import managedbean.common.ManagedBeanBase;
import managedbean.common.SessionUtils; import managedbean.common.SessionUtils;

View File

@@ -0,0 +1,118 @@
package managedbean.systemAdmin;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import TO.LoggedUserTO;
import TO.MedicalSpecialtyTO;
import common.Constants;
import managedbean.common.ManagedBeanBase;
import managedbean.common.SessionUtils;
@Named("ManageSpecialities")
@RequestScoped
public class ManageSpecialitiesMBean extends ManagedBeanBase implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String description;
private MedicalSpecialtyTO medicalSpecialty;
private List<MedicalSpecialtyTO> medicalSpecialitiesList;
public ManageSpecialitiesMBean() {
}
@PostConstruct
public void init() {
if (this.medicalSpecialty == null) {
this.medicalSpecialty = new MedicalSpecialtyTO();
}
// Recuperamos el usuario logeado actual
LoggedUserTO usr = null;
try {
usr = SessionUtils.getloggedOnUser();
if (usr == null)
this.addFacesMessage(FacesMessage.SEVERITY_ERROR, "Sesión no válida",
"Su sesión actual no es válida, por favor cierre su sesión y vuelva a logearse en el sistema.");
else {
this.medicalSpecialitiesList = this.getRemoteManagerCommon().listMedicalSpecialitiesPaged(0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH);
}
} catch (Exception e) {
this.manageException(e);
}
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
private void setSpecialtyData(MedicalSpecialtyTO ms) {
this.id = ms.getId();
this.name = ms.getName();
this.description = ms.getDescription();
}
public List<MedicalSpecialtyTO> getMedicalSpecialtiesList() {
return medicalSpecialitiesList;
}
public MedicalSpecialtyTO getMedicalSpecialty() {
return medicalSpecialty;
}
public void setMedicalSpecialty(MedicalSpecialtyTO value) {
this.medicalSpecialty = value;
}
public void saveData() {
int error = 0;
if (this.medicalSpecialty.getName() == null) {
this.addFacesMessage(FacesMessage.SEVERITY_WARN, "Nombre no relleno", "Por favor, escriba un nombre de especialidad.");
error++;
}
if (this.medicalSpecialty.getDescription() == null) {
this.addFacesMessage(FacesMessage.SEVERITY_WARN, "Descripción no rellena", "Por favor, escriba una descripción.");
error++;
}
if (error == 0) {
try {
MedicalSpecialtyTO ms = this.getRemoteManagerSystemAdmin().updateSpecialtyData(this.medicalSpecialty.getId(), this.medicalSpecialty.getName(), this.medicalSpecialty.getDescription());
this.setSpecialtyData(ms);
this.addFacesMessage(FacesMessage.SEVERITY_INFO, "Los datos se han guardado", "Los datos de la especialidad se han guardado correctamente.");
} catch (Exception e) {
this.manageException(e);
}
}
}
}

View File

@@ -1,71 +0,0 @@
package managedbean.systemAdmin;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.inject.Named;
import TO.LoggedUserTO;
import TO.MedicalSpecialtyTO;
import common.Constants;
import common.UserType;
import managedbean.common.ManagedBeanBase;
import managedbean.common.SessionUtils;
@Named("SystemAdmin")
@RequestScoped
public class SystemAdminMBean extends ManagedBeanBase implements Serializable {
private static final long serialVersionUID = 1L;
private String lastUIQuery;
private MedicalSpecialtyTO medicalSpecialty;
private List<MedicalSpecialtyTO> medicalSpecialitiesList;
public SystemAdminMBean() {
}
@PostConstruct
public void init() {
// Recuperamos el usuario logeado actual
LoggedUserTO usr = null;
this.lastUIQuery = "";
try {
usr = SessionUtils.getloggedOnUser();
if (usr == null)
this.addFacesMessage(FacesMessage.SEVERITY_ERROR, "Sesión no válida",
"Su sesión actual no es válida, por favor cierre su sesión y vuelva a logearse en el sistema.");
else {
this.medicalSpecialitiesList = this.getRemoteManagerCommon().listMedicalSpecialitiesPaged(0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH);
}
} catch (Exception e) {
this.manageException(e);
}
}
public List<MedicalSpecialtyTO> getMedicalSpecialtiesList() {
return medicalSpecialitiesList;
}
public List<MedicalSpecialtyTO> completeMedicalSpecialty(String query) {
if (query != null && query.equals(this.lastUIQuery) == false) {
this.lastUIQuery = query;
// Recuperamos las 200 primeras coincidencias
this.medicalSpecialitiesList = this.getRemoteManagerCommon().listMedicalSpecialitiesFiltered(query, 0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH);
}
return this.medicalSpecialitiesList;
}
public MedicalSpecialtyTO getMedicalSpecialty() {
return medicalSpecialty;
}
public void setMedicalSpecialty(MedicalSpecialtyTO value) {
this.medicalSpecialty = value;
}
}

View File

@@ -14,12 +14,12 @@ import javax.faces.validator.ValidatorException;
import org.primefaces.validate.ClientValidator; import org.primefaces.validate.ClientValidator;
@FacesValidator("emailValidator") @FacesValidator("emailValidator")
public class EmailValidator implements Validator, ClientValidator { public class EmailValidator implements Validator<String>, ClientValidator {
private final static String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; private final static String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
private final static Pattern EMAIL_COMPILED_PATTERN = Pattern.compile(EMAIL_PATTERN); private final static Pattern EMAIL_COMPILED_PATTERN = Pattern.compile(EMAIL_PATTERN);
public void validate(FacesContext context, UIComponent comp, Object value) throws ValidatorException { public void validate(FacesContext context, UIComponent comp, String value) throws ValidatorException {
String strValue = ""; String strValue = "";
if (value != null) if (value != null)

View File

@@ -14,9 +14,9 @@ import org.primefaces.validate.ClientValidator;
import managedbean.common.ValidationUtils; import managedbean.common.ValidationUtils;
@FacesValidator("nifValidator") @FacesValidator("nifValidator")
public class NifValidator implements Validator, ClientValidator { public class NifValidator implements Validator<String>, ClientValidator {
public void validate(FacesContext context, UIComponent comp, Object value) throws ValidatorException { public void validate(FacesContext context, UIComponent comp, String value) throws ValidatorException {
String strValue = ""; String strValue = "";
if (value != null) if (value != null)

View File

@@ -71,7 +71,7 @@ INSERT INTO myhealth.specialistdoctor(professionalnumber, password, nif, surname
INSERT INTO myhealth.patient(personalidentificationcode, password, nif, surname, email, name, familydoctorid) VALUES INSERT INTO myhealth.patient(personalidentificationcode, password, nif, surname, email, name, familydoctorid) VALUES
('PAT#100','912EC803B2CE49E4A541068D495AB570','97758900E','Singh Vila', 'Soledad@example.ecom','Soledad', 1) ('PAT#100','912EC803B2CE49E4A541068D495AB570','97758900E','Singh Vila', 'Soledad@example.ecom','Soledad', 1)
,('PAT#101','912EC803B2CE49E4A541068D495AB570','Z9518183Y','Jimenez Merino', 'Ainhoa@example.ecom','Ainhoa', 2) ,('PAT#101','912EC803B2CE49E4A541068D495AB570','Z9518183Y','Jimenez Merino', 'Ainhoa@example.ecom','Ainhoa', 2)
,('PAT#102','912EC803B2CE49E4A541068D495AB570','97758900E','Jesus Chen Barba', 'Abel@example.ecom','Abel', 3) ,('PAT#102','912EC803B2CE49E4A541068D495AB570','49426296D','Jesus Chen Barba', 'Abel@example.ecom','Abel', 3)
,('PAT#103','912EC803B2CE49E4A541068D495AB570','95014341F','Lorenzo Tapia Navas', 'Francisco@example.ecom','Francisco', 4) ,('PAT#103','912EC803B2CE49E4A541068D495AB570','95014341F','Lorenzo Tapia Navas', 'Francisco@example.ecom','Francisco', 4)
,('PAT#104','912EC803B2CE49E4A541068D495AB570','17873499S','Gimenez Gutierrez', 'Teodora@example.ecom','Teodora', 5) ,('PAT#104','912EC803B2CE49E4A541068D495AB570','17873499S','Gimenez Gutierrez', 'Teodora@example.ecom','Teodora', 5)
,('PAT#105','912EC803B2CE49E4A541068D495AB570','07320674G','Escobar Marquez', 'Jorge@example.ecom','Jorge', 6) ,('PAT#105','912EC803B2CE49E4A541068D495AB570','07320674G','Escobar Marquez', 'Jorge@example.ecom','Jorge', 6)
@@ -81,29 +81,29 @@ INSERT INTO myhealth.patient(personalidentificationcode, password, nif, surname,
,('PAT#109','912EC803B2CE49E4A541068D495AB570','53986482P','Carretero Ayala', 'Eduardo@example.ecom','Eduardo', 10); ,('PAT#109','912EC803B2CE49E4A541068D495AB570','53986482P','Carretero Ayala', 'Eduardo@example.ecom','Eduardo', 10);
INSERT INTO myhealth.question(title, message, status, response, patientid, familydoctorid) VALUES INSERT INTO myhealth.question(title, message, status, response, patientid, familydoctorid) VALUES
('titulo de la pregunta número 1', 'Doctor, tengo dolor en la articulación numero 1', 1, null, 1, 1) ('titulo de la pregunta número 1', 'Doctor, tengo dolor en la articulación numero 1', 'PENDING', null, 1, 1)
,('titulo de la pregunta número 2', 'Doctor, tengo dolor en la articulación numero 2', 1, null, 2, 1) ,('titulo de la pregunta número 2', 'Doctor, tengo dolor en la articulación numero 2', 'PENDING', null, 2, 1)
,('titulo de la pregunta número 3', 'Doctor, tengo dolor en la articulación numero 3', 1, null, 3, 1) ,('titulo de la pregunta número 3', 'Doctor, tengo dolor en la articulación numero 3', 'PENDING', null, 3, 1)
,('titulo de la pregunta número 4', 'Doctor, tengo dolor en la articulación numero 4', 1, null, 4, 1) ,('titulo de la pregunta número 4', 'Doctor, tengo dolor en la articulación numero 4', 'PENDING', null, 4, 1)
,('titulo de la pregunta número 5', 'Doctor, tengo dolor en la articulación numero 5', 1, null, 5, 1) ,('titulo de la pregunta número 5', 'Doctor, tengo dolor en la articulación numero 5', 'PENDING', null, 5, 1)
,('titulo de la pregunta número 6', 'Doctor, tengo dolor en la articulación numero 6', 1, null, 6, 1) ,('titulo de la pregunta número 6', 'Doctor, tengo dolor en la articulación numero 6', 'PENDING', null, 6, 1)
,('titulo de la pregunta número 7', 'Doctor, tengo dolor en la articulación numero 7', 1, null, 7, 1) ,('titulo de la pregunta número 7', 'Doctor, tengo dolor en la articulación numero 7', 'PENDING', null, 7, 1)
,('titulo de la pregunta número 8', 'Doctor, tengo dolor en la articulación numero 8', 1, null, 8, 1) ,('titulo de la pregunta número 8', 'Doctor, tengo dolor en la articulación numero 8', 'PENDING', null, 8, 1)
,('titulo de la pregunta número 9', 'Doctor, tengo dolor en la articulación numero 9', 1, null, 9, 1) ,('titulo de la pregunta número 9', 'Doctor, tengo dolor en la articulación numero 9', 'PENDING', null, 9, 1)
,('titulo de la pregunta número 10', 'Doctor, tengo dolor en la articulación numero 10', 1, null, 10, 1) ,('titulo de la pregunta número 10', 'Doctor, tengo dolor en la articulación numero 10', 'PENDING', null, 10, 1)
,('titulo de la pregunta número 11', 'Doctor, tengo dolor en la articulación numero 11', 1, null, 1, 1) ,('titulo de la pregunta número 11', 'Doctor, tengo dolor en la articulación numero 11', 'PENDING', null, 1, 1)
,('titulo de la pregunta número 12', 'Doctor, tengo dolor en la articulación numero 12', 1, null, 2, 1) ,('titulo de la pregunta número 12', 'Doctor, tengo dolor en la articulación numero 12', 'PENDING', null, 2, 1)
,('titulo de la pregunta número 13', 'Doctor, tengo dolor en la articulación numero 13', 1, null, 3, 1) ,('titulo de la pregunta número 13', 'Doctor, tengo dolor en la articulación numero 13', 'PENDING', null, 3, 1)
,('titulo de la pregunta número 14', 'Doctor, tengo dolor en la articulación numero 14', 1, null, 4, 1) ,('titulo de la pregunta número 14', 'Doctor, tengo dolor en la articulación numero 14', 'PENDING', null, 4, 1)
,('titulo de la pregunta número 15', 'Doctor, tengo dolor en la articulación numero 15', 1, null, 5, 1) ,('titulo de la pregunta número 15', 'Doctor, tengo dolor en la articulación numero 15', 'PENDING', null, 5, 1)
,('titulo de la pregunta número 16', 'Doctor, tengo dolor en la articulación numero 16', 1, null, 6, 1) ,('titulo de la pregunta número 16', 'Doctor, tengo dolor en la articulación numero 16', 'PENDING', null, 6, 1)
,('titulo de la pregunta número 17', 'Doctor, tengo dolor en la articulación numero 17', 1, null, 7, 1) ,('titulo de la pregunta número 17', 'Doctor, tengo dolor en la articulación numero 17', 'PENDING', null, 7, 1)
,('titulo de la pregunta número 18', 'Doctor, tengo dolor en la articulación numero 18', 1, null, 8, 1) ,('titulo de la pregunta número 18', 'Doctor, tengo dolor en la articulación numero 18', 'PENDING', null, 8, 1)
,('titulo de la pregunta número 19', 'Doctor, tengo dolor en la articulación numero 19', 1, null, 9, 1) ,('titulo de la pregunta número 19', 'Doctor, tengo dolor en la articulación numero 19', 'PENDING', null, 9, 1)
,('titulo de la pregunta número 20', 'Doctor, tengo dolor en la articulación numero 20', 1, null, 10, 1) ,('titulo de la pregunta número 20', 'Doctor, tengo dolor en la articulación numero 20', 'PENDING', null, 10, 1)
,('titulo de la pregunta número 21', 'Doctor, tengo dolor en la articulación numero 21', 1, null, 8, 1) ,('titulo de la pregunta número 21', 'Doctor, tengo dolor en la articulación numero 21', 'PENDING', null, 8, 1)
,('titulo de la pregunta número 22', 'Doctor, tengo dolor en la articulación numero 22', 1, null, 9, 1) ,('titulo de la pregunta número 22', 'Doctor, tengo dolor en la articulación numero 22', 'PENDING', null, 9, 1)
,('titulo de la pregunta número 23', 'Doctor, tengo dolor en la articulación numero 23', 1, null, 10, 1); ,('titulo de la pregunta número 23', 'Doctor, tengo dolor en la articulación numero 23', 'PENDING', null, 10, 1);

View File

@@ -1,7 +1,10 @@
**Página de inicio del proyecto My Health del Grupo 2** ## Página de inicio del proyecto My Health del Grupo 2
Organización de directorios: ### Organización de directorios:
* sources: Código fuente y proyecto eclipse * sources: Código fuente y proyecto eclipse
* database: Scripts SQL para crear la estructura de base de datos y los datos de prueba * database: Scripts SQL para crear la estructura de base de datos y los datos de prueba
* doc: Directorio para ubicar la documentación compartida. * doc: Directorio para ubicar la documentación compartida.
### Instrucciones de despliegue e instalación
Las instrucciones detalladas de despliegue y configuración están descritas en el documento [install.md](install.md)

View File

@@ -9,7 +9,8 @@ services:
- POSTGRES_PASSWORD=PASSWORD - POSTGRES_PASSWORD=PASSWORD
- POSTGRES_DB=myhealth - POSTGRES_DB=myhealth
volumes: volumes:
- ./2.database/01.CreateTables.sql:/docker-entrypoint-initdb.d/init.sql - ./2.database/01.CreateTables.sql:/docker-entrypoint-initdb.d/01.CreateTables.sql
- ./2.database/02.Datos_prueba.sql:/docker-entrypoint-initdb.d/02.Datos_prueba.sql
wildfly: wildfly:
build: . build: .
ports: ports:

34
install.md Normal file
View File

@@ -0,0 +1,34 @@
## Instrucciones de despliegue e instalación
### 1. Crear esquema de base de datos y tablas:
Se debe crear un esquema nuevo en PostgreSQL y conceder permisos al usuario USER. Esto puede realizarse ejecutando el script incluido con la solución llamado:
* 01.CreateTables.sql
### 2. Inserción de datos iniciales:
Se debe ejecutar el script, incluido con la solución, que crea la tabla e inserta los datos de prueba:
* 02.Datos_prueba.sql
### 3. Creación del DataSource:
Para este proyecto se utilizará el mismo datasource que para el caso práctico, si no está creado debe añadirse al fichero JBOSS_HOME\standalone\configuration\standalone.xlm.
El usuario y contraseña de base de datos que se han utilizado en el datasource es USER con contraseña PASSWORD.
<datasource jta="false" jndi-name="java:jboss/postgresDS" pool-name="postgresDS"
enabled="true" use-java-context="true" use-ccm="false" statistics-enabled="true">
<connection-url>jdbc:postgresql://localhost:5432/postgres</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<driver>postgresql</driver>
<security>
<user-name>USER</user-name>
<password>PASSWORD</password>
</security>
</datasource>
### 4. Ejecutar la compilación y despliegue del proyecto
Acceder al directorio con el código fuente ([git-folder]/1.sources/MyHealth), y donde está ubicado el archivo de compilación de ant build.xml, ejecutar `ant` en este directorio, el proyecto debería compilarse y desplegarse automáticamente en el servidor JBOSS local.
## Instrucciones de despliegue alternativo con docker
### pre-requisitos:
Instalar docker desktop
### Levantar ambiente con un solo comando:
Abrimos la consola y nos posicionamos en el root del proyecto donde se encuentra el archivo `docker-compose.yml` y mediante la ejecución del comando `docker-compose up` levantaremos un contenedor de postgresql con el schema, tablas y permisos configurado y un contenedor con jboss/wildfly también configurado en el que compilaremos la ultima versión del producto y la desplegaremos.