##// END OF EJS Templates
Main project list now displays root projects with their subprojects....
Main project list now displays root projects with their subprojects. Added files turned into links (if not removed) on the issue history. git-svn-id: http://redmine.rubyforge.org/svn/trunk@729 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r704:7e4611ad3180
r718:f2a058f8cf04
Show More
application_helper.rb
320 lines | 12.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.
module ApplicationHelper
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
Removed User#display_name (replaced by User#name)....
r575 link_to user.name, :controller => 'account', :action => 'show', :id => user
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Added link_to_issue helper....
r428 def link_to_issue(issue)
link_to "#{issue.tracker.name} ##{issue.id}", :controller => "issues", :action => "show", :id => issue
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
@date_format_setting ||= Setting.date_format.to_i
@date_format_setting == 0 ? l_date(date) : date.strftime("%Y-%m-%d")
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
def format_time(time)
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
@date_format_setting ||= Setting.date_format.to_i
time = time.to_time if time.is_a?(String)
@date_format_setting == 0 ? l_datetime(time) : (time.strftime("%Y-%m-%d") + ' ' + l_time(time))
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
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
def pagination_links_full(paginator, options={}, html_options={})
Jean-Philippe Lang
Added pagination on wiki page history....
r568 page_param = options.delete(:page_param) || :page
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
Added pagination on wiki page history....
r568 {:update => "content", :url => options.merge(page_param => paginator.current.previous)},
{:href => url_for(:params => options.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
Added pagination on wiki page history....
r568 {:url => {:params => options.merge(page_param => n)}, :update => 'content'},
{:href => url_for(:params => options.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
Added pagination on wiki page history....
r568 {:update => "content", :url => options.merge(page_param => paginator.current.next)},
{:href => url_for(:params => options.merge(page_param => paginator.current.next))}) if paginator.current.next
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 html
end
Jean-Philippe Lang
Removed @html_title assignments in controllers....
r704 def set_html_title(text)
@html_header_title = text
end
def html_title
title = []
title << @project.name if @project
title << @html_header_title
title << Setting.app_title
title.compact.join(' - ')
end
Jean-Philippe Lang
Removed RedCloth checks since it's now supplied with the application....
r697 # format text according to system settings
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def textilizable(text, options = {})
Jean-Philippe Lang
Fixed: 10342 Creation of Schema in Oracle...
r476 return "" if text.blank?
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
attachments = options[:attachments]
if attachments
text = text.gsub(/!([<>=]*)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
align = $1
filename = $2
rf = Regexp.new(filename, Regexp::IGNORECASE)
# search for the picture in attachments
if found = attachments.detect { |att| att.filename =~ rf }
image_url = url_for :controller => 'attachments', :action => 'download', :id => found.id
"!#{align}#{image_url}!"
else
"!#{align}#{filename}!"
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') ?
Redmine::WikiFormatting.to_html(text) : simple_format(auto_link(h(text)))
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
Wiki links can now refer other project wikis, using this syntax:...
r637 format_wiki_link = Proc.new {|project, title| "#{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
Wiki links can now refer other project wikis, using this syntax:...
r637 format_wiki_link = Proc.new {|project, title| "##{title}" }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 else
Jean-Philippe Lang
Wiki links can now refer other project wikis, using this syntax:...
r637 format_wiki_link = Proc.new {|project, title| url_for :controller => 'wiki', :action => 'index', :id => project, :page => title }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Textilized project descriptions on project list and home page....
r645 project = options[:project] || @project
Jean-Philippe Lang
Wiki links can now refer other project wikis, using this syntax:...
r637 # turn wiki links into html links
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # example:
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]]
text = text.gsub(/\[\[([^\]\|]+)(\|([^\]\|]+))?\]\]/) do |m|
Jean-Philippe Lang
Textilized project descriptions on project list and home page....
r645 link_project = project
Jean-Philippe Lang
Wiki links can now refer other project wikis, using this syntax:...
r637 page = $1
title = $3
if page =~ /^([^\:]+)\:(.*)$/
Jean-Philippe Lang
Textilized project descriptions on project list and home page....
r645 link_project = Project.find_by_name($1) || Project.find_by_identifier($1)
Jean-Philippe Lang
Small change to ApplicationHelper#textilizable to allow links to other wikis main page with custom text (eg. project:|mytext)....
r647 page = title || $2
Jean-Philippe Lang
Wiki links can now refer other project wikis, using this syntax:...
r637 title = $1 if page.blank?
end
Jean-Philippe Lang
Improved Redmine links:...
r703
if link_project && link_project.wiki
# check if page exists
wiki_page = link_project.wiki.find_page(page)
link_to((title || page), format_wiki_link.call(link_project, Wiki.titleize(page)),
:class => ('wiki-page' + (wiki_page ? '' : ' new')))
else
# project or wiki doesn't exist
title || page
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
Added Redmine::WikiFormatting module and tests for wiki links....
r688 # turn issue and revision ids into links
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # example:
Jean-Philippe Lang
Fixed 10058: issue URL in repository comment break...
r462 # #52 -> <a href="/issues/show/52">#52</a>
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688 # r52 -> <a href="/repositories/revision/6?rev=52">r52</a> (project.id is 6)
text = text.gsub(%r{([\s,-^])(#|r)(\d+)(?=[[:punct:]]|\s|<|$)}) do |m|
leading, otype, oid = $1, $2, $3
link = nil
if otype == 'r'
Jean-Philippe Lang
Improved Redmine links:...
r703 if project && (changeset = project.changesets.find_by_revision(oid))
link = link_to("r#{oid}", {:controller => 'repositories', :action => 'revision', :id => project.id, :rev => oid}, :class => 'changeset',
:title => truncate(changeset.comments, 100))
end
Jean-Philippe Lang
Added Redmine::WikiFormatting module and tests for wiki links....
r688 else
Jean-Philippe Lang
Improved Redmine links:...
r703 if issue = Issue.find_by_id(oid.to_i, :include => [:project, :status], :conditions => Project.visible_by(User.current))
link = link_to("##{oid}", {:controller => 'issues', :action => 'show', :id => oid}, :class => 'issue',
:title => "#{truncate(issue.subject, 100)} (#{issue.status.name})")
link = content_tag('del', link) if issue.closed?
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
Added Redmine::WikiFormatting module and tests for wiki links....
r688 leading + (link || "#{otype}#{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
Changed the length of 'language' column in users table from 2 to 5, to allow long language codes like pt-br....
r515 GLoc.valid_languages.collect{|lang| [ ll(lang.to_s, :general_lang_name), lang.to_s]}.sort{|x,y| x.first <=> y.first }
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] ||= {}
options[:html].store :class, "tabular"
form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
end
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
def calendar_for(field_id)
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
Per project forums added....
r526
def wikitoolbar_for(field_id)
return '' unless Setting.text_formatting == 'textile'
javascript_include_tag('jstoolbar') + javascript_tag("var toolbar = new jsToolBar($('#{field_id}')); toolbar.draw();")
end
Jean-Philippe Lang
Initial commit...
r2 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
class TabularFormBuilder < ActionView::Helpers::FormBuilder
include GLoc
def initialize(object_name, object, template, options, proc)
set_language_if_valid options.delete(:lang)
@object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
end
(field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector|
src = <<-END_SRC
def #{selector}(field, options = {})
return super if options.delete :no_label
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 label_text = l(options[:label]) if options[:label]
label_text ||= l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym)
label_text << @template.content_tag("span", " *", :class => "required") if options.delete(:required)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 label = @template.content_tag("label", label_text,
:class => (@object && @object.errors[field] ? "error" : nil),
:for => (@object_name.to_s + "_" + field.to_s))
label + super
end
END_SRC
class_eval src, __FILE__, __LINE__
end
def select(field, choices, options = {}, html_options = {})
label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
label = @template.content_tag("label", label_text,
:class => (@object && @object.errors[field] ? "error" : nil),
:for => (@object_name.to_s + "_" + field.to_s))
label + super
end
end