liquid_feedback_frontend
annotate app/main/issue/_list.lua @ 118:93f4e465b50d
add initiator support in delegation
if a delegation is issued from the initiative view, the initiators
from that one are added to the delegation target list. this makes it easier to delegate to the author without the need to add him to the contact list.
if a delegation is issued from the initiative view, the initiators
from that one are added to the delegation target list. this makes it easier to delegate to the author without the need to add him to the contact list.
author | Daniel Poelzleithner <poelzi@poelzi.org> |
---|---|
date | Mon Sep 20 20:32:04 2010 +0200 (2010-09-20) |
parents | 733f65c0c0a0 |
children | 4fb486bce608 |
rev | line source |
---|---|
bsw/jbe@0 | 1 local issues_selector = param.get("issues_selector", "table") |
bsw/jbe@0 | 2 |
bsw@51 | 3 if app.session.member_id then |
bsw@51 | 4 issues_selector |
bsw@51 | 5 :left_join("interest", "_interest", { "_interest.issue_id = issue.id AND _interest.member_id = ?", app.session.member.id} ) |
bsw@51 | 6 :add_field("(_interest.member_id NOTNULL)", "is_interested") |
bsw@51 | 7 end |
bsw@11 | 8 |
bsw/jbe@19 | 9 ui.add_partial_param_names{ |
bsw/jbe@19 | 10 "filter", |
bsw/jbe@19 | 11 "filter_open", |
bsw/jbe@19 | 12 "filter_voting", |
bsw/jbe@19 | 13 "filter_interest", |
bsw/jbe@19 | 14 "issue_list" |
bsw/jbe@19 | 15 } |
bsw/jbe@0 | 16 |
bsw/jbe@19 | 17 local filters = {} |
bsw@10 | 18 |
bsw/jbe@19 | 19 filters[#filters+1] = { |
bsw/jbe@19 | 20 label = _"Filter", |
bsw/jbe@19 | 21 { |
bsw/jbe@19 | 22 name = "open", |
bsw/jbe@19 | 23 label = _"Open", |
bsw/jbe@19 | 24 selector_modifier = function(selector) |
bsw/jbe@19 | 25 selector:add_where("issue.closed ISNULL") |
bsw/jbe@19 | 26 end |
bsw/jbe@19 | 27 }, |
bsw/jbe@19 | 28 { |
bsw/jbe@19 | 29 name = "new", |
bsw/jbe@19 | 30 label = _"New", |
bsw/jbe@19 | 31 selector_modifier = function(selector) |
bsw/jbe@19 | 32 selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") |
bsw/jbe@19 | 33 end |
bsw/jbe@19 | 34 }, |
bsw/jbe@19 | 35 { |
bsw/jbe@19 | 36 name = "accepted", |
bsw/jbe@19 | 37 label = _"In discussion", |
bsw/jbe@19 | 38 selector_modifier = function(selector) |
bsw/jbe@19 | 39 selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") |
bsw/jbe@19 | 40 end |
bsw/jbe@19 | 41 }, |
bsw/jbe@19 | 42 { |
bsw/jbe@19 | 43 name = "half_frozen", |
bsw/jbe@19 | 44 label = _"Frozen", |
bsw/jbe@19 | 45 selector_modifier = function(selector) |
bsw/jbe@19 | 46 selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL") |
bsw/jbe@19 | 47 end |
bsw/jbe@19 | 48 }, |
bsw/jbe@19 | 49 { |
bsw/jbe@19 | 50 name = "frozen", |
bsw/jbe@19 | 51 label = _"Voting", |
bsw/jbe@19 | 52 selector_modifier = function(selector) |
bsw/jbe@19 | 53 selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") |
bsw/jbe@19 | 54 filter_voting = true |
bsw/jbe@19 | 55 end |
bsw/jbe@19 | 56 }, |
bsw/jbe@19 | 57 { |
bsw/jbe@19 | 58 name = "finished", |
bsw/jbe@19 | 59 label = _"Finished", |
bsw/jbe@19 | 60 selector_modifier = function(selector) |
bsw/jbe@19 | 61 selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL") |
bsw/jbe@19 | 62 end |
bsw/jbe@19 | 63 }, |
bsw/jbe@19 | 64 { |
bsw/jbe@19 | 65 name = "cancelled", |
bsw/jbe@19 | 66 label = _"Cancelled", |
bsw/jbe@19 | 67 selector_modifier = function(selector) |
bsw/jbe@52 | 68 selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL") |
bsw/jbe@19 | 69 end |
bsw/jbe@19 | 70 }, |
bsw/jbe@19 | 71 { |
bsw/jbe@19 | 72 name = "any", |
bsw/jbe@19 | 73 label = _"Any", |
bsw/jbe@19 | 74 selector_modifier = function(selector) end |
bsw/jbe@19 | 75 }, |
bsw/jbe@19 | 76 } |
bsw/jbe@19 | 77 |
bsw/jbe@19 | 78 |
bsw@75 | 79 if app.session.member and param.get("filter") == "frozen" then |
bsw/jbe@19 | 80 filters[#filters+1] = { |
bsw/jbe@19 | 81 label = _"Filter", |
bsw/jbe@19 | 82 name = "filter_voting", |
bsw@2 | 83 { |
bsw/jbe@19 | 84 name = "any", |
bsw/jbe@19 | 85 label = _"Any", |
bsw/jbe@19 | 86 selector_modifier = function() end |
bsw@2 | 87 }, |
bsw/jbe@0 | 88 { |
bsw/jbe@19 | 89 name = "not_voted", |
bsw/jbe@19 | 90 label = _"Not voted", |
bsw/jbe@19 | 91 selector_modifier = function(selector) |
bsw/jbe@19 | 92 selector:left_join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id }) |
bsw/jbe@19 | 93 selector:add_where("direct_voter.member_id ISNULL") |
bsw@2 | 94 end |
bsw@2 | 95 }, |
bsw@2 | 96 { |
bsw/jbe@19 | 97 name = "voted", |
bsw/jbe@19 | 98 label = _"Voted", |
bsw/jbe@19 | 99 selector_modifier = function(selector) |
bsw/jbe@19 | 100 selector:join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id }) |
bsw@2 | 101 end |
bsw@2 | 102 }, |
bsw/jbe@19 | 103 } |
bsw/jbe@19 | 104 end |
bsw/jbe@19 | 105 |
bsw/jbe@19 | 106 |
bsw/jbe@19 | 107 filters[#filters+1] = { |
bsw/jbe@19 | 108 label = _"Filter", |
bsw/jbe@19 | 109 name = "filter_interest", |
bsw/jbe@19 | 110 { |
bsw/jbe@19 | 111 name = "any", |
bsw/jbe@19 | 112 label = _"Any", |
bsw/jbe@19 | 113 selector_modifier = function() end |
bsw/jbe@19 | 114 }, |
bsw/jbe@19 | 115 { |
bsw/jbe@19 | 116 name = "my", |
bsw/jbe@19 | 117 label = _"Interested", |
bsw/jbe@19 | 118 selector_modifier = function(selector) |
bsw/jbe@19 | 119 selector:join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", app.session.member.id }) |
bsw/jbe@19 | 120 end |
bsw/jbe@19 | 121 }, |
bsw/jbe@19 | 122 { |
bsw/jbe@19 | 123 name = "supported", |
bsw/jbe@19 | 124 label = _"Supported", |
bsw/jbe@19 | 125 selector_modifier = function(selector) |
bsw/jbe@19 | 126 selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN opinion ON opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)) WHERE initiative.issue_id = issue.id AND opinion.member_id ISNULL LIMIT 1)", app.session.member.id, app.session.member.id }) |
bsw/jbe@19 | 127 end |
bsw/jbe@19 | 128 }, |
bsw/jbe@19 | 129 { |
bsw/jbe@19 | 130 name = "potentially_supported", |
bsw/jbe@19 | 131 label = _"Potential supported", |
bsw/jbe@19 | 132 selector_modifier = function(selector) |
bsw/jbe@19 | 133 selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? JOIN opinion ON opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)) WHERE initiative.issue_id = issue.id LIMIT 1)", app.session.member.id, app.session.member.id }) |
bsw/jbe@19 | 134 end |
bsw/jbe@19 | 135 }, |
bsw/jbe@19 | 136 { |
bsw/jbe@19 | 137 name = "initiated", |
bsw/jbe@19 | 138 label = _"Initiated", |
bsw/jbe@19 | 139 selector_modifier = function(selector) |
bsw/jbe@19 | 140 selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN initiator ON initiator.initiative_id = initiative.id AND initiator.member_id = ? WHERE initiative.issue_id = issue.id)", app.session.member.id }) |
bsw/jbe@19 | 141 end |
bsw/jbe@19 | 142 }, |
bsw/jbe@19 | 143 } |
bsw/jbe@19 | 144 |
bsw/jbe@19 | 145 if not param.get("no_sort", atom.boolean) then |
bsw/jbe@19 | 146 filters[#filters+1] = { |
bsw/jbe@19 | 147 label = _"Order by", |
bsw/jbe@19 | 148 name = "issue_list", |
bsw@2 | 149 { |
bsw/jbe@19 | 150 name = "max_potential_support", |
bsw/jbe@19 | 151 label = _"Max potential support", |
bsw/jbe@19 | 152 selector_modifier = function(selector) |
bsw/jbe@19 | 153 selector:add_order_by("(SELECT max(supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC") |
bsw@2 | 154 end |
bsw@2 | 155 }, |
bsw@2 | 156 { |
bsw/jbe@19 | 157 name = "max_support", |
bsw/jbe@19 | 158 label = _"Max support", |
bsw/jbe@19 | 159 selector_modifier = function(selector) |
bsw/jbe@19 | 160 selector:add_order_by("(SELECT max(satisfied_supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC") |
bsw/jbe@19 | 161 end |
bsw/jbe@19 | 162 }, |
bsw/jbe@19 | 163 { |
bsw/jbe@19 | 164 name = "population", |
bsw/jbe@19 | 165 label = _"Population", |
bsw/jbe@19 | 166 selector_modifier = function(selector) |
bsw/jbe@19 | 167 selector:add_order_by("issue.population DESC") |
bsw/jbe@19 | 168 end |
bsw/jbe@19 | 169 }, |
bsw/jbe@19 | 170 { |
bsw/jbe@19 | 171 name = "newest", |
bsw/jbe@19 | 172 label = _"Newest", |
bsw/jbe@19 | 173 selector_modifier = function(selector) |
bsw/jbe@19 | 174 selector:add_order_by("issue.created DESC") |
bsw@2 | 175 end |
bsw@2 | 176 }, |
bsw/jbe@19 | 177 { |
bsw/jbe@19 | 178 name = "oldest", |
bsw/jbe@19 | 179 label = _"Oldest", |
bsw/jbe@19 | 180 selector_modifier = function(selector) |
bsw/jbe@19 | 181 selector:add_order_by("issue.created") |
bsw/jbe@19 | 182 end |
bsw/jbe@19 | 183 } |
bsw/jbe@19 | 184 } |
bsw/jbe@19 | 185 end |
bsw/jbe@19 | 186 |
bsw/jbe@19 | 187 filters.content = function() |
bsw/jbe@19 | 188 local ui_paginate = ui.paginate |
bsw/jbe@19 | 189 if param.get("per_page") == "all" then |
bsw/jbe@19 | 190 ui_paginate = function(args) args.content() end |
bsw/jbe@19 | 191 end |
bsw/jbe@19 | 192 ui_paginate{ |
bsw/jbe@19 | 193 per_page = tonumber(param.get("per_page")), |
bsw/jbe@19 | 194 selector = issues_selector, |
bsw/jbe@19 | 195 content = function() |
bsw/jbe@19 | 196 local highlight_string = param.get("highlight_string", "string") |
bsw/jbe@19 | 197 local issues = issues or issues_selector:exec() |
bsw/jbe@19 | 198 -- issues:load(initiatives) |
bsw/jbe@19 | 199 ui.list{ |
bsw/jbe@19 | 200 attr = { class = "issues" }, |
bsw/jbe@19 | 201 records = issues, |
bsw/jbe@19 | 202 columns = { |
bsw/jbe@19 | 203 { |
bsw/jbe@19 | 204 label = _"Issue", |
bsw/jbe@19 | 205 content = function(record) |
bsw/jbe@19 | 206 if not param.get("for_area_list", atom.boolean) then |
bsw/jbe@19 | 207 ui.field.text{ |
bsw/jbe@19 | 208 value = record.area.name |
bsw/jbe@19 | 209 } |
bsw/jbe@19 | 210 slot.put("<br />") |
bsw@11 | 211 end |
bsw/jbe@19 | 212 if record.is_interested then |
bsw/jbe@19 | 213 local label = _"You are interested in this issue", |
bsw/jbe@19 | 214 ui.image{ |
bsw/jbe@19 | 215 attr = { alt = label, title = label }, |
bsw/jbe@19 | 216 static = "icons/16/eye.png" |
bsw/jbe@5 | 217 } |
bsw/jbe@19 | 218 slot.put(" ") |
bsw/jbe@19 | 219 end |
bsw/jbe@19 | 220 ui.link{ |
bsw/jbe@19 | 221 text = _("Issue ##{id}", { id = tostring(record.id) }), |
bsw/jbe@19 | 222 module = "issue", |
bsw/jbe@19 | 223 view = "show", |
bsw/jbe@19 | 224 id = record.id |
bsw/jbe@19 | 225 } |
bsw/jbe@19 | 226 if record.state == "new" then |
bsw/jbe@19 | 227 ui.image{ |
bsw/jbe@19 | 228 static = "icons/16/new.png" |
bsw/jbe@5 | 229 } |
bsw/jbe@5 | 230 end |
bsw/jbe@19 | 231 slot.put("<br />") |
bsw/jbe@19 | 232 slot.put("<br />") |
bsw/jbe@19 | 233 if record.old_state then |
bsw/jbe@19 | 234 ui.field.text{ value = format.time(record.sort) } |
bsw/jbe@19 | 235 ui.field.text{ value = Issue:get_state_name_for_state(record.old_state) .. " > " .. Issue:get_state_name_for_state(record.new_state) } |
bsw/jbe@19 | 236 else |
bsw/jbe@19 | 237 end |
bsw/jbe@19 | 238 end |
bsw/jbe@19 | 239 }, |
bsw/jbe@19 | 240 { |
bsw/jbe@19 | 241 label = _"State", |
bsw/jbe@19 | 242 content = function(record) |
bsw/jbe@19 | 243 if record.state == "voting" then |
bsw/jbe@19 | 244 ui.link{ |
bsw/jbe@19 | 245 content = _"Voting", |
bsw/jbe@19 | 246 module = "vote", |
bsw/jbe@19 | 247 view = "list", |
bsw/jbe@19 | 248 params = { issue_id = record.id } |
bsw/jbe@19 | 249 } |
bsw/jbe@19 | 250 else |
bsw/jbe@19 | 251 ui.field.issue_state{ value = record.state } |
bsw/jbe@19 | 252 end |
bsw/jbe@19 | 253 end |
bsw/jbe@19 | 254 }, |
bsw/jbe@19 | 255 { |
bsw/jbe@19 | 256 label = _"Initiatives", |
bsw/jbe@19 | 257 content = function(record) |
bsw/jbe@19 | 258 local initiatives_selector = record:get_reference_selector("initiatives") |
bsw/jbe@19 | 259 local highlight_string = param.get("highlight_string") |
bsw/jbe@19 | 260 if highlight_string then |
bsw/jbe@19 | 261 initiatives_selector:add_field( {'"highlight"("initiative"."name", ?)', highlight_string }, "name_highlighted") |
bsw/jbe@19 | 262 end |
bsw/jbe@19 | 263 execute.view{ |
bsw/jbe@19 | 264 module = "initiative", |
bsw/jbe@19 | 265 view = "_list", |
bsw/jbe@19 | 266 params = { |
bsw/jbe@19 | 267 issue = record, |
bsw/jbe@19 | 268 initiatives_selector = initiatives_selector, |
bsw/jbe@19 | 269 highlight_string = highlight_string, |
bsw@51 | 270 per_page = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3, |
bsw/jbe@19 | 271 no_sort = true, |
bsw@51 | 272 limit = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3 |
bsw/jbe@19 | 273 } |
bsw/jbe@19 | 274 } |
bsw/jbe@19 | 275 end |
bsw/jbe@19 | 276 }, |
bsw/jbe@0 | 277 } |
bsw/jbe@19 | 278 } |
bsw/jbe@19 | 279 end |
bsw/jbe@19 | 280 } |
bsw/jbe@19 | 281 end |
bsw/jbe@19 | 282 |
bsw/jbe@19 | 283 filters.selector = issues_selector |
bsw/jbe@19 | 284 filters.label = _"Change filters and order" |
bsw/jbe@19 | 285 |
bsw/jbe@19 | 286 if param.get("no_filter", atom.boolean) then |
bsw/jbe@19 | 287 filters.content() |
bsw/jbe@19 | 288 else |
bsw/jbe@19 | 289 ui.filters(filters) |
bsw/jbe@19 | 290 end |
bsw/jbe@19 | 291 |
bsw/jbe@19 | 292 if param.get("legend", atom.boolean) ~= false then |
bsw/jbe@19 | 293 local filter = param.get_all_cgi().filter |
bsw/jbe@19 | 294 if not filter or filter == "any" or filter ~= "finished" then |
bsw/jbe@19 | 295 ui.bargraph_legend{ |
bsw/jbe@19 | 296 width = 25, |
bsw/jbe@19 | 297 bars = { |
bsw/jbe@19 | 298 { color = "#0a0", label = _"Supporter" }, |
bsw/jbe@19 | 299 { color = "#777", label = _"Potential supporter" }, |
bsw/jbe@19 | 300 { color = "#ddd", label = _"No support at all" }, |
bsw/jbe@19 | 301 } |
bsw/jbe@0 | 302 } |
bsw/jbe@0 | 303 end |
bsw/jbe@19 | 304 if not filter or filter == "any" or filter == "finished" then |
bsw/jbe@19 | 305 ui.bargraph_legend{ |
bsw/jbe@19 | 306 width = 25, |
bsw/jbe@19 | 307 bars = { |
bsw/jbe@19 | 308 { color = "#0a0", label = _"Yes" }, |
bsw/jbe@19 | 309 { color = "#aaa", label = _"Abstention" }, |
bsw/jbe@19 | 310 { color = "#a00", label = _"No" }, |
bsw/jbe@19 | 311 } |
bsw/jbe@19 | 312 } |
bsw/jbe@19 | 313 end |
bsw/jbe@19 | 314 end |
bsw/jbe@19 | 315 |