wf_render_elements.erl 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. -module (wf_render_elements).
  2. -author('Maxim Sokhatsky').
  3. -include_lib ("nitro/include/nitro.hrl").
  4. -compile(export_all).
  5. render_element(E) when is_list(E) -> E;
  6. render_element(Element) when is_tuple(Element) ->
  7. Id = case element(#element.id,Element) of
  8. undefined -> undefined;
  9. L when is_list(L) -> L;
  10. Other -> nitro:to_list(Other) end,
  11. case element(#element.actions,Element) of undefined -> skip; Actions -> nitro:wire(Actions) end,
  12. Tag = case element(#element.html_tag,Element) of undefined -> nitro:to_binary(element(1, Element)); T -> T end,
  13. case element(#element.validation,Element) of
  14. [] -> skip;
  15. Code ->
  16. nitro:wire(nitro:f("{var name='~s'; qi(name)"
  17. ".addEventListener('validation',"
  18. "function(e) { if (!(~s)) e.preventDefault(); });"
  19. "qi(name).validation = true;}",[Id,Code]))
  20. end,
  21. case element(#element.module,Element) of
  22. undefined ->
  23. default_render(Tag, Element);
  24. Module ->
  25. nitro:to_binary(Module:render_element(setelement(#element.id,Element,Id))) end;
  26. render_element(Element) -> io:format("Unknown Element: ~p~n\r",[Element]).
  27. default_render(Tag, Record) ->
  28. wf_tags:emit_tag(Tag, nitro:render(element(#element.body,Record)),
  29. lists:append([
  30. [{<<"id">>, element(#element.id, Record)},
  31. {<<"class">>, element(#element.class, Record)},
  32. {<<"style">>, element(#element.style, Record)},
  33. {<<"title">>, element(#element.title, Record)},
  34. {<<"accesskey">>, element(#element.accesskey, Record)},
  35. {<<"contenteditable">>, element(#element.contenteditable, Record)},
  36. {<<"contextmenu">>, element(#element.contextmenu, Record)},
  37. {<<"dir">>, element(#element.dir, Record)},
  38. {<<"draggable">>, element(#element.draggable, Record)},
  39. {<<"dropzone">>, element(#element.dropzone, Record)},
  40. {<<"hidden">>, element(#element.hidden, Record)},
  41. {<<"lang">>, element(#element.lang, Record)},
  42. {<<"spellcheck">>, element(#element.spellcheck, Record)},
  43. {<<"translate">>, element(#element.translate, Record)}],
  44. element(#element.data_fields, Record),
  45. element(#element.aria_states, Record)])).