Skip to content

Is it possible to add context menu on the data point when user does a right click on the mouse? #2312

@darewreck54

Description

@darewreck54

Hi,

I'm trying to enable the ability to right click on a data point on the chart. It seems to implement this feature two things need to happen:

  1. Add a listener for the right click even "context menu" event. l looked at double click handler implementation #1952 where they added a listener for the double click event. I'm assuming that you would do that same.

  2. Once there is a hook for it, I can then get the x and y coordinate and overlay a custom dev menu.

Question:

  1. Is this the best approach for this or is there any easier way?
  2. Is there a way to extend c3 vs modifying the original code base. I took a look at https://github.com/c3js/c3/releases/tag/0.3.0 and it's not really clear what I would do.

Would i just do something like this:

c3.chart.internal.generateEventRectsForSingleX = (eventRectEnter) => {
       const $$ = this, d3 = $$.d3, config = $$.config;
       eventRectEnter.append("rect")
           .attr("class", $$.classEvent.bind($$))
           .style("cursor", config.data_selection_enabled && config.data_selection_grouped ? "pointer" : null)
           .on('mouseover', function (d) {
               ....
           })
           .on('mouseout', function (d) {
              ....
           })
           .on('mousemove', function (d) {
             ...
           })
           .on('click', function (d) {
             ...
           })
           .on('contextmenu', function (d) {
              < Add Logic for call back to render the menu >
           })
           .call(
               config.data_selection_draggable && $$.drag ? (
                   d3.behavior.drag().origin(Object)
                       .on('drag', function () { $$.drag(d3.mouse(this)); })
                       .on('dragstart', function () { $$.dragstart(d3.mouse(this)); })
                       .on('dragend', function () { $$.dragend(); })
               ) : function () {}
           );
     };
  1. I'm also doing this in typescript so i'm having issue with the first line since none of these are defined in the scope of my class and not sure how I would keep the underlying implementation but extend it.

const $$ = this, d3 = $$.d3, config = $$.config;

Thanks,
Derek

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions