| rev | 
   line source | 
| 
bsw/jbe@1309
 | 
     1 local for_member = param.get ( "for_member", "table" )
 | 
| 
bsw/jbe@1309
 | 
     2 local for_unit =   param.get ( "for_unit",   "table" )
 | 
| 
bsw/jbe@1309
 | 
     3 local for_area =   param.get ( "for_area",   "table" )
 | 
| 
bsw/jbe@1309
 | 
     4 local for_issue =  param.get ( "for_issue",  "table" )
 | 
| 
bsw/jbe@1309
 | 
     5 local for_initiative =  param.get ( "for_initiative",  "table" )
 | 
| 
bsw/jbe@1309
 | 
     6 local for_sidebar = param.get("for_sidebar", atom.boolean)
 | 
| 
bsw/jbe@1309
 | 
     7 local no_filter =  param.get ( "no_filter",  atom.boolean )
 | 
| 
bsw/jbe@1309
 | 
     8 local search =     param.get ( "search" )
 | 
| 
bsw/jbe@1309
 | 
     9 
 | 
| 
bsw/jbe@1309
 | 
    10 local limit = 25
 | 
| 
bsw/jbe@1309
 | 
    11 
 | 
| 
bsw/jbe@1309
 | 
    12 local mode = request.get_param{ name = "mode" } or "issue"
 | 
| 
bsw/jbe@1309
 | 
    13 
 | 
| 
bsw/jbe@1309
 | 
    14 if for_initiative or for_issue or for_member then
 | 
| 
bsw/jbe@1309
 | 
    15   mode = "timeline"
 | 
| 
bsw/jbe@1309
 | 
    16 end
 | 
| 
bsw/jbe@1309
 | 
    17 
 | 
| 
bsw@1696
 | 
    18 if app.single_unit_id then
 | 
| 
bsw@1718
 | 
    19   if request.get_param{ name = "unit" } then
 | 
| 
bsw@1718
 | 
    20     for_unit = Unit:by_id(request.get_param{ name = "unit" })
 | 
| 
bsw@1718
 | 
    21   else
 | 
| 
bsw@1718
 | 
    22     for_unit = Unit:by_id(app.single_unit_id)
 | 
| 
bsw@1718
 | 
    23   end
 | 
| 
bsw@1513
 | 
    24 end
 | 
| 
bsw@1513
 | 
    25 
 | 
| 
bsw/jbe@1309
 | 
    26 local selector
 | 
| 
bsw/jbe@1309
 | 
    27 
 | 
| 
bsw/jbe@1309
 | 
    28 if search then
 | 
| 
bsw/jbe@1309
 | 
    29 
 | 
| 
bsw/jbe@1309
 | 
    30   selector = Issue:get_search_selector(search)
 | 
| 
bsw/jbe@1309
 | 
    31 
 | 
| 
bsw/jbe@1309
 | 
    32   
 | 
| 
bsw/jbe@1309
 | 
    33 elseif mode == "timeline" then
 | 
| 
bsw/jbe@1309
 | 
    34 
 | 
| 
bsw/jbe@1309
 | 
    35   local event_max_id = request.get_param_strings()["event_max_id"]
 | 
| 
bsw/jbe@1309
 | 
    36 
 | 
| 
bsw/jbe@1309
 | 
    37   selector = Event:new_selector()
 | 
| 
bsw/jbe@1309
 | 
    38     :add_order_by("event.id DESC")
 | 
| 
bsw/jbe@1309
 | 
    39     :join("issue", nil, "issue.id = event.issue_id")
 | 
| 
bsw/jbe@1309
 | 
    40     :add_field("now() - event.occurrence", "time_ago")
 | 
| 
bsw/jbe@1309
 | 
    41     :limit(limit + 1)
 | 
| 
bsw/jbe@1309
 | 
    42     
 | 
| 
bsw/jbe@1309
 | 
    43   if event_max_id then
 | 
| 
bsw/jbe@1309
 | 
    44     selector:add_where{ "event.id < ?", event_max_id }
 | 
| 
bsw/jbe@1309
 | 
    45   end
 | 
| 
bsw/jbe@1309
 | 
    46 
 | 
| 
bsw/jbe@1309
 | 
    47   if for_member then
 | 
| 
bsw/jbe@1309
 | 
    48     selector:add_where{ "event.member_id = ?", for_member.id }
 | 
| 
bsw/jbe@1309
 | 
    49   end
 | 
| 
bsw/jbe@1309
 | 
    50 
 | 
| 
bsw/jbe@1309
 | 
    51   if for_initiative then
 | 
| 
bsw/jbe@1309
 | 
    52     selector:add_where{ "event.initiative_id = ?", for_initiative.id }
 | 
| 
bsw/jbe@1309
 | 
    53   end
 | 
| 
bsw/jbe@1309
 | 
    54 
 | 
| 
bsw/jbe@1309
 | 
    55   
 | 
| 
bsw/jbe@1309
 | 
    56 elseif mode == "issue" then
 | 
| 
bsw/jbe@1309
 | 
    57   
 | 
| 
bsw/jbe@1309
 | 
    58   selector = Issue:new_selector()
 | 
| 
bsw/jbe@1309
 | 
    59 
 | 
| 
bsw/jbe@1309
 | 
    60 end
 | 
| 
bsw/jbe@1309
 | 
    61 
 | 
| 
bsw/jbe@1309
 | 
    62 if for_unit then
 | 
| 
bsw/jbe@1309
 | 
    63   selector:join("area", nil, "area.id = issue.area_id")
 | 
| 
bsw/jbe@1309
 | 
    64   selector:add_where{ "area.unit_id = ?", for_unit.id }
 | 
| 
bsw/jbe@1309
 | 
    65 elseif for_area then
 | 
| 
bsw/jbe@1309
 | 
    66   selector:add_where{ "issue.area_id = ?", for_area.id }
 | 
| 
bsw/jbe@1309
 | 
    67 elseif for_issue then
 | 
| 
bsw/jbe@1309
 | 
    68   selector:add_where{ "issue.id = ?", for_issue.id }
 | 
| 
bsw/jbe@1309
 | 
    69 end
 | 
| 
bsw/jbe@1309
 | 
    70   
 | 
| 
bsw/jbe@1309
 | 
    71 if not search and app.session.member_id then
 | 
| 
bsw/jbe@1309
 | 
    72   selector
 | 
| 
bsw/jbe@1309
 | 
    73     :left_join("interest", "_interest", { 
 | 
| 
bsw/jbe@1309
 | 
    74       "_interest.issue_id = issue.id AND _interest.member_id = ?", app.session.member.id 
 | 
| 
bsw/jbe@1309
 | 
    75     } )
 | 
| 
bsw/jbe@1309
 | 
    76     :add_field("(_interest.member_id NOTNULL)", "is_interested")
 | 
| 
bsw/jbe@1309
 | 
    77     :left_join("delegating_interest_snapshot", "_delegating_interest", { [[
 | 
| 
bsw/jbe@1309
 | 
    78       _delegating_interest.issue_id = issue.id AND 
 | 
| 
bsw/jbe@1309
 | 
    79       _delegating_interest.member_id = ? AND
 | 
| 
bsw/jbe@1309
 | 
    80       _delegating_interest.snapshot_id = issue.latest_snapshot_id
 | 
| 
bsw/jbe@1309
 | 
    81     ]], app.session.member.id } )
 | 
| 
bsw/jbe@1309
 | 
    82     :add_field("_delegating_interest.delegate_member_ids[1]", "is_interested_by_delegation_to_member_id")
 | 
| 
bsw/jbe@1309
 | 
    83     :add_field("_delegating_interest.delegate_member_ids[array_upper(_delegating_interest.delegate_member_ids, 1)]", "is_interested_via_member_id")    
 | 
| 
bsw/jbe@1309
 | 
    84     :add_field("array_length(_delegating_interest.delegate_member_ids, 1)", "delegation_chain_length")
 | 
| 
bsw/jbe@1309
 | 
    85 end
 | 
| 
bsw/jbe@1309
 | 
    86 
 | 
| 
bsw/jbe@1309
 | 
    87 local function doit()
 | 
| 
bsw/jbe@1309
 | 
    88 
 | 
| 
bsw/jbe@1309
 | 
    89   local last_event_id
 | 
| 
bsw/jbe@1309
 | 
    90 
 | 
| 
bsw/jbe@1309
 | 
    91   local items = selector:exec()
 | 
| 
bsw/jbe@1309
 | 
    92 
 | 
| 
bsw/jbe@1309
 | 
    93   local row_class = "sectionRow"
 | 
| 
bsw/jbe@1309
 | 
    94   if for_sidebar then
 | 
| 
bsw/jbe@1309
 | 
    95     row_class = "sidebarRow"
 | 
| 
bsw/jbe@1309
 | 
    96   end
 | 
| 
bsw/jbe@1309
 | 
    97   
 | 
| 
bsw/jbe@1309
 | 
    98   if mode == "timeline" then
 | 
| 
bsw/jbe@1309
 | 
    99     local issues = items:load ( "issue" )
 | 
| 
bsw/jbe@1309
 | 
   100     local initiative = items:load ( "initiative" )
 | 
| 
bsw/jbe@1309
 | 
   101     items:load ( "suggestion" )
 | 
| 
bsw/jbe@1309
 | 
   102     items:load ( "member" )
 | 
| 
bsw/jbe@1309
 | 
   103     issues:load_everything_for_member_id ( app.session.member_id )
 | 
| 
bsw/jbe@1309
 | 
   104     initiative:load_everything_for_member_id ( app.session.member_id )
 | 
| 
bsw/jbe@1309
 | 
   105   elseif mode == "issue" then
 | 
| 
bsw/jbe@1309
 | 
   106     items:load_everything_for_member_id ( app.session.member_id )
 | 
| 
bsw/jbe@1309
 | 
   107   end
 | 
| 
bsw/jbe@1309
 | 
   108 
 | 
