| rev | 
   line source | 
| 
jbe/bsw@11
 | 
     1 --[[--
 | 
| 
jbe@12
 | 
     2 ui._partial_load_js(
 | 
| 
jbe@12
 | 
     3   {
 | 
| 
jbe@12
 | 
     4     module = module,
 | 
| 
jbe@12
 | 
     5     view   = view,
 | 
| 
jbe@12
 | 
     6     id     = id,
 | 
| 
jbe@12
 | 
     7     params = params,
 | 
| 
jbe@12
 | 
     8     target = target
 | 
| 
jbe@12
 | 
     9   },
 | 
| 
jbe@12
 | 
    10   mode = mode
 | 
| 
jbe/bsw@11
 | 
    11 }
 | 
| 
jbe/bsw@11
 | 
    12 
 | 
| 
jbe@12
 | 
    13 This function is not supposed to be called directly, but only to be used by
 | 
| 
jbe@12
 | 
    14 ui.link{...} and ui.form{...}.
 | 
| 
jbe@12
 | 
    15 
 | 
| 
jbe@12
 | 
    16 It returns a JavaScript which can be used for onclick or onsubmit
 | 
| 
jbe@12
 | 
    17 attributes in HTML to cause a partial load of contents. Behaviour differs
 | 
| 
jbe@12
 | 
    18 for the following cases:
 | 
| 
jbe@12
 | 
    19 a) module, view and target (and optionally id) are given as parameters
 | 
| 
jbe@12
 | 
    20 b) neither module, view, id, nor target are given as parameters
 | 
| 
jbe@12
 | 
    21 
 | 
| 
jbe@12
 | 
    22 In case of a) the function will create a JavaScript which requests the
 | 
| 
jbe@12
 | 
    23 given view (optionally with the given id and params) as JSON data.
 | 
| 
jbe@12
 | 
    24 
 | 
| 
jbe@12
 | 
    25 In case of b) the function will create a JavaScript requesting the view
 | 
| 
jbe@12
 | 
    26 specified by the next outer ui.partial{...} call as JSON data. Request
 | 
| 
jbe@12
 | 
    27 parameters specified by previous calls of add_partial_param_names({...})
 | 
| 
jbe@12
 | 
    28 are copied from the GET/POST parameters of the current request, while they
 | 
| 
jbe@12
 | 
    29 can be overwritten using the "params" argument to this function.
 | 
| 
jbe/bsw@11
 | 
    30 
 | 
| 
jbe@12
 | 
    31 If there is no outer ui.partial{...} call in case b), then this function
 | 
| 
jbe@12
 | 
    32 returns nil.
 | 
| 
jbe@12
 | 
    33 
 | 
| 
jbe@12
 | 
    34 The called URL contains "_webmcp_json_slots[]" as GET parameters to
 | 
| 
jbe@12
 | 
    35 indicate that slot contents should be returned as a JSON object, instead of
 | 
| 
jbe@12
 | 
    36 being inserted to a page layout.
 | 
| 
jbe@12
 | 
    37 
 | 
| 
jbe@12
 | 
    38 TODO: Currently the slots requested are "default", "trace" and
 | 
| 
jbe@12
 | 
    39 "system_error". The target for the slot "default" is passed as argument to
 | 
| 
jbe@12
 | 
    40 this function or to ui.partial{...}. The targets for the slots "trace" and
 | 
| 
jbe@12
 | 
    41 "system_error" are "trace" and "system_error". This is hardcoded and should
 | 
| 
jbe@12
 | 
    42 be possible to change in future. The JavaScript will fail, if there are no
 | 
| 
jbe@12
 | 
    43 HTML elements with id's "trace" and "system_error".
 | 
| 
jbe@12
 | 
    44 
 | 
| 
jbe@12
 | 
    45 A mode can be passed as second parameter to this function. When this mode
 | 
| 
jbe@12
 | 
    46 is "nil" or non existent, the function creates JavaScript code to be used
 | 
| 
jbe@12
 | 
    47 as onclick event for normal (GET) links. When mode is set to "form_normal"
 | 
| 
jbe@12
 | 
    48 or "form_action", the returned code can be used as onsubmit event of web
 | 
| 
jbe@12
 | 
    49 forms. "form_normal" is used when the form calls a view, "form_action" is
 | 
| 
jbe@12
 | 
    50 used when the form calls an action.
 | 
| 
jbe/bsw@11
 | 
    51 
 | 
| 
jbe/bsw@11
 | 
    52 --]]--
 | 
| 
jbe/bsw@11
 | 
    53 
 | 
| 
jbe/bsw@11
 | 
    54 function ui._partial_load_js(args, mode)
 | 
| 
jbe/bsw@11
 | 
    55   local args = args or {}
 | 
| 
jbe/bsw@11
 | 
    56   local module
 | 
| 
jbe/bsw@11
 | 
    57   local view
 | 
| 
jbe/bsw@11
 | 
    58   local id
 | 
| 
jbe/bsw@11
 | 
    59   local params = {}
 | 
| 
jbe/bsw@11
 | 
    60   local target
 | 
| 
jbe/bsw@11
 | 
    61   if args.view and args.target then
 | 
| 
jbe/bsw@11
 | 
    62     module = args.module
 | 
| 
jbe/bsw@11
 | 
    63     view   = args.view
 | 
| 
jbe/bsw@11
 | 
    64     id     = args.id
 | 
| 
jbe/bsw@11
 | 
    65     target = args.target
 | 
| 
jbe/bsw@11
 | 
    66   elseif not args.view and not args.target then
 | 
| 
jbe/bsw@11
 | 
    67     if not ui._partial_state then
 | 
| 
jbe/bsw@11
 | 
    68       return nil
 | 
| 
jbe/bsw@11
 | 
    69     end
 | 
