#-- encoding: UTF-8 #-- copyright # OpenProject is a project management system. # Copyright (C) 2012-2015 the OpenProject Foundation (OPF) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License version 3. # # OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: # Copyright (C) 2006-2013 Jean-Philippe Lang # Copyright (C) 2010-2013 the ChiliProject Team # # 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. # # See doc/COPYRIGHT.rdoc for more details. #++ module IssuesHelper include ApplicationHelper def issue_list(issues, &_block) ancestors = [] issues.each do |issue| while ancestors.any? && !issue.is_descendant_of?(ancestors.last) ancestors.pop end yield issue, ancestors.size ancestors << issue unless issue.leaf? end end # Renders a HTML/CSS tooltip # # To use, a trigger div is needed. This is a div with the class of "tooltip" # that contains this method wrapped in a span with the class of "tip" # #
<%= link_to_issue(issue) %> # <%= render_issue_tooltip(issue) %> #
# def render_issue_tooltip(issue) @cached_label_status ||= WorkPackage.human_attribute_name(:status) @cached_label_start_date ||= WorkPackage.human_attribute_name(:start_date) @cached_label_due_date ||= WorkPackage.human_attribute_name(:due_date) @cached_label_assigned_to ||= WorkPackage.human_attribute_name(:assigned_to) @cached_label_priority ||= WorkPackage.human_attribute_name(:priority) @cached_label_project ||= WorkPackage.human_attribute_name(:project) (link_to_work_package(issue) + "

#{@cached_label_project}: #{link_to_project(issue.project)}
#{@cached_label_status}: #{h(issue.status.name)}
#{@cached_label_start_date}: #{format_date(issue.start_date)}
#{@cached_label_due_date}: #{format_date(issue.due_date)}
#{@cached_label_assigned_to}: #{h(issue.assigned_to)}
#{@cached_label_priority}: #{h(issue.priority.name)}".html_safe) end def render_descendants_tree(issue) s = '
' issue_list(issue.descendants.sort_by(&:lft)) do |child, level| s << content_tag('tr', content_tag('td', "', class: 'checkbox') + content_tag('td', link_to_issue(child, truncate: 60), class: 'subject') + content_tag('td', h(child.status)) + content_tag('td', link_to_user(child.assigned_to)) + content_tag('td', progress_bar(child.done_ratio, width: '80px', legend: "#{child.done_ratio}%")), class: "issue issue-#{child.id} hascontextmenu #{level > 0 ? "idnt idnt-#{level}" : nil}") end s << '
' s end def render_custom_fields_rows(issue) return if issue.custom_field_values.empty? ordered_values = [] half = (issue.custom_field_values.size / 2.0).ceil half.times do |i| ordered_values << issue.custom_field_values[i] ordered_values << issue.custom_field_values[i + half] end s = "\n" n = 0 ordered_values.compact.each do |value| s << "\n\n" if n > 0 && (n % 2) == 0 s << "\t#{h(value.custom_field.name)}:#{simple_format_without_paragraph(h(show_value(value)))}\n" n += 1 end s << "\n" s.html_safe end # Find the name of an associated record stored in the field attribute def find_name_by_reflection(field, id) association = WorkPackage.reflect_on_association(field.to_sym) if association record = association.class_name.constantize.find_by(id: id) return record.name if record end end # Renders issue children recursively def render_api_issue_children(issue, api) return if issue.leaf? api.array :children do issue.children.each do |child| api.issue(id: child.id) do api.type(id: child.type_id, name: child.type.name) unless child.type.nil? api.subject child.subject render_api_issue_children(child, api) end end end end def entries_for_filter_select_sorted(query) [['', '']] + query.available_work_package_filters.map { |field| [field[1][:name] || WorkPackage.human_attribute_name(field[0]), field[0]] unless query.has_filter?(field[0]) }.compact.sort_by { |el| ActiveSupport::Inflector.transliterate(el[0]).downcase } end def value_overridden_by_children?(attrib) WorkPackage::ATTRIBS_WITH_VALUES_FROM_CHILDREN.include? attrib end def attrib_disabled?(issue, attrib) value_overridden_by_children?(attrib) && !(issue.new_record? || issue.leaf?) end def last_issue_note(issue) note_journals = issue.journals.select(&:notes?) return t(:text_no_notes) if note_journals.empty? note_journals.last.notes end end