##// END OF EJS Templates
Fixed an error when downloading gantt png at global level....
Fixed an error when downloading gantt png at global level. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2332 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r2315:765f7abc6033
r2330:bf76988ebc3e
Show More
application_helper.rb
672 lines | 26.8 KiB | text/x-ruby | RubyLexer
/ app / helpers / application_helper.rb
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # redMine - project management software
# Copyright (C) 2006-2007 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.
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986 #
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # 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.
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986 #
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # 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.
Jean-Philippe Lang
File viewer for attached text files....
r1506 require 'coderay'
require 'coderay/helpers/file_type'
Jean-Philippe Lang
Makes wiki text formatter pluggable....
r1953 require 'forwardable'
Jean-Philippe Lang
Escape back_url field value (#2320)....
r2123 require 'cgi'
Jean-Philippe Lang
File viewer for attached text files....
r1506
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 module ApplicationHelper
Jean-Philippe Lang
Added wiki macros support. 2 builtin macros are defined: hello_world (sample macro that displays the arguments) and macro_list (display the list of installed macros)....
r884 include Redmine::WikiFormatting::Macros::Definitions
Jean-Philippe Lang
Changes ApplicationHelper#gravatar_for_mail to #avatar that takes a User or a String (less code in views)....
r1998 include GravatarHelper::PublicMethods
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Makes wiki text formatter pluggable....
r1953 extend Forwardable
def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 def current_role
@current_role ||= User.current.role_for_project(@project)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # Return true if user is authorized for controller/action, otherwise false
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 def authorize_for(controller, action)
User.current.allowed_to?({:controller => controller, :action => action}, @project)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
# Display a link if user is authorized
def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
Jean-Philippe Lang
Adds posts quoting functionality (#1825)....
r1771 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Adds posts quoting functionality (#1825)....
r1771 # Display a link to remote if user is authorized
def link_to_remote_if_authorized(name, options = {}, html_options = nil)
url = options[:url] || {}
link_to_remote(name, options, html_options) if authorize_for(url[:controller] || params[:controller], url[:action])
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
# Display a link to user's account page
Jean-Philippe Lang
Makes logged-in username in topbar linking to (#2291)....
r2107 def link_to_user(user, options={})
(user && !user.anonymous?) ? link_to(user.name(options[:format]), :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Add a time tracking block for 'My page' (#615)....
r1245 def link_to_issue(issue, options={})
Jean-Philippe Lang
Strikethru closed issue links (#1127)....
r1663 options[:class] ||= ''
options[:class] << ' issue'
options[:class] << ' closed' if issue.closed?
Jean-Philippe Lang
Add a time tracking block for 'My page' (#615)....
r1245 link_to "#{issue.tracker.name} ##{issue.id}", {:controller => "issues", :action => "show", :id => issue}, options
Jean-Philippe Lang
Added link_to_issue helper....
r428 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Appends the filename to the attachment url so that clients that ignore content-disposition http header get the real filename (#1649)....
r1669 # Generates a link to an attachment.
# Options:
# * :text - Link text (default to attachment filename)
# * :download - Force download (default: false)
def link_to_attachment(attachment, options={})
text = options.delete(:text) || attachment.filename
action = options.delete(:download) ? 'download' : 'show'
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Appends the filename to the attachment url so that clients that ignore content-disposition http header get the real filename (#1649)....
r1669 link_to(h(text), {:controller => 'attachments', :action => action, :id => attachment, :filename => attachment.filename }, options)
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Added toggle_link helper....
r429 def toggle_link(name, id, options={})
onclick = "Element.toggle('#{id}'); "
onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
onclick << "return false;"
link_to(name, "#", :onclick => onclick)
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def image_to_function(name, function, html_options = {})
html_options.symbolize_keys!
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986 tag(:input, html_options.merge({
:type => "image", :src => image_path(name),
:onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 }))
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Added a link to add a new category when creating or editing an issue....
r642 def prompt_to_remote(name, text, param, url, html_options = {})
html_options[:onclick] = "promptToRemote('#{text}', '#{param}', '#{url_for(url)}'); return false;"
link_to name, {}, html_options
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def format_date(date)
Jean-Philippe Lang
Added an option to choose the date format: language based (as defined in each lang file) or ISO 8601 (YYYY-MM-DD)....
r582 return nil unless date
Jean-Philippe Lang
Added a couple of new formats for the 'date format' setting....
r892 # "Setting.date_format.size < 2" is a temporary fix (content of date_format setting changed)
@date_format ||= (Setting.date_format.blank? || Setting.date_format.size < 2 ? l(:general_fmt_date) : Setting.date_format)
Jean-Philippe Lang
Performance improvement on calendar and gantt (about 45% on gantt for large number of issues)....
r783 date.strftime(@date_format)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Added a couple of new formats for the 'date format' setting....
r892 def format_time(time, include_date = true)
Jean-Philippe Lang
Added an option to choose the date format: language based (as defined in each lang file) or ISO 8601 (YYYY-MM-DD)....
r582 return nil unless time
time = time.to_time if time.is_a?(String)
Jean-Philippe Lang
* Added time zone support: users can select their time zone on their account view....
r904 zone = User.current.time_zone
Jean-Philippe Lang
Template error when user's timezone isn't set and UTC timestamps are used (#1889)....
r1799 local = zone ? time.in_time_zone(zone) : (time.utc? ? time.localtime : time)
Jean-Philippe Lang
Added a couple of new formats for the 'date format' setting....
r892 @date_format ||= (Setting.date_format.blank? || Setting.date_format.size < 2 ? l(:general_fmt_date) : Setting.date_format)
@time_format ||= (Setting.time_format.blank? ? l(:general_fmt_time) : Setting.time_format)
Jean-Philippe Lang
* Added time zone support: users can select their time zone on their account view....
r904 include_date ? local.strftime("#{@date_format} #{@time_format}") : local.strftime(@time_format)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Display latest user's activity on account/show view....
r2064
def format_activity_title(text)
h(truncate_single_line(text, 100))
end
def format_activity_day(date)
date == Date.today ? l(:label_today).titleize : format_date(date)
end
def format_activity_description(text)
h(truncate(text.to_s, 250).gsub(%r{<(pre|code)>.*$}m, '...'))
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Fixed: Roadmap crashes when a version has a due date > 2037....
r1885 def distance_of_date_in_words(from_date, to_date = 0)
from_date = from_date.to_date if from_date.respond_to?(:to_date)
to_date = to_date.to_date if to_date.respond_to?(:to_date)
distance_in_days = (to_date - from_date).abs
lwr(:actionview_datehelper_time_in_words_day, distance_in_days)
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Fixed: Roadmap crashes when a version has a due date > 2037....
r1885 def due_date_distance_in_words(date)
if date
l((date < Date.today ? :label_roadmap_overdue : :label_roadmap_due_in), distance_of_date_in_words(Date.today, date))
end
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Extends child_pages macro to display child pages based on page parameter (#1975)....
r2051 def render_page_hierarchy(pages, node=nil)
content = ''
if pages[node]
content << "<ul class=\"pages-hierarchy\">\n"
pages[node].each do |page|
content << "<li>"
content << link_to(h(page.pretty_title), {:controller => 'wiki', :action => 'index', :id => page.project, :page => page.title},
:title => (page.respond_to?(:updated_on) ? l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on)) : nil))
content << "\n" + render_page_hierarchy(pages, page.id) if pages[page.id]
content << "</li>\n"
end
content << "</ul>\n"
end
content
end
Jean-Philippe Lang
Moves flash messages rendering to a helper method....
r2221
# Renders flash messages
def render_flash_messages
s = ''
flash.each do |k,v|
s << content_tag('div', v, :class => "flash #{k}")
end
s
end
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302
# Renders the project quick-jump box
def render_project_jump_box
# Retrieve them now to avoid a COUNT query
projects = User.current.projects.all
if projects.any?
s = '<select onchange="if (this.value != \'\') { window.location = this.value; }">' +
"<option selected='selected'>#{ l(:label_jump_to_a_project) }</option>" +
'<option disabled="disabled">---</option>'
s << project_tree_options_for_select(projects) do |p|
Jean-Philippe Lang
Fixed that the project jump box does not preserve current tab after r2304....
r2310 { :value => url_for(:controller => 'projects', :action => 'show', :id => p, :jump => current_menu_item) }
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 end
s << '</select>'
s
end
end
def project_tree_options_for_select(projects, options = {})
s = ''
project_tree(projects) do |project, level|
name_prefix = (level > 0 ? ('&nbsp;' * 2 * level + '&#187; ') : '')
tag_options = {:value => project.id, :selected => ((project == options[:selected]) ? 'selected' : nil)}
tag_options.merge!(yield(project)) if block_given?
s << content_tag('option', name_prefix + h(project), tag_options)
end
s
end
# Yields the given block for each project with its level in the tree
def project_tree(projects, &block)
ancestors = []
projects.sort_by(&:lft).each do |project|
while (ancestors.any? && !project.is_descendant_of?(ancestors.last))
ancestors.pop
end
yield project, ancestors.size
ancestors << project
end
end
Jean-Philippe Lang
Extends child_pages macro to display child pages based on page parameter (#1975)....
r2051
Jean-Philippe Lang
Fixed: changesets titles should not be multiline in atom feeds (#1356)....
r1477 # Truncates and returns the string as a single line
def truncate_single_line(string, *args)
truncate(string, *args).gsub(%r{[\r\n]+}m, ' ')
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159 def html_hours(text)
text.gsub(%r{(\d+)\.(\d+)}, '<span class="hours hours-int">\1</span><span class="hours hours-dec">.\2</span>')
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Changes issue history headings....
r2092 def authoring(created, author, options={})
Jean-Philippe Lang
Link to activity view when displaying dates....
r2000 time_tag = @project.nil? ? content_tag('acronym', distance_of_time_in_words(Time.now, created), :title => format_time(created)) :
link_to(distance_of_time_in_words(Time.now, created),
{:controller => 'projects', :action => 'activity', :id => @project, :from => created.to_date},
:title => format_time(created))
Jean-Philippe Lang
Adds links to the user page on various views....
r1657 author_tag = (author.is_a?(User) && !author.anonymous?) ? link_to(h(author), :controller => 'account', :action => 'show', :id => author) : h(author || 'Anonymous')
Jean-Philippe Lang
Changes issue history headings....
r2092 l(options[:label] || :label_added_time_by, author_tag, time_tag)
Jean-Philippe Lang
Changed author display on issues, news and document files....
r721 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Makes permission screens localized (#2070)....
r1941 def l_or_humanize(s, options={})
k = "#{options[:prefix]}#{s}".to_sym
l_has_string?(k) ? l(k) : s.to_s.humanize
Jean-Philippe Lang
Translation for various hard-coded strings (#577)....
r1129 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def day_name(day)
l(:general_day_names).split(',')[day-1]
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def month_name(month)
l(:actionview_datehelper_select_month_names).split(',')[month-1]
end
Jean-Philippe Lang
File viewer for attached text files....
r1506 def syntax_highlight(name, content)
type = CodeRay::FileType[name]
type ? CodeRay.scan(content, type).html : h(content)
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Fixes "source:" links URLs (r1617)....
r1626 def to_path_param(path)
path.to_s.split(%r{[/\\]}).select {|p| !p.blank?}
end
Jean-Philippe Lang
New setting added to specify how many objects should be displayed on most paginated lists....
r1013 def pagination_links_full(paginator, count=nil, options={})
Jean-Philippe Lang
Added pagination on wiki page history....
r568 page_param = options.delete(:page_param) || :page
Jean-Philippe Lang
New setting added to specify how many objects should be displayed on most paginated lists....
r1013 url_param = params.dup
Jean-Philippe Lang
Fixed: issue filters may be lost when paginating after r1026....
r1051 # don't reuse params if filters are present
url_param.clear if url_param.has_key?(:set_filter)
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
html = ''
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 if paginator.current.previous
html << link_to_remote_content_update('&#171; ' + l(:label_previous), url_param.merge(page_param => paginator.current.previous)) + ' '
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 html << (pagination_links_each(paginator, options) do |n|
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 link_to_remote_content_update(n.to_s, url_param.merge(page_param => n))
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end || '')
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315
if paginator.current.next
html << ' ' + link_to_remote_content_update((l(:label_next) + ' &#187;'), url_param.merge(page_param => paginator.current.next))
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
New setting added to specify how many objects should be displayed on most paginated lists....
r1013 unless count.nil?
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 html << [
" (#{paginator.current.first_item}-#{paginator.current.last_item}/#{count})",
per_page_links(paginator.items_per_page)
].compact.join(' | ')
Jean-Philippe Lang
New setting added to specify how many objects should be displayed on most paginated lists....
r1013 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
html
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315
Jean-Philippe Lang
New setting added to specify how many objects should be displayed on most paginated lists....
r1013 def per_page_links(selected=nil)
Jean-Philippe Lang
Fixed: issue filters may be lost when paginating after r1026....
r1051 url_param = params.dup
url_param.clear if url_param.has_key?(:set_filter)
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
New setting added to specify how many objects should be displayed on most paginated lists....
r1013 links = Setting.per_page_options_array.collect do |n|
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 n == selected ? n : link_to_remote(n, {:update => "content",
:url => params.dup.merge(:per_page => n),
:method => :get},
Jean-Philippe Lang
Fixed: issue filters may be lost when paginating after r1026....
r1051 {:href => url_for(url_param.merge(:per_page => n))})
Jean-Philippe Lang
New setting added to specify how many objects should be displayed on most paginated lists....
r1013 end
links.size > 1 ? l(:label_display_per_page, links.join(', ')) : nil
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Add breadcrumb nav for the forums (#892)....
r1284 def breadcrumb(*args)
Jean-Philippe Lang
Wiki page hierarchy (#528). Parent page can be assigned on Rename screen....
r1689 elements = args.flatten
elements.any? ? content_tag('p', args.join(' &#187; ') + ' &#187; ', :class => 'breadcrumb') : nil
Jean-Philippe Lang
Add breadcrumb nav for the forums (#892)....
r1284 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Slight improvements to the browser views....
r1019 def html_title(*args)
if args.empty?
title = []
title << @project.name if @project
title += @html_title if @html_title
title << Setting.app_title
title.compact.join(' - ')
else
@html_title ||= []
@html_title += args
end
Jean-Philippe Lang
Removed @html_title assignments in controllers....
r704 end
Jean-Philippe Lang
Added some accesskeys:...
r793
def accesskey(s)
Jean-Philippe Lang
Added a 'New issue' link in the main menu (accesskey 7)....
r1067 Redmine::AccessKeys.key_for s
Jean-Philippe Lang
Added some accesskeys:...
r793 end
Jean-Philippe Lang
Added wiki macros support. 2 builtin macros are defined: hello_world (sample macro that displays the arguments) and macro_list (display the list of installed macros)....
r884 # Formats text according to system settings.
# 2 ways to call this method:
# * with a String: textilizable(text, options)
# * with an object and one of its attribute: textilizable(issue, :description, options)
def textilizable(*args)
options = args.last.is_a?(Hash) ? args.pop : {}
case args.size
when 1
Jean-Philippe Lang
Adds child_pages macro for wiki pages (#528)....
r1690 obj = options[:object]
Jean-Philippe Lang
Fixes:...
r1147 text = args.shift
Jean-Philippe Lang
Added wiki macros support. 2 builtin macros are defined: hello_world (sample macro that displays the arguments) and macro_list (display the list of installed macros)....
r884 when 2
obj = args.shift
Jean-Philippe Lang
Fixes:...
r1147 text = obj.send(args.shift).to_s
Jean-Philippe Lang
Added wiki macros support. 2 builtin macros are defined: hello_world (sample macro that displays the arguments) and macro_list (display the list of installed macros)....
r884 else
raise ArgumentError, 'invalid arguments to textilizable'
end
Jean-Philippe Lang
Fixes:...
r1147 return '' if text.blank?
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Fixes:...
r1147 only_path = options.delete(:only_path) == false ? false : true
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688
# when using an image link, try to use an attachment, if possible
Jean-Philippe Lang
Fixes:...
r1147 attachments = options[:attachments] || (obj && obj.respond_to?(:attachments) ? obj.attachments : nil)
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688 if attachments
Jean-Philippe Lang
Show the most recent file when displaying an inline image....
r1937 attachments = attachments.sort_by(&:created_on).reverse
Jean-Philippe Lang
Fixed: Inline images don't work if file name has upper case letters or if image is in BMP format (#2102)....
r1956 text = text.gsub(/!((\<|\=|\>)?(\([^\)]+\))?(\[[^\]]+\])?(\{[^\}]+\})?)(\S+\.(bmp|gif|jpg|jpeg|png))!/i) do |m|
Jean-Philippe Lang
Fixed: Textile image with style attribute cause internal server error....
r1004 style = $1
filename = $6
Jean-Philippe Lang
Escape image filename regexp (#1971)....
r1922 rf = Regexp.new(Regexp.escape(filename), Regexp::IGNORECASE)
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688 # search for the picture in attachments
if found = attachments.detect { |att| att.filename =~ rf }
Jean-Philippe Lang
Inline images alt attribute set to the attachment description....
r1313 image_url = url_for :only_path => only_path, :controller => 'attachments', :action => 'download', :id => found
desc = found.description.to_s.gsub(/^([^\(\)]*).*$/, "\\1")
alt = desc.blank? ? nil : "(#{desc})"
"!#{style}#{image_url}#{alt}!"
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688 else
Jean-Philippe Lang
Fixed: Textile image with style attribute cause internal server error....
r1004 "!#{style}#{filename}!"
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688 end
end
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Makes wiki text formatter pluggable....
r1953 text = Redmine::WikiFormatting.to_html(Setting.text_formatting, text) { |macro, args| exec_macro(macro, obj, args) }
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # different methods for formatting wiki links
case options[:wiki_links]
when :local
# used for local links to html files
Jean-Philippe Lang
Adds support for wiki links with anchor (#1647)....
r1697 format_wiki_link = Proc.new {|project, title, anchor| "#{title}.html" }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 when :anchor
# used for single-file wiki export
Jean-Philippe Lang
Adds support for wiki links with anchor (#1647)....
r1697 format_wiki_link = Proc.new {|project, title, anchor| "##{title}" }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 else
Jean-Philippe Lang
Adds support for wiki links with anchor (#1647)....
r1697 format_wiki_link = Proc.new {|project, title, anchor| url_for(:only_path => only_path, :controller => 'wiki', :action => 'index', :id => project, :page => title, :anchor => anchor) }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Fixes:...
r1147 project = options[:project] || @project || (obj && obj.respond_to?(:project) ? obj.project : nil)
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 # Wiki links
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986 #
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 # Examples:
Jean-Philippe Lang
Wiki links can now refer other project wikis, using this syntax:...
r637 # [[mypage]]
# [[mypage|mytext]]
# wiki links can refer other project wikis, using project name or identifier:
# [[project:]] -> wiki starting page
Jean-Philippe Lang
Small change to ApplicationHelper#textilizable to allow links to other wikis main page with custom text (eg. project:|mytext)....
r647 # [[project:|mytext]]
Jean-Philippe Lang
Wiki links can now refer other project wikis, using this syntax:...
r637 # [[project:mypage]]
# [[project:mypage|mytext]]
Jean-Philippe Lang
Wiki links:...
r1265 text = text.gsub(/(!)?(\[\[([^\]\n\|]+)(\|([^\]\n\|]+))?\]\])/) do |m|
Jean-Philippe Lang
Textilized project descriptions on project list and home page....
r645 link_project = project
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 esc, all, page, title = $1, $2, $3, $5
if esc.nil?
if page =~ /^([^\:]+)\:(.*)$/
link_project = Project.find_by_name($1) || Project.find_by_identifier($1)
page = $2
title ||= $1 if page.blank?
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 if link_project && link_project.wiki
Jean-Philippe Lang
Adds support for wiki links with anchor (#1647)....
r1697 # extract anchor
anchor = nil
if page =~ /^(.+?)\#(.+)$/
page, anchor = $1, $2
end
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 # check if page exists
wiki_page = link_project.wiki.find_page(page)
Jean-Philippe Lang
Adds support for wiki links with anchor (#1647)....
r1697 link_to((title || page), format_wiki_link.call(link_project, Wiki.titleize(page), anchor),
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 :class => ('wiki-page' + (wiki_page ? '' : ' new')))
else
# project or wiki doesn't exist
title || page
end
Jean-Philippe Lang
Improved Redmine links:...
r703 else
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 all
Jean-Philippe Lang
Improved Redmine links:...
r703 end
Jean-Philippe Lang
Wiki links can now refer other project wikis, using this syntax:...
r637 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 # Redmine links
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986 #
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 # Examples:
# Issues:
# #52 -> Link to issue #52
# Changesets:
# r52 -> Link to revision 52
Jean-Philippe Lang
Merged Git support branch (r1200 to r1226)....
r1222 # commit:a85130f -> Link to scmid starting with a85130f
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 # Documents:
# document#17 -> Link to document with id 17
# document:Greetings -> Link to the document with title "Greetings"
# document:"Some document" -> Link to the document with title "Some document"
# Versions:
# version#3 -> Link to version with id 3
# version:1.0.0 -> Link to version named "1.0.0"
# version:"1.0 beta 2" -> Link to version named "1.0 beta 2"
# Attachments:
# attachment:file.zip -> Link to the attachment of the current object named file.zip
Jean-Philippe Lang
Add Redmine links for repository files using source: and export: keyworkds (#867)....
r1252 # Source files:
# source:some/file -> Link to the file located at /some/file in the project's repository
# source:some/file@52 -> Link to the file's revision 52
# source:some/file#L120 -> Link to line 120 of the file
# source:some/file@52#L120 -> Link to line 120 of the file's revision 52
# export:some/file -> Force the download of the file
Jean-Philippe Lang
Adds links to forum messages using message#id syntax (#1756)....
r1728 # Forum messages:
# message#1218 -> Link to message with id 1218
text = text.gsub(%r{([\s\(,\-\>]|^)(!)?(attachment|document|version|commit|source|export|message)?((#|r)(\d+)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]]\W)|\s|<|$)}) do |m|
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 leading, esc, prefix, sep, oid = $1, $2, $3, $5 || $7, $6 || $8
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688 link = nil
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 if esc.nil?
if prefix.nil? && sep == 'r'
if project && (changeset = project.changesets.find_by_revision(oid))
Jean-Philippe Lang
Add Redmine links for repository files using source: and export: keyworkds (#867)....
r1252 link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => oid},
Jean-Philippe Lang
Fixes:...
r1147 :class => 'changeset',
Jean-Philippe Lang
Fixed: changesets titles should not be multiline in atom feeds (#1356)....
r1477 :title => truncate_single_line(changeset.comments, 100))
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 end
elsif sep == '#'
oid = oid.to_i
case prefix
when nil
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986 if issue = Issue.find_by_id(oid, :include => [:project, :status], :conditions => Project.visible_by(User.current))
Jean-Philippe Lang
Fixes:...
r1147 link = link_to("##{oid}", {:only_path => only_path, :controller => 'issues', :action => 'show', :id => oid},
Jean-Philippe Lang
Replaces del tags by a css style (a.issue.closed) for closed issue links....
r1209 :class => (issue.closed? ? 'issue closed' : 'issue'),
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 :title => "#{truncate(issue.subject, 100)} (#{issue.status.name})")
link = content_tag('del', link) if issue.closed?
end
when 'document'
if document = Document.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
Jean-Philippe Lang
Fixes:...
r1147 link = link_to h(document.title), {:only_path => only_path, :controller => 'documents', :action => 'show', :id => document},
:class => 'document'
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 end
when 'version'
if version = Version.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
Jean-Philippe Lang
Fixes:...
r1147 link = link_to h(version.name), {:only_path => only_path, :controller => 'versions', :action => 'show', :id => version},
:class => 'version'
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 end
Jean-Philippe Lang
Adds links to forum messages using message#id syntax (#1756)....
r1728 when 'message'
if message = Message.find_by_id(oid, :include => [:parent, {:board => :project}], :conditions => Project.visible_by(User.current))
link = link_to h(truncate(message.subject, 60)), {:only_path => only_path,
:controller => 'messages',
:action => 'show',
:board_id => message.board,
:id => message.root,
:anchor => (message.parent ? "message-#{message.id}" : nil)},
:class => 'message'
end
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 end
elsif sep == ':'
# removes the double quotes if any
name = oid.gsub(%r{^"(.*)"$}, "\\1")
case prefix
when 'document'
if project && document = project.documents.find_by_title(name)
Jean-Philippe Lang
Fixes:...
r1147 link = link_to h(document.title), {:only_path => only_path, :controller => 'documents', :action => 'show', :id => document},
:class => 'document'
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 end
when 'version'
if project && version = project.versions.find_by_name(name)
Jean-Philippe Lang
Fixes:...
r1147 link = link_to h(version.name), {:only_path => only_path, :controller => 'versions', :action => 'show', :id => version},
:class => 'version'
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 end
Jean-Philippe Lang
Merged Git support branch (r1200 to r1226)....
r1222 when 'commit'
if project && (changeset = project.changesets.find(:first, :conditions => ["scmid LIKE ?", "#{name}%"]))
Jean-Philippe Lang
Fixed: changesets titles should not be multiline in atom feeds (#1356)....
r1477 link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => changeset.revision},
:class => 'changeset',
:title => truncate_single_line(changeset.comments, 100)
Jean-Philippe Lang
Add Redmine links for repository files using source: and export: keyworkds (#867)....
r1252 end
when 'source', 'export'
if project && project.repository
name =~ %r{^[/\\]*(.*?)(@([0-9a-f]+))?(#(L\d+))?$}
path, rev, anchor = $1, $3, $5
Jean-Philippe Lang
Fixes "source:" links URLs (r1617)....
r1626 link = link_to h("#{prefix}:#{name}"), {:controller => 'repositories', :action => 'entry', :id => project,
:path => to_path_param(path),
Jean-Philippe Lang
Add Redmine links for repository files using source: and export: keyworkds (#867)....
r1252 :rev => rev,
:anchor => anchor,
:format => (prefix == 'export' ? 'raw' : nil)},
:class => (prefix == 'export' ? 'source download' : 'source')
Jean-Philippe Lang
Merged Git support branch (r1200 to r1226)....
r1222 end
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 when 'attachment'
if attachments && attachment = attachments.detect {|a| a.filename == name }
Jean-Philippe Lang
Fixes:...
r1147 link = link_to h(attachment.filename), {:only_path => only_path, :controller => 'attachments', :action => 'download', :id => attachment},
:class => 'attachment'
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 end
end
Jean-Philippe Lang
Improved Redmine links:...
r703 end
Jean-Philippe Lang
Attachments can now be added to wiki pages (original patch by Pavol Murin). Only authorized users can add/delete attachments....
r538 end
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 leading + (link || "#{prefix}#{sep}#{oid}")
Jean-Philippe Lang
Attachments can now be added to wiki pages (original patch by Pavol Murin). Only authorized users can add/delete attachments....
r538 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688 text
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Added wiki diff....
r580 # Same as Rails' simple_format helper without using paragraphs
def simple_format_without_paragraph(text)
text.to_s.
gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
gsub(/\n\n+/, "<br /><br />"). # 2+ newline -> 2 br
gsub(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def error_messages_for(object_name, options = {})
options = options.symbolize_keys
object = instance_variable_get("@#{object_name}")
if object && !object.errors.empty?
# build full_messages here with controller current language
full_messages = []
object.errors.each do |attr, msg|
next if msg.nil?
msg = msg.first if msg.is_a? Array
if attr == "base"
full_messages << l(msg)
else
full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
end
end
# retrieve custom values error messages
if object.errors[:custom_values]
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986 object.custom_values.each do |v|
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 v.errors.each do |attr, msg|
next if msg.nil?
msg = msg.first if msg.is_a? Array
full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
end
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 content_tag("div",
content_tag(
Jean-Philippe Lang
Changed AR error messages style (same as flash errors)....
r607 options[:header_tag] || "span", lwr(:gui_validation_error, full_messages.length) + ":"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 ) +
content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
"id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
)
else
""
end
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def lang_options_for_select(blank=true)
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986 (blank ? [["(auto)", ""]] : []) +
Jean-Philippe Lang
Added Traditional Chinese translation (by Shortie Lo)....
r946 GLoc.valid_languages.collect{|lang| [ ll(lang.to_s, :general_lang_name), lang.to_s]}.sort{|x,y| x.last <=> y.last }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def label_tag_for(name, option_tags = nil, options = {})
label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
content_tag("label", label_text)
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def labelled_tabular_form_for(name, object, options, &proc)
options[:html] ||= {}
Jean-Philippe Lang
Adds an optional description to attachments....
r1166 options[:html][:class] = 'tabular' unless options[:html].has_key?(:class)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Redirected user to where he is coming from after logging hours (#1062)....
r1339 def back_url_hidden_field_tag
Jean-Philippe Lang
Redirect user to the previous page after logging in (#1679)....
r1686 back_url = params[:back_url] || request.env['HTTP_REFERER']
Jean-Philippe Lang
Do not escape back_url twice when login fails....
r2212 back_url = CGI.unescape(back_url.to_s)
Jean-Philippe Lang
Escape back_url field value (#2320)....
r2123 hidden_field_tag('back_url', CGI.escape(back_url)) unless back_url.blank?
Jean-Philippe Lang
Redirected user to where he is coming from after logging hours (#1062)....
r1339 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def check_all_links(form_name)
link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
" | " +
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Roadmap progress bars now differentiate the progress due to closed issues from the open issues progress (2 different colors)....
r941 def progress_bar(pcts, options={})
pcts = [pcts, pcts] unless pcts.is_a?(Array)
pcts[1] = pcts[1] - pcts[0]
pcts << (100 - pcts[1] - pcts[0])
Jean-Philippe Lang
Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)....
r895 width = options[:width] || '100px;'
legend = options[:legend] || ''
content_tag('table',
content_tag('tr',
Jean-Philippe Lang
Use style attribute for setting width of table cells in progress bars (#2267)....
r2082 (pcts[0] > 0 ? content_tag('td', '', :style => "width: #{pcts[0].floor}%;", :class => 'closed') : '') +
(pcts[1] > 0 ? content_tag('td', '', :style => "width: #{pcts[1].floor}%;", :class => 'done') : '') +
(pcts[2] > 0 ? content_tag('td', '', :style => "width: #{pcts[2].floor}%;", :class => 'todo') : '')
Jean-Philippe Lang
Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)....
r895 ), :class => 'progress', :style => "width: #{width};") +
content_tag('p', legend, :class => 'pourcent')
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Added AJAX based context menu on the project issue list that provide shortcuts for editing, re-assigning, changing the status or the priority, moving or deleting an issue....
r859 def context_menu_link(name, url, options={})
options[:class] ||= ''
if options.delete(:selected)
options[:class] << ' icon-checked disabled'
options[:disabled] = true
end
if options.delete(:disabled)
options.delete(:method)
options.delete(:confirm)
options.delete(:onclick)
options[:class] << ' disabled'
url = '#'
end
link_to name, url, options
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def calendar_for(field_id)
Jean-Philippe Lang
Move repetitive calendar include code from views into helper (patch #966 by Peter Suschlik)....
r1300 include_calendar_headers_tags
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 image_tag("calendar.png", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
end
Jean-Philippe Lang
Move repetitive calendar include code from views into helper (patch #966 by Peter Suschlik)....
r1300
def include_calendar_headers_tags
unless @calendar_headers_tags_included
@calendar_headers_tags_included = true
content_for :header_tags do
javascript_include_tag('calendar/calendar') +
javascript_include_tag("calendar/lang/calendar-#{current_language}.js") +
javascript_include_tag('calendar/calendar-setup') +
stylesheet_link_tag('calendar')
end
end
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Application layout refactored....
r736 def content_for(name, content = nil, &block)
@has_content ||= {}
@has_content[name] = true
super(name, content, &block)
end
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Application layout refactored....
r736 def has_content?(name)
(@has_content && @has_content[name]) || false
end
Jean-Philippe Lang
Makes wiki text formatter pluggable....
r1953
Jean-Philippe Lang
Changes ApplicationHelper#gravatar_for_mail to #avatar that takes a User or a String (less code in views)....
r1998 # Returns the avatar image tag for the given +user+ if avatars are enabled
# +user+ can be a User or a string that will be scanned for an email address (eg. 'joe <joe@foo.bar>')
def avatar(user, options = { })
Eric Davis
Added an option to turn user Gravatars on or off...
r1970 if Setting.gravatar_enabled?
Jean-Philippe Lang
Changes ApplicationHelper#gravatar_for_mail to #avatar that takes a User or a String (less code in views)....
r1998 email = nil
if user.respond_to?(:mail)
email = user.mail
elsif user.to_s =~ %r{<(.+?)>}
email = $1
end
return gravatar(email.to_s.downcase, options) unless email.blank? rescue nil
Eric Davis
Added an option to turn user Gravatars on or off...
r1970 end
end
Jean-Philippe Lang
Makes wiki text formatter pluggable....
r1953 private
Jean-Philippe Lang
Email address should be lowercased for gravatar (#2145)....
r1986
Jean-Philippe Lang
Makes wiki text formatter pluggable....
r1953 def wiki_helper
helper = Redmine::WikiFormatting.helper_for(Setting.text_formatting)
extend helper
return self
end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315
def link_to_remote_content_update(text, url_params)
link_to_remote(text,
{:url => url_params, :method => :get, :update => 'content', :complete => 'window.scrollTo(0,0)'},
{:href => url_for(:params => url_params)}
)
end
Jean-Philippe Lang
Initial commit...
r2 end