| 
jbe/bsw@11
 | 
    70     module = ui._partial_state.module
 | 
| 
jbe/bsw@11
 | 
    71     view   = ui._partial_state.view
 | 
| 
jbe/bsw@11
 | 
    72     id     = ui._partial_state.id
 | 
| 
jbe/bsw@11
 | 
    73     target = ui._partial_state.target
 | 
| 
jbe/bsw@11
 | 
    74   else
 | 
| 
jbe/bsw@11
 | 
    75     error("Unexpected arguments passed to ui._partial_load_js{...}")
 | 
| 
jbe/bsw@11
 | 
    76   end
 | 
| 
jbe/bsw@11
 | 
    77 
 | 
| 
jbe/bsw@11
 | 
    78   if ui._partial_state then
 | 
| 
jbe@12
 | 
    79     -- TODO: do this only if args.view and args.target are unset!?
 | 
| 
jbe/bsw@11
 | 
    80     if ui._partial_state.params then
 | 
| 
jbe/bsw@11
 | 
    81       for key, value in pairs(ui._partial_state.params) do
 | 
| 
jbe/bsw@11
 | 
    82         params[key] = value
 | 
| 
jbe/bsw@11
 | 
    83       end
 | 
| 
jbe/bsw@11
 | 
    84     end
 | 
| 
jbe/bsw@11
 | 
    85     for param_name, dummy in pairs(ui._partial_state.param_name_hash) do
 | 
| 
jbe/bsw@11
 | 
    86       params[param_name] = cgi.params[param_name]
 | 
| 
jbe/bsw@11
 | 
    87     end
 | 
| 
jbe/bsw@11
 | 
    88   end
 | 
| 
jbe/bsw@11
 | 
    89   if args.params then
 | 
| 
jbe/bsw@11
 | 
    90     for key, value in pairs(args.params) do
 | 
| 
jbe/bsw@11
 | 
    91       params[key] = value
 | 
| 
jbe/bsw@11
 | 
    92     end
 | 
| 
jbe/bsw@11
 | 
    93   end
 | 
| 
jbe/bsw@11
 | 
    94   local encoded_url = encode.json(
 | 
| 
jbe/bsw@11
 | 
    95     encode.url{
 | 
| 
jbe/bsw@11
 | 
    96       module = module,
 | 
| 
jbe/bsw@11
 | 
    97       view   = view,
 | 
| 
jbe/bsw@11
 | 
    98       id     = id,
 | 
| 
jbe/bsw@11
 | 
    99       params = params
 | 
| 
jbe/bsw@11
 | 
   100     }
 | 
| 
jbe/bsw@11
 | 
   101   )
 | 
| 
jbe/bsw@11
 | 
   102 
 | 
| 
jbe/bsw@11
 | 
   103   if mode == "form_normal" then
 | 
| 
jbe/bsw@11
 | 
   104     -- NOTE: action in "action_mode" refers to WebMCP actions, while action
 | 
| 
jbe/bsw@11
 | 
   105     -- in "this.action" refers to the action attribute of HTML forms
 | 
| 
jbe/bsw@11
 | 
   106     slot.put('this.action = ', encoded_url, '; ')
 | 
| 
jbe/bsw@11
 | 
   107   end
 | 
| 
jbe/bsw@11
 | 
   108 
 | 
| 
jbe/bsw@11
 | 
   109   return slot.use_temporary(function()
 | 
| 
jbe/bsw@11
 | 
   110     slot.put(
 | 
| 
jbe/bsw@11
 | 
   111       'partialMultiLoad({',
 | 
| 
jbe/bsw@11
 | 
   112         -- mapping:
 | 
| 
jbe/bsw@11
 | 
   113         '"trace": "trace", "system_error": "system_error", ',
 | 
| 
jbe/bsw@11
 | 
   114         encode.json(target), ': "default" }, ',
 | 
| 
jbe/bsw@11
 | 
   115         -- tempLoadingContents:
 | 
| 
jbe/bsw@11
 | 
   116         '{}, ',
 | 
| 
jbe/bsw@11
 | 
   117         -- failureContents:
 | 
| 
jbe/bsw@11
 | 
   118         '"error", ',
 | 
| 
jbe/bsw@11
 | 
   119         -- url:
 | 
| 
jbe/bsw@11
 | 
   120         (mode == "form_normal" or mode == "form_action") and (
 | 
| 
jbe/bsw@11
 | 
   121           'this'
 | 
| 
jbe/bsw@11
 | 
   122         ) or (
 | 
| 
jbe/bsw@11
 | 
   123           encoded_url
 | 
| 
jbe/bsw@11
 | 
   124         ), ', ',
 | 
| 
jbe/bsw@11
 | 
   125         -- urlParams:
 | 
| 
jbe/bsw@11
 | 
   126         '"_webmcp_json_slots[]=default&_webmcp_json_slots[]=trace&_webmcp_json_slots[]=system_error", ',
 | 
| 
jbe/bsw@11
 | 
   127         -- postParams:
 | 
| 
jbe/bsw@11
 | 
   128         '{}, ',
 | 
| 
jbe/bsw@11
 | 
   129         -- successHandler:
 | 
| 
jbe/bsw@11
 | 
   130         'function() {}, ',
 | 
| 
jbe/bsw@11
 | 
   131         -- failureHandler:
 | 
| 
jbe/bsw@11
 | 
   132         'function() {} ',
 | 
| 
jbe/bsw@11
 | 
   133       '); ',
 | 
| 
jbe/bsw@11
 | 
   134       'return false;'
 | 
| 
jbe/bsw@11
 | 
   135     )
 | 
| 
jbe/bsw@11
 | 
   136   end)
 | 
| 
jbe/bsw@11
 | 
   137 end
 |