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