You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/09/30 09:42:43 UTC

[isis] branch master updated: ISIS-3122: render vega payload

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 b89285976d ISIS-3122: render vega payload
b89285976d is described below

commit b89285976d1167f3720b30b75a2b178852f0f5d9
Author: andi-huber <ah...@apache.org>
AuthorDate: Fri Sep 30 11:42:37 2022 +0200

    ISIS-3122: render vega payload
---
 .../object/{MmTitleUtil.java => MmRenderUtil.java} | 29 +-----------------
 .../isis/core/metamodel/object/MmTitleUtil.java    | 29 ------------------
 .../isis/valuetypes/vega/applib/value/Vega.java    |  4 ---
 .../metamodel/semantics/VegaValueSemantics.java    | 35 +++++++++++++++++++---
 valuetypes/vega/ui/pom.xml                         |  2 ++
 .../vega/ui/wkt/components/VegaComponentWkt.java   |  2 +-
 .../ui/wkt/components/VegaPanelFactoriesWkt.java   |  3 +-
 .../components/scalars/markup/MarkupComponent.java |  4 +--
 .../ui/components/value/StandaloneValuePanel.java  |  4 +--
 9 files changed, 40 insertions(+), 72 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmTitleUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmRenderUtil.java
similarity index 64%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmTitleUtil.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmRenderUtil.java
index 8e9c9c7584..504757d9bf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmTitleUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmRenderUtil.java
@@ -18,29 +18,16 @@
  */
 package org.apache.isis.core.metamodel.object;
 
-import java.util.function.Predicate;
-
 import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.value.semantics.Renderer;
-import org.apache.isis.core.metamodel.facets.object.title.TitleRenderRequest;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 
 import lombok.val;
 import lombok.experimental.UtilityClass;
 
 @UtilityClass
