Skip to content

Commit

Permalink
fix merge and more
Browse files Browse the repository at this point in the history
  • Loading branch information
Rapster committed Oct 15, 2023
1 parent 4446137 commit 35845bd
Show file tree
Hide file tree
Showing 8 changed files with 131 additions and 112 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.component.visit.VisitResult;
import javax.faces.context.FacesContext;

import org.primefaces.component.columngroup.ColumnGroup;
import org.primefaces.component.columns.Columns;
Expand Down Expand Up @@ -75,6 +76,8 @@ public boolean test(Object o) {

private RowColumnVisitor callback;

private String columnKey;

public static ForEachRowColumn from(UIComponent root) {
ForEachRowColumn visitor = new ForEachRowColumn();
visitor.root = root;
Expand All @@ -96,6 +99,11 @@ public ForEachRowColumn columnEnd(int columnEnd) {
return this;
}

public ForEachRowColumn columnKey(String columnKey) {
this.columnKey = columnKey;
return this;
}

public void invoke(RowColumnVisitor callback) {
this.callback = callback;

Expand Down Expand Up @@ -131,10 +139,14 @@ else if (root == target) {

protected void visitChildren(UIComponent target) throws IOException {
if (target.getChildCount() > 0) {
// ignore column start/end in case it's not a column container like UIPanel
boolean columnAware = isColumnAware(target);
int offset = columnAware && columnStart != null ? columnStart : 0;
int end = columnAware && columnEnd != null ? Math.min(columnEnd, target.getChildCount()) : target.getChildCount();
int offset = 0;
int end = target.getChildCount();

// column truncation only for column container unlike UIPanel
if (columnStart != null && columnEnd != null && isColumnAware(target)) {
offset = columnStart;
end = Math.min(columnEnd, target.getChildCount());
}

int idx = 0; // relative position of child to his parent

Expand Down Expand Up @@ -164,7 +176,6 @@ private VisitResult handleRow(int index, Row target) throws IOException {
return VisitResult.REJECT;
}


private VisitResult handleColumnGroup(int index, ColumnGroup target) throws IOException {
if (isVisitable(target)) {
callback.visitColumnGroup(index, target);
Expand All @@ -177,8 +188,9 @@ private VisitResult handleColumnGroup(int index, ColumnGroup target) throws IOEx
private VisitResult handleColumn(int index, UIColumn target) throws IOException {
if (target instanceof Columns) {
Columns cols = (Columns) target;
for (int i = 0; i < cols.getDynamicColumns().size(); i++) {
DynamicColumn column = cols.getDynamicColumns().get(i);
cols.setRowIndex(-1);
for (int i = 0; i < cols.getRowCount(); i++) {
DynamicColumn column = new DynamicColumn(i, cols, FacesContext.getCurrentInstance());
visitIfPossible(index + i, column);
}
}
Expand All @@ -203,7 +215,9 @@ private void visitIfPossible(int index, UIColumn column) throws IOException {
}

private boolean isVisitable(Object target) {
return hints.stream().allMatch(o -> o.test(target));
return !(columnKey != null
&& target instanceof UIColumn && !columnKey.equals(((UIColumn) target).getColumnKey()))
&& hints.stream().allMatch(o -> o.test(target));
}

private static boolean isColumnAware(UIComponent component) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
import javax.faces.event.PhaseId;
import javax.faces.event.PostValidateEvent;
import javax.faces.event.PreValidateEvent;
import javax.faces.model.*;
import javax.faces.model.DataModel;
import javax.faces.render.Renderer;

import org.primefaces.component.column.Column;
Expand Down Expand Up @@ -911,7 +911,6 @@ protected boolean requiresColumns() {
return false;
}

@Deprecated
protected List<UIComponent> getIterableChildren() {
return getChildren();
}
Expand Down
86 changes: 39 additions & 47 deletions primefaces/src/main/java/org/primefaces/component/api/UITable.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/
package org.primefaces.component.api;

import java.io.IOException;
import java.text.Collator;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
Expand Down Expand Up @@ -182,45 +183,42 @@ default void updateFilterByValuesWithFilterRequest(FacesContext context, Map<Str
params.get(((UIComponent) this).getClientId(context) + separator + FilterMeta.GLOBAL_FILTER_KEY));
}

forEachColumn(column -> {
FilterMeta filterMeta = filterBy.get(column.getColumnKey());
if (filterMeta == null || filterMeta.isGlobalFilter()) {
return true;
}

if (column instanceof DynamicColumn) {
((DynamicColumn) column).applyModel();
}
ForEachRowColumn.from((UIComponent) this).invoke(new RowColumnVisitor.Adapter() {
@Override
public void visitColumn(int index, UIColumn column) throws IOException {
FilterMeta filterMeta = filterBy.get(column.getColumnKey());
if (filterMeta == null || filterMeta.isGlobalFilter()) {
return;
}

UIComponent filterFacet = column.getFilterComponent();
boolean hasCustomFilter = ComponentUtils.shouldRenderFacet(filterFacet);
UIComponent filterFacet = column.getFilterComponent();
boolean hasCustomFilter = ComponentUtils.shouldRenderFacet(filterFacet);

Object filterValue;
if (hasCustomFilter) {
filterValue = ((ValueHolder) filterFacet).getLocalValue();
}
else {
String valueHolderClientId = column instanceof DynamicColumn
? column.getContainerClientId(context) + separator + "filter"
: column.getClientId(context) + separator + "filter";
filterValue = params.get(valueHolderClientId);
}

if (filterValue != null) {
// this is not absolutely necessary, but in case the result is null, it prevents to execution of the next statement
filterValue = FilterMeta.resetToNullIfEmpty(filterValue);
}
Object filterValue;
if (hasCustomFilter) {
filterValue = ((ValueHolder) filterFacet).getLocalValue();
}
else {
String valueHolderClientId = column instanceof DynamicColumn
? column.getContainerClientId(context) + separator + "filter"
: column.getClientId(context) + separator + "filter";
filterValue = params.get(valueHolderClientId);
}

if (filterValue != null) {
ValueExpression columnFilterValueVE = column.getValueExpression(ColumnBase.PropertyKeys.filterValue.toString());
if (columnFilterValueVE != null && List.class.isAssignableFrom(columnFilterValueVE.getType(context.getELContext()))) {
filterValue = Arrays.asList((Object[]) filterValue);
if (filterValue != null) {
// this is not absolutely necessary, but in case the result is null, it prevents to execution of the next statement
filterValue = FilterMeta.resetToNullIfEmpty(filterValue);
}
}

filterMeta.setFilterValue(filterValue);
if (filterValue != null) {
ValueExpression columnFilterValueVE = column.getValueExpression(ColumnBase.PropertyKeys.filterValue.toString());
if (columnFilterValueVE != null && List.class.isAssignableFrom(columnFilterValueVE.getType(context.getELContext()))) {
filterValue = Arrays.asList((Object[]) filterValue);
}
}

return true;
filterMeta.setFilterValue(filterValue);
}
});
}

Expand Down Expand Up @@ -639,22 +637,16 @@ static void treeColumnsTo2DArray(ColumnNode root, List<List<ColumnNode>> nodes,

if (child instanceof Columns) {
Columns columns = (Columns) child;
List<DynamicColumn> dynaColumns = columns.getDynamicColumns();
dynaColumns.forEach(col -> {
col.applyStatelessModel();
if (col.isRendered()) {
row.add(new ColumnNode(root, col));
}
columns.forEachDynamicColumn(false, (col, pos) -> {
row.add(new ColumnNode(root, col));
});
}
else if (child.isRendered()) {
if (child instanceof Column) {
row.add(new ColumnNode(root, child));
}
else if (child instanceof ColumnGroup) {
ColumnNode column = new ColumnNode(root, child);
row.add(column);
treeColumnsTo2DArray(column, nodes, columnStart, columnEnd);
else if (child.isRendered()
&& (child instanceof Column || child instanceof ColumnGroup)) {
ColumnNode node = new ColumnNode(root, child);
row.add(node);
if (child instanceof ColumnGroup) {
treeColumnsTo2DArray(node, nodes, columnStart, columnEnd);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import javax.faces.component.UIComponent;
import javax.faces.component.UINamingContainer;
import javax.faces.context.FacesContext;
Expand Down Expand Up @@ -100,21 +101,33 @@ public String getHeaderText() {
return headerText;
}

@Deprecated
public List<DynamicColumn> getDynamicColumns() {
if (dynamicColumns == null) {
FacesContext context = getFacesContext();
setRowIndex(-1);
dynamicColumns = new ArrayList<>(getRowCount());

for (int i = 0; i < getRowCount(); i++) {
DynamicColumn dynaColumn = new DynamicColumn(i, this, context);
dynamicColumns.add(dynaColumn);
}
forEachDynamicColumn(false, (col, index) -> dynamicColumns.add(col));
}

return dynamicColumns;
}

public void forEachDynamicColumn(boolean applyModel, BiConsumer<DynamicColumn, Integer> column) {
FacesContext context = getFacesContext();
setRowIndex(-1);
for (int i = 0; i < getRowCount(); i++) {
DynamicColumn dynaColumn = new DynamicColumn(i, this, context);
if (applyModel) {
dynaColumn.applyModel();
}
else {
dynaColumn.applyStatelessModel();
}
if (dynaColumn.isRendered()) {
column.accept(dynaColumn, i);
}
}
}

public void setDynamicColumns(List<DynamicColumn> dynamicColumns) {
this.dynamicColumns = dynamicColumns;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -889,20 +889,16 @@ public Locale resolveDataLocale() {

@Override
protected List<UIComponent> getIterableChildren() {
if (isColumnGroupLegacyEnabled()) {
List<UIComponent> iterableChildren = new ArrayList<>(getChildCount());
List<UIComponent> iterableChildren = new ArrayList<>(getChildCount());

for (int i = 0; i < getChildCount(); i++) {
UIComponent child = getChildren().get(i);
if (!(child instanceof ColumnGroup)) {
iterableChildren.add(child);
}
for (int i = 0; i < getChildCount(); i++) {
UIComponent child = getChildren().get(i);
if (!(child instanceof ColumnGroup)) {
iterableChildren.add(child);
}

return iterableChildren;
}

return getChildren();
return iterableChildren;
}

public List<?> getFilteredValue() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@
import javax.faces.event.PhaseId;

import org.primefaces.PrimeFaces;
import org.primefaces.component.api.ForEachRowColumn;
import org.primefaces.component.api.RowColumnVisitor;
import org.primefaces.component.api.UIColumn;
import org.primefaces.component.column.ColumnBase;
import org.primefaces.component.datatable.DataTable;
import org.primefaces.component.datatable.DataTableRenderer;
Expand Down Expand Up @@ -129,39 +132,41 @@ public void filter(FacesContext context, DataTable table) {
}

final int rowIndex = i;
table.forEachColumn(column -> {
FilterMeta filter = filterBy.get(column.getColumnKey(table, rowIndex));
if (filter == null || filter.isGlobalFilter()) {
return true;
}
ForEachRowColumn.from(table).invoke(new RowColumnVisitor.Adapter() {
@Override
public void visitColumn(int index, UIColumn column) throws IOException {
FilterMeta filter = filterBy.get(column.getColumnKey(table, rowIndex));
if (filter == null || filter.isGlobalFilter()) {
return;
}

Object columnValue = filter.getLocalValue(elContext, column);
Object columnValue = filter.getLocalValue(elContext, column);

if (globalFilter != null && globalFilter.isActive() && !globalMatch.get() && !hasGlobalFilterFunction) {
FilterConstraint constraint = globalFilter.getConstraint();
Object filterValue = globalFilter.getFilterValue();
globalMatch.set(constraint.isMatching(context, columnValue, filterValue, filterLocale));
}

if (!filter.isActive()) {
return true;
}
if (globalFilter != null && globalFilter.isActive() && !globalMatch.get() && !hasGlobalFilterFunction) {
FilterConstraint constraint = globalFilter.getConstraint();
Object filterValue = globalFilter.getFilterValue();
globalMatch.set(constraint.isMatching(context, columnValue, filterValue, filterLocale));
}

FilterConstraint constraint = filter.getConstraint();
Object filterValue = filter.getFilterValue();
if (filterValue instanceof String && column instanceof ColumnBase) {
ColumnBase columnBase = (ColumnBase) column;
try {
filterValue = ComponentUtils.getConvertedValue(
context, columnBase, columnBase.getConverter(), filterValue);
if (!filter.isActive()) {
return;
}
catch (Exception ex) {
filterValue = null;

FilterConstraint constraint = filter.getConstraint();
Object filterValue = filter.getFilterValue();
if (filterValue instanceof String && column instanceof ColumnBase) {
ColumnBase columnBase = (ColumnBase) column;
try {
filterValue = ComponentUtils.getConvertedValue(
context, columnBase, columnBase.getConverter(), filterValue);
}
catch (Exception ex) {
filterValue = null;
}
}
}

localMatch.set(constraint.isMatching(context, columnValue, filterValue, filterLocale));
return localMatch.get();
localMatch.set(constraint.isMatching(context, columnValue, filterValue, filterLocale));
}
});

boolean matches = localMatch.get();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,15 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import javax.el.ValueExpression;
import javax.faces.FacesException;
import javax.faces.context.FacesContext;
import javax.faces.model.ListDataModel;

import org.primefaces.PrimeFaces;
import org.primefaces.component.api.ForEachRowColumn;
import org.primefaces.component.api.RowColumnVisitor;
import org.primefaces.component.api.UIColumn;
import org.primefaces.component.datatable.DataTable;
import org.primefaces.component.datatable.DataTableRenderer;
import org.primefaces.component.datatable.DataTableState;
Expand Down Expand Up @@ -161,9 +163,12 @@ public void sort(FacesContext context, DataTable table) {
// Currently ColumnGrouping supports ui:repeat, therefore we have to use a callback
// and can't use sortMeta.getComponent()
// Later when we refactored ColumnGrouping, we may remove #invokeOnColumn as we dont support ui:repeat in other cases
table.invokeOnColumn(sortMeta.getColumnKey(), column -> {
int result = compare(context, var, sortMeta, o1, o2, collator, locale);
comparisonResult.set(result);
ForEachRowColumn.from(table).columnKey(sortMeta.getColumnKey()).invoke(new RowColumnVisitor.Adapter() {
@Override
public void visitColumn(int index, UIColumn column) throws IOException {
int result = compare(context, var, sortMeta, o1, o2, collator, locale);
comparisonResult.set(result);
}
});
}

Expand Down

0 comments on commit 35845bd

Please sign in to comment.