From b9dad6716cf7a5c608fc5e5fe53bc7c5e8918e10 Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 24 Sep 2020 18:19:15 -0400 Subject: [PATCH 1/7] add user-select-none to text elements --- src/components/annotations/draw.js | 4 +++- src/components/colorbar/draw.js | 6 +++++- src/components/fx/hover.js | 2 ++ src/components/legend/style.js | 6 ++++-- src/components/titles/index.js | 3 ++- src/plots/cartesian/axes.js | 1 + src/traces/bar/plot.js | 1 + src/traces/carpet/plot.js | 10 ++++++---- src/traces/contour/plot.js | 1 + src/traces/contourcarpet/plot.js | 1 + src/traces/funnelarea/plot.js | 2 ++ src/traces/parcats/parcats.js | 1 + src/traces/pie/plot.js | 2 ++ src/traces/scatter/plot.js | 5 ++++- src/traces/scattergeo/plot.js | 3 ++- src/traces/sunburst/plot.js | 4 +++- src/traces/treemap/draw_ancestors.js | 4 +++- src/traces/treemap/draw_descendants.js | 4 +++- 18 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/components/annotations/draw.js b/src/components/annotations/draw.js index f810100a420..177e68fa757 100644 --- a/src/components/annotations/draw.js +++ b/src/components/annotations/draw.js @@ -217,7 +217,9 @@ function drawRaw(gd, options, index, subplotId, xa, ya) { Lib.templateString(options.text, fullLayout._meta) : options.text; - var annText = annTextGroupInner.append('text') + var annText = annTextGroupInner + .classed('user-select-none', true) + .append('text') .classed('annotation-text', true) .text(text); diff --git a/src/components/colorbar/draw.js b/src/components/colorbar/draw.js index a952f78340d..3f17f86e16b 100644 --- a/src/components/colorbar/draw.js +++ b/src/components/colorbar/draw.js @@ -53,7 +53,11 @@ function draw(gd) { Lib.ensureSingle(g, 'g', cn.cbfills); Lib.ensureSingle(g, 'g', cn.cblines); Lib.ensureSingle(g, 'g', cn.cbaxis, function(s) { s.classed(cn.crisp, true); }); - Lib.ensureSingle(g, 'g', cn.cbtitleunshift, function(s) { s.append('g').classed(cn.cbtitle, true); }); + Lib.ensureSingle(g, 'g', cn.cbtitleunshift, function(s) { + s.append('g') + .classed('user-select-none', true) + .classed(cn.cbtitle, true); + }); Lib.ensureSingle(g, 'rect', cn.cboutline); var done = drawColorBar(g, opts, gd); diff --git a/src/components/fx/hover.js b/src/components/fx/hover.js index 3b43a069bc3..5f0e961db1c 100644 --- a/src/components/fx/hover.js +++ b/src/components/fx/hover.js @@ -813,6 +813,7 @@ function createHoverText(hoverData, opts, gd) { var commonLabel = container.selectAll('g.axistext') .data(showCommonLabel ? [0] : []); commonLabel.enter().append('g') + .classed('user-select-none', true) .classed('axistext', true); commonLabel.exit().remove(); @@ -1083,6 +1084,7 @@ function createHoverText(hoverData, opts, gd) { return hoverDataKey(d); }); hoverLabels.enter().append('g') + .classed('user-select-none', true) .classed('hovertext', true) .each(function() { var g = d3.select(this); diff --git a/src/components/legend/style.js b/src/components/legend/style.js index b7b9bec7618..35164029a69 100644 --- a/src/components/legend/style.js +++ b/src/components/legend/style.js @@ -282,8 +282,10 @@ module.exports = function style(s, gd, legend) { var txt = ptgroup.selectAll('g.pointtext') .data(showText ? dMod : []); txt.enter() - .append('g').classed('pointtext', true) - .append('text').attr('transform', 'translate(20,0)'); + .append('g') + .classed('user-select-none', true) + .classed('pointtext', true) + .append('text').attr('transform', 'translate(20,0)'); txt.exit().remove(); txt.selectAll('text').call(Drawing.textPointStyle, tMod, gd); } diff --git a/src/components/titles/index.js b/src/components/titles/index.js index a1cdddaf21a..0ebba94f208 100644 --- a/src/components/titles/index.js +++ b/src/components/titles/index.js @@ -105,7 +105,8 @@ function draw(gd, titleClass, options) { var elShouldExist = txt || editable; if(!group) { - group = Lib.ensureSingle(fullLayout._infolayer, 'g', 'g-' + titleClass); + group = Lib.ensureSingle(fullLayout._infolayer, 'g', 'g-' + titleClass) + .classed('user-select-none', true); } var el = group.selectAll('text') diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index f2280d48c58..24ef33c1a63 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2732,6 +2732,7 @@ axes.drawLabels = function(gd, ax, opts) { var labelsReady = []; tickLabels.enter().append('g') + .classed('user-select-none', true) .classed(cls, 1) .append('text') // only so tex has predictable alignment that we can diff --git a/src/traces/bar/plot.js b/src/traces/bar/plot.js index eaee3a1418c..6120632d11c 100644 --- a/src/traces/bar/plot.js +++ b/src/traces/bar/plot.js @@ -122,6 +122,7 @@ function plot(gd, plotinfo, cdModule, traceLayer, opts, makeOnCompleteCallback) var bars = pointGroup.selectAll('g.point').data(Lib.identity, keyFunc); bars.enter().append('g') + .classed('user-select-none', true) .classed('point', true); bars.exit().remove(); diff --git a/src/traces/carpet/plot.js b/src/traces/carpet/plot.js index 2e61c63d578..b747ba42206 100644 --- a/src/traces/carpet/plot.js +++ b/src/traces/carpet/plot.js @@ -34,7 +34,8 @@ module.exports = function plot(gd, plotinfo, cdcarpet, carpetLayer) { var minorLayer = Lib.ensureSingle(axisLayer, 'g', 'minorlayer'); var majorLayer = Lib.ensureSingle(axisLayer, 'g', 'majorlayer'); var boundaryLayer = Lib.ensureSingle(axisLayer, 'g', 'boundarylayer'); - var labelLayer = Lib.ensureSingle(axisLayer, 'g', 'labellayer'); + var labelLayer = Lib.ensureSingle(axisLayer, 'g', 'labellayer') + .classed('user-select-none', true); axisLayer.style('opacity', trace.opacity); @@ -206,7 +207,8 @@ function drawAxisTitle(gd, layer, trace, t, xy, dxy, axis, xa, ya, labelOrientat var titleJoin = layer.selectAll('text.' + labelClass).data(data); var offset = labelOrientation.maxExtent; - titleJoin.enter().append('text') + titleJoin.enter() + .append('text') .classed(labelClass, true); // There's only one, but we'll do it as a join so it's updated nicely: @@ -227,7 +229,8 @@ function drawAxisTitle(gd, layer, trace, t, xy, dxy, axis, xa, ya, labelOrientat var el = d3.select(this); - el.text(axis.title.text) + el.classed('user-select-none', true) + .text(axis.title.text) .call(svgTextUtils.convertToTspans, gd); if(reverseTitle) { @@ -239,7 +242,6 @@ function drawAxisTitle(gd, layer, trace, t, xy, dxy, axis, xa, ya, labelOrientat 'rotate(' + orientation.angle + ') ' + 'translate(0,' + offset + ')' ) - .classed('user-select-none', true) .attr('text-anchor', 'middle') .call(Drawing.font, axis.title.font); }); diff --git a/src/traces/contour/plot.js b/src/traces/contour/plot.js index 78fd46147b9..8dd3e2488a9 100644 --- a/src/traces/contour/plot.js +++ b/src/traces/contour/plot.js @@ -228,6 +228,7 @@ function makeLinesAndLabels(plotgroup, pathinfo, gd, cd0, contours) { labelGroup.exit().remove(); labelGroup.enter().append('g') + .classed('user-select-none', true) .classed('contourlabels', true); if(showLabels) { diff --git a/src/traces/contourcarpet/plot.js b/src/traces/contourcarpet/plot.js index 884c3d95dd7..8860e8da3b7 100644 --- a/src/traces/contourcarpet/plot.js +++ b/src/traces/contourcarpet/plot.js @@ -161,6 +161,7 @@ function makeLinesAndLabels(plotgroup, pathinfo, gd, cd0, contours, plotinfo, ca labelGroup.exit().remove(); labelGroup.enter().append('g') + .classed('user-select-none', true) .classed('contourlabels', true); if(showLabels) { diff --git a/src/traces/funnelarea/plot.js b/src/traces/funnelarea/plot.js index 672835bc456..ce550cfc8c3 100644 --- a/src/traces/funnelarea/plot.js +++ b/src/traces/funnelarea/plot.js @@ -89,6 +89,7 @@ module.exports = function plot(gd, cdModule) { .data(pt.text && (textPosition !== 'none') ? [0] : []); sliceTextGroup.enter().append('g') + .classed('user-select-none', true) .classed('slicetext', true); sliceTextGroup.exit().remove(); @@ -141,6 +142,7 @@ module.exports = function plot(gd, cdModule) { .data(trace.title.text ? [0] : []); titleTextGroup.enter().append('g') + .classed('user-select-none', true) .classed('titletext', true); titleTextGroup.exit().remove(); diff --git a/src/traces/parcats/parcats.js b/src/traces/parcats/parcats.js index a5fc1a60659..34c5ef0960c 100644 --- a/src/traces/parcats/parcats.js +++ b/src/traces/parcats/parcats.js @@ -225,6 +225,7 @@ function performPlot(parcatsModels, graphDiv, layout, svg) { // Initialize category label categoryGroupEnterSelection + .classed('user-select-none', true) .append('text') .attr('class', 'catlabel') .attr('pointer-events', 'none'); diff --git a/src/traces/pie/plot.js b/src/traces/pie/plot.js index 9dd866c04f0..023c2790cf1 100644 --- a/src/traces/pie/plot.js +++ b/src/traces/pie/plot.js @@ -140,6 +140,7 @@ function plot(gd, cdModule) { .data(pt.text && (textPosition !== 'none') ? [0] : []); sliceTextGroup.enter().append('g') + .classed('user-select-none', true) .classed('slicetext', true); sliceTextGroup.exit().remove(); @@ -212,6 +213,7 @@ function plot(gd, cdModule) { .data(trace.title.text ? [0] : []); titleTextGroup.enter().append('g') + .classed('user-select-none', true) .classed('titletext', true); titleTextGroup.exit().remove(); diff --git a/src/traces/scatter/plot.js b/src/traces/scatter/plot.js index b70fef865a1..14f266b3644 100644 --- a/src/traces/scatter/plot.js +++ b/src/traces/scatter/plot.js @@ -470,7 +470,10 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // each text needs to go in its own 'g' in case // it gets converted to mathjax - join.enter().append('g').classed('textpoint', true).append('text'); + join.enter().append('g') + .classed('user-select-none', true) + .classed('textpoint', true) + .append('text'); join.order(); diff --git a/src/traces/scattergeo/plot.js b/src/traces/scattergeo/plot.js index 6b94ef61d71..cda3ee6cd0a 100644 --- a/src/traces/scattergeo/plot.js +++ b/src/traces/scattergeo/plot.js @@ -23,7 +23,8 @@ var style = require('./style'); function plot(gd, geo, calcData) { var scatterLayer = geo.layers.frontplot.select('.scatterlayer'); - var gTraces = Lib.makeTraceGroups(scatterLayer, calcData, 'trace scattergeo'); + var gTraces = Lib.makeTraceGroups(scatterLayer, calcData, 'trace scattergeo') + .classed('user-select-none', true); function removeBADNUM(d, node) { if(d.lonlat[0] === BADNUM) { diff --git a/src/traces/sunburst/plot.js b/src/traces/sunburst/plot.js index ef3616e4b88..1b672879e6e 100644 --- a/src/traces/sunburst/plot.js +++ b/src/traces/sunburst/plot.js @@ -254,7 +254,9 @@ function plotOne(gd, cd, element, transitionOpts) { slicePath.call(styleOne, pt, trace); - var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext'); + var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext') + .classed('user-select-none', true); + var sliceText = Lib.ensureSingle(sliceTextGroup, 'text', '', function(s) { // prohibit tex interpretation until we can handle // tex and regular text together diff --git a/src/traces/treemap/draw_ancestors.js b/src/traces/treemap/draw_ancestors.js index 254cd077cac..a6c74dabade 100644 --- a/src/traces/treemap/draw_ancestors.js +++ b/src/traces/treemap/draw_ancestors.js @@ -134,7 +134,9 @@ module.exports = function drawAncestors(gd, cd, entry, slices, opts) { pt._text = (helpers.getPtLabel(pt) || '').split('
').join(' ') || ''; - var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext'); + var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext') + .classed('user-select-none', true); + var sliceText = Lib.ensureSingle(sliceTextGroup, 'text', '', function(s) { // prohibit tex interpretation until we can handle // tex and regular text together diff --git a/src/traces/treemap/draw_descendants.js b/src/traces/treemap/draw_descendants.js index 782a6a18899..1cfc12876d0 100644 --- a/src/traces/treemap/draw_descendants.js +++ b/src/traces/treemap/draw_descendants.js @@ -175,7 +175,9 @@ module.exports = function drawDescendants(gd, cd, entry, slices, opts) { } } - var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext'); + var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext') + .classed('user-select-none', true); + var sliceText = Lib.ensureSingle(sliceTextGroup, 'text', '', function(s) { // prohibit tex interpretation until we can handle // tex and regular text together From 346319c374e5135c24d305349a4f34c3637471b3 Mon Sep 17 00:00:00 2001 From: archmoj Date: Fri, 25 Sep 2020 13:07:52 -0400 Subject: [PATCH 2/7] Revert "add user-select-none to text elements" This reverts commit b9dad6716cf7a5c608fc5e5fe53bc7c5e8918e10. --- src/components/annotations/draw.js | 4 +--- src/components/colorbar/draw.js | 6 +----- src/components/fx/hover.js | 2 -- src/components/legend/style.js | 6 ++---- src/components/titles/index.js | 3 +-- src/plots/cartesian/axes.js | 1 - src/traces/bar/plot.js | 1 - src/traces/carpet/plot.js | 10 ++++------ src/traces/contour/plot.js | 1 - src/traces/contourcarpet/plot.js | 1 - src/traces/funnelarea/plot.js | 2 -- src/traces/parcats/parcats.js | 1 - src/traces/pie/plot.js | 2 -- src/traces/scatter/plot.js | 5 +---- src/traces/scattergeo/plot.js | 3 +-- src/traces/sunburst/plot.js | 4 +--- src/traces/treemap/draw_ancestors.js | 4 +--- src/traces/treemap/draw_descendants.js | 4 +--- 18 files changed, 14 insertions(+), 46 deletions(-) diff --git a/src/components/annotations/draw.js b/src/components/annotations/draw.js index 177e68fa757..f810100a420 100644 --- a/src/components/annotations/draw.js +++ b/src/components/annotations/draw.js @@ -217,9 +217,7 @@ function drawRaw(gd, options, index, subplotId, xa, ya) { Lib.templateString(options.text, fullLayout._meta) : options.text; - var annText = annTextGroupInner - .classed('user-select-none', true) - .append('text') + var annText = annTextGroupInner.append('text') .classed('annotation-text', true) .text(text); diff --git a/src/components/colorbar/draw.js b/src/components/colorbar/draw.js index 3f17f86e16b..a952f78340d 100644 --- a/src/components/colorbar/draw.js +++ b/src/components/colorbar/draw.js @@ -53,11 +53,7 @@ function draw(gd) { Lib.ensureSingle(g, 'g', cn.cbfills); Lib.ensureSingle(g, 'g', cn.cblines); Lib.ensureSingle(g, 'g', cn.cbaxis, function(s) { s.classed(cn.crisp, true); }); - Lib.ensureSingle(g, 'g', cn.cbtitleunshift, function(s) { - s.append('g') - .classed('user-select-none', true) - .classed(cn.cbtitle, true); - }); + Lib.ensureSingle(g, 'g', cn.cbtitleunshift, function(s) { s.append('g').classed(cn.cbtitle, true); }); Lib.ensureSingle(g, 'rect', cn.cboutline); var done = drawColorBar(g, opts, gd); diff --git a/src/components/fx/hover.js b/src/components/fx/hover.js index 5f0e961db1c..3b43a069bc3 100644 --- a/src/components/fx/hover.js +++ b/src/components/fx/hover.js @@ -813,7 +813,6 @@ function createHoverText(hoverData, opts, gd) { var commonLabel = container.selectAll('g.axistext') .data(showCommonLabel ? [0] : []); commonLabel.enter().append('g') - .classed('user-select-none', true) .classed('axistext', true); commonLabel.exit().remove(); @@ -1084,7 +1083,6 @@ function createHoverText(hoverData, opts, gd) { return hoverDataKey(d); }); hoverLabels.enter().append('g') - .classed('user-select-none', true) .classed('hovertext', true) .each(function() { var g = d3.select(this); diff --git a/src/components/legend/style.js b/src/components/legend/style.js index 35164029a69..b7b9bec7618 100644 --- a/src/components/legend/style.js +++ b/src/components/legend/style.js @@ -282,10 +282,8 @@ module.exports = function style(s, gd, legend) { var txt = ptgroup.selectAll('g.pointtext') .data(showText ? dMod : []); txt.enter() - .append('g') - .classed('user-select-none', true) - .classed('pointtext', true) - .append('text').attr('transform', 'translate(20,0)'); + .append('g').classed('pointtext', true) + .append('text').attr('transform', 'translate(20,0)'); txt.exit().remove(); txt.selectAll('text').call(Drawing.textPointStyle, tMod, gd); } diff --git a/src/components/titles/index.js b/src/components/titles/index.js index 0ebba94f208..a1cdddaf21a 100644 --- a/src/components/titles/index.js +++ b/src/components/titles/index.js @@ -105,8 +105,7 @@ function draw(gd, titleClass, options) { var elShouldExist = txt || editable; if(!group) { - group = Lib.ensureSingle(fullLayout._infolayer, 'g', 'g-' + titleClass) - .classed('user-select-none', true); + group = Lib.ensureSingle(fullLayout._infolayer, 'g', 'g-' + titleClass); } var el = group.selectAll('text') diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 24ef33c1a63..f2280d48c58 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2732,7 +2732,6 @@ axes.drawLabels = function(gd, ax, opts) { var labelsReady = []; tickLabels.enter().append('g') - .classed('user-select-none', true) .classed(cls, 1) .append('text') // only so tex has predictable alignment that we can diff --git a/src/traces/bar/plot.js b/src/traces/bar/plot.js index 6120632d11c..eaee3a1418c 100644 --- a/src/traces/bar/plot.js +++ b/src/traces/bar/plot.js @@ -122,7 +122,6 @@ function plot(gd, plotinfo, cdModule, traceLayer, opts, makeOnCompleteCallback) var bars = pointGroup.selectAll('g.point').data(Lib.identity, keyFunc); bars.enter().append('g') - .classed('user-select-none', true) .classed('point', true); bars.exit().remove(); diff --git a/src/traces/carpet/plot.js b/src/traces/carpet/plot.js index b747ba42206..2e61c63d578 100644 --- a/src/traces/carpet/plot.js +++ b/src/traces/carpet/plot.js @@ -34,8 +34,7 @@ module.exports = function plot(gd, plotinfo, cdcarpet, carpetLayer) { var minorLayer = Lib.ensureSingle(axisLayer, 'g', 'minorlayer'); var majorLayer = Lib.ensureSingle(axisLayer, 'g', 'majorlayer'); var boundaryLayer = Lib.ensureSingle(axisLayer, 'g', 'boundarylayer'); - var labelLayer = Lib.ensureSingle(axisLayer, 'g', 'labellayer') - .classed('user-select-none', true); + var labelLayer = Lib.ensureSingle(axisLayer, 'g', 'labellayer'); axisLayer.style('opacity', trace.opacity); @@ -207,8 +206,7 @@ function drawAxisTitle(gd, layer, trace, t, xy, dxy, axis, xa, ya, labelOrientat var titleJoin = layer.selectAll('text.' + labelClass).data(data); var offset = labelOrientation.maxExtent; - titleJoin.enter() - .append('text') + titleJoin.enter().append('text') .classed(labelClass, true); // There's only one, but we'll do it as a join so it's updated nicely: @@ -229,8 +227,7 @@ function drawAxisTitle(gd, layer, trace, t, xy, dxy, axis, xa, ya, labelOrientat var el = d3.select(this); - el.classed('user-select-none', true) - .text(axis.title.text) + el.text(axis.title.text) .call(svgTextUtils.convertToTspans, gd); if(reverseTitle) { @@ -242,6 +239,7 @@ function drawAxisTitle(gd, layer, trace, t, xy, dxy, axis, xa, ya, labelOrientat 'rotate(' + orientation.angle + ') ' + 'translate(0,' + offset + ')' ) + .classed('user-select-none', true) .attr('text-anchor', 'middle') .call(Drawing.font, axis.title.font); }); diff --git a/src/traces/contour/plot.js b/src/traces/contour/plot.js index 8dd3e2488a9..78fd46147b9 100644 --- a/src/traces/contour/plot.js +++ b/src/traces/contour/plot.js @@ -228,7 +228,6 @@ function makeLinesAndLabels(plotgroup, pathinfo, gd, cd0, contours) { labelGroup.exit().remove(); labelGroup.enter().append('g') - .classed('user-select-none', true) .classed('contourlabels', true); if(showLabels) { diff --git a/src/traces/contourcarpet/plot.js b/src/traces/contourcarpet/plot.js index 8860e8da3b7..884c3d95dd7 100644 --- a/src/traces/contourcarpet/plot.js +++ b/src/traces/contourcarpet/plot.js @@ -161,7 +161,6 @@ function makeLinesAndLabels(plotgroup, pathinfo, gd, cd0, contours, plotinfo, ca labelGroup.exit().remove(); labelGroup.enter().append('g') - .classed('user-select-none', true) .classed('contourlabels', true); if(showLabels) { diff --git a/src/traces/funnelarea/plot.js b/src/traces/funnelarea/plot.js index ce550cfc8c3..672835bc456 100644 --- a/src/traces/funnelarea/plot.js +++ b/src/traces/funnelarea/plot.js @@ -89,7 +89,6 @@ module.exports = function plot(gd, cdModule) { .data(pt.text && (textPosition !== 'none') ? [0] : []); sliceTextGroup.enter().append('g') - .classed('user-select-none', true) .classed('slicetext', true); sliceTextGroup.exit().remove(); @@ -142,7 +141,6 @@ module.exports = function plot(gd, cdModule) { .data(trace.title.text ? [0] : []); titleTextGroup.enter().append('g') - .classed('user-select-none', true) .classed('titletext', true); titleTextGroup.exit().remove(); diff --git a/src/traces/parcats/parcats.js b/src/traces/parcats/parcats.js index 34c5ef0960c..a5fc1a60659 100644 --- a/src/traces/parcats/parcats.js +++ b/src/traces/parcats/parcats.js @@ -225,7 +225,6 @@ function performPlot(parcatsModels, graphDiv, layout, svg) { // Initialize category label categoryGroupEnterSelection - .classed('user-select-none', true) .append('text') .attr('class', 'catlabel') .attr('pointer-events', 'none'); diff --git a/src/traces/pie/plot.js b/src/traces/pie/plot.js index 023c2790cf1..9dd866c04f0 100644 --- a/src/traces/pie/plot.js +++ b/src/traces/pie/plot.js @@ -140,7 +140,6 @@ function plot(gd, cdModule) { .data(pt.text && (textPosition !== 'none') ? [0] : []); sliceTextGroup.enter().append('g') - .classed('user-select-none', true) .classed('slicetext', true); sliceTextGroup.exit().remove(); @@ -213,7 +212,6 @@ function plot(gd, cdModule) { .data(trace.title.text ? [0] : []); titleTextGroup.enter().append('g') - .classed('user-select-none', true) .classed('titletext', true); titleTextGroup.exit().remove(); diff --git a/src/traces/scatter/plot.js b/src/traces/scatter/plot.js index 14f266b3644..b70fef865a1 100644 --- a/src/traces/scatter/plot.js +++ b/src/traces/scatter/plot.js @@ -470,10 +470,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition // each text needs to go in its own 'g' in case // it gets converted to mathjax - join.enter().append('g') - .classed('user-select-none', true) - .classed('textpoint', true) - .append('text'); + join.enter().append('g').classed('textpoint', true).append('text'); join.order(); diff --git a/src/traces/scattergeo/plot.js b/src/traces/scattergeo/plot.js index cda3ee6cd0a..6b94ef61d71 100644 --- a/src/traces/scattergeo/plot.js +++ b/src/traces/scattergeo/plot.js @@ -23,8 +23,7 @@ var style = require('./style'); function plot(gd, geo, calcData) { var scatterLayer = geo.layers.frontplot.select('.scatterlayer'); - var gTraces = Lib.makeTraceGroups(scatterLayer, calcData, 'trace scattergeo') - .classed('user-select-none', true); + var gTraces = Lib.makeTraceGroups(scatterLayer, calcData, 'trace scattergeo'); function removeBADNUM(d, node) { if(d.lonlat[0] === BADNUM) { diff --git a/src/traces/sunburst/plot.js b/src/traces/sunburst/plot.js index 1b672879e6e..ef3616e4b88 100644 --- a/src/traces/sunburst/plot.js +++ b/src/traces/sunburst/plot.js @@ -254,9 +254,7 @@ function plotOne(gd, cd, element, transitionOpts) { slicePath.call(styleOne, pt, trace); - var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext') - .classed('user-select-none', true); - + var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext'); var sliceText = Lib.ensureSingle(sliceTextGroup, 'text', '', function(s) { // prohibit tex interpretation until we can handle // tex and regular text together diff --git a/src/traces/treemap/draw_ancestors.js b/src/traces/treemap/draw_ancestors.js index a6c74dabade..254cd077cac 100644 --- a/src/traces/treemap/draw_ancestors.js +++ b/src/traces/treemap/draw_ancestors.js @@ -134,9 +134,7 @@ module.exports = function drawAncestors(gd, cd, entry, slices, opts) { pt._text = (helpers.getPtLabel(pt) || '').split('
').join(' ') || ''; - var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext') - .classed('user-select-none', true); - + var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext'); var sliceText = Lib.ensureSingle(sliceTextGroup, 'text', '', function(s) { // prohibit tex interpretation until we can handle // tex and regular text together diff --git a/src/traces/treemap/draw_descendants.js b/src/traces/treemap/draw_descendants.js index 1cfc12876d0..782a6a18899 100644 --- a/src/traces/treemap/draw_descendants.js +++ b/src/traces/treemap/draw_descendants.js @@ -175,9 +175,7 @@ module.exports = function drawDescendants(gd, cd, entry, slices, opts) { } } - var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext') - .classed('user-select-none', true); - + var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext'); var sliceText = Lib.ensureSingle(sliceTextGroup, 'text', '', function(s) { // prohibit tex interpretation until we can handle // tex and regular text together From 040465e07b8a819828f36e4515524fd8d3aba8f9 Mon Sep 17 00:00:00 2001 From: archmoj Date: Fri, 25 Sep 2020 13:12:20 -0400 Subject: [PATCH 3/7] drop user-select-none classes before adding to the top element --- src/components/legend/draw.js | 2 -- src/components/rangeselector/draw.js | 3 +-- src/components/sliders/draw.js | 18 ++++++++---------- src/components/updatemenus/draw.js | 12 +++++------- src/plots/gl2d/scene2d.js | 5 ----- src/traces/carpet/plot.js | 1 - 6 files changed, 14 insertions(+), 27 deletions(-) diff --git a/src/components/legend/draw.js b/src/components/legend/draw.js index b56ecf4f448..945067b5a40 100644 --- a/src/components/legend/draw.js +++ b/src/components/legend/draw.js @@ -89,7 +89,6 @@ module.exports = function draw(gd, opts) { if(title.text) { var titleEl = Lib.ensureSingle(scrollBox, 'text', 'legendtitletext'); titleEl.attr('text-anchor', 'start') - .classed('user-select-none', true) .call(Drawing.font, title.font) .text(title.text); @@ -410,7 +409,6 @@ function drawTexts(g, gd, opts) { var textEl = Lib.ensureSingle(g, 'text', 'legendtext'); textEl.attr('text-anchor', 'start') - .classed('user-select-none', true) .call(Drawing.font, opts.font) .text(isEditable ? ensureLength(name, maxNameLength) : name); diff --git a/src/components/rangeselector/draw.js b/src/components/rangeselector/draw.js index 7fe49cd98b4..8cad51424be 100644 --- a/src/components/rangeselector/draw.js +++ b/src/components/rangeselector/draw.js @@ -144,8 +144,7 @@ function drawButtonText(button, selectorLayout, d, gd) { } var text = Lib.ensureSingle(button, 'text', 'selector-text', function(s) { - s.classed('user-select-none', true) - .attr('text-anchor', 'middle'); + s.attr('text-anchor', 'middle'); }); text.call(Drawing.font, selectorLayout.font) diff --git a/src/components/sliders/draw.js b/src/components/sliders/draw.js index dff30e5d2bd..b6c1c25f5bd 100644 --- a/src/components/sliders/draw.js +++ b/src/components/sliders/draw.js @@ -302,11 +302,10 @@ function drawCurrentValue(sliderGroup, sliderOpts, valueOverride) { } var text = Lib.ensureSingle(sliderGroup, 'text', constants.labelClass, function(s) { - s.classed('user-select-none', true) - .attr({ - 'text-anchor': textAnchor, - 'data-notex': 1 - }); + s.attr({ + 'text-anchor': textAnchor, + 'data-notex': 1 + }); }); var str = sliderOpts.currentvalue.prefix ? sliderOpts.currentvalue.prefix : ''; @@ -357,11 +356,10 @@ function drawGrip(sliderGroup, gd, sliderOpts) { function drawLabel(item, data, sliderOpts) { var text = Lib.ensureSingle(item, 'text', constants.labelClass, function(s) { - s.classed('user-select-none', true) - .attr({ - 'text-anchor': 'middle', - 'data-notex': 1 - }); + s.attr({ + 'text-anchor': 'middle', + 'data-notex': 1 + }); }); var tx = data.step.label; diff --git a/src/components/updatemenus/draw.js b/src/components/updatemenus/draw.js index d5a160432c0..d74e312b74b 100644 --- a/src/components/updatemenus/draw.js +++ b/src/components/updatemenus/draw.js @@ -195,8 +195,7 @@ function drawHeader(gd, gHeader, gButton, scrollBox, menuOpts) { // draw drop arrow at the right edge var arrow = Lib.ensureSingle(gHeader, 'text', constants.headerArrowClassName, function(s) { - s.classed('user-select-none', true) - .attr('text-anchor', 'end') + s.attr('text-anchor', 'end') .call(Drawing.font, menuOpts.font) .text(constants.arrowSymbol[menuOpts.direction]); }); @@ -435,11 +434,10 @@ function drawItemRect(item, menuOpts) { function drawItemText(item, menuOpts, itemOpts, gd) { var text = Lib.ensureSingle(item, 'text', constants.itemTextClassName, function(s) { - s.classed('user-select-none', true) - .attr({ - 'text-anchor': 'start', - 'data-notex': 1 - }); + s.attr({ + 'text-anchor': 'start', + 'data-notex': 1 + }); }); var tx = itemOpts.label; diff --git a/src/plots/gl2d/scene2d.js b/src/plots/gl2d/scene2d.js index 79d6bc48de0..06d5ccd9863 100644 --- a/src/plots/gl2d/scene2d.js +++ b/src/plots/gl2d/scene2d.js @@ -145,11 +145,6 @@ proto.makeFramework = function() { this.updateSize(canvas); - // disabling user select on the canvas - // sanitizes double-clicks interactions - // ref: https://github.com/plotly/plotly.js/issues/744 - canvas.className += ' user-select-none'; - // create SVG container for hover text var svgContainer = this.svgContainer = document.createElementNS( 'http://www.w3.org/2000/svg', diff --git a/src/traces/carpet/plot.js b/src/traces/carpet/plot.js index 2e61c63d578..7d45bddcbb2 100644 --- a/src/traces/carpet/plot.js +++ b/src/traces/carpet/plot.js @@ -239,7 +239,6 @@ function drawAxisTitle(gd, layer, trace, t, xy, dxy, axis, xa, ya, labelOrientat 'rotate(' + orientation.angle + ') ' + 'translate(0,' + offset + ')' ) - .classed('user-select-none', true) .attr('text-anchor', 'middle') .call(Drawing.font, axis.title.font); }); From cab62647f4c0bd29db24cadb48154b8459e7d045 Mon Sep 17 00:00:00 2001 From: archmoj Date: Fri, 25 Sep 2020 13:30:14 -0400 Subject: [PATCH 4/7] disable user-select at plotly paper level --- src/plot_api/plot_api.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plot_api/plot_api.js b/src/plot_api/plot_api.js index 4baa8a329e5..aa0715ca8d0 100644 --- a/src/plot_api/plot_api.js +++ b/src/plot_api/plot_api.js @@ -3717,13 +3717,15 @@ function makePlotFramework(gd) { // Plot container fullLayout._container = gd3.selectAll('.plot-container').data([0]); - fullLayout._container.enter().insert('div', ':first-child') + fullLayout._container.enter() + .insert('div', ':first-child') .classed('plot-container', true) .classed('plotly', true); // Make the svg container fullLayout._paperdiv = fullLayout._container.selectAll('.svg-container').data([0]); fullLayout._paperdiv.enter().append('div') + .classed('user-select-none', true) .classed('svg-container', true) .style('position', 'relative'); From 89e1342af0b2288652e97b8bd3fe4e96aafe4461 Mon Sep 17 00:00:00 2001 From: archmoj Date: Fri, 25 Sep 2020 14:30:18 -0400 Subject: [PATCH 5/7] drop user-select in sankey and parcoords --- src/plot_api/plot_api.js | 1 - src/traces/parcoords/parcoords.js | 7 ++----- src/traces/sankey/render.js | 1 - 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/plot_api/plot_api.js b/src/plot_api/plot_api.js index aa0715ca8d0..d4f34bd3b7f 100644 --- a/src/plot_api/plot_api.js +++ b/src/plot_api/plot_api.js @@ -3725,7 +3725,6 @@ function makePlotFramework(gd) { // Make the svg container fullLayout._paperdiv = fullLayout._container.selectAll('.svg-container').data([0]); fullLayout._paperdiv.enter().append('div') - .classed('user-select-none', true) .classed('svg-container', true) .style('position', 'relative'); diff --git a/src/traces/parcoords/parcoords.js b/src/traces/parcoords/parcoords.js index d314f9ad4c8..9a20e792043 100644 --- a/src/traces/parcoords/parcoords.js +++ b/src/traces/parcoords/parcoords.js @@ -350,8 +350,7 @@ function styleExtentTexts(selection) { selection .classed(c.cn.axisExtentText, true) .attr('text-anchor', 'middle') - .style('cursor', 'default') - .style('user-select', 'none'); + .style('cursor', 'default'); } function parcoordsInteractionState() { @@ -655,8 +654,7 @@ module.exports = function parcoords(gd, cdModule, layout, callbacks) { axis.selectAll('text') .style('text-shadow', '1px 1px 1px #fff, -1px -1px 1px #fff, 1px -1px 1px #fff, -1px 1px 1px #fff') - .style('cursor', 'default') - .style('user-select', 'none'); + .style('cursor', 'default'); var axisHeading = axisOverlays.selectAll('.' + c.cn.axisHeading) .data(repeat, keyFun); @@ -673,7 +671,6 @@ module.exports = function parcoords(gd, cdModule, layout, callbacks) { .classed(c.cn.axisTitle, true) .attr('text-anchor', 'middle') .style('cursor', 'ew-resize') - .style('user-select', 'none') .style('pointer-events', 'auto'); axisTitle diff --git a/src/traces/sankey/render.js b/src/traces/sankey/render.js index 031d31ebdb1..3bd24ebc205 100644 --- a/src/traces/sankey/render.js +++ b/src/traces/sankey/render.js @@ -1026,7 +1026,6 @@ module.exports = function(gd, svg, calcData, layout, callbacks) { .append('text') .classed(c.cn.nodeLabel, true) .attr('transform', textFlip) - .style('user-select', 'none') .style('cursor', 'default') .style('fill', 'black'); From 7784e18da0ed12e62f1c04590237fb21da4428bf Mon Sep 17 00:00:00 2001 From: archmoj Date: Fri, 25 Sep 2020 14:33:16 -0400 Subject: [PATCH 6/7] Revert "drop user-select in sankey and parcoords" This reverts commit 89e1342af0b2288652e97b8bd3fe4e96aafe4461. --- src/plot_api/plot_api.js | 1 + src/traces/parcoords/parcoords.js | 7 +++++-- src/traces/sankey/render.js | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/plot_api/plot_api.js b/src/plot_api/plot_api.js index d4f34bd3b7f..aa0715ca8d0 100644 --- a/src/plot_api/plot_api.js +++ b/src/plot_api/plot_api.js @@ -3725,6 +3725,7 @@ function makePlotFramework(gd) { // Make the svg container fullLayout._paperdiv = fullLayout._container.selectAll('.svg-container').data([0]); fullLayout._paperdiv.enter().append('div') + .classed('user-select-none', true) .classed('svg-container', true) .style('position', 'relative'); diff --git a/src/traces/parcoords/parcoords.js b/src/traces/parcoords/parcoords.js index 9a20e792043..d314f9ad4c8 100644 --- a/src/traces/parcoords/parcoords.js +++ b/src/traces/parcoords/parcoords.js @@ -350,7 +350,8 @@ function styleExtentTexts(selection) { selection .classed(c.cn.axisExtentText, true) .attr('text-anchor', 'middle') - .style('cursor', 'default'); + .style('cursor', 'default') + .style('user-select', 'none'); } function parcoordsInteractionState() { @@ -654,7 +655,8 @@ module.exports = function parcoords(gd, cdModule, layout, callbacks) { axis.selectAll('text') .style('text-shadow', '1px 1px 1px #fff, -1px -1px 1px #fff, 1px -1px 1px #fff, -1px 1px 1px #fff') - .style('cursor', 'default'); + .style('cursor', 'default') + .style('user-select', 'none'); var axisHeading = axisOverlays.selectAll('.' + c.cn.axisHeading) .data(repeat, keyFun); @@ -671,6 +673,7 @@ module.exports = function parcoords(gd, cdModule, layout, callbacks) { .classed(c.cn.axisTitle, true) .attr('text-anchor', 'middle') .style('cursor', 'ew-resize') + .style('user-select', 'none') .style('pointer-events', 'auto'); axisTitle diff --git a/src/traces/sankey/render.js b/src/traces/sankey/render.js index 3bd24ebc205..031d31ebdb1 100644 --- a/src/traces/sankey/render.js +++ b/src/traces/sankey/render.js @@ -1026,6 +1026,7 @@ module.exports = function(gd, svg, calcData, layout, callbacks) { .append('text') .classed(c.cn.nodeLabel, true) .attr('transform', textFlip) + .style('user-select', 'none') .style('cursor', 'default') .style('fill', 'black'); From aac45faaf474ff8eb87045806d6f49adeaa67b5e Mon Sep 17 00:00:00 2001 From: archmoj Date: Fri, 25 Sep 2020 14:59:30 -0400 Subject: [PATCH 7/7] re-drop user-select in sankey and parcoords ONLY --- src/traces/parcoords/parcoords.js | 7 ++----- src/traces/sankey/render.js | 1 - 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/traces/parcoords/parcoords.js b/src/traces/parcoords/parcoords.js index d314f9ad4c8..9a20e792043 100644 --- a/src/traces/parcoords/parcoords.js +++ b/src/traces/parcoords/parcoords.js @@ -350,8 +350,7 @@ function styleExtentTexts(selection) { selection .classed(c.cn.axisExtentText, true) .attr('text-anchor', 'middle') - .style('cursor', 'default') - .style('user-select', 'none'); + .style('cursor', 'default'); } function parcoordsInteractionState() { @@ -655,8 +654,7 @@ module.exports = function parcoords(gd, cdModule, layout, callbacks) { axis.selectAll('text') .style('text-shadow', '1px 1px 1px #fff, -1px -1px 1px #fff, 1px -1px 1px #fff, -1px 1px 1px #fff') - .style('cursor', 'default') - .style('user-select', 'none'); + .style('cursor', 'default'); var axisHeading = axisOverlays.selectAll('.' + c.cn.axisHeading) .data(repeat, keyFun); @@ -673,7 +671,6 @@ module.exports = function parcoords(gd, cdModule, layout, callbacks) { .classed(c.cn.axisTitle, true) .attr('text-anchor', 'middle') .style('cursor', 'ew-resize') - .style('user-select', 'none') .style('pointer-events', 'auto'); axisTitle diff --git a/src/traces/sankey/render.js b/src/traces/sankey/render.js index 031d31ebdb1..3bd24ebc205 100644 --- a/src/traces/sankey/render.js +++ b/src/traces/sankey/render.js @@ -1026,7 +1026,6 @@ module.exports = function(gd, svg, calcData, layout, callbacks) { .append('text') .classed(c.cn.nodeLabel, true) .attr('transform', textFlip) - .style('user-select', 'none') .style('cursor', 'default') .style('fill', 'black');