diff --git a/lib/plox.ex b/lib/plox.ex
index 6a92b12..26dc04a 100644
--- a/lib/plox.ex
+++ b/lib/plox.ex
@@ -234,7 +234,14 @@ defmodule Plox do
phx-click={
if assigns[:"phx-click"],
do:
- JS.push(assigns[:"phx-click"], value: %{id: point.data_point.id, dataset_id: @dataset.id})
+ JS.push(assigns[:"phx-click"],
+ value: %{
+ id: point.data_point.id,
+ dataset_id: @dataset.id,
+ x_pixel: point.x,
+ y_pixel: point.y
+ }
+ )
}
phx-target={assigns[:"phx-target"]}
style={if assigns[:"phx-click"], do: "cursor: pointer;"}
@@ -274,7 +281,12 @@ defmodule Plox do
if assigns[:"phx-click"],
do:
JS.push(assigns[:"phx-click"],
- value: %{id: point.data_point.id, dataset_id: @dataset.id}
+ value: %{
+ id: point.data_point.id,
+ dataset_id: @dataset.id,
+ x_pixel: point.x,
+ y_pixel: point.y
+ }
)
}
phx-target={assigns[:"phx-target"]}
@@ -304,32 +316,31 @@ defmodule Plox do
attr :dataset, :any, required: true
attr :point_id, :any, required: true
-
attr :x, :atom, default: :x, doc: "The dataset axis key to use for x values"
attr :y, :atom, default: :y, doc: "The dataset axis key to use for y values"
+ attr :x_pixel, :any, required: true
+ attr :y_pixel, :any, required: true
+
attr :"phx-click-away", :any
attr :"phx-target", :any, default: nil
slot :inner_block, required: true
def tooltip(assigns) do
- point = GraphDataset.to_graph_point(assigns.dataset, assigns.x, assigns.y, assigns.point_id)
-
- assigns =
- assign(assigns, point: point)
+ assigns = assign(assigns, data_point: GraphDataset.get_point(assigns.dataset, assigns.point_id))
~H"""
- <%= render_slot(@inner_block, @point.data_point.original) %>
+ <%= render_slot(@inner_block, @data_point.original) %>
"""
@@ -347,6 +358,9 @@ defmodule Plox do
attr :orientation, :atom, values: [:vertical, :horizontal], default: :horizontal
+ attr :"phx-click", :any, default: nil
+ attr :"phx-target", :any, default: nil
+
def area_plot(%{orientation: :horizontal} = assigns) do
~H"""
<%= for [scalar1, scalar2] <- area_points(@dataset, @area, @orientation), rect_color = GraphDataset.to_color(@dataset, @color, scalar1.data_point) do %>
@@ -360,6 +374,21 @@ defmodule Plox do
width={scalar2.value - scalar1.value}
x={scalar1.value}
y={@dataset.dimensions.margin.top}
+ phx-click={
+ if assigns[:"phx-click"],
+ do:
+ JS.push(assigns[:"phx-click"],
+ value: %{
+ start_area_point_id: scalar1.data_point.id,
+ end_area_point_id: scalar2.data_point.id,
+ dataset_id: @dataset.id,
+ x_pixel: scalar1.value + (scalar2.value - scalar1.value) / 2,
+ y_pixel: @dataset.dimensions.margin.top + @dataset.dimensions.height / 2
+ }
+ )
+ }
+ style={if assigns[:"phx-click"], do: "cursor: pointer;"}
+ phx-target={assigns[:"phx-target"]}
/>
<% end %>
"""
@@ -378,6 +407,21 @@ defmodule Plox do
}
x={@dataset.dimensions.margin.left}
y={scalar1.value - (scalar1.value - scalar2.value)}
+ phx-click={
+ if assigns[:"phx-click"],
+ do:
+ JS.push(assigns[:"phx-click"],
+ value: %{
+ start_area_point_id: scalar1.data_point.id,
+ end_area_point_id: scalar2.data_point.id,
+ dataset_id: @dataset.id,
+ x_pixel: @dataset.dimensions.margin.left + @dataset.dimensions.width / 2,
+ y_pixel: scalar2.value + (scalar1.value - scalar2.value) / 2
+ }
+ )
+ }
+ style={if assigns[:"phx-click"], do: "cursor: pointer;"}
+ phx-target={assigns[:"phx-target"]}
/>
<% end %>
"""
diff --git a/lib/plox/graph_dataset.ex b/lib/plox/graph_dataset.ex
index 254b463..b7043b3 100644
--- a/lib/plox/graph_dataset.ex
+++ b/lib/plox/graph_dataset.ex
@@ -14,6 +14,12 @@ defmodule Plox.GraphDataset do
%__MODULE__{id: id, dataset: dataset, dimensions: dimensions}
end
+ def get_point(dataset, point_id) do
+ Enum.find_value(dataset.dataset.data, fn data_point ->
+ if data_point.id == point_id, do: data_point
+ end)
+ end
+
def get_scale!(%__MODULE__{dataset: dataset, dimensions: dimensions}, key) do
case Map.fetch(dataset.scales, key) do
{:ok, scale} ->