wf_render_elements.erl 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. -module (wf_render_elements).
  2. %%-author('Maxim Sokhatsky').
  3. -include_lib ("nitro/include/nitro.hrl").
  4. -include_lib ("nitro/include/comboLookupEdit.hrl").
  5. -export([
  6. render_element/1
  7. ]).
  8. render_element(E) when erlang:is_list(E) -> E;
  9. render_element(Element) when erlang:is_tuple(Element) ->
  10. Id = case erlang:element(#element.id, Element) of
  11. [] -> [];
  12. undefined -> undefined; %% todo check maybe rm?
  13. L when erlang:is_list(L) -> L;
  14. Other -> nitro:to_list(Other)
  15. end,
  16. case erlang:element(#element.actions, Element) of
  17. [] -> skip;
  18. Actions -> nitro:wire(Actions)
  19. end,
  20. Tag = case erlang:element(#element.html_tag, Element) of
  21. [] -> nitro:to_binary(erlang:element(1, Element));
  22. T -> T
  23. end,
  24. case erlang:element(1, Element) of
  25. comboLookupEdit ->
  26. lists:map(fun(El) ->
  27. Input = case erlang:element(#element.body, El) of
  28. Body when not (Body == []) and erlang:is_list(Body) ->
  29. case erlang:element(#element.body, hd(lists:flatten(tl(Body)))) of
  30. X when erlang:is_tuple(X)-> X;
  31. _ -> El
  32. end;
  33. _ -> El
  34. end,
  35. InputId = erlang:element(#element.id, Input),
  36. case erlang:element(#element.validation, Input) of
  37. [] -> skip;
  38. InputCode ->
  39. nitro:wire(nitro:f("{var name='~s'; qi(name) && qi(name).addEventListener('validation',"
  40. "function(e) { if (!(~s)) e.preventDefault(); });"
  41. "if(qi(name)) qi(name).validation = true;}", [InputId, InputCode]))
  42. end
  43. end, lists:flatten(tl(erlang:element(#element.body, erlang:element(#comboLookupEdit.form, Element)))));
  44. _ ->
  45. case erlang:element(#element.validation, Element) of
  46. [] -> skip;
  47. Code ->
  48. nitro:wire(nitro:f("{var name='~s'; qi(name) && qi(name).addEventListener('validation',"
  49. "function(e) { if (!(~s)) e.preventDefault(); });"
  50. "if(qi(name)) qi(name).validation = true;}", [Id, Code]))
  51. end
  52. end,
  53. case erlang:element(#element.module, Element) of
  54. [] -> default_render(Tag, Element);
  55. undefined -> default_render(Tag, Element); %% todo check maybe rm?
  56. Module ->
  57. nitro:to_binary( Module:render_element( erlang:setelement(#element.id, Element, Id) ) )
  58. end;
  59. render_element(Element) ->
  60. io:format("Unknown Element: ~p~n\r", [Element]).
  61. default_render(Tag, Record) ->
  62. wf_tags:emit_tag(Tag, nitro:render(lists:flatten( [erlang:element(#element.body, Record)] )),
  63. lists:append([
  64. [{<<"id">>, erlang:element(#element.id, Record)}, %% todo check bench/compare erlang asm/refactoring
  65. {<<"data-bind">>, erlang:element(#element.bind, Record)},
  66. {<<"class">>, erlang:element(#element.class, Record)},
  67. {<<"style">>, erlang:element(#element.style, Record)},
  68. {<<"title">>, erlang:element(#element.title, Record)},
  69. {<<"accesskey">>, erlang:element(#element.accesskey, Record)},
  70. {<<"contenteditable">>, erlang:element(#element.contenteditable, Record)},
  71. {<<"contextmenu">>, erlang:element(#element.contextmenu, Record)},
  72. {<<"dir">>, erlang:element(#element.dir, Record)},
  73. {<<"draggable">>, erlang:element(#element.draggable, Record)},
  74. {<<"dropzone">>, erlang:element(#element.dropzone, Record)},
  75. {<<"hidden">>, erlang:element(#element.hidden, Record)},
  76. {<<"lang">>, erlang:element(#element.lang, Record)},
  77. {<<"onclick">>, erlang:element(#element.onclick, Record)},
  78. {<<"spellcheck">>, erlang:element(#element.spellcheck, Record)},
  79. {<<"translate">>, erlang:element(#element.translate, Record)},
  80. {<<"tabindex">>, erlang:element(#element.tabindex, Record)},
  81. {<<"onmouseout">>, erlang:element(#element.onmouseout, Record)},
  82. {<<"onmouseover">>, erlang:element(#element.onmouseover, Record)},
  83. {<<"onmousemove">>, erlang:element(#element.onmousemove, Record)},
  84. {<<"role">>, erlang:element(#element.role, Record)}],
  85. erlang:element(#element.data_fields, Record),
  86. erlang:element(#element.aria_states, Record)
  87. ]) ).