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;
- }
-
}