| rev | 
   line source | 
| 
bsw/jbe@19
 | 
     1 if config.user_tab_mode == "accordeon" or config.user_tab_mode == "accordeon_first_expanded" or config.user_tab_mode == "accordeon_all_expanded" then
 | 
| 
bsw/jbe@19
 | 
     2 
 | 
| 
bsw/jbe@19
 | 
     3   function ui.tabs(tabs)
 | 
| 
bsw/jbe@19
 | 
     4     local params = param.get_all_cgi()
 | 
| 
bsw/jbe@19
 | 
     5     local current_tabs_string = params["tab"]
 | 
| 
bsw/jbe@19
 | 
     6     local current_tabs = {}
 | 
| 
bsw/jbe@19
 | 
     7     if current_tabs_string then
 | 
| 
bsw/jbe@19
 | 
     8       for current_tab in current_tabs_string:gmatch("([^%|]+)") do
 | 
| 
bsw/jbe@19
 | 
     9         current_tabs[current_tab] = current_tab
 | 
| 
bsw/jbe@19
 | 
    10       end
 | 
| 
bsw/jbe@19
 | 
    11     end
 | 
| 
bsw/jbe@19
 | 
    12 
 | 
| 
bsw/jbe@19
 | 
    13     local unique_string = param.get("tab_id") or multirand.string(16, '0123456789abcdef')
 | 
| 
bsw/jbe@19
 | 
    14 
 | 
| 
bsw/jbe@19
 | 
    15     function render_tab(tab, first)
 | 
| 
bsw/jbe@0
 | 
    16       local params = param.get_all_cgi()
 | 
| 
bsw/jbe@19
 | 
    17       local active = false
 | 
| 
bsw/jbe@19
 | 
    18       for current_tab in pairs(current_tabs) do
 | 
| 
bsw/jbe@19
 | 
    19         if tab.name == current_tab then
 | 
| 
bsw/jbe@19
 | 
    20           active = true
 | 
| 
bsw/jbe@19
 | 
    21         end
 | 
| 
bsw/jbe@19
 | 
    22       end
 | 
| 
bsw/jbe@19
 | 
    23       if config.user_tab_mode == "accordeon_first_expanded" then
 | 
| 
bsw/jbe@19
 | 
    24         if first and current_tabs_string == nil then
 | 
| 
bsw/jbe@19
 | 
    25           active = true
 | 
| 
bsw/jbe@19
 | 
    26         end
 | 
| 
bsw/jbe@19
 | 
    27       end
 | 
| 
bsw/jbe@19
 | 
    28       local link_tabs = {}
 | 
| 
bsw/jbe@19
 | 
    29       if config.user_tab_mode == "accordeon" 
 | 
| 
bsw/jbe@19
 | 
    30         or config.user_tab_mode == "accordeon_first_expanded"
 | 
| 
bsw/jbe@19
 | 
    31         or config.user_tab_mode == "accordeon_all_expanded" and current_tabs_string
 | 
| 
bsw/jbe@19
 | 
    32       then
 | 
| 
bsw/jbe@19
 | 
    33         if not current_tabs_string and not first then
 | 
| 
bsw/jbe@19
 | 
    34           link_tabs[tabs[1].name] = true
 | 
| 
bsw/jbe@19
 | 
    35         end
 | 
| 
bsw/jbe@19
 | 
    36         for current_tab in pairs(current_tabs) do
 | 
| 
bsw/jbe@19
 | 
    37           if current_tab ~= tab.name then
 | 
| 
bsw/jbe@19
 | 
    38             link_tabs[current_tab] = true
 | 
| 
bsw/jbe@19
 | 
    39           end
 | 
| 
bsw/jbe@19
 | 
    40         end
 | 
| 
bsw/jbe@19
 | 
    41       elseif config.user_tab_mode == "accordeon_all_expanded" and not current_tabs_string then
 | 
| 
bsw/jbe@19
 | 
    42         for i, current_tab in ipairs(tabs) do
 | 
| 
bsw/jbe@19
 | 
    43           if current_tab.name ~= tab.name then
 | 
| 
bsw/jbe@19
 | 
    44             link_tabs[current_tab.name] = true
 | 
| 
bsw/jbe@19
 | 
    45           end
 | 
| 
bsw/jbe@19
 | 
    46         end
 | 