| 
bsw/jbe@1309
 | 
   109   local last_event_date
 | 
| 
bsw/jbe@1309
 | 
   110   for i, item in ipairs(items) do
 | 
| 
bsw/jbe@1309
 | 
   111     local event
 | 
| 
bsw/jbe@1309
 | 
   112     local issue
 | 
| 
bsw/jbe@1309
 | 
   113     if mode == "timeline" then
 | 
| 
bsw/jbe@1309
 | 
   114       event = item
 | 
| 
bsw/jbe@1309
 | 
   115       issue = item.issue
 | 
| 
bsw/jbe@1309
 | 
   116     elseif mode == "issue" then
 | 
| 
bsw/jbe@1309
 | 
   117       event = {}
 | 
| 
bsw/jbe@1309
 | 
   118       issue = item
 | 
| 
bsw/jbe@1309
 | 
   119     end
 | 
| 
bsw/jbe@1309
 | 
   120     
 | 
| 
bsw/jbe@1309
 | 
   121     last_event_id = event.id
 | 
| 
bsw/jbe@1309
 | 
   122 
 | 
| 
bsw/jbe@1309
 | 
   123     local class = "mdl-card mdl-shadow--2dp mdl-card__fullwidth event " .. row_class
 | 
| 
bsw/jbe@1309
 | 
   124     if event.suggestion_id then
 | 
| 
bsw/jbe@1309
 | 
   125       class = class .. " suggestion"
 | 
| 
bsw/jbe@1309
 | 
   126     end
 | 
| 
bsw/jbe@1309
 | 
   127     
 | 
