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
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 }

Impressum / About Us