| 
bsw/jbe@19
 | 
    47       end
 | 
| 
bsw/jbe@19
 | 
    48       if not active then
 | 
| 
bsw/jbe@19
 | 
    49         link_tabs[tab.name] = true
 | 
| 
bsw/jbe@19
 | 
    50       end
 | 
| 
bsw/jbe@19
 | 
    51       local link_tab_string = ""
 | 
| 
bsw/jbe@19
 | 
    52       for link_tab in pairs(link_tabs) do
 | 
| 
bsw/jbe@19
 | 
    53         if #link_tab_string > 0 then
 | 
| 
bsw/jbe@19
 | 
    54           link_tab_string = link_tab_string .. "|"
 | 
| 
bsw/jbe@19
 | 
    55         end
 | 
| 
bsw/jbe@19
 | 
    56         link_tab_string = link_tab_string .. link_tab
 | 
| 
bsw/jbe@19
 | 
    57       end
 | 
| 
bsw/jbe@19
 | 
    58       params["tab"] = link_tab_string
 | 
| 
bsw/jbe@19
 | 
    59       local onclick
 | 
| 
bsw/jbe@19
 | 
    60       if not tab.content then
 | 
| 
bsw/jbe@19
 | 
    61         onclick =
 | 
| 
bsw/jbe@19
 | 
    62           'if (ui_tabs_active["' .. unique_string .. '"]["' .. tab.name .. '"]) {' ..
 | 
| 
bsw/jbe@19
 | 
    63             'el=document.getElementById("tab' .. unique_string .. '_content_' .. tab.name .. '");' ..
 | 
| 
bsw/jbe@19
 | 
    64             'el.innerHTML="";' ..
 | 
| 
bsw/jbe@19
 | 
    65             'el.style.display="none";' ..
 | 
| 
bsw/jbe@19
 | 
    66             'ui_tabs_active["' .. unique_string .. '"]["' .. tab.name .. '"]=false' ..
 | 
| 
bsw/jbe@19
 | 
    67           '} else {' ..
 | 
| 
bsw/jbe@19
 | 
    68             'ui_tabs_active["' .. unique_string .. '"]["' .. tab.name .. '"]=true;' ..
 | 
| 
bsw/jbe@19
 | 
    69             'document.getElementById("tab' .. unique_string .. '_content_' .. tab.name .. '").style.display="block"; ' ..
 | 
| 
bsw/jbe@19
 | 
    70             ui._partial_load_js{
 | 
| 
bsw/jbe@19
 | 
    71               params = { tab = tab.name }
 | 
| 
bsw/jbe@19
 | 
    72             } ..
 | 
| 
bsw/jbe@19
 | 
    73           '};' ..
 | 
| 
bsw/jbe@19
 | 
    74           'return(false);'
 | 
| 
bsw/jbe@19
 | 
    75       end
 | 
| 
bsw/jbe@19
 | 
    76       ui.link{
 | 
| 
bsw/jbe@19
 | 
    77         attr = {
 | 
| 
bsw/jbe@19
 | 
    78           name = "tab_" .. tab.name,
 | 
| 
bsw/jbe@19
 | 
    79           class = (
 | 
| 
bsw@57
 | 
    80             tab.name == current_tab and "ui_tabs_accordeon_head selected" .. (tab.class and (" " .. tab.class) or "") or
 | 
| 
bsw@57
 | 
    81             not current_tab and i == 1 and "ui_tabs_accordeon_head selected" .. (tab.class and (" " .. tab.class) or "")  or
 | 
| 
bsw@57
 | 
    82             "ui_tabs_accordeon_head" .. (tab.class and (" " .. tab.class) or "") 
 | 
| 
bsw/jbe@19
 | 
    83           ),
 | 
| 
bsw/jbe@19
 | 
    84           id = "tab" .. unique_string .. "_head_" .. tab.name,
 | 
| 
bsw/jbe@19
 | 
    85           onclick = onclick,
 | 
| 
bsw/jbe@19
 | 
    86         },
 | 
| 
bsw/jbe@19
 | 
    87         module  = request.get_module(),
 | 
| 
bsw/jbe@19
 | 
    88         view    = request.get_view(),
 | 
| 
bsw/jbe@19
 | 
    89         id      = param.get_id_cgi(),
 | 
| 
bsw/jbe@19
 | 
    90         params  = params,
 | 
| 
bsw/jbe@19
 | 
    91         anchor  = "tab" .. unique_string .. "_" .. tab.name,
 | 
| 
bsw/jbe@0
 | 
    92         content = function()
 | 
| 
bsw/jbe@19
 | 
    93           if tab.icon then
 | 
| 
bsw/jbe@19
 | 
    94             if not tab.icon.attr then
 | 
| 
bsw/jbe@19
 | 
    95               tab.icon.attr = {}
 | 
| 
bsw/jbe@19
 | 
    96             end
 | 
| 
bsw/jbe@19
 | 
    97             tab.icon.attr.id = "tab" .. unique_string .. "_icon_" .. tab.name
 | 
| 
bsw/jbe@19
 | 
    98             tab.icon.attr.width = 16
 | 
| 
bsw/jbe@19
 | 
    99             tab.icon.attr.height = 16
 | 
| 
bsw/jbe@19
 | 
   100             ui.image(tab.icon)
 | 
| 
bsw/jbe@19
 | 
   101           end
 | 
| 
bsw/jbe@19
 | 
   102           slot.put(tab.label)
 | 
| 
bsw/jbe@19
 | 
   103         end
 | 
| 
bsw/jbe@19
 | 
   104       }
 | 
