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