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Ć©todo | DescripciĆ³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