liquid_feedback_frontend

annotate app/main/vote/list.lua @ 1145:904f6807f7fa

Added support for upcoming moonbridge bases WebMCP
author bsw
date Sat Mar 21 15:26:39 2015 +0100 (2015-03-21)
parents 701a5cf6b067
children 32cc544d5a5b
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
jbe@945 5 local readonly = false
bsw/jbe@19 6
jbe@950 7 local preview = param.get("preview") and true or false
poelzi@156 8
bsw/jbe@19 9 if member_id then
bsw/jbe@19 10 if not issue.closed then
bsw/jbe@19 11 error("access denied")
bsw/jbe@19 12 end
bsw/jbe@19 13 member = Member:by_id(member_id)
bsw/jbe@19 14 readonly = true
bsw/jbe@19 15 end
bsw/jbe@19 16
poelzi@138 17 if issue.closed then
poelzi@156 18 if not member then
poelzi@158 19 member = app.session.member
poelzi@158 20 end
poelzi@156 21 readonly = true
poelzi@138 22 end
poelzi@138 23
bsw@1045 24 if preview then
bsw@1045 25 readonly = true
bsw@1045 26 end
bsw@1045 27
bsw@879 28 local submit_button_text = _"Finish voting"
bsw@1045 29 local edit_button_text = _"Edit again"
bsw@879 30
bsw@879 31 if issue.closed then
bsw@1045 32 submit_button_text = _"Save voting comment"
bsw@1045 33 edit_button_text = _"Edit voting comment"
bsw@879 34 end
bsw@879 35
bsw@1045 36 execute.view {
bsw@1045 37 module = "issue", view = "_head", params = { issue = issue }
bsw@1045 38 }
bsw@1045 39
bsw@879 40 local direct_voter
bsw@879 41
bsw/jbe@19 42 if member then
bsw@879 43 direct_voter = DirectVoter:by_pk(issue.id, member.id)
bsw/jbe@19 44 else
bsw/jbe@19 45 member = app.session.member
bsw@879 46 direct_voter = DirectVoter:by_pk(issue.id, member.id)
bsw/jbe@19 47 end
bsw/jbe@19 48
bsw/jbe@19 49
bsw@879 50
bsw/jbe@19 51 local tempvoting_string = param.get("scoring")
bsw/jbe@19 52
bsw/jbe@19 53 local tempvotings = {}
bsw/jbe@19 54 if tempvoting_string then
bsw/jbe@19 55 for match in tempvoting_string:gmatch("([^;]+)") do
bsw/jbe@19 56 for initiative_id, grade in match:gmatch("([^:;]+):([^:;]+)") do
bsw/jbe@19 57 tempvotings[tonumber(initiative_id)] = tonumber(grade)
bsw/jbe@19 58 end
bsw/jbe@5 59 end
bsw/jbe@19 60 end
bsw/jbe@5 61
bsw@95 62 local initiatives = issue:get_reference_selector("initiatives"):add_where("initiative.admitted"):add_order_by("initiative.satisfied_supporter_count DESC"):exec()
bsw/jbe@5 63
bsw/jbe@5 64 local min_grade = -1;
bsw/jbe@5 65 local max_grade = 1;
bsw/jbe@5 66
bsw/jbe@5 67 for i, initiative in ipairs(initiatives) do
bsw/jbe@5 68 -- TODO performance
bsw/jbe@19 69 initiative.vote = Vote:by_pk(initiative.id, member.id)
bsw/jbe@19 70 if tempvotings[initiative.id] then
bsw/jbe@19 71 initiative.vote = {}
bsw/jbe@19 72 initiative.vote.grade = tempvotings[initiative.id]
bsw/jbe@19 73 end
bsw/jbe@5 74 if initiative.vote then
bsw/jbe@5 75 if initiative.vote.grade > max_grade then
bsw/jbe@5 76 max_grade = initiative.vote.grade
bsw/jbe@5 77 end
bsw/jbe@5 78 if initiative.vote.grade < min_grade then
bsw/jbe@5 79 min_grade = initiative.vote.grade
bsw/jbe@5 80 end
bsw/jbe@5 81 end
bsw/jbe@5 82 end
bsw/jbe@5 83
bsw/jbe@5 84 local sections = {}
bsw/jbe@5 85 for i = min_grade, max_grade do
bsw/jbe@5 86 sections[i] = {}
bsw/jbe@5 87 for j, initiative in ipairs(initiatives) do
bsw/jbe@5 88 if (initiative.vote and initiative.vote.grade == i) or (not initiative.vote and i == 0) then
bsw/jbe@5 89 sections[i][#(sections[i])+1] = initiative
bsw/jbe@5 90 end
bsw/jbe@5 91 end
bsw/jbe@5 92 end
bsw/jbe@5 93
bsw/jbe@19 94 local approval_count, disapproval_count = 0, 0
bsw/jbe@19 95 for i = min_grade, -1 do
bsw/jbe@19 96 if #sections[i] > 0 then
bsw/jbe@19 97 disapproval_count = disapproval_count + 1
bsw/jbe@19 98 end
bsw/jbe@19 99 end
bsw/jbe@19 100 local approval_count = 0
bsw/jbe@19 101 for i = 1, max_grade do
bsw/jbe@19 102 if #sections[i] > 0 then
bsw/jbe@19 103 approval_count = approval_count + 1
bsw/jbe@19 104 end
bsw/jbe@19 105 end
bsw/jbe@5 106
bsw/jbe@19 107 if not readonly then
bsw/jbe@19 108 slot.put('<script src="' .. request.get_relative_baseurl() .. 'static/js/dragdrop.js"></script>')
bsw/jbe@19 109 slot.put('<script src="' .. request.get_relative_baseurl() .. 'static/js/voting.js"></script>')
bsw/jbe@19 110 end
bsw/jbe@19 111
bsw/jbe@19 112 ui.script{
bsw/jbe@19 113 script = function()
bsw/jbe@19 114 slot.put(
bsw/jbe@19 115 "voting_text_approval_single = ", encode.json(_"Approval [single entry]"), ";\n",
bsw/jbe@19 116 "voting_text_approval_multi = ", encode.json(_"Approval [many entries]"), ";\n",
bsw/jbe@19 117 "voting_text_first_preference_single = ", encode.json(_"Approval (first preference) [single entry]"), ";\n",
bsw/jbe@19 118 "voting_text_first_preference_multi = ", encode.json(_"Approval (first preference) [many entries]"), ";\n",
bsw/jbe@19 119 "voting_text_second_preference_single = ", encode.json(_"Approval (second preference) [single entry]"), ";\n",
bsw/jbe@19 120 "voting_text_second_preference_multi = ", encode.json(_"Approval (second preference) [many entries]"), ";\n",
bsw/jbe@19 121 "voting_text_third_preference_single = ", encode.json(_"Approval (third preference) [single entry]"), ";\n",
bsw/jbe@19 122 "voting_text_third_preference_multi = ", encode.json(_"Approval (third preference) [many entries]"), ";\n",
bsw/jbe@19 123 "voting_text_numeric_preference_single = ", encode.json(_"Approval (#th preference) [single entry]"), ";\n",
bsw/jbe@19 124 "voting_text_numeric_preference_multi = ", encode.json(_"Approval (#th preference) [many entries]"), ";\n",
bsw/jbe@19 125 "voting_text_abstention_single = ", encode.json(_"Abstention [single entry]"), ";\n",
bsw/jbe@19 126 "voting_text_abstention_multi = ", encode.json(_"Abstention [many entries]"), ";\n",
bsw/jbe@19 127 "voting_text_disapproval_above_one_single = ", encode.json(_"Disapproval (prefer to lower block) [single entry]"), ";\n",
bsw/jbe@19 128 "voting_text_disapproval_above_one_multi = ", encode.json(_"Disapproval (prefer to lower block) [many entries]"), ";\n",
bsw/jbe@19 129 "voting_text_disapproval_above_many_single = ", encode.json(_"Disapproval (prefer to lower blocks) [single entry]"), ";\n",
bsw/jbe@19 130 "voting_text_disapproval_above_many_multi = ", encode.json(_"Disapproval (prefer to lower blocks) [many entries]"), ";\n",
bsw/jbe@19 131 "voting_text_disapproval_above_last_single = ", encode.json(_"Disapproval (prefer to last block) [single entry]"), ";\n",
bsw/jbe@19 132 "voting_text_disapproval_above_last_multi = ", encode.json(_"Disapproval (prefer to last block) [many entries]"), ";\n",
bsw/jbe@19 133 "voting_text_disapproval_single = ", encode.json(_"Disapproval [single entry]"), ";\n",
bsw/jbe@19 134 "voting_text_disapproval_multi = ", encode.json(_"Disapproval [many entries]"), ";\n"
bsw/jbe@19 135 )
bsw/jbe@19 136 end
bsw/jbe@19 137 }
bsw/jbe@5 138
bsw@1045 139 if issue.state == "finished_with_winner"
bsw@1045 140 or issue.state == "finished_without_winner"
bsw@1045 141 then
bsw@1045 142
bsw@1045 143 local members_selector = Member:new_selector()
bsw@1045 144 :join("delegating_voter", nil, "delegating_voter.member_id = member.id")
bsw@1045 145 :add_where{ "delegating_voter.issue_id = ?", issue.id }
bsw@1045 146 :add_where{ "delegating_voter.delegate_member_ids[1] = ?", member.id }
bsw@1045 147 :add_field("delegating_voter.weight", "voter_weight")
bsw@1045 148 :join("issue", nil, "issue.id = delegating_voter.issue_id")
bsw@1045 149
bsw@1045 150 ui.sidebar( "tab-members", function()
bsw@1045 151 ui.sidebarHead(function()
bsw@1045 152 ui.heading{ level = 2, content = _"Incoming delegations" }
bsw@1045 153 end)
bsw@1045 154 execute.view{
bsw@1045 155 module = "member",
bsw@1045 156 view = "_list",
bsw@1045 157 params = {
bsw@1045 158 members_selector = members_selector,
bsw@1045 159 trustee = member,
bsw@1045 160 issue = issue,
bsw@1045 161 initiative = initiative,
bsw@1045 162 for_votes = true, no_filter = true,
bsw@1045 163 member_class = "sidebarRow sidebarRowNarrow",
bsw/jbe@5 164 }
bsw@1045 165 }
bsw@1045 166 end)
bsw@1045 167 end
bsw@1045 168
bsw@1045 169
bsw@1045 170 ui.section( function()
bsw@1045 171
bsw@1045 172 ui.sectionHead( function()
bsw@1045 173 if preview then
bsw@1045 174 ui.heading { level = 1, content = _"Preview of voting ballot" }
bsw@1045 175 elseif readonly then
bsw@1045 176 local str = _("Ballot of '#{member_name}'",
bsw@1045 177 {member_name = string.format('<a href="%s">%s</a>',
bsw@1045 178 encode.url{
bsw@1045 179 module = "member",
bsw@1045 180 view = "show",
bsw@1045 181 id = member.id,
bsw@1045 182 },
bsw@1045 183 encode.html(member.name))
bsw@1045 184 }
bsw@1045 185 )
bsw@1045 186 ui.heading { level = 1, content = function () slot.put ( str ) end }
bsw@1045 187 else
bsw@1045 188 ui.heading { level = 1, content = _"Voting" }
bsw/jbe@19 189 end
bsw@1045 190 end )
bsw@1045 191
bsw@1045 192 ui.sectionRow( function()
bsw@1045 193
bsw@1045 194 ui.form{
bsw@1045 195 record = direct_voter,
bsw@1045 196 attr = {
bsw@1045 197 id = "voting_form",
bsw@1045 198 class = readonly and "voting_form_readonly" or "voting_form_active"
bsw@1045 199 },
bsw@1045 200 module = "vote",
bsw@1045 201 action = "update",
bsw@1045 202 params = { issue_id = issue.id },
bsw/jbe@5 203 content = function()
bsw@1045 204 if not readonly or preview then
bsw@1045 205 local scoring = param.get("scoring")
bsw@1045 206 if not scoring then
bsw@1045 207 for i, initiative in ipairs(initiatives) do
bsw@1045 208 local vote = initiative.vote
bsw@1045 209 if vote then
bsw@1045 210 tempvotings[initiative.id] = vote.grade
bsw@1045 211 else
bsw@1045 212 tempvotings[initiative.id] = 0
bsw@1045 213 end
bsw@1045 214 end
bsw@1045 215 local tempvotings_list = {}
bsw@1045 216 for key, val in pairs(tempvotings) do
bsw@1045 217 tempvotings_list[#tempvotings_list+1] = tostring(key) .. ":" .. tostring(val)
bsw@1045 218 end
bsw@1045 219 if #tempvotings_list > 0 then
bsw@1045 220 scoring = table.concat(tempvotings_list, ";")
bsw@1045 221 else
bsw@1045 222 scoring = ""
bsw@1045 223 end
bsw/jbe@5 224 end
bsw@1045 225 slot.put('<input type="hidden" name="scoring" value="' .. scoring .. '"/>')
bsw@1045 226 end
bsw@1045 227 if preview then
bsw@1045 228 ui.heading{ level = 2, content = _"Your choice" }
bsw@1045 229 elseif not readonly then
bsw@1045 230 ui.heading{ level = 2, content = _"Make your choice by placing the initiatives" }
bsw@1045 231 end
bsw@1045 232
bsw@1045 233 ui.container{
bsw@1045 234 attr = { id = "voting" },
bsw@1045 235 content = function()
bsw@1045 236 local approval_index, disapproval_index = 0, 0
bsw@1145 237 local approval_used, disapproval_used
bsw@1045 238 for grade = max_grade, min_grade, -1 do
bsw@1045 239 local entries = sections[grade]
bsw@1045 240 local class
bsw@1045 241 if grade > 0 then
bsw@1045 242 class = "approval"
bsw@1045 243 elseif grade < 0 then
bsw@1045 244 class = "disapproval"
bsw@1045 245 else
bsw@1045 246 class = "abstention"
bsw@1045 247 end
bsw@1045 248 if
bsw@1045 249 #entries > 0 or
bsw@1045 250 (grade == 1 and not approval_used) or
bsw@1045 251 (grade == -1 and not disapproval_used) or
bsw@1045 252 grade == 0
bsw@1045 253 then
bsw@1045 254 ui.container{
bsw@1045 255 attr = { class = class },
bsw@1045 256 content = function()
bsw@1045 257 local heading
bsw@1045 258 if class == "approval" then
bsw@1045 259 approval_used = true
bsw@1045 260 approval_index = approval_index + 1
bsw@1045 261 if approval_count > 1 then
bsw@1045 262 if approval_index == 1 then
bsw@1045 263 if #entries == 1 then
bsw@1045 264 heading = _"Approval (first preference) [single entry]"
bsw@1045 265 else
bsw@1045 266 heading = _"Approval (first preference) [many entries]"
bsw@1045 267 end
bsw@1045 268 elseif approval_index == 2 then
bsw@1045 269 if #entries == 1 then
bsw@1045 270 heading = _"Approval (second preference) [single entry]"
bsw@1045 271 else
bsw@1045 272 heading = _"Approval (second preference) [many entries]"
bsw@1045 273 end
bsw@1045 274 elseif approval_index == 3 then
bsw@1045 275 if #entries == 1 then
bsw@1045 276 heading = _"Approval (third preference) [single entry]"
bsw@1045 277 else
bsw@1045 278 heading = _"Approval (third preference) [many entries]"
bsw@1045 279 end
bsw@1045 280 else
bsw@1045 281 if #entries == 1 then
bsw@1045 282 heading = _"Approval (#th preference) [single entry]"
bsw@1045 283 else
bsw@1045 284 heading = _"Approval (#th preference) [many entries]"
bsw@1045 285 end
bsw@1045 286 end
bsw/jbe@19 287 else
bsw@1045 288 if #entries == 1 then
bsw@1045 289 heading = _"Approval [single entry]"
bsw@1045 290 else
bsw@1045 291 heading = _"Approval [many entries]"
bsw@1045 292 end
bsw/jbe@19 293 end
bsw@1045 294 elseif class == "abstention" then
bsw@1045 295 if #entries == 1 then
bsw@1045 296 heading = _"Abstention [single entry]"
bsw@1045 297 else
bsw@1045 298 heading = _"Abstention [many entries]"
bsw@1045 299 end
bsw@1045 300 elseif class == "disapproval" then
bsw@1045 301 disapproval_used = true
bsw@1045 302 disapproval_index = disapproval_index + 1
bsw@1045 303 if disapproval_count > disapproval_index + 1 then
bsw@1045 304 if #entries == 1 then
bsw@1045 305 heading = _"Disapproval (prefer to lower blocks) [single entry]"
bsw@1045 306 else
bsw@1045 307 heading = _"Disapproval (prefer to lower blocks) [many entries]"
bsw@1045 308 end
bsw@1045 309 elseif disapproval_count == 2 and disapproval_index == 1 then
bsw@1045 310 if #entries == 1 then
bsw@1045 311 heading = _"Disapproval (prefer to lower block) [single entry]"
bsw@1045 312 else
bsw@1045 313 heading = _"Disapproval (prefer to lower block) [many entries]"
bsw@1045 314 end
bsw@1045 315 elseif disapproval_index == disapproval_count - 1 then
bsw@1045 316 if #entries == 1 then
bsw@1045 317 heading = _"Disapproval (prefer to last block) [single entry]"
bsw@1045 318 else
bsw@1045 319 heading = _"Disapproval (prefer to last block) [many entries]"
bsw@1045 320 end
bsw/jbe@19 321 else
bsw@1045 322 if #entries == 1 then
bsw@1045 323 heading = _"Disapproval [single entry]"
bsw@1045 324 else
bsw@1045 325 heading = _"Disapproval [many entries]"
bsw@1045 326 end
bsw/jbe@19 327 end
bsw/jbe@19 328 end
bsw@1045 329 ui.tag {
bsw@1045 330 tag = "div",
bsw@1045 331 attr = { class = "cathead" },
bsw@1045 332 content = heading
bsw@1045 333 }
bsw@1045 334 for i, initiative in ipairs(entries) do
bsw/jbe@19 335 ui.container{
bsw@1045 336 attr = {
bsw@1045 337 class = "movable",
bsw@1045 338 id = "entry_" .. tostring(initiative.id)
bsw@1045 339 },
bsw/jbe@19 340 content = function()
bsw@1045 341 local initiators_selector = initiative:get_reference_selector("initiating_members")
bsw@1045 342 :add_where("accepted")
bsw@1045 343 local initiators = initiators_selector:exec()
bsw@1045 344 local initiator_names = {}
bsw@1045 345 for i, initiator in ipairs(initiators) do
bsw@1045 346 initiator_names[#initiator_names+1] = initiator.name
bsw@1045 347 end
bsw@1045 348 local initiator_names_string = table.concat(initiator_names, ", ")
bsw@1045 349 ui.container{
bsw@1045 350 attr = { style = "float: right; position: relative;" },
bsw@1045 351 content = function()
bsw@1045 352 ui.link{
bsw@1045 353 attr = { class = "clickable" },
bsw@1045 354 content = _"Show",
bsw@1045 355 module = "initiative",
bsw@1045 356 view = "show",
bsw@1045 357 id = initiative.id
bsw@1045 358 }
bsw@1045 359 slot.put(" ")
bsw@1045 360 ui.link{
bsw@1045 361 attr = { class = "clickable", target = "_blank" },
bsw@1045 362 content = _"(new window)",
bsw@1045 363 module = "initiative",
bsw@1045 364 view = "show",
bsw@1045 365 id = initiative.id
bsw@1045 366 }
bsw@1045 367 if not readonly then
bsw@1045 368 slot.put(" ")
bsw@1045 369 ui.image{ attr = { class = "grabber" }, static = "icons/grabber.png" }
bsw@1045 370 end
bsw@1045 371 end
bsw/jbe@19 372 }
bsw/jbe@19 373 if not readonly then
bsw@1045 374 ui.container{
bsw@1045 375 attr = { style = "float: left; position: relative;" },
bsw@1045 376 content = function()
bsw@1045 377 ui.tag{
bsw@1045 378 tag = "input",
bsw@1045 379 attr = {
bsw@1045 380 onclick = "if (jsFail) return true; voting_moveUp(this.parentNode.parentNode); return(false);",
bsw@1045 381 name = "move_up_" .. tostring(initiative.id),
bsw@1045 382 class = not disabled and "clickable" or nil,
bsw@1045 383 type = "image",
bsw@1045 384 src = encode.url{ static = "icons/move_up.png" },
bsw@1045 385 alt = _"Move up"
bsw@1045 386 }
bsw@1045 387 }
bsw@1045 388 slot.put("&nbsp;")
bsw@1045 389 ui.tag{
bsw@1045 390 tag = "input",
bsw@1045 391 attr = {
bsw@1045 392 onclick = "if (jsFail) return true; voting_moveDown(this.parentNode.parentNode); return(false);",
bsw@1045 393 name = "move_down_" .. tostring(initiative.id),
bsw@1045 394 class = not disabled and "clickable" or nil,
bsw@1045 395 type = "image",
bsw@1045 396 src = encode.url{ static = "icons/move_down.png" },
bsw@1045 397 alt = _"Move down"
bsw@286 398 }
bsw@286 399 }
bsw@1045 400 slot.put("&nbsp;")
bsw@1045 401 end
bsw/jbe@19 402 }
bsw/jbe@19 403 end
bsw@1045 404 ui.container{
bsw@1045 405 content = function()
bsw@1045 406 ui.tag{ content = "i" .. initiative.id .. ": " }
bsw@1045 407 ui.tag{ content = initiative.shortened_name }
bsw@1045 408 slot.put("<br />")
bsw@1045 409 for i, initiator in ipairs(initiators) do
bsw@1045 410 ui.link{
bsw@1045 411 attr = { class = "clickable" },
bsw@1045 412 content = function ()
bsw@1045 413 execute.view{
bsw@1045 414 module = "member_image",
bsw@1045 415 view = "_show",
bsw@1045 416 params = {
bsw@1045 417 member = initiator,
bsw@1045 418 image_type = "avatar",
bsw@1045 419 show_dummy = true,
bsw@1045 420 class = "micro_avatar",
bsw@1045 421 popup_text = text
bsw@1045 422 }
bsw@1045 423 }
bsw@1045 424 end,
bsw@1045 425 module = "member", view = "show", id = initiator.id
bsw@1045 426 }
bsw@1045 427 slot.put(" ")
bsw@1045 428 ui.tag{ content = initiator.name }
bsw@1045 429 slot.put(" ")
bsw@1045 430 end
bsw@1045 431 end
bsw@1045 432 }
bsw/jbe@19 433 end
bsw/jbe@6 434 }
bsw/jbe@6 435 end
bsw@1045 436 end
bsw@1045 437 }
bsw@1045 438 end
bsw@1045 439 end
bsw@1045 440 end
bsw@1045 441 }
bsw@1045 442 if app.session.member_id and preview then
bsw@1045 443 local formatting_engine = param.get("formatting_engine") or config.enforce_formatting_engine
bsw@1045 444 local comment = param.get("comment")
bsw@1045 445 if comment and #comment > 0 then
bsw@1045 446 local rendered_comment = format.wiki_text(comment, formatting_engine)
bsw@1045 447 ui.heading{ level = "2", content = _"Voting comment" }
bsw@1045 448 ui.container { attr = { class = "member_statement" }, content = function()
bsw@1045 449 slot.put(rendered_comment)
bsw@1045 450 end }
bsw@1045 451 slot.put("<br />")
bsw@1045 452 end
bsw@1045 453 end
bsw@1045 454 if (readonly or direct_voter and direct_voter.comment) and not preview and not (app.session.member_id == member.id) then
bsw@1045 455 local text
bsw@1045 456 if direct_voter and direct_voter.comment_changed then
bsw@1045 457 text = _("Voting comment (last updated: #{timestamp})", { timestamp = format.timestamp(direct_voter.comment_changed) })
bsw@1045 458 elseif direct_voter and direct_voter.comment then
bsw@1045 459 text = _"Voting comment"
bsw@1045 460 end
bsw@1045 461 if text then
bsw@1045 462 ui.heading{ level = "2", content = text }
bsw@1045 463 end
bsw@1045 464 if direct_voter and direct_voter.comment then
bsw@1045 465 local rendered_comment = direct_voter:get_content('html')
bsw@1045 466 ui.container { attr = { class = "member_statement" }, content = function()
bsw@1045 467 slot.put(rendered_comment)
bsw@1045 468 end }
bsw@1045 469 slot.put("<br />")
bsw@1045 470 end
bsw@1045 471 end
bsw@1045 472 if app.session.member_id and app.session.member_id == member.id then
bsw@1045 473 if (not readonly or direct_voter) and not preview then
bsw@1045 474 ui.container{ content = function()
bsw@1045 475 if not config.enforce_formatting_engine then
bsw@1045 476 ui.field.select{
bsw@1045 477 label = _"Wiki engine for statement",
bsw@1045 478 name = "formatting_engine",
bsw@1045 479 foreign_records = config.formatting_engines,
bsw@1045 480 attr = {id = "formatting_engine"},
bsw@1045 481 foreign_id = "id",
bsw@1045 482 foreign_name = "name",
bsw@1045 483 value = param.get("formatting_engine") or direct_voter and direct_voter.formatting_engine
bsw@1045 484 }
bsw@1045 485 end
bsw@1045 486 ui.heading { level = 2, content = _"Voting comment (optional)" }
bsw@1045 487 ui.field.text{
bsw@1045 488 name = "comment",
bsw@1045 489 multiline = true,
bsw@1045 490 value = param.get("comment") or direct_voter and direct_voter.comment,
bsw@1045 491 attr = { style = "height: 10ex; width: 100%;" },
bsw@1045 492 }
bsw@1045 493 end }
bsw@1045 494 end
bsw@1045 495
bsw@1045 496 if preview then
bsw@1045 497 if not config.enforce_formatting_engine then
bsw@1045 498 ui.field.hidden{ name = "formatting_engine", value = param.get("formatting_engine") }
bsw@1045 499 end
bsw@1045 500 ui.field.hidden{ name = "comment", value = param.get("comment") or direct_voter and direct_voter.comment }
bsw@1045 501 end
bsw@1045 502
bsw@1045 503 if not readonly or direct_voter or preview then
bsw@1045 504 ui.container{ content = function()
bsw@1045 505 if preview then
bsw@1045 506 slot.put(" ")
bsw@1045 507 ui.tag{
bsw@1045 508 tag = "input",
bsw@1045 509 attr = {
bsw@1045 510 type = "submit",
bsw@1045 511 class = "btn btn-default",
bsw@1045 512 name = issue.closed and "update_comment" or nil,
bsw@1045 513 value = submit_button_text -- finish voting / update comment
bsw/jbe@19 514 }
bsw@1045 515 }
bsw/jbe@5 516 end
bsw@1045 517 if not preview then
bsw@1045 518 ui.tag{
bsw@1045 519 tag = "input",
bsw@1045 520 attr = {
bsw@1045 521 type = "submit",
bsw@1045 522 name = "preview",
bsw@1045 523 class = "btn btn-default",
bsw@1045 524 value = _"Preview",
bsw@1045 525 }
bsw@1045 526 }
bsw@1045 527 else
bsw@1045 528 slot.put(" ")
bsw@1045 529 ui.tag{
bsw@1045 530 tag = "input",
bsw@1045 531 attr = {
bsw@1045 532 type = "submit",
bsw@1045 533 name = "edit",
bsw@1045 534 class = "btn-link",
bsw@1045 535 value = edit_button_text,
bsw@1045 536 }
bsw@1045 537 }
bsw@1045 538 end
bsw@1045 539 end }
bsw/jbe@19 540 end
bsw/jbe@5 541 end
bsw/jbe@5 542 end
bsw/jbe@5 543 }
bsw@1045 544 slot.put("<br />")
bsw@1045 545 ui.link{
bsw@1045 546 text = _"Cancel",
bsw@1045 547 module = "issue",
bsw@1045 548 view = "show",
bsw@1045 549 id = issue.id
bsw@1045 550 }
bsw@1045 551 if direct_voter then
bsw@1045 552 slot.put(" | ")
bsw@1045 553 ui.link {
bsw@1045 554 module = "vote", action = "update",
bsw@1045 555 params = {
bsw@1045 556 issue_id = issue.id,
bsw@1045 557 discard = true
bsw@1045 558 },
bsw@1045 559 routing = {
bsw@1045 560 default = {
bsw@1045 561 mode = "redirect",
bsw@1045 562 module = "issue",
bsw@1045 563 view = "show",
bsw@1045 564 id = issue.id
bsw@1045 565 }
bsw@1045 566 },
bsw@1045 567 text = _"Discard my vote"
bsw@1045 568 }
bsw@879 569 end
bsw/jbe@5 570
bsw@1045 571 end )
bsw@1045 572 end )

Impressum / About Us