liquid_feedback_frontend

diff app/main/member/_show.lua @ 19:00d1004545f1

Dynamic interface using XMLHttpRequests, and many other changes

Bugfixes:
- Only allow voting on admitted initiatives
- Repaired issue search
- Don't display delegations for closed issues on member page
- Don't show revoke link in initiative, when issue is already half_frozen
- Localization for voting JavaScript
- Display author of suggestions

Disclosure of voting data after voting is finished:
- Possibility to inspect every ballot including preferences
- Show number of voters preferring one initiative to another initiative

Interface behaviour changes:
- Reversed default order of drafts
- Default order of suggestions changed
- Show new drafts of initiatives only once per day in timeline

Accessibility:
- Barrier-free voting implemented
- POST links are now accessible without JavaScript
- Changed gray for unsatisfied supporters in bar graph to a lighter gray

Other interface improvements:
- Optical enhancements
- Dynamic interface using XMLHttpRequests
- Show usage terms in about section
- Show own membership in area listing
- Show uninformed supporters greyed out and marked with yellow question mark
- Warning box in non-admitted initiatives
- When voted, don't display voting notice and change label of voting link
- Show object counts in more tabulator heads
- Enlarged member statement input field

Miscellaneous:
- Code cleanup
- Added README file containing installation instructions
- Use new WebMCP function ui.filters{...} instead of own ui.filter and ui.order functions
author bsw/jbe
date Sat Feb 20 22:10:31 2010 +0100 (2010-02-20)
parents 60bed92b7434
children 4f39f0a0d5b5
line diff
     1.1 --- a/app/main/member/_show.lua	Tue Feb 02 00:31:06 2010 +0100
     1.2 +++ b/app/main/member/_show.lua	Sat Feb 20 22:10:31 2010 +0100
     1.3 @@ -1,191 +1,7 @@
     1.4 -local member = param.get("member", "table")
     1.5 -
     1.6 -ui.tabs{
     1.7 -  {
     1.8 -    name = "profile",
     1.9 -    label = _"Profile",
    1.10 -    content = function()
    1.11 -      ui.form{
    1.12 -        attr = { class = "member vertical" },
    1.13 -        record = member,
    1.14 -        readonly = true,
    1.15 -        content = function()
    1.16 -
    1.17 -          ui.container{
    1.18 -            attr = { class = "right" },
    1.19 -            content = function()
    1.20 -
    1.21 -            execute.view{
    1.22 -              module = "member_image",
    1.23 -              view = "_show",
    1.24 -              params = {
    1.25 -                member = member,
    1.26 -                image_type = "photo"
    1.27 -              }
    1.28 -            }
    1.29 -
    1.30 -            ui.container{
    1.31 -              attr = { class = "contact_data" },
    1.32 -              content = function()
    1.33 -              end
    1.34 -            }
    1.35 -
    1.36 -            end
    1.37 -          }
    1.38 -
    1.39 -          if member.admin then
    1.40 -            ui.field.boolean{ label = _"Admin?",       name = "admin" }
    1.41 -          end
    1.42 -          if member.locked then
    1.43 -            ui.field.boolean{ label = _"Locked?",      name = "locked" }
    1.44 -          end
    1.45 -          if member.ident_number then
    1.46 -            ui.field.text{    label = _"Ident number", name = "ident_number" }
    1.47 -          end
    1.48 -          ui.field.text{ label = _"Name", name = "name" }
    1.49 -
    1.50 -          if member.realname and #member.realname > 0 then
    1.51 -            ui.field.text{ label = _"Real name", name = "realname" }
    1.52 -          end
    1.53 -          if member.email and #member.email > 0 then
    1.54 -            ui.field.text{ label = _"email", name = "email" }
    1.55 -          end
    1.56 -          if member.xmpp_address and #member.xmpp_address > 0 then
    1.57 -            ui.field.text{ label = _"xmpp", name = "xmpp_address" }
    1.58 -          end
    1.59 -          if member.website and #member.website > 0 then
    1.60 -            ui.field.text{ label = _"Website", name = "website" }
    1.61 -          end
    1.62 -          if member.phone and #member.phone > 0 then
    1.63 -            ui.field.text{ label = _"Phone", name = "phone" }
    1.64 -          end
    1.65 -          if member.mobile_phone and #member.mobile_phone > 0 then
    1.66 -            ui.field.text{ label = _"Mobile phone", name = "mobile_phone" }
    1.67 -          end
    1.68 -          if member.address and #member.address > 0 then
    1.69 -            ui.container{
    1.70 -              content = function()
    1.71 -                ui.tag{
    1.72 -                  tag = "label",
    1.73 -                  attr = { class = "ui_field_label" },
    1.74 -                  content = _"Address"
    1.75 -                }
    1.76 -                ui.tag{
    1.77 -                  tag = "span",
    1.78 -                  content = function()
    1.79 -                    slot.put(encode.html_newlines(encode.html(member.address)))
    1.80 -                  end
    1.81 -                }
    1.82 -              end
    1.83 -            }
    1.84 -          end
    1.85 -          if member.profession and #member.profession > 0 then
    1.86 -            ui.field.text{ label = _"Profession", name = "profession" }
    1.87 -          end
    1.88 -          if member.birthday and #member.birthday > 0 then
    1.89 -            ui.field.text{ label = _"Birthday", name = "birthday" }
    1.90 -          end
    1.91 -          if member.organizational_unit and #member.organizational_unit > 0 then
    1.92 -            ui.field.text{ label = _"Organizational unit", name = "organizational_unit" }
    1.93 -          end
    1.94 -          if member.internal_posts and #member.internal_posts > 0 then
    1.95 -            ui.field.text{ label = _"Internal posts", name = "internal_posts" }
    1.96 -          end
    1.97 -          if member.external_memberships and #member.external_memberships > 0 then
    1.98 -            ui.field.text{ label = _"Memberships", name = "external_memberships", multiline = true }
    1.99 -          end
   1.100 -          if member.external_posts and #member.external_posts > 0 then
   1.101 -            ui.field.text{ label = _"Posts", name = "external_posts", multiline = true }
   1.102 -          end
   1.103 -          slot.put('<br style="clear: right;" />')
   1.104 -
   1.105 -        end
   1.106 -      }
   1.107 -      if member.statement and #member.statement > 0 then
   1.108 -        ui.container{
   1.109 -          attr = { class = "member_statement wiki" },
   1.110 -          content = function()
   1.111 -            slot.put(format.wiki_text(member.statement))
   1.112 -          end
   1.113 -        }
   1.114 -      end
   1.115 -    end
   1.116 -  },
   1.117 -  {
   1.118 -    name = "areas",
   1.119 -    label = _"Areas",
   1.120 -    content = function()
   1.121 -      execute.view{
   1.122 -        module = "area",
   1.123 -        view = "_list",
   1.124 -        params = { areas_selector = member:get_reference_selector("areas") }
   1.125 -      }
   1.126 -    end
   1.127 -  },
   1.128 -  {
   1.129 -    name = "issues",
   1.130 -    label = _"Issues",
   1.131 -    content = function()
   1.132 -      execute.view{
   1.133 -        module = "issue",
   1.134 -        view = "_list",
   1.135 -        params = { issues_selector = member:get_reference_selector("issues") }
   1.136 -      }
   1.137 -    end
   1.138 -  },
   1.139 -  {
   1.140 -    name = "supported_initiatives",
   1.141 -    label = _"Supported initiatives",
   1.142 -    content = function()
   1.143 -      execute.view{
   1.144 -        module = "initiative",
   1.145 -        view = "_list",
   1.146 -        params = { initiatives_selector = member:get_reference_selector("supported_initiatives") }
   1.147 -      }
   1.148 -    end
   1.149 -  },
   1.150 -  {
   1.151 -    name = "initiatied_initiatives",
   1.152 -    label = _"Initiated initiatives",
   1.153 -    content = function()
   1.154 -      execute.view{
   1.155 -        module = "initiative",
   1.156 -        view = "_list",
   1.157 -        params = { initiatives_selector = member:get_reference_selector("initiated_initiatives"):add_where("initiator.accepted = true") }
   1.158 -      }
   1.159 -    end
   1.160 -  },
   1.161 -  {
   1.162 -    name = "incoming_delegations",
   1.163 -    label = _"Incoming delegations",
   1.164 -    content = function()
   1.165 -      execute.view{
   1.166 -        module = "delegation",
   1.167 -        view = "_list",
   1.168 -        params = { delegations_selector = member:get_reference_selector("incoming_delegations"), incoming = true }
   1.169 -      }
   1.170 -    end
   1.171 -  },
   1.172 -  {
   1.173 -    name = "Outgoing delegations",
   1.174 -    label = _"Outgoing delegations",
   1.175 -    content = function()
   1.176 -      execute.view{
   1.177 -        module = "delegation",
   1.178 -        view = "_list",
   1.179 -        params = { delegations_selector = member:get_reference_selector("outgoing_delegations"), outgoing = true }
   1.180 -      }
   1.181 -    end
   1.182 -  },
   1.183 -  {
   1.184 -    name = "contacts",
   1.185 -    label = _"Published contacts",
   1.186 -    content = function()
   1.187 -      execute.view{
   1.188 -        module = "member",
   1.189 -        view = "_list",
   1.190 -        params = { members_selector = member:get_reference_selector("saved_members"):add_where("public") }
   1.191 -      }
   1.192 -    end
   1.193 -  },
   1.194 -}
   1.195 +execute.view{
   1.196 +  module = "member",
   1.197 +  view = "show_tab",
   1.198 +  params = { 
   1.199 +    member = param.get("member", "table")
   1.200 +  }
   1.201 +}
   1.202 \ No newline at end of file

Impressum / About Us