From fda3192d534fc4c0b35705856f3fed7b1ea18ca5 Mon Sep 17 00:00:00 2001 From: Richard Poelderl Date: Tue, 26 Sep 2023 17:01:06 +0200 Subject: [PATCH 01/12] fix: changed Japanese translations on booking page to better match the scenario. (#10416) (#11529) Co-authored-by: sajanlamsal --- apps/web/public/static/locales/ja/common.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/web/public/static/locales/ja/common.json b/apps/web/public/static/locales/ja/common.json index 37a6660676..c7738caf5b 100644 --- a/apps/web/public/static/locales/ja/common.json +++ b/apps/web/public/static/locales/ja/common.json @@ -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": "繰り返しミーティングが送信されました", From 9084cc6677b640496079cedc5e7b4e61118f1341 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Tue, 26 Sep 2023 15:05:48 +0000 Subject: [PATCH 02/12] New Crowdin translations by Github Action --- apps/web/public/static/locales/he/common.json | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/apps/web/public/static/locales/he/common.json b/apps/web/public/static/locales/he/common.json index 734d3a5bcd..e6c5739e40 100644 --- a/apps/web/public/static/locales/he/common.json +++ b/apps/web/public/static/locales/he/common.json @@ -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 שלנו", + "fixed_host_helper": "הוסף/י את כל מי שצריך להשתתף באירוע. <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 לחודש).", "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 חדש.<1>בחר/י את Cal.com כאפליקציית ה-Trigger. בנוסף, בחר/י אירוע Trigger.<2>בחר/י את החשבון שלך ולאחר מכן הזן/י את מפתח ה-API הייחודי שלך.<3>בדוק/י את ה-Trigger.<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 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑" } From 8c8be1efa3b28f006e58c17eee48c5d1001c1676 Mon Sep 17 00:00:00 2001 From: Richard Poelderl Date: Tue, 26 Sep 2023 17:28:57 +0200 Subject: [PATCH 03/12] add preview token to `website` (#11535) --- turbo.json | 1 + 1 file changed, 1 insertion(+) diff --git a/turbo.json b/turbo.json index c6e6e41cbb..07901cc70b 100644 --- a/turbo.json +++ b/turbo.json @@ -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", From 260064c836eccbe45ed867621391a74c9f829785 Mon Sep 17 00:00:00 2001 From: Peer Richelsen Date: Tue, 26 Sep 2023 17:47:20 +0100 Subject: [PATCH 04/12] Rename merge-conflict to merge-conflict.yml --- .github/workflows/{merge-conflict => merge-conflict.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{merge-conflict => merge-conflict.yml} (100%) diff --git a/.github/workflows/merge-conflict b/.github/workflows/merge-conflict.yml similarity index 100% rename from .github/workflows/merge-conflict rename to .github/workflows/merge-conflict.yml From 7f7841fabc75ed1bfba09e2ebbc06d6e9c27edbc Mon Sep 17 00:00:00 2001 From: Peer Richelsen Date: Tue, 26 Sep 2023 17:49:49 +0100 Subject: [PATCH 05/12] Update welcome-new-contributors.yml --- .github/workflows/welcome-new-contributors.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/welcome-new-contributors.yml b/.github/workflows/welcome-new-contributors.yml index 2e238a9ba5..de934eaaa6 100644 --- a/.github/workflows/welcome-new-contributors.yml +++ b/.github/workflows/welcome-new-contributors.yml @@ -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. ❤️🎉 From 1d882e6b3bd73d3487134d29437a57f70edc51fe Mon Sep 17 00:00:00 2001 From: Peer Richelsen Date: Tue, 26 Sep 2023 17:51:02 +0100 Subject: [PATCH 06/12] Update semantic-pull-requests.yml --- .github/workflows/semantic-pull-requests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/semantic-pull-requests.yml b/.github/workflows/semantic-pull-requests.yml index 7ae42b4532..fcabef9abc 100644 --- a/.github/workflows/semantic-pull-requests.yml +++ b/.github/workflows/semantic-pull-requests.yml @@ -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) + From 79b60adf9b58bbeeea7c7c5e47850352a4e06cef Mon Sep 17 00:00:00 2001 From: Carina Wollendorfer <30310907+CarinaWolli@users.noreply.github.com> Date: Tue, 26 Sep 2023 21:41:16 +0200 Subject: [PATCH 07/12] fix: timezone of default schedule should change if profile timezone is updated (#11533) * change tz of default schedule * make sure user has at least one schedule --------- Co-authored-by: CarinaWolli --- .../loggedInViewer/updateProfile.handler.ts | 32 +++++++++++++++++++ .../availability/schedule/create.handler.ts | 2 ++ 2 files changed, 34 insertions(+) diff --git a/packages/trpc/server/routers/loggedInViewer/updateProfile.handler.ts b/packages/trpc/server/routers/loggedInViewer/updateProfile.handler.ts index c741c3f1bf..af16a06aa5 100644 --- a/packages/trpc/server/routers/loggedInViewer/updateProfile.handler.ts +++ b/packages/trpc/server/routers/loggedInViewer/updateProfile.handler.ts @@ -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. diff --git a/packages/trpc/server/routers/viewer/availability/schedule/create.handler.ts b/packages/trpc/server/routers/viewer/availability/schedule/create.handler.ts index 4117b996d6..2c1f78c74b 100644 --- a/packages/trpc/server/routers/viewer/availability/schedule/create.handler.ts +++ b/packages/trpc/server/routers/viewer/availability/schedule/create.handler.ts @@ -54,6 +54,8 @@ export const createHandler = async ({ input, ctx }: CreateOptions) => { }, }; + data.timeZone = user.timeZone; + const schedule = await prisma.schedule.create({ data, }); From 919066222bcf7f3b09305972be0da89069b9ab01 Mon Sep 17 00:00:00 2001 From: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> Date: Tue, 26 Sep 2023 17:50:10 -0400 Subject: [PATCH 08/12] fix: Dynamic events prevent fetching all users that share a username [CAL-2409] (#11288) * For dynamic search users based on org * Type fix --------- Co-authored-by: alannnc Co-authored-by: Leo Giovanetti Co-authored-by: Peer Richelsen --- apps/web/pages/[user]/[type].tsx | 5 ++--- packages/features/bookings/lib/handleNewBooking.ts | 2 ++ packages/features/ee/organizations/lib/orgDomains.ts | 5 +++++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/web/pages/[user]/[type].tsx b/apps/web/pages/[user]/[type].tsx index 2ef5eb038f..8f62d6e6ba 100644 --- a/apps/web/pages/[user]/[type].tsx +++ b/apps/web/pages/[user]/[type].tsx @@ -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, diff --git a/packages/features/bookings/lib/handleNewBooking.ts b/packages/features/bookings/lib/handleNewBooking.ts index f4890a2c1a..23eb562b74 100644 --- a/packages/features/bookings/lib/handleNewBooking.ts +++ b/packages/features/bookings/lib/handleNewBooking.ts @@ -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, diff --git a/packages/features/ee/organizations/lib/orgDomains.ts b/packages/features/ee/organizations/lib/orgDomains.ts index a405debae7..0d8051ffb7 100644 --- a/packages/features/ee/organizations/lib/orgDomains.ts +++ b/packages/features/ee/organizations/lib/orgDomains.ts @@ -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; +} From ce13350d5d7a1706d3030c0bd03290944862a07f Mon Sep 17 00:00:00 2001 From: Nafees Nazik <84864519+G3root@users.noreply.github.com> Date: Wed, 27 Sep 2023 10:09:37 +0530 Subject: [PATCH 09/12] fix: form input not being saved after "back" (#11540) Co-authored-by: Hariom Balhara --- apps/web/playwright/booking-pages.e2e.ts | 17 +++++++++++++++++ .../components/BookEventForm/BookEventForm.tsx | 5 ++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/apps/web/playwright/booking-pages.e2e.ts b/apps/web/playwright/booking-pages.e2e.ts index 9ebd29bb2d..87ac1dcf51 100644 --- a/apps/web/playwright/booking-pages.e2e.ts +++ b/apps/web/playwright/booking-pages.e2e.ts @@ -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"); diff --git a/packages/features/bookings/Booker/components/BookEventForm/BookEventForm.tsx b/packages/features/bookings/Booker/components/BookEventForm/BookEventForm.tsx index b22574e3ed..7c12ff9478 100644 --- a/packages/features/bookings/Booker/components/BookEventForm/BookEventForm.tsx +++ b/packages/features/bookings/Booker/components/BookEventForm/BookEventForm.tsx @@ -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 {}; From c275981be61284bf89b4d81dd316f00c5e04cc96 Mon Sep 17 00:00:00 2001 From: Chiranjeev Vishnoi <66114276+Chiranjeev-droid@users.noreply.github.com> Date: Wed, 27 Sep 2023 13:30:17 +0530 Subject: [PATCH 10/12] fix: profile slug added on create your first event type dialog (#11494) --- apps/web/pages/event-types/index.tsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/web/pages/event-types/index.tsx b/apps/web/pages/event-types/index.tsx index ba7c9a11b3..cee8ee06a6 100644 --- a/apps/web/pages/event-types/index.tsx +++ b/apps/web/pages/event-types/index.tsx @@ -127,7 +127,7 @@ const MobileTeamsTab: FC = (props) => { readOnly={events[0].metadata.readOnly} /> ) : ( - + )} ); @@ -363,7 +363,11 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL }, []); if (!types.length) { - return group.teamId ? : ; + return group.teamId ? ( + + ) : ( + + ); } 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={ - } @@ -915,7 +919,7 @@ const Main = ({ ) : group.teamId ? ( ) : ( - + )} )) @@ -931,7 +935,7 @@ const Main = ({ /> ) )} - {data.eventTypeGroups.length === 0 && } + {data.eventTypeGroups.length === 0 && } {searchParams?.get("dialog") === "duplicate" && } From 8a413a97b42b3994b0b7705a1dc478fa72aa222a Mon Sep 17 00:00:00 2001 From: Denzil Samuel <71846487+samueldenzil@users.noreply.github.com> Date: Wed, 27 Sep 2023 14:20:04 +0530 Subject: [PATCH 11/12] fix: allow different casing for team (#11546) --- apps/web/pages/team/[slug].tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/web/pages/team/[slug].tsx b/apps/web/pages/team/[slug].tsx index ce6aa2ce86..b557bf41e8 100644 --- a/apps/web/pages/team/[slug].tsx +++ b/apps/web/pages/team/[slug].tsx @@ -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 === "/", From ec4e2f5996937267620333d7f5c42eb025bcd91f Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Wed, 27 Sep 2023 10:26:55 +0100 Subject: [PATCH 12/12] fix: Blank state wouldn't set 'schedule'; resulting toggle had no effect (#11335) --- .../eventtype/EventAvailabilityTab.tsx | 24 ++++++++++--------- packages/core/getUserAvailability.ts | 9 ++++++- packages/prisma/selects/user.ts | 9 ++++++- .../trpc/server/routers/viewer/slots/util.ts | 10 +++++++- 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/apps/web/components/eventtype/EventAvailabilityTab.tsx b/apps/web/components/eventtype/EventAvailabilityTab.tsx index 48e72eb349..07ed8a9515 100644 --- a/apps/web/components/eventtype/EventAvailabilityTab.tsx +++ b/apps/web/components/eventtype/EventAvailabilityTab.tsx @@ -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(); + const { watch, setValue, getValues } = useFormContext(); const watchSchedule = watch("schedule"); - const formMethods = useFormContext(); const [options, setOptions] = useState([]); 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 (
@@ -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(); + const { setValue } = useFormContext(); return ( { onChange(!checked); - if (checked) { - resetField("schedule"); - } else { + if (!checked) { setValue("schedule", null); } }} diff --git a/packages/core/getUserAvailability.ts b/packages/core/getUserAvailability.ts index c683a3aa04..07ea15a0fe 100644 --- a/packages/core/getUserAvailability.ts +++ b/packages/core/getUserAvailability.ts @@ -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, }, }, diff --git a/packages/prisma/selects/user.ts b/packages/prisma/selects/user.ts index 9c62e70275..dffa09a298 100644 --- a/packages/prisma/selects/user.ts +++ b/packages/prisma/selects/user.ts @@ -13,7 +13,14 @@ export const availabilityUserSelect = Prisma.validator()({ // Relationships schedules: { select: { - availability: true, + availability: { + select: { + date: true, + startTime: true, + endTime: true, + days: true, + }, + }, timeZone: true, id: true, }, diff --git a/packages/trpc/server/routers/viewer/slots/util.ts b/packages/trpc/server/routers/viewer/slots/util.ts index 38062a6bc9..ac62bb4cd1 100644 --- a/packages/trpc/server/routers/viewer/slots/util.ts +++ b/packages/trpc/server/routers/viewer/slots/util.ts @@ -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; }