Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
368d1afe27 | ||
|
|
2069fd7248 | ||
|
|
7ed21b692e | ||
|
|
4fcdc7bf5c | ||
|
|
2a0a293f8c | ||
|
|
1b15b71a24 | ||
|
|
5d9889a90c | ||
|
|
a7ee3366eb | ||
|
|
c68e7595fe | ||
|
|
3f6be3b2c0 | ||
|
|
f1647248a2 | ||
|
|
d7db1ad303 | ||
|
|
bd48fd01b1 | ||
|
|
fabf692a08 | ||
|
|
ab62fc5d47 | ||
|
|
0c4cb2e2b0 | ||
|
|
7d77132102 | ||
|
|
50ac5f2892 | ||
|
|
fd12fcc4b8 | ||
|
+2 |
58453d0f2f | ||
|
|
44fd1b9fef | ||
|
|
0098591a56 | ||
|
|
41c1e960f8 | ||
|
|
4e49d32c61 | ||
|
+9 |
0b29c5063a | ||
|
|
95a92567cb | ||
|
+7 |
9e183e6ad1 | ||
|
|
7900f8bab5 | ||
|
|
50904d2588 | ||
|
|
6f811f4f0a | ||
|
|
d9000d0cbe | ||
|
|
ff78e66051 | ||
|
|
7c30f8ca4b | ||
|
|
0ebce77a7b | ||
|
|
4282adac4b | ||
|
|
ef611e2360 | ||
|
|
10ab86b332 | ||
|
|
f04cfef0af | ||
|
|
50151403c4 | ||
|
|
7aa131f349 | ||
|
|
d88bdc368b | ||
|
|
255938fda0 | ||
|
|
5766d6f5f4 | ||
|
|
9d299c6d5f | ||
|
|
f49783b453 | ||
|
|
246fce3ab8 | ||
|
|
82f262f60d | ||
|
|
da8d2da368 | ||
|
|
f01058e073 | ||
|
|
8e369d3fb5 | ||
|
|
11c44db609 | ||
|
|
9d911cbb59 | ||
|
|
30a887df6f | ||
|
|
62fea25eb9 | ||
|
|
d43d8700d0 | ||
|
|
e7ed20ea27 | ||
|
|
5e12b5defe | ||
|
|
d241a522fb | ||
|
+2 |
ae929f27b0 | ||
|
|
369d7c4e28 | ||
|
|
4438ca2a63 | ||
|
|
75589db569 | ||
|
|
3752ac767a | ||
|
+3 |
f3e2cf5075 | ||
|
|
92a29593aa | ||
|
|
367c5d89cc | ||
|
|
f21f36547c | ||
|
|
d3f8d954e7 | ||
|
|
27372d624d | ||
|
|
a5d2f2444a | ||
|
|
6d45e1c7c7 | ||
|
|
48419469a6 | ||
|
|
045ebb6e01 | ||
|
|
c78ea5de0b | ||
|
|
d1a787315c | ||
|
|
ce1f1f3c47 | ||
|
|
2f8bd3c07a | ||
|
|
d2f27a0463 | ||
|
|
9134ad8c5e | ||
|
|
506036e751 | ||
|
|
5e80f5056d | ||
|
|
9304ca1415 | ||
|
|
fb246fdee6 | ||
|
|
7b9e77f43a | ||
|
|
47df21322d | ||
|
|
6017806763 | ||
|
|
b347f29d6c | ||
|
|
c26cf74aec | ||
|
|
760ed74a11 | ||
|
|
145fb09b73 | ||
|
|
dd14e827e1 | ||
|
|
246c90c10f | ||
|
|
a42f703c1d | ||
|
|
7256dbf84f | ||
|
|
f5faebad67 | ||
|
+3 |
be15affa5d | ||
|
|
58dd5308ac | ||
|
|
14a6c5a03f | ||
|
|
5af20f5a7b | ||
|
|
8478363a23 | ||
|
|
19b3157c94 | ||
|
|
d4dd451c26 | ||
|
|
6c046f6507 | ||
|
|
a792d31939 |
@@ -97,7 +97,7 @@ LARK_OPEN_VERIFICATION_TOKEN=""
|
||||
|
||||
# - WEB3
|
||||
# Used for the Web3 plugin
|
||||
# @see https://github.com/calcom/cal.com/blob/main/packages/app-store/web3/README.md
|
||||
# @see https://github.com/calcom/cal.com/blob/main/packages/app-store/rainbow/README.md
|
||||
ALCHEMY_API_KEY=""
|
||||
INFURA_API_KEY=""
|
||||
# *********************************************************************************************************
|
||||
|
||||
Vendored
+1
-1
@@ -6,5 +6,5 @@
|
||||
},
|
||||
"typescript.preferences.importModuleSpecifier": "non-relative",
|
||||
"spellright.language": ["en"],
|
||||
"spellright.documentTypes": ["markdown"]
|
||||
"spellright.documentTypes": ["markdown", "typescript"]
|
||||
}
|
||||
|
||||
@@ -4,23 +4,6 @@ Contributions are what make the open source community such an amazing place to l
|
||||
|
||||
- Before jumping into a PR be sure to search [existing PRs](https://github.com/calcom/cal.com/pulls) or [issues](https://github.com/calcom/cal.com/issues) for an open or closed item that relates to your submission.
|
||||
|
||||
## Areas of expertise
|
||||
|
||||
### Legend
|
||||
|
||||
✅ = has knowledge
|
||||
|
||||
🥇 = is their main priority
|
||||
|
||||
⚠️ = is the only one with knowledge
|
||||
|
||||
👀 = has no knowledge but wants to be onboarded
|
||||
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://dynamic-svgs.vercel.app/image.svg?dark">
|
||||
<img alt="Areas of expertise table" src="https://dynamic-svgs.vercel.app/image.svg">
|
||||
</picture>
|
||||
|
||||
## Developing
|
||||
|
||||
The development branch is `main`. This is the branch that all pull
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<a href="https://news.ycombinator.com/item?id=26817795"><img src="https://img.shields.io/badge/Hacker%20News-311-%23FF6600" alt="Hacker News"></a>
|
||||
<a href="https://github.com/calcom/cal.com/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-AGPLv3-purple" alt="License"></a>
|
||||
<a href="https://github.com/calcom/cal.com/pulse"><img src="https://img.shields.io/github/commit-activity/m/calcom/cal.com" alt="Commits-per-month"></a>
|
||||
<a href="https://cal.com/pricing"><img src="https://img.shields.io/badge/Pricing-%2412%2Fmonth-brightgreen" alt="Pricing"></a>
|
||||
<a href="https://cal.com/pricing"><img src="https://img.shields.io/badge/Pricing-Free-brightgreen" alt="Pricing"></a>
|
||||
<a href="https://jitsu.com?utm_source=github/calcom/cal.com"><img src="https://img.shields.io/badge/Metrics_tracked_by-JITSU-AA00FF?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAACKSURBVHgBrZDRCYAwDEQv6gCOoKO4hOCXI9QVnEZwiY5iF5GaVClaBNtioCSUvCR3tMJaxIfZgW4AGUoEPVwgPZoS0Dmgg3NBVDFNbMIsmYCak3J1jDk9iCQvsKJvkzr71N81Gj6vDT/LU2P6RhY63jcafk3YJEbgeZpiFyc/5HJKv8Ef273NSfABGbQfUZhnOSAAAAAASUVORK5CYII=" alt="Jitsu Tracked"></a>
|
||||
<img src="https://api.checklyhq.com/v1/badges/checks/5e048048-1b51-47ba-9209-60607507622e?responseTime=true" alt="Checkly Availability" />
|
||||
<a href="https://hub.docker.com/r/calendso/calendso"><img src="https://img.shields.io/docker/pulls/calendso/calendso"></a>
|
||||
|
||||
+1
-1
Submodule apps/api updated: a36b6fa923...7e9226fabc
@@ -15,14 +15,15 @@
|
||||
"dependencies": {
|
||||
"@calcom/dayjs": "*",
|
||||
"@calcom/ui": "*",
|
||||
"@radix-ui/react-avatar": "^0.1.4",
|
||||
"@radix-ui/react-collapsible": "^0.1.0",
|
||||
"@radix-ui/react-dialog": "^0.1.0",
|
||||
"@radix-ui/react-dropdown-menu": "^0.1.1",
|
||||
"@radix-ui/react-id": "^0.1.0",
|
||||
"@radix-ui/react-radio-group": "^0.1.1",
|
||||
"@radix-ui/react-slider": "^0.1.1",
|
||||
"@radix-ui/react-switch": "^0.1.1",
|
||||
"@radix-ui/react-avatar": "^1.0.0",
|
||||
"@radix-ui/react-collapsible": "^1.0.0",
|
||||
"@radix-ui/react-dialog": "^1.0.0",
|
||||
"@radix-ui/react-dropdown-menu": "^1.0.0",
|
||||
"@radix-ui/react-id": "^1.0.0",
|
||||
"@radix-ui/react-popover": "^1.0.0",
|
||||
"@radix-ui/react-radio-group": "^1.0.0",
|
||||
"@radix-ui/react-slider": "^1.0.0",
|
||||
"@radix-ui/react-switch": "^1.0.0",
|
||||
"@radix-ui/react-tooltip": "^1.0.0",
|
||||
"next": "^12.2.5",
|
||||
"next-transpile-modules": "^9.0.0",
|
||||
|
||||
@@ -10,7 +10,9 @@ export function useViewerI18n() {
|
||||
* i18n should never be clubbed with other queries, so that it's caching can be managed independently.
|
||||
* We intend to not cache i18n query
|
||||
**/
|
||||
context: { skipBatch: true },
|
||||
trpc: {
|
||||
context: { skipBatch: true },
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ type AvailableTimesProps = {
|
||||
eventTypeId: number;
|
||||
recurringCount: number | undefined;
|
||||
eventTypeSlug: string;
|
||||
date: Dayjs;
|
||||
date?: Dayjs;
|
||||
seatsPerTimeSlot?: number | null;
|
||||
slots?: Slot[];
|
||||
isLoading: boolean;
|
||||
@@ -44,8 +44,10 @@ const AvailableTimes: FC<AvailableTimesProps> = ({
|
||||
setBrand(getComputedStyle(document.documentElement).getPropertyValue("--brand-color").trim());
|
||||
}, []);
|
||||
|
||||
if (!date) return null;
|
||||
|
||||
return (
|
||||
<div className="dark:bg-darkgray-100 mt-8 flex flex-col px-4 text-center sm:mt-0 sm:w-1/3 sm:p-5 md:-mb-5">
|
||||
<div className="dark:bg-darkgray-100 mt-8 flex h-full w-full flex-col px-4 text-center sm:mt-0 sm:p-5 md:-mb-5 md:min-w-[200px] lg:min-w-[300px]">
|
||||
<div className="mb-4 text-left text-base">
|
||||
<span className="text-bookingdarker dark:text-darkgray-800 mb-8 w-1/2 break-words font-semibold text-gray-900">
|
||||
{nameOfDay(i18n.language, Number(date.format("d")))}
|
||||
@@ -150,4 +152,6 @@ const AvailableTimes: FC<AvailableTimesProps> = ({
|
||||
);
|
||||
};
|
||||
|
||||
AvailableTimes.displayName = "AvailableTimes";
|
||||
|
||||
export default AvailableTimes;
|
||||
|
||||
@@ -29,7 +29,7 @@ type BookingItem = inferQueryOutput<"viewer.bookings">["bookings"][number];
|
||||
|
||||
type BookingItemProps = BookingItem & {
|
||||
listingStatus: BookingListingStatus;
|
||||
recurringBookings?: BookingItem[];
|
||||
recurringBookings: inferQueryOutput<"viewer.bookings">["recurringInfo"];
|
||||
};
|
||||
|
||||
function BookingListItem(booking: BookingItemProps) {
|
||||
@@ -44,10 +44,25 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
const mutation = trpc.useMutation(["viewer.bookings.confirm"], {
|
||||
onSuccess: () => {
|
||||
setRejectionDialogIsOpen(false);
|
||||
showToast(t("booking_confirmation_success"), "success");
|
||||
utils.invalidateQueries("viewer.bookings");
|
||||
},
|
||||
onError: () => {
|
||||
showToast(t("booking_confirmation_failed"), "error");
|
||||
utils.invalidateQueries("viewer.bookings");
|
||||
},
|
||||
});
|
||||
|
||||
const isUpcoming = new Date(booking.endTime) >= new Date();
|
||||
const isPast = new Date(booking.endTime) < new Date();
|
||||
const isCancelled = booking.status === BookingStatus.CANCELLED;
|
||||
const isConfirmed = booking.status === BookingStatus.ACCEPTED;
|
||||
const isRejected = booking.status === BookingStatus.REJECTED;
|
||||
const isPending = booking.status === BookingStatus.PENDING;
|
||||
const isRecurring = booking.recurringEventId !== null;
|
||||
const isTabRecurring = booking.listingStatus === "recurring";
|
||||
const isTabUnconfirmed = booking.listingStatus === "unconfirmed";
|
||||
|
||||
const bookingConfirm = async (confirm: boolean) => {
|
||||
let body = {
|
||||
bookingId: booking.id,
|
||||
@@ -56,28 +71,18 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
};
|
||||
/**
|
||||
* Only pass down the recurring event id when we need to confirm the entire series, which happens in
|
||||
* the "Recurring" tab, to support confirming discretionally in the "Recurring" tab.
|
||||
* the "Recurring" tab and "Unconfirmed" tab, to support confirming discretionally in the "Recurring" tab.
|
||||
*/
|
||||
if (booking.listingStatus === "recurring" && booking.recurringEventId !== null) {
|
||||
if ((isTabRecurring || isTabUnconfirmed) && isRecurring) {
|
||||
body = Object.assign({}, body, { recurringEventId: booking.recurringEventId });
|
||||
}
|
||||
mutation.mutate(body);
|
||||
};
|
||||
|
||||
const isUpcoming = new Date(booking.endTime) >= new Date();
|
||||
const isPast = new Date(booking.endTime) < new Date();
|
||||
const isCancelled = booking.status === BookingStatus.CANCELLED;
|
||||
const isConfirmed = booking.status === BookingStatus.ACCEPTED;
|
||||
const isRejected = booking.status === BookingStatus.REJECTED;
|
||||
const isPending = booking.status === BookingStatus.PENDING;
|
||||
|
||||
const pendingActions: ActionType[] = [
|
||||
{
|
||||
id: "reject",
|
||||
label:
|
||||
booking.listingStatus === "recurring" && booking.recurringEventId !== null
|
||||
? t("reject_all")
|
||||
: t("reject"),
|
||||
label: (isTabRecurring || isTabUnconfirmed) && isRecurring ? t("reject_all") : t("reject"),
|
||||
onClick: () => {
|
||||
setRejectionDialogIsOpen(true);
|
||||
},
|
||||
@@ -86,10 +91,7 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
},
|
||||
{
|
||||
id: "confirm",
|
||||
label:
|
||||
booking.listingStatus === "recurring" && booking.recurringEventId !== null
|
||||
? t("confirm_all")
|
||||
: t("confirm"),
|
||||
label: (isTabRecurring || isTabUnconfirmed) && isRecurring ? t("confirm_all") : t("confirm"),
|
||||
onClick: () => {
|
||||
bookingConfirm(true);
|
||||
},
|
||||
@@ -102,17 +104,10 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
let bookedActions: ActionType[] = [
|
||||
{
|
||||
id: "cancel",
|
||||
label:
|
||||
booking.listingStatus === "recurring" && booking.recurringEventId !== null
|
||||
? t("cancel_all_remaining")
|
||||
: t("cancel"),
|
||||
label: isTabRecurring && isRecurring ? t("cancel_all_remaining") : t("cancel"),
|
||||
/* When cancelling we need to let the UI and the API know if the intention is to
|
||||
cancel all remaining bookings or just that booking instance. */
|
||||
href: `/cancel/${booking.uid}${
|
||||
booking.listingStatus === "recurring" && booking.recurringEventId !== null
|
||||
? "?allRemainingBookings=true"
|
||||
: ""
|
||||
}`,
|
||||
href: `/cancel/${booking.uid}${isTabRecurring && isRecurring ? "?allRemainingBookings=true" : ""}`,
|
||||
icon: Icon.FiX,
|
||||
},
|
||||
{
|
||||
@@ -146,7 +141,7 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
},
|
||||
];
|
||||
|
||||
if (booking.listingStatus === "recurring" && booking.recurringEventId !== null) {
|
||||
if (isTabRecurring && isRecurring) {
|
||||
bookedActions = bookedActions.filter((action) => action.id !== "edit_booking");
|
||||
}
|
||||
|
||||
@@ -183,12 +178,8 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
let recurringStrings: string[] = [];
|
||||
let recurringDates: Date[] = [];
|
||||
|
||||
if (booking.recurringBookings && booking.eventType.recurringEvent?.freq !== undefined) {
|
||||
[recurringStrings, recurringDates] = extractRecurringDates(
|
||||
booking.recurringBookings,
|
||||
user?.timeZone,
|
||||
i18n
|
||||
);
|
||||
if (booking.recurringBookings !== undefined && booking.eventType.recurringEvent?.freq !== undefined) {
|
||||
[recurringStrings, recurringDates] = extractRecurringDates(booking, user?.timeZone, i18n);
|
||||
}
|
||||
|
||||
const location = booking.location || "";
|
||||
@@ -262,7 +253,7 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
</Dialog>
|
||||
|
||||
<tr className="flex flex-col hover:bg-neutral-50 sm:flex-row">
|
||||
<td className="hidden align-top ltr:pl-6 rtl:pr-6 sm:table-cell sm:w-48" onClick={onClick}>
|
||||
<td className="hidden align-top ltr:pl-6 rtl:pr-6 sm:table-cell sm:min-w-[10rem]" onClick={onClick}>
|
||||
<div className="cursor-pointer py-4">
|
||||
<div className="text-sm leading-6 text-gray-900">{startTime}</div>
|
||||
<div className="text-sm text-gray-500">
|
||||
@@ -296,7 +287,7 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td className={"flex-1 px-4" + (isRejected ? " line-through" : "")} onClick={onClick}>
|
||||
<td className={"w-full px-4" + (isRejected ? " line-through" : "")} onClick={onClick}>
|
||||
{/* Time and Badges for mobile */}
|
||||
<div className="w-full pt-4 pb-2 sm:hidden">
|
||||
<div className="flex w-full items-center justify-between sm:hidden">
|
||||
@@ -335,7 +326,7 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
<div
|
||||
title={booking.title}
|
||||
className={classNames(
|
||||
"max-w-10/12 sm:max-w-56 truncate text-sm font-medium leading-6 text-neutral-900 md:max-w-max",
|
||||
"max-w-10/12 sm:max-w-56 text-sm font-medium leading-6 text-neutral-900 md:max-w-full",
|
||||
isCancelled ? "line-through" : ""
|
||||
)}>
|
||||
{booking.title}
|
||||
@@ -365,20 +356,8 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex justify-end sm:hidden">
|
||||
<div className="whitespace-nowrap pt-2 pb-4 text-right text-sm font-medium ltr:pr-4 rtl:pl-4">
|
||||
{isUpcoming && !isCancelled ? (
|
||||
<>
|
||||
{isPending && user?.id === booking.user?.id && <TableActions actions={pendingActions} />}
|
||||
{isConfirmed && <TableActions actions={bookedActions} />}
|
||||
{isRejected && <div className="text-sm text-gray-500">{t("rejected")}</div>}
|
||||
</>
|
||||
) : null}
|
||||
{isPast && isPending && !isConfirmed ? <TableActions actions={bookedActions} /> : null}
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td className="hidden whitespace-nowrap py-4 text-right text-sm font-medium ltr:pr-4 rtl:pl-4 sm:block">
|
||||
<td className="py-4 pl-4 text-right text-sm font-medium ltr:pr-4 rtl:pl-4 sm:pl-0">
|
||||
{isUpcoming && !isCancelled ? (
|
||||
<>
|
||||
{isPending && user?.id === booking.user?.id && <TableActions actions={pendingActions} />}
|
||||
@@ -410,16 +389,21 @@ const RecurringBookingsTooltip = ({
|
||||
recurringDates,
|
||||
}: RecurringBookingsTooltipProps) => {
|
||||
const { t } = useLocale();
|
||||
const now = new Date();
|
||||
|
||||
return (
|
||||
(booking.recurringBookings &&
|
||||
booking.eventType?.recurringEvent?.freq &&
|
||||
(booking.listingStatus === "recurring" || booking.listingStatus === "cancelled") && (
|
||||
(booking.listingStatus === "recurring" ||
|
||||
booking.listingStatus === "unconfirmed" ||
|
||||
booking.listingStatus === "cancelled") && (
|
||||
<div className="underline decoration-gray-400 decoration-dashed underline-offset-2">
|
||||
<div className="flex">
|
||||
<Tooltip
|
||||
content={recurringStrings.map((aDate, key) => (
|
||||
<p key={key}>{aDate}</p>
|
||||
<p key={key} className={classNames(recurringDates[key] < now && "line-through")}>
|
||||
{aDate}
|
||||
</p>
|
||||
))}>
|
||||
<div className="text-gray-600 dark:text-white">
|
||||
<Icon.FiRefreshCcw
|
||||
@@ -434,7 +418,9 @@ const RecurringBookingsTooltip = ({
|
||||
: getEveryFreqFor({
|
||||
t,
|
||||
recurringEvent: booking.eventType.recurringEvent,
|
||||
recurringCount: booking.recurringBookings.length,
|
||||
recurringCount: recurringDates.filter((date) => {
|
||||
return date >= now;
|
||||
}).length,
|
||||
})}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { FC, useEffect, useState } from "react";
|
||||
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import TimezoneSelect, { ITimezoneOption } from "@calcom/ui/form/TimezoneSelect";
|
||||
import { Switch } from "@calcom/ui/v2";
|
||||
import TimezoneSelect, { ITimezoneOption } from "@calcom/ui/v2/core/TimezoneSelect";
|
||||
|
||||
import { is24h, timeZone } from "../../lib/clock";
|
||||
|
||||
@@ -10,9 +10,10 @@ type Props = {
|
||||
onSelectTimeZone: (selectedTimeZone: string) => void;
|
||||
onToggle24hClock: (is24hClock: boolean) => void;
|
||||
timeFormat: string;
|
||||
hideTimeFormatToggle?: boolean;
|
||||
};
|
||||
|
||||
const TimeOptions: FC<Props> = ({ onToggle24hClock, onSelectTimeZone, timeFormat }) => {
|
||||
const TimeOptions: FC<Props> = ({ onToggle24hClock, onSelectTimeZone, timeFormat, hideTimeFormatToggle }) => {
|
||||
const [selectedTimeZone, setSelectedTimeZone] = useState("");
|
||||
const [is24hClock, setIs24hClock] = useState(timeFormat === "HH:mm" && true);
|
||||
const { t } = useLocale();
|
||||
@@ -33,20 +34,22 @@ const TimeOptions: FC<Props> = ({ onToggle24hClock, onSelectTimeZone, timeFormat
|
||||
};
|
||||
|
||||
return selectedTimeZone !== "" ? (
|
||||
<div className="max-w-80 dark:border-darkgray-300 dark:bg-darkgray-200 absolute z-10 w-full rounded-sm border border-gray-200 bg-white px-4 pt-4 pb-3 shadow-sm">
|
||||
<div className="dark:border-darkgray-300 dark:bg-darkgray-200 rounded-sm border border-gray-200 bg-white px-4 pt-4 pb-3 shadow-sm">
|
||||
<div className="mb-4 flex">
|
||||
<div className="text-sm font-medium text-gray-600 dark:text-white">{t("time_options")}</div>
|
||||
<div className="ml-auto flex items-center">
|
||||
<label className="ltl:mr-3 mr-2 align-text-top text-sm font-medium text-neutral-700 ltr:ml-3 rtl:mr-3 dark:text-white">
|
||||
{t("am_pm")}
|
||||
</label>
|
||||
<Switch
|
||||
name="24hClock"
|
||||
label={t("24_h")}
|
||||
defaultChecked={is24hClock}
|
||||
onCheckedChange={handle24hClockToggle}
|
||||
/>
|
||||
</div>
|
||||
{!hideTimeFormatToggle && (
|
||||
<div className="ml-auto flex items-center">
|
||||
<label className="ltl:mr-3 mr-2 align-text-top text-sm font-medium text-neutral-700 ltr:ml-3 rtl:mr-3 dark:text-white">
|
||||
{t("am_pm")}
|
||||
</label>
|
||||
<Switch
|
||||
name="24hClock"
|
||||
label={t("24_h")}
|
||||
defaultChecked={is24hClock}
|
||||
onCheckedChange={handle24hClockToggle}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<TimezoneSelect
|
||||
id="timeZone"
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
// Get router variables
|
||||
import autoAnimate from "@formkit/auto-animate";
|
||||
import { EventType } from "@prisma/client";
|
||||
import { SchedulingType } from "@prisma/client";
|
||||
import * as Collapsible from "@radix-ui/react-collapsible";
|
||||
import * as Popover from "@radix-ui/react-popover";
|
||||
import { TFunction } from "next-i18next";
|
||||
import { useRouter } from "next/router";
|
||||
import { useReducer, useEffect, useMemo, useState } from "react";
|
||||
import { useReducer, useEffect, useMemo, useState, useRef } from "react";
|
||||
import { Toaster } from "react-hot-toast";
|
||||
import { FormattedNumber, IntlProvider } from "react-intl";
|
||||
import { z } from "zod";
|
||||
@@ -24,8 +25,7 @@ import useTheme from "@calcom/lib/hooks/useTheme";
|
||||
import notEmpty from "@calcom/lib/notEmpty";
|
||||
import { getRecurringFreq } from "@calcom/lib/recurringStrings";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import { detectBrowserTimeFormat } from "@calcom/lib/timeFormat";
|
||||
import { localStorage } from "@calcom/lib/webstorage";
|
||||
import { detectBrowserTimeFormat, getIs24hClockFromLocalStorage } from "@calcom/lib/timeFormat";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { Icon } from "@calcom/ui/Icon";
|
||||
import DatePicker from "@calcom/ui/v2/modules/booker/DatePicker";
|
||||
@@ -79,7 +79,7 @@ const useSlots = ({
|
||||
usernameList: string[];
|
||||
timeZone?: string;
|
||||
}) => {
|
||||
const { data, isLoading, isIdle } = trpc.useQuery(
|
||||
const { data, isLoading, isPaused } = trpc.useQuery(
|
||||
[
|
||||
"viewer.public.slots.getSchedule",
|
||||
{
|
||||
@@ -101,8 +101,8 @@ const useSlots = ({
|
||||
}
|
||||
}, [data]);
|
||||
|
||||
// The very first time isIdle is set if auto-fetch is disabled, so isIdle should also be considered a loading state.
|
||||
return { slots: cachedSlots, isLoading: isLoading || isIdle };
|
||||
// The very first time isPaused is set if auto-fetch is disabled, so isPaused should also be considered a loading state.
|
||||
return { slots: cachedSlots, isLoading: isLoading || isPaused };
|
||||
};
|
||||
|
||||
const SlotPicker = ({
|
||||
@@ -129,6 +129,11 @@ const SlotPicker = ({
|
||||
const { date, setQuery: setDate } = useRouterQuery("date");
|
||||
const { month, setQuery: setMonth } = useRouterQuery("month");
|
||||
const router = useRouter();
|
||||
const slotPickerRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
useEffect(() => {
|
||||
slotPickerRef.current && autoAnimate(slotPickerRef.current);
|
||||
}, [slotPickerRef]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!router.isReady) return;
|
||||
@@ -176,10 +181,8 @@ const SlotPicker = ({
|
||||
<DatePicker
|
||||
isLoading={isLoading}
|
||||
className={classNames(
|
||||
"mt-8 w-full px-4 sm:mt-0 sm:min-w-[455px] md:px-5",
|
||||
selectedDate
|
||||
? "sm:dark:border-darkgray-200 border-gray-200 sm:w-1/2 sm:border-r sm:p-4 sm:pr-6 md:w-1/3"
|
||||
: "sm:p-4"
|
||||
"mt-8 px-4 pb-4 sm:mt-0 md:min-w-[300px] md:px-5 lg:min-w-[455px]",
|
||||
selectedDate ? "sm:dark:border-darkgray-200 border-gray-200 sm:border-r sm:p-4 sm:pr-6" : "sm:p-4"
|
||||
)}
|
||||
includedDates={Object.keys(slots).filter((k) => slots[k].length > 0)}
|
||||
locale={isLocaleReady ? i18n.language : "en"}
|
||||
@@ -194,10 +197,10 @@ const SlotPicker = ({
|
||||
weekStart={weekStart}
|
||||
/>
|
||||
|
||||
{selectedDate && (
|
||||
<div ref={slotPickerRef}>
|
||||
<AvailableTimes
|
||||
isLoading={isLoading}
|
||||
slots={slots[selectedDate.format("YYYY-MM-DD")]}
|
||||
slots={selectedDate && slots[selectedDate.format("YYYY-MM-DD")]}
|
||||
date={selectedDate}
|
||||
timeFormat={timeFormat}
|
||||
eventTypeId={eventType.id}
|
||||
@@ -206,7 +209,7 @@ const SlotPicker = ({
|
||||
recurringCount={recurringEventCount}
|
||||
ethSignature={ethSignature}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
@@ -216,16 +219,18 @@ function TimezoneDropdown({
|
||||
onChangeTimeZone,
|
||||
timeZone,
|
||||
timeFormat,
|
||||
hideTimeFormatToggle,
|
||||
}: {
|
||||
onChangeTimeFormat: (newTimeFormat: string) => void;
|
||||
onChangeTimeZone: (newTimeZone: string) => void;
|
||||
timeZone?: string;
|
||||
timeFormat: string;
|
||||
hideTimeFormatToggle?: boolean;
|
||||
}) {
|
||||
const [isTimeOptionsOpen, setIsTimeOptionsOpen] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
handleToggle24hClock(localStorage.getItem("timeOption.is24hClock") === "true");
|
||||
handleToggle24hClock(!!getIs24hClockFromLocalStorage());
|
||||
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
@@ -241,8 +246,8 @@ function TimezoneDropdown({
|
||||
};
|
||||
|
||||
return (
|
||||
<Collapsible.Root open={isTimeOptionsOpen} onOpenChange={setIsTimeOptionsOpen} className="flex">
|
||||
<Collapsible.Trigger className="min-w-32 dark:text-darkgray-600 mb-2 -ml-2 px-2 text-left text-gray-600">
|
||||
<Popover.Root open={isTimeOptionsOpen} onOpenChange={setIsTimeOptionsOpen}>
|
||||
<Popover.Trigger className="min-w-32 dark:text-darkgray-600 radix-state-open:bg-gray-200 dark:radix-state-open:bg-darkgray-200 group relative mb-2 -ml-2 inline-block rounded-md px-2 py-2 text-left text-gray-600">
|
||||
<p className="text-sm font-medium">
|
||||
<Icon.FiGlobe className="mr-[10px] ml-[2px] -mt-[2px] inline-block h-4 w-4" />
|
||||
{timeZone}
|
||||
@@ -252,15 +257,21 @@ function TimezoneDropdown({
|
||||
<Icon.FiChevronDown className="ml-1 inline-block h-4 w-4" />
|
||||
)}
|
||||
</p>
|
||||
</Collapsible.Trigger>
|
||||
<Collapsible.Content>
|
||||
<TimeOptions
|
||||
onSelectTimeZone={handleSelectTimeZone}
|
||||
onToggle24hClock={handleToggle24hClock}
|
||||
timeFormat={timeFormat}
|
||||
/>
|
||||
</Collapsible.Content>
|
||||
</Collapsible.Root>
|
||||
</Popover.Trigger>
|
||||
<Popover.Portal>
|
||||
<Popover.Content
|
||||
hideWhenDetached
|
||||
align="start"
|
||||
className="animate-fade-in-up absolute left-0 top-2 w-80 max-w-[calc(100vw_-_1.5rem)]">
|
||||
<TimeOptions
|
||||
onSelectTimeZone={handleSelectTimeZone}
|
||||
onToggle24hClock={handleToggle24hClock}
|
||||
timeFormat={timeFormat}
|
||||
hideTimeFormatToggle={hideTimeFormatToggle}
|
||||
/>
|
||||
</Popover.Content>
|
||||
</Popover.Portal>
|
||||
</Popover.Root>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -289,7 +300,14 @@ const useRouterQuery = <T extends string>(name: T) => {
|
||||
|
||||
export type Props = AvailabilityTeamPageProps | AvailabilityPageProps | DynamicAvailabilityPageProps;
|
||||
|
||||
const timeFormatTotimeFormatString = (timeFormat?: number | null) => {
|
||||
if (!timeFormat) return null;
|
||||
return timeFormat === 24 ? "HH:mm" : "h:mma";
|
||||
};
|
||||
|
||||
const AvailabilityPage = ({ profile, eventType }: Props) => {
|
||||
const { data: user } = trpc.useQuery(["viewer.me"]);
|
||||
const timeFormatFromProfile = timeFormatTotimeFormatString(user?.timeFormat);
|
||||
const router = useRouter();
|
||||
const isEmbed = useIsEmbed();
|
||||
const query = dateQuerySchema.parse(router.query);
|
||||
@@ -302,8 +320,7 @@ const AvailabilityPage = ({ profile, eventType }: Props) => {
|
||||
const isBackgroundTransparent = useIsBackgroundTransparent();
|
||||
|
||||
const [timeZone, setTimeZone] = useState<string>();
|
||||
const [timeFormat, setTimeFormat] = useState(detectBrowserTimeFormat);
|
||||
const [isAvailableTimesVisible, setIsAvailableTimesVisible] = useState<boolean>();
|
||||
const [timeFormat, setTimeFormat] = useState(timeFormatFromProfile || detectBrowserTimeFormat);
|
||||
const [gateState, gateDispatcher] = useReducer(
|
||||
(state: GateState, newState: Partial<GateState>) => ({
|
||||
...state,
|
||||
@@ -316,10 +333,6 @@ const AvailabilityPage = ({ profile, eventType }: Props) => {
|
||||
setTimeZone(localStorageTimeZone() || dayjs.tz.guess());
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
setIsAvailableTimesVisible(!!query.date);
|
||||
}, [query.date]);
|
||||
|
||||
// TODO: Improve this;
|
||||
useExposePlanGlobally(eventType.users.length === 1 ? eventType.users[0].plan : "PRO");
|
||||
|
||||
@@ -338,14 +351,7 @@ const AvailabilityPage = ({ profile, eventType }: Props) => {
|
||||
|
||||
// get dynamic user list here
|
||||
const userList = eventType.users ? eventType.users.map((user) => user.username).filter(notEmpty) : [];
|
||||
// Recurring event sidebar requires more space
|
||||
const maxWidth = isAvailableTimesVisible
|
||||
? recurringEventCount
|
||||
? "max-w-6xl"
|
||||
: "max-w-5xl"
|
||||
: recurringEventCount
|
||||
? "max-w-4xl"
|
||||
: "max-w-3xl";
|
||||
|
||||
const timezoneDropdown = useMemo(
|
||||
() => (
|
||||
<TimezoneDropdown
|
||||
@@ -353,9 +359,12 @@ const AvailabilityPage = ({ profile, eventType }: Props) => {
|
||||
onChangeTimeFormat={setTimeFormat}
|
||||
timeZone={timeZone}
|
||||
onChangeTimeZone={setTimeZone}
|
||||
// Currently we don't allow the user to change the timeformat when they're logged in,
|
||||
// the only way to change it is if they go to their profile.
|
||||
hideTimeFormatToggle={!!timeFormatFromProfile}
|
||||
/>
|
||||
),
|
||||
[timeZone, timeFormat]
|
||||
[timeZone, timeFormat, timeFormatFromProfile]
|
||||
);
|
||||
const rawSlug = profile.slug ? profile.slug.split("/") : [];
|
||||
if (rawSlug.length > 1) rawSlug.pop(); //team events have team name as slug, but user events have [user]/[type] as slug.
|
||||
@@ -385,201 +394,109 @@ const AvailabilityPage = ({ profile, eventType }: Props) => {
|
||||
<div>
|
||||
<main
|
||||
className={classNames(
|
||||
shouldAlignCentrally ? "mx-auto" : "",
|
||||
isEmbed
|
||||
? classNames(maxWidth)
|
||||
: classNames("transition-max-width mx-auto my-0 duration-500 ease-in-out md:my-24", maxWidth)
|
||||
"flex flex-col",
|
||||
shouldAlignCentrally ? "items-center" : "items-start",
|
||||
!isEmbed && classNames("mx-auto my-0 ease-in-out md:my-24")
|
||||
)}>
|
||||
<div
|
||||
style={availabilityDatePickerEmbedStyles}
|
||||
className={classNames(
|
||||
isBackgroundTransparent ? "" : "dark:bg-darkgray-100 sm:dark:border-darkgray-300 bg-white",
|
||||
"border-bookinglightest overflow-hidden rounded-md md:border",
|
||||
isEmbed ? "mx-auto" : maxWidth
|
||||
)}>
|
||||
{/* mobile: details */}
|
||||
<div className="block px-4 pt-4 sm:p-8 md:hidden">
|
||||
<div>
|
||||
<UserAvatars
|
||||
profile={profile}
|
||||
users={eventType.users}
|
||||
showMembers={eventType.schedulingType !== SchedulingType.ROUND_ROBIN}
|
||||
size={9}
|
||||
truncateAfter={5}
|
||||
/>
|
||||
<div className="mt-4">
|
||||
<div className="dark:text-darkgray-900 mt-2 gap-2">
|
||||
<p className="break-words text-sm font-medium text-gray-600 dark:text-gray-300">
|
||||
{profile.name}
|
||||
</p>
|
||||
<h1 className="text-bookingdark dark:text-darkgray-900 mb-4 break-words text-xl font-semibold">
|
||||
{eventType.title}
|
||||
</h1>
|
||||
<div className="flex flex-col space-y-3">
|
||||
{eventType?.description && (
|
||||
<div className="dark:text-darkgray-600 flex py-1 text-sm font-medium text-gray-600">
|
||||
<div>
|
||||
<Icon.FiInfo className="mr-[10px] ml-[2px] inline-block h-4 w-4" />
|
||||
</div>
|
||||
<EventTypeDescriptionSafeHTML eventType={eventType} />
|
||||
<div>
|
||||
<div
|
||||
style={availabilityDatePickerEmbedStyles}
|
||||
className={classNames(
|
||||
isBackgroundTransparent
|
||||
? ""
|
||||
: "dark:bg-darkgray-100 sm:dark:border-darkgray-300 bg-white pb-4 md:pb-0",
|
||||
"border-bookinglightest overflow-hidden rounded-md md:border",
|
||||
isEmbed && "mx-auto"
|
||||
)}>
|
||||
<div className="overflow-hidden md:flex">
|
||||
<div
|
||||
className={classNames(
|
||||
"sm:dark:border-darkgray-200 flex flex-col border-gray-200 p-5 sm:border-r",
|
||||
"min-w-full md:w-[280px] md:min-w-[280px]",
|
||||
recurringEventCount && "xl:w-[380px] xl:min-w-[380px]"
|
||||
)}>
|
||||
<UserAvatars
|
||||
profile={profile}
|
||||
users={eventType.users}
|
||||
showMembers={eventType.schedulingType !== SchedulingType.ROUND_ROBIN}
|
||||
size={10}
|
||||
truncateAfter={3}
|
||||
/>
|
||||
<h2 className="mt-2 break-words text-sm font-medium text-gray-600 dark:text-gray-300">
|
||||
{profile.name}
|
||||
</h2>
|
||||
<h1 className="font-cal dark:text-darkgray-900 mb-6 break-words text-2xl font-semibold text-gray-900">
|
||||
{eventType.title}
|
||||
</h1>
|
||||
<div className="dark:text-darkgray-600 flex flex-col space-y-3 text-sm font-medium text-gray-600">
|
||||
{eventType?.description && (
|
||||
<div className="flex">
|
||||
<div>
|
||||
<Icon.FiInfo className="mr-[10px] ml-[2px] inline-block h-4 w-4" />
|
||||
</div>
|
||||
)}
|
||||
{eventType?.requiresConfirmation && (
|
||||
<p className="dark:text-darkgray-600 text-gray-600">
|
||||
<Icon.FiCheckSquare className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4" />
|
||||
{t("requires_confirmation")}
|
||||
</p>
|
||||
)}
|
||||
<AvailableEventLocations locations={eventType.locations} />
|
||||
<p className="dark:text-darkgray-600 text-gray-600">
|
||||
<Icon.FiClock className="mr-[10px] -mt-1 ml-[2px] inline-block h-4 w-4" />
|
||||
{eventType.length} {t("minutes")}
|
||||
<EventTypeDescriptionSafeHTML eventType={eventType} />
|
||||
</div>
|
||||
)}
|
||||
{eventType?.requiresConfirmation && (
|
||||
<div className="flex items-center">
|
||||
<div>
|
||||
<Icon.FiCheckSquare className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4 " />
|
||||
</div>
|
||||
{t("requires_confirmation")}
|
||||
</div>
|
||||
)}
|
||||
<AvailableEventLocations locations={eventType.locations} />
|
||||
<p className="text-sm font-medium">
|
||||
<Icon.FiClock className="mr-[10px] -mt-1 ml-[2px] inline-block h-4 w-4" />
|
||||
{eventType.length} {t("minutes")}
|
||||
</p>
|
||||
{!rescheduleUid && eventType.recurringEvent && (
|
||||
<div className="flex items-start text-sm font-medium">
|
||||
<Icon.FiRefreshCcw className="float-left mr-[10px] mt-[7px] ml-[2px] inline-block h-4 w-4 " />
|
||||
<div>
|
||||
<p className="mb-1 -ml-2 inline px-2 py-1">
|
||||
{getRecurringFreq({ t, recurringEvent: eventType.recurringEvent })}
|
||||
</p>
|
||||
<input
|
||||
type="number"
|
||||
min="1"
|
||||
max={eventType.recurringEvent.count}
|
||||
className="w-15 dark:bg-darkgray-200 h-7 rounded-sm border-gray-300 bg-white text-sm font-medium [appearance:textfield] ltr:mr-2 rtl:ml-2 dark:border-gray-500"
|
||||
defaultValue={eventType.recurringEvent.count}
|
||||
onChange={(event) => {
|
||||
setRecurringEventCount(parseInt(event?.target.value));
|
||||
}}
|
||||
/>
|
||||
<p className="inline">
|
||||
{t("occurrence", {
|
||||
count: recurringEventCount,
|
||||
})}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{eventType.price > 0 && (
|
||||
<p className="-ml-2 px-2 text-sm font-medium">
|
||||
<Icon.FiCreditCard className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4" />
|
||||
<IntlProvider locale="en">
|
||||
<FormattedNumber
|
||||
value={eventType.price / 100.0}
|
||||
style="currency"
|
||||
currency={eventType.currency.toUpperCase()}
|
||||
/>
|
||||
</IntlProvider>
|
||||
</p>
|
||||
{eventType.price > 0 && (
|
||||
<div className="dark:text-darkgray-600 text-gray-600">
|
||||
<Icon.FiCreditCard className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4" />
|
||||
<IntlProvider locale="en">
|
||||
<FormattedNumber
|
||||
value={eventType.price / 100.0}
|
||||
style="currency"
|
||||
currency={eventType.currency.toUpperCase()}
|
||||
/>
|
||||
</IntlProvider>
|
||||
</div>
|
||||
)}
|
||||
{!rescheduleUid && eventType.recurringEvent && (
|
||||
<div className="dark:text-darkgray-600 flex items-center text-gray-600">
|
||||
<Icon.FiRefreshCcw className="float-left mr-[10px] mt-1 ml-[2px] inline-block h-4 w-4 shrink-0 text-gray-500" />
|
||||
<div>
|
||||
<p className="mb-1 -ml-2 inline px-2 py-1">
|
||||
{getRecurringFreq({ t, recurringEvent: eventType.recurringEvent })}
|
||||
</p>
|
||||
<input
|
||||
type="number"
|
||||
min="1"
|
||||
max={eventType.recurringEvent.count}
|
||||
className="w-15 dark:text-darkgray-600 h-7 rounded-sm border-gray-300 bg-white text-sm text-gray-600 [appearance:textfield] ltr:mr-2 rtl:ml-2 dark:border-gray-500 dark:bg-gray-600"
|
||||
defaultValue={eventType.recurringEvent.count}
|
||||
onChange={(event) => {
|
||||
setRecurringEventCount(parseInt(event?.target.value));
|
||||
}}
|
||||
/>
|
||||
<p className="dark:text-darkgray-600 inline text-gray-600">
|
||||
{t("occurrence", {
|
||||
count: recurringEventCount,
|
||||
})}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{timezoneDropdown}
|
||||
|
||||
<div className="md:hidden">
|
||||
{/* Temp disabled booking?.startTime && rescheduleUid && (
|
||||
<div>
|
||||
<p
|
||||
className="mt-8 text-gray-600 dark:text-darkgray-600"
|
||||
data-testid="former_time_p_mobile">
|
||||
{t("former_time")}
|
||||
</p>
|
||||
<p className="text-gray-500 line-through dark:text-darkgray-600">
|
||||
<CalendarIcon className="mr-[10px] -mt-1 inline-block h-4 w-4 text-gray-500" />
|
||||
{typeof booking.startTime === "string" &&
|
||||
parseDate(dayjs(booking.startTime), i18n)}
|
||||
</p>
|
||||
</div>
|
||||
)*/}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{timezoneDropdown}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="overflow-hidden sm:flex">
|
||||
<div
|
||||
className={
|
||||
"sm:dark:border-darkgray-200 hidden overflow-hidden border-gray-200 p-5 sm:border-r md:flex md:flex-col " +
|
||||
(isAvailableTimesVisible ? "sm:w-1/3" : recurringEventCount ? "sm:w-2/3" : "sm:w-1/2")
|
||||
}>
|
||||
<UserAvatars
|
||||
profile={profile}
|
||||
users={eventType.users}
|
||||
showMembers={eventType.schedulingType !== SchedulingType.ROUND_ROBIN}
|
||||
size={10}
|
||||
truncateAfter={3}
|
||||
/>
|
||||
<h2 className="break-words text-sm font-medium text-gray-600 dark:text-gray-300 lg:mt-2">
|
||||
{profile.name}
|
||||
</h2>
|
||||
<h1 className="font-cal dark:text-darkgray-900 mb-6 break-words text-2xl text-gray-900">
|
||||
{eventType.title}
|
||||
</h1>
|
||||
<div className="dark:text-darkgray-600 flex flex-col space-y-3 text-sm font-medium text-gray-600">
|
||||
{eventType?.description && (
|
||||
<div className="flex">
|
||||
<div>
|
||||
<Icon.FiInfo className="mr-[10px] ml-[2px] inline-block h-4 w-4" />
|
||||
</div>
|
||||
<EventTypeDescriptionSafeHTML eventType={eventType} />
|
||||
{!isEmbed && (
|
||||
<div className="mt-auto hidden md:block">
|
||||
<GoBackToPreviousPage t={t} />
|
||||
</div>
|
||||
)}
|
||||
{eventType?.requiresConfirmation && (
|
||||
<div className="flex items-center">
|
||||
<div>
|
||||
<Icon.FiCheckSquare className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4 " />
|
||||
</div>
|
||||
{t("requires_confirmation")}
|
||||
</div>
|
||||
)}
|
||||
<AvailableEventLocations locations={eventType.locations} />
|
||||
<p className="text-sm font-medium">
|
||||
<Icon.FiClock className="mr-[10px] -mt-1 ml-[2px] inline-block h-4 w-4" />
|
||||
{eventType.length} {t("minutes")}
|
||||
</p>
|
||||
{!rescheduleUid && eventType.recurringEvent && (
|
||||
<div className="flex items-start text-sm font-medium">
|
||||
<Icon.FiRefreshCcw className="float-left mr-[10px] mt-[7px] ml-[2px] inline-block h-4 w-4 " />
|
||||
<div>
|
||||
<p className="mb-1 -ml-2 inline px-2 py-1">
|
||||
{getRecurringFreq({ t, recurringEvent: eventType.recurringEvent })}
|
||||
</p>
|
||||
<input
|
||||
type="number"
|
||||
min="1"
|
||||
max={eventType.recurringEvent.count}
|
||||
className="w-15 dark:bg-darkgray-200 h-7 rounded-sm border-gray-300 bg-white text-sm font-medium [appearance:textfield] ltr:mr-2 rtl:ml-2 dark:border-gray-500"
|
||||
defaultValue={eventType.recurringEvent.count}
|
||||
onChange={(event) => {
|
||||
setRecurringEventCount(parseInt(event?.target.value));
|
||||
}}
|
||||
/>
|
||||
<p className="inline">
|
||||
{t("occurrence", {
|
||||
count: recurringEventCount,
|
||||
})}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{eventType.price > 0 && (
|
||||
<p className="-ml-2 px-2 text-sm font-medium">
|
||||
<Icon.FiCreditCard className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4" />
|
||||
<IntlProvider locale="en">
|
||||
<FormattedNumber
|
||||
value={eventType.price / 100.0}
|
||||
style="currency"
|
||||
currency={eventType.currency.toUpperCase()}
|
||||
/>
|
||||
</IntlProvider>
|
||||
</p>
|
||||
)}
|
||||
{timezoneDropdown}
|
||||
</div>
|
||||
|
||||
{!isEmbed && <GoBackToPreviousPage t={t} />}
|
||||
|
||||
{/* Temporarily disabled - booking?.startTime && rescheduleUid && (
|
||||
{/* Temporarily disabled - booking?.startTime && rescheduleUid && (
|
||||
<div>
|
||||
<p
|
||||
className="mt-4 mb-3 text-gray-600 dark:text-darkgray-600"
|
||||
@@ -592,26 +509,33 @@ const AvailabilityPage = ({ profile, eventType }: Props) => {
|
||||
</p>
|
||||
</div>
|
||||
)*/}
|
||||
</div>
|
||||
<SlotPicker
|
||||
weekStart={
|
||||
typeof profile.weekStart === "string"
|
||||
? ([
|
||||
"Sunday",
|
||||
"Monday",
|
||||
"Tuesday",
|
||||
"Wednesday",
|
||||
"Thursday",
|
||||
"Friday",
|
||||
"Saturday",
|
||||
].indexOf(profile.weekStart) as 0 | 1 | 2 | 3 | 4 | 5 | 6)
|
||||
: profile.weekStart /* Allows providing weekStart as number */
|
||||
}
|
||||
eventType={eventType}
|
||||
timeFormat={timeFormat}
|
||||
timeZone={timeZone}
|
||||
users={userList}
|
||||
seatsPerTimeSlot={eventType.seatsPerTimeSlot || undefined}
|
||||
recurringEventCount={recurringEventCount}
|
||||
ethSignature={gateState.rainbowToken}
|
||||
/>
|
||||
</div>
|
||||
<SlotPicker
|
||||
weekStart={
|
||||
typeof profile.weekStart === "string"
|
||||
? (["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"].indexOf(
|
||||
profile.weekStart
|
||||
) as 0 | 1 | 2 | 3 | 4 | 5 | 6)
|
||||
: profile.weekStart /* Allows providing weekStart as number */
|
||||
}
|
||||
eventType={eventType}
|
||||
timeFormat={timeFormat}
|
||||
timeZone={timeZone}
|
||||
users={userList}
|
||||
seatsPerTimeSlot={eventType.seatsPerTimeSlot || undefined}
|
||||
recurringEventCount={recurringEventCount}
|
||||
ethSignature={gateState.rainbowToken}
|
||||
/>
|
||||
</div>
|
||||
{(!eventType.users[0] || !isBrandingHidden(eventType.users[0])) && !isEmbed && <PoweredByCal />}
|
||||
</div>
|
||||
{(!eventType.users[0] || !isBrandingHidden(eventType.users[0])) && !isEmbed && <PoweredByCal />}
|
||||
</main>
|
||||
</div>
|
||||
<Toaster position="bottom-right" />
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { zodResolver } from "@hookform/resolvers/zod";
|
||||
import { EventTypeCustomInputType, WorkflowActions } from "@prisma/client";
|
||||
import { SchedulingType } from "@prisma/client";
|
||||
import { useMutation } from "@tanstack/react-query";
|
||||
import { isValidPhoneNumber } from "libphonenumber-js";
|
||||
import { useSession } from "next-auth/react";
|
||||
import Head from "next/head";
|
||||
@@ -9,7 +10,6 @@ import { useEffect, useMemo, useState, useReducer } from "react";
|
||||
import { Controller, useForm, useWatch } from "react-hook-form";
|
||||
import { FormattedNumber, IntlProvider } from "react-intl";
|
||||
import { ReactMultiEmail } from "react-multi-email";
|
||||
import { useMutation } from "react-query";
|
||||
import { v4 as uuidv4 } from "uuid";
|
||||
import { z } from "zod";
|
||||
|
||||
@@ -445,7 +445,6 @@ const BookingPage = ({
|
||||
<div
|
||||
className={classNames(
|
||||
"main overflow-hidden",
|
||||
isEmbed ? "" : "border border-gray-200",
|
||||
isBackgroundTransparent ? "" : "dark:border-1 dark:bg-darkgray-100 bg-white",
|
||||
"dark:border-darkgray-300 rounded-md sm:border"
|
||||
)}>
|
||||
@@ -713,23 +712,25 @@ const BookingPage = ({
|
||||
/>
|
||||
)}
|
||||
{input.type === EventTypeCustomInputType.BOOL && (
|
||||
<div className="flex h-5 items-center">
|
||||
<input
|
||||
type="checkbox"
|
||||
{...bookingForm.register(`customInputs.${input.id}`, {
|
||||
required: input.required,
|
||||
})}
|
||||
required={input.required}
|
||||
id={"custom_" + input.id}
|
||||
className="h-4 w-4 rounded border-gray-300 text-black focus:ring-black disabled:bg-gray-200 ltr:mr-2 rtl:ml-2 disabled:dark:text-gray-500"
|
||||
placeholder=""
|
||||
disabled={disabledExceptForOwner}
|
||||
/>
|
||||
<label
|
||||
htmlFor={"custom_" + input.id}
|
||||
className="mb-1 block text-sm font-medium text-gray-700 dark:text-white">
|
||||
{input.label}
|
||||
</label>
|
||||
<div className="my-6">
|
||||
<div className="flex">
|
||||
<input
|
||||
type="checkbox"
|
||||
{...bookingForm.register(`customInputs.${input.id}`, {
|
||||
required: input.required,
|
||||
})}
|
||||
required={input.required}
|
||||
id={"custom_" + input.id}
|
||||
className="h-4 w-4 rounded border-gray-300 text-black focus:ring-black disabled:bg-gray-200 ltr:mr-2 rtl:ml-2 disabled:dark:text-gray-500"
|
||||
placeholder=""
|
||||
disabled={disabledExceptForOwner}
|
||||
/>
|
||||
<label
|
||||
htmlFor={"custom_" + input.id}
|
||||
className="-mt-px block text-sm font-medium text-gray-700 dark:text-white">
|
||||
{input.label}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { useMutation } from "@tanstack/react-query";
|
||||
import { RescheduleResponse } from "pages/api/book/request-reschedule";
|
||||
import React, { useState, Dispatch, SetStateAction } from "react";
|
||||
import { useMutation } from "react-query";
|
||||
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import showToast from "@calcom/lib/notification";
|
||||
|
||||
@@ -14,10 +14,11 @@ const CalendarItem = (props: ICalendarItem) => {
|
||||
const { title, imageSrc, type } = props;
|
||||
const { t } = useLocale();
|
||||
return (
|
||||
<div className="flex flex-row items-center p-5">
|
||||
<img src={imageSrc} alt={title} className="h-8 w-8" />
|
||||
<p className="mx-3 text-sm font-bold">{title}</p>
|
||||
|
||||
<div className="flex flex-row items-center justify-between p-5">
|
||||
<div className="flex items-center space-x-3">
|
||||
<img src={imageSrc} alt={title} className="h-8 w-8" />
|
||||
<p className="text-sm font-bold">{title}</p>
|
||||
</div>
|
||||
<InstallAppButtonWithoutPlanCheck
|
||||
type={type}
|
||||
render={(buttonProps) => (
|
||||
@@ -29,8 +30,7 @@ const CalendarItem = (props: ICalendarItem) => {
|
||||
// Save cookie key to return url step
|
||||
document.cookie = `return-to=${window.location.href};path=/;max-age=3600;SameSite=Lax`;
|
||||
buttonProps && buttonProps.onClick && buttonProps?.onClick(event);
|
||||
}}
|
||||
className="ml-auto rounded-md border border-gray-200 py-[10px] px-4 text-sm font-bold">
|
||||
}}>
|
||||
{t("connect")}
|
||||
</Button>
|
||||
)}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useMutation } from "react-query";
|
||||
import { useMutation } from "@tanstack/react-query";
|
||||
|
||||
import showToast from "@calcom/lib/notification";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
|
||||
@@ -76,7 +76,7 @@ const ConnectedCalendars = (props: IConnectCalendarsProps) => {
|
||||
</List>
|
||||
)}
|
||||
|
||||
{queryConnectedCalendars.isLoading && (
|
||||
{queryIntegrations.isLoading && (
|
||||
<ul className="divide-y divide-gray-200 rounded-md border border-gray-200 bg-white p-0 dark:bg-black">
|
||||
{[0, 0, 0, 0].map((_item, index) => {
|
||||
return (
|
||||
|
||||
@@ -149,7 +149,7 @@ const UserProfile = (props: IUserProfile) => {
|
||||
}}
|
||||
/>
|
||||
{errors.bio && (
|
||||
<p data-testid="required" className="text-xs italic text-red-500">
|
||||
<p data-testid="required" className="py-2 text-xs text-red-500">
|
||||
{t("required")}
|
||||
</p>
|
||||
)}
|
||||
|
||||
@@ -85,7 +85,7 @@ const UserSettings = (props: IUserSettingsProps) => {
|
||||
className="w-full rounded-md border border-gray-300 text-sm"
|
||||
/>
|
||||
{errors.name && (
|
||||
<p data-testid="required" className="text-xs italic text-red-500">
|
||||
<p data-testid="required" className="py-2 text-xs text-red-500">
|
||||
{t("required")}
|
||||
</p>
|
||||
)}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useMutation } from "@tanstack/react-query";
|
||||
import { Fragment } from "react";
|
||||
import { useMutation } from "react-query";
|
||||
|
||||
import { InstallAppButton } from "@calcom/app-store/components";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useMutation } from "@tanstack/react-query";
|
||||
import { useState } from "react";
|
||||
import { useMutation } from "react-query";
|
||||
|
||||
import showToast from "@calcom/lib/notification";
|
||||
import { ButtonBaseProps } from "@calcom/ui/Button";
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
import Link from "next/link";
|
||||
import { TeamPageProps } from "pages/team/[slug]";
|
||||
import React from "react";
|
||||
|
||||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import Button from "@calcom/ui/Button";
|
||||
import { Icon } from "@calcom/ui/Icon";
|
||||
import { Avatar } from "@calcom/ui/v2";
|
||||
|
||||
import { useLocale } from "@lib/hooks/useLocale";
|
||||
@@ -13,46 +10,46 @@ type TeamType = TeamPageProps["team"];
|
||||
type MembersType = TeamType["members"];
|
||||
type MemberType = MembersType[number];
|
||||
|
||||
const Team = ({ team }: TeamPageProps) => {
|
||||
const Member = ({ member, teamName }: { member: MemberType; teamName: string | null }) => {
|
||||
const { t } = useLocale();
|
||||
|
||||
const Member = ({ member }: { member: MemberType }) => {
|
||||
return (
|
||||
<Link key={member.id} href={`/${member.username}`}>
|
||||
<div className="sm:min-w-80 sm:max-w-80 dark:bg-darkgray-200 dark:hover:bg-darkgray-300 group flex h-full flex-col space-y-2 rounded-md bg-white p-4 hover:cursor-pointer hover:bg-gray-50 ">
|
||||
<Avatar
|
||||
size="md"
|
||||
alt={member.name || ""}
|
||||
imageSrc={WEBAPP_URL + "/" + member.username + "/avatar.png"}
|
||||
/>
|
||||
<section className="line-clamp-4 mt-2 w-full space-y-1">
|
||||
<p className="font-medium text-neutral-900 dark:text-white">{member.name}</p>
|
||||
<p className="line-clamp-3 overflow-ellipsis text-sm font-normal text-neutral-500 dark:text-white">
|
||||
{member.bio || t("user_from_team", { user: member.name, team: team.name })}
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
</Link>
|
||||
);
|
||||
};
|
||||
return (
|
||||
<Link key={member.id} href={`/${member.username}`}>
|
||||
<div className="sm:min-w-80 sm:max-w-80 dark:bg-darkgray-200 dark:hover:bg-darkgray-300 group flex min-h-full w-[90%] flex-col space-y-2 rounded-md bg-white p-4 hover:cursor-pointer hover:bg-gray-50 ">
|
||||
<Avatar
|
||||
size="md"
|
||||
alt={member.name || ""}
|
||||
imageSrc={WEBAPP_URL + "/" + member.username + "/avatar.png"}
|
||||
/>
|
||||
<section className="line-clamp-4 mt-2 w-full space-y-1">
|
||||
<p className="font-medium text-neutral-900 dark:text-white">{member.name}</p>
|
||||
<p className="line-clamp-3 overflow-ellipsis text-sm font-normal text-neutral-500 dark:text-white">
|
||||
{member.bio || t("user_from_team", { user: member.name, team: teamName })}
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
</Link>
|
||||
);
|
||||
};
|
||||
|
||||
const Members = ({ members }: { members: MembersType }) => {
|
||||
if (!members || members.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<section className="lg:min-w-lg mx-auto flex min-w-full max-w-5xl flex-wrap justify-center gap-x-6 gap-y-6">
|
||||
{members.map((member) => {
|
||||
return member.username !== null && <Member key={member.id} member={member} />;
|
||||
})}
|
||||
</section>
|
||||
);
|
||||
};
|
||||
const Members = ({ members, teamName }: { members: MembersType; teamName: string | null }) => {
|
||||
if (!members || members.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<section className="lg:min-w-lg mx-auto flex min-w-full max-w-5xl flex-wrap justify-center gap-x-6 gap-y-6">
|
||||
{members.map((member) => {
|
||||
return member.username !== null && <Member key={member.id} member={member} teamName={teamName} />;
|
||||
})}
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
const Team = ({ team }: TeamPageProps) => {
|
||||
return (
|
||||
<div>
|
||||
<Members members={team.members} />
|
||||
<Members members={team.members} teamName={team.name} />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,50 +1,48 @@
|
||||
import { useState } from "react";
|
||||
import classNames from "classnames";
|
||||
import React, { useState } from "react";
|
||||
import { ControllerRenderProps } from "react-hook-form";
|
||||
|
||||
import { Icon } from "@calcom/ui/Icon";
|
||||
|
||||
const EditableHeading = ({
|
||||
title,
|
||||
const EditableHeading = function EditableHeading({
|
||||
value,
|
||||
onChange,
|
||||
placeholder = "",
|
||||
readOnly = false,
|
||||
isReady,
|
||||
...passThroughProps
|
||||
}: {
|
||||
title: string;
|
||||
onChange?: (value: string) => void;
|
||||
placeholder?: string;
|
||||
readOnly?: boolean;
|
||||
}) => {
|
||||
isReady?: boolean;
|
||||
} & Omit<JSX.IntrinsicElements["input"], "name" | "onChange"> &
|
||||
ControllerRenderProps) {
|
||||
const [isEditing, setIsEditing] = useState(false);
|
||||
const enableEditing = () => !readOnly && setIsEditing(true);
|
||||
const enableEditing = () => setIsEditing(true);
|
||||
return (
|
||||
<div className="group relative cursor-pointer" onClick={enableEditing}>
|
||||
{!isEditing ? (
|
||||
<>
|
||||
<h1
|
||||
style={{ fontSize: 22, letterSpacing: "-0.0009em" }}
|
||||
className="inline pl-0 normal-case text-gray-900 focus:text-black group-hover:text-gray-500">
|
||||
{title}
|
||||
</h1>
|
||||
{!readOnly ? (
|
||||
<Icon.FiEdit2 className="ml-1 -mt-1 inline h-4 w-4 text-gray-700 group-hover:text-gray-500" />
|
||||
) : null}
|
||||
</>
|
||||
) : (
|
||||
<div style={{ marginBottom: -11 }}>
|
||||
<div className="flex items-center">
|
||||
<label className="min-w-8 relative inline-block">
|
||||
<span className="whitespace-pre text-xl tracking-normal text-transparent">{value} </span>
|
||||
{!isEditing && isReady && (
|
||||
<Icon.FiEdit2 className="ml-1 inline h-4 w-4 align-top text-gray-700 group-hover:text-gray-500" />
|
||||
)}
|
||||
<input
|
||||
{...passThroughProps}
|
||||
type="text"
|
||||
autoFocus
|
||||
style={{ top: -6, fontSize: 22 }}
|
||||
value={value}
|
||||
required
|
||||
className="relative h-10 w-full cursor-pointer border-none bg-transparent pl-0 text-gray-900 hover:text-gray-700 focus:text-black focus:outline-none focus:ring-0"
|
||||
placeholder={placeholder}
|
||||
defaultValue={title}
|
||||
className={classNames(
|
||||
"absolute top-0 left-0 w-full cursor-pointer border-none bg-transparent p-0 align-top text-xl text-gray-900 hover:text-gray-700 focus:text-black focus:outline-none focus:ring-0"
|
||||
)}
|
||||
onFocus={(e) => {
|
||||
setIsEditing(true);
|
||||
passThroughProps.onFocus && passThroughProps.onFocus(e);
|
||||
}}
|
||||
onBlur={(e) => {
|
||||
setIsEditing(false);
|
||||
onChange && onChange(e.target.value);
|
||||
passThroughProps.onBlur && passThroughProps.onBlur(e);
|
||||
}}
|
||||
onChange={(e) => onChange && onChange(e.target.value)}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import React, { FC } from "react";
|
||||
|
||||
import Dropdown, { DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@calcom/ui/Dropdown";
|
||||
import Dropdown, {
|
||||
DropdownMenuContent,
|
||||
DropdownMenuItem,
|
||||
DropdownMenuTrigger,
|
||||
DropdownMenuPortal,
|
||||
} from "@calcom/ui/Dropdown";
|
||||
import { Icon } from "@calcom/ui/Icon";
|
||||
import Button from "@calcom/ui/v2/core/Button";
|
||||
|
||||
@@ -43,22 +48,24 @@ const DropdownActions = ({
|
||||
) : (
|
||||
<DropdownMenuTrigger asChild>{actionTrigger}</DropdownMenuTrigger>
|
||||
)}
|
||||
<DropdownMenuContent portalled>
|
||||
{actions.map((action) => (
|
||||
<DropdownMenuItem key={action.id} className="focus-visible:outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
color="minimal"
|
||||
className="w-full rounded-none font-normal"
|
||||
href={action.href}
|
||||
StartIcon={action.icon}
|
||||
onClick={action.onClick || defaultAction}
|
||||
data-testid={action.id}>
|
||||
{action.label}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
))}
|
||||
</DropdownMenuContent>
|
||||
<DropdownMenuPortal>
|
||||
<DropdownMenuContent>
|
||||
{actions.map((action) => (
|
||||
<DropdownMenuItem key={action.id} className="focus-visible:outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
color="minimal"
|
||||
className="w-full rounded-none font-normal"
|
||||
href={action.href}
|
||||
StartIcon={action.icon}
|
||||
onClick={action.onClick || defaultAction}
|
||||
data-testid={action.id}>
|
||||
{action.label}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
))}
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenuPortal>
|
||||
</Dropdown>
|
||||
);
|
||||
};
|
||||
@@ -70,6 +77,7 @@ const TableActions: FC<Props> = ({ actions }) => {
|
||||
{actions.map((action) => {
|
||||
const button = (
|
||||
<Button
|
||||
className="whitespace-nowrap"
|
||||
key={action.id}
|
||||
data-testid={action.id}
|
||||
href={action.href}
|
||||
|
||||
@@ -91,11 +91,10 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
|
||||
const isCurrentUsernamePremium =
|
||||
user && user.metadata && hasKeyInMetadata(user, "isPremium") ? !!user.metadata.isPremium : false;
|
||||
const [isInputUsernamePremium, setIsInputUsernamePremium] = useState(false);
|
||||
|
||||
const debouncedApiCall = useCallback(
|
||||
debounce(async (username) => {
|
||||
debounce(async (username: string) => {
|
||||
const { data } = await fetchUsername(username);
|
||||
setMarkAsError(!data.available && username && username !== currentUsername);
|
||||
setMarkAsError(!data.available && !!currentUsername && username !== currentUsername);
|
||||
setIsInputUsernamePremium(data.premium);
|
||||
setUsernameIsAvailable(data.available);
|
||||
}, 150),
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import React from "react";
|
||||
import Select from "react-select";
|
||||
import { OptionProps } from "react-select";
|
||||
|
||||
import { InstallAppButton } from "@calcom/app-store/components";
|
||||
@@ -8,6 +7,7 @@ import { trpc } from "@calcom/trpc/react";
|
||||
import type { App } from "@calcom/types/App";
|
||||
import { Button } from "@calcom/ui";
|
||||
import { Icon } from "@calcom/ui/Icon";
|
||||
import { Select } from "@calcom/ui/v2";
|
||||
|
||||
import { QueryCell } from "@lib/QueryCell";
|
||||
|
||||
@@ -65,23 +65,7 @@ const AdditionalCalendarSelector = ({ isLoading }: AdditionalCalendarSelectorPro
|
||||
name="additionalCalendar"
|
||||
placeholder={t("install_another")}
|
||||
options={options}
|
||||
styles={{
|
||||
placeholder: (defaultStyles) => {
|
||||
return {
|
||||
...defaultStyles,
|
||||
color: "#3E3E3E",
|
||||
marginLeft: "3px",
|
||||
};
|
||||
},
|
||||
control: (defaultStyles) => {
|
||||
return {
|
||||
...defaultStyles,
|
||||
borderRadius: "6px",
|
||||
};
|
||||
},
|
||||
}}
|
||||
isSearchable={false}
|
||||
className="min-w-52 block w-full flex-1 rounded-none rounded-r-sm border-gray-300 text-sm font-medium text-gray-700"
|
||||
isLoading={isLoading}
|
||||
components={{ Option: ImageOption }}
|
||||
/>
|
||||
|
||||
@@ -66,7 +66,7 @@ const Component = ({
|
||||
return (
|
||||
<div className="relative flex-1 flex-col items-start justify-start px-4 md:flex md:px-8 lg:flex-row lg:px-0">
|
||||
{hasImages && (
|
||||
<div className="flex-2 mb-4 -ml-4 -mr-4 flex min-h-[450px] w-auto min-w-[672px] snap-x snap-mandatory flex-row overflow-auto whitespace-nowrap bg-gray-100 p-4 md:mb-8 md:-ml-8 md:-mr-8 md:p-8 lg:mx-0 lg:mb-0 lg:max-w-2xl lg:flex-col lg:rounded-md">
|
||||
<div className="flex-2 mb-4 -ml-4 -mr-4 flex min-h-[450px] w-auto snap-x snap-mandatory flex-row overflow-auto whitespace-nowrap bg-gray-100 p-4 md:mb-8 md:-ml-8 md:-mr-8 md:p-8 lg:mx-0 lg:mb-0 lg:max-w-2xl lg:flex-col lg:rounded-md">
|
||||
{images ? (
|
||||
images.map((img) => (
|
||||
<img
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { useMutation } from "@tanstack/react-query";
|
||||
import Link from "next/link";
|
||||
import { Fragment } from "react";
|
||||
import { useMutation } from "react-query";
|
||||
|
||||
import { InstallAppButton } from "@calcom/app-store/components";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
|
||||
@@ -32,7 +32,7 @@ function IntegrationListItem(props: {
|
||||
<ListItem
|
||||
expanded={!!props.children}
|
||||
className={classNames(
|
||||
"my-0 flex-col rounded-md border transition-colors duration-500",
|
||||
"my-0 flex-col border transition-colors duration-500 first:rounded-t-md last:rounded-b-md",
|
||||
highlight ? "bg-yellow-100" : ""
|
||||
)}>
|
||||
<div className={classNames("flex w-full flex-1 items-center space-x-2 p-4 rtl:space-x-reverse")}>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import classNames from "classnames";
|
||||
import React from "react";
|
||||
|
||||
import { SkeletonText } from "@calcom/ui/v2";
|
||||
@@ -32,9 +33,13 @@ function SkeletonItem() {
|
||||
);
|
||||
}
|
||||
|
||||
export const AvailabilitySelectSkeletonLoader = () => {
|
||||
export const SelectSkeletonLoader = ({ className }: { className?: string }) => {
|
||||
return (
|
||||
<li className="group flex w-full items-center justify-between rounded-sm border border-gray-200 px-[10px] py-3">
|
||||
<li
|
||||
className={classNames(
|
||||
"group flex w-full items-center justify-between rounded-sm border border-gray-200 px-[10px] py-3",
|
||||
className
|
||||
)}>
|
||||
<div className="flex-grow truncate text-sm">
|
||||
<div className="flex justify-between">
|
||||
<SkeletonText className="h-4 w-32" />
|
||||
|
||||
@@ -8,10 +8,10 @@ import { weekdayNames } from "@calcom/lib/weekday";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { Icon } from "@calcom/ui";
|
||||
import Button from "@calcom/ui/v2/core/Button";
|
||||
import Select from "@calcom/ui/v2/core/form/Select";
|
||||
import Select from "@calcom/ui/v2/core/form/select";
|
||||
import { SkeletonText } from "@calcom/ui/v2/core/skeleton";
|
||||
|
||||
import { AvailabilitySelectSkeletonLoader } from "@components/v2/availability/SkeletonLoader";
|
||||
import { SelectSkeletonLoader } from "@components/v2/availability/SkeletonLoader";
|
||||
|
||||
type AvailabilityOption = {
|
||||
label: string;
|
||||
@@ -30,7 +30,7 @@ const AvailabilitySelect = ({
|
||||
}) => {
|
||||
const { data, isLoading } = trpc.useQuery(["viewer.availability.list"]);
|
||||
if (isLoading) {
|
||||
return <AvailabilitySelectSkeletonLoader />;
|
||||
return <SelectSkeletonLoader />;
|
||||
}
|
||||
|
||||
const schedules = data?.schedules || [];
|
||||
|
||||
@@ -40,9 +40,9 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
|
||||
const { t } = useLocale();
|
||||
const [showEventNameTip, setShowEventNameTip] = useState(false);
|
||||
const [hashedLinkVisible, setHashedLinkVisible] = useState(!!eventType.hashedLink);
|
||||
const [redirectUrlVisible, setRedirectUrlVisible] = useState(!!eventType.successRedirectUrl);
|
||||
const [hashedUrl, setHashedUrl] = useState(eventType.hashedLink?.link);
|
||||
const [seatsInputVisible, setSeatsInputVisible] = useState(!!eventType.seatsPerTimeSlot);
|
||||
const [seatsPerTimeSlot, setSeatsPerTimeSlot] = useState(eventType.seatsPerTimeSlot || 2);
|
||||
const [customInputs, setCustomInputs] = useState<EventTypeCustomInput[]>(
|
||||
eventType.customInputs.sort((a, b) => a.id - b.id) || []
|
||||
);
|
||||
@@ -51,7 +51,7 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
|
||||
const placeholderHashedLink = `${CAL_URL}/d/${hashedUrl}/${eventType.slug}`;
|
||||
|
||||
const animationRef = useRef(null);
|
||||
const seatsEnabled = !!eventType.seatsPerTimeSlot;
|
||||
const seatsEnabled = formMethods.getValues("seatsPerTimeSlotEnabled");
|
||||
|
||||
useEffect(() => {
|
||||
animationRef.current && autoAnimate(animationRef.current);
|
||||
@@ -249,6 +249,48 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
|
||||
)}
|
||||
/>
|
||||
<hr />
|
||||
|
||||
<Controller
|
||||
name="successRedirectUrl"
|
||||
control={formMethods.control}
|
||||
defaultValue={hashedUrl}
|
||||
render={({ field: { value, onChange } }) => (
|
||||
<>
|
||||
<div className="flex space-x-3 ">
|
||||
<Switch
|
||||
name="successRedirectUrlCheck"
|
||||
fitToHeight={true}
|
||||
defaultChecked={redirectUrlVisible}
|
||||
onCheckedChange={(e) => {
|
||||
setRedirectUrlVisible(e);
|
||||
onChange(e ? value : "");
|
||||
}}
|
||||
/>
|
||||
<div className="flex flex-col">
|
||||
<Skeleton as={Label} className="text-sm font-semibold leading-none text-black">
|
||||
{t("redirect_success_booking")}
|
||||
</Skeleton>
|
||||
<Skeleton as="p" className="-mt-2 text-sm leading-normal text-gray-600">
|
||||
{t("redirect_url_description")}
|
||||
</Skeleton>
|
||||
</div>
|
||||
</div>
|
||||
{redirectUrlVisible && (
|
||||
<div className="">
|
||||
<TextField
|
||||
label={t("redirect_success_booking")}
|
||||
placeholder={t("external_redirect_url")}
|
||||
required={redirectUrlVisible}
|
||||
type="text"
|
||||
defaultValue={eventType.successRedirectUrl || ""}
|
||||
{...formMethods.register("successRedirectUrl")}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
/>
|
||||
<hr />
|
||||
<Controller
|
||||
name="hashedLink"
|
||||
control={formMethods.control}
|
||||
@@ -313,45 +355,57 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
|
||||
/>
|
||||
<hr />
|
||||
<Controller
|
||||
name="seatsPerTimeSlot"
|
||||
name="seatsPerTimeSlotEnabled"
|
||||
control={formMethods.control}
|
||||
defaultValue={seatsPerTimeSlot}
|
||||
defaultValue={!!eventType.seatsPerTimeSlot}
|
||||
render={({ field: { value, onChange } }) => (
|
||||
<>
|
||||
<div className="flex space-x-3">
|
||||
<Switch
|
||||
name="seatsPerTimeSlot"
|
||||
checked={seatsInputVisible}
|
||||
onCheckedChange={(e) => {
|
||||
setSeatsInputVisible(e);
|
||||
formMethods.setValue("seatsPerTimeSlot", seatsPerTimeSlot);
|
||||
onChange(e ? seatsPerTimeSlot : null);
|
||||
}}
|
||||
fitToHeight={true}
|
||||
/>
|
||||
<div className="flex flex-col">
|
||||
<Label className="text-sm font-semibold leading-none text-black">{t("offer_seats")}</Label>
|
||||
<p className="-mt-2 text-sm leading-normal text-gray-600">{t("offer_seats_description")}</p>
|
||||
</div>
|
||||
<div className="flex space-x-3">
|
||||
<Switch
|
||||
name="seatsPerTimeSlotEnabled"
|
||||
checked={value}
|
||||
onCheckedChange={(e) => {
|
||||
setSeatsInputVisible(e);
|
||||
// Enabling seats will disable guests and requiring confimation until fully supported
|
||||
if (e) {
|
||||
formMethods.setValue("disableGuests", true);
|
||||
formMethods.setValue("requiresConfirmation", false);
|
||||
formMethods.setValue("seatsPerTimeSlot", 2);
|
||||
} else {
|
||||
formMethods.setValue("seatsPerTimeSlot", null);
|
||||
}
|
||||
onChange(e);
|
||||
}}
|
||||
fitToHeight={true}
|
||||
/>
|
||||
<div className="flex flex-col">
|
||||
<Label className="text-sm font-semibold leading-none text-black">{t("offer_seats")}</Label>
|
||||
<p className="-mt-2 text-sm leading-normal text-gray-600">{t("offer_seats_description")}</p>
|
||||
</div>
|
||||
{seatsInputVisible && (
|
||||
<div className="">
|
||||
<TextField
|
||||
required
|
||||
name="seatsPerTimeSlot"
|
||||
label={t("number_of_seats")}
|
||||
type="number"
|
||||
defaultValue={seatsPerTimeSlot || 2}
|
||||
addOnSuffix={<>{t("seats")}</>}
|
||||
onChange={(e) => {
|
||||
formMethods.setValue("seatsPerTimeSlot", Number(e.target.value));
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
</div>
|
||||
)}
|
||||
/>
|
||||
{seatsInputVisible && (
|
||||
<Controller
|
||||
name="seatsPerTimeSlot"
|
||||
control={formMethods.control}
|
||||
defaultValue={eventType.seatsPerTimeSlot}
|
||||
render={({ field: { value, onChange } }) => (
|
||||
<div className="">
|
||||
<TextField
|
||||
required
|
||||
name="seatsPerTimeSlot"
|
||||
label={t("number_of_seats")}
|
||||
type="number"
|
||||
defaultValue={value || 2}
|
||||
addOnSuffix={<>{t("seats")}</>}
|
||||
onChange={(e) => {
|
||||
onChange(Number(e.target.value));
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
{showEventNameTip && (
|
||||
<Dialog open={showEventNameTip} onOpenChange={setShowEventNameTip}>
|
||||
<DialogContent
|
||||
|
||||
@@ -157,7 +157,7 @@ function EventTypeSingleLayout({
|
||||
return (
|
||||
<Shell
|
||||
backPath="/event-types"
|
||||
title={t("event_type_title", { eventTypeTitle: eventType.title })}
|
||||
title={eventType.title + " | " + t("event_type")}
|
||||
heading={eventType.title}
|
||||
subtitle={eventType.description || ""}
|
||||
CTA={
|
||||
@@ -228,27 +228,29 @@ function EventTypeSingleLayout({
|
||||
<Icon.FiMoreHorizontal className="group-hover:text-gray-800" />
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent>
|
||||
<DropdownMenuItem>
|
||||
<DropdownMenuItem className="focus:ring-gray-100">
|
||||
<Button
|
||||
color="minimal"
|
||||
StartIcon={Icon.FiExternalLink}
|
||||
target="_blank"
|
||||
href={permalink}
|
||||
rel="noreferrer">
|
||||
rel="noreferrer"
|
||||
className="min-w-full">
|
||||
{t("preview")}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem>
|
||||
<DropdownMenuItem className="focus:ring-gray-100">
|
||||
<Button color="minimal" StartIcon={Icon.FiLink}>
|
||||
{t("copy_link")}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem>
|
||||
<DropdownMenuItem className="focus:ring-gray-100">
|
||||
<Button
|
||||
color="minimal"
|
||||
StartIcon={Icon.FiTrash}
|
||||
disabled={!hasPermsToDelete}
|
||||
onClick={() => setDeleteDialogOpen(true)}>
|
||||
onClick={() => setDeleteDialogOpen(true)}
|
||||
className="min-w-full">
|
||||
{t("delete")}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useMutation } from "react-query";
|
||||
import { useMutation } from "@tanstack/react-query";
|
||||
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
import { ReactNode } from "react";
|
||||
import {
|
||||
QueryObserverIdleResult,
|
||||
QueryObserverLoadingErrorResult,
|
||||
QueryObserverLoadingResult,
|
||||
QueryObserverRefetchErrorResult,
|
||||
QueryObserverSuccessResult,
|
||||
UseQueryResult,
|
||||
} from "react-query";
|
||||
} from "@tanstack/react-query";
|
||||
import { ReactNode } from "react";
|
||||
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import type { TRPCClientErrorLike } from "@calcom/trpc/client";
|
||||
import type { UseTRPCQueryOptions } from "@calcom/trpc/react";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import type {
|
||||
inferHandlerInput,
|
||||
@@ -22,6 +20,8 @@ import type { AppRouter } from "@calcom/trpc/server/routers/_app";
|
||||
import { Alert } from "@calcom/ui/Alert";
|
||||
import Loader from "@calcom/ui/Loader";
|
||||
|
||||
import type { UseTRPCQueryOptions } from "@trpc/react/shared";
|
||||
|
||||
type ErrorLike = {
|
||||
message: string;
|
||||
};
|
||||
@@ -34,7 +34,6 @@ interface QueryCellOptionsBase<TData, TError extends ErrorLike> {
|
||||
query: QueryObserverLoadingErrorResult<TData, TError> | QueryObserverRefetchErrorResult<TData, TError>
|
||||
) => JSXElementOrNull;
|
||||
loading?: (query: QueryObserverLoadingResult<TData, TError> | null) => JSXElementOrNull;
|
||||
idle?: (query: QueryObserverIdleResult<TData, TError>) => JSXElementOrNull;
|
||||
}
|
||||
|
||||
interface QueryCellOptionsNoEmpty<TData, TError extends ErrorLike>
|
||||
@@ -84,14 +83,11 @@ export function QueryCell<TData, TError extends ErrorLike>(
|
||||
);
|
||||
}
|
||||
|
||||
if (query.status === "idle") {
|
||||
return opts.idle?.(query) ?? StatusLoader;
|
||||
}
|
||||
// impossible state
|
||||
return null;
|
||||
}
|
||||
|
||||
type inferProcedures<TObj extends ProcedureRecord<any, any, any, any, any, any>> = {
|
||||
type inferProcedures<TObj extends ProcedureRecord> = {
|
||||
[TPath in keyof TObj]: {
|
||||
input: inferProcedureInput<TObj[TPath]>;
|
||||
output: inferProcedureOutput<TObj[TPath]>;
|
||||
|
||||
@@ -9,7 +9,7 @@ import { ComponentProps, ReactNode } from "react";
|
||||
|
||||
import DynamicHelpscoutProvider from "@calcom/features/ee/support/lib/helpscout/providerDynamic";
|
||||
import DynamicIntercomProvider from "@calcom/features/ee/support/lib/intercom/providerDynamic";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { trpc, proxy } from "@calcom/trpc/react";
|
||||
import { MetaProvider } from "@calcom/ui/v2/core/Meta";
|
||||
|
||||
import usePublicPage from "@lib/hooks/usePublicPage";
|
||||
@@ -38,7 +38,8 @@ const CustomI18nextProvider = (props: AppPropsWithChildren) => {
|
||||
* i18n should never be clubbed with other queries, so that it's caching can be managed independently.
|
||||
* We intend to not cache i18n query
|
||||
**/
|
||||
const { i18n, locale } = trpc.useQuery(["viewer.public.i18n"], { context: { skipBatch: true } }).data ?? {
|
||||
const { i18n, locale } = trpc.useQuery(["viewer.public.i18n"], { trpc: { context: { skipBatch: true } } })
|
||||
.data ?? {
|
||||
locale: "en",
|
||||
};
|
||||
|
||||
@@ -54,7 +55,7 @@ const CustomI18nextProvider = (props: AppPropsWithChildren) => {
|
||||
};
|
||||
|
||||
const AppProviders = (props: AppPropsWithChildren) => {
|
||||
const session = trpc.useQuery(["viewer.public.session"]).data;
|
||||
const session = proxy.public.session.useQuery().data;
|
||||
// No need to have intercom on public pages - Good for Page Performance
|
||||
const isPublicPage = usePublicPage();
|
||||
const isThemeSupported =
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
// handles logic related to user clock display using 24h display / timeZone options.
|
||||
import dayjs from "@calcom/dayjs";
|
||||
import { isBrowserLocale24h } from "@calcom/lib/timeFormat";
|
||||
import {
|
||||
getIs24hClockFromLocalStorage,
|
||||
isBrowserLocale24h,
|
||||
setIs24hClockInLocalStorage,
|
||||
} from "@calcom/lib/timeFormat";
|
||||
import { localStorage } from "@calcom/lib/webstorage";
|
||||
|
||||
interface TimeOptions {
|
||||
@@ -20,8 +24,8 @@ const initClock = () => {
|
||||
return;
|
||||
}
|
||||
// This only sets browser locale if there's no preference on localStorage.
|
||||
if (!localStorage.getItem("timeOption.is24hClock")) set24hClock(isBrowserLocale24h());
|
||||
timeOptions.is24hClock = localStorage.getItem("timeOption.is24hClock") === "true";
|
||||
if (getIs24hClockFromLocalStorage() === null) set24hClock(isBrowserLocale24h());
|
||||
timeOptions.is24hClock = !!getIs24hClockFromLocalStorage();
|
||||
timeOptions.inviteeTimeZone = localStorage.getItem("timeOption.preferredTimeZone") || dayjs.tz.guess();
|
||||
};
|
||||
|
||||
@@ -32,7 +36,7 @@ const is24h = (is24hClock?: boolean) => {
|
||||
};
|
||||
|
||||
const set24hClock = (is24hClock: boolean) => {
|
||||
localStorage.setItem("timeOption.is24hClock", is24hClock.toString());
|
||||
setIs24hClockInLocalStorage(is24hClock);
|
||||
timeOptions.is24hClock = is24hClock;
|
||||
};
|
||||
|
||||
|
||||
@@ -47,14 +47,27 @@ export const parseRecurringDates = (
|
||||
return [dateStrings, rule.all()];
|
||||
};
|
||||
|
||||
type BookingItem = inferQueryOutput<"viewer.bookings">["bookings"][number];
|
||||
|
||||
export const extractRecurringDates = (
|
||||
bookings: BookingItem[],
|
||||
booking: inferQueryOutput<"viewer.bookings">["bookings"][number] & {
|
||||
eventType: { recurringEvent: RecurringEvent | null };
|
||||
recurringEventId: string | null;
|
||||
recurringBookings: inferQueryOutput<"viewer.bookings">["recurringInfo"];
|
||||
},
|
||||
timeZone: string | undefined,
|
||||
i18n: I18n
|
||||
): [string[], Date[]] => {
|
||||
const dateStrings = bookings.map((booking) => processDate(dayjs(booking.startTime).tz(timeZone), i18n));
|
||||
const allDates = dateStrings.map((dateString) => dayjs(dateString).tz(timeZone).toDate());
|
||||
const { count = 0, ...rest } =
|
||||
booking.eventType.recurringEvent !== null ? booking.eventType.recurringEvent : {};
|
||||
const recurringInfo = booking.recurringBookings.find(
|
||||
(val) => val.recurringEventId === booking.recurringEventId
|
||||
);
|
||||
const allDates = new RRule({
|
||||
...rest,
|
||||
count: recurringInfo?._count.recurringEventId,
|
||||
dtstart: recurringInfo?._min.startTime,
|
||||
}).all();
|
||||
const dateStrings = allDates.map((r) => {
|
||||
return processDate(dayjs(r).tz(timeZone), i18n);
|
||||
});
|
||||
return [dateStrings, allDates];
|
||||
};
|
||||
|
||||
@@ -7,6 +7,7 @@ import { extendEventData, nextCollectBasicSettings } from "@calcom/lib/telemetry
|
||||
|
||||
const V2_WHITELIST = [
|
||||
"/settings/admin",
|
||||
"/settings/billing",
|
||||
"/settings/developer/webhooks",
|
||||
"/settings/developer/api-keys",
|
||||
"/settings/my-account",
|
||||
|
||||
+12
-11
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@calcom/web",
|
||||
"version": "2.0.2",
|
||||
"version": "2.0.5",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"analyze": "ANALYZE=true next build",
|
||||
@@ -45,18 +45,20 @@
|
||||
"@hookform/resolvers": "^2.9.7",
|
||||
"@next-auth/prisma-adapter": "^1.0.4",
|
||||
"@next/bundle-analyzer": "12.1.6",
|
||||
"@radix-ui/react-avatar": "^0.1.4",
|
||||
"@radix-ui/react-collapsible": "^0.1.0",
|
||||
"@radix-ui/react-dialog": "^0.1.0",
|
||||
"@radix-ui/react-dropdown-menu": "^0.1.1",
|
||||
"@radix-ui/react-id": "^0.1.0",
|
||||
"@radix-ui/react-radio-group": "^0.1.1",
|
||||
"@radix-ui/react-slider": "^0.1.1",
|
||||
"@radix-ui/react-switch": "^0.1.1",
|
||||
"@radix-ui/react-toggle-group": "^0.1.5",
|
||||
"@radix-ui/react-avatar": "^1.0.0",
|
||||
"@radix-ui/react-collapsible": "^1.0.0",
|
||||
"@radix-ui/react-dialog": "^1.0.0",
|
||||
"@radix-ui/react-dropdown-menu": "^1.0.0",
|
||||
"@radix-ui/react-id": "^1.0.0",
|
||||
"@radix-ui/react-popover": "^1.0.0",
|
||||
"@radix-ui/react-radio-group": "^1.0.0",
|
||||
"@radix-ui/react-slider": "^1.0.0",
|
||||
"@radix-ui/react-switch": "^1.0.0",
|
||||
"@radix-ui/react-toggle-group": "^1.0.0",
|
||||
"@radix-ui/react-tooltip": "^1.0.0",
|
||||
"@stripe/react-stripe-js": "^1.10.0",
|
||||
"@stripe/stripe-js": "^1.35.0",
|
||||
"@tanstack/react-query": "^4.3.9",
|
||||
"@vercel/edge-functions-ui": "^0.2.1",
|
||||
"@wojtekmaj/react-daterange-picker": "^3.3.1",
|
||||
"accept-language-parser": "^1.5.0",
|
||||
@@ -105,7 +107,6 @@
|
||||
"react-live-chat-loader": "^2.7.3",
|
||||
"react-multi-email": "^0.5.3",
|
||||
"react-phone-number-input": "^3.2.7",
|
||||
"react-query": "^3.39.2",
|
||||
"react-select": "^5.4.0",
|
||||
"react-timezone-select": "^1.3.2",
|
||||
"react-use-intercom": "1.5.1",
|
||||
|
||||
@@ -182,7 +182,6 @@ export default function User(props: inferSSRProps<typeof getServerSideProps>) {
|
||||
<h2 className="dark:text-darkgray-700 pr-2 text-sm font-semibold text-gray-700">
|
||||
{type.title}
|
||||
</h2>
|
||||
<p className="dark:text-darkgray-600 hidden text-sm font-normal leading-none text-gray-600 md:block">{`/${user.username}/${type.slug}`}</p>
|
||||
</div>
|
||||
<EventTypeDescription eventType={type} />
|
||||
</a>
|
||||
|
||||
@@ -76,7 +76,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
||||
});
|
||||
|
||||
// get user's credentials + their connected integrations
|
||||
const calendarCredentials = getCalendarCredentials(user.credentials, user.id);
|
||||
const calendarCredentials = getCalendarCredentials(user.credentials);
|
||||
// get all the connected integrations' calendars (from third party)
|
||||
const connectedCalendars = await getConnectedCalendars(calendarCredentials, user.selectedCalendars);
|
||||
const calendars = connectedCalendars.flatMap((c) => c.calendars).filter(notEmpty);
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
import { GetServerSidePropsContext } from "next";
|
||||
import { signOut, useSession } from "next-auth/react";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import { useEffect } from "react";
|
||||
|
||||
import { WEBSITE_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import Button from "@calcom/ui/Button";
|
||||
import { Icon } from "@calcom/ui/Icon";
|
||||
import Button from "@calcom/ui/v2/core/Button";
|
||||
|
||||
import { inferSSRProps } from "@lib/types/inferSSRProps";
|
||||
|
||||
import AuthContainer from "@components/ui/AuthContainer";
|
||||
import AuthContainer from "@components/v2/ui/AuthContainer";
|
||||
|
||||
import { ssrInit } from "@server/lib/ssr";
|
||||
|
||||
@@ -30,7 +29,7 @@ export default function Logout(props: Props) {
|
||||
const { t } = useLocale();
|
||||
|
||||
return (
|
||||
<AuthContainer title={t("logged_out")} description={t("youve_been_logged_out")}>
|
||||
<AuthContainer title={t("logged_out")} description={t("youve_been_logged_out")} showLogo>
|
||||
<div className="mb-4">
|
||||
<div className="mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-green-100">
|
||||
<Icon.FiCheck className="h-6 w-6 text-green-600" />
|
||||
@@ -44,9 +43,9 @@ export default function Logout(props: Props) {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Link href="/auth/login" passHref>
|
||||
<Button className="flex w-full justify-center"> {t("go_back_login")}</Button>
|
||||
</Link>
|
||||
<Button href="/auth/login" passHref className="flex w-full justify-center">
|
||||
{t("go_back_login")}
|
||||
</Button>
|
||||
</AuthContainer>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { CheckIcon } from "@heroicons/react/solid";
|
||||
import { zodResolver } from "@hookform/resolvers/zod";
|
||||
import classNames from "classnames";
|
||||
import { useRouter } from "next/router";
|
||||
import { useState } from "react";
|
||||
import { Controller, FormProvider, useForm } from "react-hook-form";
|
||||
@@ -9,7 +10,7 @@ import { isPasswordValid } from "@calcom/lib/auth";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { inferSSRProps } from "@calcom/types/inferSSRProps";
|
||||
import { TextField, EmailField, PasswordField } from "@calcom/ui/v2";
|
||||
import { TextField, EmailField, PasswordField, Label } from "@calcom/ui/v2";
|
||||
import WizardForm from "@calcom/ui/v2/core/WizardForm";
|
||||
|
||||
const StepDone = () => {
|
||||
@@ -85,6 +86,8 @@ const SetupFormStep1 = (props: { setIsLoading: (val: boolean) => void }) => {
|
||||
}
|
||||
}, onError);
|
||||
|
||||
const longWebsiteUrl = process.env.NEXT_PUBLIC_WEBSITE_URL.length > 30;
|
||||
|
||||
return (
|
||||
<FormProvider {...formMethods}>
|
||||
<form id="setup-step-1" name="setup-step-1" className="space-y-4" onSubmit={onSubmit}>
|
||||
@@ -93,22 +96,36 @@ const SetupFormStep1 = (props: { setIsLoading: (val: boolean) => void }) => {
|
||||
name="username"
|
||||
control={formMethods.control}
|
||||
render={({ field: { onBlur, onChange, value } }) => (
|
||||
<TextField
|
||||
addOnLeading={
|
||||
<span className="items-centerpx-3 inline-flex rounded-none text-sm text-gray-500">
|
||||
{process.env.NEXT_PUBLIC_WEBSITE_URL}/
|
||||
</span>
|
||||
}
|
||||
value={value || ""}
|
||||
className="my-0"
|
||||
onBlur={onBlur}
|
||||
name="username"
|
||||
onChange={async (e) => {
|
||||
onChange(e.target.value);
|
||||
formMethods.setValue("username", e.target.value);
|
||||
await formMethods.trigger("username");
|
||||
}}
|
||||
/>
|
||||
<>
|
||||
<Label htmlFor="username" className={classNames(longWebsiteUrl && "mb-0")}>
|
||||
<span className="block">{t("username")}</span>
|
||||
{longWebsiteUrl && (
|
||||
<small className="items-centerpx-3 mt-2 inline-flex rounded-t-md border border-b-0 border-gray-300 bg-gray-100 py-1 px-3 text-gray-500">
|
||||
{process.env.NEXT_PUBLIC_WEBSITE_URL}
|
||||
</small>
|
||||
)}
|
||||
</Label>
|
||||
<TextField
|
||||
addOnLeading={
|
||||
!longWebsiteUrl && (
|
||||
<span className="items-centerpx-3 inline-flex rounded-none text-sm text-gray-500">
|
||||
{process.env.NEXT_PUBLIC_WEBSITE_URL}/
|
||||
</span>
|
||||
)
|
||||
}
|
||||
id="username"
|
||||
labelSrOnly={true}
|
||||
value={value || ""}
|
||||
className={classNames("my-0", longWebsiteUrl && "rounded-t-none")}
|
||||
onBlur={onBlur}
|
||||
name="username"
|
||||
onChange={async (e) => {
|
||||
onChange(e.target.value);
|
||||
formMethods.setValue("username", e.target.value);
|
||||
await formMethods.trigger("username");
|
||||
}}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
* @deprecated modifications to this file should be v2 only
|
||||
* Use `/apps/web/pages/v2/availability/[schedule].tsx` instead
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-nocheck
|
||||
import { GetStaticPaths, GetStaticProps } from "next";
|
||||
import { useRouter } from "next/router";
|
||||
import { useState } from "react";
|
||||
|
||||
@@ -54,17 +54,6 @@ export default function Bookings() {
|
||||
|
||||
const isEmpty = !query.data?.pages[0]?.bookings.length;
|
||||
|
||||
// Get all recurring events of the series with the same recurringEventId
|
||||
const defineRecurrentBookings = (
|
||||
booking: BookingOutput,
|
||||
groupedBookings: Record<string, BookingOutput[]>
|
||||
) => {
|
||||
let recurringBookings = undefined;
|
||||
if (booking.recurringEventId !== null) {
|
||||
recurringBookings = groupedBookings[booking.recurringEventId];
|
||||
}
|
||||
return { recurringBookings };
|
||||
};
|
||||
const shownBookings: Record<string, BookingOutput[]> = {};
|
||||
const filterBookings = (booking: BookingOutput) => {
|
||||
if (status === "recurring" || status === "cancelled") {
|
||||
@@ -92,7 +81,7 @@ export default function Bookings() {
|
||||
{query.status === "error" && (
|
||||
<Alert severity="error" title={t("something_went_wrong")} message={query.error.message} />
|
||||
)}
|
||||
{(query.status === "loading" || query.status === "idle") && <SkeletonLoader />}
|
||||
{(query.status === "loading" || query.isPaused) && <SkeletonLoader />}
|
||||
{query.status === "success" && !isEmpty && (
|
||||
<>
|
||||
<div className="mt-6 overflow-hidden rounded-sm border border-b border-gray-200">
|
||||
@@ -104,7 +93,7 @@ export default function Bookings() {
|
||||
<BookingListItem
|
||||
key={booking.id}
|
||||
listingStatus={status}
|
||||
{...defineRecurrentBookings(booking, shownBookings)}
|
||||
recurringBookings={page.recurringInfo}
|
||||
{...booking}
|
||||
/>
|
||||
))}
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
/**
|
||||
* @deprecated modifications to this file should be v2 only
|
||||
* Use `apps/web/pages/v2/event-types/[type].tsx` instead
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-nocheck
|
||||
import { zodResolver } from "@hookform/resolvers/zod";
|
||||
import { EventTypeCustomInput, MembershipRole, PeriodType, Prisma, SchedulingType } from "@prisma/client";
|
||||
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@radix-ui/react-collapsible";
|
||||
@@ -25,6 +31,7 @@ import { CAL_URL, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import showToast from "@calcom/lib/notification";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { TRPCClientError } from "@calcom/trpc/client";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import type { RecurringEvent } from "@calcom/types/Calendar";
|
||||
import { Alert } from "@calcom/ui/Alert";
|
||||
@@ -64,7 +71,6 @@ import * as RadioArea from "@components/ui/form/radio-area";
|
||||
import WebhookListContainer from "@components/webhook/WebhookListContainer";
|
||||
|
||||
import { getTranslation } from "@server/lib/i18n";
|
||||
import { TRPCClientError } from "@trpc/client";
|
||||
|
||||
const RainbowInstallForm = dynamic(() => import("@calcom/rainbow/components/RainbowInstallForm"), {
|
||||
suspense: true,
|
||||
@@ -108,6 +114,7 @@ export type FormValues = {
|
||||
periodCountCalendarDays: "1" | "0";
|
||||
periodDates: { startDate: Date; endDate: Date };
|
||||
seatsPerTimeSlot: number | null;
|
||||
seatsPerTimeSlotEnabled: boolean;
|
||||
minimumBookingNotice: number;
|
||||
beforeBufferTime: number;
|
||||
afterBufferTime: number;
|
||||
|
||||
@@ -13,6 +13,7 @@ import { CAL_URL, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import showToast from "@calcom/lib/notification";
|
||||
import { inferQueryOutput, trpc } from "@calcom/trpc/react";
|
||||
import { TRPCClientError } from "@calcom/trpc/react";
|
||||
import { Button } from "@calcom/ui";
|
||||
import { Alert } from "@calcom/ui/Alert";
|
||||
import Badge from "@calcom/ui/Badge";
|
||||
@@ -23,6 +24,7 @@ import Dropdown, {
|
||||
DropdownMenuItem,
|
||||
DropdownMenuSeparator,
|
||||
DropdownMenuTrigger,
|
||||
DropdownMenuPortal,
|
||||
} from "@calcom/ui/Dropdown";
|
||||
import EmptyScreen from "@calcom/ui/EmptyScreen";
|
||||
import { Icon } from "@calcom/ui/Icon";
|
||||
@@ -42,8 +44,6 @@ import { LinkText } from "@components/ui/LinkText";
|
||||
import NoCalendarConnectedAlert from "@components/ui/NoCalendarConnectedAlert";
|
||||
import SkeletonLoader from "@components/v2/eventtype/SkeletonLoader";
|
||||
|
||||
import { TRPCClientError } from "@trpc/react";
|
||||
|
||||
type EventTypeGroups = inferQueryOutput<"viewer.eventTypes">["eventTypeGroups"];
|
||||
type EventTypeGroupProfile = EventTypeGroups[number]["profile"];
|
||||
interface EventTypeListHeadingProps {
|
||||
@@ -346,36 +346,70 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
|
||||
<DropdownMenuTrigger asChild data-testid={"event-type-options-" + type.id}>
|
||||
<Button type="button" size="icon" color="minimal" StartIcon={Icon.FiMoreHorizontal} />
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent portalled>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Link href={calLink}>
|
||||
<DropdownMenuPortal>
|
||||
<DropdownMenuContent>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Link href={calLink}>
|
||||
<Button
|
||||
rel="noreferrer"
|
||||
target="_blank"
|
||||
color="minimal"
|
||||
size="sm"
|
||||
StartIcon={Icon.FiExternalLink}
|
||||
className="w-full rounded-none">
|
||||
{t("preview") as string}
|
||||
</Button>
|
||||
</Link>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
rel="noreferrer"
|
||||
target="_blank"
|
||||
type="button"
|
||||
color="minimal"
|
||||
size="sm"
|
||||
StartIcon={Icon.FiExternalLink}
|
||||
className="w-full rounded-none">
|
||||
{t("preview") as string}
|
||||
className="w-full rounded-none text-left"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiClipboard}
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(calLink);
|
||||
showToast(t("link_copied"), "success");
|
||||
}}>
|
||||
{t("copy_link") as string}
|
||||
</Button>
|
||||
</Link>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
color="minimal"
|
||||
size="sm"
|
||||
className="w-full rounded-none text-left"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiClipboard}
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(calLink);
|
||||
showToast(t("link_copied"), "success");
|
||||
}}>
|
||||
{t("copy_link") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
{isNativeShare ? (
|
||||
</DropdownMenuItem>
|
||||
{isNativeShare ? (
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
color="minimal"
|
||||
size="sm"
|
||||
className="w-full rounded-none"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiUpload}
|
||||
onClick={() => {
|
||||
navigator
|
||||
.share({
|
||||
title: t("share"),
|
||||
text: t("share_event"),
|
||||
url: calLink,
|
||||
})
|
||||
.then(() => showToast(t("link_shared"), "success"))
|
||||
.catch(() => showToast(t("failed"), "error"));
|
||||
}}>
|
||||
{t("share") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
) : null}
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
size="sm"
|
||||
href={"/event-types/" + type.id}
|
||||
color="minimal"
|
||||
className="w-full rounded-none"
|
||||
StartIcon={Icon.FiEdit2}>
|
||||
{t("edit") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
@@ -383,59 +417,27 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
|
||||
size="sm"
|
||||
className="w-full rounded-none"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiUpload}
|
||||
onClick={() => {
|
||||
navigator
|
||||
.share({
|
||||
title: t("share"),
|
||||
text: t("share_event"),
|
||||
url: calLink,
|
||||
})
|
||||
.then(() => showToast(t("link_shared"), "success"))
|
||||
.catch(() => showToast(t("failed"), "error"));
|
||||
}}>
|
||||
{t("share") as string}
|
||||
StartIcon={Icon.FiCopy}
|
||||
onClick={() => openModal(group, type)}>
|
||||
{t("duplicate") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
) : null}
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
size="sm"
|
||||
href={"/event-types/" + type.id}
|
||||
color="minimal"
|
||||
className="w-full rounded-none"
|
||||
StartIcon={Icon.FiEdit2}>
|
||||
{t("edit") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
color="minimal"
|
||||
size="sm"
|
||||
className="w-full rounded-none"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiCopy}
|
||||
onClick={() => openModal(group, type)}>
|
||||
{t("duplicate") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuSeparator className="h-px bg-gray-200" />
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
onClick={() => {
|
||||
setDeleteDialogOpen(true);
|
||||
setDeleteDialogTypeId(type.id);
|
||||
}}
|
||||
color="warn"
|
||||
size="sm"
|
||||
StartIcon={Icon.FiTrash}
|
||||
className="w-full rounded-none">
|
||||
{t("delete") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
<DropdownMenuSeparator className="h-px bg-gray-200" />
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
onClick={() => {
|
||||
setDeleteDialogOpen(true);
|
||||
setDeleteDialogTypeId(type.id);
|
||||
}}
|
||||
color="warn"
|
||||
size="sm"
|
||||
StartIcon={Icon.FiTrash}
|
||||
className="w-full rounded-none">
|
||||
{t("delete") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenuPortal>
|
||||
</Dropdown>
|
||||
</div>
|
||||
</div>
|
||||
@@ -540,6 +542,7 @@ const EventTypesPage = () => {
|
||||
<title>Home | Cal.com</title>
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
</Head>
|
||||
|
||||
<Shell
|
||||
heading={t("event_types_page_title") as string}
|
||||
subtitle={t("event_types_page_subtitle") as string}
|
||||
|
||||
@@ -92,7 +92,7 @@ const OnboardingPage = (props: IOnboardingPageProps) => {
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
</Head>
|
||||
|
||||
<div className="mx-auto px-4 py-24">
|
||||
<div className="mx-auto px-4 py-6 md:py-24">
|
||||
<div className="relative">
|
||||
<div className="sm:mx-auto sm:w-full sm:max-w-[600px]">
|
||||
<div className="mx-auto sm:max-w-[520px]">
|
||||
@@ -129,7 +129,7 @@ const OnboardingPage = (props: IOnboardingPageProps) => {
|
||||
event.preventDefault();
|
||||
goToIndex(currentStepIndex + 1);
|
||||
}}
|
||||
className="mt-24 cursor-pointer px-4 py-2 font-sans text-sm font-medium">
|
||||
className="mt-8 cursor-pointer px-4 py-2 font-sans text-sm font-medium">
|
||||
{headers[currentStepIndex]?.skipText}
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
@@ -21,6 +21,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import showToast from "@calcom/lib/notification";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { TRPCClientErrorLike } from "@calcom/trpc/client";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import type { AppRouter } from "@calcom/trpc/server/routers/_app";
|
||||
import { Alert } from "@calcom/ui/Alert";
|
||||
@@ -39,8 +40,6 @@ import Schedule from "@components/availability/Schedule";
|
||||
import { CalendarListContainer } from "@components/integrations/CalendarListContainer";
|
||||
import { UsernameAvailability } from "@components/ui/UsernameAvailability";
|
||||
|
||||
import { TRPCClientErrorLike } from "@trpc/client";
|
||||
|
||||
// Embed isn't applicable to onboarding, so ignore the rule
|
||||
/* eslint-disable @calcom/eslint/avoid-web-storage */
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useQuery } from "@tanstack/react-query";
|
||||
import React from "react";
|
||||
import { useQuery } from "react-query";
|
||||
|
||||
import { HttpError } from "@lib/core/http/error";
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ import TimezoneSelect, { ITimezone } from "react-timezone-select";
|
||||
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import showToast from "@calcom/lib/notification";
|
||||
import { setIs24hClockInLocalStorage } from "@calcom/lib/timeFormat";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { TRPCClientErrorLike } from "@calcom/trpc/client";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
@@ -229,7 +230,7 @@ function SettingsView(props: ComponentProps<typeof Settings> & { localeProp: str
|
||||
// Write time format to localStorage if available
|
||||
// Embed isn't applicable to profile pages. So ignore the rule
|
||||
// eslint-disable-next-line @calcom/eslint/avoid-web-storage
|
||||
window.localStorage.setItem("timeOption.is24hClock", selectedTimeFormat.value === 12 ? "false" : "true");
|
||||
setIs24hClockInLocalStorage(selectedTimeFormat.value === 24);
|
||||
|
||||
// TODO: Add validation
|
||||
|
||||
@@ -575,7 +576,7 @@ function SettingsView(props: ComponentProps<typeof Settings> & { localeProp: str
|
||||
* i18n should never be clubbed with other queries, so that it's caching can be managed independently.
|
||||
* We intend to not cache i18n query
|
||||
**/
|
||||
const WithQuery = withQuery(["viewer.public.i18n"], { context: { skipBatch: true } });
|
||||
const WithQuery = withQuery(["viewer.public.i18n"], { trpc: { context: { skipBatch: true } } });
|
||||
|
||||
export default function Settings(props: Props) {
|
||||
const { t } = useLocale();
|
||||
|
||||
@@ -26,7 +26,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import useTheme from "@calcom/lib/hooks/useTheme";
|
||||
import { getEveryFreqFor } from "@calcom/lib/recurringStrings";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import { isBrowserLocale24h } from "@calcom/lib/timeFormat";
|
||||
import { getIs24hClockFromLocalStorage, isBrowserLocale24h } from "@calcom/lib/timeFormat";
|
||||
import { localStorage } from "@calcom/lib/webstorage";
|
||||
import prisma from "@calcom/prisma";
|
||||
import Button from "@calcom/ui/Button";
|
||||
@@ -203,7 +203,7 @@ export default function Success(props: SuccessProps) {
|
||||
// TODO: Add payment details
|
||||
});
|
||||
setDate(date.tz(localStorage.getItem("timeOption.preferredTimeZone") || dayjs.tz.guess()));
|
||||
setIs24h(!!localStorage.getItem("timeOption.is24hClock"));
|
||||
setIs24h(!!getIs24hClockFromLocalStorage());
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [eventType, needsConfirmation]);
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import React, { useEffect } from "react";
|
||||
import { useIsEmbed } from "@calcom/embed-core/embed-iframe";
|
||||
import { CAL_URL } from "@calcom/lib/constants";
|
||||
import { getPlaceholderAvatar } from "@calcom/lib/getPlaceholderAvatar";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import useTheme from "@calcom/lib/hooks/useTheme";
|
||||
import { getTeamWithMembers } from "@calcom/lib/server/queries/teams";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
@@ -17,7 +18,6 @@ import { Button } from "@calcom/ui/v2/core";
|
||||
import EventTypeDescription from "@calcom/ui/v2/modules/event-types/EventTypeDescription";
|
||||
|
||||
import { useExposePlanGlobally } from "@lib/hooks/useExposePlanGlobally";
|
||||
import { useLocale } from "@lib/hooks/useLocale";
|
||||
import { useToggleQuery } from "@lib/hooks/useToggleQuery";
|
||||
import { inferSSRProps } from "@lib/types/inferSSRProps";
|
||||
|
||||
@@ -56,7 +56,6 @@ function TeamPage({ team }: TeamPageProps) {
|
||||
<div className="flex-shrink">
|
||||
<div className="flex flex-wrap items-center space-x-2">
|
||||
<h2 className="dark:text-darkgray-700 text-sm font-semibold text-gray-700">{type.title}</h2>
|
||||
<p className="dark:text-darkgray-600 hidden text-sm font-normal leading-none text-gray-600 md:block">{`/${team.slug}/${type.slug}`}</p>
|
||||
</div>
|
||||
<EventTypeDescription className="text-sm" eventType={type} />
|
||||
</div>
|
||||
|
||||
@@ -91,7 +91,7 @@ interface IntegrationsContainerProps {
|
||||
|
||||
const IntegrationsList = ({ data }: { data: inferQueryOutput<"viewer.integrations"> }) => {
|
||||
return (
|
||||
<List>
|
||||
<List noBorderTreatment>
|
||||
{data.items.map((item) => (
|
||||
<IntegrationListItem
|
||||
name={item.name}
|
||||
|
||||
@@ -12,18 +12,19 @@ import { trpc } from "@calcom/trpc/react";
|
||||
import useMeQuery from "@calcom/trpc/react/hooks/useMeQuery";
|
||||
import type { Schedule as ScheduleType } from "@calcom/types/schedule";
|
||||
import { Icon } from "@calcom/ui";
|
||||
import TimezoneSelect from "@calcom/ui/form/TimezoneSelect";
|
||||
import Button from "@calcom/ui/v2/core/Button";
|
||||
import Shell from "@calcom/ui/v2/core/Shell";
|
||||
import Switch from "@calcom/ui/v2/core/Switch";
|
||||
import TimezoneSelect from "@calcom/ui/v2/core/TimezoneSelect";
|
||||
import VerticalDivider from "@calcom/ui/v2/core/VerticalDivider";
|
||||
import { Form, Label } from "@calcom/ui/v2/core/form/fields";
|
||||
import showToast from "@calcom/ui/v2/core/notifications";
|
||||
import { SkeletonText } from "@calcom/ui/v2/core/skeleton";
|
||||
import { Skeleton, SkeletonText } from "@calcom/ui/v2/core/skeleton";
|
||||
|
||||
import { HttpError } from "@lib/core/http/error";
|
||||
|
||||
import EditableHeading from "@components/ui/EditableHeading";
|
||||
import { SelectSkeletonLoader } from "@components/v2/availability/SkeletonLoader";
|
||||
|
||||
const querySchema = z.object({
|
||||
schedule: stringOrNumber,
|
||||
@@ -45,7 +46,7 @@ export default function Availability({ schedule }: { schedule: number }) {
|
||||
const { data, isLoading } = trpc.useQuery(["viewer.availability.schedule", { scheduleId: schedule }]);
|
||||
|
||||
const form = useForm<AvailabilityFormValues>();
|
||||
const { control, reset, setValue } = form;
|
||||
const { control, reset } = form;
|
||||
|
||||
useEffect(() => {
|
||||
if (!isLoading && data) {
|
||||
@@ -81,22 +82,35 @@ export default function Availability({ schedule }: { schedule: number }) {
|
||||
return (
|
||||
<Shell
|
||||
backPath="/availability"
|
||||
title={t("availability_title", { availabilityTitle: data?.schedule.name })}
|
||||
title={data?.schedule.name && data.schedule.name + " | " + t("availability")}
|
||||
heading={
|
||||
<EditableHeading title={data?.schedule.name || ""} onChange={(name) => setValue("name", name)} />
|
||||
<Controller
|
||||
control={form.control}
|
||||
name="name"
|
||||
render={({ field }) => <EditableHeading isReady={!isLoading} {...field} />}
|
||||
/>
|
||||
}
|
||||
subtitle={
|
||||
data ? (
|
||||
data.schedule.availability.map((availability) => (
|
||||
<span key={availability.id}>
|
||||
{availabilityAsString(availability, { locale: i18n.language })}
|
||||
<br />
|
||||
</span>
|
||||
))
|
||||
) : (
|
||||
<SkeletonText className="h-4 w-48" />
|
||||
)
|
||||
}
|
||||
subtitle={data?.schedule.availability.map((availability) => (
|
||||
<span key={availability.id}>
|
||||
{availabilityAsString(availability, { locale: i18n.language })}
|
||||
<br />
|
||||
</span>
|
||||
))}
|
||||
CTA={
|
||||
<div className="flex items-center justify-end">
|
||||
<div className="flex items-center rounded-md px-2 sm:hover:bg-gray-100">
|
||||
<Label htmlFor="hiddenSwitch" className="mt-2 hidden cursor-pointer self-center pr-2 sm:inline">
|
||||
<Skeleton
|
||||
as={Label}
|
||||
htmlFor="hiddenSwitch"
|
||||
className="mt-2 hidden cursor-pointer self-center pr-2 sm:inline">
|
||||
{t("set_to_default")}
|
||||
</Label>
|
||||
</Skeleton>
|
||||
<Switch
|
||||
id="hiddenSwitch"
|
||||
disabled={isLoading}
|
||||
@@ -159,11 +173,11 @@ export default function Availability({ schedule }: { schedule: number }) {
|
||||
value ? (
|
||||
<TimezoneSelect
|
||||
value={value}
|
||||
className="focus:border-brand mt-1 block rounded-md border-gray-300 text-sm"
|
||||
className="focus:border-brand mt-1 block w-72 rounded-md border-gray-300 text-sm"
|
||||
onChange={(timezone) => onChange(timezone.value)}
|
||||
/>
|
||||
) : (
|
||||
<SkeletonText className="h-6 w-full" />
|
||||
<SelectSkeletonLoader className="w-72" />
|
||||
)
|
||||
}
|
||||
/>
|
||||
|
||||
@@ -55,20 +55,9 @@ export default function Bookings() {
|
||||
|
||||
const isEmpty = !query.data?.pages[0]?.bookings.length;
|
||||
|
||||
// Get all recurring events of the series with the same recurringEventId
|
||||
const defineRecurrentBookings = (
|
||||
booking: BookingOutput,
|
||||
groupedBookings: Record<string, BookingOutput[]>
|
||||
) => {
|
||||
let recurringBookings = undefined;
|
||||
if (booking.recurringEventId !== null) {
|
||||
recurringBookings = groupedBookings[booking.recurringEventId];
|
||||
}
|
||||
return { recurringBookings };
|
||||
};
|
||||
const shownBookings: Record<string, BookingOutput[]> = {};
|
||||
const filterBookings = (booking: BookingOutput) => {
|
||||
if (status === "recurring" || status === "cancelled") {
|
||||
if (status === "recurring" || status == "unconfirmed" || status === "cancelled") {
|
||||
if (!booking.recurringEventId) {
|
||||
return true;
|
||||
}
|
||||
@@ -90,11 +79,11 @@ export default function Bookings() {
|
||||
|
||||
return (
|
||||
<BookingLayout heading={t("bookings")} subtitle={t("bookings_description")}>
|
||||
<div className="flex w-full flex-1 flex-col" ref={animationParentRef}>
|
||||
<div className="flex w-full flex-col" ref={animationParentRef}>
|
||||
{query.status === "error" && (
|
||||
<Alert severity="error" title={t("something_went_wrong")} message={query.error.message} />
|
||||
)}
|
||||
{(query.status === "loading" || query.status === "idle") && <SkeletonLoader />}
|
||||
{(query.status === "loading" || query.isPaused) && <SkeletonLoader />}
|
||||
{query.status === "success" && !isEmpty && (
|
||||
<div className="pt-2 xl:pt-0">
|
||||
<WipeMyCalActionButton bookingStatus={status} bookingsEmpty={isEmpty} />
|
||||
@@ -103,7 +92,7 @@ export default function Bookings() {
|
||||
*/}
|
||||
|
||||
<div className="overflow-hidden rounded-md border border-gray-200">
|
||||
<table className="w-full">
|
||||
<table className="w-full max-w-full table-fixed">
|
||||
<tbody className="divide-y divide-gray-200 bg-white" data-testid="bookings">
|
||||
{query.data.pages.map((page, index) => (
|
||||
<Fragment key={index}>
|
||||
@@ -111,7 +100,7 @@ export default function Bookings() {
|
||||
<BookingListItem
|
||||
key={booking.id}
|
||||
listingStatus={status}
|
||||
{...defineRecurrentBookings(booking, shownBookings)}
|
||||
recurringBookings={page.recurringInfo}
|
||||
{...booking}
|
||||
/>
|
||||
))}
|
||||
|
||||
@@ -70,6 +70,7 @@ export type FormValues = {
|
||||
periodCountCalendarDays: "1" | "0";
|
||||
periodDates: { startDate: Date; endDate: Date };
|
||||
seatsPerTimeSlot: number | null;
|
||||
seatsPerTimeSlotEnabled: boolean;
|
||||
minimumBookingNotice: number;
|
||||
beforeBufferTime: number;
|
||||
afterBufferTime: number;
|
||||
@@ -96,7 +97,8 @@ export type EventTypeSetupInfered = inferSSRProps<typeof getServerSideProps>;
|
||||
const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
|
||||
const { t } = useLocale();
|
||||
|
||||
const { eventType, locationOptions, team, teamMembers } = props;
|
||||
const { eventType: dbEventType, locationOptions, team, teamMembers } = props;
|
||||
const [eventType, setEventType] = useState(dbEventType);
|
||||
const animationParentRef = useRef(null);
|
||||
const router = useRouter();
|
||||
const { tabName } = querySchema.parse(router.query);
|
||||
@@ -106,7 +108,8 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
|
||||
}, [animationParentRef]);
|
||||
|
||||
const updateMutation = trpc.useMutation("viewer.eventTypes.update", {
|
||||
onSuccess: async ({ eventType }) => {
|
||||
onSuccess: async ({ eventType: newEventType }) => {
|
||||
setEventType({ ...eventType, slug: newEventType.slug });
|
||||
showToast(
|
||||
t("event_type_updated_successfully", {
|
||||
eventTypeTitle: eventType.title,
|
||||
@@ -221,6 +224,9 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
|
||||
locations,
|
||||
blockchainId,
|
||||
smartContractAddress,
|
||||
// We don't need to send it to the backend
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
seatsPerTimeSlotEnabled,
|
||||
...input
|
||||
} = values;
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { useAutoAnimate } from "@formkit/auto-animate/react";
|
||||
import { UserPlan } from "@prisma/client";
|
||||
import Head from "next/head";
|
||||
import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
@@ -8,6 +7,7 @@ import React, { Fragment, useEffect, useState } from "react";
|
||||
import { CAL_URL, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { inferQueryOutput, trpc } from "@calcom/trpc/react";
|
||||
import { TRPCClientError } from "@calcom/trpc/react";
|
||||
import { Icon } from "@calcom/ui";
|
||||
import { Badge, Button, ButtonGroup, Dialog, EmptyScreen, showToast, Switch, Tooltip } from "@calcom/ui/v2";
|
||||
import ConfirmationDialogContent from "@calcom/ui/v2/core/ConfirmationDialogContent";
|
||||
@@ -17,6 +17,7 @@ import Dropdown, {
|
||||
DropdownMenuItem,
|
||||
DropdownMenuSeparator,
|
||||
DropdownMenuTrigger,
|
||||
DropdownMenuPortal,
|
||||
} from "@calcom/ui/v2/core/Dropdown";
|
||||
import Shell from "@calcom/ui/v2/core/Shell";
|
||||
import CreateEventTypeButton from "@calcom/ui/v2/modules/event-types/CreateEventType";
|
||||
@@ -30,8 +31,6 @@ import Avatar from "@components/ui/Avatar";
|
||||
import AvatarGroup from "@components/ui/AvatarGroup";
|
||||
import SkeletonLoader from "@components/v2/eventtype/SkeletonLoader";
|
||||
|
||||
import { TRPCClientError } from "@trpc/react";
|
||||
|
||||
type EventTypeGroups = inferQueryOutput<"viewer.eventTypes">["eventTypeGroups"];
|
||||
type EventTypeGroupProfile = EventTypeGroups[number]["profile"];
|
||||
|
||||
@@ -53,7 +52,7 @@ const Item = ({ type, group, readOnly }: { type: EventType; group: EventTypeGrou
|
||||
const { t } = useLocale();
|
||||
|
||||
return (
|
||||
<Link href={`/event-types/${type.id}`}>
|
||||
<Link href={`/event-types/${type.id}?tabName=setup`}>
|
||||
<a
|
||||
className="flex-grow truncate text-sm"
|
||||
title={`${type.title} ${type.description ? `– ${type.description}` : ""}`}>
|
||||
@@ -293,8 +292,9 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
|
||||
<DropdownMenuItem>
|
||||
<DropdownItem
|
||||
type="button"
|
||||
href={"/event-types/" + type.id}
|
||||
StartIcon={Icon.FiEdit2}>
|
||||
data-testid={"event-type-edit-" + type.id}
|
||||
StartIcon={Icon.FiEdit2}
|
||||
onClick={() => router.push("/event-types/" + type.id)}>
|
||||
{t("edit") as string}
|
||||
</DropdownItem>
|
||||
</DropdownMenuItem>
|
||||
@@ -344,90 +344,92 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
|
||||
<DropdownMenuTrigger asChild data-testid={"event-type-options-" + type.id}>
|
||||
<Button type="button" size="icon" color="secondary" StartIcon={Icon.FiMoreHorizontal} />
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent portalled>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Link href={calLink}>
|
||||
<a target="_blank">
|
||||
<DropdownMenuPortal>
|
||||
<DropdownMenuContent>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Link href={calLink}>
|
||||
<a target="_blank">
|
||||
<Button
|
||||
color="minimal"
|
||||
StartIcon={Icon.FiExternalLink}
|
||||
className="w-full rounded-none">
|
||||
{t("preview") as string}
|
||||
</Button>
|
||||
</a>
|
||||
</Link>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
color="minimal"
|
||||
className="w-full rounded-none text-left"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiClipboard}
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(calLink);
|
||||
showToast(t("link_copied"), "success");
|
||||
}}>
|
||||
{t("copy_link") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
{isNativeShare ? (
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
color="minimal"
|
||||
StartIcon={Icon.FiExternalLink}
|
||||
className="w-full rounded-none">
|
||||
{t("preview") as string}
|
||||
className="w-full rounded-none"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiUpload}
|
||||
onClick={() => {
|
||||
navigator
|
||||
.share({
|
||||
title: t("share"),
|
||||
text: t("share_event"),
|
||||
url: calLink,
|
||||
})
|
||||
.then(() => showToast(t("link_shared"), "success"))
|
||||
.catch(() => showToast(t("failed"), "error"));
|
||||
}}>
|
||||
{t("share") as string}
|
||||
</Button>
|
||||
</a>
|
||||
</Link>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
color="minimal"
|
||||
className="w-full rounded-none text-left"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiClipboard}
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(calLink);
|
||||
showToast(t("link_copied"), "success");
|
||||
}}>
|
||||
{t("copy_link") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
{isNativeShare ? (
|
||||
</DropdownMenuItem>
|
||||
) : null}
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
onClick={() => router.push("/event-types/" + type.id)}
|
||||
color="minimal"
|
||||
className="w-full rounded-none"
|
||||
StartIcon={Icon.FiEdit}>
|
||||
{t("edit") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
color="minimal"
|
||||
className="w-full rounded-none"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiUpload}
|
||||
onClick={() => {
|
||||
navigator
|
||||
.share({
|
||||
title: t("share"),
|
||||
text: t("share_event"),
|
||||
url: calLink,
|
||||
})
|
||||
.then(() => showToast(t("link_shared"), "success"))
|
||||
.catch(() => showToast(t("failed"), "error"));
|
||||
}}>
|
||||
{t("share") as string}
|
||||
StartIcon={Icon.FiCopy}
|
||||
onClick={() => openModal(group, type)}>
|
||||
{t("duplicate") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
) : null}
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
href={"/event-types/" + type.id}
|
||||
color="minimal"
|
||||
className="w-full"
|
||||
StartIcon={Icon.FiEdit}>
|
||||
{t("edit") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
type="button"
|
||||
color="minimal"
|
||||
className="w-full rounded-none"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiCopy}
|
||||
onClick={() => openModal(group, type)}>
|
||||
{t("duplicate") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuSeparator className="h-px bg-gray-200" />
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
onClick={() => {
|
||||
setDeleteDialogOpen(true);
|
||||
setDeleteDialogTypeId(type.id);
|
||||
}}
|
||||
color="destructive"
|
||||
StartIcon={Icon.FiTrash}
|
||||
className="w-full rounded-none">
|
||||
{t("delete") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
<DropdownMenuSeparator className="h-px bg-gray-200" />
|
||||
<DropdownMenuItem className="outline-none">
|
||||
<Button
|
||||
onClick={() => {
|
||||
setDeleteDialogOpen(true);
|
||||
setDeleteDialogTypeId(type.id);
|
||||
}}
|
||||
color="destructive"
|
||||
StartIcon={Icon.FiTrash}
|
||||
className="w-full rounded-none">
|
||||
{t("delete") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenuPortal>
|
||||
</Dropdown>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
import { useState } from "react";
|
||||
import { HelpScout, useChat } from "react-live-chat-loader";
|
||||
|
||||
import { classNames } from "@calcom/lib";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { Icon } from "@calcom/ui";
|
||||
import { Button } from "@calcom/ui/v2";
|
||||
import Meta from "@calcom/ui/v2/core/Meta";
|
||||
import { getLayout } from "@calcom/ui/v2/core/layouts/SettingsLayout";
|
||||
|
||||
interface CtaRowProps {
|
||||
title: string;
|
||||
description: string;
|
||||
children: React.ReactNode;
|
||||
className?: string;
|
||||
}
|
||||
|
||||
const CtaRow = ({ title, description, className, children }: CtaRowProps) => {
|
||||
return (
|
||||
<>
|
||||
<section className={classNames("flex flex-col sm:flex-row", className)}>
|
||||
<div>
|
||||
<h2 className="font-medium">{title}</h2>
|
||||
<p>{description}</p>
|
||||
</div>
|
||||
<div className="flex-shrink-0 pt-3 sm:ml-auto sm:pt-0 sm:pl-3">{children}</div>
|
||||
</section>
|
||||
<hr className="border-neutral-200" />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
const BillingView = () => {
|
||||
const { t } = useLocale();
|
||||
const { data: user } = trpc.useQuery(["viewer.me"]);
|
||||
const isPro = user?.plan === "PRO";
|
||||
const [, loadChat] = useChat();
|
||||
const [showChat, setShowChat] = useState(false);
|
||||
|
||||
const onContactSupportClick = () => {
|
||||
setShowChat(true);
|
||||
loadChat({ open: true });
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<Meta title={t("billing")} description={t("manage_billing_description")} />
|
||||
<div className="space-y-6 text-sm sm:space-y-8">
|
||||
{!isPro && (
|
||||
<CtaRow title={t("billing_freeplan_title")} description={t("billing_freeplan_description")}>
|
||||
<form target="_blank" method="POST" action="/api/upgrade">
|
||||
<Button type="submit" EndIcon={Icon.FiExternalLink}>
|
||||
{t("billing_freeplan_cta")}
|
||||
</Button>
|
||||
</form>
|
||||
</CtaRow>
|
||||
)}
|
||||
|
||||
<CtaRow
|
||||
className={classNames(!isPro && "pointer-events-none opacity-30")}
|
||||
title={t("billing_manage_details_title")}
|
||||
description={t("billing_manage_details_description")}>
|
||||
<Button
|
||||
color={isPro ? "primary" : "secondary"}
|
||||
href="/api/integrations/stripepayment/portal"
|
||||
target="_blank"
|
||||
EndIcon={Icon.FiExternalLink}>
|
||||
{t("billing_portal")}
|
||||
</Button>
|
||||
</CtaRow>
|
||||
|
||||
<CtaRow title={t("billing_help_title")} description={t("billing_help_description")}>
|
||||
<Button color="secondary" onClick={onContactSupportClick}>
|
||||
{t("billing_help_cta")}
|
||||
</Button>
|
||||
</CtaRow>
|
||||
{showChat && <HelpScout color="#292929" icon="message" horizontalPosition="right" zIndex="1" />}
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
BillingView.getLayout = getLayout;
|
||||
|
||||
export default BillingView;
|
||||
@@ -7,6 +7,7 @@ import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { Icon } from "@calcom/ui";
|
||||
import { Alert } from "@calcom/ui/v2";
|
||||
import Badge from "@calcom/ui/v2/core/Badge";
|
||||
import EmptyScreen from "@calcom/ui/v2/core/EmptyScreen";
|
||||
import Meta from "@calcom/ui/v2/core/Meta";
|
||||
@@ -23,7 +24,7 @@ import { CalendarSwitch } from "@components/v2/settings/CalendarSwitch";
|
||||
const SkeletonLoader = () => {
|
||||
return (
|
||||
<SkeletonContainer>
|
||||
<div className="mt-6 mb-8 space-y-6 divide-y">
|
||||
<div className="mt-6 mb-8 space-y-6">
|
||||
<SkeletonText className="h-8 w-full" />
|
||||
<SkeletonText className="h-8 w-full" />
|
||||
<SkeletonText className="h-8 w-full" />
|
||||
@@ -89,7 +90,30 @@ const CalendarsView = () => {
|
||||
<List>
|
||||
{data.connectedCalendars.map((item) => (
|
||||
<Fragment key={item.credentialId}>
|
||||
{item.calendars && (
|
||||
{item.error && item.error.message && (
|
||||
<Alert
|
||||
severity="warning"
|
||||
key={item.credentialId}
|
||||
title={t("calendar_connection_fail")}
|
||||
message={item.error.message}
|
||||
className="mb-4 mt-4"
|
||||
actions={
|
||||
<>
|
||||
{/* @TODO: add a reconnect button, that calls add api and delete old credential */}
|
||||
<DisconnectIntegration
|
||||
credentialId={item.credentialId}
|
||||
trashIcon
|
||||
onSuccess={() => query.refetch()}
|
||||
buttonProps={{
|
||||
className: "border border-gray-300 py-[2px]",
|
||||
color: "secondary",
|
||||
}}
|
||||
/>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
)}
|
||||
{item?.error === undefined && item.calendars && (
|
||||
<ListItem expanded className="flex-col">
|
||||
<div className="flex w-full flex-1 items-center space-x-3 pb-5 pl-1 pt-1 rtl:space-x-reverse">
|
||||
{
|
||||
@@ -154,6 +178,22 @@ const CalendarsView = () => {
|
||||
/>
|
||||
);
|
||||
}}
|
||||
error={() => {
|
||||
return (
|
||||
<Alert
|
||||
message={
|
||||
<Trans i18nKey="fetching_calendars_error">
|
||||
An error ocurred while fetching your Calendars.
|
||||
<a className="cursor-pointer underline" onClick={() => query.refetch()}>
|
||||
try again
|
||||
</a>
|
||||
.
|
||||
</Trans>
|
||||
}
|
||||
severity="error"
|
||||
/>
|
||||
);
|
||||
}}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -3,12 +3,13 @@ import { useMemo } from "react";
|
||||
import { useForm, Controller } from "react-hook-form";
|
||||
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { setIs24hClockInLocalStorage } from "@calcom/lib/timeFormat";
|
||||
import { inferQueryOutput, trpc } from "@calcom/trpc/react";
|
||||
import { Button } from "@calcom/ui/v2/core/Button";
|
||||
import Meta from "@calcom/ui/v2/core/Meta";
|
||||
import TimezoneSelect from "@calcom/ui/v2/core/TimezoneSelect";
|
||||
import Select from "@calcom/ui/v2/core/form/Select";
|
||||
import { Form, Label } from "@calcom/ui/v2/core/form/fields";
|
||||
import Select from "@calcom/ui/v2/core/form/select";
|
||||
import { getLayout } from "@calcom/ui/v2/core/layouts/SettingsLayout";
|
||||
import showToast from "@calcom/ui/v2/core/notifications";
|
||||
import { SkeletonContainer, SkeletonText, SkeletonButton } from "@calcom/ui/v2/core/skeleton";
|
||||
@@ -33,25 +34,32 @@ const SkeletonLoader = () => {
|
||||
|
||||
interface GeneralViewProps {
|
||||
localeProp: string;
|
||||
user: inferQueryOutput<"viewer.me">;
|
||||
}
|
||||
|
||||
const WithQuery = withQuery(["viewer.public.i18n"], { context: { skipBatch: true } });
|
||||
const WithQuery = withQuery(["viewer.public.i18n"], { trpc: { context: { skipBatch: true } } });
|
||||
|
||||
const GeneralQueryView = () => {
|
||||
const { t } = useLocale();
|
||||
|
||||
const { data: user, isLoading } = trpc.useQuery(["viewer.me"]);
|
||||
if (isLoading) return <SkeletonLoader />;
|
||||
if (!user) {
|
||||
throw new Error(t("something_went_wrong"));
|
||||
}
|
||||
return (
|
||||
<WithQuery
|
||||
success={({ data }) => <GeneralView localeProp={data.locale} />}
|
||||
success={({ data }) => <GeneralView user={user} localeProp={data.locale} />}
|
||||
customLoader={<SkeletonLoader />}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const GeneralView = ({ localeProp }: GeneralViewProps) => {
|
||||
const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
|
||||
const router = useRouter();
|
||||
const utils = trpc.useContext();
|
||||
const { t } = useLocale();
|
||||
|
||||
const { data: user, isLoading } = trpc.useQuery(["viewer.me"]);
|
||||
const mutation = trpc.useMutation("viewer.updateProfile", {
|
||||
onSuccess: () => {
|
||||
showToast(t("settings_updated_successfully"), "success");
|
||||
@@ -92,24 +100,24 @@ const GeneralView = ({ localeProp }: GeneralViewProps) => {
|
||||
value: localeProp || "",
|
||||
label: localeOptions.find((option) => option.value === localeProp)?.label || "",
|
||||
},
|
||||
timeZone: user?.timeZone || "",
|
||||
timeZone: user.timeZone || "",
|
||||
timeFormat: {
|
||||
value: user?.timeFormat || 12,
|
||||
label: timeFormatOptions.find((option) => option.value === user?.timeFormat)?.label || 12,
|
||||
value: user.timeFormat || 12,
|
||||
label: timeFormatOptions.find((option) => option.value === user.timeFormat)?.label || 12,
|
||||
},
|
||||
weekStart: {
|
||||
value: user?.weekStart,
|
||||
label: nameOfDay(localeProp, user?.weekStart === "Sunday" ? 0 : 1),
|
||||
value: user.weekStart,
|
||||
label: nameOfDay(localeProp, user.weekStart === "Sunday" ? 0 : 1),
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (isLoading) return <SkeletonLoader />;
|
||||
|
||||
return (
|
||||
<Form
|
||||
form={formMethods}
|
||||
handleSubmit={(values) => {
|
||||
setIs24hClockInLocalStorage(values.timeFormat.value === 24);
|
||||
|
||||
mutation.mutate({
|
||||
...values,
|
||||
locale: values.locale.value,
|
||||
|
||||
@@ -7,7 +7,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import Button from "@calcom/ui/v2/core/Button";
|
||||
import Meta from "@calcom/ui/v2/core/Meta";
|
||||
import { Form, TextField } from "@calcom/ui/v2/core/form/fields";
|
||||
import { Form, PasswordField } from "@calcom/ui/v2/core/form/fields";
|
||||
import { getLayout } from "@calcom/ui/v2/core/layouts/SettingsLayout";
|
||||
import showToast from "@calcom/ui/v2/core/notifications";
|
||||
|
||||
@@ -48,7 +48,7 @@ const PasswordView = () => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<Meta title="Password" description="Manage settings for your account passwords" />
|
||||
<Meta title={t("password")} description={t("password_description")} />
|
||||
{user && user.identityProvider !== IdentityProvider.CAL ? (
|
||||
<div>
|
||||
<div className="mt-6">
|
||||
@@ -65,22 +65,17 @@ const PasswordView = () => {
|
||||
</p>
|
||||
</div>
|
||||
) : (
|
||||
<Form<ChangePasswordFormValues> form={formMethods} handleSubmit={handleSubmit}>
|
||||
<Form form={formMethods} handleSubmit={handleSubmit}>
|
||||
<div className="max-w-[38rem] sm:flex sm:space-x-4">
|
||||
<div className="flex-grow">
|
||||
<TextField {...register("oldPassword")} label={t("old_password")} type="password" />
|
||||
<PasswordField {...register("oldPassword")} label={t("old_password")} />
|
||||
</div>
|
||||
<div className="flex-grow">
|
||||
<TextField
|
||||
{...register("newPassword")}
|
||||
label={t("new_password")}
|
||||
type="password"
|
||||
placeholder={t("secure_password")}
|
||||
/>
|
||||
<PasswordField {...register("newPassword")} label={t("new_password")} />
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-sm text-gray-600">
|
||||
<Trans i18nKey="valid_password">
|
||||
<Trans i18nKey="invalid_password_hint">
|
||||
Password must be at least at least 7 characters, mix of uppercase & lowercase letters, and
|
||||
contain at least 1 number
|
||||
</Trans>
|
||||
@@ -89,8 +84,8 @@ const PasswordView = () => {
|
||||
<Button
|
||||
color="primary"
|
||||
className="mt-8"
|
||||
disabled={isSubmitting || mutation.isLoading}
|
||||
onClick={() => handleSubmit(formMethods.getValues())}>
|
||||
type="submit"
|
||||
disabled={isSubmitting || mutation.isLoading}>
|
||||
{t("update")}
|
||||
</Button>
|
||||
</Form>
|
||||
|
||||
@@ -69,10 +69,9 @@ const CreateNewTeamPage = () => {
|
||||
data-testid="onboarding"
|
||||
key={router.asPath}>
|
||||
<Head>
|
||||
<title>{t("create_new_team")}</title>
|
||||
<title>Create a new Team</title>
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
</Head>
|
||||
|
||||
<div className="mx-auto px-4 py-24">
|
||||
<div className="relative">
|
||||
<div className="sm:mx-auto sm:w-full sm:max-w-[600px]">
|
||||
|
||||
@@ -26,7 +26,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import useTheme from "@calcom/lib/hooks/useTheme";
|
||||
import { getEveryFreqFor } from "@calcom/lib/recurringStrings";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import { isBrowserLocale24h } from "@calcom/lib/timeFormat";
|
||||
import { getIs24hClockFromLocalStorage, isBrowserLocale24h } from "@calcom/lib/timeFormat";
|
||||
import { localStorage } from "@calcom/lib/webstorage";
|
||||
import prisma from "@calcom/prisma";
|
||||
import Button from "@calcom/ui/Button";
|
||||
@@ -201,7 +201,7 @@ export default function Success(props: SuccessProps) {
|
||||
// TODO: Add payment details
|
||||
});
|
||||
setDate(date.tz(localStorage.getItem("timeOption.preferredTimeZone") || dayjs.tz.guess()));
|
||||
setIs24h(!!localStorage.getItem("timeOption.is24hClock"));
|
||||
setIs24h(!!getIs24hClockFromLocalStorage());
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [eventType, needsConfirmation]);
|
||||
|
||||
@@ -263,7 +263,7 @@ export default function Success(props: SuccessProps) {
|
||||
{userIsOwner && !isEmbed && (
|
||||
<div className="mt-2 ml-4 -mb-4">
|
||||
<Link href={eventType.recurringEvent?.count ? "/bookings/recurring" : "/bookings/upcoming"}>
|
||||
<a className="mt-2 inline-flex px-1 py-2 text-sm text-gray-500 hover:bg-gray-100 hover:text-gray-800">
|
||||
<a className="mt-2 inline-flex px-1 py-2 text-sm text-gray-500 hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-transparent dark:hover:text-white">
|
||||
<Icon.FiChevronLeft className="h-5 w-5" /> {t("back_to_bookings")}
|
||||
</a>
|
||||
</Link>
|
||||
@@ -411,7 +411,7 @@ export default function Success(props: SuccessProps) {
|
||||
!isCancelled &&
|
||||
(!isCancellationMode ? (
|
||||
<>
|
||||
<hr className="border-bookinglightest" />
|
||||
<hr className="border-bookinglightest dark:border-darkgray-300" />
|
||||
<div className="py-8 text-center last:pb-0">
|
||||
<span className="text-gray-900 ltr:mr-2 rtl:ml-2 dark:text-gray-50">
|
||||
{t("need_to_make_a_change")}
|
||||
@@ -448,7 +448,7 @@ export default function Success(props: SuccessProps) {
|
||||
))}
|
||||
{userIsOwner && !needsConfirmation && !isCancellationMode && !isCancelled && (
|
||||
<>
|
||||
<hr className="border-bookinglightest" />
|
||||
<hr className="border-bookinglightest dark:border-darkgray-300" />
|
||||
<div className="text-bookingdark align-center flex flex-row justify-center pt-8">
|
||||
<span className="flex self-center font-medium text-gray-700 ltr:mr-2 rtl:ml-2 dark:text-gray-50">
|
||||
{t("add_to_calendar")}
|
||||
|
||||
@@ -25,7 +25,8 @@ test.describe("Change username on settings", () => {
|
||||
await users.deleteAll();
|
||||
});
|
||||
|
||||
test("User can change username", async ({ page, users, prisma }) => {
|
||||
/** TODO: Find out why it's timing out */
|
||||
test.fixme("User can change username", async ({ page, users, prisma }) => {
|
||||
const user = await users.create({ plan: UserPlan.TRIAL });
|
||||
|
||||
await user.login();
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import { expect } from "@playwright/test";
|
||||
|
||||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
|
||||
import { randomString } from "../lib/random";
|
||||
import { test } from "./lib/fixtures";
|
||||
|
||||
@@ -87,7 +89,7 @@ test.describe("Event Types tests", () => {
|
||||
);
|
||||
const href = await firstElement.getAttribute("href");
|
||||
if (!href) throw new Error("No href found for event type");
|
||||
const [eventTypeId] = href.split("/").reverse();
|
||||
const [eventTypeId] = new URL(WEBAPP_URL + href).pathname.split("/").reverse();
|
||||
const firstTitle = await page.locator(`[data-testid=event-type-title-${eventTypeId}]`).innerText();
|
||||
const firstFullSlug = await page.locator(`[data-testid=event-type-slug-${eventTypeId}]`).innerText();
|
||||
const firstSlug = firstFullSlug.split("/")[2];
|
||||
|
||||
@@ -3,6 +3,7 @@ import type Prisma from "@prisma/client";
|
||||
import { Prisma as PrismaType, UserPlan } from "@prisma/client";
|
||||
import { hash } from "bcryptjs";
|
||||
|
||||
import dayjs from "@calcom/dayjs";
|
||||
import { DEFAULT_SCHEDULE, getAvailabilityFromSchedule } from "@calcom/lib/availability";
|
||||
import { prisma } from "@calcom/prisma";
|
||||
|
||||
@@ -257,7 +258,7 @@ const createUser = async (
|
||||
password: await hashPassword(uname),
|
||||
emailVerified: new Date(),
|
||||
completedOnboarding: opts?.completedOnboarding ?? true,
|
||||
timeZone: opts?.timeZone ?? TimeZoneEnum.UK,
|
||||
timeZone: opts?.timeZone ?? dayjs.tz.guess(),
|
||||
locale: opts?.locale ?? "en",
|
||||
schedules:
|
||||
opts?.completedOnboarding ?? true
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "استخدم الرابط أدناه لإعادة تعيين كلمة المرور",
|
||||
"hey_there": "مرحبًا،",
|
||||
"forgot_your_password_calcom": "نسيت كلمة المرور الخاصة بك؟ - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | نوع الحدث",
|
||||
"delete_webhook_confirmation_message": "هل أنت متأكد أنك تريد حذف الويب هوك هذا؟ لن تتلقى بعد الآن بيانات اجتماعات Cal.com على عنوان URL محدد، وفي الوقت الفعلي، عندما تتم جدولة حدث أو يتم إلغاؤه.",
|
||||
"confirm_delete_webhook": "نعم، قم بحذف الويبهوك",
|
||||
"edit_webhook": "تعديل الويبهوك",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "الفوترة",
|
||||
"manage_your_billing_info": "قم بإدارة معلومات الفوترة لديك وإلغاء اشتراكك.",
|
||||
"availability": "الأوقات المتاحة",
|
||||
"availability_title": "{{availabilityTitle}} | توفر",
|
||||
"edit_availability": "تعديل التوفر",
|
||||
"configure_availability": "اضبط الأوقات التي تكون متاحًا فيها للحجز.",
|
||||
"copy_times_to": "نسخ الأوقات إلى",
|
||||
@@ -839,7 +837,7 @@
|
||||
"redirect_success_booking": "إعادة التوجيه عند الحجز ",
|
||||
"you_are_being_redirected": "ستتم إعادة توجيهك إلى {{ url }} خلال $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "لاستخدام هذه الميزة، تحتاج إلى الترقية إلى حساب Pro.",
|
||||
"redirect_url_description": "إعادة التوجيه إلى عنوان URL مخصص بعد الحجز بنجاح",
|
||||
"duplicate": "تكرار",
|
||||
"offer_seats": "عرض مقاعد",
|
||||
"offer_seats_description": "عرض مقاعد للحجز (هذا يعطل الضيوف والتسجيل في الحجز)",
|
||||
@@ -1256,6 +1254,7 @@
|
||||
"back_to_signin": "العودة لتسجيل الدخول",
|
||||
"reset_link_sent": "تم إرسال رابط إعادة الضبط",
|
||||
"password_reset_email": "ثمة بريد إلكتروني في طريقه إلى {{email}} مع تعليمات لإعادة تعيين كلمة المرور الخاصة بك.",
|
||||
"password_reset_leading": "إذا لم تتلقَ رسالة إلكترونية قريباُ، تحقق من أن عنوان البريد الإلكتروني الذي أدخلته صحيح، وتحقق من مجلد البريد الطفيلي لديك، ثم تواصل مع قسم الدعم إذا استمرت المشكلة.",
|
||||
"password_updated": "تم تحديث كلمة المرور!",
|
||||
"pending_payment": "في انتظار الدفع",
|
||||
"confirmation_page_rainbow": "رمز بوابة الحدث الخاص بك مع الرموز أو NFTs على Ethereum وPolygon وغيرها.",
|
||||
@@ -1267,5 +1266,34 @@
|
||||
"confirm_password_change_email": "الرجاء تأكيد كلمة المرور الخاصة بك قبل تغيير عنوان بريدك الإلكتروني",
|
||||
"seats": "مقاعد",
|
||||
"every_app_published": "كل تطبيق منشور على متجر تطبيقات Cal.com هو مصدر مفتوح ويتم اختباره بشكل شامل عن طريق مراجعات الأقران. لا يدعم Cal.com أو يصادق على هذه التطبيقات ما لم يتم نشرها بواسطة Cal.com. إذا واجهت محتوى أو سلوك غير مناسب يرجى الإبلاغ عن ذلك.",
|
||||
"report_app": "الإبلاغ عن التطبيق"
|
||||
"report_app": "الإبلاغ عن التطبيق",
|
||||
"team_name_required": "اسم الفريق مطلوب",
|
||||
"how_additional_inputs_as_variables": "كيفية استخدام مدخلات إضافية كمتغيرات",
|
||||
"format": "التنسيق",
|
||||
"uppercase_for_letters": "استخدام الحروف الكبيرة لجميع الأحرف",
|
||||
"replace_whitespaces_underscores": "استبدال المساحات البيضاء بالشرطات السفلية",
|
||||
"manage_billing": "إدارة الفواتير",
|
||||
"manage_billing_description": "إدارة كل الأشياء المفوترة",
|
||||
"billing_freeplan_title": "أنت حاليًا على الخطة المجانية",
|
||||
"billing_freeplan_description": "نحن نعمل بشكل أفضل ضمن فرق. وسّع سير عملك مع أحداث الذهاب والإياب والأحداث الجماعية و صنع نماذج مسارات متقدمة",
|
||||
"billing_freeplan_cta": "جرب الآن",
|
||||
"billing_manage_details_title": "عرض تفاصيل الفوترة وإدارتها",
|
||||
"billing_manage_details_description": "اعرض تفاصيل الفوترة وعدّلها، بالإضافة إلى إمكانية إلغاء الاشتراك.",
|
||||
"billing_portal": "بوابة الفواتير",
|
||||
"billing_help_title": "هل تحتاج إلى أي شيء آخر؟",
|
||||
"billing_help_description": "إذا كنت تحتاج إلى أي مساعدة إضافية بخصوص الفوترة، فإن فريق الدعم لدينا في انتظارك لتقديم المساعدة.",
|
||||
"billing_help_cta": "الاتصال بالدعم",
|
||||
"ignore_special_characters": "تجاهل الأحرف الخاصة في تسمية الإدخال الإضافية لديك. استخدم فقط الأحرف والأرقام",
|
||||
"retry": "إعادة المحاولة",
|
||||
"fetching_calendars_error": "حدثت مشكلة أثناء حفظ بياناتك. الرجاء <1>المحاولة من جديد</1> أو التواصل مع دعم العملاء.",
|
||||
"calendar_connection_fail": "فشل الاتصال بالتقويم",
|
||||
"booking_confirmation_success": "تم تأكيد الحجز بنجاح",
|
||||
"booking_confirmation_fail": "فشل تأكيد الحجز",
|
||||
"we_wont_show_again": "لن نعرض هذا مرة أخرى",
|
||||
"couldnt_update_timezone": "لم نتمكن من تحديث المنطقة الزمنية",
|
||||
"updated_timezone_to": "تم تحديث المنطقة الزمنية إلى {{formattedCurrentTz}}",
|
||||
"update_timezone": "تحديث المنطقة الزمنية",
|
||||
"update_timezone_question": "تحديث المنطقة الزمنية؟",
|
||||
"update_timezone_description": "يبدو أن منطقتك الزمنية المحلية قد تغيرت إلى {{formattedCurrentTz}}. من المهم جداً أن يكون لديك المنطقة الزمنية المناسبة لمنع الحجز في أوقات غير مرغوب فيها. هل تريد تحديثها؟",
|
||||
"dont_update": "لا تقم بالتحديث"
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Pro obnovení hesla použijte odkaz níž",
|
||||
"hey_there": "Zdravíme,",
|
||||
"forgot_your_password_calcom": "Zapomněli jste heslo? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Typ události",
|
||||
"delete_webhook_confirmation_message": "Opravdu chcete smazat tento webhook? Přestanete v reálném čase dostávat Cal.com data o schůzce na dané URL, pokud bude událost naplánována nebo zrušena.",
|
||||
"confirm_delete_webhook": "Ano, smazat webhook",
|
||||
"edit_webhook": "Upravit webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Fakturace",
|
||||
"manage_your_billing_info": "Spravujte své fakturační údaje a zrušte své předplatné.",
|
||||
"availability": "Dostupnost",
|
||||
"availability_title": "{{availabilityTitle}} | Dostupnost",
|
||||
"edit_availability": "Upravit dostupnost",
|
||||
"configure_availability": "Nastavit časy, kdy jste dostupní pro rezervace.",
|
||||
"copy_times_to": "Kopírovat časy do",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Přesměrovat při rezervaci ",
|
||||
"you_are_being_redirected": "Budete přesměrováni na {{ url }} za $t(s, {\"count\": {{s}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "Pokud chcete použít tuto funkci, musíte provést aktualizaci na účet Pro.",
|
||||
"duplicate": "Duplikovat",
|
||||
"offer_seats": "Nabídka míst",
|
||||
"offer_seats_description": "Nabídnout místa rezervacím (tím se vypnou rezervace hostů a s potvrzením)",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Před změnou e-mailové adresy potvrďte své heslo",
|
||||
"seats": "míst",
|
||||
"every_app_published": "Každá aplikace zveřejněná v obchodě s aplikacemi na Cal.com má otevřený zdrojový kód a je důkladně testována prostřednictvím vzájemného hodnocení. Společnost Cal.com, Inc. nicméně tyto aplikace neschvaluje ani necertifikuje, pokud nejsou zveřejněny přímo společností Cal.com. Pokud se setkáte s nevhodným obsahem nebo chováním, nahlaste to.",
|
||||
"report_app": "Nahlásit aplikaci"
|
||||
"report_app": "Nahlásit aplikaci",
|
||||
"billing_manage_details_title": "Zobrazit a spravovat fakturační údaje",
|
||||
"billing_manage_details_description": "Zobrazit a upravovat fakturační údaje, možnost zrušit předplatné.",
|
||||
"billing_help_title": "Potřebujete ještě něco?",
|
||||
"billing_help_description": "Pokud potřebujete další pomoc s fakturací, náš tým podpory je zde, aby vám pomohl."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Benutzen Sie den Link, um Ihr Passwort zurückzusetzen",
|
||||
"hey_there": "Hallo,",
|
||||
"forgot_your_password_calcom": "Passwort vergessen? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Event-Typ",
|
||||
"delete_webhook_confirmation_message": "Sind Sie sicher, dass Sie diesen Webhook löschen möchten? Sie werden keine Cal.com Termindaten mehr erhalten.",
|
||||
"confirm_delete_webhook": "Ja, Webhook löschen",
|
||||
"edit_webhook": "Webhook bearbeiten",
|
||||
@@ -189,7 +188,7 @@
|
||||
"secret": "Passwort",
|
||||
"leave_blank_to_remove_secret": "Leer lassen, um Passwort zu entfernen",
|
||||
"webhook_secret_key_description": "Stellen Sie sicher, dass Ihr Server aus Sicherheitsgründen nur die erwarteten Cal.com-Anfragen empfängt",
|
||||
"secret_meeting": "Geheimes Termin",
|
||||
"secret_meeting": "Geheimer Termin",
|
||||
"login_instead": "Stattdessen anmelden",
|
||||
"already_have_an_account": "Haben Sie bereits ein Konto?",
|
||||
"create_account": "Konto erstellen",
|
||||
@@ -245,7 +244,7 @@
|
||||
"where": "Wo",
|
||||
"add_to_calendar": "Zum Kalender hinzufügen",
|
||||
"add_another_calendar": "Einen weiteren Kalender hinzufügen",
|
||||
"other": "Anderes",
|
||||
"other": "Sonstige",
|
||||
"emailed_you_and_attendees": "Wir haben Ihnen und den anderen Teilnehmern eine Einladung zum Kalender mit allen Details zugeschickt.",
|
||||
"emailed_you_and_attendees_recurring": "Wir haben Ihnn und den anderen Teilnemern eine Kalendereinladung für den ersten Termin dieses wiederkehrendem Ereignisses gesendet.",
|
||||
"emailed_you_and_any_other_attendees": "Wir haben Ihnen und allen anderen Teilnehmer diesen Informationen per E-Mail geschickt.",
|
||||
@@ -255,7 +254,7 @@
|
||||
"user_needs_to_confirm_or_reject_booking_recurring": "{{user}} muss noch die Terminreihe des wiederkehrenden Termins bestätigen oder ablehnen.",
|
||||
"meeting_is_scheduled": "Dieser Termin ist geplant",
|
||||
"meeting_is_scheduled_recurring": "Ihr wiederkehrender Termin wurde geplant",
|
||||
"submitted": "Ihr Termin wurde gebuhct",
|
||||
"submitted": "Ihr Termin wurde gebucht",
|
||||
"submitted_recurring": "Ihr wiederkehrender Termin wurde gebucht",
|
||||
"booking_submitted": "Ihre Buchung wurde versandt",
|
||||
"booking_submitted_recurring": "Ihre wiederkehrende Buchung wurde versandt",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Abrechnung",
|
||||
"manage_your_billing_info": "Verwalten Sie Ihre Rechnungsinformationen und kündigen Sie Ihr Abonnement.",
|
||||
"availability": "Verfügbarkeit",
|
||||
"availability_title": "{{availabilityTitle}} | Verfügbarkeit",
|
||||
"edit_availability": "Verfügbarkeit editieren",
|
||||
"configure_availability": "Konfigurieren Sie die Zeiten, in denen Sie für Buchungen zur Verfügung stehen.",
|
||||
"copy_times_to": "Zeiten kopieren in",
|
||||
@@ -651,7 +649,7 @@
|
||||
"event_name_tooltip": "Der Name, der in Kalendern angezeigt wird",
|
||||
"meeting_with_user": "Meeting mit {ATTENDEE}",
|
||||
"additional_inputs": "Zusätzliche Notizen",
|
||||
"additional_input_description": "Erfordert die Eingabe zusätzlicher Eingaben durch den Zeitplaner vor der Buchungsbestätigung",
|
||||
"additional_input_description": "Erfordert die Eingabe zusätzlicher Eingaben durch den Planer vor der Buchungsbestätigung",
|
||||
"label": "Bezeichnung",
|
||||
"placeholder": "Placeholder",
|
||||
"type": "Typ",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Weiterleitung bei Buchung ",
|
||||
"you_are_being_redirected": "Sie werden in $t(second, {\"count\": {{seconds}} }) auf {{ url }} weitergeleitet.",
|
||||
"external_redirect_url": "Externe Umleitungs-URL - Beginnt mit https://",
|
||||
"redirect_url_upgrade_description": "Um diese Funktion nutzen zu können, müssen Sie ein Upgrade auf einen Pro-Account durchführen.",
|
||||
"duplicate": "Duplizieren",
|
||||
"offer_seats": "Plätze anbieten",
|
||||
"offer_seats_description": "Bieten Sie Plätze für Buchungen an (dies deaktiviert Gäste & Opt-in-Buchungen)",
|
||||
@@ -1084,10 +1081,10 @@
|
||||
"using_additional_inputs_as_variables": "Wie kann ich zusätzliche Eingaben als Variablen verwenden?",
|
||||
"download_desktop_app": "Desktop-App herunterladen",
|
||||
"set_ping_link": "Ping-Link festlegen",
|
||||
"rate_limit_exceeded": "Bewertungslimit überschritten",
|
||||
"rate_limit_exceeded": "Anmeldeversuchsgrenze überschritten",
|
||||
"when_something_happens": "Wenn etwas passiert",
|
||||
"action_is_performed": "Eine Aktion wird ausgeführt",
|
||||
"test_action": "Test-Aktion",
|
||||
"test_action": "Aktion testen",
|
||||
"notification_sent": "Benachrichtigung gesendet",
|
||||
"no_input": "Kein Input",
|
||||
"test_workflow_action": "Workflow-Aktion testen",
|
||||
@@ -1144,7 +1141,7 @@
|
||||
"two_factor_auth": "Zwei-Faktor-Authentifizierung",
|
||||
"recurring_event_tab_description": "Einen wiederholenden Zeitplan einrichten",
|
||||
"today": "heute",
|
||||
"appearance": "Aussehen",
|
||||
"appearance": "Darstellung",
|
||||
"appearance_subtitle": "Einstellungen für Ihre Buchungsdarstellung verwalten",
|
||||
"my_account": "Mein Account",
|
||||
"general": "Allgemein",
|
||||
@@ -1183,7 +1180,7 @@
|
||||
"location_info": "Der Ort des Events",
|
||||
"organizer_name_info": "Ihr Name",
|
||||
"additional_notes_info": "Die zusätzlichen Anmerkungen der Buchung",
|
||||
"attendee_name_info": "Der Name der Buchenden",
|
||||
"attendee_name_info": "Name der buchenden Person",
|
||||
"to": "An",
|
||||
"attendee_required_enter_number": "Hier muss der Teilnehmer bei der Buchung eine Telefonnummer eingeben",
|
||||
"workflow_turned_on_successfully": "{{workflowName}} Workflow erfolgreich {{offOn}}geschaltet",
|
||||
@@ -1215,7 +1212,7 @@
|
||||
"problem_saving_user_profile": "Beim Speichern Ihrer Daten ist ein Problem aufgetreten. Bitte versuchen Sie es erneut oder wenden Sie sich an den Support.",
|
||||
"purchase_missing_seats": "Fehlende Plätze kaufen",
|
||||
"slot_length": "Zeitfensterlänge",
|
||||
"booking_appearance": "Buchungsdarstellung",
|
||||
"booking_appearance": "Darstellung der Buchungsseite",
|
||||
"appearance_team_description": "Einstellungen für die Buchungsdarstellung Ihres Teams verwalten",
|
||||
"only_owner_change": "Nur der Besitzer dieses Teams kann Änderungen an den Buchungen des Teams vornehmen ",
|
||||
"team_disable_cal_branding_description": "Entfernt alle Cal-bezogenen Markenzeichen, z.B. 'Powered by Cal.'",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Bitte bestätigen Sie Ihr Passwort, bevor Sie Ihre E-Mail-Adresse ändern",
|
||||
"seats": "Plätze",
|
||||
"every_app_published": "Jede App, die im Cal.com App Store veröffentlicht wird, ist Open Source und gründlich durch Peer Reviews getestet. Cal.com, Inc. unterstützt oder zertifiziert diese Apps jedoch nicht, es sei denn, sie werden von Cal.com veröffentlicht. Wenn Sie auf unangemessene Inhalte oder Verhaltensweisen stoßen, melden Sie diese bitte.",
|
||||
"report_app": "App melden"
|
||||
"report_app": "App melden",
|
||||
"billing_manage_details_title": "Ihre Rechnungsdetails ansehen und verwalten",
|
||||
"billing_manage_details_description": "Rechnungsdaten ansehen, bearbeiten oder Abonnement kündigen.",
|
||||
"billing_help_title": "Brauchen Sie etwas anderes?",
|
||||
"billing_help_description": "Wenn Sie weitere Hilfe bei der Rechnungsstellung benötigen, hilft Ihnen unser Support-Team gerne weiter."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Use the link below to reset your password",
|
||||
"hey_there": "Hey there,",
|
||||
"forgot_your_password_calcom": "Forgot your password? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Event Type",
|
||||
"delete_webhook_confirmation_message": "Are you sure you want to delete this webhook? You will no longer receive Cal.com meeting data at a specified URL, in real-time, when an event is scheduled or canceled.",
|
||||
"confirm_delete_webhook": "Yes, delete webhook",
|
||||
"edit_webhook": "Edit Webhook",
|
||||
@@ -314,6 +313,7 @@
|
||||
"past_bookings": "Your past bookings will show up here.",
|
||||
"cancelled_bookings": "Your cancelled bookings will show up here.",
|
||||
"unconfirmed_bookings": "Your unconfirmed bookings will show up here.",
|
||||
"unconfirmed_bookings_tooltip": "Unconfirmed bookings",
|
||||
"on": "on",
|
||||
"and": "and",
|
||||
"calendar_shows_busy_between": "Your calendar shows you as busy between",
|
||||
@@ -633,7 +633,6 @@
|
||||
"billing": "Billing",
|
||||
"manage_your_billing_info": "Manage your billing information and cancel your subscription.",
|
||||
"availability": "Availability",
|
||||
"availability_title": "{{availabilityTitle}} | Availability",
|
||||
"edit_availability": "Edit availability",
|
||||
"configure_availability": "Configure times when you are available for bookings.",
|
||||
"copy_times_to": "Copy times to",
|
||||
@@ -839,7 +838,7 @@
|
||||
"redirect_success_booking": "Redirect on booking ",
|
||||
"you_are_being_redirected": "You are being redirected to {{ url }} in $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "In order to use this feature, you need to upgrade to a Pro account.",
|
||||
"redirect_url_description": "Redirect to a custom URL after a successful booking",
|
||||
"duplicate": "Duplicate",
|
||||
"offer_seats": "Offer seats",
|
||||
"offer_seats_description": "Offer seats for booking. This automatically disables guest & opt-in bookings.",
|
||||
@@ -1255,9 +1254,9 @@
|
||||
"create_first_api_key_description": "API keys allow other apps to communicate with Cal.com",
|
||||
"back_to_signin": "Back to sign in",
|
||||
"reset_link_sent": "Reset link sent",
|
||||
"password_reset_email":"An email is on it’s way to {{email}} with instructions to reset your password.",
|
||||
"password_reset_leading":"If you don't receive an email soon, check that the email address you entered is correct, check your spam folder or reach out to support if the issue persists.",
|
||||
"password_updated":"Password updated!",
|
||||
"password_reset_email": "An email is on it’s way to {{email}} with instructions to reset your password.",
|
||||
"password_reset_leading": "If you don't receive an email soon, check that the email address you entered is correct, check your spam folder or reach out to support if the issue persists.",
|
||||
"password_updated": "Password updated!",
|
||||
"pending_payment": "Pending payment",
|
||||
"confirmation_page_rainbow": "Token gate your event with tokens or NFTs on Ethereum, Polygon, and more.",
|
||||
"not_on_cal": "Not on Cal.com",
|
||||
@@ -1268,5 +1267,37 @@
|
||||
"confirm_password_change_email": "Please confirm your password before changing your email address",
|
||||
"seats": "seats",
|
||||
"every_app_published": "Every app published on the Cal.com App Store is open source and thoroughly tested via peer reviews. Nevertheless, Cal.com, Inc. does not endorse or certify these apps unless they are published by Cal.com. If you encounter inappropriate content or behaviour please report it.",
|
||||
"report_app": "Report app"
|
||||
"report_app": "Report app",
|
||||
"team_name_required": "Team name required",
|
||||
"how_additional_inputs_as_variables": "How to use Additional Inputs as Variables",
|
||||
"format": "Format",
|
||||
"uppercase_for_letters": "Use uppercase for all letters",
|
||||
"replace_whitespaces_underscores": "Replace whitespaces with underscores",
|
||||
"manage_billing": "Manage billing",
|
||||
"manage_billing_description": "Manage all things billing",
|
||||
"billing_freeplan_title": "You're currently on the FREE plan",
|
||||
"billing_freeplan_description": "We work better in teams. Extend your workflows with round-robin and collective events and make advanced routing forms",
|
||||
"billing_freeplan_cta": "Try now",
|
||||
"billing_manage_details_title": "View and manage your billing details",
|
||||
"billing_manage_details_description": "View and edit your billing details, as well as cancel your subscription.",
|
||||
"billing_portal": "Billing portal",
|
||||
"billing_help_title": "Need anything else?",
|
||||
"billing_help_description": "If you need any further help with billing, our support team are here to help.",
|
||||
"billing_help_cta": "Contact support",
|
||||
"ignore_special_characters": "Ignore special characters in your Additional Input label. Use only letters and numbers",
|
||||
"retry": "Retry",
|
||||
"fetching_calendars_error": "There was a problem fetching your calendars. Please <1>try again</1> or reach out to customer support.",
|
||||
"calendar_connection_fail": "Calendar connection failed",
|
||||
"booking_confirmation_success": "Booking confirmation succeeded",
|
||||
"booking_confirmation_fail": "Booking confirmation failed",
|
||||
"we_wont_show_again": "We won't show this again",
|
||||
"couldnt_update_timezone": "We couldn't update the timezone",
|
||||
"updated_timezone_to": "Updated timezone to {{formattedCurrentTz}}",
|
||||
"update_timezone": "Update timezone",
|
||||
"update_timezone_question": "Update Timezone?",
|
||||
"update_timezone_description": "It seems like your local timezone has changed to {{formattedCurrentTz}}. It's very important to have the correct timezone to prevent bookings at undesired times. Do you want to update it?",
|
||||
"dont_update": "Don't update",
|
||||
"email_address_action": "send email to a specific email address",
|
||||
"after_event_trigger": "after event ends",
|
||||
"how_long_after": "How long after event ends?"
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Utilice el enlace de abajo para restablecer su contraseña",
|
||||
"hey_there": "Hola,",
|
||||
"forgot_your_password_calcom": "¿Has olvidado tu contraseña? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Tipo de Evento",
|
||||
"delete_webhook_confirmation_message": "¿Está seguro de que desea eliminar este webhook? Ya no recibirá datos de reuniones de Cal.com en una URL específica, en tiempo real, cuando se programe o cancele un evento.",
|
||||
"confirm_delete_webhook": "Sí, elimina este webhook",
|
||||
"edit_webhook": "Editar Webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Facturación",
|
||||
"manage_your_billing_info": "Gestione su información de facturación y cancele su suscripción.",
|
||||
"availability": "Disponibilidad",
|
||||
"availability_title": "{{availabilityTitle}} | Disponibilidad",
|
||||
"edit_availability": "Editar disponibilidad",
|
||||
"configure_availability": "Configure los horarios en los que está disponible para realizar reservas.",
|
||||
"copy_times_to": "Copiar tiempos en",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Redirigir al reservar ",
|
||||
"you_are_being_redirected": "Serás redirigido a {{ url }} en $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "Para poder usar esta función, necesita actualizarse a una cuenta Pro.",
|
||||
"duplicate": "Duplicar",
|
||||
"offer_seats": "Ofrecer plazas",
|
||||
"offer_seats_description": "Ofrecer asientos para las reservas (desactiva las reservas de invitados y lsa optativas)",
|
||||
@@ -1184,8 +1181,58 @@
|
||||
"organizer_name_info": "Tu Nombre",
|
||||
"additional_notes_info": "Las notas adicionales de la reserva",
|
||||
"attendee_name_info": "El nombre de la persona que reserva",
|
||||
"to": "Para",
|
||||
"attendee_required_enter_number": "Será necesario que el asistente introduzca un número de teléfono al reservar",
|
||||
"workflow_turned_on_successfully": "El flujo de trabajo {{workflowName}} se ajustó como {{offOn}} correctamente",
|
||||
"download_responses": "Descargar respuestas",
|
||||
"create_your_first_form": "Cree su primer formulario",
|
||||
"create_your_first_form_description": "Con los formularios de orientación puede hacer preguntas de cualificación y llegar a la persona o tipo de evento correctos.",
|
||||
"create_your_first_webhook": "Cree su primer Webhook",
|
||||
"create_your_first_webhook_description": "Con Webhooks puede recibir datos de reuniones en tiempo real cuando suceda algo en Cal.com.",
|
||||
"for_a_maximum_of": "Para un máximo de",
|
||||
"event_one": "evento",
|
||||
"event_other": "eventos",
|
||||
"profile_team_description": "Administre ajustes para el perfil de su equipo",
|
||||
"members_team_description": "Usuarios que están en el grupo",
|
||||
"team_url": "URL del equipo",
|
||||
"delete_team": "Eliminar equipo",
|
||||
"team_members": "Miembros del equipo",
|
||||
"more": "Más",
|
||||
"more_page_footer": "Vemos la aplicación móvil como una extensión de la aplicación web. Si está realizando acciones complicadas, consulte la aplicación web.",
|
||||
"workflow_example_1": "Enviar recordatorio por SMS al asistente 24 horas antes de que el evento comience",
|
||||
"workflow_example_2": "Enviar SMS personalizado al asistente cuando se cambie la planificación del evento",
|
||||
"workflow_example_3": "Enviar correo electrónico personalizado al anfitrión cuando se reserve un evento nuevo",
|
||||
"workflow_example_4": "Enviar recordatorio por correo electrónico al asistente 1 hora antes de que el evento comience",
|
||||
"workflow_example_5": "Enviar correo electrónico personalizado al anfitrión cuando se cambie la planificación del evento",
|
||||
"workflow_example_6": "Enviar SMS personalizado al anfitrión cuando se reserve un evento nuevo",
|
||||
"welcome_to_cal_header": "¡Bienvenido a Cal.com!",
|
||||
"edit_form_later_subtitle": "Podrá editarlo más tarde.",
|
||||
"connect_calendar_later": "Conectaré mi calendario más tarde",
|
||||
"set_my_availability_later": "Indicaré mi disponibilidad más tarde",
|
||||
"problem_saving_user_profile": "Se produjo un problema al guardar sus datos. Inténtelo de nuevo o póngase en contacto con el servicio de atención al cliente.",
|
||||
"purchase_missing_seats": "Comprar licencias que faltan",
|
||||
"slot_length": "Duración de franja",
|
||||
"booking_appearance": "Aspecto de la reserva",
|
||||
"appearance_team_description": "Administre los ajustes para el aspecto de la reserva de su equipo",
|
||||
"only_owner_change": "Solo el propietario de este equipo puede hacer cambios en la reserva del equipo ",
|
||||
"team_disable_cal_branding_description": "Elimina cualquier marca relacionada con Cal, p. ej., \"Powered by Cal\"",
|
||||
"invited_by_team": "{{teamName}} le invitó a unirse a su equipo como {{role}}",
|
||||
"token_invalid_expired": "El token no es válido o ha caducado.",
|
||||
"exchange_add": "Conectar a Microsoft Exchange",
|
||||
"exchange_authentication": "Método de autenticación",
|
||||
"exchange_authentication_standard": "Autenticación básica",
|
||||
"exchange_authentication_ntlm": "Autenticación NTLM",
|
||||
"exchange_compression": "Compresión GZip",
|
||||
"routing_forms_description": "Puede ver todos los formularios y rutas que ha creado aquí.",
|
||||
"add_new_form": "Añadir formulario nuevo",
|
||||
"form_description": "Cree su formulario para dirigirlo a un agente de reservas",
|
||||
"copy_link_to_form": "Copiar enlace al formulario",
|
||||
"theme": "Tema",
|
||||
"theme_applies_note": "Solo se aplica a sus páginas de reservas públicas",
|
||||
"theme_light": "Claro",
|
||||
"theme_dark": "Oscuro",
|
||||
"theme_system": "Predeterminado del sistema",
|
||||
"add_a_team": "Añadir un equipo",
|
||||
"saml_config": "Configuración de SAML",
|
||||
"add_webhook_description": "Reciba datos de reuniones en tiempo real cuando suceda algo en Cal.com",
|
||||
"triggers_when": "Se activa cuando",
|
||||
@@ -1217,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Confirme su contraseña antes de cambiar su dirección de correo electrónico",
|
||||
"seats": "asientos",
|
||||
"every_app_published": "Las aplicaciones publicadas en la tienda de aplicaciones de Cal.com son de código abierto y se han sometido a pruebas exhaustivas con las reseñas de pares. Sin embargo, Cal.com, Inc. no avala ni certifica estas aplicaciones a menos que Cal.com las haya publicado expresamente. Si encuentra contenido o comportamiento inapropiados, informe de ello.",
|
||||
"report_app": "Denunciar aplicación"
|
||||
"report_app": "Denunciar aplicación",
|
||||
"billing_manage_details_title": "Ver y administrar sus datos de facturación",
|
||||
"billing_manage_details_description": "Vea y edite sus datos de facturación, así como cancele su suscripción.",
|
||||
"billing_help_title": "¿Necesita algo más?",
|
||||
"billing_help_description": "Si necesita más ayuda con la facturación, nuestro equipo de soporte está aquí para ayudarlo."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Utilisez le lien ci-dessous pour réinitialiser votre mot de passe",
|
||||
"hey_there": "Salut,",
|
||||
"forgot_your_password_calcom": "Mot de passe oublié ? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Type d'événement",
|
||||
"delete_webhook_confirmation_message": "Êtes-vous sûr de vouloir supprimer ce webhook ? Vous ne recevrez plus les données de réunion de Cal.com à une URL spécifiée, en temps réel, lorsqu'un événement est programmé ou annulé.",
|
||||
"confirm_delete_webhook": "Oui, supprimer le webhook",
|
||||
"edit_webhook": "Modifier le webhook",
|
||||
@@ -612,7 +611,7 @@
|
||||
"create_first_team_and_invite_others": "Créez votre première équipe et invitez d'autres utilisateurs à travailler avec vous.",
|
||||
"create_team_to_get_started": "Créer une équipe pour commencer",
|
||||
"teams": "Équipes",
|
||||
"team": "Equipe",
|
||||
"team": "Équipe",
|
||||
"team_billing": "Facturation d'équipe",
|
||||
"upgrade_to_flexible_pro_title": "Nous avons modifié la facturation pour les équipes",
|
||||
"upgrade_to_flexible_pro_message": "Des membres dans votre équipe n'ont pas de place. Mettez à niveau votre offre pro pour couvrir les places manquantes.",
|
||||
@@ -633,7 +632,9 @@
|
||||
"billing": "Facturation",
|
||||
"manage_your_billing_info": "Gérez vos informations de facturation et annulez votre abonnement.",
|
||||
"availability": "Disponibilité",
|
||||
"edit_availability": "Modifier la disponibilité",
|
||||
"configure_availability": "Déclarez les moments où vous êtes disponible pour un rendez-vous.",
|
||||
"copy_times_to": "Copier les heures vers",
|
||||
"change_weekly_schedule": "Modifier votre planning hebdomadaire",
|
||||
"logo": "Logo",
|
||||
"error": "Erreur",
|
||||
@@ -648,6 +649,7 @@
|
||||
"event_name_tooltip": "Le nom qui apparaîtra dans les calendriers",
|
||||
"meeting_with_user": "Rendez-vous avec {ATTENDEE}",
|
||||
"additional_inputs": "Entrées additionnelles",
|
||||
"additional_input_description": "Exiger que le planificateur saisisse des entrées supplémentaires avant que la réservation soit confirmée",
|
||||
"label": "Libellé",
|
||||
"placeholder": "Placeholder",
|
||||
"type": "Type",
|
||||
@@ -662,6 +664,8 @@
|
||||
"disable_guests": "Désactiver les invité. es",
|
||||
"disable_guests_description": "Désactiver l'ajout d'invité·es supplémentaires lors de la réservation.",
|
||||
"private_link": "Générer une URL privée",
|
||||
"private_link_label": "Lien privé",
|
||||
"private_link_hint": "Votre lien privé sera régénéré après chaque utilisation",
|
||||
"copy_private_link": "Copier le lien privé",
|
||||
"private_link_description": "Générer une URL privée à partager sans exposer votre nom d'utilisateur Cal",
|
||||
"invitees_can_schedule": "Les invité·es peuvent réserver",
|
||||
@@ -703,16 +707,21 @@
|
||||
"delete_account_confirmation_message": "Êtes-vous sûr de vouloir supprimer votre compte Cal.com ? Toute personne avec qui vous avez partagé le lien de votre compte ne pourra plus réserver en utilisant ce lien et toutes les préférences que vous avez enregistrées seront perdues.",
|
||||
"integrations": "Intégrations",
|
||||
"apps": "Applications",
|
||||
"category_apps": "Applications {{category}}",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Connecter les personnes, la technologie et l'espace de travail.",
|
||||
"settings": "Paramètres",
|
||||
"event_type_moved_successfully": "Le type d'évènement a bien été déplacé",
|
||||
"next_step_text": "Prochaine étape",
|
||||
"next_step": "Passer l'étape",
|
||||
"prev_step": "Étape précédente",
|
||||
"install": "Installer",
|
||||
"installed": "Installé",
|
||||
"active_install_one": "{{count}} installation active",
|
||||
"active_install_other": "{{count}} installations actives",
|
||||
"globally_install": "Installation globale",
|
||||
"app_successfully_installed": "Application installée avec succès",
|
||||
"app_could_not_be_installed": "Impossible d'installer l'application",
|
||||
"disconnect": "Déconnecter",
|
||||
"embed_your_calendar": "Intégrez votre calendrier dans votre page web",
|
||||
"connect_your_favourite_apps": "Connectez vos applications favorites.",
|
||||
@@ -723,6 +732,7 @@
|
||||
"connect_additional_calendar": "Connecter un calendrier supplémentaire",
|
||||
"conferencing": "Conférence",
|
||||
"calendar": "Calendrier",
|
||||
"payments": "Paiements",
|
||||
"not_installed": "Non installé",
|
||||
"error_password_mismatch": "Les mots de passe ne correspondent pas.",
|
||||
"error_required_field": "Ce champ est requis.",
|
||||
@@ -756,9 +766,22 @@
|
||||
"import_from": "Importer depuis",
|
||||
"access_token": "Jeton d'accès",
|
||||
"visit_roadmap": "Feuille de route",
|
||||
"featured_categories": "Catégories en vedette",
|
||||
"popular_categories": "Catégories populaires",
|
||||
"number_apps_one": "{{count}} Application",
|
||||
"number_apps_other": "{{count}} Applications",
|
||||
"trending_apps": "Applications populaires",
|
||||
"explore_apps": "{{category}} applications",
|
||||
"installed_apps": "Applications installées",
|
||||
"no_category_apps": "Aucune application {{category}}",
|
||||
"no_category_apps_description_calendar": "Ajouter une application de calendrier pour vérifier les conflits et éviter les doubles réservations",
|
||||
"no_category_apps_description_conferencing": "Essayez d'ajouter une application de conférence pour interconnecter les appels vidéo avec vos clients",
|
||||
"no_category_apps_description_payment": "Ajouter une application de paiement pour faciliter les transactions entre vous et vos clients",
|
||||
"no_category_apps_description_other": "Ajouter n'importe quel autre type d'application pour faire toutes sortes de choses",
|
||||
"installed_app_calendar_description": "Définir le(s) calendrier(s) pour vérifier les conflits pour éviter les doubles réservations.",
|
||||
"installed_app_conferencing_description": "Ajoutez vos applications de vidéoconférence préférées pour vos réunions",
|
||||
"installed_app_payment_description": "Configurez les services de traitement de paiement à utiliser lors de la facturation de vos clients.",
|
||||
"installed_app_other_description": "Toutes vos applications installées à partir d'autres catégories.",
|
||||
"empty_installed_apps_headline": "Aucune application installée",
|
||||
"empty_installed_apps_description": "Les applications vous permettent d'améliorer votre flux de travail et votre processus de planification de façon significative.",
|
||||
"empty_installed_apps_button": "Explorer l'App Store",
|
||||
@@ -779,6 +802,7 @@
|
||||
"remove": "Supprimer",
|
||||
"add": "Ajouter",
|
||||
"installed_one": "Installé",
|
||||
"installed_other": "{{count}} installé(e)(s)",
|
||||
"verify_wallet": "Vérifier le portefeuille",
|
||||
"connect_metamask": "Connecter Metamask",
|
||||
"create_events_on": "Créer des événements le :",
|
||||
@@ -796,6 +820,8 @@
|
||||
"set_to_default": "Définir par défaut",
|
||||
"new_schedule_btn": "Nouveau programme",
|
||||
"add_new_schedule": "Ajouter un nouveau programme",
|
||||
"add_new_calendar": "Ajouter un nouveau calendrier",
|
||||
"set_calendar": "Définir où ajouter de nouveaux événements lors de la réservation.",
|
||||
"delete_schedule": "Supprimer le programme",
|
||||
"schedule_created_successfully": "{{scheduleName}} programme créé",
|
||||
"availability_updated_successfully": "{{scheduleName}} programme mis à jour",
|
||||
@@ -811,7 +837,6 @@
|
||||
"redirect_success_booking": "Rediriger vers la réservation ",
|
||||
"you_are_being_redirected": "Vous êtes redirigé vers {{ url }} dans $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://exemple.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "Pour pouvoir utiliser cette fonctionnalité, vous devez passer à un compte Pro.",
|
||||
"duplicate": "Dupliquer",
|
||||
"offer_seats": "Offrir des places",
|
||||
"offer_seats_description": "Offrez des places pour réservations (cela désactive les invités et active les réservations)",
|
||||
@@ -949,6 +974,7 @@
|
||||
"workflows": "Workflows",
|
||||
"new_workflow_btn": "Nouveau workflow",
|
||||
"add_new_workflow": "Ajouter un nouveau workflow",
|
||||
"reschedule_event_trigger": "lorsque l'événement est reprogrammé",
|
||||
"trigger": "Déclencheur",
|
||||
"triggers": "Déclencheurs",
|
||||
"action": "Action",
|
||||
@@ -976,10 +1002,13 @@
|
||||
"change_username_standard_to_premium": "Puisque vous passez d'un nom d'utilisateur standard à un premium, vous allez être envoyé au paiement pour valider le changement.",
|
||||
"change_username_premium_to_standard": "Puisque vous passez d'un nom d'utilisateur premium à un standard, vous allez être envoyé au paiement pour valider la rétrogradation.",
|
||||
"go_to_stripe_billing": "Accéder à la facturation",
|
||||
"stripe_description": "Nécessite un paiement pour les réservations (0,5% + 0,10 € de commission par transaction)",
|
||||
"trial_expired": "Votre période d'essai a expiré",
|
||||
"remove_app": "Supprimer l'application",
|
||||
"yes_remove_app": "Oui, supprimer l'application",
|
||||
"are_you_sure_you_want_to_remove_this_app": "Voulez-vous vraiment supprimer cette application ?",
|
||||
"app_removed_successfully": "Application supprimée avec succès",
|
||||
"error_removing_app": "Erreur lors de la suppression de l'application",
|
||||
"web_conference": "Conférence en ligne",
|
||||
"number_for_sms_reminders": "Numéro de téléphone (pour les rappels par SMS)",
|
||||
"requires_confirmation": "Nécessite une confirmation",
|
||||
@@ -1035,18 +1064,209 @@
|
||||
"navigate": "Naviguer",
|
||||
"open": "Ouvrir",
|
||||
"close": "Fermer",
|
||||
"team_feature_teams": "Ceci est une fonctionnalité d'équipe. Mettez à niveau vers l'équipe pour voir la disponibilité de votre équipe.",
|
||||
"team_feature_workflows": "Ceci est une fonctionnalité d'équipe. Mettez à niveau vers l'équipe pour automatiser vos notifications et rappels d'événements avec les flux de travail.",
|
||||
"show_eventtype_on_profile": "Afficher sur le profil",
|
||||
"embed": "Intégré",
|
||||
"new_username": "Nouveau nom d'utilisateur",
|
||||
"current_username": "Nom d'utilisateur actuel",
|
||||
"example_1": "Exemple 1",
|
||||
"example_2": "Exemple 2",
|
||||
"additional_input_label": "Libellé de saisie supplémentaire",
|
||||
"company_size": "Taille de l'entreprise",
|
||||
"what_help_needed": "Pour quoi avez-vous besoin d'aide ?",
|
||||
"variable_format": "Format des variables",
|
||||
"webhook_subscriber_url_reserved": "L'url d'abonné au Webhook est déjà définie",
|
||||
"custom_input_as_variable_info": "Ignorer tous les caractères spéciaux du libellé de saisie supplémentaire (utiliser uniquement des lettres et des chiffres), utiliser des majuscules pour toutes les lettres et remplacer les espaces par des tirets bas.",
|
||||
"using_additional_inputs_as_variables": "Comment utiliser des entrées supplémentaires en tant que variables ?",
|
||||
"download_desktop_app": "Télécharger l'application de bureau",
|
||||
"set_ping_link": "Définir le lien Ping",
|
||||
"rate_limit_exceeded": "Limite dépassée",
|
||||
"when_something_happens": "Quand quelque chose se passe",
|
||||
"action_is_performed": "Une action est effectuée",
|
||||
"test_action": "Tester l'action",
|
||||
"notification_sent": "Notification envoyée",
|
||||
"no_input": "Aucune entrée",
|
||||
"test_workflow_action": "Tester l'effet du workflow",
|
||||
"send_sms": "Envoyer un SMS",
|
||||
"send_sms_to_number": "Êtes-vous sûr de vouloir envoyer un SMS au {{number}}?",
|
||||
"missing_connected_calendar": "Aucun calendrier par défaut connecté",
|
||||
"connect_your_calendar_and_link": "Vous pouvez connecter votre calendrier depuis <1>ici</1>.",
|
||||
"default_calendar_selected": "Calendrier par défaut",
|
||||
"hide_from_profile": "Masquer du profil",
|
||||
"event_setup_tab_title": "Configuration de l'événement",
|
||||
"event_limit_tab_title": "Limites",
|
||||
"event_limit_tab_description": "Fréquence de réservation",
|
||||
"event_advanced_tab_description": "Paramètres du calendrier & plus...",
|
||||
"event_advanced_tab_title": "Avancé",
|
||||
"select_which_cal": "Sélectionnez le calendrier auquel ajouter des réservations",
|
||||
"custom_event_name": "Nom de l'événement personnalisé",
|
||||
"custom_event_name_description": "Créer des noms d'événements personnalisés à afficher sur l'événement du calendrier",
|
||||
"2fa_required": "Authentification en deux étapes requise",
|
||||
"incorrect_2fa": "Code d'authentification à deux facteurs incorrect",
|
||||
"which_event_type_apply": "À quel type d'événement s'appliquera-t-il ?",
|
||||
"no_workflows_description": "Les workflows permettent une automatisation simple pour envoyer des notifications et des rappels vous permettant de construire des processus autour de vos événements.",
|
||||
"create_workflow": "Créer un workflow",
|
||||
"do_this": "Effectuer ceci",
|
||||
"turn_off": "Désactiver",
|
||||
"settings_updated_successfully": "Paramètres mis à jour avec succès",
|
||||
"error_updating_settings": "Erreur lors de la mise à jour des paramètres",
|
||||
"personal_cal_url": "Mon URL Cal personnelle",
|
||||
"bio_hint": "Quelques phrases à propos de vous. Ces informations apparaîtront sur votre page d'url personnelle.",
|
||||
"delete_account_modal_title": "Supprimer le compte",
|
||||
"confirm_delete_account_modal": "Êtes-vous sûr de vouloir supprimer votre compte Cal.com ?",
|
||||
"delete_my_account": "Supprimer mon compte",
|
||||
"start_of_week": "Début de la semaine",
|
||||
"select_calendars": "Sélectionnez quels calendriers vous voulez vérifier les conflits pour éviter les doubles réservations.",
|
||||
"check_for_conflicts": "Vérifier les conflits",
|
||||
"adding_events_to": "Ajout d'événements à",
|
||||
"follow_system_preferences": "Suivre les préférences système",
|
||||
"custom_brand_colors": "Couleurs de marque personnalisées",
|
||||
"customize_your_brand_colors": "Personnalisez votre propre couleur de marque dans votre page de réservation.",
|
||||
"pro": "Pro",
|
||||
"removes_cal_branding": "Supprime les marques associées à Cal, c'est-à-dire \"Powered by Cal.\"",
|
||||
"profile_picture": "Photo de profil",
|
||||
"upload": "Télécharger",
|
||||
"web3": "Web3",
|
||||
"rainbow_token_gated": "Ce type d'événement nécessite un jeton d'authentification.",
|
||||
"rainbow_connect_wallet_gate": "Connectez votre portefeuille si vous possédez <1>{{name}}</1> (<3>{{symbol}}</3>).",
|
||||
"rainbow_insufficient_balance": "Votre portefeuille connecté ne contient pas assez de <1>{{symbol}}</1>.",
|
||||
"rainbow_sign_message_request": "Signez la demande de message sur votre portefeuille.",
|
||||
"rainbow_signature_error": "Erreur lors de la demande de signature de votre portefeuille.",
|
||||
"token_address": "Adresse du jeton",
|
||||
"blockchain": "Blockchain",
|
||||
"old_password": "Ancien mot de passe",
|
||||
"secure_password": "Votre nouveau mot de passe super sécurisé",
|
||||
"error_updating_password": "Erreur lors de la mise à jour du mot de passe",
|
||||
"two_factor_auth": "Authentification en deux étapes",
|
||||
"recurring_event_tab_description": "Configurez un calendrier récurrent",
|
||||
"today": "aujourd'hui",
|
||||
"appearance": "Apparence",
|
||||
"appearance_subtitle": "Gérer les paramètres pour votre apparence de réservation",
|
||||
"my_account": "Mon compte",
|
||||
"general": "Général",
|
||||
"calendars": "Calendriers",
|
||||
"2fa_auth": "Authentification à deux facteurs",
|
||||
"invoices": "Factures",
|
||||
"embeds": "Intègre",
|
||||
"impersonation": "Identification",
|
||||
"users": "Utilisateurs",
|
||||
"profile_description": "Gérer les paramètres de votre profil cal",
|
||||
"general_description": "Gérer les paramètres pour votre langue et votre fuseau horaire",
|
||||
"calendars_description": "Configurez la manière dont vos types d'événements interagissent avec vos calendriers",
|
||||
"appearance_description": "Gérer les paramètres pour votre apparence de réservation",
|
||||
"conferencing_description": "Gérez vos applications de vidéoconférence pour vos réunions",
|
||||
"password_description": "Gérer les paramètres pour les mots de passe de votre compte",
|
||||
"2fa_description": "Gérer les paramètres pour les mots de passe de votre compte",
|
||||
"we_just_need_basic_info": "Nous avons juste besoin de quelques informations de base pour configurer votre profil.",
|
||||
"skip": "Ignorer",
|
||||
"do_this_later": "Effectuer ceci plus tard",
|
||||
"set_availability_getting_started_subtitle_1": "Définir les plages de temps lorsque vous êtes disponible",
|
||||
"set_availability_getting_started_subtitle_2": "Vous pouvez personnaliser tout cela plus tard dans la page de disponibilité.",
|
||||
"connect_calendars_from_app_store": "Vous pouvez ajouter plus de calendriers depuis l'App Store",
|
||||
"connect_conference_apps": "Connecter les applications de conférence",
|
||||
"connect_calendar_apps": "Connecter les applications de calendrier",
|
||||
"connect_payment_apps": "Connecter les applications de paiement",
|
||||
"connect_other_apps": "Connecter d'autres applications",
|
||||
"current_step_of_total": "Étape {{currentStep}} sur {{maxSteps}}",
|
||||
"add_variable": "Ajouter une variable",
|
||||
"custom_phone_number": "Numéro de téléphone personnalisé",
|
||||
"message_template": "Modèle de message",
|
||||
"email_subject": "Objet",
|
||||
"add_dynamic_variables": "Ajouter des variables de texte dynamiques",
|
||||
"event_name_info": "Nom du type d'événement",
|
||||
"event_date_info": "Date de l'évènement",
|
||||
"event_time_info": "Heure de début de l'événement",
|
||||
"location_info": "Lieu de l'événement",
|
||||
"organizer_name_info": "Votre nom",
|
||||
"additional_notes_info": "Notes supplémentaires de réservation",
|
||||
"attendee_name_info": "Nom de la personne réservant",
|
||||
"to": "À/vers",
|
||||
"attendee_required_enter_number": "Le participant devra entrer un numéro de téléphone lors de la réservation",
|
||||
"workflow_turned_on_successfully": "Le workflow {{workflowName}} a été {{offOn}} avec succès",
|
||||
"download_responses": "Télécharger les réponses",
|
||||
"create_your_first_form": "Créer votre premier formulaire",
|
||||
"create_your_first_form_description": "Grâce aux formulaires d'acheminement, vous pouvez poser des questions de qualification et vous diriger vers la personne ou le type d'événement appropriés.",
|
||||
"create_your_first_webhook": "Créez votre premier Webhook",
|
||||
"create_your_first_webhook_description": "Avec les Webhooks, vous pouvez recevoir des données de réunion en temps réel lorsque quelque chose se passe sur Cal.com.",
|
||||
"for_a_maximum_of": "Pour un maximum de",
|
||||
"event_one": "événement",
|
||||
"event_other": "événements",
|
||||
"profile_team_description": "Gérer les paramètres de votre profil d'équipe",
|
||||
"members_team_description": "Utilisateurs membres du groupe",
|
||||
"team_url": "URL de l'équipe",
|
||||
"delete_team": "Supprimer l'équipe",
|
||||
"team_members": "Membres de l'équipe",
|
||||
"more": "En savoir plus",
|
||||
"more_page_footer": "Nous considérons l'application mobile comme une extension de l'application web. Si vous effectuez des actions complexes, veuillez vous référer à l'application Web.",
|
||||
"workflow_example_1": "Envoyer un rappel SMS 24 heures avant le début de l'événement",
|
||||
"workflow_example_2": "Envoyer un SMS personnalisé lorsque l'événement est reprogrammé au participant",
|
||||
"workflow_example_3": "Envoyer un email personnalisé quand un nouvel événement est réservé à un hôte",
|
||||
"workflow_example_4": "Envoyer un rappel par e-mail 1 heure avant le début des événements",
|
||||
"workflow_example_5": "Envoyer un email personnalisé lorsque l'événement est reprogrammé à l'hôte",
|
||||
"workflow_example_6": "Envoyer un SMS personnalisé quand un nouvel événement est réservé à un hôte",
|
||||
"welcome_to_cal_header": "Bienvenue sur Cal.com !",
|
||||
"edit_form_later_subtitle": "Vous pourrez modifier cela plus tard.",
|
||||
"connect_calendar_later": "Je connecterai mon calendrier plus tard",
|
||||
"set_my_availability_later": "Je vais définir ma disponibilité plus tard",
|
||||
"problem_saving_user_profile": "Un problème est survenu lors de l'enregistrement de vos données. Veuillez réessayer ou contacter le service client.",
|
||||
"purchase_missing_seats": "Acheter des places manquantes",
|
||||
"slot_length": "Durée du créneau",
|
||||
"booking_appearance": "Apparence de page de réservation",
|
||||
"appearance_team_description": "Gérer les paramètres pour l'apparence de réservation de votre équipe",
|
||||
"only_owner_change": "Seul le propriétaire de cette équipe peut apporter des modifications à la réservation de l'équipe ",
|
||||
"team_disable_cal_branding_description": "Supprime les marques associées à Cal, c'est-à-dire \"Powered by Cal\"",
|
||||
"invited_by_team": "{{teamName}} vous a invité à rejoindre son équipe en tant que {{role}}",
|
||||
"token_invalid_expired": "Le jeton est invalide ou expiré.",
|
||||
"exchange_add": "Se connecter à Microsoft Exchange",
|
||||
"exchange_authentication": "Méthode d'authentification",
|
||||
"exchange_authentication_standard": "Authentification de base",
|
||||
"exchange_authentication_ntlm": "Authentification NTLM",
|
||||
"exchange_compression": "Compression GZip",
|
||||
"routing_forms_description": "Vous pouvez voir tous les formulaires et tous les parcours que vous avez créés ici.",
|
||||
"add_new_form": "Ajouter un nouveau formulaire",
|
||||
"form_description": "Créez votre formulaire pour acheminer un organisateur",
|
||||
"copy_link_to_form": "Copier le lien vers le formulaire",
|
||||
"theme": "Thème",
|
||||
"theme_applies_note": "Ceci s'applique uniquement à vos pages publiques de réservation",
|
||||
"theme_light": "Clair",
|
||||
"theme_dark": "Sombre"
|
||||
"theme_dark": "Sombre",
|
||||
"theme_system": "Défaut du système",
|
||||
"add_a_team": "Ajouter une équipe",
|
||||
"saml_config": "Configuration SAML",
|
||||
"add_webhook_description": "Recevoir les données de la réunion en temps réel lorsque quelque chose se passe sur Cal.com",
|
||||
"triggers_when": "Se déclenche quand",
|
||||
"test_webhook": "Veuillez faire un test de ping avant de créer.",
|
||||
"enable_webhook": "Activer le Webhook",
|
||||
"add_webhook": "Ajouter un Webhook",
|
||||
"webhook_edited_successfully": "Webhook enregistré",
|
||||
"webhooks_description": "Recevez les données de la réunion en temps réel lorsque quelque chose se passe sur Cal.com",
|
||||
"api_keys_description": "Générer des clés API pour accéder à votre propre compte",
|
||||
"new_api_key": "Nouvelle clé API",
|
||||
"active": "Actif",
|
||||
"api_key_updated": "Nom de clé API mis à jour",
|
||||
"api_key_update_failed": "Erreur de mise à jour du nom de la clé API",
|
||||
"embeds_title": "Intégration d'iframe HTML",
|
||||
"embeds_description": "Intégrez tous vos types d'événements sur votre site web",
|
||||
"create_first_api_key": "Créez votre première clé API",
|
||||
"create_first_api_key_description": "Les clés API permettent à d'autres applications de communiquer avec Cal.com",
|
||||
"back_to_signin": "Retour à la connexion",
|
||||
"reset_link_sent": "Lien de réinitialisation envoyé",
|
||||
"password_reset_email": "Un e-mail est transmis vers {{email}} avec les instructions pour réinitialiser votre mot de passe.",
|
||||
"password_updated": "Mot de passe mis à jour !",
|
||||
"pending_payment": "Paiement en attente",
|
||||
"confirmation_page_rainbow": "Le jeton porte votre événement avec des jetons ou des NFT sur Ethereum, Polygone et plus encore.",
|
||||
"not_on_cal": "Pas sur Cal.com",
|
||||
"no_calendar_installed": "Aucun calendrier installé",
|
||||
"no_calendar_installed_description": "Vous n'avez pas encore connecté vos calendriers",
|
||||
"add_a_calendar": "Ajouter au calendrier",
|
||||
"change_email_hint": "Vous devrez peut-être vous déconnecter et vous reconnecter pour que le changement prenne effet",
|
||||
"confirm_password_change_email": "Veuillez confirmer votre mot de passe avant de changer votre adresse e-mail",
|
||||
"seats": "places",
|
||||
"every_app_published": "Chaque application publiée sur l'App Store de Cal.com est open source et soigneusement testée via les évaluations par les pairs. Néanmoins, Cal.com, Inc. n'approuve pas ou ne certifie pas ces applications à moins qu'elles ne soient publiées par Cal.com. Si vous rencontrez un contenu ou un comportement inapproprié, veuillez le signaler.",
|
||||
"report_app": "Signaler une application",
|
||||
"billing_manage_details_title": "Affichez et gérez vos informations de facturation",
|
||||
"billing_manage_details_description": "Affichez et modifiez vos informations de facturation, et annuler votre abonnement.",
|
||||
"billing_help_title": "Besoin d'autre chose ?",
|
||||
"billing_help_description": "Si vous avez besoin d'aide pour la facturation, notre équipe d'assistance est là pour vous aider."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "נא להשתמש בקישור הבא כדי לאפס את הסיסמה",
|
||||
"hey_there": "שלום,",
|
||||
"forgot_your_password_calcom": "שכחתה את הסיסמה? - cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | סוג האירוע",
|
||||
"delete_webhook_confirmation_message": "בטוח שברצונך למחוק את ה-Webhook הזה? אם אירוע יבוטל או שייקבע עבורו מועד, לא תקבל יותר נתוני פגישות מ-Cal.com בזמן אמת או בכתובת ה-URL שציינת.",
|
||||
"confirm_delete_webhook": "כן, אני רוצה למחוק את ה-Webhook",
|
||||
"edit_webhook": "עריכת Webhook",
|
||||
@@ -143,6 +142,7 @@
|
||||
"view_public_page": "צפייה בדף הציבורי",
|
||||
"sign_out": "יציאה",
|
||||
"add_another": "הוסף לוח זמנים נוסף",
|
||||
"install_another": "התקנת אפליקציה נוספת",
|
||||
"until": "עד",
|
||||
"powered_by": "מופעל על ידי",
|
||||
"unavailable": "לא זמין",
|
||||
@@ -157,6 +157,7 @@
|
||||
"checkbox": "תיבת סימון",
|
||||
"is_required": "נדרש",
|
||||
"required": "נדרש",
|
||||
"optional": "אופציונלי",
|
||||
"input_type": "סוג הקלט",
|
||||
"rejected": "נדחה",
|
||||
"unconfirmed": "לא אושר",
|
||||
@@ -227,7 +228,9 @@
|
||||
"connect_your_calendar_instructions": "קשר את לוח השנה שלך לצפייה בזמנים עמוסים ובאירועים חדשים באופן אוטומטי ברגע שנקבע מועד עבורם.",
|
||||
"set_up_later": "להגדיר מאוחר יותר",
|
||||
"current_time": "השעה הנוכחית",
|
||||
"details": "פרטים",
|
||||
"welcome": "ברוך הבא",
|
||||
"welcome_back": "ברוך שובך",
|
||||
"welcome_to_calcom": "ברוך הבא אל Cal.com",
|
||||
"welcome_instructions": "אמור לנו באיזה שם ברצונך שנקרא לך ובאיזה אזור זמן אתה נמצא. ניתן יהיה לערוך את הפרטים האלה מאוחר יותר.",
|
||||
"connect_caldav": "חיבור לשרת CalDav",
|
||||
@@ -240,6 +243,7 @@
|
||||
"when": "מתי",
|
||||
"where": "היכן",
|
||||
"add_to_calendar": "הוספה ללוח השנה",
|
||||
"add_another_calendar": "הוספת לוח שנה אחר",
|
||||
"other": "אחר",
|
||||
"emailed_you_and_attendees": "שלחנו לך ולמשתתפים האחרים הודעת דוא\"ל עם הזמנה בלוח השנה הכוללת את כל הפרטים.",
|
||||
"emailed_you_and_attendees_recurring": "שלחנו לך ולמשתתפים האחרים הודעת דוא\"ל עם הזמנה בלוח השנה לאירוע הראשון מבין האירועים החוזרים האלה.",
|
||||
@@ -261,6 +265,8 @@
|
||||
"enter_new_password": "נא להזין את הסיסמה החדשה שבה ברצונך להשתמש עבור החשבון.",
|
||||
"reset_password": "איפוס סיסמה",
|
||||
"change_your_password": "שינוי סיסמה",
|
||||
"show_password": "הצגת הסיסמה",
|
||||
"hide_password": "הסתרת הסיסמה",
|
||||
"try_again": "לנסות שוב",
|
||||
"request_is_expired": "תוקף הבקשה פג.",
|
||||
"reset_instructions": "הזן את כתובת הדוא\"ל המשויכת לחשבון שלך, ואנו נשלח לך קישור לאיפוס הסיסמה.",
|
||||
@@ -306,6 +312,7 @@
|
||||
"recurring_bookings": "ברגע שמישהו יקבע איתך פגישה חוזרת, המועד שנקבע יוצג כאן.",
|
||||
"past_bookings": "ההזמנות הקודמות שלך יוצגו כאן.",
|
||||
"cancelled_bookings": "ההזמנות המבוטלות שלך יוצגו כאן.",
|
||||
"unconfirmed_bookings": "ההזמנות שלך שלא אושרו יוצגו כאן.",
|
||||
"on": "בתאריך",
|
||||
"and": "וגם",
|
||||
"calendar_shows_busy_between": "בלוח השנה מוצג כי אתה עסוק בין",
|
||||
@@ -346,6 +353,7 @@
|
||||
"booking_cancelled": "ההזמנה בוטלה",
|
||||
"booking_rescheduled": "מועד ההזמנה השתנה",
|
||||
"booking_created": "ההזמנה נוצרה",
|
||||
"meeting_ended": "הפגישה הסתיימה",
|
||||
"form_submitted": "הטופס נשלח",
|
||||
"event_triggers": "גורמים מפעילים של אירועים",
|
||||
"subscriber_url": "כתובת URL של המנוי/ה",
|
||||
@@ -488,6 +496,9 @@
|
||||
"lets_create_first_administrator_user": "עכשיו ניצור את המשתמש הראשון המוגדר כמנהל מערכת.",
|
||||
"new_member": "חבר/ה חדש/ה",
|
||||
"invite": "להזמין",
|
||||
"add_team_members": "הוספת חברי צוות",
|
||||
"add_team_members_description": "להזמין עוד אנשים להצטרף לצוות",
|
||||
"add_team_member": "הוספת חבר צוות",
|
||||
"invite_new_member": "להזמין חבר/ה חדש/ה",
|
||||
"invite_new_team_member": "להזמין מישהו לצוות שלך.",
|
||||
"change_member_role": "לשנות את תפקיד החבר/ה בצוות",
|
||||
@@ -600,6 +611,7 @@
|
||||
"create_first_team_and_invite_others": "צור את הצוות הראשון שלך והזמן משתמשים אחרים לעבוד יחד איתך.",
|
||||
"create_team_to_get_started": "צור צוות כדי להתחיל",
|
||||
"teams": "צוותים",
|
||||
"team": "צוות",
|
||||
"team_billing": "חיוב צוותים",
|
||||
"upgrade_to_flexible_pro_title": "שינינו את החיוב בעבור צוותים",
|
||||
"upgrade_to_flexible_pro_message": "יש בצוות שלך חברים שאין להם מקום. שדרג לחבילת Pro לדאוג למקומות החסרים.",
|
||||
@@ -620,7 +632,9 @@
|
||||
"billing": "חיוב",
|
||||
"manage_your_billing_info": "נהל את פרטי החיוב ובטל את המינוי.",
|
||||
"availability": "זמינות",
|
||||
"edit_availability": "עריכת נתוני זמינות",
|
||||
"configure_availability": "הגדר מועדים שבהם תהיה זמין להזמנות.",
|
||||
"copy_times_to": "העתקת שעות אל",
|
||||
"change_weekly_schedule": "שינוי לוח הזמנים השבועי שלך",
|
||||
"logo": "לוגו",
|
||||
"error": "שגיאה",
|
||||
@@ -635,6 +649,7 @@
|
||||
"event_name_tooltip": "השם שיופיע בלוחות השנה",
|
||||
"meeting_with_user": "פגישה עם {ATTENDEE}",
|
||||
"additional_inputs": "אפשרויות קלט נוספות",
|
||||
"additional_input_description": "לדרוש מכלי התזמון להוסיף פרטים לפני אישור ההזמנה",
|
||||
"label": "תווית",
|
||||
"placeholder": "מציין מיקום",
|
||||
"type": "סוג",
|
||||
@@ -649,6 +664,8 @@
|
||||
"disable_guests": "השבתת אורחים",
|
||||
"disable_guests_description": "השבת את האפשרות להוסיף אורחים נוספים בעת ביצוע הזמנה.",
|
||||
"private_link": "יצירת קישור פרטי",
|
||||
"private_link_label": "קישור פרטי",
|
||||
"private_link_hint": "הקישור הפרטי שלך ייווצר מחדש לאחר כל שימוש",
|
||||
"copy_private_link": "העתקת קישור פרטי",
|
||||
"private_link_description": "ניתן ליצור כתובת URL פרטית על מנת לשתף את האירוע מבלי לחשוף את שם המשתמש/ת שלך ב-Cal",
|
||||
"invitees_can_schedule": "המוזמנים יכולים לקבוע מועד",
|
||||
@@ -690,16 +707,21 @@
|
||||
"delete_account_confirmation_message": "בטוח שברצונך למחוק את חשבון Cal.com שלך? כל מי ששיתפת איתו את הקישור לחשבון לא יוכל יותר להזמין באמצעותו, וכל ההעדפות ששמרת יאבדו.",
|
||||
"integrations": "שילובים",
|
||||
"apps": "אפליקציות",
|
||||
"category_apps": "אפליקציות בקטגוריה {{category}}",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "מקשרים בין אנשים, טכנולוגיה ומקום העבודה.",
|
||||
"settings": "הגדרות",
|
||||
"event_type_moved_successfully": "סוג האירוע הועבר בהצלחה",
|
||||
"next_step_text": "השלב הבא",
|
||||
"next_step": "לדלג על שלב זה",
|
||||
"prev_step": "לשלב הקודם",
|
||||
"install": "התקנה",
|
||||
"installed": "מותקן",
|
||||
"active_install_one": "התקנה פעילה {{count}}",
|
||||
"active_install_other": "{{count}} התקנות פעילות",
|
||||
"globally_install": "התקנה גלובלית",
|
||||
"app_successfully_installed": "האפליקציה הותקנה בהצלחה",
|
||||
"app_could_not_be_installed": "לא ניתן היה להתקין את האפליקציה",
|
||||
"disconnect": "התנתקות",
|
||||
"embed_your_calendar": "הטמע את לוח השנה שלך בתוך דף האינטרנט",
|
||||
"connect_your_favourite_apps": "חבר את האפליקציות האהובות עליך.",
|
||||
@@ -710,6 +732,7 @@
|
||||
"connect_additional_calendar": "חיבור לוח שנה נוסף",
|
||||
"conferencing": "שיחות ועידה",
|
||||
"calendar": "לוח שנה",
|
||||
"payments": "תשלומים",
|
||||
"not_installed": "לא מותקן",
|
||||
"error_password_mismatch": "הסיסמאות אינן זהות.",
|
||||
"error_required_field": "שדה זה הוא שדה חובה.",
|
||||
@@ -743,9 +766,22 @@
|
||||
"import_from": "ייבוא מ",
|
||||
"access_token": "טוקן גישה",
|
||||
"visit_roadmap": "מפת דרכים",
|
||||
"featured_categories": "קטגוריות מוצגות",
|
||||
"popular_categories": "קטגוריות פופולריות",
|
||||
"number_apps_one": "אפליקציה {{count}}",
|
||||
"number_apps_other": "{{count}} אפליקציות",
|
||||
"trending_apps": "אפליקציות פופולריות",
|
||||
"explore_apps": "אפליקציות בקטגוריה {{category}}",
|
||||
"installed_apps": "אפליקציות מותקנות",
|
||||
"no_category_apps": "אין אפליקציות בקטגוריה {{category}}",
|
||||
"no_category_apps_description_calendar": "הוסף/י אפליקציית לוח שנה כדי לבדוק אם יש התנגשויות על מנת למנוע כפל הזמנות",
|
||||
"no_category_apps_description_conferencing": "נסה/י להוסיף אפליקציית שיחות ועידה כדי לשלב שיחות וידאו עם הלקוחות",
|
||||
"no_category_apps_description_payment": "הוסף/י אפליקציית תשלומים על מנת להפוך את ביצוע העסקאות בינך לבין הלקוחות לפשוט יותר",
|
||||
"no_category_apps_description_other": "הוסף/י כל סוג אחר של אפליקציה לביצוע פעולות שונות",
|
||||
"installed_app_calendar_description": "הגדר/י את לוח(ות) השנה לבדוק אם יש התנגשויות על מנת למנוע כפל הזמנות.",
|
||||
"installed_app_conferencing_description": "הוסף/י את האפליקציות האהובות עליך לשיחות ועידה לשימוש בפגישות שלך",
|
||||
"installed_app_payment_description": "הגדר/י את השירותים לעיבוד תשלומים שבהם יש להשתמש לחיוב הלקוחות.",
|
||||
"installed_app_other_description": "כל האפליקציות המותקנות שלך מקטגוריות אחרות.",
|
||||
"empty_installed_apps_headline": "אין אפליקציות מותקנות",
|
||||
"empty_installed_apps_description": "אפליקציות מאפשרות לך לשפר משמעותית את תהליכי העבודה שלך ואת תהליך קביעת המועדים.",
|
||||
"empty_installed_apps_button": "נא לעיין ב-App Store",
|
||||
@@ -766,6 +802,7 @@
|
||||
"remove": "הסר",
|
||||
"add": "הוסף",
|
||||
"installed_one": "מותקן",
|
||||
"installed_other": "{{count}} הותקנו",
|
||||
"verify_wallet": "אימות הארנק",
|
||||
"connect_metamask": "קישור Metamask",
|
||||
"create_events_on": "יצירת אירועים ב:",
|
||||
@@ -783,6 +820,8 @@
|
||||
"set_to_default": "הגדר לברירת המחדל",
|
||||
"new_schedule_btn": "תזמון חדש",
|
||||
"add_new_schedule": "הוסף מועד חדש",
|
||||
"add_new_calendar": "הוספת לוח שנה חדש",
|
||||
"set_calendar": "הגדר/י למתי יש להוסיף אירועים חדשים כשאת/ה כבר עסוק/ה.",
|
||||
"delete_schedule": "מחק תזמון",
|
||||
"schedule_created_successfully": "יצירת התזמון {{scheduleName}} בוצעה בהצלחה",
|
||||
"availability_updated_successfully": "עדכון התזמון {{scheduleName}} בוצע בהצלחה",
|
||||
@@ -798,7 +837,6 @@
|
||||
"redirect_success_booking": "הפניה מחדש בעת הזמנה ",
|
||||
"you_are_being_redirected": "אנחנו ננתב אותך אל {{ url }} בעוד $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "כדי להשתמש בתכונה זו, עליך לשדרג לחשבון Pro.",
|
||||
"duplicate": "כפילות",
|
||||
"offer_seats": "הצעת מקומות",
|
||||
"offer_seats_description": "הצעת מקומות להזמנות (אפשרות זו משביתה אישורי הזמנות ואורחים)",
|
||||
@@ -936,6 +974,7 @@
|
||||
"workflows": "תהליכי עבודה",
|
||||
"new_workflow_btn": "תהליך עבודה חדש",
|
||||
"add_new_workflow": "הוספת תהליך עבודה חדש",
|
||||
"reschedule_event_trigger": "כאשר נקבע מועד חדש לאירוע",
|
||||
"trigger": "גורם מפעיל",
|
||||
"triggers": "גורמים מפעילים",
|
||||
"action": "פעולה",
|
||||
@@ -963,10 +1002,13 @@
|
||||
"change_username_standard_to_premium": "מאחר שאתה משנה את שם המשתמש מסטנדרטי לפרימיום, תועבר אל הקופה לצורך שדרוג.",
|
||||
"change_username_premium_to_standard": "מאחר שאתה משנה את שם המשתמש מפרימיום לסטנדרטי, תועבר אל הקופה לצורך שנמוך.",
|
||||
"go_to_stripe_billing": "למעבר אל דף החיוב",
|
||||
"stripe_description": "דרישת תשלום עבור הזמנות (0.5% + €0.10 עמלה לכל עסקה)",
|
||||
"trial_expired": "התוקף של גרסת הניסיון שלך פג",
|
||||
"remove_app": "הסרת האפליקציה",
|
||||
"yes_remove_app": "כן, להסיר את האפליקציה",
|
||||
"are_you_sure_you_want_to_remove_this_app": "בטוח שברצונך להסיר את האפליקציה הזו?",
|
||||
"app_removed_successfully": "הסרת האפליקציה בוצעה בהצלחה",
|
||||
"error_removing_app": "שגיאה בהסרת האפליקציה",
|
||||
"web_conference": "שיחת ועידה מקוונת",
|
||||
"number_for_sms_reminders": "מספר טלפון (לתזכורות ב-SMS)",
|
||||
"requires_confirmation": "נדרש אישור",
|
||||
@@ -1022,18 +1064,209 @@
|
||||
"navigate": "ניווט",
|
||||
"open": "פתיחה",
|
||||
"close": "סגירה",
|
||||
"team_feature_teams": "זוהי תכונה של גרסת Team. כדאי לשדרג ל-Team כדי לראות את זמינות חברי הצוות.",
|
||||
"team_feature_workflows": "זוהי תכונה של גרסת Team. כדאי לשדרג ל-Team כדי להפוך את התזכורות והעדכונים לגבי אירועים לאוטומטיים באמצעות תהליכי עבודה.",
|
||||
"show_eventtype_on_profile": "הצג בפרופיל",
|
||||
"embed": "הטמעה",
|
||||
"new_username": "שם משתמש חדש",
|
||||
"current_username": "שם משתמש נוכחי",
|
||||
"example_1": "דוגמה 1",
|
||||
"example_2": "דוגמה 2",
|
||||
"additional_input_label": "תווית קלט נוספת",
|
||||
"company_size": "גודל החברה",
|
||||
"what_help_needed": "במה דרושה לך עזרה?",
|
||||
"variable_format": "הפורמט של המשתנה",
|
||||
"webhook_subscriber_url_reserved": "כתובת ה-URL של מנוי/מנויית Webhook כבר מוגדרת",
|
||||
"custom_input_as_variable_info": "התעלמות מכל התווים המיוחדים של תווית הקלט הנוספת (שימוש באותיות ובספרות בלבד), שימוש באותיות רישיות עבור כל האותיות והחלפת רווחים במקפים תחתונים.",
|
||||
"using_additional_inputs_as_variables": "איך ניתן להשתמש בסוגי קלט נוספים כמשתנים?",
|
||||
"download_desktop_app": "הורדת האפליקציה למחשבים שולחניים",
|
||||
"set_ping_link": "הגדרת קישור Ping",
|
||||
"rate_limit_exceeded": "חריגה מההגבלה",
|
||||
"when_something_happens": "כאשר משהו קורה",
|
||||
"action_is_performed": "פעולה מבוצעת",
|
||||
"test_action": "בדיקת פעולה",
|
||||
"notification_sent": "נשלח עדכון",
|
||||
"no_input": "אין קלט",
|
||||
"test_workflow_action": "בדיקת פעולת תהליך עבודה",
|
||||
"send_sms": "שליחת SMS",
|
||||
"send_sms_to_number": "בטוח שברצונך לשלוח SMS למספר {{number}}?",
|
||||
"missing_connected_calendar": "אף לוח שנה המוגדר כברירת מחדל לא מחובר",
|
||||
"connect_your_calendar_and_link": "ניתן לחבר את לוח השנה שלך מ<1>כאן</1>.",
|
||||
"default_calendar_selected": "לוח השנה המוגדר כברירת מחדל",
|
||||
"hide_from_profile": "להסתיר מהפרופיל",
|
||||
"event_setup_tab_title": "הגדרת האירוע",
|
||||
"event_limit_tab_title": "מגבלות",
|
||||
"event_limit_tab_description": "באיזו תדירות ניתן להזמין אותך",
|
||||
"event_advanced_tab_description": "הגדרות לוח שנה ועוד...",
|
||||
"event_advanced_tab_title": "מתקדם",
|
||||
"select_which_cal": "בחר/י את לוח השנה שאליו יש להוסיף הזמנות",
|
||||
"custom_event_name": "שם אירוע מותאם אישית",
|
||||
"custom_event_name_description": "ניתן ליצור שמות אירועים בהתאמה אישית שיוצגו באירוע בלוח השנה",
|
||||
"2fa_required": "נדרש אימות בשני גורמים",
|
||||
"incorrect_2fa": "קוד שגוי של אימות בשני גורמים",
|
||||
"which_event_type_apply": "על איזה סוג אירוע זה יחול?",
|
||||
"no_workflows_description": "תהליכי עבודה מאפשרים שימוש באוטומציה פשוטה לשליחת עדכונים ותזכורות, כך שאת/ה יכול/ה לתכנן תהליכים שקשורים לאירועים שלך.",
|
||||
"create_workflow": "יצירת תהליך עבודה",
|
||||
"do_this": "יש לבצע את הפעולה הזו",
|
||||
"turn_off": "השבתה",
|
||||
"settings_updated_successfully": "עדכון ההגדרות בוצע בהצלחה",
|
||||
"error_updating_settings": "שגיאה במהלך עדכון ההגדרות",
|
||||
"personal_cal_url": "כתובת ה-URL של ה-Cal האישי שלי",
|
||||
"bio_hint": "מספר משפטים אודותיך. המידע הזה יופיע בדף ה-URL האישי שלך.",
|
||||
"delete_account_modal_title": "מחיקת חשבון",
|
||||
"confirm_delete_account_modal": "בטוח שברצונך למחוק את חשבון Cal.com שלך?",
|
||||
"delete_my_account": "מחיקת החשבון שלי",
|
||||
"start_of_week": "תחילת השבוע",
|
||||
"select_calendars": "בחר/י את לוחות השנה שבהם ברצונך לבדוק אם יש התנגשויות כדי למנוע כפל הזמנות.",
|
||||
"check_for_conflicts": "בדיקת התנגשויות",
|
||||
"adding_events_to": "הוספת אירועים ל",
|
||||
"follow_system_preferences": "פעל לפי העדפות המערכת",
|
||||
"custom_brand_colors": "צבעי מותג בהתאמה אישית",
|
||||
"customize_your_brand_colors": "בצע/י התאמה אישית של דף ההזמנות שלך עם צבעי מותג משלך.",
|
||||
"pro": "Pro",
|
||||
"removes_cal_branding": "הסרת מיתוגים הקשורים ל-Cal, כלומר 'מופעל על ידי Cal'.",
|
||||
"profile_picture": "תמונת פרופיל",
|
||||
"upload": "העלאה",
|
||||
"web3": "Web3",
|
||||
"rainbow_token_gated": "סוג אירוע זה מוגן באמצעות טוקן.",
|
||||
"rainbow_connect_wallet_gate": "קשר/י את הארנק שלך אם בבעלותך <1>{{name}}</1> (<3>{{symbol}}</3>).",
|
||||
"rainbow_insufficient_balance": "אין בארנק שלך מספיק <1>{{symbol}}</1>.",
|
||||
"rainbow_sign_message_request": "חתום/י על בקשת ההודעה בארנק.",
|
||||
"rainbow_signature_error": "שגיאה בעת בקשת חתימה מהארנק.",
|
||||
"token_address": "כתובת הטוקן",
|
||||
"blockchain": "בלוקצ'יין",
|
||||
"old_password": "הסיסמה הקודמת",
|
||||
"secure_password": "הסיסמה החדשה והסופר מאובטחת שלך",
|
||||
"error_updating_password": "שגיאה בעת עדכון הסיסמה",
|
||||
"two_factor_auth": "אימות בשני גורמים",
|
||||
"recurring_event_tab_description": "הגדרת לוח זמנים חוזר",
|
||||
"today": "היום",
|
||||
"appearance": "מראה",
|
||||
"appearance_subtitle": "ניהול ההגדרות של מראה ההזמנות שלך",
|
||||
"my_account": "החשבון שלי",
|
||||
"general": "כללי",
|
||||
"calendars": "לוחות שנה",
|
||||
"2fa_auth": "אימות בשני גורמים",
|
||||
"invoices": "חשבוניות",
|
||||
"embeds": "הטמעות",
|
||||
"impersonation": "התחזות",
|
||||
"users": "משתמשים",
|
||||
"profile_description": "ניהול הגדרות עבור פרופיל Cal שלך",
|
||||
"general_description": "ניהול הגדרות שפה ואזור זמן",
|
||||
"calendars_description": "הגדרת האינטראקציה בין סוגי האירועים שלך לבין לוחות השנה שלך",
|
||||
"appearance_description": "ניהול ההגדרות של מראה ההזמנות שלך",
|
||||
"conferencing_description": "ניהול האפליקציות שלך לשיחות ועידה לשימוש בפגישות שלך",
|
||||
"password_description": "ניהול הגדרות עבור סיסמאות החשבון שלך",
|
||||
"2fa_description": "ניהול הגדרות עבור סיסמאות החשבון שלך",
|
||||
"we_just_need_basic_info": "אנחנו זקוקים רק לכמה פרטים בסיסיים כדי להגדיר את הפרופיל שלך.",
|
||||
"skip": "דלג",
|
||||
"do_this_later": "לעשות זאת מאוחר יותר",
|
||||
"set_availability_getting_started_subtitle_1": "הגדרת טווחי זמן שבהם את/ה זמין/ה",
|
||||
"set_availability_getting_started_subtitle_2": "תוכל/י לבצע התאמה אישית של כל ההגדרות האלה מאוחר יותר בדף פרטי הזמינות.",
|
||||
"connect_calendars_from_app_store": "ניתן להוסיף עוד לוחות שנה מה-App Store",
|
||||
"connect_conference_apps": "חיבור אפליקציות של שיחות ועידה",
|
||||
"connect_calendar_apps": "חיבור אפליקציות של לוחות שנה",
|
||||
"connect_payment_apps": "חיבור אפליקציות של תשלומים",
|
||||
"connect_other_apps": "חיבור אפליקציות אחרות",
|
||||
"current_step_of_total": "שלב {{currentStep}} מתוך {{maxSteps}}",
|
||||
"add_variable": "הוספת משתנה",
|
||||
"custom_phone_number": "מספר טלפון בהתאמה אישית",
|
||||
"message_template": "תבנית הודעות",
|
||||
"email_subject": "נושא הדוא״ל",
|
||||
"add_dynamic_variables": "הוספת משתני טקסט דינמיים",
|
||||
"event_name_info": "שם סוג האירוע",
|
||||
"event_date_info": "תאריך האירוע",
|
||||
"event_time_info": "שעת ההתחלה של האירוע",
|
||||
"location_info": "מיקום האירוע",
|
||||
"organizer_name_info": "שמך",
|
||||
"additional_notes_info": "הערות נוספות בהזמנה",
|
||||
"attendee_name_info": "שם האדם שביצע את ההזמנה",
|
||||
"to": "אל",
|
||||
"attendee_required_enter_number": "דבר זה יחייב את המשתתף/ת להזין מספר טלפון בעת ההזמנה",
|
||||
"workflow_turned_on_successfully": "תהליך העבודה {{workflowName}} הועבר למצב {{offOn}} בהצלחה",
|
||||
"download_responses": "הורדת התגובות",
|
||||
"create_your_first_form": "יצירת הטופס הראשון שלך",
|
||||
"create_your_first_form_description": "באמצעות טפסי ניתוב ניתן לשאול שאלות סיווג ולנתב אל האדם או אל סוג האירוע המתאימים.",
|
||||
"create_your_first_webhook": "יצירת ה-Webhook הראשון שלך",
|
||||
"create_your_first_webhook_description": "עם רכיבי Webhook ניתן לקבל נתוני פגישה בזמן אמת כשמשהו קורה ב-Cal.com.",
|
||||
"for_a_maximum_of": "למקסימום של",
|
||||
"event_one": "אירוע",
|
||||
"event_other": "אירועים",
|
||||
"profile_team_description": "ניהול הגדרות עבור פרופיל הצוות",
|
||||
"members_team_description": "משתמשים שמשתייכים לקבוצה",
|
||||
"team_url": "כתובת ה-URL של הצוות",
|
||||
"delete_team": "מחיקת צוות",
|
||||
"team_members": "חברי הצוות",
|
||||
"more": "עוד",
|
||||
"more_page_footer": "אנחנו רואים באפליקציה לנייד הרחבה של האפליקציה האינטרנטית. אם עליך לבצע פעולות מורכבות, כדאי לחזור אל האפליקציה האינטרנטית.",
|
||||
"workflow_example_1": "שליחת תזכורת ב-SMS למשתתף/ת 24 שעות לפני תחילת האירוע",
|
||||
"workflow_example_2": "שליחת SMS מותאם אישית למשתתף/ת כאשר המועד של אירוע משתנה",
|
||||
"workflow_example_3": "שליחת דוא\"ל מותאם אישית למארח/ת כאשר אירוע חדש מוזמן",
|
||||
"workflow_example_4": "שליחת תזכורת בדוא\"ל למשתתף/ת שעה לפני תחילת אירועים",
|
||||
"workflow_example_5": "שליחת דוא\"ל מותאם אישית למארח/ת כאשר המועד של אירוע משתנה",
|
||||
"workflow_example_6": "שליחת SMS מותאם אישית למארח/ת כאשר אירוע חדש מוזמן",
|
||||
"welcome_to_cal_header": "ברוך בואך אל Cal.com!",
|
||||
"edit_form_later_subtitle": "ניתן יהיה לערוך את זה מאוחר יותר.",
|
||||
"connect_calendar_later": "אקשר את לוח השנה שלי מאוחר יותר",
|
||||
"set_my_availability_later": "אגדיר את הזמינות שלי בהמשך",
|
||||
"problem_saving_user_profile": "היתה בעיה בשמירת הנתונים שלך. נסה/י שוב או פנה/י לתמיכת לקוחות.",
|
||||
"purchase_missing_seats": "חסרים מקומות ברכישה",
|
||||
"slot_length": "אורך חלון הזמן",
|
||||
"booking_appearance": "מראה ההזמנה",
|
||||
"appearance_team_description": "ניהול ההגדרות של מראה הזמנות הצוות שלך",
|
||||
"only_owner_change": "רק הבעלים של הצוות יכולים לבצע שינויים בהזמנה של הצוות ",
|
||||
"team_disable_cal_branding_description": "הסרת מיתוגים הקשורים ל-Cal, כלומר 'מופעל על ידי Cal'",
|
||||
"invited_by_team": "הוזמנת על ידי {{teamName}} להצטרף לצוות בתפקיד {{role}}",
|
||||
"token_invalid_expired": "הטוקן לא חוקי או שתוקפו פג.",
|
||||
"exchange_add": "התחבר/י אל Microsoft Exchange",
|
||||
"exchange_authentication": "שיטת אימות",
|
||||
"exchange_authentication_standard": "אימות בסיסי",
|
||||
"exchange_authentication_ntlm": "אימות NTLM",
|
||||
"exchange_compression": "דחיסת GZip",
|
||||
"routing_forms_description": "כאן ניתן לראות את כל הטפסים והנתיבים שיצרת.",
|
||||
"add_new_form": "הוספת טופס חדש",
|
||||
"form_description": "צור/י טופס משלך כדי לנתב אל מזמין/ה",
|
||||
"copy_link_to_form": "העתק את הקישור לטופס",
|
||||
"theme": "ערכת נושא",
|
||||
"theme_applies_note": "חל רק על הדפים של הזמנות ציבוריות",
|
||||
"theme_light": "בהיר",
|
||||
"theme_dark": "כהה"
|
||||
"theme_dark": "כהה",
|
||||
"theme_system": "ברירת המחדל של המערכת",
|
||||
"add_a_team": "הוספת צוות",
|
||||
"saml_config": "תצורת SAML",
|
||||
"add_webhook_description": "קבלת נתוני פגישה בזמן אמת כשמשהו קורה ב-Cal.com",
|
||||
"triggers_when": "מופעל כאשר",
|
||||
"test_webhook": "יש לבצע בדיקת Ping לפני היצירה.",
|
||||
"enable_webhook": "הפעלת Webhook",
|
||||
"add_webhook": "הוספת Webhook",
|
||||
"webhook_edited_successfully": "ה-Webhook נשמר",
|
||||
"webhooks_description": "קבלת נתוני פגישה בזמן אמת כשמשהו קורה ב-Cal.com",
|
||||
"api_keys_description": "צור/י מפתחות API לקבלת גישה לחשבון שלך",
|
||||
"new_api_key": "מפתח API חדש",
|
||||
"active": "פעיל",
|
||||
"api_key_updated": "שם מפתח ה-API עודכן",
|
||||
"api_key_update_failed": "שגיאה בעת עדכון השם של מפתח ה-API",
|
||||
"embeds_title": "הטמעת iframe של HTML",
|
||||
"embeds_description": "הטמעת כל סוגי האירועים באתר",
|
||||
"create_first_api_key": "יצירת מפתח ה-API הראשון שלך",
|
||||
"create_first_api_key_description": "מפתחות API מאפשרים לאפליקציות אחרות לתקשר עם Cal.com",
|
||||
"back_to_signin": "בחזרה לדף הכניסה",
|
||||
"reset_link_sent": "נשלח קישור לאיפוס",
|
||||
"password_reset_email": "שלחנו לך הודעת דוא\"ל לכתובת {{email}} עם הוראות לאיפוס הסיסמה.",
|
||||
"password_updated": "הסיסמה עודכנה!",
|
||||
"pending_payment": "בהמתנה לתשלום",
|
||||
"confirmation_page_rainbow": "הגן/י על האירוע שלך באמצעות טוקנים או אסימוני NFT ב-Ethereum, ב-Polygon ועוד.",
|
||||
"not_on_cal": "לא ב-Cal.com",
|
||||
"no_calendar_installed": "לא מותקן אף לוח שנה",
|
||||
"no_calendar_installed_description": "לא קישרת אף אחד מלוחות השנה שלך",
|
||||
"add_a_calendar": "הוספת לוח שנה",
|
||||
"change_email_hint": "ייתכן שיהיה צורך לצאת ולהיכנס שוב כדי לראות שהשינויים נכנסו לתוקף",
|
||||
"confirm_password_change_email": "יש לאשר את הסיסמה לפני שינוי כתובת הדוא\"ל",
|
||||
"seats": "מקומות",
|
||||
"every_app_published": "כל אפליקציה שמתפרסמת ב-App Store של Cal.com היא בעלת קוד מקור פתוח. כל אפליקציה כזו גם נבדקה בקפידה על ידי עמיתים. למרות זאת, Cal.com, Inc. אינה מעודדת שימוש באף אפליקציה כזו ואינה מעניקה אישור לאף אפליקציה כזו, אלא אם מדובר באפליקציות שפורסמו על ידי Cal.com. אם נתקלת בהתנהגות או בתכנים בלתי הולמים, עליך לדווח על האפליקציה.",
|
||||
"report_app": "דיווח על האפליקציה",
|
||||
"billing_manage_details_title": "הצגה וניהול של פרטי החיוב",
|
||||
"billing_manage_details_description": "כאן ניתן להציג ולנהל את פרטי החיוב, וכן לבטל את המינוי.",
|
||||
"billing_help_title": "צריך משהו נוסף?",
|
||||
"billing_help_description": "אם דרוש לך סיוע נוסף בענייני חיוב, צוות התמיכה שלנו כאן כדי לעזור."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Usa il link qui sotto per reimpostare la tua password",
|
||||
"hey_there": "Ciao,",
|
||||
"forgot_your_password_calcom": "Hai dimenticato la password? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Tipo di evento",
|
||||
"delete_webhook_confirmation_message": "Sei sicuro di voler eliminare questo webhook? Non riceverai più Cal.com dati di riunione in un URL specificato, in tempo reale, quando un evento è programmato o annullato.",
|
||||
"confirm_delete_webhook": "Sì, elimina webhook",
|
||||
"edit_webhook": "Modifica Webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Fatturazione",
|
||||
"manage_your_billing_info": "Gestisci le tue informazioni di fatturazione e annulla il tuo abbonamento.",
|
||||
"availability": "Disponibilità",
|
||||
"availability_title": "{{availabilityTitle}} | Disponibilità",
|
||||
"edit_availability": "Modifica disponibilità",
|
||||
"configure_availability": "Cambia quando sei disponibile per le prenotazioni.",
|
||||
"copy_times_to": "Copia orari in",
|
||||
@@ -771,7 +769,7 @@
|
||||
"featured_categories": "Categorie in evidenza",
|
||||
"popular_categories": "Categorie popolari",
|
||||
"number_apps_one": "{{count}} App",
|
||||
"number_apps_other": "{{count}} App",
|
||||
"number_apps_other": "{{count}} app",
|
||||
"trending_apps": "App di tendenza",
|
||||
"explore_apps": "App {{category}}",
|
||||
"installed_apps": "App installate",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Reindirizza su prenotazione ",
|
||||
"you_are_being_redirected": "Verrai reindirizzato a {{ url }} tra $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "Per poter utilizzare questa funzionalità, è necessario passare a un account Pro.",
|
||||
"duplicate": "Duplica",
|
||||
"offer_seats": "Imposta posti",
|
||||
"offer_seats_description": "Imposta i posti da prenotare (ciò disabiliterà le prenotazioni ospite e le prenotazioni opt-in)",
|
||||
@@ -1084,10 +1081,10 @@
|
||||
"using_additional_inputs_as_variables": "Come usare i campi di input aggiuntivi come variabili?",
|
||||
"download_desktop_app": "Scarica app desktop",
|
||||
"set_ping_link": "Imposta link di Ping",
|
||||
"rate_limit_exceeded": "Limite di frequenza superato",
|
||||
"rate_limit_exceeded": "Limite superato",
|
||||
"when_something_happens": "Quando succede qualcosa",
|
||||
"action_is_performed": "Viene eseguita un'azione",
|
||||
"test_action": "Azione di test",
|
||||
"test_action": "Verifica azione",
|
||||
"notification_sent": "Notifica inviata",
|
||||
"no_input": "Nessun input",
|
||||
"test_workflow_action": "Verifica azione del flusso di lavoro",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Conferma la password prima di cambiare l'indirizzo e-mail",
|
||||
"seats": "posti",
|
||||
"every_app_published": "Tutte le applicazioni pubblicate nell'App store di Cal.com sono open source e sono state testate in modo approfondito attraverso una valutazione tra pari. Tuttavia, Cal.com, Inc. non promuove né certifica tali applicazioni, a meno che non siano pubblicate da Cal.com. Se notate contenuti o comportamenti inappropriati, vi preghiamo di segnalarceli.",
|
||||
"report_app": "Segnala app"
|
||||
"report_app": "Segnala app",
|
||||
"billing_manage_details_title": "Visualizza e gestisci i tuoi dettagli di fatturazione",
|
||||
"billing_manage_details_description": "Visualizza e modifica i tuoi dati di fatturazione, puoi anche modificare la tua subcription.",
|
||||
"billing_help_title": "Hai bisogno di altro?",
|
||||
"billing_help_description": "Se hai bisogno di ulteriore aiuto per la fatturazione, il nostro team di supporto è qui per aiutarti."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "以下のリンクを使用してパスワードをリセットしてください",
|
||||
"hey_there": "こんにちは!",
|
||||
"forgot_your_password_calcom": "パスワードをお忘れですか? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | イベントタイプ",
|
||||
"delete_webhook_confirmation_message": "このウェブフックを削除してもよろしいですか? イベントがスケジュールまたはキャンセルされたときに、指定された URL でのミーティングデータをリアルタイムには受け取れなくなります。",
|
||||
"confirm_delete_webhook": "はい、ウェブフックを削除します",
|
||||
"edit_webhook": "ウェブフックを編集",
|
||||
@@ -633,8 +632,7 @@
|
||||
"billing": "請求",
|
||||
"manage_your_billing_info": "請求情報の管理とサブスクリプションのキャンセル。",
|
||||
"availability": "利用可能期間",
|
||||
"availability_title": "{{availabilityTitle}} | 空き状況",
|
||||
"edit_availability": "空き状況を編集",
|
||||
"edit_availability": "予定を編集",
|
||||
"configure_availability": "予約が可能な時間を設定する。",
|
||||
"copy_times_to": "次に時間をコピー",
|
||||
"change_weekly_schedule": "ウィークリースケジュールを変更する",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "予約時にリダイレクト",
|
||||
"you_are_being_redirected": "$t(second, {\"count\": {{seconds}} }) で {{ url }} にリダイレクトします",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "この機能を利用するには、Pro アカウントへのアップグレードが必要です。",
|
||||
"duplicate": "複製",
|
||||
"offer_seats": "座席を提供",
|
||||
"offer_seats_description": "予約に座席を提供 (これはゲストとオプトイン予約を無効化します)",
|
||||
@@ -1131,7 +1128,7 @@
|
||||
"profile_picture": "プロフィール写真",
|
||||
"upload": "アップロード",
|
||||
"web3": "Web3",
|
||||
"rainbow_token_gated": "このイベントタイプはトークンゲートされています。",
|
||||
"rainbow_token_gated": "このイベントタイプはトークンゲート(トークンを持っている人だけに制限)されています。",
|
||||
"rainbow_connect_wallet_gate": "<1>{{name}}</1>(<3>{{symbol}}</3>)を所有している場合、ウォレットを接続します。",
|
||||
"rainbow_insufficient_balance": "接続されているウォレットには十分な<1>{{symbol}}</1>が含まれていません。",
|
||||
"rainbow_sign_message_request": "ウォレットのメッセージリクエストに署名してください。",
|
||||
@@ -1184,7 +1181,7 @@
|
||||
"organizer_name_info": "あなたの名前",
|
||||
"additional_notes_info": "予約の追加メモ",
|
||||
"attendee_name_info": "予約者名",
|
||||
"to": "宛先",
|
||||
"to": "送信先",
|
||||
"attendee_required_enter_number": "この場合、予約時に参加者の電話番号の入力が必要になります",
|
||||
"workflow_turned_on_successfully": "{{workflowName}} ワークフローが正常に {{offOn}} になりました",
|
||||
"download_responses": "回答をダウンロード",
|
||||
@@ -1239,7 +1236,7 @@
|
||||
"saml_config": "SAML 設定",
|
||||
"add_webhook_description": "Cal.com で何かが起こったときにリアルタイムでミーティングデータを受信します",
|
||||
"triggers_when": "次の場合にトリガー",
|
||||
"test_webhook": "作成前に Ping テストを行ってください。",
|
||||
"test_webhook": "作成前に Ping テストを実行してください。",
|
||||
"enable_webhook": "ウェブフックを有効にする",
|
||||
"add_webhook": "ウェブフックを追加",
|
||||
"webhook_edited_successfully": "ウェブフックを保存しました",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "メールアドレスを変更する前にパスワードを確認してください",
|
||||
"seats": "座席",
|
||||
"every_app_published": "Cal.com アプリストアで公開されているアプリはいずれもオープンソースであり、ピアレビューを通じて徹底的にテストされています。しかしながら Cal.com, Inc は、Cal.com によって公開されたものでない限り、これらのアプリを推奨または認証していません。不適切なコンテンツや動作に遭遇した場合は、ご報告ください。",
|
||||
"report_app": "アプリを報告"
|
||||
"report_app": "アプリを報告",
|
||||
"billing_manage_details_title": "請求情報の詳細を表示・管理する",
|
||||
"billing_manage_details_description": "請求情報の詳細を表示・編集、およびサブスクリプションをキャンセルする。",
|
||||
"billing_help_title": "他に必要なものはありませんか?",
|
||||
"billing_help_description": "請求に関するサポートが必要な場合は、サポートチームがお手伝いします。"
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "비밀번호를 재설정하시려면 아래 링크를 사용하세요.",
|
||||
"hey_there": "안녕하세요.",
|
||||
"forgot_your_password_calcom": "비밀번호를 잊어버리셨나요? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | 이벤트 타입",
|
||||
"delete_webhook_confirmation_message": "웹훅을 정말로 삭제하시겠습니까? 이벤트 일정이 잡혔거나 취소되었을 때 Cal.com의 회의 정보를 더 이상 실시간으로 받아보실 수 없게 됩니다.",
|
||||
"confirm_delete_webhook": "네, 웹훅을 삭제하겠습니다.",
|
||||
"edit_webhook": "웹훅 수정하기",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "청구",
|
||||
"manage_your_billing_info": "결제 정보를 관리하고 구독을 취소하세요.",
|
||||
"availability": "유효성",
|
||||
"availability_title": "{{availabilityTitle}} | 가용성",
|
||||
"edit_availability": "가용성 편집",
|
||||
"configure_availability": "예약 가능한 시간을 구성하십시오.",
|
||||
"copy_times_to": "횟수 복사:",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "예약 시 리디렉션",
|
||||
"you_are_being_redirected": "$t(second, {\"count\": {{seconds}} }) 후에 {{ url }}(으)로 리디렉션됩니다.",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "이 기능을 사용하려면 Pro 계정으로 업그레이드해야 합니다.",
|
||||
"duplicate": "복제",
|
||||
"offer_seats": "좌석 제공",
|
||||
"offer_seats_description": "예약에 좌석 제공(게스트를 비활성화하고 예약을 선택함)",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "이메일 주소 변경 전 비밀번호를 확인하세요",
|
||||
"seats": "좌석",
|
||||
"every_app_published": "Cal.com App Store에 게시된 모든 앱은 오픈 소스이며 피어 리뷰를 통해 철저한 테스트를 거쳤습니다. 그럼에도 불구하고 Cal.com, Inc.는 Cal.com에서 게시하지 않는 한 이 앱을 보증 또는 인증하지 않습니다. 부적절한 콘텐츠나 활동을 발견하면 신고해 주시기 바랍니다.",
|
||||
"report_app": "신고 앱"
|
||||
"report_app": "신고 앱",
|
||||
"billing_manage_details_title": "결제 세부정보 보기 및 관리",
|
||||
"billing_manage_details_description": "결제 세부 정보 확인 및 수정, 혹은 구독을 취소합니다.",
|
||||
"billing_help_title": "다른 것이 필요하십니까?",
|
||||
"billing_help_description": "청구와 관련하여 추가 도움이 필요한 경우 지원 팀이 도와드리겠습니다."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Gebruik de onderstaande link om uw wachtwoord te resetten",
|
||||
"hey_there": "Hallo daar,",
|
||||
"forgot_your_password_calcom": "Wachtwoord vergeten? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Evenement",
|
||||
"delete_webhook_confirmation_message": "Weet u zeker dat u deze webhook wilt verwijderen? U ontvangt dan niet langer Cal.com vergadergegevens op een opgegeven URL, in real-time, wanneer een evenement is geboekt of geannuleerd.",
|
||||
"confirm_delete_webhook": "Ja, webhook verwijderen",
|
||||
"edit_webhook": "Webhook bewerken",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Abonnement",
|
||||
"manage_your_billing_info": "Beheer uw betalingsgegevens en annuleer uw abonnement.",
|
||||
"availability": "Beschikbaarheid",
|
||||
"availability_title": "{{availabilityTitle}} | Beschikbaarheid",
|
||||
"edit_availability": "Beschikbaarheid bewerken",
|
||||
"configure_availability": "Configureer tijden wanneer u beschikbaar bent voor afspraken.",
|
||||
"copy_times_to": "Tijden kopiëren naar",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Omleiding bij boeking ",
|
||||
"you_are_being_redirected": "U wordt omgeleid naar {{ url }} over $t(seconde, {\"count\": {{seconden}} }).",
|
||||
"external_redirect_url": "https://voorbeeld.com/omleiding-naar-mijn-succespagina",
|
||||
"redirect_url_upgrade_description": "Om deze functie te gebruiken, moet u upgraden naar een Pro-account.",
|
||||
"duplicate": "Dupliceren",
|
||||
"offer_seats": "Zitplaatsen aanbieden",
|
||||
"offer_seats_description": "Zitplaatsen aanbieden aan boekingen (dit schakelt gastboekingen en aanmeldingsboekingen uit)",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Bevestig uw wachtwoord voordat u uw e-mailadres wijzigt",
|
||||
"seats": "plaatsen",
|
||||
"every_app_published": "Elke app die in de app store van Cal.com wordt gepubliceerd is open source en grondig getest via collegiale beoordelingen. Desondanks onderschrijft of certificeert Cal.com, Inc. deze apps niet, tenzij ze zijn gepubliceerd door Cal.com. Meld het als u ongepaste inhoud of gedrag tegenkomt.",
|
||||
"report_app": "App melden"
|
||||
"report_app": "App melden",
|
||||
"billing_manage_details_title": "Bekijk en beheer uw betalingsgegevens",
|
||||
"billing_manage_details_description": "Uw betalingsgegevens bekijken of uw account opzeggen.",
|
||||
"billing_help_title": "Nog iets nodig?",
|
||||
"billing_help_description": "Als u verdere hulp nodig heeft bij facturering, is ons ondersteuningsteam er om u te helpen."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Użyj poniższego linku, aby zresetować swoje hasło",
|
||||
"hey_there": "Cześć,",
|
||||
"forgot_your_password_calcom": "Nie pamiętasz swojego hasła? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Typ Wydarzenia",
|
||||
"delete_webhook_confirmation_message": "Czy na pewno chcesz usunąć ten webhook? Nie będziesz już otrzymywać danych o spotkaniach w Cal.com w określonym URL, w czasie rzeczywistym, gdy zdarzenie jest zaplanowane lub anulowane.",
|
||||
"confirm_delete_webhook": "Tak, usuń webhook",
|
||||
"edit_webhook": "Edytuj Webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Rozliczenia",
|
||||
"manage_your_billing_info": "Zarządzaj informacjami rozliczeniowymi i anuluj subskrypcję.",
|
||||
"availability": "Dostępność",
|
||||
"availability_title": "{{availabilityTitle}} | Dostępność",
|
||||
"edit_availability": "Edytuj dostępność",
|
||||
"configure_availability": "Skonfiguruj czasy, kiedy jesteś dostępny dla rezerwacji.",
|
||||
"copy_times_to": "Kopiuj czasy do",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Przekieruj przy rezerwacji ",
|
||||
"you_are_being_redirected": "Zostałeś przekierowany do {{ url }} w $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/przekieruj-do-moja-strona",
|
||||
"redirect_url_upgrade_description": "Aby korzystać z tej funkcji, musisz uaktualnić do konta Pro.",
|
||||
"duplicate": "Duplikat",
|
||||
"offer_seats": "Zaproponuj miejsca",
|
||||
"offer_seats_description": "Zaoferuj miejsca do zarezerwowania (ta funkcja wyłącza rezerwacje gości i rezerwacje wstępne)",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Potwierdź hasło przed zmianą adresu e-mail",
|
||||
"seats": "miejsca",
|
||||
"every_app_published": "Każda aplikacja opublikowana w sklepie App Store serwisu Cal.com jest otwartym oprogramowaniem i jest dokładnie testowana przez innych użytkowników. Niemniej jednak Cal.com, Inc. nie odpowiada za aplikacje ani nie certyfikuje ich, chyba że są one publikowane przez Cal.com. Jeśli natrafisz na nieodpowiednie treści lub zachowanie, zgłoś je.",
|
||||
"report_app": "Zgłoś aplikację"
|
||||
"report_app": "Zgłoś aplikację",
|
||||
"billing_manage_details_title": "Zobacz i zarządzaj swoimi danymi rozliczeniowymi",
|
||||
"billing_manage_details_description": "Zobacz i edytuj swoje dane rozliczeniowe, jak również anuluj subskrypcję.",
|
||||
"billing_help_title": "Potrzebujesz czegoś innego?",
|
||||
"billing_help_description": "Jeśli potrzebujesz dalszej pomocy przy rozliczaniu, nasz zespół wsparcia jest tutaj, aby pomóc."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Use o link abaixo para redefinir a sua senha",
|
||||
"hey_there": "Olá,",
|
||||
"forgot_your_password_calcom": "Esqueceu sua senha? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Tipo de evento",
|
||||
"delete_webhook_confirmation_message": "Você tem certeza que quer remover este Webhook? Você não receberá mais dados de reuniões de Cal.com na URL especificada, em tempo real, quando um evento for agendado ou cancelado.",
|
||||
"confirm_delete_webhook": "Sim, remover o Webhook",
|
||||
"edit_webhook": "Editar Webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Faturamento",
|
||||
"manage_your_billing_info": "Gerenciar as suas informações de faturamento e cancelar a sua assinatura.",
|
||||
"availability": "Disponibilidade",
|
||||
"availability_title": "{{availabilityTitle}} | Disponibilidade",
|
||||
"edit_availability": "Editar disponibilidade",
|
||||
"configure_availability": "Configure os horários em que estiver disponível para reservas.",
|
||||
"copy_times_to": "Copiar horários para",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Redirecionar após a reserva ",
|
||||
"you_are_being_redirected": "Você está sendo redirecionado para {{ url }} em $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "Para usar este recurso, atualize para uma conta Pro.",
|
||||
"duplicate": "Duplicar",
|
||||
"offer_seats": "Oferecer assentos",
|
||||
"offer_seats_description": "Oferecer lugares para reserva (isso desativa convidados e confirmações de reserva)",
|
||||
@@ -1268,5 +1265,9 @@
|
||||
"confirm_password_change_email": "Confirme sua senha antes de alterar o endereço de e-mail",
|
||||
"seats": "assentos",
|
||||
"every_app_published": "Todos os aplicativos publicados na App Store da Cal.com são de código aberto e testados minuciosamente por meio de avaliações por pares. No entanto, a Cal.com, Inc. não endossa ou certifica esses aplicativos a não ser que sejam publicados pela Cal.com. Se você encontrar conteúdo ou comportamento inadequado, denuncie.",
|
||||
"report_app": "Denunciar aplicativo"
|
||||
"report_app": "Denunciar aplicativo",
|
||||
"billing_manage_details_title": "Visualizar e gerenciar os seus detalhes de faturamento",
|
||||
"billing_manage_details_description": "Ver e editar os seus dados de faturamento, bem como cancelar a sua assinatura.",
|
||||
"billing_help_title": "Precisa de algo mais?",
|
||||
"billing_help_description": "Se precisar de mais ajuda com o faturamento, o nosso time de suporte está aqui para ajudar."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Use a ligação abaixo para redefinir a sua senha",
|
||||
"hey_there": "Olá,",
|
||||
"forgot_your_password_calcom": "Esqueceu-se da sua senha? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Tipo de evento",
|
||||
"delete_webhook_confirmation_message": "De certeza que quer eliminar este Webhook? Não receberá mais dados de reuniões de Cal.com do URL especificado, em tempo real, quando um evento for agendado ou cancelado.",
|
||||
"confirm_delete_webhook": "Sim, eliminar o Webhook",
|
||||
"edit_webhook": "Editar Webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Facturação",
|
||||
"manage_your_billing_info": "Gerir as suas informações de faturação e cancele a sua assinatura.",
|
||||
"availability": "Disponibilidade",
|
||||
"availability_title": "{{availabilityTitle}} | Disponibilidade",
|
||||
"edit_availability": "Editar disponibilidade",
|
||||
"configure_availability": "Configure os horários em que estiver disponível para reservas.",
|
||||
"copy_times_to": "Copiar horários para",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Redireccionar ao reservar ",
|
||||
"you_are_being_redirected": "Está a ser redireccionado para {{ url }} em $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://exemplo.com/redireccionar-para-pagina-de-sucesso",
|
||||
"redirect_url_upgrade_description": "Para usar esta funcionalidade, tem de actualizar para uma conta Pro.",
|
||||
"duplicate": "Duplicar",
|
||||
"offer_seats": "Oferecer lugares",
|
||||
"offer_seats_description": "Oferecer lugares para reservas (isto desactiva os convidados e confirmações nas reservas)",
|
||||
@@ -1259,7 +1256,7 @@
|
||||
"password_updated": "Palavra-passe atualizada!",
|
||||
"pending_payment": "Pagamento pendente",
|
||||
"confirmation_page_rainbow": "Controle o acesso ao seu evento com tokens ou NFT na Ethereum, Polygon e muito mais.",
|
||||
"not_on_cal": "Não em Cal.com",
|
||||
"not_on_cal": "Não existe em Cal.com",
|
||||
"no_calendar_installed": "Nenhum calendário instalado",
|
||||
"no_calendar_installed_description": "Ainda não associou nenhum dos seus calendários",
|
||||
"add_a_calendar": "Adicionar um calendário",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Por favor, confirme a sua palavra-passe antes de alterar o seu endereço de e-mail",
|
||||
"seats": "lugares",
|
||||
"every_app_published": "Todas as aplicações publicadas na loja de aplicações Cal.com são de código aberto e minuciosamente testadas através da avaliação por pares. No entanto, Cal.com, Inc. não apoia ou certifica estas aplicações a não ser que sejam publicadas pela Cal.com. Se encontrar conteúdos ou comportamentos inadequados, por favor, reporte a situação.",
|
||||
"report_app": "Reportar aplicação"
|
||||
"report_app": "Reportar aplicação",
|
||||
"billing_manage_details_title": "Visualizar e gerir os seus detalhes de faturação",
|
||||
"billing_manage_details_description": "Ver e editar os seus dados de faturação, bem como cancelar a sua assinatura.",
|
||||
"billing_help_title": "Precisa de algo mais?",
|
||||
"billing_help_description": "Se precisar de mais ajuda com a faturação, a nossa equipa de suporte está aqui para ajudar."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Utilizați linkul de mai jos pentru a vă reseta parola",
|
||||
"hey_there": "Bună,",
|
||||
"forgot_your_password_calcom": "Ți-ai uitat parola? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} Tip de Eveniment",
|
||||
"delete_webhook_confirmation_message": "Ești sigur că vrei să ștergi acest webhook? Nu vei mai primi Cal.com date de întâlnire la un URL specificat, în timp real, atunci când un eveniment este programat sau anulat.",
|
||||
"confirm_delete_webhook": "Da, șterge webhook",
|
||||
"edit_webhook": "Editează Webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Facturare",
|
||||
"manage_your_billing_info": "Gestionați informațiile de facturare și anulați abonamentul.",
|
||||
"availability": "Disponibilitate",
|
||||
"availability_title": "{{availabilityTitle}} | Disponibilitate",
|
||||
"edit_availability": "Editează disponibilitatea",
|
||||
"configure_availability": "Configurați orele când sunteți disponibil pentru rezervări.",
|
||||
"copy_times_to": "Copiază orele la",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Redirecționare la rezervare ",
|
||||
"you_are_being_redirected": "Sunteți redirecționat către {{ url }} în $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "Pentru a utiliza această caracteristică, trebuie să faceți upgrade la un cont Pro.",
|
||||
"duplicate": "Duplicare",
|
||||
"offer_seats": "Oferiți locuri",
|
||||
"offer_seats_description": "Oferiți locuri pentru rezervări (se dezactivează astfel oaspeții și rezervările la alegere)",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Te rugăm să confirmi parola înainte de a-ți schimba adresa de e-mail",
|
||||
"seats": "locuri",
|
||||
"every_app_published": "Fiecare aplicație publicată pe Cal.com App Store este open source și testată temeinic prin evaluări inter pares. Cu toate acestea, Cal.com, Inc. nu susține sau certifică aceste aplicații decât dacă sunt publicate de Cal.com. Dacă întâmpini un conținut sau un comportament necorespunzător, te rugăm să îl raportezi.",
|
||||
"report_app": "Raportează aplicația"
|
||||
"report_app": "Raportează aplicația",
|
||||
"billing_manage_details_title": "Vizualizați și gestionați detaliile de facturare",
|
||||
"billing_manage_details_description": "Vizualizați și editați detaliile de facturare, precum și anulați abonarea.",
|
||||
"billing_help_title": "Aveți nevoie de altceva?",
|
||||
"billing_help_description": "Dacă ai nevoie de ajutor suplimentar pentru facturare, echipa noastră de asistență este aici pentru a te ajuta."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Используйте ссылку ниже, чтобы сбросить пароль",
|
||||
"hey_there": "Привет,",
|
||||
"forgot_your_password_calcom": "Забыли пароль? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Тип события",
|
||||
"delete_webhook_confirmation_message": "Вы уверены, что хотите удалить этот вебхук? Вы больше не будете получать от Cal.com данные о новых или отменённых встречах по указанному URL в реальном времени.",
|
||||
"confirm_delete_webhook": "Да, удалить веб-хук",
|
||||
"edit_webhook": "Изменить веб-хук",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Биллинг",
|
||||
"manage_your_billing_info": "Управление платежной информацией и отменой подписки.",
|
||||
"availability": "Доступность",
|
||||
"availability_title": "{{availabilityTitle}} | Доступность",
|
||||
"edit_availability": "Изменить доступность",
|
||||
"configure_availability": "Измените временные интервалы, доступные для бронирования.",
|
||||
"copy_times_to": "Скопировать время в",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Перенаправление при бронировании ",
|
||||
"you_are_being_redirected": "Перенаправление на {{ url }} произойдет через $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "Чтобы использовать эту функцию, необходимо перейти на аккаунт Pro.",
|
||||
"duplicate": "Создать копию",
|
||||
"offer_seats": "Предложить места",
|
||||
"offer_seats_description": "Предлагать места при бронировании (при этом отключается гостевой режим и бронирование с подтверждением)",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Подтвердите свой пароль, чтобы изменить адрес электронной почты",
|
||||
"seats": "места",
|
||||
"every_app_published": "Все приложения на Cal.com App Store – это решения с открытым исходным кодом, которые тщательно тестируются коллегами. Тем не менее Cal.com, Inc. не дает гарантию в отношении только тех приложений, которые опубликованы Cal.com. Если вы обнаружите неприемлемое содержание или поведение, просим сообщать об этом.",
|
||||
"report_app": "Пожаловаться на приложение"
|
||||
"report_app": "Пожаловаться на приложение",
|
||||
"billing_manage_details_title": "Просмотр и управление платежными данными",
|
||||
"billing_manage_details_description": "Просматривайте и редактируйте платежные реквизиты, а также отменяйте подписку.",
|
||||
"billing_help_title": "Нужно что-нибудь еще?",
|
||||
"billing_help_description": "Если вам нужна дальнейшая помощь с оплатой счета, наша служба поддержки готова помочь."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Resetujte lozinku koristeći link ispod",
|
||||
"hey_there": "Zdravo,",
|
||||
"forgot_your_password_calcom": "Zaboravili ste lozinku? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Tip Dogadjaja",
|
||||
"delete_webhook_confirmation_message": "Da li ste sigurni da želite da obrišete ovaj webhook? Nećete više dobijati Cal.com podatke o sastancima preko naznačenog URL, istovremeno kad je dogadjaj zakazan ili otkazan.",
|
||||
"confirm_delete_webhook": "Da, obriši webhook",
|
||||
"edit_webhook": "Uredi Webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Naplate",
|
||||
"manage_your_billing_info": "Upravljajte svojim informacijama za plaćanje i otkažite pretplatu.",
|
||||
"availability": "Dostupnost",
|
||||
"availability_title": "{{availabilityTitle}} | Dostupnost",
|
||||
"edit_availability": "Uredi dostupnost",
|
||||
"configure_availability": "Konfigurišite vreme kada ste dostupni za rezervacije.",
|
||||
"copy_times_to": "Kopiraj vremena u",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Preusmeri na rezervaciju ",
|
||||
"you_are_being_redirected": "Preusmeravamo vas na {{ url }} za $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "Da biste koristili ovu funkciju, morate izvršiti nadogradnju na Pro nalog.",
|
||||
"duplicate": "Dupliraj",
|
||||
"offer_seats": "Ponudi mesta",
|
||||
"offer_seats_description": "Ponudi mesta za zakazivanje (ovo onemogućava gostujuća i opciona zakazivanja)",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Potvrdite svoju lozinku pre promene imejl adrese",
|
||||
"seats": "sedišta",
|
||||
"every_app_published": "Svaka aplikacija objavljena na Cal.com prodavnici je otvorenog tipa i detaljno je testirana kroz recenzije saradnika. Bez obzira na to, Cal.com, Inc. ne podržava ni sertifikuje ove aplikacije osim ako ih nije objavio Cal.com. Ako naiđete na neprikladan sardžaj ili ponašanje, molimo vas da to prijavite.",
|
||||
"report_app": "Prijavite aplikaciju"
|
||||
"report_app": "Prijavite aplikaciju",
|
||||
"billing_manage_details_title": "Pogledajte i upravljate vaše detalje naplate",
|
||||
"billing_manage_details_description": "Pogledajte i uredite vaše detalje naplate, a i otkažite vašu pretplatu.",
|
||||
"billing_help_title": "Treba li vam još nešto?",
|
||||
"billing_help_description": "Ako vam treba pomoć sa naplatom, naš tim podrške je tu da pomogne."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Använd länken nedan för att återställa ditt lösenord",
|
||||
"hey_there": "Hallå där,",
|
||||
"forgot_your_password_calcom": "Glömt ditt lösenord? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Händelsetyp",
|
||||
"delete_webhook_confirmation_message": "Är du säker på att du vill ta bort denna webhook? Du kommer inte längre att få Calcom mötesdata skickad till angiven URL, i realtid, när en händelse är schemalagd eller avbruten.",
|
||||
"confirm_delete_webhook": "Ja, ta bort webhook",
|
||||
"edit_webhook": "Redigera Webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Fakturering",
|
||||
"manage_your_billing_info": "Hantera din faktureringsinformation och avsluta din prenumeration.",
|
||||
"availability": "Tillgänglighet",
|
||||
"availability_title": "{{availabilityTitle}} | Tillgänglighet",
|
||||
"edit_availability": "Redigera tillgänglighet",
|
||||
"configure_availability": "Ställ in de tider du är tillgänglig för bokningar.",
|
||||
"copy_times_to": "Kopiera tider till",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Omdirigera vid bokning ",
|
||||
"you_are_being_redirected": "Du omdirigeras till {{ url }} om $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "För att kunna använda den här funktionen måste du uppgradera till ett Pro-konto.",
|
||||
"duplicate": "Duplicera",
|
||||
"offer_seats": "Erbjud platser",
|
||||
"offer_seats_description": "Erbjud platser till bokningar (Detta inaktiverar gäster och bokningar)",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Vänligen bekräfta ditt lösenord innan du ändrar din e-postadress",
|
||||
"seats": "platser",
|
||||
"every_app_published": "Alla appar som publiceras i Cal.com App Store har öppen källkod och är noggrant testade genom peer reviews. Cal.com, Inc. stöder eller certifierar dock inte dessa appar om de inte publiceras av Cal.com. Om du stöter på olämpligt innehåll eller beteende ber vi dig att rapportera det.",
|
||||
"report_app": "Rapportera app"
|
||||
"report_app": "Rapportera app",
|
||||
"billing_manage_details_title": "Visa och hantera dina faktureringsuppgifter",
|
||||
"billing_manage_details_description": "Visa och redigera dina faktureringsuppgifter samt avsluta din prenumeration.",
|
||||
"billing_help_title": "Behöver du något annat?",
|
||||
"billing_help_description": "Om du behöver ytterligare hjälp med fakturering finns vårt supportteam här för att hjälpa till."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Şifrenizi sıfırlamak için aşağıdaki bağlantıyı kullanın",
|
||||
"hey_there": "Selam,",
|
||||
"forgot_your_password_calcom": "Şifrenizi mi unuttunuz? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Etkinlik Türü",
|
||||
"delete_webhook_confirmation_message": "Bu web kancasını silmek istediğinizden emin misiniz? Bir etkinlik planlandığında veya iptal edildiğinde, Cal.com toplantı verilerini gerçek zamanlı olarak belirli bir URL'de almazsınız.",
|
||||
"confirm_delete_webhook": "Evet, web kancasını sil",
|
||||
"edit_webhook": "Web kancasını düzenle",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Fatura",
|
||||
"manage_your_billing_info": "Fatura bilgilerinizi yönetin ve aboneliğinizi iptal edin.",
|
||||
"availability": "Müsaitlik",
|
||||
"availability_title": "{{availabilityTitle}} | Müsaitlik Durumu",
|
||||
"edit_availability": "Müsaitlik durumunu düzenle",
|
||||
"configure_availability": "Rezervasyon için uygun olduğunuz zamanları yapılandırın.",
|
||||
"copy_times_to": "Saatleri şuraya kopyala:",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Rezervasyonu yönlendir ",
|
||||
"you_are_being_redirected": "$t(second, {\"count\": {{seconds}} }) içinde {{ url }} adresine yönlendirileceksiniz.",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "Bu özelliği kullanmak için Pro hesabına geçmeniz gerekiyor.",
|
||||
"duplicate": "Çoğalt",
|
||||
"offer_seats": "Yer teklif et",
|
||||
"offer_seats_description": "Rezervasyonlar için koltuk teklif edin (bu işlem, misafirleri ve rezervasyon onaylarını devre dışı bırakır)",
|
||||
@@ -1185,13 +1182,13 @@
|
||||
"additional_notes_info": "Ek rezervasyon notları",
|
||||
"attendee_name_info": "Rezervasyon yaptıran kişinin adı",
|
||||
"to": "Kime",
|
||||
"attendee_required_enter_number": "Bu, katılımcının rezervasyon yapmak için bir telefon numarası girmesini gerektirecektir",
|
||||
"attendee_required_enter_number": "Bu, katılımcının rezervasyon yapmak için bir telefon numarası girmesini gerektirir",
|
||||
"workflow_turned_on_successfully": "{{workflowName}} iş akışı başarıyla {{offOn}}",
|
||||
"download_responses": "Yanıtları İndir",
|
||||
"create_your_first_form": "İlk formunuzu oluşturun",
|
||||
"create_your_first_form_description": "Yönlendirme Formları ile niteliksel sorular sorabilir ve bunları doğru kişiye veya etkinlik türüne yönlendirebilirsiniz.",
|
||||
"create_your_first_webhook": "İlk Web kancanızı oluşturun",
|
||||
"create_your_first_webhook_description": "Web kancaları ile Cal.com'da bir etkinlik gerçekleştiğinde toplantı verilerini gerçek zamanlı olarak alabilirsiniz.",
|
||||
"create_your_first_webhook": "İlk Web Kancanızı oluşturun",
|
||||
"create_your_first_webhook_description": "Web Kancaları ile Cal.com'da bir etkinlik gerçekleştiğinde toplantı verilerini gerçek zamanlı olarak alabilirsiniz.",
|
||||
"for_a_maximum_of": "Maksimum",
|
||||
"event_one": "etkinlik",
|
||||
"event_other": "etkinlik",
|
||||
@@ -1201,12 +1198,12 @@
|
||||
"delete_team": "Ekibi Sil",
|
||||
"team_members": "Ekip üyeleri",
|
||||
"more": "Daha fazla",
|
||||
"more_page_footer": "Mobil uygulamayı web uygulamasının bir uzantısı olarak görüyoruz. Karmaşık bir işlem yapıyorsanız, lütfen web uygulamasına geri dönün.",
|
||||
"more_page_footer": "Mobil uygulamayı web uygulamasının bir uzantısı olarak görüyoruz. Karmaşık bir işlem yapıyorsanız lütfen web uygulamasına geri dönün.",
|
||||
"workflow_example_1": "Etkinlik başlamadan 24 saat önce katılımcıya SMS hatırlatıcısı gönder",
|
||||
"workflow_example_2": "Etkinlik yeniden planlandığında katılımcıya özel SMS gönder",
|
||||
"workflow_example_3": "Yeni bir etkinlik rezervasyonu yapıldığında organizatöre özel bir e-posta gönderin",
|
||||
"workflow_example_4": "Etkinlikler başlamadan 1 saat önce katılımcıya e-posta hatırlatıcısı gönderin",
|
||||
"workflow_example_5": "Etkinlik yeniden planlandığında ana bilgisayara özel e-posta gönder",
|
||||
"workflow_example_5": "Etkinlik yeniden planlandığında organizatöre özel e-posta gönderin",
|
||||
"workflow_example_6": "Yeni bir etkinlik rezervasyonu yapıldığında organizatöre özel SMS gönderin",
|
||||
"welcome_to_cal_header": "Cal.com'a hoş geldiniz!",
|
||||
"edit_form_later_subtitle": "Bunu daha sonra düzenleyebilirsiniz.",
|
||||
@@ -1226,24 +1223,24 @@
|
||||
"exchange_authentication_standard": "Temel kimlik doğrulaması",
|
||||
"exchange_authentication_ntlm": "NTLM kimlik doğrulaması",
|
||||
"exchange_compression": "GZip sıkıştırma",
|
||||
"routing_forms_description": "Oluşturduğunuz tüm formları ve rotaları burada görebilirsiniz.",
|
||||
"routing_forms_description": "Oluşturduğunuz tüm formları ve yönlendirmeleri burada görebilirsiniz.",
|
||||
"add_new_form": "Yeni form ekle",
|
||||
"form_description": "Rezervasyon yapan kişiyi yönlendirmek için formunuzu oluşturun",
|
||||
"copy_link_to_form": "Bağlantıyı forma kopyala",
|
||||
"theme": "Tema",
|
||||
"theme_applies_note": "Bu, sadecev genel rezervasyon sayfalarınız için geçerlidir",
|
||||
"theme_applies_note": "Bu, sadece genel rezervasyon sayfalarınız için geçerlidir",
|
||||
"theme_light": "Açık",
|
||||
"theme_dark": "Koyu",
|
||||
"theme_system": "Sistem varsayılanı",
|
||||
"add_a_team": "Ekip ekle",
|
||||
"saml_config": "SAML Yapılandırması",
|
||||
"add_webhook_description": "Cal.com'da bir etkinlik gerçekleştiğinde gerçek zamanlı olarak toplantı bilgilerini alın",
|
||||
"add_webhook_description": "Cal.com'da bir etkinlik gerçekleştiğinde toplantı bilgilerini gerçek zamanlı olarak alın",
|
||||
"triggers_when": "Tetiklenme zamanı",
|
||||
"test_webhook": "Lütfen oluşturmadan önce ping testi yapın.",
|
||||
"enable_webhook": "Web kancasını etkinleştir",
|
||||
"add_webhook": "Web kancası ekle",
|
||||
"add_webhook": "Web Kancası ekle",
|
||||
"webhook_edited_successfully": "Web Kancası kaydedildi",
|
||||
"webhooks_description": "Cal.com'da bir etkinlik gerçekleştiğinde gerçek zamanlı olarak toplantı bilgilerini alın",
|
||||
"webhooks_description": "Cal.com'da bir etkinlik gerçekleştiğinde toplantı bilgilerini gerçek zamanlı olarak alın",
|
||||
"api_keys_description": "Kendi hesabınıza erişmek için API anahtarları oluşturun",
|
||||
"new_api_key": "Yeni API anahtarı",
|
||||
"active": "Etkin",
|
||||
@@ -1258,14 +1255,18 @@
|
||||
"password_reset_email": "{{email}} adresine şifrenizi sıfırlama talimatlarını içeren bir e-posta gönderildi.",
|
||||
"password_updated": "Şifre güncellendi!",
|
||||
"pending_payment": "Bekleyen ödeme",
|
||||
"confirmation_page_rainbow": "Ethereum, Polygon ve diğer token'lar veya NFT ile etkinliğinizi kontrol edin.",
|
||||
"not_on_cal": "Cal.com'da değil",
|
||||
"confirmation_page_rainbow": "Ethereum, Polygon ve diğer token'lar veya NFT ile etkinliğinizi kontrol altında tutun.",
|
||||
"not_on_cal": "Cal.com'da yok",
|
||||
"no_calendar_installed": "Yüklü takvim yok",
|
||||
"no_calendar_installed_description": "Henüz hiçbir takviminizi bağlamadınız",
|
||||
"add_a_calendar": "Takvim ekle",
|
||||
"change_email_hint": "Değişikliklerin geçerli olduğunu görmek için oturumu kapatıp tekrar açmanız gerekebilir",
|
||||
"confirm_password_change_email": "Lütfen e-posta adresinizi değiştirmeden önce şifrenizi onaylayın",
|
||||
"seats": "yer",
|
||||
"every_app_published": "Cal.com Uygulama Mağazası'nda yayınlanan her uygulama açık kaynak kodludur ve uzman incelemeleriyle kapsamlı bir şekilde test edilmiştir. Cal.com, Cal.com tarafından yayınlanmadıkça bu uygulamaları desteklemez veya onaylamaz. Uygunsuz içerik veya davranışla karşılaşırsanız lütfen bize bildirin.",
|
||||
"report_app": "Uygulamayı bildir"
|
||||
"every_app_published": "Cal.com Uygulama Mağazası'nda yayınlanan her uygulama açık kaynak kodludur ve uzman incelemeleriyle kapsamlı bir şekilde test edilmiştir. Cal.com, Cal.com tarafından yayınlanmadıkça bu uygulamaları desteklemez veya onaylamaz. Herhangi bir uygunsuz içerik veya davranışla karşılaşırsanız lütfen bize bildirin.",
|
||||
"report_app": "Uygulamayı bildir",
|
||||
"billing_manage_details_title": "Fatura bilgilerinizi görüntüleyin ve yönetin",
|
||||
"billing_manage_details_description": "Fatura bilgilerinizi görüntüleyin ve düzenleyin, ayrıca aboneliğinizi iptal edin.",
|
||||
"billing_help_title": "Başka bir şeye ihtiyacınız var mı?",
|
||||
"billing_help_description": "Faturalandırma konusunda daha fazla yardıma ihtiyacınız olursa destek ekibimiz size yardımcı olmaya hazır."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Скористайтеся посиланням нижче, щоб скинути пароль",
|
||||
"hey_there": "Привіт!",
|
||||
"forgot_your_password_calcom": "Забули пароль? – Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Тип заходу",
|
||||
"delete_webhook_confirmation_message": "Справді видалити цей вебгук? Ви більше не отримуватимете дані про нараду Cal.com за вказаною URL-адресою: у реальному часі, а також під час планування та скасування.",
|
||||
"confirm_delete_webhook": "Так, видалити вебгук",
|
||||
"edit_webhook": "Редагувати вебгук",
|
||||
@@ -498,6 +497,8 @@
|
||||
"new_member": "Новий учасник",
|
||||
"invite": "Запросити",
|
||||
"add_team_members": "Додати учасників команди",
|
||||
"add_team_members_description": "Запросіть інших у свою команду",
|
||||
"add_team_member": "Додати учасника команди",
|
||||
"invite_new_member": "Запросіть нового учасника",
|
||||
"invite_new_team_member": "Запросіть когось у свою команду.",
|
||||
"change_member_role": "Змініть роль учасника команди",
|
||||
@@ -610,6 +611,7 @@
|
||||
"create_first_team_and_invite_others": "Створіть свою першу команду та запросіть інших, щоб працювати разом.",
|
||||
"create_team_to_get_started": "Створіть команду, щоб почати",
|
||||
"teams": "Команди",
|
||||
"team": "Команда",
|
||||
"team_billing": "Виставлення рахунків для команд",
|
||||
"upgrade_to_flexible_pro_title": "Ми змінили умови оплати для команд",
|
||||
"upgrade_to_flexible_pro_message": "У вашій команді є учасники без придбаних місць. Перейдіть на план Pro, щоб отримати всі потрібні місця.",
|
||||
@@ -630,7 +632,9 @@
|
||||
"billing": "Виставлення рахунків",
|
||||
"manage_your_billing_info": "Керуйте своїми даними для виставлення рахунків і підписками.",
|
||||
"availability": "Доступність",
|
||||
"edit_availability": "Редагувати відомості про доступність",
|
||||
"configure_availability": "Налаштовуйте свої часові вікна, доступні для бронювання.",
|
||||
"copy_times_to": "Копіювати час до",
|
||||
"change_weekly_schedule": "Змініть свій розклад на тиждень",
|
||||
"logo": "Логотип",
|
||||
"error": "Помилка",
|
||||
@@ -645,6 +649,7 @@
|
||||
"event_name_tooltip": "Ім’я, яке показуватиметься в календарях",
|
||||
"meeting_with_user": "Нарада з користувачем {ATTENDEE}",
|
||||
"additional_inputs": "Додаткові поля введення",
|
||||
"additional_input_description": "Вимагати від особи, що хоче створити бронювання, надавати додаткові відомості",
|
||||
"label": "Мітка",
|
||||
"placeholder": "Заповнювач",
|
||||
"type": "Тип",
|
||||
@@ -659,6 +664,8 @@
|
||||
"disable_guests": "Вимкнути гостей",
|
||||
"disable_guests_description": "Забороніть додати гостей під час бронювання.",
|
||||
"private_link": "Створити приватне посилання",
|
||||
"private_link_label": "Приватне посилання",
|
||||
"private_link_hint": "Після кожного використання ваше приватне посилання створюватиметься повторно",
|
||||
"copy_private_link": "Копіювати приватне посилання",
|
||||
"private_link_description": "Створіть приватну URL-адресу, щоб поширювати її, не виказуючи свого імені користувача в Cal",
|
||||
"invitees_can_schedule": "Запрошені можуть планувати",
|
||||
@@ -700,16 +707,21 @@
|
||||
"delete_account_confirmation_message": "Справді видалити обліковий запис Cal.com? Усі, кому ви надавали посилання на свій обліковий запис, більше не зможуть бронювати ваш час за його допомогою. Усі збережені налаштування буде втрачено.",
|
||||
"integrations": "Інтеграції",
|
||||
"apps": "Додатки",
|
||||
"category_apps": "Додатки з категорії «{{category}}»",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Спілкування та технології на робочому місці.",
|
||||
"settings": "Параметри",
|
||||
"event_type_moved_successfully": "Тип події переміщено",
|
||||
"next_step_text": "Наступний крок",
|
||||
"next_step": "Пропустити крок",
|
||||
"prev_step": "Попередній крок",
|
||||
"install": "Установити",
|
||||
"installed": "Установлено",
|
||||
"active_install_one": "{{count}} активна інсталяція",
|
||||
"active_install_other": "Активних інсталяцій: {{count}}",
|
||||
"globally_install": "Установлено глобально",
|
||||
"app_successfully_installed": "Додаток установлено",
|
||||
"app_could_not_be_installed": "Не вдалося встановити додаток",
|
||||
"disconnect": "Від’єднати",
|
||||
"embed_your_calendar": "Вбудуйте календар у свою вебсторінку",
|
||||
"connect_your_favourite_apps": "Підключіть улюблені застосунки.",
|
||||
@@ -720,6 +732,7 @@
|
||||
"connect_additional_calendar": "Підключити додатковий календар",
|
||||
"conferencing": "Відеоконференції",
|
||||
"calendar": "Календар",
|
||||
"payments": "Платежі",
|
||||
"not_installed": "Не встановлено",
|
||||
"error_password_mismatch": "Паролі не збігаються.",
|
||||
"error_required_field": "Це поле обов’язкове.",
|
||||
@@ -753,9 +766,22 @@
|
||||
"import_from": "Імпортувати з",
|
||||
"access_token": "Токен доступу",
|
||||
"visit_roadmap": "Дорожня карта",
|
||||
"featured_categories": "Рекомендовані категорії",
|
||||
"popular_categories": "Популярні категорії",
|
||||
"number_apps_one": "{{count}} додаток",
|
||||
"number_apps_other": "Додатків: {{count}}",
|
||||
"trending_apps": "Популярні додатки",
|
||||
"explore_apps": "Додатки з категорії «{{category}}»",
|
||||
"installed_apps": "Установлені додатки",
|
||||
"no_category_apps": "Немає додатків із категорії «{{category}}»",
|
||||
"no_category_apps_description_calendar": "Додайте додаток-календар, щоб перевіряти розклад на наявність конфліктів і уникати подвійних бронювань",
|
||||
"no_category_apps_description_conferencing": "Спробуйте додати програму для конференцій, щоб інтегрувати можливість відеовикликів зі своїми клієнтами",
|
||||
"no_category_apps_description_payment": "Додайте платіжний додаток, щоб спростити транзакції між вами та вашими клієнтами",
|
||||
"no_category_apps_description_other": "Додавайте інші додатки з різноманітними функціями",
|
||||
"installed_app_calendar_description": "Налаштуйте календар, щоб перевіряти розклад на наявність конфліктів і уникати подвійних бронювань.",
|
||||
"installed_app_conferencing_description": "Додавайте улюблені додатки для відеоконференцій, щоб проводити наради",
|
||||
"installed_app_payment_description": "Укажіть, які служби обробки платежів використовувати, коли клієнти вам платять.",
|
||||
"installed_app_other_description": "Усі ваші встановлені додатки з інших категорій.",
|
||||
"empty_installed_apps_headline": "Не встановлено жодних додатків",
|
||||
"empty_installed_apps_description": "Додатки дають змогу оптимізувати робочий процес і спростити роботу з графіком.",
|
||||
"empty_installed_apps_button": "Переглянути магазин додатків",
|
||||
@@ -776,6 +802,7 @@
|
||||
"remove": "Вилучити",
|
||||
"add": "Додати",
|
||||
"installed_one": "Установлено",
|
||||
"installed_other": "Встановлено {{count}}",
|
||||
"verify_wallet": "Пройдіть перевірку гаманця",
|
||||
"connect_metamask": "Підключіть Metamask",
|
||||
"create_events_on": "Створюйте заходи в:",
|
||||
@@ -793,6 +820,8 @@
|
||||
"set_to_default": "Установити за замовчуванням",
|
||||
"new_schedule_btn": "Створити розклад",
|
||||
"add_new_schedule": "Додати новий розклад",
|
||||
"add_new_calendar": "Додати новий календар",
|
||||
"set_calendar": "Укажіть, куди додавати нові заходи, коли ваш час бронюють.",
|
||||
"delete_schedule": "Видалити розклад",
|
||||
"schedule_created_successfully": "Розклад «{{scheduleName}}» створено",
|
||||
"availability_updated_successfully": "Розклад «{{scheduleName}}» оновлено",
|
||||
@@ -808,7 +837,6 @@
|
||||
"redirect_success_booking": "Перенаправляти під час бронювання ",
|
||||
"you_are_being_redirected": "Ви перейдете за адресою {{ url }} через $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "Щоб користуватися цією функцією, потрібен обліковий запис Pro.",
|
||||
"duplicate": "Дублювати",
|
||||
"offer_seats": "Запропонувати місця",
|
||||
"offer_seats_description": "Пропонувати місця під час бронювання (при цьому вимикається гостьовий режим і бронювання з підтвердженням)",
|
||||
@@ -946,6 +974,7 @@
|
||||
"workflows": "Робочі процеси",
|
||||
"new_workflow_btn": "Новий робочий процес",
|
||||
"add_new_workflow": "Додати новий робочий процес",
|
||||
"reschedule_event_trigger": "у момент перенесення заходу",
|
||||
"trigger": "Тригер",
|
||||
"triggers": "Тригери",
|
||||
"action": "Дія",
|
||||
@@ -973,10 +1002,13 @@
|
||||
"change_username_standard_to_premium": "Оскільки ви змінюєте стандартне ім’я користувача на преміальне, відкриється оформлення переходу на дорожчу підписку.",
|
||||
"change_username_premium_to_standard": "Оскільки ви змінюєте преміальне ім’я користувача на стандартне, відкриється оформлення переходу на дешевшу підписку.",
|
||||
"go_to_stripe_billing": "Перейти до виставлення рахунків",
|
||||
"stripe_description": "Вимагати оплату за бронювання (комісія за транзакцію: 0,5% + 0,10 €)",
|
||||
"trial_expired": "Пробний період закінчився",
|
||||
"remove_app": "Вилучити додаток",
|
||||
"yes_remove_app": "Так, вилучити додаток",
|
||||
"are_you_sure_you_want_to_remove_this_app": "Справді вилучити цей додаток?",
|
||||
"app_removed_successfully": "Додаток вилучено",
|
||||
"error_removing_app": "Помилка під час вилучення додатку",
|
||||
"web_conference": "Вебконференція",
|
||||
"number_for_sms_reminders": "Номер телефону (для SMS-нагадувань)",
|
||||
"requires_confirmation": "Потрібне підтвердження",
|
||||
@@ -1032,18 +1064,209 @@
|
||||
"navigate": "Перейти",
|
||||
"open": "Відкрити",
|
||||
"close": "Закрити",
|
||||
"team_feature_teams": "Ця функція доступна в плані Team. Перейдіть на нього, щоб бачити відомості про доступність учасників своєї команди.",
|
||||
"team_feature_workflows": "Ця функція доступна в плані Team. Перейдіть на нього, щоб автоматизувати сповіщення та нагадування про заходи за допомогою робочих процесів.",
|
||||
"show_eventtype_on_profile": "Показувати в профілі",
|
||||
"embed": "Вбудувати",
|
||||
"new_username": "Нове ім’я користувача",
|
||||
"current_username": "Поточне ім’я користувача",
|
||||
"example_1": "Приклад 1",
|
||||
"example_2": "Приклад 2",
|
||||
"additional_input_label": "Додатковий введений підпис",
|
||||
"company_size": "Розмір компанії",
|
||||
"what_help_needed": "З чим саме потрібна допомога?",
|
||||
"variable_format": "Формат змінної",
|
||||
"webhook_subscriber_url_reserved": "URL-адресу для абонента у вебгуку вже визначено",
|
||||
"custom_input_as_variable_info": "Усі спеціальні символи в додатковому введеному підписі пропускаються (використовуються тільки літери та цифри), використовуються лише великі літери, пробіли замінюються на підкреслення.",
|
||||
"using_additional_inputs_as_variables": "Як використовувати додаткові поля введення як змінні?",
|
||||
"download_desktop_app": "Завантажити додаток для ПК",
|
||||
"set_ping_link": "Установити Ping-посилання",
|
||||
"rate_limit_exceeded": "Перевищено ліміт кількості запитів",
|
||||
"when_something_happens": "Коли щось стається",
|
||||
"action_is_performed": "Виконується дія",
|
||||
"test_action": "Перевірити дію",
|
||||
"notification_sent": "Надсилається сповіщення",
|
||||
"no_input": "Нічого не введено",
|
||||
"test_workflow_action": "Перевірити дію робочого циклу",
|
||||
"send_sms": "Надіслати SMS",
|
||||
"send_sms_to_number": "Справді надіслати SMS-повідомлення на номер {{number}}?",
|
||||
"missing_connected_calendar": "Немає календаря за замовчуванням",
|
||||
"connect_your_calendar_and_link": "Підключити календар можна <1>звідси</1>.",
|
||||
"default_calendar_selected": "Календар за замовчуванням",
|
||||
"hide_from_profile": "Не показувати в профілі",
|
||||
"event_setup_tab_title": "Налаштування заходу",
|
||||
"event_limit_tab_title": "Ліміти",
|
||||
"event_limit_tab_description": "Як часто ваш час можуть бронювати",
|
||||
"event_advanced_tab_description": "Налаштування календаря та інше…",
|
||||
"event_advanced_tab_title": "Додатково",
|
||||
"select_which_cal": "Виберіть календар, у який додаватимуться бронювання",
|
||||
"custom_event_name": "Користувацька назва події",
|
||||
"custom_event_name_description": "Вибирайте для заходів власні назви, що показуватимуться в календарі",
|
||||
"2fa_required": "Необхідна двоетапна автентифікація",
|
||||
"incorrect_2fa": "Неправильний код двоетапної автентифікації",
|
||||
"which_event_type_apply": "До якого типу заходів це застосовуватиметься?",
|
||||
"no_workflows_description": "Робочі процеси – це проста автоматизація сповіщень і нагадувань, що дає вам змогу будувати процеси, пов’язані з вашими заходами.",
|
||||
"create_workflow": "Створити робочий процес",
|
||||
"do_this": "Зробити це",
|
||||
"turn_off": "Вимкнути",
|
||||
"settings_updated_successfully": "Параметри оновлено",
|
||||
"error_updating_settings": "Помилка оновлення параметрів",
|
||||
"personal_cal_url": "Моя персональна URL-адреса Cal",
|
||||
"bio_hint": "Кілька речень про вас. Ця інформація з’явиться на сторінці за вашою URL-адресою.",
|
||||
"delete_account_modal_title": "Видалення облікового запису",
|
||||
"confirm_delete_account_modal": "Справді видалити свій обліковий запис Cal.com?",
|
||||
"delete_my_account": "Видалити мій обліковий запис",
|
||||
"start_of_week": "Початок тижня",
|
||||
"select_calendars": "Виберіть, які календарі потрібно перевірити на наявність конфліктів, щоб уникнути подвійних бронювань.",
|
||||
"check_for_conflicts": "Перевірка конфліктів",
|
||||
"adding_events_to": "Додавання подій у",
|
||||
"follow_system_preferences": "Відповідно до системних параметрів",
|
||||
"custom_brand_colors": "Користувацькі брендові кольори",
|
||||
"customize_your_brand_colors": "Налаштуйте власний брендовий колір на сторінці бронювання.",
|
||||
"pro": "Pro",
|
||||
"removes_cal_branding": "Вилучення будь-яких пов’язаних із Cal брендингових надписів, як-от «На платформі Cal».",
|
||||
"profile_picture": "Зображення профілю",
|
||||
"upload": "Завантажити",
|
||||
"web3": "Web3",
|
||||
"rainbow_token_gated": "Цей тип заходу підтримує доступ тільки для власників токенів.",
|
||||
"rainbow_connect_wallet_gate": "Якщо у вас є <1>{{name}}</1> (<3>{{symbol}}</3>), підключіть свій гаманець.",
|
||||
"rainbow_insufficient_balance": "У вашому підключеному гаманці бракує <1>{{symbol}}</1>.",
|
||||
"rainbow_sign_message_request": "Підпишіть запит на надсилання повідомлень у своєму гаманці.",
|
||||
"rainbow_signature_error": "Сталася помилка запиту на підпис від вашого гаманця.",
|
||||
"token_address": "Адреса токена",
|
||||
"blockchain": "Блокчейн",
|
||||
"old_password": "Старий пароль",
|
||||
"secure_password": "Ваш новий суперзахищений пароль",
|
||||
"error_updating_password": "Помилка оновлення пароля",
|
||||
"two_factor_auth": "Двоетапна автентифікація",
|
||||
"recurring_event_tab_description": "Налаштування розкладу з повторюваними заходами",
|
||||
"today": "сьогодні",
|
||||
"appearance": "Зовнішній вигляд",
|
||||
"appearance_subtitle": "Налаштовуйте вигляд бронювання",
|
||||
"my_account": "Мій обліковий запис",
|
||||
"general": "Загальні",
|
||||
"calendars": "Календарі",
|
||||
"2fa_auth": "Двоетапна перевірка",
|
||||
"invoices": "Рахунки-фактури",
|
||||
"embeds": "Вбудовування",
|
||||
"impersonation": "Вхід від імені користувача",
|
||||
"users": "Користувачі",
|
||||
"profile_description": "Керуйте налаштуваннями свого профілю cal",
|
||||
"general_description": "Керуйте налаштуваннями мови та часового поясу",
|
||||
"calendars_description": "Налаштуйте, як типи заходів мають взаємодіяти з вашими календарями",
|
||||
"appearance_description": "Налаштовуйте вигляд бронювання",
|
||||
"conferencing_description": "Керуйте додатками для відеоконференцій і нарад",
|
||||
"password_description": "Керуйте налаштуваннями паролів облікових записів",
|
||||
"2fa_description": "Керуйте налаштуваннями паролів облікових записів",
|
||||
"we_just_need_basic_info": "Щоб налаштувати ваш профіль, нам потрібні базові відомості.",
|
||||
"skip": "Пропустити",
|
||||
"do_this_later": "Зробити це пізніше",
|
||||
"set_availability_getting_started_subtitle_1": "Укажіть, у які проміжки часу ви доступні",
|
||||
"set_availability_getting_started_subtitle_2": "Усе це можна налаштувати пізніше на сторінці «Доступність».",
|
||||
"connect_calendars_from_app_store": "Ви можете додати більше календарів з магазину додатків",
|
||||
"connect_conference_apps": "Підключити додатки для конференцій",
|
||||
"connect_calendar_apps": "Підключити додатки календарів",
|
||||
"connect_payment_apps": "Підключити платіжні додатки",
|
||||
"connect_other_apps": "Підключити інші додатки",
|
||||
"current_step_of_total": "Крок {{currentStep}} із {{maxSteps}}",
|
||||
"add_variable": "Додати змінну",
|
||||
"custom_phone_number": "Користувацький номер телефону",
|
||||
"message_template": "Шаблон повідомлення",
|
||||
"email_subject": "Тема листа",
|
||||
"add_dynamic_variables": "Додати динамічні текстові змінні",
|
||||
"event_name_info": "Назва типу заходу",
|
||||
"event_date_info": "Дата заходу",
|
||||
"event_time_info": "Час початку заходу",
|
||||
"location_info": "Місце проведення заходу",
|
||||
"organizer_name_info": "Ваше ім’я",
|
||||
"additional_notes_info": "Додаткові примітки щодо бронювання",
|
||||
"attendee_name_info": "Ім’я того, хто бронює",
|
||||
"to": "Кому",
|
||||
"attendee_required_enter_number": "Під час бронювання відвідувачу потрібно буде ввести номер телефону",
|
||||
"workflow_turned_on_successfully": "Робочий процес «{{workflowName}}» {{offOn}}",
|
||||
"download_responses": "Завантажити відповіді",
|
||||
"create_your_first_form": "Створіть свою першу форму",
|
||||
"create_your_first_form_description": "Форми маршрутизації дають змогу запитувати уточнювальні запитання та переходити до відповідної особи або типу заходу.",
|
||||
"create_your_first_webhook": "Створіть свій перший вебгук",
|
||||
"create_your_first_webhook_description": "Завдяки вебгукам ви можете отримувати дані про наради в реальному часі, коли на Cal.com щось стається.",
|
||||
"for_a_maximum_of": "На максимум",
|
||||
"event_one": "захід",
|
||||
"event_other": "заходи",
|
||||
"profile_team_description": "Керуйте налаштуваннями свого профілю команди",
|
||||
"members_team_description": "Користувачі в цій групі",
|
||||
"team_url": "URL-адреса команди",
|
||||
"delete_team": "Видалити команду",
|
||||
"team_members": "Учасники команди",
|
||||
"more": "Більше",
|
||||
"more_page_footer": "Додаток для мобільних пристроїв ми вважаємо розширенням вебдодатку. Якщо вам потрібно виконувати складні дії, скористайтеся саме останнім.",
|
||||
"workflow_example_1": "Надсилати відвідувачу нагадування про захід в SMS-повідомленні за 24 години до початку",
|
||||
"workflow_example_2": "Надсилати відвідувачу користувацьке SMS-повідомлення, якщо захід перенесено",
|
||||
"workflow_example_3": "Надсилати ведучому користувацький електронний лист, якщо бронюється новий захід",
|
||||
"workflow_example_4": "Надсилати відвідувачу нагадування про захід в електронному листі за 1 годину до початку",
|
||||
"workflow_example_5": "Надсилати ведучому користувацький електронний лист, якщо захід перенесено",
|
||||
"workflow_example_6": "Надсилати ведучому користувацьке SMS-повідомлення, якщо бронюється новий захід",
|
||||
"welcome_to_cal_header": "Вітаємо в Cal.com!",
|
||||
"edit_form_later_subtitle": "Це можна буде змінити пізніше.",
|
||||
"connect_calendar_later": "Я підключу календар пізніше",
|
||||
"set_my_availability_later": "Я вкажу дані про доступність пізніше",
|
||||
"problem_saving_user_profile": "Під час збереження даних виникла проблема. Повторіть спробу або зверніться в службу підтримки.",
|
||||
"purchase_missing_seats": "Придбати відсутні місця",
|
||||
"slot_length": "Тривалість вікна",
|
||||
"booking_appearance": "Вигляд бронювання",
|
||||
"appearance_team_description": "Налаштовуйте вигляд бронювання своєї команди",
|
||||
"only_owner_change": "Змінювати бронювання команди може лише її власник ",
|
||||
"team_disable_cal_branding_description": "Вилучення будь-яких пов’язаних із Cal брендингових надписів, як-от «На платформі Cal»",
|
||||
"invited_by_team": "{{teamName}} запросив(-ла) вас приєднатися до його або її команди в такій ролі: {{role}}",
|
||||
"token_invalid_expired": "Токен недійсний або застарілий.",
|
||||
"exchange_add": "Підключитися до Microsoft Exchange",
|
||||
"exchange_authentication": "Метод автентифікації",
|
||||
"exchange_authentication_standard": "Проста автентифікація",
|
||||
"exchange_authentication_ntlm": "Автентифікація NTLM",
|
||||
"exchange_compression": "Стиснення GZip",
|
||||
"routing_forms_description": "Тут наведено всі створені форми та маршрути.",
|
||||
"add_new_form": "Додати форму",
|
||||
"form_description": "Створіть власну форму для маршрутизації автора бронювання",
|
||||
"copy_link_to_form": "Копіювати посилання на форму",
|
||||
"theme": "Тема",
|
||||
"theme_applies_note": "Застосовується тільки до ваших загальнодоступних сторінок бронювання",
|
||||
"theme_light": "Світла",
|
||||
"theme_dark": "Темна"
|
||||
"theme_dark": "Темна",
|
||||
"theme_system": "Стандартне системне значення",
|
||||
"add_a_team": "Додати команду",
|
||||
"saml_config": "Конфігурація SAML",
|
||||
"add_webhook_description": "Отримуйте дані про наради в реальному часі, коли на Cal.com щось стається",
|
||||
"triggers_when": "Спрацьовує в таких випадках",
|
||||
"test_webhook": "Перш ніж створювати, виконайте ping-тест.",
|
||||
"enable_webhook": "Увімкнути вебгук",
|
||||
"add_webhook": "Додати вебгук",
|
||||
"webhook_edited_successfully": "Вебгук збережено",
|
||||
"webhooks_description": "Отримуйте дані про наради в реальному часі, коли на Cal.com щось стається",
|
||||
"api_keys_description": "Створюйте ключі API, щоб отримувати доступ до свого облікового запису",
|
||||
"new_api_key": "Новий ключ API",
|
||||
"active": "Активний",
|
||||
"api_key_updated": "Назву ключа API оновлено",
|
||||
"api_key_update_failed": "Помилка оновлення назви ключа API",
|
||||
"embeds_title": "Вбудовування iframe HTML",
|
||||
"embeds_description": "Вбудовайте події всіх типів у свій вебсайт",
|
||||
"create_first_api_key": "Створіть свій перший ключ API",
|
||||
"create_first_api_key_description": "Ключі API дають іншим додаткам змогу обмінюватися даними з Cal.com",
|
||||
"back_to_signin": "Повернутися до входу",
|
||||
"reset_link_sent": "Посилання для скидання надіслано",
|
||||
"password_reset_email": "Електронний лист з інструкціями зі скидання пароля надіслано на {{email}}.",
|
||||
"password_updated": "Пароль оновлено!",
|
||||
"pending_payment": "Очікується оплата",
|
||||
"confirmation_page_rainbow": "Увімкніть доступ до свого заходу тільки для власників звичайних або невзаємозамінних токенів Ethereum, Polygon тощо.",
|
||||
"not_on_cal": "Не на Cal.com",
|
||||
"no_calendar_installed": "Немає встановлених календарів",
|
||||
"no_calendar_installed_description": "Ви ще не підключили свої календарі",
|
||||
"add_a_calendar": "Додати календар",
|
||||
"change_email_hint": "Щоб зміни почали діяти, можливо, знадобиться вийти із системи та ввійти знову",
|
||||
"confirm_password_change_email": "Перш ніж змінювати адресу електронної пошти, підтвердьте свій пароль",
|
||||
"seats": "місця",
|
||||
"every_app_published": "Усі додатки, опубліковані в магазині Cal.com, мають відкритий код і ретельно перевіряються учасниками спільноти. Утім, Cal.com, Inc. рекомендує та сертифікує лише додатки, опубліковані компанією Cal.com. Якщо ви натрапили на неприйнятний вміст або поведінку, надішліть нам скаргу.",
|
||||
"report_app": "Поскаржитися на додаток",
|
||||
"billing_manage_details_title": "Переглядайте свої дані для виставлення рахунків і керуйте ними",
|
||||
"billing_manage_details_description": "Тут ви можете переглянути й відредагувати свої дані для виставлення рахунків, а також скасувати підписку.",
|
||||
"billing_help_title": "Потрібно щось інше?",
|
||||
"billing_help_description": "Якщо вам потрібна додаткова допомога з виставленням рахунків, наша служба підтримки готова її надати."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "Sử dụng đường link dưới đây để thay đổi mật khẩu của bạn",
|
||||
"hey_there": "Xin chào,",
|
||||
"forgot_your_password_calcom": "Quên mật khẩu của bạn? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | Loại Sự Kiện",
|
||||
"delete_webhook_confirmation_message": "Bạn có chắc bạn muốn xoá webhook này? Bạn sẽ không còn nhận dữ liệu cuộc họp Cal.com tại đường URL này, trong thời gian thực, khi một sự kiện được lên lịch hoặc huỷ.",
|
||||
"confirm_delete_webhook": "Vâng, hãy xoá webhook",
|
||||
"edit_webhook": "Chỉnh Webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "Thanh toán",
|
||||
"manage_your_billing_info": "Quản lý thông tin thanh toán của bạn và hủy đăng ký của bạn.",
|
||||
"availability": "Lịch khả dụng",
|
||||
"availability_title": "{{availabilityTitle}} | Tình trạng trống lịch",
|
||||
"edit_availability": "Sửa tình trạng trống lịch",
|
||||
"configure_availability": "Định cấu hình thời gian mà mọi người có thể đặt lịch hẹn.",
|
||||
"copy_times_to": "Sao chép thời gian đến",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "Chuyển hướng khi đặt lịch hẹn ",
|
||||
"you_are_being_redirected": "Bạn sẽ được chuyển hướng đến {{ url }} sau $t(second, {\"count\": {{seconds}} }).",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "Để sử dụng tính năng này, bạn cần nâng cấp lên tài khoản Pro.",
|
||||
"duplicate": "Sao chép",
|
||||
"offer_seats": "Cung cấp ghế ngồi",
|
||||
"offer_seats_description": "Cung ứng chỗ cho lịch hẹn (Cái này sẽ vô hiệu hoá khách & lịch hẹn tham gia)",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "Vui lòng xác nhận mật khẩu của bạn trước khi đổi địa chỉ email",
|
||||
"seats": "ghế",
|
||||
"every_app_published": "Mọi ứng dụng được công bố trên Cal.com App Store là dạng mã nguồn mở và được kiểm nghiệm kĩ càng thông qua khâu bình duyệt ngang hàng. Dẫu vậy, Cal.com, Inc. không công nhận hay chứng nhận những ứng dụng nếu chúng không do Cal.com công bố. Nếu bạn gặp nội dụng hay hành vi không đúng mực nào, vui lòng báo cáo vụ việc.",
|
||||
"report_app": "Báo cáo ứng dụng"
|
||||
"report_app": "Báo cáo ứng dụng",
|
||||
"billing_manage_details_title": "Xem và quản lý chi tiết thanh toán của bạn",
|
||||
"billing_manage_details_description": "Xem và chỉnh sửa chi tiết thanh toán của bạn, cũng như hủy đăng ký gói của bạn.",
|
||||
"billing_help_title": "Cần gì nữa không?",
|
||||
"billing_help_description": "Nếu bạn cần thêm bất kỳ trợ giúp nào về thanh toán, nhóm hỗ trợ của chúng tôi luôn sẵn sàng trợ giúp."
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "使用下面的链接重置您的密码",
|
||||
"hey_there": "嘿,您好!",
|
||||
"forgot_your_password_calcom": "忘记密码?- Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | 活动类型",
|
||||
"delete_webhook_confirmation_message": "您确定要删除此Webhook吗?当活动被安排或取消时,您将不再会在指定的链接收到 Cal.com 实时提供的会议数据。",
|
||||
"confirm_delete_webhook": "是,删除 Webhook",
|
||||
"edit_webhook": "编辑 Webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "计费",
|
||||
"manage_your_billing_info": "管理您的账单信息和取消您的订阅。",
|
||||
"availability": "可预约时间",
|
||||
"availability_title": "{{availabilityTitle}} | 可预约时间",
|
||||
"edit_availability": "编辑可预约时间",
|
||||
"configure_availability": "配置您可预约的时间。",
|
||||
"copy_times_to": "复制时间到",
|
||||
@@ -651,7 +649,7 @@
|
||||
"event_name_tooltip": "在日历中显示的名称",
|
||||
"meeting_with_user": "与 {ATTENDEE} 的会议",
|
||||
"additional_inputs": "更多输入框",
|
||||
"additional_input_description": "在确认预约之前,需要调度员输入额外的信息",
|
||||
"additional_input_description": "在确认预约之前,需要预约者输入额外的信息",
|
||||
"label": "标签",
|
||||
"placeholder": "占位符",
|
||||
"type": "类型",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "预约时重定向",
|
||||
"you_are_being_redirected": "您将在 $t(second, {\"count\": {{seconds}} }) 秒后重定向到 {{ url }}。",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "要使用此功能,您需要升级到专业版帐户。",
|
||||
"duplicate": "复制",
|
||||
"offer_seats": "提供位置",
|
||||
"offer_seats_description": "提供位置以供预约(这将禁止访客并选择预约)",
|
||||
@@ -1192,7 +1189,7 @@
|
||||
"create_your_first_form_description": "利用途径表格,您可以提出符合条件的问题并为正确的人或活动类型选择途径。",
|
||||
"create_your_first_webhook": "创建您的第一个 Webhook",
|
||||
"create_your_first_webhook_description": "通过 Webhook,当 Cal.com 上发生事件时,您可以实时接收会议数据。",
|
||||
"for_a_maximum_of": "最大",
|
||||
"for_a_maximum_of": "最多",
|
||||
"event_one": "活动",
|
||||
"event_other": "活动",
|
||||
"profile_team_description": "管理团队资料的设置",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "请在更改电子邮件地址之前确认密码",
|
||||
"seats": "位置",
|
||||
"every_app_published": "Cal.com 应用商店上发布的每个应用都是开源的,并通过同行评审进行了全面测试。尽管如此,除非应用是由 Cal.com 发布的,否则 Cal.com, Inc. 不认可或认证这些应用。如果您遇到不当内容或行为,请举报。",
|
||||
"report_app": "报告应用"
|
||||
"report_app": "报告应用",
|
||||
"billing_manage_details_title": "查看和管理您的账单详情",
|
||||
"billing_manage_details_description": "查看和编辑您的账单详情,以及取消订阅。",
|
||||
"billing_help_title": "还有其他需要?",
|
||||
"billing_help_description": "如果您在支付帐单时需要任何进一步的帮助,我们的支持团队会给您提供帮助。"
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@
|
||||
"use_link_to_reset_password": "使用以下連結重置密碼",
|
||||
"hey_there": "哈囉,",
|
||||
"forgot_your_password_calcom": "忘記密碼了? - Cal.com",
|
||||
"event_type_title": "{{eventTypeTitle}} | 活動類型",
|
||||
"delete_webhook_confirmation_message": "您確定要刪除這組 Webhook 嗎?之後活動預定或取消的時候,您就不會即時經特定連結收到 Cal.com 的會議資料。",
|
||||
"confirm_delete_webhook": "是的,刪除 Webhook",
|
||||
"edit_webhook": "編輯 Webhook",
|
||||
@@ -633,7 +632,6 @@
|
||||
"billing": "付費",
|
||||
"manage_your_billing_info": "管理付費資訊,以及取消訂閱。",
|
||||
"availability": "開放時間",
|
||||
"availability_title": "{{availabilityTitle}} | 開放時間",
|
||||
"edit_availability": "編輯開放時間",
|
||||
"configure_availability": "設定開放接受預約的時段。",
|
||||
"copy_times_to": "將時間複製到",
|
||||
@@ -839,7 +837,6 @@
|
||||
"redirect_success_booking": "在預約時重新導向 ",
|
||||
"you_are_being_redirected": "將於 $t(second, {\"count\": {{seconds}} }) 秒後將您重新導向至 {{ url }}。",
|
||||
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
|
||||
"redirect_url_upgrade_description": "您必須升級至專業版帳號才能使用此功能。",
|
||||
"duplicate": "複製",
|
||||
"offer_seats": "提供座位",
|
||||
"offer_seats_description": "為預約提供席次 (這將停用賓客和主動加入的預約)",
|
||||
@@ -1267,5 +1264,9 @@
|
||||
"confirm_password_change_email": "請先確認密碼,再變更電子郵件地址",
|
||||
"seats": "座位",
|
||||
"every_app_published": "Cal.com App Store 上發佈的每個應用程式皆為開放原始碼,並經過同業審查仔細測試過。不過除了 Cal.com 發佈的應用程式外,Cal.com, Inc. 無法為其他應用程式背書或提出擔保。若您發現這些應用程式有不當內容或行為,請立即回報。",
|
||||
"report_app": "回報應用程式"
|
||||
"report_app": "回報應用程式",
|
||||
"billing_manage_details_title": "檢視與管理付費細節",
|
||||
"billing_manage_details_description": "檢視與編輯付費細節,以及取消訂閱。",
|
||||
"billing_help_title": "還要什麼嗎?",
|
||||
"billing_help_description": "如果有關於付費的進一步需求,我們的支援團隊隨時上前幫忙。"
|
||||
}
|
||||
|
||||
@@ -99,7 +99,7 @@ html.todesktop nav a[aria-current="page"]{
|
||||
|
||||
html.todesktop nav a svg{
|
||||
color: #0272F7 !important
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
@@ -153,11 +153,11 @@ button[role="switch"][data-state="checked"] {
|
||||
}
|
||||
/* TODO: avoid global specific css */
|
||||
/* button[role="switch"][data-state="checked"] span {
|
||||
transform: translateX(16px);
|
||||
transform: translateX(16px);
|
||||
} */
|
||||
|
||||
/* DateRangePicker */
|
||||
/*
|
||||
/*
|
||||
TODO:: Remove on V2 launch
|
||||
*/
|
||||
.react-daterange-picker > .react-daterange-picker__wrapper {
|
||||
@@ -197,11 +197,6 @@ button[role="switch"][data-state="checked"] {
|
||||
box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
/* React Select V2 */
|
||||
.cal-react-select-container .cal-react-select__control {
|
||||
@apply bg-white min-h-[36px] h-[36px] text-sm leading-4 border-gray-300 hover:border-neutral-400 focus-within:ring-2 focus-within:ring-neutral-800 focus-within:border-0 placeholder:text-gray-400 placeholder:text-sm placeholder:font-normal;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* !important to style multi-email input */
|
||||
@@ -344,6 +339,10 @@ button[role="switch"][data-state="checked"] {
|
||||
animation: loader-inner 2s infinite ease-in;
|
||||
}
|
||||
|
||||
.no-ring-inset {
|
||||
--tw-ring-inset: unset;
|
||||
}
|
||||
|
||||
@keyframes loader {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
@@ -482,3 +481,18 @@ hr {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes sure h-screen works on mobile Safari. By default h-screen
|
||||
* does not take into account the height of the address bar, causing
|
||||
* weird behaviour when scrolling — sometimes the height will be correct
|
||||
* and sometimes it won't, depending on whether the address bar is
|
||||
* in 'collapsed' state or not.
|
||||
* @see: https://benborgers.com/posts/tailwind-h-screen
|
||||
*/
|
||||
@supports (-webkit-touch-callout: none) {
|
||||
.h-screen {
|
||||
height: -webkit-fill-available;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
Submodule apps/website updated: 3b9c54ba62...b59ae88a2e
@@ -54,9 +54,15 @@ const config: Config = {
|
||||
displayName: "@calcom/api",
|
||||
roots: ["<rootDir>/apps/api"],
|
||||
testMatch: ["**/test/lib/**/*.(spec|test).(ts|tsx|js)"],
|
||||
setupFilesAfterEnv: ["<rootDir>/tests/config/singleton.ts"],
|
||||
transform: {
|
||||
"^.+\\.ts?$": "ts-jest",
|
||||
},
|
||||
globals: {
|
||||
"ts-jest": {
|
||||
tsconfig: "<rootDir>/apps/api/tsconfig.json",
|
||||
},
|
||||
},
|
||||
transformIgnorePatterns: ["/node_modules/", "^.+\\.module\\.(css|sass|scss)$"],
|
||||
testEnvironment: "node",
|
||||
clearMocks: true,
|
||||
|
||||
@@ -119,11 +119,11 @@ const BaseAppFork = {
|
||||
fs.writeFileSync(`${appDirPath}/config.json`, JSON.stringify(config, null, 2));
|
||||
fs.writeFileSync(
|
||||
`${appDirPath}/README.mdx`,
|
||||
fs.readFileSync(`${appDirPath}/README.mdx`).toString().replace("_DESCRIPTION_", appDescription)
|
||||
);
|
||||
fs.writeFileSync(
|
||||
`${appDirPath}/README.mdx`,
|
||||
fs.readFileSync(`${appDirPath}/README.mdx`).toString().replace("_DESCRIPTION_", appDescription)
|
||||
fs
|
||||
.readFileSync(`${appDirPath}/README.mdx`)
|
||||
.toString()
|
||||
.replace(/_DESCRIPTION_/g, appDescription)
|
||||
.replace(/_APP_DIR_/g, slug)
|
||||
);
|
||||
message = !editMode ? "Forked base app" : "Updated app";
|
||||
yield message;
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
---
|
||||
description: _DESCRIPTION_
|
||||
items:
|
||||
- /api/app-store/_APP_DIR_/1.jpg
|
||||
- /api/app-store/_APP_DIR_/2.jpg
|
||||
- /api/app-store/_APP_DIR_/3.jpg
|
||||
---
|
||||
{/* Feel free to edit description or add other frontmatter. Frontmatter would be available in the components here as variables by same name */}
|
||||
|
||||
<div>
|
||||
<Slider items={items} />
|
||||
|
||||
{description}
|
||||
</div>
|
||||
<hr />
|
||||
<div style={{color:"gray", fontStyle:"italic"}} >
|
||||
<div>Edit README.mdx file to update the content.</div>
|
||||
<div>Edit config.json to update logo </div>
|
||||
</div>
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 365 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 394 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 394 KiB |
@@ -1,4 +1,4 @@
|
||||
import { useMutation } from "react-query";
|
||||
import { useMutation } from "@tanstack/react-query";
|
||||
|
||||
import type { IntegrationOAuthCallbackState } from "@calcom/app-store/types";
|
||||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
|
||||
@@ -9,4 +9,10 @@ items:
|
||||
|
||||
<Slider items={items} />
|
||||
|
||||
Close is the inside sales CRM of choice for startups and SMBs. Make more calls, send more emails and close more deals starting today.
|
||||
- Close is a modern CRM with build-in sales communication tools for email, phone, SMS, and meetings.
|
||||
- Automate the sales process by enrolling leads and contacts into sequences.
|
||||
- Track the entire sales process and performance with powerful activity and funnel reporting
|
||||
|
||||
Close.com subscriptions range from $29 - $149 per month. <a href="https://www.close.com/pricing" target="_blank">See pricing page</a>
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user