Browse Source

allow #jq{} targets from querySelectorAll()

Andrii Zadorozhnii 4 years ago
parent
commit
8ef9c4ddca
2 changed files with 8 additions and 1 deletions
  1. 4 1
      src/actions/action_jq.erl
  2. 4 0
      src/render/wf_event.erl

+ 4 - 1
src/actions/action_jq.erl

@@ -8,12 +8,15 @@
 -define(R(E), nitro:render(E)).
 -define(T(T), wf_event:target(T)).
 -define(U, undefined).
+-define(M, {".map(i=>i.", ");"}).
+-define(P, {".", ";"}).
 
 render_action(#jq{property=?U,target=T,method=Methods,args=Args0,format=F}) ->
     Args = case F of "'~s'" -> [ ?R(Args0) ]; _ -> Args0 end,
     Format = fun(A) when is_tuple(A) orelse is_integer(A) -> ?R(A); (A) -> nitro:to_list(A) end,
     RenderedArgs = string:join([ Format(A) || A <- Args], ","),
-    [[?T(T),".",?B(M),"(",nitro:f(F,[RenderedArgs]),");"] || M <- Methods];
+    {Op,Op2} = case T of {qa,_} ->  ?M;{_,{qa,_},_} -> ?M; _ -> ?P end,
+    [[?T(T),Op,?B(M),"(",nitro:f(F,[RenderedArgs]),")", Op2] || M <- Methods];
 render_action(#jq{target=T,method=?U,property=P,right=R,args=simple}) -> [?B(T),".",?B(P),"='",?R(R),"';"];
 render_action(#jq{target=T,method=?U,property=P,right=?U})            -> [?T(T),".",?B(P),";"];
 render_action(#jq{target=T,method=?U,property=P,right=#jq{}=R})       -> [?T(T),".",?B(P),"=", ?R(R), ";"];

+ 4 - 0
src/render/wf_event.erl

@@ -9,10 +9,14 @@
 
 -define(B(E), nitro:to_binary(E)).
 -define(L(E), nitro:to_list(E)).
+target({ps, {qa, Id}, Ps}) ->
+  T = target({qa,Id}), P = nitro:js_escape(Ps),
+  ["var t=",T,";t.map(ts => '",P,"'.split('.').reduce((a,p)=>(a&&a[p]?a[p]:null),ts)).filter(o=>o)"];
 target({ps,Id,Ps}) ->
   T = target(Id), P = nitro:js_escape(Ps),
   ["var ts=",T,",ps = '",P,"'.split('.').reduce((a,p)=>(a&&a[p]?a[p]:null),ts);","ps&&ps"];
 target({qs,S}) -> ["qs('",nitro:js_escape(?L(S)), "')"];
+target({qa,S}) -> ["Array.from(qa('",nitro:js_escape(?L(S)), "'))"];
 target({g,T})  -> nitro:js_escape(?L(T));
 target(Id)     -> ["qi('",nitro:js_escape(?L(Id)),"')"].