-module (wf_render_elements). %%-author('Maxim Sokhatsky'). -include_lib ("nitro/include/nitro.hrl"). -include_lib ("nitro/include/comboLookupEdit.hrl"). -export([ render_element/1 ]). render_element(E) when erlang:is_list(E) -> E; render_element(Element) when erlang:is_tuple(Element) -> Id = case erlang:element(#element.id, Element) of [] -> []; undefined -> undefined; %% todo check maybe rm? L when erlang:is_list(L) -> L; Other -> nitro:to_list(Other) end, case erlang:element(#element.actions, Element) of [] -> skip; Actions -> nitro:wire(Actions) end, Tag = case erlang:element(#element.html_tag, Element) of [] -> nitro:to_binary(erlang:element(1, Element)); T -> T end, case erlang:element(1, Element) of comboLookupEdit -> lists:map(fun(El) -> Input = case erlang:element(#element.body, El) of Body when not (Body == []) and erlang:is_list(Body) -> case erlang:element(#element.body, hd(lists:flatten(tl(Body)))) of X when erlang:is_tuple(X)-> X; _ -> El end; _ -> El end, InputId = erlang:element(#element.id, Input), case erlang:element(#element.validation, Input) of [] -> skip; InputCode -> nitro:wire(nitro:f("{var name='~s'; qi(name) && qi(name).addEventListener('validation'," "function(e) { if (!(~s)) e.preventDefault(); });" "if(qi(name)) qi(name).validation = true;}", [InputId, InputCode])) end end, lists:flatten(tl(erlang:element(#element.body, erlang:element(#comboLookupEdit.form, Element))))); _ -> case erlang:element(#element.validation, Element) of [] -> skip; Code -> nitro:wire(nitro:f("{var name='~s'; qi(name) && qi(name).addEventListener('validation'," "function(e) { if (!(~s)) e.preventDefault(); });" "if(qi(name)) qi(name).validation = true;}", [Id, Code])) end end, case erlang:element(#element.module, Element) of [] -> default_render(Tag, Element); undefined -> default_render(Tag, Element); %% todo check maybe rm? Module -> nitro:to_binary( Module:render_element( erlang:setelement(#element.id, Element, Id) ) ) end; render_element(Element) -> io:format("Unknown Element: ~p~n\r", [Element]). default_render(Tag, Record) -> wf_tags:emit_tag(Tag, nitro:render(lists:flatten( [erlang:element(#element.body, Record)] )), lists:append([ [{<<"id">>, erlang:element(#element.id, Record)}, %% todo check bench/compare erlang asm/refactoring {<<"data-bind">>, erlang:element(#element.bind, Record)}, {<<"class">>, erlang:element(#element.class, Record)}, {<<"style">>, erlang:element(#element.style, Record)}, {<<"title">>, erlang:element(#element.title, Record)}, {<<"accesskey">>, erlang:element(#element.accesskey, Record)}, {<<"contenteditable">>, erlang:element(#element.contenteditable, Record)}, {<<"contextmenu">>, erlang:element(#element.contextmenu, Record)}, {<<"dir">>, erlang:element(#element.dir, Record)}, {<<"draggable">>, erlang:element(#element.draggable, Record)}, {<<"dropzone">>, erlang:element(#element.dropzone, Record)}, {<<"hidden">>, erlang:element(#element.hidden, Record)}, {<<"lang">>, erlang:element(#element.lang, Record)}, {<<"onclick">>, erlang:element(#element.onclick, Record)}, {<<"spellcheck">>, erlang:element(#element.spellcheck, Record)}, {<<"translate">>, erlang:element(#element.translate, Record)}, {<<"tabindex">>, erlang:element(#element.tabindex, Record)}, {<<"onmouseout">>, erlang:element(#element.onmouseout, Record)}, {<<"onmouseover">>, erlang:element(#element.onmouseover, Record)}, {<<"onmousemove">>, erlang:element(#element.onmousemove, Record)}, {<<"role">>, erlang:element(#element.role, Record)}], erlang:element(#element.data_fields, Record), erlang:element(#element.aria_states, Record) ]) ).