| 
bsw/jbe@19
 | 
   105       local expanded = active or not request.get_json_request_slots() and config.user_tab_mode == "accordeon_all_expanded" and not current_tabs_string
 | 
| 
bsw/jbe@19
 | 
   106       ui.container{
 | 
| 
bsw/jbe@19
 | 
   107         attr = {
 | 
| 
bsw@57
 | 
   108           class = "ui_tabs_accordeon_content" .. (tab.class and (" " .. tab.class) or ""),
 | 
| 
bsw/jbe@19
 | 
   109           style = not expanded and "display: none;" or nil,
 | 
| 
bsw/jbe@19
 | 
   110           id = "tab" .. unique_string .. "_content_" .. tab.name
 | 
| 
bsw/jbe@19
 | 
   111         },
 | 
| 
bsw/jbe@19
 | 
   112         content = function()
 | 
| 
bsw/jbe@19
 | 
   113           if expanded then
 | 
| 
bsw/jbe@19
 | 
   114             ui.script{ script = 'ui_tabs_active["' .. unique_string .. '"]["' .. tab.name .. '"] = true;' }
 | 
| 
bsw/jbe@19
 | 
   115             execute.view{
 | 
| 
bsw/jbe@19
 | 
   116               module = tab.module,
 | 
| 
bsw/jbe@19
 | 
   117               view = tab.view,
 | 
| 
bsw/jbe@19
 | 
   118               id = tab.id,
 | 
| 
bsw/jbe@19
 | 
   119               params = tab.params
 | 
| 
bsw/jbe@0
 | 
   120             }
 | 
| 
bsw/jbe@19
 | 
   121           else
 | 
| 
bsw/jbe@19
 | 
   122             slot.put(" ")
 | 
| 
bsw/jbe@0
 | 
   123           end
 | 
| 
bsw/jbe@0
 | 
   124         end
 | 
| 
bsw/jbe@0
 | 
   125       }
 | 
| 
bsw/jbe@19
 | 
   126     end
 | 
| 
bsw/jbe@19
 | 
   127 
 | 
| 
bsw/jbe@19
 | 
   128     if not request.get_json_request_slots() or not current_tabs_string then
 | 
| 
bsw/jbe@19
 | 
   129       ui.script{ script = "ui_tabs_active['" .. unique_string .. "'] = {};" }
 | 
