liquid_feedback_frontend

annotate app/main/suggestion/_list.lua @ 5:afd9f769c7ae

Version beta1

Final voting with Schulze-Method is now possible

Many bug fixes and code cleanup

Registration with invite codes

More sort and filter options

Seperated display of "supporters" and "potential supporters"

Optical changes

Flood limit / initiative contigent is now checked by frontend

Neccessary changes to access core beta11
author bsw/jbe
date Fri Dec 25 12:00:00 2009 +0100 (2009-12-25)
parents 80c215dbf076
children 00d1004545f1
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@0 4
bsw/jbe@4 5 ui.order{
bsw/jbe@4 6 name = name,
bsw/jbe@0 7 selector = suggestions_selector,
bsw/jbe@4 8 options = {
bsw/jbe@4 9 {
bsw/jbe@4 10 name = "all",
bsw/jbe@4 11 label = _"all",
bsw/jbe@4 12 order_by = "minus2_unfulfilled_count + minus1_unfulfilled_count + minus2_fulfilled_count + minus1_fulfilled_count + plus2_unfulfilled_count + plus1_unfulfilled_count + plus2_fulfilled_count + plus1_fulfilled_count DESC, id"
bsw/jbe@4 13 },
bsw/jbe@4 14 {
bsw/jbe@4 15 name = "plus2",
bsw/jbe@4 16 label = _"must",
bsw/jbe@4 17 order_by = "plus2_unfulfilled_count + plus2_fulfilled_count DESC, id"
bsw/jbe@4 18 },
bsw/jbe@4 19 {
bsw/jbe@4 20 name = "plus",
bsw/jbe@4 21 label = _"must/should",
bsw/jbe@4 22 order_by = "plus2_unfulfilled_count + plus1_unfulfilled_count + plus2_fulfilled_count + plus1_fulfilled_count DESC, id"
bsw/jbe@4 23 },
bsw/jbe@4 24 {
bsw/jbe@4 25 name = "minus",
bsw/jbe@4 26 label = _"must/should not",
bsw/jbe@4 27 order_by = "minus2_unfulfilled_count + minus1_unfulfilled_count + minus2_fulfilled_count + minus1_fulfilled_count DESC, id"
bsw/jbe@4 28 },
bsw/jbe@4 29 {
bsw/jbe@4 30 name = "minus2",
bsw/jbe@4 31 label = _"must not",
bsw/jbe@4 32 order_by = "minus2_unfulfilled_count + minus2_fulfilled_count DESC, id"
bsw/jbe@4 33 },
bsw/jbe@4 34 {
bsw/jbe@4 35 name = "unfulfilled",
bsw/jbe@4 36 label = _"not implemented",
bsw/jbe@4 37 order_by = "minus2_unfulfilled_count + minus1_unfulfilled_count + plus2_unfulfilled_count + plus1_unfulfilled_count DESC, id"
bsw/jbe@4 38 },
bsw/jbe@4 39 {
bsw/jbe@4 40 name = "plus2_unfulfilled",
bsw/jbe@4 41 label = _"must",
bsw/jbe@4 42 order_by = "plus2_unfulfilled_count DESC, id"
bsw/jbe@4 43 },
bsw/jbe@4 44 {
bsw/jbe@4 45 name = "plus_unfulfilled",
bsw/jbe@4 46 label = _"must/should",
bsw/jbe@4 47 order_by = "plus2_unfulfilled_count + plus1_unfulfilled_count DESC, id"
bsw/jbe@4 48 },
bsw/jbe@4 49 {
bsw/jbe@4 50 name = "minus_unfulfilled",
bsw/jbe@4 51 label = _"must/should not",
bsw/jbe@4 52 order_by = "minus2_unfulfilled_count + minus1_unfulfilled_count DESC, id"
bsw/jbe@4 53 },
bsw/jbe@4 54 {
bsw/jbe@4 55 name = "minus2_unfulfilled",
bsw/jbe@4 56 label = _"must not",
bsw/jbe@4 57 order_by = "minus2_unfulfilled_count DESC, id"
bsw/jbe@4 58 },
bsw/jbe@4 59 },
bsw/jbe@0 60 content = function()
bsw/jbe@4 61 ui.paginate{
bsw/jbe@4 62 selector = suggestions_selector,
bsw/jbe@4 63 content = function()
bsw/jbe@4 64 ui.list{
bsw/jbe@4 65 attr = { style = "table-layout: fixed;" },
bsw/jbe@4 66 records = suggestions_selector:exec(),
bsw/jbe@4 67 columns = {
bsw/jbe@4 68 {
bsw/jbe@4 69 label = _"Suggestion",
bsw/jbe@4 70 content = function(record)
bsw/jbe@4 71 ui.link{
bsw/jbe@4 72 text = record.name,
bsw/jbe@4 73 module = "suggestion",
bsw/jbe@4 74 view = "show",
bsw/jbe@4 75 id = record.id
bsw/jbe@0 76 }
bsw/jbe@4 77 end
bsw/jbe@4 78 },
bsw/jbe@4 79 {
bsw/jbe@4 80 label = _"Collective opinion",
bsw/jbe@4 81 label_attr = { style = "width: 101px;" },
bsw/jbe@4 82 content = function(record)
bsw/jbe@4 83 if record.minus2_unfulfilled_count then
bsw/jbe@4 84 local max_value = record.initiative.issue.population
bsw/jbe@4 85 ui.bargraph{
bsw/jbe@4 86 max_value = max_value,
bsw/jbe@4 87 width = 50,
bsw/jbe@4 88 bars = {
bsw/jbe@4 89 { color = "#ddd", value = max_value - record.minus2_unfulfilled_count - record.minus1_unfulfilled_count - record.minus2_fulfilled_count - record.minus1_fulfilled_count },
bsw/jbe@4 90 { color = "#f88", value = record.minus1_unfulfilled_count + record.minus1_fulfilled_count },
bsw/jbe@4 91 { color = "#a00", value = record.minus2_unfulfilled_count + record.minus2_fulfilled_count },
bsw/jbe@4 92 { color = "#0a0", value = record.plus2_unfulfilled_count + record.plus2_fulfilled_count },
bsw/jbe@4 93 { color = "#8f8", value = record.plus1_unfulfilled_count + record.plus1_fulfilled_count },
bsw/jbe@4 94 { color = "#ddd", value = max_value - record.plus1_unfulfilled_count - record.plus2_unfulfilled_count - record.plus1_fulfilled_count - record.plus2_fulfilled_count },
bsw/jbe@4 95 }
bsw/jbe@4 96 }
bsw/jbe@4 97 end
bsw/jbe@4 98 end
bsw/jbe@4 99 },
bsw/jbe@4 100 {
bsw/jbe@4 101 label = _"My opinion",
bsw/jbe@4 102 content = function(record)
bsw/jbe@4 103 local degree
bsw/jbe@4 104 local opinion = Opinion:by_pk(app.session.member.id, record.id)
bsw/jbe@4 105 if opinion then
bsw/jbe@4 106 degree = opinion.degree
bsw@3 107 end
bsw/jbe@5 108 ui.container{
bsw/jbe@5 109 attr = { class = "suggestion_my_opinion" },
bsw/jbe@5 110 content = function()
bsw/jbe@5 111 ui.link{
bsw/jbe@5 112 attr = { class = "action" .. (degree == -2 and " active_red2" or "") },
bsw/jbe@5 113 text = _"must not",
bsw/jbe@5 114 module = "opinion",
bsw/jbe@5 115 action = "update",
bsw/jbe@5 116 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } },
bsw/jbe@5 117 params = {
bsw/jbe@5 118 suggestion_id = record.id,
bsw/jbe@5 119 degree = -2
bsw/jbe@5 120 }
bsw/jbe@5 121 }
bsw/jbe@5 122 slot.put(" ")
bsw/jbe@5 123 ui.link{
bsw/jbe@5 124 attr = { class = "action" .. (degree == -1 and " active_red1" or "") },
bsw/jbe@5 125 text = _"should not",
bsw/jbe@5 126 module = "opinion",
bsw/jbe@5 127 action = "update",
bsw/jbe@5 128 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } },
bsw/jbe@5 129 params = {
bsw/jbe@5 130 suggestion_id = record.id,
bsw/jbe@5 131 degree = -1
bsw/jbe@5 132 }
bsw/jbe@5 133 }
bsw/jbe@5 134 slot.put(" ")
bsw/jbe@5 135 ui.link{
bsw/jbe@5 136 attr = { class = "action" .. (degree == nil and " active" or "") },
bsw/jbe@5 137 text = _"neutral",
bsw/jbe@5 138 module = "opinion",
bsw/jbe@5 139 action = "update",
bsw/jbe@5 140 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } },
bsw/jbe@5 141 params = {
bsw/jbe@5 142 suggestion_id = record.id,
bsw/jbe@5 143 delete = true
bsw/jbe@5 144 }
bsw/jbe@5 145 }
bsw/jbe@5 146 slot.put(" ")
bsw/jbe@5 147 ui.link{
bsw/jbe@5 148 attr = { class = "action" .. (degree == 1 and " active_green1" or "") },
bsw/jbe@5 149 text = _"should",
bsw/jbe@5 150 module = "opinion",
bsw/jbe@5 151 action = "update",
bsw/jbe@5 152 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } },
bsw/jbe@5 153 params = {
bsw/jbe@5 154 suggestion_id = record.id,
bsw/jbe@5 155 degree = 1
bsw/jbe@5 156 }
bsw/jbe@5 157 }
bsw/jbe@5 158 slot.put(" ")
bsw/jbe@5 159 ui.link{
bsw/jbe@5 160 attr = { class = "action" .. (degree == 2 and " active_green2" or "") },
bsw/jbe@5 161 text = _"must",
bsw/jbe@5 162 module = "opinion",
bsw/jbe@5 163 action = "update",
bsw/jbe@5 164 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } },
bsw/jbe@5 165 params = {
bsw/jbe@5 166 suggestion_id = record.id,
bsw/jbe@5 167 degree = 2
bsw/jbe@5 168 }
bsw/jbe@5 169 }
bsw/jbe@5 170 end
bsw/jbe@0 171 }
bsw/jbe@0 172 end
bsw/jbe@4 173 },
bsw/jbe@4 174 {
bsw/jbe@4 175 content = function(record)
bsw/jbe@4 176 local opinion = Opinion:by_pk(app.session.member.id, record.id)
bsw/jbe@4 177 if opinion and not opinion.fulfilled then
bsw/jbe@4 178 ui.image{ static = "icons/16/cross.png" }
bsw/jbe@4 179 end
bsw/jbe@4 180 end
bsw/jbe@4 181 },
bsw/jbe@4 182 {
bsw/jbe@4 183 label = _"Suggestion currently not implemented",
bsw/jbe@4 184 label_attr = { style = "width: 101px;" },
bsw/jbe@4 185 content = function(record)
bsw/jbe@4 186 if record.minus2_unfulfilled_count then
bsw/jbe@4 187 local max_value = record.initiative.issue.population
bsw/jbe@4 188 ui.bargraph{
bsw/jbe@4 189 max_value = max_value,
bsw/jbe@4 190 width = 50,
bsw/jbe@4 191 bars = {
bsw/jbe@4 192 { color = "#ddd", value = max_value - record.minus2_unfulfilled_count - record.minus1_unfulfilled_count },
bsw/jbe@4 193 { color = "#f88", value = record.minus1_unfulfilled_count },
bsw/jbe@4 194 { color = "#a00", value = record.minus2_unfulfilled_count },
bsw/jbe@4 195 { color = "#0a0", value = record.plus2_unfulfilled_count },
bsw/jbe@4 196 { color = "#8f8", value = record.plus1_unfulfilled_count },
bsw/jbe@4 197 { color = "#ddd", value = max_value - record.plus1_unfulfilled_count - record.plus2_unfulfilled_count },
bsw/jbe@4 198 }
bsw/jbe@4 199 }
bsw/jbe@4 200 end
bsw/jbe@4 201 end
bsw/jbe@4 202 },
bsw/jbe@4 203 {
bsw/jbe@4 204 content = function(record)
bsw/jbe@4 205 local opinion = Opinion:by_pk(app.session.member.id, record.id)
bsw/jbe@4 206 if opinion and opinion.fulfilled then
bsw/jbe@4 207 ui.image{ static = "icons/16/tick.png" }
bsw/jbe@4 208 end
bsw/jbe@4 209 end
bsw/jbe@4 210 },
bsw/jbe@4 211 {
bsw/jbe@4 212 label = _"Suggestion currently implemented",
bsw/jbe@4 213 label_attr = { style = "width: 101px;" },
bsw/jbe@4 214 content = function(record)
bsw/jbe@4 215 if record.minus2_fulfilled_count then
bsw/jbe@4 216 local max_value = record.initiative.issue.population
bsw/jbe@4 217 ui.bargraph{
bsw/jbe@4 218 max_value = max_value,
bsw/jbe@4 219 width = 50,
bsw/jbe@4 220 bars = {
bsw/jbe@4 221 { color = "#ddd", value = max_value - record.minus2_fulfilled_count - record.minus1_fulfilled_count },
bsw/jbe@4 222 { color = "#f88", value = record.minus1_fulfilled_count },
bsw/jbe@4 223 { color = "#a00", value = record.minus2_fulfilled_count },
bsw/jbe@4 224 { color = "#0a0", value = record.plus2_fulfilled_count },
bsw/jbe@4 225 { color = "#8f8", value = record.plus1_fulfilled_count },
bsw/jbe@4 226 { color = "#ddd", value = max_value - record.plus1_fulfilled_count - record.plus2_fulfilled_count },
bsw/jbe@4 227 }
bsw/jbe@4 228 }
bsw/jbe@4 229 end
bsw@3 230 end
bsw/jbe@4 231 },
bsw/jbe@4 232 {
bsw/jbe@4 233 label_attr = { style = "width: 200px;" },
bsw/jbe@4 234 content = function(record)
bsw/jbe@4 235 local degree
bsw/jbe@4 236 local opinion = Opinion:by_pk(app.session.member.id, record.id)
bsw/jbe@4 237 if opinion then
bsw/jbe@4 238 degree = opinion.degree
bsw/jbe@4 239 end
bsw/jbe@4 240 if opinion then
bsw/jbe@4 241 if not opinion.fulfilled then
bsw/jbe@4 242 local text = ""
bsw/jbe@4 243 if opinion.degree > 0 then
bsw/jbe@4 244 text = _"Mark suggestion as implemented and express satisfaction"
bsw/jbe@4 245 else
bsw/jbe@4 246 text = _"Mark suggestion as implemented and express dissatisfaction"
bsw/jbe@4 247 end
bsw/jbe@4 248 ui.link{
bsw/jbe@4 249 attr = { class = "action" },
bsw/jbe@4 250 text = text,
bsw/jbe@4 251 module = "opinion",
bsw/jbe@4 252 action = "update",
bsw/jbe@4 253 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } },
bsw/jbe@4 254 params = {
bsw/jbe@4 255 suggestion_id = record.id,
bsw/jbe@4 256 fulfilled = true
bsw/jbe@4 257 }
bsw/jbe@4 258 }
bsw/jbe@4 259 else
bsw/jbe@4 260 if opinion.degree > 0 then
bsw/jbe@4 261 text = _"Mark suggestion as not implemented and express dissatisfaction"
bsw/jbe@4 262 else
bsw/jbe@4 263 text = _"Mark suggestion as not implemented and express satisfaction"
bsw/jbe@4 264 end
bsw/jbe@4 265 ui.link{
bsw/jbe@4 266 attr = { class = "action" },
bsw/jbe@4 267 text = text,
bsw/jbe@4 268 module = "opinion",
bsw/jbe@4 269 action = "update",
bsw/jbe@4 270 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } },
bsw/jbe@4 271 params = {
bsw/jbe@4 272 suggestion_id = record.id,
bsw/jbe@4 273 fulfilled = false
bsw/jbe@4 274 }
bsw/jbe@4 275 }
bsw/jbe@4 276 end
bsw/jbe@4 277 end
bsw/jbe@4 278 end
bsw/jbe@4 279 },
bsw/jbe@4 280 {
bsw/jbe@4 281 content = function(record)
bsw/jbe@4 282 local opinion = Opinion:by_pk(app.session.member.id, record.id)
bsw/jbe@4 283 if opinion then
bsw/jbe@4 284 if (opinion.fulfilled and opinion.degree > 0) or (not opinion.fulfilled and opinion.degree < 0) then
bsw/jbe@4 285 ui.image{ static = "icons/16/thumb_up_green.png" }
bsw/jbe@4 286 else
bsw/jbe@4 287 ui.image{ static = "icons/16/thumb_down_red.png" }
bsw/jbe@4 288 end
bsw/jbe@4 289 end
bsw/jbe@4 290 end
bsw/jbe@4 291 },
bsw/jbe@4 292 }
bsw/jbe@4 293 }
bsw/jbe@4 294 end
bsw/jbe@0 295 }
bsw/jbe@0 296 end
bsw/jbe@0 297 }
bsw/jbe@4 298
bsw/jbe@4 299 if initiative then
bsw/jbe@4 300 ui.field.timestamp{ label = _"Last snapshot:", value = initiative.issue.snapshot }
bsw/jbe@4 301 end

Impressum / About Us