Chore: Storybook organization and errors (#21923)

pull/21647/head
Douglas Fabris 5 years ago committed by GitHub
parent 9869118f08
commit 62d3733b87
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 13
      .storybook/decorators.js
  2. 9
      .storybook/mocks/providers.js
  3. 7
      client/components/Card/Body.tsx
  4. 6
      client/components/Card/Card.stories.js
  5. 4
      client/components/Card/Card.tsx
  6. 6
      client/components/Card/CardDivider.js
  7. 6
      client/components/Card/CardDivider.tsx
  8. 4
      client/components/Card/CardIcon.tsx
  9. 4
      client/components/Card/Col.tsx
  10. 4
      client/components/Card/ColSection.tsx
  11. 4
      client/components/Card/ColTitle.tsx
  12. 6
      client/components/Card/Footer.js
  13. 6
      client/components/Card/Footer.tsx
  14. 4
      client/components/Card/Title.tsx
  15. 4
      client/components/Card/index.ts
  16. 2
      client/components/DotLeader.stories.js
  17. 2
      client/components/Header/Header.stories.js
  18. 2
      client/components/Message/Attachments/components/Image.stories.js
  19. 2
      client/components/Message/Metrics/Metrics.stories.js
  20. 9
      client/components/Page/PageScrollableContent.tsx
  21. 10
      client/components/data/Counter.js
  22. 2
      client/lib/asyncState/AsyncStatePhase.ts
  23. 1
      client/sidebar/Item/Condensed.js
  24. 2
      client/sidebar/Item/Condensed.stories.js
  25. 1
      client/sidebar/Item/Extended.js
  26. 1
      client/sidebar/Item/Extended.stories.js
  27. 1
      client/sidebar/Item/Medium.js
  28. 2
      client/sidebar/Item/Medium.stories.js
  29. 4
      client/sidebar/Sidebar.stories.js
  30. 3
      client/sidebar/hooks/useSidebarPaletteColor.js
  31. 6
      client/views/admin/settings/inputs/MultiSelectSettingInput.stories.js
  32. 2
      client/views/notFound/NotFoundPage.stories.js
  33. 2
      client/views/omnichannel/analytics/DateRangePicker.stories.js
  34. 2
      client/views/omnichannel/installation/Installation.js
  35. 2
      client/views/room/Announcement/Announcement.stories.js
  36. 2
      client/views/room/Room.stories.js
  37. 2
      client/views/room/contextualBar/AutoTranslate/AutoTranslate.stories.js
  38. 2
      client/views/room/contextualBar/Call/Jitsi/CallJitsi.stories.js
  39. 4
      client/views/room/contextualBar/ExportMessages/ExportMessages.stories.js
  40. 2
      client/views/room/contextualBar/Info/RoomInfo/RoomInfo.stories.js
  41. 2
      client/views/room/contextualBar/KeyboardShortcuts/KeyboardShortcuts.stories.js
  42. 33
      client/views/room/contextualBar/NotificationPreferences/NotificationPreferences.js
  43. 35
      client/views/room/contextualBar/NotificationPreferences/NotificationPreferences.stories.js
  44. 2
      client/views/room/contextualBar/OTR/OTR.stories.js
  45. 2
      client/views/room/contextualBar/PruneMessages/PruneMessages.stories.js
  46. 2
      client/views/room/contextualBar/RoomFiles/RoomFiles.stories.js
  47. 35
      client/views/room/contextualBar/RoomFiles/components/FileItem.js
  48. 2
      client/views/room/contextualBar/RoomFiles/components/FileItem.stories.js
  49. 2
      client/views/room/contextualBar/RoomFiles/components/FileItemIcon.stories.js
  50. 2
      client/views/room/contextualBar/RoomMembers/AddUsers/AddUsers.stories.js
  51. 2
      client/views/room/contextualBar/RoomMembers/EditInvite/EditInvite.stories.js
  52. 2
      client/views/room/contextualBar/RoomMembers/InviteUsers/InviteUsers.stories.js
  53. 2
      client/views/room/contextualBar/RoomMembers/RoomMembers.stories.js
  54. 2
      client/views/room/contextualBar/UserInfo/UserInfo.stories.js
  55. 2
      client/views/setupWizard/Pager.stories.js
  56. 2
      client/views/setupWizard/SetupWizardPage.stories.js
  57. 2
      client/views/setupWizard/SideBar.stories.js
  58. 2
      client/views/setupWizard/StepHeader.stories.js
  59. 2
      client/views/setupWizard/steps/AdminUserInformationStep.stories.js
  60. 2
      client/views/setupWizard/steps/FinalStep.stories.js
  61. 2
      client/views/setupWizard/steps/RegisterServerStep.stories.js
  62. 2
      client/views/setupWizard/steps/SettingsBasedStep.stories.js
  63. 2
      client/views/teams/contextualBar/info/Delete/DeleteTeamModal.stories.js
  64. 2
      client/views/teams/contextualBar/info/Leave/LeaveTeamModal.stories.js
  65. 2
      client/views/teams/contextualBar/info/TeamsInfo.stories.js
  66. 2
      ee/app/engagement-dashboard/client/components/ChannelsTab/ChannelsTab.stories.js
  67. 6
      ee/app/engagement-dashboard/client/components/ChannelsTab/TableSection.js
  68. 10
      ee/app/engagement-dashboard/client/components/ChannelsTab/index.js
  69. 12
      ee/app/engagement-dashboard/client/components/EngagementDashboardPage.js
  70. 17
      ee/app/engagement-dashboard/client/components/MessagesTab/MessagesPerChannelSection.js
  71. 12
      ee/app/engagement-dashboard/client/components/MessagesTab/MessagesSentSection.js
  72. 2
      ee/app/engagement-dashboard/client/components/MessagesTab/MessagesTab.stories.js
  73. 20
      ee/app/engagement-dashboard/client/components/MessagesTab/index.js
  74. 12
      ee/app/engagement-dashboard/client/components/UsersTab/ActiveUsersSection.js
  75. 20
      ee/app/engagement-dashboard/client/components/UsersTab/BusiestChatTimesSection.js
  76. 12
      ee/app/engagement-dashboard/client/components/UsersTab/NewUsersSection.js
  77. 12
      ee/app/engagement-dashboard/client/components/UsersTab/UsersByTimeOfTheDaySection.js
  78. 0
      ee/app/engagement-dashboard/client/components/UsersTab/UsersTab.Stories.js
  79. 16
      ee/app/engagement-dashboard/client/components/UsersTab/index.js
  80. 167
      ee/client/audit/AuditPage.js
  81. 119
      ee/client/audit/AuditPageBase.js
  82. 26
      ee/client/audit/Tabs/ChannelTab.js
  83. 26
      ee/client/audit/Tabs/DirectTab.js
  84. 26
      ee/client/audit/Tabs/UsersTab.js
  85. 41
      ee/client/audit/Tabs/VisitorsTab.js
  86. 2
      ee/client/omnichannel/additionalForms/BusinessHoursTimeZone.js
  87. 2
      ee/client/omnichannel/cannedResponses/CannedResponseAdd.stories.js
  88. 4
      ee/client/omnichannel/cannedResponses/CannedResponseDetails.stories.js
  89. 2
      ee/client/omnichannel/cannedResponses/CannedResponseEdit.js
  90. 6
      ee/client/omnichannel/cannedResponses/CannedResponseEdit.stories.js
  91. 2
      ee/client/omnichannel/cannedResponses/CannedResponseForm.stories.js
  92. 2
      ee/client/omnichannel/cannedResponses/CannedResponsesList.stories.js

@ -31,11 +31,20 @@ export const rocketChatDecorator = (fn) => {
};
export const fullHeightDecorator = (storyFn) =>
<div style={{ display: 'flex', flexDirection: 'column', maxHeight: '100vh' }}>
<div style={{
display: 'flex',
flexDirection: 'column',
maxHeight: '100vh',
}}>
{storyFn()}
</div>;
export const centeredDecorator = (storyFn) =>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: '100vh' }}>
<div style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
minHeight: '100vh',
}}>
{storyFn()}
</div>;

