liquid_feedback_frontend
changeset 414:699b9fa7bc36
Integrated new event system, splitted issues in open/closed, changed navigation
line diff
1.1 --- a/app/main/_filter/20_session.lua Sat Mar 10 13:54:14 2012 +0100 1.2 +++ b/app/main/_filter/20_session.lua Sat Mar 10 16:57:49 2012 +0100 1.3 @@ -13,4 +13,12 @@ 1.4 1.5 locale.set{ lang = app.session.lang or config.default_lang or "en" } 1.6 1.7 +if locale.get("lang") == "de" then 1.8 + locale.set{ 1.9 + date_format = 'DD.MM.YYYY', 1.10 + time_format = 'HH:MM Uhr', 1.11 + decimal_point = ',' 1.12 + } 1.13 +end 1.14 + 1.15 execute.inner()
2.1 --- a/app/main/_filter_view/30_navigation.lua Sat Mar 10 13:54:14 2012 +0100 2.2 +++ b/app/main/_filter_view/30_navigation.lua Sat Mar 10 16:57:49 2012 +0100 2.3 @@ -4,10 +4,26 @@ 2.4 2.5 if config.public_access or app.session.member_id then 2.6 ui.link{ 2.7 - text = _"Home", 2.8 + attr = { class = "logolf" }, 2.9 + content = _"Home", 2.10 module = 'index', 2.11 view = 'index' 2.12 } 2.13 + ui.link{ 2.14 + content = _"Units", 2.15 + module = 'unit', 2.16 + view = 'list' 2.17 + } 2.18 + ui.link{ 2.19 + content = _"Members", 2.20 + module = 'member', 2.21 + view = 'list' 2.22 + } 2.23 + ui.link{ 2.24 + content = _"Contacts", 2.25 + module = 'contact', 2.26 + view = 'list' 2.27 + } 2.28 else 2.29 ui.link{ 2.30 text = _"Login", 2.31 @@ -16,24 +32,6 @@ 2.32 } 2.33 end 2.34 2.35 - if app.session.member then 2.36 - 2.37 - if not config.single_unit_id then 2.38 - ui.link{ 2.39 - text = _"Units", 2.40 - module = 'unit', 2.41 - view = 'list' 2.42 - } 2.43 - else 2.44 - ui.link{ 2.45 - text = _"Areas", 2.46 - module = 'unit', 2.47 - view = 'show', 2.48 - id = config.single_unit_id 2.49 - } 2.50 - end 2.51 - end 2.52 - 2.53 if config.public_access and app.session.member == nil then 2.54 ui.link{ 2.55 text = _"Login", 2.56 @@ -65,65 +63,68 @@ 2.57 } 2.58 else 2.59 2.60 - ui.link{ 2.61 - text = _"Timeline", 2.62 - module = "timeline", 2.63 - view = "index" 2.64 - } 2.65 - 2.66 - ui.link{ 2.67 - text = _"Members", 2.68 - module = 'member', 2.69 - view = 'list', 2.70 - params = { member_list = "newest" } 2.71 - } 2.72 - 2.73 - ui.link{ 2.74 - text = _"Contacts", 2.75 - module = 'contact', 2.76 - view = 'list' 2.77 - } 2.78 + ui.container{ attr = { class = "member_info" }, content = function() 2.79 + ui.link{ 2.80 + content = function() 2.81 + execute.view{ 2.82 + module = "member_image", 2.83 + view = "_show", 2.84 + params = { 2.85 + member = app.session.member, 2.86 + image_type = "avatar", 2.87 + show_dummy = true, 2.88 + class = "micro_avatar", 2.89 + } 2.90 + } 2.91 + ui.tag{ content = app.session.member.name } 2.92 + end, 2.93 + module = "member", 2.94 + view = "show", 2.95 + id = app.session.member_id 2.96 + } 2.97 2.98 - ui.link{ 2.99 - text = (_"Settings"), 2.100 - module = "member", 2.101 - view = "settings" 2.102 - } 2.103 - 2.104 - ui.link{ 2.105 - text = _"About", 2.106 - module = 'index', 2.107 - view = 'about' 2.108 - } 2.109 + ui.link{ 2.110 + text = _"Settings", 2.111 + module = "member", 2.112 + view = "settings" 2.113 + } 2.114 2.115 - if app.session.member_id then 2.116 - ui.link{ 2.117 - -- image = { static = "icons/16/stop.png" }, 2.118 - text = _"Logout", 2.119 - module = 'index', 2.120 - action = 'logout', 2.121 - routing = { 2.122 - default = { 2.123 - mode = "redirect", 2.124 - module = "index", 2.125 - view = "index" 2.126 + if app.session.member_id then 2.127 + ui.link{ 2.128 + -- image = { static = "icons/16/stop.png" }, 2.129 + text = _"Logout", 2.130 + module = 'index', 2.131 + action = 'logout', 2.132 + routing = { 2.133 + default = { 2.134 + mode = "redirect", 2.135 + module = "index", 2.136 + view = "index" 2.137 + } 2.138 } 2.139 } 2.140 - } 2.141 - end 2.142 - 2.143 - if app.session.member.admin then 2.144 - 2.145 - slot.put(" ") 2.146 - 2.147 + end 2.148 + 2.149 ui.link{ 2.150 - attr = { class = { "admin_only" } }, 2.151 - text = _"Admin", 2.152 - module = 'admin', 2.153 - view = 'index' 2.154 + text = _"About", 2.155 + module = 'index', 2.156 + view = 'about' 2.157 } 2.158 2.159 - end 2.160 + if app.session.member.admin then 2.161 + 2.162 + slot.put(" ") 2.163 + 2.164 + ui.link{ 2.165 + attr = { class = { "admin_only" } }, 2.166 + text = _"Admin", 2.167 + module = 'admin', 2.168 + view = 'index' 2.169 + } 2.170 + 2.171 + end 2.172 + end } 2.173 + 2.174 end 2.175 2.176 end)
3.1 --- a/app/main/_filter_view/32_searchbox.lua Sat Mar 10 13:54:14 2012 +0100 3.2 +++ b/app/main/_filter_view/32_searchbox.lua Sat Mar 10 16:57:49 2012 +0100 3.3 @@ -2,7 +2,7 @@ 3.4 execute.inner() 3.5 return 3.6 end 3.7 - 3.8 +--[[ 3.9 slot.select('searchbox', function() 3.10 3.11 ui.form{ 3.12 @@ -30,5 +30,5 @@ 3.13 } 3.14 3.15 end) 3.16 - 3.17 +--]] 3.18 execute.inner(); 3.19 \ No newline at end of file
4.1 --- a/app/main/area/show_tab.lua Sat Mar 10 13:54:14 2012 +0100 4.2 +++ b/app/main/area/show_tab.lua Sat Mar 10 16:57:49 2012 +0100 4.3 @@ -1,6 +1,13 @@ 4.4 local area = param.get("area", "table") or Area:by_id(param.get_id()) 4.5 4.6 -local issues_selector = area:get_reference_selector("issues") 4.7 +local open_issues_selector = area:get_reference_selector("issues") 4.8 + :add_where("issue.closed ISNULL") 4.9 + :add_order_by("coalesce(issue.fully_frozen + issue.voting_time, issue.half_frozen + issue.verification_time, issue.accepted + issue.discussion_time, issue.created + issue.admission_time) - now()") 4.10 + 4.11 +local closed_issues_selector = area:get_reference_selector("issues") 4.12 + :add_where("issue.closed NOTNULL") 4.13 + :add_order_by("issue.closed DESC") 4.14 + 4.15 local members_selector = area:get_reference_selector("members") 4.16 local delegations_selector = area:get_reference_selector("delegations") 4.17 4.18 @@ -10,20 +17,34 @@ 4.19 static_params = { area_id = area.id }, 4.20 } 4.21 4.22 -tabs[#tabs+1] = 4.23 - { 4.24 - name = "issues", 4.25 - label = _"Issues" .. " (" .. tostring(issues_selector:count()) .. ")", 4.26 - icon = { static = "icons/16/folder.png" }, 4.27 - module = "issue", 4.28 - view = "_list", 4.29 - params = { 4.30 - issues_selector = issues_selector, 4.31 - filter = cgi.params["filter"], 4.32 - filter_voting = param.get("filter_voting"), 4.33 - for_area_list = true 4.34 - } 4.35 +tabs[#tabs+1] = { 4.36 + name = "timeline", 4.37 + label = _"Events", 4.38 + module = "event", 4.39 + view = "_list", 4.40 + params = { for_area = area } 4.41 +} 4.42 + 4.43 +tabs[#tabs+1] = { 4.44 + name = "open", 4.45 + label = _"Open issues", 4.46 + module = "issue", 4.47 + view = "_list", 4.48 + params = { 4.49 + for_state = "open", 4.50 + issues_selector = open_issues_selector, for_area = true 4.51 } 4.52 +} 4.53 +tabs[#tabs+1] = { 4.54 + name = "closed", 4.55 + label = _"Closed issues", 4.56 + module = "issue", 4.57 + view = "_list", 4.58 + params = { 4.59 + for_state = "closed", 4.60 + issues_selector = closed_issues_selector, for_area = true 4.61 + } 4.62 +} 4.63 4.64 if app.session.member_id then 4.65 tabs[#tabs+1] =
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 5.2 +++ b/app/main/event/_list.lua Sat Mar 10 16:57:49 2012 +0100 5.3 @@ -0,0 +1,174 @@ 5.4 +local global = param.get("global", atom.boolean) 5.5 +local for_member = param.get("for_member", "table") 5.6 +local for_unit = param.get("for_unit", "table") 5.7 +local for_area = param.get("for_area", "table") 5.8 + 5.9 +local event_selector = Event:new_selector() 5.10 + :add_order_by("event.id DESC") 5.11 + :limit(25) 5.12 + :join("issue", nil, "issue.id = event.issue_id") 5.13 + 5.14 +if for_member then 5.15 + event_selector:add_where{ "event.member_id = ?", for_member.id } 5.16 +elseif for_unit then 5.17 + event_selector:join("area", nil, "area.id = issue.area_id") 5.18 + event_selector:add_where{ "area.unit_id = ?", for_unit.id } 5.19 +elseif for_area then 5.20 + event_selector:add_where{ "issue.area_id = ?", for_area.id } 5.21 +elseif not global then 5.22 + 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 }) 5.23 +end 5.24 + 5.25 +if app.session.member_id then 5.26 + event_selector 5.27 + :left_join("interest", "_interest", { "_interest.issue_id = issue.id AND _interest.member_id = ?", app.session.member.id } ) 5.28 + :add_field("(_interest.member_id NOTNULL)", "is_interested") 5.29 + :left_join("delegating_interest_snapshot", "_delegating_interest", { "_delegating_interest.issue_id = issue.id AND _delegating_interest.member_id = ? AND _delegating_interest.event = issue.latest_snapshot_event", app.session.member.id } ) 5.30 + :add_field("_delegating_interest.delegate_member_ids[1]", "is_interested_by_delegation_to_member_id") 5.31 + :add_field("_delegating_interest.delegate_member_ids[array_upper(_delegating_interest.delegate_member_ids, 1)]", "is_interested_via_member_id") 5.32 + :add_field("array_length(_delegating_interest.delegate_member_ids, 1)", "delegation_chain_length") 5.33 +end 5.34 + 5.35 +--local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = { member = app.session.member }} 5.36 + 5.37 +--filters.content = function() 5.38 + 5.39 + ui.container{ attr = { class = "issues events" }, content = function() 5.40 + 5.41 + local last_event_date 5.42 + for i, event in ipairs(event_selector:exec()) do 5.43 + if event.occurrence.date ~= last_event_date then 5.44 + ui.container{ attr = { class = "date" }, content = format.date(event.occurrence.date) } 5.45 + last_event_date = event.occurrence.date 5.46 + end 5.47 + local class = "issue" 5.48 + if event.is_interested then 5.49 + class = class .. " interested" 5.50 + elseif event.is_interested_by_delegation_to_member_id then 5.51 + class = class .. " interested_by_delegation" 5.52 + end 5.53 + ui.container{ attr = { class = class }, content = function() 5.54 + 5.55 + ui.container { attr = { class = "issue_info" }, content = function() 5.56 + 5.57 + ui.container{ content = function() 5.58 + ui.link{ 5.59 + attr = { class = "issue_id" }, 5.60 + text = _("Issue ##{id}", { id = tostring(event.issue_id) }), 5.61 + module = "issue", 5.62 + view = "show", 5.63 + id = event.issue_id 5.64 + } 5.65 + 5.66 + slot.put(" · ") 5.67 + ui.tag{ content = event.issue.area.name } 5.68 + slot.put(" · ") 5.69 + ui.tag{ content = event.issue.area.unit.name } 5.70 + slot.put(" · ") 5.71 + ui.tag{ content = event.issue.policy.name } 5.72 + end } 5.73 + 5.74 + ui.container{ attr = { class = "issue_policy_info" }, content = function() 5.75 + if event.member_id then 5.76 + ui.link{ 5.77 + content = function() 5.78 + execute.view{ 5.79 + module = "member_image", 5.80 + view = "_show", 5.81 + params = { 5.82 + member = event.member, 5.83 + image_type = "avatar", 5.84 + show_dummy = true, 5.85 + class = "micro_avatar", 5.86 + popup_text = text 5.87 + } 5.88 + } 5.89 + end, 5.90 + module = "member", view = "show", id = event.member_id 5.91 + } 5.92 + slot.put(" ") 5.93 + ui.link{ 5.94 + text = event.member.name, 5.95 + module = "member", view = "show", id = event.member_id 5.96 + } 5.97 + slot.put(" · ") 5.98 + end 5.99 + local event_name = event.event_name 5.100 + local event_image 5.101 + if event.event == "issue_state_changed" then 5.102 + if event.state == "discussion" then 5.103 + event_name = _"Discussion started" 5.104 + event_image = "new.png" 5.105 + elseif event.state == "verification" then 5.106 + event_name = _"Verification started" 5.107 + event_image = "lock.png" 5.108 + elseif event.state == "voting" then 5.109 + event_name = _"Voting started" 5.110 + event_image = "email_open.png" 5.111 + else 5.112 + event_name = event.state_name 5.113 + end 5.114 + if event_image then 5.115 + ui.image{ static = "icons/16/" .. event_image } 5.116 + end 5.117 + end 5.118 + ui.tag{ attr = { class = "event_name" }, content = event_name } 5.119 + slot.put(" · ") 5.120 + ui.tag{ attr = { class = "time" }, content = format.time(event.occurrence) } 5.121 + end } 5.122 + 5.123 + end } 5.124 + 5.125 + if event.suggestion_id then 5.126 + ui.container{ attr = { class = "suggestion" }, content = function() 5.127 + ui.link{ 5.128 + text = event.suggestion.name, 5.129 + module = "suggestion", view = "show", id = event.suggestion_id 5.130 + } 5.131 + end } 5.132 + end 5.133 + 5.134 + ui.container{ attr = { class = "initiative_list" }, content = function() 5.135 + if not event.initiative_id then 5.136 + local initiatives_selector = Initiative:new_selector() 5.137 + :add_where{ "initiative.issue_id = ?", event.issue_id } 5.138 + :add_order_by("initiative.rank, initiative.supporter_count") 5.139 + execute.view{ module = "initiative", view = "_list", params = { 5.140 + issue = event.issue, 5.141 + initiatives_selector = initiatives_selector, 5.142 + no_sort = true, 5.143 + limit = 3 5.144 + } } 5.145 + else 5.146 + local initiatives_selector = Initiative:new_selector() 5.147 + :add_where{ "initiative.id = ?", event.initiative_id } 5.148 + execute.view{ module = "initiative", view = "_list", params = { 5.149 + issue = event.issue, 5.150 + initiatives_selector = initiatives_selector, 5.151 + no_sort = true, 5.152 + limit = 1 5.153 + } } 5.154 + end 5.155 + end } 5.156 + 5.157 + --[[ 5.158 + if event.initiative_id then 5.159 + ui.container{ attr = { class = "initiative_id" }, content = event.initiative_id } 5.160 + end 5.161 + if event.draft_id then 5.162 + ui.container{ attr = { class = "draft_id" }, content = event.draft_id } 5.163 + end 5.164 + if event.suggestion_id then 5.165 + ui.container{ attr = { class = "suggestion_id" }, content = event.suggestion_id } 5.166 + end 5.167 + --]] 5.168 + 5.169 + end } 5.170 + end 5.171 + 5.172 + end } 5.173 + 5.174 +--end 5.175 + 5.176 +--filters.selector = event_selector 5.177 +--ui.filters(filters) 5.178 \ No newline at end of file
6.1 --- a/app/main/index/index.lua Sat Mar 10 13:54:14 2012 +0100 6.2 +++ b/app/main/index/index.lua Sat Mar 10 16:57:49 2012 +0100 6.3 @@ -1,16 +1,3 @@ 6.4 -slot.select("title", function() 6.5 - if app.session.member then 6.6 - execute.view{ 6.7 - module = "member_image", 6.8 - view = "_show", 6.9 - params = { 6.10 - member = app.session.member, 6.11 - image_type = "avatar" 6.12 - } 6.13 - } 6.14 - end 6.15 -end) 6.16 - 6.17 slot.select("title", function() 6.18 ui.container{ 6.19 attr = { class = "lang_chooser" },
7.1 --- a/app/main/initiative/_list_element.lua Sat Mar 10 13:54:14 2012 +0100 7.2 +++ b/app/main/initiative/_list_element.lua Sat Mar 10 16:57:49 2012 +0100 7.3 @@ -9,8 +9,10 @@ 7.4 and initiative.issue.ranks_available or initiative.admitted == false 7.5 then 7.6 ui.field.rank{ attr = { class = "rank" }, value = initiative.rank, eligible = initiative.eligible } 7.7 + elseif not initiative.issue.closed then 7.8 + ui.image{ static = "icons/16/script.png" } 7.9 else 7.10 - ui.image{ static = "icons/16/script.png" } 7.11 + ui.image{ static = "icons/16/cross.png" } 7.12 end 7.13 end } 7.14
8.1 --- a/app/main/issue/_filters.lua Sat Mar 10 13:54:14 2012 +0100 8.2 +++ b/app/main/issue/_filters.lua Sat Mar 10 16:57:49 2012 +0100 8.3 @@ -1,69 +1,226 @@ 8.4 local member = param.get("member", "table") 8.5 +local state = param.get("state") 8.6 +local for_unit = param.get("for_unit", atom.boolean) 8.7 +local for_area = param.get("for_area", atom.boolean) 8.8 8.9 local filters = {} 8.10 8.11 --- FIXME: the filter should be named like the corresponding issue.state value 8.12 +if member then 8.13 + local filter = { 8.14 + name = "filter_interest", 8.15 + } 8.16 + if not for_unit and not for_area then 8.17 + filter[#filter+1] = { 8.18 + name = "any", 8.19 + label = _"All units", 8.20 + selector_modifier = function() end 8.21 + } 8.22 + filter[#filter+1] = { 8.23 + name = "unit", 8.24 + label = _"My units", 8.25 + selector_modifier = function(selector) 8.26 + selector:join("area", nil, "area.id = issue.area_id") 8.27 + selector:join("privilege", nil, { "privilege.unit_id = area.unit_id AND privilege.member_id = ? AND privilege.voting_right", member.id }) 8.28 + end 8.29 + } 8.30 + end 8.31 + if for_unit and not for_area then 8.32 + filter[#filter+1] = { 8.33 + name = "any", 8.34 + label = _"All areas", 8.35 + selector_modifier = function() end 8.36 + } 8.37 + end 8.38 + if not for_area then 8.39 + filter[#filter+1] = { 8.40 + name = "area", 8.41 + label = _"My areas", 8.42 + selector_modifier = function(selector) 8.43 + selector:join("membership", nil, { "membership.area_id = issue.area_id AND membership.member_id = ?", member.id }) 8.44 + end 8.45 + } 8.46 + end 8.47 + if for_area then 8.48 + filter[#filter+1] = { 8.49 + name = "any", 8.50 + label = _"All issues", 8.51 + selector_modifier = function() end 8.52 + } 8.53 + end 8.54 + filter[#filter+1] = { 8.55 + name = "issue", 8.56 + label = _"Interested", 8.57 + selector_modifier = function() end 8.58 + } 8.59 + filter[#filter+1] = { 8.60 + name = "supported", 8.61 + label = _"Supported", 8.62 + selector_modifier = function() end 8.63 + } 8.64 + filter[#filter+1] = { 8.65 + name = "potentially_supported", 8.66 + label = _"Potentially supported", 8.67 + selector_modifier = function() end 8.68 + } 8.69 + filter[#filter+1] = { 8.70 + name = "initiated", 8.71 + label = _"Initiated", 8.72 + selector_modifier = function(selector) 8.73 + 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 }) 8.74 + end 8.75 + } 8.76 + 8.77 + filters[#filters+1] = filter 8.78 +end 8.79 8.80 -filters[#filters+1] = { 8.81 - name = "filter", 8.82 - { 8.83 - name = "any", 8.84 - label = _"Any phase", 8.85 - selector_modifier = function(selector) end 8.86 - }, 8.87 - { 8.88 + 8.89 + 8.90 +if app.session.member then 8.91 + 8.92 + local filter_interest = param.get_all_cgi()["filter_interest"] 8.93 + 8.94 + if filter_interest ~= "any" and filter_interest ~= nil and ( 8.95 + filter_interest == "issue" or filter_interest == "supported" or filter_interest == "potentially_supported" 8.96 + ) then 8.97 + filters[#filters+1] = { 8.98 + name = "filter_delegation", 8.99 + { 8.100 + name = "any", 8.101 + label = _"Direct and by delegation", 8.102 + selector_modifier = function(selector) 8.103 + if filter_interest == "issue" then 8.104 + selector:left_join("delegating_interest_snapshot", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? AND filter_interest.event = issue.latest_snapshot_event", member.id }) 8.105 + selector:left_join("interest", "filter_delegating_interest", { "filter_delegating_interest.issue_id = issue.id AND filter_delegating_interest.member_id = ? ", member.id }) 8.106 + selector:add_where{ "filter_interest.member_id NOTNULL OR filter_delegating_interest.member_id NOTNULL" } 8.107 + elseif filter_interest == "supported" then 8.108 + selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = ? WHERE initiative.issue_id = issue.id AND critical_opinion.member_id ISNULL LIMIT 1) OR EXISTS (SELECT 1 FROM initiative JOIN direct_supporter_snapshot ON direct_supporter_snapshot.initiative_id = initiative.id AND direct_supporter_snapshot.event = issue.latest_snapshot_event JOIN delegating_interest_snapshot ON delegating_interest_snapshot.delegate_member_ids[array_upper(delegating_interest_snapshot.delegate_member_ids, 1)] = direct_supporter_snapshot.member_id AND delegating_interest_snapshot.issue_id = issue.id AND delegating_interest_snapshot.member_id = ? AND delegating_interest_snapshot.event = issue.latest_snapshot_event WHERE initiative.issue_id = issue.id AND direct_supporter_snapshot.satisfied LIMIT 1)", member.id, member.id, member.id }) 8.109 + elseif filter_interest == "potentially_supported" then 8.110 + selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = ? WHERE initiative.issue_id = issue.id LIMIT 1) OR EXISTS (SELECT 1 FROM initiative JOIN direct_supporter_snapshot ON direct_supporter_snapshot.initiative_id = initiative.id AND direct_supporter_snapshot.event = issue.latest_snapshot_event JOIN delegating_interest_snapshot ON delegating_interest_snapshot.delegate_member_ids[array_upper(delegating_interest_snapshot.delegate_member_ids, 1)] = direct_supporter_snapshot.member_id AND delegating_interest_snapshot.issue_id = issue.id AND delegating_interest_snapshot.member_id = ? AND delegating_interest_snapshot.event = issue.latest_snapshot_event WHERE initiative.issue_id = issue.id AND NOT direct_supporter_snapshot.satisfied LIMIT 1)", member.id, member.id, member.id, member.id }) 8.111 + end 8.112 + end 8.113 + }, 8.114 + { 8.115 + name = "direct", 8.116 + label = _"Direct", 8.117 + selector_modifier = function(selector) 8.118 + if filter_interest == "issue" then 8.119 + selector:join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", member.id }) 8.120 + elseif filter_interest == "supported" then 8.121 + selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = ? WHERE initiative.issue_id = issue.id AND critical_opinion.member_id ISNULL LIMIT 1)", member.id, member.id }) 8.122 + elseif filter_interest == "potentially_supported" then 8.123 + selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = ? WHERE initiative.issue_id = issue.id LIMIT 1)", member.id, member.id }) 8.124 + end 8.125 + end 8.126 + }, 8.127 + { 8.128 + name = "delegated", 8.129 + label = _"By delegation", 8.130 + selector_modifier = function(selector) 8.131 + if filter_interest == "issue" then 8.132 + selector:join("delegating_interest_snapshot", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? AND filter_interest.event = issue.latest_snapshot_event", member.id }) 8.133 + elseif filter_interest == "supported" then 8.134 + selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN direct_supporter_snapshot ON direct_supporter_snapshot.initiative_id = initiative.id AND direct_supporter_snapshot.event = issue.latest_snapshot_event JOIN delegating_interest_snapshot ON delegating_interest_snapshot.delegate_member_ids[array_upper(delegating_interest_snapshot.delegate_member_ids, 1)] = direct_supporter_snapshot.member_id AND delegating_interest_snapshot.issue_id = issue.id AND delegating_interest_snapshot.member_id = ? AND delegating_interest_snapshot.event = issue.latest_snapshot_event WHERE initiative.issue_id = issue.id AND direct_supporter_snapshot.satisfied LIMIT 1)", member.id }) 8.135 + elseif filter_interest == "potentially_supported" then 8.136 + selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN direct_supporter_snapshot ON direct_supporter_snapshot.initiative_id = initiative.id AND direct_supporter_snapshot.event = issue.latest_snapshot_event JOIN delegating_interest_snapshot ON delegating_interest_snapshot.delegate_member_ids[array_upper(delegating_interest_snapshot.delegate_member_ids, 1)] = direct_supporter_snapshot.member_id AND delegating_interest_snapshot.issue_id = issue.id AND delegating_interest_snapshot.member_id = ? AND delegating_interest_snapshot.event = issue.latest_snapshot_event WHERE initiative.issue_id = issue.id AND NOT direct_supporter_snapshot.satisfied LIMIT 1)", member.id, member.id }) 8.137 + end 8.138 + end 8.139 + } 8.140 + } 8.141 + end 8.142 + 8.143 +end 8.144 + 8.145 +local filter = { name = "filter" } 8.146 + 8.147 +filter[#filter+1] = { 8.148 + name = "any", 8.149 + label = _"Any phase", 8.150 + selector_modifier = function(selector) end 8.151 +} 8.152 + 8.153 +if not state or state == "open" then 8.154 + filter[#filter+1] = { 8.155 name = "open", 8.156 label = _"Open", 8.157 selector_modifier = function(selector) 8.158 selector:add_where("issue.closed ISNULL") 8.159 end 8.160 - }, 8.161 - { 8.162 + } 8.163 + filter[#filter+1] = { 8.164 name = "new", 8.165 label = _"New", 8.166 selector_modifier = function(selector) 8.167 selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") 8.168 end 8.169 - }, 8.170 - { 8.171 + } 8.172 + filter[#filter+1] = { 8.173 name = "accepted", 8.174 label = _"Discussion", 8.175 selector_modifier = function(selector) 8.176 selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL") 8.177 end 8.178 - }, 8.179 - { 8.180 + } 8.181 + filter[#filter+1] = { 8.182 name = "half_frozen", 8.183 label = _"Frozen", 8.184 selector_modifier = function(selector) 8.185 selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL") 8.186 end 8.187 - }, 8.188 - { 8.189 + } 8.190 + filter[#filter+1] = { 8.191 name = "frozen", 8.192 label = _"Voting", 8.193 selector_modifier = function(selector) 8.194 selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") 8.195 filter_voting = true 8.196 end 8.197 - }, 8.198 - { 8.199 + } 8.200 +end 8.201 + 8.202 +if not state then 8.203 + filter[#filter+1] = { 8.204 name = "finished", 8.205 label = _"Finished", 8.206 selector_modifier = function(selector) 8.207 selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL") 8.208 end 8.209 - }, 8.210 - { 8.211 + } 8.212 + filter[#filter+1] = { 8.213 name = "cancelled", 8.214 label = _"Cancelled", 8.215 selector_modifier = function(selector) 8.216 selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL") 8.217 end 8.218 } 8.219 -} 8.220 +end 8.221 8.222 +if state == "closed" then 8.223 + filter[#filter+1] = { 8.224 + name = "finished_with_winner", 8.225 + label = _"Finished with winner", 8.226 + selector_modifier = function(selector) 8.227 + selector:add_where("issue.state = 'finished_with_winner'") 8.228 + end 8.229 + } 8.230 + filter[#filter+1] = { 8.231 + name = "finished_without_winner", 8.232 + label = _"Finished without winner", 8.233 + selector_modifier = function(selector) 8.234 + selector:add_where("issue.state = 'finished_without_winner'") 8.235 + end 8.236 + } 8.237 + filter[#filter+1] = { 8.238 + name = "cancelled", 8.239 + label = _"Cancelled", 8.240 + selector_modifier = function(selector) 8.241 + selector:add_where("issue.state NOT IN ('finished_with_winner', 'finished_without_winner')") 8.242 + end 8.243 + } 8.244 +end 8.245 8.246 +filters[#filters+1] = filter 8.247 + 8.248 +--[[ 8.249 if not param.get("no_sort", atom.boolean) then 8.250 8.251 local filter = { name = "order" } 8.252 @@ -100,103 +257,7 @@ 8.253 filters[#filters+1] = filter 8.254 8.255 end 8.256 - 8.257 -if app.session.member then 8.258 - local filter = { 8.259 - name = "filter_interest", 8.260 - { 8.261 - name = "any", 8.262 - label = _"Any", 8.263 - selector_modifier = function() end 8.264 - }, 8.265 - { 8.266 - name = "my", 8.267 - label = _"Interested", 8.268 - selector_modifier = function() end 8.269 - }, 8.270 - { 8.271 - name = "supported", 8.272 - label = _"Supported", 8.273 - selector_modifier = function() end 8.274 - }, 8.275 - { 8.276 - name = "potentially_supported", 8.277 - label = _"Potentially supported", 8.278 - selector_modifier = function() end 8.279 - }, 8.280 - { 8.281 - name = "initiated", 8.282 - label = _"Initiated", 8.283 - selector_modifier = function(selector) 8.284 - 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 }) 8.285 - end 8.286 - }, 8.287 - } 8.288 - 8.289 - --[[ 8.290 - if param.get_all_cgi()["filter"] == "finished" then 8.291 - filter[#filter+1] = { 8.292 - name = "voted", 8.293 - label = _"Voted", 8.294 - selector_modifier = function(selector) 8.295 - selector:add_where({ "EXISTS (SELECT 1 FROM vote WHERE vote.issue_id = issue.id AND vote.member_id = ?)", member.id }) 8.296 - end 8.297 - } 8.298 - end 8.299 - --]] 8.300 - 8.301 - filters[#filters+1] = filter 8.302 - 8.303 - local filter_interest = param.get_all_cgi()["filter_interest"] 8.304 - 8.305 - if filter_interest ~= "any" and filter_interest ~= nil and filter_interest ~= "initiated" then 8.306 - filters[#filters+1] = { 8.307 - name = "filter_delegation", 8.308 - { 8.309 - name = "any", 8.310 - label = _"Direct and by delegation", 8.311 - selector_modifier = function(selector) 8.312 - if filter_interest == "my" then 8.313 - selector:left_join("delegating_interest_snapshot", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? AND filter_interest.event = issue.latest_snapshot_event", member.id }) 8.314 - selector:left_join("interest", "filter_delegating_interest", { "filter_delegating_interest.issue_id = issue.id AND filter_delegating_interest.member_id = ? ", member.id }) 8.315 - selector:add_where{ "filter_interest.member_id NOTNULL OR filter_delegating_interest.member_id NOTNULL" } 8.316 - elseif filter_interest == "supported" then 8.317 - selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = ? WHERE initiative.issue_id = issue.id AND critical_opinion.member_id ISNULL LIMIT 1) OR EXISTS (SELECT 1 FROM initiative JOIN direct_supporter_snapshot ON direct_supporter_snapshot.initiative_id = initiative.id AND direct_supporter_snapshot.event = issue.latest_snapshot_event JOIN delegating_interest_snapshot ON delegating_interest_snapshot.delegate_member_ids[array_upper(delegating_interest_snapshot.delegate_member_ids, 1)] = direct_supporter_snapshot.member_id AND delegating_interest_snapshot.issue_id = issue.id AND delegating_interest_snapshot.member_id = ? AND delegating_interest_snapshot.event = issue.latest_snapshot_event WHERE initiative.issue_id = issue.id AND direct_supporter_snapshot.satisfied LIMIT 1)", member.id, member.id, member.id }) 8.318 - elseif filter_interest == "potentially_supported" then 8.319 - selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = ? WHERE initiative.issue_id = issue.id LIMIT 1) OR EXISTS (SELECT 1 FROM initiative JOIN direct_supporter_snapshot ON direct_supporter_snapshot.initiative_id = initiative.id AND direct_supporter_snapshot.event = issue.latest_snapshot_event JOIN delegating_interest_snapshot ON delegating_interest_snapshot.delegate_member_ids[array_upper(delegating_interest_snapshot.delegate_member_ids, 1)] = direct_supporter_snapshot.member_id AND delegating_interest_snapshot.issue_id = issue.id AND delegating_interest_snapshot.member_id = ? AND delegating_interest_snapshot.event = issue.latest_snapshot_event WHERE initiative.issue_id = issue.id AND NOT direct_supporter_snapshot.satisfied LIMIT 1)", member.id, member.id, member.id, member.id }) 8.320 - end 8.321 - end 8.322 - }, 8.323 - { 8.324 - name = "direct", 8.325 - label = _"Direct", 8.326 - selector_modifier = function(selector) 8.327 - if filter_interest == "my" then 8.328 - selector:join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", member.id }) 8.329 - elseif filter_interest == "supported" then 8.330 - selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = ? WHERE initiative.issue_id = issue.id AND critical_opinion.member_id ISNULL LIMIT 1)", member.id, member.id }) 8.331 - elseif filter_interest == "potentially_supported" then 8.332 - selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? JOIN critical_opinion ON critical_opinion.initiative_id = initiative.id AND critical_opinion.member_id = ? WHERE initiative.issue_id = issue.id LIMIT 1)", member.id, member.id }) 8.333 - end 8.334 - end 8.335 - }, 8.336 - { 8.337 - name = "delegated", 8.338 - label = _"By delegation", 8.339 - selector_modifier = function(selector) 8.340 - if filter_interest == "my" then 8.341 - selector:join("delegating_interest_snapshot", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? AND filter_interest.event = issue.latest_snapshot_event", member.id }) 8.342 - elseif filter_interest == "supported" then 8.343 - selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN direct_supporter_snapshot ON direct_supporter_snapshot.initiative_id = initiative.id AND direct_supporter_snapshot.event = issue.latest_snapshot_event JOIN delegating_interest_snapshot ON delegating_interest_snapshot.delegate_member_ids[array_upper(delegating_interest_snapshot.delegate_member_ids, 1)] = direct_supporter_snapshot.member_id AND delegating_interest_snapshot.issue_id = issue.id AND delegating_interest_snapshot.member_id = ? AND delegating_interest_snapshot.event = issue.latest_snapshot_event WHERE initiative.issue_id = issue.id AND direct_supporter_snapshot.satisfied LIMIT 1)", member.id }) 8.344 - elseif filter_interest == "potentially_supported" then 8.345 - selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN direct_supporter_snapshot ON direct_supporter_snapshot.initiative_id = initiative.id AND direct_supporter_snapshot.event = issue.latest_snapshot_event JOIN delegating_interest_snapshot ON delegating_interest_snapshot.delegate_member_ids[array_upper(delegating_interest_snapshot.delegate_member_ids, 1)] = direct_supporter_snapshot.member_id AND delegating_interest_snapshot.issue_id = issue.id AND delegating_interest_snapshot.member_id = ? AND delegating_interest_snapshot.event = issue.latest_snapshot_event WHERE initiative.issue_id = issue.id AND NOT direct_supporter_snapshot.satisfied LIMIT 1)", member.id, member.id }) 8.346 - end 8.347 - end 8.348 - } 8.349 - } 8.350 - end 8.351 - 8.352 -end 8.353 +--]] 8.354 8.355 if app.session.member and member.id == app.session.member_id and (param.get_all_cgi()["filter"] == "frozen") then 8.356 filters[#filters+1] = { 8.357 @@ -224,31 +285,8 @@ 8.358 } 8.359 end 8.360 8.361 -if member then 8.362 - filters[#filters+1] = { 8.363 - name = "filter_membership", 8.364 - { 8.365 - name = "any", 8.366 - label = _"All units", 8.367 - selector_modifier = function() end 8.368 - }, 8.369 - { 8.370 - name = "unit", 8.371 - label = _"My units", 8.372 - selector_modifier = function(selector) 8.373 - selector:join("area", nil, "area.id = issue.area_id") 8.374 - selector:join("privilege", nil, { "privilege.unit_id = area.unit_id AND privilege.member_id = ? AND privilege.voting_right", member.id }) 8.375 - end 8.376 - }, 8.377 - { 8.378 - name = "area", 8.379 - label = _"My areas", 8.380 - selector_modifier = function(selector) 8.381 - selector:join("membership", nil, { "membership.area_id = issue.area_id AND membership.member_id = ?", member.id }) 8.382 - end 8.383 - }, 8.384 - } 8.385 -end 8.386 + 8.387 + 8.388 8.389 function filters:get_filter(group, name) 8.390 for i,grp in ipairs(self) do
9.1 --- a/app/main/issue/_list.lua Sat Mar 10 13:54:14 2012 +0100 9.2 +++ b/app/main/issue/_list.lua Sat Mar 10 16:57:49 2012 +0100 9.3 @@ -1,5 +1,15 @@ 9.4 local issues_selector = param.get("issues_selector", "table") 9.5 local for_member = param.get("for_member", "table") or app.session.member 9.6 +local for_state = param.get("for_state") 9.7 +local for_unit = param.get("for_unit", atom.boolean) 9.8 +local for_area = param.get("for_area", atom.boolean) 9.9 + 9.10 + 9.11 +if for_state == "open" then 9.12 + issues_selector:add_where("issue.closed ISNULL") 9.13 +elseif for_state == "closed" then 9.14 + issues_selector:add_where("issue.closed NOTNULL") 9.15 +end 9.16 9.17 if app.session.member_id then 9.18 issues_selector 9.19 @@ -20,7 +30,9 @@ 9.20 "issue_list" 9.21 } 9.22 9.23 -local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = { member = for_member }} 9.24 +local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = { 9.25 + member = for_member, state = for_state, for_unit = for_unit, for_area = for_area 9.26 +}} 9.27 9.28 filters.content = function() 9.29 ui.paginate{ 9.30 @@ -120,6 +132,9 @@ 9.31 ui.tag{ content = issue.area.name } 9.32 slot.put(" · ") 9.33 ui.tag{ content = issue.area.unit.name } 9.34 + slot.put(" · ") 9.35 + ui.tag{ content = issue.policy.name } 9.36 + 9.37 9.38 end 9.39 } 9.40 @@ -128,14 +143,15 @@ 9.41 tag = "div", 9.42 content = function() 9.43 9.44 - ui.tag{ content = issue.policy.name } 9.45 - 9.46 - slot.put(" · ") 9.47 - ui.tag{ content = issue.state_name } 9.48 + ui.tag{ attr = { class = "event_name" }, content = issue.state_name } 9.49 9.50 if issue.state_time_left then 9.51 slot.put(" · ") 9.52 - ui.tag{ content = _("#{time_left} left", { time_left = issue.state_time_left:gsub("days", _"days"):gsub("day", _"day") }) } 9.53 + if issue.state_time_left:sub(1,1) == "-" then 9.54 + ui.tag{ content = _("Counting starts soon") } 9.55 + else 9.56 + ui.tag{ content = _("#{time_left} left", { time_left = issue.state_time_left:gsub("days", _"days"):gsub("day", _"day") }) } 9.57 + end 9.58 end 9.59 9.60 end
10.1 --- a/app/main/member/_area_list.lua Sat Mar 10 13:54:14 2012 +0100 10.2 +++ b/app/main/member/_area_list.lua Sat Mar 10 16:57:49 2012 +0100 10.3 @@ -49,7 +49,10 @@ 10.4 else 10.5 ui.container{ attr = { class = "voting_priv_info" }, content = _"You have voting privileges for this unit, but you are not member of any of its areas." } 10.6 end 10.7 + ui.container{ content = function() 10.8 + ui.link{ content = _"Show all areas of unit", module = "unit", view = "show", id = unit.id } 10.9 + end } 10.10 + 10.11 end } 10.12 - 10.13 + 10.14 end 10.15 -
11.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 11.2 +++ b/app/main/member/_event_list.lua Sat Mar 10 16:57:49 2012 +0100 11.3 @@ -0,0 +1,27 @@ 11.4 +local member = param.get("member", "table") 11.5 +local events = param.get_all_cgi()["events"] or "personal" 11.6 + 11.7 +ui.container{ attr = { class = "ui_filter_head" }, content = function() 11.8 + 11.9 + ui.link{ 11.10 + attr = { class = events == "personal" and "ui_tabs_link active" or nil }, 11.11 + text = _"Personal timeline", 11.12 + module = "index", view = "index", params = { tab = "timeline", events = "personal" } 11.13 + } 11.14 + 11.15 + ui.link{ 11.16 + attr = { class = events == "global" and "active" or nil }, 11.17 + text = _"Global timeline", 11.18 + module = "index", view = "index", params = { tab = "timeline", events = "global" } 11.19 + } 11.20 +end } 11.21 + 11.22 +if events == "personal" then 11.23 + execute.view{ 11.24 + module = "event", view = "_list" 11.25 + } 11.26 +elseif events == "global" then 11.27 + execute.view{ 11.28 + module = "event", view = "_list", params = { global = true } 11.29 + } 11.30 +end
12.1 --- a/app/main/member/settings.lua Sat Mar 10 13:54:14 2012 +0100 12.2 +++ b/app/main/member/settings.lua Sat Mar 10 16:57:49 2012 +0100 12.3 @@ -13,13 +13,6 @@ 12.4 12.5 local pages = {} 12.6 12.7 -pages[#pages+1] = { module = "member", view = "edit", text = _"Edit profile" } 12.8 -pages[#pages+1] = { module = "member", view = "edit_images", text = _"Upload images" } 12.9 -pages[#pages+1] = { view = "settings_notification", text = _"Notification settings" } 12.10 -pages[#pages+1] = { view = "settings_display", text = _"Display settings" } 12.11 -if not config.locked_profile_fields.notify_email then 12.12 - pages[#pages+1] = { view = "settings_email", text = _"Change your notification email address" } 12.13 -end 12.14 if not config.locked_profile_fields.name then 12.15 pages[#pages+1] = { view = "settings_name", text = _"Change your screen name" } 12.16 end 12.17 @@ -27,6 +20,11 @@ 12.18 pages[#pages+1] = { view = "settings_login", text = _"Change your login" } 12.19 end 12.20 pages[#pages+1] = { view = "settings_password", text = _"Change your password" } 12.21 +if not config.locked_profile_fields.notify_email then 12.22 + pages[#pages+1] = { view = "settings_email", text = _"Change your notification email address" } 12.23 +end 12.24 +pages[#pages+1] = { view = "settings_notification", text = _"Notification settings" } 12.25 +pages[#pages+1] = { view = "settings_display", text = _"Display settings" } 12.26 pages[#pages+1] = { view = "developer_settings", text = _"Developer settings" } 12.27 12.28 ui.list{
13.1 --- a/app/main/member/show_tab.lua Sat Mar 10 13:54:14 2012 +0100 13.2 +++ b/app/main/member/show_tab.lua Sat Mar 10 16:57:49 2012 +0100 13.3 @@ -169,7 +169,7 @@ 13.4 view = "_area_list", 13.5 params = { areas_selector = areas_selector, member = member }, 13.6 } 13.7 - 13.8 +--[[ 13.9 local issues_selector = Issue:new_selector() 13.10 tabs[#tabs+1] = { 13.11 name = "issues", 13.12 @@ -184,49 +184,84 @@ 13.13 filter_interest = (member.id ~= app.session.member_id) and "my" or nil, 13.14 }, 13.15 } 13.16 - 13.17 -local outgoing_delegations_selector = member:get_reference_selector("outgoing_delegations") 13.18 - :left_join("issue", "_member_showtab_issue", "_member_showtab_issue.id = delegation.issue_id") 13.19 - :add_where("_member_showtab_issue.closed ISNULL") 13.20 +--]] 13.21 +if show_as_homepage then 13.22 + tabs[#tabs+1] = { 13.23 + name = "timeline", 13.24 + label = _"Events", 13.25 + module = "member", 13.26 + view = "_event_list", 13.27 + params = { } 13.28 + } 13.29 +else 13.30 + tabs[#tabs+1] = { 13.31 + name = "timeline", 13.32 + label = _"Events", 13.33 + module = "event", 13.34 + view = "_list", 13.35 + params = { for_member = member } 13.36 + } 13.37 +end 13.38 + 13.39 tabs[#tabs+1] = { 13.40 - name = "outgoing_delegations", 13.41 - label = _"Outgoing delegations" .. " (" .. tostring(outgoing_delegations_selector:count()) .. ")", 13.42 - icon = { static = "icons/16/table_go.png" }, 13.43 - module = "delegation", 13.44 + name = "open", 13.45 + label = _"Open issues", 13.46 + module = "issue", 13.47 view = "_list", 13.48 - params = { delegations_selector = outgoing_delegations_selector, outgoing = true }, 13.49 + params = { 13.50 + for_state = "open", 13.51 + issues_selector = Issue:new_selector() 13.52 + :add_where("issue.closed ISNULL") 13.53 + :add_order_by("coalesce(issue.fully_frozen + issue.voting_time, issue.half_frozen + issue.verification_time, issue.accepted + issue.discussion_time, issue.created + issue.admission_time) - now()") 13.54 + } 13.55 +} 13.56 +tabs[#tabs+1] = { 13.57 + name = "closed", 13.58 + label = _"Closed issues", 13.59 + module = "issue", 13.60 + view = "_list", 13.61 + params = { 13.62 + for_state = "closed", 13.63 + issues_selector = Issue:new_selector() 13.64 + :add_where("issue.closed NOTNULL") 13.65 + :add_order_by("issue.closed DESC") 13.66 + 13.67 + } 13.68 } 13.69 13.70 -local incoming_delegations_selector = member:get_reference_selector("incoming_delegations") 13.71 - :left_join("issue", "_member_showtab_issue", "_member_showtab_issue.id = delegation.issue_id") 13.72 - :add_where("_member_showtab_issue.closed ISNULL") 13.73 -tabs[#tabs+1] = { 13.74 - name = "incoming_delegations", 13.75 - label = _"Incoming delegations" .. " (" .. tostring(incoming_delegations_selector:count()) .. ")", 13.76 - icon = { static = "icons/16/table_go.png" }, 13.77 - module = "delegation", 13.78 - view = "_list", 13.79 - params = { delegations_selector = incoming_delegations_selector, incoming = true }, 13.80 -} 13.81 +if not show_as_homepage then 13.82 + local outgoing_delegations_selector = member:get_reference_selector("outgoing_delegations") 13.83 + :left_join("issue", "_member_showtab_issue", "_member_showtab_issue.id = delegation.issue_id") 13.84 + :add_where("_member_showtab_issue.closed ISNULL") 13.85 + tabs[#tabs+1] = { 13.86 + name = "outgoing_delegations", 13.87 + label = _"Outgoing delegations" .. " (" .. tostring(outgoing_delegations_selector:count()) .. ")", 13.88 + icon = { static = "icons/16/table_go.png" }, 13.89 + module = "delegation", 13.90 + view = "_list", 13.91 + params = { delegations_selector = outgoing_delegations_selector, outgoing = true }, 13.92 + } 13.93 13.94 -local contacts_selector = member:get_reference_selector("saved_members"):add_where("public") 13.95 -tabs[#tabs+1] = { 13.96 - name = "contacts", 13.97 - label = _"Contacts" .. " (" .. tostring(contacts_selector:count()) .. ")", 13.98 - icon = { static = "icons/16/book_edit.png" }, 13.99 - module = "member", 13.100 - view = "_list", 13.101 - params = { members_selector = contacts_selector }, 13.102 -} 13.103 + local incoming_delegations_selector = member:get_reference_selector("incoming_delegations") 13.104 + :left_join("issue", "_member_showtab_issue", "_member_showtab_issue.id = delegation.issue_id") 13.105 + :add_where("_member_showtab_issue.closed ISNULL") 13.106 + tabs[#tabs+1] = { 13.107 + name = "incoming_delegations", 13.108 + label = _"Incoming delegations" .. " (" .. tostring(incoming_delegations_selector:count()) .. ")", 13.109 + icon = { static = "icons/16/table_go.png" }, 13.110 + module = "delegation", 13.111 + view = "_list", 13.112 + params = { delegations_selector = incoming_delegations_selector, incoming = true }, 13.113 + } 13.114 13.115 -if show_as_homepage then 13.116 + local contacts_selector = member:get_reference_selector("saved_members"):add_where("public") 13.117 tabs[#tabs+1] = { 13.118 - name = "profile", 13.119 - label = _"Profile", 13.120 - icon = { static = "icons/16/application_form.png" }, 13.121 + name = "contacts", 13.122 + label = _"Contacts" .. " (" .. tostring(contacts_selector:count()) .. ")", 13.123 + icon = { static = "icons/16/book_edit.png" }, 13.124 module = "member", 13.125 - view = "_profile", 13.126 - params = { member = member }, 13.127 + view = "_list", 13.128 + params = { members_selector = contacts_selector }, 13.129 } 13.130 end 13.131
14.1 --- a/app/main/unit/show.lua Sat Mar 10 13:54:14 2012 +0100 14.2 +++ b/app/main/unit/show.lua Sat Mar 10 16:57:49 2012 +0100 14.3 @@ -44,10 +44,17 @@ 14.4 :join("privilege", "trustee_privilege", "trustee_privilege.member_id = trustee.id AND trustee_privilege.unit_id = delegation.unit_id AND trustee_privilege.voting_right") 14.5 :add_where{ "delegation.unit_id = ?", unit.id } 14.6 14.7 -local issues_selector = Issue:new_selector() 14.8 +local open_issues_selector = Issue:new_selector() 14.9 :join("area", nil, "area.id = issue.area_id") 14.10 :add_where{ "area.unit_id = ?", unit.id } 14.11 - 14.12 + :add_where("issue.closed ISNULL") 14.13 + :add_order_by("coalesce(issue.fully_frozen + issue.voting_time, issue.half_frozen + issue.verification_time, issue.accepted + issue.discussion_time, issue.created + issue.admission_time) - now()") 14.14 + 14.15 +local closed_issues_selector = Issue:new_selector() 14.16 + :join("area", nil, "area.id = issue.area_id") 14.17 + :add_where{ "area.unit_id = ?", unit.id } 14.18 + :add_where("issue.closed NOTNULL") 14.19 + :add_order_by("issue.closed DESC") 14.20 14.21 local tabs = { 14.22 module = "unit", 14.23 @@ -64,11 +71,32 @@ 14.24 } 14.25 14.26 tabs[#tabs+1] = { 14.27 - name = "issues", 14.28 - label = _"Issues", 14.29 + name = "timeline", 14.30 + label = _"Events", 14.31 + module = "event", 14.32 + view = "_list", 14.33 + params = { for_unit = unit } 14.34 +} 14.35 + 14.36 +tabs[#tabs+1] = { 14.37 + name = "open", 14.38 + label = _"Open issues", 14.39 module = "issue", 14.40 view = "_list", 14.41 - params = { issues_selector = issues_selector } 14.42 + params = { 14.43 + for_state = "open", 14.44 + issues_selector = open_issues_selector, for_unit = true 14.45 + } 14.46 +} 14.47 +tabs[#tabs+1] = { 14.48 + name = "closed", 14.49 + label = _"Closed issues", 14.50 + module = "issue", 14.51 + view = "_list", 14.52 + params = { 14.53 + for_state = "closed", 14.54 + issues_selector = closed_issues_selector, for_unit = true 14.55 + } 14.56 } 14.57 14.58 if app.session.member_id then
15.1 --- a/config/default.lua Sat Mar 10 13:54:14 2012 +0100 15.2 +++ b/config/default.lua Sat Mar 10 16:57:49 2012 +0100 15.3 @@ -22,7 +22,6 @@ 15.4 15.5 config.locked_profile_fields = { 15.6 field_name = true, 15.7 - notify_email = true 15.8 } 15.9 15.10 config.member_image_content_type = "image/jpeg"
16.1 --- a/config/development.lua Sat Mar 10 13:54:14 2012 +0100 16.2 +++ b/config/development.lua Sat Mar 10 16:57:49 2012 +0100 16.3 @@ -1,4 +1,4 @@ 16.4 -config.absolute_base_url = "http://localhost/lf/" 16.5 +config.absolute_base_url = "http://10.8.33.34/lf/" 16.6 16.7 execute.config("default") 16.8 16.9 @@ -50,3 +50,5 @@ 16.10 group_id = "g.7WDKN3StkEyuWkyN", 16.11 cookie_path = "/" 16.12 } 16.13 + 16.14 +config.document_dir = "/home/dark/tmp"
17.1 --- a/locale/translations.de.lua Sat Mar 10 13:54:14 2012 +0100 17.2 +++ b/locale/translations.de.lua Sat Mar 10 16:57:49 2012 +0100 17.3 @@ -114,6 +114,7 @@ 17.4 ["Choose member"] = "Mitglied auswählen"; 17.5 ["Click for details"] = "Klicke für Details"; 17.6 ["Closed"] = "geschlossen"; 17.7 +["Closed issues"] = "Geschlossene Themen"; 17.8 ["Closed user group, please login to participate."] = "Geschlossene Benutzergruppe: Bitte melde dich an um teilzunehmen."; 17.9 ["Collective opinion of supporters"] = "Meinungsbild der Unterstützer"; 17.10 ["Commit suggestion"] = "Anregung speichern"; 17.11 @@ -126,6 +127,7 @@ 17.12 ["Contacts"] = "Kontakte"; 17.13 ["Content"] = "Inhalt"; 17.14 ["Counting of votes"] = "Auszählung"; 17.15 +["Counting starts soon"] = "Auszählung beginnt in Kürze"; 17.16 ["Create / edit area"] = "Themengebiet anlegen / bearbeiten"; 17.17 ["Create / edit policy"] = "Regelwerk anlegen / bearbeiten"; 17.18 ["Create alternative initiative"] = "Alternative Initiative hinzufügen"; 17.19 @@ -174,6 +176,7 @@ 17.20 ["Discussion"] = "Diskussion"; 17.21 ["Discussion URL"] = "Diskussions-URL"; 17.22 ["Discussion on issue"] = "Diskussion zum Thema"; 17.23 +["Discussion started"] = "Diskussion gestartet"; 17.24 ["Discussion time"] = "Zeit für die Diskussion"; 17.25 ["Discussion with initiators"] = "Diskussion mit den Initiatoren"; 17.26 ["Discussion, frozen and voting phase"] = "Diskussions-, Eingefroren- und Abstimmphase"; 17.27 @@ -188,7 +191,6 @@ 17.28 ["Edit initiative"] = "Initiative bearbeiten"; 17.29 ["Edit my page"] = "Meine Seite bearbeiten"; 17.30 ["Edit my profile"] = "Mein Profil bearbeiten"; 17.31 -["Edit profile"] = "Profil bearbeiten"; 17.32 ["Eligible as winner"] = "Als Gewinner qualifiziert"; 17.33 ["Email address"] = "E-Mail-Adresse"; 17.34 ["Email address confirmation"] = "Bestätigung der E-Mail-Adresse"; 17.35 @@ -202,12 +204,15 @@ 17.36 ["Error while updating member, database reported:<br /><br /> (#{errormessage})"] = "Fehler beim aktualisieren des Mitglieds, die Datenbank berichtet folgenden Fehler:<br /><br /> (#{errormessage})"; 17.37 ["Etherpad authentication failed"] = "Etherpad-Anmeldung fehlgeschlagen"; 17.38 ["Event #{id} -> #{num} members"] = false; 17.39 +["Events"] = "Ereignisse"; 17.40 ["External memberships"] = "Externe Mitgliedschaften"; 17.41 ["External posts"] = "Externe Ämter"; 17.42 ["Finish voting"] = "Stimmabgabe abschließen"; 17.43 ["Finished"] = "Abgeschlossen"; 17.44 ["Finished (with winner)"] = "Abgeschlossen (mit Gewinner)"; 17.45 ["Finished (without winner)"] = "Abgeschlossen (ohne Gewinner)"; 17.46 +["Finished with winner"] = "Abgeschlossen mit Gewinner"; 17.47 +["Finished without winner"] = "Abgeschlossen ohne Gewinner"; 17.48 ["Friday"] = "Freitag"; 17.49 ["Frozen"] = "Eingefroren"; 17.50 ["Frozen and voting phase"] = "Eingefroren- und Abstimmphase"; 17.51 @@ -216,6 +221,7 @@ 17.52 ["Generate API key"] = "API-Schlüssel erzeugen"; 17.53 ["Global delegation"] = "Globale Delegation"; 17.54 ["Global delegation set to '#{name}'"] = "Globale Delegation an '#{name}' erteilt"; 17.55 +["Global timeline"] = false; 17.56 ["Half frozen at"] = "Halb eingefroren am/um"; 17.57 ["Hello\n\n"] = "Hallo\n\n"; 17.58 ["Hello "] = "Hallo "; 17.59 @@ -347,7 +353,6 @@ 17.60 ["New draft has been added to initiative"] = "Neuer Entwurf wurde der Initiative hinzugefügt"; 17.61 ["New initiative"] = "Neue Initiative"; 17.62 ["New initiative draft"] = "Neuer Entwurfstext der Initiative"; 17.63 -["New initiative in existing issue"] = "Neue Initiative in bestehenden Thema"; 17.64 ["New issue"] = "Neues Thema"; 17.65 ["New password"] = "Neues Kennwort"; 17.66 ["New passwords does not match."] = "Du hast nicht zweimal das gleiche Kennwort eingegeben"; 17.67 @@ -389,6 +394,7 @@ 17.68 ["One step back"] = "Ein Schritt zurück"; 17.69 ["Open"] = "Offen"; 17.70 ["Open initiatives you are supporting which has been updated their draft:"] = "Offene, von dir unterstützte Initiativen, deren Antragstext aktualisiert wurde:"; 17.71 +["Open issues"] = "Offene Themen"; 17.72 ["OpenID"] = false; 17.73 ["OpenID Login"] = false; 17.74 ["Opinions"] = "Meinungen"; 17.75 @@ -403,6 +409,7 @@ 17.76 ["Password reset request"] = "Kennwort-Rücksetzung anfordern"; 17.77 ["Passwords don't match!"] = "Kennwörter stimmen nicht überein!"; 17.78 ["Passwords must consist of at least 8 characters!"] = "Das Kennwort muss zumindest 8 Zeichen lang sein!"; 17.79 +["Personal timeline"] = false; 17.80 ["Phases"] = "Phasen"; 17.81 ["Phone"] = "Telefon"; 17.82 ["Photo"] = "Foto"; 17.83 @@ -432,6 +439,7 @@ 17.84 ["Potentially supported"] = "Potentiell unterstützt"; 17.85 ["Preview"] = "Vorschau"; 17.86 ["Profession"] = "Beruf"; 17.87 +["Profil"] = false; 17.88 ["Profile"] = "Profil"; 17.89 ["Publish"] = "Veröffentlichen"; 17.90 ["Published"] = "veröffentlicht"; 17.91 @@ -487,6 +495,7 @@ 17.92 ["Settings"] = "Einstellungen"; 17.93 ["Show"] = "Zeige"; 17.94 ["Show active members"] = "Zeige aktive Mitglieder"; 17.95 +["Show all areas of unit"] = "Zeige alle Themengebiete der Gliederung"; 17.96 ["Show areas in use"] = "Zeige verwendete Themenbereiche"; 17.97 ["Show areas not in use"] = "Zeige nicht verwendete Themenbereiche"; 17.98 ["Show diff"] = "Änderungen anzeigen"; 17.99 @@ -586,6 +595,7 @@ 17.100 ["Unknown author"] = "Unbekannter Autor"; 17.101 ["Updated drafts"] = "Neue Entwürfe"; 17.102 ["Upload images"] = "Bilder hochladen"; 17.103 +["Verification started"] = "Phase Überprüfung gestartet"; 17.104 ["Verification time"] = "Zeit für die Überprüfung"; 17.105 ["Version"] = "Version"; 17.106 ["Vote now"] = "Jetzt abstimmen";
18.1 --- a/model/event.lua Sat Mar 10 13:54:14 2012 +0100 18.2 +++ b/model/event.lua Sat Mar 10 16:57:49 2012 +0100 18.3 @@ -9,11 +9,27 @@ 18.4 ref = 'issue', 18.5 } 18.6 18.7 +Event:add_reference{ 18.8 + mode = 'm1', 18.9 + to = "Suggestion", 18.10 + this_key = 'suggestion_id', 18.11 + that_key = 'id', 18.12 + ref = 'suggestion', 18.13 +} 18.14 + 18.15 +Event:add_reference{ 18.16 + mode = 'm1', 18.17 + to = "Member", 18.18 + this_key = 'member_id', 18.19 + that_key = 'id', 18.20 + ref = 'member', 18.21 +} 18.22 + 18.23 function Event.object_get:event_name() 18.24 return ({ 18.25 issue_state_changed = _"Issue reached next phase", 18.26 initiative_created_in_new_issue = _"New issue", 18.27 - initiative_created_in_existing_issue = _"New initiative in existing issue", 18.28 + initiative_created_in_existing_issue = _"New initiative", 18.29 initiative_revoked = _"Initiative revoked", 18.30 new_draft_created = _"New initiative draft", 18.31 suggestion_created = _"New suggestion"
19.1 --- a/model/event_seen_by_member.lua Sat Mar 10 13:54:14 2012 +0100 19.2 +++ b/model/event_seen_by_member.lua Sat Mar 10 16:57:49 2012 +0100 19.3 @@ -1,4 +1,2 @@ 19.4 EventSeenByMember = mondelefant.new_class() 19.5 EventSeenByMember.table = 'event_seen_by_member' 19.6 - 19.7 -
20.1 --- a/static/style.css Sat Mar 10 13:54:14 2012 +0100 20.2 +++ b/static/style.css Sat Mar 10 16:57:49 2012 +0100 20.3 @@ -158,9 +158,7 @@ 20.4 background-image: -webkit-gradient(linear, left top, left bottom, 20.5 color-stop(0%, #888), color-stop(25%,#333) 20.6 ); 20.7 - color: #fff; 20.8 font-size: 90%; 20.9 - line-height: 200%; 20.10 padding-left: 1%; 20.11 box-shadow: #aaa 0 0 5px; 20.12 overflow: hidden; 20.13 @@ -174,6 +172,7 @@ 20.14 20.15 .topbar a { 20.16 color: #eee; 20.17 + line-height: 30px; 20.18 } 20.19 20.20 .topbar a:hover { 20.21 @@ -200,6 +199,10 @@ 20.22 display: inline; 20.23 } 20.24 20.25 +.topbar .member_info { 20.26 + float: right; 20.27 +} 20.28 + 20.29 .searchbox { 20.30 margin: 0; 20.31 padding: 0.1ex 1em 0ex 1em; 20.32 @@ -543,9 +546,8 @@ 20.33 */ 20.34 20.35 .ui_tabs_links { 20.36 - margin-top: 3ex; 20.37 + margin-top: 2ex; 20.38 margin-bottom: 1ex; 20.39 - font-size: 75%; 20.40 } 20.41 20.42 .ui_tabs_links a { 20.43 @@ -566,7 +568,6 @@ 20.44 background-color: #444; 20.45 color: #fff; 20.46 text-decoration: none; 20.47 - padding: 1ex; 20.48 } 20.49 20.50 .ui_tabs_links a.yellow { 20.51 @@ -616,7 +617,8 @@ 20.52 color: #777; 20.53 margin-top: 0.5ex; 20.54 margin-bottom: 0.5ex; 20.55 - font-size: 75%; 20.56 + font-size: 90%; 20.57 + font-weight: bold; 20.58 float: left; 20.59 line-height: 200%; 20.60 margin-right: 2em; 20.61 @@ -942,6 +944,25 @@ 20.62 } 20.63 20.64 /************************************************************************* 20.65 + * Events 20.66 + */ 20.67 + 20.68 +.events .date { 20.69 + font-size: 150%; 20.70 + font-weight: bold; 20.71 + margin-top: 2ex; 20.72 + line-height: 150%; 20.73 +} 20.74 + 20.75 +.event_list .event div { 20.76 +} 20.77 + 20.78 +.event_list .event .member_id { 20.79 + float: right; 20.80 +} 20.81 + 20.82 + 20.83 +/************************************************************************* 20.84 * Issues 20.85 */ 20.86 20.87 @@ -978,14 +999,29 @@ 20.88 background-image: -ms-linear-gradient(top, #dfeaff 0%, #fcfcfc 66%); 20.89 } 20.90 20.91 +.event_list .event .issue_id, 20.92 .issues .issue .issue_info .issue_id { 20.93 font-size: 125%; 20.94 } 20.95 20.96 +.issues .issue .suggestion { 20.97 + margin-left: 1ex; 20.98 + margin-bottom: 1ex; 20.99 + font-weight: bold; 20.100 +} 20.101 + 20.102 .issue_policy_info { 20.103 font-style: italic; 20.104 } 20.105 20.106 +.issue_policy_info .event_name { 20.107 + font-weight: bold; 20.108 +} 20.109 + 20.110 +.issue_policy_info img { 20.111 + vertical-align: middle; 20.112 +} 20.113 + 20.114 .issues .issue .interest_by_delegation { 20.115 float: right; 20.116 }