【发布时间】:2021-01-08 16:21:21
【问题描述】:
我的表中有一个列,我用以下代码填充项目:
@Override
public void populateItem(Item<ICellPopulator<T>> item, String componentId, IModel<T> model) {
if (deleteEnabled(model)) {
item.add(new ConfirmationLink<>(componentId).onClick(target -> deleteRow(...)));
} else {
item.add(new Label(componentId));
}
}
因此,当用户有足够的授权删除实体时,他可以看到行中的图标,如果不是,他只会看到一个空单元格。
在哪里可以检查表中的每个模型,用户无权删除任何实体并阻止列在表中呈现?
更新
我想添加一些代码来解释我的情况。
这是在我的应用程序中使用表格的一个非常常见的示例。
public class CenterPanel extends SWPanel<CourierSearchQuery> {
public CenterPanel(String id) {
super(id, new Model<>(new CourierSearchQuery()));
}
@Override
protected void onInitialize() {
super.onInitialize();
List<IColumn<Courier, String>> columns = List.of(
new StyledColumn<Courier>("Ф.И.О.", "name.FIO", "name.FIO")
.setCreateComponentFunction((id, model) ->
new LinkPanel(id, model.map(n -> n.getName().getFIO()), model)),
new StyledColumn<Courier>("Статус", "state.title")
.setCssClass(CSS.width(100)),
new StyledColumn<Courier>("Телефон", "phone")
.setCssClass(CSS.width(100)),
new DeleteColumn<>() // <- this column should be hideable
);
add(new EntityDataTable<>("table", columns, getModel()));
}
}
有一个 JPA 实体 (Courier)、POJO 参数对象 (CourierSearchQuery),我可以在其中设置过滤数据和 EntityDataTable 的条件。最后一个包含一个 dataprovider,它可以为实体找到一个 DAO,调用一个带有过滤参数的搜索方法并在它上面创建一个迭代器。
还有一个 DeleteColumn 类。在后台,它会检查用户对当前实体的权限并显示一个 ajax 链接。
我想用下面的接口标记它并将它隐藏在一个DataTable类中(如果需要的话):
public interface HideableColumn<T> {
boolean isCellVisible(T object);
}
为了实现隐藏,我写了以下内容:
private List<? extends IColumn<T, String>> allColumns;
@Override
protected void onConfigure() {
super.onConfigure();
if (allColumns == null) allColumns = new ArrayList<>(getColumns());
if (allColumns.stream().anyMatch(e -> e instanceof HideableColumn)) {
getColumns().clear();
Set<T> objects = new HashSet<>();
getDataProvider().iterator(getCurrentPage() * getItemsPerPage(), getItemsPerPage()).forEachRemaining(objects::add); // <-1
allColumns.stream()
.filter(e -> !(e instanceof HideableColumn) || objects.stream().anyMatch(((HideableColumn<T>) e)::isCellVisible))
.forEach(e -> getColumns().add(e)); // <-2
}
}
但是这段代码有两个问题: 1 - 它使表调用 dataProvider#iterator() 两次 2 - 由于 dataTable#getColumns() 在声明中有通配符,因此无法编译
【问题讨论】:
标签: wicket