liquid_feedback_frontend

annotate app/main/vote/list.lua @ 520:f9b80c930456

Removed browser warning from login page
author bsw
date Mon Apr 16 23:28:58 2012 +0200 (2012-04-16)
parents 7492497005bd
children a930d2ab9e76
rev   line source
bsw/jbe@19 1 local issue = Issue:by_id(param.get("issue_id"), atom.integer)
bsw/jbe@19 2
bsw/jbe@19 3 local member_id = param.get("member_id", atom.integer)
bsw/jbe@19 4 local member
bsw/jbe@19 5
bsw/jbe@19 6 local readonly = false
poelzi@156 7
bsw/jbe@19 8 if member_id then
bsw/jbe@19 9 if not issue.closed then
bsw/jbe@19 10 error("access denied")
bsw/jbe@19 11 end
bsw/jbe@19 12 member = Member:by_id(member_id)
bsw/jbe@19 13 readonly = true
bsw/jbe@19 14 end
bsw/jbe@19 15
poelzi@138 16 if issue.closed then
poelzi@156 17 if not member then
poelzi@156 18 slot.put_into("error", _"This issue is already closed.")
poelzi@156 19 end
poelzi@158 20 if not member then
poelzi@158 21 member = app.session.member
poelzi@158 22 end
poelzi@156 23 readonly = true
poelzi@138 24 end
poelzi@138 25
bsw/jbe@19 26 if member then
poelzi@156 27 local str = _("Ballot of '#{member_name}' for issue ##{issue_id}",
poelzi@156 28 {member_name = string.format('<a href="%s">%s</a>',
poelzi@156 29 encode.url{
poelzi@156 30 module = "member",
poelzi@156 31 view = "show",
poelzi@156 32 id = member.id,
poelzi@156 33 },
poelzi@156 34 encode.html(member.name)),
poelzi@156 35 issue_id = string.format('<a href="%s">%s</a>',
poelzi@156 36 encode.url{
poelzi@156 37 module = "issue",
poelzi@156 38 view = "show",
poelzi@156 39 id = issue.id,
poelzi@156 40 },
poelzi@156 41 encode.html(tostring(issue.id)))
poelzi@156 42 }
poelzi@156 43 )
poelzi@156 44 slot.put_into("title", str)
bsw/jbe@19 45 else
bsw/jbe@19 46 member = app.session.member
bsw/jbe@19 47 slot.put_into("title", _"Voting")
bsw/jbe@19 48
bsw/jbe@19 49 slot.select("actions", function()
bsw/jbe@19 50 ui.link{
bsw/jbe@19 51 content = function()
bsw/jbe@19 52 ui.image{ static = "icons/16/cancel.png" }
bsw/jbe@19 53 slot.put(_"Cancel")
bsw/jbe@19 54 end,
bsw/jbe@19 55 module = "issue",
bsw/jbe@19 56 view = "show",
bsw/jbe@19 57 id = issue.id
bsw/jbe@19 58 }
bsw@26 59 ui.link{
bsw@86 60 text = _"Discard voting",
bsw@26 61 content = function()
bsw@26 62 ui.image{ static = "icons/16/email_delete.png" }
bsw@26 63 slot.put(_"Discard voting")
bsw@26 64 end,
bsw@26 65 module = "vote",
bsw@26 66 action = "update",
bsw@26 67 params = {
bsw@26 68 issue_id = issue.id,
bsw@26 69 discard = true
bsw@26 70 },
bsw@26 71 routing = {
bsw@26 72 default = {
bsw@26 73 mode = "redirect",
bsw@26 74 module = "issue",
bsw@26 75 view = "show",
bsw@26 76 id = issue.id
bsw@26 77 }
bsw@26 78 }
bsw@26 79 }
bsw/jbe@19 80 end)
bsw/jbe@19 81 end
bsw/jbe@19 82
bsw/jbe@19 83
bsw/jbe@19 84 local tempvoting_string = param.get("scoring")
bsw/jbe@19 85
bsw/jbe@19 86 local tempvotings = {}
bsw/jbe@19 87 if tempvoting_string then
bsw/jbe@19 88 for match in tempvoting_string:gmatch("([^;]+)") do
bsw/jbe@19 89 for initiative_id, grade in match:gmatch("([^:;]+):([^:;]+)") do
bsw/jbe@19 90 tempvotings[tonumber(initiative_id)] = tonumber(grade)
bsw/jbe@19 91 end
bsw/jbe@5 92 end
bsw/jbe@19 93 end
bsw/jbe@5 94
bsw@95 95 local initiatives = issue:get_reference_selector("initiatives"):add_where("initiative.admitted"):add_order_by("initiative.satisfied_supporter_count DESC"):exec()
bsw/jbe@5 96
bsw/jbe@5 97 local min_grade = -1;
bsw/jbe@5 98 local max_grade = 1;
bsw/jbe@5 99
bsw/jbe@5 100 for i, initiative in ipairs(initiatives) do
bsw/jbe@5 101 -- TODO performance
bsw/jbe@19 102 initiative.vote = Vote:by_pk(initiative.id, member.id)
bsw/jbe@19 103 if tempvotings[initiative.id] then
bsw/jbe@19 104 initiative.vote = {}
bsw/jbe@19 105 initiative.vote.grade = tempvotings[initiative.id]
bsw/jbe@19 106 end
bsw/jbe@5 107 if initiative.vote then
bsw/jbe@5 108 if initiative.vote.grade > max_grade then
bsw/jbe@5 109 max_grade = initiative.vote.grade
bsw/jbe@5 110 end
bsw/jbe@5 111 if initiative.vote.grade < min_grade then
bsw/jbe@5 112 min_grade = initiative.vote.grade
bsw/jbe@5 113 end
bsw/jbe@5 114 end
bsw/jbe@5 115 end
bsw/jbe@5 116
bsw/jbe@5 117 local sections = {}
bsw/jbe@5 118 for i = min_grade, max_grade do
bsw/jbe@5 119 sections[i] = {}
bsw/jbe@5 120 for j, initiative in ipairs(initiatives) do
bsw/jbe@5 121 if (initiative.vote and initiative.vote.grade == i) or (not initiative.vote and i == 0) then
bsw/jbe@5 122 sections[i][#(sections[i])+1] = initiative
bsw/jbe@5 123 end
bsw/jbe@5 124 end
bsw/jbe@5 125 end
bsw/jbe@5 126
bsw/jbe@19 127 local approval_count, disapproval_count = 0, 0
bsw/jbe@19 128 for i = min_grade, -1 do
bsw/jbe@19 129 if #sections[i] > 0 then
bsw/jbe@19 130 disapproval_count = disapproval_count + 1
bsw/jbe@19 131 end
bsw/jbe@19 132 end
bsw/jbe@19 133 local approval_count = 0
bsw/jbe@19 134 for i = 1, max_grade do
bsw/jbe@19 135 if #sections[i] > 0 then
bsw/jbe@19 136 approval_count = approval_count + 1
bsw/jbe@19 137 end
bsw/jbe@19 138 end
bsw/jbe@5 139
bsw/jbe@5 140
bsw/jbe@5 141
bsw/jbe@19 142 if not readonly then
bsw/jbe@19 143 util.help("vote.list", _"Voting")
bsw/jbe@19 144 slot.put('<script src="' .. request.get_relative_baseurl() .. 'static/js/dragdrop.js"></script>')
bsw/jbe@19 145 slot.put('<script src="' .. request.get_relative_baseurl() .. 'static/js/voting.js"></script>')
bsw/jbe@19 146 end
bsw/jbe@19 147
bsw/jbe@19 148 ui.script{
bsw/jbe@19 149 script = function()
bsw/jbe@19 150 slot.put(
bsw/jbe@19 151 "voting_text_approval_single = ", encode.json(_"Approval [single entry]"), ";\n",
bsw/jbe@19 152 "voting_text_approval_multi = ", encode.json(_"Approval [many entries]"), ";\n",
bsw/jbe@19 153 "voting_text_first_preference_single = ", encode.json(_"Approval (first preference) [single entry]"), ";\n",
bsw/jbe@19 154 "voting_text_first_preference_multi = ", encode.json(_"Approval (first preference) [many entries]"), ";\n",
bsw/jbe@19 155 "voting_text_second_preference_single = ", encode.json(_"Approval (second preference) [single entry]"), ";\n",
bsw/jbe@19 156 "voting_text_second_preference_multi = ", encode.json(_"Approval (second preference) [many entries]"), ";\n",
bsw/jbe@19 157 "voting_text_third_preference_single = ", encode.json(_"Approval (third preference) [single entry]"), ";\n",
bsw/jbe@19 158 "voting_text_third_preference_multi = ", encode.json(_"Approval (third preference) [many entries]"), ";\n",
bsw/jbe@19 159 "voting_text_numeric_preference_single = ", encode.json(_"Approval (#th preference) [single entry]"), ";\n",
bsw/jbe@19 160 "voting_text_numeric_preference_multi = ", encode.json(_"Approval (#th preference) [many entries]"), ";\n",
bsw/jbe@19 161 "voting_text_abstention_single = ", encode.json(_"Abstention [single entry]"), ";\n",
bsw/jbe@19 162 "voting_text_abstention_multi = ", encode.json(_"Abstention [many entries]"), ";\n",
bsw/jbe@19 163 "voting_text_disapproval_above_one_single = ", encode.json(_"Disapproval (prefer to lower block) [single entry]"), ";\n",
bsw/jbe@19 164 "voting_text_disapproval_above_one_multi = ", encode.json(_"Disapproval (prefer to lower block) [many entries]"), ";\n",
bsw/jbe@19 165 "voting_text_disapproval_above_many_single = ", encode.json(_"Disapproval (prefer to lower blocks) [single entry]"), ";\n",
bsw/jbe@19 166 "voting_text_disapproval_above_many_multi = ", encode.json(_"Disapproval (prefer to lower blocks) [many entries]"), ";\n",
bsw/jbe@19 167 "voting_text_disapproval_above_last_single = ", encode.json(_"Disapproval (prefer to last block) [single entry]"), ";\n",
bsw/jbe@19 168 "voting_text_disapproval_above_last_multi = ", encode.json(_"Disapproval (prefer to last block) [many entries]"), ";\n",
bsw/jbe@19 169 "voting_text_disapproval_single = ", encode.json(_"Disapproval [single entry]"), ";\n",
bsw/jbe@19 170 "voting_text_disapproval_multi = ", encode.json(_"Disapproval [many entries]"), ";\n"
bsw/jbe@19 171 )
bsw/jbe@19 172 end
bsw/jbe@19 173 }
bsw/jbe@5 174
bsw/jbe@5 175 ui.form{
bsw/jbe@19 176 attr = {
bsw/jbe@19 177 id = "voting_form",
bsw/jbe@19 178 class = readonly and "voting_form_readonly" or "voting_form_active"
bsw/jbe@19 179 },
bsw/jbe@5 180 module = "vote",
bsw/jbe@5 181 action = "update",
bsw/jbe@5 182 params = { issue_id = issue.id },
bsw/jbe@5 183 routing = {
bsw/jbe@5 184 default = {
bsw/jbe@5 185 mode = "redirect",
bsw/jbe@5 186 module = "issue",
bsw/jbe@5 187 view = "show",
bsw/jbe@5 188 id = issue.id
bsw/jbe@5 189 }
bsw/jbe@5 190 },
bsw/jbe@5 191 content = function()
bsw/jbe@19 192 if not readonly then
bsw/jbe@19 193 local scoring = param.get("scoring")
bsw/jbe@19 194 if not scoring then
bsw/jbe@19 195 for i, initiative in ipairs(initiatives) do
bsw/jbe@19 196 local vote = initiative.vote
bsw/jbe@19 197 if vote then
bsw/jbe@19 198 tempvotings[initiative.id] = vote.grade
bsw/jbe@19 199 end
bsw/jbe@19 200 end
bsw/jbe@19 201 local tempvotings_list = {}
bsw/jbe@19 202 for key, val in pairs(tempvotings) do
bsw/jbe@19 203 tempvotings_list[#tempvotings_list+1] = tostring(key) .. ":" .. tostring(val)
bsw/jbe@19 204 end
bsw/jbe@19 205 if #tempvotings_list > 0 then
bsw/jbe@19 206 scoring = table.concat(tempvotings_list, ";")
bsw/jbe@19 207 else
bsw/jbe@19 208 scoring = ""
bsw/jbe@19 209 end
bsw/jbe@19 210 end
bsw/jbe@19 211 slot.put('<input type="hidden" name="scoring" value="' .. scoring .. '"/>')
bsw/jbe@19 212 -- TODO abstrahieren
bsw/jbe@19 213 ui.tag{
bsw/jbe@19 214 tag = "input",
bsw/jbe@19 215 attr = {
bsw@86 216 type = "submit",
bsw/jbe@19 217 class = "voting_done",
bsw/jbe@19 218 value = _"Finish voting"
bsw/jbe@19 219 }
bsw/jbe@5 220 }
bsw/jbe@19 221 end
bsw/jbe@5 222 ui.container{
bsw/jbe@5 223 attr = { id = "voting" },
bsw/jbe@5 224 content = function()
bsw/jbe@19 225 local approval_index, disapproval_index = 0, 0
bsw/jbe@5 226 for grade = max_grade, min_grade, -1 do
bsw/jbe@19 227 local entries = sections[grade]
bsw/jbe@5 228 local class
bsw/jbe@5 229 if grade > 0 then
bsw/jbe@5 230 class = "approval"
bsw/jbe@5 231 elseif grade < 0 then
bsw/jbe@5 232 class = "disapproval"
bsw/jbe@5 233 else
bsw/jbe@5 234 class = "abstention"
bsw/jbe@5 235 end
bsw/jbe@19 236 if
bsw/jbe@19 237 #entries > 0 or
bsw/jbe@19 238 (grade == 1 and not approval_used) or
bsw/jbe@19 239 (grade == -1 and not disapproval_used) or
bsw/jbe@19 240 grade == 0
bsw/jbe@19 241 then
bsw/jbe@19 242 ui.container{
bsw/jbe@19 243 attr = { class = class },
bsw/jbe@19 244 content = function()
bsw/jbe@19 245 local heading
bsw/jbe@19 246 if class == "approval" then
bsw/jbe@19 247 approval_used = true
bsw/jbe@19 248 approval_index = approval_index + 1
bsw/jbe@19 249 if approval_count > 1 then
bsw/jbe@19 250 if approval_index == 1 then
bsw/jbe@19 251 if #entries == 1 then
bsw/jbe@19 252 heading = _"Approval (first preference) [single entry]"
bsw/jbe@19 253 else
bsw/jbe@19 254 heading = _"Approval (first preference) [many entries]"
bsw/jbe@19 255 end
bsw/jbe@19 256 elseif approval_index == 2 then
bsw/jbe@19 257 if #entries == 1 then
bsw/jbe@19 258 heading = _"Approval (second preference) [single entry]"
bsw/jbe@19 259 else
bsw/jbe@19 260 heading = _"Approval (second preference) [many entries]"
bsw/jbe@19 261 end
bsw/jbe@19 262 elseif approval_index == 3 then
bsw/jbe@19 263 if #entries == 1 then
bsw/jbe@19 264 heading = _"Approval (third preference) [single entry]"
bsw/jbe@19 265 else
bsw/jbe@19 266 heading = _"Approval (third preference) [many entries]"
bsw/jbe@19 267 end
bsw/jbe@19 268 else
bsw/jbe@19 269 if #entries == 1 then
bsw/jbe@19 270 heading = _"Approval (#th preference) [single entry]"
bsw/jbe@19 271 else
bsw/jbe@19 272 heading = _"Approval (#th preference) [many entries]"
bsw/jbe@19 273 end
bsw/jbe@19 274 end
bsw/jbe@19 275 else
bsw/jbe@19 276 if #entries == 1 then
bsw/jbe@19 277 heading = _"Approval [single entry]"
bsw/jbe@19 278 else
bsw/jbe@19 279 heading = _"Approval [many entries]"
bsw/jbe@19 280 end
bsw/jbe@19 281 end
bsw/jbe@19 282 elseif class == "abstention" then
bsw/jbe@19 283 if #entries == 1 then
bsw/jbe@19 284 heading = _"Abstention [single entry]"
bsw/jbe@19 285 else
bsw/jbe@19 286 heading = _"Abstention [many entries]"
bsw/jbe@19 287 end
bsw/jbe@19 288 elseif class == "disapproval" then
bsw/jbe@19 289 disapproval_used = true
bsw/jbe@19 290 disapproval_index = disapproval_index + 1
bsw/jbe@19 291 if disapproval_count > disapproval_index + 1 then
bsw/jbe@19 292 if #entries == 1 then
bsw/jbe@19 293 heading = _"Disapproval (prefer to lower blocks) [single entry]"
bsw/jbe@19 294 else
bsw/jbe@19 295 heading = _"Disapproval (prefer to lower blocks) [many entries]"
bsw/jbe@19 296 end
bsw/jbe@19 297 elseif disapproval_count == 2 and disapproval_index == 1 then
bsw/jbe@19 298 if #entries == 1 then
bsw/jbe@19 299 heading = _"Disapproval (prefer to lower block) [single entry]"
bsw/jbe@19 300 else
bsw/jbe@19 301 heading = _"Disapproval (prefer to lower block) [many entries]"
bsw/jbe@19 302 end
bsw/jbe@19 303 elseif disapproval_index == disapproval_count - 1 then
bsw/jbe@19 304 if #entries == 1 then
bsw/jbe@19 305 heading = _"Disapproval (prefer to last block) [single entry]"
bsw/jbe@19 306 else
bsw/jbe@19 307 heading = _"Disapproval (prefer to last block) [many entries]"
bsw/jbe@19 308 end
bsw/jbe@19 309 else
bsw/jbe@19 310 if #entries == 1 then
bsw/jbe@19 311 heading = _"Disapproval [single entry]"
bsw/jbe@19 312 else
bsw/jbe@19 313 heading = _"Disapproval [many entries]"
bsw/jbe@6 314 end
bsw/jbe@19 315 end
bsw/jbe@19 316 end
bsw/jbe@19 317 ui.tag {
bsw/jbe@19 318 tag = "div",
bsw/jbe@19 319 attr = { class = "cathead" },
bsw/jbe@19 320 content = heading
bsw/jbe@19 321 }
bsw/jbe@19 322 for i, initiative in ipairs(entries) do
bsw/jbe@19 323 ui.container{
bsw/jbe@19 324 attr = {
bsw/jbe@19 325 class = "movable",
bsw/jbe@19 326 id = "entry_" .. tostring(initiative.id)
bsw/jbe@19 327 },
bsw/jbe@19 328 content = function()
bsw/jbe@19 329 local initiators_selector = initiative:get_reference_selector("initiating_members")
bsw/jbe@19 330 :add_where("accepted")
bsw/jbe@19 331 local initiators = initiators_selector:exec()
bsw/jbe@19 332 local initiator_names = {}
bsw/jbe@19 333 for i, initiator in ipairs(initiators) do
bsw/jbe@19 334 initiator_names[#initiator_names+1] = initiator.name
bsw/jbe@19 335 end
bsw/jbe@19 336 local initiator_names_string = table.concat(initiator_names, ", ")
bsw/jbe@19 337 ui.container{
bsw@519 338 attr = { style = "float: right; position: relative;" },
bsw/jbe@19 339 content = function()
bsw/jbe@19 340 ui.link{
bsw/jbe@19 341 attr = { class = "clickable" },
bsw/jbe@19 342 content = _"Show",
bsw/jbe@19 343 module = "initiative",
bsw/jbe@19 344 view = "show",
bsw/jbe@19 345 id = initiative.id
bsw/jbe@19 346 }
bsw/jbe@19 347 slot.put(" ")
bsw/jbe@19 348 ui.link{
bsw/jbe@19 349 attr = { class = "clickable", target = "_blank" },
bsw/jbe@19 350 content = _"(new window)",
bsw/jbe@19 351 module = "initiative",
bsw/jbe@19 352 view = "show",
bsw/jbe@19 353 id = initiative.id
bsw/jbe@19 354 }
bsw/jbe@19 355 if not readonly then
bsw/jbe@19 356 slot.put(" ")
bsw/jbe@19 357 ui.image{ attr = { class = "grabber" }, static = "icons/grabber.png" }
bsw/jbe@19 358 end
bsw/jbe@19 359 end
bsw/jbe@19 360 }
bsw/jbe@19 361 if not readonly then
bsw/jbe@19 362 ui.container{
bsw@519 363 attr = { style = "float: left; position: relative;" },
bsw/jbe@19 364 content = function()
bsw/jbe@19 365 ui.tag{
bsw/jbe@19 366 tag = "input",
bsw/jbe@19 367 attr = {
bsw@519 368 onclick = "if (jsFail) return true; voting_moveUp(this.parentNode.parentNode); return(false);",
bsw@519 369 name = "move_up_" .. tostring(initiative.id),
bsw/jbe@19 370 class = not disabled and "clickable" or nil,
bsw/jbe@19 371 type = "image",
bsw/jbe@19 372 src = encode.url{ static = "icons/move_up.png" },
bsw/jbe@19 373 alt = _"Move up"
bsw/jbe@19 374 }
bsw/jbe@19 375 }
bsw/jbe@19 376 slot.put("&nbsp;")
bsw/jbe@19 377 ui.tag{
bsw/jbe@19 378 tag = "input",
bsw/jbe@19 379 attr = {
bsw@519 380 onclick = "if (jsFail) return true; voting_moveDown(this.parentNode.parentNode); return(false);",
bsw@519 381 name = "move_down_" .. tostring(initiative.id),
bsw/jbe@19 382 class = not disabled and "clickable" or nil,
bsw/jbe@19 383 type = "image",
bsw/jbe@19 384 src = encode.url{ static = "icons/move_down.png" },
bsw/jbe@19 385 alt = _"Move down"
bsw/jbe@19 386 }
bsw/jbe@19 387 }
bsw/jbe@19 388 slot.put("&nbsp;")
bsw/jbe@19 389 end
bsw/jbe@6 390 }
bsw/jbe@6 391 end
bsw/jbe@6 392 ui.container{
bsw/jbe@19 393 content = function()
bsw@285 394 ui.tag{ content = "i" .. initiative.id .. ": " }
bsw@285 395 ui.tag{ content = initiative.shortened_name }
bsw@286 396 slot.put("<br />")
bsw@286 397 for i, initiator in ipairs(initiators) do
bsw@286 398 ui.link{
bsw@286 399 attr = { class = "clickable" },
bsw@286 400 content = function ()
bsw@286 401 execute.view{
bsw@286 402 module = "member_image",
bsw@286 403 view = "_show",
bsw@286 404 params = {
bsw@286 405 member = initiator,
bsw@286 406 image_type = "avatar",
bsw@286 407 show_dummy = true,
bsw@286 408 class = "micro_avatar",
bsw@286 409 popup_text = text
bsw@286 410 }
bsw@286 411 }
bsw@286 412 end,
bsw@286 413 module = "member", view = "show", id = initiator.id
bsw/jbe@19 414 }
bsw@286 415 slot.put(" ")
bsw@290 416 ui.tag{ content = initiator.name }
bsw@286 417 slot.put(" ")
bsw/jbe@19 418 end
bsw/jbe@19 419 end
bsw/jbe@6 420 }
bsw/jbe@6 421 end
bsw/jbe@19 422 }
bsw/jbe@19 423 end
bsw/jbe@5 424 end
bsw/jbe@19 425 }
bsw/jbe@19 426 end
bsw/jbe@5 427 end
bsw/jbe@5 428 end
bsw/jbe@5 429 }
bsw/jbe@19 430 if not readonly then
bsw/jbe@19 431 ui.tag{
bsw/jbe@19 432 tag = "input",
bsw/jbe@19 433 attr = {
bsw@86 434 type = "submit",
bsw/jbe@19 435 class = "voting_done",
bsw/jbe@19 436 value = _"Finish voting"
bsw/jbe@19 437 }
bsw/jbe@5 438 }
bsw/jbe@19 439 end
bsw/jbe@5 440 end
bsw/jbe@5 441 }
bsw/jbe@5 442
bsw/jbe@5 443

Impressum / About Us