| 
bsw@1603
 | 
   128     ui.container{ attr = { class = class, id = "issue_" .. issue.id }, content = function()
 | 
| 
bsw/jbe@1309
 | 
   129       local event_name
 | 
| 
bsw/jbe@1309
 | 
   130       local event_icon
 | 
| 
bsw/jbe@1309
 | 
   131       local negative_event = false
 | 
| 
bsw/jbe@1309
 | 
   132       
 | 
| 
bsw/jbe@1309
 | 
   133       local days_ago_text
 | 
| 
bsw/jbe@1309
 | 
   134 
 | 
| 
bsw/jbe@1309
 | 
   135       if mode == "timeline" then
 | 
| 
bsw/jbe@1309
 | 
   136         event_name = event.event_name
 | 
| 
bsw/jbe@1309
 | 
   137           if event.event == "issue_state_changed" then
 | 
| 
bsw/jbe@1309
 | 
   138             if event.state == "discussion" then
 | 
| 
bsw/jbe@1309
 | 
   139               event_name = _"Discussion started"
 | 
| 
bsw/jbe@1309
 | 
   140             elseif event.state == "verification" then
 | 
| 
bsw/jbe@1309
 | 
   141               event_name = _"Verification started"
 | 
| 
bsw/jbe@1309
 | 
   142             elseif event.state == "voting" then
 | 
| 
bsw/jbe@1309
 | 
   143               event_name = _"Voting started"
 | 
| 
bsw/jbe@1309
 | 
   144             elseif event.state == "finished_with_winner" then
 | 
| 
bsw/jbe@1309
 | 
   145               event_name = event.state_name
 | 
| 
bsw/jbe@1309
 | 
   146             elseif event.state == "finished_without_winner" then
 | 
| 
bsw/jbe@1309
 | 
   147               event_name = event.state_name
 | 
| 
bsw/jbe@1309
 | 
   148               negative_event = true
 | 
| 
bsw/jbe@1309
 | 
   149             else
 | 
| 
bsw/jbe@1309
 | 
   150               event_name = event.state_name
 | 
| 
bsw/jbe@1309
 | 
   151               negative_event = true
 | 
| 
bsw/jbe@1309
 | 
   152             end
 | 
| 
bsw/jbe@1309
 | 
   153           elseif event.event == "initiative_revoked" then
 | 
| 
bsw/jbe@1309
 | 
   154             negative_event = true
 | 
| 
bsw/jbe@1309
 | 
   155           end
 | 
| 
bsw/jbe@1309
 | 
   156 
 | 
| 
bsw/jbe@1309
 | 
   157         if event.time_ago == 0 then
 | 
| 
bsw/jbe@1309
 | 
   158           days_ago_text = _("today at #{time}", { time = format.time(event.occurrence) })
 | 
| 
bsw/jbe@1309
 | 
   159         elseif event.time_ago == 1 then
 | 
| 
bsw/jbe@1309
 | 
   160           days_ago_text = _("yesterday at #{time}", { time = format.time(event.occurrence) })
 | 
| 
bsw/jbe@1309
 | 
   161         else
 | 
| 
bsw/jbe@1309
 | 
   162           days_ago_text = _("#{interval} ago", { interval = format.interval_text ( event.time_ago ) } )
 | 
| 
bsw/jbe@1309
 | 
   163         end
 | 
| 
bsw/jbe@1309
 | 
   164         
 | 
| 
bsw/jbe@1309
 | 
   165       elseif mode == "issue" then
 | 
| 
bsw/jbe@1309
 | 
   166         local event_icons_map = {
 | 
| 
bsw/jbe@1309
 | 
   167           admission = "bubble_chart",
 | 
| 
bsw/jbe@1309
 | 
   168           discussion = "question_answer",
 | 
| 
bsw/jbe@1309
 | 
   169           verification = "find_in_page",
 | 
| 
bsw/jbe@1309
 | 
   170           voting = "mail",
 | 
| 
bsw@1650
 | 
   171           finished_with_winner = "emoji_events",
 | 
| 
bsw@1650
 | 
   172           finished_without_winner = "do_not_disturb",
 | 
| 
bsw@1653
 | 
   173           canceled = "do_not_disturb"
 | 
| 
bsw/jbe@1309
 | 
   174         }
 | 
| 
bsw/jbe@1309
 | 
   175         event_icon = event_icons_map[issue.state] or event_icons_map["canceled"]
 | 
| 
bsw/jbe@1309
 | 
   176         event_name = issue.state_name
 | 
| 
bsw/jbe@1309
 | 
   177         if issue.state_time_left:sub(1,1) ~= "-" then
 | 
| 
bsw/jbe@1309
 | 
   178           days_ago_text = _( "#{interval_text} left", {
 | 
| 
bsw/jbe@1309
 | 
   179             interval_text = format.interval_text ( issue.state_time_left )
 | 
| 
bsw/jbe@1309
 | 
   180           })
 | 
| 
bsw/jbe@1309
 | 
   181         elseif issue.closed then
 | 
| 
bsw/jbe@1309
 | 
   182           days_ago_text = _( "#{interval_text} ago", {
 | 
| 
bsw/jbe@1309
 | 
   183             interval_text = format.interval_text ( issue.closed_ago )
 | 
| 
bsw/jbe@1309
 | 
   184           })
 | 
| 
bsw/jbe@1309
 | 
   185         else
 | 
| 
bsw/jbe@1309
 | 
   186           days_ago_text = _"phase ends soon" 
 | 
| 
bsw/jbe@1309
 | 
   187         end
 | 
| 
bsw/jbe@1309
 | 
   188         if issue.closed and not issue.fully_frozen then
 | 
| 
bsw/jbe@1309
 | 
   189           negative_event = true
 | 
| 
bsw/jbe@1309
 | 
   190         end
 | 
| 
bsw/jbe@1309
 | 
   191         if issue.state == "finished_without_winner" 
 | 
| 
bsw/jbe@1309
 | 
   192             or issue.state == "canceled_no_initiative_admitted"
 | 
| 
bsw/jbe@1309
 | 
   193             or issue.state == "canceled_by_admin"
 | 
| 
bsw/jbe@1309
 | 
   194         then
 | 
| 
bsw/jbe@1309
 | 
   195           negative_event = true
 | 
| 
bsw/jbe@1309
 | 
   196         end
 | 
| 
bsw/jbe@1309
 | 
   197       end
 | 
| 
bsw/jbe@1309
 | 
   198 
 | 
| 
bsw/jbe@1309
 | 
   199       local class= "event_info"
 | 
| 
bsw/jbe@1309
 | 
   200       
 | 
| 
bsw/jbe@1309
 | 
   201       if negative_event then
 | 
| 
bsw/jbe@1309
 | 
   202         class = class .. " negative"
 | 
| 
bsw/jbe@1309
 | 
   203       end
 | 
| 
bsw/jbe@1309
 | 
   204 
 | 
| 
bsw/jbe@1309
 | 
   205       if not for_issue and not for_initiative then
 | 
| 
bsw@1503
 | 
   206         ui.container{ attr = { class = "mdl-card__title mdl-card--has-fab mdl-card--border card-issue" }, content = function()
 | 
| 
bsw@1489
 | 
   207           ui.container{ attr = { class = "contextlinks" }, content = function()
 | 
| 
bsw@1696
 | 
   208             if not (app.single_unit_id and config.single_area_id) then
 | 
| 
bsw@1696
 | 
   209               if not app.single_unit_id then
 | 
| 
bsw@1650
 | 
   210                 ui.icon("group")
 | 
| 
bsw@1650
 | 
   211                 slot.put(" ")
 | 
| 
bsw@1489
 | 
   212                 ui.link{
 | 
| 
bsw@1489
 | 
   213                   module = "index", view = "index", params = { unit = issue.area.unit_id },
 | 
| 
bsw@1650
 | 
   214                   attr = { class = "unit" }, content = issue.area.unit.name                 }
 | 
| 
bsw@1489
 | 
   215               end
 | 
| 
bsw@1489
 | 
   216               if not config.single_area_id then
 | 
| 
bsw@1696
 | 
   217                 if not app.single_unit_id then
 | 
| 
bsw@1650
 | 
   218                   slot.put("     ")
 | 
| 
bsw@1490
 | 
   219                 end
 | 
| 
bsw@1650
 | 
   220                 ui.icon("category")
 | 
| 
bsw@1650
 | 
   221                 slot.put(" ")
 | 
| 
bsw@1489
 | 
   222                 ui.link{
 | 
| 
bsw@1489
 | 
   223                   module = "index", view = "index", params = { unit = issue.area.unit_id, area = issue.area_id },
 | 
| 
bsw@1489
 | 
   224                   attr = { class = "area" }, content = issue.area.name
 | 
| 
bsw@1489
 | 
   225                 }
 | 
| 
bsw@1489
 | 
   226               end
 | 
| 
bsw/jbe@1309
 | 
   227             end
 | 
| 
bsw@1650
 | 
   228             slot.put("     ")
 | 
| 
bsw@1650
 | 
   229             ui.icon("gavel")
 | 
| 
bsw@1650
 | 
   230             slot.put(" ")
 | 
| 
bsw/jbe@1309
 | 
   231             ui.link{
 | 
| 
bsw/jbe@1309
 | 
   232               module = "issue", view = "show", id = issue.id,
 | 
| 
bsw@1489
 | 
   233               attr = { class = "issue" }, content = issue.name
 | 
| 
bsw@1489
 | 
   234             }
 | 
| 
bsw@1503
 | 
   235 --          end }
 | 
| 
bsw@1503
 | 
   236 --          ui.container{ attr = { class = "mdl-card__subtitle-text .mdl-cell--hide-phone" }, content = function()
 | 
| 
bsw@1503
 | 
   237             ui.container{ attr = { class = class, style = "float: right; color: #fff;" }, content = function ()
 | 
| 
bsw/jbe@1309
 | 
   238               if event_icon then
 | 
| 
bsw@1489
 | 
   239                 ui.tag{ tag = "i", attr = { class = "material-icons", ["aria-hidden"] = "true" }, content = event_icon }
 | 
| 
bsw/jbe@1309
 | 
   240               end
 | 
| 
bsw/jbe@1309
 | 
   241               slot.put(" ")
 | 
| 
bsw/jbe@1309
 | 
   242               ui.tag { content = event_name }
 | 
| 
bsw/jbe@1309
 | 
   243               slot.put(" ")
 | 
| 
bsw/jbe@1309
 | 
   244               ui.tag{ content = "(" .. days_ago_text .. ")" }
 | 
| 
bsw/jbe@1309
 | 
   245             end }
 | 
| 
bsw/jbe@1309
 | 
   246           end }
 | 
| 
bsw/jbe@1309
 | 
   247           if app.session.member and issue.fully_frozen and not issue.closed and not issue.member_info.direct_voted and app.session.member:has_voting_right_for_unit_id(issue.area.unit_id) then
 | 
| 
bsw/jbe@1309
 | 
   248             ui.link {
 | 
| 
bsw/jbe@1309
 | 
   249               attr = { class = "mdl-button mdl-js-button mdl-button--fab mdl-button--colored" ,
 | 
| 
bsw/jbe@1309
 | 
   250                 style = "position: absolute; right: 20px; bottom: -27px;"
 | 
| 
bsw/jbe@1309
 | 
   251               },
 | 
| 
bsw/jbe@1309
 | 
   252               module = "vote", view = "list", 
 | 
| 
bsw/jbe@1309
 | 
   253               params = { issue_id = issue.id },
 | 
| 
bsw/jbe@1309
 | 
   254               content = function()
 | 
| 
bsw/jbe@1309
 | 
   255                 ui.tag{ tag = "i", attr = { class = "material-icons" }, content = config.voting_icon or "mail_outline" }
 | 
| 
bsw/jbe@1309
 | 
   256               end 
 | 
| 
bsw/jbe@1309
 | 
   257             }
 | 
| 
bsw/jbe@1309
 | 
   258           end
 | 
| 
bsw/jbe@1309
 | 
   259         end }
 | 
| 
bsw/jbe@1309
 | 
   260       end
 | 
| 
bsw/jbe@1309
 | 
   261 
 | 
| 
bsw/jbe@1309
 | 
   262       if event.suggestion_id then
 | 
| 
bsw/jbe@1309
 | 
   263         ui.container{ attr = { class = "suggestion" }, content = function()
 | 
| 
bsw/jbe@1309
 | 
   264           ui.link{
 | 
| 
bsw/jbe@1309
 | 
   265             text = format.string(event.suggestion.name, {
 | 
| 
bsw/jbe@1309
 | 
   266               truncate_at = 160, truncate_suffix = true
 | 
| 
bsw/jbe@1309
 | 
   267             }),
 | 
| 
bsw/jbe@1309
 | 
   268             module = "initiative", view = "show", id = event.initiative.id,
 | 
| 
bsw/jbe@1309
 | 
   269             params = { suggestion_id = event.suggestion_id },
 | 
| 
bsw/jbe@1309
 | 
   270             anchor = "s" .. event.suggestion_id
 | 
| 
bsw/jbe@1309
 | 
   271           }
 | 
| 
bsw/jbe@1309
 | 
   272         end }
 | 
| 
bsw/jbe@1309
 | 
   273       end
 | 
| 
bsw/jbe@1309
 | 
   274 
 | 
| 
bsw/jbe@1309
 | 
   275       if not for_initiative and (not for_issue or event.initiative_id) then
 | 
| 
bsw/jbe@1309
 | 
   276         
 | 
| 
bsw/jbe@1309
 | 
   277         ui.container{ attr = { class = "initiative_list" }, content = function()
 | 
| 
bsw/jbe@1309
 | 
   278           if event.initiative_id then
 | 
| 
bsw/jbe@1309
 | 
   279             local initiative = event.initiative
 | 
| 
bsw/jbe@1309
 | 
   280               
 | 
| 
bsw/jbe@1309
 | 
   281             execute.view{ module = "initiative", view = "_list", params = { 
 | 
| 
bsw/jbe@1309
 | 
   282               issue = issue,
 | 
| 
bsw/jbe@1309
 | 
   283               initiative = initiative,
 | 
| 
bsw/jbe@1309
 | 
   284               for_event = mode == "timeline" and not (event.state == issue.state)
 | 
| 
bsw/jbe@1309
 | 
   285 
 | 
| 
bsw/jbe@1309
 | 
   286             } }
 | 
| 
bsw/jbe@1309
 | 
   287           else
 | 
| 
bsw/jbe@1309
 | 
   288             local initiatives = issue.initiatives
 | 
| 
bsw/jbe@1309
 | 
   289             execute.view{ module = "initiative", view = "_list", params = { 
 | 
| 
bsw/jbe@1309
 | 
   290               issue = issue,
 | 
| 
bsw/jbe@1309
 | 
   291               initiatives = initiatives,
 | 
| 
bsw/jbe@1309
 | 
   292               for_event = mode == "timeline" and not (event.state == issue.state)
 | 
| 
bsw/jbe@1309
 | 
   293             } }
 | 
| 
bsw/jbe@1309
 | 
   294           end
 | 
| 
bsw/jbe@1309
 | 
   295         end }
 | 
| 
bsw/jbe@1309
 | 
   296       end
 | 
| 
bsw@1587
 | 
   297       if 
 | 
| 
bsw@1587
 | 
   298         app.session.member_id and (
 | 
| 
bsw@1587
 | 
   299           (not issue.fully_frozen and app.session.member:has_initiative_right_for_unit_id(issue.area.unit_id))
 | 
| 
bsw@1590
 | 
   300           or (issue.fully_frozen and app.session.member:has_voting_right_for_unit_id(issue.area.unit_id))
 | 
| 
bsw@1587
 | 
   301         )
 | 
| 
bsw@1587
 | 
   302       then
 | 
| 
bsw/jbe@1309
 | 
   303         ui.container{ attr = { class = "mdl-card__actions mdl-card--border" }, content = function()
 | 
| 
bsw/jbe@1309
 | 
   304           execute.view{ 
 | 
| 
bsw/jbe@1309
 | 
   305             module = "delegation", view = "_info", params = { 
 | 
| 
bsw/jbe@1309
 | 
   306               issue = issue, member = for_member 
 | 
| 
bsw/jbe@1309
 | 
   307             }
 | 
| 
bsw/jbe@1309
 | 
   308           }
 | 
| 
bsw/jbe@1309
 | 
   309         end }
 | 
| 
bsw/jbe@1309
 | 
   310       end
 | 
| 
bsw/jbe@1309
 | 
   311     end }
 | 
