liquid_feedback_frontend

view app/main/issue/_list2.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 851d4710452f
line source
1 local for_member = param.get ( "for_member", "table" )
2 local for_unit = param.get ( "for_unit", "table" )
3 local for_area = param.get ( "for_area", "table" )
4 local for_issue = param.get ( "for_issue", "table" )
5 local for_initiative = param.get ( "for_initiative", "table" )
6 local for_sidebar = param.get("for_sidebar", atom.boolean)
7 local no_filter = param.get ( "no_filter", atom.boolean )
8 local search = param.get ( "search" )
10 local limit = 25
12 local mode = request.get_param{ name = "mode" } or "issue"
14 if for_initiative or for_issue or for_member then
15 mode = "timeline"
16 end
18 local selector
20 if search then
22 selector = Issue:get_search_selector(search)
25 elseif mode == "timeline" then
27 local event_max_id = request.get_param_strings()["event_max_id"]
29 selector = Event:new_selector()
30 :add_order_by("event.id DESC")
31 :join("issue", nil, "issue.id = event.issue_id")
32 :add_field("now() - event.occurrence", "time_ago")
33 :limit(limit + 1)
35 if event_max_id then
36 selector:add_where{ "event.id < ?", event_max_id }
37 end
39 if for_member then
40 selector:add_where{ "event.member_id = ?", for_member.id }
41 end
43 if for_initiative then
44 selector:add_where{ "event.initiative_id = ?", for_initiative.id }
45 end
48 elseif mode == "issue" then
50 selector = Issue:new_selector()
52 end
54 if for_unit then
55 selector:join("area", nil, "area.id = issue.area_id")
56 selector:add_where{ "area.unit_id = ?", for_unit.id }
57 elseif for_area then
58 selector:add_where{ "issue.area_id = ?", for_area.id }
59 elseif for_issue then
60 selector:add_where{ "issue.id = ?", for_issue.id }
61 end
63 if not search and app.session.member_id then
64 selector
65 :left_join("interest", "_interest", {
66 "_interest.issue_id = issue.id AND _interest.member_id = ?", app.session.member.id
67 } )
68 :add_field("(_interest.member_id NOTNULL)", "is_interested")
69 :left_join("delegating_interest_snapshot", "_delegating_interest", { [[
70 _delegating_interest.issue_id = issue.id AND
71 _delegating_interest.member_id = ? AND
72 _delegating_interest.event = issue.latest_snapshot_event
73 ]], app.session.member.id } )
74 :add_field("_delegating_interest.delegate_member_ids[1]", "is_interested_by_delegation_to_member_id")
75 :add_field("_delegating_interest.delegate_member_ids[array_upper(_delegating_interest.delegate_member_ids, 1)]", "is_interested_via_member_id")
76 :add_field("array_length(_delegating_interest.delegate_member_ids, 1)", "delegation_chain_length")
77 end
79 local function doit()
81 local last_event_id
83 local items = selector:exec()
85 if #items < 1 then
86 ui.section( function()
87 ui.sectionRow( function()
88 ui.heading{ level = 2, content = _"No results for this selection" }
89 end )
90 end )
91 return
92 end
94 local row_class = "sectionRow"
95 if for_sidebar then
96 row_class = "sidebarRow"
97 end
99 if mode == "timeline" then
100 local issues = items:load ( "issue" )
101 local initiative = items:load ( "initiative" )
102 items:load ( "suggestion" )
103 items:load ( "member" )
104 issues:load_everything_for_member_id ( app.session.member_id )
105 initiative:load_everything_for_member_id ( app.session.member_id )
106 elseif mode == "issue" then
107 items:load_everything_for_member_id ( app.session.member_id )
108 end
110 local class = "section"
111 if mode == "timeline" then
112 class = class .. " events"
113 elseif mode == "issue" then
114 class = class .. " issues"
115 end
117 ui.container{ attr = { class = class }, content = function()
119 local last_event_date
120 for i, item in ipairs(items) do
121 local event
122 local issue
123 if mode == "timeline" then
124 event = item
125 issue = item.issue
126 elseif mode == "issue" then
127 event = {}
128 issue = item
129 end
131 last_event_id = event.id
133 local class = "event " .. row_class
134 if event.suggestion_id then
135 class = class .. " suggestion"
136 end
138 ui.container{ attr = { class = class }, content = function()
139 local event_name
140 local negative_event = false
142 local days_ago_text
144 if mode == "timeline" then
145 event_name = event.event_name
147 if event.event == "issue_state_changed" then
148 if event.state == "discussion" then
149 event_name = _"Discussion started"
150 elseif event.state == "verification" then
151 event_name = _"Verification started"
152 elseif event.state == "voting" then
153 event_name = _"Voting started"
154 elseif event.state == "finished_with_winner" then
155 event_name = event.state_name
156 elseif event.state == "finished_without_winner" then
157 event_name = event.state_name
158 negative_event = true
159 else
160 event_name = event.state_name
161 negative_event = true
162 end
163 elseif event.event == "initiative_revoked" then
164 negative_event = true
165 end
167 if event.time_ago == 0 then
168 days_ago_text = _("today at #{time}", { time = format.time(event.occurrence) })
169 elseif event.time_ago == 1 then
170 days_ago_text = _("yesterday at #{time}", { time = format.time(event.occurrence) })
171 else
172 days_ago_text = _("#{interval} ago", { interval = format.interval_text ( event.time_ago ) } )
173 end
175 elseif mode == "issue" then
176 event_name = issue.state_name
177 if issue.state_time_left:sub(1,1) ~= "-" then
178 days_ago_text = _( "#{interval} left", {
179 interval = format.interval_text ( issue.state_time_left )
180 })
181 elseif issue.closed then
182 days_ago_text = _( "#{interval} ago", {
183 interval = format.interval_text ( issue.closed_ago )
184 })
185 else
186 days_ago_text = _"phase ends soon"
187 end
188 if issue.closed and not issue.fully_frozen then
189 negative_event = true
190 end
191 if issue.state == "finished_without_winner" then
192 negative_event = true
193 end
194 if issue.state == "canceled_no_initiative_admitted" then
195 negative_event = true
196 end
197 if issue.state == "canceled_by_admin" then
198 negative_event = true
199 end
200 end
202 local class= "event_info"
204 if negative_event then
205 class = class .. " negative"
206 end
208 if mode == "timeline" then
209 ui.container{ attr = { class = class }, content = function ()
210 ui.tag { content = event_name }
211 slot.put ( " " )
212 ui.tag{ attr = { class = "event_time" }, content = days_ago_text }
213 end }
214 end
216 if not for_issue and not for_initiative then
217 ui.container{ attr = { class = "issue_context" }, content = function()
218 ui.link{
219 module = "unit", view = "show", id = issue.area.unit_id,
220 attr = { class = "unit" }, text = issue.area.unit.name
221 }
222 slot.put ( " " )
223 ui.link{
224 module = "area", view = "show", id = issue.area_id,
225 attr = { class = "area" }, text = issue.area.name
226 }
227 slot.put ( " " )
228 execute.view{
229 module = "delegation", view = "_info", params = {
230 issue = issue, member = for_member
231 }
232 }
233 end }
234 ui.container{ attr = { class = "issue_info" }, content = function()
235 ui.link{
236 attr = { class = "issue" },
237 text = _("#{policy} ##{id}", { policy = issue.policy.name, id = issue.id }),
238 module = "issue",
239 view = "show",
240 id = issue.id
241 }
243 end }
244 end
246 if mode ~= "timeline"
247 or event.state == "finished_with_winner"
248 or event.state == "finished_without_winner"
249 then
250 local initiative = issue.initiatives[1]
251 if initiative then
252 util.initiative_pie(initiative)
253 end
254 end
256 if mode == "issue" then
257 ui.container{ attr = { class = class }, content = function ()
258 ui.tag { content = event_name }
259 slot.put ( " " )
260 ui.tag{ attr = { class = "event_time" }, content = days_ago_text }
261 end }
262 elseif mode == "timeline"
263 and not for_issue
264 and event.event ~= "issue_state_changed"
265 then
266 slot.put("<br />")
267 end
269 if event.suggestion_id then
270 ui.container{ attr = { class = "suggestion" }, content = function()
271 ui.link{
272 text = format.string(event.suggestion.name, {
273 truncate_at = 160, truncate_suffix = true
274 }),
275 module = "initiative", view = "show", id = event.initiative.id,
276 params = { suggestion_id = event.suggestion_id },
277 anchor = "s" .. event.suggestion_id
278 }
279 end }
280 end
282 if not for_initiative and (not for_issue or event.initiative_id) then
284 ui.container{ attr = { class = "initiative_list" }, content = function()
285 if event.initiative_id then
286 local initiative = event.initiative
288 execute.view{ module = "initiative", view = "_list", params = {
289 issue = issue,
290 initiative = initiative,
291 for_event = mode == "timeline" and not (event.state == issue.state)
293 } }
294 else
295 local initiatives = issue.initiatives
296 execute.view{ module = "initiative", view = "_list", params = {
297 issue = issue,
298 initiatives = initiatives,
299 for_event = mode == "timeline" and not (event.state == issue.state)
300 } }
301 end
302 end }
303 end
305 end }
306 end
308 if mode == "timeline" then
309 if for_sidebar then
310 ui.container { attr = { class = row_class }, content = function ()
311 ui.link{
312 attr = { class = "moreLink" },
313 text = _"Show full history",
314 module = "initiative", view = "history", id = for_initiative.id
315 }
316 end }
317 elseif #items > limit then
318 ui.container { attr = { class = row_class }, content = function ()
319 local params = request.get_param_strings()
320 ui.link{
321 attr = { class = "moreLink" },
322 text = _"Show older events",
323 module = request.get_module(),
324 view = request.get_view(),
325 id = for_unit and for_unit.id or for_area and for_area.id or for_issue and for_issue.id or for_member and for_member.id,
326 params = {
327 mode = "timeline",
328 event_max_id = last_event_id,
329 tab = params["tab"],
330 phase = params["phase"],
331 closed = params["closed"]
332 }
333 }
334 end }
335 elseif #items < 1 then
336 ui.container { attr = { class = row_class }, content = _"No more events available" }
337 end
338 end
340 end }
342 end
345 local filters = {}
347 if not for_initiative and not for_issue and not no_filter then
348 filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = {
349 for_events = mode == "timeline" and true or false,
350 member = app.session.member,
351 for_member = for_member,
352 state = for_state,
353 for_unit = for_unit and true or false,
354 for_area = for_area and true or false
355 }}
356 end
358 filters.opened = true
359 filters.selector = selector
361 if mode == "timeline" then
362 filters.content = doit
363 else
364 filters.content = function()
365 ui.paginate{
366 selector = selector,
367 per_page = 25,
368 content = doit
369 }
370 end
371 end
373 ui.filters(filters)

Impressum / About Us