Current section

Files

Jump to
bh lib bh bh4 progress.ex
Raw

lib/bh/bh4/progress.ex

defmodule Bh.Bh4.Progress do
@moduledoc """
Twitter Bootstrap 4 progress bar helpers for Phoenix.
## Examples
Real live examples can be found on the site of the
[Project](https://kovpack.github.io/bh/).
"""
@allowed_opts [:percentage, :context, :striped]
@contexts [:success, :info, :warning, :danger]
use Phoenix.HTML
@doc """
Generates progress bar HTML markup.
## Options
* `:percentage` - used as a value of a progress bar. Default value - 0
(zero progress).
* `:context` - context of the progress bar. Be default context is not
needed, which renderes blue proggress bar. Allowed options: `:success`,
`:info`, `:warning` and `:danger`.
* `:striped` - boolean value. Pass `:true` if you need striped progress
bar. By default progress bar is not striped.
## Examples
Render default HTML5 `progress`:
<%= bh_progress percentage: 50 %>
<progress class="progress" max="100" value="50">%</progress>
"""
def bh_progress(opts \\ []) do
opts = Bh.Service.leave_allowed_opts(opts, @allowed_opts)
final_opts =
[]
|> Keyword.put(:class, "progress")
|> Keyword.put(:max, 100)
|> put_percentage(opts)
|> put_progress_context(opts)
|> put_striped(opts)
render_bh_progress(final_opts)
end
defp render_bh_progress(final_opts) do
content_tag(:progress, "#{final_opts[:value]}%", final_opts)
end
defp put_striped(final_opts, opts) do
if Keyword.has_key?(opts, :striped) && is_boolean(opts[:striped]) do
extra_class =
case opts[:striped] do
true -> "progress-striped"
_ -> ""
end
Keyword.put(final_opts, :class, "#{final_opts[:class]} #{extra_class}")
else
final_opts
end
end
defp put_progress_context(final_opts, opts) do
if Keyword.has_key?(opts, :context) && opts[:context] in @contexts do
with extra_class = "progress-#{opts[:context]}" do
Keyword.put(final_opts, :class, "#{final_opts[:class]} #{extra_class}")
end
else
final_opts
end
end
defp put_percentage(final_opts, opts) do
if Keyword.has_key?(opts, :percentage) do
Keyword.put(final_opts, :value, opts[:percentage])
else
Keyword.put(final_opts, :value, 0)
end
end
end