| 
bsw/jbe@1309
 | 
   312 
 | 
| 
bsw/jbe@1309
 | 
   313   end
 | 
| 
bsw/jbe@1309
 | 
   314   
 | 
| 
bsw/jbe@1309
 | 
   315   if mode == "timeline" then
 | 
| 
bsw/jbe@1309
 | 
   316     if for_sidebar then
 | 
| 
bsw/jbe@1309
 | 
   317       ui.container { attr = { class = row_class }, content = function ()
 | 
| 
bsw/jbe@1309
 | 
   318         ui.link{
 | 
| 
bsw/jbe@1309
 | 
   319           attr = { class = "moreLink" },
 | 
| 
bsw/jbe@1309
 | 
   320           text = _"Show full history",
 | 
| 
bsw/jbe@1309
 | 
   321           module = "initiative", view = "history", id = for_initiative.id
 | 
| 
bsw/jbe@1309
 | 
   322         }
 | 
| 
bsw/jbe@1309
 | 
   323       end }
 | 
| 
bsw/jbe@1309
 | 
   324     elseif #items > limit then
 | 
| 
bsw/jbe@1309
 | 
   325       ui.container { attr = { class = row_class }, content = function ()
 | 
| 
bsw/jbe@1309
 | 
   326         local params = request.get_param_strings()
 | 
| 
bsw/jbe@1309
 | 
   327         ui.link{
 | 
| 
bsw/jbe@1309
 | 
   328           attr = { class = "moreLink" },
 | 
| 
bsw/jbe@1309
 | 
   329           text = _"Show older events",
 | 
| 
bsw/jbe@1309
 | 
   330           module = request.get_module(),
 | 
| 
bsw/jbe@1309
 | 
   331           view = request.get_view(),
 | 
| 
bsw/jbe@1309
 | 
   332           id = for_unit and for_unit.id or for_area and for_area.id or for_issue and for_issue.id or for_member and for_member.id,
 | 
| 
bsw/jbe@1309
 | 
   333           params = {
 | 
| 
bsw/jbe@1309
 | 
   334             mode = "timeline",
 | 
| 
bsw/jbe@1309
 | 
   335             event_max_id = last_event_id,
 | 
| 
bsw/jbe@1309
 | 
   336             tab = params["tab"],
 | 
| 
bsw/jbe@1309
 | 
   337             phase = params["phase"],
 | 
| 
bsw/jbe@1309
 | 
   338             closed = params["closed"]
 | 
| 
bsw/jbe@1309
 | 
   339           }
 | 
| 
bsw/jbe@1309
 | 
   340         }
 | 
| 
bsw/jbe@1309
 | 
   341       end }
 | 
