liquid_feedback_frontend
annotate app/main/vote/list.lua @ 52:88ac7798b562
Several bugfixes (getpic.c, accepted but canceled issues, ...); Listing of available policies
- Bugfixes in fastpath/getpic.c (related to crashes since alpha5)
- Respect Content-Types of images in database
(needs database update, as Content-Type was incorrectly stored by previous versions)
- Typo fixed in help messages
- RSS-Feed (currently only after manual authentication while session is valid)
- Listing of available policies
- German translation fixed: "gebe" -> "gib" (Imperativ)
- Bugfixes related to issues which had been accepted but canceled afterwards
- Prohibit creation of initiatives in disabled areas or with disabled policies
- Bugfixes in fastpath/getpic.c (related to crashes since alpha5)
- Respect Content-Types of images in database
(needs database update, as Content-Type was incorrectly stored by previous versions)
- Typo fixed in help messages
- RSS-Feed (currently only after manual authentication while session is valid)
- Listing of available policies
- German translation fixed: "gebe" -> "gib" (Imperativ)
- Bugfixes related to issues which had been accepted but canceled afterwards
- Prohibit creation of initiatives in disabled areas or with disabled policies
author | bsw/jbe |
---|---|
date | Thu Apr 15 19:58:25 2010 +0200 (2010-04-15) |
parents | 3036f2732b83 |
children | 1f1f8c78ba3a |
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 |
bsw/jbe@19 | 7 if member_id then |
bsw/jbe@19 | 8 if not issue.closed then |
bsw/jbe@19 | 9 error("access denied") |
bsw/jbe@19 | 10 end |
bsw/jbe@19 | 11 member = Member:by_id(member_id) |
bsw/jbe@19 | 12 readonly = true |
bsw/jbe@19 | 13 end |
bsw/jbe@19 | 14 |
bsw/jbe@19 | 15 if member then |
bsw/jbe@19 | 16 slot.put_into("title", _("Ballot of '#{member_name}' for issue ##{issue_id}", { |
bsw/jbe@19 | 17 member_name = member.name, |
bsw/jbe@19 | 18 issue_id = issue.id |
bsw/jbe@19 | 19 })) |
bsw/jbe@19 | 20 else |
bsw/jbe@19 | 21 member = app.session.member |
bsw/jbe@19 | 22 slot.put_into("title", _"Voting") |
bsw/jbe@19 | 23 |
bsw/jbe@19 | 24 slot.select("actions", function() |
bsw/jbe@19 | 25 ui.link{ |
bsw/jbe@19 | 26 content = function() |
bsw/jbe@19 | 27 ui.image{ static = "icons/16/cancel.png" } |
bsw/jbe@19 | 28 slot.put(_"Cancel") |
bsw/jbe@19 | 29 end, |
bsw/jbe@19 | 30 module = "issue", |
bsw/jbe@19 | 31 view = "show", |
bsw/jbe@19 | 32 id = issue.id |
bsw/jbe@19 | 33 } |
bsw@26 | 34 ui.link{ |
bsw@26 | 35 content = function() |
bsw@26 | 36 ui.image{ static = "icons/16/email_delete.png" } |
bsw@26 | 37 slot.put(_"Discard voting") |
bsw@26 | 38 end, |
bsw@26 | 39 module = "vote", |
bsw@26 | 40 action = "update", |
bsw@26 | 41 params = { |
bsw@26 | 42 issue_id = issue.id, |
bsw@26 | 43 discard = true |
bsw@26 | 44 }, |
bsw@26 | 45 routing = { |
bsw@26 | 46 default = { |
bsw@26 | 47 mode = "redirect", |
bsw@26 | 48 module = "issue", |
bsw@26 | 49 view = "show", |
bsw@26 | 50 id = issue.id |
bsw@26 | 51 } |
bsw@26 | 52 } |
bsw@26 | 53 } |
bsw/jbe@19 | 54 end) |
bsw/jbe@19 | 55 end |
bsw/jbe@19 | 56 |
bsw/jbe@19 | 57 |
bsw/jbe@5 | 58 local warning_text = _"Some JavaScript based functions (voting in particular) will not work.\nFor this beta, please use a current version of Firefox, Safari, Opera(?), Konqueror or another (more) standard compliant browser.\nAlternative access without JavaScript will be available soon." |
bsw/jbe@5 | 59 |
bsw/jbe@5 | 60 ui.script{ static = "js/browser_warning.js" } |
bsw/jbe@5 | 61 ui.script{ script = "checkBrowser(" .. encode.json(_"Your web browser is not fully supported yet." .. " " .. warning_text:gsub("\n", "\n\n")) .. ");" } |
bsw/jbe@5 | 62 |
bsw/jbe@19 | 63 |
bsw/jbe@19 | 64 local tempvoting_string = param.get("scoring") |
bsw/jbe@19 | 65 |
bsw/jbe@19 | 66 local tempvotings = {} |
bsw/jbe@19 | 67 if tempvoting_string then |
bsw/jbe@19 | 68 for match in tempvoting_string:gmatch("([^;]+)") do |
bsw/jbe@19 | 69 for initiative_id, grade in match:gmatch("([^:;]+):([^:;]+)") do |
bsw/jbe@19 | 70 tempvotings[tonumber(initiative_id)] = tonumber(grade) |
bsw/jbe@19 | 71 end |
bsw/jbe@5 | 72 end |
bsw/jbe@19 | 73 end |
bsw/jbe@5 | 74 |
bsw/jbe@19 | 75 local initiatives = issue:get_reference_selector("initiatives"):add_where("initiative.admitted"):exec() |
bsw/jbe@5 | 76 |
bsw/jbe@5 | 77 local min_grade = -1; |
bsw/jbe@5 | 78 local max_grade = 1; |
bsw/jbe@5 | 79 |
bsw/jbe@5 | 80 for i, initiative in ipairs(initiatives) do |
bsw/jbe@5 | 81 -- TODO performance |
bsw/jbe@19 | 82 initiative.vote = Vote:by_pk(initiative.id, member.id) |
bsw/jbe@19 | 83 if tempvotings[initiative.id] then |
bsw/jbe@19 | 84 initiative.vote = {} |
bsw/jbe@19 | 85 initiative.vote.grade = tempvotings[initiative.id] |
bsw/jbe@19 | 86 end |
bsw/jbe@5 | 87 if initiative.vote then |
bsw/jbe@5 | 88 if initiative.vote.grade > max_grade then |
bsw/jbe@5 | 89 max_grade = initiative.vote.grade |
bsw/jbe@5 | 90 end |
bsw/jbe@5 | 91 if initiative.vote.grade < min_grade then |
bsw/jbe@5 | 92 min_grade = initiative.vote.grade |
bsw/jbe@5 | 93 end |
bsw/jbe@5 | 94 end |
bsw/jbe@5 | 95 end |
bsw/jbe@5 | 96 |
bsw/jbe@5 | 97 local sections = {} |
bsw/jbe@5 | 98 for i = min_grade, max_grade do |
bsw/jbe@5 | 99 sections[i] = {} |
bsw/jbe@5 | 100 for j, initiative in ipairs(initiatives) do |
bsw/jbe@5 | 101 if (initiative.vote and initiative.vote.grade == i) or (not initiative.vote and i == 0) then |
bsw/jbe@5 | 102 sections[i][#(sections[i])+1] = initiative |
bsw/jbe@5 | 103 end |
bsw/jbe@5 | 104 end |
bsw/jbe@5 | 105 end |
bsw/jbe@5 | 106 |
bsw/jbe@19 | 107 local approval_count, disapproval_count = 0, 0 |
bsw/jbe@19 | 108 for i = min_grade, -1 do |
bsw/jbe@19 | 109 if #sections[i] > 0 then |
bsw/jbe@19 | 110 disapproval_count = disapproval_count + 1 |
bsw/jbe@19 | 111 end |
bsw/jbe@19 | 112 end |
bsw/jbe@19 | 113 local approval_count = 0 |
bsw/jbe@19 | 114 for i = 1, max_grade do |
bsw/jbe@19 | 115 if #sections[i] > 0 then |
bsw/jbe@19 | 116 approval_count = approval_count + 1 |
bsw/jbe@19 | 117 end |
bsw/jbe@19 | 118 end |
bsw/jbe@5 | 119 |
bsw/jbe@5 | 120 |
bsw/jbe@5 | 121 |
bsw/jbe@19 | 122 if not readonly then |
bsw/jbe@19 | 123 util.help("vote.list", _"Voting") |
bsw/jbe@19 | 124 slot.put('<script src="' .. request.get_relative_baseurl() .. 'static/js/dragdrop.js"></script>') |
bsw/jbe@19 | 125 slot.put('<script src="' .. request.get_relative_baseurl() .. 'static/js/voting.js"></script>') |
bsw/jbe@19 | 126 end |
bsw/jbe@19 | 127 |
bsw/jbe@19 | 128 ui.script{ |
bsw/jbe@19 | 129 script = function() |
bsw/jbe@19 | 130 slot.put( |
bsw/jbe@19 | 131 "voting_text_approval_single = ", encode.json(_"Approval [single entry]"), ";\n", |
bsw/jbe@19 | 132 "voting_text_approval_multi = ", encode.json(_"Approval [many entries]"), ";\n", |
bsw/jbe@19 | 133 "voting_text_first_preference_single = ", encode.json(_"Approval (first preference) [single entry]"), ";\n", |
bsw/jbe@19 | 134 "voting_text_first_preference_multi = ", encode.json(_"Approval (first preference) [many entries]"), ";\n", |
bsw/jbe@19 | 135 "voting_text_second_preference_single = ", encode.json(_"Approval (second preference) [single entry]"), ";\n", |
bsw/jbe@19 | 136 "voting_text_second_preference_multi = ", encode.json(_"Approval (second preference) [many entries]"), ";\n", |
bsw/jbe@19 | 137 "voting_text_third_preference_single = ", encode.json(_"Approval (third preference) [single entry]"), ";\n", |
bsw/jbe@19 | 138 "voting_text_third_preference_multi = ", encode.json(_"Approval (third preference) [many entries]"), ";\n", |
bsw/jbe@19 | 139 "voting_text_numeric_preference_single = ", encode.json(_"Approval (#th preference) [single entry]"), ";\n", |
bsw/jbe@19 | 140 "voting_text_numeric_preference_multi = ", encode.json(_"Approval (#th preference) [many entries]"), ";\n", |
bsw/jbe@19 | 141 "voting_text_abstention_single = ", encode.json(_"Abstention [single entry]"), ";\n", |
bsw/jbe@19 | 142 "voting_text_abstention_multi = ", encode.json(_"Abstention [many entries]"), ";\n", |
bsw/jbe@19 | 143 "voting_text_disapproval_above_one_single = ", encode.json(_"Disapproval (prefer to lower block) [single entry]"), ";\n", |
bsw/jbe@19 | 144 "voting_text_disapproval_above_one_multi = ", encode.json(_"Disapproval (prefer to lower block) [many entries]"), ";\n", |
bsw/jbe@19 | 145 "voting_text_disapproval_above_many_single = ", encode.json(_"Disapproval (prefer to lower blocks) [single entry]"), ";\n", |
bsw/jbe@19 | 146 "voting_text_disapproval_above_many_multi = ", encode.json(_"Disapproval (prefer to lower blocks) [many entries]"), ";\n", |
bsw/jbe@19 | 147 "voting_text_disapproval_above_last_single = ", encode.json(_"Disapproval (prefer to last block) [single entry]"), ";\n", |
bsw/jbe@19 | 148 "voting_text_disapproval_above_last_multi = ", encode.json(_"Disapproval (prefer to last block) [many entries]"), ";\n", |
bsw/jbe@19 | 149 "voting_text_disapproval_single = ", encode.json(_"Disapproval [single entry]"), ";\n", |
bsw/jbe@19 | 150 "voting_text_disapproval_multi = ", encode.json(_"Disapproval [many entries]"), ";\n" |
bsw/jbe@19 | 151 ) |
bsw/jbe@19 | 152 end |
bsw/jbe@19 | 153 } |
bsw/jbe@5 | 154 |
bsw/jbe@5 | 155 ui.form{ |
bsw/jbe@19 | 156 attr = { |
bsw/jbe@19 | 157 id = "voting_form", |
bsw/jbe@19 | 158 class = readonly and "voting_form_readonly" or "voting_form_active" |
bsw/jbe@19 | 159 }, |
bsw/jbe@5 | 160 module = "vote", |
bsw/jbe@5 | 161 action = "update", |
bsw/jbe@5 | 162 params = { issue_id = issue.id }, |
bsw/jbe@5 | 163 routing = { |
bsw/jbe@5 | 164 default = { |
bsw/jbe@5 | 165 mode = "redirect", |
bsw/jbe@5 | 166 module = "issue", |
bsw/jbe@5 | 167 view = "show", |
bsw/jbe@5 | 168 id = issue.id |
bsw/jbe@5 | 169 } |
bsw/jbe@5 | 170 }, |
bsw/jbe@5 | 171 content = function() |
bsw/jbe@19 | 172 if not readonly then |
bsw/jbe@19 | 173 local scoring = param.get("scoring") |
bsw/jbe@19 | 174 if not scoring then |
bsw/jbe@19 | 175 for i, initiative in ipairs(initiatives) do |
bsw/jbe@19 | 176 local vote = initiative.vote |
bsw/jbe@19 | 177 if vote then |
bsw/jbe@19 | 178 tempvotings[initiative.id] = vote.grade |
bsw/jbe@19 | 179 end |
bsw/jbe@19 | 180 end |
bsw/jbe@19 | 181 local tempvotings_list = {} |
bsw/jbe@19 | 182 for key, val in pairs(tempvotings) do |
bsw/jbe@19 | 183 tempvotings_list[#tempvotings_list+1] = tostring(key) .. ":" .. tostring(val) |
bsw/jbe@19 | 184 end |
bsw/jbe@19 | 185 if #tempvotings_list > 0 then |
bsw/jbe@19 | 186 scoring = table.concat(tempvotings_list, ";") |
bsw/jbe@19 | 187 else |
bsw/jbe@19 | 188 scoring = "" |
bsw/jbe@19 | 189 end |
bsw/jbe@19 | 190 end |
bsw/jbe@19 | 191 slot.put('<input type="hidden" name="scoring" value="' .. scoring .. '"/>') |
bsw/jbe@19 | 192 -- TODO abstrahieren |
bsw/jbe@19 | 193 ui.tag{ |
bsw/jbe@19 | 194 tag = "input", |
bsw/jbe@19 | 195 attr = { |
bsw/jbe@19 | 196 type = "button", |
bsw/jbe@19 | 197 class = "voting_done", |
bsw/jbe@19 | 198 value = _"Finish voting" |
bsw/jbe@19 | 199 } |
bsw/jbe@5 | 200 } |
bsw/jbe@19 | 201 end |
bsw/jbe@5 | 202 ui.container{ |
bsw/jbe@5 | 203 attr = { id = "voting" }, |
bsw/jbe@5 | 204 content = function() |
bsw/jbe@19 | 205 local approval_index, disapproval_index = 0, 0 |
bsw/jbe@5 | 206 for grade = max_grade, min_grade, -1 do |
bsw/jbe@19 | 207 local entries = sections[grade] |
bsw/jbe@5 | 208 local class |
bsw/jbe@5 | 209 if grade > 0 then |
bsw/jbe@5 | 210 class = "approval" |
bsw/jbe@5 | 211 elseif grade < 0 then |
bsw/jbe@5 | 212 class = "disapproval" |
bsw/jbe@5 | 213 else |
bsw/jbe@5 | 214 class = "abstention" |
bsw/jbe@5 | 215 end |
bsw/jbe@19 | 216 if |
bsw/jbe@19 | 217 #entries > 0 or |
bsw/jbe@19 | 218 (grade == 1 and not approval_used) or |
bsw/jbe@19 | 219 (grade == -1 and not disapproval_used) or |
bsw/jbe@19 | 220 grade == 0 |
bsw/jbe@19 | 221 then |
bsw/jbe@19 | 222 ui.container{ |
bsw/jbe@19 | 223 attr = { class = class }, |
bsw/jbe@19 | 224 content = function() |
bsw/jbe@19 | 225 local heading |
bsw/jbe@19 | 226 if class == "approval" then |
bsw/jbe@19 | 227 approval_used = true |
bsw/jbe@19 | 228 approval_index = approval_index + 1 |
bsw/jbe@19 | 229 if approval_count > 1 then |
bsw/jbe@19 | 230 if approval_index == 1 then |
bsw/jbe@19 | 231 if #entries == 1 then |
bsw/jbe@19 | 232 heading = _"Approval (first preference) [single entry]" |
bsw/jbe@19 | 233 else |
bsw/jbe@19 | 234 heading = _"Approval (first preference) [many entries]" |
bsw/jbe@19 | 235 end |
bsw/jbe@19 | 236 elseif approval_index == 2 then |
bsw/jbe@19 | 237 if #entries == 1 then |
bsw/jbe@19 | 238 heading = _"Approval (second preference) [single entry]" |
bsw/jbe@19 | 239 else |
bsw/jbe@19 | 240 heading = _"Approval (second preference) [many entries]" |
bsw/jbe@19 | 241 end |
bsw/jbe@19 | 242 elseif approval_index == 3 then |
bsw/jbe@19 | 243 if #entries == 1 then |
bsw/jbe@19 | 244 heading = _"Approval (third preference) [single entry]" |
bsw/jbe@19 | 245 else |
bsw/jbe@19 | 246 heading = _"Approval (third preference) [many entries]" |
bsw/jbe@19 | 247 end |
bsw/jbe@19 | 248 else |
bsw/jbe@19 | 249 if #entries == 1 then |
bsw/jbe@19 | 250 heading = _"Approval (#th preference) [single entry]" |
bsw/jbe@19 | 251 else |
bsw/jbe@19 | 252 heading = _"Approval (#th preference) [many entries]" |
bsw/jbe@19 | 253 end |
bsw/jbe@19 | 254 end |
bsw/jbe@19 | 255 else |
bsw/jbe@19 | 256 if #entries == 1 then |
bsw/jbe@19 | 257 heading = _"Approval [single entry]" |
bsw/jbe@19 | 258 else |
bsw/jbe@19 | 259 heading = _"Approval [many entries]" |
bsw/jbe@19 | 260 end |
bsw/jbe@19 | 261 end |
bsw/jbe@19 | 262 elseif class == "abstention" then |
bsw/jbe@19 | 263 if #entries == 1 then |
bsw/jbe@19 | 264 heading = _"Abstention [single entry]" |
bsw/jbe@19 | 265 else |
bsw/jbe@19 | 266 heading = _"Abstention [many entries]" |
bsw/jbe@19 | 267 end |
bsw/jbe@19 | 268 elseif class == "disapproval" then |
bsw/jbe@19 | 269 disapproval_used = true |
bsw/jbe@19 | 270 disapproval_index = disapproval_index + 1 |
bsw/jbe@19 | 271 if disapproval_count > disapproval_index + 1 then |
bsw/jbe@19 | 272 if #entries == 1 then |
bsw/jbe@19 | 273 heading = _"Disapproval (prefer to lower blocks) [single entry]" |
bsw/jbe@19 | 274 else |
bsw/jbe@19 | 275 heading = _"Disapproval (prefer to lower blocks) [many entries]" |
bsw/jbe@19 | 276 end |
bsw/jbe@19 | 277 elseif disapproval_count == 2 and disapproval_index == 1 then |
bsw/jbe@19 | 278 if #entries == 1 then |
bsw/jbe@19 | 279 heading = _"Disapproval (prefer to lower block) [single entry]" |
bsw/jbe@19 | 280 else |
bsw/jbe@19 | 281 heading = _"Disapproval (prefer to lower block) [many entries]" |
bsw/jbe@19 | 282 end |
bsw/jbe@19 | 283 elseif disapproval_index == disapproval_count - 1 then |
bsw/jbe@19 | 284 if #entries == 1 then |
bsw/jbe@19 | 285 heading = _"Disapproval (prefer to last block) [single entry]" |
bsw/jbe@19 | 286 else |
bsw/jbe@19 | 287 heading = _"Disapproval (prefer to last block) [many entries]" |
bsw/jbe@19 | 288 end |
bsw/jbe@19 | 289 else |
bsw/jbe@19 | 290 if #entries == 1 then |
bsw/jbe@19 | 291 heading = _"Disapproval [single entry]" |
bsw/jbe@19 | 292 else |
bsw/jbe@19 | 293 heading = _"Disapproval [many entries]" |
bsw/jbe@6 | 294 end |
bsw/jbe@19 | 295 end |
bsw/jbe@19 | 296 end |
bsw/jbe@19 | 297 ui.tag { |
bsw/jbe@19 | 298 tag = "div", |
bsw/jbe@19 | 299 attr = { class = "cathead" }, |
bsw/jbe@19 | 300 content = heading |
bsw/jbe@19 | 301 } |
bsw/jbe@19 | 302 for i, initiative in ipairs(entries) do |
bsw/jbe@19 | 303 ui.container{ |
bsw/jbe@19 | 304 attr = { |
bsw/jbe@19 | 305 class = "movable", |
bsw/jbe@19 | 306 id = "entry_" .. tostring(initiative.id) |
bsw/jbe@19 | 307 }, |
bsw/jbe@19 | 308 content = function() |
bsw/jbe@19 | 309 local initiators_selector = initiative:get_reference_selector("initiating_members") |
bsw/jbe@19 | 310 :add_where("accepted") |
bsw/jbe@19 | 311 local initiators = initiators_selector:exec() |
bsw/jbe@19 | 312 local initiator_names = {} |
bsw/jbe@19 | 313 for i, initiator in ipairs(initiators) do |
bsw/jbe@19 | 314 initiator_names[#initiator_names+1] = initiator.name |
bsw/jbe@19 | 315 end |
bsw/jbe@19 | 316 local initiator_names_string = table.concat(initiator_names, ", ") |
bsw/jbe@19 | 317 ui.container{ |
bsw/jbe@19 | 318 attr = { style = "float: right;" }, |
bsw/jbe@19 | 319 content = function() |
bsw/jbe@19 | 320 ui.link{ |
bsw/jbe@19 | 321 attr = { class = "clickable" }, |
bsw/jbe@19 | 322 content = _"Show", |
bsw/jbe@19 | 323 module = "initiative", |
bsw/jbe@19 | 324 view = "show", |
bsw/jbe@19 | 325 id = initiative.id |
bsw/jbe@19 | 326 } |
bsw/jbe@19 | 327 slot.put(" ") |
bsw/jbe@19 | 328 ui.link{ |
bsw/jbe@19 | 329 attr = { class = "clickable", target = "_blank" }, |
bsw/jbe@19 | 330 content = _"(new window)", |
bsw/jbe@19 | 331 module = "initiative", |
bsw/jbe@19 | 332 view = "show", |
bsw/jbe@19 | 333 id = initiative.id |
bsw/jbe@19 | 334 } |
bsw/jbe@19 | 335 if not readonly then |
bsw/jbe@19 | 336 slot.put(" ") |
bsw/jbe@19 | 337 ui.image{ attr = { class = "grabber" }, static = "icons/grabber.png" } |
bsw/jbe@19 | 338 end |
bsw/jbe@19 | 339 end |
bsw/jbe@19 | 340 } |
bsw/jbe@19 | 341 if not readonly then |
bsw/jbe@19 | 342 ui.container{ |
bsw/jbe@19 | 343 attr = { style = "float: left;" }, |
bsw/jbe@19 | 344 content = function() |
bsw/jbe@19 | 345 ui.tag{ |
bsw/jbe@19 | 346 tag = "input", |
bsw/jbe@19 | 347 attr = { |
bsw/jbe@19 | 348 onclick = "voting_moveUp(this.parentNode.parentNode); return(false);", |
bsw/jbe@19 | 349 name = "move_up", |
bsw/jbe@19 | 350 value = initiative.id, |
bsw/jbe@19 | 351 class = not disabled and "clickable" or nil, |
bsw/jbe@19 | 352 type = "image", |
bsw/jbe@19 | 353 src = encode.url{ static = "icons/move_up.png" }, |
bsw/jbe@19 | 354 alt = _"Move up" |
bsw/jbe@19 | 355 } |
bsw/jbe@19 | 356 } |
bsw/jbe@19 | 357 slot.put(" ") |
bsw/jbe@19 | 358 ui.tag{ |
bsw/jbe@19 | 359 tag = "input", |
bsw/jbe@19 | 360 attr = { |
bsw/jbe@19 | 361 onclick = "voting_moveDown(this.parentNode.parentNode); return(false);", |
bsw/jbe@19 | 362 name = "move_down", |
bsw/jbe@19 | 363 value = initiative.id, |
bsw/jbe@19 | 364 class = not disabled and "clickable" or nil, |
bsw/jbe@19 | 365 type = "image", |
bsw/jbe@19 | 366 src = encode.url{ static = "icons/move_down.png" }, |
bsw/jbe@19 | 367 alt = _"Move down" |
bsw/jbe@19 | 368 } |
bsw/jbe@19 | 369 } |
bsw/jbe@19 | 370 slot.put(" ") |
bsw/jbe@19 | 371 end |
bsw/jbe@6 | 372 } |
bsw/jbe@6 | 373 end |
bsw/jbe@6 | 374 ui.container{ |
bsw/jbe@19 | 375 content = function() |
bsw/jbe@19 | 376 slot.put(encode.html(initiative.shortened_name)) |
bsw/jbe@19 | 377 if #initiators > 1 then |
bsw/jbe@19 | 378 ui.container{ |
bsw/jbe@19 | 379 attr = { style = "font-size: 80%;" }, |
bsw/jbe@19 | 380 content = _"Initiators" .. ": " .. initiator_names_string |
bsw/jbe@19 | 381 } |
bsw/jbe@19 | 382 else |
bsw/jbe@19 | 383 ui.container{ |
bsw/jbe@19 | 384 attr = { style = "font-size: 80%;" }, |
bsw/jbe@19 | 385 content = _"Initiator" .. ": " .. initiator_names_string |
bsw/jbe@19 | 386 } |
bsw/jbe@19 | 387 end |
bsw/jbe@19 | 388 end |
bsw/jbe@6 | 389 } |
bsw/jbe@6 | 390 end |
bsw/jbe@19 | 391 } |
bsw/jbe@19 | 392 end |
bsw/jbe@5 | 393 end |
bsw/jbe@19 | 394 } |
bsw/jbe@19 | 395 end |
bsw/jbe@5 | 396 end |
bsw/jbe@5 | 397 end |
bsw/jbe@5 | 398 } |
bsw/jbe@19 | 399 if not readonly then |
bsw/jbe@19 | 400 ui.tag{ |
bsw/jbe@19 | 401 tag = "input", |
bsw/jbe@19 | 402 attr = { |
bsw/jbe@19 | 403 type = "button", |
bsw/jbe@19 | 404 class = "voting_done", |
bsw/jbe@19 | 405 value = _"Finish voting" |
bsw/jbe@19 | 406 } |
bsw/jbe@5 | 407 } |
bsw/jbe@19 | 408 end |
bsw/jbe@5 | 409 end |
bsw/jbe@5 | 410 } |
bsw/jbe@5 | 411 |
bsw/jbe@5 | 412 |