| rev | 
   line source | 
| 
bsw/jbe@0
 | 
     1 local issue = param.get("issue", "table")
 | 
| 
bsw/jbe@0
 | 
     2 
 | 
| 
bsw/jbe@19
 | 
     3 local initiatives_selector = param.get("initiatives_selector", "table")
 | 
| 
bsw@51
 | 
     4 
 | 
| 
bsw@274
 | 
     5 local highlight_initiative = param.get("highlight_initiative", "table")
 | 
| 
bsw@274
 | 
     6 
 | 
| 
bsw@285
 | 
     7 local for_member = param.get("for_member", "table") or app.session.member
 | 
| 
bsw@285
 | 
     8 
 | 
| 
bsw@11
 | 
     9 initiatives_selector
 | 
| 
bsw/jbe@19
 | 
    10   :join("issue", nil, "issue.id = initiative.issue_id")
 | 
| 
bsw@11
 | 
    11 
 | 
| 
bsw@51
 | 
    12 if app.session.member_id then
 | 
| 
bsw@51
 | 
    13   initiatives_selector
 | 
| 
bsw@285
 | 
    14     :left_join("initiator", "_initiator", { "_initiator.initiative_id = initiative.id AND _initiator.member_id = ? AND _initiator.accepted", for_member.id } )
 | 
| 
bsw@285
 | 
    15     :left_join("supporter", "_supporter", { "_supporter.initiative_id = initiative.id AND _supporter.member_id = ?", for_member.id} )
 | 
| 
bsw@285
 | 
    16     :left_join("delegating_interest_snapshot", "_delegating_interest_snapshot", { "_delegating_interest_snapshot.issue_id = initiative.issue_id AND _delegating_interest_snapshot.member_id = ? AND _delegating_interest_snapshot.event = issue.latest_snapshot_event", for_member.id} )
 | 
| 
bsw@285
 | 
    17     :left_join("direct_supporter_snapshot", "_direct_supporter_snapshot", "_direct_supporter_snapshot.initiative_id = initiative.id AND _direct_supporter_snapshot.member_id = _delegating_interest_snapshot.delegate_member_ids[array_upper(_delegating_interest_snapshot.delegate_member_ids, 1)] AND _direct_supporter_snapshot.event = issue.latest_snapshot_event")
 | 
| 
bsw@285
 | 
    18 
 | 
| 
bsw@51
 | 
    19     :add_field("(_initiator.member_id NOTNULL)", "is_initiator")
 | 
| 
bsw@285
 | 
    20     :add_field({"(_supporter.member_id NOTNULL) AND NOT EXISTS(SELECT 1 FROM opinion WHERE opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)))", for_member.id }, "is_supporter")
 | 
| 
bsw@285
 | 
    21     :add_field({"EXISTS(SELECT 1 FROM opinion WHERE opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)))", for_member.id }, "is_potential_supporter")
 | 
| 
bsw@285
 | 
    22 
 | 
| 
bsw@285
 | 
    23     :add_field("_direct_supporter_snapshot.member_id NOTNULL", "is_supporter_via_delegation")
 | 
| 
bsw@51
 | 
    24 end
 | 
| 
bsw@11
 | 
    25 
 | 
| 
bsw@476
 | 
    26 initiatives_selector:add_order_by("initiative.rank, initiative.supporter_count DESC, initiative.id")
 | 
| 
bsw@469
 | 
    27 
 | 
| 
bsw/jbe@19
 | 
    28 local initiatives_count = initiatives_selector:count()
 | 
| 
bsw@11
 | 
    29 
 | 
| 
bsw/jbe@19
 | 
    30 local limit = param.get("limit", atom.number)
 | 
| 
bsw/jbe@19
 | 
    31 
 | 
| 
bsw@345
 | 
    32 local more_initiatives_count
 | 
| 
bsw@345
 | 
    33 if limit then
 | 
| 
bsw@345
 | 
    34   if initiatives_count > limit then
 | 
| 
bsw@345
 | 
    35     more_initiatives_count = initiatives_count - limit
 | 
| 
bsw/jbe@19
 | 
    36   end
 | 
| 
bsw@345
 | 
    37   initiatives_selector:limit(limit)
 | 
| 
bsw/jbe@19
 | 
    38 end
 | 
| 
bsw/jbe@19
 | 
    39 
 | 
