Unverified Commit 1fa5bfec authored by Martin Kraft's avatar Martin Kraft Committed by GitHub

MM-10916: Updates some permissions text to include documentation links....

 MM-10916: Updates some permissions text to include documentation links. Disables eslint complexity rule. (#1330)

* Adds FormattedMarkdownMessage component. (#1302)

* Adds FormattedMarkdownMessage component.

* Extends Marked's Renderer. Removes FormattedHTMLMessage component.

* Removes <br> support. Adds newline character support.

* MM-10916: Updates some permissions text to include documentation links. Disables eslint complexity rule.
parent befd23a2
......@@ -85,7 +85,7 @@
"last"
],
"complexity": [
1,
0,
10
],
"computed-property-spacing": [
......
......@@ -485,7 +485,7 @@ export default class AdminSidebar extends React.Component {
title={
<FormattedMessage
id='admin.sidebar.permissions'
defaultMessage='Permissions'
defaultMessage='Advanced Permissions'
/>
}
>
......
......@@ -6,6 +6,8 @@ import PropTypes from 'prop-types';
import {FormattedMessage} from 'react-intl';
import {Link} from 'react-router-dom';
import FormattedMarkdownMessage from 'components/formatted_markdown_message';
import LoadingScreen from 'components/loading_screen.jsx';
import PermissionsSchemeSummary from './permissions_scheme_summary';
......@@ -38,7 +40,7 @@ export default class PermissionSchemesSettings extends React.PureComponent {
schemes: {},
};
async componentWillMount() {
async UNSAFE_componentWillMount() { // eslint-disable-line camelcase
let schemes;
let phase2MigrationIsComplete = true; // Assume migration is complete unless HTTP status code says otherwise.
try {
......@@ -145,9 +147,9 @@ export default class PermissionSchemesSettings extends React.PureComponent {
<div className={'banner info'}>
<div className='banner__content'>
<span>
<FormattedMessage
<FormattedMarkdownMessage
id='admin.permissions.introBanner'
defaultMessage='Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our documentation.'
defaultMessage='Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our [documentation](!https://about.mattermost.com/default-advanced-permissions).'
/>
</span>
</div>
......@@ -163,9 +165,9 @@ export default class PermissionSchemesSettings extends React.PureComponent {
/>
</h3>
<span>
<FormattedMessage
<FormattedMarkdownMessage
id='admin.permissions.systemSchemeBannerText'
defaultMessage='Set the default permissions inherited by all teams unless a Team Override Scheme is applied.'
defaultMessage='Set the default permissions inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied.'
/>
</span>
</div>
......@@ -193,9 +195,9 @@ export default class PermissionSchemesSettings extends React.PureComponent {
/>
</h3>
<span>
<FormattedMessage
<FormattedMarkdownMessage
id='admin.permissions.teamOverrideSchemesBannerText'
defaultMessage='Use when specific teams need permission exceptions to the System Scheme.'
defaultMessage='Use when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).'
/>
</span>
</div>
......
......@@ -15,6 +15,8 @@ import AccordionToggleIcon from 'components/svg/accordion_toggle_icon.jsx';
import FormError from 'components/form_error.jsx';
import BlockableLink from 'components/admin_console/blockable_link';
import FormattedMarkdownMessage from 'components/formatted_markdown_message';
import PermissionsTree from '../permissions_tree.jsx';
export default class PermissionSystemSchemeSettings extends React.Component {
......@@ -208,9 +210,9 @@ export default class PermissionSystemSchemeSettings extends React.Component {
<div className={'banner info'}>
<div className='banner__content'>
<span>
<FormattedMessage
<FormattedMarkdownMessage
id='admin.permissions.systemScheme.introBanner'
defaultMessage='Configure the default permissions for Team Admins, Channel Admins and other members. This scheme is inherited by all teams unless a Team Override Scheme is applied in specific teams.'
defaultMessage='Configure the default permissions for Team Admins, Channel Admins and other members. This scheme is inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied in specific teams.'
/>
</span>
</div>
......
......@@ -3,7 +3,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
import {FormattedMessage} from 'react-intl';
import {PermissionsScope} from 'utils/constants.jsx';
import {localizeMessage} from 'utils/utils.jsx';
......@@ -15,6 +15,8 @@ import FormError from 'components/form_error.jsx';
import TeamSelectorModal from 'components/team_selector_modal';
import BlockableLink from 'components/admin_console/blockable_link';
import FormattedMarkdownMessage from 'components/formatted_markdown_message';
import PermissionsTree from '../permissions_tree.jsx';
import TeamInList from './team_in_list';
......@@ -373,9 +375,9 @@ export default class PermissionTeamSchemeSettings extends React.Component {
<div className={'banner info'}>
<div className='banner__content'>
<span>
<FormattedHTMLMessage
<FormattedMarkdownMessage
id='admin.permissions.teamScheme.introBanner'
defaultMessage='Team Override Schemes set the permissions for Team Admins, Channel Admins and other members in specific teams. Use a Team Override Scheme when specific teams need permission exceptions to the <a href="/admin_console/permissions/system-scheme">System Scheme</a>.'
defaultMessage='[Team Override Schemes](!https://about.mattermost.com/default-team-override-scheme) set the permissions for Team Admins, Channel Admins and other members in specific teams. Use a Team Override Scheme when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).'
/>
</span>
</div>
......
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React from 'react';
import {injectIntl, intlShape} from 'react-intl';
import PropTypes from 'prop-types';
import marked from 'marked';
const TARGET_BLANK_URL_PREFIX = '!';
class CustomRenderer extends marked.Renderer {
link(href, title, text) {
if (href[0] === TARGET_BLANK_URL_PREFIX) {
return `<a href="${href.substring(1, href.length)}" target="_blank">${text}</a>`;
}
return `<a href="${href}">${text}</a>`;
}
paragraph(text) {
return text;
}
}
class FormattedMarkdownMessage extends React.PureComponent {
static get propTypes() {
return {
intl: intlShape.isRequired,
id: PropTypes.string.isRequired,
defaultMessage: PropTypes.string.isRequired,
values: PropTypes.object,
};
}
render() {
const origMsg = this.props.intl.formatMessage({
id: this.props.id,
defaultMessage: this.props.defaultMessage,
}, this.props.values);
const markedUpMessage = marked(origMsg, {
breaks: true,
sanitize: true,
renderer: new CustomRenderer(),
});
return (<span dangerouslySetInnerHTML={{__html: markedUpMessage}}/>);
}
}
export default injectIntl(FormattedMarkdownMessage);
\ No newline at end of file
......@@ -772,7 +772,7 @@
"admin.permissions.group.teams.description": "Create teams and manage members.",
"admin.permissions.group.teams.name": "Teams",
"admin.permissions.inherited_from": "Inherited from <a>{name}</a>.",
"admin.permissions.introBanner": "Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our documentation.",
"admin.permissions.introBanner": "Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our [documentation](!https://about.mattermost.com/default-advanced-permissions).",
"admin.permissions.loadMoreSchemes": "Load more schemes",
"admin.permissions.loadingMoreSchemes": "Loading...",
"admin.permissions.permission.assign_system_admin_role.description": "Assign system admin role",
......@@ -869,7 +869,7 @@
"admin.permissions.systemScheme.allMembersTitle": "All Members",
"admin.permissions.systemScheme.channelAdminsDescription": "Permissions granted to channel creators and any users promoted to Channel Administrator.",
"admin.permissions.systemScheme.channelAdminsTitle": "Channel Administrators",
"admin.permissions.systemScheme.introBanner": "Configure the default permissions for Team Admins, Channel Admins and other members. This scheme is inherited by all teams unless a Team Override Scheme is applied in specific teams.",
"admin.permissions.systemScheme.introBanner": "Configure the default permissions for Team Admins, Channel Admins and other members. This scheme is inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied in specific teams.",
"admin.permissions.systemScheme.resetDefaultsButton": "Reset to Defaults",
"admin.permissions.systemScheme.resetDefaultsButtonModalBody": "This will reset all selections on this page to their default settings. Are you sure you want to reset?",
"admin.permissions.systemScheme.resetDefaultsButtonModalTitle": "Reset to Default?",
......@@ -879,9 +879,9 @@
"admin.permissions.systemScheme.teamAdminsDescription": "Permissions granted to team creators and any users promoted to Team Administrator.",
"admin.permissions.systemScheme.teamAdminsTitle": "Team Administrators",
"admin.permissions.systemSchemeBannerButton": "Edit Scheme",
"admin.permissions.systemSchemeBannerText": "Set the default permissions inherited by all teams unless a Team Override Scheme is applied.",
"admin.permissions.systemSchemeBannerText": "Set the default permissions inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied.",
"admin.permissions.systemSchemeBannerTitle": "System Scheme",
"admin.permissions.teamOverrideSchemesBannerText": "Use when specific teams need permission exceptions to the System Scheme.",
"admin.permissions.teamOverrideSchemesBannerText": "Use when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).",
"admin.permissions.teamOverrideSchemesInProgress": "Migration job in progress: Team Override Schemes are not available until the job server completes the permissions migration. Learn more in the {documentationLink}.",
"admin.permissions.teamOverrideSchemesNewButton": "New Team Override Scheme",
"admin.permissions.teamOverrideSchemesNoJobsEnabled": "Migration job on hold: Team Override Schemes are not available until the job server can execute the permissions migration. The job will be automatically started when the job server is enabled. Learn more in the {documentationLink}.",
......@@ -889,7 +889,7 @@
"admin.permissions.teamOverrideSchemesTitle": "Team Override Schemes",
"admin.permissions.teamScheme": "Team Scheme",
"admin.permissions.teamScheme.addTeams": "Add Teams",
"admin.permissions.teamScheme.introBanner": "Team Override Schemes set the permissions for Team Admins, Channel Admins and other members in specific teams. Use a Team Override Scheme when specific teams need permission exceptions to the <a href=\"/admin_console/permissions/system-scheme\">System Scheme</a>.",
"admin.permissions.teamScheme.introBanner": "[Team Override Schemes](!https://about.mattermost.com/default-team-override-scheme) set the permissions for Team Admins, Channel Admins and other members in specific teams. Use a Team Override Scheme when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme).",
"admin.permissions.teamScheme.noTeams": "No team selected. Please add teams to this list.",
"admin.permissions.teamScheme.removeTeam": "Remove",
"admin.permissions.teamScheme.schemeDescriptionLabel": "Scheme Description:",
......@@ -1192,6 +1192,7 @@
"admin.sidebar.oauth": "OAuth 2.0",
"admin.sidebar.other": "OTHER",
"admin.sidebar.password": "Password",
"admin.sidebar.permissions": "Advanced Permissions",
"admin.sidebar.plugins": "Plugins (Beta)",
"admin.sidebar.plugins.configuration": "Configuration",
"admin.sidebar.plugins.management": "Management",
......
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`components/FormattedMarkdownMessage should backup to default 1`] = `
<IntlProvider
locale="en"
messages={
Object {
"test.bar": "<b>hello</b> <script>var malicious = true;</script> world!",
"test.foo": "**bold** *italic* [link](https://mattermost.com/) <br/> [link target blank](!https://mattermost.com/)",
"test.vals": "*Hi* {petName}!",
}
}
>
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="testing default message"
id="xxx"
>
<FormattedMarkdownMessage
defaultMessage="testing default message"
id="xxx"
intl={
Object {
"defaultFormats": Object {},
"defaultLocale": "en",
"formatDate": [Function],
"formatHTMLMessage": [Function],
"formatMessage": [Function],
"formatNumber": [Function],
"formatPlural": [Function],
"formatRelative": [Function],
"formatTime": [Function],
"formats": Object {},
"formatters": Object {
"getDateTimeFormat": [Function],
"getMessageFormat": [Function],
"getNumberFormat": [Function],
"getPluralFormat": [Function],
"getRelativeFormat": [Function],
},
"locale": "en",
"messages": Object {
"test.bar": "<b>hello</b> <script>var malicious = true;</script> world!",
"test.foo": "**bold** *italic* [link](https://mattermost.com/) <br/> [link target blank](!https://mattermost.com/)",
"test.vals": "*Hi* {petName}!",
},
"now": [Function],
"textComponent": "span",
}
}
>
<span
dangerouslySetInnerHTML={
Object {
"__html": "testing default message",
}
}
/>
</FormattedMarkdownMessage>
</InjectIntl(FormattedMarkdownMessage)>
</IntlProvider>
`;
exports[`components/FormattedMarkdownMessage should escape non-BR 1`] = `
<IntlProvider
locale="en"
messages={
Object {
"test.bar": "<b>hello</b> <script>var malicious = true;</script> world!",
"test.foo": "**bold** *italic* [link](https://mattermost.com/) <br/> [link target blank](!https://mattermost.com/)",
"test.vals": "*Hi* {petName}!",
}
}
>
<InjectIntl(FormattedMarkdownMessage)
defaultMessage=""
id="test.bar"
>
<FormattedMarkdownMessage
defaultMessage=""
id="test.bar"
intl={
Object {
"defaultFormats": Object {},
"defaultLocale": "en",
"formatDate": [Function],
"formatHTMLMessage": [Function],
"formatMessage": [Function],
"formatNumber": [Function],
"formatPlural": [Function],
"formatRelative": [Function],
"formatTime": [Function],
"formats": Object {},
"formatters": Object {
"getDateTimeFormat": [Function],
"getMessageFormat": [Function],
"getNumberFormat": [Function],
"getPluralFormat": [Function],
"getRelativeFormat": [Function],
},
"locale": "en",
"messages": Object {
"test.bar": "<b>hello</b> <script>var malicious = true;</script> world!",
"test.foo": "**bold** *italic* [link](https://mattermost.com/) <br/> [link target blank](!https://mattermost.com/)",
"test.vals": "*Hi* {petName}!",
},
"now": [Function],
"textComponent": "span",
}
}
>
<span
dangerouslySetInnerHTML={
Object {
"__html": "&lt;b&gt;hello&lt;/b&gt; &lt;script&gt;var malicious = true;&lt;/script&gt; world!",
}
}
/>
</FormattedMarkdownMessage>
</InjectIntl(FormattedMarkdownMessage)>
</IntlProvider>
`;
exports[`components/FormattedMarkdownMessage should render message 1`] = `
<IntlProvider
locale="en"
messages={
Object {
"test.bar": "<b>hello</b> <script>var malicious = true;</script> world!",
"test.foo": "**bold** *italic* [link](https://mattermost.com/) <br/> [link target blank](!https://mattermost.com/)",
"test.vals": "*Hi* {petName}!",
}
}
>
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="**bold** *italic* [link](https://mattermost.com/) <br/> [link target blank](!https://mattermost.com/)"
id="test.foo"
>
<FormattedMarkdownMessage
defaultMessage="**bold** *italic* [link](https://mattermost.com/) <br/> [link target blank](!https://mattermost.com/)"
id="test.foo"
intl={
Object {
"defaultFormats": Object {},
"defaultLocale": "en",
"formatDate": [Function],
"formatHTMLMessage": [Function],
"formatMessage": [Function],
"formatNumber": [Function],
"formatPlural": [Function],
"formatRelative": [Function],
"formatTime": [Function],
"formats": Object {},
"formatters": Object {
"getDateTimeFormat": [Function],
"getMessageFormat": [Function],
"getNumberFormat": [Function],
"getPluralFormat": [Function],
"getRelativeFormat": [Function],
},
"locale": "en",
"messages": Object {
"test.bar": "<b>hello</b> <script>var malicious = true;</script> world!",
"test.foo": "**bold** *italic* [link](https://mattermost.com/) <br/> [link target blank](!https://mattermost.com/)",
"test.vals": "*Hi* {petName}!",
},
"now": [Function],
"textComponent": "span",
}
}
>
<span
dangerouslySetInnerHTML={
Object {
"__html": "<strong>bold</strong> <em>italic</em> <a href=\\"https://mattermost.com/\\">link</a> &lt;br/&gt; <a href=\\"https://mattermost.com/\\" target=\\"_blank\\">link target blank</a>",
}
}
/>
</FormattedMarkdownMessage>
</InjectIntl(FormattedMarkdownMessage)>
</IntlProvider>
`;
exports[`components/FormattedMarkdownMessage values should work 1`] = `
<IntlProvider
locale="en"
messages={
Object {
"test.bar": "<b>hello</b> <script>var malicious = true;</script> world!",
"test.foo": "**bold** *italic* [link](https://mattermost.com/) <br/> [link target blank](!https://mattermost.com/)",
"test.vals": "*Hi* {petName}!",
}
}
>
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="*Hi* {petName}!"
id="test.vals"
values={
Object {
"petName": "sweetie",
}
}
>
<FormattedMarkdownMessage
defaultMessage="*Hi* {petName}!"
id="test.vals"
intl={
Object {
"defaultFormats": Object {},
"defaultLocale": "en",
"formatDate": [Function],
"formatHTMLMessage": [Function],
"formatMessage": [Function],
"formatNumber": [Function],
"formatPlural": [Function],
"formatRelative": [Function],
"formatTime": [Function],
"formats": Object {},
"formatters": Object {
"getDateTimeFormat": [Function],
"getMessageFormat": [Function],
"getNumberFormat": [Function],
"getPluralFormat": [Function],
"getRelativeFormat": [Function],
},
"locale": "en",
"messages": Object {
"test.bar": "<b>hello</b> <script>var malicious = true;</script> world!",
"test.foo": "**bold** *italic* [link](https://mattermost.com/) <br/> [link target blank](!https://mattermost.com/)",
"test.vals": "*Hi* {petName}!",
},
"now": [Function],
"textComponent": "span",
}
}
values={
Object {
"petName": "sweetie",
}
}
>
<span
dangerouslySetInnerHTML={
Object {
"__html": "<em>Hi</em> sweetie!",
}
}
/>
</FormattedMarkdownMessage>
</InjectIntl(FormattedMarkdownMessage)>
</IntlProvider>
`;
......@@ -27,10 +27,9 @@ exports[`components/admin_console/permission_schemes_settings/permission_schemes
className="banner__content"
>
<span>
<FormattedMessage
defaultMessage="Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our documentation."
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our [documentation](!https://about.mattermost.com/default-advanced-permissions)."
id="admin.permissions.introBanner"
values={Object {}}
/>
</span>
</div>
......@@ -50,10 +49,9 @@ exports[`components/admin_console/permission_schemes_settings/permission_schemes
/>
</h3>
<span>
<FormattedMessage
defaultMessage="Set the default permissions inherited by all teams unless a Team Override Scheme is applied."
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="Set the default permissions inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied."
id="admin.permissions.systemSchemeBannerText"
values={Object {}}
/>
</span>
</div>
......@@ -89,10 +87,9 @@ exports[`components/admin_console/permission_schemes_settings/permission_schemes
/>
</h3>
<span>
<FormattedMessage
defaultMessage="Use when specific teams need permission exceptions to the System Scheme."
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="Use when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme)."
id="admin.permissions.teamOverrideSchemesBannerText"
values={Object {}}
/>
</span>
</div>
......@@ -168,10 +165,9 @@ exports[`components/admin_console/permission_schemes_settings/permission_schemes
className="banner__content"
>
<span>
<FormattedMessage
defaultMessage="Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our documentation."
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our [documentation](!https://about.mattermost.com/default-advanced-permissions)."
id="admin.permissions.introBanner"
values={Object {}}
/>
</span>
</div>
......@@ -191,10 +187,9 @@ exports[`components/admin_console/permission_schemes_settings/permission_schemes
/>
</h3>
<span>
<FormattedMessage
defaultMessage="Set the default permissions inherited by all teams unless a Team Override Scheme is applied."
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="Set the default permissions inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied."
id="admin.permissions.systemSchemeBannerText"
values={Object {}}
/>
</span>
</div>
......@@ -230,10 +225,9 @@ exports[`components/admin_console/permission_schemes_settings/permission_schemes
/>
</h3>
<span>
<FormattedMessage
defaultMessage="Use when specific teams need permission exceptions to the System Scheme."
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="Use when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme)."
id="admin.permissions.teamOverrideSchemesBannerText"
values={Object {}}
/>
</span>
</div>
......@@ -288,10 +282,9 @@ exports[`components/admin_console/permission_schemes_settings/permission_schemes
className="banner__content"
>
<span>
<FormattedMessage
defaultMessage="Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our documentation."
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our [documentation](!https://about.mattermost.com/default-advanced-permissions)."
id="admin.permissions.introBanner"
values={Object {}}
/>
</span>
</div>
......@@ -311,10 +304,9 @@ exports[`components/admin_console/permission_schemes_settings/permission_schemes
/>
</h3>
<span>
<FormattedMessage
defaultMessage="Set the default permissions inherited by all teams unless a Team Override Scheme is applied."
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="Set the default permissions inherited by all teams unless a [Team Override Scheme](!https://about.mattermost.com/default-team-override-scheme) is applied."
id="admin.permissions.systemSchemeBannerText"
values={Object {}}
/>
</span>
</div>
......@@ -350,10 +342,9 @@ exports[`components/admin_console/permission_schemes_settings/permission_schemes
/>
</h3>
<span>
<FormattedMessage
defaultMessage="Use when specific teams need permission exceptions to the System Scheme."
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="Use when specific teams need permission exceptions to the [System Scheme](!https://about.mattermost.com/default-system-scheme)."
id="admin.permissions.teamOverrideSchemesBannerText"
values={Object {}}
/>
</span>
</div>
......@@ -456,10 +447,9 @@ exports[`components/admin_console/permission_schemes_settings/permission_schemes
className="banner__content"
>
<span>
<FormattedMessage
defaultMessage="Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our documentation."
<InjectIntl(FormattedMarkdownMessage)
defaultMessage="Permission Schemes set the default permissions for Team Admins, Channel Admins and everyone else. Learn more about permission schemes in our [documentation](!https://about.mattermost.com/default-advanced-permissions)."
id="admin.permissions.introBanner"
values={Object {}}