Skip to main content

A utocomplete disponibles en base a rango de dos fechas seleccionadas

Autocomplete disponibles en base a rango de dos fechas seleccionadas

Necesitamos filtrar los entity para un autocomplete en base a la disponibilidad de datos que se encuentren disponibles entre dos fechas.
MétodoDescripción
Boolean isAvailableBetweenDateHour(Bson filter, String namefieldOfStart, Date valueStart, String namefieldOfEnd, Date valueEnd)Devuelve true si no hay registros con la condición fechay hora de inicio y fin y el filtro que se pasa como parÔmetro
List<T> notAvailableBetweenDateHour(Bson filter, String namefieldOfStart, Date valueStart, String namefieldOfEnd, Date valueEnd)Devuelve una lista de los elementos que estan en ese rango de fechas y que cumplan la condición del filtro que se pasa como parÔmetro
Deseamos que al seleccionar la fecha y hora de inicio y de fin desde <p:calendar>, mostrar en un autocomplete los vehĆ­culos disponibles entre ese intervalo.



Personalizar el <p:calendar>

En este ejemplo creamos un componente <p:calendar> personalizado,Invocamos el evento dateSelect
<?xml version='1.0' encoding='UTF-8' ?>
<!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:p="http://primefaces.org/ui"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:b="http://bootsfaces.net/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<composite:interface >
<composite:attribute name="id" />
<composite:attribute name="value" />
<composite:attribute name="label"/>
<composite:attribute name="mindate" default=""/>
<composite:attribute name="mode" default="popup"/>
<composite:attribute name="required" default="false"/>
<composite:attribute name="pattern" default="dd/MM/yyyy" />
</composite:interface>
<composite:implementation>
<p:calendar
id="#{cc.attrs.id}"
mode="#{cc.attrs.mode}"
value="#{cc.attrs.value}"
placeholder="#{cc.attrs.label}"
required="#{cc.attrs.required}"
requiredMessage="#{cc.attrs.label} #{app['info.required']}"
pattern="#{cc.attrs.pattern}"
selectOtherMonths="true"
showTodayButton="true"
mindate="#{cc.attrs.mindate}"
navigator="true">
<p:ajax event="dateSelect" listener="#{viajeController.handleSelect}"
update=":form:vehiculo, :form:conductor, :form:msg" />
</p:calendar>
</composite:implementation>
</html>

Personalizar el autocomplete

<?xml version='1.0' encoding='UTF-8' ?>
<!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:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<composite:interface >
<composite:attribute name="value" />
<composite:attribute name="disabled" default="false" />
<composite:attribute name="itemLabel" />
<composite:attribute name="multiple" default="false" />
<composite:attribute name="dropdown" default="false"/>
<composite:attribute name="minQueryLength" default="1"/>
<composite:attribute name="update" />
<composite:attribute name="rendered"/>
<composite:attribute name="required" default="false" />
<composite:attribute name="field"/>
<composite:attribute name="fromstart" default="true"/>
<composite:attribute name="size" default="25"/>
<composite:attribute name="listener"
method-signature="void handleSelect(org.primefaces.event.SelectEvent)" />
</composite:interface>
<composite:implementation>
<p:autoComplete dropdown="true"
id="vehiculo"
multiple="false"
scrollHeight="250"
size="25"
emptyMessage="#{app['info.nohayregistros']}"
value="#{viajeController.viaje.vehiculo}"
completeMethod="#{viajeController.completeVehiculoFiltrado}"
var="p"
required="true"
requiredMessage="#{msg['field.vehiculo']}"
itemLabel=" #{p.marca} #{p.modelo} #{p.placa}"
itemValue="#{p}" forceSelection="true">
<f:converter binding="#{vehiculoConverter}"/>
<f:attribute name="field" value="marca"/>
<f:attribute name="fielddropdown" value="false"/>
<f:attribute name="fieldquerylenth" value="0"/>
<p:ajax event="itemSelect" listener="#{viajeController.handleSelect}"
update="" />
<p:ajax event="itemUnselect" listener="#{viajeController.handleSelect}"
update=""
/>
<f:facet name="itemtip">
<h:panelGrid columns="2" cellpadding="5">
<h:outputText value="#{msg['field.idvehiculo']}" />
<h:outputText value="#{p.idvehiculo}" />
<h:outputText value="#{msg['field.marca']}" />
<h:outputText value="#{p.marca}" />
<h:outputText value="#{msg['field.modelo']}" />
<h:outputText value="#{p.modelo}" />
<h:outputText value="#{msg['field.placa']}" />
<h:outputText value="#{p.placa}" />
</h:panelGrid>
</f:facet>
</p:autoComplete>
</composite:implementation>
</html>


