[MM-64367] Update property/attribute naming convetion (#31168)
Automatic Merge
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
c90dfa4895
Коммит
a457d3b73c
@@ -197,7 +197,7 @@ export default function PolicyList(props: Props): JSX.Element {
|
||||
<Menu.Item
|
||||
id={`policy-menu-edit-${policy.id}`}
|
||||
onClick={() => {
|
||||
history.push(`/admin_console/user_management/attribute_based_access_control/edit_policy/${policy.id}`);
|
||||
history.push(`/admin_console/system_attributes/attribute_based_access_control/edit_policy/${policy.id}`);
|
||||
}}
|
||||
leadingElement={<i className='icon icon-pencil-outline'/>}
|
||||
labels={
|
||||
@@ -229,7 +229,7 @@ export default function PolicyList(props: Props): JSX.Element {
|
||||
if (props.onPolicySelected) {
|
||||
props.onPolicySelected(policy);
|
||||
} else {
|
||||
history.push(`/admin_console/user_management/attribute_based_access_control/edit_policy/${policy.id}`);
|
||||
history.push(`/admin_console/system_attributes/attribute_based_access_control/edit_policy/${policy.id}`);
|
||||
}
|
||||
},
|
||||
};
|
||||
@@ -326,7 +326,7 @@ export default function PolicyList(props: Props): JSX.Element {
|
||||
<button
|
||||
className='btn btn-primary'
|
||||
onClick={() => {
|
||||
history.push('/admin_console/user_management/attribute_based_access_control/edit_policy');
|
||||
history.push('/admin_console/system_attributes/attribute_based_access_control/edit_policy');
|
||||
}}
|
||||
>
|
||||
<i className='icon icon-plus'/>
|
||||
|
||||
@@ -10,7 +10,7 @@ exports[`components/admin_console/access_control/policy_details/PolicyDetails sh
|
||||
<div>
|
||||
<Connect(Component)
|
||||
className="fa fa-angle-left back"
|
||||
to="/admin_console/user_management/attribute_based_access_control"
|
||||
to="/admin_console/system_attributes/attribute_based_access_control"
|
||||
/>
|
||||
<MemoizedFormattedMessage
|
||||
defaultMessage="Edit Access Control Policy"
|
||||
@@ -193,7 +193,7 @@ exports[`components/admin_console/access_control/policy_details/PolicyDetails sh
|
||||
/>
|
||||
<Connect(Component)
|
||||
className="btn btn-quaternary"
|
||||
to="/admin_console/user_management/attribute_based_access_control"
|
||||
to="/admin_console/system_attributes/attribute_based_access_control"
|
||||
>
|
||||
<MemoizedFormattedMessage
|
||||
defaultMessage="Cancel"
|
||||
@@ -214,7 +214,7 @@ exports[`components/admin_console/access_control/policy_details/PolicyDetails sh
|
||||
<div>
|
||||
<Connect(Component)
|
||||
className="fa fa-angle-left back"
|
||||
to="/admin_console/user_management/attribute_based_access_control"
|
||||
to="/admin_console/system_attributes/attribute_based_access_control"
|
||||
/>
|
||||
<MemoizedFormattedMessage
|
||||
defaultMessage="Edit Access Control Policy"
|
||||
@@ -368,7 +368,7 @@ exports[`components/admin_console/access_control/policy_details/PolicyDetails sh
|
||||
/>
|
||||
<Connect(Component)
|
||||
className="btn btn-quaternary"
|
||||
to="/admin_console/user_management/attribute_based_access_control"
|
||||
to="/admin_console/system_attributes/attribute_based_access_control"
|
||||
>
|
||||
<MemoizedFormattedMessage
|
||||
defaultMessage="Cancel"
|
||||
|
||||
@@ -239,7 +239,7 @@ function PolicyDetails({
|
||||
setSaveNeeded(false);
|
||||
setShowConfirmationModal(false);
|
||||
actions.setNavigationBlocked(false);
|
||||
getHistory().push('/admin_console/user_management/attribute_based_access_control');
|
||||
getHistory().push('/admin_console/system_attributes/attribute_based_access_control');
|
||||
};
|
||||
|
||||
const handleDelete = async () => {
|
||||
@@ -275,7 +275,7 @@ function PolicyDetails({
|
||||
}
|
||||
|
||||
if (success) {
|
||||
getHistory().push('/admin_console/user_management/attribute_based_access_control');
|
||||
getHistory().push('/admin_console/system_attributes/attribute_based_access_control');
|
||||
}
|
||||
};
|
||||
|
||||
@@ -331,7 +331,7 @@ function PolicyDetails({
|
||||
<AdminHeader withBackButton={true}>
|
||||
<div>
|
||||
<BlockableLink
|
||||
to='/admin_console/user_management/attribute_based_access_control'
|
||||
to='/admin_console/system_attributes/attribute_based_access_control'
|
||||
className='fa fa-angle-left back'
|
||||
/>
|
||||
<FormattedMessage
|
||||
@@ -399,7 +399,7 @@ function PolicyDetails({
|
||||
}
|
||||
text={formatMessage({
|
||||
id: 'admin.access_control.policy.edit_policy.notice.text',
|
||||
defaultMessage: 'You havent configured any user attributes yet. Attribute-Based Access Control requires user attributes that are either synced from an external system (like LDAP or SAML) or manually configured and enabled on this server. To start using attribute based access, please configure user attributes in System Properties.',
|
||||
defaultMessage: 'You havent configured any user attributes yet. Attribute-Based Access Control requires user attributes that are either synced from an external system (like LDAP or SAML) or manually configured and enabled on this server. To start using attribute based access, please configure user attributes in System Attributes.',
|
||||
})}
|
||||
primaryButton={{
|
||||
text: formatMessage({
|
||||
@@ -407,7 +407,7 @@ function PolicyDetails({
|
||||
defaultMessage: 'Configure user attributes',
|
||||
}),
|
||||
onClick: () => {
|
||||
getHistory().push('/admin_console/site_config/system_properties');
|
||||
getHistory().push('/admin_console/system_attributes/user_attributes');
|
||||
},
|
||||
}}
|
||||
/>
|
||||
@@ -642,7 +642,7 @@ function PolicyDetails({
|
||||
/>
|
||||
<BlockableLink
|
||||
className='btn btn-quaternary'
|
||||
to='/admin_console/user_management/attribute_based_access_control'
|
||||
to='/admin_console/system_attributes/attribute_based_access_control'
|
||||
>
|
||||
<FormattedMessage
|
||||
id='admin.access_control.edit_policy.cancel'
|
||||
|
||||
@@ -8,7 +8,7 @@ import type {MessageDescriptor} from 'react-intl';
|
||||
import {FormattedMessage, defineMessage, defineMessages} from 'react-intl';
|
||||
import {Link} from 'react-router-dom';
|
||||
|
||||
import {AccountMultipleOutlineIcon, ChartBarIcon, CogOutlineIcon, CreditCardOutlineIcon, FlaskOutlineIcon, FormatListBulletedIcon, InformationOutlineIcon, PowerPlugOutlineIcon, ServerVariantIcon, ShieldOutlineIcon, SitemapIcon} from '@mattermost/compass-icons/components';
|
||||
import {AccountMultipleOutlineIcon, ChartBarIcon, CogOutlineIcon, CreditCardOutlineIcon, FlaskOutlineIcon, FormatListBulletedIcon, InformationOutlineIcon, PowerPlugOutlineIcon, ServerVariantIcon, ShieldOutlineIcon, SitemapIcon, TableLargeIcon} from '@mattermost/compass-icons/components';
|
||||
import type {CloudState, Product} from '@mattermost/types/cloud';
|
||||
import type {AdminConfig, ClientLicense} from '@mattermost/types/config';
|
||||
import type {Job} from '@mattermost/types/jobs';
|
||||
@@ -668,8 +668,36 @@ const AdminDefinition: AdminDefinitionType = {
|
||||
},
|
||||
restrictedIndicator: getRestrictedIndicator(true, LicenseSkus.Enterprise),
|
||||
},
|
||||
},
|
||||
},
|
||||
system_attributes: {
|
||||
icon: (
|
||||
<TableLargeIcon
|
||||
size={16}
|
||||
color={'currentColor'}
|
||||
/>
|
||||
),
|
||||
sectionTitle: defineMessage({id: 'admin.sidebar.systemAttributes', defaultMessage: 'System Attributes'}),
|
||||
isHidden: it.not(it.all(
|
||||
it.minLicenseTier(LicenseSkus.Enterprise),
|
||||
it.configIsTrue('FeatureFlags', 'CustomProfileAttributes'),
|
||||
)),
|
||||
subsections: {
|
||||
system_properties: {
|
||||
url: 'system_attributes/user_attributes',
|
||||
title: defineMessage({id: 'admin.sidebar.user_attributes', defaultMessage: 'User Attributes'}),
|
||||
searchableStrings: systemPropertiesSearchableStrings,
|
||||
isHidden: it.not(it.all(
|
||||
it.minLicenseTier(LicenseSkus.Enterprise),
|
||||
it.configIsTrue('FeatureFlags', 'CustomProfileAttributes'),
|
||||
)),
|
||||
schema: {
|
||||
id: 'SystemProperties',
|
||||
component: SystemProperties,
|
||||
},
|
||||
},
|
||||
access_control_policy_details_edit: {
|
||||
url: `user_management/attribute_based_access_control/edit_policy/:policy_id(${ID_PATH_PATTERN})`,
|
||||
url: `system_attributes/attribute_based_access_control/edit_policy/:policy_id(${ID_PATH_PATTERN})`,
|
||||
isHidden: it.any(
|
||||
it.configIsFalse('AccessControlSettings', 'EnableAttributeBasedAccessControl'),
|
||||
it.not(it.licensedForSku(LicenseSkus.EnterpriseAdvanced)),
|
||||
@@ -683,10 +711,9 @@ const AdminDefinition: AdminDefinitionType = {
|
||||
id: 'AccessControlPolicy',
|
||||
component: PolicyDetails,
|
||||
},
|
||||
|
||||
},
|
||||
access_control_policy_details: {
|
||||
url: 'user_management/attribute_based_access_control/edit_policy',
|
||||
url: 'system_attributes/attribute_based_access_control/edit_policy',
|
||||
isHidden: it.any(
|
||||
it.configIsFalse('AccessControlSettings', 'EnableAttributeBasedAccessControl'),
|
||||
it.not(it.licensedForSku(LicenseSkus.EnterpriseAdvanced)),
|
||||
@@ -700,7 +727,7 @@ const AdminDefinition: AdminDefinitionType = {
|
||||
},
|
||||
},
|
||||
attribute_based_access_control: {
|
||||
url: 'user_management/attribute_based_access_control',
|
||||
url: 'system_attributes/attribute_based_access_control',
|
||||
title: defineMessage({id: 'admin.sidebar.attributeBasedAccessControl', defaultMessage: 'Attribute-Based Access'}),
|
||||
isHidden: it.any(
|
||||
it.not(it.licensedForSku(LicenseSkus.EnterpriseAdvanced)),
|
||||
@@ -720,10 +747,10 @@ const AdminDefinition: AdminDefinitionType = {
|
||||
type: 'bool',
|
||||
key: 'AccessControlSettings.EnableAttributeBasedAccessControl',
|
||||
label: defineMessage({id: 'admin.accesscontrol.enableTitle', defaultMessage: 'Allow attribute based access controls on this server'}),
|
||||
help_text: defineMessage({id: 'admin.accesscontrol.enableDesc', defaultMessage: 'Allow access restrictions based on user attributes using custom access policies. To effectively use this feature, you must define user attributes (properties) in the {userAttributes} section.'}),
|
||||
help_text: defineMessage({id: 'admin.accesscontrol.enableDesc', defaultMessage: 'Allow access restrictions based on user attributes using custom access policies. To effectively use this feature, you must define user attributes in the {userAttributes} section.'}),
|
||||
help_text_values: {
|
||||
userAttributes: (
|
||||
<a href='../site_config/system_properties'>
|
||||
<a href='../system_attributes/user_attributes'>
|
||||
<FormattedMessage
|
||||
id='admin.system_properties.user_properties.title'
|
||||
defaultMessage='User Attributes'
|
||||
@@ -767,7 +794,7 @@ const AdminDefinition: AdminDefinitionType = {
|
||||
restrictedIndicator: getRestrictedIndicator(false, LicenseSkus.EnterpriseAdvanced),
|
||||
},
|
||||
attribute_based_access_control_feature_discovery: {
|
||||
url: 'user_management/attribute_based_access_control',
|
||||
url: 'system_attributes/attribute_based_access_control',
|
||||
isDiscovery: true,
|
||||
title: defineMessage({id: 'admin.sidebar.attributeBasedAccessControl', defaultMessage: 'Attribute-Based Access'}),
|
||||
isHidden: it.any(
|
||||
@@ -2458,19 +2485,6 @@ const AdminDefinition: AdminDefinitionType = {
|
||||
],
|
||||
},
|
||||
},
|
||||
system_properties: {
|
||||
url: 'site_config/system_properties',
|
||||
title: defineMessage({id: 'admin.sidebar.system_properties', defaultMessage: 'System Properties'}),
|
||||
searchableStrings: systemPropertiesSearchableStrings,
|
||||
isHidden: it.not(it.all(
|
||||
it.minLicenseTier(LicenseSkus.Enterprise),
|
||||
it.configIsTrue('FeatureFlags', 'CustomProfileAttributes'),
|
||||
)),
|
||||
schema: {
|
||||
id: 'SystemProperties',
|
||||
component: SystemProperties,
|
||||
},
|
||||
},
|
||||
localization: {
|
||||
url: 'site_config/localization',
|
||||
title: defineMessage({id: 'admin.sidebar.localization', defaultMessage: 'Localization'}),
|
||||
|
||||
@@ -1496,10 +1496,40 @@ exports[`components/AdminSidebar should match snapshot with license with enterpr
|
||||
/>
|
||||
}
|
||||
/>
|
||||
</AdminSidebarCategory>
|
||||
<AdminSidebarCategory
|
||||
definitionKey="system_attributes"
|
||||
icon={
|
||||
<TableLargeIcon
|
||||
color="currentColor"
|
||||
size={16}
|
||||
/>
|
||||
}
|
||||
key="system_attributes"
|
||||
parentLink="/admin_console"
|
||||
sectionClass=""
|
||||
title={
|
||||
<Memo(MemoizedFormattedMessage)
|
||||
defaultMessage="System Attributes"
|
||||
id="admin.sidebar.systemAttributes"
|
||||
/>
|
||||
}
|
||||
>
|
||||
<AdminSidebarSection
|
||||
definitionKey="user_management.attribute_based_access_control_feature_discovery"
|
||||
key="user_management.attribute_based_access_control_feature_discovery"
|
||||
name="user_management/attribute_based_access_control"
|
||||
definitionKey="system_attributes.system_properties"
|
||||
key="system_attributes.system_properties"
|
||||
name="system_attributes/user_attributes"
|
||||
title={
|
||||
<Memo(MemoizedFormattedMessage)
|
||||
defaultMessage="User Attributes"
|
||||
id="admin.sidebar.user_attributes"
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<AdminSidebarSection
|
||||
definitionKey="system_attributes.attribute_based_access_control_feature_discovery"
|
||||
key="system_attributes.attribute_based_access_control_feature_discovery"
|
||||
name="system_attributes/attribute_based_access_control"
|
||||
restrictedIndicator={
|
||||
<RestrictedIndicator
|
||||
blocked={true}
|
||||
@@ -1701,17 +1731,6 @@ exports[`components/AdminSidebar should match snapshot with license with enterpr
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<AdminSidebarSection
|
||||
definitionKey="site.system_properties"
|
||||
key="site.system_properties"
|
||||
name="site_config/system_properties"
|
||||
title={
|
||||
<Memo(MemoizedFormattedMessage)
|
||||
defaultMessage="System Properties"
|
||||
id="admin.sidebar.system_properties"
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<AdminSidebarSection
|
||||
definitionKey="site.localization"
|
||||
key="site.localization"
|
||||
@@ -2567,10 +2586,40 @@ exports[`components/AdminSidebar should match snapshot with license with enterpr
|
||||
/>
|
||||
}
|
||||
/>
|
||||
</AdminSidebarCategory>
|
||||
<AdminSidebarCategory
|
||||
definitionKey="system_attributes"
|
||||
icon={
|
||||
<TableLargeIcon
|
||||
color="currentColor"
|
||||
size={16}
|
||||
/>
|
||||
}
|
||||
key="system_attributes"
|
||||
parentLink="/admin_console"
|
||||
sectionClass=""
|
||||
title={
|
||||
<Memo(MemoizedFormattedMessage)
|
||||
defaultMessage="System Attributes"
|
||||
id="admin.sidebar.systemAttributes"
|
||||
/>
|
||||
}
|
||||
>
|
||||
<AdminSidebarSection
|
||||
definitionKey="user_management.attribute_based_access_control"
|
||||
key="user_management.attribute_based_access_control"
|
||||
name="user_management/attribute_based_access_control"
|
||||
definitionKey="system_attributes.system_properties"
|
||||
key="system_attributes.system_properties"
|
||||
name="system_attributes/user_attributes"
|
||||
title={
|
||||
<Memo(MemoizedFormattedMessage)
|
||||
defaultMessage="User Attributes"
|
||||
id="admin.sidebar.user_attributes"
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<AdminSidebarSection
|
||||
definitionKey="system_attributes.attribute_based_access_control"
|
||||
key="system_attributes.attribute_based_access_control"
|
||||
name="system_attributes/attribute_based_access_control"
|
||||
title={
|
||||
<Memo(MemoizedFormattedMessage)
|
||||
defaultMessage="Attribute-Based Access"
|
||||
@@ -2759,17 +2808,6 @@ exports[`components/AdminSidebar should match snapshot with license with enterpr
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<AdminSidebarSection
|
||||
definitionKey="site.system_properties"
|
||||
key="site.system_properties"
|
||||
name="site_config/system_properties"
|
||||
title={
|
||||
<Memo(MemoizedFormattedMessage)
|
||||
defaultMessage="System Properties"
|
||||
id="admin.sidebar.system_properties"
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<AdminSidebarSection
|
||||
definitionKey="site.localization"
|
||||
key="site.localization"
|
||||
|
||||
@@ -136,7 +136,7 @@ const CustomProfileAttributes: React.FC<Props> = (props: Props): JSX.Element | n
|
||||
values={{
|
||||
link: (msg: string) => (
|
||||
<Link
|
||||
to='/admin_console/site_config/system_properties'
|
||||
to='/admin_console/system_attributes/user_attributes'
|
||||
>
|
||||
{msg}
|
||||
</Link>
|
||||
|
||||
@@ -73,7 +73,7 @@ describe('SystemProperties', () => {
|
||||
expect(screen.queryByText('Loading')).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
expect(screen.getByRole('heading', {name: 'User Properties'})).toBeInTheDocument();
|
||||
expect(screen.getByRole('heading', {name: 'Configure user attributes'})).toBeInTheDocument();
|
||||
|
||||
expect(screen.queryByDisplayValue('test attribute 0')).toBeInTheDocument();
|
||||
expect(screen.queryByDisplayValue('test attribute 1')).toBeInTheDocument();
|
||||
|
||||
@@ -58,11 +58,11 @@ export default function SystemProperties(props: Props) {
|
||||
<FormattedMessage
|
||||
tagName={SectionHeading}
|
||||
id='admin.system_properties.user_properties.title'
|
||||
defaultMessage='User Properties'
|
||||
defaultMessage='Configure user attributes'
|
||||
/>
|
||||
<FormattedMessage
|
||||
id='admin.system_properties.user_properties.subtitle'
|
||||
defaultMessage='Customize the properties to show in user profiles'
|
||||
defaultMessage='Attributes will be shown in user profile and can be used in access control policies.'
|
||||
/>
|
||||
</hgroup>
|
||||
</SectionHeader>
|
||||
@@ -91,7 +91,7 @@ export default function SystemProperties(props: Props) {
|
||||
}
|
||||
|
||||
const msg = defineMessages({
|
||||
pageTitle: {id: 'admin.sidebar.system_properties', defaultMessage: 'System Properties'},
|
||||
pageTitle: {id: 'admin.sidebar.user_attributes', defaultMessage: 'User Attributes'},
|
||||
});
|
||||
|
||||
export const searchableStrings: SearchableStrings = Object.values(msg);
|
||||
|
||||
@@ -36,8 +36,8 @@ describe('RemoveUserPropertyFieldModal', () => {
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(screen.getByText('Delete Test Field property')).toBeInTheDocument();
|
||||
expect(screen.getByText('Deleting this property will remove all user-defined values associated with it.')).toBeInTheDocument();
|
||||
expect(screen.getByText('Delete Test Field attribute')).toBeInTheDocument();
|
||||
expect(screen.getByText('Deleting this attribute will remove all user-defined values associated with it.')).toBeInTheDocument();
|
||||
expect(screen.getByText('Delete')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ function RemoveUserPropertyFieldModal({
|
||||
|
||||
const title = formatMessage({
|
||||
id: 'admin.system_properties.confirm.delete.title',
|
||||
defaultMessage: 'Delete {name} property',
|
||||
defaultMessage: 'Delete {name} attribute',
|
||||
}, {name});
|
||||
|
||||
const confirmButtonText = formatMessage({
|
||||
@@ -60,7 +60,7 @@ function RemoveUserPropertyFieldModal({
|
||||
const message = (
|
||||
<FormattedMessage
|
||||
id={'admin.system_properties.confirm.delete.text'}
|
||||
defaultMessage={'Deleting this property will remove all user-defined values associated with it.'}
|
||||
defaultMessage={'Deleting this attribute will remove all user-defined values associated with it.'}
|
||||
/>
|
||||
);
|
||||
|
||||
|
||||
@@ -118,8 +118,8 @@ describe('UserPropertyDotMenu', () => {
|
||||
fireEvent.click(menuButton);
|
||||
|
||||
// Verify both link options are shown
|
||||
expect(screen.getByText('Link property to AD/LDAP')).toBeInTheDocument();
|
||||
expect(screen.getByText('Link property to SAML')).toBeInTheDocument();
|
||||
expect(screen.getByText('Link attribute to AD/LDAP')).toBeInTheDocument();
|
||||
expect(screen.getByText('Link attribute to SAML')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('hides LDAP and SAML link menu options for pending fields', async () => {
|
||||
@@ -135,8 +135,8 @@ describe('UserPropertyDotMenu', () => {
|
||||
fireEvent.click(menuButton);
|
||||
|
||||
// Verify both link options are not shown
|
||||
expect(screen.queryByText('Link property to AD/LDAP')).not.toBeInTheDocument();
|
||||
expect(screen.queryByText('Link property to SAML')).not.toBeInTheDocument();
|
||||
expect(screen.queryByText('Link attribute to AD/LDAP')).not.toBeInTheDocument();
|
||||
expect(screen.queryByText('Link attribute to SAML')).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('shows "Edit link with" text when LDAP attribute is linked', async () => {
|
||||
@@ -187,7 +187,7 @@ describe('UserPropertyDotMenu', () => {
|
||||
fireEvent.click(menuButton);
|
||||
|
||||
// Click the duplicate option
|
||||
fireEvent.click(screen.getByText(/Duplicate property/));
|
||||
fireEvent.click(screen.getByText(/Duplicate attribute/));
|
||||
|
||||
// Wait for createField to be called
|
||||
await waitFor(() => {
|
||||
@@ -207,7 +207,7 @@ describe('UserPropertyDotMenu', () => {
|
||||
fireEvent.click(menuButton);
|
||||
|
||||
// Verify duplicate option is not shown
|
||||
expect(screen.queryByText(/Duplicate property/)).not.toBeInTheDocument();
|
||||
expect(screen.queryByText(/Duplicate attribute/)).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('handles field deletion with confirmation when field exists in DB', async () => {
|
||||
@@ -218,12 +218,12 @@ describe('UserPropertyDotMenu', () => {
|
||||
fireEvent.click(menuButton);
|
||||
|
||||
// Click delete option
|
||||
const deleteOption = screen.getByRole('menuitem', {name: /Delete property/});
|
||||
const deleteOption = screen.getByRole('menuitem', {name: /Delete attribute/});
|
||||
fireEvent.click(deleteOption);
|
||||
|
||||
await waitFor(() => {
|
||||
// Verify the delete modal is shown
|
||||
expect(screen.getByText('Delete Test Field property')).toBeInTheDocument();
|
||||
expect(screen.getByText('Delete Test Field attribute')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
// click delete confirm button
|
||||
@@ -250,7 +250,7 @@ describe('UserPropertyDotMenu', () => {
|
||||
fireEvent.click(menuButton);
|
||||
|
||||
// Click delete option
|
||||
const deleteOption = screen.getByRole('menuitem', {name: /Delete property/});
|
||||
const deleteOption = screen.getByRole('menuitem', {name: /Delete attribute/});
|
||||
fireEvent.click(deleteOption);
|
||||
|
||||
await waitFor(() => {
|
||||
|
||||
@@ -194,7 +194,7 @@ const DotMenu = ({
|
||||
) : (
|
||||
<FormattedMessage
|
||||
id='admin.system_properties.user_properties.dotmenu.ad_ldap.link_property.label'
|
||||
defaultMessage={'Link property to AD/LDAP'}
|
||||
defaultMessage={'Link attribute to AD/LDAP'}
|
||||
/>
|
||||
)}
|
||||
/>,
|
||||
@@ -215,7 +215,7 @@ const DotMenu = ({
|
||||
) : (
|
||||
<FormattedMessage
|
||||
id='admin.system_properties.user_properties.dotmenu.saml.link_property.label'
|
||||
defaultMessage={'Link property to SAML'}
|
||||
defaultMessage={'Link attribute to SAML'}
|
||||
/>
|
||||
)}
|
||||
/>,
|
||||
@@ -229,7 +229,7 @@ const DotMenu = ({
|
||||
labels={(
|
||||
<FormattedMessage
|
||||
id='admin.system_properties.user_properties.dotmenu.duplicate.label'
|
||||
defaultMessage={'Duplicate property'}
|
||||
defaultMessage={'Duplicate attribute'}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
@@ -242,7 +242,7 @@ const DotMenu = ({
|
||||
labels={(
|
||||
<FormattedMessage
|
||||
id='admin.system_properties.user_properties.dotmenu.delete.label'
|
||||
defaultMessage={'Delete property'}
|
||||
defaultMessage={'Delete attribute'}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
|
||||
@@ -77,11 +77,11 @@ describe('UserPropertiesTable', () => {
|
||||
);
|
||||
};
|
||||
|
||||
it('renders table with correct property fields', () => {
|
||||
it('renders table with correct attribute fields', () => {
|
||||
renderComponent();
|
||||
|
||||
// Check column headers
|
||||
expect(screen.getByText('Property')).toBeInTheDocument();
|
||||
expect(screen.getByText('Attribute')).toBeInTheDocument();
|
||||
expect(screen.getByText('Type')).toBeInTheDocument();
|
||||
expect(screen.getByText('Values')).toBeInTheDocument();
|
||||
expect(screen.getByText('Actions')).toBeInTheDocument();
|
||||
@@ -162,7 +162,7 @@ describe('UserPropertiesTable', () => {
|
||||
|
||||
// Validation error should be shown
|
||||
await waitFor(() => {
|
||||
expect(screen.getByText('Please enter a property name.')).toBeInTheDocument();
|
||||
expect(screen.getByText('Please enter an attribute name.')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -68,7 +68,7 @@ export const useUserPropertiesTable = (): SectionHook => {
|
||||
<PlusIcon size={16}/>
|
||||
<FormattedMessage
|
||||
id='admin.system_properties.user_properties.add_property'
|
||||
defaultMessage='Add property'
|
||||
defaultMessage='Add attribute'
|
||||
/>
|
||||
</LinkButton>
|
||||
)}
|
||||
@@ -112,7 +112,7 @@ export function UserPropertiesTable({
|
||||
<ColHeaderLeft>
|
||||
<FormattedMessage
|
||||
id='admin.system_properties.user_properties.table.property'
|
||||
defaultMessage='Property'
|
||||
defaultMessage='Attribute'
|
||||
/>
|
||||
</ColHeaderLeft>
|
||||
);
|
||||
@@ -128,7 +128,7 @@ export function UserPropertiesTable({
|
||||
<FormattedMessage
|
||||
tagName={DangerText}
|
||||
id='admin.system_properties.user_properties.table.validation.name_required'
|
||||
defaultMessage='Please enter a property name.'
|
||||
defaultMessage='Please enter an attribute name.'
|
||||
/>
|
||||
);
|
||||
} else if (warningId === ValidationWarningNameUnique) {
|
||||
@@ -136,7 +136,7 @@ export function UserPropertiesTable({
|
||||
<FormattedMessage
|
||||
tagName={DangerText}
|
||||
id='admin.system_properties.user_properties.table.validation.name_unique'
|
||||
defaultMessage='Property names must be unique.'
|
||||
defaultMessage='Attribute names must be unique.'
|
||||
/>
|
||||
);
|
||||
} else if (warningId === ValidationWarningNameTaken) {
|
||||
@@ -144,7 +144,7 @@ export function UserPropertiesTable({
|
||||
<FormattedMessage
|
||||
tagName={DangerText}
|
||||
id='admin.system_properties.user_properties.table.validation.name_taken'
|
||||
defaultMessage='Property name already taken.'
|
||||
defaultMessage='Attribute name already taken.'
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -154,7 +154,7 @@ export function UserPropertiesTable({
|
||||
<EditCell
|
||||
strong={true}
|
||||
value={getValue()}
|
||||
label={formatMessage({id: 'admin.system_properties.user_properties.table.property_name.input.name', defaultMessage: 'Property Name'})}
|
||||
label={formatMessage({id: 'admin.system_properties.user_properties.table.property_name.input.name', defaultMessage: 'Attribute Name'})}
|
||||
deleted={toDelete}
|
||||
borderless={!warning}
|
||||
testid='property-field-input'
|
||||
|
||||
@@ -103,7 +103,7 @@ describe('UserPropertyTypeMenu', () => {
|
||||
fireEvent.click(screen.getByText('Text'));
|
||||
|
||||
// Type in the filter input
|
||||
const filterInput = screen.getByRole('textbox', {name: 'Property type'});
|
||||
const filterInput = screen.getByRole('textbox', {name: 'Attribute type'});
|
||||
fireEvent.change(filterInput, {target: {value: 'multi'}});
|
||||
|
||||
// Should only see Multi-select now
|
||||
|
||||
@@ -74,7 +74,7 @@ const SelectType = (props: Props) => {
|
||||
key='filter_types'
|
||||
id='filter_types'
|
||||
type='text'
|
||||
placeholder={formatMessage({id: 'admin.system_properties.user_properties.table.filter_type', defaultMessage: 'Property type'})}
|
||||
placeholder={formatMessage({id: 'admin.system_properties.user_properties.table.filter_type', defaultMessage: 'Attribute type'})}
|
||||
className='search-teams-selector-search'
|
||||
value={filter}
|
||||
onChange={onFilterChange}
|
||||
|
||||
@@ -301,7 +301,7 @@
|
||||
"admin.access_control.policy.edit_policy.error.unassign_channels": "Error unassigning channels: {error}",
|
||||
"admin.access_control.policy.edit_policy.error.update_active_status": "Error updating policy active status: {error}",
|
||||
"admin.access_control.policy.edit_policy.notice.button": "Configure user attributes",
|
||||
"admin.access_control.policy.edit_policy.notice.text": "You havent configured any user attributes yet. Attribute-Based Access Control requires user attributes that are either synced from an external system (like LDAP or SAML) or manually configured and enabled on this server. To start using attribute based access, please configure user attributes in System Properties.",
|
||||
"admin.access_control.policy.edit_policy.notice.text": "You havent configured any user attributes yet. Attribute-Based Access Control requires user attributes that are either synced from an external system (like LDAP or SAML) or manually configured and enabled on this server. To start using attribute based access, please configure user attributes in System Attributes.",
|
||||
"admin.access_control.policy.edit_policy.notice.title": "Please add user attributes and values to use Attribute-Based Access Control",
|
||||
"admin.access_control.policy.edit_policy.policyName": "Access control policy name:",
|
||||
"admin.access_control.policy.edit_policy.policyName.placeholder": "Add a unique policy name",
|
||||
@@ -814,7 +814,7 @@
|
||||
"admin.customization.uniqueEmojiReactionLimitPerPostDesc": "The number of unique emoji reactions that can be added to a post. Increasing this limit could lead to poor client performance. Maximum is 500.",
|
||||
"admin.customization.uniqueEmojiReactionLimitPerPostPlaceholder": "E.g.: 25",
|
||||
"admin.customProfileAttribDesc": "(Optional) The attribute in the SAML Assertion that will be used to populate the {name} of users in Mattermost.",
|
||||
"admin.customProfileAttributes.subtitle": "You can add or remove custom profile attributes by going to the <link>system properties page</link>.",
|
||||
"admin.customProfileAttributes.subtitle": "You can add or remove custom profile attributes by going to the <link>user attributes page</link>.",
|
||||
"admin.customProfileAttributes.title": "Custom profile attributes sync",
|
||||
"admin.customProfileAttribWarning": "(Warning) This attribute will be converted to a TEXT attribute, if the field is set to synchronize.",
|
||||
"admin.data_grid.empty": "No items found",
|
||||
@@ -2661,10 +2661,11 @@
|
||||
"admin.sidebar.siteStatistics": "Site Statistics",
|
||||
"admin.sidebar.smtp": "SMTP",
|
||||
"admin.sidebar.subscription": "Subscription",
|
||||
"admin.sidebar.system_properties": "System Properties",
|
||||
"admin.sidebar.systemAttributes": "System Attributes",
|
||||
"admin.sidebar.systemRoles": "Delegated Granular Administration",
|
||||
"admin.sidebar.teams": "Teams",
|
||||
"admin.sidebar.teamStatistics": "Team Statistics",
|
||||
"admin.sidebar.user_attributes": "User Attributes",
|
||||
"admin.sidebar.userManagement": "User Management",
|
||||
"admin.sidebar.users": "Users",
|
||||
"admin.sidebar.usersAndTeams": "Users and Teams",
|
||||
@@ -2744,15 +2745,15 @@
|
||||
"admin.support.termsOfServiceTitle": "Custom Terms of Service",
|
||||
"admin.support.termsTitle": "Terms of Use Link:",
|
||||
"admin.system_properties.confirm.delete.button": "Delete",
|
||||
"admin.system_properties.confirm.delete.text": "Deleting this property will remove all user-defined values associated with it.",
|
||||
"admin.system_properties.confirm.delete.title": "Delete {name} property",
|
||||
"admin.system_properties.confirm.delete.text": "Deleting this attribute will remove all user-defined values associated with it.",
|
||||
"admin.system_properties.confirm.delete.title": "Delete {name} attribute",
|
||||
"admin.system_properties.details.saving_changes": "Saving configuration…",
|
||||
"admin.system_properties.details.saving_changes_error": "There was an error while saving the configuration",
|
||||
"admin.system_properties.user_properties.add_property": "Add property",
|
||||
"admin.system_properties.user_properties.add_property": "Add attribute",
|
||||
"admin.system_properties.user_properties.dotmenu.ad_ldap.edit_link.label": "Edit link with: <Chip>AD/LDAP: {propertyName}</Chip>",
|
||||
"admin.system_properties.user_properties.dotmenu.ad_ldap.link_property.label": "Link property to AD/LDAP",
|
||||
"admin.system_properties.user_properties.dotmenu.delete.label": "Delete property",
|
||||
"admin.system_properties.user_properties.dotmenu.duplicate.label": "Duplicate property",
|
||||
"admin.system_properties.user_properties.dotmenu.ad_ldap.link_property.label": "Link attribute to AD/LDAP",
|
||||
"admin.system_properties.user_properties.dotmenu.delete.label": "Delete attribute",
|
||||
"admin.system_properties.user_properties.dotmenu.duplicate.label": "Duplicate attribute",
|
||||
"admin.system_properties.user_properties.dotmenu.duplicate.name_copy": "{fieldName} (copy)",
|
||||
"admin.system_properties.user_properties.dotmenu.saml.edit_link.label": "Edit link with: <Chip>SAML: {propertyName}</Chip>",
|
||||
"admin.system_properties.user_properties.dotmenu.saml.link_property.label": "Link property to SAML",
|
||||
@@ -2760,11 +2761,11 @@
|
||||
"admin.system_properties.user_properties.dotmenu.visibility.hidden.label": "Always hide",
|
||||
"admin.system_properties.user_properties.dotmenu.visibility.label": "Visibility",
|
||||
"admin.system_properties.user_properties.dotmenu.visibility.when_set.label": "Hide when empty",
|
||||
"admin.system_properties.user_properties.subtitle": "Customize the properties to show in user profiles",
|
||||
"admin.system_properties.user_properties.subtitle": "Attributes will be shown in user profile and can be used in access control policies.",
|
||||
"admin.system_properties.user_properties.table.actions": "Actions",
|
||||
"admin.system_properties.user_properties.table.filter_type": "Property type",
|
||||
"admin.system_properties.user_properties.table.property": "Property",
|
||||
"admin.system_properties.user_properties.table.property_name.input.name": "Property Name",
|
||||
"admin.system_properties.user_properties.table.filter_type": "Attribute type",
|
||||
"admin.system_properties.user_properties.table.property": "Attribute",
|
||||
"admin.system_properties.user_properties.table.property_name.input.name": "Attribute Name",
|
||||
"admin.system_properties.user_properties.table.select_type.email": "Email",
|
||||
"admin.system_properties.user_properties.table.select_type.multi_select": "Multi-select",
|
||||
"admin.system_properties.user_properties.table.select_type.phone": "Phone",
|
||||
@@ -2772,16 +2773,16 @@
|
||||
"admin.system_properties.user_properties.table.select_type.text": "Text",
|
||||
"admin.system_properties.user_properties.table.select_type.url": "URL",
|
||||
"admin.system_properties.user_properties.table.type": "Type",
|
||||
"admin.system_properties.user_properties.table.validation.name_required": "Please enter a property name.",
|
||||
"admin.system_properties.user_properties.table.validation.name_taken": "Property name already taken.",
|
||||
"admin.system_properties.user_properties.table.validation.name_unique": "Property names must be unique.",
|
||||
"admin.system_properties.user_properties.table.validation.name_required": "Please enter an attribute name.",
|
||||
"admin.system_properties.user_properties.table.validation.name_taken": "Attribute name already taken.",
|
||||
"admin.system_properties.user_properties.table.validation.name_unique": "Attribute names must be unique.",
|
||||
"admin.system_properties.user_properties.table.validation.values_unique": "Values must be unique.",
|
||||
"admin.system_properties.user_properties.table.values": "Values",
|
||||
"admin.system_properties.user_properties.table.values.placeholder": "Add values… (required)",
|
||||
"admin.system_properties.user_properties.table.values.synced_with": "Synced with: {syncedProperties}",
|
||||
"admin.system_properties.user_properties.table.values.synced_with.ldap": "AD/LDAP: {propertyName}",
|
||||
"admin.system_properties.user_properties.table.values.synced_with.saml": "SAML: {propertyName}",
|
||||
"admin.system_properties.user_properties.title": "User Properties",
|
||||
"admin.system_properties.user_properties.title": "Configure user attributes",
|
||||
"admin.system_roles_feature_discovery.copy": "Assign customizable admin roles to give designated users read and/or write access to select sections of System Console.",
|
||||
"admin.system_roles_feature_discovery.title": "Provide controlled access to the System Console with Mattermost Enterprise",
|
||||
"admin.system_users_list.pagination": "Showing {firstPage} - {lastPage} of {totalItems} users",
|
||||
|
||||
@@ -20,6 +20,10 @@ export const RESOURCE_KEYS = {
|
||||
PERMISSIONS: 'user_management.permissions',
|
||||
SYSTEM_ROLES: 'user_management.system_roles',
|
||||
},
|
||||
SYSTEM_ATTRIBUTES: {
|
||||
USER_ATTRIBUTES: 'system_attributes.user_attributes',
|
||||
ATTRIBUTE_BASED_ACCESS_CONTROL: 'system_attributes.attribute_based_access_control',
|
||||
},
|
||||
AUTHENTICATION: {
|
||||
SIGNUP: 'authentication.signup',
|
||||
EMAIL: 'authentication.email',
|
||||
@@ -93,6 +97,8 @@ export const ResourceToSysConsolePermissionsTable: Record<string, string[]> = {
|
||||
[RESOURCE_KEYS.USER_MANAGEMENT.CHANNELS]: [Permissions.SYSCONSOLE_READ_USERMANAGEMENT_CHANNELS, Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_CHANNELS],
|
||||
[RESOURCE_KEYS.USER_MANAGEMENT.PERMISSIONS]: [Permissions.SYSCONSOLE_READ_USERMANAGEMENT_PERMISSIONS, Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_PERMISSIONS],
|
||||
[RESOURCE_KEYS.USER_MANAGEMENT.SYSTEM_ROLES]: [Permissions.SYSCONSOLE_READ_USERMANAGEMENT_SYSTEM_ROLES, Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_SYSTEM_ROLES],
|
||||
[RESOURCE_KEYS.SYSTEM_ATTRIBUTES.USER_ATTRIBUTES]: [Permissions.SYSCONSOLE_READ_USERMANAGEMENT_USERS, Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_USERS],
|
||||
[RESOURCE_KEYS.SYSTEM_ATTRIBUTES.ATTRIBUTE_BASED_ACCESS_CONTROL]: [Permissions.SYSCONSOLE_READ_USERMANAGEMENT_SYSTEM_ROLES, Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_SYSTEM_ROLES],
|
||||
[RESOURCE_KEYS.SITE.CUSTOMIZATION]: [Permissions.SYSCONSOLE_READ_SITE_CUSTOMIZATION, Permissions.SYSCONSOLE_WRITE_SITE_CUSTOMIZATION],
|
||||
[RESOURCE_KEYS.SITE.LOCALIZATION]: [Permissions.SYSCONSOLE_READ_SITE_LOCALIZATION, Permissions.SYSCONSOLE_WRITE_SITE_LOCALIZATION],
|
||||
[RESOURCE_KEYS.SITE.USERS_AND_TEAMS]: [Permissions.SYSCONSOLE_READ_SITE_USERS_AND_TEAMS, Permissions.SYSCONSOLE_WRITE_SITE_USERS_AND_TEAMS],
|
||||
|
||||
@@ -95,6 +95,7 @@ export function adminDefinitionsToUrlsAndTexts(adminDefinition: typeof AdminDefi
|
||||
adminDefinition.about,
|
||||
adminDefinition.reporting,
|
||||
adminDefinition.user_management,
|
||||
adminDefinition.system_attributes,
|
||||
adminDefinition.environment,
|
||||
adminDefinition.site,
|
||||
adminDefinition.authentication,
|
||||
|
||||
Ссылка в новой задаче
Block a user