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.
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("&nbsp;")
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

Impressum / About Us