diff --git a/platform/features/layout/src/FixedController.js b/platform/features/layout/src/FixedController.js index c190170505..e461568853 100644 --- a/platform/features/layout/src/FixedController.js +++ b/platform/features/layout/src/FixedController.js @@ -256,6 +256,11 @@ define( // Position a panel after a drop event function handleDrop(e, id, position) { + // Don't handle this event if it has already been handled + if (e.defaultPrevented) { + return; + } + e.preventDefault(); // Store the position of this element. addElement({ type: "fixed.telemetry", diff --git a/platform/features/layout/src/LayoutController.js b/platform/features/layout/src/LayoutController.js index fc6c8aafba..1c58f92988 100644 --- a/platform/features/layout/src/LayoutController.js +++ b/platform/features/layout/src/LayoutController.js @@ -109,6 +109,9 @@ define( // Position a panel after a drop event function handleDrop(e, id, position) { + if (e.defaultPrevented) { + return; + } // Ensure that configuration field is populated $scope.configuration = $scope.configuration || {}; // Make sure there is a "panels" field in the @@ -129,6 +132,10 @@ define( } // Populate template-facing position for this id populatePosition(id); + // Layout may contain embedded views which will + // listen for drops, so call preventDefault() so + // that they can recognize that this event is handled. + e.preventDefault(); } // Position panes when the model field changes @@ -220,4 +227,4 @@ define( return LayoutController; } -); \ No newline at end of file +); diff --git a/platform/features/layout/test/FixedControllerSpec.js b/platform/features/layout/test/FixedControllerSpec.js index 0dae9e5597..4f3d548908 100644 --- a/platform/features/layout/test/FixedControllerSpec.js +++ b/platform/features/layout/test/FixedControllerSpec.js @@ -34,6 +34,7 @@ define( mockFormatter, mockDomainObject, mockSubscription, + mockEvent, testGrid, testModel, testValues, @@ -98,6 +99,10 @@ define( 'subscription', [ 'unsubscribe', 'getTelemetryObjects', 'getRangeValue', 'getDatum' ] ); + mockEvent = jasmine.createSpyObj( + 'event', + [ 'preventDefault' ] + ); testGrid = [ 123, 456 ]; testModel = { @@ -302,7 +307,7 @@ define( // Notify that a drop occurred testModel.composition.push('d'); findOn('mctDrop')( - {}, + mockEvent, 'd', { x: 300, y: 100 } ); @@ -310,12 +315,31 @@ define( // Should have added an element expect(testConfiguration.elements.length).toEqual(4); + // ...and prevented default... + expect(mockEvent.preventDefault).toHaveBeenCalled(); + // Should have triggered commit (provided by // EditRepresenter) with some message. expect(mockScope.commit) .toHaveBeenCalledWith(jasmine.any(String)); }); + it("ignores drops when default has been prevented", function () { + // Avoids redundant drop-handling, WTD-1233 + mockEvent.defaultPrevented = true; + + // Notify that a drop occurred + testModel.composition.push('d'); + findOn('mctDrop')( + mockEvent, + 'd', + { x: 300, y: 100 } + ); + + // Should NOT have added an element + expect(testConfiguration.elements.length).toEqual(3); + }); + it("unsubscribes when destroyed", function () { // Make an object available findWatch('domainObject')(mockDomainObject); diff --git a/platform/features/layout/test/LayoutControllerSpec.js b/platform/features/layout/test/LayoutControllerSpec.js index 95134c298b..5ec80755f4 100644 --- a/platform/features/layout/test/LayoutControllerSpec.js +++ b/platform/features/layout/test/LayoutControllerSpec.js @@ -28,6 +28,7 @@ define( describe("The Layout controller", function () { var mockScope, + mockEvent, testModel, testConfiguration, controller; @@ -37,6 +38,10 @@ define( "$scope", [ "$watch", "$on", "commit" ] ); + mockEvent = jasmine.createSpyObj( + 'event', + [ 'preventDefault' ] + ); testModel = { composition: [ "a", "b", "c" ] @@ -144,17 +149,32 @@ define( // Notify that a drop occurred testModel.composition.push('d'); mockScope.$on.mostRecentCall.args[1]( - {}, + mockEvent, 'd', { x: 300, y: 100 } ); expect(testConfiguration.panels.d).toBeDefined(); + expect(mockEvent.preventDefault).toHaveBeenCalled(); // Should have triggered commit (provided by // EditRepresenter) with some message. expect(mockScope.commit) .toHaveBeenCalledWith(jasmine.any(String)); }); + + it("ignores drops when default has been prevented", function () { + // Avoids redundant drop-handling, WTD-1233 + mockEvent.defaultPrevented = true; + + // Notify that a drop occurred + testModel.composition.push('d'); + mockScope.$on.mostRecentCall.args[1]( + mockEvent, + 'd', + { x: 300, y: 100 } + ); + expect(testConfiguration.panels.d).not.toBeDefined(); + }); }); } -); \ No newline at end of file +); diff --git a/platform/persistence/elastic/bundle.json b/platform/persistence/elastic/bundle.json index 371b8aa17a..e7dfa1ab9d 100644 --- a/platform/persistence/elastic/bundle.json +++ b/platform/persistence/elastic/bundle.json @@ -17,7 +17,7 @@ }, { "key": "ELASTIC_ROOT", - "value": "/elastic", + "value": "http://localhost:9200", "priority": "fallback" }, { @@ -43,4 +43,4 @@ } ] } -} \ No newline at end of file +}