Skip to content

Commit

Permalink
Fix primefaces#12507 - DataTable: standard input facet filter not wor…
Browse files Browse the repository at this point in the history
…king with dynamic columns
  • Loading branch information
Rapster committed Aug 22, 2024
1 parent 481623a commit 75e5c59
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 38 deletions.
29 changes: 18 additions & 11 deletions primefaces/src/main/java/org/primefaces/component/api/UIColumn.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@
*/
package org.primefaces.component.api;

import org.primefaces.component.celleditor.CellEditor;
import org.primefaces.model.MatchMode;
import org.primefaces.util.FacetUtils;
import org.primefaces.util.LangUtils;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.el.ELContext;
import javax.el.MethodExpression;
Expand All @@ -36,11 +37,12 @@
import javax.faces.component.UIComponent;
import javax.faces.component.UIData;
import javax.faces.context.FacesContext;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.primefaces.component.celleditor.CellEditor;
import org.primefaces.model.MatchMode;
import org.primefaces.util.ComponentTraversalUtils;
import org.primefaces.util.FacetUtils;
import org.primefaces.util.LangUtils;

public interface UIColumn {

Expand Down Expand Up @@ -247,14 +249,19 @@ default String getColumnKey(UIComponent parent, int rowIndex) {

Object getConverter();

default Object getFilterValueFromValueHolder() {
default EditableValueHolder getFilterValueHolder() {
UIComponent filterFacet = getFacet("filter");
return ComponentTraversalUtils.firstChildRenderedOrSelf(EditableValueHolder.class, filterFacet);
}

default Object getFilterValueFromValueHolder(FacesContext context) {
UIComponent filterFacet = getFacet("filter");
if (filterFacet == null) {
return null;
}
AtomicReference<Object> filterValue = new AtomicReference<>(null);

FacetUtils.invokeOnEditableValueHolder(FacesContext.getCurrentInstance(), filterFacet, (ctx, component) -> {
FacetUtils.invokeOnEditableValueHolder(context, filterFacet, (ctx, component) -> {
filterValue.set(((EditableValueHolder) component).getValue());
});

Expand Down
36 changes: 19 additions & 17 deletions primefaces/src/main/java/org/primefaces/component/api/UITable.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,30 +23,32 @@
*/
package org.primefaces.component.api;

import org.primefaces.component.column.ColumnBase;
import org.primefaces.component.headerrow.HeaderRow;
import org.primefaces.expression.SearchExpressionUtils;
import org.primefaces.model.ColumnMeta;
import org.primefaces.model.FilterMeta;
import org.primefaces.model.SortMeta;
import org.primefaces.util.ComponentUtils;
import org.primefaces.util.FacetUtils;
import org.primefaces.util.LangUtils;
import org.primefaces.util.LocaleUtils;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function;
import java.util.stream.Collectors;

import javax.el.MethodExpression;
import javax.el.ValueExpression;
import javax.faces.FacesException;
import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
import javax.faces.component.UINamingContainer;
import javax.faces.component.ValueHolder;
import javax.faces.component.search.SearchExpressionHint;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.primefaces.component.column.ColumnBase;
import org.primefaces.component.headerrow.HeaderRow;
import org.primefaces.expression.SearchExpressionUtils;
import org.primefaces.model.ColumnMeta;
import org.primefaces.model.FilterMeta;
import org.primefaces.model.SortMeta;
import org.primefaces.util.ComponentUtils;
import org.primefaces.util.FacetUtils;
import org.primefaces.util.LangUtils;
import org.primefaces.util.LocaleUtils;

public interface UITable<T extends UITableState> extends ColumnAware, MultiViewStateAware<T> {

Expand Down Expand Up @@ -195,11 +197,11 @@ default void updateFilterByValuesWithFilterRequest(FacesContext context, Map<Str
((DynamicColumn) column).applyModel();
}

boolean hasCustomFilter = column.getFacet("filter") != null;
EditableValueHolder hasCustomFilter = column.getFilterValueHolder();

Object filterValue;
if (hasCustomFilter) {
filterValue = column.getFilterValueFromValueHolder();
if (hasCustomFilter != null) {
filterValue = column.getFilterValueFromValueHolder(context);
}
else {
String valueHolderClientId = column instanceof DynamicColumn
Expand Down
21 changes: 11 additions & 10 deletions primefaces/src/main/java/org/primefaces/model/FilterMeta.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@
*/
package org.primefaces.model;

import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Objects;

import javax.el.ELContext;
import javax.el.MethodExpression;
import javax.el.ValueExpression;
import javax.faces.context.FacesContext;

import org.primefaces.component.api.DynamicColumn;
import org.primefaces.component.api.UIColumn;
import org.primefaces.component.column.ColumnBase;
Expand All @@ -32,15 +42,6 @@
import org.primefaces.model.filter.GlobalFilterConstraint;
import org.primefaces.util.LangUtils;

import javax.el.ELContext;
import javax.el.MethodExpression;
import javax.el.ValueExpression;
import javax.faces.context.FacesContext;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Objects;

public class FilterMeta implements Serializable {

public static final String GLOBAL_FILTER_KEY = "globalFilter";
Expand Down Expand Up @@ -99,7 +100,7 @@ else if (filterByVE == null) {

Object filterValue = column.getFilterValue();
if (filterValue == null) {
filterValue = column.getFilterValueFromValueHolder();
filterValue = column.getFilterValueFromValueHolder(context);
}

return new FilterMeta(column.getColumnKey(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,17 @@ public static UIComponent closestNamingContainer(UIComponent component) {
return (UIComponent) closest(NamingContainer.class, component);
}

public static <T> T firstChildRenderedOrSelf(Class<T> childType, UIComponent base) {
if (base == null || !base.isRendered()) {
return null;
}
else if (childType.isInstance(base)) {
return (T) base;
}

return firstChildRendered(childType, base);
}

public static <T> T firstChildRendered(Class<T> childType, UIComponent base) {
if (base == null || !base.isRendered()) {
return null;
Expand Down

0 comments on commit 75e5c59

Please sign in to comment.