diff --git a/src/components/shapes/draw_newshape/newshapes.js b/src/components/shapes/draw_newshape/newshapes.js index 831a270e9ab..7145838c04d 100644 --- a/src/components/shapes/draw_newshape/newshapes.js +++ b/src/components/shapes/draw_newshape/newshapes.js @@ -1,5 +1,7 @@ 'use strict'; +var axis_ids = require('../../../plots/cartesian/axis_ids'); + var dragHelpers = require('../../dragelement/helpers'); var drawMode = dragHelpers.drawMode; var openMode = dragHelpers.openMode; @@ -84,10 +86,23 @@ function newShapes(outlines, dragOptions) { case 'line': case 'rect': case 'circle': - modifyItem('x0', afterEdit.x0 - (beforeEdit.x0shift || 0)); - modifyItem('x1', afterEdit.x1 - (beforeEdit.x1shift || 0)); - modifyItem('y0', afterEdit.y0 - (beforeEdit.y0shift || 0)); - modifyItem('y1', afterEdit.y1 - (beforeEdit.y1shift || 0)); + + var xaxis = axis_ids.getFromId(gd, beforeEdit.xref); + if (beforeEdit.xref.charAt(0) === 'x' && xaxis.type.includes('category')) { + modifyItem('x0', afterEdit.x0 - (beforeEdit.x0shift || 0)); + modifyItem('x1', afterEdit.x1 - (beforeEdit.x1shift || 0)); + } else { + modifyItem('x0', afterEdit.x0); + modifyItem('x1', afterEdit.x1); + } + var yaxis = axis_ids.getFromId(gd, beforeEdit.yref); + if (beforeEdit.yref.charAt(0) === 'y' && yaxis.type.includes('category')) { + modifyItem('y0', afterEdit.y0 - (beforeEdit.y0shift || 0)); + modifyItem('y1', afterEdit.y1 - (beforeEdit.y1shift || 0)); + } else { + modifyItem('y0', afterEdit.y0); + modifyItem('y1', afterEdit.y1); + } break; case 'path': diff --git a/test/jasmine/tests/draw_newshape_test.js b/test/jasmine/tests/draw_newshape_test.js index 657df5b2c0f..55e6a7554cb 100644 --- a/test/jasmine/tests/draw_newshape_test.js +++ b/test/jasmine/tests/draw_newshape_test.js @@ -1426,6 +1426,43 @@ describe('Activate and edit editable shapes', function() { .then(done, done.fail); }); + + it('should be possible to drag shapes referencing non-categorical axes', function(done) { + Plotly.newPlot(gd, { + data: [ + { + x: ["2015-02-01", "2015-02-02", "2015-02-03"], + y: [14, 17, 8], + mode: "line", + }, + ], + layout: { + xaxis: { title: { text: "Date" }, type: "date" }, + dragmode: "drawline", + shapes: [ + { + type: "rect", + xref: "x", + yref: "paper", + x0: "2015-02-02", + y0: 0, + x1: "2015-02-08", + y1: 1, + opacity: 0.2, + editable: true, + }, + ], + }, + }) + .then(function() { drag([[257.64, 370], [250, 300]]); }) // move lower left corner up and left + .then(function () { + var shapes = gd._fullLayout.shapes; + var obj = shapes[0]._input; + print(obj); + assertPos(obj.path, 'M250,300H1019V100H257.64Z'); + }) + .then(done, done.fail); + }); }); });