This is an automated email from the ASF dual-hosted git repository.
gengliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push:
new 04f04e0 [SPARK-31420][WEBUI] Infinite timeline redraw in job details
page
04f04e0 is described below
commit 04f04e0ea74fd26a7bd39e833752ce277997f4dc
Author: Kousuke Saruta <[email protected]>
AuthorDate: Mon Apr 13 23:23:00 2020 -0700
[SPARK-31420][WEBUI] Infinite timeline redraw in job details page
### What changes were proposed in this pull request?
Upgrade vis.js to fix an infinite re-drawing issue.
As reported here, old releases of vis.js have that issue.
Fortunately, the latest version seems to resolve the issue.
With the latest release of vis.js, there are some performance issues with
the original `timeline-view.js` and `timeline-view.css` so I also changed them.
### Why are the changes needed?
For better UX.
### Does this PR introduce any user-facing change?
No. Appearance and functionalities are not changed.
### How was this patch tested?
I confirmed infinite redrawing doesn't happen with a JobPage which I had
reproduced the issue.
With the original version of vis.js, I reproduced the issue with the
following conditions.
* Use history server and load core/src/test/resources/spark-events.
* Visit the JobPage for job2 in application_1553914137147_0018.
* Zoom out to 80% on Safari / Chrome / Firefox.
Maybe, it depends on OS and the version of browsers.
Closes #28192 from sarutak/upgrade-visjs.
Authored-by: Kousuke Saruta <[email protected]>
Signed-off-by: Gengliang Wang <[email protected]>
---
.../org/apache/spark/ui/static/timeline-view.css | 12 -----
.../org/apache/spark/ui/static/timeline-view.js | 29 ++++++++---
.../spark/ui/static/vis-timeline-graph2d.min.css | 2 +
.../ui/static/vis-timeline-graph2d.min.css.map | 1 +
.../spark/ui/static/vis-timeline-graph2d.min.js | 60 ++++++++++++++++++++++
.../ui/static/vis-timeline-graph2d.min.js.map | 1 +
.../org/apache/spark/ui/static/vis.min.css | 1 -
.../org/apache/spark/ui/static/vis.min.js | 45 ----------------
.../main/scala/org/apache/spark/ui/UIUtils.scala | 5 +-
.../org/apache/spark/ui/UISeleniumSuite.scala | 2 +-
dev/.rat-excludes | 6 ++-
licenses-binary/LICENSE-vis-timeline.txt | 23 +++++++++
licenses-binary/LICENSE-vis.txt | 22 --------
licenses/LICENSE-vis-timeline.txt | 23 +++++++++
licenses/LICENSE-vis.txt | 22 --------
15 files changed, 140 insertions(+), 114 deletions(-)
diff --git
a/core/src/main/resources/org/apache/spark/ui/static/timeline-view.css
b/core/src/main/resources/org/apache/spark/ui/static/timeline-view.css
index 3f31403..c9bf83c 100644
--- a/core/src/main/resources/org/apache/spark/ui/static/timeline-view.css
+++ b/core/src/main/resources/org/apache/spark/ui/static/timeline-view.css
@@ -238,18 +238,6 @@ tr.corresponding-item-hover > td,
tr.corresponding-item-hover > th {
background-color: #D6FFE4 !important;
}
-#application-timeline.collapsed {
- display: none;
-}
-
-#job-timeline.collapsed {
- display: none;
-}
-
-#task-assignment-timeline.collapsed {
- display: none;
-}
-
.control-panel {
margin-bottom: 5px;
}
diff --git
a/core/src/main/resources/org/apache/spark/ui/static/timeline-view.js
b/core/src/main/resources/org/apache/spark/ui/static/timeline-view.js
index b2cd616..a63ee86 100644
--- a/core/src/main/resources/org/apache/spark/ui/static/timeline-view.js
+++ b/core/src/main/resources/org/apache/spark/ui/static/timeline-view.js
@@ -26,7 +26,7 @@ function drawApplicationTimeline(groupArray, eventObjArray,
startTime, offset) {
editable: false,
align: 'left',
showCurrentTime: false,
- min: startTime,
+ start: startTime,
zoomable: false,
moment: function (date) {
return vis.moment(date).utcOffset(offset);
@@ -50,7 +50,7 @@ function drawApplicationTimeline(groupArray, eventObjArray,
startTime, offset) {
};
$(this).click(function() {
- var jobPagePath =
$(getSelectorForJobEntry(this)).find("a.name-link").attr("href")
+ var jobPagePath =
$(getSelectorForJobEntry(this)).find("a.name-link").attr("href");
window.location.href = jobPagePath
});
@@ -75,6 +75,9 @@ function drawApplicationTimeline(groupArray, eventObjArray,
startTime, offset) {
$("#application-timeline").toggleClass('collapsed');
+ var visibilityState = status ? "" : "none";
+ $("#application-timeline").css("display", visibilityState);
+
// Switch the class of the arrow from open to closed.
$(this).find('.expand-application-timeline-arrow').toggleClass('arrow-open');
$(this).find('.expand-application-timeline-arrow').toggleClass('arrow-closed');
@@ -89,6 +92,8 @@ $(function () {
// Set it to false so that the click function can revert it
window.localStorage.setItem("expand-application-timeline", "false");
$("span.expand-application-timeline").trigger('click');
+ } else {
+ $("#application-timeline").css("display", "none");
}
});
@@ -103,7 +108,7 @@ function drawJobTimeline(groupArray, eventObjArray,
startTime, offset) {
editable: false,
align: 'left',
showCurrentTime: false,
- min: startTime,
+ start: startTime,
zoomable: false,
moment: function (date) {
return vis.moment(date).utcOffset(offset);
@@ -152,6 +157,9 @@ function drawJobTimeline(groupArray, eventObjArray,
startTime, offset) {
$("#job-timeline").toggleClass('collapsed');
+ var visibilityState = status ? "" : "none";
+ $("#job-timeline").css("display", visibilityState);
+
// Switch the class of the arrow from open to closed.
$(this).find('.expand-job-timeline-arrow').toggleClass('arrow-open');
$(this).find('.expand-job-timeline-arrow').toggleClass('arrow-closed');
@@ -166,13 +174,15 @@ $(function () {
// Set it to false so that the click function can revert it
window.localStorage.setItem("expand-job-timeline", "false");
$("span.expand-job-timeline").trigger('click');
+ } else {
+ $("#job-timeline").css("display", "none");
}
});
function drawTaskAssignmentTimeline(groupArray, eventObjArray, minLaunchTime,
maxFinishTime, offset) {
var groups = new vis.DataSet(groupArray);
var items = new vis.DataSet(eventObjArray);
- var container = $("#task-assignment-timeline")[0]
+ var container = $("#task-assignment-timeline")[0];
var options = {
groupOrder: function(a, b) {
return a.value - b.value
@@ -181,15 +191,15 @@ function drawTaskAssignmentTimeline(groupArray,
eventObjArray, minLaunchTime, ma
align: 'left',
selectable: false,
showCurrentTime: false,
- min: minLaunchTime,
- max: maxFinishTime,
+ start: minLaunchTime,
+ end: maxFinishTime,
zoomable: false,
moment: function (date) {
return vis.moment(date).utcOffset(offset);
}
};
- var taskTimeline = new vis.Timeline(container)
+ var taskTimeline = new vis.Timeline(container);
taskTimeline.setOptions(options);
taskTimeline.setGroups(groups);
taskTimeline.setItems(items);
@@ -220,6 +230,9 @@ function drawTaskAssignmentTimeline(groupArray,
eventObjArray, minLaunchTime, ma
$("#task-assignment-timeline").toggleClass("collapsed");
+ var visibilityState = status ? "" : "none";
+ $("#task-assignment-timeline").css("display", visibilityState);
+
// Switch the class of the arrow from open to closed.
$(this).find(".expand-task-assignment-timeline-arrow").toggleClass("arrow-open");
$(this).find(".expand-task-assignment-timeline-arrow").toggleClass("arrow-closed");
@@ -234,6 +247,8 @@ $(function () {
// Set it to false so that the click function can revert it
window.localStorage.setItem("expand-task-assignment-timeline", "false");
$("span.expand-task-assignment-timeline").trigger('click');
+ } else {
+ $("#task-assignment-timeline").css("display", "none");
}
});
diff --git
a/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.css
b/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.css
new file mode 100644
index 0000000..d22a9ac
--- /dev/null
+++
b/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.css
@@ -0,0 +1,2 @@
+.vis [class*=span]{min-height:0;width:auto}.vis
.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0
0 10px
#86d5f8}div.vis-configuration{position:relative;display:block;float:left;font-size:12px}div.vis-configuration-wrapper{display:block;width:700px}div.vis-configuration-wrapper:after{clear:both;content:"";display:block}div.vis-configuration.vis-config-option-container{display:block;width:495px;background-color:#fff;border:2px
solid #f7f8fa [...]
+/*# sourceMappingURL=vis-timeline-graph2d.min.css.map */
\ No newline at end of file
diff --git
a/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.css.map
b/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.css.map
new file mode 100644
index 0000000..3c165a7
--- /dev/null
+++
b/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["bootstrap.css","activator.css","configuration.css","tooltip.css","panel.css","currenttime.css","customtime.css","timeline.css","pathStyles.css","dataaxis.css","itemset.css","labelset.css","timeaxis.css","item.css"],"names":[],"mappings":"AAEA,mBACE,YAAa,CACb,UACF,CCLA,cACE,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,UAAW,CACX,WAAY,CAGZ,UACF,CAEA,YACE,2BACF,CCbA,sBACI,iBAAiB,CACjB,aAAa,CACb,UAAU,CACV,cACJ,CAEA,8BACI,aAAa,CACb,WACJ,CAEA,oCACE,UAAW,CACX,UAAW,CACX,aACF,CAEA,kDA
[...]
\ No newline at end of file
diff --git
a/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.js
b/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.js
new file mode 100644
index 0000000..df73040
--- /dev/null
+++
b/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.js
@@ -0,0 +1,60 @@
+/**
+ * vis-timeline and vis-graph2d
+ * https://visjs.github.io/vis-timeline/
+ *
+ * Create a fully customizable, interactive timeline with items and ranges.
+ *
+ * @version 7.3.4
+ * @date 2020-03-18T17:03:58.105Z
+ *
+ * @copyright (c) 2011-2017 Almende B.V, http://almende.com
+ * @copyright (c) 2017-2019 visjs contributors, https://github.com/visjs
+ *
+ * @license
+ * vis.js is dual licensed under both
+ *
+ * 1. The Apache 2.0 License
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * and
+ *
+ * 2. The MIT License
+ * http://opensource.org/licenses/MIT
+ *
+ * vis.js may be distributed under either license.
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof
module?e(exports):"function"==typeof
define&&define.amd?define(["exports"],e):e((t=t||self).vis=t.vis||{})}(this,(function(t){"use
strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof
window?window:"undefined"!=typeof global?global:"undefined"!=typeof
self?self:{};function i(){throw new Error("Dynamic requires are not currently
supported by @rollup/plugin-commonjs")}function n(t,e){return t(e={exports:{}}
[...]
+/**
+ * vis-util
+ * https://github.com/visjs/vis-util
+ *
+ * utilitie collection for visjs
+ *
+ * @version 4.0.0
+ * @date 2020-02-29T15:35:13.178Z
+ *
+ * @copyright (c) 2011-2017 Almende B.V, http://almende.com
+ * @copyright (c) 2017-2019 visjs contributors, https://github.com/visjs
+ *
+ * @license
+ * vis.js is dual licensed under both
+ *
+ * 1. The Apache 2.0 License
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * and
+ *
+ * 2. The MIT License
+ * http://opensource.org/licenses/MIT
+ *
+ * vis.js may be distributed under either license.
+ */
+function(){for(var t=arguments.length,e=new
Array(t),i=0;i<t;i++)e[i]=arguments[i];return
qo(e.length?e:[Jo()])},HSVToHex:xs,HSVToRGB:ys,RGBToHSV:gs,RGBToHex:fs,addClassName:function(t,e){var
i=t.className.split(" "),n=e.split("
");i=Pn(i).call(i,En(n).call(n,(function(t){return
Fo(i).call(i,t)<0}))),t.className=i.join(" ")},addCssText:function(t,e){var
i=function(t){for(var e=1;e<arguments.length;e++){var
i,n=null!=arguments[e]?arguments[e]:{};if(e%2)mn(i=Ko(Object(n),!0)).call(i,(funct
[...]
+/*! Hammer.JS - v2.0.17-rc - 2019-12-16
+ * http://naver.github.io/egjs
+ *
+ * Forked By Naver egjs
+ * Copyright (c) hammerjs
+ * Licensed under the MIT license */
+function yl(){return(yl=Object.assign||function(t){for(var
e=1;e<arguments.length;e++){var i=arguments[e];for(var n in
i)Object.prototype.hasOwnProperty.call(i,n)&&(t[n]=i[n])}return
t}).apply(this,arguments)}function
xl(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}function
wl(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised -
super() hasn't been called");return t}var _l,kl="function"!=typeof
Object.assign?function(t){if(null= [...]
+//# sourceMappingURL=vis-timeline-graph2d.min.js.map
diff --git
a/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.js.map
b/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.js.map
new file mode 100644
index 0000000..779880d
--- /dev/null
+++
b/core/src/main/resources/org/apache/spark/ui/static/vis-timeline-graph2d.min.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"vis-timeline-graph2d.min.js","sources":["../../node_modules/moment/moment.js","../../node_modules/core-js-pure/internals/global.js","../../node_modules/moment/locale/de.js","../../node_modules/moment/locale/es.js","../../node_modules/moment/locale/fr.js","../../node_modules/moment/locale/it.js","../../node_modules/moment/locale/ja.js","../../node_modules/moment/locale/nl.js","../../node_modules/moment/locale/pl.js","../../node_modules/moment/locale/ru.js","../../node
[...]
\ No newline at end of file
diff --git a/core/src/main/resources/org/apache/spark/ui/static/vis.min.css
b/core/src/main/resources/org/apache/spark/ui/static/vis.min.css
deleted file mode 100644
index 40d182cf..0000000
--- a/core/src/main/resources/org/apache/spark/ui/static/vis.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.vis-background,.vis-labelset,.vis-timeline{overflow:hidden}.vis
.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0
0 10px #86d5f8}.vis
[class*=span]{min-height:0;width:auto}div.vis-configuration{position:relative;display:block;float:left;font-size:12px}div.vis-configuration-wrapper{display:block;width:700px}div.vis-configuration-wrapper::after{clear:both;content:"";display:block}div.vis-configuration.vis-config-option-container{display:blo
[...]
\ No newline at end of file
diff --git a/core/src/main/resources/org/apache/spark/ui/static/vis.min.js
b/core/src/main/resources/org/apache/spark/ui/static/vis.min.js
deleted file mode 100644
index 92b8ed7..0000000
--- a/core/src/main/resources/org/apache/spark/ui/static/vis.min.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * vis.js
- * https://github.com/almende/vis
- *
- * A dynamic, browser-based visualization library.
- *
- * @version 4.16.1
- * @date 2016-04-18
- *
- * @license
- * Copyright (C) 2011-2016 Almende B.V, http://almende.com
- *
- * Vis.js is dual licensed under both
- *
- * * The Apache 2.0 License
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * and
- *
- * * The MIT License
- * http://opensource.org/licenses/MIT
- *
- * Vis.js may be distributed under either license.
- */
-"use strict";!function(t,e){"object"==typeof exports&&"object"==typeof
module?module.exports=e():"function"==typeof
define&&define.amd?define([],e):"object"==typeof
exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function
e(o){if(i[o])return i[o].exports;var n=i[o]={exports:{},id:o,loaded:!1};return
t[o].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var i={};return
e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){var
o=i(1);o.extend(e,i(7)),o.extend(e,i(24)),o.extend [...]
-i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function ae(t,e){var i;return
t.isValid()&&e.isValid()?(e=Vt(e,t),t.isBefore(e)?i=re(t,e):(i=re(e,t),i.milliseconds=-i.milliseconds,i.months=-i.months),i):{milliseconds:0,months:0}}function
he(t){return 0>t?-1*Math.round(-1*t):Math.round(t)}function de(t,e){return
function(i,o){var n,s;return null===o||isNaN(+o)||(x(e,"moment()."+e+"(period,
number) is deprecated. Please use moment()."+e+"(number,
period)."),s=i,i=o,o=s),i="string"==typeof [...]
-r.xOffset&&(t+=r.xOffset),r.yOffset&&(i+=r.yOffset),r.content&&(h.textContent=r.content),r.className&&h.setAttributeNS(null,"class",r.className+"
vis-label"),h.setAttributeNS(null,"x",t),h.setAttributeNS(null,"y",i)}return
a},e.drawBar=function(t,i,o,n,s,r,a,h){if(0!=n){0>n&&(n*=-1,i-=n);var
d=e.getSVGElement("rect",r,a);d.setAttributeNS(null,"x",t-.5*o),d.setAttributeNS(null,"y",i),d.setAttributeNS(null,"width",o),d.setAttributeNS(null,"height",n),d.setAttributeNS(null,"class",s),h&&d.s
[...]
-m.strokeStyle=this.axisColor,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke(),t=this._convert3Dto2D(new
c(this.xMax,i.getCurrent(),this.zMin)),e=this._convert3Dto2D(new
c(this.xMax-y,i.getCurrent(),this.zMin)),m.strokeStyle=this.axisColor,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke()),s=Math.sin(w)>0?this.xMin:this.xMax,n=this._convert3Dto2D(new
c(s,i.getCurrent(),this.zMin)),Math.cos(2*w)<0?(m.textAlign="center",m.textBaseline="top",n.y+=b):Math.sin(2*w)>0?(m.
[...]
-i.isFirst=!!s,i.isFinal=!!r,s&&(t.session={}),i.eventType=e,E(t,i),t.emit("hammer.input",i),t.recognize(i),t.session.prevInput=i}function
E(t,e){var
i=t.session,o=e.pointers,n=o.length;i.firstInput||(i.firstInput=N(e)),n>1&&!i.firstMultiple?i.firstMultiple=N(e):1===n&&(i.firstMultiple=!1);var
s=i.firstInput,r=i.firstMultiple,a=r?r.center:s.center,h=e.center=R(o);e.timeStamp=gt(),e.deltaTime=e.timeStamp-s.timeStamp,e.angle=B(a,h),e.distance=A(a,h),P(i,e),e.offsetDirection=L(e.deltaX,e.del
[...]
-var
o=t[0],n=t[1],s=t[2],r=t[3],a=document.createElement("input");a.className="vis-configuration
vis-config-range";try{a.type="range",a.min=n,a.max=s}catch(h){}a.step=r;var
d="",l=0;if(void 0!==e){var
c=1.2;0>e&&n>e*c?(a.min=Math.ceil(e*c),l=a.min,d="range
increased"):n>e/c&&(a.min=Math.ceil(e/c),l=a.min,d="range
increased"),e*c>s&&1!==s&&(a.max=Math.ceil(e*c),l=a.max,d="range
increased"),a.value=e}else a.value=o;var
u=document.createElement("input");u.className="vis-configuration vis-co [...]
-this.startToFront=0>=1-e,this.endToFront=0>=e-1;var
h=d.snapAwayFromHidden(this.body.hiddenDates,r,1-e,!0),l=d.snapAwayFromHidden(this.body.hiddenDates,a,e-1,!0);h==r&&l==a||(this.props.touch.start=h,this.props.touch.end=l,this.scaleOffset=1-t.scale,r=h,a=l),this.setRange(r,a,!1,!0),this.startToFront=!1,this.endToFront=!0}},o.prototype._isInsideRange=function(t){var
e=t.center?t.center.x:t.clientX;if(this.options.rtl)var
i=e-r.getAbsoluteLeft(this.body.dom.centerContainer);else var i=r.g [...]
-this.lastVisibleInterval=h,this.props.lastWidth=this.props.width;var
l=this.stackDirty,c=this._firstGroup(),u={item:t.item,axis:t.axis},p={item:t.item,axis:t.item.vertical/2},f=0,m=t.axis+t.item.vertical;return
this.groups[y].redraw(e,p,l),r.forEach(this.groups,function(t){var
i=t==c?u:p,o=t.redraw(e,i,l);s=o||s,f+=t.height}),f=Math.max(f,m),this.stackDirty=!1,a.style.height=i(f),this.props.width=a.offsetWidth,this.props.height=f,this.dom.axis.style.top=i("top"==n?this.body.domProps.top.
[...]
-return
d>t?-1:l>=t?0:1};if(e.length>0)for(s=0;s<e.length;s++)this._checkIfVisibleWithReference(e[s],r,a,i);var
u=n.binarySearchCustom(t.byStart,c,"data","start");if(this._traceVisible(u,t.byStart,r,a,function(t){return
t.data.start<d||t.data.start>l}),1==this.checkRangedItems)for(this.checkRangedItems=!1,s=0;s<t.byEnd.length;s++)this._checkIfVisibleWithReference(t.byEnd[s],r,a,i);else{var
p=n.binarySearchCustom(t.byEnd,c,"data","end");this._traceVisible(p,t.byEnd,r,a,function(t){return
t [...]
-}),t.stopPropagation()}},o.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{id:this.options.id,time:new
Date(this.customTime.valueOf())}),t.stopPropagation())},o.customTimeFromTarget=function(t){for(var
e=t.target;e;){if(e.hasOwnProperty("custom-time"))return
e["custom-time"];e=e.parentNode}return
null},t.exports=o},function(t,e){e.en={current:"current",time:"time"},e.en_EN=e.en,e.en_US=e.en,e.nl={current:"huidige",time:"tijd"},e.nl_NL=e.
[...]
-this.props.height=this.body.domProps.right.height),t=this._redrawLabels(),t=this._isResized()||t,this.options.icons===!0?this._redrawGroupIcons():this._cleanupIcons(),this._redrawTitle(s)}return
t},o.prototype._redrawLabels=function(){var
t=this,e=!1;s.prepareElements(this.DOMelements.lines),s.prepareElements(this.DOMelements.labels);var
i=this.options.orientation,o=void
0!=this.options[i].range?this.options[i].range:{},n=!0;void
0!=o.max&&(this.range.end=o.max,n=!1);var r=!0;void 0!=o.m [...]
-},functions:{createNode:function(){},createEdge:function(){},getPointer:function(){}},modules:{},view:{scale:1,translation:{x:0,y:0}}},this.bindEventListeners(),this.images=new
r["default"](function(){return
o.body.emitter.emit("_requestRedraw")}),this.groups=new
h["default"],this.canvas=new w["default"](this.body),this.selectionHandler=new
D["default"](this.body,this.canvas),this.interactionHandler=new
O["default"](this.body,this.canvas,this.selectionHandler),this.view=new
x["default"]( [...]
-this._drawBackground(t),this._drawText(t,o,e,i,n))}}},{key:"_drawBackground",value:function(t){if(void
0!==this.fontOptions.background&&"none"!==this.fontOptions.background){t.fillStyle=this.fontOptions.background;var
e=2;if(this.isEdgeLabel)switch(this.fontOptions.align){case"middle":t.fillRect(.5*-this.size.width,.5*-this.size.height,this.size.width,this.size.height);break;case"top":t.fillRect(.5*-this.size.width,-(this.size.height+e),this.size.width,this.size.height);break;case"bottom
[...]
-value:function(t,e){return
this._distanceToBorder(t,e)}}]),e}(d["default"]);e["default"]=l},function(t,e,i){function
o(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){if(!(t instanceof
e))throw new TypeError("Cannot call a class as a function")}function
s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super()
hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof
e?t:e}function r(t,e){if("function"!=typeof e&&null!==e)throw new
TypeError("Sup [...]
-m=p-f,!(Math.abs(m)<v));)m>0?a>0?s=g:r=g:a>0?r=g:s=g,d++;return
c.t=g,c}},{key:"getLineWidth",value:function(t,e){return
t===!0?Math.max(this.selectionWidth,.3/this.body.view.scale):e===!0?Math.max(this.hoverWidth,.3/this.body.view.scale):Math.max(this.options.width,.3/this.body.view.scale)}},{key:"getColor",value:function(t,e,i){var
o=this.options.color;if(o.inherit!==!1){if("both"===o.inherit&&this.from.id!==this.to.id){var
n=t.createLinearGradient(this.from.x,this.from.y,this.to.x,thi [...]
-e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}}]),t}();e["default"]=n},function(t,e){function
i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a
function")}Object.defineProperty(e,"__esModule",{value:!0});var
o=function(){function t(t,e){for(var i=0;i<e.length;i++){var
o=e[i];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in
o&&(o.writable=!0),Object.defineProp [...]
-this.frame.canvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var
e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error:
your browser does not support HTML
canvas",this.frame.canvas.appendChild(e)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}},{key:"_bi
[...]
-return o.length>0?e===!0?this.body.nodes[o[o.length-1]]:o[o.length-1]:void
0}},{key:"_getEdgesOverlappingWith",value:function(t,e){for(var
i=this.body.edges,o=0;o<this.body.edgeIndices.length;o++){var
n=this.body.edgeIndices[o];i[n].isOverlappingWith(t)&&e.push(n)}}},{key:"_getAllEdgesOverlappingWith",value:function(t){var
e=[];return
this._getEdgesOverlappingWith(t,e),e}},{key:"getEdgeAt",value:function(t){var
e=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],i=this._pointerT
[...]
-if(i.x=e.x,i.y=e.y,2!==this.options.editNode.length)throw new Error("The
function for edit does not support two arguments (data,
callback)");this.options.editNode(i,function(e){null!==e&&void
0!==e&&"editNode"===t.inMode&&t.body.data.nodes.getDataSet().update(e),t.showManipulatorToolbar()})}else
alert(this.options.locales[this.options.locale].editClusterError||this.options.locales.en.editClusterError)}else
this.showManipulatorToolbar()}},{key:"addEdgeMode",value:function(){if(this.editMo
[...]
-this.lineTo(t+n,e-s),this.lineTo(t-n,e-s),this.lineTo(t,e+(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath(),i*=.82,e+=.1*i;for(var
o=0;10>o;o++){var
n=o%2===0?1.3*i:.5*i;this.lineTo(t+n*Math.sin(2*o*Math.PI/10),e-n*Math.cos(2*o*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.diamond=function(t,e,i){this.beginPath(),this.lineTo(t,e+i),this.lineTo(t+i,e),this.lineTo(t,e-i),this.lineTo(t-i,e),this.closePath()},CanvasRendering
[...]
-//# sourceMappingURL=vis.map
diff --git a/core/src/main/scala/org/apache/spark/ui/UIUtils.scala
b/core/src/main/scala/org/apache/spark/ui/UIUtils.scala
index c84bc1f..9016785 100644
--- a/core/src/main/scala/org/apache/spark/ui/UIUtils.scala
+++ b/core/src/main/scala/org/apache/spark/ui/UIUtils.scala
@@ -225,13 +225,14 @@ private[spark] object UIUtils extends Logging {
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet"
href={prependBaseUri(request, "/static/bootstrap.min.css")}
type="text/css"/>
- <link rel="stylesheet" href={prependBaseUri(request,
"/static/vis.min.css")} type="text/css"/>
+ <link rel="stylesheet"
+ href={prependBaseUri(request,
"/static/vis-timeline-graph2d.min.css")} type="text/css"/>
<link rel="stylesheet" href={prependBaseUri(request, "/static/webui.css")}
type="text/css"/>
<link rel="stylesheet"
href={prependBaseUri(request, "/static/timeline-view.css")}
type="text/css"/>
<script src={prependBaseUri(request, "/static/sorttable.js")} ></script>
<script src={prependBaseUri(request,
"/static/jquery-3.4.1.min.js")}></script>
- <script src={prependBaseUri(request, "/static/vis.min.js")}></script>
+ <script src={prependBaseUri(request,
"/static/vis-timeline-graph2d.min.js")}></script>
<script src={prependBaseUri(request,
"/static/bootstrap.bundle.min.js")}></script>
<script src={prependBaseUri(request,
"/static/initialize-tooltips.js")}></script>
<script src={prependBaseUri(request, "/static/table.js")}></script>
diff --git a/core/src/test/scala/org/apache/spark/ui/UISeleniumSuite.scala
b/core/src/test/scala/org/apache/spark/ui/UISeleniumSuite.scala
index 9f0cdea..757e03b 100644
--- a/core/src/test/scala/org/apache/spark/ui/UISeleniumSuite.scala
+++ b/core/src/test/scala/org/apache/spark/ui/UISeleniumSuite.scala
@@ -47,7 +47,7 @@ import org.apache.spark.status.api.v1.{JacksonMessageWriter,
RDDDataDistribution
private[spark] class SparkUICssErrorHandler extends DefaultCssErrorHandler {
- private val cssWhiteList = List("bootstrap.min.css", "vis.min.css")
+ private val cssWhiteList = List("bootstrap.min.css",
"vis-timeline-graph2d.min.css")
private def isInWhileList(uri: String): Boolean =
cssWhiteList.exists(uri.endsWith)
diff --git a/dev/.rat-excludes b/dev/.rat-excludes
index b1a8494..473551f 100644
--- a/dev/.rat-excludes
+++ b/dev/.rat-excludes
@@ -31,8 +31,10 @@ d3.min.js
dagre-d3.min.js
graphlib-dot.min.js
sorttable.js
-vis.min.js
-vis.min.css
+vis-timeline-graph2d.min.js
+vis-timeline-graph2d.min.js.map
+vis-timeline-graph2d.min.css
+vis-timeline-graph2d.min.css.map
dataTables.bootstrap4.1.10.20.min.css
dataTables.bootstrap4.1.10.20.min.js
dataTables.rowsGroup.js
diff --git a/licenses-binary/LICENSE-vis-timeline.txt
b/licenses-binary/LICENSE-vis-timeline.txt
new file mode 100644
index 0000000..d343783
--- /dev/null
+++ b/licenses-binary/LICENSE-vis-timeline.txt
@@ -0,0 +1,23 @@
+vis-timeline and vis-graph2d
+https://visjs.github.io/vis-timeline/
+
+Create a fully customizable, interactive timeline with items and ranges.
+
+@version 7.3.4
+@date 2020-03-18T17:03:58.105Z
+
+@copyright (c) 2011-2017 Almende B.V, http://almende.com
+@copyright (c) 2017-2019 visjs contributors, https://github.com/visjs
+
+@license
+vis.js is dual licensed under both
+
+ 1. The Apache 2.0 License
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ and
+
+ 2. The MIT License
+ http://opensource.org/licenses/MIT
+
+vis.js may be distributed under either license.
diff --git a/licenses-binary/LICENSE-vis.txt b/licenses-binary/LICENSE-vis.txt
deleted file mode 100644
index 18b7323..0000000
--- a/licenses-binary/LICENSE-vis.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-vis.js
-https://github.com/almende/vis
-
-A dynamic, browser-based visualization library.
-
-@version 4.16.1
-@date 2016-04-18
-
-@license
-Copyright (C) 2011-2016 Almende B.V, http://almende.com
-
-Vis.js is dual licensed under both
-
-* The Apache 2.0 License
- http://www.apache.org/licenses/LICENSE-2.0
-
-and
-
-* The MIT License
- http://opensource.org/licenses/MIT
-
-Vis.js may be distributed under either license.
\ No newline at end of file
diff --git a/licenses/LICENSE-vis-timeline.txt
b/licenses/LICENSE-vis-timeline.txt
new file mode 100644
index 0000000..d343783
--- /dev/null
+++ b/licenses/LICENSE-vis-timeline.txt
@@ -0,0 +1,23 @@
+vis-timeline and vis-graph2d
+https://visjs.github.io/vis-timeline/
+
+Create a fully customizable, interactive timeline with items and ranges.
+
+@version 7.3.4
+@date 2020-03-18T17:03:58.105Z
+
+@copyright (c) 2011-2017 Almende B.V, http://almende.com
+@copyright (c) 2017-2019 visjs contributors, https://github.com/visjs
+
+@license
+vis.js is dual licensed under both
+
+ 1. The Apache 2.0 License
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ and
+
+ 2. The MIT License
+ http://opensource.org/licenses/MIT
+
+vis.js may be distributed under either license.
diff --git a/licenses/LICENSE-vis.txt b/licenses/LICENSE-vis.txt
deleted file mode 100644
index 18b7323..0000000
--- a/licenses/LICENSE-vis.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-vis.js
-https://github.com/almende/vis
-
-A dynamic, browser-based visualization library.
-
-@version 4.16.1
-@date 2016-04-18
-
-@license
-Copyright (C) 2011-2016 Almende B.V, http://almende.com
-
-Vis.js is dual licensed under both
-
-* The Apache 2.0 License
- http://www.apache.org/licenses/LICENSE-2.0
-
-and
-
-* The MIT License
- http://opensource.org/licenses/MIT
-
-Vis.js may be distributed under either license.
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]