Add support for CSS based control of user specific components
authorTom Hughes <tom@compton.nu>
Wed, 21 Jul 2010 20:00:26 +0000 (21:00 +0100)
committerTom Hughes <tom@compton.nu>
Wed, 21 Jul 2010 20:49:20 +0000 (21:49 +0100)
Define some helper routines which can be used to make page elements
only display when the logged in user matches certain conditions and
add style rules to the layout to trigger those elements based on the
logged in user.

app/helpers/application_helper.rb
app/views/layouts/site.html.erb

index 5fa021bcf4e695c130c2e4094fe1ecb2ccdb68cc..3d2c70a132d566b36d6770226c2d8bbd4c919bb6 100644 (file)
@@ -40,6 +40,45 @@ module ApplicationHelper
     return js
   end
 
+  def style_rules
+    css = ""
+
+    css << ".hidden { display: none }";
+    css << ".hide_unless_logged_in { display: none }" unless @user;
+    css << ".hide_if_logged_in { display: none }" if @user;
+    css << ".hide_if_user_#{@user.id} { display: none }" if @user;
+    css << ".show_if_user_#{@user.id} { display: inline }" if @user;
+    css << ".hide_unless_administrator { display: none }" unless @user and @user.administrator?;
+
+    return content_tag(:style, css)
+  end
+
+  def if_logged_in(tag = :div, &block)
+    concat(content_tag(tag, capture(&block), :class => "hide_unless_logged_in"))
+  end
+
+  def if_not_logged_in(tag = :div, &block)
+    concat(content_tag(tag, capture(&block), :class => "hide_if_logged_in"))
+  end
+
+  def if_user(user, tag = :div, &block)
+    if user
+      concat(content_tag(tag, capture(&block), :class => "hidden show_if_user_#{user.id}"))
+    end
+  end
+
+  def unless_user(user, tag = :div, &block)
+    if user
+      concat(content_tag(tag, capture(&block), :class => "hide_if_user_#{user.id}"))
+    else
+      concat(content_tag(tag, capture(&block)))
+    end
+  end
+
+  def if_administrator(tag = :div, &block)
+    concat(content_tag(tag, capture(&block), :class => "hide_unless_administrator"))
+  end
+
   def describe_location(lat, lon, zoom = nil, language = nil)
     zoom = zoom || 14
     language = language || request.user_preferred_languages.join(',')
index c17255709171508eb4fe470294807211f3fb93b2..6a820ef2629bbe282464e89530e0c72851fc3591 100644 (file)
@@ -13,6 +13,7 @@
     <%= stylesheet_link_tag 'print', :media => "print" %>
     <%= tag("link", { :rel => "search", :type => "application/opensearchdescription+xml", :title => "OpenStreetMap Search", :href => "/opensearch/osm.xml" }) %>
     <%= tag("meta", { :name => "description", :content => "OpenStreetMap is the free wiki world map." }) %>
+    <%= style_rules %>
     <%= yield :head %>
     <title><%= t 'layouts.project_name.title' %><%= ' | '+ h(@title) if @title %></title>
   </head>