# HG changeset patch # User bsw # Date 1331395069 -3600 # Node ID 699b9fa7bc364048687ad36dc56a1b6d7a2c4a7e # Parent 336476245f3f4b847b71634e4976bd1b98184135 Integrated new event system, splitted issues in open/closed, changed navigation diff -r 336476245f3f -r 699b9fa7bc36 app/main/_filter/20_session.lua --- a/app/main/_filter/20_session.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/_filter/20_session.lua Sat Mar 10 16:57:49 2012 +0100 @@ -13,4 +13,12 @@ locale.set{ lang = app.session.lang or config.default_lang or "en" } +if locale.get("lang") == "de" then + locale.set{ + date_format = 'DD.MM.YYYY', + time_format = 'HH:MM Uhr', + decimal_point = ',' + } +end + execute.inner() diff -r 336476245f3f -r 699b9fa7bc36 app/main/_filter_view/30_navigation.lua --- a/app/main/_filter_view/30_navigation.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/_filter_view/30_navigation.lua Sat Mar 10 16:57:49 2012 +0100 @@ -4,10 +4,26 @@ if config.public_access or app.session.member_id then ui.link{ - text = _"Home", + attr = { class = "logolf" }, + content = _"Home", module = 'index', view = 'index' } + ui.link{ + content = _"Units", + module = 'unit', + view = 'list' + } + ui.link{ + content = _"Members", + module = 'member', + view = 'list' + } + ui.link{ + content = _"Contacts", + module = 'contact', + view = 'list' + } else ui.link{ text = _"Login", @@ -16,24 +32,6 @@ } end - if app.session.member then - - if not config.single_unit_id then - ui.link{ - text = _"Units", - module = 'unit', - view = 'list' - } - else - ui.link{ - text = _"Areas", - module = 'unit', - view = 'show', - id = config.single_unit_id - } - end - end - if config.public_access and app.session.member == nil then ui.link{ text = _"Login", @@ -65,65 +63,68 @@ } else - ui.link{ - text = _"Timeline", - module = "timeline", - view = "index" - } - - ui.link{ - text = _"Members", - module = 'member', - view = 'list', - params = { member_list = "newest" } - } - - ui.link{ - text = _"Contacts", - module = 'contact', - view = 'list' - } + ui.container{ attr = { class = "member_info" }, content = function() + ui.link{ + content = function() + execute.view{ + module = "member_image", + view = "_show", + params = { + member = app.session.member, + image_type = "avatar", + show_dummy = true, + class = "micro_avatar", + } + } + ui.tag{ content = app.session.member.name } + end, + module = "member", + view = "show", + id = app.session.member_id + } - ui.link{ - text = (_"Settings"), - module = "member", - view = "settings" - } - - ui.link{ - text = _"About", - module = 'index', - view = 'about' - } + ui.link{ + text = _"Settings", + module = "member", + view = "settings" + } - if app.session.member_id then - ui.link{ - -- image = { static = "icons/16/stop.png" }, - text = _"Logout", - module = 'index', - action = 'logout', - routing = { - default = { - mode = "redirect", - module = "index", - view = "index" + if app.session.member_id then + ui.link{ + -- image = { static = "icons/16/stop.png" }, + text = _"Logout", + module = 'index', + action = 'logout', + routing = { + default = { + mode = "redirect", + module = "index", + view = "index" + } } } - } - end - - if app.session.member.admin then - - slot.put(" ") - + end + ui.link{ - attr = { class = { "admin_only" } }, - text = _"Admin", - module = 'admin', - view = 'index' + text = _"About", + module = 'index', + view = 'about' } - end + if app.session.member.admin then + + slot.put(" ") + + ui.link{ + attr = { class = { "admin_only" } }, + text = _"Admin", + module = 'admin', + view = 'index' + } + + end + end } + end end) diff -r 336476245f3f -r 699b9fa7bc36 app/main/_filter_view/32_searchbox.lua --- a/app/main/_filter_view/32_searchbox.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/_filter_view/32_searchbox.lua Sat Mar 10 16:57:49 2012 +0100 @@ -2,7 +2,7 @@ execute.inner() return end - +--[[ slot.select('searchbox', function() ui.form{ @@ -30,5 +30,5 @@ } end) - +--]] execute.inner(); \ No newline at end of file diff -r 336476245f3f -r 699b9fa7bc36 app/main/area/show_tab.lua --- a/app/main/area/show_tab.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/area/show_tab.lua Sat Mar 10 16:57:49 2012 +0100 @@ -1,6 +1,13 @@ local area = param.get("area", "table") or Area:by_id(param.get_id()) -local issues_selector = area:get_reference_selector("issues") +local open_issues_selector = area:get_reference_selector("issues") + :add_where("issue.closed ISNULL") + :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()") + +local closed_issues_selector = area:get_reference_selector("issues") + :add_where("issue.closed NOTNULL") + :add_order_by("issue.closed DESC") + local members_selector = area:get_reference_selector("members") local delegations_selector = area:get_reference_selector("delegations") @@ -10,20 +17,34 @@ static_params = { area_id = area.id }, } -tabs[#tabs+1] = - { - name = "issues", - label = _"Issues" .. " (" .. tostring(issues_selector:count()) .. ")", - icon = { static = "icons/16/folder.png" }, - module = "issue", - view = "_list", - params = { - issues_selector = issues_selector, - filter = cgi.params["filter"], - filter_voting = param.get("filter_voting"), - for_area_list = true - } +tabs[#tabs+1] = { + name = "timeline", + label = _"Events", + module = "event", + view = "_list", + params = { for_area = area } +} + +tabs[#tabs+1] = { + name = "open", + label = _"Open issues", + module = "issue", + view = "_list", + params = { + for_state = "open", + issues_selector = open_issues_selector, for_area = true } +} +tabs[#tabs+1] = { + name = "closed", + label = _"Closed issues", + module = "issue", + view = "_list", + params = { + for_state = "closed", + issues_selector = closed_issues_selector, for_area = true + } +} if app.session.member_id then tabs[#tabs+1] = diff -r 336476245f3f -r 699b9fa7bc36 app/main/event/_list.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/main/event/_list.lua Sat Mar 10 16:57:49 2012 +0100 @@ -0,0 +1,174 @@ +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") + +local event_selector = Event:new_selector() + :add_order_by("event.id DESC") + :limit(25) + :join("issue", nil, "issue.id = event.issue_id") + +if for_member then + event_selector:add_where{ "event.member_id = ?", for_member.id } +elseif for_unit then + event_selector:join("area", nil, "area.id = issue.area_id") + 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 }) +end + +if app.session.member_id then + event_selector + :left_join("interest", "_interest", { "_interest.issue_id = issue.id AND _interest.member_id = ?", app.session.member.id } ) + :add_field("(_interest.member_id NOTNULL)", "is_interested") + :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 } ) + :add_field("_delegating_interest.delegate_member_ids[1]", "is_interested_by_delegation_to_member_id") + :add_field("_delegating_interest.delegate_member_ids[array_upper(_delegating_interest.delegate_member_ids, 1)]", "is_interested_via_member_id") + :add_field("array_length(_delegating_interest.delegate_member_ids, 1)", "delegation_chain_length") +end + +--local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = { member = app.session.member }} + +--filters.content = function() + + ui.container{ attr = { class = "issues events" }, content = function() + + local last_event_date + for i, event in ipairs(event_selector:exec()) do + if event.occurrence.date ~= last_event_date then + ui.container{ attr = { class = "date" }, content = format.date(event.occurrence.date) } + last_event_date = event.occurrence.date + end + local class = "issue" + if event.is_interested then + class = class .. " interested" + elseif event.is_interested_by_delegation_to_member_id then + class = class .. " interested_by_delegation" + end + ui.container{ attr = { class = class }, content = function() + + ui.container { attr = { class = "issue_info" }, content = function() + + ui.container{ content = function() + ui.link{ + attr = { class = "issue_id" }, + text = _("Issue ##{id}", { id = tostring(event.issue_id) }), + module = "issue", + view = "show", + id = event.issue_id + } + + slot.put(" · ") + ui.tag{ content = event.issue.area.name } + slot.put(" · ") + ui.tag{ content = event.issue.area.unit.name } + slot.put(" · ") + ui.tag{ content = event.issue.policy.name } + end } + + ui.container{ attr = { class = "issue_policy_info" }, content = function() + if event.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(" ") + ui.link{ + text = event.member.name, + module = "member", view = "show", id = event.member_id + } + slot.put(" · ") + end + 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 = "new.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" + else + event_name = event.state_name + end + if event_image then + ui.image{ static = "icons/16/" .. event_image } + end + end + ui.tag{ attr = { class = "event_name" }, content = event_name } + slot.put(" · ") + ui.tag{ attr = { class = "time" }, content = format.time(event.occurrence) } + end } + + end } + + if event.suggestion_id then + ui.container{ attr = { class = "suggestion" }, content = function() + ui.link{ + text = event.suggestion.name, + module = "suggestion", view = "show", id = event.suggestion_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") + execute.view{ module = "initiative", view = "_list", params = { + issue = event.issue, + initiatives_selector = initiatives_selector, + no_sort = true, + limit = 3 + } } + else + local initiatives_selector = Initiative:new_selector() + :add_where{ "initiative.id = ?", event.initiative_id } + execute.view{ module = "initiative", view = "_list", params = { + issue = event.issue, + initiatives_selector = initiatives_selector, + no_sort = true, + limit = 1 + } } + end + end } + + --[[ + if event.initiative_id then + ui.container{ attr = { class = "initiative_id" }, content = event.initiative_id } + end + if event.draft_id then + ui.container{ attr = { class = "draft_id" }, content = event.draft_id } + end + if event.suggestion_id then + ui.container{ attr = { class = "suggestion_id" }, content = event.suggestion_id } + end + --]] + + end } + end + + end } + +--end + +--filters.selector = event_selector +--ui.filters(filters) \ No newline at end of file diff -r 336476245f3f -r 699b9fa7bc36 app/main/index/index.lua --- a/app/main/index/index.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/index/index.lua Sat Mar 10 16:57:49 2012 +0100 @@ -1,16 +1,3 @@ -slot.select("title", function() - if app.session.member then - execute.view{ - module = "member_image", - view = "_show", - params = { - member = app.session.member, - image_type = "avatar" - } - } - end -end) - slot.select("title", function() ui.container{ attr = { class = "lang_chooser" }, diff -r 336476245f3f -r 699b9fa7bc36 app/main/initiative/_list_element.lua --- a/app/main/initiative/_list_element.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/initiative/_list_element.lua Sat Mar 10 16:57:49 2012 +0100 @@ -9,8 +9,10 @@ and initiative.issue.ranks_available or initiative.admitted == false then ui.field.rank{ attr = { class = "rank" }, value = initiative.rank, eligible = initiative.eligible } + elseif not initiative.issue.closed then + ui.image{ static = "icons/16/script.png" } else - ui.image{ static = "icons/16/script.png" } + ui.image{ static = "icons/16/cross.png" } end end } diff -r 336476245f3f -r 699b9fa7bc36 app/main/issue/_filters.lua --- a/app/main/issue/_filters.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/issue/_filters.lua Sat Mar 10 16:57:49 2012 +0100 @@ -1,69 +1,226 @@ local member = param.get("member", "table") +local state = param.get("state") +local for_unit = param.get("for_unit", atom.boolean) +local for_area = param.get("for_area", atom.boolean) local filters = {} --- FIXME: the filter should be named like the corresponding issue.state value +if member then + local filter = { + name = "filter_interest", + } + if not for_unit and not for_area then + filter[#filter+1] = { + name = "any", + label = _"All units", + selector_modifier = function() end + } + filter[#filter+1] = { + name = "unit", + label = _"My units", + selector_modifier = function(selector) + selector:join("area", nil, "area.id = issue.area_id") + selector:join("privilege", nil, { "privilege.unit_id = area.unit_id AND privilege.member_id = ? AND privilege.voting_right", member.id }) + end + } + end + if for_unit and not for_area then + filter[#filter+1] = { + name = "any", + label = _"All areas", + selector_modifier = function() end + } + end + if not for_area then + filter[#filter+1] = { + name = "area", + label = _"My areas", + selector_modifier = function(selector) + selector:join("membership", nil, { "membership.area_id = issue.area_id AND membership.member_id = ?", member.id }) + end + } + end + if for_area then + filter[#filter+1] = { + name = "any", + label = _"All issues", + selector_modifier = function() end + } + end + filter[#filter+1] = { + name = "issue", + label = _"Interested", + selector_modifier = function() end + } + filter[#filter+1] = { + name = "supported", + label = _"Supported", + selector_modifier = function() end + } + filter[#filter+1] = { + name = "potentially_supported", + 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 + } + + filters[#filters+1] = filter +end -filters[#filters+1] = { - name = "filter", - { - name = "any", - label = _"Any phase", - selector_modifier = function(selector) end - }, - { + + +if app.session.member then + + 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" + ) then + filters[#filters+1] = { + name = "filter_delegation", + { + name = "any", + label = _"Direct and by delegation", + selector_modifier = function(selector) + if filter_interest == "issue" then + 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 }) + selector:left_join("interest", "filter_delegating_interest", { "filter_delegating_interest.issue_id = issue.id AND filter_delegating_interest.member_id = ? ", member.id }) + selector:add_where{ "filter_interest.member_id NOTNULL OR filter_delegating_interest.member_id NOTNULL" } + elseif filter_interest == "supported" then + 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 }) + elseif filter_interest == "potentially_supported" then + 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 }) + end + end + }, + { + name = "direct", + label = _"Direct", + selector_modifier = function(selector) + if filter_interest == "issue" then + selector:join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", member.id }) + elseif filter_interest == "supported" then + 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 }) + elseif filter_interest == "potentially_supported" then + 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 }) + end + end + }, + { + name = "delegated", + label = _"By delegation", + selector_modifier = function(selector) + if filter_interest == "issue" then + 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 }) + elseif filter_interest == "supported" then + 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 }) + elseif filter_interest == "potentially_supported" then + 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 }) + end + end + } + } + end + +end + +local filter = { name = "filter" } + +filter[#filter+1] = { + name = "any", + label = _"Any phase", + selector_modifier = function(selector) end +} + +if not state or state == "open" then + filter[#filter+1] = { name = "open", label = _"Open", selector_modifier = function(selector) selector:add_where("issue.closed ISNULL") end - }, - { + } + filter[#filter+1] = { name = "new", label = _"New", selector_modifier = function(selector) selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL") 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") 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") end - }, - { + } + filter[#filter+1] = { name = "frozen", label = _"Voting", selector_modifier = function(selector) selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL") filter_voting = true end - }, - { + } +end + +if not state then + filter[#filter+1] = { name = "finished", label = _"Finished", selector_modifier = function(selector) selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL") end - }, - { + } + filter[#filter+1] = { name = "cancelled", label = _"Cancelled", selector_modifier = function(selector) selector:add_where("issue.closed NOTNULL AND issue.fully_frozen ISNULL") end } -} +end +if state == "closed" then + filter[#filter+1] = { + name = "finished_with_winner", + label = _"Finished with winner", + selector_modifier = function(selector) + selector:add_where("issue.state = 'finished_with_winner'") + end + } + filter[#filter+1] = { + name = "finished_without_winner", + label = _"Finished without winner", + selector_modifier = function(selector) + selector:add_where("issue.state = 'finished_without_winner'") + 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')") + end + } +end +filters[#filters+1] = filter + +--[[ if not param.get("no_sort", atom.boolean) then local filter = { name = "order" } @@ -100,103 +257,7 @@ filters[#filters+1] = filter end - -if app.session.member then - local filter = { - name = "filter_interest", - { - name = "any", - label = _"Any", - selector_modifier = function() end - }, - { - name = "my", - label = _"Interested", - selector_modifier = function() end - }, - { - name = "supported", - label = _"Supported", - selector_modifier = function() end - }, - { - name = "potentially_supported", - label = _"Potentially supported", - selector_modifier = function() 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 = ? AND initiator.accepted WHERE initiative.issue_id = issue.id)", member.id }) - end - }, - } - - --[[ - if param.get_all_cgi()["filter"] == "finished" then - filter[#filter+1] = { - name = "voted", - label = _"Voted", - selector_modifier = function(selector) - selector:add_where({ "EXISTS (SELECT 1 FROM vote WHERE vote.issue_id = issue.id AND vote.member_id = ?)", member.id }) - end - } - end - --]] - - filters[#filters+1] = filter - - local filter_interest = param.get_all_cgi()["filter_interest"] - - if filter_interest ~= "any" and filter_interest ~= nil and filter_interest ~= "initiated" then - filters[#filters+1] = { - name = "filter_delegation", - { - name = "any", - label = _"Direct and by delegation", - selector_modifier = function(selector) - if filter_interest == "my" then - 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 }) - selector:left_join("interest", "filter_delegating_interest", { "filter_delegating_interest.issue_id = issue.id AND filter_delegating_interest.member_id = ? ", member.id }) - selector:add_where{ "filter_interest.member_id NOTNULL OR filter_delegating_interest.member_id NOTNULL" } - elseif filter_interest == "supported" then - 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 }) - elseif filter_interest == "potentially_supported" then - 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 }) - end - end - }, - { - name = "direct", - label = _"Direct", - selector_modifier = function(selector) - if filter_interest == "my" then - selector:join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", member.id }) - elseif filter_interest == "supported" then - 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 }) - elseif filter_interest == "potentially_supported" then - 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 }) - end - end - }, - { - name = "delegated", - label = _"By delegation", - selector_modifier = function(selector) - if filter_interest == "my" then - 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 }) - elseif filter_interest == "supported" then - 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 }) - elseif filter_interest == "potentially_supported" then - 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 }) - end - end - } - } - end - -end +--]] if app.session.member and member.id == app.session.member_id and (param.get_all_cgi()["filter"] == "frozen") then filters[#filters+1] = { @@ -224,31 +285,8 @@ } end -if member then - filters[#filters+1] = { - name = "filter_membership", - { - name = "any", - label = _"All units", - selector_modifier = function() end - }, - { - name = "unit", - label = _"My units", - selector_modifier = function(selector) - selector:join("area", nil, "area.id = issue.area_id") - selector:join("privilege", nil, { "privilege.unit_id = area.unit_id AND privilege.member_id = ? AND privilege.voting_right", member.id }) - end - }, - { - name = "area", - label = _"My areas", - selector_modifier = function(selector) - selector:join("membership", nil, { "membership.area_id = issue.area_id AND membership.member_id = ?", member.id }) - end - }, - } -end + + function filters:get_filter(group, name) for i,grp in ipairs(self) do diff -r 336476245f3f -r 699b9fa7bc36 app/main/issue/_list.lua --- a/app/main/issue/_list.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/issue/_list.lua Sat Mar 10 16:57:49 2012 +0100 @@ -1,5 +1,15 @@ local issues_selector = param.get("issues_selector", "table") local for_member = param.get("for_member", "table") or app.session.member +local for_state = param.get("for_state") +local for_unit = param.get("for_unit", atom.boolean) +local for_area = param.get("for_area", atom.boolean) + + +if for_state == "open" then + issues_selector:add_where("issue.closed ISNULL") +elseif for_state == "closed" then + issues_selector:add_where("issue.closed NOTNULL") +end if app.session.member_id then issues_selector @@ -20,7 +30,9 @@ "issue_list" } -local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = { member = for_member }} +local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = { + member = for_member, state = for_state, for_unit = for_unit, for_area = for_area +}} filters.content = function() ui.paginate{ @@ -120,6 +132,9 @@ ui.tag{ content = issue.area.name } slot.put(" · ") ui.tag{ content = issue.area.unit.name } + slot.put(" · ") + ui.tag{ content = issue.policy.name } + end } @@ -128,14 +143,15 @@ tag = "div", content = function() - ui.tag{ content = issue.policy.name } - - slot.put(" · ") - ui.tag{ content = issue.state_name } + ui.tag{ attr = { class = "event_name" }, content = issue.state_name } if issue.state_time_left then slot.put(" · ") - ui.tag{ content = _("#{time_left} left", { time_left = issue.state_time_left:gsub("days", _"days"):gsub("day", _"day") }) } + if issue.state_time_left:sub(1,1) == "-" then + ui.tag{ content = _("Counting starts soon") } + else + ui.tag{ content = _("#{time_left} left", { time_left = issue.state_time_left:gsub("days", _"days"):gsub("day", _"day") }) } + end end end diff -r 336476245f3f -r 699b9fa7bc36 app/main/member/_area_list.lua --- a/app/main/member/_area_list.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/member/_area_list.lua Sat Mar 10 16:57:49 2012 +0100 @@ -49,7 +49,10 @@ else 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." } end + ui.container{ content = function() + ui.link{ content = _"Show all areas of unit", module = "unit", view = "show", id = unit.id } + end } + end } - + end - diff -r 336476245f3f -r 699b9fa7bc36 app/main/member/_event_list.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/main/member/_event_list.lua Sat Mar 10 16:57:49 2012 +0100 @@ -0,0 +1,27 @@ +local member = param.get("member", "table") +local events = param.get_all_cgi()["events"] or "personal" + +ui.container{ attr = { class = "ui_filter_head" }, content = function() + + ui.link{ + attr = { class = events == "personal" and "ui_tabs_link active" or nil }, + text = _"Personal timeline", + module = "index", view = "index", params = { tab = "timeline", events = "personal" } + } + + ui.link{ + attr = { class = events == "global" and "active" or nil }, + text = _"Global timeline", + module = "index", view = "index", params = { tab = "timeline", events = "global" } + } +end } + +if events == "personal" then + execute.view{ + module = "event", view = "_list" + } +elseif events == "global" then + execute.view{ + module = "event", view = "_list", params = { global = true } + } +end diff -r 336476245f3f -r 699b9fa7bc36 app/main/member/settings.lua --- a/app/main/member/settings.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/member/settings.lua Sat Mar 10 16:57:49 2012 +0100 @@ -13,13 +13,6 @@ local pages = {} -pages[#pages+1] = { module = "member", view = "edit", text = _"Edit profile" } -pages[#pages+1] = { module = "member", view = "edit_images", text = _"Upload images" } -pages[#pages+1] = { view = "settings_notification", text = _"Notification settings" } -pages[#pages+1] = { view = "settings_display", text = _"Display settings" } -if not config.locked_profile_fields.notify_email then - pages[#pages+1] = { view = "settings_email", text = _"Change your notification email address" } -end if not config.locked_profile_fields.name then pages[#pages+1] = { view = "settings_name", text = _"Change your screen name" } end @@ -27,6 +20,11 @@ pages[#pages+1] = { view = "settings_login", text = _"Change your login" } end pages[#pages+1] = { view = "settings_password", text = _"Change your password" } +if not config.locked_profile_fields.notify_email then + pages[#pages+1] = { view = "settings_email", text = _"Change your notification email address" } +end +pages[#pages+1] = { view = "settings_notification", text = _"Notification settings" } +pages[#pages+1] = { view = "settings_display", text = _"Display settings" } pages[#pages+1] = { view = "developer_settings", text = _"Developer settings" } ui.list{ diff -r 336476245f3f -r 699b9fa7bc36 app/main/member/show_tab.lua --- a/app/main/member/show_tab.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/member/show_tab.lua Sat Mar 10 16:57:49 2012 +0100 @@ -169,7 +169,7 @@ view = "_area_list", params = { areas_selector = areas_selector, member = member }, } - +--[[ local issues_selector = Issue:new_selector() tabs[#tabs+1] = { name = "issues", @@ -184,49 +184,84 @@ filter_interest = (member.id ~= app.session.member_id) and "my" or nil, }, } - -local outgoing_delegations_selector = member:get_reference_selector("outgoing_delegations") - :left_join("issue", "_member_showtab_issue", "_member_showtab_issue.id = delegation.issue_id") - :add_where("_member_showtab_issue.closed ISNULL") +--]] +if show_as_homepage then + tabs[#tabs+1] = { + name = "timeline", + label = _"Events", + module = "member", + view = "_event_list", + params = { } + } +else + tabs[#tabs+1] = { + name = "timeline", + label = _"Events", + module = "event", + view = "_list", + params = { for_member = member } + } +end + tabs[#tabs+1] = { - name = "outgoing_delegations", - label = _"Outgoing delegations" .. " (" .. tostring(outgoing_delegations_selector:count()) .. ")", - icon = { static = "icons/16/table_go.png" }, - module = "delegation", + name = "open", + label = _"Open issues", + module = "issue", view = "_list", - params = { delegations_selector = outgoing_delegations_selector, outgoing = true }, + params = { + for_state = "open", + issues_selector = Issue:new_selector() + :add_where("issue.closed ISNULL") + :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()") + } +} +tabs[#tabs+1] = { + name = "closed", + label = _"Closed issues", + module = "issue", + view = "_list", + params = { + for_state = "closed", + issues_selector = Issue:new_selector() + :add_where("issue.closed NOTNULL") + :add_order_by("issue.closed DESC") + + } } -local incoming_delegations_selector = member:get_reference_selector("incoming_delegations") - :left_join("issue", "_member_showtab_issue", "_member_showtab_issue.id = delegation.issue_id") - :add_where("_member_showtab_issue.closed ISNULL") -tabs[#tabs+1] = { - name = "incoming_delegations", - label = _"Incoming delegations" .. " (" .. tostring(incoming_delegations_selector:count()) .. ")", - icon = { static = "icons/16/table_go.png" }, - module = "delegation", - view = "_list", - params = { delegations_selector = incoming_delegations_selector, incoming = true }, -} +if not show_as_homepage then + local outgoing_delegations_selector = member:get_reference_selector("outgoing_delegations") + :left_join("issue", "_member_showtab_issue", "_member_showtab_issue.id = delegation.issue_id") + :add_where("_member_showtab_issue.closed ISNULL") + tabs[#tabs+1] = { + name = "outgoing_delegations", + label = _"Outgoing delegations" .. " (" .. tostring(outgoing_delegations_selector:count()) .. ")", + icon = { static = "icons/16/table_go.png" }, + module = "delegation", + view = "_list", + params = { delegations_selector = outgoing_delegations_selector, outgoing = true }, + } -local contacts_selector = member:get_reference_selector("saved_members"):add_where("public") -tabs[#tabs+1] = { - name = "contacts", - label = _"Contacts" .. " (" .. tostring(contacts_selector:count()) .. ")", - icon = { static = "icons/16/book_edit.png" }, - module = "member", - view = "_list", - params = { members_selector = contacts_selector }, -} + local incoming_delegations_selector = member:get_reference_selector("incoming_delegations") + :left_join("issue", "_member_showtab_issue", "_member_showtab_issue.id = delegation.issue_id") + :add_where("_member_showtab_issue.closed ISNULL") + tabs[#tabs+1] = { + name = "incoming_delegations", + label = _"Incoming delegations" .. " (" .. tostring(incoming_delegations_selector:count()) .. ")", + icon = { static = "icons/16/table_go.png" }, + module = "delegation", + view = "_list", + params = { delegations_selector = incoming_delegations_selector, incoming = true }, + } -if show_as_homepage then + local contacts_selector = member:get_reference_selector("saved_members"):add_where("public") tabs[#tabs+1] = { - name = "profile", - label = _"Profile", - icon = { static = "icons/16/application_form.png" }, + name = "contacts", + label = _"Contacts" .. " (" .. tostring(contacts_selector:count()) .. ")", + icon = { static = "icons/16/book_edit.png" }, module = "member", - view = "_profile", - params = { member = member }, + view = "_list", + params = { members_selector = contacts_selector }, } end diff -r 336476245f3f -r 699b9fa7bc36 app/main/unit/show.lua --- a/app/main/unit/show.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/app/main/unit/show.lua Sat Mar 10 16:57:49 2012 +0100 @@ -44,10 +44,17 @@ :join("privilege", "trustee_privilege", "trustee_privilege.member_id = trustee.id AND trustee_privilege.unit_id = delegation.unit_id AND trustee_privilege.voting_right") :add_where{ "delegation.unit_id = ?", unit.id } -local issues_selector = Issue:new_selector() +local open_issues_selector = Issue:new_selector() :join("area", nil, "area.id = issue.area_id") :add_where{ "area.unit_id = ?", unit.id } - + :add_where("issue.closed ISNULL") + :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()") + +local closed_issues_selector = Issue:new_selector() + :join("area", nil, "area.id = issue.area_id") + :add_where{ "area.unit_id = ?", unit.id } + :add_where("issue.closed NOTNULL") + :add_order_by("issue.closed DESC") local tabs = { module = "unit", @@ -64,11 +71,32 @@ } tabs[#tabs+1] = { - name = "issues", - label = _"Issues", + name = "timeline", + label = _"Events", + module = "event", + view = "_list", + params = { for_unit = unit } +} + +tabs[#tabs+1] = { + name = "open", + label = _"Open issues", module = "issue", view = "_list", - params = { issues_selector = issues_selector } + params = { + for_state = "open", + issues_selector = open_issues_selector, for_unit = true + } +} +tabs[#tabs+1] = { + name = "closed", + label = _"Closed issues", + module = "issue", + view = "_list", + params = { + for_state = "closed", + issues_selector = closed_issues_selector, for_unit = true + } } if app.session.member_id then diff -r 336476245f3f -r 699b9fa7bc36 config/default.lua --- a/config/default.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/config/default.lua Sat Mar 10 16:57:49 2012 +0100 @@ -22,7 +22,6 @@ config.locked_profile_fields = { field_name = true, - notify_email = true } config.member_image_content_type = "image/jpeg" diff -r 336476245f3f -r 699b9fa7bc36 config/development.lua --- a/config/development.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/config/development.lua Sat Mar 10 16:57:49 2012 +0100 @@ -1,4 +1,4 @@ -config.absolute_base_url = "http://localhost/lf/" +config.absolute_base_url = "http://10.8.33.34/lf/" execute.config("default") @@ -50,3 +50,5 @@ group_id = "g.7WDKN3StkEyuWkyN", cookie_path = "/" } + +config.document_dir = "/home/dark/tmp" diff -r 336476245f3f -r 699b9fa7bc36 locale/translations.de.lua --- a/locale/translations.de.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/locale/translations.de.lua Sat Mar 10 16:57:49 2012 +0100 @@ -114,6 +114,7 @@ ["Choose member"] = "Mitglied auswählen"; ["Click for details"] = "Klicke für Details"; ["Closed"] = "geschlossen"; +["Closed issues"] = "Geschlossene Themen"; ["Closed user group, please login to participate."] = "Geschlossene Benutzergruppe: Bitte melde dich an um teilzunehmen."; ["Collective opinion of supporters"] = "Meinungsbild der Unterstützer"; ["Commit suggestion"] = "Anregung speichern"; @@ -126,6 +127,7 @@ ["Contacts"] = "Kontakte"; ["Content"] = "Inhalt"; ["Counting of votes"] = "Auszählung"; +["Counting starts soon"] = "Auszählung beginnt in Kürze"; ["Create / edit area"] = "Themengebiet anlegen / bearbeiten"; ["Create / edit policy"] = "Regelwerk anlegen / bearbeiten"; ["Create alternative initiative"] = "Alternative Initiative hinzufügen"; @@ -174,6 +176,7 @@ ["Discussion"] = "Diskussion"; ["Discussion URL"] = "Diskussions-URL"; ["Discussion on issue"] = "Diskussion zum Thema"; +["Discussion started"] = "Diskussion gestartet"; ["Discussion time"] = "Zeit für die Diskussion"; ["Discussion with initiators"] = "Diskussion mit den Initiatoren"; ["Discussion, frozen and voting phase"] = "Diskussions-, Eingefroren- und Abstimmphase"; @@ -188,7 +191,6 @@ ["Edit initiative"] = "Initiative bearbeiten"; ["Edit my page"] = "Meine Seite bearbeiten"; ["Edit my profile"] = "Mein Profil bearbeiten"; -["Edit profile"] = "Profil bearbeiten"; ["Eligible as winner"] = "Als Gewinner qualifiziert"; ["Email address"] = "E-Mail-Adresse"; ["Email address confirmation"] = "Bestätigung der E-Mail-Adresse"; @@ -202,12 +204,15 @@ ["Error while updating member, database reported:

