liquid_feedback_frontend
changeset 851:82f13fbbc05a
Added issue filters to event list, added voted filter
author | bsw |
---|---|
date | Fri Aug 17 00:03:23 2012 +0200 (2012-08-17) |
parents | 7102c66b05f3 |
children | 376e3ed9b245 |
files | app/main/event/_list.lua app/main/index/_index_member.lua app/main/issue/_filters.lua |
line diff
1.1 --- a/app/main/event/_list.lua Sun Aug 12 22:14:06 2012 +0200 1.2 +++ b/app/main/event/_list.lua Fri Aug 17 00:03:23 2012 +0200 1.3 @@ -1,4 +1,4 @@ 1.4 -local global = param.get("global", atom.boolean) 1.5 +--local global = param.get("global", atom.boolean) 1.6 local for_member = param.get("for_member", "table") 1.7 local for_unit = param.get("for_unit", "table") 1.8 local for_area = param.get("for_area", "table") 1.9 @@ -20,8 +20,8 @@ 1.10 event_selector:add_where{ "area.unit_id = ?", for_unit.id } 1.11 elseif for_area then 1.12 event_selector:add_where{ "issue.area_id = ?", for_area.id } 1.13 -elseif not global then 1.14 - event_selector:join("event_seen_by_member", nil, { "event_seen_by_member.id = event.id AND event_seen_by_member.seen_by_member_id = ?", app.session.member_id }) 1.15 +--elseif not global then 1.16 +-- event_selector:join("event_seen_by_member", nil, { "event_seen_by_member.id = event.id AND event_seen_by_member.seen_by_member_id = ?", app.session.member_id }) 1.17 end 1.18 1.19 if app.session.member_id then 1.20 @@ -34,176 +34,192 @@ 1.21 :add_field("array_length(_delegating_interest.delegate_member_ids, 1)", "delegation_chain_length") 1.22 end 1.23 1.24 -local last_event_id 1.25 +local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = { 1.26 + for_events = true, 1.27 + member = app.session.member, for_member = for_member, state = for_state, for_unit = for_unit and true or false, for_area = for_area and true or false 1.28 +}} 1.29 1.30 -local events = event_selector:exec() 1.31 +filters.opened = true 1.32 +filters.selector = event_selector 1.33 + 1.34 +filters.content = function() 1.35 + 1.36 1.37 -local issues = events:load("issue") 1.38 -issues:load_everything_for_member_id(app.session.member_id) 1.39 + local last_event_id 1.40 + 1.41 + local events = event_selector:exec() 1.42 1.43 -events:load("initiative") 1.44 -events:load("suggestion") 1.45 -events:load("member") 1.46 + local issues = events:load("issue") 1.47 + issues:load_everything_for_member_id(app.session.member_id) 1.48 + 1.49 + events:load("initiative") 1.50 + events:load("suggestion") 1.51 + events:load("member") 1.52 1.53 1.54 -ui.container{ attr = { class = "issues events" }, content = function() 1.55 + ui.container{ attr = { class = "issues events" }, content = function() 1.56 1.57 - local last_event_date 1.58 - for i, event in ipairs(events) do 1.59 - last_event_id = event.id 1.60 + local last_event_date 1.61 + for i, event in ipairs(events) do 1.62 + last_event_id = event.id 1.63 1.64 - ui.container{ attr = { class = "event_info" }, content = function() 1.65 - local event_name = event.event_name 1.66 - local event_image 1.67 - if event.event == "issue_state_changed" then 1.68 - if event.state == "discussion" then 1.69 - event_name = _"Discussion started" 1.70 - event_image = "comments.png" 1.71 - elseif event.state == "verification" then 1.72 - event_name = _"Verification started" 1.73 - event_image = "lock.png" 1.74 - elseif event.state == "voting" then 1.75 - event_name = _"Voting started" 1.76 - event_image = "email_open.png" 1.77 - elseif event.state == "finished_with_winner" then 1.78 - event_name = event.state_name 1.79 - event_image = "award_star_gold_2.png" 1.80 - elseif event.state == "finished_without_winner" then 1.81 - event_name = event.state_name 1.82 - event_image = "cross.png" 1.83 - else 1.84 - event_name = event.state_name 1.85 - end 1.86 - if event_image then 1.87 - ui.image{ static = "icons/16/" .. event_image } 1.88 - slot.put(" ") 1.89 + ui.container{ attr = { class = "event_info" }, content = function() 1.90 + local event_name = event.event_name 1.91 + local event_image 1.92 + if event.event == "issue_state_changed" then 1.93 + if event.state == "discussion" then 1.94 + event_name = _"Discussion started" 1.95 + event_image = "comments.png" 1.96 + elseif event.state == "verification" then 1.97 + event_name = _"Verification started" 1.98 + event_image = "lock.png" 1.99 + elseif event.state == "voting" then 1.100 + event_name = _"Voting started" 1.101 + event_image = "email_open.png" 1.102 + elseif event.state == "finished_with_winner" then 1.103 + event_name = event.state_name 1.104 + event_image = "award_star_gold_2.png" 1.105 + elseif event.state == "finished_without_winner" then 1.106 + event_name = event.state_name 1.107 + event_image = "cross.png" 1.108 + else 1.109 + event_name = event.state_name 1.110 + end 1.111 + if event_image then 1.112 + ui.image{ static = "icons/16/" .. event_image } 1.113 + slot.put(" ") 1.114 + end 1.115 end 1.116 - end 1.117 - local days_ago_text 1.118 - if event.time_ago == 0 then 1.119 - days_ago_text = _("Today at #{time}", { time = format.time(event.occurrence) }) 1.120 - elseif event.time_ago == 1 then 1.121 - days_ago_text = _("Yesterday at #{time}", { time = format.time(event.occurrence) }) 1.122 - else 1.123 - days_ago_text = _("#{date} at #{time}", { date = format.date(event.occurrence.date), time = format.time(event.occurrence) }) 1.124 - end 1.125 - ui.tag{ attr = { class = "event_name" }, content = event_name } 1.126 - slot.put("<br />") 1.127 - ui.tag{ content = days_ago_text } 1.128 ---[[ if event.time_ago > 1 then 1.129 - slot.put("<br />(") 1.130 - ui.tag{ content = _("#{count} days ago", { count = event.time_ago }) } 1.131 - slot.put(")") 1.132 - end 1.133 - --]] 1.134 - if app.session:has_access("authors_pseudonymous") and event.member_id then 1.135 + local days_ago_text 1.136 + if event.time_ago == 0 then 1.137 + days_ago_text = _("Today at #{time}", { time = format.time(event.occurrence) }) 1.138 + elseif event.time_ago == 1 then 1.139 + days_ago_text = _("Yesterday at #{time}", { time = format.time(event.occurrence) }) 1.140 + else 1.141 + days_ago_text = _("#{date} at #{time}", { date = format.date(event.occurrence.date), time = format.time(event.occurrence) }) 1.142 + end 1.143 + ui.tag{ attr = { class = "event_name" }, content = event_name } 1.144 slot.put("<br />") 1.145 - slot.put("<br />") 1.146 - if app.session.member_id then 1.147 + ui.tag{ content = days_ago_text } 1.148 + --[[ if event.time_ago > 1 then 1.149 + slot.put("<br />(") 1.150 + ui.tag{ content = _("#{count} days ago", { count = event.time_ago }) } 1.151 + slot.put(")") 1.152 + end 1.153 + --]] 1.154 + if app.session:has_access("authors_pseudonymous") and event.member_id then 1.155 + slot.put("<br />") 1.156 + slot.put("<br />") 1.157 + if app.session.member_id then 1.158 + ui.link{ 1.159 + content = function() 1.160 + execute.view{ 1.161 + module = "member_image", 1.162 + view = "_show", 1.163 + params = { 1.164 + member = event.member, 1.165 + image_type = "avatar", 1.166 + show_dummy = true, 1.167 + class = "micro_avatar", 1.168 + popup_text = text 1.169 + } 1.170 + } 1.171 + end, 1.172 + module = "member", view = "show", id = event.member_id 1.173 + } 1.174 + slot.put(" ") 1.175 + end 1.176 ui.link{ 1.177 - content = function() 1.178 - execute.view{ 1.179 - module = "member_image", 1.180 - view = "_show", 1.181 - params = { 1.182 - member = event.member, 1.183 - image_type = "avatar", 1.184 - show_dummy = true, 1.185 - class = "micro_avatar", 1.186 - popup_text = text 1.187 - } 1.188 - } 1.189 - end, 1.190 + text = event.member.name, 1.191 module = "member", view = "show", id = event.member_id 1.192 } 1.193 - slot.put(" ") 1.194 - end 1.195 - ui.link{ 1.196 - text = event.member.name, 1.197 - module = "member", view = "show", id = event.member_id 1.198 - } 1.199 - end 1.200 - end } 1.201 - 1.202 - ui.container{ attr = { class = "issue" }, content = function() 1.203 - 1.204 - execute.view{ module = "delegation", view = "_info", params = { issue = event.issue } } 1.205 - 1.206 - ui.container{ attr = { class = "content" }, content = function() 1.207 - ui.link{ 1.208 - module = "unit", view = "show", id = event.issue.area.unit_id, 1.209 - attr = { class = "unit_link" }, text = event.issue.area.unit.name 1.210 - } 1.211 - slot.put(" ") 1.212 - ui.link{ 1.213 - module = "area", view = "show", id = event.issue.area_id, 1.214 - attr = { class = "area_link" }, text = event.issue.area.name 1.215 - } 1.216 - end } 1.217 - 1.218 - ui.container{ attr = { class = "title" }, content = function() 1.219 - ui.link{ 1.220 - attr = { class = "issue_id" }, 1.221 - text = _("#{policy} ##{id}", { policy = event.issue.policy.name, id = event.issue_id }), 1.222 - module = "issue", 1.223 - view = "show", 1.224 - id = event.issue_id 1.225 - } 1.226 - end } 1.227 - 1.228 - ui.container{ attr = { class = "initiative_list" }, content = function() 1.229 - if not event.initiative_id then 1.230 - local initiatives_selector = Initiative:new_selector() 1.231 - :add_where{ "initiative.issue_id = ?", event.issue_id } 1.232 - :add_order_by("initiative.rank, initiative.supporter_count DESC") 1.233 - execute.view{ module = "initiative", view = "_list", params = { 1.234 - issue = event.issue, 1.235 - initiatives_selector = initiatives_selector, 1.236 - no_sort = true, 1.237 - limit = 5 1.238 - } } 1.239 - else 1.240 - local initiatives_selector = Initiative:new_selector() 1.241 - :add_where{ "initiative.id = ?", event.initiative_id } 1.242 - execute.view{ module = "initiative", view = "_list", params = { 1.243 - initiatives_selector = initiatives_selector, 1.244 - no_sort = true, 1.245 - hide_more_initiatives = true 1.246 - } } 1.247 end 1.248 end } 1.249 1.250 - ui.container{ attr = { class = "content suggestion" }, content = function() 1.251 - if event.suggestion_id then 1.252 + ui.container{ attr = { class = "issue" }, content = function() 1.253 + 1.254 + execute.view{ module = "delegation", view = "_info", params = { issue = event.issue } } 1.255 + 1.256 + ui.container{ attr = { class = "content" }, content = function() 1.257 + ui.link{ 1.258 + module = "unit", view = "show", id = event.issue.area.unit_id, 1.259 + attr = { class = "unit_link" }, text = event.issue.area.unit.name 1.260 + } 1.261 + slot.put(" ") 1.262 + ui.link{ 1.263 + module = "area", view = "show", id = event.issue.area_id, 1.264 + attr = { class = "area_link" }, text = event.issue.area.name 1.265 + } 1.266 + end } 1.267 + 1.268 + ui.container{ attr = { class = "title" }, content = function() 1.269 ui.link{ 1.270 - text = event.suggestion.name, 1.271 - module = "suggestion", view = "show", id = event.suggestion_id 1.272 + attr = { class = "issue_id" }, 1.273 + text = _("#{policy} ##{id}", { policy = event.issue.policy.name, id = event.issue_id }), 1.274 + module = "issue", 1.275 + view = "show", 1.276 + id = event.issue_id 1.277 } 1.278 - end 1.279 + end } 1.280 + 1.281 + ui.container{ attr = { class = "initiative_list" }, content = function() 1.282 + if not event.initiative_id then 1.283 + local initiatives_selector = Initiative:new_selector() 1.284 + :add_where{ "initiative.issue_id = ?", event.issue_id } 1.285 + :add_order_by("initiative.rank, initiative.supporter_count DESC") 1.286 + execute.view{ module = "initiative", view = "_list", params = { 1.287 + issue = event.issue, 1.288 + initiatives_selector = initiatives_selector, 1.289 + no_sort = true, 1.290 + limit = 5 1.291 + } } 1.292 + else 1.293 + local initiatives_selector = Initiative:new_selector() 1.294 + :add_where{ "initiative.id = ?", event.initiative_id } 1.295 + execute.view{ module = "initiative", view = "_list", params = { 1.296 + initiatives_selector = initiatives_selector, 1.297 + no_sort = true, 1.298 + hide_more_initiatives = true 1.299 + } } 1.300 + end 1.301 + end } 1.302 + 1.303 + ui.container{ attr = { class = "content suggestion" }, content = function() 1.304 + if event.suggestion_id then 1.305 + ui.link{ 1.306 + text = event.suggestion.name, 1.307 + module = "suggestion", view = "show", id = event.suggestion_id 1.308 + } 1.309 + end 1.310 + end } 1.311 end } 1.312 - end } 1.313 + end 1.314 + 1.315 + end } 1.316 + 1.317 + slot.put("<br />") 1.318 + 1.319 + if #events > 0 then 1.320 + ui.link{ 1.321 + attr = { class = "more_events_links" }, 1.322 + text = _"Show older events", 1.323 + module = request.get_module(), 1.324 + view = request.get_view(), 1.325 + id = for_unit and for_unit.id or for_area and for_area.id, 1.326 + params = { 1.327 + tab = param.get_all_cgi()["tab"], 1.328 + events = param.get_all_cgi()["events"], 1.329 + event_max_id = last_event_id 1.330 + } 1.331 + } 1.332 + else 1.333 + ui.tag{ content = _"No more events available" } 1.334 end 1.335 1.336 -end } 1.337 - 1.338 -slot.put("<br />") 1.339 + slot.put("<br />") 1.340 + slot.put("<br />") 1.341 1.342 -if #events > 0 then 1.343 - ui.link{ 1.344 - attr = { class = "more_events_links" }, 1.345 - text = _"Show older events", 1.346 - module = request.get_module(), 1.347 - view = request.get_view(), 1.348 - id = for_unit and for_unit.id or for_area and for_area.id, 1.349 - params = { 1.350 - tab = param.get_all_cgi()["tab"], 1.351 - events = param.get_all_cgi()["events"], 1.352 - event_max_id = last_event_id 1.353 - } 1.354 - } 1.355 -else 1.356 - ui.tag{ content = _"No more events available" } 1.357 end 1.358 1.359 -slot.put("<br />") 1.360 -slot.put("<br />") 1.361 + 1.362 +ui.filters(filters) 1.363 \ No newline at end of file
2.1 --- a/app/main/index/_index_member.lua Sun Aug 12 22:14:06 2012 +0200 2.2 +++ b/app/main/index/_index_member.lua Fri Aug 17 00:03:23 2012 +0200 2.3 @@ -16,8 +16,8 @@ 2.4 tabs[#tabs+1] = { 2.5 name = "timeline", 2.6 label = _"Latest events", 2.7 - module = "member", 2.8 - view = "_event_list", 2.9 + module = "event", 2.10 + view = "_list", 2.11 params = { } 2.12 } 2.13
3.1 --- a/app/main/issue/_filters.lua Sun Aug 12 22:14:06 2012 +0200 3.2 +++ b/app/main/issue/_filters.lua Fri Aug 17 00:03:23 2012 +0200 3.3 @@ -4,6 +4,8 @@ 3.4 local for_unit = param.get("for_unit", atom.boolean) 3.5 local for_area = param.get("for_area", atom.boolean) 3.6 3.7 +local for_events = param.get("for_events", atom.boolean) 3.8 + 3.9 local filters = {} 3.10 3.11 local filter = { name = "filter" } 3.12 @@ -21,7 +23,11 @@ 3.13 name = "open", 3.14 label = _"Open", 3.15 selector_modifier = function(selector) 3.16 - selector:add_where("issue.closed ISNULL") 3.17 + if for_events then 3.18 + selector:add_where("event.state in ('admission', 'discussion', 'verification', 'voting')") 3.19 + else 3.20 + selector:add_where("issue.closed ISNULL") 3.21 + end 3.22 end 3.23 } 3.24 end 3.25 @@ -31,28 +37,44 @@ 3.26 name = "new", 3.27 label = _"New", 3.28 selector_modifier = function(selector) 3.29 - selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") 3.30 + if for_events then 3.31 + selector:add_where("event.state = 'admission'") 3.32 + else 3.33 + selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") 3.34 + end 3.35 end 3.36 } 3.37 filter[#filter+1] = { 3.38 name = "accepted", 3.39 label = _"Discussion", 3.40 selector_modifier = function(selector) 3.41 - selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") 3.42 + if for_events then 3.43 + selector:add_where("event.state = 'discussion'") 3.44 + else 3.45 + selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") 3.46 + end 3.47 end 3.48 } 3.49 filter[#filter+1] = { 3.50 name = "half_frozen", 3.51 label = _"Frozen", 3.52 selector_modifier = function(selector) 3.53 - selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL") 3.54 + if for_events then 3.55 + selector:add_where("event.state = 'verification'") 3.56 + else 3.57 + selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL") 3.58 + end 3.59 end 3.60 } 3.61 filter[#filter+1] = { 3.62 name = "frozen", 3.63 label = _"Voting", 3.64 selector_modifier = function(selector) 3.65 - selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") 3.66 + if for_events then 3.67 + selector:add_where("event.state = 'voting'") 3.68 + else 3.69 + selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") 3.70 + end 3.71 filter_voting = true 3.72 end 3.73 } 3.74 @@ -63,14 +85,23 @@ 3.75 name = "finished", 3.76 label = _"Finished", 3.77 selector_modifier = function(selector) 3.78 - selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL") 3.79 + if for_events then 3.80 + selector:add_where("event.state IN ('finished_with_winner', 'finished_without_winner')") 3.81 + else 3.82 + selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL") 3.83 + end 3.84 end 3.85 } 3.86 filter[#filter+1] = { 3.87 name = "cancelled", 3.88 label = _"Cancelled", 3.89 selector_modifier = function(selector) 3.90 - selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL") 3.91 + 3.92 + if for_events then 3.93 + selector:add_where("event.state IN ('canceled_revoked_before_accepted', 'canceled_issue_not_accepted', 'canceled_after_revocation_during_discussion', 'canceled_after_revocation_during_verification')") 3.94 + else 3.95 + selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL") 3.96 + end 3.97 end 3.98 } 3.99 end 3.100 @@ -86,28 +117,44 @@ 3.101 name = "finished", 3.102 label = _"Finished", 3.103 selector_modifier = function(selector) 3.104 - selector:add_where("issue.state IN ('finished_with_winner', 'finished_without_winner')") 3.105 + if for_events then 3.106 + selector:add_where("event.state IN ('finished_with_winner', 'finished_without_winner')") 3.107 + else 3.108 + selector:add_where("issue.state IN ('finished_with_winner', 'finished_without_winner')") 3.109 + end 3.110 end 3.111 } 3.112 filter[#filter+1] = { 3.113 name = "finished_with_winner", 3.114 label = _"with winner", 3.115 selector_modifier = function(selector) 3.116 - selector:add_where("issue.state = 'finished_with_winner'") 3.117 + if for_events then 3.118 + selector:add_where("event.state = 'finished_with_winner'") 3.119 + else 3.120 + selector:add_where("issue.state = 'finished_with_winner'") 3.121 + end 3.122 end 3.123 } 3.124 filter[#filter+1] = { 3.125 name = "finished_without_winner", 3.126 label = _"without winner", 3.127 selector_modifier = function(selector) 3.128 - selector:add_where("issue.state = 'finished_without_winner'") 3.129 + if for_events then 3.130 + selector:add_where("event.state = 'finished_without_winner'") 3.131 + else 3.132 + selector:add_where("issue.state = 'finished_without_winner'") 3.133 + end 3.134 end 3.135 } 3.136 filter[#filter+1] = { 3.137 name = "cancelled", 3.138 label = _"Cancelled", 3.139 selector_modifier = function(selector) 3.140 - selector:add_where("issue.state NOT IN ('finished_with_winner', 'finished_without_winner')") 3.141 + if for_events then 3.142 + selector:add_where("event.state NOT IN ('finished_with_winner', 'finished_without_winner')") 3.143 + else 3.144 + selector:add_where("issue.state NOT IN ('finished_with_winner', 'finished_without_winner')") 3.145 + end 3.146 end 3.147 } 3.148 end 3.149 @@ -165,6 +212,13 @@ 3.150 selector_modifier = function() end 3.151 } 3.152 filter[#filter+1] = { 3.153 + name = "initiated", 3.154 + label = _"Initiated", 3.155 + selector_modifier = function(selector) 3.156 + selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN initiator ON initiator.initiative_id = initiative.id AND initiator.member_id = ? AND initiator.accepted WHERE initiative.issue_id = issue.id)", member.id }) 3.157 + end 3.158 + } 3.159 + filter[#filter+1] = { 3.160 name = "supported", 3.161 label = _"Supported", 3.162 selector_modifier = function() end 3.163 @@ -174,13 +228,13 @@ 3.164 label = _"Potentially supported", 3.165 selector_modifier = function() end 3.166 } 3.167 - filter[#filter+1] = { 3.168 - name = "initiated", 3.169 - label = _"Initiated", 3.170 - selector_modifier = function(selector) 3.171 - selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN initiator ON initiator.initiative_id = initiative.id AND initiator.member_id = ? AND initiator.accepted WHERE initiative.issue_id = issue.id)", member.id }) 3.172 - end 3.173 - } 3.174 + if state == 'closed' or for_events then 3.175 + filter[#filter+1] = { 3.176 + name = "voted", 3.177 + label = _"Voted", 3.178 + selector_modifier = function() end 3.179 + } 3.180 + end 3.181 3.182 filters[#filters+1] = filter 3.183 end 3.184 @@ -192,7 +246,7 @@ 3.185 local filter_interest = param.get_all_cgi()["filter_interest"] 3.186 3.187 if filter_interest ~= "any" and filter_interest ~= nil and ( 3.188 - filter_interest == "issue" or filter_interest == "supported" or filter_interest == "potentially_supported" 3.189 + filter_interest == "issue" or filter_interest == "supported" or filter_interest == "potentially_supported" or filter_interest == 'voted' 3.190 ) then 3.191 3.192 local function add_default_joins(selector) 3.193 @@ -225,6 +279,9 @@ 3.194 "EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = ? AND NOT direct_supporter_snapshot.satisfied) " .. 3.195 "END OR EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = filter_d_interest_s.delegate_member_ids[array_upper(filter_d_interest_s.delegate_member_ids,1)] AND NOT direct_supporter_snapshot.satisfied)", member.id, member.id, member.id }) 3.196 3.197 + elseif filter_interest == "voted" then 3.198 + selector:add_where({ "EXISTS(SELECT 1 FROM direct_voter WHERE direct_voter.issue_id = issue.id AND direct_voter.member_id = ?) OR EXISTS(SELECT 1 FROM delegating_voter WHERE delegating_voter.issue_id = issue.id AND delegating_voter.member_id = ?) ", member.id, member.id }) 3.199 + 3.200 end 3.201 3.202 end 3.203 @@ -251,6 +308,8 @@ 3.204 "ELSE " .. 3.205 "EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = ? AND NOT direct_supporter_snapshot.satisfied) " .. 3.206 "END", member.id, member.id }) 3.207 + elseif filter_interest == "voted" then 3.208 + selector:add_where({ "EXISTS(SELECT 1 FROM direct_voter WHERE direct_voter.issue_id = issue.id AND direct_voter.member_id = ?) ", member.id }) 3.209 3.210 end 3.211 end 3.212 @@ -269,6 +328,8 @@ 3.213 elseif filter_interest == "potentially_supported" then 3.214 selector:add_where({ 3.215 "EXISTS(SELECT 1 FROM direct_supporter_snapshot WHERE direct_supporter_snapshot.event = issue.latest_snapshot_event AND direct_supporter_snapshot.issue_id = issue.id AND direct_supporter_snapshot.member_id = filter_d_interest_s.delegate_member_ids[array_upper(filter_d_interest_s.delegate_member_ids,1)] AND NOT direct_supporter_snapshot.satisfied)", member.id }) 3.216 + elseif filter_interest == "voted" then 3.217 + selector:add_where({ "EXISTS(SELECT 1 FROM delegating_voter WHERE delegating_voter.issue_id = issue.id AND delegating_voter.member_id = ?) ", member.id }) 3.218 3.219 end 3.220 end