Packages
Nitrogen Web Framework Core Library
Current section
Files
Jump to
Current section
Files
src/elements/other/element_progress_bar.erl
% vim: sw=4 ts=4 et ft=erlang
% Nitrogen Web Framework for Erlang
% Copyright (c) 2014 Jesse Gumm
% See MIT-LICENSE for licensing information.
-module (element_progress_bar).
-include("wf.hrl").
-export([
reflect/0,
render_element/1
]).
-spec reflect() -> [atom()].
reflect() -> record_info(fields, progress_bar).
-spec render_element(#progress_bar{}) -> html().
render_element(Rec = #progress_bar{value=Value, color=Color, max=Max, label=Label} ) ->
LabelElement = render_label(Label, Value, Max),
Tempid = wf:temp_id(),
Class = create_class(Tempid, Label, Rec#progress_bar.class),
wire_init(Tempid, Value, Max, Color),
wf_tags:emit_tag('div', LabelElement, [
{style, Rec#progress_bar.style},
{title, Rec#progress_bar.title},
{id, Rec#progress_bar.html_id},
{class, Class}
]).
create_class(Tempid, Label, CurClass) ->
%% This is is the class we'll use to identify our in initialization
Classid = wf_render_elements:normalize_id(Tempid),
%% This will be an identifier class which nitrogen.js will use to determine
%% how to format the label.
LabelClass = label_class(Label),
[Classid, LabelClass | CurClass].
wire_init(ID, Val, Max, Color) ->
RenderedValue = render_value(Val),
wf:wire(wf:f("Nitrogen.$init_progress_bar('~s', ~p, ~p, '~s');", [ID, RenderedValue, Max, Color])).
render_value(undefined) ->
false;
render_value(V) ->
V.
label_class(undefined) ->
'progressbar-label-none';
label_class(Atom) when is_atom(Atom) ->
wf:to_atom(wf:to_list(['progressbar-label-',Atom]));
label_class(Str) when is_list(Str); is_binary(Str) ->
'progressbar-label-string'.
render_label(Label, undefined, _Max) when is_atom(Label) ->
[];
render_label(undefined, _Val, _Max) ->
[];
render_label(percent, Val, Max) when Val=/=undefined ->
#panel{class=['progressbar-label'], text=render_percent(Val, Max)};
render_label(ratio, Val, Max) when Val=/=undefined ->
#panel{class=['progressbar-label'], text=render_ratio(Val, Max)};
render_label(both, Val, Max) when Val=/=undefined ->
#panel{class=['progressbar-label'], text=render_both(Val, Max)};
render_label(String, _, _) when is_list(String); is_binary(String) ->
#panel{class=['progressbar-label'], text=String}.
render_both(Val, Max) ->
[render_percent(Val, Max), " (", render_ratio(Val, Max), ")"].
render_percent(Val, Max) ->
Percent = Val * 100 div Max,
[wf:to_list(Percent),"%"].
render_ratio(Val, Max) ->
[wf:to_list(Val),"/",wf:to_list(Max)].