liquid_feedback_frontend
annotate app/main/suggestion/_list.lua @ 159:5d797c6706d5
implement quorum display
show the initiative quorum as a small 1px line in bargraph
allow to update your support on the diff page
better linked title in diff page
show absolute quorum numbers in detail pages of issue and initiative
show the initiative quorum as a small 1px line in bargraph
allow to update your support on the diff page
better linked title in diff page
show absolute quorum numbers in detail pages of issue and initiative
author | Daniel Poelzleithner <poelzi@poelzi.org> |
---|---|
date | Sat Oct 09 03:42:48 2010 +0200 (2010-10-09) |
parents | 44ba79952610 |
children | f460555c9896 |
rev | line source |
---|---|
bsw/jbe@4 | 1 |
bsw/jbe@4 | 2 local initiative = param.get("initiative", "table") |
bsw/jbe@0 | 3 local suggestions_selector = param.get("suggestions_selector", "table") |
bsw/jbe@19 | 4 local tab_id = param.get("tab_id") |
bsw/jbe@19 | 5 local show_name = param.get("show_name", atom.boolean) |
bsw/jbe@19 | 6 if show_name == nil then |
bsw/jbe@19 | 7 show_name = true |
bsw/jbe@19 | 8 end |
bsw/jbe@19 | 9 local show_filter = param.get("show_filter", atom.boolean) |
bsw/jbe@19 | 10 if show_filter == nil then |
bsw/jbe@19 | 11 show_filter = true |
bsw/jbe@19 | 12 end |
bsw/jbe@0 | 13 |
bsw/jbe@19 | 14 local partial = { |
bsw/jbe@19 | 15 routing = { |
bsw/jbe@19 | 16 default = { |
bsw/jbe@19 | 17 mode = "redirect", |
bsw/jbe@19 | 18 module = "initiative", |
bsw/jbe@19 | 19 view = "show_tab", |
bsw/jbe@19 | 20 params = { |
bsw/jbe@19 | 21 initiative_id = initiative.id, |
bsw/jbe@19 | 22 tab = "suggestions", |
bsw/jbe@19 | 23 tab_id = tab_id |
bsw/jbe@19 | 24 }, |
bsw/jbe@19 | 25 } |
bsw/jbe@19 | 26 } |
bsw/jbe@19 | 27 } |
bsw/jbe@19 | 28 |
bsw/jbe@19 | 29 local ui_filters = ui.filters |
bsw/jbe@19 | 30 if not show_filter then |
bsw/jbe@19 | 31 ui_filters = function(args) args.content() end |
bsw/jbe@19 | 32 end |
bsw/jbe@19 | 33 |
bsw/jbe@19 | 34 ui_filters{ |
bsw/jbe@19 | 35 label = _"Show filter", |
bsw/jbe@0 | 36 selector = suggestions_selector, |
bsw/jbe@19 | 37 { |
bsw/jbe@19 | 38 label = _"Order by", |
bsw/jbe@4 | 39 { |
bsw/jbe@19 | 40 name = "plus_unfulfilled", |
bsw/jbe@19 | 41 label = _"requested", |
bsw/jbe@19 | 42 selector_modifier = function(selector) selector:add_order_by("plus2_unfulfilled_count + plus1_unfulfilled_count DESC, id") end |
bsw/jbe@4 | 43 }, |
bsw/jbe@4 | 44 { |
bsw/jbe@4 | 45 name = "plus2", |
bsw/jbe@4 | 46 label = _"must", |
bsw/jbe@19 | 47 selector_modifier = function(selector) selector:add_order_by("plus2_unfulfilled_count + plus2_fulfilled_count DESC, id") end |
bsw/jbe@4 | 48 }, |
bsw/jbe@4 | 49 { |
bsw/jbe@4 | 50 name = "plus", |
bsw/jbe@4 | 51 label = _"must/should", |
bsw/jbe@19 | 52 selector_modifier = function(selector) selector:add_order_by("plus2_unfulfilled_count + plus1_unfulfilled_count + plus2_fulfilled_count + plus1_fulfilled_count DESC, id") end |
bsw/jbe@4 | 53 }, |
bsw/jbe@4 | 54 { |
bsw/jbe@4 | 55 name = "minus", |
bsw/jbe@4 | 56 label = _"must/should not", |
bsw/jbe@19 | 57 selector_modifier = function(selector) selector:add_order_by("minus2_unfulfilled_count + minus1_unfulfilled_count + minus2_fulfilled_count + minus1_fulfilled_count DESC, id") end |
bsw/jbe@4 | 58 }, |
bsw/jbe@4 | 59 { |
bsw/jbe@4 | 60 name = "minus2", |
bsw/jbe@4 | 61 label = _"must not", |
bsw/jbe@19 | 62 selector_modifier = function(selector) selector:add_order_by("minus2_unfulfilled_count + minus2_fulfilled_count DESC, id") end |
bsw/jbe@19 | 63 } |
bsw/jbe@4 | 64 }, |
bsw/jbe@0 | 65 content = function() |
bsw/jbe@4 | 66 ui.paginate{ |
bsw/jbe@4 | 67 selector = suggestions_selector, |
bsw/jbe@4 | 68 content = function() |
bsw/jbe@4 | 69 ui.list{ |
bsw/jbe@4 | 70 attr = { style = "table-layout: fixed;" }, |
bsw/jbe@4 | 71 records = suggestions_selector:exec(), |
bsw/jbe@4 | 72 columns = { |
bsw/jbe@4 | 73 { |
bsw/jbe@19 | 74 label = show_name and _"Suggestion" or nil, |
bsw/jbe@4 | 75 content = function(record) |
bsw/jbe@19 | 76 if show_name then |
bsw/jbe@19 | 77 ui.link{ |
bsw/jbe@19 | 78 text = record.name, |
bsw/jbe@19 | 79 module = "suggestion", |
bsw/jbe@19 | 80 view = "show", |
bsw/jbe@19 | 81 id = record.id |
bsw/jbe@19 | 82 } |
bsw/jbe@19 | 83 end |
bsw/jbe@4 | 84 end |
bsw/jbe@4 | 85 }, |
bsw/jbe@4 | 86 { |
bsw@95 | 87 label = _"Collective opinion of supporters", |
bsw/jbe@4 | 88 label_attr = { style = "width: 101px;" }, |
bsw/jbe@4 | 89 content = function(record) |
bsw/jbe@4 | 90 if record.minus2_unfulfilled_count then |
bsw@95 | 91 local max_value = record.initiative.supporter_count |
bsw/jbe@4 | 92 ui.bargraph{ |
bsw/jbe@4 | 93 max_value = max_value, |
bsw@95 | 94 width = 100, |
bsw/jbe@4 | 95 bars = { |
bsw@95 | 96 { color = "#0a0", value = record.plus2_unfulfilled_count + record.plus2_fulfilled_count }, |
bsw@95 | 97 { color = "#8f8", value = record.plus1_unfulfilled_count + record.plus1_fulfilled_count }, |
bsw@95 | 98 { color = "#eee", value = max_value - record.minus2_unfulfilled_count - record.minus1_unfulfilled_count - record.minus2_fulfilled_count - record.minus1_fulfilled_count - record.plus1_unfulfilled_count - record.plus2_unfulfilled_count - record.plus1_fulfilled_count - record.plus2_fulfilled_count}, |
bsw/jbe@4 | 99 { color = "#f88", value = record.minus1_unfulfilled_count + record.minus1_fulfilled_count }, |
bsw/jbe@4 | 100 { color = "#a00", value = record.minus2_unfulfilled_count + record.minus2_fulfilled_count }, |
bsw/jbe@4 | 101 } |
bsw/jbe@4 | 102 } |
bsw/jbe@4 | 103 end |
bsw/jbe@4 | 104 end |
bsw/jbe@4 | 105 }, |
bsw/jbe@4 | 106 { |
bsw/jbe@4 | 107 label = _"My opinion", |
bsw@95 | 108 label_attr = { style = "width: 130px; font-style: italic;" }, |
bsw/jbe@4 | 109 content = function(record) |
bsw/jbe@4 | 110 local degree |
bsw@51 | 111 local opinion |
bsw@51 | 112 if app.session.member_id then |
bsw@51 | 113 opinion = Opinion:by_pk(app.session.member.id, record.id) |
bsw@51 | 114 end |
bsw/jbe@4 | 115 if opinion then |
bsw/jbe@4 | 116 degree = opinion.degree |
bsw@3 | 117 end |
bsw/jbe@5 | 118 ui.container{ |
bsw/jbe@5 | 119 attr = { class = "suggestion_my_opinion" }, |
bsw/jbe@5 | 120 content = function() |
bsw@51 | 121 if app.session.member_id then |
bsw@51 | 122 if initiative.issue.state == "voting" or initiative.issue.state == "closed" then |
bsw@95 | 123 if degree == -2 then |
bsw@95 | 124 ui.tag{ |
bsw@95 | 125 tag = "span", |
bsw@95 | 126 attr = { |
bsw@95 | 127 class = "action" .. (degree == -2 and " active_red2" or "") |
bsw@95 | 128 }, |
bsw@95 | 129 content = _"must not" |
bsw@95 | 130 } |
bsw@95 | 131 end |
bsw@95 | 132 if degree == -1 then |
bsw@95 | 133 ui.tag{ |
bsw@95 | 134 tag = "span", |
bsw@95 | 135 attr = { class = "action" .. (degree == -1 and " active_red1" or "") }, |
bsw@95 | 136 content = _"should not" |
bsw@95 | 137 } |
bsw@95 | 138 end |
bsw@95 | 139 if degree == nil then |
bsw@95 | 140 ui.tag{ |
bsw@95 | 141 tag = "span", |
bsw@95 | 142 attr = { class = "action" .. (degree == nil and " active" or "") }, |
bsw@95 | 143 content = _"neutral" |
bsw@95 | 144 } |
bsw@95 | 145 end |
bsw@95 | 146 if degree == 1 then |
bsw@95 | 147 ui.tag{ |
bsw@95 | 148 tag = "span", |
bsw@95 | 149 attr = { class = "action" .. (degree == 1 and " active_green1" or "") }, |
bsw@95 | 150 content = _"should" |
bsw@95 | 151 } |
bsw@95 | 152 end |
bsw@95 | 153 if degree == 2 then |
bsw@95 | 154 ui.tag{ |
bsw@95 | 155 tag = "span", |
bsw@95 | 156 attr = { class = "action" .. (degree == 2 and " active_green2" or "") }, |
bsw@95 | 157 content = _"must" |
bsw@95 | 158 } |
bsw@95 | 159 end |
bsw@51 | 160 else |
poelzi@142 | 161 -- we need to put initiative_id into the parameters to have a redirect target in case the suggestion is gone after the action |
poelzi@142 | 162 params = param.get_all_cgi() |
poelzi@142 | 163 params['initiative_id'] = initiative.id |
poelzi@142 | 164 |
bsw@51 | 165 ui.link{ |
bsw@95 | 166 attr = { class = "action" .. (degree == 2 and " active_green2" or "") }, |
bsw@95 | 167 text = _"must", |
bsw@51 | 168 module = "opinion", |
bsw@51 | 169 action = "update", |
poelzi@142 | 170 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } }, |
bsw@51 | 171 params = { |
bsw@51 | 172 suggestion_id = record.id, |
bsw@95 | 173 degree = 2 |
bsw@51 | 174 }, |
bsw@51 | 175 partial = partial |
bsw@51 | 176 } |
bsw@51 | 177 slot.put(" ") |
bsw@51 | 178 ui.link{ |
bsw@51 | 179 attr = { class = "action" .. (degree == 1 and " active_green1" or "") }, |
bsw@51 | 180 text = _"should", |
bsw@51 | 181 module = "opinion", |
bsw@51 | 182 action = "update", |
poelzi@142 | 183 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params} }, |
bsw@51 | 184 params = { |
bsw@51 | 185 suggestion_id = record.id, |
bsw@51 | 186 degree = 1 |
bsw@51 | 187 }, |
bsw@51 | 188 partial = partial |
bsw@51 | 189 } |
bsw@51 | 190 slot.put(" ") |
bsw@51 | 191 ui.link{ |
bsw@95 | 192 attr = { class = "action" .. (degree == nil and " active" or "") }, |
bsw@95 | 193 text = _"neutral", |
bsw@51 | 194 module = "opinion", |
bsw@51 | 195 action = "update", |
poelzi@142 | 196 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } }, |
bsw@51 | 197 params = { |
bsw@51 | 198 suggestion_id = record.id, |
bsw@95 | 199 delete = true |
bsw@95 | 200 }, |
bsw@95 | 201 partial = partial |
bsw@95 | 202 } |
bsw@95 | 203 slot.put(" ") |
bsw@95 | 204 ui.link{ |
bsw@95 | 205 attr = { class = "action" .. (degree == -1 and " active_red1" or "") }, |
bsw@95 | 206 text = _"should not", |
bsw@95 | 207 module = "opinion", |
bsw@95 | 208 action = "update", |
poelzi@142 | 209 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } }, |
bsw@95 | 210 params = { |
bsw@95 | 211 suggestion_id = record.id, |
bsw@95 | 212 degree = -1 |
bsw@95 | 213 }, |
bsw@95 | 214 partial = partial |
bsw@95 | 215 } |
bsw@95 | 216 slot.put(" ") |
bsw@95 | 217 ui.link{ |
bsw@95 | 218 attr = { class = "action" .. (degree == -2 and " active_red2" or "") }, |
bsw@95 | 219 text = _"must not", |
bsw@95 | 220 module = "opinion", |
bsw@95 | 221 action = "update", |
poelzi@142 | 222 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } }, |
bsw@95 | 223 params = { |
bsw@95 | 224 suggestion_id = record.id, |
bsw@95 | 225 degree = -2 |
bsw@51 | 226 }, |
bsw@51 | 227 partial = partial |
bsw@51 | 228 } |
bsw@51 | 229 end |
bsw/jbe@19 | 230 else |
bsw@51 | 231 ui.field.text{ value = _"[Registered members only]" } |
bsw/jbe@19 | 232 end |
bsw/jbe@5 | 233 end |
bsw/jbe@0 | 234 } |
bsw/jbe@0 | 235 end |
bsw/jbe@4 | 236 }, |
bsw/jbe@4 | 237 { |
bsw/jbe@4 | 238 label = _"Suggestion currently not implemented", |
bsw/jbe@4 | 239 label_attr = { style = "width: 101px;" }, |
bsw/jbe@4 | 240 content = function(record) |
bsw/jbe@4 | 241 if record.minus2_unfulfilled_count then |
bsw@95 | 242 local max_value = record.initiative.supporter_count |
bsw/jbe@4 | 243 ui.bargraph{ |
bsw/jbe@4 | 244 max_value = max_value, |
bsw@95 | 245 width = 100, |
bsw/jbe@4 | 246 bars = { |
bsw/jbe@4 | 247 { color = "#0a0", value = record.plus2_unfulfilled_count }, |
bsw/jbe@4 | 248 { color = "#8f8", value = record.plus1_unfulfilled_count }, |
bsw@95 | 249 { color = "#eee", value = max_value - record.minus2_unfulfilled_count - record.minus1_unfulfilled_count - record.plus1_unfulfilled_count - record.plus2_unfulfilled_count }, |
bsw@95 | 250 { color = "#f88", value = record.minus1_unfulfilled_count }, |
bsw@95 | 251 { color = "#a00", value = record.minus2_unfulfilled_count }, |
bsw/jbe@4 | 252 } |
bsw/jbe@4 | 253 } |
bsw/jbe@4 | 254 end |
bsw/jbe@4 | 255 end |
bsw/jbe@4 | 256 }, |
bsw/jbe@4 | 257 { |
bsw/jbe@4 | 258 label = _"Suggestion currently implemented", |
bsw/jbe@4 | 259 label_attr = { style = "width: 101px;" }, |
bsw/jbe@4 | 260 content = function(record) |
bsw/jbe@4 | 261 if record.minus2_fulfilled_count then |
bsw@95 | 262 local max_value = record.initiative.supporter_count |
bsw/jbe@4 | 263 ui.bargraph{ |
bsw/jbe@4 | 264 max_value = max_value, |
bsw@95 | 265 width = 100, |
bsw/jbe@4 | 266 bars = { |
bsw@95 | 267 { color = "#0a0", value = record.plus2_fulfilled_count }, |
bsw@95 | 268 { color = "#8f8", value = record.plus1_fulfilled_count }, |
bsw@95 | 269 { color = "#eee", value = max_value - record.minus2_fulfilled_count - record.minus1_fulfilled_count - record.plus1_fulfilled_count - record.plus2_fulfilled_count}, |
bsw/jbe@4 | 270 { color = "#f88", value = record.minus1_fulfilled_count }, |
bsw/jbe@4 | 271 { color = "#a00", value = record.minus2_fulfilled_count }, |
bsw/jbe@4 | 272 } |
bsw/jbe@4 | 273 } |
bsw/jbe@4 | 274 end |
bsw@3 | 275 end |
bsw/jbe@4 | 276 }, |
bsw/jbe@4 | 277 { |
bsw@95 | 278 label = app.session.member_id and _"I consider suggestion as" or nil, |
bsw@95 | 279 label_attr = { style = "width: 100px; font-style: italic;" }, |
bsw/jbe@4 | 280 content = function(record) |
bsw/jbe@4 | 281 local degree |
bsw@51 | 282 local opinion |
bsw@51 | 283 if app.session.member_id then |
bsw@51 | 284 opinion = Opinion:by_pk(app.session.member.id, record.id) |
bsw@51 | 285 end |
bsw/jbe@4 | 286 if opinion then |
bsw/jbe@4 | 287 degree = opinion.degree |
bsw/jbe@4 | 288 end |
bsw/jbe@4 | 289 if opinion then |
bsw@95 | 290 |
bsw@95 | 291 ui.link{ |
bsw@95 | 292 attr = { class = opinion.fulfilled and "action active" or "action" }, |
bsw@95 | 293 text = _"implemented", |
bsw@95 | 294 module = "opinion", |
bsw@95 | 295 action = "update", |
bsw@95 | 296 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } }, |
bsw@95 | 297 params = { |
bsw@95 | 298 suggestion_id = record.id, |
bsw@95 | 299 fulfilled = true |
bsw@95 | 300 }, |
bsw@95 | 301 partial = partial |
bsw@95 | 302 } |
bsw@95 | 303 slot.put("<br />") |
bsw@95 | 304 ui.link{ |
bsw@95 | 305 attr = { class = not opinion.fulfilled and "action active" or "action" }, |
bsw@95 | 306 text = _"not implemented", |
bsw@95 | 307 module = "opinion", |
bsw@95 | 308 action = "update", |
bsw@95 | 309 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } }, |
bsw@95 | 310 params = { |
bsw@95 | 311 suggestion_id = record.id, |
bsw@95 | 312 fulfilled = false |
bsw@95 | 313 }, |
bsw@95 | 314 partial = partial |
bsw@95 | 315 } |
bsw@95 | 316 |
bsw/jbe@4 | 317 end |
bsw/jbe@4 | 318 end |
bsw/jbe@4 | 319 }, |
bsw/jbe@4 | 320 { |
bsw@95 | 321 label = app.session.member_id and _"So I'm" or nil, |
bsw/jbe@4 | 322 content = function(record) |
bsw@51 | 323 local opinion |
bsw@51 | 324 if app.session.member_id then |
bsw@51 | 325 opinion = Opinion:by_pk(app.session.member.id, record.id) |
bsw@51 | 326 end |
bsw/jbe@4 | 327 if opinion then |
bsw/jbe@4 | 328 if (opinion.fulfilled and opinion.degree > 0) or (not opinion.fulfilled and opinion.degree < 0) then |
bsw@95 | 329 local title = _"satisfied" |
bsw@95 | 330 ui.image{ attr = { alt = title, title = title }, static = "icons/emoticon_happy.png" } |
bsw@95 | 331 elseif opinion.degree == 1 or opinion.degree == -1 then |
bsw@95 | 332 local title = _"a bit unsatisfied" |
bsw@95 | 333 ui.image{ attr = { alt = title, title = title }, static = "icons/emoticon_unhappy.png" } |
bsw/jbe@4 | 334 else |
bsw@95 | 335 local title = _"more unsatisfied" |
bsw@95 | 336 ui.image{ attr = { alt = title, title = title }, static = "icons/emoticon_unhappy_red.png" } |
bsw/jbe@4 | 337 end |
bsw/jbe@4 | 338 end |
bsw/jbe@4 | 339 end |
bsw/jbe@4 | 340 }, |
bsw/jbe@4 | 341 } |
bsw/jbe@4 | 342 } |
bsw/jbe@4 | 343 end |
bsw/jbe@0 | 344 } |
bsw/jbe@0 | 345 end |
bsw/jbe@0 | 346 } |