[8.8] Disable User Profile theme button group when DarkMode config is set (#158030) (#158080)

# Backport

This will backport the following commits from `main` to `8.8`:
- [Disable User Profile theme button group when DarkMode config is set
(#158030)](https://github.com/elastic/kibana/pull/158030)

<!--- Backport version: 8.9.7 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT
[{"author":{"name":"Kurt","email":"kc13greiner@users.noreply.github.com"},"sourceCommit":{"committedDate":"2023-05-18T14:08:22Z","message":"Disable
User Profile theme button group when DarkMode config is set
(#158030)\n\n## Summary\r\n\r\nCloses
[#156424](https://github.com/elastic/kibana/issues/156424)\r\n\r\nWhen
`uiSettings.overrides.theme:darkMode: true` is set in
the\r\n`kibana.yml` it should take precedence over all other theme
selectors.\r\n\r\nThe User Profile theme selector was still interactive
while\r\n`uiSettings.overrides.theme:darkMode: true` was set in the
config,\r\ncausing a confusing UX.\r\n\r\n## Screenshots\r\n\r\n<img
width=\"930\" alt=\"Screenshot 2023-05-17 at 5 22 58
PM\"\r\nsrc=\"7539df59-9f7d-4ec4-9d11-9b47a8e0a6fc\">\r\n\r\n<img
width=\"937\" alt=\"Screenshot 2023-05-17 at 5 23 22
PM\"\r\nsrc=\"f20b8a20-d2f2-4669-8621-9e0998af4e4c\">\r\n\r\n##
Testing\r\n\r\n*When `uiSettings.overrides.theme:darkMode` is `true` the
theme is\r\noverridden to 'Dark', but if it is set to `false`, it DOES
NOT override\r\nthe theme to 'Light'.*\r\n\r\n1) In `kibana.yml`, set
`uiSettings.overrides.theme:darkMode: true`\r\n2) Navigate to User
Profiles and see that the Theme control is\r\ndisabled/set to 'Dark' and
that there is help text\r\n3) set `uiSettings.overrides.theme:darkMode:
false` / remove the\r\nconfiguration line\r\n4) Navigate to User
Profiles and see that the Theme control is enabled\r\nand set to
'Light'","sha":"4ac89d09bee37096e4d23dfb1410ea080ed50b05","branchLabelMapping":{"^v8.9.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["Team:Security","release_note:skip","8.8
candidate","v8.8.0","v8.9.0"],"number":158030,"url":"https://github.com/elastic/kibana/pull/158030","mergeCommit":{"message":"Disable
User Profile theme button group when DarkMode config is set
(#158030)\n\n## Summary\r\n\r\nCloses
[#156424](https://github.com/elastic/kibana/issues/156424)\r\n\r\nWhen
`uiSettings.overrides.theme:darkMode: true` is set in
the\r\n`kibana.yml` it should take precedence over all other theme
selectors.\r\n\r\nThe User Profile theme selector was still interactive
while\r\n`uiSettings.overrides.theme:darkMode: true` was set in the
config,\r\ncausing a confusing UX.\r\n\r\n## Screenshots\r\n\r\n<img
width=\"930\" alt=\"Screenshot 2023-05-17 at 5 22 58
PM\"\r\nsrc=\"7539df59-9f7d-4ec4-9d11-9b47a8e0a6fc\">\r\n\r\n<img
width=\"937\" alt=\"Screenshot 2023-05-17 at 5 23 22
PM\"\r\nsrc=\"f20b8a20-d2f2-4669-8621-9e0998af4e4c\">\r\n\r\n##
Testing\r\n\r\n*When `uiSettings.overrides.theme:darkMode` is `true` the
theme is\r\noverridden to 'Dark', but if it is set to `false`, it DOES
NOT override\r\nthe theme to 'Light'.*\r\n\r\n1) In `kibana.yml`, set
`uiSettings.overrides.theme:darkMode: true`\r\n2) Navigate to User
Profiles and see that the Theme control is\r\ndisabled/set to 'Dark' and
that there is help text\r\n3) set `uiSettings.overrides.theme:darkMode:
false` / remove the\r\nconfiguration line\r\n4) Navigate to User
Profiles and see that the Theme control is enabled\r\nand set to
'Light'","sha":"4ac89d09bee37096e4d23dfb1410ea080ed50b05"}},"sourceBranch":"main","suggestedTargetBranches":["8.8"],"targetPullRequestStates":[{"branch":"8.8","label":"v8.8.0","labelRegex":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"state":"NOT_CREATED"},{"branch":"main","label":"v8.9.0","labelRegex":"^v8.9.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/158030","number":158030,"mergeCommit":{"message":"Disable
User Profile theme button group when DarkMode config is set
(#158030)\n\n## Summary\r\n\r\nCloses
[#156424](https://github.com/elastic/kibana/issues/156424)\r\n\r\nWhen
`uiSettings.overrides.theme:darkMode: true` is set in
the\r\n`kibana.yml` it should take precedence over all other theme
selectors.\r\n\r\nThe User Profile theme selector was still interactive
while\r\n`uiSettings.overrides.theme:darkMode: true` was set in the
config,\r\ncausing a confusing UX.\r\n\r\n## Screenshots\r\n\r\n<img
width=\"930\" alt=\"Screenshot 2023-05-17 at 5 22 58
PM\"\r\nsrc=\"7539df59-9f7d-4ec4-9d11-9b47a8e0a6fc\">\r\n\r\n<img
width=\"937\" alt=\"Screenshot 2023-05-17 at 5 23 22
PM\"\r\nsrc=\"f20b8a20-d2f2-4669-8621-9e0998af4e4c\">\r\n\r\n##
Testing\r\n\r\n*When `uiSettings.overrides.theme:darkMode` is `true` the
theme is\r\noverridden to 'Dark', but if it is set to `false`, it DOES
NOT override\r\nthe theme to 'Light'.*\r\n\r\n1) In `kibana.yml`, set
`uiSettings.overrides.theme:darkMode: true`\r\n2) Navigate to User
Profiles and see that the Theme control is\r\ndisabled/set to 'Dark' and
that there is help text\r\n3) set `uiSettings.overrides.theme:darkMode:
false` / remove the\r\nconfiguration line\r\n4) Navigate to User
Profiles and see that the Theme control is enabled\r\nand set to
'Light'","sha":"4ac89d09bee37096e4d23dfb1410ea080ed50b05"}}]}]
BACKPORT-->

Co-authored-by: Kurt <kc13greiner@users.noreply.github.com>
This commit is contained in:
Kibana Machine 2023-05-18 11:16:20 -04:00 committed by GitHub
parent e0cc912c80
commit 7dd245e35a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 7 deletions

View file

@ -58,6 +58,8 @@ describe('useUserProfileForm', () => {
coreStart.http.post.mockReset().mockResolvedValue(undefined);
coreStart.notifications.toasts.addDanger.mockReset();
coreStart.notifications.toasts.addSuccess.mockReset();
coreStart.settings.client.get.mockReset();
coreStart.settings.client.isOverridden.mockReset();
});
it('should initialise form with values from user profile', () => {
@ -254,8 +256,9 @@ describe('useUserProfileForm', () => {
<UserProfile user={nonCloudUser} data={data} />
</Providers>
);
expect(testWrapper.exists('[data-test-subj="darkModeButton"]')).toBeTruthy();
const darkModeButton = testWrapper.find('EuiButtonGroup[data-test-subj="darkModeButton"]');
expect(darkModeButton).toBeTruthy();
expect(darkModeButton.getDOMNode()).not.toBeDisabled();
});
it('should not display if the User is a cloud user', () => {
@ -278,7 +281,7 @@ describe('useUserProfileForm', () => {
</Providers>
);
expect(testWrapper.exists('[data-test-subj="darkModeButton"]')).toBeFalsy();
expect(testWrapper.exists('EuiButtonGroup[data-test-subj="darkModeButton"]')).toBeFalsy();
});
it('should add special toast after submitting form successfully since darkMode requires a refresh', async () => {
@ -306,5 +309,32 @@ describe('useUserProfileForm', () => {
expect.objectContaining({ toastLifeTimeMs: 300000 })
);
});
it('should be disabled if the theme has been set in the config', () => {
const data: UserProfileData = {};
const nonCloudUser = mockAuthenticatedUser({ elastic_cloud_user: false });
coreStart.settings.client.get.mockReturnValueOnce(true);
coreStart.settings.client.isOverridden.mockReturnValueOnce(true);
const testWrapper = mount(
<Providers
services={coreStart}
theme$={theme$}
history={history}
authc={authc}
securityApiClients={{
userProfiles: new UserProfileAPIClient(coreStart.http),
users: new UserAPIClient(coreStart.http),
}}
>
<UserProfile user={nonCloudUser} data={data} />
</Providers>
);
const darkModeButton = testWrapper.find('EuiButtonGroup[data-test-subj="darkModeButton"]');
expect(darkModeButton).toBeTruthy();
expect(darkModeButton.getDOMNode()).toHaveProperty('disabled');
});
});
});

