This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new f98cde0a0a ISIS-2927: vaadin: use (common) DataTableModel
f98cde0a0a is described below

commit f98cde0a0a4d0fa74899831fd7442a749aedfa36
Author: andi-huber <[email protected]>
AuthorDate: Mon Oct 31 11:28:51 2022 +0100

    ISIS-2927: vaadin: use (common) DataTableModel
---
 .../managed/nonscalar/DataTableModel.java          |  3 +
 .../model/context/MemberInvocationHandler.java     | 30 +++++++
 .../viewer/vaadin/model/context/UiContextVaa.java  | 12 ++-
 .../vaadin/model/util/{_vaa.java => Vaa.java}      | 29 ++++---
 .../ui/components/UiComponentFactoryVaa.java       |  4 +-
 .../ui/components/collection/TableViewVaa.java     | 94 +++++-----------------
 .../vaadin/ui/components/object/ObjectViewVaa.java | 30 +++----
 .../viewer/vaadin/ui/pages/main/MainViewVaa.java   | 53 ++++++++----
 .../ui/pages/main/MainView_createHeader.java       |  4 +-
 .../vaadin/ui/pages/main/UiActionHandlerVaa.java   |  2 +-
 .../vaadin/ui/pages/main/UiContextVaaDefault.java  | 47 ++++++-----
 11 files changed, 160 insertions(+), 148 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/nonscalar/DataTableModel.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/nonscalar/DataTableModel.java
index 9843aa5071..7f66a63d11 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/nonscalar/DataTableModel.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/nonscalar/DataTableModel.java
@@ -169,6 +169,9 @@ implements MultiselectChoices {
             .getFriendlyName());
     }
 
+    /**
+     * Count filtered data rows.
+     */
     public int getElementCount() {
         return dataRowsFiltered.getValue().size();
     }
diff --git 
a/incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/context/MemberInvocationHandler.java
 
b/incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/context/MemberInvocationHandler.java
new file mode 100644
index 0000000000..e16f771350
--- /dev/null
+++ 
b/incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/context/MemberInvocationHandler.java
@@ -0,0 +1,30 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.causeway.incubator.viewer.vaadin.model.context;
+
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
+import org.apache.causeway.core.metamodel.object.ManagedObject;
+
+public interface MemberInvocationHandler<T> {
+
+    T handle(ManagedObject object);
+    T handle(ManagedAction managedAction, Can<ManagedObject> params, 
ManagedObject actionResult);
+
+}
diff --git 
a/incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/context/UiContextVaa.java
 
