Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
7c205e5
early UI refresher of workflows using v3 designs. needs tons of testi…
PeerRich Jul 28, 2025
e30e6fe
Delete .claude/settings.local.json
PeerRich Jul 28, 2025
f6673a7
Merge branch 'main' into chore/improve-workflows-ui
PeerRich Jul 28, 2025
0aea12b
Merge branch 'main' of https://github.com/calcom/cal.com into chore/i…
Amit91848 Sep 4, 2025
20ed648
fix: bunch of design fixes, merge conflict fixes
Amit91848 Sep 5, 2025
5efda2e
Merge branch 'main' into chore/improve-workflows-ui
Amit91848 Sep 5, 2025
9ac7942
fix: e2e and type-check
Amit91848 Sep 5, 2025
02013c2
fix: await button click
Amit91848 Sep 5, 2025
78a8da3
Merge branch 'chore/improve-workflows-ui' of https://github.com/calco…
Amit91848 Sep 5, 2025
41fd53b
review fixes
Amit91848 Sep 8, 2025
18bee8f
code rabbit fixes
Amit91848 Sep 8, 2025
b0d43cc
fix styles in variables dropdown
Amit91848 Sep 8, 2025
522f6fc
fix text truncate
Amit91848 Sep 8, 2025
0575ca7
fix: unit tests
Amit91848 Sep 8, 2025
a07e87b
fix: unit tests
Amit91848 Sep 8, 2025
5791c37
Merge branch 'main' into chore/improve-workflows-ui
Amit91848 Sep 8, 2025
f8983a4
chore: add missing i18n
Udit-takkar Sep 8, 2025
c08db85
review fixes
Amit91848 Sep 8, 2025
50e4b83
Merge branch 'chore/improve-workflows-ui' of https://github.com/calco…
Amit91848 Sep 8, 2025
ea79849
Merge branch 'main' of https://github.com/calcom/cal.com into chore/i…
Amit91848 Sep 10, 2025
9e7627e
review fixes
Amit91848 Sep 10, 2025
a1563f3
Merge branch 'main' of https://github.com/calcom/cal.com into chore/i…
Amit91848 Sep 10, 2025
2c08eed
fix testing info message
Sep 11, 2025
e04aa5b
move timeSectionText up
Sep 11, 2025
7697541
fix which team does this apply to info message
Sep 11, 2025
a33aaf2
disable set up agent button with read only
Sep 11, 2025
4e34d80
Merge branch 'main' of https://github.com/calcom/cal.com into chore/i…
Amit91848 Sep 11, 2025
40a482c
fix: cal.ai breaking on mobile screen
Amit91848 Sep 11, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export type AdminLayoutProps = {
children: React.ReactNode;
userRole: UserPermissionRole | "INACTIVE_ADMIN" | undefined;
} & ComponentProps<typeof Shell>;
export default function AdminLayoutAppDirClient({ userRole, children }: AdminLayoutProps) {
export default function AdminLayoutAppDirClient({ children }: AdminLayoutProps) {
const pathname = usePathname();

const isAppsPage = pathname?.startsWith("/settings/admin/apps");
Expand Down
5 changes: 4 additions & 1 deletion apps/web/playwright/fixtures/workflows.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ export function createWorkflowPageFixture(page: Page) {

const saveWorkflow = async () => {
const submitPromise = page.waitForResponse("/api/trpc/workflows/update?batch=1");
await page.getByTestId("save-workflow").click();
const saveButton = await page.getByTestId("save-workflow");
await saveButton.click();
const response = await submitPromise;
expect(response.status()).toBe(200);
const responseData = await response.json();
Expand All @@ -61,7 +62,9 @@ export function createWorkflowPageFixture(page: Page) {
};

const fillNameInput = async (name: string) => {
await page.getByTestId("edit-workflow-name-button").click();
await page.getByTestId("workflow-name").fill(name);
await page.keyboard.press("Enter");
};

const editSelectedWorkflow = async (name: string) => {
Expand Down
4 changes: 3 additions & 1 deletion apps/web/public/static/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -846,6 +846,7 @@
"phone_number_subscription_cancelled_successfully": "Phone number subscription canceled successfully",
"updating": "Updating",
"round_robin": "Round Robin",
"hi_how_are_you_doing": "Hi, how are you doing?",
"round_robin_description": "Cycle meetings between multiple team members.",
"managed_event": "Managed Event",
"username_placeholder": "username",
Expand Down Expand Up @@ -2341,7 +2342,6 @@
"could_not_charge_card": "Could not charge card for payment.",
"insights": "Insights",
"routing_forms": "Routing Forms",
"testing_workflow_info_message": "When testing this workflow, be aware that Emails and SMS can only be scheduled at least 1 hour in advance",
"insights_no_data_found_for_filter": "No data found for the selected filter or selected dates.",
"acknowledge_booking_no_show_fee": "I acknowledge that if I do not attend this event that a {{amount, currency}} no show fee will be applied to my card.",
"days": "days",
Expand Down Expand Up @@ -3594,6 +3594,7 @@
"webhook_trigger_event": "The name of the trigger event (e.g., BOOKING_CREATED, BOOKING_CANCELLED)",
"webhook_created_at": "The time of the webhook",
"webhook_type": "The event type slug",
"set_up_agent": "Set up Agent",
"webhook_title": "The event type name",
"webhook_start_time": "The event's start time",
"webhook_end_time": "The event's end time",
Expand Down Expand Up @@ -3652,5 +3653,6 @@
"before_scheduled_start_time": "Before scheduled start time",
"cancel_booking_acknowledge_no_show_fee": "I acknowledge that by cancelling the booking within {{timeValue}} {{timeUnit}} of the start time I will be charged the no show fee of {{amount, currency}}",
"contact_organizer": "If you have any questions, please contact the organizer.",
"testing_sms_workflow_info_message": "When testing this workflow, be aware that SMS need to be scheduled at least 15 minutes in advance",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated this info message, this was wrong now that we use SMTP + tasker for sending workflow emails

"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Fix grammar in user-facing copy; consider parametrizing minutes.

“SMS need to be scheduled” → “SMS messages must be scheduled”. Immediate fix:

-  "testing_sms_workflow_info_message": "When testing this workflow, be aware that SMS need to be scheduled at least 15 minutes in advance"
+  "testing_sms_workflow_info_message": "When testing this workflow, SMS messages must be scheduled at least 15 minutes in advance"

Optional: make minutes configurable/localizable, e.g.
"testing_sms_workflow_info_message": "When testing this workflow, SMS messages must be scheduled at least {{minutes}} $t(minute_timeUnit) in advance" and pass minutes: 15.

Confirm old key was removed everywhere and new key is referenced:


🏁 Script executed:

#!/bin/bash
# Old key should have no references
rg -n --no-ignore -S "\btesting_workflow_info_message\b" .

# New key should be referenced in code
rg -n --no-ignore -S "\btesting_sms_workflow_info_message\b" packages/ apps/

Length of output: 7890


Fix grammar, sync i18n keys across locales, and parametrize minutes

Search shows the old key testing_workflow_info_message still exists in i18n.lock and many non‑en locale files while the new key testing_sms_workflow_info_message is present only in en and referenced by the code — reconcile these now.

  • Immediate (English) fix — apply diff:
-  "testing_sms_workflow_info_message": "When testing this workflow, be aware that SMS need to be scheduled at least 15 minutes in advance"
+  "testing_sms_workflow_info_message": "When testing this workflow, SMS messages must be scheduled at least 15 minutes in advance"
  • Mandatory: remove or replace testing_workflow_info_message across translations and update i18n.lock so all locales use the same key (or keep the old key and update the English string consistently).
    • Locations found: i18n.lock:2321 and apps/web/public/static/locales/*/common.json (many languages, ~line 2324).
  • Confirmed good: apps/web/public/static/locales/en/common.json:3631 contains the new string and packages/features/ee/workflows/components/WorkflowStepContainer.tsx:600 references t("testing_sms_workflow_info_message").
  • Verify after fixes:
    • rg -n --no-ignore -S "\btesting_workflow_info_message\b" i18n.lock apps/web/public/static/locales
    • rg -n --no-ignore -S "\btesting_sms_workflow_info_message\b" packages/ apps/web/public/static/locales
  • Optional (recommended): parametrize minutes for localization, e.g.
    "testing_sms_workflow_info_message": "When testing this workflow, SMS messages must be scheduled at least {{minutes}} $t(minute_timeUnit) in advance" with minutes: 15.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
"testing_sms_workflow_info_message": "When testing this workflow, SMS messages must be scheduled at least 15 minutes in advance",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
🤖 Prompt for AI Agents
In apps/web/public/static/locales/en/common.json around line 3632, replace the
English-only ad hoc key with the normalized key
testing_sms_workflow_info_message and parametrize the minutes (e.g. "When
testing this workflow, SMS messages must be scheduled at least {{minutes}}
$t(minute_timeUnit) in advance") plus add a minutes default (15) or ensure
callers pass it; then in i18n.lock and every
apps/web/public/static/locales/*/common.json remove the old
testing_workflow_info_message key and add or rename the
testing_sms_workflow_info_message key so all locales and the lock file use the
same key, update corresponding translated strings (or mark them for
translators), and run the provided ripgrep checks (rg -n --no-ignore -S
"\btesting_workflow_info_message\b" i18n.lock apps/web/public/static/locales and
rg -n --no-ignore -S "\btesting_sms_workflow_info_message\b" packages/
apps/web/public/static/locales) to verify no stale references remain.

}
2 changes: 1 addition & 1 deletion apps/web/test/lib/confirm.handler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import { describe, it, beforeEach, vi, expect } from "vitest";

import * as handleConfirmationModule from "@calcom/features/bookings/lib/handleConfirmation";
import { BookingStatus } from "@calcom/prisma/enums";
import type { TrpcSessionUser } from "@calcom/trpc/server/types";
import { confirmHandler } from "@calcom/trpc/server/routers/viewer/bookings/confirm.handler";
import type { TrpcSessionUser } from "@calcom/trpc/server/types";

describe("confirmHandler", () => {
beforeEach(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { v4 as uuidv4 } from "uuid";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import classNames from "@calcom/ui/classNames";
import { Button } from "@calcom/ui/components/button";
import { FormCard } from "@calcom/ui/components/card";
import { FormCard, FormCardBody } from "@calcom/ui/components/card";
import {
BooleanToggleGroupField,
Label,
Expand Down Expand Up @@ -90,7 +90,7 @@ function Field({
router ? { text: router.name, variant: "gray", href: `${appUrl}/form-edit/${router.id}` } : null
}
deleteField={router ? null : deleteField}>
<div className="bg-default border-default w-full gap-3 rounded-2xl border p-3">
<FormCardBody>
<div className="mb-3 w-full">
<TextField
data-testid={`${hookFieldNamespace}.label`}
Expand Down Expand Up @@ -211,7 +211,7 @@ function Field({
}}
/>
</div>
</div>
</FormCardBody>
</FormCard>
</div>
);
Expand Down
9 changes: 8 additions & 1 deletion packages/features/components/phone-input/PhoneInput.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"use client";

import { isSupportedCountry } from "libphonenumber-js";
import type { CSSProperties } from "react";
import { useState, useEffect } from "react";
import PhoneInput from "react-phone-input-2";
import "react-phone-input-2/lib/style.css";
Expand All @@ -19,6 +20,8 @@ export type PhoneInputProps = {
disabled?: boolean;
onChange: (value: string) => void;
defaultCountry?: string;
inputStyle?: CSSProperties;
flagButtonStyle?: CSSProperties;
};

function BasePhoneInput({
Expand All @@ -45,6 +48,7 @@ function BasePhoneInput({
if (value !== sanitized) {
onChange(sanitized);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

if (!isPlatform) {
Expand Down Expand Up @@ -97,6 +101,8 @@ function BasePhoneInputWeb({
className = "",
onChange,
value,
inputStyle,
flagButtonStyle,
...rest
}: Omit<PhoneInputProps, "defaultCountry">) {
const defaultCountry = useDefaultCountry();
Expand All @@ -122,9 +128,10 @@ function BasePhoneInputWeb({
)}
inputClass="text-sm focus:ring-0 !bg-default text-default placeholder:text-muted"
buttonClass="text-emphasis !bg-default hover:!bg-emphasis"
buttonStyle={{ ...flagButtonStyle }}
searchClass="!text-default !bg-default hover:!bg-emphasis"
dropdownClass="!text-default !bg-default"
inputStyle={{ width: "inherit", border: 0 }}
inputStyle={{ width: "inherit", border: 0, ...inputStyle }}
searchStyle={{
display: "flex",
flexDirection: "row",
Expand Down
2 changes: 2 additions & 0 deletions packages/features/ee/workflows/api/scheduleEmailReminders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ export async function handler(req: NextRequest) {
//cancel reminders for cancelled/rescheduled bookings that are scheduled within the next hour
const remindersToCancel: { referenceId: string | null; id: number }[] = await getAllRemindersToCancel();

//eslint-disable-next-line @typescript-eslint/no-explicit-any
const cancelUpdatePromises: Promise<any>[] = [];

for (const reminder of remindersToCancel) {
Expand Down Expand Up @@ -98,6 +99,7 @@ export async function handler(req: NextRequest) {
}

// schedule all unscheduled reminders within the next 72 hours
//eslint-disable-next-line @typescript-eslint/no-explicit-any
const sendEmailPromises: Promise<any>[] = [];

const unscheduledReminders = await getAllUnscheduledReminders();
Expand Down
15 changes: 2 additions & 13 deletions packages/features/ee/workflows/components/SkeletonLoaderEdit.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,8 @@ import { SkeletonText, SkeletonContainer } from "@calcom/ui/components/skeleton"
function SkeletonLoader() {
return (
<SkeletonContainer>
<div className="ml-2 mt-10 md:flex">
<div className="mr-6 flex flex-col md:flex-none">
<SkeletonText className="h-4 w-28" />
<SkeletonText className="mb-6 mt-2 h-8 w-full md:w-64" />
<SkeletonText className="h-4 w-28" />
<SkeletonText className="mt-2 h-8 w-full md:w-64" />
<SkeletonText className="mt-8 hidden h-0.5 w-full md:block" />
<SkeletonText className="mb-6 mt-8 h-8 w-40" />
</div>
<div className="hidden flex-grow md:flex">
<SkeletonText className="h-64 w-full" />
</div>
</div>
<SkeletonText className="mx-auto my-8 h-48 w-full max-w-4xl" />
<SkeletonText className="mx-auto my-8 h-80 w-full max-w-4xl" />
</SkeletonContainer>
);
}
Expand Down
Loading
Loading