@ -2,6 +2,7 @@ import i18next from 'i18next';
import React from 'react';
import { TranslationContext } from '../../client/contexts/TranslationContext';
import ServerProvider from '../../client/providers/ServerProvider';
let contextValue;
@ -61,7 +62,9 @@ function TranslationProviderMock({ children }) {
}
export function MeteorProviderMock({ children }) {
return <TranslationProviderMock>
{children}
</TranslationProviderMock>;
return <ServerProvider>
<TranslationProviderMock>
{children}
</TranslationProviderMock>
</ServerProvider>;
}

@ -1,7 +1,10 @@
import { Box } from '@rocket.chat/fuselage';
import React from 'react';
import React, { FC, CSSProperties } from 'react';
const Body = ({ children, flexDirection = 'row' }) => (
const Body: FC<{ flexDirection: CSSProperties['flexDirection'] }> = ({
children,
flexDirection = 'row',
}) => (
<Box mb='x8' display='flex' flexDirection={flexDirection} flexGrow={1}>
{children}
</Box>

@ -1,10 +1,10 @@
import { Box, Button, ButtonGroup } from '@rocket.chat/fuselage';
import React from 'react';
import Card from './Card';
import Card from '.';
export default {
title: 'components/basic/Card',
title: 'components/Card',
component: Card,
};
@ -74,7 +74,7 @@ export const Double = () => (
<Card.Icon name='cross' />A bunch of stuff
</Box>
<Box display='flex' flexDirection='row' alignItems='center'>
<Card.Icon name='num-pad' />A bunch of stuff
<Card.Icon name='dialpad' />A bunch of stuff
</Box>
</Box>
<Box>

@ -1,7 +1,7 @@
import { Box } from '@rocket.chat/fuselage';
import React from 'react';
import React, { FC } from 'react';
const Card = ({ children, ...props }) => (
const Card: FC = ({ children, ...props }) => (
<Box
display='flex'
flexDirection='column'

@ -1,6 +0,0 @@
import { Divider } from '@rocket.chat/fuselage';
import React from 'react';
const CardDivider = () => <Divider width='x1' mi='x24' mb='none' alignSelf='stretch' />;
export default CardDivider;

@ -0,0 +1,6 @@
import { Divider } from '@rocket.chat/fuselage';
import React, { FC } from 'react';
const CardDivider: FC = () => <Divider width='x1' mi='x24' mb='none' alignSelf='stretch' />;
export default CardDivider;

@ -1,7 +1,7 @@
import { Box, Icon } from '@rocket.chat/fuselage';
import React from 'react';
import React, { FC } from 'react';
const CardIcon = ({ name, children, ...props }) => (
const CardIcon: FC<{ name: string }> = ({ name, children, ...props }) => (
<Box
minWidth='x16'
display='inline-flex'

@ -1,7 +1,7 @@
import { Box } from '@rocket.chat/fuselage';
import React from 'react';
import React, { FC } from 'react';
const Col = ({ children }) => (
const Col: FC = ({ children }) => (
<Box display='flex' alignSelf='stretch' w='x228' flexDirection='column' fontScale='c1'>
{children}
</Box>

@ -1,7 +1,7 @@
import { Box } from '@rocket.chat/fuselage';
import React from 'react';
import React, { FC } from 'react';
const ColSection = ({ children }) => (
const ColSection: FC = ({ children }) => (
<Box mb='x8' color='info'>
{children}
</Box>

@ -1,7 +1,7 @@
import { Box } from '@rocket.chat/fuselage';
import React from 'react';
import React, { FC } from 'react';
const ColTitle = ({ children }) => (
const ColTitle: FC = ({ children }) => (
<Box fontScale='c2' m='none'>
{children}
</Box>

@ -1,6 +0,0 @@
import { Box } from '@rocket.chat/fuselage';
import React from 'react';
const Footer = ({ children }) => <Box mb='x8'>{children}</Box>;
export default Footer;

@ -0,0 +1,6 @@
import { Box } from '@rocket.chat/fuselage';
import React, { FC } from 'react';
const Footer: FC = ({ children }) => <Box mb='x8'>{children}</Box>;
export default Footer;

@ -1,7 +1,7 @@
import { Box } from '@rocket.chat/fuselage';
import React from 'react';
import React, { FC } from 'react';
const Title = ({ children }) => (
const Title: FC = ({ children }) => (
<Box mb='x8' fontScale='p2'>
{children}
</Box>

@ -8,6 +8,8 @@ import ColTitle from './ColTitle';
import Footer from './Footer';
import Title from './Title';
export const DOUBLE_COLUMN_CARD_WIDTH = 552;
export default Object.assign(Card, {
Title,
Body,
@ -19,5 +21,3 @@ export default Object.assign(Card, {
Divider: CardDivider,
Icon: CardIcon,
});
export const DOUBLE_COLUMN_CARD_WIDTH = 552;

@ -4,7 +4,7 @@ import React from 'react';
import DotLeader from './DotLeader';
export default {
title: 'components/basic/DotLeader',
title: 'components/DotLeader',
component: DotLeader,
};

@ -9,7 +9,7 @@ import RoomAvatar from '../avatar/RoomAvatar';
import Header from './Header';
export default {
title: 'Chat Header',
title: 'room/Header',
component: Header,
};

@ -3,7 +3,7 @@ import React from 'react';
import Retry from './Retry';
export default {
title: 'Image',
title: 'components/Image',
component: Image,
};

@ -5,7 +5,7 @@ import Reply from './Reply';
import Metrics from './index';
export default {
title: 'components/Message/Metrics',
title: 'message/Metrics',
component: Metrics,
};

@ -10,7 +10,14 @@ type PageScrollableContentProps = {
const PageScrollableContent = forwardRef<HTMLElement, PageScrollableContentProps>(
function PageScrollableContent({ onScrollContent, ...props }, ref) {
return (
<Box display='flex' flexShrink={1} flexDirection='column' flexGrow={1} overflow='hidden'>
<Box
height='50vh'
display='flex'
flexShrink={1}
flexDirection='column'
flexGrow={1}
overflow='hidden'
>
<ScrollableContentWrapper
onScroll={onScrollContent as CustomScrollbarsProps['onScroll']}
ref={ref as any}

@ -8,7 +8,15 @@ function Counter({ count, variation = 0, description }) {
<>
<Flex.Container alignItems='end'>
<Box>
<Box is='span' color='default' fontScale='h1' style={{ fontSize: '3em', lineHeight: 1 }}>
<Box
is='span'
color='default'
fontScale='h1'
style={{
fontSize: '3em',
lineHeight: 1,
}}
>
{count}
</Box>
<Growth fontScale='s1'>{variation}</Growth>

@ -1,4 +1,4 @@
export const enum AsyncStatePhase {
export enum AsyncStatePhase {
LOADING = 'loading',
RESOLVED = 'resolved',
REJECTED = 'rejected',

@ -5,6 +5,7 @@ import React, { memo, useState } from 'react';
const Condensed = ({
icon,
title = '',
titleIcon,
avatar,
actions,
href,

@ -6,7 +6,7 @@ import UserAvatar from '../../components/avatar/UserAvatar';
import Condensed from './Condensed';
export default {
title: 'Sidebar/condensed',
title: 'Sidebar/Condensed',
component: Condensed,
};

@ -14,6 +14,7 @@ const Extended = ({
menu,
menuOptions,
subtitle = '',
titleIcon,
badges,
threadUnread,
unread,

@ -78,7 +78,6 @@ export const Menu = () => (
clickable
title={title}
subtitle={subtitle}
w
titleIcon={<Box mi='x4'>{<Status.Online />}</Box>}
avatar={avatar}
menuOptions={{

@ -5,6 +5,7 @@ import React, { memo, useState } from 'react';
const Medium = ({
icon,
title = '',
titleIcon,
avatar,
actions,
href,

@ -6,7 +6,7 @@ import UserAvatar from '../../components/avatar/UserAvatar';
import Medium from './Medium';
export default {
title: 'Sidebar/medium',
title: 'Sidebar/Medium',
component: Medium,
};

@ -149,9 +149,9 @@ const Sidebar = () => (
<>
<SettingsContext.Provider value={settingContextValue}>
<UserContext.Provider value={userContextValue}>
<aside class='sidebar sidebar--main' role='navigation'>
<aside className='sidebar sidebar--main' role='navigation'>
<Header />
<div class='rooms-list sidebar--custom-colors' aria-label='Channels' role='region'>
<div className='rooms-list sidebar--custom-colors' aria-label='Channels' role='region'>
<RoomList />
</div>
</aside>

@ -138,7 +138,8 @@ const useTheme = () => {
return result;
};
const toVar = (color) => (color[0] === '#' ? color : oldPallet[color] || `var(--${color})`);
const toVar = (color) =>
color && color[0] === '#' ? color : oldPallet[color] || `var(--${color})`;
const getStyle = ((selector) => (colors) => `
${selector} {

@ -41,8 +41,10 @@ export const withValue = () => (
_id='setting_id'
label='Label'
placeholder='Placeholder'
value='1'
values={options}
value={[
[1, 'Lorem Ipsum'],
[2, 'Lorem Ipsum'],
]}
/>
);

@ -3,7 +3,7 @@ import React from 'react';
import NotFoundPage from './NotFoundPage';
export default {
title: 'views/notFound/NotFoundPage',
title: 'components/NotFoundPage',
component: NotFoundPage,
};

@ -3,7 +3,7 @@ import React from 'react';
import DateRangePicker from './DateRangePicker';
export default {
title: 'DateRange',
title: 'components/DateRangePicker',
component: DateRangePicker,
};

@ -11,7 +11,7 @@ import Wrapper from './Wrapper';
const Installation = () => {
const t = useTranslation();
const siteUrl = useSetting('Site_Url').replace(/\/$/, '');
const siteUrl = useSetting('Site_Url')?.replace(/\/$/, '');
const installString = `<!-- Start of Rocket.Chat Livechat Script -->
<script type="text/javascript">

@ -3,7 +3,7 @@ import React from 'react';
import Announcement from '.';
export default {
title: 'components/Announcement',
title: 'room/Announcement',
component: Announcement,
};

@ -3,7 +3,7 @@ import React from 'react';
import { RoomTemplate } from './components/RoomTemplate/RoomTemplate';
export default {
title: 'views/Room',
title: 'room',
component: RoomTemplate,
};

@ -5,7 +5,7 @@ import VerticalBar from '../../../../components/VerticalBar';
import AutoTranslate from './AutoTranslate';
export default {
title: 'components/basic/AutoTranslate',
title: 'room/contextualBar/AutoTranslate',
component: AutoTranslate,
};

@ -6,7 +6,7 @@ import CallJitsi from './CallJitsi';
import CallModal from './components/CallModal';
export default {
title: 'components/basic/CallJitsi',
title: 'room/contextualBar/CallJitsi',
component: CallJitsi,
};

@ -3,8 +3,8 @@ import React from 'react';
import ExportMessages from './index';
export default {
title: 'contextualBar/Export Messages',
title: 'room/contextualBar/ExportMessages',
component: ExportMessages,
};
export const ContextualBar = () => <ExportMessages />;
export const _default = () => <ExportMessages />;

@ -4,7 +4,7 @@ import VerticalBar from '../../../../../components/VerticalBar';
import RoomInfo from './RoomInfo';
export default {
title: 'components/RoomInfo',
title: 'room/contextualBar/RoomInfo',
component: RoomInfo,
};

@ -5,7 +5,7 @@ import VerticalBar from '../../../../components/VerticalBar';
import KeyboardShortcutsWithClose from './KeyboardShortcutsWithClose';
export default {
title: 'components/KeyboardShortcut',
title: 'room/contextualBar/KeyboardShortcut',
component: KeyboardShortcutsWithClose,
};

@ -17,6 +17,7 @@ const NotificationPreferences = ({
handleSaveButton,
}) => {
const t = useTranslation();
return (
<>
<VerticalBar.Header>
@ -28,42 +29,42 @@ const NotificationPreferences = ({
<NotificationToogle
label={t('Turn_ON')}
description={t('Receive_alerts')}
onChange={formHandlers.handleTurnOn}
defaultChecked={formValues.turnOn}
onChange={formHandlers?.handleTurnOn}
defaultChecked={formValues?.turnOn}
/>
<NotificationToogle
label={t('Mute_Group_Mentions')}
onChange={formHandlers.handleMuteGroupMentions}
defaultChecked={formValues.muteGroupMentions}
onChange={formHandlers?.handleMuteGroupMentions}
defaultChecked={formValues?.muteGroupMentions}
/>
<NotificationToogle
label={t('Show_counter')}
description={t('Display_unread_counter')}
onChange={formHandlers.handleShowCounter}
defaultChecked={formValues.showCounter}
onChange={formHandlers?.handleShowCounter}
defaultChecked={formValues?.showCounter}
/>
<FieldGroup>
<NotificationByDevice device={t('Desktop')} icon={'computer'}>
<Preferences
id={'DesktopAlert'}
onChange={formHandlers.handleDesktopAlert}
onChange={formHandlers?.handleDesktopAlert}
name={t('Alerts')}
options={handleOptions.alerts}
optionDefault={formValues.desktopAlert}
optionDefault={formValues?.desktopAlert}
/>
<Preferences
id={'DesktopAudio'}
onChange={formHandlers.handleDesktopAudio}
onChange={formHandlers?.handleDesktopAudio}
name={t('Audio')}
options={handleOptions.audio}
optionDefault={formValues.desktopAudio}
optionDefault={formValues?.desktopAudio}
/>
<Preferences
id={'DesktopSound'}
onChange={formHandlers.handleDesktopSound}
onChange={formHandlers?.handleDesktopSound}
name={t('Sound')}
options={handleOptions.sound}
optionDefault={formValues.desktopSound}
optionDefault={formValues?.desktopSound}
>
<Button mis='x4' square ghost onClick={handlePlaySound}>
<Icon name='play' size='x18' />
@ -73,19 +74,19 @@ const NotificationPreferences = ({
<NotificationByDevice device={t('Mobile')} icon={'mobile'}>
<Preferences
id={'MobileAlert'}
onChange={formHandlers.handleMobileAlert}
onChange={formHandlers?.handleMobileAlert}
name={t('Alerts')}
options={handleOptions.alerts}
optionDefault={formValues.mobileAlert}
optionDefault={formValues?.mobileAlert}
/>
</NotificationByDevice>
<NotificationByDevice device={t('Email')} icon={'mail'}>
<Preferences
id={'EmailAlert'}
onChange={formHandlers.handleEmailAlert}
onChange={formHandlers?.handleEmailAlert}
name={t('Alerts')}
options={handleOptions.alerts}
optionDefault={formValues.emailAlert}
optionDefault={formValues?.emailAlert}
/>
</NotificationByDevice>
</FieldGroup>

@ -1,11 +1,10 @@
import { Box } from '@rocket.chat/fuselage';
import React from 'react';
import VerticalBar from '../../../../components/VerticalBar';
import NotificationsPreferences from './NotificationPreferences';
export default {
title: 'components/basic/NotificationsPreferences',
title: 'room/contextualBar/NotificationsPreferences',
component: NotificationsPreferences,
};
@ -49,21 +48,19 @@ handleSelect.mobile.alert = 'mentions';
handleSelect.email.alert = 'nothing';
export const Default = () => (
<Box height='600px'>
<VerticalBar>
<NotificationsPreferences
handleOn={handleOn}
handleSwitch={handleSwitch}
handleOptions={handleOptions}
handleSelect={handleSelect}
handleChangeOption={{
desktopAlert: () => {},
desktopAudio: () => {},
mobileAlert: () => {},
emailAlert: () => {},
}}
handleSoundChange={{ desktopSound: () => {} }}
/>
</VerticalBar>
</Box>
<VerticalBar>
<NotificationsPreferences
handleOn={handleOn}
handleSwitch={handleSwitch}
handleOptions={handleOptions}
handleSelect={handleSelect}
handleChangeOption={{
desktopAlert: () => {},
desktopAudio: () => {},
mobileAlert: () => {},
emailAlert: () => {},
}}
handleSoundChange={{ desktopSound: () => {} }}
/>
</VerticalBar>
);

@ -4,7 +4,7 @@ import VerticalBar from '../../../../components/VerticalBar';
import OTR from './OTR';
export default {
title: 'components/OTR',
title: 'room/contextualBar/OTR',
component: OTR,
};

@ -4,7 +4,7 @@ import VerticalBar from '../../../../components/VerticalBar';
import PruneMessages from './PruneMessages';
export default {
title: 'components/PruneMessages',
title: 'room/contextualBar/PruneMessages',
component: PruneMessages,
};

@ -4,7 +4,7 @@ import VerticalBar from '../../../../components/VerticalBar';
import RoomFiles from './RoomFiles';
export default {
title: 'components/RoomFiles',
title: 'room/contextualBar/RoomFiles',
component: RoomFiles,
};

@ -14,21 +14,24 @@ const hoverClass = css`
}
`;
const FileItem = ({
_id,
name,
url,
uploadedAt,
ts,
user,
type,
typeGroup,
style,
onClickDelete,
className,
isDeletionAllowed,
}) => {
const FileItem = ({ fileData }) => {
const format = useFormatDateAndTime();
const {
_id,
name,
url,
uploadedAt,
ts,
user,
type,
typeGroup,
style,
onClickDelete,
className,
isDeletionAllowed,
} = fileData;
return (
<Box display='flex' p='x12' style={style} className={[className, hoverClass]}>
<Box
@ -62,7 +65,9 @@ const FileItem = ({
_id={_id}
name={name}
url={url}
onClickDelete={isDeletionAllowed({ uid: user?._id, ts }) && onClickDelete}
onClickDelete={
isDeletionAllowed && isDeletionAllowed({ uid: user?._id, ts }) && onClickDelete
}
/>
</Box>
);

@ -4,7 +4,7 @@ import VerticalBar from '../../../../../components/VerticalBar';
import FileItem from './FileItem';
export default {
title: 'components/RoomFiles/FileItem',
title: 'room/ContextualBar/RoomFiles/FileItem',
component: FileItem,
};

@ -3,7 +3,7 @@ import React from 'react';
import FileItemIcon from './FileItemIcon';
export default {
title: 'components/RoomFiles/FileItemIcon',
title: 'room/contextualBar/RoomFiles/FileItemIcon',
component: FileItemIcon,
};

@ -4,7 +4,7 @@ import VerticalBar from '../../../../../components/VerticalBar';
import AddUsers from './AddUsers';
export default {
title: 'components/RoomMembers/AddUsers',
title: 'room/contextualBar/RoomMembers/AddUsers',
component: AddUsers,
};

@ -4,7 +4,7 @@ import VerticalBar from '../../../../../components/VerticalBar';
import EditInvite from './EditInvite';
export default {
title: 'components/RoomMembers/EditInvite',
title: 'room/contextualBar/RoomMembers/EditInvite',
component: EditInvite,
};

@ -4,7 +4,7 @@ import VerticalBar from '../../../../../components/VerticalBar';
import InviteUsers from './InviteUsers';
export default {
title: 'components/RoomMembers/InviteUsers',
title: 'room/contextualBar/RoomMembers/InviteUsers',
component: InviteUsers,
};

@ -4,7 +4,7 @@ import VerticalBar from '../../../../components/VerticalBar';
import RoomMembers from './List/RoomMembers';
export default {
title: 'components/RoomMembers',
title: 'room/contextualBar/RoomMembers',
component: RoomMembers,
};

@ -5,7 +5,7 @@ import VerticalBar from '../../../../components/VerticalBar';
import UserInfo from './UserInfo';
export default {
title: 'components/UserInfo',
title: 'room/contextualBar/UserInfo',
component: UserInfo,
};

@ -4,7 +4,7 @@ import React from 'react';
import { Pager } from './Pager';
export default {
title: 'views/setupWizard/Pager',
title: 'components/setupWizard/Pager',
component: Pager,
};

@ -4,7 +4,7 @@ import SetupWizardPage from './SetupWizardPage';
import { finalStep } from './SetupWizardState';
export default {
title: 'views/setupWizard/SetupWizardPage',
title: 'components/setupWizard/SetupWizardPage',
component: SetupWizardPage,
};

@ -3,7 +3,7 @@ import React from 'react';
import SideBar from './SideBar';
export default {
title: 'views/setupWizard/SideBar',
title: 'components/setupWizard/SideBar',
component: SideBar,
};

@ -3,7 +3,7 @@ import React from 'react';
import { StepHeader } from './StepHeader';
export default {
title: 'views/setupWizard/StepHeader',
title: 'components/setupWizard/StepHeader',
component: StepHeader,
};

@ -3,7 +3,7 @@ import React from 'react';
import AdminUserInformationStep from './AdminUserInformationStep';
export default {
title: 'views/setupWizard/steps/AdminUserInformationStep',
title: 'components/setupWizard/steps/AdminUserInformationStep',
component: AdminUserInformationStep,
};

@ -3,7 +3,7 @@ import React from 'react';
import FinalStep from './FinalStep';
export default {
title: 'views/setupWizard/steps/FinalStep',
title: 'components/setupWizard/steps/FinalStep',
component: FinalStep,
};

@ -3,7 +3,7 @@ import React from 'react';
import RegisterServerStep from './RegisterServerStep';
export default {
title: 'views/setupWizard/steps/RegisterServerStep',
title: 'components/setupWizard/steps/RegisterServerStep',
component: RegisterServerStep,
};

@ -3,7 +3,7 @@ import React from 'react';
import SettingsBasedStep from './SettingsBasedStep';
export default {
title: 'views/setupWizard/steps/SettingsBasedStep',
title: 'components/setupWizard/steps/SettingsBasedStep',
component: SettingsBasedStep,
};

@ -3,7 +3,7 @@ import React from 'react';
import DeleteTeam, { StepOne, StepTwo, StepThree } from '.';
export default {
title: 'components/DeleteTeamModal',
title: 'teams/DeleteTeamModal',
component: DeleteTeam,
};

@ -3,7 +3,7 @@ import React from 'react';
import LeaveTeamModal, { StepOne, StepTwo } from '.';
export default {
title: 'components/LeaveTeamModal',
title: 'teams/LeaveTeamModal',
component: LeaveTeamModal,
};

@ -4,7 +4,7 @@ import VerticalBar from '../../../../components/VerticalBar';
import TeamsInfo from './TeamsInfo';
export default {
title: 'components/TeamsInfo',
title: 'teams/TeamsInfo',
component: TeamsInfo,
};

@ -1,7 +1,7 @@
import { Margins } from '@rocket.chat/fuselage';
import React from 'react';
import { ChannelsTab } from '.';
import ChannelsTab from '.';
export default {
title: 'admin/enterprise/engagement/ChannelsTab',

@ -8,7 +8,7 @@ import Growth from '../../../../../../client/components/data/Growth';
import { Section } from '../Section';
import { downloadCsvAs } from '../../../../../../client/lib/download';
export function TableSection() {
const TableSection = () => {
const t = useTranslation();
const periodOptions = useMemo(() => [
@ -155,4 +155,6 @@ export function TableSection() {
/>
</Box>
</Section>;
}
};
export default TableSection;

@ -1,9 +1,7 @@
import React from 'react';
import { TableSection } from './TableSection';
import TableSection from './TableSection';
export function ChannelsTab() {
return <>
<TableSection />
</>;
}
const ChannelsTab = () => <TableSection />;
export default ChannelsTab;

@ -3,14 +3,14 @@ import React, { useMemo } from 'react';
import { useTranslation } from '../../../../../client/contexts/TranslationContext';
import Page from '../../../../../client/components/Page';
import { UsersTab } from './UsersTab';
import { MessagesTab } from './MessagesTab';
import { ChannelsTab } from './ChannelsTab';
import UsersTab from './UsersTab';
import MessagesTab from './MessagesTab';
import ChannelsTab from './ChannelsTab';
export function EngagementDashboardPage({
export const EngagementDashboardPage = ({
tab = 'users',
onSelectTab,
}) {
}) => {
const t = useTranslation();
const handleTabClick = useMemo(() => (onSelectTab ? (tab) => () => onSelectTab(tab) : () => undefined), [onSelectTab]);
@ -30,4 +30,4 @@ export function EngagementDashboardPage({
</Box>
</Page.ScrollableContent>
</Page>;
}
};

@ -9,7 +9,7 @@ import { LegendSymbol } from '../data/LegendSymbol';
import { Section } from '../Section';
import { downloadCsvAs } from '../../../../../../client/lib/download';
export function MessagesPerChannelSection() {
const MessagesPerChannelSection = () => {
const t = useTranslation();
const periodOptions = useMemo(() => [
@ -86,8 +86,15 @@ export function MessagesPerChannelSection() {
? <Box>
<Flex.Item grow={1} shrink={1}>
<Margins inline='x24'>
<Box style={{ position: 'relative', height: 300 }}>
<Box style={{ position: 'absolute', width: '100%', height: '100%' }}>
<Box style={{
position: 'relative',
height: 300,
}}>
<Box style={{
position: 'absolute',
width: '100%',
height: '100%',
}}>
<ResponsivePie
data={[
{
@ -221,4 +228,6 @@ export function MessagesPerChannelSection() {
</Margins>
</Flex.Container>
</Section>;
}
};
export default MessagesPerChannelSection;

@ -9,7 +9,7 @@ import CounterSet from '../../../../../../client/components/data/CounterSet';
import { Section } from '../Section';
import { downloadCsvAs } from '../../../../../../client/lib/download';
export function MessagesSentSection() {
const MessagesSentSection = () => {
const t = useTranslation();
const periodOptions = useMemo(() => [
@ -110,7 +110,11 @@ export function MessagesSentSection() {
? <Box style={{ height: 240 }}>
<Flex.Item align='stretch' grow={1} shrink={0}>
<Box style={{ position: 'relative' }}>
<Box style={{ position: 'absolute', width: '100%', height: '100%' }}>
<Box style={{
position: 'absolute',
width: '100%',
height: '100%',
}}>
<ResponsiveBar
data={values}
indexBy='date'
@ -174,4 +178,6 @@ export function MessagesSentSection() {
: <Skeleton variant='rect' height={240} />}
</Flex.Container>
</Section>;
}
};
export default MessagesSentSection;

@ -1,7 +1,7 @@
import { Margins } from '@rocket.chat/fuselage';
import React from 'react';
import { MessagesTab } from '.';
import MessagesTab from '.';
export default {
title: 'admin/enterprise/engagement/MessagesTab',

@ -1,13 +1,13 @@
import { Divider } from '@rocket.chat/fuselage';
import React from 'react';
import { Divider } from '@rocket.chat/fuselage';
import MessagesSentSection from './MessagesSentSection';
import MessagesPerChannelSection from './MessagesPerChannelSection';
import { MessagesSentSection } from './MessagesSentSection';
import { MessagesPerChannelSection } from './MessagesPerChannelSection';
const MessagesTab = () => <>
<MessagesSentSection />
<Divider />
<MessagesPerChannelSection />
</>;
export function MessagesTab() {
return <>
<MessagesSentSection />
<Divider />
<MessagesPerChannelSection />
</>;
}
export default MessagesTab;

@ -10,7 +10,7 @@ import { LegendSymbol } from '../data/LegendSymbol';
import { Section } from '../Section';
import { downloadCsvAs } from '../../../../../../client/lib/download';
export function ActiveUsersSection() {
const ActiveUsersSection = () => {
const t = useTranslation();
const period = useMemo(() => ({
@ -133,7 +133,11 @@ export function ActiveUsersSection() {
? <Box style={{ height: 240 }}>
<Flex.Item align='stretch' grow={1} shrink={0}>
<Box style={{ position: 'relative' }}>
<Box style={{ position: 'absolute', width: '100%', height: '100%' }}>
<Box style={{
position: 'absolute',
width: '100%',
height: '100%',
}}>
<ResponsiveLine
data={[
{
@ -237,4 +241,6 @@ export function ActiveUsersSection() {
: <Skeleton variant='rect' height={240} />}
</Flex.Container>
</Section>;
}
};
export default ActiveUsersSection;

@ -8,7 +8,7 @@ import { useTranslation } from '../../../../../../client/contexts/TranslationCon
import { useEndpointData } from '../../../../../../client/hooks/useEndpointData';
import { Section } from '../Section';
function ContentForHours({ displacement, onPreviousDateClick, onNextDateClick }) {
const ContentForHours = ({ displacement, onPreviousDateClick, onNextDateClick }) => {
const t = useTranslation();
const isLgScreen = useBreakpoints().includes('lg');
@ -115,9 +115,9 @@ function ContentForHours({ displacement, onPreviousDateClick, onNextDateClick })
</Box>
: <Skeleton variant='rect' height={196} />}
</>;
}
};
function ContentForDays({ displacement, onPreviousDateClick, onNextDateClick }) {
const ContentForDays = ({ displacement, onPreviousDateClick, onNextDateClick }) => {
const currentDate = useMemo(() => moment.utc().subtract(displacement, 'weeks'), [displacement]);
const formattedCurrentDate = useMemo(() => {
const startOfWeekDate = currentDate.clone().subtract(6, 'days');
@ -153,7 +153,11 @@ function ContentForDays({ displacement, onPreviousDateClick, onNextDateClick })
? <Box style={{ height: 196 }}>
<Flex.Item align='stretch' grow={1} shrink={0}>
<Box style={{ position: 'relative' }}>
<Box style={{ position: 'absolute', width: '100%', height: '100%' }}>
<Box style={{
position: 'absolute',
width: '100%',
height: '100%',
}}>
<ResponsiveBar
data={values}
indexBy='day'
@ -208,9 +212,9 @@ function ContentForDays({ displacement, onPreviousDateClick, onNextDateClick })
: <Skeleton variant='rect' height={196} />}
</Flex.Container>
</>;
}
};
export function BusiestChatTimesSection() {
const BusiestChatTimesSection = () => {
const t = useTranslation();
const [timeUnit, setTimeUnit] = useState('hours');
@ -241,4 +245,6 @@ export function BusiestChatTimesSection() {
onNextDateClick={handleNextDateClick}
/>
</Section>;
}
};
export default BusiestChatTimesSection;

@ -13,7 +13,7 @@ import { downloadCsvAs } from '../../../../../../client/lib/download';
const TICK_WIDTH = 45;
export function NewUsersSection() {
const NewUsersSection = () => {
const t = useTranslation();
const periodOptions = useMemo(() => [
@ -136,7 +136,11 @@ export function NewUsersSection() {
? <Box style={{ height: 240 }}>
<Flex.Item align='stretch' grow={1} shrink={0}>
<Box style={{ position: 'relative' }} ref={sizeRef}>
<Box style={{ position: 'absolute', width: '100%', height: '100%' }}>
<Box style={{
position: 'absolute',
width: '100%',
height: '100%',
}}>
<ResponsiveBar
data={values}
indexBy='date'
@ -208,4 +212,6 @@ export function NewUsersSection() {
: <Box ref={sizeRef}><Skeleton variant='rect' height={240}/></Box>}
</Flex.Container>
</Section>;
}
};
export default NewUsersSection;

@ -8,7 +8,7 @@ import { useEndpointData } from '../../../../../../client/hooks/useEndpointData'
import { Section } from '../Section';
import { downloadCsvAs } from '../../../../../../client/lib/download';
export function UsersByTimeOfTheDaySection() {
const UsersByTimeOfTheDaySection = () => {
const t = useTranslation();
const periodOptions = useMemo(() => [
@ -101,7 +101,11 @@ export function UsersByTimeOfTheDaySection() {
? <Box display='flex' style={{ height: 696 }}>
<Flex.Item align='stretch' grow={1} shrink={0}>
<Box style={{ position: 'relative' }}>
<Box style={{ position: 'absolute', width: '100%', height: '100%' }}>
<Box style={{
position: 'absolute',
width: '100%',
height: '100%',
}}>
<ResponsiveHeatMap
data={values}
indexBy='hour'
@ -177,4 +181,6 @@ export function UsersByTimeOfTheDaySection() {
</Box>
: <Skeleton variant='rect' height={696} />}
</Section>;
}
};
export default UsersByTimeOfTheDaySection;

@ -1,13 +1,13 @@
import React from 'react';
import { useBreakpoints } from '@rocket.chat/fuselage-hooks';
import { Box, Divider, Flex, Margins } from '@rocket.chat/fuselage';
import React from 'react';
import { NewUsersSection } from './NewUsersSection';
import { ActiveUsersSection } from './ActiveUsersSection';
import { UsersByTimeOfTheDaySection } from './UsersByTimeOfTheDaySection';
import { BusiestChatTimesSection } from './BusiestChatTimesSection';
import NewUsersSection from './NewUsersSection';
import ActiveUsersSection from './ActiveUsersSection';
import UsersByTimeOfTheDaySection from './UsersByTimeOfTheDaySection';
import BusiestChatTimesSection from './BusiestChatTimesSection';
export function UsersTab() {
const UsersTab = () => {
const isXxlScreen = useBreakpoints().includes('xxl');
return <>
@ -26,4 +26,6 @@ export function UsersTab() {
</Margins>
</Box>
</>;
}
};
export default UsersTab;

@ -1,25 +1,9 @@
import {
Box,
Field,
TextInput,
ButtonGroup,
Button,
Margins,
Tabs,
Flex,
} from '@rocket.chat/fuselage';
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import React, { useRef, useState } from 'react';
import AutoCompleteAgent from '../../../client/components/AutoCompleteAgent';
import Page from '../../../client/components/Page';
import { useTranslation } from '../../../client/contexts/TranslationContext';
import { useForm } from '../../../client/hooks/useForm';
import DateRangePicker from './DateRangePicker';
import Result from './Result';
import RoomAutoComplete from './RoomAutoComplete';
import UserAutoCompleteMultiple from './UserAutoCompleteMultiple';
import VisitorAutoComplete from './VisitorAutoComplete';
import { AuditPageBase } from './AuditPageBase';
const initialValues = {
msg: '',
@ -62,15 +46,6 @@ const AuditPage = () => {
handleDateRange,
} = handlers;
const useHandleType = (type) =>
useMutableCallback(() => {
handleVisitor('');
handleAgent();
handleRid('');
handleUsers([]);
handleType(type);
});
const onChangeUsers = useMutableCallback((value, action) => {
if (!action) {
if (users.includes(value)) {
@ -125,127 +100,25 @@ const AuditPage = () => {
});
return (
<Page>
<Page.Header title={t('Message_auditing')} />
<Tabs>
<Tabs.Item selected={type === ''} onClick={useHandleType('')}>
{t('Channels')}
</Tabs.Item>
<Tabs.Item selected={type === 'u'} onClick={useHandleType('u')}>
{t('Users')}
</Tabs.Item>
<Tabs.Item selected={type === 'd'} onClick={useHandleType('d')}>
{t('Direct_Messages')}
</Tabs.Item>
<Tabs.Item selected={type === 'l'} onClick={useHandleType('l')}>
{t('Omnichannel')}
</Tabs.Item>
</Tabs>
<Page.ScrollableContentWithShadow mb='neg-x4'>
<Margins block='x4'>
<Box display='flex' flexDirection='row' mi='neg-x4' justifyContent='stretch'>
<Margins inline='x4'>
<Flex.Item shrink={1}>
<Field>
<Field.Label>{t('Message')}</Field.Label>
<Field.Row>
<TextInput value={msg} onChange={handleMsg} placeholder={t('Search')} />
</Field.Row>
</Field>
<Field>
<Field.Label>{t('Date')}</Field.Label>
<Field.Row>
<DateRangePicker onChange={handleDateRange} display='flex' flexGrow={1} />
</Field.Row>
</Field>
</Flex.Item>
</Margins>
</Box>
<Box display='flex' flexDirection='row' alignItems='flex-end'>
<Flex.Item shrink={1}>
{type === '' && (
<Field>
<Field.Label>{t('Channel_name')}</Field.Label>
<Field.Row>
<RoomAutoComplete
error={errors.rid}
value={rid}
onChange={handleRid}
placeholder={t('Channel_Name_Placeholder')}
/>
</Field.Row>
{errors.rid && <Field.Error>{errors.rid}</Field.Error>}
</Field>
)}
{type === 'u' && (
<Field>
<Field.Label>{t('Users')}</Field.Label>
<Field.Row>
<UserAutoCompleteMultiple
error={errors.users}
value={users}
onChange={onChangeUsers}
placeholder={t('Username_Placeholder')}
/>
</Field.Row>
{errors.users && <Field.Error>{errors.users}</Field.Error>}
</Field>
)}
{type === 'd' && (
<Field>
<Field.Label>{t('Users')}</Field.Label>
<Field.Row>
<UserAutoCompleteMultiple
error={errors.users}
value={users}
onChange={onChangeUsers}
placeholder={t('Username_Placeholder')}
/>
</Field.Row>
{errors.users && <Field.Error>{errors.users}</Field.Error>}
</Field>
)}
{type === 'l' && (
<>
<Margins inline='x4'>
<Field>
<Field.Label flexGrow={0}>{t('Visitor')}</Field.Label>
<Field.Row>
<VisitorAutoComplete
error={errors.visitor}
value={visitor}
onChange={handleVisitor}
placeholder={t('Username_Placeholder')}
/>
</Field.Row>
{errors.visitor && <Field.Error>{errors.visitor}</Field.Error>}
</Field>
<Field>
<Field.Label flexGrow={0}>{t('Agent')}</Field.Label>
<Field.Row>
<AutoCompleteAgent
error={errors.agent}
value={agent}
onChange={handleAgent}
placeholder={t('Username_Placeholder')}
/>
</Field.Row>
{errors.agent && <Field.Error>{errors.agent}</Field.Error>}
</Field>
</Margins>
</>
)}
<ButtonGroup mis='x8' align='end'>
<Button primary onClick={apply}>
{t('Apply')}
</Button>
</ButtonGroup>
</Flex.Item>
</Box>
<Result setDataRef={setData} />
</Margins>
</Page.ScrollableContentWithShadow>
</Page>
<AuditPageBase
type={type}
handleType={handleType}
msg={msg}
handleMsg={handleMsg}
handleDateRange={handleDateRange}
errors={errors}
rid={rid}
handleRid={handleRid}
users={users}
handleUsers={handleUsers}
onChangeUsers={onChangeUsers}
visitor={visitor}
handleVisitor={handleVisitor}
agent={agent}
handleAgent={handleAgent}
apply={apply}
setData={setData}
/>
);
};

@ -0,0 +1,119 @@
import {
Box,
Field,
TextInput,
ButtonGroup,
Button,
Margins,
Tabs,
Flex,
} from '@rocket.chat/fuselage';
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import React from 'react';
import Page from '../../../client/components/Page';
import { useTranslation } from '../../../client/contexts/TranslationContext';
import DateRangePicker from './DateRangePicker';
import Result from './Result';
import ChannelTab from './Tabs/ChannelTab';
import DirectTab from './Tabs/DirectTab';
import UsersTab from './Tabs/UsersTab';
import VisitorsTab from './Tabs/VisitorsTab';
// TODO: create more stories for the tabs
export const AuditPageBase = ({
type,
handleType,
msg,
handleMsg,
handleDateRange,
errors,
rid,
handleRid,
users,
handleUsers,
onChangeUsers,
visitor,
handleVisitor,
agent,
handleAgent,
apply,
setData,
}) => {
const t = useTranslation();
const useHandleType = (type) =>
useMutableCallback(() => {
handleVisitor('');
handleAgent();
handleRid('');
handleUsers([]);
handleType(type);
});
return (
<Page>
<Page.Header title={t('Message_auditing')} />
<Tabs>
<Tabs.Item selected={type === ''} onClick={useHandleType('')}>
{t('Channels')}
</Tabs.Item>
<Tabs.Item selected={type === 'u'} onClick={useHandleType('u')}>
{t('Users')}
</Tabs.Item>
<Tabs.Item selected={type === 'd'} onClick={useHandleType('d')}>
{t('Direct_Messages')}
</Tabs.Item>
<Tabs.Item selected={type === 'l'} onClick={useHandleType('l')}>
{t('Omnichannel')}
</Tabs.Item>
</Tabs>
<Page.ScrollableContentWithShadow mb='neg-x4'>
<Margins block='x4'>
<Box display='flex' flexDirection='row' mi='neg-x4' justifyContent='stretch'>
<Margins inline='x4'>
<Flex.Item shrink={1}>
<Field>
<Field.Label>{t('Message')}</Field.Label>
<Field.Row>
<TextInput value={msg} onChange={handleMsg} placeholder={t('Search')} />
</Field.Row>
</Field>
<Field>
<Field.Label>{t('Date')}</Field.Label>
<Field.Row>
<DateRangePicker onChange={handleDateRange} display='flex' flexGrow={1} />
</Field.Row>
</Field>
</Flex.Item>
</Margins>
</Box>
<Box display='flex' flexDirection='row' alignItems='flex-end'>
<Flex.Item shrink={1}>
{type === '' && <ChannelTab errors={errors} rid={rid} handleRid={handleRid} />}
{type === 'u' && (
<UsersTab errors={errors} users={users} onChangeUsers={onChangeUsers} />
)}
{type === 'd' && <DirectTab />}
{type === 'l' && (
<VisitorsTab
errors={errors}
visitor={visitor}
handleVisitor={handleVisitor}
agent={agent}
handleAgent={handleAgent}
/>
)}
<ButtonGroup mis='x8' align='end'>
<Button primary onClick={apply}>
{t('Apply')}
</Button>
</ButtonGroup>
</Flex.Item>
</Box>
{setData && <Result setDataRef={setData} />}
</Margins>
</Page.ScrollableContentWithShadow>
</Page>
);
};

@ -0,0 +1,26 @@
import { Field } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../../client/contexts/TranslationContext';
import RoomAutoComplete from '../RoomAutoComplete';
const ChannelTab = ({ errors, rid, handleRid }) => {
const t = useTranslation();
return (
<Field>
<Field.Label>{t('Channel_name')}</Field.Label>
<Field.Row>
<RoomAutoComplete
error={errors.rid}
value={rid}
onChange={handleRid}
placeholder={t('Channel_Name_Placeholder')}
/>
</Field.Row>
{errors.rid && <Field.Error>{errors.rid}</Field.Error>}
</Field>
);
};
export default ChannelTab;

@ -0,0 +1,26 @@
import { Field } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../../client/contexts/TranslationContext';
import UserAutoCompleteMultiple from '../UserAutoCompleteMultiple';
const DirectTab = ({ errors, users, onChangeUsers }) => {
const t = useTranslation();
return (
<Field>
<Field.Label>{t('Users')}</Field.Label>
<Field.Row>
<UserAutoCompleteMultiple
error={errors.users}
value={users}
onChange={onChangeUsers}
placeholder={t('Username_Placeholder')}
/>
</Field.Row>
{errors.users && <Field.Error>{errors.users}</Field.Error>}
</Field>
);
};
export default DirectTab;

@ -0,0 +1,26 @@
import { Field } from '@rocket.chat/fuselage';
import React from 'react';
import { useTranslation } from '../../../../client/contexts/TranslationContext';
import UserAutoCompleteMultiple from '../UserAutoCompleteMultiple';
const UsersTab = ({ errors, users, onChangeUsers }) => {
const t = useTranslation();
return (
<Field>
<Field.Label>{t('Users')}</Field.Label>
<Field.Row>
<UserAutoCompleteMultiple
error={errors.users}
value={users}
onChange={onChangeUsers}
placeholder={t('Username_Placeholder')}
/>
</Field.Row>
{errors.users && <Field.Error>{errors.users}</Field.Error>}
</Field>
);
};
export default UsersTab;

@ -0,0 +1,41 @@
import { Field, Margins } from '@rocket.chat/fuselage';
import React from 'react';
import AutoCompleteAgent from '../../../../client/components/AutoCompleteAgent';
import { useTranslation } from '../../../../client/contexts/TranslationContext';
import VisitorAutoComplete from '../VisitorAutoComplete';
const VisitorsTab = ({ errors, visitor, handleVisitor, agent, handleAgent }) => {
const t = useTranslation();
return (
<Margins inline='x4'>
<Field>
<Field.Label flexGrow={0}>{t('Visitor')}</Field.Label>
<Field.Row>
<VisitorAutoComplete
error={errors.visitor}
value={visitor}
onChange={handleVisitor}
placeholder={t('Username_Placeholder')}
/>
</Field.Row>
{errors.visitor && <Field.Error>{errors.visitor}</Field.Error>}
</Field>
<Field>
<Field.Label flexGrow={0}>{t('Agent')}</Field.Label>
<Field.Row>
<AutoCompleteAgent
error={errors.agent}
value={agent}
onChange={handleAgent}
placeholder={t('Username_Placeholder')}
/>
</Field.Row>
{errors.agent && <Field.Error>{errors.agent}</Field.Error>}
</Field>
</Margins>
);
};
export default VisitorsTab;

@ -21,7 +21,7 @@ const BusinessHoursTimeZone = ({ onChange, data, className, hasChanges = () => {
const timeZonesOptions = useMemo(() => timeZones.map((name) => [name, t(name)]), [t, timeZones]);
onChange({ name });
onChange && onChange({ name });
hasChanges(hasUnsavedChanges);
return (

@ -4,7 +4,7 @@ import React from 'react';
import CannedResponseAdd from './CannedResponseAdd';
export default {
title: 'omnichannel/CannedResponseAdd',
title: 'omnichannel/CannedResponse/CannedResponseAdd',
component: CannedResponseAdd,
};

@ -4,7 +4,7 @@ import React from 'react';
import { CannedResponseDetails } from './CannedResponseDetails';
export default {
title: 'omnichannel/CannedResponseDetails',
title: 'omnichannel/CannedResponse/CannedResponseDetails',
component: CannedResponseDetails,
};
@ -16,6 +16,6 @@ const cannedResponse = {
export const Default = () => (
<Box maxWidth='x300' alignSelf='center' w='full'>
<CannedResponseDetails {...cannedResponse} />
<CannedResponseDetails response={cannedResponse} />
</Box>
);

@ -8,7 +8,7 @@ import { useForm } from '../../../../client/hooks/useForm';
import CannedResponsesForm from './CannedResponseForm';
import { withResponseData } from './withResponseData';
const CannedResponseEdit = ({ response, onSave, onReturn, onClose }) => {
export const CannedResponseEdit = ({ response, onSave, onReturn, onClose }) => {
const t = useTranslation();
const [errors, setErrors] = useState();

@ -1,10 +1,10 @@
import { Box } from '@rocket.chat/fuselage';
import React from 'react';
import CannedResponseEdit from './CannedResponseEdit';
import { CannedResponseEdit } from './CannedResponseEdit';
export default {
title: 'omnichannel/CannedResponseEdit',
title: 'omnichannel/CannedResponse/CannedResponseEdit',
component: CannedResponseEdit,
};
@ -15,6 +15,6 @@ const cannedResponse = {
export const Default = () => (
<Box maxWidth='x300' alignSelf='center' w='full'>
<CannedResponseEdit {...cannedResponse} />
<CannedResponseEdit response={cannedResponse} />
</Box>
);

@ -5,7 +5,7 @@ import { useForm } from '../../../../client/hooks/useForm';
import CannedResponseForm from './CannedResponseForm';
export default {
title: 'omnichannel/CannedResponseForm',
title: 'omnichannel/CannedResponse/CannedResponseForm',
component: CannedResponseForm,
};

@ -4,7 +4,7 @@ import React from 'react';
import CannedResponsesList from './CannedResponsesList';
export default {
title: 'omnichannel/CannedResponsesList',
title: 'omnichannel/CannedResponse/CannedResponsesList',
component: CannedResponsesList,
};

Loading…
Cancel
Save