From f4945879735d3a6d9f6ecac4773cb6a660cd57a4 Mon Sep 17 00:00:00 2001 From: Jan Provaznik Date: Tue, 10 Sep 2019 10:11:38 +0000 Subject: Add event presenter This presenter will be used in an upcoming MR which adds rendering of epic events on group activity page. --- app/helpers/events_helper.rb | 4 ++- app/models/event.rb | 14 ++++---- app/presenters/event_presenter.rb | 20 +++++++++++ app/views/events/_event.atom.builder | 2 ++ app/views/events/_event.html.haml | 2 ++ app/views/events/_event_scope.html.haml | 5 ++- app/views/events/event/_common.html.haml | 4 +-- app/views/events/event/_created_project.html.haml | 2 +- app/views/users/calendar_activities.html.haml | 2 +- spec/helpers/events_helper_spec.rb | 2 +- spec/presenters/event_presenter_spec.rb | 41 +++++++++++++++++++++++ 11 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 app/presenters/event_presenter.rb create mode 100644 spec/presenters/event_presenter_spec.rb diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index e990e425cb6..09866ca75ff 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -103,7 +103,7 @@ module EventsHelper words << "at" end - words << event.project_name + words << event.resource_parent_name words.join(" ") end @@ -223,3 +223,5 @@ module EventsHelper end end end + +EventsHelper.prepend_if_ee('EE::EventsHelper') diff --git a/app/models/event.rb b/app/models/event.rb index 52d54be39a9..580bb770599 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -3,6 +3,8 @@ class Event < ApplicationRecord include Sortable include FromUnion + include Presentable + default_scope { reorder(nil) } CREATED = 1 @@ -135,6 +137,10 @@ class Event < ApplicationRecord end end + def present + super(presenter_class: ::EventPresenter) + end + # rubocop:disable Metrics/CyclomaticComplexity # rubocop:disable Metrics/PerceivedComplexity def visible_to_user?(user = nil) @@ -161,12 +167,8 @@ class Event < ApplicationRecord # rubocop:enable Metrics/PerceivedComplexity # rubocop:enable Metrics/CyclomaticComplexity - def project_name - if project - project.full_name - else - "(deleted project)" - end + def resource_parent + project || group end def target_title diff --git a/app/presenters/event_presenter.rb b/app/presenters/event_presenter.rb new file mode 100644 index 00000000000..f31d362d5fa --- /dev/null +++ b/app/presenters/event_presenter.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +class EventPresenter < Gitlab::View::Presenter::Delegated + presents :event + + def resource_parent_name + resource_parent&.full_name || '' + end + + def target_link_options + case resource_parent + when Group + [event.group, event.target] + when Project + [event.project.namespace.becomes(Namespace), event.project, event.target] + else + '' + end + end +end diff --git a/app/views/events/_event.atom.builder b/app/views/events/_event.atom.builder index d56234e6c1a..406e8a93194 100644 --- a/app/views/events/_event.atom.builder +++ b/app/views/events/_event.atom.builder @@ -1,5 +1,7 @@ return unless event.visible_to_user?(current_user) +event = event.present + xml.entry do xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" xml.link href: event_feed_url(event) diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml index 222175c818a..647f0597adb 100644 --- a/app/views/events/_event.html.haml +++ b/app/views/events/_event.html.haml @@ -1,3 +1,5 @@ +- event = event.present + - if event.visible_to_user?(current_user) .event-item .event-item-timestamp diff --git a/app/views/events/_event_scope.html.haml b/app/views/events/_event_scope.html.haml index 98941722434..67e4c538b4a 100644 --- a/app/views/events/_event_scope.html.haml +++ b/app/views/events/_event_scope.html.haml @@ -2,6 +2,5 @@ = event_preposition(event) - if event.project = link_to_project(event.project) - - else - = event.project_name - + - elsif event.group + = link_to event.resource_parent_name, group_path(event.group) diff --git a/app/views/events/event/_common.html.haml b/app/views/events/event/_common.html.haml index b02fdb4b638..50c5885c648 100644 --- a/app/views/events/event/_common.html.haml +++ b/app/views/events/event/_common.html.haml @@ -8,7 +8,7 @@ %span.event-type.d-inline-block.append-right-4{ class: event.action_name } = event.action_name %span.event-target-type.append-right-4= event.target_type.titleize.downcase - = link_to [event.project.namespace.becomes(Namespace), event.project, event.target], class: 'has-tooltip event-target-link append-right-4', title: event.target_title do + = link_to event.target_link_options, class: 'has-tooltip event-target-link append-right-4', title: event.target_title do = event.target.reference_link_text - unless event.milestone? %span.event-target-title.append-right-4{ dir: "auto" } @@ -17,4 +17,4 @@ %span.event-type.d-inline-block.append-right-4{ class: event.action_name } = event_action_name(event) - = render "events/event_scope", event: event + = render "events/event_scope", event: event if event.resource_parent.present? diff --git a/app/views/events/event/_created_project.html.haml b/app/views/events/event/_created_project.html.haml index 2f156603414..606b0febb57 100644 --- a/app/views/events/event/_created_project.html.haml +++ b/app/views/events/event/_created_project.html.haml @@ -10,4 +10,4 @@ - if event.project = link_to_project(event.project) - else - = event.project_name + = event.resource_parent_name diff --git a/app/views/users/calendar_activities.html.haml b/app/views/users/calendar_activities.html.haml index 3191eaa1e2c..7516dfe1602 100644 --- a/app/views/users/calendar_activities.html.haml +++ b/app/views/users/calendar_activities.html.haml @@ -27,7 +27,7 @@ - if event.project = link_to_project(event.project) - else - = event.project_name + = event.resource_parent_name - else made a private contribution - else diff --git a/spec/helpers/events_helper_spec.rb b/spec/helpers/events_helper_spec.rb index 3d15306d4d2..e062c841717 100644 --- a/spec/helpers/events_helper_spec.rb +++ b/spec/helpers/events_helper_spec.rb @@ -27,7 +27,7 @@ describe EventsHelper do end describe '#event_feed_url' do - let(:event) { create(:event) } + let(:event) { create(:event).present } let(:project) { create(:project, :public, :repository) } context 'issue' do diff --git a/spec/presenters/event_presenter_spec.rb b/spec/presenters/event_presenter_spec.rb new file mode 100644 index 00000000000..79f5e359141 --- /dev/null +++ b/spec/presenters/event_presenter_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe EventPresenter do + include Gitlab::Routing.url_helpers + + set(:group) { create(:group) } + set(:project) { create(:project, group: group) } + set(:target) { create(:milestone, project: project) } + set(:group_event) { create(:event, :created, project: nil, group: group, target: target) } + set(:project_event) { create(:event, :created, project: project, target: target) } + + describe '#resource_parent_name' do + context 'with group event' do + subject { group_event.present.resource_parent_name } + + it { is_expected.to eq(group.full_name) } + end + + context 'with project label' do + subject { project_event.present.resource_parent_name } + + it { is_expected.to eq(project.full_name) } + end + end + + describe '#target_link_options' do + context 'with group event' do + subject { group_event.present.target_link_options } + + it { is_expected.to eq([group, target]) } + end + + context 'with project label' do + subject { project_event.present.target_link_options } + + it { is_expected.to eq([group.becomes(Namespace), project, target]) } + end + end +end -- cgit v1.2.3