From f74199e60f1b7fb3582754ba7277952fa9e0989f Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 20 May 2015 14:02:53 -0700 Subject: [PATCH 1/8] [Layout] Add check to view in frame Add check to template for views in frame to avoid populating frame prematurely; WTD-1182. --- platform/features/layout/res/templates/frame.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/features/layout/res/templates/frame.html b/platform/features/layout/res/templates/frame.html index cf4149947f..bb3a61ab56 100644 --- a/platform/features/layout/res/templates/frame.html +++ b/platform/features/layout/res/templates/frame.html @@ -14,7 +14,7 @@
+ mct-object="representation.selected.key && domainObject">
\ No newline at end of file From 9b6d8cf1ec0ccfce3168b61a2d01a642a9290f5b Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 20 May 2015 16:26:28 -0700 Subject: [PATCH 2/8] [Representation] Minimize scope reuse When switching among domain objects and/or views, avoid reusing the same information is scope. The wrong information in scope can cause various failures in views, such as WTD-1182. --- .../features/layout/src/LayoutController.js | 3 ++ .../representation/src/MCTRepresentation.js | 34 +++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/platform/features/layout/src/LayoutController.js b/platform/features/layout/src/LayoutController.js index c8e057d0f8..f3d44110b5 100644 --- a/platform/features/layout/src/LayoutController.js +++ b/platform/features/layout/src/LayoutController.js @@ -69,6 +69,9 @@ define( function lookupPanels(ids) { var configuration = $scope.configuration || {}; + // Ensure ids is array-like + ids = ids || []; + // Pull panel positions from configuration rawPositions = shallowCopy(configuration.panels || {}, ids); diff --git a/platform/representation/src/MCTRepresentation.js b/platform/representation/src/MCTRepresentation.js index 4d44d39c7a..7381ce653c 100644 --- a/platform/representation/src/MCTRepresentation.js +++ b/platform/representation/src/MCTRepresentation.js @@ -72,15 +72,18 @@ define( function link($scope, element, attrs) { var activeRepresenters = representers.map(function (Representer) { - return new Representer($scope, element, attrs); - }); + return new Representer($scope, element, attrs); + }), + toClear = [], // Properties to clear out of scope on change + counter = 0; // Populate scope with any capabilities indicated by the // representation's extension definition function refreshCapabilities() { var domainObject = $scope.domainObject, representation = lookup($scope.key, domainObject), - uses = ((representation || {}).uses || []); + uses = ((representation || {}).uses || []), + myCounter = counter; if (domainObject) { // Update model @@ -94,10 +97,16 @@ define( " for representation ", $scope.key ].join("")); + $q.when( domainObject.useCapability(used) ).then(function (c) { - $scope[used] = c; + // Avoid clobbering capabilities from + // subsequent representations; + // Angular reuses scopes. + if (counter === myCounter) { + $scope[used] = c; + } }); }); } @@ -109,8 +118,7 @@ define( function refresh() { var domainObject = $scope.domainObject, representation = lookup($scope.key, domainObject), - uses = ((representation || {}).uses || []), - gestureKeys = ((representation || {}).gestures || []); + uses = ((representation || {}).uses || []); // Create an empty object named "representation", for this // representation to store local variables into. @@ -131,9 +139,19 @@ define( $log.warn("No representation found for " + $scope.key); } + // Clear out the scope from the last representation + toClear.forEach(function (property) { + delete $scope[property]; + }); + // Populate scope with fields associated with the current // domain object (if one has been passed in) if (domainObject) { + // Track how many representations we've made in this scope, + // to ensure that the correct representations are matched to + // the correct object/key pairs. + counter += 1; + // Initialize any capabilities refreshCapabilities(); @@ -147,6 +165,10 @@ define( activeRepresenters.forEach(function (representer) { representer.represent(representation, domainObject); }); + + // Track which properties we want to clear from scope + // next change object/key pair changes + toClear = uses.concat(['model']); } } From cde173dbdc8afc5c2f69a956cc8e2bc24a59ce18 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 20 May 2015 16:39:49 -0700 Subject: [PATCH 3/8] [Representation] Add test for scope clearing Add test clearing to verify that scope gets cleared on view changes, WTD-1182. --- .../test/MCTRepresentationSpec.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/platform/representation/test/MCTRepresentationSpec.js b/platform/representation/test/MCTRepresentationSpec.js index 835c40b71b..45e88daca5 100644 --- a/platform/representation/test/MCTRepresentationSpec.js +++ b/platform/representation/test/MCTRepresentationSpec.js @@ -160,6 +160,25 @@ define( // Should have gotten a warning - that's an unknown key expect(mockLog.warn).toHaveBeenCalled(); }); + + it("clears out obsolete peroperties from scope", function () { + mctRepresentation.link(mockScope, mockElement); + + mockScope.key = "def"; + mockScope.domainObject = mockDomainObject; + mockDomainObject.useCapability.andReturn("some value"); + + // Trigger the watch + mockScope.$watch.calls[0].args[1](); + expect(mockScope.testCapability).toBeDefined(); + + // Change the view + mockScope.key = "xyz"; + + // Trigger the watch again; should clear capability from scope + mockScope.$watch.calls[0].args[1](); + expect(mockScope.testCapability).toBeUndefined(); + }); }); } ); \ No newline at end of file From a18a7c99608a517503f632b84cbabc3005d52e5f Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 3 Jun 2015 07:49:11 -0700 Subject: [PATCH 4/8] [Layout] Fix comment Change inaccurate comment based on feedback from code review for WTD-1182. --- platform/features/layout/src/LayoutController.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/features/layout/src/LayoutController.js b/platform/features/layout/src/LayoutController.js index f3d44110b5..9212f900b3 100644 --- a/platform/features/layout/src/LayoutController.js +++ b/platform/features/layout/src/LayoutController.js @@ -69,7 +69,8 @@ define( function lookupPanels(ids) { var configuration = $scope.configuration || {}; - // Ensure ids is array-like + // ids is read from model.composition and may be undefined; + // fall back to an array if that occurs ids = ids || []; // Pull panel positions from configuration From dac44623ee2488e43e9718bf4bc1fde76f1d9c9f Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 19 Jun 2015 15:47:22 -0700 Subject: [PATCH 5/8] [Plot] Begin adding WebGL fallback Begin adding code to handle case where WebGL context is lost, WTD-475. --- platform/features/plot/src/MCTChart.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/platform/features/plot/src/MCTChart.js b/platform/features/plot/src/MCTChart.js index b8350e9171..d07eb398aa 100644 --- a/platform/features/plot/src/MCTChart.js +++ b/platform/features/plot/src/MCTChart.js @@ -155,6 +155,15 @@ define( } } + function fallbackFromWebGL() { + element.html(TEMPLATE); + canvas = element.find("canvas")[0]; + chart = getChart([Canvas2DChart], canvas); + if (chart) { + doDraw(scope.draw); + } + } + // Try to initialize a chart. chart = getChart([GLChart, Canvas2DChart], canvas); @@ -192,4 +201,4 @@ define( return MCTChart; } -); \ No newline at end of file +); From b6fdf4d6ab815718d3e3210a0947f25850f1df52 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 19 Jun 2015 16:02:52 -0700 Subject: [PATCH 6/8] [Plot] Fall back from WebGL on context loss When a WebGL context is loss, fall back to displaying plots using regular canvas 2d API. WTD-475. --- platform/features/plot/src/MCTChart.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/platform/features/plot/src/MCTChart.js b/platform/features/plot/src/MCTChart.js index d07eb398aa..2ca51b2309 100644 --- a/platform/features/plot/src/MCTChart.js +++ b/platform/features/plot/src/MCTChart.js @@ -155,6 +155,7 @@ define( } } + // Switch from WebGL to plain 2D if context is lost function fallbackFromWebGL() { element.html(TEMPLATE); canvas = element.find("canvas")[0]; @@ -173,6 +174,11 @@ define( return; } + // WebGL is a bit of a special case; it may work, then fail + // later for various reasons, so we need to listen for this + // and fall back to plain canvas drawing when it occurs. + canvas.addEventListener("webglcontextlost", fallbackFromWebGL); + // Check for resize, on a timer activeInterval = $interval(drawIfResized, 1000); From 5ca954deafa9bd11655a8494c3e36fd6e402559a Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 19 Jun 2015 16:14:49 -0700 Subject: [PATCH 7/8] [Plot] Test fallback on webglcontextlost Add test case to verify that fallback occurs when a WebGL context is lost, WTD-475. --- platform/features/plot/test/MCTChartSpec.js | 22 +++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/platform/features/plot/test/MCTChartSpec.js b/platform/features/plot/test/MCTChartSpec.js index 93be797114..9c60b034a6 100644 --- a/platform/features/plot/test/MCTChartSpec.js +++ b/platform/features/plot/test/MCTChartSpec.js @@ -36,6 +36,7 @@ define( mockElement, mockCanvas, mockGL, + mockC2d, mockPromise, mctChart; @@ -47,13 +48,14 @@ define( mockScope = jasmine.createSpyObj("$scope", ["$watchCollection", "$on"]); mockElement = - jasmine.createSpyObj("element", ["find"]); + jasmine.createSpyObj("element", ["find", "html"]); mockInterval.cancel = jasmine.createSpy("cancelInterval"); mockPromise = jasmine.createSpyObj("promise", ["then"]); // mct-chart uses GLChart, so it needs WebGL API - mockCanvas = jasmine.createSpyObj("canvas", [ "getContext" ]); + mockCanvas = + jasmine.createSpyObj("canvas", [ "getContext", "addEventListener" ]); mockGL = jasmine.createSpyObj( "gl", [ @@ -81,6 +83,7 @@ define( "drawArrays" ] ); + mockC2d = jasmine.createSpyObj('c2d', ['clearRect']); mockGL.ARRAY_BUFFER = "ARRAY_BUFFER"; mockGL.DYNAMIC_DRAW = "DYNAMIC_DRAW"; mockGL.TRIANGLE_FAN = "TRIANGLE_FAN"; @@ -93,7 +96,9 @@ define( }); mockElement.find.andReturn([mockCanvas]); - mockCanvas.getContext.andReturn(mockGL); + mockCanvas.getContext.andCallFake(function (type) { + return { webgl: mockGL, '2d': mockC2d }[type]; + }); mockInterval.andReturn(mockPromise); mctChart = new MCTChart(mockInterval, mockLog); @@ -169,6 +174,15 @@ define( expect(mockLog.warn).toHaveBeenCalled(); }); + it("falls back to Canvas 2d API if WebGL context is lost", function () { + mctChart.link(mockScope, mockElement); + expect(mockCanvas.addEventListener) + .toHaveBeenCalledWith("webglcontextlost", jasmine.any(Function)); + expect(mockCanvas.getContext).not.toHaveBeenCalledWith('2d'); + mockCanvas.addEventListener.mostRecentCall.args[1](); + expect(mockCanvas.getContext).toHaveBeenCalledWith('2d'); + }); + it("logs nothing in nominal situations (WebGL available)", function () { // Complement the previous test mctChart.link(mockScope, mockElement); @@ -197,4 +211,4 @@ define( }); } -); \ No newline at end of file +); From 273ce42c16e2a2e2fc44199e26425ff6180bdbe4 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Thu, 18 Jun 2015 15:18:42 -0700 Subject: [PATCH 8/8] [Frontend] Fix to prevent infobubbles from preventing clicks Added CSS class "bubble-container" to BUBBLE_TEMPLATE; bubble-container utilizes CSS "pointer-events: none"; Changed INFO_HOVER_DELAY constant from 500ms to 2000ms; --- .../general/res/css/theme-espresso.css | 74 ++++++++++--------- .../general/res/sass/helpers/_bubbles.scss | 7 ++ platform/commonUI/inspect/bundle.json | 2 +- .../commonUI/inspect/res/info-bubble.html | 8 +- .../commonUI/inspect/src/InfoConstants.js | 3 +- 5 files changed, 54 insertions(+), 40 deletions(-) diff --git a/platform/commonUI/general/res/css/theme-espresso.css b/platform/commonUI/general/res/css/theme-espresso.css index 5a8bcac07a..84a3ed5925 100644 --- a/platform/commonUI/general/res/css/theme-espresso.css +++ b/platform/commonUI/general/res/css/theme-espresso.css @@ -84,7 +84,7 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -/* line 5, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 5, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, @@ -105,38 +105,38 @@ time, mark, audio, video { font-size: 100%; vertical-align: baseline; } -/* line 22, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 22, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ html { line-height: 1; } -/* line 24, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 24, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ ol, ul { list-style: none; } -/* line 26, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 26, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ table { border-collapse: collapse; border-spacing: 0; } -/* line 28, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 28, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ caption, th, td { text-align: left; font-weight: normal; vertical-align: middle; } -/* line 30, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 30, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ q, blockquote { quotes: none; } - /* line 103, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ + /* line 103, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ q:before, q:after, blockquote:before, blockquote:after { content: ""; content: none; } -/* line 32, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 32, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ a img { border: none; } -/* line 116, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 116, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } @@ -4219,51 +4219,55 @@ input[type="text"] { * at runtime from the About dialog for additional information. *****************************************************************************/ /* line 24, ../sass/helpers/_bubbles.scss */ +.bubble-container { + pointer-events: none; } + +/* line 31, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper { -moz-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; position: relative; z-index: 50; } - /* line 29, ../sass/helpers/_bubbles.scss */ + /* line 36, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper .l-infobubble { display: inline-block; min-width: 100px; max-width: 300px; padding: 5px 10px; } - /* line 34, ../sass/helpers/_bubbles.scss */ + /* line 41, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper .l-infobubble:before { content: ""; position: absolute; width: 0; height: 0; } - /* line 40, ../sass/helpers/_bubbles.scss */ + /* line 47, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper .l-infobubble table { width: 100%; } - /* line 43, ../sass/helpers/_bubbles.scss */ + /* line 50, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper .l-infobubble table tr td { padding: 2px 0; vertical-align: top; } - /* line 50, ../sass/helpers/_bubbles.scss */ + /* line 57, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper .l-infobubble table tr td.label { padding-right: 10px; white-space: nowrap; } - /* line 54, ../sass/helpers/_bubbles.scss */ + /* line 61, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper .l-infobubble table tr td.value { white-space: nowrap; } - /* line 58, ../sass/helpers/_bubbles.scss */ + /* line 65, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper .l-infobubble table tr td.align-wrap { white-space: normal; } - /* line 64, ../sass/helpers/_bubbles.scss */ + /* line 71, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper .l-infobubble .title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-bottom: 5px; } - /* line 71, ../sass/helpers/_bubbles.scss */ + /* line 78, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper.arw-left { margin-left: 20px; } - /* line 73, ../sass/helpers/_bubbles.scss */ + /* line 80, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper.arw-left .l-infobubble::before { right: 100%; width: 0; @@ -4271,10 +4275,10 @@ input[type="text"] { border-top: 6.66667px solid transparent; border-bottom: 6.66667px solid transparent; border-right: 10px solid #ddd; } - /* line 79, ../sass/helpers/_bubbles.scss */ + /* line 86, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper.arw-right { margin-right: 20px; } - /* line 81, ../sass/helpers/_bubbles.scss */ + /* line 88, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper.arw-right .l-infobubble::before { left: 100%; width: 0; @@ -4282,16 +4286,16 @@ input[type="text"] { border-top: 6.66667px solid transparent; border-bottom: 6.66667px solid transparent; border-left: 10px solid #ddd; } - /* line 88, ../sass/helpers/_bubbles.scss */ + /* line 95, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper.arw-top .l-infobubble::before { top: 20px; } - /* line 94, ../sass/helpers/_bubbles.scss */ + /* line 101, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper.arw-btm .l-infobubble::before { bottom: 20px; } - /* line 99, ../sass/helpers/_bubbles.scss */ + /* line 106, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper.arw-down { margin-bottom: 10px; } - /* line 101, ../sass/helpers/_bubbles.scss */ + /* line 108, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper.arw-down .l-infobubble::before { left: 50%; top: 100%; @@ -4299,21 +4303,21 @@ input[type="text"] { border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 7.5px solid #ddd; } - /* line 110, ../sass/helpers/_bubbles.scss */ + /* line 117, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper .arw { z-index: 2; } - /* line 113, ../sass/helpers/_bubbles.scss */ + /* line 120, ../sass/helpers/_bubbles.scss */ .l-infobubble-wrapper.arw-up .arw.arw-down, .l-infobubble-wrapper.arw-down .arw.arw-up { display: none; } -/* line 120, ../sass/helpers/_bubbles.scss */ +/* line 127, ../sass/helpers/_bubbles.scss */ .l-thumbsbubble-wrapper .arw-up { width: 0; height: 0; border-left: 6.66667px solid transparent; border-right: 6.66667px solid transparent; border-bottom: 10px solid #4d4d4d; } -/* line 123, ../sass/helpers/_bubbles.scss */ +/* line 130, ../sass/helpers/_bubbles.scss */ .l-thumbsbubble-wrapper .arw-down { width: 0; height: 0; @@ -4321,7 +4325,7 @@ input[type="text"] { border-right: 6.66667px solid transparent; border-top: 10px solid #4d4d4d; } -/* line 127, ../sass/helpers/_bubbles.scss */ +/* line 134, ../sass/helpers/_bubbles.scss */ .s-infobubble { -moz-border-radius: 2px; -webkit-border-radius: 2px; @@ -4332,22 +4336,22 @@ input[type="text"] { background: #ddd; color: #666; font-size: 0.8rem; } - /* line 134, ../sass/helpers/_bubbles.scss */ + /* line 141, ../sass/helpers/_bubbles.scss */ .s-infobubble .title { color: #333333; font-weight: bold; } - /* line 139, ../sass/helpers/_bubbles.scss */ + /* line 146, ../sass/helpers/_bubbles.scss */ .s-infobubble tr td { border-top: 1px solid #c4c4c4; font-size: 0.9em; } - /* line 143, ../sass/helpers/_bubbles.scss */ + /* line 150, ../sass/helpers/_bubbles.scss */ .s-infobubble tr:first-child td { border-top: none; } - /* line 147, ../sass/helpers/_bubbles.scss */ + /* line 154, ../sass/helpers/_bubbles.scss */ .s-infobubble .value { color: #333333; } -/* line 152, ../sass/helpers/_bubbles.scss */ +/* line 159, ../sass/helpers/_bubbles.scss */ .s-thumbsbubble { background: #4d4d4d; color: #b3b3b3; } diff --git a/platform/commonUI/general/res/sass/helpers/_bubbles.scss b/platform/commonUI/general/res/sass/helpers/_bubbles.scss index e9648523c4..5b174ba6da 100644 --- a/platform/commonUI/general/res/sass/helpers/_bubbles.scss +++ b/platform/commonUI/general/res/sass/helpers/_bubbles.scss @@ -19,6 +19,13 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ + +//************************************************* GENERAL +.bubble-container { + pointer-events: none; +} + + //************************************************* LAYOUT .l-infobubble-wrapper { diff --git a/platform/commonUI/inspect/bundle.json b/platform/commonUI/inspect/bundle.json index 07506d0983..51244b2bf2 100644 --- a/platform/commonUI/inspect/bundle.json +++ b/platform/commonUI/inspect/bundle.json @@ -44,7 +44,7 @@ "constants": [ { "key": "INFO_HOVER_DELAY", - "value": 500 + "value": 2000 } ] } diff --git a/platform/commonUI/inspect/res/info-bubble.html b/platform/commonUI/inspect/res/info-bubble.html index 1deeeade15..82545cb29e 100644 --- a/platform/commonUI/inspect/res/info-bubble.html +++ b/platform/commonUI/inspect/res/info-bubble.html @@ -1,6 +1,8 @@ - + diff --git a/platform/commonUI/inspect/src/InfoConstants.js b/platform/commonUI/inspect/src/InfoConstants.js index 86570911c6..5e43a1b618 100644 --- a/platform/commonUI/inspect/src/InfoConstants.js +++ b/platform/commonUI/inspect/src/InfoConstants.js @@ -23,7 +23,8 @@ define({ BUBBLE_TEMPLATE: "" + + "bubble-layout=\"{{bubbleLayout}}\" " + + "class=\"bubble-container\">" + "" + "" + "",