b/incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/context/UiContextVaa.java
index 590ef1c92b..f93176623d 100644
--- 
a/incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/context/UiContextVaa.java
+++ 
b/incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/context/UiContextVaa.java
@@ -19,26 +19,24 @@
 package org.apache.causeway.incubator.viewer.vaadin.model.context;
 
 import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.Supplier;
 
 import com.vaadin.flow.component.Component;
 
 import org.apache.causeway.applib.services.iactnlayer.InteractionService;
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 
 public interface UiContextVaa {
 
-    //JavaFxViewerConfig getJavaFxViewerConfig();
-
     InteractionService getInteractionService();
-    //ActionUiModelFactoryFx getActionUiModelFactory();
 
     void setNewPageHandler(Consumer<Component> onNewPage);
-    void setPageFactory(Function<ManagedObject, Component> pageFactory);
+    void setPageFactory(MemberInvocationHandler<Component> pageFactory);
 
     void route(ManagedObject object);
-    void route(Supplier<ManagedObject> objectSupplier);
+    void route(ManagedAction managedAction, Can<ManagedObject> params, 
ManagedObject actionResult);
+//    void route(Supplier<ManagedObject> objectSupplier);
 
     // -- DECORATORS
 
diff --git 
a/incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/util/_vaa.java
 
b/incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/util/Vaa.java
similarity index 79%
rename from 
incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/util/_vaa.java
rename to 
incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/util/Vaa.java
index 07d41b76bf..33a08306bf 100644
--- 
a/incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/util/_vaa.java
+++ 
b/incubator/viewers/vaadin/model/src/main/java/org/apache/causeway/incubator/viewer/vaadin/model/util/Vaa.java
@@ -30,42 +30,45 @@ import com.vaadin.flow.component.html.Label;
 import lombok.val;
 import lombok.experimental.UtilityClass;
 
+/**
+ * Vaadin common idioms, in alphabetical order.
+ */
 @UtilityClass
-public class _vaa {
+public class Vaa {
 
     // -- COMPONENT FACTORIES
 
-    public static <T extends Component> T add(HasComponents container, T 
component) {
-        container.add(component);
-        return component;
-    }
-
-    public static Label newLabel(HasComponents container, String label) {
-        val component = new Label(label);
+    public <T extends Component> T add(final HasComponents container, final T 
component) {
         container.add(component);
         return component;
     }
 
-    public static Button newButton(String label) {
+    public Button newButton(final String label) {
         val component = new Button(label);
         component.getStyle().set("margin-left", "0.5em");
         component.addThemeVariants(ButtonVariant.LUMO_SMALL);
         return component;
     }
 
-    public static Button newButton(HasComponents container, String label, 
ComponentEventListener<ClickEvent<Button>> eventHandler) {
+    public Button newButton(final HasComponents container, final String label, 
final ComponentEventListener<ClickEvent<Button>> eventHandler) {
         val component = newButton(label);
         container.add(component);
         component.addClickListener(eventHandler);
         return component;
     }
 
+    public Label newLabel(final HasComponents container, final String label) {
+        val component = new Label(label);
+        container.add(component);
+        return component;
+    }
+
     // -- COMPONENT EVENTS
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    public static <T extends Component> T setOnClick(
-            T component,
-            Runnable onClick) {
+    public <T extends Component> T setOnClick(
+            final T component,
+            final Runnable onClick) {
         ComponentUtil.addListener(component, ClickEvent.class,
                 (ComponentEventListener) e->onClick.run());
         return component;
diff --git 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/UiComponentFactoryVaa.java
 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/UiComponentFactoryVaa.java
index 6028a4ee57..f3cb2afe8a 100644
--- 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/UiComponentFactoryVaa.java
+++ 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/UiComponentFactoryVaa.java
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Service;
 
 import org.apache.causeway.commons.handler.ChainOfResponsibility;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
-import org.apache.causeway.incubator.viewer.vaadin.model.util._vaa;
+import org.apache.causeway.incubator.viewer.vaadin.model.util.Vaa;
 import org.apache.causeway.viewer.commons.model.components.UiComponentFactory;
 import 
org.apache.causeway.viewer.commons.model.components.UiComponentFactory.ButtonRequest;
 import 
org.apache.causeway.viewer.commons.model.components.UiComponentFactory.ComponentRequest;
@@ -62,7 +62,7 @@ public class UiComponentFactoryVaa implements 
UiComponentFactory<Component, Comp
         val disablingUiModelIfAny = request.getDisablingUiModelIfAny();
         val actionEventHandler = request.getActionEventHandler();
 
-        val uiButton = _vaa.newButton(managedAction.getFriendlyName());
+        val uiButton = Vaa.newButton(managedAction.getFriendlyName());
 
         disablingUiModelIfAny.ifPresent(disablingUiModel->{
 //            uiContext.getDisablingDecoratorForButton()
diff --git 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/collection/TableViewVaa.java
 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/collection/TableViewVaa.java
index 2b601105a2..4dc51b3b8b 100644
--- 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/collection/TableViewVaa.java
+++ 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/collection/TableViewVaa.java
@@ -25,17 +25,10 @@ import com.vaadin.flow.component.grid.Grid;
 import com.vaadin.flow.component.orderedlayout.VerticalLayout;
 
 import org.apache.causeway.applib.annotation.Where;
-import org.apache.causeway.applib.services.bookmark.Oid;
-import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.internal.collections._Multimaps;
-import 
org.apache.causeway.core.metamodel.interactions.managed.ManagedCollection;
+import 
org.apache.causeway.core.metamodel.interactions.managed.nonscalar.DataRow;
+import 
org.apache.causeway.core.metamodel.interactions.managed.nonscalar.DataTableModel;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.object.ManagedObjects;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.causeway.core.metamodel.util.Facets;
 import org.apache.causeway.incubator.viewer.vaadin.model.context.UiContextVaa;
 
 import lombok.AccessLevel;
@@ -56,48 +49,18 @@ public class TableViewVaa extends VerticalLayout {
         return new TableViewVaa();
     }
 
-    /**
-     * Constructs a (page-able) {@link Grid} from given {@code collection}
-     * @param collection - of (wrapped) domain objects
-     * @param where
-     */
-    public static TableViewVaa fromCollection(
-            final @NonNull UiContextVaa uiContext,
-            final @NonNull ManagedObject collection,
-            final @NonNull Where where) {
-
-        val objects = Facets.collectionStream(collection)
-                .collect(Can.toCan());
-
-        return ManagedObjects.commonSpecification(objects)
-                .map(elementSpec->new TableViewVaa(elementSpec, objects, 
where))
-                .orElseGet(TableViewVaa::empty);
-    }
-
     /**
      * Constructs a (page-able) {@link Grid} from given {@code 
managedCollection}
      * @param managedCollection
      * @param where
      */
-    public static Component forManagedCollection(
+    public static Component forDataTableModel(
             final @NonNull UiContextVaa uiContext,
-            final @NonNull ManagedCollection managedCollection,
-            final @NonNull Where where) {
-
-        val elementSpec = managedCollection.getElementType();
-        val elements = managedCollection.streamElements()
-                .collect(Can.toCan());
-        return elements.isEmpty()
+            final @NonNull DataTableModel dataTableModel,
+            final @NonNull Where where) { //TODO not used yet (or is redundant)
+        return dataTableModel.getElementCount()==0
                 ? empty()
-                : new TableViewVaa(elementSpec, elements, where);
-    }
-
-    private Can<OneToOneAssociation> columnProperties(final 
ObjectSpecification elementSpec, final Where where) {
-
-        //TODO honor column order (as per layout)
-        return elementSpec.streamProperties(MixedIn.INCLUDED)
-                .filter(ObjectAssociation.Predicates.staticallyVisible(where))
-                .collect(Can.toCan());
+                : new TableViewVaa(dataTableModel);
     }
 
     /**
@@ -106,9 +69,7 @@ public class TableViewVaa extends VerticalLayout {
      * @param objects - (wrapped) domain objects to be rendered by this table
      */
     private TableViewVaa(
-            final @NonNull ObjectSpecification elementSpec,
-            final @NonNull Can<ManagedObject> objects,
-            final @NonNull Where where) {
+            final @NonNull DataTableModel dataTableModel) {
 
         //            final ComboBox<ManagedObject> listBox = new ComboBox<>();
         //            listBox.setLabel(label + " #" + objects.size());
@@ -118,52 +79,37 @@ public class TableViewVaa extends VerticalLayout {
         //            }
         //            listBox.setItemLabelGenerator(o -> o.titleString());
 
-        val objectGrid = new Grid<ManagedObject>();
+        val objectGrid = new Grid<DataRow>();
         add(objectGrid);
 
-        if (objects.isEmpty()) {
+        val rows = dataTableModel.getDataRowsFiltered().getValue();
+
+        if (rows.isEmpty()) {
             //TODO show placeholder: "No rows to display"
             return;
         }
 
-        val columnProperties = columnProperties(elementSpec, where);
-
-        // rather prepare all table cells into a multi-map eagerly,
-        // than having to spawn new transactions/interactions for each table 
cell when rendered lazily
-        val table = _Multimaps.<Oid, String, String>newMapMultimap();
-
-        objects.stream()
-        .forEach(object->{
-
-            val id = object.getBookmark().orElse(null);
-            if(id==null) {
-                return;
-            }
-
-            columnProperties.forEach(property->{
-                table.putElement(id, property.getId(), 
stringifyPropertyValue(property, object));
-            });
-
-        });
+        val columns = dataTableModel.getDataColumns().getValue();
 
         // object link as first column
-        objectGrid.addColumn(targetObject->{
+        objectGrid.addColumn(row->{
             // TODO provide icon with link
-            return "obj. ref ["+targetObject.getBookmark().orElse(null)+"]";
+            return "obj. ref [" + 
row.getRowElement().getBookmark().orElse(null) + "]";
         });
 
         // property columns
-        columnProperties.forEach(property->{
-            objectGrid.addColumn(targetObject -> {
+        columns.forEach(column->{
+            val property = column.getPropertyMetaModel();
+            objectGrid.addColumn(row -> {
                 log.debug("about to get property value for property {}", 
property.getId());
-                return stringifyPropertyValue(property, targetObject);
+                return stringifyPropertyValue(property, row.getRowElement());
             })
             .setHeader(property.getCanonicalFriendlyName());
             //TODO add column description as is provided via 
property.getColumnDescription()
         });
 
         // populate the model
-        objectGrid.setItems(objects.toList());
+        objectGrid.setItems(rows.toList());
         objectGrid.recalculateColumnWidths();
         objectGrid.setColumnReorderingAllowed(true);
 
diff --git 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/object/ObjectViewVaa.java
 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/object/ObjectViewVaa.java
index 1ab6d0b880..879668b911 100644
--- 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/object/ObjectViewVaa.java
+++ 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/components/object/ObjectViewVaa.java
@@ -51,7 +51,7 @@ import 
org.apache.causeway.core.metamodel.interactions.managed.PropertyInteracti
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.object.MmTitleUtil;
 import org.apache.causeway.incubator.viewer.vaadin.model.context.UiContextVaa;
-import org.apache.causeway.incubator.viewer.vaadin.model.util._vaa;
+import org.apache.causeway.incubator.viewer.vaadin.model.util.Vaa;
 import 
org.apache.causeway.incubator.viewer.vaadin.ui.components.UiComponentFactoryVaa;
 import 
org.apache.causeway.incubator.viewer.vaadin.ui.components.collection.TableViewVaa;
 import org.apache.causeway.viewer.commons.model.components.UiComponentFactory;
@@ -99,7 +99,7 @@ public class ObjectViewVaa extends VerticalLayout {
 
             @Override
             protected void onObjectTitle(final HasComponents container, final 
DomainObjectLayoutData domainObjectData) {
-                val uiTitle = _vaa.add(container, new H1(objectTitle));
+                val uiTitle = Vaa.add(container, new H1(objectTitle));
                 //                uiTitle.addThemeVariants(
                 //                        ButtonVariant.LUMO_LARGE,
                 //                        ButtonVariant.LUMO_TERTIARY_INLINE);
@@ -107,7 +107,7 @@ public class ObjectViewVaa extends VerticalLayout {
 
             @Override
             protected HasComponents newRow(final HasComponents container, 
final BSRow bsRow) {
-                val uiRow = _vaa.add(container, new FlexLayout());
+                val uiRow = Vaa.add(container, new FlexLayout());
 
                 uiRow.setWidthFull();
                 uiRow.setFlexWrap(FlexWrap.WRAP); // allow line breaking
@@ -125,7 +125,7 @@ public class ObjectViewVaa extends VerticalLayout {
             @Override
             protected HasComponents newCol(final HasComponents container, 
final BSCol bscol) {
 
-                val uiCol = _vaa.add(container, new VerticalLayout());
+                val uiCol = Vaa.add(container, new VerticalLayout());
 
                 final int span = bscol.getSpan();
                 ((FlexLayout)container).setFlexGrow(span, uiCol);
@@ -138,7 +138,7 @@ public class ObjectViewVaa extends VerticalLayout {
 
             @Override
             protected HasComponents newActionPanel(final HasComponents 
container) {
-                val uiActionPanel = _vaa.add(container, new FlexLayout());
+                val uiActionPanel = Vaa.add(container, new FlexLayout());
 
                 uiActionPanel.setFlexWrap(FlexWrap.WRAP); // allow line 
breaking
                 uiActionPanel.setAlignItems(Alignment.BASELINE);
@@ -147,7 +147,7 @@ public class ObjectViewVaa extends VerticalLayout {
 
             @Override
             protected Tabs newTabGroup(final HasComponents container, final 
BSTabGroup tabGroupData) {
-                val uiTabGroup = _vaa.add(container, new Tabs());
+                val uiTabGroup = Vaa.add(container, new Tabs());
 
                 uiTabGroup.setOrientation(Tabs.Orientation.HORIZONTAL);
                 return uiTabGroup;
@@ -155,14 +155,14 @@ public class ObjectViewVaa extends VerticalLayout {
 
             @Override
             protected HasComponents newTab(final Tabs container, final BSTab 
tabData) {
-                val uiTab = _vaa.add(container, new Tab(tabData.getName()));
+                val uiTab = Vaa.add(container, new Tab(tabData.getName()));
                 return uiTab;
             }
 
             @Override
             protected HasComponents newFieldSet(final HasComponents container, 
final FieldSet fieldSetData) {
 
-                _vaa.add(container, new H2(fieldSetData.getName()));
+                Vaa.add(container, new H2(fieldSetData.getName()));
 
                 // handle associated actions
                 val actionBar = newActionPanel(container);
@@ -170,7 +170,7 @@ public class ObjectViewVaa extends VerticalLayout {
                     onAction(actionBar, actionData);
                 }
 
-                val uiFieldSet = _vaa.add(container, new FormLayout());
+                val uiFieldSet = Vaa.add(container, new FormLayout());
 
                 uiFieldSet.setResponsiveSteps(
                         new ResponsiveStep("0", 1)); // single column only
@@ -196,7 +196,7 @@ public class ObjectViewVaa extends VerticalLayout {
 
                     interaction.checkUsability();
 
-                    val uiButton = _vaa.add(container,
+                    val uiButton = Vaa.add(container,
                             uiComponentFactory.buttonFor(
                                     UiComponentFactory.ButtonRequest.of(
                                             managedAction,
@@ -221,7 +221,7 @@ public class ObjectViewVaa extends VerticalLayout {
 
                     val propNeg = managedProperty.startNegotiation();
 
-                    val uiProperty = _vaa.add(container,
+                    val uiProperty = Vaa.add(container,
                             uiComponentFactory.componentFor(
                                     UiComponentFactory.ComponentRequest.of(
                                             propNeg,
@@ -246,7 +246,7 @@ public class ObjectViewVaa extends VerticalLayout {
                 .checkVisibility()
                 .getManagedCollection()
                 .ifPresent(managedCollection -> {
-                    _vaa.add(container, new 
H3(managedCollection.getFriendlyName()));
+                    Vaa.add(container, new 
H3(managedCollection.getFriendlyName()));
 
                     // handle associated actions
                     val actionBar = newActionPanel(container);
@@ -254,10 +254,10 @@ public class ObjectViewVaa extends VerticalLayout {
                         onAction(actionBar, actionData);
                     }
 
-                    val uiCollection = _vaa.add(container,
-                            TableViewVaa.forManagedCollection(
+                    val uiCollection = Vaa.add(container,
+                            TableViewVaa.forDataTableModel(
                                     uiContext,
-                                    managedCollection,
+                                    managedCollection.createDataTableModel(),
                                     Where.PARENTED_TABLES));
 
                 });
diff --git 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/MainViewVaa.java
 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/MainViewVaa.java
index 737d2b4c3b..4c433467e5 100644
--- 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/MainViewVaa.java
+++ 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/MainViewVaa.java
@@ -31,8 +31,14 @@ import com.vaadin.flow.router.Route;
 import com.vaadin.flow.router.RouteAlias;
 
 import org.apache.causeway.applib.annotation.Where;
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.commons.internal.exceptions._Exceptions;
+import org.apache.causeway.core.metamodel.context.HasMetaModelContext;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
+import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
+import 
org.apache.causeway.core.metamodel.interactions.managed.nonscalar.DataTableModel;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import 
org.apache.causeway.incubator.viewer.vaadin.model.context.MemberInvocationHandler;
 import org.apache.causeway.incubator.viewer.vaadin.model.context.UiContextVaa;
 import 
org.apache.causeway.incubator.viewer.vaadin.ui.components.UiComponentFactoryVaa;
 import 
org.apache.causeway.incubator.viewer.vaadin.ui.components.collection.TableViewVaa;
@@ -53,18 +59,19 @@ import lombok.extern.log4j.Log4j2;
 @CssImport("./css/menu.css")
 @Log4j2
 public class MainViewVaa extends AppLayout
-implements BeforeEnterObserver {
+implements
+    HasMetaModelContext,
+    BeforeEnterObserver,
+    MemberInvocationHandler<Component> {
 
     private static final long serialVersionUID = 1L;
 
-    private final transient MetaModelContext commonContext;
     private final transient MetaModelContext metaModelContext;
     private final transient UiContextVaa uiContext;
     private final transient UiActionHandlerVaa uiActionHandler;
     private final transient UiComponentFactoryVaa uiComponentFactory;
     private final transient HeaderUiService headerUiService;
 
-
     private Div pageContent = new Div();
 
     /**
@@ -79,14 +86,13 @@ implements BeforeEnterObserver {
             final UiComponentFactoryVaa uiComponentFactory) {
 
         this.metaModelContext = metaModelContext;
-        this.commonContext = metaModelContext;
         this.uiActionHandler = uiActionHandler;
         this.headerUiService = headerUiService;
         this.uiContext = uiContext;
         this.uiComponentFactory = uiComponentFactory;
 
         uiContext.setNewPageHandler(this::replaceContent);
-        uiContext.setPageFactory(this::uiComponentForActionResult);
+        uiContext.setPageFactory(this);
     }
 
     @Override
@@ -98,7 +104,7 @@ implements BeforeEnterObserver {
         setPrimarySection(Section.NAVBAR);
 
         val menuBarContainer = MainView_createHeader.createHeader(
-                commonContext,
+                metaModelContext,
                 headerUiService.getHeader(),
                 uiActionHandler::handleActionLinkClicked,
                 this::renderHomepage);
@@ -116,19 +122,38 @@ implements BeforeEnterObserver {
 
     private void renderHomepage() {
         log.info("about to render homepage");
-        uiContext.route(metaModelContext::getHomePageAdapter);
+        val homepage = 
getInteractionService().callAnonymous(metaModelContext::getHomePageAdapter);
+        uiContext.route(homepage);
+    }
+
+    @Override
+    public Component handle(final ManagedObject object) {
+        return ObjectViewVaa.fromObject(
+                uiContext,
+                uiComponentFactory,
+                uiActionHandler::handleActionLinkClicked,
+                object);
     }
 
-    private Component uiComponentForActionResult(final ManagedObject 
actionResult) {
+    @Override
+    public Component handle(final ManagedAction managedAction, final 
Can<ManagedObject> params, final ManagedObject actionResult) {
         if (actionResult.getSpecification().isPlural()) {
-            return TableViewVaa.fromCollection(uiContext, actionResult, 
Where.STANDALONE_TABLES);
+
+            val dataTableModel = DataTableModel.forAction(managedAction, 
params, actionResult);
+
+            return TableViewVaa.forDataTableModel(uiContext, dataTableModel, 
Where.STANDALONE_TABLES);
         } else {
-            return ObjectViewVaa.fromObject(
-                    uiContext,
-                    uiComponentFactory,
-                    uiActionHandler::handleActionLinkClicked,
-                    actionResult);
+            return handle(actionResult);
+        }
+    }
+
+    @Override
+    public MetaModelContext getMetaModelContext() {
+        if(metaModelContext==null) {
+            // TODO needs static recovery
+            throw _Exceptions.notImplemented();
         }
+        return metaModelContext;
     }
 
 
diff --git 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/MainView_createHeader.java
 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/MainView_createHeader.java
index af063524ab..0e95b8e915 100644
--- 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/MainView_createHeader.java
+++ 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/MainView_createHeader.java
@@ -31,7 +31,7 @@ import 
com.vaadin.flow.component.orderedlayout.FlexLayout.FlexWrap;
 
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
-import org.apache.causeway.incubator.viewer.vaadin.model.util._vaa;
+import org.apache.causeway.incubator.viewer.vaadin.model.util.Vaa;
 import 
org.apache.causeway.viewer.commons.applib.services.branding.BrandingUiModel;
 import org.apache.causeway.viewer.commons.applib.services.header.HeaderUiModel;
 import org.apache.causeway.viewer.commons.applib.services.menu.MenuUiService;
@@ -48,7 +48,7 @@ final class MainView_createHeader {
             final Runnable onHomepageLinkClick) {
 
         val titleOrLogo = createTitleOrLogo(commonContext, 
headerUiModel.getBranding());
-        _vaa.setOnClick(titleOrLogo, onHomepageLinkClick);
+        Vaa.setOnClick(titleOrLogo, onHomepageLinkClick);
 
         val leftMenuBar = new MenuBar();
         val horizontalSpacer = new Div();
diff --git 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
index bf8119e449..97f7945bf3 100644
--- 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
+++ 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
@@ -81,7 +81,7 @@ public class UiActionHandlerVaa {
             val actionResultOrVeto = managedAction.invoke(params);
 
             actionResultOrVeto.getSuccess()
-            .ifPresent(actionResult->uiContext.route(actionResult));
+            .ifPresent(actionResult->uiContext.route(managedAction, params, 
actionResult));
 
         });
     }
diff --git 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/UiContextVaaDefault.java
 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/UiContextVaaDefault.java
index 16c5eb6a53..7dfd335644 100644
--- 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/UiContextVaaDefault.java
+++ 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/causeway/incubator/viewer/vaadin/ui/pages/main/UiContextVaaDefault.java
@@ -18,18 +18,21 @@
  */
 package org.apache.causeway.incubator.viewer.vaadin.ui.pages.main;
 
+import java.util.Optional;
 import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.Supplier;
 
 import javax.inject.Inject;
 
 import com.vaadin.flow.component.Component;
 
+import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Service;
 
 import org.apache.causeway.applib.services.iactnlayer.InteractionService;
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import 
org.apache.causeway.incubator.viewer.vaadin.model.context.MemberInvocationHandler;
 import org.apache.causeway.incubator.viewer.vaadin.model.context.UiContextVaa;
 
 import lombok.Getter;
@@ -42,33 +45,43 @@ import lombok.extern.log4j.Log4j2;
 @Log4j2
 public class UiContextVaaDefault implements UiContextVaa {
 
-//    @Getter(onMethod_ = {@Override})
-//    private final JavaFxViewerConfig javaFxViewerConfig;
     @Getter(onMethod_ = {@Override})
     private final InteractionService interactionService;
-//    @Getter(onMethod_ = {@Override})
-//    private final ActionUiModelFactoryFx actionUiModelFactory = new 
ActionUiModelFactoryFx();
 
     @Setter(onMethod_ = {@Override})
     private Consumer<Component> newPageHandler;
 
     @Setter(onMethod_ = {@Override})
-    private Function<ManagedObject, Component> pageFactory;
+    private MemberInvocationHandler<Component> pageFactory;
+
+    // might not be initialized yet
+    private Optional<MemberInvocationHandler<Component>> pageFactory() {
+        return Optional.ofNullable(pageFactory);
+    }
 
     @Override
     public void route(final ManagedObject object) {
         log.info("about to render object {}", object);
-        newPage(pageFor(object));
+        newPage(pageFactory()
+                .map(pageFactory->pageFactory.handle(object))
+                .orElse(null));
     }
 
     @Override
-    public void route(final Supplier<ManagedObject> objectSupplier) {
-        interactionService.runAnonymous(()->{
-            var object = objectSupplier.get();
-            route(object);
-        });
+    public void route(final ManagedAction managedAction, final 
Can<ManagedObject> params, final ManagedObject actionResult) {
+        log.info("about to render object {}", actionResult);
+        newPage(pageFactory()
+                .map(pageFactory->pageFactory.handle(managedAction, params, 
actionResult))
+                .orElse(null));
     }
 
+//    public void route(final Supplier<ManagedObject> objectSupplier) {
+//        interactionService.runAnonymous(()->{
+//            var object = objectSupplier.get();
+//            route(object);
+//        });
+//    }
+
     // -- DECORATORS
 
 //    @Getter(onMethod_ = {@Override})
@@ -88,16 +101,10 @@ public class UiContextVaaDefault implements UiContextVaa {
 
     // -- HELPER
 
-    private void newPage(final Component content) {
+    private void newPage(final @Nullable Component content) {
         if(newPageHandler!=null && content!=null) {
             newPageHandler.accept(content);
         }
     }
 
-    private Component pageFor(final ManagedObject object) {
-        return pageFactory!=null
-                ? pageFactory.apply(object)
-                : null;
-    }
-
 }


Reply via email to