* Fixed save state panel for channel banner

* Defined default background color

* Updated test

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
Harshil Sharma
2025-05-06 14:02:41 +05:30
коммит произвёл GitHub
родитель 257abbfb0d
Коммит d73222dca9
2 изменённых файлов: 44 добавлений и 6 удалений

Просмотреть файл

@@ -83,6 +83,29 @@ describe('ChannelSettingsConfigurationTab', () => {
expect(screen.queryByTestId('channel_banner_banner_background_color_picker')).not.toBeInTheDocument(); expect(screen.queryByTestId('channel_banner_banner_background_color_picker')).not.toBeInTheDocument();
}); });
it('should render with the correct default values when banner is enabled', async () => {
const channelWithNoColor = {...mockChannelWithBanner, banner_info: undefined};
renderWithContext(<ChannelSettingsConfigurationTab {...{...baseProps, channel: channelWithNoColor}}/>);
// Check that the toggle is enabled
const toggle = screen.getByTestId('channelBannerToggle-button');
expect(toggle).toBeInTheDocument();
expect(toggle).not.toHaveClass('active');
// Click the toggle to enable the banner
await act(async () => {
await userEvent.click(screen.getByTestId('channelBannerToggle-button'));
});
// Banner text and color inputs should be visible when banner is enabled
expect(screen.getByTestId('channel_banner_banner_text_textbox')).toBeInTheDocument();
expect(screen.getByTestId('channel_banner_banner_text_textbox')).toHaveValue('');
// Check that the color picker has the correct value
expect(screen.getByTestId('color-inputColorValue')).toBeInTheDocument();
expect(screen.getByTestId('color-inputColorValue')).toHaveValue('#DDDDDD');
});
it('should render with the correct initial values when banner is enabled', () => { it('should render with the correct initial values when banner is enabled', () => {
renderWithContext(<ChannelSettingsConfigurationTab {...{...baseProps, channel: mockChannelWithBanner}}/>); renderWithContext(<ChannelSettingsConfigurationTab {...{...baseProps, channel: mockChannelWithBanner}}/>);
@@ -97,6 +120,7 @@ describe('ChannelSettingsConfigurationTab', () => {
// Check that the color picker has the correct value // Check that the color picker has the correct value
expect(screen.getByTestId('color-inputColorValue')).toBeInTheDocument(); expect(screen.getByTestId('color-inputColorValue')).toBeInTheDocument();
expect(screen.getByTestId('color-inputColorValue')).toHaveValue('#ff0000');
}); });
it('should show banner settings when toggle is clicked', async () => { it('should show banner settings when toggle is clicked', async () => {

Просмотреть файл

@@ -24,7 +24,7 @@ const CHANNEL_BANNER_MIN_CHARACTER_LIMIT = 0;
const DEFAULT_CHANNEL_BANNER = { const DEFAULT_CHANNEL_BANNER = {
enabled: false, enabled: false,
background_color: '', background_color: '#DDDDDD',
text: '', text: '',
}; };
@@ -69,6 +69,11 @@ function ChannelSettingsConfigurationTab({channel, setAreThereUnsavedChanges, sh
setUpdatedChannelBanner(toUpdate); setUpdatedChannelBanner(toUpdate);
}, [initialBannerInfo, updatedChannelBanner]); }, [initialBannerInfo, updatedChannelBanner]);
const resetFormErrors = useCallback(() => {
setFormError('');
setSaveChangesPanelState(undefined);
}, []);
const handleTextChange = useCallback((e: React.ChangeEvent<TextboxElement>) => { const handleTextChange = useCallback((e: React.ChangeEvent<TextboxElement>) => {
setUpdatedChannelBanner({ setUpdatedChannelBanner({
...updatedChannelBanner, ...updatedChannelBanner,
@@ -88,17 +93,21 @@ function ChannelSettingsConfigurationTab({channel, setAreThereUnsavedChanges, sh
})); }));
setCharacterLimitExceeded(true); setCharacterLimitExceeded(true);
} else { } else {
setFormError(''); resetFormErrors();
setCharacterLimitExceeded(false); setCharacterLimitExceeded(false);
} }
}, [formatMessage, updatedChannelBanner]); }, [formatMessage, resetFormErrors, updatedChannelBanner]);
const handleColorChange = useCallback((color: string) => { const handleColorChange = useCallback((color: string) => {
setUpdatedChannelBanner({ setUpdatedChannelBanner({
...updatedChannelBanner, ...updatedChannelBanner,
background_color: color, background_color: color,
}); });
}, [updatedChannelBanner]);
if (color) {
resetFormErrors();
}
}, [resetFormErrors, updatedChannelBanner]);
const toggleTextPreview = useCallback(() => setShowBannerTextPreview((show) => !show), []); const toggleTextPreview = useCallback(() => setShowBannerTextPreview((show) => !show), []);
@@ -165,8 +174,10 @@ function ChannelSettingsConfigurationTab({channel, setAreThereUnsavedChanges, sh
setSaveChangesPanelState('error'); setSaveChangesPanelState('error');
return; return;
} }
resetFormErrors();
setSaveChangesPanelState('saved'); setSaveChangesPanelState('saved');
}, [handleSave]); }, [handleSave, resetFormErrors]);
const handleCancel = useCallback(() => { const handleCancel = useCallback(() => {
setRequireConfirm(false); setRequireConfirm(false);
@@ -175,6 +186,7 @@ function ChannelSettingsConfigurationTab({channel, setAreThereUnsavedChanges, sh
setUpdatedChannelBanner(initialBannerInfo); setUpdatedChannelBanner(initialBannerInfo);
setFormError(''); setFormError('');
setSaveChangesPanelState(undefined);
setCharacterLimitExceeded(false); setCharacterLimitExceeded(false);
}, [initialBannerInfo]); }, [initialBannerInfo]);
@@ -187,6 +199,8 @@ function ChannelSettingsConfigurationTab({channel, setAreThereUnsavedChanges, sh
characterLimitExceeded || characterLimitExceeded ||
showTabSwitchError; showTabSwitchError;
const showSaveChangesPanel = requireConfirm || saveChangesPanelState === 'saved';
return ( return (
<div className='ChannelSettingsModal__configurationTab'> <div className='ChannelSettingsModal__configurationTab'>
<div className='channel_banner_header'> <div className='channel_banner_header'>
@@ -270,7 +284,7 @@ function ChannelSettingsConfigurationTab({channel, setAreThereUnsavedChanges, sh
</div> </div>
} }
{requireConfirm && ( {showSaveChangesPanel && (
<SaveChangesPanel <SaveChangesPanel
handleSubmit={handleSaveChanges} handleSubmit={handleSaveChanges}
handleCancel={handleCancel} handleCancel={handleCancel}