| 
bsw/jbe@1309
 | 
   342     elseif #items < 1 then
 | 
| 
bsw/jbe@1309
 | 
   343       ui.container { attr = { class = row_class }, content = _"No more events available" }
 | 
| 
bsw/jbe@1309
 | 
   344     end
 | 
| 
bsw/jbe@1309
 | 
   345   end
 | 
| 
bsw/jbe@1309
 | 
   346   
 | 
| 
bsw/jbe@1309
 | 
   347   if #items < 1 then
 | 
| 
bsw/jbe@1309
 | 
   348     ui.section( function()
 | 
| 
bsw/jbe@1309
 | 
   349       ui.sectionRow( function()
 | 
| 
bsw/jbe@1309
 | 
   350         ui.container{ content = _"No results for this selection" }
 | 
| 
bsw/jbe@1309
 | 
   351       end )
 | 
| 
bsw/jbe@1309
 | 
   352     end )
 | 
| 
bsw/jbe@1309
 | 
   353   end
 | 
| 
bsw/jbe@1309
 | 
   354   
 | 
| 
bsw/jbe@1309
 | 
   355   
 | 
| 
bsw/jbe@1309
 | 
   356 end
 | 
| 
bsw/jbe@1309
 | 
   357 
 | 
| 
bsw/jbe@1309
 | 
   358 
 | 
