/modules/mod_base/actions/action_base_update.erl

https://code.google.com/p/zotonic/ · Erlang · 94 lines · 69 code · 8 blank · 17 comment · 0 complexity · 57766de58b20b5374889640338957250 MD5 · raw file

  1. %% @author Marc Worrell <marc@worrell.nl>
  2. %% @copyright 2009 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 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 -> proplists:get_value(text, Args, "");
  30. Template -> #render{template=Template, vars=Args}
  31. end,
  32. case {TargetId, Html} of
  33. {undefined,_} -> render_inline(Method, TargetId, Html, Args, Context);
  34. {_,#render{}} -> render_postback(Method, TriggerId, TargetId, Html, Args, Context);
  35. {_,_} -> render_static(Method, TargetId, Html, Args, Context)
  36. end.
  37. render_inline(Method, TargetId, Html, Args, Context) ->
  38. Sel = z_render:css_selector(TargetId, Args),
  39. case proplists:get_value(appear, Args) of
  40. true ->
  41. case Method of
  42. update -> {[], z_render:appear_selector(Sel, Html, Context)};
  43. replace -> {[], z_render:appear_replace_selector(Sel, Html, Context)};
  44. insert_top -> {[], z_render:appear_top_selector(Sel, Html, Context)};
  45. insert_bottom -> {[], z_render:appear_bottom_selector(Sel, Html, Context)};
  46. insert_before -> {[], z_render:appear_before_selector(Sel, Html, Context)};
  47. insert_after -> {[], z_render:appear_after_selector(Sel, Html, Context)}
  48. end;
  49. _ ->
  50. case Method of
  51. update -> {[], z_render:update_selector(Sel, Html, Context)};
  52. replace -> {[], z_render:replace_selector(Sel, Html, Context)};
  53. insert_top -> {[], z_render:insert_top_selector(Sel, Html, Context)};
  54. insert_bottom -> {[], z_render:insert_bottom_selector(Sel, Html, Context)};
  55. insert_before -> {[], z_render:insert_before_selector(Sel, Html, Context)};
  56. insert_after -> {[], z_render:insert_after_selector(Sel, Html, Context)}
  57. end
  58. end.
  59. render_static(Method, TargetId, Html, Args, Context) ->
  60. Sel = z_render:css_selector(TargetId, Args),
  61. case proplists:get_value(appear, Args) of
  62. true ->
  63. case Method of
  64. update -> {z_render:appear_selector_js(Sel, Html), Context};
  65. replace -> {z_render:appear_replace_selector_js(Sel, Html), Context};
  66. insert_top -> {z_render:appear_top_selector_js(Sel, Html), Context};
  67. insert_bottom -> {z_render:appear_bottom_selector_js(Sel, Html), Context};
  68. insert_before -> {z_render:appear_before_selector_js(Sel, Html), Context};
  69. insert_after -> {z_render:appear_after_selector_js(Sel, Html), Context}
  70. end;
  71. _ ->
  72. case Method of
  73. update -> {z_render:update_selector_js(Sel, Html), Context};
  74. replace -> {z_render:replace_selector_js(Sel, Html), Context};
  75. insert_top -> {z_render:insert_top_selector_js(Sel, Html), Context};
  76. insert_bottom -> {z_render:insert_bottom_selector_js(Sel, Html), Context};
  77. insert_before -> {z_render:insert_before_selector_js(Sel, Html), Context};
  78. insert_after -> {z_render:insert_after_selector_js(Sel, Html), Context}
  79. end
  80. end.
  81. render_postback(Method, TriggerId, TargetId, Html, Args, Context) ->
  82. {PostbackMsgJS, _PickledPostback} = z_render:make_postback({render, Method, Html, Args}, undefined, TriggerId, TargetId, ?MODULE, Context),
  83. {PostbackMsgJS, Context}.
  84. event({postback, {render, Method, Html, Args}, _TriggerId, TargetId}, Context) ->
  85. {[], Context1} = render_inline(Method, TargetId, Html, Args, Context),
  86. Context1.