Commit a5d2ab99 authored by Kushal Pandya's avatar Kushal Pandya

Merge branch '349949-fix-incident-sidebar-in-issue-boards' into 'master'

Fix Incident sidebar on issue boards

See merge request gitlab-org/gitlab!78021
parents 65c4fdf7 496d339b
...@@ -6,11 +6,12 @@ import SidebarDropdownWidget from 'ee_else_ce/sidebar/components/sidebar_dropdow ...@@ -6,11 +6,12 @@ import SidebarDropdownWidget from 'ee_else_ce/sidebar/components/sidebar_dropdow
import { __, sprintf } from '~/locale'; import { __, sprintf } from '~/locale';
import BoardSidebarTimeTracker from '~/boards/components/sidebar/board_sidebar_time_tracker.vue'; import BoardSidebarTimeTracker from '~/boards/components/sidebar/board_sidebar_time_tracker.vue';
import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.vue'; import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.vue';
import { ISSUABLE } from '~/boards/constants'; import { ISSUABLE, INCIDENT } from '~/boards/constants';
import { getIdFromGraphQLId } from '~/graphql_shared/utils'; import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import SidebarAssigneesWidget from '~/sidebar/components/assignees/sidebar_assignees_widget.vue'; import SidebarAssigneesWidget from '~/sidebar/components/assignees/sidebar_assignees_widget.vue';
import SidebarConfidentialityWidget from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue'; import SidebarConfidentialityWidget from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue';
import SidebarDateWidget from '~/sidebar/components/date/sidebar_date_widget.vue'; import SidebarDateWidget from '~/sidebar/components/date/sidebar_date_widget.vue';
import SidebarSeverity from '~/sidebar/components/severity/sidebar_severity.vue';
import SidebarSubscriptionsWidget from '~/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue'; import SidebarSubscriptionsWidget from '~/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue';
import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue'; import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue';
import SidebarLabelsWidget from '~/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue'; import SidebarLabelsWidget from '~/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue';
...@@ -29,6 +30,7 @@ export default { ...@@ -29,6 +30,7 @@ export default {
SidebarSubscriptionsWidget, SidebarSubscriptionsWidget,
SidebarDropdownWidget, SidebarDropdownWidget,
SidebarTodoWidget, SidebarTodoWidget,
SidebarSeverity,
MountingPortal, MountingPortal,
SidebarWeightWidget: () => SidebarWeightWidget: () =>
import('ee_component/sidebar/components/weight/sidebar_weight_widget.vue'), import('ee_component/sidebar/components/weight/sidebar_weight_widget.vue'),
...@@ -69,9 +71,15 @@ export default { ...@@ -69,9 +71,15 @@ export default {
isIssuableSidebar() { isIssuableSidebar() {
return this.sidebarType === ISSUABLE; return this.sidebarType === ISSUABLE;
}, },
isIncidentSidebar() {
return this.activeBoardItem.type === INCIDENT;
},
showSidebar() { showSidebar() {
return this.isIssuableSidebar && this.isSidebarOpen; return this.isIssuableSidebar && this.isSidebarOpen;
}, },
sidebarTitle() {
return this.isIncidentSidebar ? __('Incident details') : __('Issue details');
},
fullPath() { fullPath() {
return this.activeBoardItem?.referencePath?.split('#')[0] || ''; return this.activeBoardItem?.referencePath?.split('#')[0] || '';
}, },
...@@ -138,7 +146,7 @@ export default { ...@@ -138,7 +146,7 @@ export default {
@close="handleClose" @close="handleClose"
> >
<template #title> <template #title>
<h2 class="gl-my-0 gl-font-size-h2 gl-line-height-24">{{ __('Issue details') }}</h2> <h2 class="gl-my-0 gl-font-size-h2 gl-line-height-24">{{ sidebarTitle }}</h2>
</template> </template>
<template #header> <template #header>
<sidebar-todo-widget <sidebar-todo-widget
...@@ -159,7 +167,7 @@ export default { ...@@ -159,7 +167,7 @@ export default {
@assignees-updated="setAssignees" @assignees-updated="setAssignees"
/> />
<sidebar-dropdown-widget <sidebar-dropdown-widget
v-if="epicFeatureAvailable" v-if="epicFeatureAvailable && !isIncidentSidebar"
:iid="activeBoardItem.iid" :iid="activeBoardItem.iid"
issuable-attribute="epic" issuable-attribute="epic"
:workspace-path="projectPathForActiveIssue" :workspace-path="projectPathForActiveIssue"
...@@ -178,7 +186,7 @@ export default { ...@@ -178,7 +186,7 @@ export default {
/> />
<template v-if="!glFeatures.iterationCadences"> <template v-if="!glFeatures.iterationCadences">
<sidebar-dropdown-widget <sidebar-dropdown-widget
v-if="iterationFeatureAvailable" v-if="iterationFeatureAvailable && !isIncidentSidebar"
:iid="activeBoardItem.iid" :iid="activeBoardItem.iid"
issuable-attribute="iteration" issuable-attribute="iteration"
:workspace-path="projectPathForActiveIssue" :workspace-path="projectPathForActiveIssue"
...@@ -190,7 +198,7 @@ export default { ...@@ -190,7 +198,7 @@ export default {
</template> </template>
<template v-else> <template v-else>
<iteration-sidebar-dropdown-widget <iteration-sidebar-dropdown-widget
v-if="iterationFeatureAvailable" v-if="iterationFeatureAvailable && !isIncidentSidebar"
:iid="activeBoardItem.iid" :iid="activeBoardItem.iid"
:workspace-path="projectPathForActiveIssue" :workspace-path="projectPathForActiveIssue"
:attr-workspace-path="groupPathForActiveIssue" :attr-workspace-path="groupPathForActiveIssue"
...@@ -226,8 +234,14 @@ export default { ...@@ -226,8 +234,14 @@ export default {
> >
{{ __('None') }} {{ __('None') }}
</sidebar-labels-widget> </sidebar-labels-widget>
<sidebar-severity
v-if="isIncidentSidebar"
:iid="activeBoardItem.iid"
:project-path="fullPath"
:initial-severity="activeBoardItem.severity"
/>
<sidebar-weight-widget <sidebar-weight-widget
v-if="weightFeatureAvailable" v-if="weightFeatureAvailable && !isIncidentSidebar"
:iid="activeBoardItem.iid" :iid="activeBoardItem.iid"
:full-path="fullPath" :full-path="fullPath"
:issuable-type="issuableType" :issuable-type="issuableType"
......
...@@ -54,6 +54,7 @@ export const inactiveId = 0; ...@@ -54,6 +54,7 @@ export const inactiveId = 0;
export const ISSUABLE = 'issuable'; export const ISSUABLE = 'issuable';
export const LIST = 'list'; export const LIST = 'list';
export const INCIDENT = 'INCIDENT';
export const flashAnimationDuration = 2000; export const flashAnimationDuration = 2000;
......
#import "~/graphql_shared/fragments/milestone.fragment.graphql" #import "~/graphql_shared/fragments/issue.fragment.graphql"
#import "~/graphql_shared/fragments/user.fragment.graphql"
fragment IssueNode on Issue { fragment Issue on Issue {
id id
iid ...IssueNode
title
referencePath: reference(full: true)
dueDate
timeEstimate
totalTimeSpent
humanTimeEstimate
humanTotalTimeSpent
emailsDisabled
confidential
hidden
webUrl
relativePosition
milestone {
...MilestoneFragment
}
assignees {
nodes {
...User
}
}
labels {
nodes {
id
title
color
description
}
}
} }
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
mutation CreateIssue($input: CreateIssueInput!) { mutation CreateIssue($input: CreateIssueInput!) {
createIssue(input: $input) { createIssue(input: $input) {
issue { issue {
...IssueNode ...Issue
} }
errors errors
} }
......
...@@ -21,7 +21,7 @@ mutation issueMoveList( ...@@ -21,7 +21,7 @@ mutation issueMoveList(
} }
) { ) {
issue { issue {
...IssueNode ...Issue
} }
errors errors
} }
......
...@@ -22,7 +22,7 @@ query BoardListsEE( ...@@ -22,7 +22,7 @@ query BoardListsEE(
issues(first: $first, filters: $filters, after: $after) { issues(first: $first, filters: $filters, after: $after) {
edges { edges {
node { node {
...IssueNode ...Issue
} }
} }
pageInfo { pageInfo {
...@@ -46,7 +46,7 @@ query BoardListsEE( ...@@ -46,7 +46,7 @@ query BoardListsEE(
issues(first: $first, filters: $filters, after: $after) { issues(first: $first, filters: $filters, after: $after) {
edges { edges {
node { node {
...IssueNode ...Issue
} }
} }
pageInfo { pageInfo {
......
#import "~/graphql_shared/fragments/milestone.fragment.graphql"
#import "~/graphql_shared/fragments/user.fragment.graphql"
fragment IssueNode on Issue {
id
iid
title
referencePath: reference(full: true)
dueDate
timeEstimate
totalTimeSpent
humanTimeEstimate
humanTotalTimeSpent
emailsDisabled
confidential
hidden
webUrl
relativePosition
type
severity
milestone {
...MilestoneFragment
}
assignees {
nodes {
...User
}
}
labels {
nodes {
id
title
color
description
}
}
}
#import "~/graphql_shared/fragments/milestone.fragment.graphql" #import "~/graphql_shared/fragments/issue.fragment.graphql"
#import "~/graphql_shared/fragments/user.fragment.graphql"
fragment IssueNode on Issue { fragment Issue on Issue {
...IssueNode
id id
iid
title
referencePath: reference(full: true)
dueDate
timeEstimate
totalTimeSpent
humanTimeEstimate
humanTotalTimeSpent
weight weight
confidential
hidden
webUrl
blocked blocked
blockedByCount blockedByCount
relativePosition
epic { epic {
id id
} }
assignees {
nodes {
...User
}
}
milestone {
...MilestoneFragment
}
iteration { iteration {
id id
title title
...@@ -37,12 +17,4 @@ fragment IssueNode on Issue { ...@@ -37,12 +17,4 @@ fragment IssueNode on Issue {
title title
} }
} }
labels {
nodes {
id
title
color
description
}
}
} }
...@@ -23,7 +23,7 @@ mutation issueMoveListEE( ...@@ -23,7 +23,7 @@ mutation issueMoveListEE(
} }
) { ) {
issue { issue {
...IssueNode ...Issue
} }
errors errors
} }
......
...@@ -86,17 +86,31 @@ describe('ee/BoardContentSidebar', () => { ...@@ -86,17 +86,31 @@ describe('ee/BoardContentSidebar', () => {
}); });
}; };
beforeEach(() => {
createStore();
createComponent();
});
afterEach(() => { afterEach(() => {
wrapper.destroy(); wrapper.destroy();
wrapper = null;
}); });
it('matches the snapshot', () => { describe('issue sidebar', () => {
expect(wrapper.find(GlDrawer).element).toMatchSnapshot(); beforeEach(() => {
createStore();
createComponent();
});
it('matches the snapshot', () => {
expect(wrapper.findComponent(GlDrawer).element).toMatchSnapshot();
});
});
describe('incident sidebar', () => {
beforeEach(() => {
createStore({
mockGetters: { activeBoardItem: () => ({ ...mockIssue, epic: null, type: 'INCIDENT' }) },
});
createComponent();
});
it('matches the snapshot', () => {
expect(wrapper.findComponent(GlDrawer).element).toMatchSnapshot();
});
}); });
}); });
...@@ -18654,6 +18654,9 @@ msgstr "" ...@@ -18654,6 +18654,9 @@ msgstr ""
msgid "Incident Management Limits" msgid "Incident Management Limits"
msgstr "" msgstr ""
msgid "Incident details"
msgstr ""
msgid "Incident template (optional)." msgid "Incident template (optional)."
msgstr "" msgstr ""
......
...@@ -9,6 +9,7 @@ import BoardContentSidebar from '~/boards/components/board_content_sidebar.vue'; ...@@ -9,6 +9,7 @@ import BoardContentSidebar from '~/boards/components/board_content_sidebar.vue';
import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.vue'; import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.vue';
import { ISSUABLE } from '~/boards/constants'; import { ISSUABLE } from '~/boards/constants';
import SidebarDateWidget from '~/sidebar/components/date/sidebar_date_widget.vue'; import SidebarDateWidget from '~/sidebar/components/date/sidebar_date_widget.vue';
import SidebarSeverity from '~/sidebar/components/severity/sidebar_severity.vue';
import SidebarSubscriptionsWidget from '~/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue'; import SidebarSubscriptionsWidget from '~/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue';
import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue'; import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue';
import SidebarLabelsWidget from '~/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue'; import SidebarLabelsWidget from '~/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue';
...@@ -96,7 +97,7 @@ describe('BoardContentSidebar', () => { ...@@ -96,7 +97,7 @@ describe('BoardContentSidebar', () => {
}); });
it('confirms we render MountingPortal', () => { it('confirms we render MountingPortal', () => {
expect(wrapper.find(MountingPortal).props()).toMatchObject({ expect(wrapper.findComponent(MountingPortal).props()).toMatchObject({
mountTo: '#js-right-sidebar-portal', mountTo: '#js-right-sidebar-portal',
append: true, append: true,
name: 'board-content-sidebar', name: 'board-content-sidebar',
...@@ -141,6 +142,10 @@ describe('BoardContentSidebar', () => { ...@@ -141,6 +142,10 @@ describe('BoardContentSidebar', () => {
); );
}); });
it('does not render SidebarSeverity', () => {
expect(wrapper.findComponent(SidebarSeverity).exists()).toBe(false);
});
describe('when we emit close', () => { describe('when we emit close', () => {
let toggleBoardItem; let toggleBoardItem;
...@@ -160,4 +165,17 @@ describe('BoardContentSidebar', () => { ...@@ -160,4 +165,17 @@ describe('BoardContentSidebar', () => {
}); });
}); });
}); });
describe('incident sidebar', () => {
beforeEach(() => {
createStore({
mockGetters: { activeBoardItem: () => ({ ...mockIssue, epic: null, type: 'INCIDENT' }) },
});
createComponent();
});
it('renders SidebarSeverity', () => {
expect(wrapper.findComponent(SidebarSeverity).exists()).toBe(true);
});
});
}); });
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