| 
bsw/jbe@1309
 | 
   359 local filters = {}
 | 
| 
bsw/jbe@1309
 | 
   360 
 | 
| 
bsw/jbe@1309
 | 
   361 if not for_initiative and not for_issue and not no_filter then
 | 
| 
bsw/jbe@1309
 | 
   362   
 | 
| 
bsw/jbe@1309
 | 
   363   filters = execute.chunk{
 | 
| 
bsw/jbe@1309
 | 
   364     module = "issue", chunk = "_filters", params = {
 | 
| 
bsw/jbe@1309
 | 
   365     for_events = mode == "timeline" and true or false,
 | 
| 
bsw/jbe@1309
 | 
   366     member = app.session.member, 
 | 
| 
bsw/jbe@1309
 | 
   367     for_member = for_member, 
 | 
| 
bsw/jbe@1309
 | 
   368     state = for_state, 
 | 
| 
bsw/jbe@1309
 | 
   369     for_unit = for_unit and true or false, 
 | 
| 
bsw/jbe@1309
 | 
   370     for_area = for_area and true or false
 | 
| 
bsw/jbe@1309
 | 
   371   }}
 | 
| 
bsw/jbe@1309
 | 
   372 end
 | 
| 
bsw/jbe@1309
 | 
   373 
 | 
| 
bsw/jbe@1309
 | 
   374 filters.opened = true
 | 
| 
bsw/jbe@1309
 | 
   375 filters.selector = selector
 | 
| 
bsw/jbe@1309
 | 
   376 
 | 
| 
bsw/jbe@1309
 | 
   377 
 | 
| 
bsw/jbe@1309
 | 
   378 local function dotabs()
 | 
| 
bsw/jbe@1309
 | 
   379   slot.select("filter", function()
 | 
| 
bsw/jbe@1309
 | 
   380     ui.container{ attr = { class = "mdl-tabs mdl-js-tabs mdl-js-ripple-effect float-left" }, content = function()
 | 
| 
bsw/jbe@1309
 | 
   381       ui.container{ attr = { class = "mdl-tabs__tab-bar" }, content = function()
 | 
| 
bsw/jbe@1309
 | 
   382         local mode = request.get_param{ name = "mode" }
 | 
| 
bsw/jbe@1309
 | 
   383         local css_active = (not mode or mode == "issue") and " is-active" or ""
 | 
| 
bsw/jbe@1309
 | 
   384         ui.link{ module = request.get_module(), view = request.get_view(), id = request.get_id_string(), content = "Issues", attr = { class = "mdl-tabs__tab" .. css_active } }
 | 
| 
bsw/jbe@1309
 | 
   385         local css_active = mode and " is-active" or " "
 | 
| 
bsw/jbe@1309
 | 
   386         ui.link{ module = request.get_module(), view = request.get_view(), id = request.get_id_string(), params = { mode = "timeline" }, content = "Timeline", attr = { class = "mdl-tabs__tab" .. css_active } }
 | 
| 
bsw/jbe@1309
 | 
   387         ui.link{ module = "member", view = "list", content = "Member", attr = { class = "mdl-tabs__tab" } }
 | 
| 
bsw/jbe@1309
 | 
   388       end }
 | 
| 
bsw/jbe@1309
 | 
   389     end }
 | 
| 
bsw/jbe@1309
 | 
   390   end)
 | 