-public class MmTitleUtil {
-
-    public String abbreviatedTitleOf(final ManagedObject adapter, final int maxLength, final String suffix) {
-        return _InternalTitleUtil.abbreviated(titleOf(adapter), maxLength, suffix);
-    }
-
-    public String titleOf(final ManagedObject adapter) {
-        return adapter!=null
-                ? adapter.getTitle()
-                : "";
-    }
+public class MmRenderUtil {
 
     public String htmlStringForValueType(
             final @Nullable ManagedObject adapter,
@@ -66,18 +53,4 @@ public class MmTitleUtil {
         return renderer.htmlPresentation(valueFacet.createValueSemanticsContext(feature), adapter.getPojo());
     }
 
-    public String getTitleHonoringTitlePartSkipping(
-            final ManagedObject managedObject,
-            final Predicate<ManagedObject> skipTitlePart) {
-        return ManagedObjects.isPacked(managedObject)
-                ? "(multiple objects)"
-                : managedObject != null
-                    ? _InternalTitleUtil.titleString(
-                            TitleRenderRequest.builder()
-                            .object(managedObject)
-                            .skipTitlePartEvaluator(skipTitlePart)
-                            .build())
-                    : "(no object)";
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmTitleUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmTitleUtil.java
index 8e9c9c7584..c22afb8b4b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmTitleUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmTitleUtil.java
@@ -20,13 +20,8 @@ package org.apache.isis.core.metamodel.object;
 
 import java.util.function.Predicate;
 
-import org.springframework.lang.Nullable;
-
-import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.core.metamodel.facets.object.title.TitleRenderRequest;
-import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 
-import lombok.val;
 import lombok.experimental.UtilityClass;
 
 @UtilityClass
@@ -42,30 +37,6 @@ public class MmTitleUtil {
                 : "";
     }
 
-    public String htmlStringForValueType(
-            final @Nullable ManagedObject adapter,
-            final @Nullable ObjectFeature feature) {
-
-        if(!ManagedObjects.isSpecified(adapter)) {
-            return "";
-        }
-
-        val spec = adapter.getSpecification();
-        val valueFacet = spec.valueFacet().orElse(null);
-
-        if(valueFacet==null) {
-            return String.format("missing ValueFacet %s", spec.getCorrespondingClass());
-        }
-
-        @SuppressWarnings("unchecked")
-        val renderer = (Renderer<Object>) valueFacet.selectRendererForFeature(feature).orElse(null);
-        if(renderer==null) {
-            return String.format("missing Renderer %s", spec.getCorrespondingClass());
-        }
-
-        return renderer.htmlPresentation(valueFacet.createValueSemanticsContext(feature), adapter.getPojo());
-    }
-
     public String getTitleHonoringTitlePartSkipping(
             final ManagedObject managedObject,
             final Predicate<ManagedObject> skipTitlePart) {
diff --git a/valuetypes/vega/applib/src/main/java/org/apache/isis/valuetypes/vega/applib/value/Vega.java b/valuetypes/vega/applib/src/main/java/org/apache/isis/valuetypes/vega/applib/value/Vega.java
index cef652f29a..b2d67183e4 100644
--- a/valuetypes/vega/applib/src/main/java/org/apache/isis/valuetypes/vega/applib/value/Vega.java
+++ b/valuetypes/vega/applib/src/main/java/org/apache/isis/valuetypes/vega/applib/value/Vega.java
@@ -102,10 +102,6 @@ public final class Vega implements Serializable {
                 : schema.asEmptyJson();
     }
 
-    public String asHtml() {
-        return "Vega.asHtml()"; //TODO[ISIS-3122]
-    }
-
     public boolean isEqualTo(final Vega other) {
         return Objects.equals(this.getJson(), other!=null ? other.getJson() : null);
     }
diff --git a/valuetypes/vega/metamodel/src/main/java/org/apache/isis/valuetypes/vega/metamodel/semantics/VegaValueSemantics.java b/valuetypes/vega/metamodel/src/main/java/org/apache/isis/valuetypes/vega/metamodel/semantics/VegaValueSemantics.java
index 38910b122e..47a772bb20 100644
--- a/valuetypes/vega/metamodel/src/main/java/org/apache/isis/valuetypes/vega/metamodel/semantics/VegaValueSemantics.java
+++ b/valuetypes/vega/metamodel/src/main/java/org/apache/isis/valuetypes/vega/metamodel/semantics/VegaValueSemantics.java
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.valuetypes.vega.metamodel.semantics;
 
+import java.util.UUID;
+
 import javax.inject.Named;
 
 import org.springframework.stereotype.Component;
@@ -33,6 +35,9 @@ import org.apache.isis.schema.common.v2.ValueType;
 import org.apache.isis.valuetypes.vega.applib.IsisModuleValVegaApplib;
 import org.apache.isis.valuetypes.vega.applib.value.Vega;
 
+import lombok.NonNull;
+import lombok.val;
+
 @Component
 @Named(IsisModuleValVegaApplib.NAMESPACE + ".VegaValueSemantics")
 public class VegaValueSemantics
@@ -80,12 +85,34 @@ implements
 
     @Override
     public String htmlPresentation(final ValueSemanticsProvider.Context context, final Vega vega) {
-        return renderHtml(vega, Vega::asHtml);
+        return renderHtml(vega, this::asHtml);
     }
 
-    @Override
-    public SyntaxHighlighter syntaxHighlighter() {
-        return SyntaxHighlighter.PRISM_COY;
+    /**
+     * see usage examples at https://vega.github.io/vega/usage/
+     */
+    private String asHtml(final @NonNull Vega vega) {
+        val containerId = "vegaContainer" + UUID.randomUUID().toString();
+
+        val htmlFragment = String.format(""
+                + "<div id=\"%1$s\"></div>\n"
+                + "<script type=\"text/javascript\">\n"
+                + "var spec = %2$s;\n"
+                + "document.addEventListener('DOMContentLoaded', (event) => {\n"
+                + "  view = new vega.View(vega.parse(spec), {\n"
+                + "    renderer:  '%3$s',\n"
+                + "    container: '#%1$s',\n"
+                + "    hover:     %4$b    \n"
+                + "  });\n"
+                + "  view.runAsync();\n"
+                + "});"
+                + "</script>",
+                containerId,
+                vega.getJson(),
+                "canvas", // renderer (canvas or svg)
+                true // enable hover processing
+                );
+        return htmlFragment;
     }
 
     // -- PARSER
diff --git a/valuetypes/vega/ui/pom.xml b/valuetypes/vega/ui/pom.xml
index 57289bedd4..8274632bc9 100644
--- a/valuetypes/vega/ui/pom.xml
+++ b/valuetypes/vega/ui/pom.xml
@@ -43,6 +43,8 @@
 		</dependency>
 
 		<!-- provides VEGA API -->
+		<!-- Unfortunately the webjar {@code org.webjars.npm:vega:5.22.1} cannot be used,
+			as (at time of writing) <i>Maven</i> fails to resolve all its dependencies. -->
 		<!--
 		<dependency>
 		    <groupId>org.webjars.npm</groupId>
diff --git a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/VegaComponentWkt.java b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/VegaComponentWkt.java
index 43c2b4bf85..4388d35a25 100644
--- a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/VegaComponentWkt.java
+++ b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/VegaComponentWkt.java
@@ -32,7 +32,7 @@ public class VegaComponentWkt extends MarkupComponent {
     public VegaComponentWkt(final String id, final IModel<?> model){
         super(id, model,
                 org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupComponent.Options.builder()
-                .syntaxHighlighter(SyntaxHighlighter.PRISM_COY)
+                .syntaxHighlighter(SyntaxHighlighter.NONE)
                 .build());
     }
 
diff --git a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/VegaPanelFactoriesWkt.java b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/VegaPanelFactoriesWkt.java
index 8a169427d5..8b62f0640e 100644
--- a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/VegaPanelFactoriesWkt.java
+++ b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/VegaPanelFactoriesWkt.java
@@ -31,8 +31,7 @@ import lombok.val;
 /**
  * @implNote Almost a copy of {@code Parented} and {@code Standalone} in
  * {@link MarkupPanelFactories}, but specific to
- * the {@link Vega} value-type which requires client-side java-script to be
- * executed to enable syntax highlighting
+ * the {@link Vega} value-type.
  */
 public class VegaPanelFactoriesWkt {
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java
index 3e8fbfc1d7..1391705496 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java
@@ -30,7 +30,7 @@ import org.apache.wicket.model.IModel;
 
 import org.apache.isis.applib.value.semantics.Renderer.SyntaxHighlighter;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.MmTitleUtil;
+import org.apache.isis.core.metamodel.object.MmRenderUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.commons.model.scalar.UiParameter;
 import org.apache.isis.viewer.wicket.model.models.ScalarPropertyModel;
@@ -106,7 +106,7 @@ public class MarkupComponent extends WebComponent {
         if(modelObject instanceof ManagedObject) {
             val adapter = (ManagedObject) modelObject;
             val feature = lookupObjectFeatureIn(getDefaultModel()).orElse(null);
-            val asHtml = MmTitleUtil.htmlStringForValueType(adapter, feature);
+            val asHtml = MmRenderUtil.htmlStringForValueType(adapter, feature);
             return asHtml != null
                 ? asHtml
                 : fallback;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanel.java
index 9f37f50aa2..d0481277fa 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/value/StandaloneValuePanel.java
@@ -24,7 +24,7 @@ import java.util.UUID;
 import org.apache.isis.applib.services.bookmark.idstringifiers.PredefinedSerializables;
 import org.apache.isis.applib.value.LocalResourcePath;
 import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.MmTitleUtil;
+import org.apache.isis.core.metamodel.object.MmRenderUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.models.ValueModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
@@ -51,7 +51,7 @@ extends PanelAbstract<ManagedObject, ValueModel> {
         // (we probably need to remove StandaloneValuePanel and utilize the ScalarPanel for standalone values instead)
         if(isProbablySimpleInlineHtml(valueModel.getObjectMember().getElementType())) {
             Wkt.markupAdd(this, ID_STANDALONE_VALUE, ()->
-                MmTitleUtil.htmlStringForValueType(getModel().getObject(), getModel().getObjectMember())
+                MmRenderUtil.htmlStringForValueType(getModel().getObject(), getModel().getObjectMember())
             );
         } else {
             // resort to (textual) title rendering