View file

@ -29,7 +29,7 @@ import type { FunctionComponent } from 'react';
import React, { useRef, useState } from 'react';
import useUpdateEffect from 'react-use/lib/useUpdateEffect';
import type { CoreStart, ToastInput, ToastOptions } from '@kbn/core/public';
import type { CoreStart, IUiSettingsClient, ToastInput, ToastOptions } from '@kbn/core/public';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n-react';
import { toMountPoint, useKibana } from '@kbn/kibana-react-plugin/public';
@ -142,11 +142,23 @@ function UserDetailsEditor({ user }: { user: AuthenticatedUser }) {
);
}
function UserSettingsEditor({ formik }: { formik: ReturnType<typeof useUserProfileForm> }) {
function UserSettingsEditor({
formik,
isDarkModeOverride,
}: {
formik: ReturnType<typeof useUserProfileForm>;
isDarkModeOverride: boolean;
}) {
if (!formik.values.data) {
return null;
}
let idSelected = formik.values.data.userSettings.darkMode;
if (isDarkModeOverride) {
idSelected = 'dark';
}
return (
<EuiDescribedFormGroup
fullWidth
@ -168,6 +180,7 @@ function UserSettingsEditor({ formik }: { formik: ReturnType<typeof useUserProfi
>
<FormRow
name="data.userSettings.darkMode"
helpText={renderHelpText(isDarkModeOverride)}
label={
<FormLabel for="data.userSettings.darkMode">
<FormattedMessage
@ -187,7 +200,8 @@ function UserSettingsEditor({ formik }: { formik: ReturnType<typeof useUserProfi
)}
buttonSize="m"
data-test-subj="darkModeButton"
idSelected={formik.values.data.userSettings.darkMode}
idSelected={idSelected}
isDisabled={isDarkModeOverride}
options={[
{
id: '',
@ -532,6 +546,8 @@ export const UserProfile: FunctionComponent<UserProfileProps> = ({ user, data })
const isCloudUser = user.elastic_cloud_user;
const isDarkModeOverride = determineIfDarkModeOverride(services.settings.client);
const rightSideItems = [
{
title: (
@ -658,7 +674,9 @@ export const UserProfile: FunctionComponent<UserProfileProps> = ({ user, data })
user={user}
onShowPasswordForm={() => setShowChangePasswordForm(true)}
/>
{isCloudUser ? null : <UserSettingsEditor formik={formik} />}
{isCloudUser ? null : (
<UserSettingsEditor formik={formik} isDarkModeOverride={isDarkModeOverride} />
)}
</Form>
</EuiPageTemplate>
</Breadcrumb>
@ -878,3 +896,23 @@ export const SaveChangesBottomBar: FunctionComponent = () => {
</EuiFlexGroup>
);
};
function renderHelpText(isOverridden: boolean) {
if (isOverridden) {
return (
<EuiText size="xs">
<FormattedMessage
id="xpack.security.accountManagement.userProfile.overriddenMessage"
defaultMessage="This setting is overridden by the Kibana server and can not be changed."
/>
</EuiText>
);
}
}
function determineIfDarkModeOverride(settingsClient: IUiSettingsClient) {
const isThemeOverridden = settingsClient.isOverridden('theme:darkMode');
const isOverriddenThemeDarkMode = settingsClient.get<boolean>('theme:darkMode');
return isThemeOverridden && isOverriddenThemeDarkMode;
}