element_select.erl 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. -module(element_select).
  2. %%-author('Maxim Sokhatsky').
  3. -include_lib("nitro/include/nitro.hrl").
  4. -include_lib("nitro/include/event.hrl").
  5. -export([
  6. render_element/1
  7. ]).
  8. render_element(Record) when Record#select.show_if == false -> [<<>>];
  9. render_element(Record = #select{}) ->
  10. ID = case Record#select.id of
  11. [] -> nitro:temp_id();
  12. I -> I
  13. end,
  14. case Record#select.postback of
  15. [] -> skip;
  16. Postback ->
  17. nitro:wire( #event{type = change, target = ID,
  18. postback = Postback,
  19. source = [ nitro:to_atom(ID)|Record#select.source ],
  20. delegate = Record#select.delegate} )
  21. end,
  22. Props = [
  23. {<<"id">>, ID},
  24. {<<"class">>, Record#select.class},
  25. {<<"style">>, Record#select.style},
  26. {<<"name">>, Record#select.name},
  27. {<<"onchange">>, Record#select.onchange},
  28. {<<"title">>, Record#select.title},
  29. {<<"required">>,
  30. case Record#select.required of
  31. true -> <<"required">>;
  32. _ -> []
  33. end},
  34. {<<"disabled">>,
  35. case Record#select.disabled of
  36. true -> <<"disabled">>;
  37. _ -> []
  38. end},
  39. {<<"multiple">>,
  40. case Record#select.multiple of
  41. true -> <<"multiple">>;
  42. _ -> []
  43. end} | Record#select.data_fields
  44. ],
  45. wf_tags:emit_tag(<<"select">>, nitro:render(Record#select.body), Props);
  46. render_element(Group = #optgroup{}) ->
  47. wf_tags:emit_tag(<<"optgroup">>, nitro:render(Group#optgroup.body), [
  48. {<<"disabled">>,
  49. case Group#optgroup.disabled of
  50. true -> <<"disabled">>;
  51. _ -> []
  52. end},
  53. {<<"label">>, Group#optgroup.label}
  54. ]);
  55. render_element(O = #option{}) ->
  56. wf_tags:emit_tag(<<"option">>, nitro:render(O#option.body), lists:flatten([get_attrs(O) | O#option.data_fields])).
  57. get_attrs(O) ->
  58. ValueAttr = case {O#option.selected, O#option.disabled} of
  59. {true, true} -> <<"selected disabled value">>;
  60. {true, _} -> <<"selected value">>;
  61. {_, true} -> <<"disabled value">>;
  62. _ -> <<"value">>
  63. end,
  64. [{<<"id">>, O#option.id},
  65. {<<"label">>, O#option.label},
  66. {<<"title">>, O#option.title},
  67. {ValueAttr, O#option.value}
  68. ].