Load branches on new merge request page asynchronously
This commit is contained in:
parent
8bf030722d
commit
244f511eec
|
|
@ -1,86 +0,0 @@
|
||||||
/* eslint-disable func-names, space-before-function-paren, wrap-iife, quotes, no-var, object-shorthand, consistent-return, no-unused-vars, comma-dangle, vars-on-top, prefer-template, max-len */
|
|
||||||
|
|
||||||
import $ from 'jquery';
|
|
||||||
import { localTimeAgo } from './lib/utils/datetime_utility';
|
|
||||||
import axios from './lib/utils/axios_utils';
|
|
||||||
|
|
||||||
export default class Compare {
|
|
||||||
constructor(opts) {
|
|
||||||
this.opts = opts;
|
|
||||||
this.source_loading = $(".js-source-loading");
|
|
||||||
this.target_loading = $(".js-target-loading");
|
|
||||||
$('.js-compare-dropdown').each((function(_this) {
|
|
||||||
return function(i, dropdown) {
|
|
||||||
var $dropdown;
|
|
||||||
$dropdown = $(dropdown);
|
|
||||||
return $dropdown.glDropdown({
|
|
||||||
selectable: true,
|
|
||||||
fieldName: $dropdown.data('fieldName'),
|
|
||||||
filterable: true,
|
|
||||||
id: function(obj, $el) {
|
|
||||||
return $el.data('id');
|
|
||||||
},
|
|
||||||
toggleLabel: function(obj, $el) {
|
|
||||||
return $el.text().trim();
|
|
||||||
},
|
|
||||||
clicked: function(e, el) {
|
|
||||||
if ($dropdown.is('.js-target-branch')) {
|
|
||||||
return _this.getTargetHtml();
|
|
||||||
} else if ($dropdown.is('.js-source-branch')) {
|
|
||||||
return _this.getSourceHtml();
|
|
||||||
} else if ($dropdown.is('.js-target-project')) {
|
|
||||||
return _this.getTargetProject();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
})(this));
|
|
||||||
this.initialState();
|
|
||||||
}
|
|
||||||
|
|
||||||
initialState() {
|
|
||||||
this.getSourceHtml();
|
|
||||||
this.getTargetHtml();
|
|
||||||
}
|
|
||||||
|
|
||||||
getTargetProject() {
|
|
||||||
$('.mr_target_commit').empty();
|
|
||||||
|
|
||||||
return axios.get(this.opts.targetProjectUrl, {
|
|
||||||
params: {
|
|
||||||
target_project_id: $("input[name='merge_request[target_project_id]']").val(),
|
|
||||||
},
|
|
||||||
}).then(({ data }) => {
|
|
||||||
$('.js-target-branch-dropdown .dropdown-content').html(data);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getSourceHtml() {
|
|
||||||
return this.constructor.sendAjax(this.opts.sourceBranchUrl, this.source_loading, '.mr_source_commit', {
|
|
||||||
ref: $("input[name='merge_request[source_branch]']").val()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getTargetHtml() {
|
|
||||||
return this.constructor.sendAjax(this.opts.targetBranchUrl, this.target_loading, '.mr_target_commit', {
|
|
||||||
target_project_id: $("input[name='merge_request[target_project_id]']").val(),
|
|
||||||
ref: $("input[name='merge_request[target_branch]']").val()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
static sendAjax(url, loading, target, params) {
|
|
||||||
const $target = $(target);
|
|
||||||
|
|
||||||
loading.show();
|
|
||||||
$target.empty();
|
|
||||||
|
|
||||||
return axios.get(url, {
|
|
||||||
params,
|
|
||||||
}).then(({ data }) => {
|
|
||||||
loading.hide();
|
|
||||||
$target.html(data);
|
|
||||||
const className = '.' + $target[0].className.replace(' ', '.');
|
|
||||||
localTimeAgo($('.js-timeago', className));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -4,8 +4,9 @@ import $ from 'jquery';
|
||||||
import { __ } from './locale';
|
import { __ } from './locale';
|
||||||
import axios from './lib/utils/axios_utils';
|
import axios from './lib/utils/axios_utils';
|
||||||
import flash from './flash';
|
import flash from './flash';
|
||||||
|
import { capitalizeFirstCharacter } from './lib/utils/text_utility';
|
||||||
|
|
||||||
export default function initCompareAutocomplete() {
|
export default function initCompareAutocomplete(limitTo = null, clickHandler = () => {}) {
|
||||||
$('.js-compare-dropdown').each(function() {
|
$('.js-compare-dropdown').each(function() {
|
||||||
var $dropdown, selected;
|
var $dropdown, selected;
|
||||||
$dropdown = $(this);
|
$dropdown = $(this);
|
||||||
|
|
@ -15,14 +16,27 @@ export default function initCompareAutocomplete() {
|
||||||
const $filterInput = $('input[type="search"]', $dropdownContainer);
|
const $filterInput = $('input[type="search"]', $dropdownContainer);
|
||||||
$dropdown.glDropdown({
|
$dropdown.glDropdown({
|
||||||
data: function(term, callback) {
|
data: function(term, callback) {
|
||||||
axios.get($dropdown.data('refsUrl'), {
|
const params = {
|
||||||
params: {
|
|
||||||
ref: $dropdown.data('ref'),
|
ref: $dropdown.data('ref'),
|
||||||
search: term,
|
search: term,
|
||||||
},
|
};
|
||||||
}).then(({ data }) => {
|
|
||||||
|
if (limitTo) {
|
||||||
|
params.find = limitTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
axios
|
||||||
|
.get($dropdown.data('refsUrl'), {
|
||||||
|
params,
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
if (limitTo) {
|
||||||
|
callback(data[capitalizeFirstCharacter(limitTo)] || []);
|
||||||
|
} else {
|
||||||
callback(data);
|
callback(data);
|
||||||
}).catch(() => flash(__('Error fetching refs')));
|
}
|
||||||
|
})
|
||||||
|
.catch(() => flash(__('Error fetching refs')));
|
||||||
},
|
},
|
||||||
selectable: true,
|
selectable: true,
|
||||||
filterable: true,
|
filterable: true,
|
||||||
|
|
@ -32,9 +46,15 @@ export default function initCompareAutocomplete() {
|
||||||
renderRow: function(ref) {
|
renderRow: function(ref) {
|
||||||
var link;
|
var link;
|
||||||
if (ref.header != null) {
|
if (ref.header != null) {
|
||||||
return $('<li />').addClass('dropdown-header').text(ref.header);
|
return $('<li />')
|
||||||
|
.addClass('dropdown-header')
|
||||||
|
.text(ref.header);
|
||||||
} else {
|
} else {
|
||||||
link = $('<a />').attr('href', '#').addClass(ref === selected ? 'is-active' : '').text(ref).attr('data-ref', escape(ref));
|
link = $('<a />')
|
||||||
|
.attr('href', '#')
|
||||||
|
.addClass(ref === selected ? 'is-active' : '')
|
||||||
|
.text(ref)
|
||||||
|
.attr('data-ref', escape(ref));
|
||||||
return $('<li />').append(link);
|
return $('<li />').append(link);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -43,9 +63,10 @@ export default function initCompareAutocomplete() {
|
||||||
},
|
},
|
||||||
toggleLabel: function(obj, $el) {
|
toggleLabel: function(obj, $el) {
|
||||||
return $el.text().trim();
|
return $el.text().trim();
|
||||||
}
|
},
|
||||||
|
clicked: () => clickHandler($dropdown),
|
||||||
});
|
});
|
||||||
$filterInput.on('keyup', (e) => {
|
$filterInput.on('keyup', e => {
|
||||||
const keyCode = e.keyCode || e.which;
|
const keyCode = e.keyCode || e.which;
|
||||||
if (keyCode !== 13) return;
|
if (keyCode !== 13) return;
|
||||||
const text = $filterInput.val();
|
const text = $filterInput.val();
|
||||||
|
|
@ -54,7 +75,7 @@ export default function initCompareAutocomplete() {
|
||||||
$dropdownContainer.removeClass('open');
|
$dropdownContainer.removeClass('open');
|
||||||
});
|
});
|
||||||
|
|
||||||
$dropdownContainer.on('click', '.dropdown-content a', (e) => {
|
$dropdownContainer.on('click', '.dropdown-content a', e => {
|
||||||
$dropdown.prop('title', e.target.text.replace(/_+?/g, '-'));
|
$dropdown.prop('title', e.target.text.replace(/_+?/g, '-'));
|
||||||
if ($dropdown.hasClass('has-tooltip')) {
|
if ($dropdown.hasClass('has-tooltip')) {
|
||||||
$dropdown.tooltip('fixTitle');
|
$dropdown.tooltip('fixTitle');
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
import initCompareAutocomplete from '~/compare_autocomplete';
|
import initCompareAutocomplete from '~/compare_autocomplete';
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', initCompareAutocomplete);
|
document.addEventListener('DOMContentLoaded', () => initCompareAutocomplete());
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
import $ from 'jquery';
|
||||||
|
import { localTimeAgo } from '~/lib/utils/datetime_utility';
|
||||||
|
import axios from '~/lib/utils/axios_utils';
|
||||||
|
import initCompareAutocomplete from '~/compare_autocomplete';
|
||||||
|
import initTargetProjectDropdown from './target_project_dropdown';
|
||||||
|
|
||||||
|
const updateCommitList = (url, $loadingIndicator, $commitList, params) => {
|
||||||
|
$loadingIndicator.show();
|
||||||
|
$commitList.empty();
|
||||||
|
|
||||||
|
return axios
|
||||||
|
.get(url, {
|
||||||
|
params,
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
$loadingIndicator.hide();
|
||||||
|
$commitList.html(data);
|
||||||
|
localTimeAgo($('.js-timeago', $commitList));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default mrNewCompareNode => {
|
||||||
|
const { sourceBranchUrl, targetBranchUrl } = mrNewCompareNode.dataset;
|
||||||
|
initTargetProjectDropdown();
|
||||||
|
|
||||||
|
const updateSourceBranchCommitList = () =>
|
||||||
|
updateCommitList(
|
||||||
|
sourceBranchUrl,
|
||||||
|
$(mrNewCompareNode).find('.js-source-loading'),
|
||||||
|
$(mrNewCompareNode).find('.mr_source_commit'),
|
||||||
|
{
|
||||||
|
ref: $(mrNewCompareNode)
|
||||||
|
.find("input[name='merge_request[source_branch]']")
|
||||||
|
.val(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
const updateTargetBranchCommitList = () =>
|
||||||
|
updateCommitList(
|
||||||
|
targetBranchUrl,
|
||||||
|
$(mrNewCompareNode).find('.js-target-loading'),
|
||||||
|
$(mrNewCompareNode).find('.mr_target_commit'),
|
||||||
|
{
|
||||||
|
target_project_id: $(mrNewCompareNode)
|
||||||
|
.find("input[name='merge_request[target_project_id]']")
|
||||||
|
.val(),
|
||||||
|
ref: $(mrNewCompareNode)
|
||||||
|
.find("input[name='merge_request[target_branch]']")
|
||||||
|
.val(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
initCompareAutocomplete('branches', $dropdown => {
|
||||||
|
if ($dropdown.is('.js-target-branch')) {
|
||||||
|
updateTargetBranchCommitList();
|
||||||
|
} else if ($dropdown.is('.js-source-branch')) {
|
||||||
|
updateSourceBranchCommitList();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
updateSourceBranchCommitList();
|
||||||
|
updateTargetBranchCommitList();
|
||||||
|
};
|
||||||
|
|
@ -1,18 +1,15 @@
|
||||||
import Compare from '~/compare';
|
|
||||||
import MergeRequest from '~/merge_request';
|
import MergeRequest from '~/merge_request';
|
||||||
import initPipelines from '~/commit/pipelines/pipelines_bundle';
|
import initPipelines from '~/commit/pipelines/pipelines_bundle';
|
||||||
|
import initCompare from './compare';
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare');
|
const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare');
|
||||||
if (mrNewCompareNode) {
|
if (mrNewCompareNode) {
|
||||||
new Compare({ // eslint-disable-line no-new
|
initCompare(mrNewCompareNode);
|
||||||
targetProjectUrl: mrNewCompareNode.dataset.targetProjectUrl,
|
|
||||||
sourceBranchUrl: mrNewCompareNode.dataset.sourceBranchUrl,
|
|
||||||
targetBranchUrl: mrNewCompareNode.dataset.targetBranchUrl,
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
const mrNewSubmitNode = document.querySelector('.js-merge-request-new-submit');
|
const mrNewSubmitNode = document.querySelector('.js-merge-request-new-submit');
|
||||||
new MergeRequest({ // eslint-disable-line no-new
|
// eslint-disable-next-line no-new
|
||||||
|
new MergeRequest({
|
||||||
action: mrNewSubmitNode.dataset.mrSubmitAction,
|
action: mrNewSubmitNode.dataset.mrSubmitAction,
|
||||||
});
|
});
|
||||||
initPipelines();
|
initPipelines();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
import $ from 'jquery';
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
const $targetProjectDropdown = $('.js-target-project');
|
||||||
|
$targetProjectDropdown.glDropdown({
|
||||||
|
selectable: true,
|
||||||
|
fieldName: $targetProjectDropdown.data('fieldName'),
|
||||||
|
filterable: true,
|
||||||
|
id(obj, $el) {
|
||||||
|
return $el.data('id');
|
||||||
|
},
|
||||||
|
toggleLabel(obj, $el) {
|
||||||
|
return $el.text().trim();
|
||||||
|
},
|
||||||
|
clicked({ $el }) {
|
||||||
|
$('.mr_target_commit').empty();
|
||||||
|
const $targetBranchDropdown = $('.js-target-branch');
|
||||||
|
$targetBranchDropdown.data('refsUrl', $el.data('refsUrl'));
|
||||||
|
$targetBranchDropdown.data('glDropdown').clearMenu();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
@ -83,13 +83,6 @@ class Projects::MergeRequests::CreationsController < Projects::MergeRequests::Ap
|
||||||
render layout: false
|
render layout: false
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_branches
|
|
||||||
@target_project = selected_target_project
|
|
||||||
@target_branches = @target_project ? @target_project.repository.branch_names : []
|
|
||||||
|
|
||||||
render layout: false
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def build_merge_request
|
def build_merge_request
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
= form_for [@project.namespace.becomes(Namespace), @project, @merge_request], url: project_new_merge_request_path(@project), method: :get, html: { class: "merge-request-form form-inline js-requires-input" } do |f|
|
= form_for [@project.namespace.becomes(Namespace), @project, @merge_request], url: project_new_merge_request_path(@project), method: :get, html: { class: "merge-request-form form-inline js-requires-input" } do |f|
|
||||||
.hide.alert.alert-danger.mr-compare-errors
|
.hide.alert.alert-danger.mr-compare-errors
|
||||||
.js-merge-request-new-compare.row{ 'data-target-project-url': project_new_merge_request_update_branches_path(@source_project), 'data-source-branch-url': project_new_merge_request_branch_from_path(@source_project), 'data-target-branch-url': project_new_merge_request_branch_to_path(@source_project) }
|
.js-merge-request-new-compare.row{ 'data-source-branch-url': project_new_merge_request_branch_from_path(@source_project), 'data-target-branch-url': project_new_merge_request_branch_to_path(@source_project) }
|
||||||
.col-md-6
|
.col-md-6
|
||||||
.panel.panel-default.panel-new-merge-request
|
.panel.panel-default.panel-new-merge-request
|
||||||
.panel-heading
|
.panel-heading
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
.panel-body.clearfix
|
.panel-body.clearfix
|
||||||
.merge-request-select.dropdown
|
.merge-request-select.dropdown
|
||||||
= f.hidden_field :source_project_id
|
= f.hidden_field :source_project_id
|
||||||
= dropdown_toggle @merge_request.source_project_path, { toggle: "dropdown", field_name: "#{f.object_name}[source_project_id]", disabled: @merge_request.persisted? }, { toggle_class: "js-compare-dropdown js-source-project" }
|
= dropdown_toggle @merge_request.source_project_path, { toggle: "dropdown", 'field-name': "#{f.object_name}[source_project_id]", disabled: @merge_request.persisted? }, { toggle_class: "js-compare-dropdown js-source-project" }
|
||||||
.dropdown-menu.dropdown-menu-selectable.dropdown-source-project
|
.dropdown-menu.dropdown-menu-selectable.dropdown-source-project
|
||||||
= dropdown_title("Select source project")
|
= dropdown_title("Select source project")
|
||||||
= dropdown_filter("Search projects")
|
= dropdown_filter("Search projects")
|
||||||
|
|
@ -21,14 +21,12 @@
|
||||||
selected: f.object.source_project_id
|
selected: f.object.source_project_id
|
||||||
.merge-request-select.dropdown
|
.merge-request-select.dropdown
|
||||||
= f.hidden_field :source_branch
|
= f.hidden_field :source_branch
|
||||||
= dropdown_toggle f.object.source_branch || "Select source branch", { toggle: "dropdown", field_name: "#{f.object_name}[source_branch]" }, { toggle_class: "js-compare-dropdown js-source-branch git-revision-dropdown-toggle" }
|
= dropdown_toggle f.object.source_branch || _("Select source branch"), { toggle: "dropdown", 'field-name': "#{f.object_name}[source_branch]", 'refs-url': refs_project_path(@source_project), selected: f.object.source_branch }, { toggle_class: "js-compare-dropdown js-source-branch git-revision-dropdown-toggle" }
|
||||||
.dropdown-menu.dropdown-menu-selectable.dropdown-source-branch.git-revision-dropdown
|
.dropdown-menu.dropdown-menu-selectable.js-source-branch-dropdown.git-revision-dropdown
|
||||||
= dropdown_title("Select source branch")
|
= dropdown_title(_("Select source branch"))
|
||||||
= dropdown_filter("Search branches")
|
= dropdown_filter(_("Search branches"))
|
||||||
= dropdown_content do
|
= dropdown_content
|
||||||
= render 'projects/merge_requests/dropdowns/branch',
|
= dropdown_loading
|
||||||
branches: @merge_request.source_branches,
|
|
||||||
selected: f.object.source_branch
|
|
||||||
.panel-footer
|
.panel-footer
|
||||||
.text-center= icon('spinner spin', class: 'js-source-loading')
|
.text-center= icon('spinner spin', class: 'js-source-loading')
|
||||||
%ul.list-unstyled.mr_source_commit
|
%ul.list-unstyled.mr_source_commit
|
||||||
|
|
@ -41,7 +39,7 @@
|
||||||
- projects = target_projects(@project)
|
- projects = target_projects(@project)
|
||||||
.merge-request-select.dropdown
|
.merge-request-select.dropdown
|
||||||
= f.hidden_field :target_project_id
|
= f.hidden_field :target_project_id
|
||||||
= dropdown_toggle f.object.target_project.full_path, { toggle: "dropdown", field_name: "#{f.object_name}[target_project_id]", disabled: @merge_request.persisted? }, { toggle_class: "js-compare-dropdown js-target-project" }
|
= dropdown_toggle f.object.target_project.full_path, { toggle: "dropdown", 'field-name': "#{f.object_name}[target_project_id]", disabled: @merge_request.persisted? }, { toggle_class: "js-compare-dropdown js-target-project" }
|
||||||
.dropdown-menu.dropdown-menu-selectable.dropdown-target-project
|
.dropdown-menu.dropdown-menu-selectable.dropdown-target-project
|
||||||
= dropdown_title("Select target project")
|
= dropdown_title("Select target project")
|
||||||
= dropdown_filter("Search projects")
|
= dropdown_filter("Search projects")
|
||||||
|
|
@ -51,14 +49,12 @@
|
||||||
selected: f.object.target_project_id
|
selected: f.object.target_project_id
|
||||||
.merge-request-select.dropdown
|
.merge-request-select.dropdown
|
||||||
= f.hidden_field :target_branch
|
= f.hidden_field :target_branch
|
||||||
= dropdown_toggle f.object.target_branch, { toggle: "dropdown", field_name: "#{f.object_name}[target_branch]" }, { toggle_class: "js-compare-dropdown js-target-branch git-revision-dropdown-toggle" }
|
= dropdown_toggle f.object.target_branch, { toggle: "dropdown", 'field-name': "#{f.object_name}[target_branch]", 'refs-url': refs_project_path(f.object.target_project), selected: f.object.target_branch }, { toggle_class: "js-compare-dropdown js-target-branch git-revision-dropdown-toggle" }
|
||||||
.dropdown-menu.dropdown-menu-selectable.dropdown-target-branch.js-target-branch-dropdown.git-revision-dropdown
|
.dropdown-menu.dropdown-menu-selectable.js-target-branch-dropdown.git-revision-dropdown
|
||||||
= dropdown_title("Select target branch")
|
= dropdown_title(_("Select target branch"))
|
||||||
= dropdown_filter("Search branches")
|
= dropdown_filter(_("Search branches"))
|
||||||
= dropdown_content do
|
= dropdown_content
|
||||||
= render 'projects/merge_requests/dropdowns/branch',
|
= dropdown_loading
|
||||||
branches: @merge_request.target_branches,
|
|
||||||
selected: f.object.target_branch
|
|
||||||
.panel-footer
|
.panel-footer
|
||||||
.text-center= icon('spinner spin', class: "js-target-loading")
|
.text-center= icon('spinner spin', class: "js-target-loading")
|
||||||
%ul.list-unstyled.mr_target_commit
|
%ul.list-unstyled.mr_target_commit
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
%ul
|
%ul
|
||||||
- projects.each do |project|
|
- projects.each do |project|
|
||||||
%li
|
%li
|
||||||
%a{ href: "#", class: "#{('is-active' if selected == project.id)}", data: { id: project.id } }
|
%a{ href: "#", class: "#{('is-active' if selected == project.id)}", data: { id: project.id, 'refs-url': refs_project_path(project) } }
|
||||||
= project.full_path
|
= project.full_path
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Load branches on new merge request page asynchronously
|
||||||
|
merge_request: 18315
|
||||||
|
author:
|
||||||
|
type: changed
|
||||||
|
|
@ -161,7 +161,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
|
||||||
end
|
end
|
||||||
|
|
||||||
get :diff_for_path
|
get :diff_for_path
|
||||||
get :update_branches
|
|
||||||
get :branch_from
|
get :branch_from
|
||||||
get :branch_to
|
get :branch_to
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps
|
||||||
|
|
||||||
first('.js-source-branch').click
|
first('.js-source-branch').click
|
||||||
wait_for_requests
|
wait_for_requests
|
||||||
first('.dropdown-source-branch .dropdown-content a', text: 'fix').click
|
first('.js-source-branch-dropdown .dropdown-content a', text: 'fix').click
|
||||||
|
|
||||||
click_button "Compare branches and continue"
|
click_button "Compare branches and continue"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -157,34 +157,4 @@ describe Projects::MergeRequests::CreationsController do
|
||||||
expect(response).to have_gitlab_http_status(200)
|
expect(response).to have_gitlab_http_status(200)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'GET #update_branches' do
|
|
||||||
before do
|
|
||||||
allow(Ability).to receive(:allowed?).and_call_original
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'lists the branches of another fork if the user has access' do
|
|
||||||
expect(Ability).to receive(:allowed?).with(user, :read_project, project) { true }
|
|
||||||
|
|
||||||
get :update_branches,
|
|
||||||
namespace_id: fork_project.namespace,
|
|
||||||
project_id: fork_project,
|
|
||||||
target_project_id: project.id
|
|
||||||
|
|
||||||
expect(assigns(:target_branches)).not_to be_empty
|
|
||||||
expect(response).to have_gitlab_http_status(200)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'does not list branches when the user cannot read the project' do
|
|
||||||
expect(Ability).to receive(:allowed?).with(user, :read_project, project) { false }
|
|
||||||
|
|
||||||
get :update_branches,
|
|
||||||
namespace_id: fork_project.namespace,
|
|
||||||
project_id: fork_project,
|
|
||||||
target_project_id: project.id
|
|
||||||
|
|
||||||
expect(response).to have_gitlab_http_status(200)
|
|
||||||
expect(assigns(:target_branches)).to eq([])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ describe 'Merge request > User selects branches for new MR', :js do
|
||||||
expect(page).to have_content('Target branch')
|
expect(page).to have_content('Target branch')
|
||||||
|
|
||||||
first('.js-source-branch').click
|
first('.js-source-branch').click
|
||||||
find('.dropdown-source-branch .dropdown-content a', match: :first).click
|
find('.js-source-branch-dropdown .dropdown-content a', match: :first).click
|
||||||
|
|
||||||
expect(page).to have_content "b83d6e3"
|
expect(page).to have_content "b83d6e3"
|
||||||
end
|
end
|
||||||
|
|
@ -35,22 +35,16 @@ describe 'Merge request > User selects branches for new MR', :js do
|
||||||
expect(page).to have_content('Target branch')
|
expect(page).to have_content('Target branch')
|
||||||
|
|
||||||
first('.js-target-branch').click
|
first('.js-target-branch').click
|
||||||
find('.dropdown-target-branch .dropdown-content a', text: 'v1.1.0', match: :first).click
|
find('.js-target-branch-dropdown .dropdown-content a', text: 'v1.1.0', match: :first).click
|
||||||
|
|
||||||
expect(page).to have_content "b83d6e3"
|
expect(page).to have_content "b83d6e3"
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'generates a diff for an orphaned branch' do
|
it 'generates a diff for an orphaned branch' do
|
||||||
visit project_merge_requests_path(project)
|
visit project_new_merge_request_path(project)
|
||||||
|
|
||||||
page.within '.content' do
|
|
||||||
click_link 'New merge request'
|
|
||||||
end
|
|
||||||
expect(page).to have_content('Source branch')
|
|
||||||
expect(page).to have_content('Target branch')
|
|
||||||
|
|
||||||
find('.js-source-branch', match: :first).click
|
find('.js-source-branch', match: :first).click
|
||||||
find('.dropdown-source-branch .dropdown-content a', text: 'orphaned-branch', match: :first).click
|
find('.js-source-branch-dropdown .dropdown-content a', text: 'orphaned-branch', match: :first).click
|
||||||
|
|
||||||
click_button "Compare branches"
|
click_button "Compare branches"
|
||||||
click_link "Changes"
|
click_link "Changes"
|
||||||
|
|
@ -71,19 +65,18 @@ describe 'Merge request > User selects branches for new MR', :js do
|
||||||
|
|
||||||
first('.js-source-branch').click
|
first('.js-source-branch').click
|
||||||
|
|
||||||
input = find('.dropdown-source-branch .dropdown-input-field')
|
page.within '.js-source-branch-dropdown' do
|
||||||
|
input = find('.dropdown-input-field')
|
||||||
input.click
|
input.click
|
||||||
input.send_keys('orphaned-branch')
|
input.send_keys('orphaned-branch')
|
||||||
|
|
||||||
find('.dropdown-source-branch .dropdown-content li', match: :first)
|
expect(page).to have_css('.dropdown-content li', count: 1)
|
||||||
source_items = all('.dropdown-source-branch .dropdown-content li')
|
end
|
||||||
|
|
||||||
expect(source_items.count).to eq(1)
|
|
||||||
|
|
||||||
first('.js-target-branch').click
|
first('.js-target-branch').click
|
||||||
|
|
||||||
find('.dropdown-target-branch .dropdown-content li', match: :first)
|
find('.js-target-branch-dropdown .dropdown-content li', match: :first)
|
||||||
target_items = all('.dropdown-target-branch .dropdown-content li')
|
target_items = all('.js-target-branch-dropdown .dropdown-content li')
|
||||||
|
|
||||||
expect(target_items.count).to be > 1
|
expect(target_items.count).to be > 1
|
||||||
end
|
end
|
||||||
|
|
@ -171,7 +164,6 @@ describe 'Merge request > User selects branches for new MR', :js do
|
||||||
|
|
||||||
page.within('.merge-request') do
|
page.within('.merge-request') do
|
||||||
click_link 'Pipelines'
|
click_link 'Pipelines'
|
||||||
wait_for_requests
|
|
||||||
|
|
||||||
expect(page).to have_content "##{pipeline.id}"
|
expect(page).to have_content "##{pipeline.id}"
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ RSpec.shared_examples 'a creatable merge request' do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'updates the branches when selecting a new target project' do
|
it 'updates the branches when selecting a new target project', :js do
|
||||||
target_project_member = target_project.owner
|
target_project_member = target_project.owner
|
||||||
CreateBranchService.new(target_project, target_project_member)
|
CreateBranchService.new(target_project, target_project_member)
|
||||||
.execute('a-brand-new-branch-to-test', 'master')
|
.execute('a-brand-new-branch-to-test', 'master')
|
||||||
|
|
@ -92,7 +92,7 @@ RSpec.shared_examples 'a creatable merge request' do
|
||||||
|
|
||||||
first('.js-target-branch').click
|
first('.js-target-branch').click
|
||||||
|
|
||||||
within('.dropdown-target-branch .dropdown-content') do
|
within('.js-target-branch-dropdown .dropdown-content') do
|
||||||
expect(page).to have_content('a-brand-new-branch-to-test')
|
expect(page).to have_content('a-brand-new-branch-to-test')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue