]> source.dussan.org Git - redmine.git/commitdiff
Support for Javascript in Themes (#2803).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 22 Dec 2010 21:37:07 +0000 (21:37 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 22 Dec 2010 21:37:07 +0000 (21:37 +0000)
If javascripts/theme.js is found in the theme directory, it will be automatically loaded on each page.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4558 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/views/layouts/base.rhtml
lib/redmine/themes.rb
test/integration/lib/redmine/themes_test.rb [new file with mode: 0644]

index 0393815b0af7f8a272be408e0fc42d47764bb100..8cd7a97eb39c4d341bc2a789f2cdd13d862eae27 100644 (file)
@@ -9,6 +9,7 @@
 <%= stylesheet_link_tag 'application', :media => 'all' %>
 <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
 <%= javascript_include_tag :defaults %>
+<%= heads_for_theme %>
 <%= heads_for_wiki_formatter %>
 <!--[if IE]>
     <style type="text/css">
index f932f956398f7878fca18339a208fe639258ff6a..2b38ec517839d1fb4c2dca5fd204ce7dfa0e2894 100644 (file)
@@ -40,12 +40,14 @@ module Redmine
   
     # Class used to represent a theme
     class Theme
-      attr_reader :name, :dir, :stylesheets
+      attr_reader :path, :name, :dir
       
       def initialize(path)
+        @path = path
         @dir = File.basename(path)
         @name = @dir.humanize
-        @stylesheets = Dir.glob("#{path}/stylesheets/*.css").collect {|f| File.basename(f).gsub(/\.css$/, '')}
+        @stylesheets = nil
+        @javascripts = nil
       end
       
       # Directory name used as the theme id
@@ -58,10 +60,32 @@ module Redmine
       def <=>(theme)
         name <=> theme.name
       end
+      
+      def stylesheets
+        @stylesheets ||= assets("stylesheets", "css")
+      end
+      
+      def javascripts
+        @javascripts ||= assets("javascripts", "js")
+      end
+      
+      def stylesheet_path(source)
+        "/themes/#{dir}/stylesheets/#{source}"
+      end
+      
+      def javascript_path(source)
+        "/themes/#{dir}/javascripts/#{source}"
+      end
+      
+      private
+      
+      def assets(dir, ext)
+        Dir.glob("#{path}/#{dir}/*.#{ext}").collect {|f| File.basename(f).gsub(/\.#{ext}$/, '')}
+      end
     end
     
     private
-        
+    
     def self.scan_themes
       dirs = Dir.glob("#{Rails.public_path}/themes/*").select do |f|
         # A theme should at least override application.css
@@ -73,13 +97,29 @@ module Redmine
 end
 
 module ApplicationHelper
+  def current_theme
+    unless instance_variable_defined?(:@current_theme)
+      @current_theme = Redmine::Themes.theme(Setting.ui_theme)
+    end
+    @current_theme
+  end
+  
   def stylesheet_path(source)
-    @current_theme ||= Redmine::Themes.theme(Setting.ui_theme)
-    super((@current_theme && @current_theme.stylesheets.include?(source)) ?
-      "/themes/#{@current_theme.dir}/stylesheets/#{source}" : source)
+    if current_theme && current_theme.stylesheets.include?(source)
+      super current_theme.stylesheet_path(source)
+    else
+      super
+    end
   end
   
   def path_to_stylesheet(source)
     stylesheet_path source
   end
+  
+  # Returns the header tags for the current theme
+  def heads_for_theme
+    if current_theme && current_theme.javascripts.include?('theme')
+      javascript_include_tag current_theme.javascript_path('theme')
+    end
+  end
 end
diff --git a/test/integration/lib/redmine/themes_test.rb b/test/integration/lib/redmine/themes_test.rb
new file mode 100644 (file)
index 0000000..d106d8f
--- /dev/null
@@ -0,0 +1,60 @@
+# Redmine - project management software
+# Copyright (C) 2006-2010  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.expand_path('../../../../test_helper', __FILE__)
+
+class ThemesTest < ActionController::IntegrationTest
+  fixtures :all
+  
+  def setup
+    @theme = Redmine::Themes.themes.last
+    Setting.ui_theme = @theme.id
+  end
+  
+  def teardown
+    Setting.ui_theme = ''
+  end
+  
+  def test_application_css
+    get '/'
+    
+    assert_response :success
+    assert_tag :tag => 'link',
+      :attributes => {:href => %r{^/themes/#{@theme.dir}/stylesheets/application.css}}
+  end
+  
+  def test_without_theme_js
+    get '/'
+    
+    assert_response :success
+    assert_no_tag :tag => 'script',
+      :attributes => {:src => %r{^/themes/#{@theme.dir}/javascripts/theme.js}}
+  end
+  
+  def test_with_theme_js
+    # Simulates a theme.js
+    @theme.javascripts << 'theme'
+    get '/'
+    
+    assert_response :success
+    assert_tag :tag => 'script',
+      :attributes => {:src => %r{^/themes/#{@theme.dir}/javascripts/theme.js}}
+        
+  ensure
+    @theme.javascripts.delete 'theme'
+  end
+end