| 
bsw@345
 | 
    40 local issue = param.get("issue", "table")
 | 
| 
bsw/jbe@19
 | 
    41 
 | 
| 
bsw@345
 | 
    42 local name = "initiative_list"
 | 
| 
bsw@345
 | 
    43 if issue then
 | 
| 
bsw@345
 | 
    44   name = "issue_" .. tostring(issue.id) ..  "_initiative_list"
 | 
| 
bsw@345
 | 
    45 end
 | 
| 
bsw@345
 | 
    46 
 | 
| 
bsw@345
 | 
    47 ui.add_partial_param_names{ name }
 | 
| 
bsw/jbe@19
 | 
    48 
 | 
| 
bsw@469
 | 
    49 ui.paginate{
 | 
| 
bsw@469
 | 
    50   name = issue and "issue_" .. tostring(issue.id) .. "_page" or nil,
 | 
| 
bsw@345
 | 
    51   selector = initiatives_selector,
 | 
| 
bsw@480
 | 
    52   per_page = param.get("per_page", atom.number) or limit or 25,
 | 
| 
bsw@345
 | 
    53   content = function()
 | 
| 
bsw@469
 | 
    54     local initiatives = initiatives_selector:exec()
 | 
| 
bsw@469
 | 
    55     if highlight_initiative then
 | 
| 
bsw@469
 | 
    56       local highlight_initiative_found
 | 
| 
bsw@469
 | 
    57       for i, initiative in ipairs(initiatives) do
 | 
| 
bsw@469
 | 
    58         if initiative.id == highlight_initiative.id then
 | 
| 
bsw@469
 | 
    59           highhighlight_initiative_found = true
 | 
| 
bsw/jbe@19
 | 
    60         end
 | 
| 
bsw/jbe@19
 | 
    61       end
 | 
| 
bsw@469
 | 
    62       if not highhighlight_initiative_found then
 | 
| 
bsw@469
 | 
    63         initiatives[#initiatives+1] = highlight_initiative
 | 
| 
bsw@469
 | 
    64         if more_initiatives_count then
 | 
| 
bsw@469
 | 
    65           more_initiatives_count = more_initiatives_count - 1
 | 
| 
bsw@469
 | 
    66         end
 | 
| 
bsw@469
 | 
    67       end
 | 
| 
bsw@469
 | 
    68     end
 | 
| 
bsw@469
 | 
    69     for i, initiative in ipairs(initiatives) do
 | 
| 
bsw@469
 | 
    70       execute.view{
 | 
| 
bsw@469
 | 
    71         module = "initiative",
 | 
| 
bsw@469
 | 
    72         view = "_list_element",
 | 
| 
bsw@469
 | 
    73         params = {
 | 
| 
bsw@469
 | 
    74           initiative = initiative,
 | 
| 
bsw@469
 | 
    75           selected = highlight_initiative and highlight_initiative.id == initiative.id or nil,
 | 
| 
bsw@469
 | 
    76         }
 | 
| 
bsw@469
 | 
    77       }
 | 
| 
bsw@469
 | 
    78     end
 | 
| 
bsw/jbe@19
 | 
    79   end
 | 
| 
bsw@345
 | 
    80 }
 | 
| 
bsw/jbe@19
 | 
    81 
 | 
| 
bsw@345
 | 
    82 if more_initiatives_count and more_initiatives_count > 0 then
 | 
| 
bsw@345
 | 
    83   local text
 | 
| 
bsw@345
 | 
    84   if more_initiatives_count == 1 then
 | 
| 
bsw@345
 | 
    85     text = _("and one more initiative")
 | 
| 
bsw@345
 | 
    86   else
 | 
| 
bsw@345
 | 
    87     text = _("and #{count} more initiatives", { count = more_initiatives_count })
 | 
| 
bsw@345
 | 
    88   end
 | 
| 
bsw@345
 | 
    89   ui.link{
 | 
| 
bsw@345
 | 
    90     attr = { class = "more_initiatives_link" },
 | 
| 
bsw@345
 | 
    91     content = text,
 | 
| 
bsw@345
 | 
    92     module = "issue",
 | 
| 
bsw@345
 | 
    93     view = "show",
 | 
| 
bsw@345
 | 
    94     id = issue.id,
 | 
| 
bsw@345
 | 
    95   }
 | 
| 
bsw/jbe@19
 | 
    96 end
 |