liquid_feedback_frontend
annotate app/main/suggestion/_list.lua @ 9:0ee1e0c42d4c
Version beta5
Minor security fix: Added missing security filter for admin section. Reading of member listing including login names was possible for all users. Write access has not been possible though.
Changing of name and login is possible while a history of these changes is written and accessible by all users.
Statistics shown in area list
Trimming of user input also converts multiple whitespaces to single space character.
Minor security fix: Added missing security filter for admin section. Reading of member listing including login names was possible for all users. Write access has not been possible though.
Changing of name and login is possible while a history of these changes is written and accessible by all users.
Statistics shown in area list
Trimming of user input also converts multiple whitespaces to single space character.
author | bsw |
---|---|
date | Mon Jan 04 12:00:00 2010 +0100 (2010-01-04) |
parents | afd9f769c7ae |
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 |