diff --git a/.changeset/witty-impalas-flow.md b/.changeset/witty-impalas-flow.md new file mode 100644 index 0000000000000..f0685178bf1ec --- /dev/null +++ b/.changeset/witty-impalas-flow.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/ui-client': minor +'@rocket.chat/meteor': minor +--- + +Improves the Outbound Message modal’s scrolling on smaller viewports and with large templates diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessagePreview/OutboundMessagePreview.tsx b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessagePreview/OutboundMessagePreview.tsx index 5230cc9060af7..8f01e7ed680b9 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessagePreview/OutboundMessagePreview.tsx +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessagePreview/OutboundMessagePreview.tsx @@ -6,6 +6,7 @@ import type { ILivechatContact, } from '@rocket.chat/core-typings'; import { Box, Margins } from '@rocket.chat/fuselage'; +import type { ComponentProps } from 'react'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -14,7 +15,7 @@ import { formatPhoneNumber } from '../../../../../lib/formatPhoneNumber'; import type { TemplateParameters } from '../../definitions/template'; import TemplatePreview from '../TemplatePreview'; -type OutboundMessagePreviewProps = { +type OutboundMessagePreviewProps = ComponentProps & { template?: IOutboundProviderTemplate; contactName?: ILivechatContact['name']; providerName?: IOutboundProviderMetadata['providerName']; @@ -50,6 +51,7 @@ const OutboundMessagePreview = ({ sender: rawSender, recipient: rawRecipient, templateParameters, + ...props }: OutboundMessagePreviewProps) => { const { t } = useTranslation(); @@ -68,7 +70,7 @@ const OutboundMessagePreview = ({ }, [agentName, agentUsername, departmentName]); return ( -
+
    @@ -99,7 +101,7 @@ const OutboundMessagePreview = ({ ) : null} -
