From 7226f1e4c072ce7a09a2bf3e92e14b749634e594 Mon Sep 17 00:00:00 2001 From: Amit Sharma <74371312+Amit91848@users.noreply.github.com> Date: Thu, 5 Feb 2026 22:07:59 +0530 Subject: [PATCH] fix: ux audit changes (#26875) * fix: ux audit changes * fix: remove locale-insensitive toLowerCase() on translation Remove .toLowerCase() call on t('minutes') translation as it is locale-insensitive and can corrupt translations (e.g., Turkish dotted/dotless 'i'). The translation itself should provide the desired casing. Addresses Cubic AI review feedback with confidence 9/10. Co-Authored-By: unknown <> * fix: redirect url tool tip not working * fix: type check --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../forms/[[...pages]]/Forms.tsx | 6 +- .../components/apps/CalendarListContainer.tsx | 4 +- .../apps/routing-forms/FormActions.tsx | 5 +- .../data-table/components/DataTable.tsx | 3 +- .../workflows/components/AddActionDialog.tsx | 2 +- .../components/WorkflowCreationDialog.tsx | 2 +- .../components/EventTypeLayout.tsx | 2 +- .../components/locations/CalVideoSettings.tsx | 5 +- .../settings/my-account/general-view.tsx | 2 + apps/web/modules/signup-view.tsx | 18 ++-- .../components/AvailabilityEditSheet.tsx | 6 +- .../components/EventScheduleItem.tsx | 2 +- .../UserTable/EditSheet/EditUserForm.tsx | 101 +++++++++--------- apps/web/public/static/locales/en/common.json | 14 ++- .../form/inputs/MultiOptionInput.tsx | 2 +- 15 files changed, 92 insertions(+), 82 deletions(-) diff --git a/apps/web/app/(use-page-wrapper)/apps/routing-forms/forms/[[...pages]]/Forms.tsx b/apps/web/app/(use-page-wrapper)/apps/routing-forms/forms/[[...pages]]/Forms.tsx index f9a6b4f80a..1f0f4bc486 100644 --- a/apps/web/app/(use-page-wrapper)/apps/routing-forms/forms/[[...pages]]/Forms.tsx +++ b/apps/web/app/(use-page-wrapper)/apps/routing-forms/forms/[[...pages]]/Forms.tsx @@ -159,8 +159,8 @@ export default function RoutingForms({ appUrl }: { appUrl: string }) { subtitle={t("routing_forms_description")}> } @@ -168,7 +168,7 @@ export default function RoutingForms({ appUrl }: { appUrl: string }) {
} /> diff --git a/apps/web/components/apps/routing-forms/FormActions.tsx b/apps/web/components/apps/routing-forms/FormActions.tsx index cb78efa728..8f11874430 100644 --- a/apps/web/components/apps/routing-forms/FormActions.tsx +++ b/apps/web/components/apps/routing-forms/FormActions.tsx @@ -173,10 +173,7 @@ export const FormActionsDropdown = ({ type="button" variant="icon" color="secondary" - className={classNames( - disabled && "opacity-30", - "ltr:radix-state-open:rounded-r-(--btn-group-radius) rtl:radix-state-open:rounded-l-(--btn-group-radius)" - )} + className={classNames(disabled && "opacity-30")} StartIcon="ellipsis" /> diff --git a/apps/web/modules/data-table/components/DataTable.tsx b/apps/web/modules/data-table/components/DataTable.tsx index fca0356287..7d56e956a4 100644 --- a/apps/web/modules/data-table/components/DataTable.tsx +++ b/apps/web/modules/data-table/components/DataTable.tsx @@ -173,7 +173,8 @@ export function DataTable({ width: `var(--header-${kebabCase(header?.id)}-size)`, }} className={classNames( - "relative flex shrink-0 items-center", + "relative flex items-center", + column.columnDef.meta?.autoWidth ? "grow" : "shrink-0", "bg-cal-muted", column.getIsPinned() && "top-0 z-20 sm:sticky" )}> diff --git a/apps/web/modules/ee/workflows/components/AddActionDialog.tsx b/apps/web/modules/ee/workflows/components/AddActionDialog.tsx index b878f83ea3..bfc2cfd36d 100644 --- a/apps/web/modules/ee/workflows/components/AddActionDialog.tsx +++ b/apps/web/modules/ee/workflows/components/AddActionDialog.tsx @@ -143,7 +143,7 @@ export const AddActionDialog = (props: IAddActionDialog) => { return ( -
+
{ diff --git a/apps/web/modules/ee/workflows/components/WorkflowCreationDialog.tsx b/apps/web/modules/ee/workflows/components/WorkflowCreationDialog.tsx index 243fb319db..113576b8c1 100644 --- a/apps/web/modules/ee/workflows/components/WorkflowCreationDialog.tsx +++ b/apps/web/modules/ee/workflows/components/WorkflowCreationDialog.tsx @@ -168,7 +168,7 @@ export function WorkflowCreationDialog({ type="button" onClick={handleContinue} loading={createMutation.isPending || isLoading}> - {t("continue")} + {t("create")} diff --git a/apps/web/modules/event-types/components/EventTypeLayout.tsx b/apps/web/modules/event-types/components/EventTypeLayout.tsx index 9a20565a06..a8f04704fc 100644 --- a/apps/web/modules/event-types/components/EventTypeLayout.tsx +++ b/apps/web/modules/event-types/components/EventTypeLayout.tsx @@ -135,7 +135,7 @@ function EventTypeSingleLayout({ formMethods.watch("hidden") ? t("show_eventtype_on_profile") : t("hide_from_profile") } side="bottom"> -
+
{ const { t } = useLocale(); @@ -30,7 +31,7 @@ const CalVideoSettings = ({ calVideoSettings }: { calVideoSettings?: CalVideoSet aria-expanded={isExpanded} onClick={() => setIsExpanded(!isExpanded)} className={classNames( - "todesktop:py-[7px] text-default group flex w-full items-center rounded-md px-2 py-1.5 text-sm font-medium transition", + "cursor-pointer todesktop:py-[7px] text-default group flex w-full items-center rounded-md px-2 pt-1.5 text-sm font-medium transition", "[&[aria-current='page']]:!bg-transparent", "[&[aria-current='page']]:text-emphasis mt-0.5 text-sm" )}> @@ -169,7 +170,7 @@ const CalVideoSettings = ({ calVideoSettings }: { calVideoSettings?: CalVideoSet /> {t("redirect_url")}
} defaultValue={calVideoSettings?.redirectUrlOnExit || ""} data-testid="calVideoSettings.redirectUrlOnExit" containerClassName="mt-4" diff --git a/apps/web/modules/settings/my-account/general-view.tsx b/apps/web/modules/settings/my-account/general-view.tsx index c124c00a63..31d6ad532f 100644 --- a/apps/web/modules/settings/my-account/general-view.tsx +++ b/apps/web/modules/settings/my-account/general-view.tsx @@ -24,6 +24,7 @@ import { showToast } from "@calcom/ui/components/toast"; import { revalidateTravelSchedules } from "@calcom/web/app/cache/travelSchedule"; import TravelScheduleModal from "@components/settings/TravelScheduleModal"; +import { Icon } from "@calcom/ui/components/icon"; export type FormValues = { locale: { @@ -317,6 +318,7 @@ const GeneralView = ({ user, travelSchedules }: GeneralViewProps) => { )} />
+ {t("timeformat_profile_hint")}
)} {IS_CALCOM && ( -
+
+
)} {!displayEmailForm && ( -
+
{/* Upper Row */} -
- {isGoogleLoginEnabled ? ( + {isGoogleLoginEnabled && ( +
- ) : null} -
+
+ )} {isGoogleLoginEnabled && ( -
+
@@ -680,7 +680,7 @@ export default function Signup({ )} {/* Lower Row */} -
+
- @@ -299,9 +302,9 @@ function AttributesList(props: { selectedUserId: number }) { const attribute = attributes?.find((attr) => attr.id === attributeId); return attribute ? attribute.options.map((option) => ({ - value: option.id, - label: option.value, - })) + value: option.id, + label: option.value, + })) : []; }; @@ -403,17 +406,17 @@ function AttributesList(props: { selectedUserId: number }) { const updatedOptions = attr.type === "MULTI_SELECT" ? valueAsArray.map((v) => ({ - label: v.label, - value: v.value, - weight: v.weight || 100, - })) + label: v.label, + value: v.value, + weight: v.weight || 100, + })) : [ - { - label: valueAsArray[0].label, - value: valueAsArray[0].value, - weight: valueAsArray[0].weight || 100, - }, - ]; + { + label: valueAsArray[0].label, + value: valueAsArray[0].value, + weight: valueAsArray[0].weight || 100, + }, + ]; field.onChange({ id: attr.id, diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index 5835684331..e4a28093b6 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -1296,7 +1296,7 @@ "apps_description": "Here you can find a list of your apps", "apps_listing": "App listing", "category_apps": "{{category}} apps", - "app_store": "App Store", + "app_store": "App store", "app_store_description": "Connecting people, technology and the workplace.", "connect_your_video": "Connect your video conferencing app", "settings": "Settings", @@ -1850,6 +1850,7 @@ "apply_to_all_teams": "Apply to all team and user event types", "which_team_apply": "Which team will this apply to?", "no_workflows_description": "Workflows enable simple automation to send notifications & reminders enabling you to build processes around your events.", + "no_workflows_description_v2": "Automate event reminders and notifications", "timeformat_profile_hint": "This is an internal setting and will not affect how times are displayed on public booking pages for you or anyone booking you.", "create_workflow": "Create a workflow", "do_this": "Do this", @@ -2050,8 +2051,8 @@ "exchange_version_2015": "2015", "exchange_version_2016": "2016", "routing": "Routing", - "routing_forms_description": "Create forms to direct attendees to the correct destinations", - "routing_forms_send_email_owner": "Send Email to Owner", + "routing_forms_description": "Create forms to direct attendees to the correct hosts", + "routing_forms_send_email_owner": "Send email to owner", "routing_forms_send_email_owner_description": "Sends an email to the owner when the form is submitted", "routing_forms_send_email_to": "Send Email to", "add_new_form": "Add new form", @@ -2469,6 +2470,7 @@ "no_entries_description": "Add an email/domain to get started.", "duplicate_email": "Email is duplicate", "enter_redirect_url_on_exit_description": "Enter a redirect URL to which the attendee will be sent once they leave the meeting.", + "redirect_url": "Redirect URL", "booking_with_payment_cancelled": "Paying for this event is no longer possible", "booking_with_payment_cancelled_already_paid": "A refund for this booking payment is on its way.", "booking_with_payment_cancelled_refunded": "This booking payment has been refunded.", @@ -3130,7 +3132,7 @@ "organization_price_per_user_month": "$37 per user per month", "privacy_organization_description": "Manage privacy settings for your organization", "privacy": "Privacy", - "privacy_and_security": "Privacy & Security", + "privacy_and_security": "Privacy & security", "team_will_be_under_org": "New teams will be under your organization", "add_group_name": "Add group name", "group_name": "Group name", @@ -4533,6 +4535,10 @@ "enabled_via_auto_opt_in": "Enabled via auto opt-in", "account_already_exists_please_login": "An account with this email already exists. Please log in to accept the invitation.", "unverified_email_oauth_error": "Please verify your email address before signing in with Google or SAML. Sign in with your password to resend the verification email.", + "availability_schedule": "Availability schedule", + "connect_your_first_calendar": "Connect your first calendar", + "routing_that_grows_with_you": "Routing that grows with you", + "routing_forms_upgrade_description": "Create simple forms that guide bookings to the right person, team, or event. Start solo, then seamlessly route meetings as more people or use cases come into play. Available on the Teams plan.", "pbac_resource_feature_opt_in": "Feature Opt-In", "pbac_desc_view_feature_opt_in": "View feature opt-in settings", "pbac_desc_update_feature_opt_in": "Manage feature opt-in settings", diff --git a/packages/ui/components/form/inputs/MultiOptionInput.tsx b/packages/ui/components/form/inputs/MultiOptionInput.tsx index 2ede89b135..ad41d8c80c 100644 --- a/packages/ui/components/form/inputs/MultiOptionInput.tsx +++ b/packages/ui/components/form/inputs/MultiOptionInput.tsx @@ -305,7 +305,7 @@ export const MultiOptionInput = ({ color={addOptionButtonColor} StartIcon="plus" onClick={addOption} - className="mt-4 border-none" + className="border-none" disabled={disabled}> {addOptionLabel}