Compare commits

...
17 Commits
Author SHA1 Message Date
Keith Williams 55a8a0d2d3 v3.4.3
Auto Comment Merge Conflicts / auto-comment-merge-conflicts (push) Canceled after 0s
release.yml / release (push) Canceled after 0s
2023-10-20 13:53:48 -03:00
Crowdin Bot 3093216534 New Crowdin translations by Github Action 2023-10-20 16:52:30 +00:00
Crowdin Bot 99a1c36ffc New Crowdin translations by Github Action 2023-10-20 16:49:37 +00:00
Crowdin Bot f4e48f5fc1 New Crowdin translations by Github Action 2023-10-20 16:47:04 +00:00
c352dc647e fix: broken layout email embed generator (CALCOM-11779) (#11951)
Co-authored-by: gitstart-calcom <gitstart-calcom@users.noreply.github.com>
Co-authored-by: GitStart-Cal.com <121884634+gitstart-calcom@users.noreply.github.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2023-10-20 16:44:26 +00:00
Udit Takkar 34bb069b4a revert: feat: Shows link location (#12024) 2023-10-20 12:43:45 -03:00
Peer Richelsen 39ea9c112d chore: delete "unapproved issue" workflow (#12008) 2023-10-20 14:39:28 +00:00
e32d4648af fix: webhook overflow (#11968)
Co-authored-by: Peer Richelsen <peer@cal.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2023-10-20 14:38:52 +00:00
Crowdin Bot 20b7633ab5 New Crowdin translations by Github Action 2023-10-20 14:35:26 +00:00
6f017a7972 fix: fixed caldav app icon and text (#12016)
Co-authored-by: Peer Richelsen <peer@cal.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2023-10-20 14:32:07 +00:00
Peer Richelsen cbd0e2d287 chore: removed "set up your public profile" banner (#12001) 2023-10-20 15:31:59 +01:00
Axl ff739bf9be fix: pwa nav improvements (#11972) 2023-10-20 15:31:03 +01:00
Siddharth Movaliya ff3541910b fix: team availability slider overflow (#12020) 2023-10-20 15:27:03 +01:00
sean-brydon d043de7724 fix: overlay calendar modal (#12021) 2023-10-20 15:02:08 +01:00
sean-brydon be1517facd fix: get correct count for team members in slider (#12017) 2023-10-20 09:42:49 -03:00
kremedev 19eced00f5 fix: Unable to modify the location of a booking when rescheduling (#11651) 2023-10-20 09:00:00 +02:00
Hariom Balhara e2414b174a Handle non-org team with same slug as the organizations requestedSlug (#11996) 2023-10-20 00:05:34 +05:30
45 changed files with 275 additions and 179 deletions
@@ -1,18 +0,0 @@
name: Add comment
on:
issues:
types:
- labeled
jobs:
add-comment:
if: github.event.label.name == '🚨 needs approval'
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- name: Add comment
uses: peter-evans/create-or-update-comment@5f728c3dae25f329afbe34ee4d08eef25569d79f
with:
issue-number: ${{ github.event.issue.number }}
body: |
This feature request has not been reviewed yet by the Product Team and needs approval beforehand. Once approved, this issue is available for anyone to work on. **Make sure to reference this issue in your pull request.** :sparkles: Thank you for your contribution! :sparkles:
+1 -1
View File
@@ -58,7 +58,7 @@ function PageWrapper(props: AppProps) {
<Head>
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, viewport-fit=cover"
/>
</Head>
<DefaultSeo
@@ -88,10 +88,6 @@ function BookingListItem(booking: BookingItemProps) {
const isRecurring = booking.recurringEventId !== null;
const isTabRecurring = booking.listingStatus === "recurring";
const isTabUnconfirmed = booking.listingStatus === "unconfirmed";
const eventLocationType = getEventLocationType(booking.location);
const meetingLink = booking.references[0]?.meetingUrl
? booking.references[0]?.meetingUrl
: booking.location;
const paymentAppData = getPaymentAppData(booking.eventType);
@@ -357,27 +353,6 @@ function BookingListItem(booking: BookingItemProps) {
attendees={booking.attendees}
/>
</div>
{!isPending && (eventLocationType || booking.location?.startsWith("https://")) && (
<Link
href={meetingLink ? meetingLink.toString() : ""}
className="text-sm leading-6 text-blue-400 hover:underline">
<div className="flex items-center gap-2">
{eventLocationType ? (
<>
<img
src={eventLocationType.iconUrl}
className="h-4 w-4 rounded-sm"
alt={`${eventLocationType.label} logo`}
/>
{t("join_event_location", { eventLocationType: eventLocationType.label })}
</>
) : (
t("join_meeting")
)}
</div>
</Link>
)}
{isPending && (
<Badge className="ltr:mr-2 rtl:ml-2" variant="orange">
{t("unconfirmed")}
+1 -1
View File
@@ -235,7 +235,7 @@ const nextConfig = {
? [
{
...matcherConfigRootPath,
destination: "/team/:orgSlug",
destination: "/team/:orgSlug?isOrgProfile=1",
},
{
...matcherConfigUserRoute,
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@calcom/web",
"version": "3.4.2",
"version": "3.4.3",
"private": true,
"scripts": {
"analyze": "ANALYZE=true next build",
+57 -11
View File
@@ -115,6 +115,13 @@ export default function Success(props: SuccessProps) {
const tz = props.tz ? props.tz : isSuccessBookingPage && attendeeTimeZone ? attendeeTimeZone : timeZone();
const location = props.bookingInfo.location as ReturnType<typeof getEventLocationValue>;
let rescheduleLocation: string | undefined;
if (
typeof props.bookingInfo.responses.location === "object" &&
"optionValue" in props.bookingInfo.responses.location
) {
rescheduleLocation = props.bookingInfo.responses.location.optionValue;
}
const locationVideoCallUrl: string | undefined = bookingMetadataSchema.parse(
props?.bookingInfo?.metadata || {}
@@ -295,7 +302,14 @@ export default function Success(props: SuccessProps) {
bookingInfo.status
);
const rescheduleLocationToDisplay = getSuccessPageLocationMessage(
rescheduleLocation ?? "",
t,
bookingInfo.status
);
const providerName = guessEventLocationType(location)?.label;
const rescheduleProviderName = guessEventLocationType(rescheduleLocation)?.label;
return (
<div className={isEmbed ? "" : "h-screen"} data-testid="success-page">
@@ -467,18 +481,50 @@ export default function Success(props: SuccessProps) {
<>
<div className="mt-3 font-medium">{t("where")}</div>
<div className="col-span-2 mt-3" data-testid="where">
{locationToDisplay.startsWith("http") ? (
<a
href={locationToDisplay}
target="_blank"
title={locationToDisplay}
className="text-default flex items-center gap-2 underline"
rel="noreferrer">
{providerName || "Link"}
<ExternalLink className="text-default inline h-4 w-4" />
</a>
{!rescheduleLocation || locationToDisplay === rescheduleLocationToDisplay ? (
locationToDisplay.startsWith("http") ? (
<a
href={locationToDisplay}
target="_blank"
title={locationToDisplay}
className="text-default flex items-center gap-2"
rel="noreferrer">
{providerName || "Link"}
<ExternalLink className="text-default inline h-4 w-4" />
</a>
) : (
locationToDisplay
)
) : (
locationToDisplay
<>
{!!formerTime &&
(locationToDisplay.startsWith("http") ? (
<a
href={locationToDisplay}
target="_blank"
title={locationToDisplay}
className="text-default flex items-center gap-2 line-through"
rel="noreferrer">
{providerName || "Link"}
<ExternalLink className="text-default inline h-4 w-4" />
</a>
) : (
<p className="line-through">{locationToDisplay}</p>
))}
{rescheduleLocationToDisplay.startsWith("http") ? (
<a
href={rescheduleLocationToDisplay}
target="_blank"
title={rescheduleLocationToDisplay}
className="text-default flex items-center gap-2"
rel="noreferrer">
{rescheduleProviderName || "Link"}
<ExternalLink className="text-default inline h-4 w-4" />
</a>
) : (
rescheduleLocationToDisplay
)}
</>
)}
</div>
</>
-30
View File
@@ -65,7 +65,6 @@ import {
MoreHorizontal,
Trash,
Upload,
User as UserIcon,
Users,
} from "@calcom/ui/components/icon";
@@ -821,34 +820,6 @@ const Actions = () => {
);
};
const SetupProfileBanner = ({ closeAction }: { closeAction: () => void }) => {
const { t } = useLocale();
const orgBranding = useOrgBranding();
return (
<Alert
className="my-4"
severity="info"
title={t("set_up_your_profile")}
message={t("set_up_your_profile_description", { orgName: orgBranding?.name })}
CustomIcon={UserIcon}
actions={
<div className="flex gap-1">
<Button color="minimal" className="text-sky-700 hover:bg-sky-100" onClick={closeAction}>
{t("dismiss")}
</Button>
<Button
color="secondary"
className="border-sky-700 bg-sky-50 text-sky-700 hover:border-sky-900 hover:bg-sky-200"
href="/getting-started">
{t("set_up")}
</Button>
</div>
}
/>
);
};
const EmptyEventTypeList = ({ group }: { group: EventTypeGroup }) => {
const { t } = useLocale();
return (
@@ -984,7 +955,6 @@ const EventTypesPage = () => {
heading={t("event_types_page_title")}
hideHeadingOnMobile
subtitle={t("event_types_page_subtitle")}
afterHeading={showProfileBanner && <SetupProfileBanner closeAction={closeBanner} />}
beforeCTAactions={<Actions />}
CTA={<CTA data={data} />}>
<HeadSeo
+22 -9
View File
@@ -1,3 +1,9 @@
// This route is reachable by
// 1. /team/[slug]
// 2. / (when on org domain e.g. http://calcom.cal.com/. This is through a rewrite from next.config.js)
// Also the getServerSideProps and default export are reused by
// 1. org/[orgSlug]/team/[slug]
// 2. org/[orgSlug]/[user]/[type]
import classNames from "classnames";
import type { GetServerSidePropsContext } from "next";
import Link from "next/link";
@@ -12,6 +18,7 @@ import { WEBAPP_URL } from "@calcom/lib/constants";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { useRouterQuery } from "@calcom/lib/hooks/useRouterQuery";
import useTheme from "@calcom/lib/hooks/useTheme";
import logger from "@calcom/lib/logger";
import { markdownToSafeHTML } from "@calcom/lib/markdownToSafeHTML";
import { getTeamWithMembers } from "@calcom/lib/server/queries/teams";
import slugify from "@calcom/lib/slugify";
@@ -34,7 +41,7 @@ import { ssrInit } from "@server/lib/ssr";
import { getTemporaryOrgRedirect } from "../../lib/getTemporaryOrgRedirect";
export type PageProps = inferSSRProps<typeof getServerSideProps>;
const log = logger.getSubLogger({ prefix: ["team/[slug]"] });
function TeamPage({
team,
isUnpublished,
@@ -277,12 +284,23 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
);
const isOrgContext = isValidOrgDomain && currentOrgDomain;
// Provided by Rewrite from next.config.js
const isOrgProfile = context.query?.isOrgProfile === "1";
const flags = await getFeatureFlagMap(prisma);
const isOrganizationFeatureEnabled = flags["organizations"];
log.debug("getServerSideProps", {
isOrgProfile,
isOrganizationFeatureEnabled,
isValidOrgDomain,
currentOrgDomain,
});
const team = await getTeamWithMembers({
slug: slugify(slug ?? ""),
orgSlug: currentOrgDomain,
isTeamView: true,
isOrgView: isValidOrgDomain && context.resolvedUrl === "/",
isOrgView: isValidOrgDomain && isOrgProfile,
});
if (!isOrgContext && slug) {
@@ -299,17 +317,12 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
const ssr = await ssrInit(context);
const metadata = teamMetadataSchema.parse(team?.metadata ?? {});
console.info("gSSP, team/[slug] - ", {
isValidOrgDomain,
currentOrgDomain,
ALLOWED_HOSTNAMES: process.env.ALLOWED_HOSTNAMES,
flags: JSON.stringify(flags),
});
// Taking care of sub-teams and orgs
if (
(!isValidOrgDomain && team?.parent) ||
(!isValidOrgDomain && !!metadata?.isOrganization) ||
flags["organizations"] !== true
!isOrganizationFeatureEnabled
) {
return { notFound: true } as const;
}
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "هذه المنظمة ليس لديها فرق بعد",
"org_no_teams_yet_description": "إذا كنت مسؤول، تأكد من إنشاء فرق لعرضها هنا.",
"set_up": "الإعداد",
"set_up_your_profile": "إعداد ملفك الشخصي",
"set_up_your_profile_description": "دع الناس يعرفون من أنت داخل {{orgName}}، ومتى يتعاملون مع الرابط العام الخاص بك.",
"my_profile": "الملف الشخصي",
"my_settings": "الإعدادات",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "Tato organizace zatím neobsahuje žádné týmy",
"org_no_teams_yet_description": "Pokud jste správce, nezapomeňte vytvořit týmy, které se zde budou zobrazovat.",
"set_up": "Nastavení",
"set_up_your_profile": "Nastavení profilu",
"set_up_your_profile_description": "Dejte lidem vědět, co v rámci organizace {{orgName}} děláte, pokud si otevřou váš veřejný odkaz.",
"my_profile": "Můj profil",
"my_settings": "Moje nastavení",
"crm": "CRM",
@@ -1965,8 +1965,6 @@
"org_no_teams_yet": "Diese Organization hat noch keine Teams",
"org_no_teams_yet_description": "Falls Sie ein Administrator sind, sollten Sie unbedingt Teams erstellen, welche hier angezeigt werden können.",
"set_up": "Einrichten",
"set_up_your_profile": "Richten Sie Ihr Profil ein",
"set_up_your_profile_description": "Lassen Sie Leute beim Klicken auf Ihren öffentlichen Link wissen, welche Funktion Sie innerhalb von {{orgName}} haben.",
"my_profile": "Mein Profil",
"my_settings": "Meine Einstellungen",
"crm": "CRM",
@@ -1972,8 +1972,6 @@
"org_no_teams_yet": "This organization has no teams yet",
"org_no_teams_yet_description": "If you are an administrator, be sure to create teams to be shown here.",
"set_up": "Set up",
"set_up_your_profile": "Set up your profile",
"set_up_your_profile_description": "Let people know who you are within {{orgName}}, and when they engage with your public link.",
"my_profile": "My Profile",
"my_settings": "My Settings",
"crm": "CRM",
@@ -2095,7 +2093,5 @@
"overlay_my_calendar":"Overlay my calendar",
"overlay_my_calendar_toc":"By connecting to your calendar, you accept our privacy policy and terms of use. You may revoke access at any time.",
"view_overlay_calendar_events":"View your calendar events to prevent clashed booking.",
"join_event_location": "Join {{eventLocationType}}",
"join_meeting": "Join Meeting",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "Esta organización aún no tiene equipos",
"org_no_teams_yet_description": "Si usted es un administrador, asegúrese de crear equipos para que se muestren aquí.",
"set_up": "Configurar",
"set_up_your_profile": "Configure su perfil",
"set_up_your_profile_description": "Informe a las personas quién es usted dentro de {{orgName}} y cuándo interactúen con su enlace público.",
"my_profile": "Mi perfil",
"my_settings": "Mi configuración",
"crm": "CRM",
@@ -17,6 +17,7 @@
"verify_email_banner_body": "Egiaztatu zure email helbidea mezuak eta egutegiko eguneratzeak ahalik eta hobekien jasoko dituzula bermatzeko",
"verify_email_email_header": "Egiaztatu zure email helbidea",
"verify_email_email_button": "Egiaztatu emaila",
"copy_somewhere_safe": "Gorde API gako hau toki seguru batean. Ezingo duzu berriro ikusi.",
"verify_email_email_body": "Mesedez, egiaztatu zure email helbidea beheko botoia sakatuz.",
"verify_email_by_code_email_body": "Mesedez, egiaztatu zure email helbidea beheko kodea erabiliz.",
"verify_email_email_link_text": "Hemen duzu esteka, botoiak sakatzea gustuko ez baduzu:",
@@ -45,17 +46,25 @@
"invite_team_notifcation_badge": "Gon.",
"your_event_has_been_scheduled": "Zure gertaera programatu da",
"your_event_has_been_scheduled_recurring": "Zure gertaera errepikaria programatu da",
"accept_our_license": "Onartu gure lizentzia <1>NEXT_PUBLIC_LICENSE_CONSENT</1> .env aldagaia aldatuz honakora: '{{agree}}'.",
"remove_banner_instructions": "Baner hau ezabatzeko, mesedez zabaldu zure .env fitxategia eta aldatu <1>NEXT_PUBLIC_LICENSE_CONSENT</1> aldagaia honakora: '{{agree}}'.",
"error_message": "Errore-mezua honakoa ian da: '{{errorMessage}}'",
"refund_failed_subject": "Itzulketak huts egin du: {{name}} - {{date}} - {{eventType}}",
"refund_failed": "Huts egin du itzulketak {{eventType}} gertaerarako, {{userName}}(r)ekin {{date}}(e)an.",
"a_refund_failed": "Itzulketa batek huts egin du",
"awaiting_payment_subject": "Ordainketaren zain: {{title}} {{date}}(e)an",
"meeting_awaiting_payment": "Zure bilera ordainketa zain dago",
"help": "Laguntza",
"price": "Prezioa",
"paid": "Ordainduta",
"refunded": "Itzulita",
"payment": "Ordainketa",
"missing_card_fields": "Txartelaren eremuak falta dira",
"pay_now": "Ordaindu orain",
"terms_summary": "Terminoen laburpena",
"open_env": "Ireki .env eta onartu gure Lizentzia",
"env_changed": "Nire .env aldatu dut",
"accept_license": "Onart Lizentzia",
"still_waiting_for_approval": "Gertaera bat onarpenaren zain dago",
"event_is_still_waiting": "Gertaera-eskaera oraindik zain dago: {{attendeeName}} - {{date}} - {{eventType}}",
"no_more_results": "Emaitza gehiagorik ez",
@@ -82,12 +91,36 @@
"event_has_been_rescheduled": "Eguneratuta - Zure gertaeraren programazioa aldatu egin da",
"request_reschedule_subtitle": "{{organizer}}(e)k erreserba bertan behera utzi du eta beste denbora-tarte bat hautatzeko eskatu dizu.",
"request_reschedule_title_organizer": "Beste denbora-tarte bat hautatzeko eskatu diozu {{attendee}}(r)i",
"request_reschedule_subtitle_organizer": "Erreserba bertan behera utzi duzu eta {{attendee}}(e)k erreserba-ordu berri bat hautatu beharko du.",
"rescheduled_event_type_subject": "Berrantolatzeko eskaera bidalita: {{eventType}} {{name}}(r)ekin {{date}}(e)an",
"hi_user_name": "Kaixo {{name}}",
"ics_event_title": "{{eventType}} {{name}}(r)ekin",
"new_event_subject": "Gertaera berria: {{attendeeName}} - {{date}} - {{eventType}}",
"notes": "Oharrak",
"manage_my_bookings": "Kudeatu nire erreserbak",
"need_to_make_a_change": "Aldaketaren bat egin behar duzu?",
"new_event_scheduled": "Gertaera berri bat programatu da.",
"new_event_scheduled_recurring": "Gertaera errepikari berri bat programatu da.",
"invitee_email": "Gonbidatuaren emaila",
"invitee_timezone": "Gonbidatuaren ordu-eremua",
"event_type": "Gertaera mota",
"enter_meeting": "Sartu bilerara",
"video_call_provider": "Bideodeiaren hornitzailea",
"meeting_id": "Bileraren IDa",
"meeting_password": "Bileraren pasahitza",
"meeting_url": "Bilerarako URLa",
"meeting_request_rejected": "Zure bilera eskaera ez da onartu",
"rejected_event_type_with_organizer": "Errefusatua: {{eventType}} {{organizer}}(r)ekin {{date}}(e)an",
"hi": "Kaixo",
"join_team": "Batu taldera",
"manage_this_team": "Kudeatu talde hau",
"team_info": "Taldearen informazioa",
"you_have_been_invited": "{{teamName}} taldera batzeko gonbidatua izan zara",
"hidden_team_member_title": "Ezkutuan zaude talde honetan",
"hidden_team_owner_message": "Pro kontu bat behar duzu taldeak erabiltzeko, ezkutuan geratuko zara bitartean.",
"team_upgrade_banner_description": "Ez duzu taldea konfiguratzen bukatu. Zure \"{{teamName}}\" taldea bertsio-berritu behar duzu.",
"upgrade_banner_action": "Bertsio-berritu hemen",
"team_upgraded_successfully": "Zure taldea zuzen bertsio-berritu da!",
"use_link_to_reset_password": "Erabili beheko esteka pasahitza berrezartzeko",
"hey_there": "Kaixo,",
"forgot_your_password_calcom": "Pasahitza ahaztu duzu? - {{appName}}",
@@ -122,12 +155,66 @@
"rejected": "Baztertua",
"unconfirmed": "Baieztatu gabea",
"guests": "Gonbidatuak",
"404_claim_entity_user": "Erreklamatu zure erabiltzaile-izena eta programatu gertaerak",
"popular_pages": "Orrialde ospetsuak",
"register_now": "Izena eman orain",
"register": "Izena eman",
"page_doesnt_exist": "Orrialde hau ez dago.",
"check_spelling_mistakes_or_go_back": "Egiaztatu akats ortografikorik ez dagoela edo joan aurreko orrira.",
"404_page_not_found": "404: Orrialde hau ezin izan da aurkitu.",
"booker_event_not_found": "Ezin izan dugu aurkitu erreserbatu nahi izan duzun gertaera.",
"getting_started": "Nola hasi",
"15min_meeting": "15 minutuko bilera",
"30min_meeting": "30 minutuko bilera",
"secret": "Sekretua",
"leave_blank_to_remove_secret": "Zuri utzi sekretua ezabatzeko",
"secret_meeting": "Bilera sekretua",
"already_have_an_account": "Baduzu kontua dagoeneko?",
"create_account": "Sortu kontua",
"confirm_password": "Baieztatu pasahitza",
"reset_your_password": "Ezarri zure pasahitz berria zure email helbidera bidalitako argibideak jarraituz.",
"create_your_account": "Sortu zure kontua",
"sign_up": "Izena eman",
"youve_been_logged_out": "Saioa amaitu duzu",
"hope_to_see_you_soon": "Laster ikusiko zaitugula espero dugu!",
"logged_out": "Saioa amaituta",
"no_account_exists": "Ez dago konturik email helbide horrekin bat datorrenik.",
"create_an_account": "Sortu kontu bat",
"dont_have_an_account": "Ez duzu konturik?",
"sign_in_account": "Hasi saioa zure kontuan",
"sign_in": "Hasi saioa",
"go_back_login": "Itzuli saio-hasiera orrialdera",
"request_password_reset": "Bidali berrezartzeko emaila",
"send_invite": "Bidali gonbidapena",
"forgot_password": "Pasahitza ahaztu duzu?",
"forgot": "Ahaztuta?",
"done": "Eginda",
"all_done": "Dena eginda!",
"all": "Guztia",
"yours": "Zure kontua",
"create_booking_link_with_calcom": "Sor ezazu zeure erreserba-esteka {{appName}}(e)kin",
"user_needs_to_confirm_or_reject_booking": "{{user}}(e)k erreserba baieztatu edo errefusatu behar du oraindik.",
"meeting_is_scheduled": "Bilera hau programatuta dago",
"meeting_is_scheduled_recurring": "Gertaera errepikariak programatuta daude",
"booking_submitted": "Zure erreserba bidali da",
"booking_submitted_recurring": "Zure bilera errepikaria bidali da",
"booking_confirmed": "Zure erreserba baieztatu da",
"booking_confirmed_recurring": "Zure bilera errepikaria baieztatu da",
"reset_password": "Berrezarri pasahitza",
"change_your_password": "Aldatu zure pasahitza",
"show_password": "Erakutsi pasahitza",
"hide_password": "Ezkutatu pasahitza",
"try_again": "Saiatu berriro",
"whoops": "Hara",
"login": "Saioa hasi",
"success": "Arrakasta",
"failed": "Huts egin du",
"password_has_been_reset_login": "Zure pasahitza berrezarri da. Orain saioa has dezakezu sortu berri duzun pasahitzarekin.",
"layout": "Diseinua",
"bookerlayout_default_title": "Lehenetsitako ikuspegia",
"bookerlayout_user_settings_title": "Erreserbatarako diseinua",
"bookerlayout_month_view": "Hilabetea",
"bookerlayout_week_view": "Astero",
"bookerlayout_column_view": "Zutabea",
"back_to_bookings": "Itzuli erreserbatara",
"really_cancel_booking": "Benetan bertan behera utzi nahi duzu zure erreserba?",
@@ -1959,8 +1959,6 @@
"org_no_teams_yet": "Cette organisation n'a pas encore d'équipe",
"org_no_teams_yet_description": "Si vous êtes un administrateur, assurez-vous de créer des équipes à afficher ici.",
"set_up": "Configurer",
"set_up_your_profile": "Configurer votre profil",
"set_up_your_profile_description": "Faites savoir aux gens qui vous êtes au sein de {{orgName}} et quand ils interagissent avec votre lien public.",
"my_profile": "Mon profil",
"my_settings": "Mes paramètres",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "בארגון הזה עדיין אין צוותים",
"org_no_teams_yet_description": "אם את/ה מנהל/ת מערכת, צור/צרי צוותים שיוצגו כאן.",
"set_up": "הגדרה",
"set_up_your_profile": "הגדרת הפרופיל שלך",
"set_up_your_profile_description": "אפשר/י לאנשים לדעת מי את/ה ב-{{orgName}} וכשהם מקיימים איתך אינטראקציה באמצעות הקישור הציבורי שלך.",
"my_profile": "הפרופיל שלי",
"my_settings": "ההגדרות שלי",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "Questa organizzazione non ha ancora alcun team",
"org_no_teams_yet_description": "Se sei un amministratore, assicurati di creare dei team da mostrare qui.",
"set_up": "Imposta",
"set_up_your_profile": "Imposta il tuo profilo",
"set_up_your_profile_description": "Fai sapere agli utenti la tua posizione all'interno di {{orgName}} quando interagiscono con il tuo link pubblico.",
"my_profile": "Il mio profilo",
"my_settings": "Le mie impostazioni",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "この組織にはまだチームがありません",
"org_no_teams_yet_description": "管理者である場合には、ここに表示されるチームを必ず作成してください。",
"set_up": "設定",
"set_up_your_profile": "プロフィールを設定する",
"set_up_your_profile_description": "{{orgName}} 内で、公開リンクを使用するユーザーにあなたのことを知ってもらいましょう。",
"my_profile": "プロフィール",
"my_settings": "設定",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "이 조직에 아직 팀이 없습니다",
"org_no_teams_yet_description": "관리자인 경우 여기에 표시할 팀을 만들어야 합니다.",
"set_up": "설정",
"set_up_your_profile": "사용자 프로필 설정",
"set_up_your_profile_description": "{{orgName}} 내에서 귀하가 누구인지, 그리고 귀하의 공개 링크에 언제 참여하는지 사람들에게 알려주세요.",
"my_profile": "내 프로필",
"my_settings": "내 설정",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "Deze organisatie heeft nog geen teams",
"org_no_teams_yet_description": "Als u een beheerder bent, zorg er dan voor dat u teams maakt die hier weergegeven worden.",
"set_up": "Instellen",
"set_up_your_profile": "Stel uw profiel in",
"set_up_your_profile_description": "Laat mensen weten wie u bent binnen {{orgName}} en wanneer ze uw openbare link gebruiken.",
"my_profile": "Mijn profiel",
"my_settings": "Mijn instellingen",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "W tej organizacji nie ma jeszcze żadnych zespołów",
"org_no_teams_yet_description": "Jeśli jesteś administratorem, pamiętaj o utworzeniu zespołów, które będą wyświetlane tutaj.",
"set_up": "Skonfiguruj",
"set_up_your_profile": "Skonfiguruj profil",
"set_up_your_profile_description": "Określ informacje o Twojej roli w organizacji {{orgName}} wyświetlane osobom, które klikną Twój link publiczny.",
"my_profile": "Mój profil",
"my_settings": "Moje ustawienia",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "Esta organização ainda não tem nenhuma equipe",
"org_no_teams_yet_description": "Se você for administrador, não se esqueça de criar equipes para mostrar aqui.",
"set_up": "Configurar",
"set_up_your_profile": "Configurar seu perfil",
"set_up_your_profile_description": "Deixe que as pessoas saibam quem você é em {{orgName}} e quando interagirem com seu link público.",
"my_profile": "Meu perfil",
"my_settings": "Minhas configurações",
"crm": "CRM",
@@ -1958,8 +1958,6 @@
"org_no_teams_yet": "Esta organização ainda não tem equipas",
"org_no_teams_yet_description": "Se é um administrador, deve criar equipas para serem apresentadas aqui.",
"set_up": "Configurar",
"set_up_your_profile": "Configurar o seu perfil",
"set_up_your_profile_description": "Permita que as pessoas saibam quem você é em {{orgName}} e quando se envolvem com o seu link público.",
"my_profile": "O meu perfil",
"my_settings": "As minhas definições",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "Această organizație nu are încă echipe",
"org_no_teams_yet_description": "Dacă sunteți administrator, creați echipe pentru a fi afișate aici.",
"set_up": "Configurare",
"set_up_your_profile": "Configurați-vă profilul",
"set_up_your_profile_description": "Spuneți-le celorlalți care este rolul dvs. în cadrul {{orgName}} și atunci când interacționează cu linkul dvs. public.",
"my_profile": "Profilul meu",
"my_settings": "Setările mele",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "У этой организации еще нет команд",
"org_no_teams_yet_description": "Если вы администратор, не забудьте создать команды, которые будут отображаться здесь.",
"set_up": "Настроить",
"set_up_your_profile": "Настроить профиль",
"set_up_your_profile_description": "Расскажите, чем вы занимаетесь в {{orgName}}. Эта информация будет отобраться в ваших публичных ссылках.",
"my_profile": "Мой профиль",
"my_settings": "Мои настройки",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "Ova organizacija još uvek nema timove",
"org_no_teams_yet_description": "Ako ste administrator, obavezno kreirajte timove koji će ovde biti prikazani.",
"set_up": "Podesi",
"set_up_your_profile": "Podesite svoj profil",
"set_up_your_profile_description": "Unesite informacije o svojoj ulozi u organizaciji {{orgName}}. Te informacije će videti osobe koje kliknu na vaš javni link.",
"my_profile": "Moj profil",
"my_settings": "Moja podešavanja",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "Denna organisation har inga team än",
"org_no_teams_yet_description": "Om du är administratör ska du skapa team som visas här.",
"set_up": "Konfigurera",
"set_up_your_profile": "Konfigurera din profil",
"set_up_your_profile_description": "Meddela andra vem du är inom {{orgName}} och när de engagerar sig i din offentliga länk.",
"my_profile": "Min profil",
"my_settings": "Mina inställningar",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "Bu kuruluşun henüz ekibi yok",
"org_no_teams_yet_description": "Yöneticiyseniz burada gösterilecek ekipler oluşturduğunuzdan emin olun.",
"set_up": "Düzenle",
"set_up_your_profile": "Profilinizi düzenleyin",
"set_up_your_profile_description": "{{orgName}} adlı kuruluş dâhilinde ve herkese açık bağlantınızla etkileşim kurduklarında insanların kim olduğunuzu bilmelerini sağlayın.",
"my_profile": "Profilim",
"my_settings": "Ayarlarım",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "В організації поки немає команд",
"org_no_teams_yet_description": "Якщо ви адміністратор, не забудьте створити команди, які з’являться тут.",
"set_up": "Налаштувати",
"set_up_your_profile": "Налаштуйте профіль",
"set_up_your_profile_description": "Повідомте, яку функцію ви виконуєте в організації {{orgName}}. Ця інформація буде також доступна за вашим публічним посиланням.",
"my_profile": "Мій профіль",
"my_settings": "Мої налаштування",
"crm": "CRM",
@@ -1971,8 +1971,6 @@
"org_no_teams_yet": "Tổ chức này chưa có nhóm nào",
"org_no_teams_yet_description": "Nếu bạn là một quản trị viên, hãy bảo đảm tạo nhóm các nhóm cần được hiển thị tại đây.",
"set_up": "Thiết lập",
"set_up_your_profile": "Thiết lập hồ sơ của bạn",
"set_up_your_profile_description": "Hãy để mọi người biết bạn là ai trong {{orgName}}, và cho họ biết khi nhấp vào liên kết công cộng của bạn.",
"my_profile": "Hồ sơ của tôi",
"my_settings": "Cài đặt của tôi",
"crm": "CRM",
@@ -1958,8 +1958,6 @@
"org_no_teams_yet": "此组织尚无团队",
"org_no_teams_yet_description": "如果您是管理员,请务必创建要在此处显示的团队。",
"set_up": "设置",
"set_up_your_profile": "设置您的个人资料",
"set_up_your_profile_description": "让人们知道您在 {{orgName}} 中的身份,以及他们何时可与您的公共链接互动。",
"my_profile": "我的个人资料",
"my_settings": "我的设置",
"crm": "CRM",
@@ -1957,8 +1957,6 @@
"org_no_teams_yet": "此組織尚無團隊",
"org_no_teams_yet_description": "若您是管理員,請務必建立團隊,才會顯示在這裡。",
"set_up": "設定",
"set_up_your_profile": "設定個人資料",
"set_up_your_profile_description": "向大家介紹您在 {{orgName}} 擔任的職務,以及他們何時可以使用您的公開連結。",
"my_profile": "我的個人資料",
"my_settings": "我的設定",
"crm": "CRM",
@@ -3,7 +3,7 @@ items:
- 1.jpg
---
> 🚨 A slow Caldav server can cause a slow booking page for you
> 🚨 <span class="text-red-500">A slow Caldav server can cause a slow booking page for you</span>
Caldav is a protocol that allows different clients/servers to access scheduling information on remote servers as well as schedule meetings with other users on the same server or other servers. It extends WebDAV specification and uses iCalendar format for the data.
@@ -1,3 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="3004" height="3004" fill="none">
<path fill="#DFE4E4" stroke="#fff" stroke-width="100" d="m2809.88 802.052 12.75 14.238v1801.24c0 168.34-136.45 304.8-304.8 304.8H485.801c-168.343 0-304.801-136.46-304.801-304.8V825.541l3.742-9.121 28.646-69.814 12.728-31.02H2732.48l14.91 16.652 62.49 69.814Z"/>
<path fill="#CD2E47" stroke="#fff" stroke-width="100" d="M2822.63 835.4v50H181V585.507c0-168.345 136.457-304.814 304.801-304.814H2517.83c168.35 0 304.8 136.47 304.8 304.814V835.4Z"/>
<path fill="#1C202E" stroke="#fff" stroke-width="70" d="M593.032 611.307h-3.084c-53.065 0-96.079-43.018-96.079-96.08V192.08c0-53.062 43.015-96.08 96.079-96.08h3.084c53.064 0 96.078 43.018 96.078 96.08v323.147c0 53.062-43.014 96.08-96.078 96.08ZM1050.09 611.307h-3.08c-53.065 0-96.081-43.018-96.081-96.08V192.08c0-53.063 43.016-96.08 96.081-96.08h3.08c53.07 0 96.08 43.017 96.08 96.08v323.147c0 53.062-43.01 96.08-96.08 96.08ZM1507.15 611.307h-3.08c-53.06 0-96.08-43.017-96.08-96.08V192.08c0-53.063 43.02-96.08 96.08-96.08h3.08c53.06 0 96.08 43.017 96.08 96.08v323.147c0 53.063-43.02 96.08-96.08 96.08ZM1964.22 611.307h-3.08c-53.07 0-96.08-43.017-96.08-96.08V192.08c0-53.063 43.01-96.08 96.08-96.08h3.08c53.06 0 96.08 43.017 96.08 96.08v323.147c0 53.063-43.02 96.08-96.08 96.08ZM2421.27 611.307h-3.08c-53.06 0-96.08-43.017-96.08-96.08V192.08c0-53.064 43.02-96.08 96.08-96.08h3.08c53.06 0 96.08 43.017 96.08 96.08v323.147c0 53.063-43.02 96.08-96.08 96.08Z"/>
<path fill="#DFE4E4" d="M2772.63 835.4v1782.13c0 140.72-114.07 254.8-254.8 254.8H485.801c-140.728 0-254.801-114.08-254.801-254.8V835.4l28.645-69.813H2710.14l62.49 69.813Z"/>
<path fill="#CD2E47" d="M2772.63 585.507V835.4H231V585.507c0-140.734 114.073-254.814 254.801-254.814H2517.83c140.73 0 254.8 114.08 254.8 254.814Z"/>
<path fill="#9B213B" d="M684.276 632.147H491.114c-21.767 0-39.414-17.64-39.414-39.414V510.72c0-21.773 17.647-39.413 39.414-39.413h193.162c21.768 0 39.414 17.64 39.414 39.413v82.013c0 21.774-17.646 39.414-39.414 39.414Z"/>
<path fill="#1C202E" d="M593.032 576.307h-3.084c-33.733 0-61.079-27.347-61.079-61.08V192.08c0-33.733 27.346-61.08 61.079-61.08h3.084c33.733 0 61.078 27.347 61.078 61.08v323.147c0 33.733-27.345 61.08-61.078 61.08Z"/>
<path fill="#9B213B" d="M1141.34 632.147H948.174c-21.768 0-39.414-17.64-39.414-39.414V510.72c0-21.773 17.646-39.413 39.414-39.413h193.166c21.76 0 39.41 17.64 39.41 39.413v82.013c0 21.774-17.65 39.414-39.41 39.414Z"/>
<path fill="#1C202E" d="M1050.09 576.307h-3.08c-33.73 0-61.081-27.347-61.081-61.08V192.08c0-33.733 27.351-61.08 61.081-61.08h3.08c33.74 0 61.08 27.347 61.08 61.08v323.147c0 33.733-27.34 61.08-61.08 61.08Z"/>
<path fill="#9B213B" d="M1598.4 632.147h-193.17c-21.76 0-39.41-17.64-39.41-39.414V510.72c0-21.773 17.65-39.413 39.41-39.413h193.17c21.76 0 39.42 17.64 39.42 39.413v82.013c0 21.774-17.66 39.414-39.42 39.414Z"/>
<path fill="#1C202E" d="M1507.15 576.307h-3.08c-33.73 0-61.08-27.347-61.08-61.08V192.08c0-33.733 27.35-61.08 61.08-61.08h3.08c33.73 0 61.08 27.347 61.08 61.08v323.147c0 33.733-27.35 61.08-61.08 61.08Z"/>
<path fill="#9B213B" d="M2055.46 632.147H1862.3c-21.78 0-39.42-17.64-39.42-39.414V510.72c0-21.773 17.64-39.413 39.42-39.413h193.16c21.77 0 39.41 17.64 39.41 39.413v82.013c0 21.774-17.64 39.414-39.41 39.414Z"/>
<path fill="#1C202E" d="M1964.22 576.307h-3.08c-33.74 0-61.08-27.347-61.08-61.08V192.08c0-33.733 27.34-61.08 61.08-61.08h3.08c33.73 0 61.08 27.347 61.08 61.08v323.147c0 33.733-27.35 61.08-61.08 61.08Z"/>
<path fill="#9B213B" d="M2512.52 632.147h-193.16c-21.77 0-39.42-17.64-39.42-39.414V510.72c0-21.773 17.65-39.413 39.42-39.413h193.16c21.76 0 39.42 17.64 39.42 39.413v82.013c0 21.774-17.66 39.414-39.42 39.414Z"/>
<path fill="#1C202E" d="M2421.27 576.307h-3.08c-33.73 0-61.08-27.347-61.08-61.08V192.08c0-33.733 27.35-61.08 61.08-61.08h3.08c33.73 0 61.08 27.347 61.08 61.08v323.147c0 33.733-27.35 61.08-61.08 61.08Z"/>
<path fill="#B9C3C4" d="M842.32 959.6h154.945c21.575 0 39.065 17.48 39.065 39.053v154.957c0 21.56-17.49 39.06-39.065 39.06H842.32c-21.573 0-39.063-17.5-39.063-39.06V998.653c0-21.573 17.49-39.053 39.063-39.053ZM1618.35 959.6h154.95c21.57 0 39.06 17.48 39.06 39.053v154.957c0 21.56-17.49 39.06-39.06 39.06h-154.95c-21.57 0-39.07-17.5-39.07-39.06V998.653c0-21.573 17.5-39.053 39.07-39.053ZM2588.39 998.653v154.957c0 21.56-17.49 39.06-39.07 39.06h-154.94c-21.58 0-39.06-17.5-39.06-39.06V998.653c0-21.573 17.48-39.053 39.06-39.053h154.94c21.58 0 39.07 17.48 39.07 39.053ZM454.304 959.6h154.945c21.574 0 39.063 17.48 39.063 39.053v154.957c0 21.56-17.489 39.06-39.063 39.06H454.304c-21.573 0-39.063-17.5-39.063-39.06V998.653c0-21.573 17.49-39.053 39.063-39.053ZM2006.36 959.6h154.95c21.57 0 39.07 17.48 39.07 39.053v154.957c0 21.56-17.5 39.06-39.07 39.06h-154.95c-21.57 0-39.05-17.5-39.05-39.06V998.653c0-21.573 17.48-39.053 39.05-39.053ZM1230.33 959.6h154.95c21.58 0 39.07 17.48 39.07 39.053v154.957c0 21.56-17.49 39.06-39.07 39.06h-154.95c-21.57 0-39.06-17.5-39.06-39.06V998.653c0-21.573 17.49-39.053 39.06-39.053ZM1618.35 2092.4h154.95c21.57 0 39.06 17.48 39.06 39.05v154.95c0 21.57-17.49 39.07-39.06 39.07h-154.95c-21.57 0-39.07-17.5-39.07-39.07v-154.95c0-21.57 17.5-39.05 39.07-39.05ZM2588.39 2131.45v154.95c0 21.57-17.49 39.07-39.07 39.07h-154.94c-21.58 0-39.06-17.5-39.06-39.07v-154.95c0-21.57 17.48-39.05 39.06-39.05h154.94c21.58 0 39.07 17.48 39.07 39.05ZM2006.36 2092.4h154.95c21.57 0 39.07 17.48 39.07 39.05v154.95c0 21.57-17.5 39.07-39.07 39.07h-154.95c-21.57 0-39.05-17.5-39.05-39.07v-154.95c0-21.57 17.48-39.05 39.05-39.05ZM1230.33 2092.4h154.95c21.58 0 39.07 17.48 39.07 39.05v154.95c0 21.57-17.49 39.07-39.07 39.07h-154.95c-21.57 0-39.06-17.5-39.06-39.07v-154.95c0-21.57 17.49-39.05 39.06-39.05ZM842.32 2092.4h154.945c21.575 0 39.065 17.48 39.065 39.05v154.95c0 21.57-17.49 39.07-39.065 39.07H842.32c-21.573 0-39.063-17.5-39.063-39.07v-154.95c0-21.57 17.49-39.05 39.063-39.05ZM454.304 2092.4h154.945c21.574 0 39.063 17.48 39.063 39.05v154.95c0 21.57-17.489 39.07-39.063 39.07H454.304c-21.573 0-39.063-17.5-39.063-39.07v-154.95c0-21.57 17.49-39.05 39.063-39.05ZM454.304 2470h154.945c21.574 0 39.063 17.48 39.063 39.05V2664c0 21.57-17.489 39.07-39.063 39.07H454.304c-21.573 0-39.063-17.5-39.063-39.07v-154.95c0-21.57 17.49-39.05 39.063-39.05ZM842.32 2470h154.945c21.575 0 39.065 17.48 39.065 39.05V2664c0 21.57-17.49 39.07-39.065 39.07H842.32c-21.573 0-39.063-17.5-39.063-39.07v-154.95c0-21.57 17.49-39.05 39.063-39.05ZM1424.35 2509.05V2664c0 21.57-17.49 39.07-39.07 39.07h-154.95c-21.57 0-39.06-17.5-39.06-39.07v-154.95c0-21.57 17.49-39.05 39.06-39.05h154.95c21.58 0 39.07 17.48 39.07 39.05Z"/>
<path fill="#1C202E" d="M2178.1 1401.28h114.89l113.48 315.59c8.03 23.17 13.94 43.97 17.73 62.41 3.78-19.38 9.69-40.19 17.73-62.41l113.47-315.59h112.76l-196.45 496.44h-95.74l-197.87-496.44ZM1994.44 1401.28h85.81l202.13 496.44h-107.8l-34.04-94.33h-207.09l-34.04 94.33h-107.8l202.83-496.44Zm113.47 316.3-53.19-135.46c-8.03-20.8-13.94-39.71-17.73-56.73-6.14 23.64-12.05 42.55-17.73 56.73l-53.19 135.46h141.84ZM1391.06 1401.28h177.3c55.79 0 102.6 10.63 140.42 31.91 38.3 21.28 66.9 50.59 85.81 87.94 18.92 37.35 28.37 80.38 28.37 129.08 0 48.22-9.45 91.01-28.37 128.36-18.91 37.35-47.51 66.67-85.81 87.94-37.82 20.81-84.63 31.21-140.42 31.21h-177.3v-496.44Zm165.24 407.08c55.79 0 96.93-14.19 123.4-42.55 26.95-28.84 40.43-67.38 40.43-115.6 0-48.23-13.48-86.76-40.43-115.6-26.47-29.32-67.61-43.97-123.4-43.97h-65.95v317.72h65.95ZM1231.6 1380h95.74v517.72h-95.74V1380ZM962.661 1906.94c-33.096 0-63.592-8.51-91.487-25.53-27.895-17.5-50.117-40.9-66.665-70.21-16.075-29.32-24.113-61.47-24.113-96.46 0-34.98 8.038-67.13 24.113-96.45 16.548-29.78 38.77-53.42 66.665-70.92 27.895-17.49 58.391-26.24 91.487-26.24 30.26 0 54.609 5.67 73.049 17.02 18.91 11.35 33.57 27.66 43.97 48.94v-58.16h95.03v368.79h-92.9v-60.28c-10.88 22.22-25.77 39.47-44.68 51.77-18.44 11.82-43.264 17.73-74.469 17.73Zm-86.523-192.91c0 18.92 4.256 36.65 12.766 53.19 8.983 16.08 21.04 29.08 36.169 39.01 15.603 9.46 33.333 14.18 53.191 14.18 20.33 0 38.296-4.72 53.896-14.18 16.08-9.46 28.37-22.22 36.88-38.3 8.51-16.07 12.77-33.8 12.77-53.19 0-19.38-4.26-37.11-12.77-53.19-8.51-16.54-20.8-29.55-36.88-39-15.6-9.93-33.566-14.9-53.896-14.9-19.858 0-37.588 4.97-53.191 14.9-15.602 9.45-27.659 22.22-36.169 38.29-8.51 16.08-12.766 33.81-12.766 53.19ZM594.008 1906.94c-48.225 0-92.196-11.35-131.911-34.04-39.243-23.17-70.211-54.38-92.906-93.62-22.694-39.24-34.042-82.27-34.042-129.07 0-47.28 10.875-90.55 32.624-129.79 22.221-39.71 52.954-70.92 92.196-93.61 39.243-23.17 83.922-34.75 134.039-34.75 40.189 0 74.703 6.38 103.544 19.14 29.314 12.3 55.318 31.92 78.012 58.87l-70.211 60.99c-29.786-31.2-66.901-46.81-111.345-46.81-31.204 0-58.627 7.57-82.267 22.7-23.64 14.65-41.843 34.75-54.609 60.28-12.765 25.06-19.148 52.72-19.148 82.98 0 30.26 6.383 57.91 19.148 82.97 13.239 25.06 31.678 44.92 55.318 59.58 24.113 14.65 52.008 21.98 83.686 21.98 46.335 0 84.159-16.07 113.473-48.22l72.338 61.7c-19.857 24.11-45.862 43.26-78.012 57.44-31.678 14.19-68.32 21.28-109.927 21.28Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 8.9 KiB

@@ -77,6 +77,13 @@ export const BookingFields = ({
return null;
}
// Attendee location field can be edited during reschedule
if (field.name === SystemField.Enum.location) {
if (locationResponse?.value === "attendeeInPerson" || "phone") {
readOnly = false;
}
}
// Dynamically populate location field options
if (field.name === SystemField.Enum.location && field.type === "radioInput") {
if (!field.optionsInputs) {
@@ -1,6 +1,7 @@
import { useSession } from "next-auth/react";
import { useSearchParams, useRouter, usePathname } from "next/navigation";
import { useState, useCallback, useEffect } from "react";
import { useCallback, useEffect } from "react";
import { shallow } from "zustand/shallow";
import dayjs from "@calcom/dayjs";
import { useIsEmbed } from "@calcom/embed-core/embed-iframe";
@@ -18,17 +19,15 @@ import { useLocalSet } from "../hooks/useLocalSet";
import { useOverlayCalendarStore } from "./store";
interface OverlayCalendarSwitchProps {
setContinueWithProvider: (val: boolean) => void;
setCalendarSettingsOverlay: (val: boolean) => void;
enabled?: boolean;
}
function OverlayCalendarSwitch({
setCalendarSettingsOverlay,
setContinueWithProvider,
enabled,
}: OverlayCalendarSwitchProps) {
function OverlayCalendarSwitch({ enabled }: OverlayCalendarSwitchProps) {
const { t } = useLocale();
const setContinueWithProvider = useOverlayCalendarStore((state) => state.setContinueWithProviderModal);
const setCalendarSettingsOverlay = useOverlayCalendarStore(
(state) => state.setCalendarSettingsOverlayModal
);
const layout = useBookerStore((state) => state.layout);
const searchParams = useSearchParams();
const { data: session } = useSession();
@@ -110,9 +109,16 @@ function OverlayCalendarSwitch({
export function OverlayCalendarContainer() {
const isEmbed = useIsEmbed();
const searchParams = useSearchParams();
const [continueWithProvider, setContinueWithProvider] = useState(false);
const [calendarSettingsOverlay, setCalendarSettingsOverlay] = useState(false);
const { data: session } = useSession();
const [continueWithProvider, setContinueWithProvider] = useOverlayCalendarStore(
(state) => [state.continueWithProviderModal, state.setContinueWithProviderModal],
shallow
);
const [calendarSettingsOverlay, setCalendarSettingsOverlay] = useOverlayCalendarStore(
(state) => [state.calendarSettingsOverlayModal, state.setCalendarSettingsOverlayModal],
shallow
);
const { data: session, status: sessionStatus } = useSession();
const setOverlayBusyDates = useOverlayCalendarStore((state) => state.setOverlayBusyDates);
const switchEnabled =
searchParams.get("overlayCalendar") === "true" ||
@@ -170,11 +176,7 @@ export function OverlayCalendarContainer() {
return (
<>
<OverlayCalendarSwitch
setCalendarSettingsOverlay={setCalendarSettingsOverlay}
setContinueWithProvider={setContinueWithProvider}
enabled={switchEnabled}
/>
<OverlayCalendarSwitch enabled={switchEnabled} />
<OverlayCalendarContinueModal
open={continueWithProvider}
onClose={(val) => {
@@ -5,6 +5,10 @@ import type { EventBusyDate } from "@calcom/types/Calendar";
interface IOverlayCalendarStore {
overlayBusyDates: EventBusyDate[] | undefined;
setOverlayBusyDates: (busyDates: EventBusyDate[]) => void;
continueWithProviderModal: boolean;
setContinueWithProviderModal: (value: boolean) => void;
calendarSettingsOverlayModal: boolean;
setCalendarSettingsOverlayModal: (value: boolean) => void;
}
export const useOverlayCalendarStore = create<IOverlayCalendarStore>((set) => ({
@@ -12,4 +16,12 @@ export const useOverlayCalendarStore = create<IOverlayCalendarStore>((set) => ({
setOverlayBusyDates: (busyDates: EventBusyDate[]) => {
set({ overlayBusyDates: busyDates });
},
calendarSettingsOverlayModal: false,
setCalendarSettingsOverlayModal: (value: boolean) => {
set({ calendarSettingsOverlayModal: value });
},
continueWithProviderModal: false,
setContinueWithProviderModal: (value: boolean) => {
set({ continueWithProviderModal: value });
},
}));
+1 -1
View File
@@ -242,7 +242,7 @@ const EmailEmbed = ({ eventType, username }: { eventType?: EventType; username:
{selectedDate ? (
<div className="mt-[9px] font-medium ">
{selectedDate ? (
<div className="flex h-full w-full flex-row gap-4">
<div className="flex h-full w-full flex-col gap-4">
<AvailableTimesHeader date={dayjs(selectedDate)} />
<AvailableTimes
className="w-full"
+2 -2
View File
@@ -702,7 +702,7 @@ const MobileNavigation = () => {
<>
<nav
className={classNames(
"pwa:pb-2.5 bg-muted border-subtle fixed bottom-0 z-30 -mx-4 flex w-full border-t bg-opacity-40 px-1 shadow backdrop-blur-md md:hidden",
"pwa:pb-[max(0.625rem,env(safe-area-inset-bottom))] pwa:-mx-2 bg-muted border-subtle fixed bottom-0 z-30 -mx-4 flex w-full border-t bg-opacity-40 px-1 shadow backdrop-blur-md md:hidden",
isEmbed && "hidden"
)}>
{mobileNavigationBottomItems.map((item) => (
@@ -980,7 +980,7 @@ export function ShellMain(props: LayoutProps) {
className={classNames(
props.backPath
? "relative"
: "pwa:bottom-24 fixed bottom-20 z-40 ltr:right-4 rtl:left-4 md:z-auto md:ltr:right-0 md:rtl:left-0",
: "pwa:bottom-[max(7rem,_calc(5rem_+_env(safe-area-inset-bottom)))] fixed bottom-20 z-40 ltr:right-4 rtl:left-4 md:z-auto md:ltr:right-0 md:rtl:left-0",
"flex-shrink-0 md:relative md:bottom-auto md:right-auto"
)}>
{isLocaleReady && props.CTA}
@@ -73,7 +73,11 @@ export default function WebhookListItem(props: {
)}>
<div className="w-full truncate">
<div className="flex">
<p className="text-emphasis truncate text-sm font-medium">{webhook.subscriberUrl}</p>
<Tooltip content={webhook.subscriberUrl}>
<p className="text-emphasis max-w-[600px] truncate text-sm font-medium">
{webhook.subscriberUrl}
</p>
</Tooltip>
{!!props.readOnly && (
<Badge variant="gray" className="ml-2 ">
{t("readonly")}
+23 -1
View File
@@ -7,6 +7,7 @@ import { SchedulingType } from "@calcom/prisma/enums";
import { EventTypeMetaDataSchema, teamMetadataSchema } from "@calcom/prisma/zod-utils";
import { WEBAPP_URL } from "../../../constants";
import logger from "../../../logger";
export type TeamWithMembers = Awaited<ReturnType<typeof getTeamWithMembers>>;
@@ -17,6 +18,9 @@ export async function getTeamWithMembers(args: {
orgSlug?: string | null;
includeTeamLogo?: boolean;
isTeamView?: boolean;
/**
* If true, means that you are fetching an organization and not a team
*/
isOrgView?: boolean;
}) {
const { id, slug, userId, orgSlug, isTeamView, isOrgView, includeTeamLogo } = args;
@@ -120,12 +124,30 @@ export async function getTeamWithMembers(args: {
}
if (id) where.id = id;
if (slug) where.slug = slug;
if (isOrgView) {
// We must fetch only the organization here.
// Note that an organization and a team that doesn't belong to an organization, both have parentId null
// If the organization has null slug(but requestedSlug is 'test') and the team also has slug 'test', we can't distinguish them without explicitly checking the metadata.isOrganization
// Note that, this isn't possible now to have same requestedSlug as the slug of a team not part of an organization. This is legacy teams handling mostly. But it is still safer to be sure that you are fetching an Organization only in case of isOrgView
where.metadata = {
path: ["isOrganization"],
equals: true,
};
}
const team = await prisma.team.findFirst({
const teams = await prisma.team.findMany({
where,
select: teamSelect,
});
if (teams.length > 1) {
logger.error("Found more than one team/Org. We should be doing something wrong.", {
where,
teams: teams.map((team) => ({ id: team.id, slug: team.slug })),
});
}
const team = teams[0];
if (!team) return null;
// This should improve performance saving already app data found.
@@ -1,3 +1,5 @@
import { Prisma } from "@prisma/client";
import type { Dayjs } from "@calcom/dayjs";
import dayjs from "@calcom/dayjs";
import type { DateRange } from "@calcom/lib/date-ranges";
@@ -120,9 +122,16 @@ async function getInfoForAllTeams({ ctx, input }: GetOptions) {
limit,
});
// Get total team count across all teams the user is in (for pagination)
const totalTeamMembers =
await prisma.$queryRaw<number>`SELECT COUNT(DISTINCT "userId")::integer from "Membership" WHERE "teamId" IN (${Prisma.join(
teamIds
)})`;
return {
teamMembers,
totalTeamMembers: teamMembers.length,
totalTeamMembers,
};
}
@@ -72,17 +72,17 @@ export const createHandler = async ({ input, ctx }: CreateOptions) => {
},
});
const slugCollisions = await prisma.team.findFirst({
// An org doesn't have a parentId. A team that isn't part of an org also doesn't have a parentId.
// So, an org can't have the same slug as a non-org team.
// There is a unique index on [slug, parentId] in Team because we don't add the slug to the team always. We only add metadata.requestedSlug in some cases. So, DB won't prevent creation of such an organization.
const hasANonOrgTeamOrOrgWithSameSlug = await prisma.team.findFirst({
where: {
slug: slug,
metadata: {
path: ["isOrganization"],
equals: true,
},
parentId: null,
},
});
if (slugCollisions || RESERVED_SUBDOMAINS.includes(slug))
if (hasANonOrgTeamOrOrgWithSameSlug || RESERVED_SUBDOMAINS.includes(slug))
throw new TRPCError({ code: "BAD_REQUEST", message: "organization_url_taken" });
if (userCollisions) throw new TRPCError({ code: "BAD_REQUEST", message: "admin_email_taken" });
+1 -2
View File
@@ -58,8 +58,7 @@ export function AppCard({ app, credentials, searchText, userAdminTeams }: AppCar
alt={`${app.name} Logo`}
className={classNames(
app.logo.includes("-dark") && "dark:invert",
"mb-4 h-12 w-12 rounded-sm",
app.dirName == "caldavcalendar" && "dark:invert" // TODO: Maybe find a better way to handle this @Hariom?
"mb-4 h-12 w-12 rounded-sm" // TODO: Maybe find a better way to handle this @Hariom?
)}
/>
</div>
@@ -36,7 +36,7 @@ export function DataTableToolbar<TData>({
const isFiltered = table.getState().columnFilters.length > 0;
return (
<div className="bg-default sticky top-[3rem] z-10 flex items-center justify-end space-x-2 py-4 md:top-0">
<div className="bg-default sticky top-[3rem] z-10 flex items-center justify-end space-x-2 py-[2.15rem] md:top-0">
{searchKey && (
<Input
className="max-w-64 mb-0 mr-auto rounded-md"