Commit 0f8a0f60 authored by GitLab Bot's avatar GitLab Bot

Merge remote-tracking branch 'upstream/master' into ce-to-ee-2018-06-15

parents fe5a7f00 8db7e253
...@@ -307,14 +307,23 @@ To better understand the priority by which UX tackles issues, see the [UX sectio ...@@ -307,14 +307,23 @@ To better understand the priority by which UX tackles issues, see the [UX sectio
Once an issue has been worked on and is ready for development, a UXer removes the ~"UX" label and applies the ~"UX ready" label to that issue. Once an issue has been worked on and is ready for development, a UXer removes the ~"UX" label and applies the ~"UX ready" label to that issue.
The UX team has a special type label called ~"design artifact". This label indicates that the final output The UX team has a special type label called ~"design artifact". This label indicates that the final output
for an issue is a UX solution/design. The solution will be developed by frontend and/or backend in a subsequent milestone. for an issue is a UX solution/design. The solution will be developed by frontend and/or backend in a subsequent milestone.
Any issue labeled ~"design artifact" should not also be labeled ~"frontend" or ~"backend" since no development is Any issue labeled ~"design artifact" should not also be labeled ~"frontend" or ~"backend" since no development is
needed until the solution has been decided. needed until the solution has been decided.
~"design artifact" issues are like any other issue and should contain a milestone label, ~"Deliverable" or ~"Stretch", when scheduled in the current milestone. ~"design artifact" issues are like any other issue and should contain a milestone label, ~"Deliverable" or ~"Stretch", when scheduled in the current milestone.
Once the ~"design artifact" issue has been completed, the UXer removes the ~"design artifact" label and applies the ~"UX ready" label. The Product Manager can use the To prevent the misunderstanding that a feature will be be delivered in the
existing issue or decide to create a whole new issue for the purpose of development. assigned milestone, when only UX design is planned for that milestone, the
Product Manager should create a separate issue for the ~"design artifact",
assign the ~UX, ~"design artifact" and ~"Deliverable" labels, add a milestone
and use a title that makes it clear that the scheduled issue is design only
(e.g. `Design exploration for XYZ`).
When the ~"design artifact" issue has been completed, the UXer removes the ~UX
label, adds the ~"UX ready" label and closes the issue. This indicates the
design artifact is complete. The UXer will also copy the designs to related
issues for implementation in an upcoming milestone.
## Issue tracker ## Issue tracker
......
...@@ -90,7 +90,7 @@ const bindEvents = () => { ...@@ -90,7 +90,7 @@ const bindEvents = () => {
function chooseTemplate() { function chooseTemplate() {
$('.template-option').hide(); $('.template-option').hide();
$projectFieldsForm.addClass('selected'); $projectFieldsForm.addClass('selected');
$selectedIcon.removeClass('active'); $selectedIcon.removeClass('d-block');
const value = $(this).val(); const value = $(this).val();
const templates = { const templates = {
rails: { rails: {
...@@ -109,7 +109,7 @@ const bindEvents = () => { ...@@ -109,7 +109,7 @@ const bindEvents = () => {
const selectedTemplate = templates[value]; const selectedTemplate = templates[value];
$selectedTemplateText.text(selectedTemplate.text); $selectedTemplateText.text(selectedTemplate.text);
$(selectedTemplate.icon).addClass('active'); $(selectedTemplate.icon).addClass('d-block');
$templateProjectNameInput.focus(); $templateProjectNameInput.focus();
} }
......
...@@ -11,7 +11,7 @@ import syntaxHighlight from './syntax_highlight'; ...@@ -11,7 +11,7 @@ import syntaxHighlight from './syntax_highlight';
const WRAPPER = '<div class="diff-content"></div>'; const WRAPPER = '<div class="diff-content"></div>';
const LOADING_HTML = '<i class="fa fa-spinner fa-spin"></i>'; const LOADING_HTML = '<i class="fa fa-spinner fa-spin"></i>';
const ERROR_HTML = '<div class="nothing-here-block"><i class="fa fa-warning"></i> Could not load diff</div>'; const ERROR_HTML = '<div class="nothing-here-block"><i class="fa fa-warning"></i> Could not load diff</div>';
const COLLAPSED_HTML = '<div class="nothing-here-block diff-collapsed">This diff is collapsed. <a class="click-to-expand">Click to expand it.</a></div>'; const COLLAPSED_HTML = '<div class="nothing-here-block diff-collapsed">This diff is collapsed. <button class="click-to-expand btn btn-link">Click to expand it.</button></div>';
export default class SingleFileDiff { export default class SingleFileDiff {
constructor(file) { constructor(file) {
......
...@@ -293,3 +293,9 @@ input[type=color].form-control { ...@@ -293,3 +293,9 @@ input[type=color].form-control {
color: $gl-text-color-secondary; color: $gl-text-color-secondary;
} }
} }
.project-templates-buttons {
.btn {
vertical-align: unset;
}
}
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
.click-to-expand { .click-to-expand {
cursor: pointer; cursor: pointer;
vertical-align: initial;
} }
} }
} }
......
...@@ -497,6 +497,12 @@ ...@@ -497,6 +497,12 @@
&:not(:first-child) { &:not(:first-child) {
border-top: 1px solid $border-color; border-top: 1px solid $border-color;
} }
.btn-template-icon {
position: absolute;
left: $gl-padding;
top: $gl-padding;
}
} }
.template-title { .template-title {
...@@ -514,12 +520,6 @@ ...@@ -514,12 +520,6 @@
} }
} }
svg {
position: absolute;
left: $gl-padding;
top: $gl-padding;
}
.project-fields-form { .project-fields-form {
display: none; display: none;
...@@ -530,34 +530,23 @@ ...@@ -530,34 +530,23 @@
} }
.template-input-group { .template-input-group {
position: relative; .input-group-prepend {
@include media-breakpoint-up(sm) {
display: flex;
}
.input-group-prepend,
.input-group-append {
flex: 1; flex: 1;
text-align: left;
padding-left: ($gl-padding * 3);
background-color: $white-light;
} }
.selected-template { .input-group-text {
line-height: 20px; width: 100%;
background-color: $white-light;
} }
.selected-icon { .selected-icon {
padding-right: $gl-padding;
svg { svg {
display: none; display: none;
top: 7px; top: 7px;
height: 20px; height: 20px;
width: 20px; width: 20px;
&.active {
display: block;
}
} }
} }
} }
......
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
.settings-content { .settings-content {
max-height: 1px; max-height: 1px;
overflow-y: scroll; overflow-y: hidden;
padding-right: 110px; padding-right: 110px;
animation: collapseMaxHeight 300ms ease-out; animation: collapseMaxHeight 300ms ease-out;
// Keep the section from expanding when we scroll over it // Keep the section from expanding when we scroll over it
......
...@@ -10,16 +10,18 @@ ...@@ -10,16 +10,18 @@
%a.btn.btn-default{ href: template.preview, rel: 'noopener noreferrer', target: '_blank' } Preview %a.btn.btn-default{ href: template.preview, rel: 'noopener noreferrer', target: '_blank' } Preview
.project-fields-form .project-fields-form
.form-group .row
%label.label-light .form-group.col-sm-12
Template %label.label-light
.input-group.template-input-group Template
.input-group-prepend .input-group.template-input-group
.input-group-text .input-group-prepend
.selected-icon .input-group-text
- Gitlab::ProjectTemplate.all.each do |template| .selected-icon
= custom_icon(template.logo) - Gitlab::ProjectTemplate.all.each do |template|
.selected-template = custom_icon(template.logo)
%button.btn.btn-default.change-template{ type: "button" } Change template .selected-template
.input-group-append
%button.btn.btn-default.change-template{ type: "button" } Change template
= render 'new_project_fields', f: f, project_name_id: "template-project-name" = render 'new_project_fields', f: f, project_name_id: "template-project-name"
...@@ -2,4 +2,4 @@ ...@@ -2,4 +2,4 @@
- url = url_for(safe_params.merge(action: :diff_for_path, old_path: diff_file.old_path, new_path: diff_file.new_path, file_identifier: diff_file.file_identifier)) - url = url_for(safe_params.merge(action: :diff_for_path, old_path: diff_file.old_path, new_path: diff_file.new_path, file_identifier: diff_file.file_identifier))
.nothing-here-block.diff-collapsed{ data: { diff_for_path: url } } .nothing-here-block.diff-collapsed{ data: { diff_for_path: url } }
This diff is collapsed. This diff is collapsed.
%a.click-to-expand Click to expand it. %button.click-to-expand.btn.btn-link Click to expand it.
%pre.build-trace#build-trace %pre.build-trace#build-trace
%code.bash.js-build-output %code.bash.js-build-output
.build-loader-animation.js-build-refresh .build-loader-animation.js-build-refresh
---
title: Remove scrollbar in Safari in repo settings page
merge_request: 19809
author: gfyoung
type: fixed
...@@ -109,7 +109,7 @@ with a major point release of GitLab itself. All deprecations and changes ...@@ -109,7 +109,7 @@ with a major point release of GitLab itself. All deprecations and changes
between two versions should be listed in the documentation. For the changes between two versions should be listed in the documentation. For the changes
between v3 and v4; please read the [v3 to v4 documentation](v3_to_v4.md) between v3 and v4; please read the [v3 to v4 documentation](v3_to_v4.md)
#### Current status ### Current status
Currently only API version v4 is available. Version v3 was removed in Currently only API version v4 is available. Version v3 was removed in
[GitLab 11.0](https://gitlab.com/gitlab-org/gitlab-ce/issues/36819). [GitLab 11.0](https://gitlab.com/gitlab-org/gitlab-ce/issues/36819).
......
...@@ -10,7 +10,6 @@ Milestones allow you to organize issues and merge requests into a cohesive group ...@@ -10,7 +10,6 @@ Milestones allow you to organize issues and merge requests into a cohesive group
- **Project milestones** can be assigned to issues or merge requests in that project only. - **Project milestones** can be assigned to issues or merge requests in that project only.
- **Group milestones** can be assigned to any issue or merge request of any project in that group. - **Group milestones** can be assigned to any issue or merge request of any project in that group.
- In the [future](https://gitlab.com/gitlab-org/gitlab-ce/issues/36862), you will be able to assign group milestones to issues and merge requests of projects in [subgroups](../../group/subgroups/index.md).
## Creating milestones ## Creating milestones
......
...@@ -31,7 +31,7 @@ describe 'Dropdown assignee', :js do ...@@ -31,7 +31,7 @@ describe 'Dropdown assignee', :js do
describe 'behavior' do describe 'behavior' do
it 'opens when the search bar has assignee:' do it 'opens when the search bar has assignee:' do
filtered_search.set('assignee:') input_filtered_search('assignee:', submit: false, extra_space: false)
expect(page).to have_css(js_dropdown_assignee, visible: true) expect(page).to have_css(js_dropdown_assignee, visible: true)
end end
...@@ -44,6 +44,7 @@ describe 'Dropdown assignee', :js do ...@@ -44,6 +44,7 @@ describe 'Dropdown assignee', :js do
it 'should show loading indicator when opened' do it 'should show loading indicator when opened' do
slow_requests do slow_requests do
# We aren't using `input_filtered_search` because we want to see the loading indicator
filtered_search.set('assignee:') filtered_search.set('assignee:')
expect(page).to have_css('#js-dropdown-assignee .filter-dropdown-loading', visible: true) expect(page).to have_css('#js-dropdown-assignee .filter-dropdown-loading', visible: true)
...@@ -51,19 +52,19 @@ describe 'Dropdown assignee', :js do ...@@ -51,19 +52,19 @@ describe 'Dropdown assignee', :js do
end end
it 'should hide loading indicator when loaded' do it 'should hide loading indicator when loaded' do
filtered_search.set('assignee:') input_filtered_search('assignee:', submit: false, extra_space: false)
expect(find(js_dropdown_assignee)).not_to have_css('.filter-dropdown-loading') expect(find(js_dropdown_assignee)).not_to have_css('.filter-dropdown-loading')
end end
it 'should load all the assignees when opened' do it 'should load all the assignees when opened' do
filtered_search.set('assignee:') input_filtered_search('assignee:', submit: false, extra_space: false)
expect(dropdown_assignee_size).to eq(4) expect(dropdown_assignee_size).to eq(4)
end end
it 'shows current user at top of dropdown' do it 'shows current user at top of dropdown' do
filtered_search.set('assignee:') input_filtered_search('assignee:', submit: false, extra_space: false)
expect(filter_dropdown.first('.filter-dropdown-item')).to have_content(user.name) expect(filter_dropdown.first('.filter-dropdown-item')).to have_content(user.name)
end end
...@@ -71,7 +72,7 @@ describe 'Dropdown assignee', :js do ...@@ -71,7 +72,7 @@ describe 'Dropdown assignee', :js do
describe 'filtering' do describe 'filtering' do
before do before do
filtered_search.set('assignee:') input_filtered_search('assignee:', submit: false, extra_space: false)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_john.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_john.name)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name)
...@@ -79,23 +80,21 @@ describe 'Dropdown assignee', :js do ...@@ -79,23 +80,21 @@ describe 'Dropdown assignee', :js do
end end
it 'filters by name' do it 'filters by name' do
filtered_search.send_keys('j') input_filtered_search('jac', submit: false, extra_space: false)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_john.name)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_no_content(user.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_no_content(user.name)
end end
it 'filters by case insensitive name' do it 'filters by case insensitive name' do
filtered_search.send_keys('J') input_filtered_search('JAC', submit: false, extra_space: false)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_john.name)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_no_content(user.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_no_content(user.name)
end end
it 'filters by username with symbol' do it 'filters by username with symbol' do
filtered_search.send_keys('@ot') input_filtered_search('@ott', submit: false, extra_space: false)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name)
...@@ -103,7 +102,7 @@ describe 'Dropdown assignee', :js do ...@@ -103,7 +102,7 @@ describe 'Dropdown assignee', :js do
end end
it 'filters by case insensitive username with symbol' do it 'filters by case insensitive username with symbol' do
filtered_search.send_keys('@OT') input_filtered_search('@OTT', submit: false, extra_space: false)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name)
...@@ -111,7 +110,9 @@ describe 'Dropdown assignee', :js do ...@@ -111,7 +110,9 @@ describe 'Dropdown assignee', :js do
end end
it 'filters by username without symbol' do it 'filters by username without symbol' do
filtered_search.send_keys('ot') input_filtered_search('ott', submit: false, extra_space: false)
wait_for_requests
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name)
...@@ -119,7 +120,9 @@ describe 'Dropdown assignee', :js do ...@@ -119,7 +120,9 @@ describe 'Dropdown assignee', :js do
end end
it 'filters by case insensitive username without symbol' do it 'filters by case insensitive username without symbol' do
filtered_search.send_keys('OT') input_filtered_search('OTT', submit: false, extra_space: false)
wait_for_requests
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user_jacob.name)
expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name) expect(find("#{js_dropdown_assignee} .filter-dropdown")).to have_content(user.name)
...@@ -129,7 +132,7 @@ describe 'Dropdown assignee', :js do ...@@ -129,7 +132,7 @@ describe 'Dropdown assignee', :js do
describe 'selecting from dropdown' do describe 'selecting from dropdown' do
before do before do
filtered_search.set('assignee:') input_filtered_search('assignee:', submit: false, extra_space: false)
end end
it 'fills in the assignee username when the assignee has not been filtered' do it 'fills in the assignee username when the assignee has not been filtered' do
...@@ -143,7 +146,7 @@ describe 'Dropdown assignee', :js do ...@@ -143,7 +146,7 @@ describe 'Dropdown assignee', :js do
end end
it 'fills in the assignee username when the assignee has been filtered' do it 'fills in the assignee username when the assignee has been filtered' do
filtered_search.send_keys('roo') input_filtered_search('roo', submit: false, extra_space: false)
click_assignee(user.name) click_assignee(user.name)
wait_for_requests wait_for_requests
...@@ -165,7 +168,7 @@ describe 'Dropdown assignee', :js do ...@@ -165,7 +168,7 @@ describe 'Dropdown assignee', :js do
describe 'selecting from dropdown without Ajax call' do describe 'selecting from dropdown without Ajax call' do
before do before do
Gitlab::Testing::RequestBlockerMiddleware.block_requests! Gitlab::Testing::RequestBlockerMiddleware.block_requests!
filtered_search.set('assignee:') input_filtered_search('assignee:', submit: false, extra_space: false)
end end
after do after do
...@@ -183,31 +186,31 @@ describe 'Dropdown assignee', :js do ...@@ -183,31 +186,31 @@ describe 'Dropdown assignee', :js do
describe 'input has existing content' do describe 'input has existing content' do
it 'opens assignee dropdown with existing search term' do it 'opens assignee dropdown with existing search term' do
filtered_search.set('searchTerm assignee:') input_filtered_search('searchTerm assignee:', submit: false, extra_space: false)
expect(page).to have_css(js_dropdown_assignee, visible: true) expect(page).to have_css(js_dropdown_assignee, visible: true)
end end
it 'opens assignee dropdown with existing author' do it 'opens assignee dropdown with existing author' do
filtered_search.set('author:@user assignee:') input_filtered_search('author:@user assignee:', submit: false, extra_space: false)
expect(page).to have_css(js_dropdown_assignee, visible: true) expect(page).to have_css(js_dropdown_assignee, visible: true)
end end
it 'opens assignee dropdown with existing label' do it 'opens assignee dropdown with existing label' do
filtered_search.set('label:~bug assignee:') input_filtered_search('label:~bug assignee:', submit: false, extra_space: false)
expect(page).to have_css(js_dropdown_assignee, visible: true) expect(page).to have_css(js_dropdown_assignee, visible: true)
end end
it 'opens assignee dropdown with existing milestone' do it 'opens assignee dropdown with existing milestone' do
filtered_search.set('milestone:%v1.0 assignee:') input_filtered_search('milestone:%v1.0 assignee:', submit: false, extra_space: false)
expect(page).to have_css(js_dropdown_assignee, visible: true) expect(page).to have_css(js_dropdown_assignee, visible: true)
end end
it 'opens assignee dropdown with existing my-reaction' do it 'opens assignee dropdown with existing my-reaction' do
filtered_search.set('my-reaction:star assignee:') input_filtered_search('my-reaction:star assignee:', submit: false, extra_space: false)
expect(page).to have_css(js_dropdown_assignee, visible: true) expect(page).to have_css(js_dropdown_assignee, visible: true)
end end
...@@ -215,8 +218,7 @@ describe 'Dropdown assignee', :js do ...@@ -215,8 +218,7 @@ describe 'Dropdown assignee', :js do
describe 'caching requests' do describe 'caching requests' do
it 'caches requests after the first load' do it 'caches requests after the first load' do
filtered_search.set('assignee') input_filtered_search('assignee:', submit: false, extra_space: false)
filtered_search.send_keys(':')
initial_size = dropdown_assignee_size initial_size = dropdown_assignee_size
expect(initial_size).to be > 0 expect(initial_size).to be > 0
...@@ -224,8 +226,7 @@ describe 'Dropdown assignee', :js do ...@@ -224,8 +226,7 @@ describe 'Dropdown assignee', :js do
new_user = create(:user) new_user = create(:user)
project.add_master(new_user) project.add_master(new_user)
find('.filtered-search-box .clear-search').click find('.filtered-search-box .clear-search').click
filtered_search.set('assignee') input_filtered_search('assignee:', submit: false, extra_space: false)
filtered_search.send_keys(':')
expect(dropdown_assignee_size).to eq(initial_size) expect(dropdown_assignee_size).to eq(initial_size)
end end
......
...@@ -166,8 +166,7 @@ feature 'Diff file viewer', :js do ...@@ -166,8 +166,7 @@ feature 'Diff file viewer', :js do
context 'expanding the diff' do context 'expanding the diff' do
before do before do
# We can't use `click_link` because the "link" doesn't have an `href`. click_button 'Click to expand it.'
find('a.click-to-expand').click
wait_for_requests wait_for_requests
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