+ ); }; diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/OutboundMessageWizard.tsx b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/OutboundMessageWizard.tsx index 859a0994a123e..468f041c26ca0 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/OutboundMessageWizard.tsx +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/OutboundMessageWizard.tsx @@ -147,10 +147,10 @@ const OutboundMessageWizard = ({ defaultValues = {}, onSuccess, onError }: Outbo return ( }> - + - + diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/components/OutboundMessageForm.tsx b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/components/OutboundMessageForm.tsx new file mode 100644 index 0000000000000..2b24a9cd01f9f --- /dev/null +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/components/OutboundMessageForm.tsx @@ -0,0 +1,12 @@ +import { Box } from '@rocket.chat/fuselage'; +import type { ComponentProps } from 'react'; + +type OutboundMessageFormProps = ComponentProps & { + onSubmit?: () => void; +}; + +const OutboundMessageForm = ({ onSubmit, ...props }: OutboundMessageFormProps) => ( + +); + +export default OutboundMessageForm; diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/MessageForm/MessageForm.tsx b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/MessageForm/MessageForm.tsx index 1d1dde6475fac..dda545c6ad949 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/MessageForm/MessageForm.tsx +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/MessageForm/MessageForm.tsx @@ -1,5 +1,5 @@ import type { IOutboundProviderTemplate, Serialized, ILivechatContact } from '@rocket.chat/core-typings'; -import { Box, Button, FieldGroup } from '@rocket.chat/fuselage'; +import { Box, Button, FieldGroup, Scrollable } from '@rocket.chat/fuselage'; import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; import { useToastBarDispatch } from '@rocket.chat/fuselage-toastbar'; import type { ReactNode } from 'react'; @@ -12,6 +12,7 @@ import TemplatePlaceholderField from './components/TemplatePlaceholderField'; import TemplatePreviewForm from './components/TemplatePreviewField'; import type { TemplateParameters } from '../../../../definitions/template'; import { extractParameterMetadata } from '../../../../utils/template'; +import Form from '../../components/OutboundMessageForm'; import { FormFetchError } from '../../utils/errors'; export type MessageFormData = { @@ -78,16 +79,18 @@ const MessageForm = (props: MessageFormProps) => { }); return ( -
- - setValue('templateParameters', {})} /> + + + + setValue('templateParameters', {})} /> - {parametersMetadata.map((metadata) => ( - - ))} + {parametersMetadata.map((metadata) => ( + + ))} - {template ? : null} - + {template ? : null} + + {customActions ?? ( @@ -96,7 +99,7 @@ const MessageForm = (props: MessageFormProps) => { )} -
+ ); }; diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/MessageForm/components/TemplateField.tsx b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/MessageForm/components/TemplateField.tsx index 0c9ef49dbd258..1f116ac24c326 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/MessageForm/components/TemplateField.tsx +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/MessageForm/components/TemplateField.tsx @@ -1,6 +1,7 @@ import type { IOutboundProviderTemplate, Serialized } from '@rocket.chat/core-typings'; import { Field, FieldError, FieldHint, FieldLabel, FieldRow } from '@rocket.chat/fuselage'; import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; +import type { ComponentProps } from 'react'; import { useId } from 'react'; import type { Control } from 'react-hook-form'; import { useController } from 'react-hook-form'; @@ -11,13 +12,13 @@ import TemplateSelect from '../../../../TemplateSelect'; import { cxp } from '../../../utils/cx'; import type { MessageFormData } from '../MessageForm'; -type TemplateFieldProps = { +type TemplateFieldProps = ComponentProps & { control: Control; templates: Serialized[] | undefined; onChange?: (templateId: string) => void; }; -const TemplateField = ({ control, templates, onChange: onChangeExternal }: TemplateFieldProps) => { +const TemplateField = ({ control, templates, onChange: onChangeExternal, ...props }: TemplateFieldProps) => { const { t } = useTranslation(); const templateFieldId = useId(); @@ -46,7 +47,7 @@ const TemplateField = ({ control, templates, onChange: onChangeExternal }: Templ }); return ( - + {t('Template')} diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RecipientForm/RecipientForm.tsx b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RecipientForm/RecipientForm.tsx index 942249923aa12..b9f815fdca996 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RecipientForm/RecipientForm.tsx +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RecipientForm/RecipientForm.tsx @@ -1,5 +1,5 @@ import type { IOutboundProviderMetadata, Serialized, ILivechatContact } from '@rocket.chat/core-typings'; -import { Box, Button, FieldGroup } from '@rocket.chat/fuselage'; +import { Box, Button, FieldGroup, Scrollable } from '@rocket.chat/fuselage'; import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; import { useToastBarDispatch } from '@rocket.chat/fuselage-toastbar'; import { useEndpoint } from '@rocket.chat/ui-contexts'; @@ -14,6 +14,7 @@ import ContactField from './components/ContactField'; import RecipientField from './components/RecipientField'; import SenderField from './components/SenderField'; import { omnichannelQueryKeys } from '../../../../../../../lib/queryKeys'; +import Form from '../../components/OutboundMessageForm'; import { ContactNotFoundError, ProviderNotFoundError } from '../../utils/errors'; export type RecipientFormData = { @@ -184,43 +185,45 @@ const RecipientForm = (props: RecipientFormProps) => { }); return ( -
- - - - - - - - - + + + + + + + + + + + + {customActions ?? ( - + )} - + ); }; diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RepliesForm/RepliesForm.tsx b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RepliesForm/RepliesForm.tsx index f7e6acc2f13e5..4d442b89d207f 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RepliesForm/RepliesForm.tsx +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RepliesForm/RepliesForm.tsx @@ -1,5 +1,5 @@ import type { Serialized, ILivechatDepartment, ILivechatDepartmentAgents } from '@rocket.chat/core-typings'; -import { Box, Button, FieldGroup } from '@rocket.chat/fuselage'; +import { Box, Button, FieldGroup, Scrollable } from '@rocket.chat/fuselage'; import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; import { useToastBarDispatch } from '@rocket.chat/fuselage-toastbar'; import { useEndpoint, usePermission, useUser } from '@rocket.chat/ui-contexts'; @@ -13,6 +13,7 @@ import AgentField from './components/AgentField'; import DepartmentField from './components/DepartmentField'; import { useAllowedAgents } from './hooks/useAllowedAgents'; import { omnichannelQueryKeys } from '../../../../../../../lib/queryKeys'; +import Form from '../../components/OutboundMessageForm'; import { FormFetchError } from '../../utils/errors'; export type RepliesFormData = { @@ -115,25 +116,27 @@ const RepliesForm = (props: RepliesFormProps) => { }); return ( -
- - setValue('agentId', '')} - /> - - - + + + + setValue('agentId', '')} + /> + + + + {customActions ?? ( @@ -142,7 +145,7 @@ const RepliesForm = (props: RepliesFormProps) => { )} -
+ ); }; diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RepliesForm/components/AgentField.tsx b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RepliesForm/components/AgentField.tsx index 424587969176e..96b6cd9fc904c 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RepliesForm/components/AgentField.tsx +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/forms/RepliesForm/components/AgentField.tsx @@ -1,5 +1,6 @@ import type { ILivechatDepartmentAgents, Serialized } from '@rocket.chat/core-typings'; import { Field, FieldError, FieldHint, FieldLabel, FieldRow } from '@rocket.chat/fuselage'; +import type { ComponentProps } from 'react'; import { useId } from 'react'; import type { Control } from 'react-hook-form'; import { useController } from 'react-hook-form'; @@ -9,7 +10,7 @@ import AutoCompleteAgent from '../../../../AutoCompleteDepartmentAgent'; import { cxp } from '../../../utils/cx'; import type { RepliesFormData } from '../RepliesForm'; -type AgentFieldProps = { +type AgentFieldProps = ComponentProps & { control: Control; agents: Serialized[]; canAssignAgent?: boolean; @@ -17,7 +18,7 @@ type AgentFieldProps = { isLoading?: boolean; }; -const AgentField = ({ control, agents, canAssignAgent, disabled = false, isLoading = false }: AgentFieldProps) => { +const AgentField = ({ control, agents, canAssignAgent, disabled = false, isLoading = false, ...props }: AgentFieldProps) => { const { t } = useTranslation(); const agentFieldId = useId(); @@ -30,7 +31,7 @@ const AgentField = ({ control, agents, canAssignAgent, disabled = false, isLoadi }); return ( - + {`${t('Agent')} (${t('optional')})`} & { control: Control; onlyMyDepartments?: boolean; isError: boolean; @@ -26,6 +27,7 @@ const DepartmentField = ({ isFetching, onRefetch, onChange: onChangeExternal, + ...props }: DepartmentFieldProps) => { const { t } = useTranslation(); const departmentFieldId = useId(); @@ -49,7 +51,7 @@ const DepartmentField = ({ }); return ( - + {`${t('Department')} (${t('optional')})`} - ( - - - - - )} - /> - + ( + + + + + )} + /> ); }; diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/RecipientStep.tsx b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/RecipientStep.tsx index 689a6f8648a9c..88e9c64e7c573 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/RecipientStep.tsx +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/RecipientStep.tsx @@ -19,18 +19,16 @@ const RecipientStep = ({ defaultValues, onDirty, onSubmit }: RecipientStepProps) }); return ( -
- ( - - - - )} - /> -
+ ( + + + + )} + /> ); }; diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/RepliesStep.tsx b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/RepliesStep.tsx index 7c569115c4a92..d3abec35e7aab 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/RepliesStep.tsx +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/RepliesStep.tsx @@ -18,18 +18,16 @@ const RepliesStep = ({ defaultValues, onSubmit }: RepliesStepProps) => { }); return ( -
- ( - - - - - )} - /> -
+ ( + + + + + )} + /> ); }; diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/ReviewStep.tsx b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/ReviewStep.tsx index b6cf83197bb02..3237ed57eb9f7 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/ReviewStep.tsx +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/ReviewStep.tsx @@ -1,4 +1,4 @@ -import { Box, Button } from '@rocket.chat/fuselage'; +import { Box, Button, Scrollable } from '@rocket.chat/fuselage'; import { WizardActions, WizardBackButton } from '@rocket.chat/ui-client'; import { useMutation } from '@tanstack/react-query'; import type { ComponentProps } from 'react'; @@ -16,10 +16,10 @@ const ReviewStep = ({ onSend, ...props }: ReviewStepProps) => { const sendMutation = useMutation({ mutationFn: onSend }); return ( -
- - - + + + + @@ -28,7 +28,7 @@ const ReviewStep = ({ onSend, ...props }: ReviewStepProps) => { {t('Send')} -
+
); }; diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/MessageStep.spec.tsx.snap b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/MessageStep.spec.tsx.snap index 4e25cd5e1229c..c60d28eb8f14d 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/MessageStep.spec.tsx.snap +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/MessageStep.spec.tsx.snap @@ -6,38 +6,36 @@ exports[`MessageStep renders Default without crashing 1`] = `
-
+
@@ -52,38 +50,36 @@ exports[`MessageStep renders WithDefaultValues without crashing 1`] = `
-
+
diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/RecipientStep.spec.tsx.snap b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/RecipientStep.spec.tsx.snap index 7a42710074c6c..8141b4b06a536 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/RecipientStep.spec.tsx.snap +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/RecipientStep.spec.tsx.snap @@ -6,28 +6,26 @@ exports[`RecipientStep renders Default without crashing 1`] = `
-
+
@@ -42,28 +40,26 @@ exports[`RecipientStep renders WithDefaultValues without crashing 1`] = `
-
+
diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/RepliesStep.spec.tsx.snap b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/RepliesStep.spec.tsx.snap index a23b2bbfa7f1e..e3249db6dbd08 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/RepliesStep.spec.tsx.snap +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/RepliesStep.spec.tsx.snap @@ -6,38 +6,36 @@ exports[`RepliesStep renders Default without crashing 1`] = `
-
+
@@ -52,38 +50,36 @@ exports[`RepliesStep renders WithDefaultValues without crashing 1`] = `
-
+
diff --git a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/ReviewStep.spec.tsx.snap b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/ReviewStep.spec.tsx.snap index b065e27062f08..9d3e1c3150758 100644 --- a/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/ReviewStep.spec.tsx.snap +++ b/apps/meteor/client/components/Omnichannel/OutboundMessage/components/OutboundMessageWizard/steps/__snapshots__/ReviewStep.spec.tsx.snap @@ -6,24 +6,23 @@ exports[`ReviewStep renders Default without crashing 1`] = `
-
+
-
-
+ agentname="John Doe" + agentusername="johndoe" + contactname="Jane Smith" + data-testid="outbound-message-preview" + departmentname="Support" + maxheight="500" + providername="Rocket.Chat" + providertype="phone" + recipient="+0987654321" + sender="+1234567890" + template="[object Object]" + templateparameters="[object Object]" + />