# HG changeset patch # User bsw # Date 1345154603 -7200 # Node ID 82f13fbbc05aa7c03e14da06a6bbfeac32b3ebb3 # Parent 7102c66b05f38235fd5a9064229f063eeff94d84 Added issue filters to event list, added voted filter diff -r 7102c66b05f3 -r 82f13fbbc05a app/main/event/_list.lua --- a/app/main/event/_list.lua Sun Aug 12 22:14:06 2012 +0200 +++ b/app/main/event/_list.lua Fri Aug 17 00:03:23 2012 +0200 @@ -1,4 +1,4 @@ -local global = param.get("global", atom.boolean) +--local global = param.get("global", atom.boolean) local for_member = param.get("for_member", "table") local for_unit = param.get("for_unit", "table") local for_area = param.get("for_area", "table") @@ -20,8 +20,8 @@ event_selector:add_where{ "area.unit_id = ?", for_unit.id } elseif for_area then event_selector:add_where{ "issue.area_id = ?", for_area.id } -elseif not global then - 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 }) +--elseif not global then +-- 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 }) end if app.session.member_id then @@ -34,176 +34,192 @@ :add_field("array_length(_delegating_interest.delegate_member_ids, 1)", "delegation_chain_length") end -local last_event_id +local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = { + for_events = true, + 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 +}} -local events = event_selector:exec() +filters.opened = true +filters.selector = event_selector + +filters.content = function() + -local issues = events:load("issue") -issues:load_everything_for_member_id(app.session.member_id) + local last_event_id + + local events = event_selector:exec() -events:load("initiative") -events:load("suggestion") -events:load("member") + local issues = events:load("issue") + issues:load_everything_for_member_id(app.session.member_id) + + events:load("initiative") + events:load("suggestion") + events:load("member") -ui.container{ attr = { class = "issues events" }, content = function() + ui.container{ attr = { class = "issues events" }, content = function() - local last_event_date - for i, event in ipairs(events) do - last_event_id = event.id + local last_event_date + for i, event in ipairs(events) do + last_event_id = event.id - ui.container{ attr = { class = "event_info" }, content = function() - local event_name = event.event_name - local event_image - if event.event == "issue_state_changed" then - if event.state == "discussion" then - event_name = _"Discussion started" - event_image = "comments.png" - elseif event.state == "verification" then - event_name = _"Verification started" - event_image = "lock.png" - elseif event.state == "voting" then - event_name = _"Voting started" - event_image = "email_open.png" - elseif event.state == "finished_with_winner" then - event_name = event.state_name - event_image = "award_star_gold_2.png" - elseif event.state == "finished_without_winner" then - event_name = event.state_name - event_image = "cross.png" - else - event_name = event.state_name - end - if event_image then - ui.image{ static = "icons/16/" .. event_image } - slot.put(" ") + ui.container{ attr = { class = "event_info" }, content = function() + local event_name = event.event_name + local event_image + if event.event == "issue_state_changed" then + if event.state == "discussion" then + event_name = _"Discussion started" + event_image = "comments.png" + elseif event.state == "verification" then + event_name = _"Verification started" + event_image = "lock.png" + elseif event.state == "voting" then + event_name = _"Voting started" + event_image = "email_open.png" + elseif event.state == "finished_with_winner" then + event_name = event.state_name + event_image = "award_star_gold_2.png" + elseif event.state == "finished_without_winner" then + event_name = event.state_name + event_image = "cross.png" + else + event_name = event.state_name + end + if event_image then + ui.image{ static = "icons/16/" .. event_image } + slot.put(" ") + end end - end - local days_ago_text - if event.time_ago == 0 then - days_ago_text = _("Today at #{time}", { time = format.time(event.occurrence) }) - elseif event.time_ago == 1 then - days_ago_text = _("Yesterday at #{time}", { time = format.time(event.occurrence) }) - else - days_ago_text = _("#{date} at #{time}", { date = format.date(event.occurrence.date), time = format.time(event.occurrence) }) - end - ui.tag{ attr = { class = "event_name" }, content = event_name } - slot.put("
") - ui.tag{ content = days_ago_text } ---[[ if event.time_ago > 1 then - slot.put("
(") - ui.tag{ content = _("#{count} days ago", { count = event.time_ago }) } - slot.put(")") - end - --]] - if app.session:has_access("authors_pseudonymous") and event.member_id then + local days_ago_text + if event.time_ago == 0 then + days_ago_text = _("Today at #{time}", { time = format.time(event.occurrence) }) + elseif event.time_ago == 1 then + days_ago_text = _("Yesterday at #{time}", { time = format.time(event.occurrence) }) + else + days_ago_text = _("#{date} at #{time}", { date = format.date(event.occurrence.date), time = format.time(event.occurrence) }) + end + ui.tag{ attr = { class = "event_name" }, content = event_name } slot.put("
") - slot.put("
") - if app.session.member_id then + ui.tag{ content = days_ago_text } + --[[ if event.time_ago > 1 then + slot.put("
(") + ui.tag{ content = _("#{count} days ago", { count = event.time_ago }) } + slot.put(")") + end + --]] + if app.session:has_access("authors_pseudonymous") and event.member_id then + slot.put("
") + slot.put("
") + if app.session.member_id then + ui.link{ + content = function() + execute.view{ + module = "member_image", + view = "_show", + params = { + member = event.member, + image_type = "avatar", + show_dummy = true, + class = "micro_avatar", + popup_text = text + } + } + end, + module = "member", view = "show", id = event.member_id + } + slot.put(" ") + end ui.link{ - content = function() - execute.view{ - module = "member_image", - view = "_show", - params = { - member = event.member, - image_type = "avatar", - show_dummy = true, - class = "micro_avatar", - popup_text = text - } - } - end, + text = event.member.name, module = "member", view = "show", id = event.member_id } - slot.put(" ") - end - ui.link{ - text = event.member.name, - module = "member", view = "show", id = event.member_id - } - end - end } - - ui.container{ attr = { class = "issue" }, content = function() - - execute.view{ module = "delegation", view = "_info", params = { issue = event.issue } } - - ui.container{ attr = { class = "content" }, content = function() - ui.link{ - module = "unit", view = "show", id = event.issue.area.unit_id, - attr = { class = "unit_link" }, text = event.issue.area.unit.name - } - slot.put(" ") - ui.link{ - module = "area", view = "show", id = event.issue.area_id, - attr = { class = "area_link" }, text = event.issue.area.name - } - end } - - ui.container{ attr = { class = "title" }, content = function() - ui.link{ - attr = { class = "issue_id" }, - text = _("#{policy} ##{id}", { policy = event.issue.policy.name, id = event.issue_id }), - module = "issue", - view = "show", - id = event.issue_id - } - end } - - ui.container{ attr = { class = "initiative_list" }, content = function() - if not event.initiative_id then - local initiatives_selector = Initiative:new_selector() - :add_where{ "initiative.issue_id = ?", event.issue_id } - :add_order_by("initiative.rank, initiative.supporter_count DESC") - execute.view{ module = "initiative", view = "_list", params = { - issue = event.issue, - initiatives_selector = initiatives_selector, - no_sort = true, - limit = 5 - } } - else - local initiatives_selector = Initiative:new_selector() - :add_where{ "initiative.id = ?", event.initiative_id } - execute.view{ module = "initiative", view = "_list", params = { - initiatives_selector = initiatives_selector, - no_sort = true, - hide_more_initiatives = true - } } end end } - ui.container{ attr = { class = "content suggestion" }, content = function() - if event.suggestion_id then + ui.container{ attr = { class = "issue" }, content = function() + + execute.view{ module = "delegation", view = "_info", params = { issue = event.issue } } + + ui.container{ attr = { class = "content" }, content = function() + ui.link{ + module = "unit", view = "show", id = event.issue.area.unit_id, + attr = { class = "unit_link" }, text = event.issue.area.unit.name + } + slot.put(" ") + ui.link{ + module = "area", view = "show", id = event.issue.area_id, + attr = { class = "area_link" }, text = event.issue.area.name + } + end } + + ui.container{ attr = { class = "title" }, content = function() ui.link{ - text = event.suggestion.name, - module = "suggestion", view = "show", id = event.suggestion_id + attr = { class = "issue_id" }, + text = _("#{policy} ##{id}", { policy = event.issue.policy.name, id = event.issue_id }), + module = "issue", + view = "show", + id = event.issue_id } - end + end } + + ui.container{ attr = { class = "initiative_list" }, content = function() + if not event.initiative_id then + local initiatives_selector = Initiative:new_selector() + :add_where{ "initiative.issue_id = ?", event.issue_id } + :add_order_by("initiative.rank, initiative.supporter_count DESC") + execute.view{ module = "initiative", view = "_list", params = { + issue = event.issue, + initiatives_selector = initiatives_selector, + no_sort = true, + limit = 5 + } } + else + local initiatives_selector = Initiative:new_selector() + :add_where{ "initiative.id = ?", event.initiative_id } + execute.view{ module = "initiative", view = "_list", params = { + initiatives_selector = initiatives_selector, + no_sort = true, + hide_more_initiatives = true + } } + end + end } + + ui.container{ attr = { class = "content suggestion" }, content = function() + if event.suggestion_id then + ui.link{ + text = event.suggestion.name, + module = "suggestion", view = "show", id = event.suggestion_id + } + end + end } end } - end } + end + + end } + + slot.put("
") + + if #events > 0 then + ui.link{ + attr = { class = "more_events_links" }, + text = _"Show older events", + module = request.get_module(), + view = request.get_view(), + id = for_unit and for_unit.id or for_area and for_area.id, + params = { + tab = param.get_all_cgi()["tab"], + events = param.get_all_cgi()["events"], + event_max_id = last_event_id + } + } + else + ui.tag{ content = _"No more events available" } end -end } - -slot.put("
") + slot.put("
") + slot.put("
") -if #events > 0 then - ui.link{ - attr = { class = "more_events_links" }, - text = _"Show older events", - module = request.get_module(), - view = request.get_view(), - id = for_unit and for_unit.id or for_area and for_area.id, - params = { - tab = param.get_all_cgi()["tab"], - events = param.get_all_cgi()["events"], - event_max_id = last_event_id - } - } -else - ui.tag{ content = _"No more events available" } end -slot.put("
") -slot.put("
") + +ui.filters(filters) \ No newline at end of file diff -r 7102c66b05f3 -r 82f13fbbc05a app/main/index/_index_member.lua --- a/app/main/index/_index_member.lua Sun Aug 12 22:14:06 2012 +0200 +++ b/app/main/index/_index_member.lua Fri Aug 17 00:03:23 2012 +0200 @@ -16,8 +16,8 @@ tabs[#tabs+1] = { name = "timeline", label = _"Latest events", - module = "member", - view = "_event_list", + module = "event", + view = "_list", params = { } } diff -r 7102c66b05f3 -r 82f13fbbc05a app/main/issue/_filters.lua --- a/app/main/issue/_filters.lua Sun Aug 12 22:14:06 2012 +0200 +++ b/app/main/issue/_filters.lua Fri Aug 17 00:03:23 2012 +0200 @@ -4,6 +4,8 @@ local for_unit = param.get("for_unit", atom.boolean) local for_area = param.get("for_area", atom.boolean) +local for_events = param.get("for_events", atom.boolean) + local filters = {} local filter = { name = "filter" } @@ -21,7 +23,11 @@ name = "open", label = _"Open", selector_modifier = function(selector) - selector:add_where("issue.closed ISNULL") + if for_events then + selector:add_where("event.state in ('admission', 'discussion', 'verification', 'voting')") + else + selector:add_where("issue.closed ISNULL") + end end } end @@ -31,28 +37,44 @@ name = "new", label = _"New", selector_modifier = function(selector) - selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") + if for_events then + selector:add_where("event.state = 'admission'") + else + selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") + end end } filter[#filter+1] = { name = "accepted", label = _"Discussion", selector_modifier = function(selector) - selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") + if for_events then + selector:add_where("event.state = 'discussion'") + else + selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") + end end } filter[#filter+1] = { name = "half_frozen", label = _"Frozen", selector_modifier = function(selector) - selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL") + if for_events then + selector:add_where("event.state = 'verification'") + else + selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL") + end end } filter[#filter+1] = { name = "frozen", label = _"Voting", selector_modifier = function(selector) - selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") + if for_events then + selector:add_where("event.state = 'voting'") + else + selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") + end filter_voting = true end } @@ -63,14 +85,23 @@ name = "finished", label = _"Finished", selector_modifier = function(selector) - selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL") + if for_events then + selector:add_where("event.state IN ('finished_with_winner', 'finished_without_winner')") + else + selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL") + end end } filter[#filter+1] = { name = "cancelled", label = _"Cancelled", selector_modifier = function(selector) - selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL") + + if for_events then + selector:add_where("event.state IN ('canceled_revoked_before_accepted', 'canceled_issue_not_accepted', 'canceled_after_revocation_during_discussion', 'canceled_after_revocation_during_verification')") + else + selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL") + end end } end @@ -86,28 +117,44 @@ name = "finished", label = _"Finished", selector_modifier = function(selector) - selector:add_where("issue.state IN ('finished_with_winner', 'finished_without_winner')") + if for_events then + selector:add_where("event.state IN ('finished_with_winner', 'finished_without_winner')") + else + selector:add_where("issue.state IN ('finished_with_winner', 'finished_without_winner')") + end end } filter[#filter+1] = { name = "finished_with_winner", label = _"with winner", selector_modifier = function(selector) - selector:add_where("issue.state = 'finished_with_winner'") + if for_events then + selector:add_where("event.state = 'finished_with_winner'") + else + selector:add_where("issue.state = 'finished_with_winner'") + end end } filter[#filter+1] = { name = "finished_without_winner", label = _"without winner", selector_modifier = function(selector) - selector:add_where("issue.state = 'finished_without_winner'") + if for_events then + selector:add_where("event.state = 'finished_without_winner'") + else + selector:add_where("issue.state = 'finished_without_winner'") + end end } filter[#filter+1] = { name = "cancelled", label = _"Cancelled", selector_modifier = function(selector) - selector:add_where("issue.state NOT IN ('finished_with_winner', 'finished_without_winner')") + if for_events then + selector:add_where("event.state NOT IN ('finished_with_winner', 'finished_without_winner')") + else + selector:add_where("issue.state NOT IN ('finished_with_winner', 'finished_without_winner')") + end end } end @@ -165,6 +212,13 @@ selector_modifier = function() end } filter[#filter+1] = { + name = "initiated", + label = _"Initiated", + selector_modifier = function(selector) + 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 }) + end + } + filter[#filter+1] = { name = "supported", label = _"Supported", selector_modifier = function() end @@ -174,13 +228,13 @@ label = _"Potentially supported", selector_modifier = function() end } - filter[#filter+1] = { - name = "initiated", - label = _"Initiated", - selector_modifier = function(selector) - 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 }) - end - } + if state == 'closed' or for_events then + filter[#filter+1] = { + name = "voted", + label = _"Voted", + selector_modifier = function() end + } + end filters[#filters+1] = filter end @@ -192,7 +246,7 @@ local filter_interest = param.get_all_cgi()["filter_interest"] if filter_interest ~= "any" and filter_interest ~= nil and ( - filter_interest == "issue" or filter_interest == "supported" or filter_interest == "potentially_supported" + filter_interest == "issue" or filter_interest == "supported" or filter_interest == "potentially_supported" or filter_interest == 'voted' ) then local function add_default_joins(selector) @@ -225,6 +279,9 @@ "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) " .. "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 }) + elseif filter_interest == "voted" then + 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 }) + end end @@ -251,6 +308,8 @@ "ELSE " .. "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) " .. "END", member.id, member.id }) + elseif filter_interest == "voted" then + selector:add_where({ "EXISTS(SELECT 1 FROM direct_voter WHERE direct_voter.issue_id = issue.id AND direct_voter.member_id = ?) ", member.id }) end end @@ -269,6 +328,8 @@ elseif filter_interest == "potentially_supported" then selector:add_where({ "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 }) + elseif filter_interest == "voted" then + selector:add_where({ "EXISTS(SELECT 1 FROM delegating_voter WHERE delegating_voter.issue_id = issue.id AND delegating_voter.member_id = ?) ", member.id }) end end