Merge branch 'main' into feat/signup-refactor

pull/11421/merge^2
sean-brydon 2023-09-27 10:33:12 +01:00 committed by GitHub
commit b95c884ddc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 196 additions and 32 deletions

View File

@ -44,4 +44,5 @@ jobs:
with:
header: pr-title-lint-error
message: |
Thank you for following the naming conventions! 🙏
Thank you for following the naming conventions! 🙏 Feel free to join our [discord](https://go.cal.com/discord) and post your PR link to [collect XP and win prizes!](https://cal.com/blog/community-incentives)

View File

@ -22,6 +22,6 @@ jobs:
repo-token: ${{ secrets.GITHUB_TOKEN }}
pr-message: |-
Thank you for making your first Pull Request and taking the time to improve Cal.com ! ❤️🎉
Feel free to join the conversation at [discord](https://go.cal.com/discord)
Feel free to join our [discord](https://go.cal.com/discord) and post your PR link to [collect XP and win prizes!](https://cal.com/blog/community-incentives)
issue-message: |
Thank you for opening your first issue, one of our team members will review it as soon as it possible. ❤️🎉

View File

@ -1,5 +1,5 @@
import type { EventTypeSetup, FormValues } from "pages/event-types/[type]";
import { useState, memo } from "react";
import { useState, memo, useEffect } from "react";
import { Controller, useFormContext } from "react-hook-form";
import type { OptionProps, SingleValueProps } from "react-select";
import { components } from "react-select";
@ -164,9 +164,8 @@ const EventTypeSchedule = ({ eventType }: { eventType: EventTypeSetup }) => {
t("locked_fields_admin_description"),
t("locked_fields_member_description")
);
const { watch } = useFormContext<FormValues>();
const { watch, setValue, getValues } = useFormContext<FormValues>();
const watchSchedule = watch("schedule");
const formMethods = useFormContext<FormValues>();
const [options, setOptions] = useState<AvailabilityOption[]>([]);
const { isLoading } = trpc.viewer.availability.list.useQuery(undefined, {
@ -214,7 +213,7 @@ const EventTypeSchedule = ({ eventType }: { eventType: EventTypeSetup }) => {
setOptions(options);
const scheduleId = formMethods.getValues("schedule");
const scheduleId = getValues("schedule");
const value = options.find((option) =>
scheduleId
? option.value === scheduleId
@ -223,11 +222,16 @@ const EventTypeSchedule = ({ eventType }: { eventType: EventTypeSetup }) => {
: option.value === schedules.find((schedule) => schedule.isDefault)?.id
);
formMethods.setValue("availability", value);
setValue("availability", value);
},
});
const availabilityValue = formMethods.watch("availability");
const availabilityValue = watch("availability");
useEffect(() => {
if (!availabilityValue?.value) return;
setValue("schedule", availabilityValue.value);
}, [availabilityValue, setValue]);
return (
<div className="space-y-4">
@ -248,7 +252,7 @@ const EventTypeSchedule = ({ eventType }: { eventType: EventTypeSetup }) => {
isSearchable={false}
onChange={(selected) => {
field.onChange(selected?.value || null);
if (selected?.value) formMethods.setValue("availability", selected);
if (selected?.value) setValue("availability", selected);
}}
className="block w-full min-w-0 flex-1 rounded-sm text-sm"
value={availabilityValue}
@ -276,7 +280,7 @@ const EventTypeSchedule = ({ eventType }: { eventType: EventTypeSetup }) => {
const UseCommonScheduleSettingsToggle = ({ eventType }: { eventType: EventTypeSetup }) => {
const { t } = useLocale();
const { resetField, setValue } = useFormContext<FormValues>();
const { setValue } = useFormContext<FormValues>();
return (
<Controller
name="metadata.config.useHostSchedulesForTeamEvent"
@ -285,9 +289,7 @@ const UseCommonScheduleSettingsToggle = ({ eventType }: { eventType: EventTypeSe
checked={!value}
onCheckedChange={(checked) => {
onChange(!checked);
if (checked) {
resetField("schedule");
} else {
if (!checked) {
setValue("schedule", null);
}
}}

View File

@ -10,8 +10,7 @@ import {
getMultipleDurationValue,
} from "@calcom/features/bookings/lib/get-booking";
import type { GetBookingType } from "@calcom/features/bookings/lib/get-booking";
import { getSlugOrRequestedSlug } from "@calcom/features/ee/organizations/lib/orgDomains";
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
import { orgDomainConfig, userOrgQuery } from "@calcom/features/ee/organizations/lib/orgDomains";
import { getUsernameList } from "@calcom/lib/defaultEvents";
import slugify from "@calcom/lib/slugify";
import prisma from "@calcom/prisma";
@ -152,7 +151,7 @@ async function getUserPageProps(context: GetServerSidePropsContext) {
const user = await prisma.user.findFirst({
where: {
username,
organization: isValidOrgDomain && currentOrgDomain ? getSlugOrRequestedSlug(currentOrgDomain) : null,
organization: userOrgQuery(context.req.headers.host ?? "", context.params?.orgSlug),
},
select: {
away: true,

View File

@ -127,7 +127,7 @@ const MobileTeamsTab: FC<MobileTeamsTabProps> = (props) => {
readOnly={events[0].metadata.readOnly}
/>
) : (
<CreateFirstEventTypeView />
<CreateFirstEventTypeView slug={eventTypeGroups[0].profile.slug ?? ""} />
)}
</div>
);
@ -363,7 +363,11 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
}, []);
if (!types.length) {
return group.teamId ? <EmptyEventTypeList group={group} /> : <CreateFirstEventTypeView />;
return group.teamId ? (
<EmptyEventTypeList group={group} />
) : (
<CreateFirstEventTypeView slug={group.profile.slug ?? ""} />
);
}
const firstItem = types[0];
@ -764,7 +768,7 @@ const EventTypeListHeading = ({
);
};
const CreateFirstEventTypeView = () => {
const CreateFirstEventTypeView = ({ slug }: { slug: string }) => {
const { t } = useLocale();
return (
@ -774,7 +778,7 @@ const CreateFirstEventTypeView = () => {
description={t("new_event_type_description")}
className="mb-16"
buttonRaw={
<Button href="?dialog=new" variant="button">
<Button href={`?dialog=new&eventPage=${slug}`} variant="button">
{t("create")}
</Button>
}
@ -915,7 +919,7 @@ const Main = ({
) : group.teamId ? (
<EmptyEventTypeList group={group} />
) : (
<CreateFirstEventTypeView />
<CreateFirstEventTypeView slug={data.profiles[0].slug ?? ""} />
)}
</div>
))
@ -931,7 +935,7 @@ const Main = ({
/>
)
)}
{data.eventTypeGroups.length === 0 && <CreateFirstEventTypeView />}
{data.eventTypeGroups.length === 0 && <CreateFirstEventTypeView slug={data.profiles[0].slug ?? ""} />}
<EventTypeEmbedDialog />
{searchParams?.get("dialog") === "duplicate" && <DuplicateDialog />}
</>

View File

@ -14,6 +14,7 @@ import { useRouterQuery } from "@calcom/lib/hooks/useRouterQuery";
import useTheme from "@calcom/lib/hooks/useTheme";
import { markdownToSafeHTML } from "@calcom/lib/markdownToSafeHTML";
import { getTeamWithMembers } from "@calcom/lib/server/queries/teams";
import slugify from "@calcom/lib/slugify";
import { stripMarkdown } from "@calcom/lib/stripMarkdown";
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
import prisma from "@calcom/prisma";
@ -271,7 +272,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
);
const flags = await getFeatureFlagMap(prisma);
const team = await getTeamWithMembers({
slug,
slug: slugify(slug ?? ""),
orgSlug: currentOrgDomain,
isTeamView: true,
isOrgView: isValidOrgDomain && context.resolvedUrl === "/",

View File

@ -252,6 +252,23 @@ test.describe("prefill", () => {
});
});
test("Persist the field values when going back and coming back to the booking form", async ({
page,
users,
}) => {
await page.goto("/pro/30min");
await selectFirstAvailableTimeSlotNextMonth(page);
await page.fill('[name="name"]', "John Doe");
await page.fill('[name="email"]', "john@example.com");
await page.fill('[name="notes"]', "Test notes");
await page.click('[data-testid="back"]');
await selectFirstAvailableTimeSlotNextMonth(page);
await expect(page.locator('[name="name"]')).toHaveValue("John Doe");
await expect(page.locator('[name="email"]')).toHaveValue("john@example.com");
await expect(page.locator('[name="notes"]')).toHaveValue("Test notes");
});
test("logged out", async ({ page, users }) => {
await page.goto("/pro/30min");

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "יש לאמת את כתובת הדוא״ל כדי להבטיח שתוכל/י לקבל הודעות לכתובת הדוא״ל וללוח השנה בצורה הטובה ביותר",
"verify_email_email_header": "יש לאמת את כתובת הדוא״ל שלך",
"verify_email_email_button": "אימות כתובת דוא״ל",
"copy_somewhere_safe": "חשוב לשמור את מפתח ה-API הזה במקום בטוח. לא תהיה אפשרות לראות אותו שוב.",
"verify_email_email_body": "נא לאמת את כתובת הדוא״ל שלך על ידי לחיצה על הכפתור להלן.",
"verify_email_by_code_email_body": "נא לאמת את כתובת הדוא״ל באמצעות הקוד שמתחת.",
"verify_email_email_link_text": "הנה הקישור, למקרה שאינך אוהב/ת ללחוץ על כפתורים:",
"email_verification_code": "הזנת קוד האימות",
"email_verification_code_placeholder": "יש להזין את קוד האימות שנשלח אליך בדוא\"ל",
"incorrect_email_verification_code": "קוד האימות שגוי.",
"email_sent": "הודעת הדוא״ל נשלחה בהצלחה",
"email_not_sent": "אירעה שגיאה בעת שליחת הדוא\"ל",
"event_declined_subject": "נדחה: {{title}} ב- {{date}}",
"event_cancelled_subject": "בוטל: {{title}} ב-{{date}}",
"event_request_declined": "בקשת האירוע שלך נדחתה",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "אירוע חוזר ממתין לאישורך",
"someone_requested_an_event": "מישהו ביקש לקבוע מועד לאירוע בלוח השנה שלך.",
"someone_requested_password_reset": "מישהו ביקש קישור כדי לשנות את הסיסמה שלך.",
"password_reset_email_sent": "אם כתובת הדוא\"ל הזו קיימת במערכת שלנו, אמור להישלח אליך דוא\"ל לאיפוס.",
"password_reset_instructions": "אם הבקשה לא היתה שלך, ניתן להתעלם מהודעת הדוא\"ל הזו בבטחה, והסיסמה שלך לא תשתנה.",
"event_awaiting_approval_subject": "ממתין לאישור: {{title}} ב- {{date}}",
"event_still_awaiting_approval": "אירוע עדיין ממתין לאישורך",
@ -217,6 +224,10 @@
"already_have_an_account": "כבר יש לך חשבון?",
"create_account": "צור חשבון",
"confirm_password": "אישור סיסמה",
"confirm_auth_change": "זה ישנה את דרך ההתחברות שלך",
"confirm_auth_email_change": "שינוי כתובת הדוא\"ל ינתק את שיטת האימות הנוכחית שמשמשת אותך לכניסה אל Cal.com. נבקש ממך לאמת את כתובת הדוא\"ל החדשה שלך. מעכשיו, המערכת תנתק אותך מהחשבון ויהיה עליך להשתמש בכתובת הדוא\"ל החדשה שלך כדי להתחבר, במקום בשיטת האימות הנוכחית שלך לאחר שתגדיר/י סיסמה לפי ההוראות שיישלחו אליך בדוא\"ל.",
"reset_your_password": "הגדר/י את הסיסמה החדשה שלך לפי ההוראות שנשלחו אל כתובת הדוא\"ל שלך.",
"email_change": "התחבר/י שוב עם כתובת הדוא\"ל החדשה והסיסמה.",
"create_your_account": "צור את החשבון שלך",
"sign_up": "הרשמה",
"youve_been_logged_out": "יצאת מהמערכת",
@ -244,6 +255,9 @@
"yours": "החשבון שלך",
"available_apps": "אפליקציות זמינות",
"available_apps_lower_case": "אפליקציות זמינות",
"available_apps_desc": "לא מותקנת אצלך אף אפליקציה. ראה/י אפליקציות פופולריות מתחת וסייר/י כדי לראות אפליקציות נוספות ב-<1>App Store</1> שלנו",
"fixed_host_helper": "הוסף/י את כל מי שצריך להשתתף באירוע. <1>מידע נוסף</1>",
"round_robin_helper": "האנשים בקבוצה משתתפים כל אחד בתורו ורק אדם אחד יגיע לאירוע.",
"check_email_reset_password": "בדוק/י בתיבת הדוא\"ל שלחנו לך קישור לאיפוס הסיסמה.",
"finish": "סיום",
"organization_general_description": "ניהול הגדרות השפה ואזור הזמן של הצוות",
@ -252,6 +266,7 @@
"nearly_there_instructions": "דבר אחרון: תיאור קצר אודותיך/ייך בתוספת תמונה עוזרים מאוד להשיג הזמנות ומאפשרים לאנשים לדעת עם מי הם עומדים להיפגש.",
"set_availability_instructions": "הגדר טווחי זמן שבהם אתה זמין באופן קבוע. ניתן יהיה ליצור טווחי זמן נוספים מאוחר יותר ולהקצות אותם ללוחות שנה אחרים.",
"set_availability": "ציין את הזמינות שלך",
"availability_settings": "הגדרות זמינוּת",
"continue_without_calendar": "להמשיך בלי לוח שנה",
"connect_your_calendar": "קשר את לוח השנה שלך",
"connect_your_video_app": "חיבור אפליקציות הווידאו שלך",
@ -393,6 +408,8 @@
"allow_dynamic_booking_tooltip": "קישורי הזמנות קבוצתיות שניתן ליצור באופן דינמי על ידי הוספת שמות משתמשים מרובים עם '+', למשל: '{{appName}}/bailey+peer'",
"allow_dynamic_booking": "לאפשר למשתתפים לשריין איתך פגישה באמצעות הזמנות קבוצתיות דינמיות",
"dynamic_booking": "קישורים לקבוצות דינמיות",
"allow_seo_indexing": "מתן אפשרות למנועי חיפוש לגשת לתוכן הציבורי שלך",
"seo_indexing": "מתן אפשרות להוספה לאינדקסים של SEO",
"email": "דוא\"ל",
"email_placeholder": "iisraeli@example.com",
"full_name": "שם מלא",
@ -407,6 +424,7 @@
"booking_requested": "התקבלה בקשת הזמנה",
"meeting_ended": "הפגישה הסתיימה",
"form_submitted": "הטופס נשלח",
"booking_paid": "בוצע תשלום עבור ההזמנה",
"event_triggers": "גורמים מפעילים של אירועים",
"subscriber_url": "כתובת URL של המנוי/ה",
"create_new_webhook": "יצירת Webhook חדש",
@ -507,6 +525,7 @@
"your_name": "שמך",
"your_full_name": "שמך המלא",
"no_name": "ללא שם",
"enter_number_between_range": "נא להזין מספר בין 1 ל-{{maxOccurences}}",
"email_address": "כתובת דוא\"ל",
"enter_valid_email": "יש להזין כתובת דוא״ל תקינה",
"location": "מיקום",
@ -544,6 +563,7 @@
"leave": "יציאה",
"profile": "פרופיל",
"my_team_url": "כתובת ה-URL של הצוות שלי",
"my_teams": "הצוותים שלי",
"team_name": "שם הצוות",
"your_team_name": "שם הצוות שלך",
"team_updated_successfully": "עדכון הצוות בוצע בהצלחה",
@ -571,6 +591,8 @@
"invite_new_member": "להזמין חבר/ת צוות חדש/ה",
"invite_new_member_description": "הערה: פעולה זו <1>תחייב את המינוי שלך במקום נוסף ($15 לחודש)</1>.",
"invite_new_team_member": "להזמין מישהו לצוות שלך.",
"upload_csv_file": "העלאת קובץ .csv",
"invite_via_email": "הזמנה בדוא\"ל",
"change_member_role": "לשנות את תפקיד החבר/ה בצוות",
"disable_cal_branding": "הסר מיתוג {{appName}}",
"disable_cal_branding_description": "הסתר את כל המיתוג של {{appName}} מהדפים הציבוריים שלך.",
@ -843,6 +865,7 @@
"team_view_user_availability_disabled": "כדי להציג את זמינות הצוות, המשתמש חייב לאשר את ההזמנה",
"set_as_away": "הגדר/י את הסטטוס שלך כ'לא נמצא/ת'",
"set_as_free": "השבתת הסטטוס 'לא נמצא/ת'",
"toggle_away_error": "שגיאה בעת עדכון סטטוס 'לא נמצא/ת'",
"user_away": "משתמש זה מוגדר כעת כ'לא נמצא/ת'.",
"user_away_description": "האדם שניסית לשריין איתו חלון זמן הגדיר את עצמו כ'לא נמצא/ת', ולכן הוא אינו מקבל הזמנות חדשות.",
"meet_people_with_the_same_tokens": "לפגוש אנשים עם אותם טוקנים",
@ -852,6 +875,7 @@
"account_managed_by_identity_provider_description": "כדי לשנות את כתובת הדוא\"ל ואת הסיסמה, לאפשר אימות דו-גורמי ועוד, יש לעבור אל הגדרות החשבון אצל {{provider}}.",
"signin_with_google": "כניסה עם Google",
"signin_with_saml": "כניסה עם SAML",
"signin_with_saml_oidc": "כניסה עם SAML/OIDC",
"you_will_need_to_generate": "תצטרך ליצור טוקן גישה מהכלי הישן שבו השתמשת לקביעת מועדים.",
"import": "ייבוא",
"import_from": "ייבוא מ",
@ -951,6 +975,8 @@
"offer_seats_description": "הצעת מקומות להזמנות (אפשרות זו משביתה באופן אוטומטי אישורי הזמנות ואורחים).",
"seats_available_one": "מקום זמין",
"seats_available_other": "מקומות זמינים",
"seats_nearly_full": "כמעט כל המקומות תפוסים",
"seats_half_full": "המקומות מתמלאים במהירות",
"number_of_seats": "מספר המקומות לכל הזמנה",
"enter_number_of_seats": "יש להזין את מספר המקומות",
"you_can_manage_your_schedules": "ניתן לנהל את לוחות הזמנים בדף 'זמינות'.",
@ -1031,12 +1057,14 @@
"how_you_want_add_cal_site": "איך ברצונך להוסיף את {{appName}} לאתר שלך?",
"choose_ways_put_cal_site": "בחר/י אחת מהדרכים הבאות כדי לשלב את {{appName}} באתר שלך.",
"setting_up_zapier": "המערכת מגדירה את השילוב שלך עם Zapier",
"setting_up_make": "המערכת מגדירה את השילוב שלך עם Make",
"generate_api_key": "יצירת מפתח ממשק תכנות יישומים (API)",
"generate_api_key_description": "צור מפתח ממשק מפתחים, API, לשימוש עם {{appName}} ב-",
"your_unique_api_key": "מפתח ה-API הייחודי שלך",
"copy_safe_api_key": "העתק/י את מפתח ה-API הזה ושמור/י אותו במקום בטוח. אם תאבד/י אותו, יהיה עליך ליצור מפתח חדש.",
"zapier_setup_instructions": "<0>התחבר/י לחשבון Zapier שלך וצור/י Zap חדש.</0><1>בחר/י את Cal.com כאפליקציית ה-Trigger. בנוסף, בחר/י אירוע Trigger.</1><2>בחר/י את החשבון שלך ולאחר מכן הזן/י את מפתח ה-API הייחודי שלך.</2><3>בדוק/י את ה-Trigger.</3><4>וזהו, הכל מוכן!</4>",
"install_zapier_app": "תחילה עליך להוריד את אפליקציית Zapier מה-App Store ולהתקין אותה.",
"install_make_app": "תחילה עליך להוריד את אפליקציית Make מה-App Store ולהתקין אותה.",
"connect_apple_server": "חיבור לשרת Apple",
"calendar_url": "כתובת ה-URL של לוח השנה",
"apple_server_generate_password": "צור סיסמה ספציפית לאפליקציה שתשמש עבור {{appName}} ב-",
@ -1086,6 +1114,7 @@
"email_attendee_action": "שליחת דוא\"ל למשתתפים",
"sms_attendee_action": "שליחת SMS למשתתף",
"sms_number_action": "שלח SMS למספר מסוים",
"send_reminder_sms": "שלח/י למשתתפים תזכורות לפגישות ב-SMS בקלות",
"whatsapp_number_action": "שליחת Whatsapp למספר מסוים",
"whatsapp_attendee_action": "שליחת Whatsapp למשתתף",
"workflows": "תהליכים",
@ -1245,6 +1274,7 @@
"error_updating_settings": "שגיאה בעדכון ההגדרות",
"personal_cal_url": "כתובת ה-URL האישית שלי של {{appName}}",
"bio_hint": "מספר משפטים אודותיך. המידע הזה יופיע בדף ה-URL האישי שלך.",
"user_has_no_bio": "משתמש זה עדיין לא הוסיף ביוגרפיה.",
"delete_account_modal_title": "מחיקת החשבון",
"confirm_delete_account_modal": "בטוח שברצונך למחוק את חשבון {{appName}} שלך?",
"delete_my_account": "מחיקת החשבון שלי",
@ -1427,6 +1457,7 @@
"add_limit": "הוספת הגבלה",
"team_name_required": "נדרש שם צוות",
"show_attendees": "שיתוף האורחים בפרטי המשתתפים",
"show_available_seats_count": "הצגת מספר המקומות הפנויים",
"how_booking_questions_as_variables": "איך משתמשים בשאלות הזמנה בתור משתנים?",
"format": "פורמט",
"uppercase_for_letters": "שימוש באותיות רישיות עבור כל האותיות",
@ -1660,6 +1691,8 @@
"delete_sso_configuration_confirmation_description": "אתה בטוח שאתה רוצה למחוק את הגדרות {{connectionType}}? חברי הצוות שלך שמשתמשים ב- {{connectionType}} להזדהות לא יוכלו להשתמש בו להכנס ל- Cal.com.",
"organizer_timezone": "מארגן אזורי זמן",
"email_user_cta": "צפה בהזמנה",
"email_no_user_invite_heading_team": "הוזמנת להצטרף לצוות ב-{{appName}}",
"email_no_user_invite_heading_org": "הוזמנת להצטרף לארגון ב-{{appName}}",
"email_no_user_invite_subheading": "{{invitedBy}} הזמין אותך להצטרף לצוות שלו ב- {{appName}}. {{appName}} הינה מתזמן זימונים שמאפשר לך ולצוות שלך לזמן פגישות בלי כל הפינג פונג במיילים.",
"email_user_invite_subheading_team": "{{invitedBy}} הזמין/ה אותך להצטרף לצוות שלו/ה בשם '{{teamName}}' באפליקציה {{appName}}. אפליקציית {{appName}} היא כלי לקביעת מועדים לאירועים שמאפשר לך ולצוות שלך לתזמן פגישות בלי כל הפינג פונג במיילים.",
"email_no_user_invite_steps_intro": "נדריך אותך במספר קטן של צעדים ותוכל/י להתחיל ליהנות מקביעת מועדים עם ה-{{entity}} שלך במהירות ובלי בעיות.",
@ -1865,6 +1898,9 @@
"open_dialog_with_element_click": "לפתוח תיבת דו-שיח ב-Cal כשמישהו לוחץ על רכיב.",
"need_help_embedding": "זקוק/ה לעזרה? ניתן לעיין במדריכים שלנו בנושא הטמעת Cal ב-Wix, ב-Squarespace או ב-WordPress, לקרוא את דף השאלות הנפוצות או לסקור אפשרויות הטמעה מתקדמות.",
"book_my_cal": "הזמנה ב-Cal",
"first_name": "שם פרטי",
"last_name": "שם משפחה",
"first_last_name": "שם פרטי, שם משפחה",
"invite_as": "הזמנה בְתור",
"form_updated_successfully": "עדכון הטופס בוצע בהצלחה.",
"disable_attendees_confirmation_emails": "השבתת הודעות דוא\"ל לאישור שנשלחות כברירת מחדל עבור המשתתפים",
@ -1878,6 +1914,7 @@
"first_event_type_webhook_description": "צור/צרי את ה-Webhook הראשון שלך עבור סוג האירוע הזה",
"install_app_on": "התקנת האפליקציה ב-",
"create_for": "צור/צרי עבור",
"currency": "מטבע",
"organization_banner_description": "צור/צרי סביבות שבהן הצוותים שלך יוכלו ליצור אפליקציות, תהליכי עבודה וסוגי אירועים משותפים, עם תכונות כמו סבב וקביעת מועדים שיתופית.",
"organization_banner_title": "ניהול ארגונים עם צוותים מרובים",
"set_up_your_organization": "הגדרת הארגון שלך",
@ -1938,6 +1975,42 @@
"insights_team_filter": "צוות: {{teamName}}",
"insights_user_filter": "משתמש: {{userName}}",
"insights_subtitle": "הצגת insights לגבי ההזמנות באירועים שלך",
"location_options": "{{locationCount}} אפשרויות מיקום",
"custom_plan": "חבילה בהתאמה אישית",
"email_embed": "הטבעה בדוא\"ל",
"add_times_to_your_email": "בחר/י כמה מועדים פנויים והטבע/י אותם בדוא\"ל",
"select_time": "בחירת שעה",
"select_date": "בחירת תאריך",
"see_all_available_times": "לצפייה בכל המועדים הפנויים",
"org_team_names_example": "לדוגמה, מחלקת שיווק",
"org_team_names_example_1": "לדוגמה, מחלקת שיווק",
"org_team_names_example_2": "לדוגמה, מחלקת מכירות",
"org_team_names_example_3": "לדוגמה, מחלקת עיצוב",
"org_team_names_example_4": "לדוגמה, מחלקת הנדסה",
"org_team_names_example_5": "לדוגמה, מחלקת ניתוח נתונים",
"org_max_team_warnings": "תהיה אפשרות להוסיף עוד מחלקות או צוותים מאוחר יותר.",
"what_is_this_meeting_about": "במה עוסקת הפגישה הזו?",
"add_to_team": "הוספה לצוות",
"remove_users_from_org": "הסרת משתמשים מהארגון",
"remove_users_from_org_confirm": "בטוח שברצונך להסיר {{userCount}} משתמשים מהארגון הזה?",
"organizations": "ארגונים",
"org_admin_other_teams": "צוותים אחרים",
"attendee_first_name_variable": "השם הפרטי של המשתתף",
"attendee_last_name_variable": "שם המשפחה של המשתתף",
"me": "אני",
"member_removed": "החבר הוסר",
"my_availability": "הזמינות שלי",
"team_availability": "הזמינות של הצוות",
"your_organization_updated_sucessfully": "עדכון הארגון שלך בוצע בהצלחה",
"team_no_event_types": "אין לצוות זה אף סוג של אירוע",
"seat_options_doesnt_multiple_durations": "האפשרויות של הושבה במקומות לא תומכות במשכי זמן שונים",
"include_calendar_event": "כלילת אירוע מלוח השנה",
"recently_added": "נוספו לאחרונה",
"no_members_found": "לא נמצא אף חבר",
"event_setup_length_error": "הגדרת אירוע: משך הזמן חייב להיות לפחות דקה אחת.",
"availability_schedules": "לוחות זמנים לזמינוּת",
"view_only_edit_availability_not_onboarded": "משתמש זה לא השלים תהליך הטמעה. לא תהיה לך אפשרות להגדיר את הזמינות שלו עד שהוא יעשה זאת.",
"view_only_edit_availability": "את/ה צופה בזמינות של משתמש זה. יש לך אפשרות לערוך רק את פרטי הזמינות שלך.",
"edit_users_availability": "עריכת הזמינות של משתמש: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -283,10 +283,10 @@
"connect": "接続",
"try_for_free": "無料で試す",
"create_booking_link_with_calcom": "{{appName}} で独自の予約リンクを作成する",
"who": "誰が",
"what": "何を",
"when": "いつ",
"where": "どこで",
"who": "ホスト",
"what": "イベント",
"when": "日時",
"where": "参加方法",
"add_to_calendar": "カレンダーに追加",
"add_another_calendar": "別のカレンダーを追加",
"other": "その他",
@ -298,7 +298,7 @@
"needs_to_be_confirmed_or_rejected_recurring": "繰り返しミーティングは、まだ確認または拒否が必要です。",
"user_needs_to_confirm_or_reject_booking": "{{user}} はまだ予約を承認または拒否する必要があります",
"user_needs_to_confirm_or_reject_booking_recurring": "{{user}} は、まだ繰り返しミーティングの各予約を確認または拒否する必要があります。",
"meeting_is_scheduled": "このミーティングは予定されています",
"meeting_is_scheduled": "このミーティングを予定しました",
"meeting_is_scheduled_recurring": "繰り返しイベントがスケジュールされています",
"booking_submitted": "予約が送信されました",
"booking_submitted_recurring": "繰り返しミーティングが送信されました",

View File

@ -52,7 +52,14 @@ const getEventType = async (id: number) => {
metadata: true,
schedule: {
select: {
availability: true,
availability: {
select: {
days: true,
date: true,
startTime: true,
endTime: true,
},
},
timeZone: true,
},
},

View File

@ -461,7 +461,10 @@ function useInitialFormValues({
const session = useSession();
useEffect(() => {
(async function () {
if (Object.keys(formValues).length) return formValues;
if (Object.keys(formValues).length) {
setDefaultValues(formValues);
return;
}
if (!eventType?.bookingFields) {
return {};

View File

@ -35,6 +35,7 @@ import {
import { getBookingFieldsWithSystemFields } from "@calcom/features/bookings/lib/getBookingFields";
import { getCalEventResponses } from "@calcom/features/bookings/lib/getCalEventResponses";
import { handleWebhookTrigger } from "@calcom/features/bookings/lib/handleWebhookTrigger";
import { userOrgQuery } from "@calcom/features/ee/organizations/lib/orgDomains";
import {
allowDisablingAttendeeConfirmationEmails,
allowDisablingHostConfirmationEmails,
@ -732,6 +733,7 @@ async function handler(
const users = await prisma.user.findMany({
where: {
username: { in: dynamicUserList },
organization: userOrgQuery(req.headers.host ? req.headers.host.replace(/^https?:\/\//, "") : ""),
},
select: {
...userSelect.select,

View File

@ -64,3 +64,8 @@ export function getSlugOrRequestedSlug(slug: string) {
],
} satisfies Prisma.TeamWhereInput;
}
export function userOrgQuery(hostname: string, fallback?: string | string[]) {
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(hostname, fallback);
return isValidOrgDomain && currentOrgDomain ? getSlugOrRequestedSlug(currentOrgDomain) : null;
}

View File

@ -13,7 +13,14 @@ export const availabilityUserSelect = Prisma.validator<Prisma.UserSelect>()({
// Relationships
schedules: {
select: {
availability: true,
availability: {
select: {
date: true,
startTime: true,
endTime: true,
days: true,
},
},
timeZone: true,
id: true,
},

View File

@ -19,6 +19,7 @@ import type { TrpcSessionUser } from "@calcom/trpc/server/trpc";
import { TRPCError } from "@trpc/server";
import { getDefaultScheduleId } from "../viewer/availability/util";
import { updateUserMetadataAllowedKeys, type TUpdateProfileInputSchema } from "./updateProfile.schema";
type UpdateProfileOptions = {
@ -130,9 +131,40 @@ export const updateProfileHandler = async ({ ctx, input }: UpdateProfileOptions)
name: true,
createdDate: true,
locale: true,
schedules: {
select: {
id: true,
},
},
},
});
if (user.timeZone !== data.timeZone && updatedUser.schedules.length > 0) {
// on timezone change update timezone of default schedule
const defaultScheduleId = await getDefaultScheduleId(user.id, prisma);
if (!user.defaultScheduleId) {
// set default schedule if not already set
await prisma.user.update({
where: {
id: user.id,
},
data: {
defaultScheduleId,
},
});
}
await prisma.schedule.updateMany({
where: {
id: defaultScheduleId,
},
data: {
timeZone: data.timeZone,
},
});
}
if (hasEmailChangedOnNonCalProvider) {
// Because the email has changed, we are now attempting to use the CAL provider-
// which has no password yet. We have to send the reset password email.

View File

@ -54,6 +54,8 @@ export const createHandler = async ({ input, ctx }: CreateOptions) => {
},
};
data.timeZone = user.timeZone;
const schedule = await prisma.schedule.create({
data,
});

View File

@ -161,7 +161,14 @@ export async function getEventType(
metadata: true,
schedule: {
select: {
availability: true,
availability: {
select: {
date: true,
startTime: true,
endTime: true,
days: true,
},
},
timeZone: true,
},
},
@ -192,6 +199,7 @@ export async function getEventType(
},
},
});
if (!eventType) {
return null;
}

View File

@ -65,6 +65,7 @@
"DATOCMS_API_TOKEN",
"DATOCMS_GRAPHQL_ENDPOINT",
"DATOCMS_WEBHOOK_SECRET",
"DATOCMS_PREVIEW_SECRET",
"ENVIRONMENT_URL",
"NEXT_PUBLIC_IS_PREMIUM_NEW_PLAN",
"NEXT_PUBLIC_STRIPE_FREE_PLAN_PRICE",