En el formulario:

  • Calendar
  • Autocomplete
<p:outputLabel value="#{msg['field.fechahorainicioreserva']}"/>
<extensionviaje:calendar pattern="dd/MM/yyyy HH:mm a"
value="#{viajeController.viaje.fechahorainicioreserva}"
label="#{msg['field.fechahorainicioreserva']}" />
<p:outputLabel value="#{msg['field.fechahorafinreserva']}" />
<extensionviaje:calendar pattern="dd/MM/yyyy HH:mm a"
value="#{viajeController.viaje.fechahorafinreserva}"
label="#{msg['field.fechahorafinreserva']}" />
<p:outputLabel value="#{msg['field.vehiculo']}"
id="vehiculolabel" />
<extensionviaje:autocompletevehiculos id="vehiculo"/>

Controller

public void handleSelect(SelectEvent event) {
try {
} catch (Exception e) {
errorServices.errorMessage(nameOfClass(), nameOfMethod(), e.getLocalizedMessage());
}
}
// <editor-fold defaultstate="collapsed" desc="completeVehiculoFiltrado(String query)">
/**
* Se usa para los autocomplete filtrando
*
* @param query
* @return
*/
public List<Vehiculo> completeVehiculoFiltrado(String query) {
List<Vehiculo> suggestions = new ArrayList<>();
// List<Vehiculo> disponibles = new ArrayList<>();
List<Vehiculo> temp = new ArrayList<>();
try {
Boolean found = false;
query = query.trim();
String field = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("field");
temp = vehiculoRepository.findRegex(field, query, true, new Document(field, 1));
if (temp.isEmpty()) {
return suggestions;
} else {
List<Vehiculo> validos = temp.stream()
.filter(x -> isVehiculoActivoDisponible(x)).collect(Collectors.toList());
if (validos.isEmpty()) {
return suggestions;
}
if (vehiculoList == null || vehiculoList.isEmpty()) {
return validos;
} else {
// REMOVERLOS SI YA ESTAN EN EL LISTADO
validos.forEach((v) -> {
Optional<Vehiculo> optional = vehiculoList.stream()
.filter(v2 -> v2.getIdvehiculo() == v.getIdvehiculo())
.findAny();
if (!optional.isPresent()) {
suggestions.add(v);
}
});
}
}
} catch (Exception e) {
errorServices.errorMessage(nameOfClass(), nameOfMethod(), e.getLocalizedMessage());
}
return suggestions;
}
// </editor-fold>

isVehiculoActivoDisponible(Vehiculo vehiculo)

  • Verifica si el vehĆ­culo esta disponible en esas fechas.
public Boolean isVehiculoActivoDisponible(Vehiculo vehiculo) {
Boolean valid = false;
try {
if (vehiculo.getActivo().equals("no") && vehiculo.getEnreparacion().equals("si")) {
} else {
if (viajeServices.vehiculoDisponible(vehiculo, viaje.getFechahorainicioreserva(), viaje.getFechahorafinreserva())) {
valid = true;
}
}
} catch (Exception e) {
errorServices.errorDialog(nameOfClass(), nameOfMethod(), "isVehiculoValid()", e.getLocalizedMessage());
}
return valid;
}

Comments

Popular posts from this blog

JUnit con DataClassG

JUnit con DataClassG 0. ESQUEMA Services: Por cada beans crearemos una clase Services que se encargarĆ” de interactuar con el controller para realizar las operaciones de la base de datos. Se crearan los mĆ©todos insert, update,delete y los demas metodos para realizar las diversas operaciones. Test: Se crearĆ”n las clases para test de las clases Services. Form: Los formularios para la interactuar con el usuario. ProvinciasServices.java colocamos los mĆ©todos, insert, update,delete public class ProvinciasServices {    ProvinciasController provinciasController = new ProvinciasController();    public ProvinciasServices() {    }    public Boolean insert (Provincias provincias){        try{            if(provinciasController.insert(provincias)){              return tru...

Primefaces v13

 La versión nueva de primefaces v13.0 elimina el componente <p:repeat>  Consulte los cambios en  https://github.com/primefaces/primefaces/releases/tag/13.0.0 por lo tanto si necesita una solución similar considere utilizar  <p:carousel>  o  <ui:repeat> En la versión 13 genera una excepción