liquid_feedback_frontend
view app/main/initiative/_list.lua @ 391:4cc560fb92d4
Fix error in registration process
| author | bsw | 
|---|---|
| date | Mon Mar 05 20:17:25 2012 +0100 (2012-03-05) | 
| parents | 7d6a3c411f99 | 
| children | 3e2e233330d9 | 
 line source
     1 local issue = param.get("issue", "table")
     3 local initiatives_selector = param.get("initiatives_selector", "table")
     5 local highlight_initiative = param.get("highlight_initiative", "table")
     7 local for_member = param.get("for_member", "table") or app.session.member
     9 initiatives_selector
    10   :join("issue", nil, "issue.id = initiative.issue_id")
    12 if app.session.member_id then
    13   initiatives_selector
    14     :left_join("initiator", "_initiator", { "_initiator.initiative_id = initiative.id AND _initiator.member_id = ? AND _initiator.accepted", for_member.id } )
    15     :left_join("supporter", "_supporter", { "_supporter.initiative_id = initiative.id AND _supporter.member_id = ?", for_member.id} )
    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} )
    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")
    19     :add_field("(_initiator.member_id NOTNULL)", "is_initiator")
    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")
    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")
    23     :add_field("_direct_supporter_snapshot.member_id NOTNULL", "is_supporter_via_delegation")
    24 end
    26 local initiatives_count = initiatives_selector:count()
    28 local limit = param.get("limit", atom.number)
    29 local no_sort = param.get("no_sort", atom.boolean)
    31 local more_initiatives_count
    32 if limit then
    33   if initiatives_count > limit then
    34     more_initiatives_count = initiatives_count - limit
    35   end
    36   initiatives_selector:limit(limit)
    37 end
    39 local issue = param.get("issue", "table")
    41 local name = "initiative_list"
    42 if issue then
    43   name = "issue_" .. tostring(issue.id) ..  "_initiative_list"
    44 end
    46 ui.add_partial_param_names{ name }
    48 local order_filter = {
    49   name = name,
    50   label = _"Order by"
    51 }
    53 if issue and issue.ranks_available then
    54   order_filter[#order_filter+1] = {
    55     name = "rank",
    56     label = _"Rank",
    57     selector_modifier = function(selector) selector:add_order_by("initiative.rank, initiative.admitted DESC, vote_ratio(initiative.positive_votes, initiative.negative_votes) DESC, initiative.id") end
    58   }
    59 end
    61 order_filter[#order_filter+1] = {
    62   name = "potential_support",
    63   label = _"Potential support",
    64   selector_modifier = function(selector) selector:add_order_by("CASE WHEN issue.population = 0 THEN 0 ELSE initiative.supporter_count::float / issue.population::float END DESC, initiative.id") end
    65 }
    67 order_filter[#order_filter+1] = {
    68   name = "support",
    69   label = _"Support",
    70   selector_modifier = function(selector) selector:add_order_by("initiative.satisfied_supporter_count::float / issue.population::float DESC, initiative.id") end
    71 }
    73 order_filter[#order_filter+1] = {
    74   name = "newest",
    75   label = _"Newest",
    76   selector_modifier = function(selector) selector:add_order_by("initiative.created DESC, initiative.id") end
    77 }
    79 order_filter[#order_filter+1] = {
    80   name = "oldest",
    81   label = _"Oldest",
    82   selector_modifier = function(selector) selector:add_order_by("initiative.created, initiative.id") end
    83 }
    85 ui_filters = ui.filters
    87 if no_sort then
    88   ui_filters = function(args) args.content() end
    89   if issue.ranks_available then
    90     initiatives_selector:add_order_by("initiative.rank, initiative.admitted DESC, vote_ratio(initiative.positive_votes, initiative.negative_votes) DESC, initiative.id")
    91   else
    92     initiatives_selector:add_order_by("CASE WHEN issue.population = 0 OR initiative.supporter_count = 0 OR initiative.supporter_count ISNULL THEN 0 ELSE initiative.supporter_count::float / issue.population::float END DESC, initiative.id")
    93   end
    94 end
    96 ui_filters{
    97   label = _"Change order",
    98   order_filter,
    99   selector = initiatives_selector,
   100   content = function()
   101     ui.paginate{
   102       name = issue and "issue_" .. tostring(issue.id) .. "_page" or nil,
   103       selector = initiatives_selector,
   104       per_page = param.get("per_page", atom.number) or limit,
   105       content = function()
   106         local initiatives = initiatives_selector:exec()
   107         if highlight_initiative then
   108           local highlight_initiative_found
   109           for i, initiative in ipairs(initiatives) do
   110             if initiative.id == highlight_initiative.id then
   111               highhighlight_initiative_found = true
   112             end
   113           end
   114           if not highhighlight_initiative_found then
   115             initiatives[#initiatives+1] = highlight_initiative
   116             if more_initiatives_count then
   117               more_initiatives_count = more_initiatives_count - 1
   118             end
   119           end
   120         end
   121         for i, initiative in ipairs(initiatives) do
   122           execute.view{
   123             module = "initiative",
   124             view = "_list_element",
   125             params = {
   126               initiative = initiative,
   127               selected = highlight_initiative and highlight_initiative.id == initiative.id or nil,
   128             }
   129           }
   130         end
   131       end
   132     }
   133   end
   134 }
   136 if more_initiatives_count and more_initiatives_count > 0 then
   137   local text
   138   if more_initiatives_count == 1 then
   139     text = _("and one more initiative")
   140   else
   141     text = _("and #{count} more initiatives", { count = more_initiatives_count })
   142   end
   143   ui.link{
   144     attr = { class = "more_initiatives_link" },
   145     content = text,
   146     module = "issue",
   147     view = "show",
   148     id = issue.id,
   149   }
   150 end
