Commit 886b2468 authored by Simon Knox's avatar Simon Knox

Merge branch '299366-feature-flag-rollout-of-board_new_list' into 'master'

Remove `board_new_list` feature flag [RUN ALL RSPEC] [RUN AS-IF-FOSS]

See merge request gitlab-org/gitlab!59826
parents 1f56f7d3 ec1eb8d0
...@@ -2548,8 +2548,6 @@ Gitlab/FeatureAvailableUsage: ...@@ -2548,8 +2548,6 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/views/projects/settings/operations/_status_page.html.haml' - 'ee/app/views/projects/settings/operations/_status_page.html.haml'
- 'ee/app/views/projects/settings/repository/_protected_branches.html.haml' - 'ee/app/views/projects/settings/repository/_protected_branches.html.haml'
- 'ee/app/views/projects/sidebar/_repository_locked_files.html.haml' - 'ee/app/views/projects/sidebar/_repository_locked_files.html.haml'
- 'ee/app/views/shared/issuable/_board_create_list_dropdown.html.haml'
- 'ee/app/views/shared/issuable/_board_create_list_dropdown.html.haml'
- 'ee/app/views/shared/issuable/_group_bulk_update_sidebar.html.haml' - 'ee/app/views/shared/issuable/_group_bulk_update_sidebar.html.haml'
- 'ee/app/views/shared/issuable/form/_default_templates.html.haml' - 'ee/app/views/shared/issuable/form/_default_templates.html.haml'
- 'ee/app/views/shared/labels/_create_label_help_text.html.haml' - 'ee/app/views/shared/labels/_create_label_help_text.html.haml'
......
/* eslint-disable func-names, no-new */
import $ from 'jquery';
import store from '~/boards/stores';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
import createFlash from '~/flash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
import CreateLabelDropdown from '../../create_label';
import { fullLabelId } from '../boards_util';
import boardsStore from '../stores/boards_store';
function shouldCreateListGraphQL(label) {
return store.getters.shouldUseGraphQL && !store.getters.getListByLabelId(fullLabelId(label));
}
// eslint-disable-next-line @gitlab/no-global-event-off
$(document)
.off('created.label')
.on('created.label', (e, label, addNewList) => {
if (!addNewList) {
return;
}
if (shouldCreateListGraphQL(label)) {
store.dispatch('createList', { labelId: fullLabelId(label) });
} else {
boardsStore.new({
title: label.title,
position: boardsStore.state.lists.length - 2,
list_type: 'label',
label: {
id: label.id,
title: label.title,
color: label.color,
},
});
}
});
export default function initNewListDropdown() {
$('.js-new-board-list').each(function () {
const $dropdownToggle = $(this);
const $dropdown = $dropdownToggle.closest('.dropdown');
new CreateLabelDropdown(
$dropdown.find('.dropdown-new-label'),
$dropdownToggle.data('namespacePath'),
$dropdownToggle.data('projectPath'),
);
initDeprecatedJQueryDropdown($dropdownToggle, {
data(term, callback) {
const reqFailed = () => {
$dropdownToggle.data('bs.dropdown').hide();
createFlash({
message: __('Error fetching labels.'),
});
};
if (store.getters.shouldUseGraphQL) {
store
.dispatch('fetchLabels')
.then((data) => callback(data))
.catch(reqFailed);
} else {
axios
.get($dropdownToggle.attr('data-list-labels-path'))
.then(({ data }) => callback(data))
.catch(reqFailed);
}
},
renderRow(label) {
const active = store.getters.shouldUseGraphQL
? store.getters.getListByLabelId(label.id)
: boardsStore.findListByLabelId(label.id);
const $li = $('<li />');
const $a = $('<a />', {
class: active ? `is-active js-board-list-${getIdFromGraphQLId(active.id)}` : '',
text: label.title,
href: '#',
});
const $labelColor = $('<span />', {
class: 'dropdown-label-box',
style: `background-color: ${label.color}`,
});
return $li.append($a.prepend($labelColor));
},
search: {
fields: ['title'],
},
filterable: true,
selectable: true,
multiSelect: true,
containerSelector: '.js-tab-container-labels .dropdown-page-one .dropdown-content',
clicked(options) {
const { e } = options;
const label = options.selectedObj;
e.preventDefault();
if (shouldCreateListGraphQL(label)) {
store.dispatch('createList', { labelId: label.id });
} else if (!boardsStore.findListByLabelId(label.id)) {
boardsStore.new({
title: label.title,
position: boardsStore.state.lists.length - 2,
list_type: 'label',
label: {
id: label.id,
title: label.title,
color: label.color,
},
});
}
},
});
});
}
...@@ -7,12 +7,7 @@ import { mapActions, mapGetters } from 'vuex'; ...@@ -7,12 +7,7 @@ import { mapActions, mapGetters } from 'vuex';
import 'ee_else_ce/boards/models/issue'; import 'ee_else_ce/boards/models/issue';
import 'ee_else_ce/boards/models/list'; import 'ee_else_ce/boards/models/list';
import BoardSidebar from 'ee_else_ce/boards/components/board_sidebar'; import BoardSidebar from 'ee_else_ce/boards/components/board_sidebar';
import initNewListDropdown from 'ee_else_ce/boards/components/new_list_dropdown'; import { setWeightFetchingState, setEpicFetchingState } from 'ee_else_ce/boards/ee_functions';
import {
setWeightFetchingState,
setEpicFetchingState,
getMilestoneTitle,
} from 'ee_else_ce/boards/ee_functions';
import toggleEpicsSwimlanes from 'ee_else_ce/boards/toggle_epics_swimlanes'; import toggleEpicsSwimlanes from 'ee_else_ce/boards/toggle_epics_swimlanes';
import toggleLabels from 'ee_else_ce/boards/toggle_labels'; import toggleLabels from 'ee_else_ce/boards/toggle_labels';
import BoardAddNewColumnTrigger from '~/boards/components/board_add_new_column_trigger.vue'; import BoardAddNewColumnTrigger from '~/boards/components/board_add_new_column_trigger.vue';
...@@ -313,20 +308,6 @@ export default () => { ...@@ -313,20 +308,6 @@ export default () => {
}, },
}); });
// eslint-disable-next-line no-new, @gitlab/no-runtime-template-compiler
new Vue({
el: document.getElementById('js-add-list'),
data() {
return {
filters: boardsStore.state.filters,
...getMilestoneTitle($boardApp),
};
},
mounted() {
initNewListDropdown();
},
});
const createColumnTriggerEl = document.querySelector('.js-create-column-trigger'); const createColumnTriggerEl = document.querySelector('.js-create-column-trigger');
if (createColumnTriggerEl) { if (createColumnTriggerEl) {
// eslint-disable-next-line no-new // eslint-disable-next-line no-new
......
...@@ -386,15 +386,6 @@ ...@@ -386,15 +386,6 @@
} }
} }
} }
.boards-add-list > .btn {
text-align: left;
> svg {
position: absolute;
right: 6px;
}
}
} }
.droplab-dropdown .dropdown-menu .filter-dropdown-item { .droplab-dropdown .dropdown-menu .filter-dropdown-item {
......
...@@ -15,14 +15,6 @@ ...@@ -15,14 +15,6 @@
} }
} }
.dropdown-menu-issues-board-new {
width: 320px;
.dropdown-content {
max-height: 140px;
}
}
.issue-board-dropdown-content { .issue-board-dropdown-content {
margin: 0; margin: 0;
padding: $gl-padding-4 $gl-padding $gl-padding; padding: $gl-padding-4 $gl-padding $gl-padding;
......
.dropdown.gl-display-flex.gl-align-items-center.gl-ml-3#js-add-list
%button.gl-button.btn.btn-confirm.js-new-board-list{ type: "button", data: board_list_data }
Add list
.dropdown-menu.dropdown-extended-height.dropdown-menu-paging.dropdown-menu-right.dropdown-menu-issues-board-new.dropdown-menu-selectable.js-tab-container-labels
= render partial: "shared/issuable/label_page_default", locals: { show_footer: true, show_create: true, show_boards_content: true, title: "Add list" }
- if can?(current_user, :admin_label, board.resource_parent)
= render partial: "shared/issuable/label_page_create", locals: { show_add_list: true, add_list: true, add_list_class: 'd-none' }
= dropdown_loading
...@@ -207,10 +207,7 @@ ...@@ -207,10 +207,7 @@
#js-board-epics-swimlanes-toggle #js-board-epics-swimlanes-toggle
.js-board-config{ data: { can_admin_list: user_can_admin_list.to_s, has_scope: board.scoped?.to_s } } .js-board-config{ data: { can_admin_list: user_can_admin_list.to_s, has_scope: board.scoped?.to_s } }
- if user_can_admin_list - if user_can_admin_list
- if Feature.enabled?(:board_new_list, board.resource_parent, default_enabled: :yaml) || board.to_type == "EpicBoard" .js-create-column-trigger{ data: board_list_data }
.js-create-column-trigger{ data: board_list_data }
- else
= render 'shared/issuable/board_create_list_dropdown', board: board
#js-toggle-focus-btn #js-toggle-focus-btn
- elsif type != :productivity_analytics && show_sorting_dropdown - elsif type != :productivity_analytics && show_sorting_dropdown
= render 'shared/issuable/sort_dropdown' = render 'shared/issuable/sort_dropdown'
---
name: board_new_list
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52061
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/299366
milestone: '13.8'
type: development
group: group::project management
default_enabled: true
...@@ -339,14 +339,14 @@ As in other list types, click the trash icon to remove a list. ...@@ -339,14 +339,14 @@ As in other list types, click the trash icon to remove a list.
### Iteration lists **(PREMIUM)** ### Iteration lists **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250479) in GitLab 13.11. > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250479) in GitLab 13.11.
> - [Deployed behind the `board_new_list` and `iteration_board_lists` feature flags](../feature_flags.md), enabled by default. > - Enabled on GitLab.com and is ready for production use.
> - Enabled on GitLab.com. > - Enabled with `iteration_board_lists` flag for self-managed GitLab and is ready for production use.
> - Recommended for production use. > GitLab administrators can opt to [disable the feature flag](#enable-or-disable-iteration-lists-in-boards).
> - For GitLab self-managed instances, GitLab administrators can opt to disable the feature flags: [`board_new_list`](#enable-or-disable-new-add-list-form) and [`iteration_board_lists`](#enable-or-disable-iteration-lists-in-boards). **(PREMIUM SELF)**
There can be FLAG:
[risks when disabling released features](../../administration/feature_flags.md#risks-when-disabling-released-features). On self-managed GitLab, by default this feature is available. To hide the feature, ask an
Refer to this feature's version history for more details. administrator to [disable the `iteration_board_lists` flag](../../administration/feature_flags.md).
On GitLab.com, this feature is available.
You're also able to create lists of an iteration. You're also able to create lists of an iteration.
These are lists that filter issues by the assigned These are lists that filter issues by the assigned
...@@ -675,10 +675,6 @@ A few things to remember: ...@@ -675,10 +675,6 @@ A few things to remember:
### Enable or disable GraphQL-based issue boards **(FREE SELF)** ### Enable or disable GraphQL-based issue boards **(FREE SELF)**
NOTE:
When enabling GraphQL-based issue boards, you must also enable the
[new add list form](#enable-or-disable-new-add-list-form).
It is deployed behind a feature flag that is **enabled by default** as of GitLab 14.1. It is deployed behind a feature flag that is **enabled by default** as of GitLab 14.1.
[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md) [GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
can disable it. can disable it.
...@@ -695,30 +691,8 @@ To disable it: ...@@ -695,30 +691,8 @@ To disable it:
Feature.disable(:graphql_board_lists) Feature.disable(:graphql_board_lists)
``` ```
### Enable or disable new add list form **(FREE SELF)**
The new form for adding lists is under development but ready for production use. It is
deployed behind a feature flag that is **enabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
can disable it.
To enable it:
```ruby
Feature.enable(:board_new_list)
```
To disable it:
```ruby
Feature.disable(:board_new_list)
```
### Enable or disable iteration lists in boards **(PREMIUM SELF)** ### Enable or disable iteration lists in boards **(PREMIUM SELF)**
NOTE:
When disabling iteration lists in boards, you also need to disable the [new add list form](#enable-or-disable-new-add-list-form).
The iteration list is under development but ready for production use. It is The iteration list is under development but ready for production use. It is
deployed behind a feature flag that is **enabled by default**. deployed behind a feature flag that is **enabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md) [GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
......
import BoardsListSelector from './boards_list_selector/index';
export default function initAssigneesListSelector() {
const $addListEl = document.querySelector('#js-add-list');
return new BoardsListSelector({
propsData: {
listPath: $addListEl.querySelector('.js-new-board-list').dataset.listAssigneesPath,
listType: 'assignees',
},
}).$mount('.js-assignees-list');
}
import BoardsListSelector from './boards_list_selector';
export default function initMilestoneListSelector() {
const $addListEl = document.querySelector('#js-add-list');
return new BoardsListSelector({
propsData: {
listPath: $addListEl.querySelector('.js-new-board-list').dataset.listMilestonePath,
listType: 'milestones',
},
}).$mount('.js-milestone-list');
}
import $ from 'jquery';
import initNewListDropdown from '~/boards/components/new_list_dropdown';
import AssigneeList from './assignees_list_selector';
import MilestoneList from './milestone_list_selector';
const handleDropdownHide = (e) => {
const $currTarget = $(e.currentTarget);
if ($currTarget.data('preventClose')) {
e.preventDefault();
}
$currTarget.removeData('preventClose');
};
let assigneeList;
let milestoneList;
const handleDropdownTabClick = (e) => {
const $addListEl = $('#js-add-list');
$addListEl.data('preventClose', true);
if (e.target.dataset.action === 'tab-assignees' && !assigneeList) {
assigneeList = AssigneeList();
}
if (e.target.dataset.action === 'tab-milestones' && !milestoneList) {
milestoneList = MilestoneList();
}
};
export default () => {
initNewListDropdown();
$('#js-add-list').on('hide.bs.dropdown', handleDropdownHide);
$('.js-new-board-list-tabs').on('click', handleDropdownTabClick);
};
@import '../../../../../app/assets/stylesheets/page_bundles/boards'; @import '../../../../../app/assets/stylesheets/page_bundles/boards';
.boards-add-list {
&.show {
.dropdown-menu-tabs {
max-height: 400px;
min-width: 240px;
overflow-y: hidden;
}
}
.dropdown-tabs-list {
box-shadow: 0 0 0 1px var(--border-color, $border-color);
}
.dropdown-tab-item {
border-left: 1px solid var(--border-color, $border-color);
a {
border-bottom: 2px solid transparent;
background-color: var(--gray-50, $gray-50);
&:focus,
&.active {
background-color: var(--white, $white);
}
&.active {
font-weight: bold;
border-bottom-color: var(--indigo-500, $indigo-500);
}
}
}
.issue-board-dropdown-content {
padding: $gl-padding;
}
}
.board-add-new-list .gl-new-dropdown-inner { .board-add-new-list .gl-new-dropdown-inner {
max-height: 12rem !important; max-height: 12rem !important;
......
.dropdown-page-one
.issue-board-dropdown-content
%p
= _('Assignee lists show all issues assigned to the selected user.')
.js-assignees-list
- assignee_lists_available = board.resource_parent.feature_available?(:board_assignee_lists)
- milestone_lists_available = board.resource_parent.feature_available?(:board_milestone_lists)
- if assignee_lists_available || milestone_lists_available
.dropdown.boards-add-list.gl-ml-3.gl-display-flex.gl-align-items-center#js-add-list
%button.btn.gl-button.btn-confirm.gl-display-flex.js-new-board-list{ type: "button", data: board_list_data }
%span Add list
= sprite_icon('chevron-down', css_class: 'gl-ml-2 btn-success-board-list-chevron')
.dropdown-menu.dropdown-menu-paging.dropdown-menu-right.dropdown-menu-issues-board-new.dropdown-menu-selectable.dropdown-menu-tabs.pt-0
%ul.nav.nav-tabs.dropdown-tabs-list.d-flex.js-new-board-list-tabs{ role: 'tablist' }
%li.nav-item.dropdown-tab-item.flex-grow-1.flex-shrink-1.w-0.border-left-0.js-tab-button-labels
%a.w-100.text-center.py-3.px-2.active{ href: '#', role: 'tab', data: { is_link: 'true', toggle: 'tab', action: 'tab-labels', target: '#tab-labels' } }
Label
- if assignee_lists_available
%li.nav-item.dropdown-tab-item.flex-grow-1.flex-shrink-1.w-0.js-tab-button-assignees
%a.w-100.text-center.py-3.px-2{ href: '#', role: 'tab', data: { is_link: 'true', toggle: 'tab', action: 'tab-assignees', target: '#tab-assignees' } }
Assignee
- if milestone_lists_available
%li.nav-item.dropdown-tab-item.flex-grow-1.flex-shrink-1.w-0.js-tab-button-milestones
%a.w-100.text-center.py-3.px-2{ href: '#', role: 'tab', data: { is_link: 'true', toggle: 'tab', action: 'tab-milestones', target: '#tab-milestones' } }
Milestone
.tab-content
#tab-labels.tab-pane.tab-pane-labels.active.js-tab-container-labels{ role: 'tabpanel' }
= render partial: "shared/issuable/label_page_default", locals: { show_title: false, show_footer: true, show_create: true, show_boards_content: true, content_title: _('Label lists show all issues with the selected label.') }
- if can?(current_user, :admin_label, board.resource_parent)
= render partial: "shared/issuable/label_page_create", locals: { show_close: false }
- if assignee_lists_available
#tab-assignees.tab-pane.tab-pane-assignees.js-tab-container-assignees{ role: 'tabpanel' }
= render partial: "shared/issuable/assignee_page_default"
- if milestone_lists_available
#tab-milestones.tab-pane.tab-pane-milestones.js-tab-container-milestones{ role: 'tabpanel' }
= render partial: "shared/issuable/milestone_page_default"
= dropdown_loading
- else
= render_ce 'shared/issuable/board_create_list_dropdown', board: board
.dropdown-page-one
.issue-board-dropdown-content
%p
= _('Milestone lists show all issues from the selected milestone.')
.js-milestone-list
...@@ -35,46 +35,6 @@ RSpec.describe 'Project issue boards', :js do ...@@ -35,46 +35,6 @@ RSpec.describe 'Project issue boards', :js do
end end
end end
context 'add list dropdown' do
let(:group) { create(:group) }
let(:project) { create(:project, :public, namespace: group) }
before do
stub_feature_flags(board_new_list: false)
project.add_maintainer(user)
group.add_reporter(user)
login_as(user)
end
it 'shows tabbed dropdown with labels list and assignees list' do
stub_licensed_features(board_assignee_lists: true)
visit_board_page
page.within('#js-add-list') do
page.find('.js-new-board-list').click
wait_for_requests
expect(page).to have_css('.dropdown-menu.dropdown-menu-tabs')
expect(page).to have_css('.js-tab-button-labels')
expect(page).to have_css('.js-tab-button-assignees')
end
end
it 'shows simple dropdown with only labels list' do
stub_licensed_features(board_assignee_lists: false)
visit_board_page
page.within('#js-add-list') do
page.find('.js-new-board-list').click
wait_for_requests
expect(page).to have_css('.dropdown-menu.js-tab-container-labels')
expect(page).to have_content('Create lists from labels. Issues with that label appear in that list.')
expect(page).not_to have_css('.js-tab-button-assignees')
end
end
end
context 'swimlanes dropdown' do context 'swimlanes dropdown' do
context 'license feature on' do context 'license feature on' do
before do before do
......
...@@ -44,8 +44,7 @@ RSpec.describe 'User adds milestone lists', :js do ...@@ -44,8 +44,7 @@ RSpec.describe 'User adds milestone lists', :js do
set_cookie('sidebar_collapsed', 'true') set_cookie('sidebar_collapsed', 'true')
stub_feature_flags( stub_feature_flags(
graphql_board_lists: graphql_board_lists_enabled, graphql_board_lists: graphql_board_lists_enabled
board_new_list: true
) )
if board_type == :project if board_type == :project
...@@ -89,10 +88,6 @@ RSpec.describe 'User adds milestone lists', :js do ...@@ -89,10 +88,6 @@ RSpec.describe 'User adds milestone lists', :js do
sign_in(user) sign_in(user)
stub_feature_flags(
board_new_list: true
)
visit project_board_path(project, project_board) visit project_board_path(project, project_board)
wait_for_all_requests wait_for_all_requests
......
...@@ -4650,9 +4650,6 @@ msgstr "" ...@@ -4650,9 +4650,6 @@ msgstr ""
msgid "Assignee lists not available with your current license" msgid "Assignee lists not available with your current license"
msgstr "" msgstr ""
msgid "Assignee lists show all issues assigned to the selected user."
msgstr ""
msgid "Assignee(s)" msgid "Assignee(s)"
msgstr "" msgstr ""
...@@ -19448,9 +19445,6 @@ msgstr "" ...@@ -19448,9 +19445,6 @@ msgstr ""
msgid "Label actions dropdown" msgid "Label actions dropdown"
msgstr "" msgstr ""
msgid "Label lists show all issues with the selected label."
msgstr ""
msgid "Label priority" msgid "Label priority"
msgstr "" msgstr ""
...@@ -21526,9 +21520,6 @@ msgstr "" ...@@ -21526,9 +21520,6 @@ msgstr ""
msgid "Milestone lists not available with your current license" msgid "Milestone lists not available with your current license"
msgstr "" msgstr ""
msgid "Milestone lists show all issues from the selected milestone."
msgstr ""
msgid "MilestoneCombobox|An error occurred while searching for milestones" msgid "MilestoneCombobox|An error occurred while searching for milestones"
msgstr "" msgstr ""
......
...@@ -17,6 +17,8 @@ RSpec.describe 'User adds lists', :js do ...@@ -17,6 +17,8 @@ RSpec.describe 'User adds lists', :js do
let_it_be(:project_label) { create(:label, project: project) } let_it_be(:project_label) { create(:label, project: project) }
let_it_be(:group_backlog_list) { create(:backlog_list, board: group_board) } let_it_be(:group_backlog_list) { create(:backlog_list, board: group_board) }
let_it_be(:project_backlog_list) { create(:backlog_list, board: project_board) } let_it_be(:project_backlog_list) { create(:backlog_list, board: project_board) }
let_it_be(:backlog) { create(:group_label, group: group, name: 'Backlog') }
let_it_be(:closed) { create(:group_label, group: group, name: 'Closed') }
let_it_be(:issue) { create(:labeled_issue, project: project, labels: [group_label, project_label]) } let_it_be(:issue) { create(:labeled_issue, project: project, labels: [group_label, project_label]) }
...@@ -25,15 +27,11 @@ RSpec.describe 'User adds lists', :js do ...@@ -25,15 +27,11 @@ RSpec.describe 'User adds lists', :js do
group.add_owner(user) group.add_owner(user)
end end
where(:board_type, :graphql_board_lists_enabled, :board_new_list_enabled) do where(:board_type, :graphql_board_lists_enabled) do
:project | true | true :project | true
:project | false | true :project | false
:project | true | false :group | true
:project | false | false :group | false
:group | true | true
:group | false | true
:group | true | false
:group | false | false
end end
with_them do with_them do
...@@ -43,8 +41,7 @@ RSpec.describe 'User adds lists', :js do ...@@ -43,8 +41,7 @@ RSpec.describe 'User adds lists', :js do
set_cookie('sidebar_collapsed', 'true') set_cookie('sidebar_collapsed', 'true')
stub_feature_flags( stub_feature_flags(
graphql_board_lists: graphql_board_lists_enabled, graphql_board_lists: graphql_board_lists_enabled
board_new_list: board_new_list_enabled
) )
if board_type == :project if board_type == :project
...@@ -57,39 +54,44 @@ RSpec.describe 'User adds lists', :js do ...@@ -57,39 +54,44 @@ RSpec.describe 'User adds lists', :js do
end end
it 'creates new column for label containing labeled issue' do it 'creates new column for label containing labeled issue' do
click_button button_text(board_new_list_enabled) click_button 'Create list'
wait_for_all_requests wait_for_all_requests
select_label(board_new_list_enabled, group_label) select_label(group_label)
wait_for_all_requests wait_for_all_requests
expect(page).to have_selector('.board', text: group_label.title) expect(page).to have_selector('.board', text: group_label.title)
expect(find('.board:nth-child(2) .board-card')).to have_content(issue.title) expect(find('.board:nth-child(2) .board-card')).to have_content(issue.title)
end end
end
def select_label(board_new_list_enabled, label) it 'creates new list for Backlog and closed labels' do
if board_new_list_enabled click_button 'Create list'
click_button 'Select a label' wait_for_requests
find('label', text: label.title).click select_label(backlog)
click_button 'Add to board' click_button 'Create list'
wait_for_requests
wait_for_all_requests select_label(closed)
else
page.within('.dropdown-menu-issues-board-new') do wait_for_requests
click_link label.title
end expect(page).to have_selector('.board', text: closed.title)
expect(find('.board:nth-child(2) .board-header')).to have_content(backlog.title)
expect(find('.board:nth-child(3) .board-header')).to have_content(closed.title)
expect(find('.board:nth-child(4) .board-header')).to have_content('Closed')
end end
end end
def button_text(board_new_list_enabled) def select_label(label)
if board_new_list_enabled click_button 'Select a label'
'Create list'
else find('label', text: label.title).click
'Add list'
end click_button 'Add to board'
wait_for_all_requests
end end
end end
...@@ -34,7 +34,7 @@ RSpec.describe "User views issues" do ...@@ -34,7 +34,7 @@ RSpec.describe "User views issues" do
.and have_content(open_issue2.title) .and have_content(open_issue2.title)
.and have_no_content(closed_issue.title) .and have_no_content(closed_issue.title)
.and have_content(moved_open_issue.title) .and have_content(moved_open_issue.title)
.and have_no_selector(".js-new-board-list") .and have_no_content('Create list')
end end
it "opens issues by label" do it "opens issues by label" do
...@@ -65,7 +65,7 @@ RSpec.describe "User views issues" do ...@@ -65,7 +65,7 @@ RSpec.describe "User views issues" do
.and have_no_content(open_issue1.title) .and have_no_content(open_issue1.title)
.and have_no_content(open_issue2.title) .and have_no_content(open_issue2.title)
.and have_no_content(moved_open_issue.title) .and have_no_content(moved_open_issue.title)
.and have_no_selector(".js-new-board-list") .and have_no_content('Create list')
end end
include_examples "opens issue from list" do include_examples "opens issue from list" do
...@@ -87,7 +87,7 @@ RSpec.describe "User views issues" do ...@@ -87,7 +87,7 @@ RSpec.describe "User views issues" do
.and have_content(open_issue2.title) .and have_content(open_issue2.title)
.and have_content(moved_open_issue.title) .and have_content(moved_open_issue.title)
.and have_no_content('CLOSED (MOVED)') .and have_no_content('CLOSED (MOVED)')
.and have_no_selector(".js-new-board-list") .and have_no_content('Create list')
end end
include_examples "opens issue from list" do include_examples "opens issue from list" do
......
...@@ -17,7 +17,6 @@ RSpec.describe 'Labels Hierarchy', :js do ...@@ -17,7 +17,6 @@ RSpec.describe 'Labels Hierarchy', :js do
let!(:project_label_1) { create(:label, project: project_1, title: 'Label_4') } let!(:project_label_1) { create(:label, project: project_1, title: 'Label_4') }
before do before do
stub_feature_flags(board_new_list: false)
grandparent.add_owner(user) grandparent.add_owner(user)
sign_in(user) sign_in(user)
...@@ -307,88 +306,4 @@ RSpec.describe 'Labels Hierarchy', :js do ...@@ -307,88 +306,4 @@ RSpec.describe 'Labels Hierarchy', :js do
it_behaves_like 'filtering by ancestor labels for groups', true it_behaves_like 'filtering by ancestor labels for groups', true
end end
end end
context 'creating boards lists' do
before do
stub_feature_flags(board_new_list: false)
end
context 'on project boards' do
let(:board) { create(:board, project: project_1) }
before do
project_1.add_developer(user)
visit project_board_path(project_1, board)
find('.js-new-board-list').click
wait_for_requests
end
it 'creates lists from all ancestor labels' do
[grandparent_group_label, parent_group_label, project_label_1].each do |label|
find('a', text: label.title).click
end
wait_for_requests
expect(page).to have_selector('.board-title-text', text: grandparent_group_label.title)
expect(page).to have_selector('.board-title-text', text: parent_group_label.title)
expect(page).to have_selector('.board-title-text', text: project_label_1.title)
end
end
context 'on group boards' do
let(:board) { create(:board, group: parent) }
before do
parent.add_developer(user)
visit group_board_path(parent, board)
find('.js-new-board-list').click
wait_for_requests
end
context 'when graphql_board_lists FF enabled' do
it 'creates lists from all ancestor group labels' do
[grandparent_group_label, parent_group_label].each do |label|
find('a', text: label.title).click
end
wait_for_requests
expect(page).to have_selector('.board-title-text', text: grandparent_group_label.title)
expect(page).to have_selector('.board-title-text', text: parent_group_label.title)
end
it 'does not create lists from descendant groups' do
expect(page).not_to have_selector('a', text: child_group_label.title)
end
end
end
context 'when graphql_board_lists FF disabled' do
let(:board) { create(:board, group: parent) }
before do
stub_feature_flags(graphql_board_lists: false)
parent.add_developer(user)
visit group_board_path(parent, board)
find('.js-new-board-list').click
wait_for_requests
end
it 'creates lists from all ancestor group labels' do
[grandparent_group_label, parent_group_label].each do |label|
find('a', text: label.title).click
end
wait_for_requests
expect(page).to have_selector('.board-title-text', text: grandparent_group_label.title)
expect(page).to have_selector('.board-title-text', text: parent_group_label.title)
end
it 'does not create lists from descendant groups' do
expect(page).not_to have_selector('a', text: child_group_label.title)
end
end
end
end end
...@@ -3,14 +3,10 @@ ...@@ -3,14 +3,10 @@
RSpec.shared_examples 'multiple issue boards' do RSpec.shared_examples 'multiple issue boards' do
context 'authorized user' do context 'authorized user' do
before do before do
stub_feature_flags(board_new_list: false)
parent.add_maintainer(user) parent.add_maintainer(user)
login_as(user) login_as(user)
stub_feature_flags(board_new_list: false)
visit boards_path visit boards_path
wait_for_requests wait_for_requests
end end
...@@ -79,13 +75,13 @@ RSpec.shared_examples 'multiple issue boards' do ...@@ -79,13 +75,13 @@ RSpec.shared_examples 'multiple issue boards' do
expect(page).to have_content(board2.name) expect(page).to have_content(board2.name)
end end
click_button 'Add list' click_button 'Create list'
wait_for_requests click_button 'Select a label'
page.within '.dropdown-menu-issues-board-new' do page.choose(planning.title)
click_link planning.title
end click_button 'Add to board'
wait_for_requests wait_for_requests
......
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