| rev | line source | 
| bsw@1045 | 1 local issue = param.get("issue", "table") | 
| bsw@1045 | 2 local initiative = param.get("initiative", "table") | 
| bsw@1045 | 3 | 
| bsw@1045 | 4 local view_module | 
| bsw@1045 | 5 local view_id | 
| bsw@1045 | 6 | 
| bsw@1045 | 7 if initiative then | 
| bsw@1045 | 8   issue = initiative.issue | 
| bsw@1045 | 9   view_module = "initiative" | 
| bsw@1045 | 10   view_id = initiative.id | 
| bsw@1045 | 11 else | 
| bsw@1045 | 12   view_module = "issue" | 
| bsw@1045 | 13   view_id = issue.id | 
| bsw@1045 | 14 end | 
| bsw@1045 | 15 | 
| bsw@1045 | 16 ui.sidebar( "tab-whatcanido", function() | 
| bsw@1045 | 17 | 
| bsw@1045 | 18   ui.sidebarHead( function() | 
| bsw@1045 | 19     ui.heading{ level = 2, content = function() | 
| bsw@1045 | 20       ui.link{ | 
| bsw@1045 | 21         content = issue.name, | 
| bsw@1045 | 22         module = "issue", view = "show", id = issue.id | 
| bsw@1045 | 23       } | 
| bsw@1045 | 24     end } | 
| bsw@1045 | 25   end ) | 
| bsw@1045 | 26 | 
| bsw@1045 | 27   local current_occured = false | 
| bsw@1045 | 28   local failed = false | 
| bsw@1045 | 29 | 
| bsw@1045 | 30   for i, state in ipairs{ "admission", "discussion", "verification", "voting" } do | 
| bsw@1045 | 31     local current = state == issue.state | 
| bsw@1045 | 32 | 
| bsw@1045 | 33     if current then | 
| bsw@1045 | 34       current_occured = true | 
| bsw@1045 | 35     end | 
| bsw@1045 | 36 | 
| bsw@1045 | 37     local phase_success = ( | 
| bsw@1045 | 38       (state == "admission" and issue.accepted) | 
| bsw@1045 | 39         or (state == "discussion" and issue.half_frozen) | 
| bsw@1045 | 40         or (state == "verification" and issue.fully_frozen and issue.state ~= "canceled_no_initiative_admitted") | 
| bsw@1045 | 41         or (state == "voting" and issue.closed and issue.state ~= "canceled_no_initiative_admitted" and issue.state ~= "canceled_by_admin") | 
| bsw@1045 | 42     ) | 
| bsw@1045 | 43 | 
| bsw@1045 | 44     if not failed then | 
| bsw@1060 | 45       ui.link{ attr = { | 
| bsw@1060 | 46         onclick = "$('#phase-help-" .. state .. "').toggle();return false;", | 
| bsw@1060 | 47         class = "sidebarRow sidebarRowNarrow", | 
| bsw@1060 | 48       }, content = function() | 
| bsw@1045 | 49 | 
| bsw@1045 | 50         local state_names = { | 
| bsw@1045 | 51           admission = _"Admission", | 
| bsw@1045 | 52           discussion = _"Discussion", | 
| bsw@1045 | 53           verification = _"Verification", | 
| bsw@1045 | 54           voting = _"Voting" | 
| bsw@1045 | 55         } | 
| bsw@1045 | 56 | 
| bsw@1045 | 57         local state_name = "(" .. i .. ") " .. state_names[state] or state | 
| bsw@1045 | 58 | 
| bsw@1045 | 59         local function quorum_text(policy, quorum) | 
| bsw@1045 | 60           local num | 
| bsw@1045 | 61           local den | 
| bsw@1045 | 62 | 
| bsw@1045 | 63           if quorum == 1 then | 
| bsw@1045 | 64             num = policy.issue_quorum_num | 
| bsw@1045 | 65             den = policy.issue_quorum_den | 
| bsw@1045 | 66           elseif quorum == 2 then | 
| bsw@1045 | 67             num = policy.initiative_quorum_num | 
| bsw@1045 | 68             den = policy.initiative_quorum_den | 
| bsw@1045 | 69           end | 
| bsw@1045 | 70 | 
| bsw@1060 | 71           if num == nil or den == nil then | 
| bsw@1060 | 72             return 0 | 
| bsw@1060 | 73           end | 
| bsw@1060 | 74 | 
| bsw@1060 | 75           if den == 100 or den == 10 then | 
| bsw@1060 | 76             return _("#{percentage}%", { percentage = num * 100 / den }) | 
| bsw@1045 | 77           else | 
| bsw@1045 | 78             return num .. "/" .. den | 
| bsw@1045 | 79           end | 
| bsw@1045 | 80 | 
| bsw@1045 | 81         end | 
| bsw@1045 | 82 | 
| bsw@1045 | 83         local quorum | 
| bsw@1045 | 84         if state == "admission" then | 
| bsw@1045 | 85           quorum = quorum_text(issue.policy, 1) | 
| bsw@1045 | 86         elseif state == "verification" then | 
| bsw@1045 | 87           quorum = quorum_text(issue.policy, 2) | 
| bsw@1045 | 88         end | 
| bsw@1045 | 89 | 
| bsw@1045 | 90         if current then | 
| bsw@1045 | 91           local time_left | 
| bsw@1045 | 92           if issue.state_time_left:sub(1,1) ~= "-" then | 
| bsw@1045 | 93             time_left = format.interval_text(issue.state_time_left, { mode = "time_left" }) | 
| bsw@1045 | 94           else | 
| bsw@1045 | 95             time_left = "phase ends soon" | 
| bsw@1045 | 96           end | 
| bsw@1045 | 97 | 
| bsw@1045 | 98           ui.tag{ attr = { class = "right" }, | 
| bsw@1045 | 99             content = time_left | 
| bsw@1045 | 100           } | 
| bsw@1045 | 101         elseif current_occured then | 
| bsw@1045 | 102           local phase_duration = issue[state .. "_time"] | 
| bsw@1045 | 103           ui.tag{ attr = { class = "right" }, | 
| bsw@1045 | 104             content = _("#{duration}", { | 
| bsw@1045 | 105               duration = format.interval_text(phase_duration) | 
| bsw@1045 | 106             } ) | 
| bsw@1045 | 107           } | 
| bsw@1045 | 108         else | 
| bsw@1045 | 109           local text = "failed" | 
| bsw@1045 | 110           if quorum then | 
| bsw@1045 | 111             text = _("failed #{quorum}", { quorum = quorum }) | 
| bsw@1045 | 112           end | 
| bsw@1045 | 113           if phase_success then | 
| bsw@1060 | 114             if quorum == 0 then | 
| bsw@1060 | 115               text = _"without quorum" | 
| bsw@1060 | 116             elseif quorum then | 
| bsw@1045 | 117               text = _("reached #{quorum}", { quorum = quorum }) | 
| bsw@1045 | 118             else | 
| bsw@1045 | 119               text = _"finished" | 
| bsw@1045 | 120             end | 
| bsw@1045 | 121           elseif issue.state == "canceled_revoked_before_accepted" or | 
| bsw@1045 | 122               issue.state == "canceled_after_revocation_during_discussion" or | 
| bsw@1045 | 123               issue.state == "canceled_after_revocation_during_verification" | 
| bsw@1045 | 124           then | 
| bsw@1045 | 125             text = _"revoked" | 
| bsw@1045 | 126           elseif issue.state == "canceled_by_admin" then | 
| bsw@1045 | 127             text = _"canceled" | 
| bsw@1045 | 128           end | 
| bsw@1045 | 129 | 
| bsw@1045 | 130           ui.tag{ attr = { class = "right" }, | 
| bsw@1045 | 131             content = text | 
| bsw@1045 | 132           } | 
| bsw@1045 | 133         end | 
| bsw@1045 | 134 | 
| bsw@1045 | 135         ui.heading{ level = 3, content = function() | 
| bsw@1045 | 136           if current then | 
| bsw@1045 | 137             ui.image{ attr = { class = "icon16" }, static = "icons/32/phase_current.png" } | 
| bsw@1045 | 138           elseif not current_occured and not phase_success then | 
| bsw@1045 | 139             ui.image{ attr = { class = "icon16" }, static = "icons/32/phase_failed.png" } | 
| bsw@1045 | 140           elseif current_occured then | 
| bsw@1045 | 141             ui.image{ attr = { class = "icon16" }, static = "icons/32/empty.png" } | 
| bsw@1045 | 142           else | 
| bsw@1045 | 143             ui.image{ attr = { class = "icon16" }, static = "icons/32/phase_finished.png" } | 
| bsw@1045 | 144           end | 
| bsw@1045 | 145           slot.put(" ") | 
| bsw@1045 | 146           ui.tag{ content = state_name } | 
| bsw@1045 | 147         end } | 
| bsw@1060 | 148 | 
| bsw@1045 | 149         local help_texts = { | 
| bsw@1081 | 150           admission = _("As soon as one initiative of this issue reaches the 1st quorum of #{quorum} support, the issue will proceed to discussion phase.", { quorum = quorum_text(issue.policy, 1) }), | 
| bsw@1081 | 151           discussion = _"During the discussion phase, the issue is debated on while the initiators improve the proposals and reasons in their initiatives. Supporters of initiatives can write and rate suggestions for improvement.", | 
| bsw@1081 | 152           verification = _("During the verification phase, existing initiatives cannot be changed anymore. Initiatives need to pass the 2nd quorum of #{quorum} at end of verification phase to become admitted for voting.", { quorum = quorum_text(issue.policy, 2) }), | 
| bsw@1081 | 153           voting = _"During the voting phase, votes for all admitted initiatives in this issue can be cast. The final result will be calculated as soon as this phase ends." | 
| bsw@1045 | 154         } | 
| bsw@1060 | 155         ui.container { attr = { id = "phase-help-" .. state, style = "display: none;" }, content = help_texts[state] } | 
| bsw@1045 | 156 | 
| bsw@1060 | 157       end } | 
| bsw@1045 | 158     end | 
| bsw@1045 | 159 | 
| bsw@1045 | 160     if not phase_success and not current and not current_occured then | 
| bsw@1045 | 161       failed = true | 
| bsw@1045 | 162     end | 
| bsw@1045 | 163   end | 
| bsw@1045 | 164 | 
| bsw@1045 | 165   if issue.closed then | 
| bsw@1045 | 166     ui.sidebarSection( function() | 
| bsw@1045 | 167       ui.heading { level = 1, content = issue.state_name } | 
| bsw@1045 | 168     end ) | 
| bsw@1045 | 169     if issue.admin_notice then | 
| bsw@1045 | 170       ui.sidebarSection( function() | 
| bsw@1045 | 171         ui.heading { level = 3, content = _"Administrative notice:" } | 
| bsw@1045 | 172         slot.put(encode.html_newlines(issue.admin_notice)) | 
| bsw@1045 | 173       end ) | 
| bsw@1045 | 174     end | 
| bsw@1045 | 175   end | 
| bsw@1045 | 176 | 
| bsw@1045 | 177 end ) |