| rev | 
   line source | 
| 
bsw/jbe@0
 | 
     1 local issues_selector = param.get("issues_selector", "table")
 | 
| 
bsw@459
 | 
     2 local member = param.get("for_member", "table") or app.session.member
 | 
| 
bsw@459
 | 
     3 local for_member = param.get("for_member", "table")
 | 
| 
bsw@414
 | 
     4 local for_state = param.get("for_state")
 | 
| 
bsw@414
 | 
     5 local for_unit = param.get("for_unit", atom.boolean)
 | 
| 
bsw@414
 | 
     6 local for_area = param.get("for_area", atom.boolean)
 | 
| 
bsw@414
 | 
     7 
 | 
| 
bsw@414
 | 
     8 
 | 
| 
bsw@414
 | 
     9 if for_state == "open" then
 | 
| 
bsw@414
 | 
    10   issues_selector:add_where("issue.closed ISNULL")
 | 
| 
bsw@414
 | 
    11 elseif for_state == "closed" then
 | 
| 
bsw@414
 | 
    12   issues_selector:add_where("issue.closed NOTNULL")
 | 
| 
bsw@414
 | 
    13 end
 | 
| 
bsw/jbe@0
 | 
    14 
 | 
| 
bsw@51
 | 
    15 if app.session.member_id then
 | 
| 
bsw@51
 | 
    16   issues_selector
 | 
| 
bsw@461
 | 
    17     :left_join("interest", "_interest", { "_interest.issue_id = issue.id AND _interest.member_id = ?", member.id } )
 | 
| 
bsw@51
 | 
    18     :add_field("(_interest.member_id NOTNULL)", "is_interested")
 | 
| 
bsw@285
 | 
    19   issues_selector
 | 
| 
bsw@461
 | 
    20     :left_join("delegating_interest_snapshot", "_delegating_interest", { "_delegating_interest.issue_id = issue.id AND _delegating_interest.member_id = ? AND _delegating_interest.event = issue.latest_snapshot_event", member.id } )
 | 
| 
bsw@285
 | 
    21     :add_field("_delegating_interest.delegate_member_ids[1]", "is_interested_by_delegation_to_member_id")
 | 
| 
bsw@285
 | 
    22     :add_field("_delegating_interest.delegate_member_ids[array_upper(_delegating_interest.delegate_member_ids, 1)]", "is_interested_via_member_id")
 | 
| 
bsw@285
 | 
    23     :add_field("array_length(_delegating_interest.delegate_member_ids, 1)", "delegation_chain_length")
 | 
| 
bsw@51
 | 
    24 end
 | 
| 
bsw@11
 | 
    25 
 | 
| 
bsw/jbe@19
 | 
    26 ui.add_partial_param_names{
 | 
| 
bsw/jbe@19
 | 
    27   "filter",
 | 
| 
bsw/jbe@19
 | 
    28   "filter_open",
 | 
| 
bsw/jbe@19
 | 
    29   "filter_voting",
 | 
| 
bsw/jbe@19
 | 
    30   "filter_interest",
 | 
| 
bsw/jbe@19
 | 
    31   "issue_list" 
 | 
| 
bsw/jbe@19
 | 
    32 }
 | 
| 
bsw/jbe@0
 | 
    33 
 | 
| 
bsw@414
 | 
    34 local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = {
 | 
| 
bsw@459
 | 
    35   member = member, for_member = for_member, state = for_state, for_unit = for_unit, for_area = for_area
 | 
| 
bsw@414
 | 
    36 }}
 | 
| 
bsw/jbe@19
 | 
    37 
 | 
| 
bsw/jbe@19
 | 
    38 filters.content = function()
 | 