| 
bsw/jbe@19
 | 
   130       ui.container{
 | 
| 
bsw/jbe@19
 | 
   131         attr = { class = "ui_tabs" },
 | 
| 
bsw/jbe@19
 | 
   132         content = function()
 | 
| 
bsw/jbe@19
 | 
   133           for i, tab in ipairs(tabs) do
 | 
| 
bsw/jbe@19
 | 
   134             local static_params = tabs.static_params or {}
 | 
| 
bsw/jbe@19
 | 
   135             static_params.tab = tab.name
 | 
| 
bsw/jbe@19
 | 
   136             static_params.tab_id = unique_string
 | 
| 
bsw/jbe@19
 | 
   137             ui.partial{
 | 
| 
bsw/jbe@19
 | 
   138               module           = tabs.module,
 | 
| 
bsw/jbe@19
 | 
   139               view             = tabs.view,
 | 
| 
bsw/jbe@19
 | 
   140               id               = tabs.id,
 | 
| 
bsw/jbe@19
 | 
   141               params           = static_params,
 | 
| 
bsw/jbe@19
 | 
   142               param_names      = { "page" },
 | 
| 
bsw/jbe@19
 | 
   143               hourglass_target = "tab" .. unique_string .. "_icon_" .. tab.name,
 | 
| 
bsw/jbe@19
 | 
   144               target           = "tab" .. unique_string .. "_content_" .. tab.name,
 | 
| 
bsw/jbe@19
 | 
   145               content = function()
 | 
| 
bsw/jbe@19
 | 
   146                 render_tab(tab, i == 1)
 | 
| 
bsw/jbe@19
 | 
   147               end
 | 
| 
bsw/jbe@19
 | 
   148             }
 | 
| 
bsw/jbe@19
 | 
   149           end
 | 
| 
bsw/jbe@19
 | 
   150         end
 | 
| 
bsw/jbe@19
 | 
   151       }
 | 
| 
bsw/jbe@19
 | 
   152     else
 | 
| 
bsw/jbe@19
 | 
   153       local dyntab
 | 
| 
bsw/jbe@0
 | 
   154       for i, tab in ipairs(tabs) do
 | 
| 
bsw/jbe@19
 | 
   155         if tab.name == current_tabs_string then
 | 
| 
bsw/jbe@19
 | 
   156           dyntab = tab
 | 
| 
bsw/jbe@0
 | 
   157         end
 | 
| 
bsw/jbe@0
 | 
   158       end
 | 
| 
bsw/jbe@19
 | 
   159       if dyntab then
 | 
| 
bsw/jbe@19
 | 
   160         local static_params = tabs.static_params or {}
 | 
| 
bsw/jbe@19
 | 
   161         static_params.tab = dyntab.name
 | 
| 
bsw/jbe@19
 | 
   162         static_params.tab_id = unique_string
 | 
| 
bsw/jbe@19
 | 
   163         dyntab.params.tab_id = unique_string
 | 
| 
bsw/jbe@19
 | 
   164         ui.partial{
 | 
| 
bsw/jbe@19
 | 
   165           module           = tabs.module,
 | 
| 
bsw/jbe@19
 | 
   166           view             = tabs.view,
 | 
| 
bsw/jbe@19
 | 
   167           id               = tabs.id,
 | 
| 
bsw/jbe@19
 | 
   168           params           = static_params,
 | 
| 
bsw/jbe@19
 | 
   169           param_names      = { "page" },
 | 
| 
bsw/jbe@19
 | 
   170           hourglass_target = "tab" .. unique_string .. "_icon_" .. dyntab.name,
 | 
| 
bsw/jbe@19
 | 
   171           target           = "tab" .. unique_string .. "_content_" .. dyntab.name,
 | 
| 
bsw/jbe@19
 | 
   172           content = function()
 | 
| 
bsw/jbe@19
 | 
   173             execute.view{
 | 
| 
bsw/jbe@19
 | 
   174               module = dyntab.module,
 | 
| 
bsw/jbe@19
 | 
   175               view   = dyntab.view,
 | 
| 
bsw/jbe@19
 | 
   176               id     = dyntab.id,
 | 
| 
bsw/jbe@19
 | 
   177               params = dyntab.params,
 | 
| 
bsw/jbe@19
 | 
   178             }
 | 
| 
bsw/jbe@19
 | 
   179           end
 | 
| 
bsw/jbe@19
 | 
   180         }
 | 
| 
bsw/jbe@19
 | 
   181       end
 | 
| 
bsw/jbe@0
 | 
   182     end
 | 
| 
bsw/jbe@19
 | 
   183   end
 | 
| 
bsw/jbe@19
 | 
   184 
 | 
| 
bsw/jbe@19
 | 
   185 else -- 'classic tab'
 | 
| 
bsw/jbe@0
 | 
   186 
 | 
| 
bsw/jbe@19
 | 
   187   function ui.tabs(tabs)
 | 