(#{errormessage})"] = "Fehler beim aktualisieren des Mitglieds, die Datenbank berichtet folgenden Fehler:

(#{errormessage})"; ["Etherpad authentication failed"] = "Etherpad-Anmeldung fehlgeschlagen"; ["Event #{id} -> #{num} members"] = false; +["Events"] = "Ereignisse"; ["External memberships"] = "Externe Mitgliedschaften"; ["External posts"] = "Externe Ämter"; ["Finish voting"] = "Stimmabgabe abschließen"; ["Finished"] = "Abgeschlossen"; ["Finished (with winner)"] = "Abgeschlossen (mit Gewinner)"; ["Finished (without winner)"] = "Abgeschlossen (ohne Gewinner)"; +["Finished with winner"] = "Abgeschlossen mit Gewinner"; +["Finished without winner"] = "Abgeschlossen ohne Gewinner"; ["Friday"] = "Freitag"; ["Frozen"] = "Eingefroren"; ["Frozen and voting phase"] = "Eingefroren- und Abstimmphase"; @@ -216,6 +221,7 @@ ["Generate API key"] = "API-Schlüssel erzeugen"; ["Global delegation"] = "Globale Delegation"; ["Global delegation set to '#{name}'"] = "Globale Delegation an '#{name}' erteilt"; +["Global timeline"] = false; ["Half frozen at"] = "Halb eingefroren am/um"; ["Hello\n\n"] = "Hallo\n\n"; ["Hello "] = "Hallo "; @@ -347,7 +353,6 @@ ["New draft has been added to initiative"] = "Neuer Entwurf wurde der Initiative hinzugefügt"; ["New initiative"] = "Neue Initiative"; ["New initiative draft"] = "Neuer Entwurfstext der Initiative"; -["New initiative in existing issue"] = "Neue Initiative in bestehenden Thema"; ["New issue"] = "Neues Thema"; ["New password"] = "Neues Kennwort"; ["New passwords does not match."] = "Du hast nicht zweimal das gleiche Kennwort eingegeben"; @@ -389,6 +394,7 @@ ["One step back"] = "Ein Schritt zurück"; ["Open"] = "Offen"; ["Open initiatives you are supporting which has been updated their draft:"] = "Offene, von dir unterstützte Initiativen, deren Antragstext aktualisiert wurde:"; +["Open issues"] = "Offene Themen"; ["OpenID"] = false; ["OpenID Login"] = false; ["Opinions"] = "Meinungen"; @@ -403,6 +409,7 @@ ["Password reset request"] = "Kennwort-Rücksetzung anfordern"; ["Passwords don't match!"] = "Kennwörter stimmen nicht überein!"; ["Passwords must consist of at least 8 characters!"] = "Das Kennwort muss zumindest 8 Zeichen lang sein!"; +["Personal timeline"] = false; ["Phases"] = "Phasen"; ["Phone"] = "Telefon"; ["Photo"] = "Foto"; @@ -432,6 +439,7 @@ ["Potentially supported"] = "Potentiell unterstützt"; ["Preview"] = "Vorschau"; ["Profession"] = "Beruf"; +["Profil"] = false; ["Profile"] = "Profil"; ["Publish"] = "Veröffentlichen"; ["Published"] = "veröffentlicht"; @@ -487,6 +495,7 @@ ["Settings"] = "Einstellungen"; ["Show"] = "Zeige"; ["Show active members"] = "Zeige aktive Mitglieder"; +["Show all areas of unit"] = "Zeige alle Themengebiete der Gliederung"; ["Show areas in use"] = "Zeige verwendete Themenbereiche"; ["Show areas not in use"] = "Zeige nicht verwendete Themenbereiche"; ["Show diff"] = "Änderungen anzeigen"; @@ -586,6 +595,7 @@ ["Unknown author"] = "Unbekannter Autor"; ["Updated drafts"] = "Neue Entwürfe"; ["Upload images"] = "Bilder hochladen"; +["Verification started"] = "Phase Überprüfung gestartet"; ["Verification time"] = "Zeit für die Überprüfung"; ["Version"] = "Version"; ["Vote now"] = "Jetzt abstimmen"; diff -r 336476245f3f -r 699b9fa7bc36 model/event.lua --- a/model/event.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/model/event.lua Sat Mar 10 16:57:49 2012 +0100 @@ -9,11 +9,27 @@ ref = 'issue', } +Event:add_reference{ + mode = 'm1', + to = "Suggestion", + this_key = 'suggestion_id', + that_key = 'id', + ref = 'suggestion', +} + +Event:add_reference{ + mode = 'm1', + to = "Member", + this_key = 'member_id', + that_key = 'id', + ref = 'member', +} + function Event.object_get:event_name() return ({ issue_state_changed = _"Issue reached next phase", initiative_created_in_new_issue = _"New issue", - initiative_created_in_existing_issue = _"New initiative in existing issue", + initiative_created_in_existing_issue = _"New initiative", initiative_revoked = _"Initiative revoked", new_draft_created = _"New initiative draft", suggestion_created = _"New suggestion" diff -r 336476245f3f -r 699b9fa7bc36 model/event_seen_by_member.lua --- a/model/event_seen_by_member.lua Sat Mar 10 13:54:14 2012 +0100 +++ b/model/event_seen_by_member.lua Sat Mar 10 16:57:49 2012 +0100 @@ -1,4 +1,2 @@ EventSeenByMember = mondelefant.new_class() EventSeenByMember.table = 'event_seen_by_member' - - diff -r 336476245f3f -r 699b9fa7bc36 static/style.css --- a/static/style.css Sat Mar 10 13:54:14 2012 +0100 +++ b/static/style.css Sat Mar 10 16:57:49 2012 +0100 @@ -158,9 +158,7 @@ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #888), color-stop(25%,#333) ); - color: #fff; font-size: 90%; - line-height: 200%; padding-left: 1%; box-shadow: #aaa 0 0 5px; overflow: hidden; @@ -174,6 +172,7 @@ .topbar a { color: #eee; + line-height: 30px; } .topbar a:hover { @@ -200,6 +199,10 @@ display: inline; } +.topbar .member_info { + float: right; +} + .searchbox { margin: 0; padding: 0.1ex 1em 0ex 1em; @@ -543,9 +546,8 @@ */ .ui_tabs_links { - margin-top: 3ex; + margin-top: 2ex; margin-bottom: 1ex; - font-size: 75%; } .ui_tabs_links a { @@ -566,7 +568,6 @@ background-color: #444; color: #fff; text-decoration: none; - padding: 1ex; } .ui_tabs_links a.yellow { @@ -616,7 +617,8 @@ color: #777; margin-top: 0.5ex; margin-bottom: 0.5ex; - font-size: 75%; + font-size: 90%; + font-weight: bold; float: left; line-height: 200%; margin-right: 2em; @@ -942,6 +944,25 @@ } /************************************************************************* + * Events + */ + +.events .date { + font-size: 150%; + font-weight: bold; + margin-top: 2ex; + line-height: 150%; +} + +.event_list .event div { +} + +.event_list .event .member_id { + float: right; +} + + +/************************************************************************* * Issues */ @@ -978,14 +999,29 @@ background-image: -ms-linear-gradient(top, #dfeaff 0%, #fcfcfc 66%); } +.event_list .event .issue_id, .issues .issue .issue_info .issue_id { font-size: 125%; } +.issues .issue .suggestion { + margin-left: 1ex; + margin-bottom: 1ex; + font-weight: bold; +} + .issue_policy_info { font-style: italic; } +.issue_policy_info .event_name { + font-weight: bold; +} + +.issue_policy_info img { + vertical-align: middle; +} + .issues .issue .interest_by_delegation { float: right; }