Files
nairobi/lib/comment_tree.rb
Bertocq dff966d9b3 Show valuation comment thread @ Valuation show/edit
Why:

Budget Investment's valuators should be able to see internal valuation
comments thread at both show and edit views.

How:

At Valuation::BudgetInvestmentsController:
* Include CommentableActions to gain access to the entire feature, with
required resource_model & resource_name methods.
* Add the only possible order (oldest to newest)
* Load comments on both show & edit actions, passing `valuations` flag
to the CommentTree in order to only list those.

At CommentTree:
* Use `valuations` flag as instance variable to decide wich
comment threat to load: valuations (if relation exists) or comments.
2018-01-31 01:53:33 +01:00

47 lines
1.1 KiB
Ruby

class CommentTree
ROOT_COMMENTS_PER_PAGE = 10
attr_accessor :root_comments, :comments, :commentable, :page, :order
def initialize(commentable, page, order = 'confidence_score', valuations: false)
@commentable = commentable
@page = page
@order = order
@valuations = valuations
@comments = root_comments + root_descendants
end
def root_comments
base_comments.roots.send("sort_by_#{order}").page(page).per(ROOT_COMMENTS_PER_PAGE).for_render
end
def base_comments
if @valuations && commentable.respond_to?('valuations')
commentable.valuations
else
commentable.comments
end
end
def root_descendants
root_comments.each_with_object([]) do |root, array|
array.concat(Comment.descendants_of(root).send("sort_descendants_by_#{order}").for_render.to_a)
end
end
def ordered_children_of(parent)
comments_by_parent_id[parent.id] || []
end
def comments_by_parent_id
comments.each_with_object({}) do |comment, array|
(array[comment.parent_id] ||= []) << comment
end
end
def comment_authors
comments.map(&:author)
end
end