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 47c775844a ISIS-3122: adds support for vega-lite
47c775844a is described below
commit 47c775844a54aef0e47920c69bed74e76acebcf9
Author: andi-huber <[email protected]>
AuthorDate: Sat Oct 1 05:58:00 2022 +0200
ISIS-3122: adds support for vega-lite
---
.../isis/valuetypes/vega/applib/value/Vega.java | 3 ++
.../metamodel/semantics/VegaValueSemantics.java | 20 +++++++----
.../vega/ui/wkt/components/VegaComponentWkt.java | 41 +++++++++++++++++++++-
...aJsReference.java => VegaEmbedJsReference.java} | 21 ++++-------
.../vega/ui/wkt/components/js/VegaJsReference.java | 8 ++---
...gaJsReference.java => VegaLiteJsReference.java} | 21 ++++-------
.../vega/ui/wkt/components/js/[email protected] | 22 ++++++++++++
.../vega/ui/wkt/components/js/[email protected] | 2 ++
.../components/js/{vega.min.js => [email protected]} | 0
9 files changed, 97 insertions(+), 41 deletions(-)
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 b2d67183e4..7a042d2d99 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
@@ -59,6 +59,9 @@ public final class Vega implements Serializable {
VEGA("https://vega.github.io/schema/vega/v5.json"),
VEGA_LITE("https://vega.github.io/schema/vega-lite/v5.json");
+ public boolean isNone() {return this==NONE;}
+ public boolean isVega() {return this==VEGA;}
+ public boolean isVegaLite() {return this==VEGA_LITE;}
public static String key() { return "$schema"; }
@Getter @Accessors(fluent = true) private final String value;
@NonNull String asEmptyJson() {
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 cb0a1a27e4..da48dae7ff 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
@@ -89,7 +89,8 @@ implements
}
/**
- * see usage examples at https://vega.github.io/vega/usage/
+ * see usage examples at <a
href="https://vega.github.io/vega/usage/">vega</a>
+ * and <a
href="https://vega.github.io/vega-lite/usage/embed.html">vega-lite</a>
*/
private String asHtml(final @NonNull Vega vega) {
val containerId = "vegaContainer" + UUID.randomUUID().toString();
@@ -102,9 +103,9 @@ implements
+ "document.addEventListener('DOMContentLoaded', (event)
=> {\n"
+ " var spec = %2$s;\n"
+ " var view = new vega.View(vega.parse(spec), {\n"
- + " renderer: '%3$s',\n"
+ + " renderer: '%3$s',\n"
+ " container: '#%1$s',\n"
- + " hover: %4$b \n"
+ + " hover: %4$b\n"
+ " });\n"
+ " view.runAsync();\n"
+ "});"
@@ -118,12 +119,19 @@ implements
}
case VEGA_LITE: {
val htmlFragment = String.format(""
- + "<div id=\"%1$s\">VEGA-LITE TODO</div>\n",
- containerId);
+ + "<div id=\"%1$s\"></div>\n"
+ + "<script type=\"text/javascript\">\n"
+ + "document.addEventListener('DOMContentLoaded', (event)
=> {\n"
+ + " var spec = %2$s;\n"
+ + " vegaEmbed('#%1$s', spec);"
+ + "});"
+ + "</script>",
+ containerId,
+ vega.getJson());
return htmlFragment;
}
default:
- return "<!-- emtpy Vega (unsupported schema) -->";
+ return "<!-- empty Vega (unsupported schema) -->";
}
}
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 4388d35a25..837dae8799 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
@@ -18,13 +18,25 @@
*/
package org.apache.isis.valuetypes.vega.ui.wkt.components;
+import java.util.Optional;
+
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.model.IModel;
import org.apache.isis.applib.value.semantics.Renderer.SyntaxHighlighter;
+import org.apache.isis.commons.internal.base._Casts;
+import org.apache.isis.core.metamodel.object.ManagedObject;
+import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
+import org.apache.isis.valuetypes.vega.applib.value.Vega;
+import
org.apache.isis.valuetypes.vega.ui.wkt.components.js.VegaEmbedJsReference;
import org.apache.isis.valuetypes.vega.ui.wkt.components.js.VegaJsReference;
+import
org.apache.isis.valuetypes.vega.ui.wkt.components.js.VegaLiteJsReference;
import
org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupComponent;
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
+
+@Log4j2
public class VegaComponentWkt extends MarkupComponent {
private static final long serialVersionUID = 1L;
@@ -39,7 +51,34 @@ public class VegaComponentWkt extends MarkupComponent {
@Override
public void renderHead(final IHeaderResponse response) {
super.renderHead(response);
- response.render(VegaJsReference.asHeaderItem());
+
+ vegaSchema()
+ .ifPresent(vegaSchema->{
+ if(vegaSchema.isVega()) {
+ response.render(VegaJsReference.asHeaderItem());
+ }
+ else
+ if(vegaSchema.isVegaLite()) {
+ response.render(VegaJsReference.asHeaderItem());
+ response.render(VegaLiteJsReference.asHeaderItem());
+ response.render(VegaEmbedJsReference.asHeaderItem());
+ }
+ });
+ }
+
+ // -- HELPER
+
+ private Optional<Vega.Schema> vegaSchema() {
+ val modelObject = getDefaultModelObject();
+ if(modelObject==null) {
+ return Optional.empty();
+ }
+ if(!(modelObject instanceof ManagedObject)) {
+ log.error("framework bug: unexpected type {}",
modelObject.getClass().getName());
+ return Optional.empty();
+ }
+ return _Casts.castTo(Vega.class,
MmUnwrapUtil.single((ManagedObject)modelObject))
+ .map(Vega::getSchema);
}
}
diff --git
a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaJsReference.java
b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaEmbedJsReference.java
similarity index 72%
copy from
valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaJsReference.java
copy to
valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaEmbedJsReference.java
index 57e6ec9b74..968613af11 100644
---
a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaJsReference.java
+++
b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaEmbedJsReference.java
@@ -26,31 +26,24 @@ import lombok.Getter;
import lombok.experimental.Accessors;
/**
- * Provides a local copy of https://vega.github.io/vega/vega.min.js
- * <p>
- * 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.
+ * Provides a local copy of {@linkplain
https://cdn.jsdelivr.net/npm/[email protected]}
* <p>
* LICENSE <a
href="https://vega.github.io/vega/vega/blob/main/LICENSE">BSD-3-Clause
license</a>
* @since 2.0
*/
-public class VegaJsReference
+public class VegaEmbedJsReference
extends JavaScriptResourceReference {
private static final long serialVersionUID = 1L;
@Getter(lazy = true) @Accessors(fluent = true)
- private static final VegaJsReference instance =
- new VegaJsReference();
+ private static final VegaEmbedJsReference instance =
+ new VegaEmbedJsReference();
public static JavaScriptHeaderItem asHeaderItem() {
- return
JavaScriptReferenceHeaderItem.forReference(VegaJsReference.instance());
+ return
JavaScriptReferenceHeaderItem.forReference(VegaEmbedJsReference.instance());
}
- /**
- * Private constructor.
- */
- private VegaJsReference() {
- super(VegaJsReference.class, "vega.min.js");
+ private VegaEmbedJsReference() {
+ super(VegaEmbedJsReference.class, "[email protected]");
}
-
}
diff --git
a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaJsReference.java
b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaJsReference.java
index 57e6ec9b74..daee8bdae5 100644
---
a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaJsReference.java
+++
b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaJsReference.java
@@ -26,7 +26,7 @@ import lombok.Getter;
import lombok.experimental.Accessors;
/**
- * Provides a local copy of https://vega.github.io/vega/vega.min.js
+ * Provides a local copy of {@linkplain
https://cdn.jsdelivr.net/npm/[email protected]}
* <p>
* 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.
@@ -46,11 +46,7 @@ extends JavaScriptResourceReference {
return
JavaScriptReferenceHeaderItem.forReference(VegaJsReference.instance());
}
- /**
- * Private constructor.
- */
private VegaJsReference() {
- super(VegaJsReference.class, "vega.min.js");
+ super(VegaJsReference.class, "[email protected]");
}
-
}
diff --git
a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaJsReference.java
b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaLiteJsReference.java
similarity index 72%
copy from
valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaJsReference.java
copy to
valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaLiteJsReference.java
index 57e6ec9b74..d59120ec9b 100644
---
a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaJsReference.java
+++
b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/VegaLiteJsReference.java
@@ -26,31 +26,24 @@ import lombok.Getter;
import lombok.experimental.Accessors;
/**
- * Provides a local copy of https://vega.github.io/vega/vega.min.js
- * <p>
- * 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.
+ * Provides a local copy of {@linkplain
https://cdn.jsdelivr.net/npm/[email protected]}
* <p>
* LICENSE <a
href="https://vega.github.io/vega/vega/blob/main/LICENSE">BSD-3-Clause
license</a>
* @since 2.0
*/
-public class VegaJsReference
+public class VegaLiteJsReference
extends JavaScriptResourceReference {
private static final long serialVersionUID = 1L;
@Getter(lazy = true) @Accessors(fluent = true)
- private static final VegaJsReference instance =
- new VegaJsReference();
+ private static final VegaLiteJsReference instance =
+ new VegaLiteJsReference();
public static JavaScriptHeaderItem asHeaderItem() {
- return
JavaScriptReferenceHeaderItem.forReference(VegaJsReference.instance());
+ return
JavaScriptReferenceHeaderItem.forReference(VegaLiteJsReference.instance());
}
- /**
- * Private constructor.
- */
- private VegaJsReference() {
- super(VegaJsReference.class, "vega.min.js");
+ private VegaLiteJsReference() {
+ super(VegaLiteJsReference.class, "[email protected]");
}
-
}
diff --git
a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/[email protected]
b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/[email protected]
new file mode 100644
index 0000000000..a40955608f
--- /dev/null
+++
b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/[email protected]
@@ -0,0 +1,22 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof
module?module.exports=t(require("vega"),require("vega-lite")):"function"==typeof
define&&define.amd?define(["vega","vega-lite"],t):(e="undefined"!=typeof
globalThis?globalThis:e||self).vegaEmbed=t(e.vega,e.vegaLite)}(this,(function(e,t){"use
strict";function n(e){if(e&&e.__esModule)return e;var
t=Object.create(null);return
e&&Object.keys(e).forEach((function(n){if("default"!==n){var
o=Object.getOwnPropertyDescriptor(e,n);Object [...]
+/*!
+ * https://github.com/Starcounter-Jack/JSON-Patch
+ * (c) 2017-2021 Joachim Wester
+ * MIT license
+ */function D(e,t){void 0===t&&(t=!1);var
n=T.get(e.object);C(n.value,e.object,e.patches,"",t),e.patches.length&&A(n.value,e.patches);var
o=e.patches;return
o.length>0&&(e.patches=[],e.callback&&e.callback(o)),o}function
C(e,t,n,o,r){if(t!==e){"function"==typeof t.toJSON&&(t=t.toJSON());for(var
i=l(t),a=l(e),s=!1,p=a.length-1;p>=0;p--){var d=e[g=a[p]];if(!c(t,g)||void
0===t[g]&&void
0!==d&&!1===Array.isArray(t))Array.isArray(e)===Array.isArray(t)?(r&&n.push({op:"test",path:o+"/"+u(g)
[...]
+/*!
*****************************************************************************
+ Copyright (c) Microsoft Corporation.
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
DIRECT,
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ PERFORMANCE OF THIS SOFTWARE.
+
***************************************************************************** */
+function(e,t){var n={};for(var o in
e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(n[o]=e[o]);if(null!=e&&"function"==typeof
Object.getOwnPropertySymbols){var
r=0;for(o=Object.getOwnPropertySymbols(e);r<o.length;r++)t.indexOf(o[r])<0&&Object.prototype.propertyIsEnumerable.call(e,o[r])&&(n[o[r]]=e[o[r]])}return
n}(r,["title","image"]);i&&(o+="<h2>".concat(t(i),"</h2>")),a&&(o+='<img
src="'.concat(t(a),'">'));const
c=Object.keys(s);if(c.length>0){o+="<table>";for(const e of [...]
+//# sourceMappingURL=vega-embed.min.js.map
diff --git
a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/[email protected]
b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/[email protected]
new file mode 100644
index 0000000000..09bd86c619
--- /dev/null
+++
b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/[email protected]
@@ -0,0 +1,2 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof
module?t(exports,require("vega")):"function"==typeof
define&&define.amd?define(["exports","vega"],t):t((e="undefined"!=typeof
globalThis?globalThis:e||self).vegaLite={},e.vega)}(this,(function(e,t){"use
strict";var
n="5.2.0";Array.prototype.flat||Object.defineProperty(Array.prototype,"flat",{configurable:!0,value:function
e(){var t=isNaN(arguments[0])?1:Number(arguments[0]);return
t?Array.prototype.reduce.call(this,(function(n, [...]
+//# sourceMappingURL=vega-lite.min.js.map
diff --git
a/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/vega.min.js
b/valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/[email protected]
similarity index 100%
rename from
valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/vega.min.js
rename to
valuetypes/vega/ui/wicket/src/main/java/org/apache/isis/valuetypes/vega/ui/wkt/components/js/[email protected]