# HG changeset patch # User Daniel Poelzleithner # Date 1286246646 -7200 # Node ID 4fb486bce60819f4d4464d6977427b9bec1fc122 # Parent 36aedac3e4bfd06dde80a1a1694a37f93f9ea036 add pageinator to issue view. this "paginator" shows links to the prev/area/next issues that have the same state then the current one. This helps a lot when inspecting new issues or voting. The voting filter works a little bit different, as he also activtes the not_voted subfilter because it is most likely only not voted issues are interessting to the user diff -r 36aedac3e4bf -r 4fb486bce608 app/main/_layout/default.html --- a/app/main/_layout/default.html Mon Oct 04 15:52:22 2010 +0200 +++ b/app/main/_layout/default.html Tue Oct 05 04:44:06 2010 +0200 @@ -63,6 +63,9 @@
+
+ +
diff -r 36aedac3e4bf -r 4fb486bce608 app/main/issue/_filters.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/main/issue/_filters.lua Tue Oct 05 04:44:06 2010 +0200 @@ -0,0 +1,186 @@ +local filters = {} + +-- FIXME: the filter should be named like the corresponding issue.state value + +filters[#filters+1] = { + label = _"Filter", + name = "filter", + { + name = "open", + label = _"Open", + selector_modifier = function(selector) + selector:add_where("issue.closed ISNULL") + end + }, + { + name = "new", + label = _"New", + selector_modifier = function(selector) + selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") + end + }, + { + name = "accepted", + label = _"In discussion", + selector_modifier = function(selector) + selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") + end + }, + { + name = "half_frozen", + label = _"Frozen", + selector_modifier = function(selector) + selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL") + end + }, + { + name = "frozen", + label = _"Voting", + selector_modifier = function(selector) + selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") + filter_voting = true + end + }, + { + name = "finished", + label = _"Finished", + selector_modifier = function(selector) + selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL") + end + }, + { + name = "cancelled", + label = _"Cancelled", + selector_modifier = function(selector) + selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL") + end + }, + { + name = "any", + label = _"Any", + selector_modifier = function(selector) end + }, +} + + +if app.session.member and param.get("filter") == "frozen" then + filters[#filters+1] = { + label = _"Filter", + name = "filter_voting", + { + name = "any", + label = _"Any", + selector_modifier = function() end + }, + { + name = "not_voted", + label = _"Not voted", + selector_modifier = function(selector) + selector:left_join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id }) + selector:add_where("direct_voter.member_id ISNULL") + end + }, + { + name = "voted", + label = _"Voted", + selector_modifier = function(selector) + selector:join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id }) + end + }, + } +end + + +filters[#filters+1] = { + label = _"Filter", + name = "filter_interest", + { + name = "any", + label = _"Any", + selector_modifier = function() end + }, + { + name = "my", + label = _"Interested", + selector_modifier = function(selector) + selector:join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", app.session.member.id }) + end + }, + { + name = "supported", + label = _"Supported", + selector_modifier = function(selector) + 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 }) + end + }, + { + name = "potentially_supported", + label = _"Potential supported", + selector_modifier = function(selector) + 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 }) + end + }, + { + 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 = ? WHERE initiative.issue_id = issue.id)", app.session.member.id }) + end + }, +} + +if not param.get("no_sort", atom.boolean) then + filters[#filters+1] = { + label = _"Order by", + name = "issue_list", + { + name = "max_potential_support", + label = _"Max potential support", + selector_modifier = function(selector) + selector:add_order_by("(SELECT max(supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC") + end + }, + { + name = "max_support", + label = _"Max support", + selector_modifier = function(selector) + selector:add_order_by("(SELECT max(satisfied_supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC") + end + }, + { + name = "population", + label = _"Population", + selector_modifier = function(selector) + selector:add_order_by("issue.population DESC") + end + }, + { + name = "newest", + label = _"Newest", + selector_modifier = function(selector) + selector:add_order_by("issue.created DESC") + end + }, + { + name = "oldest", + label = _"Oldest", + selector_modifier = function(selector) + selector:add_order_by("issue.created") + end + } + } +end + +function filters:get_filter(group, name) + for i,grp in ipairs(self) do + if grp.name == group then + for i,entry in ipairs(grp) do + if entry.name == name then + return entry + end + end + end + end +end + +return filters \ No newline at end of file diff -r 36aedac3e4bf -r 4fb486bce608 app/main/issue/_list.lua --- a/app/main/issue/_list.lua Mon Oct 04 15:52:22 2010 +0200 +++ b/app/main/issue/_list.lua Tue Oct 05 04:44:06 2010 +0200 @@ -14,175 +14,7 @@ "issue_list" } -local filters = {} - -filters[#filters+1] = { - label = _"Filter", - { - name = "open", - label = _"Open", - selector_modifier = function(selector) - selector:add_where("issue.closed ISNULL") - end - }, - { - name = "new", - label = _"New", - selector_modifier = function(selector) - selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") - end - }, - { - name = "accepted", - label = _"In discussion", - selector_modifier = function(selector) - selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") - end - }, - { - name = "half_frozen", - label = _"Frozen", - selector_modifier = function(selector) - selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL") - end - }, - { - name = "frozen", - label = _"Voting", - selector_modifier = function(selector) - selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") - filter_voting = true - end - }, - { - name = "finished", - label = _"Finished", - selector_modifier = function(selector) - selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL") - end - }, - { - name = "cancelled", - label = _"Cancelled", - selector_modifier = function(selector) - selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL") - end - }, - { - name = "any", - label = _"Any", - selector_modifier = function(selector) end - }, -} - - -if app.session.member and param.get("filter") == "frozen" then - filters[#filters+1] = { - label = _"Filter", - name = "filter_voting", - { - name = "any", - label = _"Any", - selector_modifier = function() end - }, - { - name = "not_voted", - label = _"Not voted", - selector_modifier = function(selector) - selector:left_join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id }) - selector:add_where("direct_voter.member_id ISNULL") - end - }, - { - name = "voted", - label = _"Voted", - selector_modifier = function(selector) - selector:join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id }) - end - }, - } -end - - -filters[#filters+1] = { - label = _"Filter", - name = "filter_interest", - { - name = "any", - label = _"Any", - selector_modifier = function() end - }, - { - name = "my", - label = _"Interested", - selector_modifier = function(selector) - selector:join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", app.session.member.id }) - end - }, - { - name = "supported", - label = _"Supported", - selector_modifier = function(selector) - 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 }) - end - }, - { - name = "potentially_supported", - label = _"Potential supported", - selector_modifier = function(selector) - 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 }) - end - }, - { - 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 = ? WHERE initiative.issue_id = issue.id)", app.session.member.id }) - end - }, -} - -if not param.get("no_sort", atom.boolean) then - filters[#filters+1] = { - label = _"Order by", - name = "issue_list", - { - name = "max_potential_support", - label = _"Max potential support", - selector_modifier = function(selector) - selector:add_order_by("(SELECT max(supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC") - end - }, - { - name = "max_support", - label = _"Max support", - selector_modifier = function(selector) - selector:add_order_by("(SELECT max(satisfied_supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC") - end - }, - { - name = "population", - label = _"Population", - selector_modifier = function(selector) - selector:add_order_by("issue.population DESC") - end - }, - { - name = "newest", - label = _"Newest", - selector_modifier = function(selector) - selector:add_order_by("issue.created DESC") - end - }, - { - name = "oldest", - label = _"Oldest", - selector_modifier = function(selector) - selector:add_order_by("issue.created") - end - } - } -end +local filters = execute.load_chunk{module="issue", chunk="_filters.lua"} filters.content = function() local ui_paginate = ui.paginate diff -r 36aedac3e4bf -r 4fb486bce608 app/main/issue/_show_head.lua --- a/app/main/issue/_show_head.lua Mon Oct 04 15:52:22 2010 +0200 +++ b/app/main/issue/_show_head.lua Tue Oct 05 04:44:06 2010 +0200 @@ -37,6 +37,111 @@ end) +slot.select("content_navigation", function() + + if app.session.member_id then + + local this = 0 + local issues_selector = Issue:new_selector() + + -- FIXME: !DRY + local issue_filter_map = { + new = "new.png", + accepted = "comments.png", + half_frozen = "lock.png", + frozen ="email_open.png", + finished = "tick.png", + cancelled = "cross.png", + } + + + local mk_link = function(index, text, icon, ltr) + content = function() + if ltr then + slot.put(text) + ui.image{ static = "icons/16/"..icon } + else + ui.image{ static = "icons/16/"..icon } + slot.put(text) + end + end + if records[this+index] then + ui.link{ + content = content, + module = "issue", + view = "show", + id = records[this+index].id, + } + else + ui.container{ + content = content, + } + end + end + + issues_selector + :add_where{"issue.area_id = ?", issue.area.id} + + local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = {filter = "frozen"}} + + local state = issue.state + + -- FIXME: fix filter names to reflect issue.state values + if state == "voting" then + state = "frozen" + elseif state == "frozen" then + state = "half_frozen" + end + + filter = filters:get_filter("filter", state) + if filter then + filter.selector_modifier(issues_selector) + + -- add subfilter to voting pager, so only not voted entries will be shown + -- as this seems the most usefull exception + if filter.name == "frozen" then + filter_voting_name = "not_voted" + local vfilter = filters:get_filter("filter_voting", "not_voted") + if vfilter then + vfilter.selector_modifier(issues_selector) + end + end + end + + records = issues_selector:exec() + + for i,cissue in ipairs(records) do + if cissue.id == issue.id then + this = i + break + end + end + + mk_link(-1, "Previous", "resultset_previous.png") + if issue.area then + ui.link{ + content = function() + if issue_filter_map[state] then + ui.image{ static = "icons/16/"..issue_filter_map[state] } + end + slot.put(issue.area.name) + end, + module = "area", + view = "show", + id = issue.area.id, + params = { + filter = filter and filter.name or nil, + filter_voting = filter_voting_name, + tab = "issues" + } + } + end + mk_link(1, "Next", "resultset_next.png", 1) + end +end + +) + slot.select("actions", function() if app.session.member_id then diff -r 36aedac3e4bf -r 4fb486bce608 static/style.css --- a/static/style.css Mon Oct 04 15:52:22 2010 +0200 +++ b/static/style.css Tue Oct 05 04:44:06 2010 +0200 @@ -182,7 +182,6 @@ .title_bar { border-bottom: 1px solid #777; - margin-bottom: 2ex; padding-top: 1ex; padding-bottom: 0.5ex; } @@ -250,6 +249,21 @@ vertical-align: middle; } +.content_navigation { + font-size: 75%; + background-color: #eee; + margin-bottom: 2ex; + padding-left: 1em; +} + +.content_navigation div, +.content_navigation a { + display: inline-block; + padding: 3px 0.5em 3px 0.0em; + margin-right: 1em; + vertical-align: middle; +} + .actions a:hover { background-color: #d7d7d7; } @@ -265,6 +279,9 @@ margin-right: 1em; } + + + /************************************************************************* * vote info / delegation */