| 
bsw@275
 | 
    39   ui.paginate{
 | 
| 
bsw@422
 | 
    40     per_page = tonumber(param.get("per_page") or 25),
 | 
| 
bsw/jbe@19
 | 
    41     selector = issues_selector,
 | 
| 
bsw/jbe@19
 | 
    42     content = function()
 | 
| 
bsw/jbe@19
 | 
    43       local highlight_string = param.get("highlight_string", "string")
 | 
| 
bsw/jbe@19
 | 
    44       local issues = issues or issues_selector:exec()
 | 
| 
bsw/jbe@19
 | 
    45       -- issues:load(initiatives)
 | 
| 
bsw@273
 | 
    46       ui.container{ attr = { class = "issues" }, content = function()
 | 
| 
bsw@273
 | 
    47 
 | 
| 
bsw@273
 | 
    48         for i, issue in ipairs(issues) do
 | 
| 
bsw@273
 | 
    49 
 | 
| 
bsw@273
 | 
    50           local class = "issue"
 | 
| 
bsw@289
 | 
    51           if issue.is_interested then
 | 
| 
bsw@273
 | 
    52             class = class .. " interested"
 | 
| 
bsw@289
 | 
    53           elseif issue.is_interested_by_delegation_to_member_id then
 | 
| 
bsw@289
 | 
    54             class = class .. " interested_by_delegation"
 | 
| 
bsw@273
 | 
    55           end
 | 
| 
bsw@273
 | 
    56           ui.container{ attr = { class = class }, content = function()
 | 
| 
bsw@273
 | 
    57 
 | 
| 
bsw@273
 | 
    58             ui.container{ attr = { class = "issue_info" }, content = function()
 | 
| 
bsw@273
 | 
    59             
 | 
| 
bsw@312
 | 
    60               if issue.is_interested then
 | 
| 
bsw@312
 | 
    61                 ui.tag{
 | 
| 
bsw@312
 | 
    62                   tag = "div", attr = { class = "interest_by_delegation"},
 | 
| 
bsw@312
 | 
    63                   content = function()
 | 
| 
bsw@312
 | 
    64                     local text = "You are interested in this issue"
 | 
| 
bsw@312
 | 
    65                     ui.image{ attr = { alt = text, title = text }, static = "icons/16/eye.png" }
 | 
| 
bsw@312
 | 
    66                   end
 | 
| 
bsw@312
 | 
    67                 }
 | 
| 
bsw@312
 | 
    68                 
 | 
| 
bsw@312
 | 
    69               elseif issue.is_interested_by_delegation_to_member_id then
 | 
| 
bsw@285
 | 
    70                 ui.tag{
 | 
| 
bsw@285
 | 
    71                   tag = "div", attr = { class = "interest_by_delegation"},
 | 
| 
bsw@285
 | 
    72                   content = function()
 | 
| 
bsw@285
 | 
    73                     local member = Member:by_id(issue.is_interested_by_delegation_to_member_id)
 | 
| 
bsw@315
 | 
    74                     local text = _"delegated to"
 | 
| 
bsw@315
 | 
    75                     ui.image{
 | 
| 
bsw@315
 | 
    76                       attr = { class = "delegation_arrow", alt = text, title = text },
 | 
| 
bsw@315
 | 
    77                       static = "delegation_arrow_24_horizontal.png"
 | 
| 
bsw@315
 | 
    78                     }
 | 
| 
bsw@285
 | 
    79                     execute.view{
 | 
| 
bsw@285
 | 
    80                       module = "member_image",
 | 
| 
bsw@285
 | 
    81                       view = "_show",
 | 
| 
bsw@285
 | 
    82                       params = {
 | 
| 
bsw@285
 | 
    83                         member = member,
 | 
| 
bsw@285
 | 
    84                         image_type = "avatar",
 | 
| 
bsw@285
 | 
    85                         show_dummy = true,
 | 
| 
bsw@285
 | 
    86                         class = "micro_avatar",
 | 
| 
bsw@285
 | 
    87                         popup_text = member.name
 | 
| 
bsw@285
 | 
    88                       }
 | 
| 
bsw@285
 | 
    89                     }
 | 
| 
bsw@285
 | 
    90                     if issue.is_interested_by_delegation_to_member_id ~= issue.is_interested_via_member_id then
 | 
| 
bsw@285
 | 
    91                       if issue.delegation_chain_length > 2 then
 | 
| 
bsw@315
 | 
    92                         local text = _"delegated to"
 | 
| 
bsw@315
 | 
    93                         ui.image{
 | 
| 
bsw@315
 | 
    94                           attr = { class = "delegation_arrow", alt = text, title = text },
 | 
| 
bsw@315
 | 
    95                           static = "delegation_arrow_24_horizontal.png"
 | 
| 
bsw@315
 | 
    96                         }
 | 
| 
bsw@315
 | 
    97                         ui.tag{ content = "..." }
 | 
| 
bsw@285
 | 
    98                       end
 | 
| 
bsw@315
 | 
    99                     local text = _"delegated to"
 | 
| 
bsw@315
 | 
   100                       ui.image{
 | 
| 
bsw@315
 | 
   101                         attr = { class = "delegation_arrow", alt = text, title = text },
 | 
| 
bsw@315
 | 
   102                         static = "delegation_arrow_24_horizontal.png"
 | 
| 
bsw@315
 | 
   103                       }
 | 
| 
bsw@285
 | 
   104                       local member = Member:by_id(issue.is_interested_via_member_id)
 | 
| 
bsw@285
 | 
   105                       execute.view{
 | 
| 
bsw@285
 | 
   106                         module = "member_image",
 | 
| 
bsw@285
 | 
   107                         view = "_show",
 | 
| 
bsw@285
 | 
   108                         params = {
 | 
| 
bsw@285
 | 
   109                           member = member,
 | 
| 
bsw@285
 | 
   110                           image_type = "avatar",
 | 
| 
bsw@285
 | 
   111                           show_dummy = true,
 | 
| 
bsw@285
 | 
   112                           class = "micro_avatar",
 | 
| 
bsw@285
 | 
   113                           popup_text = member.name
 | 
| 
bsw@285
 | 
   114                         }
 | 
| 
bsw@285
 | 
   115                       }
 | 
| 
bsw@285
 | 
   116                     end
 | 
| 
bsw@285
 | 
   117                   end
 | 
| 
bsw@285
 | 
   118                 }
 | 
| 
bsw@285
 | 
   119               end
 | 
| 
bsw@285
 | 
   120             
 | 
| 
bsw@273
 | 
   121               ui.tag{
 | 
| 
bsw@273
 | 
   122                 tag = "div",
 | 
| 
bsw@273
 | 
   123                 content = function()
 | 
| 
bsw@273
 | 
   124                   ui.link{
 | 
| 
bsw@273
 | 
   125                     attr = { class = "issue_id" },
 | 
| 
bsw@273
 | 
   126                     text = _("Issue ##{id}", { id = tostring(issue.id) }),
 | 
| 
bsw@273
 | 
   127                     module = "issue",
 | 
| 
bsw@273
 | 
   128                     view = "show",
 | 
| 
bsw@273
 | 
   129                     id = issue.id
 | 
| 
bsw@273
 | 
   130                   }
 | 
| 
bsw@273
 | 
   131 
 | 
| 
bsw@280
 | 
   132                   slot.put(" · ")
 | 
| 
bsw@471
 | 
   133                   ui.tag{ content = issue.policy.name }
 | 
| 
bsw@471
 | 
   134                   slot.put(" · ")
 | 
| 
bsw@280
 | 
   135                   ui.tag{ content = issue.area.name }
 | 
| 
bsw@280
 | 
   136                   slot.put(" · ")
 | 
| 
bsw@280
 | 
   137                   ui.tag{ content = issue.area.unit.name }
 | 
| 
bsw@280
 | 
   138 
 | 
| 
bsw@280
 | 
   139               end
 | 
| 
bsw/jbe@19
 | 
   140               }
 | 
| 
bsw@273
 | 
   141               ui.tag{
 | 
| 
bsw@286
 | 
   142                 attr = { class = "issue_policy_info" },
 | 
| 
bsw@273
 | 
   143                 tag = "div",
 | 
| 
bsw@273
 | 
   144                 content = function()
 | 
| 
bsw@273
 | 
   145                 
 | 
| 
bsw@414
 | 
   146                   ui.tag{ attr = { class = "event_name" }, content = issue.state_name }
 | 
| 
bsw@273
 | 
   147 
 | 
| 
bsw@273
 | 
   148                   if issue.state_time_left then
 | 
| 
bsw@273
 | 
   149                     slot.put(" · ")
 | 
| 
bsw@414
 | 
   150                     if issue.state_time_left:sub(1,1) == "-" then
 | 
| 
bsw@448
 | 
   151                       if issue.state == "new" then
 | 
| 
bsw@448
 | 
   152                         ui.tag{ content = _("Discussion starts soon") }
 | 
| 
bsw@448
 | 
   153                       elseif issue.state == "discussion" then
 | 
| 
bsw@448
 | 
   154                         ui.tag{ content = _("Verification starts soon") }
 | 
| 
bsw@448
 | 
   155                       elseif issue.state == "frozen" then
 | 
| 
bsw@448
 | 
   156                         ui.tag{ content = _("Voting starts soon") }
 | 
| 
bsw@448
 | 
   157                       elseif issue.state == "voting" then
 | 
| 
bsw@448
 | 
   158                         ui.tag{ content = _("Counting starts soon") }
 | 
| 
bsw@448
 | 
   159                       end
 | 
| 
bsw@414
 | 
   160                     else
 | 
| 
bsw@414
 | 
   161                       ui.tag{ content = _("#{time_left} left", { time_left = issue.state_time_left:gsub("days", _"days"):gsub("day", _"day") }) }
 | 
| 
bsw@414
 | 
   162                     end
 | 
| 
bsw@273
 | 
   163                   end
 | 
| 
bsw@273
 | 
   164 
 | 
| 
bsw@273
 | 
   165                 end
 | 
| 
bsw@273
 | 
   166               }
 | 
| 
bsw@273
 | 
   167 
 | 
| 
bsw@273
 | 
   168               
 | 
| 
bsw@273
 | 
   169               if issue.old_state then
 | 
| 
bsw@273
 | 
   170                 ui.field.text{ value = format.time(issue.sort) }
 | 
| 
bsw@273
 | 
   171                 ui.field.text{ value = Issue:get_state_name_for_state(issue.old_state) .. " > " .. Issue:get_state_name_for_state(issue.new_state) }
 | 
| 
bsw/jbe@19
 | 
   172               else
 | 
| 
bsw/jbe@19
 | 
   173               end
 | 
| 
bsw@273
 | 
   174             end }
 | 
| 
bsw@273
 | 
   175 
 | 
| 
bsw@273
 | 
   176             ui.container{ attr = { class = "initiative_list" }, content = function()
 | 
| 
bsw@273
 | 
   177 
 | 
| 
bsw@273
 | 
   178               local initiatives_selector = issue:get_reference_selector("initiatives")
 | 
| 
bsw/jbe@19
 | 
   179               local highlight_string = param.get("highlight_string")
 | 
| 
bsw/jbe@19
 | 
   180               if highlight_string then
 | 
| 
bsw/jbe@19
 | 
   181                 initiatives_selector:add_field( {'"highlight"("initiative"."name", ?)', highlight_string }, "name_highlighted")
 | 
| 
bsw/jbe@19
 | 
   182               end
 | 
| 
bsw/jbe@19
 | 
   183               execute.view{
 | 
| 
bsw/jbe@19
 | 
   184                 module = "initiative",
 | 
| 
bsw/jbe@19
 | 
   185                 view = "_list",
 | 
| 
bsw/jbe@19
 | 
   186                 params = {
 | 
| 
bsw@273
 | 
   187                   issue = issue,
 | 
| 
bsw/jbe@19
 | 
   188                   initiatives_selector = initiatives_selector,
 | 
| 
bsw/jbe@19
 | 
   189                   highlight_string = highlight_string,
 | 
| 
bsw@51
 | 
   190                   per_page = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3,
 | 
| 
bsw/jbe@19
 | 
   191                   no_sort = true,
 | 
| 
bsw@285
 | 
   192                   limit = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3,
 | 
| 
bsw@285
 | 
   193                   for_member = for_member
 | 
| 
bsw/jbe@19
 | 
   194                 }
 | 
| 
bsw/jbe@19
 | 
   195               }
 | 
| 
bsw@273
 | 
   196             end }
 | 
| 
bsw@273
 | 
   197           end }
 | 
| 
bsw@273
 | 
   198         end
 | 
| 
bsw@273
 | 
   199       end }
 | 
| 
bsw/jbe@19
 | 
   200     end
 | 
| 
bsw/jbe@19
 | 
   201   }
 | 
| 
bsw/jbe@19
 | 
   202 end
 | 
| 
bsw/jbe@19
 | 
   203 
 | 
| 
bsw@275
 | 
   204 filters.opened = true
 | 
| 
bsw/jbe@19
 | 
   205 filters.selector = issues_selector
 | 
| 
bsw/jbe@19
 | 
   206 
 | 
| 
bsw/jbe@19
 | 
   207 if param.get("no_filter", atom.boolean) then
 | 
| 
bsw/jbe@19
 | 
   208   filters.content()
 | 
| 
bsw/jbe@19
 | 
   209 else
 | 
| 
bsw/jbe@19
 | 
   210   ui.filters(filters)
 | 
| 
bsw/jbe@19
 | 
   211 end
 |