rev |
line source |
bsw/jbe@4
|
1
|
bsw/jbe@4
|
2 local initiative = param.get("initiative", "table")
|
bsw/jbe@0
|
3 local suggestions_selector = param.get("suggestions_selector", "table")
|
bsw/jbe@19
|
4 local tab_id = param.get("tab_id")
|
bsw/jbe@19
|
5 local show_name = param.get("show_name", atom.boolean)
|
bsw/jbe@19
|
6 if show_name == nil then
|
bsw/jbe@19
|
7 show_name = true
|
bsw/jbe@19
|
8 end
|
bsw/jbe@19
|
9 local show_filter = param.get("show_filter", atom.boolean)
|
bsw/jbe@19
|
10 if show_filter == nil then
|
bsw/jbe@19
|
11 show_filter = true
|
bsw/jbe@19
|
12 end
|
bsw/jbe@0
|
13
|
bsw/jbe@19
|
14 local partial = {
|
bsw/jbe@19
|
15 routing = {
|
bsw/jbe@19
|
16 default = {
|
bsw/jbe@19
|
17 mode = "redirect",
|
bsw/jbe@19
|
18 module = "initiative",
|
bsw/jbe@19
|
19 view = "show_tab",
|
bsw/jbe@19
|
20 params = {
|
bsw/jbe@19
|
21 initiative_id = initiative.id,
|
bsw/jbe@19
|
22 tab = "suggestions",
|
bsw/jbe@19
|
23 tab_id = tab_id
|
bsw/jbe@19
|
24 },
|
bsw/jbe@19
|
25 }
|
bsw/jbe@19
|
26 }
|
bsw/jbe@19
|
27 }
|
bsw/jbe@19
|
28
|
bsw/jbe@19
|
29 local ui_filters = ui.filters
|
bsw/jbe@19
|
30 if not show_filter then
|
bsw/jbe@19
|
31 ui_filters = function(args) args.content() end
|
bsw/jbe@19
|
32 end
|
bsw/jbe@19
|
33
|
bsw/jbe@19
|
34 ui_filters{
|
bsw/jbe@0
|
35 selector = suggestions_selector,
|
bsw/jbe@19
|
36 {
|
bsw/jbe@4
|
37 {
|
bsw/jbe@19
|
38 name = "plus_unfulfilled",
|
bsw/jbe@19
|
39 label = _"requested",
|
bsw/jbe@19
|
40 selector_modifier = function(selector) selector:add_order_by("plus2_unfulfilled_count + plus1_unfulfilled_count DESC, id") end
|
bsw/jbe@4
|
41 },
|
bsw/jbe@4
|
42 {
|
bsw/jbe@4
|
43 name = "plus2",
|
bsw/jbe@4
|
44 label = _"must",
|
bsw/jbe@19
|
45 selector_modifier = function(selector) selector:add_order_by("plus2_unfulfilled_count + plus2_fulfilled_count DESC, id") end
|
bsw/jbe@4
|
46 },
|
bsw/jbe@4
|
47 {
|
bsw/jbe@4
|
48 name = "plus",
|
bsw/jbe@4
|
49 label = _"must/should",
|
bsw/jbe@19
|
50 selector_modifier = function(selector) selector:add_order_by("plus2_unfulfilled_count + plus1_unfulfilled_count + plus2_fulfilled_count + plus1_fulfilled_count DESC, id") end
|
bsw/jbe@4
|
51 },
|
bsw/jbe@4
|
52 {
|
bsw/jbe@4
|
53 name = "minus",
|
bsw/jbe@4
|
54 label = _"must/should not",
|
bsw/jbe@19
|
55 selector_modifier = function(selector) selector:add_order_by("minus2_unfulfilled_count + minus1_unfulfilled_count + minus2_fulfilled_count + minus1_fulfilled_count DESC, id") end
|
bsw/jbe@4
|
56 },
|
bsw/jbe@4
|
57 {
|
bsw/jbe@4
|
58 name = "minus2",
|
bsw/jbe@4
|
59 label = _"must not",
|
bsw/jbe@19
|
60 selector_modifier = function(selector) selector:add_order_by("minus2_unfulfilled_count + minus2_fulfilled_count DESC, id") end
|
bsw/jbe@19
|
61 }
|
bsw/jbe@4
|
62 },
|
bsw/jbe@0
|
63 content = function()
|
bsw/jbe@4
|
64 ui.paginate{
|
bsw/jbe@4
|
65 selector = suggestions_selector,
|
bsw/jbe@4
|
66 content = function()
|
bsw/jbe@4
|
67 ui.list{
|
bsw/jbe@4
|
68 attr = { style = "table-layout: fixed;" },
|
bsw/jbe@4
|
69 records = suggestions_selector:exec(),
|
bsw/jbe@4
|
70 columns = {
|
bsw/jbe@4
|
71 {
|
bsw/jbe@19
|
72 label = show_name and _"Suggestion" or nil,
|
bsw/jbe@4
|
73 content = function(record)
|
bsw/jbe@19
|
74 if show_name then
|
bsw/jbe@19
|
75 ui.link{
|
bsw/jbe@19
|
76 text = record.name,
|
bsw/jbe@19
|
77 module = "suggestion",
|
bsw/jbe@19
|
78 view = "show",
|
bsw/jbe@19
|
79 id = record.id
|
bsw/jbe@19
|
80 }
|
bsw/jbe@19
|
81 end
|
bsw/jbe@4
|
82 end
|
bsw/jbe@4
|
83 },
|
bsw/jbe@4
|
84 {
|
bsw@95
|
85 label = _"Collective opinion of supporters",
|
bsw/jbe@4
|
86 label_attr = { style = "width: 101px;" },
|
bsw/jbe@4
|
87 content = function(record)
|
bsw/jbe@4
|
88 if record.minus2_unfulfilled_count then
|
bsw@95
|
89 local max_value = record.initiative.supporter_count
|
bsw/jbe@4
|
90 ui.bargraph{
|
bsw/jbe@4
|
91 max_value = max_value,
|
bsw@95
|
92 width = 100,
|
bsw/jbe@4
|
93 bars = {
|
bsw@95
|
94 { color = "#0a0", value = record.plus2_unfulfilled_count + record.plus2_fulfilled_count },
|
bsw@95
|
95 { color = "#8f8", value = record.plus1_unfulfilled_count + record.plus1_fulfilled_count },
|
bsw@95
|
96 { color = "#eee", value = max_value - record.minus2_unfulfilled_count - record.minus1_unfulfilled_count - record.minus2_fulfilled_count - record.minus1_fulfilled_count - record.plus1_unfulfilled_count - record.plus2_unfulfilled_count - record.plus1_fulfilled_count - record.plus2_fulfilled_count},
|
bsw/jbe@4
|
97 { color = "#f88", value = record.minus1_unfulfilled_count + record.minus1_fulfilled_count },
|
bsw/jbe@4
|
98 { color = "#a00", value = record.minus2_unfulfilled_count + record.minus2_fulfilled_count },
|
bsw/jbe@4
|
99 }
|
bsw/jbe@4
|
100 }
|
bsw/jbe@4
|
101 end
|
bsw/jbe@4
|
102 end
|
bsw/jbe@4
|
103 },
|
bsw/jbe@4
|
104 {
|
bsw/jbe@4
|
105 label = _"My opinion",
|
bsw@95
|
106 label_attr = { style = "width: 130px; font-style: italic;" },
|
bsw/jbe@4
|
107 content = function(record)
|
bsw/jbe@4
|
108 local degree
|
bsw@51
|
109 local opinion
|
bsw@51
|
110 if app.session.member_id then
|
bsw@51
|
111 opinion = Opinion:by_pk(app.session.member.id, record.id)
|
bsw@51
|
112 end
|
bsw/jbe@4
|
113 if opinion then
|
bsw/jbe@4
|
114 degree = opinion.degree
|
bsw@3
|
115 end
|
bsw/jbe@5
|
116 ui.container{
|
bsw/jbe@5
|
117 attr = { class = "suggestion_my_opinion" },
|
bsw/jbe@5
|
118 content = function()
|
bsw@51
|
119 if app.session.member_id then
|
bsw@51
|
120 if initiative.issue.state == "voting" or initiative.issue.state == "closed" then
|
bsw@95
|
121 if degree == -2 then
|
bsw@95
|
122 ui.tag{
|
bsw@95
|
123 tag = "span",
|
bsw@95
|
124 attr = {
|
bsw@95
|
125 class = "action" .. (degree == -2 and " active_red2" or "")
|
bsw@95
|
126 },
|
bsw@95
|
127 content = _"must not"
|
bsw@95
|
128 }
|
bsw@95
|
129 end
|
bsw@95
|
130 if degree == -1 then
|
bsw@95
|
131 ui.tag{
|
bsw@95
|
132 tag = "span",
|
bsw@95
|
133 attr = { class = "action" .. (degree == -1 and " active_red1" or "") },
|
bsw@95
|
134 content = _"should not"
|
bsw@95
|
135 }
|
bsw@95
|
136 end
|
bsw@95
|
137 if degree == nil then
|
bsw@95
|
138 ui.tag{
|
bsw@95
|
139 tag = "span",
|
bsw@95
|
140 attr = { class = "action" .. (degree == nil and " active" or "") },
|
bsw@95
|
141 content = _"neutral"
|
bsw@95
|
142 }
|
bsw@95
|
143 end
|
bsw@95
|
144 if degree == 1 then
|
bsw@95
|
145 ui.tag{
|
bsw@95
|
146 tag = "span",
|
bsw@95
|
147 attr = { class = "action" .. (degree == 1 and " active_green1" or "") },
|
bsw@95
|
148 content = _"should"
|
bsw@95
|
149 }
|
bsw@95
|
150 end
|
bsw@95
|
151 if degree == 2 then
|
bsw@95
|
152 ui.tag{
|
bsw@95
|
153 tag = "span",
|
bsw@95
|
154 attr = { class = "action" .. (degree == 2 and " active_green2" or "") },
|
bsw@95
|
155 content = _"must"
|
bsw@95
|
156 }
|
bsw@95
|
157 end
|
bsw@51
|
158 else
|
poelzi@142
|
159 -- we need to put initiative_id into the parameters to have a redirect target in case the suggestion is gone after the action
|
poelzi@142
|
160 params = param.get_all_cgi()
|
poelzi@142
|
161 params['initiative_id'] = initiative.id
|
poelzi@142
|
162
|
bsw@51
|
163 ui.link{
|
bsw@95
|
164 attr = { class = "action" .. (degree == 2 and " active_green2" or "") },
|
bsw@95
|
165 text = _"must",
|
bsw@51
|
166 module = "opinion",
|
bsw@51
|
167 action = "update",
|
poelzi@142
|
168 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } },
|
bsw@51
|
169 params = {
|
bsw@51
|
170 suggestion_id = record.id,
|
bsw@95
|
171 degree = 2
|
bsw@51
|
172 },
|
bsw@51
|
173 partial = partial
|
bsw@51
|
174 }
|
bsw@51
|
175 slot.put(" ")
|
bsw@51
|
176 ui.link{
|
bsw@51
|
177 attr = { class = "action" .. (degree == 1 and " active_green1" or "") },
|
bsw@51
|
178 text = _"should",
|
bsw@51
|
179 module = "opinion",
|
bsw@51
|
180 action = "update",
|
poelzi@142
|
181 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params} },
|
bsw@51
|
182 params = {
|
bsw@51
|
183 suggestion_id = record.id,
|
bsw@51
|
184 degree = 1
|
bsw@51
|
185 },
|
bsw@51
|
186 partial = partial
|
bsw@51
|
187 }
|
bsw@51
|
188 slot.put(" ")
|
bsw@51
|
189 ui.link{
|
bsw@95
|
190 attr = { class = "action" .. (degree == nil and " active" or "") },
|
bsw@95
|
191 text = _"neutral",
|
bsw@51
|
192 module = "opinion",
|
bsw@51
|
193 action = "update",
|
poelzi@142
|
194 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } },
|
bsw@51
|
195 params = {
|
bsw@51
|
196 suggestion_id = record.id,
|
bsw@95
|
197 delete = true
|
bsw@95
|
198 },
|
bsw@95
|
199 partial = partial
|
bsw@95
|
200 }
|
bsw@95
|
201 slot.put(" ")
|
bsw@95
|
202 ui.link{
|
bsw@95
|
203 attr = { class = "action" .. (degree == -1 and " active_red1" or "") },
|
bsw@95
|
204 text = _"should not",
|
bsw@95
|
205 module = "opinion",
|
bsw@95
|
206 action = "update",
|
poelzi@142
|
207 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } },
|
bsw@95
|
208 params = {
|
bsw@95
|
209 suggestion_id = record.id,
|
bsw@95
|
210 degree = -1
|
bsw@95
|
211 },
|
bsw@95
|
212 partial = partial
|
bsw@95
|
213 }
|
bsw@95
|
214 slot.put(" ")
|
bsw@95
|
215 ui.link{
|
bsw@95
|
216 attr = { class = "action" .. (degree == -2 and " active_red2" or "") },
|
bsw@95
|
217 text = _"must not",
|
bsw@95
|
218 module = "opinion",
|
bsw@95
|
219 action = "update",
|
poelzi@142
|
220 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } },
|
bsw@95
|
221 params = {
|
bsw@95
|
222 suggestion_id = record.id,
|
bsw@95
|
223 degree = -2
|
bsw@51
|
224 },
|
bsw@51
|
225 partial = partial
|
bsw@51
|
226 }
|
bsw@51
|
227 end
|
bsw/jbe@19
|
228 else
|
bsw@51
|
229 ui.field.text{ value = _"[Registered members only]" }
|
bsw/jbe@19
|
230 end
|
bsw/jbe@5
|
231 end
|
bsw/jbe@0
|
232 }
|
bsw/jbe@0
|
233 end
|
bsw/jbe@4
|
234 },
|
bsw/jbe@4
|
235 {
|
bsw/jbe@4
|
236 label = _"Suggestion currently not implemented",
|
bsw/jbe@4
|
237 label_attr = { style = "width: 101px;" },
|
bsw/jbe@4
|
238 content = function(record)
|
bsw/jbe@4
|
239 if record.minus2_unfulfilled_count then
|
bsw@95
|
240 local max_value = record.initiative.supporter_count
|
bsw/jbe@4
|
241 ui.bargraph{
|
bsw/jbe@4
|
242 max_value = max_value,
|
bsw@95
|
243 width = 100,
|
bsw/jbe@4
|
244 bars = {
|
bsw/jbe@4
|
245 { color = "#0a0", value = record.plus2_unfulfilled_count },
|
bsw/jbe@4
|
246 { color = "#8f8", value = record.plus1_unfulfilled_count },
|
bsw@95
|
247 { color = "#eee", value = max_value - record.minus2_unfulfilled_count - record.minus1_unfulfilled_count - record.plus1_unfulfilled_count - record.plus2_unfulfilled_count },
|
bsw@95
|
248 { color = "#f88", value = record.minus1_unfulfilled_count },
|
bsw@95
|
249 { color = "#a00", value = record.minus2_unfulfilled_count },
|
bsw/jbe@4
|
250 }
|
bsw/jbe@4
|
251 }
|
bsw/jbe@4
|
252 end
|
bsw/jbe@4
|
253 end
|
bsw/jbe@4
|
254 },
|
bsw/jbe@4
|
255 {
|
bsw/jbe@4
|
256 label = _"Suggestion currently implemented",
|
bsw/jbe@4
|
257 label_attr = { style = "width: 101px;" },
|
bsw/jbe@4
|
258 content = function(record)
|
bsw/jbe@4
|
259 if record.minus2_fulfilled_count then
|
bsw@95
|
260 local max_value = record.initiative.supporter_count
|
bsw/jbe@4
|
261 ui.bargraph{
|
bsw/jbe@4
|
262 max_value = max_value,
|
bsw@95
|
263 width = 100,
|
bsw/jbe@4
|
264 bars = {
|
bsw@95
|
265 { color = "#0a0", value = record.plus2_fulfilled_count },
|
bsw@95
|
266 { color = "#8f8", value = record.plus1_fulfilled_count },
|
bsw@95
|
267 { color = "#eee", value = max_value - record.minus2_fulfilled_count - record.minus1_fulfilled_count - record.plus1_fulfilled_count - record.plus2_fulfilled_count},
|
bsw/jbe@4
|
268 { color = "#f88", value = record.minus1_fulfilled_count },
|
bsw/jbe@4
|
269 { color = "#a00", value = record.minus2_fulfilled_count },
|
bsw/jbe@4
|
270 }
|
bsw/jbe@4
|
271 }
|
bsw/jbe@4
|
272 end
|
bsw@3
|
273 end
|
bsw/jbe@4
|
274 },
|
bsw/jbe@4
|
275 {
|
bsw@95
|
276 label = app.session.member_id and _"I consider suggestion as" or nil,
|
bsw@95
|
277 label_attr = { style = "width: 100px; font-style: italic;" },
|
bsw/jbe@4
|
278 content = function(record)
|
bsw/jbe@4
|
279 local degree
|
bsw@51
|
280 local opinion
|
bsw@51
|
281 if app.session.member_id then
|
bsw@51
|
282 opinion = Opinion:by_pk(app.session.member.id, record.id)
|
bsw@51
|
283 end
|
bsw/jbe@4
|
284 if opinion then
|
bsw/jbe@4
|
285 degree = opinion.degree
|
bsw/jbe@4
|
286 end
|
bsw/jbe@4
|
287 if opinion then
|
bsw@95
|
288
|
bsw@95
|
289 ui.link{
|
bsw@95
|
290 attr = { class = opinion.fulfilled and "action active" or "action" },
|
bsw@95
|
291 text = _"implemented",
|
bsw@95
|
292 module = "opinion",
|
bsw@95
|
293 action = "update",
|
bsw@95
|
294 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } },
|
bsw@95
|
295 params = {
|
bsw@95
|
296 suggestion_id = record.id,
|
bsw@95
|
297 fulfilled = true
|
bsw@95
|
298 },
|
bsw@95
|
299 partial = partial
|
bsw@95
|
300 }
|
bsw@95
|
301 slot.put("<br />")
|
bsw@95
|
302 ui.link{
|
bsw@95
|
303 attr = { class = not opinion.fulfilled and "action active" or "action" },
|
bsw@95
|
304 text = _"not implemented",
|
bsw@95
|
305 module = "opinion",
|
bsw@95
|
306 action = "update",
|
bsw@95
|
307 routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } },
|
bsw@95
|
308 params = {
|
bsw@95
|
309 suggestion_id = record.id,
|
bsw@95
|
310 fulfilled = false
|
bsw@95
|
311 },
|
bsw@95
|
312 partial = partial
|
bsw@95
|
313 }
|
bsw@95
|
314
|
bsw/jbe@4
|
315 end
|
bsw/jbe@4
|
316 end
|
bsw/jbe@4
|
317 },
|
bsw/jbe@4
|
318 {
|
bsw@95
|
319 label = app.session.member_id and _"So I'm" or nil,
|
bsw/jbe@4
|
320 content = function(record)
|
bsw@51
|
321 local opinion
|
bsw@51
|
322 if app.session.member_id then
|
bsw@51
|
323 opinion = Opinion:by_pk(app.session.member.id, record.id)
|
bsw@51
|
324 end
|
bsw/jbe@4
|
325 if opinion then
|
bsw/jbe@4
|
326 if (opinion.fulfilled and opinion.degree > 0) or (not opinion.fulfilled and opinion.degree < 0) then
|
bsw@95
|
327 local title = _"satisfied"
|
bsw@95
|
328 ui.image{ attr = { alt = title, title = title }, static = "icons/emoticon_happy.png" }
|
bsw@95
|
329 elseif opinion.degree == 1 or opinion.degree == -1 then
|
bsw@95
|
330 local title = _"a bit unsatisfied"
|
bsw@95
|
331 ui.image{ attr = { alt = title, title = title }, static = "icons/emoticon_unhappy.png" }
|
bsw/jbe@4
|
332 else
|
bsw@95
|
333 local title = _"more unsatisfied"
|
bsw@95
|
334 ui.image{ attr = { alt = title, title = title }, static = "icons/emoticon_unhappy_red.png" }
|
bsw/jbe@4
|
335 end
|
bsw/jbe@4
|
336 end
|
bsw/jbe@4
|
337 end
|
bsw/jbe@4
|
338 },
|
bsw/jbe@4
|
339 }
|
bsw/jbe@4
|
340 }
|
bsw/jbe@4
|
341 end
|
bsw/jbe@0
|
342 }
|
bsw/jbe@0
|
343 end
|
bsw/jbe@0
|
344 }
|