rev |
line source |
bsw/jbe@0
|
1 local issues_selector = param.get("issues_selector", "table")
|
bsw/jbe@0
|
2
|
bsw@51
|
3 if app.session.member_id then
|
bsw@51
|
4 issues_selector
|
bsw@51
|
5 :left_join("interest", "_interest", { "_interest.issue_id = issue.id AND _interest.member_id = ?", app.session.member.id} )
|
bsw@51
|
6 :add_field("(_interest.member_id NOTNULL)", "is_interested")
|
bsw@51
|
7 end
|
bsw@11
|
8
|
bsw/jbe@19
|
9 ui.add_partial_param_names{
|
bsw/jbe@19
|
10 "filter",
|
bsw/jbe@19
|
11 "filter_open",
|
bsw/jbe@19
|
12 "filter_voting",
|
bsw/jbe@19
|
13 "filter_interest",
|
bsw/jbe@19
|
14 "issue_list"
|
bsw/jbe@19
|
15 }
|
bsw/jbe@0
|
16
|
bsw/jbe@19
|
17 local filters = {}
|
bsw@10
|
18
|
bsw/jbe@19
|
19 filters[#filters+1] = {
|
bsw/jbe@19
|
20 label = _"Filter",
|
bsw/jbe@19
|
21 {
|
bsw/jbe@19
|
22 name = "open",
|
bsw/jbe@19
|
23 label = _"Open",
|
bsw/jbe@19
|
24 selector_modifier = function(selector)
|
bsw/jbe@19
|
25 selector:add_where("issue.closed ISNULL")
|
bsw/jbe@19
|
26 end
|
bsw/jbe@19
|
27 },
|
bsw/jbe@19
|
28 {
|
bsw/jbe@19
|
29 name = "new",
|
bsw/jbe@19
|
30 label = _"New",
|
bsw/jbe@19
|
31 selector_modifier = function(selector)
|
bsw/jbe@19
|
32 selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
|
bsw/jbe@19
|
33 end
|
bsw/jbe@19
|
34 },
|
bsw/jbe@19
|
35 {
|
bsw/jbe@19
|
36 name = "accepted",
|
bsw/jbe@19
|
37 label = _"In discussion",
|
bsw/jbe@19
|
38 selector_modifier = function(selector)
|
bsw/jbe@19
|
39 selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
|
bsw/jbe@19
|
40 end
|
bsw/jbe@19
|
41 },
|
bsw/jbe@19
|
42 {
|
bsw/jbe@19
|
43 name = "half_frozen",
|
bsw/jbe@19
|
44 label = _"Frozen",
|
bsw/jbe@19
|
45 selector_modifier = function(selector)
|
bsw/jbe@19
|
46 selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL")
|
bsw/jbe@19
|
47 end
|
bsw/jbe@19
|
48 },
|
bsw/jbe@19
|
49 {
|
bsw/jbe@19
|
50 name = "frozen",
|
bsw/jbe@19
|
51 label = _"Voting",
|
bsw/jbe@19
|
52 selector_modifier = function(selector)
|
bsw/jbe@19
|
53 selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
|
bsw/jbe@19
|
54 filter_voting = true
|
bsw/jbe@19
|
55 end
|
bsw/jbe@19
|
56 },
|
bsw/jbe@19
|
57 {
|
bsw/jbe@19
|
58 name = "finished",
|
bsw/jbe@19
|
59 label = _"Finished",
|
bsw/jbe@19
|
60 selector_modifier = function(selector)
|
bsw/jbe@19
|
61 selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL")
|
bsw/jbe@19
|
62 end
|
bsw/jbe@19
|
63 },
|
bsw/jbe@19
|
64 {
|
bsw/jbe@19
|
65 name = "cancelled",
|
bsw/jbe@19
|
66 label = _"Cancelled",
|
bsw/jbe@19
|
67 selector_modifier = function(selector)
|
bsw/jbe@52
|
68 selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL")
|
bsw/jbe@19
|
69 end
|
bsw/jbe@19
|
70 },
|
bsw/jbe@19
|
71 {
|
bsw/jbe@19
|
72 name = "any",
|
bsw/jbe@19
|
73 label = _"Any",
|
bsw/jbe@19
|
74 selector_modifier = function(selector) end
|
bsw/jbe@19
|
75 },
|
bsw/jbe@19
|
76 }
|
bsw/jbe@19
|
77
|
bsw/jbe@19
|
78
|
bsw@75
|
79 if app.session.member and param.get("filter") == "frozen" then
|
bsw/jbe@19
|
80 filters[#filters+1] = {
|
bsw/jbe@19
|
81 label = _"Filter",
|
bsw/jbe@19
|
82 name = "filter_voting",
|
bsw@2
|
83 {
|
bsw/jbe@19
|
84 name = "any",
|
bsw/jbe@19
|
85 label = _"Any",
|
bsw/jbe@19
|
86 selector_modifier = function() end
|
bsw@2
|
87 },
|
bsw/jbe@0
|
88 {
|
bsw/jbe@19
|
89 name = "not_voted",
|
bsw/jbe@19
|
90 label = _"Not voted",
|
bsw/jbe@19
|
91 selector_modifier = function(selector)
|
bsw/jbe@19
|
92 selector:left_join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id })
|
bsw/jbe@19
|
93 selector:add_where("direct_voter.member_id ISNULL")
|
bsw@2
|
94 end
|
bsw@2
|
95 },
|
bsw@2
|
96 {
|
bsw/jbe@19
|
97 name = "voted",
|
bsw/jbe@19
|
98 label = _"Voted",
|
bsw/jbe@19
|
99 selector_modifier = function(selector)
|
bsw/jbe@19
|
100 selector:join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id })
|
bsw@2
|
101 end
|
bsw@2
|
102 },
|
bsw/jbe@19
|
103 }
|
bsw/jbe@19
|
104 end
|
bsw/jbe@19
|
105
|
bsw/jbe@19
|
106
|
bsw/jbe@19
|
107 filters[#filters+1] = {
|
bsw/jbe@19
|
108 label = _"Filter",
|
bsw/jbe@19
|
109 name = "filter_interest",
|
bsw/jbe@19
|
110 {
|
bsw/jbe@19
|
111 name = "any",
|
bsw/jbe@19
|
112 label = _"Any",
|
bsw/jbe@19
|
113 selector_modifier = function() end
|
bsw/jbe@19
|
114 },
|
bsw/jbe@19
|
115 {
|
bsw/jbe@19
|
116 name = "my",
|
bsw/jbe@19
|
117 label = _"Interested",
|
bsw/jbe@19
|
118 selector_modifier = function(selector)
|
bsw/jbe@19
|
119 selector:join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", app.session.member.id })
|
bsw/jbe@19
|
120 end
|
bsw/jbe@19
|
121 },
|
bsw/jbe@19
|
122 {
|
bsw/jbe@19
|
123 name = "supported",
|
bsw/jbe@19
|
124 label = _"Supported",
|
bsw/jbe@19
|
125 selector_modifier = function(selector)
|
bsw/jbe@19
|
126 selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN opinion ON opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)) WHERE initiative.issue_id = issue.id AND opinion.member_id ISNULL LIMIT 1)", app.session.member.id, app.session.member.id })
|
bsw/jbe@19
|
127 end
|
bsw/jbe@19
|
128 },
|
bsw/jbe@19
|
129 {
|
bsw/jbe@19
|
130 name = "potentially_supported",
|
bsw/jbe@19
|
131 label = _"Potential supported",
|
bsw/jbe@19
|
132 selector_modifier = function(selector)
|
bsw/jbe@19
|
133 selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? JOIN opinion ON opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)) WHERE initiative.issue_id = issue.id LIMIT 1)", app.session.member.id, app.session.member.id })
|
bsw/jbe@19
|
134 end
|
bsw/jbe@19
|
135 },
|
bsw/jbe@19
|
136 {
|
bsw/jbe@19
|
137 name = "initiated",
|
bsw/jbe@19
|
138 label = _"Initiated",
|
bsw/jbe@19
|
139 selector_modifier = function(selector)
|
bsw/jbe@19
|
140 selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN initiator ON initiator.initiative_id = initiative.id AND initiator.member_id = ? WHERE initiative.issue_id = issue.id)", app.session.member.id })
|
bsw/jbe@19
|
141 end
|
bsw/jbe@19
|
142 },
|
bsw/jbe@19
|
143 }
|
bsw/jbe@19
|
144
|
bsw/jbe@19
|
145 if not param.get("no_sort", atom.boolean) then
|
bsw/jbe@19
|
146 filters[#filters+1] = {
|
bsw/jbe@19
|
147 label = _"Order by",
|
bsw/jbe@19
|
148 name = "issue_list",
|
bsw@2
|
149 {
|
bsw/jbe@19
|
150 name = "max_potential_support",
|
bsw/jbe@19
|
151 label = _"Max potential support",
|
bsw/jbe@19
|
152 selector_modifier = function(selector)
|
bsw/jbe@19
|
153 selector:add_order_by("(SELECT max(supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC")
|
bsw@2
|
154 end
|
bsw@2
|
155 },
|
bsw@2
|
156 {
|
bsw/jbe@19
|
157 name = "max_support",
|
bsw/jbe@19
|
158 label = _"Max support",
|
bsw/jbe@19
|
159 selector_modifier = function(selector)
|
bsw/jbe@19
|
160 selector:add_order_by("(SELECT max(satisfied_supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC")
|
bsw/jbe@19
|
161 end
|
bsw/jbe@19
|
162 },
|
bsw/jbe@19
|
163 {
|
bsw/jbe@19
|
164 name = "population",
|
bsw/jbe@19
|
165 label = _"Population",
|
bsw/jbe@19
|
166 selector_modifier = function(selector)
|
bsw/jbe@19
|
167 selector:add_order_by("issue.population DESC")
|
bsw/jbe@19
|
168 end
|
bsw/jbe@19
|
169 },
|
bsw/jbe@19
|
170 {
|
bsw/jbe@19
|
171 name = "newest",
|
bsw/jbe@19
|
172 label = _"Newest",
|
bsw/jbe@19
|
173 selector_modifier = function(selector)
|
bsw/jbe@19
|
174 selector:add_order_by("issue.created DESC")
|
bsw@2
|
175 end
|
bsw@2
|
176 },
|
bsw/jbe@19
|
177 {
|
bsw/jbe@19
|
178 name = "oldest",
|
bsw/jbe@19
|
179 label = _"Oldest",
|
bsw/jbe@19
|
180 selector_modifier = function(selector)
|
bsw/jbe@19
|
181 selector:add_order_by("issue.created")
|
bsw/jbe@19
|
182 end
|
bsw/jbe@19
|
183 }
|
bsw/jbe@19
|
184 }
|
bsw/jbe@19
|
185 end
|
bsw/jbe@19
|
186
|
bsw/jbe@19
|
187 filters.content = function()
|
bsw/jbe@19
|
188 local ui_paginate = ui.paginate
|
bsw/jbe@19
|
189 if param.get("per_page") == "all" then
|
bsw/jbe@19
|
190 ui_paginate = function(args) args.content() end
|
bsw/jbe@19
|
191 end
|
bsw/jbe@19
|
192 ui_paginate{
|
bsw/jbe@19
|
193 per_page = tonumber(param.get("per_page")),
|
bsw/jbe@19
|
194 selector = issues_selector,
|
bsw/jbe@19
|
195 content = function()
|
bsw/jbe@19
|
196 local highlight_string = param.get("highlight_string", "string")
|
bsw/jbe@19
|
197 local issues = issues or issues_selector:exec()
|
bsw/jbe@19
|
198 -- issues:load(initiatives)
|
bsw/jbe@19
|
199 ui.list{
|
bsw/jbe@19
|
200 attr = { class = "issues" },
|
bsw/jbe@19
|
201 records = issues,
|
bsw/jbe@19
|
202 columns = {
|
bsw/jbe@19
|
203 {
|
bsw/jbe@19
|
204 label = _"Issue",
|
bsw/jbe@19
|
205 content = function(record)
|
bsw/jbe@19
|
206 if not param.get("for_area_list", atom.boolean) then
|
bsw/jbe@19
|
207 ui.field.text{
|
bsw/jbe@19
|
208 value = record.area.name
|
bsw/jbe@19
|
209 }
|
bsw/jbe@19
|
210 slot.put("<br />")
|
bsw@11
|
211 end
|
bsw/jbe@19
|
212 if record.is_interested then
|
bsw/jbe@19
|
213 local label = _"You are interested in this issue",
|
bsw/jbe@19
|
214 ui.image{
|
bsw/jbe@19
|
215 attr = { alt = label, title = label },
|
bsw/jbe@19
|
216 static = "icons/16/eye.png"
|
bsw/jbe@5
|
217 }
|
bsw/jbe@19
|
218 slot.put(" ")
|
bsw/jbe@19
|
219 end
|
bsw/jbe@19
|
220 ui.link{
|
bsw/jbe@19
|
221 text = _("Issue ##{id}", { id = tostring(record.id) }),
|
bsw/jbe@19
|
222 module = "issue",
|
bsw/jbe@19
|
223 view = "show",
|
bsw/jbe@19
|
224 id = record.id
|
bsw/jbe@19
|
225 }
|
bsw/jbe@19
|
226 if record.state == "new" then
|
bsw/jbe@19
|
227 ui.image{
|
bsw/jbe@19
|
228 static = "icons/16/new.png"
|
bsw/jbe@5
|
229 }
|
bsw/jbe@5
|
230 end
|
bsw/jbe@19
|
231 slot.put("<br />")
|
bsw/jbe@19
|
232 slot.put("<br />")
|
bsw/jbe@19
|
233 if record.old_state then
|
bsw/jbe@19
|
234 ui.field.text{ value = format.time(record.sort) }
|
bsw/jbe@19
|
235 ui.field.text{ value = Issue:get_state_name_for_state(record.old_state) .. " > " .. Issue:get_state_name_for_state(record.new_state) }
|
bsw/jbe@19
|
236 else
|
bsw/jbe@19
|
237 end
|
bsw/jbe@19
|
238 end
|
bsw/jbe@19
|
239 },
|
bsw/jbe@19
|
240 {
|
bsw/jbe@19
|
241 label = _"State",
|
bsw/jbe@19
|
242 content = function(record)
|
bsw/jbe@19
|
243 if record.state == "voting" then
|
bsw/jbe@19
|
244 ui.link{
|
bsw/jbe@19
|
245 content = _"Voting",
|
bsw/jbe@19
|
246 module = "vote",
|
bsw/jbe@19
|
247 view = "list",
|
bsw/jbe@19
|
248 params = { issue_id = record.id }
|
bsw/jbe@19
|
249 }
|
bsw/jbe@19
|
250 else
|
bsw/jbe@19
|
251 ui.field.issue_state{ value = record.state }
|
bsw/jbe@19
|
252 end
|
bsw/jbe@19
|
253 end
|
bsw/jbe@19
|
254 },
|
bsw/jbe@19
|
255 {
|
bsw/jbe@19
|
256 label = _"Initiatives",
|
bsw/jbe@19
|
257 content = function(record)
|
bsw/jbe@19
|
258 local initiatives_selector = record:get_reference_selector("initiatives")
|
bsw/jbe@19
|
259 local highlight_string = param.get("highlight_string")
|
bsw/jbe@19
|
260 if highlight_string then
|
bsw/jbe@19
|
261 initiatives_selector:add_field( {'"highlight"("initiative"."name", ?)', highlight_string }, "name_highlighted")
|
bsw/jbe@19
|
262 end
|
bsw/jbe@19
|
263 execute.view{
|
bsw/jbe@19
|
264 module = "initiative",
|
bsw/jbe@19
|
265 view = "_list",
|
bsw/jbe@19
|
266 params = {
|
bsw/jbe@19
|
267 issue = record,
|
bsw/jbe@19
|
268 initiatives_selector = initiatives_selector,
|
bsw/jbe@19
|
269 highlight_string = highlight_string,
|
bsw@51
|
270 per_page = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3,
|
bsw/jbe@19
|
271 no_sort = true,
|
bsw@51
|
272 limit = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3
|
bsw/jbe@19
|
273 }
|
bsw/jbe@19
|
274 }
|
bsw/jbe@19
|
275 end
|
bsw/jbe@19
|
276 },
|
bsw/jbe@0
|
277 }
|
bsw/jbe@19
|
278 }
|
bsw/jbe@19
|
279 end
|
bsw/jbe@19
|
280 }
|
bsw/jbe@19
|
281 end
|
bsw/jbe@19
|
282
|
bsw/jbe@19
|
283 filters.selector = issues_selector
|
bsw/jbe@19
|
284 filters.label = _"Change filters and order"
|
bsw/jbe@19
|
285
|
bsw/jbe@19
|
286 if param.get("no_filter", atom.boolean) then
|
bsw/jbe@19
|
287 filters.content()
|
bsw/jbe@19
|
288 else
|
bsw/jbe@19
|
289 ui.filters(filters)
|
bsw/jbe@19
|
290 end
|
bsw/jbe@19
|
291
|
bsw/jbe@19
|
292 if param.get("legend", atom.boolean) ~= false then
|
bsw/jbe@19
|
293 local filter = param.get_all_cgi().filter
|
bsw/jbe@19
|
294 if not filter or filter == "any" or filter ~= "finished" then
|
bsw/jbe@19
|
295 ui.bargraph_legend{
|
bsw/jbe@19
|
296 width = 25,
|
bsw/jbe@19
|
297 bars = {
|
bsw/jbe@19
|
298 { color = "#0a0", label = _"Supporter" },
|
bsw/jbe@19
|
299 { color = "#777", label = _"Potential supporter" },
|
bsw/jbe@19
|
300 { color = "#ddd", label = _"No support at all" },
|
bsw/jbe@19
|
301 }
|
bsw/jbe@0
|
302 }
|
bsw/jbe@0
|
303 end
|
bsw/jbe@19
|
304 if not filter or filter == "any" or filter == "finished" then
|
bsw/jbe@19
|
305 ui.bargraph_legend{
|
bsw/jbe@19
|
306 width = 25,
|
bsw/jbe@19
|
307 bars = {
|
bsw/jbe@19
|
308 { color = "#0a0", label = _"Yes" },
|
bsw/jbe@19
|
309 { color = "#aaa", label = _"Abstention" },
|
bsw/jbe@19
|
310 { color = "#a00", label = _"No" },
|
bsw/jbe@19
|
311 }
|
bsw/jbe@19
|
312 }
|
bsw/jbe@19
|
313 end
|
bsw/jbe@19
|
314 end
|
bsw/jbe@19
|
315
|