parent
a28c5c17ff
commit
ad9160c116
@ -1,150 +0,0 @@ |
|||||||
#-- 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 JournalsHelper |
|
||||||
include ApplicationHelper |
|
||||||
include ERB::Util |
|
||||||
include ActionView::Helpers::TagHelper |
|
||||||
|
|
||||||
def self.included(base) |
|
||||||
base.class_eval do |
|
||||||
if respond_to? :before_filter |
|
||||||
before_filter :find_optional_journal, only: [:edit] |
|
||||||
end |
|
||||||
end |
|
||||||
end |
|
||||||
|
|
||||||
def render_journal(model, journal, options = {}) |
|
||||||
return '' if journal.initial? |
|
||||||
journal_content = render_journal_details(journal, :label_updated_time_by, model, options) |
|
||||||
content_tag 'div', journal_content, id: "change-#{journal.id}", class: work_package_css_classes(journal.journable) |
|
||||||
end |
|
||||||
|
|
||||||
# This renders a journal entry with a header and details |
|
||||||
def render_journal_details(journal, header_label = :label_updated_time_by, model = nil, options = {}) |
|
||||||
header = <<-HTML |
|
||||||
<div class="profile-wrap"> |
|
||||||
#{avatar(journal.user)} |
|
||||||
</div> |
|
||||||
<h4> |
|
||||||
<div class="journal-link" style="float:right;">#{link_to "##{journal.anchor}", anchor: "note-#{journal.anchor}"}</div> |
|
||||||
#{authoring journal.created_at, journal.user, label: header_label} |
|
||||||
#{content_tag('a', '', name: "note-#{journal.anchor}")} |
|
||||||
</h4> |
|
||||||
HTML |
|
||||||
|
|
||||||
if journal.details.any? |
|
||||||
details = content_tag 'ul', class: 'details journal-attributes' do |
|
||||||
journal.details.map { |detail| |
|
||||||
if d = journal.render_detail(detail, cache: options[:cache]) |
|
||||||
content_tag('li', d.html_safe) |
|
||||||
end |
|
||||||
}.compact.join(' ').html_safe |
|
||||||
end |
|
||||||
end |
|
||||||
|
|
||||||
notes = journal.notes.blank? ? |
|
||||||
'' : |
|
||||||
render_notes(model, journal, options) |
|
||||||
|
|
||||||
content_tag('div', "#{header}#{details}#{notes}".html_safe, id: "change-#{journal.id}", class: 'journal') |
|
||||||
end |
|
||||||
|
|
||||||
def render_notes(model, journal, options = {}) |
|
||||||
editable = journal.editable_by?(User.current) if User.current.logged? |
|
||||||
|
|
||||||
unless journal.notes.blank? |
|
||||||
|
|
||||||
links = [].tap do |l| |
|
||||||
if options[:quote_permission] && User.current.allowed_to?(options[:quote_permission], journal.project) |
|
||||||
# TODO: This is a hack. |
|
||||||
# it assumes that there is a quoted action on the controller |
|
||||||
# currently rendering the view |
|
||||||
# the quote link should somehow be supplied |
|
||||||
controller_name = controller.class.to_s.underscore.gsub(/_controller\z/, '').to_sym |
|
||||||
l << link_to(icon_wrapper('icon-context icon-quote', l(:button_quote)), |
|
||||||
{ controller: controller_name, |
|
||||||
action: 'quoted', |
|
||||||
id: model, |
|
||||||
journal_id: journal }, |
|
||||||
title: l(:button_quote), |
|
||||||
class: 'quote-link no-decoration-on-hover') |
|
||||||
end |
|
||||||
if editable |
|
||||||
l << link_to_in_place_notes_editor(icon_wrapper('icon-context icon-edit', l(:button_edit)), "journal-#{journal.id}-notes", |
|
||||||
{ controller: '/journals', action: 'edit', id: journal }, |
|
||||||
class: 'no-decoration-on-hover', |
|
||||||
title: l(:button_edit)) |
|
||||||
end |
|
||||||
end |
|
||||||
end |
|
||||||
|
|
||||||
content = '' |
|
||||||
content << content_tag('div', links.join(' '), { class: 'contextual' }, false) unless links.empty? |
|
||||||
attachments = model.try(:attachments) || [] |
|
||||||
content << content_tag('div', |
|
||||||
format_text(journal, :notes, attachments: attachments), |
|
||||||
class: 'wikicontent', |
|
||||||
:'ng-non-bindable' => '', |
|
||||||
'data-user' => journal.journable.author) |
|
||||||
|
|
||||||
css_classes = 'wiki journal-notes' |
|
||||||
css_classes << ' editable' if editable |
|
||||||
|
|
||||||
content_tag('div', content, { id: "journal-#{journal.id}-notes", class: css_classes }, false) |
|
||||||
end |
|
||||||
|
|
||||||
def link_to_in_place_notes_editor(text, _field_id, url, options = {}) |
|
||||||
onclick = "new Ajax.Request('#{url_for(url)}', {asynchronous:true, evalScripts:true, method:'get'}); return false;" |
|
||||||
link_to text, '#', options.merge(onclick: onclick) |
|
||||||
end |
|
||||||
|
|
||||||
# This may conveniently be used by controllers to find journals referred to in the current request |
|
||||||
def find_optional_journal |
|
||||||
@journal = Journal.find_by(id: params[:journal_id]) |
|
||||||
end |
|
||||||
|
|
||||||
def render_reply(journal) |
|
||||||
user = journal.user |
|
||||||
text = journal.notes |
|
||||||
|
|
||||||
# Replaces pre blocks with [...] |
|
||||||
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]') |
|
||||||
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> " |
|
||||||
content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" |
|
||||||
|
|
||||||
render(:update) do |page| |
|
||||||
page << "$('notes').value = \"#{escape_javascript content}\";" |
|
||||||
page.show 'update' |
|
||||||
page << "Form.Element.focus('notes');" |
|
||||||
page << "Element.scrollTo('update');" |
|
||||||
page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;" |
|
||||||
end |
|
||||||
end |
|
||||||
end |
|
Loading…
Reference in new issue