liquid_feedback_frontend

changeset 414:699b9fa7bc36

Integrated new event system, splitted issues in open/closed, changed navigation
author bsw
date Sat Mar 10 16:57:49 2012 +0100 (2012-03-10)
parents 336476245f3f
children 2113a6bb597d
files app/main/_filter/20_session.lua app/main/_filter_view/30_navigation.lua app/main/_filter_view/32_searchbox.lua app/main/area/show_tab.lua app/main/event/_list.lua app/main/index/index.lua app/main/initiative/_list_element.lua app/main/issue/_filters.lua app/main/issue/_list.lua app/main/member/_area_list.lua app/main/member/_event_list.lua app/main/member/settings.lua app/main/member/show_tab.lua app/main/unit/show.lua config/default.lua config/development.lua locale/translations.de.lua model/event.lua model/event_seen_by_member.lua static/style.css
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  }

Impressum / About Us