| 
bsw/jbe@1309
 | 
   391 end
 | 
| 
bsw/jbe@1309
 | 
   392 
 | 
| 
bsw/jbe@1309
 | 
   393 
 | 
| 
bsw/jbe@1309
 | 
   394 if mode == "timeline" then
 | 
| 
bsw/jbe@1309
 | 
   395   --dotabs()
 | 
| 
bsw/jbe@1309
 | 
   396   filters.content = function()
 | 
| 
bsw/jbe@1309
 | 
   397     doit()
 | 
| 
bsw/jbe@1309
 | 
   398   end
 | 
| 
bsw/jbe@1309
 | 
   399 else
 | 
| 
bsw/jbe@1309
 | 
   400   -- dotabs()
 | 
| 
bsw/jbe@1309
 | 
   401   filters.content = function()
 | 
| 
bsw/jbe@1309
 | 
   402     if config.voting_only then
 | 
| 
bsw/jbe@1309
 | 
   403       local admission_order_field = "filter_issue_order.order_in_unit"
 | 
| 
bsw/jbe@1309
 | 
   404       if for_area then
 | 
| 
bsw/jbe@1309
 | 
   405         admission_order_field = "filter_issue_order.order_in_area"
 | 
| 
bsw/jbe@1309
 | 
   406       end
 | 
| 
bsw/jbe@1309
 | 
   407       selector:left_join ( "issue_order_in_admission_state", "filter_issue_order",    "filter_issue_order.id = issue.id" )
 | 
| 
bsw/jbe@1309
 | 
   408       selector:add_order_by ( "issue.closed DESC NULLS FIRST" )
 | 
| 
bsw/jbe@1309
 | 
   409       selector:add_order_by ( "issue.accepted ISNULL" )
 | 
| 
bsw/jbe@1309
 | 
   410       selector:add_order_by ( "CASE WHEN issue.accepted ISNULL THEN NULL ELSE justify_interval(coalesce(issue.fully_frozen + issue.voting_time, issue.half_frozen + issue.verification_time, issue.accepted + issue.discussion_time, issue.created + issue.max_admission_time) - now()) END" )
 | 
| 
bsw/jbe@1309
 | 
   411       selector:add_order_by ( "CASE WHEN issue.accepted ISNULL THEN " .. admission_order_field .. " ELSE NULL END" )
 | 
| 
bsw/jbe@1309
 | 
   412       selector:add_order_by ( "id" )
 | 
| 
bsw/jbe@1309
 | 
   413     end
 | 
| 
bsw@1493
 | 
   414     if not search then
 | 
| 
bsw@1602
 | 
   415 --      execute.view{ module = "index", view = "_head" }
 | 
| 
bsw@1493
 | 
   416     end
 | 
| 
bsw/jbe@1309
 | 
   417     ui.paginate{
 | 
| 
bsw/jbe@1309
 | 
   418       selector = selector,
 | 
| 
bsw/jbe@1309
 | 
   419       per_page = 25,
 | 
| 
bsw@1758
 | 
   420       link_attr = { class = "mdl-button mdl-js-button mdl-button--raised" },
 | 
| 
bsw@1760
 | 
   421       active_link_attr = { class = "mdl-button mdl-js-button mdl-button--raised mdl-button--colored" },
 | 
| 
bsw@1757
 | 
   422       position = "after",
 | 
| 
bsw/jbe@1309
 | 
   423       content = doit
 | 
| 
bsw/jbe@1309
 | 
   424     }
 | 
| 
bsw/jbe@1309
 | 
   425   end
 | 
| 
bsw/jbe@1309
 | 
   426 end
 | 
| 
bsw/jbe@1309
 | 
   427 
 | 
| 
bsw/jbe@1309
 | 
   428 filters.class = "mdl-special-card mdl-card__fullwidth mdl-shadow--2dp"
 | 
| 
bsw/jbe@1309
 | 
   429 
 | 
| 
bsw@1489
 | 
   430 filters.legend = _"Filter issues:"
 | 
| 
bsw@1489
 | 
   431 
 | 
| 
bsw/jbe@1309
 | 
   432 ui.filters(filters)
 | 
| 
bsw/jbe@1309
 | 
   433 
 | 
| 
bsw/jbe@1309
 | 
   434 
 | 
| 
bsw/jbe@1309
 | 
   435       
 |