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