##// END OF EJS Templates
Reverting commit r1748. Some environments are not allowing the cached file to...
Reverting commit r1748. Some environments are not allowing the cached file to write to public, causing all JavaScript to fail. Javascripts are now cached into a single file for downloads in production mode. #1186 git-svn-id: http://redmine.rubyforge.org/svn/trunk@1771 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r1728:16509203398f
r1770:8f3a04ce6906
Show More
application_helper.rb
552 lines | 23.5 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.
#
# 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.
Jean-Philippe Lang
File viewer for attached text files....
r1506 require 'coderay'
require 'coderay/helpers/file_type'
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
added svn:eol-style native property on /app files...
r330
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
# 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
added svn:eol-style native property on /app files...
r330 end
# Display a link to user's account page
def link_to_user(user)
Jean-Philippe Lang
Forums enhancements:...
r913 user ? link_to(user, :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
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
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'
link_to(h(text), {:controller => 'attachments', :action => action, :id => attachment, :filename => attachment.filename }, options)
end
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
added svn:eol-style native property on /app files...
r330 def image_to_function(name, function, html_options = {})
html_options.symbolize_keys!
tag(:input, html_options.merge({
:type => "image", :src => image_path(name),
:onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};"
}))
end
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
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
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
Removes calls to TimeZone#adjust (#1584)....
r1612 local = zone ? time.in_time_zone(zone) : (time.utc? ? time.utc_to_local : 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
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
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
Changed author display on issues, news and document files....
r721 def authoring(created, author)
Jean-Philippe Lang
Date added as acronym title in ApplicationHelper#authoring...
r725 time_tag = content_tag('acronym', distance_of_time_in_words(Time.now, created), :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')
l(: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
Translation for various hard-coded strings (#577)....
r1129 def l_or_humanize(s)
l_has_string?("label_#{s}".to_sym) ? l("label_#{s}".to_sym) : s.to_s.humanize
end
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
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
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
New setting added to specify how many objects should be displayed on most paginated lists....
r1013
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 html = ''
html << link_to_remote(('&#171; ' + l(:label_previous)),
Jean-Philippe Lang
Fixed #208: Issue list does not scroll up when you click next...
r1100 {:update => 'content',
:url => url_param.merge(page_param => paginator.current.previous),
:complete => 'window.scrollTo(0,0)'},
Jean-Philippe Lang
New setting added to specify how many objects should be displayed on most paginated lists....
r1013 {:href => url_for(:params => url_param.merge(page_param => paginator.current.previous))}) + ' ' if paginator.current.previous
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
html << (pagination_links_each(paginator, options) do |n|
link_to_remote(n.to_s,
Jean-Philippe Lang
Fixed #208: Issue list does not scroll up when you click next...
r1100 {:url => {:params => url_param.merge(page_param => n)},
:update => 'content',
:complete => 'window.scrollTo(0,0)'},
Jean-Philippe Lang
New setting added to specify how many objects should be displayed on most paginated lists....
r1013 {:href => url_for(:params => url_param.merge(page_param => n))})
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end || '')
html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
Jean-Philippe Lang
Fixed #208: Issue list does not scroll up when you click next...
r1100 {:update => 'content',
:url => url_param.merge(page_param => paginator.current.next),
:complete => 'window.scrollTo(0,0)'},
Jean-Philippe Lang
New setting added to specify how many objects should be displayed on most paginated lists....
r1013 {:href => url_for(:params => url_param.merge(page_param => paginator.current.next))}) if paginator.current.next
unless count.nil?
html << [" (#{paginator.current.first_item}-#{paginator.current.last_item}/#{count})", per_page_links(paginator.items_per_page)].compact.join(' | ')
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 html
end
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
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|
n == selected ? n : link_to_remote(n, {:update => "content", :url => params.dup.merge(:per_page => n)},
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
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
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?
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
Added Redmine::WikiFormatting module and tests for wiki links....
r688 if attachments
Jean-Philippe Lang
Fixed: Textile image with style attribute cause internal server error....
r1004 text = text.gsub(/!((\<|\=|\>)?(\([^\)]+\))?(\[[^\]]+\])?(\{[^\}]+\})?)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
style = $1
filename = $6
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688 rf = Regexp.new(filename, Regexp::IGNORECASE)
# 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
Fixed: 10342 Creation of Schema in Oracle...
r476
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688 text = (Setting.text_formatting == 'textile') ?
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 Redmine::WikiFormatting.to_html(text) { |macro, args| exec_macro(macro, obj, args) } :
simple_format(auto_link(h(text)))
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
Fixes:...
r1147 project = options[:project] || @project || (obj && obj.respond_to?(:project) ? obj.project : nil)
Jean-Philippe Lang
Textilized project descriptions on project list and home page....
r645
Jean-Philippe Lang
Redmine links can be used to link to documents, versions and attachments....
r1050 # Wiki links
#
# 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
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
#
# 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
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
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
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
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]
object.custom_values.each do |v|
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
end
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
def lang_options_for_select(blank=true)
(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
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
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
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']
hidden_field_tag('back_url', 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
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)") +
" | " +
link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
end
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
Roadmap progress bars now differentiate the progress due to closed issues from the open issues progress (2 different colors)....
r941 (pcts[0] > 0 ? content_tag('td', '', :width => "#{pcts[0].floor}%;", :class => 'closed') : '') +
(pcts[1] > 0 ? content_tag('td', '', :width => "#{pcts[1].floor}%;", :class => 'done') : '') +
(pcts[2] > 0 ? content_tag('td', '', :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
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
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
Per project forums added....
r526
def wikitoolbar_for(field_id)
return '' unless Setting.text_formatting == 'textile'
Jean-Philippe Lang
Display wiki syntax quick ref link within the jstoolbar (closes #629, #767)....
r1176
help_link = l(:setting_text_formatting) + ': ' +
link_to(l(:label_help), compute_public_path('wiki_syntax', 'help', 'html'),
:onclick => "window.open(\"#{ compute_public_path('wiki_syntax', 'help', 'html') }\", \"\", \"resizable=yes, location=no, width=300, height=640, menubar=no, status=no, scrollbars=yes\"); return false;")
Jean-Philippe Lang
Added i18n support to the jstoolbar (only english and french are actually translated)....
r1060 javascript_include_tag('jstoolbar/jstoolbar') +
javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language}") +
Jean-Philippe Lang
Display wiki syntax quick ref link within the jstoolbar (closes #629, #767)....
r1176 javascript_tag("var toolbar = new jsToolBar($('#{field_id}')); toolbar.setHelpLink('#{help_link}'); toolbar.draw();")
Jean-Philippe Lang
Per project forums added....
r526 end
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
def has_content?(name)
(@has_content && @has_content[name]) || false
end
Jean-Philippe Lang
Initial commit...
r2 end