/modules/mod_base/actions/action_base_update.erl

http://github.com/zotonic/zotonic · Erlang · 104 lines · 79 code · 8 blank · 17 comment · 0 complexity · 8439f441b7b1785719e7e8bcf6d0d846 MD5 · raw file

  1. %% @author Marc Worrell <marc@worrell.nl>
  2. %% @copyright 2009-2015 Marc Worrell
  3. %% Date: 2009-07-16
  4. %% @doc Replace the content of the target with the result of a render action.
  5. %% Copyright 2009-2015 Marc Worrell
  6. %%
  7. %% Licensed under the Apache License, Version 2.0 (the "License");
  8. %% you may not use this file except in compliance with the License.
  9. %% You may obtain a copy of the License at
  10. %%
  11. %% http://www.apache.org/licenses/LICENSE-2.0
  12. %%
  13. %% Unless required by applicable law or agreed to in writing, software
  14. %% distributed under the License is distributed on an "AS IS" BASIS,
  15. %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. %% See the License for the specific language governing permissions and
  17. %% limitations under the License.
  18. -module(action_base_update).
  19. -include("zotonic.hrl").
  20. -export([
  21. render_action/4,
  22. render_update/5,
  23. event/2
  24. ]).
  25. render_action(TriggerId, TargetId, Args, Context) ->
  26. render_update(update, TriggerId, TargetId, Args, Context).
  27. render_update(Method, TriggerId, TargetId, Args, Context) ->
  28. Html = case proplists:get_value(template, Args) of
  29. undefined ->
  30. proplists:get_value(text, Args, "");
  31. Template ->
  32. IsAll = proplists:get_value('include_all', Args),
  33. case z_convert:to_bool(proplists:get_value('catinclude', Args)) of
  34. true ->
  35. #render{template={cat, Template}, vars=Args, is_all=IsAll};
  36. false ->
  37. #render{template=Template, vars=Args, is_all=IsAll}
  38. end
  39. end,
  40. case {TargetId, Html} of
  41. {undefined,_} -> render_inline(Method, TargetId, Html, Args, Context);
  42. {_,#render{}} -> render_postback(Method, TriggerId, TargetId, Html, Args, Context);
  43. {_,_} -> render_static(Method, TargetId, Html, Args, Context)
  44. end.
  45. render_inline(Method, TargetId, Html, Args, Context) ->
  46. Sel = z_render:css_selector(TargetId, Args),
  47. case proplists:get_value(appear, Args) of
  48. true ->
  49. case Method of
  50. update -> {[], z_render:appear_selector(Sel, Html, Context)};
  51. replace -> {[], z_render:appear_replace_selector(Sel, Html, Context)};
  52. insert_top -> {[], z_render:appear_top_selector(Sel, Html, Context)};
  53. insert_bottom -> {[], z_render:appear_bottom_selector(Sel, Html, Context)};
  54. insert_before -> {[], z_render:appear_before_selector(Sel, Html, Context)};
  55. insert_after -> {[], z_render:appear_after_selector(Sel, Html, Context)};
  56. iframe -> {[], z_render:update_iframe(TargetId, Html, Context)}
  57. end;
  58. _ ->
  59. case Method of
  60. update -> {[], z_render:update_selector(Sel, Html, Context)};
  61. replace -> {[], z_render:replace_selector(Sel, Html, Context)};
  62. insert_top -> {[], z_render:insert_top_selector(Sel, Html, Context)};
  63. insert_bottom -> {[], z_render:insert_bottom_selector(Sel, Html, Context)};
  64. insert_before -> {[], z_render:insert_before_selector(Sel, Html, Context)};
  65. insert_after -> {[], z_render:insert_after_selector(Sel, Html, Context)};
  66. iframe -> {[], z_render:update_iframe(TargetId, Html, Context)}
  67. end
  68. end.
  69. render_static(Method, TargetId, Html, Args, Context) ->
  70. Sel = z_render:css_selector(TargetId, Args),
  71. case proplists:get_value(appear, Args) of
  72. true ->
  73. case Method of
  74. update -> {z_render:appear_selector_js(Sel, Html), Context};
  75. replace -> {z_render:appear_replace_selector_js(Sel, Html), Context};
  76. insert_top -> {z_render:appear_top_selector_js(Sel, Html), Context};
  77. insert_bottom -> {z_render:appear_bottom_selector_js(Sel, Html), Context};
  78. insert_before -> {z_render:appear_before_selector_js(Sel, Html), Context};
  79. insert_after -> {z_render:appear_after_selector_js(Sel, Html), Context}
  80. end;
  81. _ ->
  82. case Method of
  83. update -> {z_render:update_selector_js(Sel, Html), Context};
  84. replace -> {z_render:replace_selector_js(Sel, Html), Context};
  85. insert_top -> {z_render:insert_top_selector_js(Sel, Html), Context};
  86. insert_bottom -> {z_render:insert_bottom_selector_js(Sel, Html), Context};
  87. insert_before -> {z_render:insert_before_selector_js(Sel, Html), Context};
  88. insert_after -> {z_render:insert_after_selector_js(Sel, Html), Context}
  89. end
  90. end.
  91. render_postback(Method, TriggerId, TargetId, Html, Args, Context) ->
  92. {PostbackMsgJS, _PickledPostback} = z_render:make_postback({render, Method, Html, Args}, undefined, TriggerId, TargetId, ?MODULE, Context),
  93. {PostbackMsgJS, Context}.
  94. event(#postback{message={render, Method, Html, Args}, target=TargetId}, Context) ->
  95. {[], Context1} = render_inline(Method, TargetId, Html, Args, Context),
  96. Context1.