New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: select team members to receive emails #13957
Changes from 25 commits
45ad054
e49a9b1
93c8f82
23880dd
6b39816
9b852c8
837dbba
c841056
2859d7a
87c2167
46d7da0
8f9043d
ae825f4
10a1d85
93f2dc4
19bbbd0
b68a4ab
bb5028a
b9677cd
1dbf7d1
478a481
a6d75dc
e8b25e9
8b7170d
6b7a554
3484e6e
8493678
81e4d1b
319cf6d
2352550
47cc320
4d2cfb0
79d9346
5206fd8
7e6c566
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,6 +5,8 @@ | |
import { Controller, useFormContext } from "react-hook-form"; | ||
|
||
import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired"; | ||
import AddMembersWithSwitch from "@calcom/features/eventtypes/components/AddMembersWithSwitch"; | ||
import type { Host } from "@calcom/features/eventtypes/lib/types"; | ||
import { ShellMain } from "@calcom/features/shell/Shell"; | ||
import useApp from "@calcom/lib/hooks/useApp"; | ||
import { useLocale } from "@calcom/lib/hooks/useLocale"; | ||
|
@@ -243,11 +245,16 @@ | |
function SingleForm({ form, appUrl, Page, enrichedWithUserProfileForm }: SingleFormComponentProps) { | ||
const utils = trpc.useContext(); | ||
const { t } = useLocale(); | ||
const { data: teamMembers } = form.teamId | ||
? trpc.viewer.teams.listMembers.useQuery({ teamIds: [form.teamId] }) | ||
: { data: [] }; | ||
|
||
const [isTestPreviewOpen, setIsTestPreviewOpen] = useState(false); | ||
const [response, setResponse] = useState<Response>({}); | ||
const [decidedAction, setDecidedAction] = useState<Route["action"] | null>(null); | ||
const [skipFirstUpdate, setSkipFirstUpdate] = useState(true); | ||
const [selectedMembers, setSelectedMembers] = useState<Host[]>([]); | ||
const [assignAllTeamMembers, setAssignAllTeamMembers] = useState(false); | ||
const [eventTypeUrl, setEventTypeUrl] = useState(""); | ||
|
||
function testRouting() { | ||
|
@@ -293,6 +300,26 @@ | |
// eslint-disable-next-line react-hooks/exhaustive-deps | ||
}, [form]); | ||
|
||
useEffect(() => { | ||
if (form.teamId && form.settings?.sendUpdatesTo?.length && teamMembers?.length) { | ||
let sendToAll = true; | ||
teamMembers.forEach((member) => { | ||
if (!form.settings?.sendUpdatesTo?.includes(member.id)) { | ||
sendToAll = false; | ||
return; | ||
} | ||
}); | ||
setAssignAllTeamMembers(sendToAll); | ||
setSelectedMembers( | ||
form.settings.sendUpdatesTo.map((userId) => ({ | ||
isFixed: true, | ||
userId: userId, | ||
priority: 1, | ||
})) | ||
); | ||
} | ||
}, [form.teamId, form.settings?.sendUpdatesTo?.length, teamMembers?.length]); | ||
Check warning on line 321 in packages/app-store/routing-forms/components/SingleForm.tsx GitHub Actions / ESLint Report Analysispackages/app-store/routing-forms/components/SingleForm.tsx#L321
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could we instead add to the form a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
|
||
const mutation = trpc.viewer.appRoutingForms.formMutation.useMutation({ | ||
onSuccess() { | ||
showToast(t("form_updated_successfully"), "success"); | ||
|
@@ -356,20 +383,59 @@ | |
/> | ||
|
||
<div className="mt-6"> | ||
<Controller | ||
name="settings.emailOwnerOnSubmission" | ||
control={hookForm.control} | ||
render={({ field: { value, onChange } }) => { | ||
return ( | ||
<SettingsToggle | ||
title={t("routing_forms_send_email_owner")} | ||
description={t("routing_forms_send_email_owner_description")} | ||
checked={value} | ||
onCheckedChange={(val) => onChange(val)} | ||
/> | ||
); | ||
}} | ||
/> | ||
{form.teamId ? ( | ||
<AddMembersWithSwitch | ||
teamMembers={(teamMembers || []).map((member) => ({ | ||
value: member.id.toString(), | ||
label: member.name || "", | ||
avatar: member.avatarUrl || "", | ||
email: member.email, | ||
isFixed: true, | ||
}))} | ||
value={selectedMembers} | ||
onChange={(value) => { | ||
setSelectedMembers(value); | ||
hookForm.setValue( | ||
"settings.sendUpdatesTo", | ||
value.map((teamMember) => teamMember.userId), | ||
{ shouldDirty: true } | ||
); | ||
hookForm.setValue("settings.emailOwnerOnSubmission", false, { shouldDirty: true }); | ||
}} | ||
assignAllTeamMembers={assignAllTeamMembers} | ||
setAssignAllTeamMembers={setAssignAllTeamMembers} | ||
automaticAddAllEnabled={true} | ||
isFixed={true} | ||
onActive={() => { | ||
hookForm.setValue( | ||
"settings.sendUpdatesTo", | ||
(teamMembers || []).map((teamMember) => teamMember.id), | ||
{ shouldDirty: true } | ||
); | ||
hookForm.setValue("settings.emailOwnerOnSubmission", false, { shouldDirty: true }); | ||
}} | ||
placeholder={t("select_members")} | ||
containerClassName="!px-0 !pb-0 !pt-0" | ||
/> | ||
) : ( | ||
<Controller | ||
name="settings.emailOwnerOnSubmission" | ||
control={hookForm.control} | ||
render={({ field: { value, onChange } }) => { | ||
return ( | ||
<SettingsToggle | ||
title={t("routing_forms_send_email_owner")} | ||
description={t("routing_forms_send_email_owner_description")} | ||
checked={value} | ||
onCheckedChange={(val) => { | ||
onChange(val); | ||
hookForm.unregister("settings.sendUpdatesTo"); | ||
}} | ||
/> | ||
); | ||
}} | ||
/> | ||
)} | ||
</div> | ||
|
||
{form.routers.length ? ( | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we are querying the team members everytime the form has a
teamId
can we move this to server side and include it in theformQuery.handler
?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done