liquid_feedback_frontend
annotate app/main/initiative/_list.lua @ 57:4f39f0a0d5b5
Listing of updated drafts on start page; Code cleanup; Minor bugfix
MOTD, initiator invite, issues to vote and listing of updated drafts shown as tabs on start page;
Bugfix: Initiator icon only shown when initiatorship has been accepted
MOTD, initiator invite, issues to vote and listing of updated drafts shown as tabs on start page;
Bugfix: Initiator icon only shown when initiatorship has been accepted
author | bsw |
---|---|
date | Sat Apr 17 21:59:02 2010 +0200 (2010-04-17) |
parents | 0849be391140 |
children | bed32bf10a0b |
rev | line source |
---|---|
bsw/jbe@19 | 1 ui.script{ script = "lf_initiative_expanded = {};" } |
bsw@11 | 2 |
bsw/jbe@0 | 3 local issue = param.get("issue", "table") |
bsw/jbe@0 | 4 |
bsw/jbe@19 | 5 local initiatives_selector = param.get("initiatives_selector", "table") |
bsw@51 | 6 |
bsw@11 | 7 initiatives_selector |
bsw/jbe@19 | 8 :join("issue", nil, "issue.id = initiative.issue_id") |
bsw@11 | 9 |
bsw@51 | 10 if app.session.member_id then |
bsw@51 | 11 initiatives_selector |
bsw@57 | 12 :left_join("initiator", "_initiator", { "_initiator.initiative_id = initiative.id AND _initiator.member_id = ? AND _initiator.accepted", app.session.member.id} ) |
bsw@51 | 13 :left_join("supporter", "_supporter", { "_supporter.initiative_id = initiative.id AND _supporter.member_id = ?", app.session.member.id} ) |
bsw@51 | 14 |
bsw@51 | 15 :add_field("(_initiator.member_id NOTNULL)", "is_initiator") |
bsw@51 | 16 :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)))", app.session.member.id }, "is_supporter") |
bsw@51 | 17 :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)))", app.session.member.id }, "is_potential_supporter") |
bsw@51 | 18 end |
bsw@11 | 19 |
bsw/jbe@19 | 20 local initiatives_count = initiatives_selector:count() |
bsw@11 | 21 |
bsw/jbe@19 | 22 local limit = param.get("limit", atom.number) |
bsw/jbe@19 | 23 local no_sort = param.get("no_sort", atom.boolean) |
bsw/jbe@19 | 24 |
bsw/jbe@19 | 25 local show_for_issue = param.get("show_for_issue", atom.boolean) |
bsw/jbe@19 | 26 |
bsw/jbe@19 | 27 local show_for_initiative |
bsw/jbe@19 | 28 |
bsw/jbe@19 | 29 local show_for_initiative_id = param.get("for_initiative_id", atom.number) |
bsw/jbe@19 | 30 |
bsw/jbe@19 | 31 if show_for_initiative_id then |
bsw/jbe@19 | 32 show_for_initiative = Initiative:by_id(show_for_initiative_id) |
bsw/jbe@19 | 33 |
bsw/jbe@19 | 34 elseif not show_for_initiative_id and show_for_issue and issue and issue.ranks_available then |
bsw/jbe@19 | 35 winning_initiative = Initiative:new_selector() |
bsw/jbe@19 | 36 :add_where{ "issue_id = ?", issue.id } |
bsw/jbe@19 | 37 :add_where("rank = 1") |
bsw@24 | 38 :optional_object_mode() |
bsw/jbe@19 | 39 :exec() |
bsw/jbe@19 | 40 if winning_initiative then |
bsw/jbe@19 | 41 show_for_initiative = winning_initiative |
bsw/jbe@19 | 42 ui.container{ |
bsw/jbe@19 | 43 attr = { class = "admitted_info" }, |
bsw/jbe@19 | 44 content = _"This issue has been finished with the following winning initiative:" |
bsw/jbe@19 | 45 } |
bsw/jbe@19 | 46 else |
bsw/jbe@19 | 47 ui.container{ |
bsw/jbe@19 | 48 attr = { class = "not_admitted_info" }, |
bsw/jbe@19 | 49 content = _"This issue has been finished without any winning initiative." |
bsw/jbe@19 | 50 } |
bsw/jbe@19 | 51 end |
bsw/jbe@19 | 52 end |
bsw/jbe@19 | 53 |
bsw/jbe@19 | 54 |
bsw/jbe@19 | 55 if show_for_initiative then |
bsw/jbe@19 | 56 ui.script{ script = "lf_initiative_expanded['initiative_content_" .. tostring(show_for_initiative.id) .. "'] = true;" } |
bsw/jbe@19 | 57 initiatives_selector:add_where{ "initiative.id != ?", show_for_initiative.id } |
bsw/jbe@19 | 58 |
bsw/jbe@19 | 59 execute.view{ |
bsw/jbe@19 | 60 module = "initiative", |
bsw/jbe@19 | 61 view = "_list_element", |
bsw/jbe@19 | 62 params = { |
bsw/jbe@19 | 63 initiative = show_for_initiative, |
bsw/jbe@19 | 64 expanded = true, |
bsw/jbe@19 | 65 expandable = true |
bsw/jbe@19 | 66 } |
bsw/jbe@19 | 67 } |
bsw/jbe@19 | 68 if show_for_issue then |
bsw/jbe@19 | 69 slot.put("<br />") |
bsw/jbe@19 | 70 ui.container{ |
bsw/jbe@19 | 71 attr = { style = "font-weight: bold;" }, |
bsw/jbe@0 | 72 content = function() |
bsw/jbe@19 | 73 slot.put(_"Alternative initiatives") |
bsw/jbe@0 | 74 end |
bsw/jbe@0 | 75 } |
bsw/jbe@0 | 76 end |
bsw/jbe@19 | 77 elseif show_for_issue then |
bsw/jbe@19 | 78 ui.container{ |
bsw/jbe@19 | 79 attr = { style = "font-weight: bold;" }, |
bsw/jbe@19 | 80 content = function() |
bsw/jbe@19 | 81 slot.put(_"Alternative initiatives") |
bsw/jbe@19 | 82 end |
bsw@11 | 83 } |
bsw@11 | 84 end |
bsw/jbe@19 | 85 |
bsw/jbe@19 | 86 if not show_for_initiative or initiatives_count > 1 then |
bsw/jbe@19 | 87 |
bsw/jbe@19 | 88 |
bsw/jbe@19 | 89 local more_initiatives_count |
bsw/jbe@19 | 90 if limit then |
bsw/jbe@19 | 91 limit = limit - (show_for_initiative and 1 or 0) |
bsw/jbe@19 | 92 if initiatives_count > limit then |
bsw/jbe@19 | 93 more_initiatives_count = initiatives_count - limit |
bsw/jbe@19 | 94 end |
bsw/jbe@19 | 95 initiatives_selector:limit(limit) |
bsw/jbe@19 | 96 end |
bsw/jbe@19 | 97 |
bsw/jbe@19 | 98 local expandable = param.get("expandable", atom.boolean) |
bsw/jbe@19 | 99 |
bsw/jbe@19 | 100 local issue = param.get("issue", "table") |
bsw/jbe@19 | 101 |
bsw/jbe@19 | 102 local name = "initiative_list" |
bsw/jbe@19 | 103 if issue then |
bsw/jbe@19 | 104 name = "issue_" .. tostring(issue.id) .. "_initiative_list" |
bsw/jbe@19 | 105 end |
bsw/jbe@19 | 106 |
bsw/jbe@19 | 107 ui.add_partial_param_names{ name } |
bsw/jbe@19 | 108 |
bsw/jbe@19 | 109 local order_filter = { |
bsw/jbe@19 | 110 name = name, |
bsw/jbe@19 | 111 label = _"Order by" |
bsw/jbe@19 | 112 } |
bsw/jbe@19 | 113 |
bsw/jbe@19 | 114 if issue and issue.ranks_available then |
bsw/jbe@19 | 115 order_filter[#order_filter+1] = { |
bsw/jbe@19 | 116 name = "rank", |
bsw/jbe@19 | 117 label = _"Rank", |
bsw/jbe@19 | 118 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 |
bsw/jbe@19 | 119 } |
bsw/jbe@19 | 120 end |
bsw/jbe@19 | 121 |
bsw/jbe@19 | 122 order_filter[#order_filter+1] = { |
bsw/jbe@19 | 123 name = "potential_support", |
bsw/jbe@19 | 124 label = _"Potential support", |
bsw/jbe@19 | 125 selector_modifier = function(selector) selector:add_order_by("initiative.supporter_count::float / issue.population::float DESC, initiative.id") end |
bsw/jbe@19 | 126 } |
bsw/jbe@19 | 127 |
bsw/jbe@19 | 128 order_filter[#order_filter+1] = { |
bsw/jbe@19 | 129 name = "support", |
bsw/jbe@19 | 130 label = _"Support", |
bsw/jbe@19 | 131 selector_modifier = function(selector) selector:add_order_by("initiative.satisfied_supporter_count::float / issue.population::float DESC, initiative.id") end |
bsw/jbe@19 | 132 } |
bsw/jbe@19 | 133 |
bsw/jbe@19 | 134 order_filter[#order_filter+1] = { |
bsw/jbe@19 | 135 name = "newest", |
bsw/jbe@19 | 136 label = _"Newest", |
bsw/jbe@19 | 137 selector_modifier = function(selector) selector:add_order_by("initiative.created DESC, initiative.id") end |
bsw/jbe@19 | 138 } |
bsw/jbe@19 | 139 |
bsw/jbe@19 | 140 order_filter[#order_filter+1] = { |
bsw/jbe@19 | 141 name = "oldest", |
bsw/jbe@19 | 142 label = _"Oldest", |
bsw/jbe@19 | 143 selector_modifier = function(selector) selector:add_order_by("initiative.created, initiative.id") end |
bsw/jbe@19 | 144 } |
bsw/jbe@19 | 145 |
bsw/jbe@19 | 146 ui_filters = ui.filters |
bsw/jbe@19 | 147 |
bsw/jbe@19 | 148 if no_sort then |
bsw/jbe@19 | 149 ui_filters = function(args) args.content() end |
bsw/jbe@19 | 150 if issue.ranks_available then |
bsw/jbe@19 | 151 initiatives_selector:add_order_by("initiative.rank, initiative.admitted DESC, vote_ratio(initiative.positive_votes, initiative.negative_votes) DESC, initiative.id") |
bsw/jbe@19 | 152 else |
bsw/jbe@19 | 153 initiatives_selector:add_order_by("initiative.supporter_count::float / issue.population::float DESC, initiative.id") |
bsw/jbe@19 | 154 end |
bsw/jbe@19 | 155 end |
bsw/jbe@19 | 156 |
bsw/jbe@19 | 157 ui_filters{ |
bsw/jbe@19 | 158 label = _"Change order", |
bsw/jbe@19 | 159 order_filter, |
bsw/jbe@19 | 160 selector = initiatives_selector, |
bsw/jbe@19 | 161 content = function() |
bsw/jbe@19 | 162 ui.paginate{ |
bsw/jbe@19 | 163 name = issue and "issue_" .. tostring(issue.id) .. "_page" or nil, |
bsw/jbe@19 | 164 selector = initiatives_selector, |
bsw/jbe@19 | 165 per_page = param.get("per_page", atom.number), |
bsw/jbe@19 | 166 content = function() |
bsw/jbe@19 | 167 local initiatives = initiatives_selector:exec() |
bsw/jbe@19 | 168 for i, initiative in ipairs(initiatives) do |
bsw/jbe@19 | 169 local expanded = config.user_tab_mode == "accordeon_all_expanded" and expandable or |
bsw/jbe@19 | 170 show_for_initiative and initiative.id == show_for_initiative.id |
bsw/jbe@19 | 171 if expanded then |
bsw/jbe@19 | 172 ui.script{ script = "lf_initiative_expanded['initiative_content_" .. tostring(initiative.id) .. "'] = true;" } |
bsw/jbe@19 | 173 end |
bsw/jbe@19 | 174 execute.view{ |
bsw/jbe@19 | 175 module = "initiative", |
bsw/jbe@19 | 176 view = "_list_element", |
bsw/jbe@19 | 177 params = { |
bsw/jbe@19 | 178 initiative = initiative, |
bsw/jbe@19 | 179 expanded = expanded, |
bsw/jbe@19 | 180 expandable = expandable |
bsw/jbe@19 | 181 } |
bsw/jbe@19 | 182 } |
bsw/jbe@19 | 183 end |
bsw/jbe@19 | 184 end |
bsw/jbe@19 | 185 } |
bsw/jbe@19 | 186 end |
bsw/jbe@19 | 187 } |
bsw/jbe@19 | 188 |
bsw/jbe@19 | 189 if more_initiatives_count then |
bsw/jbe@19 | 190 ui.link{ |
bsw/jbe@19 | 191 attr = { style = "font-size: 75%; font-style: italic;" }, |
bsw/jbe@19 | 192 content = _("and #{count} more initiatives", { count = more_initiatives_count }), |
bsw/jbe@19 | 193 module = "issue", |
bsw/jbe@19 | 194 view = "show", |
bsw/jbe@19 | 195 id = issue.id, |
bsw/jbe@19 | 196 } |
bsw/jbe@19 | 197 end |
bsw/jbe@19 | 198 |
bsw/jbe@19 | 199 end |
bsw/jbe@19 | 200 |
bsw/jbe@19 | 201 if show_for_issue then |
bsw/jbe@19 | 202 slot.put("<br />") |
bsw/jbe@19 | 203 |
bsw/jbe@19 | 204 if issue and initiatives_count == 1 then |
bsw/jbe@19 | 205 ui.container{ |
bsw/jbe@19 | 206 content = function() |
bsw/jbe@19 | 207 if issue.fully_frozen or issue.closed then |
bsw/jbe@19 | 208 slot.put(_"There were no more alternative initiatives.") |
bsw/jbe@19 | 209 else |
bsw/jbe@19 | 210 slot.put(_"There are no more alternative initiatives currently.") |
bsw/jbe@19 | 211 end |
bsw/jbe@19 | 212 end |
bsw/jbe@19 | 213 } |
bsw/jbe@19 | 214 end |
bsw/jbe@19 | 215 |
bsw@51 | 216 if app.session.member_id and not (issue.fully_frozen or issue.closed) then |
bsw/jbe@19 | 217 slot.put(" ") |
bsw/jbe@19 | 218 ui.link{ |
bsw/jbe@19 | 219 content = function() |
bsw/jbe@19 | 220 ui.image{ static = "icons/16/script_add.png" } |
bsw/jbe@19 | 221 slot.put(" ") |
bsw/jbe@19 | 222 slot.put(_"Create alternative initiative") |
bsw/jbe@19 | 223 end, |
bsw/jbe@19 | 224 module = "initiative", |
bsw/jbe@19 | 225 view = "new", |
bsw/jbe@19 | 226 params = { issue_id = issue.id } |
bsw/jbe@19 | 227 } |
bsw/jbe@19 | 228 end |
bsw/jbe@19 | 229 end |