defmodule SigmaKit.Components.Charts do use Phoenix.LiveComponent @globals ~w(grid legend time_unit x_format y_format) # prop y_label_format, :string, options: ["dollar", "percent"] attr :chart_id, :string, required: true attr :options, :map, required: true attr :class, :any, default: "" attr :autocolor, :boolean, default: false attr :canvas_width, :string, default: "100%" attr :canvas_height, :string, default: "100%" attr :y_label_format, :any, default: nil def chart(assigns) do ~H"""
""" end attr :chart_id, :string, required: true attr :class, :any, default: "" attr :canvas_width, :string, default: "100%" attr :canvas_height, :string, default: "100%" attr :rest, :global, include: @globals def bar_chart(assigns) do ~H""" <.chart canvas_width={@canvas_width} canvas_height={@canvas_height} chart_id={@chart_id} class={@class} options={build_options("bar", @rest)} /> """ end attr :chart_id, :string, required: true attr :class, :any, default: "" attr :rest, :global, include: @globals attr :canvas_width, :string, default: "100%" attr :canvas_height, :string, default: "100%" def line_chart(assigns) do ~H""" <.chart canvas_width={@canvas_width} canvas_height={@canvas_height} chart_id={@chart_id} class={@class} options={build_options("line", @rest)} /> """ end attr :chart_id, :string, required: true attr :class, :any, default: "" attr :canvas_width, :string, default: "100%" attr :canvas_height, :string, default: "100%" attr :rest, :global, include: @globals def pie_chart(assigns) do ~H""" <.chart canvas_width={@canvas_width} canvas_height={@canvas_height} chart_id={@chart_id} class={@class} options={build_options("pie", @rest, grid: false, legend: true)} /> """ end attr :chart_id, :string, required: true attr :class, :any, default: "" attr :canvas_width, :string, default: "100%" attr :canvas_height, :string, default: "100%" attr :rest, :global, include: @globals def scatter_chart(assigns) do ~H""" <.chart canvas_width={@canvas_width} canvas_height={@canvas_height} chart_id={@chart_id} class={@class} options={build_options("scatter", @rest)} /> """ end attr :chart_id, :string, required: true attr :class, :any, default: "" attr :canvas_width, :string, default: "100%" attr :canvas_height, :string, default: "100%" attr :rest, :global, include: @globals def bubble_chart(assigns) do ~H""" <.chart canvas_width={@canvas_width} canvas_height={@canvas_height} chart_id={@chart_id} class={@class} options={build_options("bubble", @rest)} /> """ end defp build_options(type, opts, defaults \\ []) do opts = Enum.into(defaults, opts) grid = Map.get(opts, :grid, true) legend = Map.get(opts, :legend, false) x_format = Map.get(opts, :x_format, "timeseries") time_unit = Map.get(opts, :time_unit, nil) %{ type: type, options: %{ animation: false, maintainAspectRatio: false, responsive: true, tension: 0.4, pointRadius: 1, scales: %{ y: %{ border: %{ display: false }, grid: %{ display: grid, drawBorder: grid, drawTicks: grid }, ticks: %{ display: grid } }, x: %{ type: x_format, time: %{ unit: time_unit, round: true }, border: %{ display: false }, grid: %{ display: grid, drawBorder: grid }, ticks: %{ display: grid } } }, plugins: %{ legend: %{ display: legend } }, interaction: %{ intersect: false, mode: "nearest" } } } end end