| 
bsw/jbe@19
 | 
   188     ui.container{
 | 
| 
bsw/jbe@19
 | 
   189       attr = { class = "ui_tabs" },
 | 
| 
bsw/jbe@19
 | 
   190       content = function()
 | 
| 
bsw/jbe@19
 | 
   191         local params = param.get_all_cgi()
 | 
| 
bsw/jbe@19
 | 
   192         local current_tab = params["tab"]
 | 
| 
bsw/jbe@19
 | 
   193         ui.container{
 | 
| 
bsw/jbe@19
 | 
   194           attr = { class = "ui_tabs_links" },
 | 
| 
bsw/jbe@19
 | 
   195           content = function()
 | 
| 
bsw/jbe@19
 | 
   196             for i, tab in ipairs(tabs) do
 | 
| 
bsw/jbe@19
 | 
   197               params["tab"] = i > 1 and tab.name or nil
 | 
| 
bsw/jbe@19
 | 
   198               ui.link{
 | 
| 
bsw/jbe@19
 | 
   199                 attr = { 
 | 
| 
bsw/jbe@19
 | 
   200                   class = (
 | 
| 
bsw@57
 | 
   201                     tab.name == current_tab and "selected" .. (tab.class and (" " .. tab.class) or "") or
 | 
| 
bsw@57
 | 
   202                     not current_tab and i == 1 and "selected" .. (tab.class and (" " .. tab.class) or "") or
 | 
| 
bsw@57
 | 
   203                     "" .. (tab.class and (" " .. tab.class) or "")
 | 
| 
bsw/jbe@19
 | 
   204                   )
 | 
| 
bsw/jbe@19
 | 
   205                 },
 | 
| 
bsw/jbe@19
 | 
   206                 module  = request.get_module(),
 | 
| 
bsw/jbe@19
 | 
   207                 view    = request.get_view(),
 | 
| 
bsw/jbe@19
 | 
   208                 id      = param.get_id_cgi(),
 | 
| 
bsw/jbe@19
 | 
   209                 content = tab.label,
 | 
| 
bsw/jbe@19
 | 
   210                 params  = params
 | 
| 
bsw/jbe@19
 | 
   211               }
 | 
| 
bsw/jbe@19
 | 
   212               slot.put(" ")
 | 
| 
bsw/jbe@19
 | 
   213             end
 | 
| 
bsw/jbe@19
 | 
   214           end
 | 
| 
bsw/jbe@19
 | 
   215         }
 | 
| 
bsw/jbe@19
 | 
   216         for i, tab in ipairs(tabs) do
 | 
| 
bsw/jbe@19
 | 
   217           if tab.name == current_tab or not current_tab and i == 1 then
 | 
| 
bsw/jbe@19
 | 
   218             ui.container{
 | 
| 
bsw/jbe@19
 | 
   219               attr = { class = "ui_tabs_content" },
 | 
| 
bsw/jbe@19
 | 
   220               content = function()
 | 
| 
bsw/jbe@19
 | 
   221                 if tab.content then
 | 
| 
bsw/jbe@19
 | 
   222                   tab.content()
 | 
| 
bsw/jbe@19
 | 
   223                 else
 | 
| 
bsw/jbe@19
 | 
   224                   execute.view{
 | 
| 
bsw/jbe@19
 | 
   225                     module = tab.module,
 | 
| 
bsw/jbe@19
 | 
   226                     view   = tab.view,
 | 
| 
bsw/jbe@19
 | 
   227                     id     = tab.id,
 | 
| 
bsw/jbe@19
 | 
   228                     params = tab.params,
 | 
| 
bsw/jbe@19
 | 
   229                   }
 | 
| 
bsw/jbe@19
 | 
   230                 end
 | 
| 
bsw/jbe@19
 | 
   231               end
 | 
| 
bsw/jbe@19
 | 
   232             }
 | 
| 
bsw/jbe@19
 | 
   233           end
 | 
| 
bsw/jbe@19
 | 
   234         end
 | 
| 
bsw/jbe@19
 | 
   235       end
 | 
| 
bsw/jbe@19
 | 
   236     }
 | 
| 
bsw/jbe@19
 | 
   237   end
 | 
| 
bsw/jbe@19
 | 
   238 
 | 
| 
bsw/jbe@19
 | 
   239 end |