liquid_feedback_frontend

view app/main/issue/_sidebar_state.lua @ 1245:9578cef4018a

More readable phase duration in issue sidebar
author bsw
date Wed Jan 27 11:16:26 2016 +0100 (2016-01-27)
parents b18e198c2624
children 32cc544d5a5b
line source
1 local issue = param.get("issue", "table")
2 local initiative = param.get("initiative", "table")
4 local view_module
5 local view_id
7 if initiative then
8 issue = initiative.issue
9 view_module = "initiative"
10 view_id = initiative.id
11 else
12 view_module = "issue"
13 view_id = issue.id
14 end
16 ui.sidebar( "tab-whatcanido", function()
18 ui.sidebarHead( function()
19 ui.heading{ level = 2, content = function()
20 ui.link{
21 content = issue.name,
22 module = "issue", view = "show", id = issue.id
23 }
24 end }
25 end )
27 local current_occured = false
28 local failed = false
30 for i, state in ipairs{ "admission", "discussion", "verification", "voting" } do
31 local current = state == issue.state
33 if current then
34 current_occured = true
35 end
37 local phase_success = (
38 (state == "admission" and issue.accepted)
39 or (state == "discussion" and issue.half_frozen)
40 or (state == "verification" and issue.fully_frozen and issue.state ~= "canceled_no_initiative_admitted")
41 or (state == "voting" and issue.closed and issue.state ~= "canceled_no_initiative_admitted" and issue.state ~= "canceled_by_admin")
42 )
44 if not failed then
45 ui.link{ attr = {
46 onclick = "$('#phase-help-" .. state .. "').toggle();return false;",
47 class = "sidebarRow sidebarRowNarrow",
48 }, content = function()
50 local state_names = {
51 admission = _"Admission",
52 discussion = _"Discussion",
53 verification = _"Verification",
54 voting = _"Voting"
55 }
57 local state_name = "(" .. i .. ") " .. state_names[state] or state
59 local function quorum_text(policy, quorum)
60 local num
61 local den
63 if quorum == 1 then
64 num = policy.issue_quorum_num
65 den = policy.issue_quorum_den
66 elseif quorum == 2 then
67 num = policy.initiative_quorum_num
68 den = policy.initiative_quorum_den
69 end
71 if num == nil or den == nil then
72 return 0
73 end
75 if den == 100 or den == 10 then
76 return _("#{percentage}%", { percentage = num * 100 / den })
77 else
78 return num .. "/" .. den
79 end
81 end
83 local quorum
84 if state == "admission" then
85 quorum = quorum_text(issue.policy, 1)
86 elseif state == "verification" then
87 quorum = quorum_text(issue.policy, 2)
88 end
90 if current then
91 local time_left
92 if issue.state_time_left:sub(1,1) ~= "-" then
93 time_left = format.interval_text(issue.state_time_left, { mode = "time_left" })
94 else
95 time_left = "phase ends soon"
96 end
98 ui.tag{ attr = { class = "right" },
99 content = time_left
100 }
101 elseif current_occured then
102 local phase_duration = issue[state .. "_time_text"]
103 ui.tag{ attr = { class = "right" },
104 content = _("#{duration}", {
105 duration = format.interval_text(phase_duration)
106 } )
107 }
108 else
109 local text = "failed"
110 if quorum then
111 text = _("failed #{quorum}", { quorum = quorum })
112 end
113 if phase_success then
114 if quorum == 0 then
115 text = _"without quorum"
116 elseif quorum then
117 text = _("reached #{quorum}", { quorum = quorum })
118 else
119 text = _"finished"
120 end
121 elseif issue.state == "canceled_revoked_before_accepted" or
122 issue.state == "canceled_after_revocation_during_discussion" or
123 issue.state == "canceled_after_revocation_during_verification"
124 then
125 text = _"revoked"
126 elseif issue.state == "canceled_by_admin" then
127 text = _"canceled"
128 end
130 ui.tag{ attr = { class = "right" },
131 content = text
132 }
133 end
135 ui.heading{ level = 3, content = function()
136 if current then
137 ui.image{ attr = { class = "icon16" }, static = "icons/32/phase_current.png" }
138 elseif not current_occured and not phase_success then
139 ui.image{ attr = { class = "icon16" }, static = "icons/32/phase_failed.png" }
140 elseif current_occured then
141 ui.image{ attr = { class = "icon16" }, static = "icons/32/empty.png" }
142 else
143 ui.image{ attr = { class = "icon16" }, static = "icons/32/phase_finished.png" }
144 end
145 slot.put(" ")
146 ui.tag{ content = state_name }
147 end }
149 local help_texts = {
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) }),
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.",
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) }),
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."
154 }
155 ui.container { attr = { id = "phase-help-" .. state, style = "display: none;" }, content = help_texts[state] }
157 end }
158 end
160 if not phase_success and not current and not current_occured then
161 failed = true
162 end
163 end
165 if issue.closed then
166 ui.sidebarSection( function()
167 ui.heading { level = 1, content = issue.state_name }
168 end )
169 end
171 if issue.admin_notice then
172 ui.sidebarSection( function()
173 ui.heading { level = 3, content = _"Administrative notice:" }
174 slot.put(encode.html_newlines(issue.admin_notice))
175 end )
176 end
177 end )

Impressum / About Us