Commit d6acd0a2 authored by Eulyeon Ko's avatar Eulyeon Ko

Refactor for readability and add messages

Display different empty state messages depending on
whether user can edit project settings or not
when service desk is unsupported
parent 1db5bef9
import { __ } from '~/locale'; import { __ } from '~/locale';
/**
* Generates empty state messages for Service Desk issues list.
*
* @param {emptyStateMeta} emptyStateMeta - Meta data used to generate empty state messages
* @returns {Object} Object containing empty state messages generated using the meta data.
*/
export function generateMessages(emptyStateMeta) {
const {
svgPath,
serviceDeskHelpPage,
serviceDeskAddress,
editProjectPage,
incomingEmailHelpPage,
} = emptyStateMeta;
const serviceDeskSupportedTitle = __(
'Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab',
);
const serviceDeskSupportedMessage = __(
'Those emails automatically become issues (with the comments becoming the email conversation) listed here.',
);
const commonDescription = `
<span>${serviceDeskSupportedMessage}</span>
<a href="${serviceDeskHelpPage}">${__('Read more')}</a>`;
return {
serviceDeskEnabledAndCanEditProjectSettings: {
title: serviceDeskSupportedTitle,
svgPath,
description: `<p>${__('Have your users email')}
<code>${serviceDeskAddress}</code>
</p>
${commonDescription}`,
},
serviceDeskEnabledAndCannotEditProjectSettings: {
title: serviceDeskSupportedTitle,
svgPath,
description: commonDescription,
},
serviceDeskDisabledAndCanEditProjectSettings: {
title: serviceDeskSupportedTitle,
svgPath,
description: commonDescription,
primaryLink: editProjectPage,
primaryText: __('Turn on Service Desk'),
},
serviceDeskDisabledAndCannotEditProjectSettings: {
title: serviceDeskSupportedTitle,
svgPath,
description: commonDescription,
},
serviceDeskIsNotSupported: {
title: __('Service Desk is not supported'),
svgPath,
description: __(
'In order to enable Service Desk for your instance, you must first set up incoming email.',
),
primaryLink: incomingEmailHelpPage,
primaryText: __('More information'),
},
serviceDeskIsNotEnabled: {
title: __('Service Desk is not enabled'),
svgPath,
description: __(
'For help setting up the Service Desk for your instance, please contact an administrator.',
),
},
};
}
/** /**
* Returns the attributes used for gl-empty-state in the Service Desk issues list. * Returns the attributes used for gl-empty-state in the Service Desk issues list.
*
* @param {Object} emptyStateMeta - Meta data used to generate empty state messages
* @returns {Object}
*/ */
export function emptyStateHelper(emptyStateMeta) { export function emptyStateHelper(emptyStateMeta) {
const { isServiceDeskSupported, svgPath, serviceDeskHelpPage } = emptyStateMeta; const messages = generateMessages(emptyStateMeta);
const { isServiceDeskSupported, canEditProjectSettings, isServiceDeskEnabled } = emptyStateMeta;
if (isServiceDeskSupported) { if (isServiceDeskSupported) {
const title = __( if (isServiceDeskEnabled && canEditProjectSettings) {
'Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab', return messages.serviceDeskEnabledAndCanEditProjectSettings;
);
const commonMessage = __(
'Those emails automatically become issues (with the comments becoming the email conversation) listed here.',
);
const commonDescription = `
<span>${commonMessage}</span>
<a href="${serviceDeskHelpPage}">${__('Read more')}</a>`;
if (emptyStateMeta.canEditProjectSettings && emptyStateMeta.isServiceDeskEnabled) {
return {
title,
svgPath,
description: `<p>${__('Have your users email')} <code>${
emptyStateMeta.serviceDeskAddress
}</code></p> ${commonDescription}`,
};
} }
if (emptyStateMeta.canEditProjectSettings && !emptyStateMeta.isServiceDeskEnabled) { if (isServiceDeskEnabled && !canEditProjectSettings) {
return { return messages.serviceDeskEnabledAndCannotEditProjectSettings;
title,
svgPath,
description: commonDescription,
primaryLink: emptyStateMeta.editProjectPage,
primaryText: __('Turn on Service Desk'),
};
} }
return { // !isServiceDeskEnabled && canEditProjectSettings
title, if (canEditProjectSettings) {
svgPath, return messages.serviceDeskDisabledAndCanEditProjectSettings;
description: commonDescription, }
};
// !isServiceDeskEnabled && !canEditProjectSettings
return messages.serviceDeskDisabledAndCannotEditProjectSettings;
} }
return { // !serviceDeskSupported && canEditProjectSettings
title: __('Service Desk is enabled but not yet active'), if (canEditProjectSettings) {
svgPath, return messages.serviceDeskIsNotSupported;
description: __('You must set up incoming email before it becomes active.'), }
primaryLink: emptyStateMeta.incomingEmailHelpPage,
primaryText: __('More information'), // !serviceDeskSupported && !canEditProjectSettings
}; return messages.serviceDeskIsNotEnabled;
} }
---
title: Display informative messages when service desk is unsupported
merge_request: 40454
author:
type: other
...@@ -10963,6 +10963,9 @@ msgstr "" ...@@ -10963,6 +10963,9 @@ msgstr ""
msgid "Footer message" msgid "Footer message"
msgstr "" msgstr ""
msgid "For help setting up the Service Desk for your instance, please contact an administrator."
msgstr ""
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)" msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr "" msgstr ""
...@@ -13037,6 +13040,9 @@ msgstr "" ...@@ -13037,6 +13040,9 @@ msgstr ""
msgid "In %{time_to_now}" msgid "In %{time_to_now}"
msgstr "" msgstr ""
msgid "In order to enable Service Desk for your instance, you must first set up incoming email."
msgstr ""
msgid "In order to gather accurate feature usage data, it can take 1 to 2 weeks to see your index." msgid "In order to gather accurate feature usage data, it can take 1 to 2 weeks to see your index."
msgstr "" msgstr ""
...@@ -22383,6 +22389,12 @@ msgstr "" ...@@ -22383,6 +22389,12 @@ msgstr ""
msgid "Service Desk is enabled but not yet active" msgid "Service Desk is enabled but not yet active"
msgstr "" msgstr ""
msgid "Service Desk is not enabled"
msgstr ""
msgid "Service Desk is not supported"
msgstr ""
msgid "Service Templates" msgid "Service Templates"
msgstr "" msgstr ""
......
...@@ -7,6 +7,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js do ...@@ -7,6 +7,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js do
let(:user) { create(:user) } let(:user) { create(:user) }
before do before do
# The following two conditions equate to Gitlab::ServiceDesk.supported == true
allow(Gitlab::IncomingEmail).to receive(:enabled?).and_return(true) allow(Gitlab::IncomingEmail).to receive(:enabled?).and_return(true)
allow(Gitlab::IncomingEmail).to receive(:supports_wildcard?).and_return(true) allow(Gitlab::IncomingEmail).to receive(:supports_wildcard?).and_return(true)
...@@ -27,53 +28,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js do ...@@ -27,53 +28,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js do
end end
describe 'issues list' do describe 'issues list' do
context 'when service desk is misconfigured' do context 'when service desk is supported' do
before do
allow(Gitlab::ServiceDesk).to receive(:supported?).and_return(false)
visit service_desk_project_issues_path(project)
end
it 'shows a message to say the configuration is incomplete' do
expect(page).to have_css('.empty-state')
expect(page).to have_text('Service Desk is enabled but not yet active')
expect(page).to have_text('You must set up incoming email before it becomes active')
expect(page).to have_link('More information', href: help_page_path('administration/incoming_email', anchor: 'set-it-up'))
end
end
context 'when service desk has not been activated' do
let(:project_without_service_desk) { create(:project, :private, service_desk_enabled: false) }
describe 'service desk info content' do
context 'when user has permissions to edit project settings' do
before do
project_without_service_desk.add_maintainer(user)
visit service_desk_project_issues_path(project_without_service_desk)
end
it 'displays the large info box, documentation, and a button to configure' do
aggregate_failures do
expect(page).to have_css('.empty-state')
expect(page).to have_link('Read more', href: help_page_path('user/project/service_desk'))
expect(page).to have_link('Turn on Service Desk')
end
end
end
context 'when user does not have permission to edit project settings' do
before do
project_without_service_desk.add_guest(user)
visit service_desk_project_issues_path(project_without_service_desk)
end
it 'does not show a button configure service desk' do
expect(page).not_to have_link('Turn on Service Desk')
end
end
end
end
context 'when service desk has been activated' do
context 'when there are no issues' do context 'when there are no issues' do
describe 'service desk info content' do describe 'service desk info content' do
it 'displays the large info box, documentation, and the address' do it 'displays the large info box, documentation, and the address' do
...@@ -81,6 +36,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js do ...@@ -81,6 +36,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js do
aggregate_failures do aggregate_failures do
expect(page).to have_css('.empty-state') expect(page).to have_css('.empty-state')
expect(page).to have_text('Use Service Desk to connect with your users')
expect(page).to have_link('Read more', href: help_page_path('user/project/service_desk')) expect(page).to have_link('Read more', href: help_page_path('user/project/service_desk'))
expect(page).not_to have_link('Turn on Service Desk') expect(page).not_to have_link('Turn on Service Desk')
expect(page).to have_content(project.service_desk_address) expect(page).to have_content(project.service_desk_address)
...@@ -99,6 +55,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js do ...@@ -99,6 +55,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js do
it 'displays the large info box and the documentation link' do it 'displays the large info box and the documentation link' do
aggregate_failures do aggregate_failures do
expect(page).to have_css('.empty-state') expect(page).to have_css('.empty-state')
expect(page).to have_text('Use Service Desk to connect with your users')
expect(page).to have_link('Read more', href: help_page_path('user/project/service_desk')) expect(page).to have_link('Read more', href: help_page_path('user/project/service_desk'))
expect(page).not_to have_link('Turn on Service Desk') expect(page).not_to have_link('Turn on Service Desk')
expect(page).not_to have_content(project.service_desk_address) expect(page).not_to have_content(project.service_desk_address)
...@@ -155,5 +112,46 @@ RSpec.describe 'Service Desk Issue Tracker', :js do ...@@ -155,5 +112,46 @@ RSpec.describe 'Service Desk Issue Tracker', :js do
end end
end end
end end
context 'when service desk is not supported' do
let(:project_without_service_desk) { create(:project, :private, service_desk_enabled: false) }
before do
allow(Gitlab::ServiceDesk).to receive(:supported?).and_return(false)
visit service_desk_project_issues_path(project)
end
describe 'service desk info content' do
context 'when user has permissions to edit project settings' do
before do
project_without_service_desk.add_maintainer(user)
visit service_desk_project_issues_path(project_without_service_desk)
end
it 'informs user to setup incoming email to turn on support for Service Desk' do
aggregate_failures do
expect(page).to have_css('.empty-state')
expect(page).to have_text('Service Desk is not supported')
expect(page).to have_text('In order to enable Service Desk for your instance, you must first set up incoming email.')
expect(page).to have_link('More information', href: help_page_path('administration/incoming_email', anchor: 'set-it-up'))
end
end
end
context 'when user does not have permission to edit project settings' do
before do
project_without_service_desk.add_developer(user)
visit service_desk_project_issues_path(project_without_service_desk)
end
it 'informs user to contact an administrator to enable service desk' do
expect(page).to have_css('.empty-state')
# NOTE: here, "enabled" is not used in the sense of "ServiceDesk::Enabled?"
expect(page).to have_text('Service Desk is not enabled')
expect(page).to have_text('For help setting up the Service Desk for your instance, please contact an administrator.')
end
end
end
end
end end
end end
import { emptyStateHelper, generateMessages } from '~/issuables_list/service_desk_helper';
describe('service desk helper', () => {
const emptyStateMessages = generateMessages({});
// Note: isServiceDeskEnabled must not be true when isServiceDeskSupported is false (it's an invalid case).
describe.each`
isServiceDeskSupported | isServiceDeskEnabled | canEditProjectSettings | expectedMessage
${true} | ${true} | ${true} | ${'serviceDeskEnabledAndCanEditProjectSettings'}
${true} | ${true} | ${false} | ${'serviceDeskEnabledAndCannotEditProjectSettings'}
${true} | ${false} | ${true} | ${'serviceDeskDisabledAndCanEditProjectSettings'}
${true} | ${false} | ${false} | ${'serviceDeskDisabledAndCannotEditProjectSettings'}
${false} | ${false} | ${true} | ${'serviceDeskIsNotSupported'}
${false} | ${false} | ${false} | ${'serviceDeskIsNotEnabled'}
`(
'isServiceDeskSupported = $isServiceDeskSupported, isServiceDeskEnabled = $isServiceDeskEnabled, canEditProjectSettings = $canEditProjectSettings',
({ isServiceDeskSupported, isServiceDeskEnabled, canEditProjectSettings, expectedMessage }) => {
it(`displays ${expectedMessage} message`, () => {
const emptyStateMeta = {
isServiceDeskEnabled,
isServiceDeskSupported,
canEditProjectSettings,
};
expect(emptyStateHelper(emptyStateMeta)).toEqual(emptyStateMessages[expectedMessage]);
});
},
);
});
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