Commit 8c470548 authored by Dmytro Zaporozhets (DZ)'s avatar Dmytro Zaporozhets (DZ)

Merge branch 'jyavorska-master-patch-96769' into 'master'

RUN AS-IF-FOSS: Add canonical links for moved/duplicated/promoted issues

Closes #222473

See merge request gitlab-org/gitlab!34604
parents 98f0499a 655a7057
......@@ -40,6 +40,14 @@ module PageLayoutHelper
end
end
def page_canonical_link(link = nil)
if link
@page_canonical_link = link
else
@page_canonical_link
end
end
def favicon
Gitlab::Favicon.main
end
......
......@@ -19,6 +19,7 @@ class Issue < ApplicationRecord
include WhereComposite
include StateEventable
include IdInOrdered
include Presentable
DueDateStruct = Struct.new(:title, :name).freeze
NoDueDate = DueDateStruct.new('No Due Date', '0').freeze
......@@ -417,6 +418,10 @@ class Issue < ApplicationRecord
IssueLink.inverse_link_type(type)
end
def relocation_target
moved_to || duplicated_to
end
private
def ensure_metrics
......
......@@ -42,6 +42,9 @@
%title= page_title(site_name)
%meta{ name: "description", content: page_description }
- if page_canonical_link
%link{ rel: 'canonical', href: page_canonical_link }
= favicon_link_tag favicon, id: 'favicon', data: { original_href: favicon }, type: 'image/png'
= render 'layouts/startup_css'
......
......@@ -4,6 +4,8 @@
- page_title "#{@issue.title} (#{@issue.to_reference})", _("Issues")
- page_description @issue.description
- page_card_attributes @issue.card_attributes
- if @issue.relocation_target
- page_canonical_link @issue.relocation_target.present(current_user: current_user).web_url
- can_update_issue = can?(current_user, :update_issue, @issue)
- can_reopen_issue = can?(current_user, :reopen_issue, @issue)
......
---
title: Add canonical links for moved/duplicated issues
merge_request: 34604
author:
type: added
......@@ -26,10 +26,6 @@ module EE
end
end
def epic_path(entity, *args)
group_epic_path(entity.group, entity, *args)
end
def license_management_api_url(project)
expose_path(api_v4_projects_managed_licenses_path(id: project.id))
end
......@@ -60,6 +56,11 @@ module EE
end
end
url_helper :epic
def epic_path(entity, *args)
group_epic_path(entity.group, entity, *args)
end
url_helper :user_group_saml_omniauth_metadata
def user_group_saml_omniauth_metadata_path(group)
params = { group_path: group.path, token: group.saml_discovery_token }
......
......@@ -16,6 +16,7 @@ module EE
include UsageStatistics
include FromUnion
include EpicTreeSorting
include Presentable
enum state_id: {
opened: ::Epic.available_states[:opened],
......
......@@ -204,6 +204,11 @@ module EE
update!(blocking_issues_count: blocking_count)
end
override :relocation_target
def relocation_target
super || promoted_to_epic
end
private
def blocking_issues_ids
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'issues canonical link' do
include Spec::Support::Helpers::Features::CanonicalLinkHelpers
let(:epic) { create(:epic) }
let(:project) { create(:project, :public, group: epic.group) }
let(:original_issue) { create(:issue, project: project) }
let(:canonical_url) { epic_url(epic) }
context 'when the issue was promoted' do
it 'shows the canonical URL' do
original_issue.promoted_to_epic = epic
original_issue.save!
visit(issue_path(original_issue))
expect(page).to have_canonical_link(canonical_url)
end
end
end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'issues canonical link' do
include Spec::Support::Helpers::Features::CanonicalLinkHelpers
let_it_be(:original_project) { create(:project, :public) }
let_it_be(:original_issue) { create(:issue, project: original_project) }
let_it_be(:canonical_issue) { create(:issue) }
let_it_be(:canonical_url) { issue_url(canonical_issue, Gitlab::Application.routes.default_url_options) }
it "doesn't show the canonical URL" do
visit(issue_path(original_issue))
expect(page).not_to have_any_canonical_links
end
context 'when the issue was moved' do
it 'shows the canonical URL' do
original_issue.moved_to = canonical_issue
original_issue.save!
visit(issue_path(original_issue))
expect(page).to have_canonical_link(canonical_url)
end
end
context 'when the issue was duplicated' do
it 'shows the canonical URL' do
original_issue.duplicated_to = canonical_issue
original_issue.save!
visit(issue_path(original_issue))
expect(page).to have_canonical_link(canonical_url)
end
end
end
# frozen_string_literal: true
# These helpers allow you to manipulate with notes.
#
# Usage:
# describe "..." do
# include Spec::Support::Helpers::Features::CanonicalLinkHelpers
# ...
#
# expect(page).to have_canonical_link(url)
#
module Spec
module Support
module Helpers
module Features
module CanonicalLinkHelpers
def have_canonical_link(url)
have_xpath("//link[@rel=\"canonical\" and @href=\"#{url}\"]", visible: false)
end
def have_any_canonical_links
have_xpath('//link[@rel="canonical"]', visible: false)
end
end
end
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment