fix: Routing Form - Show responses in the order of fields (#11143)

Co-authored-by: Carina Wollendorfer <30310907+CarinaWolli@users.noreply.github.com>
This commit is contained in:
Hariom Balhara 2023-09-07 20:52:39 +05:30 committed by GitHub
parent b946f89ffb
commit 5324ec8051
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 29 additions and 13 deletions

View File

@ -3,15 +3,15 @@ import type { App_RoutingForms_Form } from "@prisma/client";
import { BaseEmailHtml, Info } from "@calcom/emails/src/components"; import { BaseEmailHtml, Info } from "@calcom/emails/src/components";
import { WEBAPP_URL } from "@calcom/lib/constants"; import { WEBAPP_URL } from "@calcom/lib/constants";
import type { Response } from "../../types/types"; import type { OrderedResponses } from "../../types/types";
export const ResponseEmail = ({ export const ResponseEmail = ({
form, form,
response, orderedResponses,
...props ...props
}: { }: {
form: Pick<App_RoutingForms_Form, "id" | "name">; form: Pick<App_RoutingForms_Form, "id" | "name">;
response: Response; orderedResponses: OrderedResponses;
subject: string; subject: string;
} & Partial<React.ComponentProps<typeof BaseEmailHtml>>) => { } & Partial<React.ComponentProps<typeof BaseEmailHtml>>) => {
return ( return (
@ -36,11 +36,11 @@ export const ResponseEmail = ({
title={form.name} title={form.name}
subtitle="New Response Received" subtitle="New Response Received"
{...props}> {...props}>
{Object.entries(response).map(([fieldId, fieldResponse]) => { {orderedResponses.map((fieldResponse, index) => {
return ( return (
<Info <Info
withSpacer withSpacer
key={fieldId} key={index}
label={fieldResponse.label} label={fieldResponse.label}
description={ description={
fieldResponse.value instanceof Array ? fieldResponse.value.join(",") : fieldResponse.value fieldResponse.value instanceof Array ? fieldResponse.value.join(",") : fieldResponse.value

View File

@ -3,17 +3,25 @@ import type { App_RoutingForms_Form } from "@prisma/client";
import { renderEmail } from "@calcom/emails"; import { renderEmail } from "@calcom/emails";
import BaseEmail from "@calcom/emails/templates/_base-email"; import BaseEmail from "@calcom/emails/templates/_base-email";
import type { Response } from "../../types/types"; import type { OrderedResponses } from "../../types/types";
type Form = Pick<App_RoutingForms_Form, "id" | "name">; type Form = Pick<App_RoutingForms_Form, "id" | "name">;
export default class ResponseEmail extends BaseEmail { export default class ResponseEmail extends BaseEmail {
response: Response; orderedResponses: OrderedResponses;
toAddresses: string[]; toAddresses: string[];
form: Form; form: Form;
constructor({ toAddresses, response, form }: { form: Form; toAddresses: string[]; response: Response }) { constructor({
toAddresses,
orderedResponses,
form,
}: {
form: Form;
toAddresses: string[];
orderedResponses: OrderedResponses;
}) {
super(); super();
this.form = form; this.form = form;
this.response = response; this.orderedResponses = orderedResponses;
this.toAddresses = toAddresses; this.toAddresses = toAddresses;
} }
@ -26,7 +34,7 @@ export default class ResponseEmail extends BaseEmail {
subject, subject,
html: renderEmail("ResponseEmail", { html: renderEmail("ResponseEmail", {
form: this.form, form: this.form,
response: this.response, orderedResponses: this.orderedResponses,
subject, subject,
}), }),
}; };

View File

@ -6,6 +6,7 @@ import logger from "@calcom/lib/logger";
import { WebhookTriggerEvents } from "@calcom/prisma/client"; import { WebhookTriggerEvents } from "@calcom/prisma/client";
import type { Ensure } from "@calcom/types/utils"; import type { Ensure } from "@calcom/types/utils";
import type { OrderedResponses } from "../types/types";
import type { Response, SerializableForm } from "../types/types"; import type { Response, SerializableForm } from "../types/types";
export async function onFormSubmission( export async function onFormSubmission(
@ -61,23 +62,28 @@ export async function onFormSubmission(
}); });
await Promise.all(promises); await Promise.all(promises);
const orderedResponses = form.fields.reduce((acc, field) => {
acc.push(response[field.id]);
return acc;
}, [] as OrderedResponses);
if (form.settings?.emailOwnerOnSubmission) { if (form.settings?.emailOwnerOnSubmission) {
logger.debug( logger.debug(
`Preparing to send Form Response email for Form:${form.id} to form owner: ${form.user.email}` `Preparing to send Form Response email for Form:${form.id} to form owner: ${form.user.email}`
); );
await sendResponseEmail(form, response, form.user.email); await sendResponseEmail(form, orderedResponses, form.user.email);
} }
} }
export const sendResponseEmail = async ( export const sendResponseEmail = async (
form: Pick<App_RoutingForms_Form, "id" | "name">, form: Pick<App_RoutingForms_Form, "id" | "name">,
response: Response, orderedResponses: OrderedResponses,
ownerEmail: string ownerEmail: string
) => { ) => {
try { try {
if (typeof window === "undefined") { if (typeof window === "undefined") {
const { default: ResponseEmail } = await import("../emails/templates/response-email"); const { default: ResponseEmail } = await import("../emails/templates/response-email");
const email = new ResponseEmail({ form: form, toAddresses: [ownerEmail], response: response }); const email = new ResponseEmail({ form: form, toAddresses: [ownerEmail], orderedResponses });
await email.sendEmail(); await email.sendEmail();
} }
} catch (e) { } catch (e) {

View File

@ -45,3 +45,5 @@ export type SerializableRoute =
isFallback?: LocalRoute["isFallback"]; isFallback?: LocalRoute["isFallback"];
}) })
| GlobalRoute; | GlobalRoute;
export type OrderedResponses = Response[string][];