Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d73d0ebb6e | ||
|
|
a3971c127b | ||
|
|
912d3cf5b2 | ||
|
|
73c35ba5a2 | ||
|
|
55f1019908 | ||
|
|
863fc695ec | ||
|
|
d931fb1f9c | ||
|
|
fd054dfb8d | ||
|
|
699e08b2ee | ||
|
|
e1228ca03c | ||
|
|
9ad69c20cf | ||
|
|
9a5efd39ce | ||
|
|
497b0804d3 | ||
|
|
8b50f419e5 | ||
|
|
9208827406 | ||
|
|
8891381d89 | ||
|
|
ab39f0c8b6 | ||
|
|
cd2382e091 | ||
|
|
154c54a2aa | ||
|
|
e949a4c529 | ||
|
|
64b321ac9c | ||
|
|
e90e060739 | ||
|
|
123074f4ba | ||
|
|
8115c86e37 | ||
|
|
92a48b466c | ||
|
|
7a4298dc00 | ||
|
|
3d379c65e8 | ||
|
|
b1d509ba30 | ||
|
|
6360e73901 | ||
|
|
7e44e686e8 | ||
|
|
0b914bef79 | ||
|
|
a48d190af3 | ||
|
|
c21f0caecf | ||
|
|
1f42a152b0 | ||
|
|
b8f0cc6fa1 | ||
|
|
c6f84e6c4b | ||
|
|
9c3f4ec055 | ||
|
|
f0cfbede7e | ||
|
|
e2a825a9a0 | ||
|
|
963a2a0b76 | ||
|
|
4037367f8c | ||
|
|
0b3b268eed | ||
|
|
2acb5559dc | ||
|
|
be1c6eb65c | ||
|
|
feefa26c90 | ||
|
|
2c25f88100 | ||
|
|
2be9fc8bc0 | ||
|
|
5927b42560 | ||
|
|
5726d18027 | ||
|
|
3312d9cfc6 | ||
|
|
c140b01548 | ||
|
|
c2085c6be9 | ||
|
|
b8b9d04897 | ||
|
|
4497c4ce0b | ||
|
|
cd06141816 | ||
|
|
013646bf2c | ||
|
|
12bbbe3617 | ||
|
|
2c7c9fd716 | ||
|
|
11fc2a738a | ||
|
|
44ab25b4a0 | ||
|
|
4a2c0cb164 | ||
|
|
b1d9e2b84c | ||
|
|
47b9e8a8ac | ||
|
|
42265021fe | ||
|
|
0b0fee3985 | ||
|
|
5718cc5e17 | ||
|
|
361889ded7 | ||
|
|
2260ddcebc | ||
|
|
80c3b91077 | ||
|
|
a11cf130bf |
@@ -0,0 +1,41 @@
|
||||
# This is just to test this file
|
||||
name: Build
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build Docs
|
||||
permissions:
|
||||
contents: read
|
||||
runs-on: buildjet-2vcpu-ubuntu-2204
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/dangerous-git-checkout
|
||||
- name: Cache Docs build
|
||||
uses: buildjet/cache@v4
|
||||
id: cache-docs-build
|
||||
env:
|
||||
cache-name: docs-build
|
||||
key-1: ${{ hashFiles('yarn.lock') }}
|
||||
key-2: ${{ hashFiles('docs/**.*', '!**/node_modules') }}
|
||||
key-3: ${{ github.event.pull_request.number || github.ref }}
|
||||
key-4: ${{ github.sha }}
|
||||
with:
|
||||
path: |
|
||||
**/docs/**
|
||||
key: ${{ runner.os }}-${{ env.cache-name }}-${{ env.key-1 }}-${{ env.key-2 }}-${{ env.key-3 }}-${{ env.key-4 }}
|
||||
- name: Run build
|
||||
working-directory: docs
|
||||
run: |
|
||||
export NODE_OPTIONS="--max_old_space_size=8192"
|
||||
if [ ${{ steps.cache-docs-build.outputs.cache-hit }} == 'true' ]; then
|
||||
echo "Cache hit for Docs build. Skipping build."
|
||||
else
|
||||
npm install -g mintlify
|
||||
mintlify dev &
|
||||
sleep 5 # Let it run for 5 seconds
|
||||
kill $!
|
||||
fi
|
||||
shell: bash
|
||||
@@ -33,7 +33,7 @@ jobs:
|
||||
with:
|
||||
filters: |
|
||||
has-files-requiring-all-checks:
|
||||
- "!(**.md|.github/CODEOWNERS)"
|
||||
- "!(**.md|.github/CODEOWNERS|docs/**|apps/web/public/static/locales/**/common.json)"
|
||||
- name: Get Latest Commit SHA
|
||||
id: get_sha
|
||||
run: |
|
||||
@@ -139,6 +139,13 @@ jobs:
|
||||
uses: ./.github/workflows/atoms-production-build.yml
|
||||
secrets: inherit
|
||||
|
||||
build-docs:
|
||||
name: Production builds
|
||||
needs: [changes, check-label, deps]
|
||||
if: ${{ needs.check-label.outputs.run-e2e == 'true' && needs.changes.outputs.has-files-requiring-all-checks == 'true' }}
|
||||
uses: ./.github/workflows/docs-build.yml
|
||||
secrets: inherit
|
||||
|
||||
build:
|
||||
name: Production builds
|
||||
needs: [changes, check-label, deps]
|
||||
@@ -225,6 +232,7 @@ jobs:
|
||||
build-api-v1,
|
||||
build-api-v2,
|
||||
build-atoms,
|
||||
build-docs,
|
||||
e2e,
|
||||
e2e-api-v2,
|
||||
e2e-embed,
|
||||
|
||||
@@ -39,7 +39,7 @@ env:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Web App
|
||||
name: Build Web App
|
||||
runs-on: buildjet-4vcpu-ubuntu-2204
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { z } from "zod";
|
||||
|
||||
import { emailSchema } from "@calcom/lib/emailSchema";
|
||||
import { _AttendeeModel as Attendee } from "@calcom/prisma/zod";
|
||||
|
||||
import { timeZone } from "~/lib/validations/shared/timeZone";
|
||||
@@ -14,7 +15,7 @@ export const schemaAttendeeBaseBodyParams = Attendee.pick({
|
||||
const schemaAttendeeCreateParams = z
|
||||
.object({
|
||||
bookingId: z.number().int(),
|
||||
email: z.string().email(),
|
||||
email: emailSchema,
|
||||
name: z.string(),
|
||||
timeZone: timeZone,
|
||||
})
|
||||
@@ -23,7 +24,7 @@ const schemaAttendeeCreateParams = z
|
||||
const schemaAttendeeEditParams = z
|
||||
.object({
|
||||
name: z.string().optional(),
|
||||
email: z.string().email().optional(),
|
||||
email: emailSchema.optional(),
|
||||
timeZone: timeZone.optional(),
|
||||
})
|
||||
.strict();
|
||||
|
||||
@@ -1,16 +1,18 @@
|
||||
import { withValidation } from "next-validations";
|
||||
import { z } from "zod";
|
||||
|
||||
import { emailSchema } from "@calcom/lib/emailSchema";
|
||||
|
||||
import { baseApiParams } from "./baseApiParams";
|
||||
|
||||
// Extracted out as utility function so can be reused
|
||||
// at different endpoints that require this validation.
|
||||
export const schemaQueryAttendeeEmail = baseApiParams.extend({
|
||||
attendeeEmail: z.string().email(),
|
||||
attendeeEmail: emailSchema,
|
||||
});
|
||||
|
||||
export const schemaQuerySingleOrMultipleAttendeeEmails = z.object({
|
||||
attendeeEmail: z.union([z.string().email(), z.array(z.string().email())]).optional(),
|
||||
attendeeEmail: z.union([emailSchema, z.array(emailSchema)]).optional(),
|
||||
});
|
||||
|
||||
export const withValidQueryAttendeeEmail = withValidation({
|
||||
|
||||
@@ -1,16 +1,18 @@
|
||||
import { withValidation } from "next-validations";
|
||||
import { z } from "zod";
|
||||
|
||||
import { emailSchema } from "@calcom/lib/emailSchema";
|
||||
|
||||
import { baseApiParams } from "./baseApiParams";
|
||||
|
||||
// Extracted out as utility function so can be reused
|
||||
// at different endpoints that require this validation.
|
||||
export const schemaQueryUserEmail = baseApiParams.extend({
|
||||
email: z.string().email(),
|
||||
email: emailSchema,
|
||||
});
|
||||
|
||||
export const schemaQuerySingleOrMultipleUserEmails = z.object({
|
||||
email: z.union([z.string().email(), z.array(z.string().email())]),
|
||||
email: z.union([emailSchema, z.array(emailSchema)]),
|
||||
});
|
||||
|
||||
export const withValidQueryUserEmail = withValidation({
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { z } from "zod";
|
||||
|
||||
import { emailSchema } from "@calcom/lib/emailSchema";
|
||||
import { checkUsername } from "@calcom/lib/server/checkUsername";
|
||||
import { _UserModel as User } from "@calcom/prisma/zod";
|
||||
import { iso8601 } from "@calcom/prisma/zod-utils";
|
||||
@@ -92,7 +93,7 @@ export const schemaUserBaseBodyParams = User.pick({
|
||||
// Here we can both require or not (adding optional or nullish) and also rewrite validations for any value
|
||||
// for example making weekStart only accept weekdays as input
|
||||
const schemaUserEditParams = z.object({
|
||||
email: z.string().email().toLowerCase(),
|
||||
email: emailSchema.toLowerCase(),
|
||||
username: usernameSchema,
|
||||
weekStart: z.nativeEnum(weekdays).optional(),
|
||||
brandColor: z.string().min(4).max(9).regex(/^#/).optional(),
|
||||
@@ -115,7 +116,7 @@ const schemaUserEditParams = z.object({
|
||||
// merging both BaseBodyParams with RequiredParams, and omiting whatever we want at the end.
|
||||
|
||||
const schemaUserCreateParams = z.object({
|
||||
email: z.string().email().toLowerCase(),
|
||||
email: emailSchema.toLowerCase(),
|
||||
username: usernameSchema,
|
||||
weekStart: z.nativeEnum(weekdays).optional(),
|
||||
brandColor: z.string().min(4).max(9).regex(/^#/).optional(),
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
"@sentry/nextjs": "^8.8.0",
|
||||
"bcryptjs": "^2.4.3",
|
||||
"memory-cache": "^0.2.0",
|
||||
"next": "^13.5.4",
|
||||
"next": "^13.5.6",
|
||||
"next-api-middleware": "^1.0.1",
|
||||
"next-axiom": "^0.17.0",
|
||||
"next-swagger-doc": "^0.3.6",
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"dependencies": {
|
||||
"@calcom/platform-constants": "*",
|
||||
"@calcom/platform-enums": "*",
|
||||
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.45",
|
||||
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.46",
|
||||
"@calcom/platform-libraries-0.0.2": "npm:@calcom/platform-libraries@0.0.2",
|
||||
"@calcom/platform-types": "*",
|
||||
"@calcom/platform-utils": "*",
|
||||
|
||||
+295
-6
@@ -1018,10 +1018,6 @@ describe("Bookings Endpoints 2024-08-13", () => {
|
||||
});
|
||||
});
|
||||
|
||||
function responseDataIsBooking(data: any): data is BookingOutput_2024_08_13 {
|
||||
return !Array.isArray(data) && typeof data === "object" && data && "id" in data;
|
||||
}
|
||||
|
||||
function responseDataIsRecurranceBooking(data: any): data is RecurringBookingOutput_2024_08_13 {
|
||||
return (
|
||||
!Array.isArray(data) &&
|
||||
@@ -1032,10 +1028,303 @@ describe("Bookings Endpoints 2024-08-13", () => {
|
||||
);
|
||||
}
|
||||
|
||||
function responseDataIsRecurringBooking(data: any): data is RecurringBookingOutput_2024_08_13[] {
|
||||
return Array.isArray(data);
|
||||
afterAll(async () => {
|
||||
await oauthClientRepositoryFixture.delete(oAuthClient.id);
|
||||
await teamRepositoryFixture.delete(organization.id);
|
||||
await userRepositoryFixture.deleteByEmail(user.email);
|
||||
await bookingsRepositoryFixture.deleteAllBookings(user.id, user.email);
|
||||
await app.close();
|
||||
});
|
||||
});
|
||||
|
||||
function responseDataIsBooking(data: any): data is BookingOutput_2024_08_13 {
|
||||
return !Array.isArray(data) && typeof data === "object" && data && "id" in data;
|
||||
}
|
||||
|
||||
function responseDataIsRecurringBooking(data: any): data is RecurringBookingOutput_2024_08_13[] {
|
||||
return Array.isArray(data);
|
||||
}
|
||||
|
||||
describe("Recurring bookings", () => {
|
||||
let app: INestApplication;
|
||||
let organization: Team;
|
||||
|
||||
let userRepositoryFixture: UserRepositoryFixture;
|
||||
let bookingsRepositoryFixture: BookingsRepositoryFixture;
|
||||
let schedulesService: SchedulesService_2024_04_15;
|
||||
let eventTypesRepositoryFixture: EventTypesRepositoryFixture;
|
||||
let oauthClientRepositoryFixture: OAuthClientRepositoryFixture;
|
||||
let oAuthClient: PlatformOAuthClient;
|
||||
let teamRepositoryFixture: TeamRepositoryFixture;
|
||||
|
||||
const userEmail = "bookings-controller-e2e@api.com";
|
||||
let user: User;
|
||||
|
||||
const maxRecurrenceCount = 3;
|
||||
let recurringEventTypeId: number;
|
||||
|
||||
beforeAll(async () => {
|
||||
const moduleRef = await withApiAuth(
|
||||
userEmail,
|
||||
Test.createTestingModule({
|
||||
imports: [AppModule, PrismaModule, UsersModule, SchedulesModule_2024_04_15],
|
||||
})
|
||||
)
|
||||
.overrideGuard(PermissionsGuard)
|
||||
.useValue({
|
||||
canActivate: () => true,
|
||||
})
|
||||
.compile();
|
||||
|
||||
userRepositoryFixture = new UserRepositoryFixture(moduleRef);
|
||||
bookingsRepositoryFixture = new BookingsRepositoryFixture(moduleRef);
|
||||
eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef);
|
||||
oauthClientRepositoryFixture = new OAuthClientRepositoryFixture(moduleRef);
|
||||
teamRepositoryFixture = new TeamRepositoryFixture(moduleRef);
|
||||
schedulesService = moduleRef.get<SchedulesService_2024_04_15>(SchedulesService_2024_04_15);
|
||||
|
||||
organization = await teamRepositoryFixture.create({ name: "organization bookings" });
|
||||
oAuthClient = await createOAuthClient(organization.id);
|
||||
|
||||
user = await userRepositoryFixture.create({
|
||||
email: userEmail,
|
||||
});
|
||||
|
||||
const userSchedule: CreateScheduleInput_2024_04_15 = {
|
||||
name: "working time",
|
||||
timeZone: "Europe/Rome",
|
||||
isDefault: true,
|
||||
};
|
||||
await schedulesService.createUserSchedule(user.id, userSchedule);
|
||||
|
||||
const recurringEvent = await eventTypesRepositoryFixture.create(
|
||||
// note(Lauris): freq 2 means weekly, interval 1 means every week and count 3 means 3 weeks in a row
|
||||
{
|
||||
title: "peer coding recurring",
|
||||
slug: "peer-coding-recurring",
|
||||
length: 60,
|
||||
recurringEvent: { freq: 2, count: maxRecurrenceCount, interval: 1 },
|
||||
},
|
||||
user.id
|
||||
);
|
||||
recurringEventTypeId = recurringEvent.id;
|
||||
|
||||
app = moduleRef.createNestApplication();
|
||||
bootstrap(app as NestExpressApplication);
|
||||
|
||||
await app.init();
|
||||
});
|
||||
|
||||
async function createOAuthClient(organizationId: number) {
|
||||
const data = {
|
||||
logo: "logo-url",
|
||||
name: "name",
|
||||
redirectUris: ["http://localhost:5555"],
|
||||
permissions: 32,
|
||||
};
|
||||
const secret = "secret";
|
||||
|
||||
const client = await oauthClientRepositoryFixture.create(organizationId, data, secret);
|
||||
return client;
|
||||
}
|
||||
|
||||
it("should not create recurring booking with recurrenceCount larger than event type recurrence count", async () => {
|
||||
const recurrenceCount = 1000;
|
||||
|
||||
const body: CreateRecurringBookingInput_2024_08_13 = {
|
||||
start: new Date(Date.UTC(2030, 1, 4, 13, 0, 0)).toISOString(),
|
||||
eventTypeId: recurringEventTypeId,
|
||||
attendee: {
|
||||
name: "Mr Proper Recurring",
|
||||
email: "mr_proper_recurring@gmail.com",
|
||||
timeZone: "Europe/Rome",
|
||||
language: "it",
|
||||
},
|
||||
location: "https://meet.google.com/abc-def-ghi",
|
||||
recurrenceCount,
|
||||
};
|
||||
|
||||
return request(app.getHttpServer())
|
||||
.post("/v2/bookings")
|
||||
.send(body)
|
||||
.set(CAL_API_VERSION_HEADER, VERSION_2024_08_13)
|
||||
.expect(400);
|
||||
});
|
||||
|
||||
it("should create a recurring booking with recurrenceCount smaller than event type recurrence count", async () => {
|
||||
const recurrenceCount = maxRecurrenceCount - 1;
|
||||
const body: CreateRecurringBookingInput_2024_08_13 = {
|
||||
start: new Date(Date.UTC(2030, 1, 4, 13, 0, 0)).toISOString(),
|
||||
eventTypeId: recurringEventTypeId,
|
||||
attendee: {
|
||||
name: "Mr Proper Recurring",
|
||||
email: "mr_proper_recurring@gmail.com",
|
||||
timeZone: "Europe/Rome",
|
||||
language: "it",
|
||||
},
|
||||
location: "https://meet.google.com/abc-def-ghi",
|
||||
recurrenceCount,
|
||||
};
|
||||
|
||||
return request(app.getHttpServer())
|
||||
.post("/v2/bookings")
|
||||
.send(body)
|
||||
.set(CAL_API_VERSION_HEADER, VERSION_2024_08_13)
|
||||
.expect(201)
|
||||
.then(async (response) => {
|
||||
const responseBody: CreateBookingOutput_2024_08_13 = response.body;
|
||||
expect(responseBody.status).toEqual(SUCCESS_STATUS);
|
||||
expect(responseBody.data).toBeDefined();
|
||||
expect(responseDataIsRecurringBooking(responseBody.data)).toBe(true);
|
||||
|
||||
if (responseDataIsRecurringBooking(responseBody.data)) {
|
||||
const data: RecurringBookingOutput_2024_08_13[] = responseBody.data;
|
||||
expect(data.length).toEqual(maxRecurrenceCount - 1);
|
||||
|
||||
const firstBooking = data[0];
|
||||
expect(firstBooking.id).toBeDefined();
|
||||
expect(firstBooking.uid).toBeDefined();
|
||||
expect(firstBooking.hosts[0].id).toEqual(user.id);
|
||||
expect(firstBooking.status).toEqual("accepted");
|
||||
expect(firstBooking.start).toEqual(new Date(Date.UTC(2030, 1, 4, 13, 0, 0)).toISOString());
|
||||
expect(firstBooking.end).toEqual(new Date(Date.UTC(2030, 1, 4, 14, 0, 0)).toISOString());
|
||||
expect(firstBooking.duration).toEqual(60);
|
||||
expect(firstBooking.eventTypeId).toEqual(recurringEventTypeId);
|
||||
expect(firstBooking.attendees[0]).toEqual({
|
||||
name: body.attendee.name,
|
||||
timeZone: body.attendee.timeZone,
|
||||
language: body.attendee.language,
|
||||
absent: false,
|
||||
});
|
||||
expect(firstBooking.location).toEqual(body.location);
|
||||
expect(firstBooking.recurringBookingUid).toBeDefined();
|
||||
expect(firstBooking.absentHost).toEqual(false);
|
||||
|
||||
const secondBooking = data[1];
|
||||
expect(secondBooking.id).toBeDefined();
|
||||
expect(secondBooking.uid).toBeDefined();
|
||||
expect(secondBooking.hosts[0].id).toEqual(user.id);
|
||||
expect(secondBooking.status).toEqual("accepted");
|
||||
expect(secondBooking.start).toEqual(new Date(Date.UTC(2030, 1, 11, 13, 0, 0)).toISOString());
|
||||
expect(secondBooking.end).toEqual(new Date(Date.UTC(2030, 1, 11, 14, 0, 0)).toISOString());
|
||||
expect(secondBooking.duration).toEqual(60);
|
||||
expect(secondBooking.eventTypeId).toEqual(recurringEventTypeId);
|
||||
expect(secondBooking.recurringBookingUid).toBeDefined();
|
||||
expect(secondBooking.attendees[0]).toEqual({
|
||||
name: body.attendee.name,
|
||||
timeZone: body.attendee.timeZone,
|
||||
language: body.attendee.language,
|
||||
absent: false,
|
||||
});
|
||||
expect(secondBooking.location).toEqual(body.location);
|
||||
expect(secondBooking.absentHost).toEqual(false);
|
||||
} else {
|
||||
throw new Error(
|
||||
"Invalid response data - expected recurring booking but received non array response"
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it("should create a recurring booking with recurrenceCount equal to event type recurrence count", async () => {
|
||||
const recurrenceCount = maxRecurrenceCount;
|
||||
const body: CreateRecurringBookingInput_2024_08_13 = {
|
||||
start: new Date(Date.UTC(2030, 1, 4, 13, 0, 0)).toISOString(),
|
||||
eventTypeId: recurringEventTypeId,
|
||||
attendee: {
|
||||
name: "Mr Proper Recurring",
|
||||
email: "mr_proper_recurring@gmail.com",
|
||||
timeZone: "Europe/Rome",
|
||||
language: "it",
|
||||
},
|
||||
location: "https://meet.google.com/abc-def-ghi",
|
||||
recurrenceCount,
|
||||
};
|
||||
|
||||
return request(app.getHttpServer())
|
||||
.post("/v2/bookings")
|
||||
.send(body)
|
||||
.set(CAL_API_VERSION_HEADER, VERSION_2024_08_13)
|
||||
.expect(201)
|
||||
.then(async (response) => {
|
||||
const responseBody: CreateBookingOutput_2024_08_13 = response.body;
|
||||
expect(responseBody.status).toEqual(SUCCESS_STATUS);
|
||||
expect(responseBody.data).toBeDefined();
|
||||
expect(responseDataIsRecurringBooking(responseBody.data)).toBe(true);
|
||||
|
||||
if (responseDataIsRecurringBooking(responseBody.data)) {
|
||||
const data: RecurringBookingOutput_2024_08_13[] = responseBody.data;
|
||||
expect(data.length).toEqual(maxRecurrenceCount);
|
||||
|
||||
const firstBooking = data[0];
|
||||
expect(firstBooking.id).toBeDefined();
|
||||
expect(firstBooking.uid).toBeDefined();
|
||||
expect(firstBooking.hosts[0].id).toEqual(user.id);
|
||||
expect(firstBooking.status).toEqual("accepted");
|
||||
expect(firstBooking.start).toEqual(new Date(Date.UTC(2030, 1, 4, 13, 0, 0)).toISOString());
|
||||
expect(firstBooking.end).toEqual(new Date(Date.UTC(2030, 1, 4, 14, 0, 0)).toISOString());
|
||||
expect(firstBooking.duration).toEqual(60);
|
||||
expect(firstBooking.eventTypeId).toEqual(recurringEventTypeId);
|
||||
expect(firstBooking.attendees[0]).toEqual({
|
||||
name: body.attendee.name,
|
||||
timeZone: body.attendee.timeZone,
|
||||
language: body.attendee.language,
|
||||
absent: false,
|
||||
});
|
||||
expect(firstBooking.location).toEqual(body.location);
|
||||
expect(firstBooking.meetingUrl).toEqual(body.location);
|
||||
expect(firstBooking.recurringBookingUid).toBeDefined();
|
||||
expect(firstBooking.absentHost).toEqual(false);
|
||||
|
||||
const secondBooking = data[1];
|
||||
expect(secondBooking.id).toBeDefined();
|
||||
expect(secondBooking.uid).toBeDefined();
|
||||
expect(secondBooking.hosts[0].id).toEqual(user.id);
|
||||
expect(secondBooking.status).toEqual("accepted");
|
||||
expect(secondBooking.start).toEqual(new Date(Date.UTC(2030, 1, 11, 13, 0, 0)).toISOString());
|
||||
expect(secondBooking.end).toEqual(new Date(Date.UTC(2030, 1, 11, 14, 0, 0)).toISOString());
|
||||
expect(secondBooking.duration).toEqual(60);
|
||||
expect(secondBooking.eventTypeId).toEqual(recurringEventTypeId);
|
||||
expect(secondBooking.recurringBookingUid).toBeDefined();
|
||||
expect(secondBooking.attendees[0]).toEqual({
|
||||
name: body.attendee.name,
|
||||
timeZone: body.attendee.timeZone,
|
||||
language: body.attendee.language,
|
||||
absent: false,
|
||||
});
|
||||
expect(secondBooking.location).toEqual(body.location);
|
||||
expect(secondBooking.absentHost).toEqual(false);
|
||||
|
||||
const thirdBooking = data[2];
|
||||
expect(thirdBooking.id).toBeDefined();
|
||||
expect(thirdBooking.uid).toBeDefined();
|
||||
expect(thirdBooking.hosts[0].id).toEqual(user.id);
|
||||
expect(thirdBooking.status).toEqual("accepted");
|
||||
expect(thirdBooking.start).toEqual(new Date(Date.UTC(2030, 1, 18, 13, 0, 0)).toISOString());
|
||||
expect(thirdBooking.end).toEqual(new Date(Date.UTC(2030, 1, 18, 14, 0, 0)).toISOString());
|
||||
expect(thirdBooking.duration).toEqual(60);
|
||||
expect(thirdBooking.eventTypeId).toEqual(recurringEventTypeId);
|
||||
expect(thirdBooking.recurringBookingUid).toBeDefined();
|
||||
expect(thirdBooking.attendees[0]).toEqual({
|
||||
name: body.attendee.name,
|
||||
timeZone: body.attendee.timeZone,
|
||||
language: body.attendee.language,
|
||||
absent: false,
|
||||
});
|
||||
expect(thirdBooking.location).toEqual(body.location);
|
||||
expect(thirdBooking.absentHost).toEqual(false);
|
||||
} else {
|
||||
throw new Error(
|
||||
"Invalid response data - expected recurring booking but received non array response"
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await bookingsRepositoryFixture.deleteAllBookings(user.id, user.email);
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await oauthClientRepositoryFixture.delete(oAuthClient.id);
|
||||
await teamRepositoryFixture.delete(organization.id);
|
||||
|
||||
@@ -5,7 +5,7 @@ import { hashAPIKey, isApiKey, stripApiKey } from "@/lib/api-key";
|
||||
import { ApiKeyRepository } from "@/modules/api-key/api-key-repository";
|
||||
import { OAuthClientRepository } from "@/modules/oauth-clients/oauth-client.repository";
|
||||
import { OAuthFlowService } from "@/modules/oauth-clients/services/oauth-flow.service";
|
||||
import { Injectable, NotFoundException } from "@nestjs/common";
|
||||
import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common";
|
||||
import { Logger } from "@nestjs/common";
|
||||
import { ConfigService } from "@nestjs/config";
|
||||
import { Request } from "express";
|
||||
@@ -57,9 +57,9 @@ export enum Frequency {
|
||||
|
||||
const recurringEventSchema = z.object({
|
||||
dtstart: z.string().optional(),
|
||||
interval: z.number().int().optional(),
|
||||
count: z.number().int().optional(),
|
||||
freq: z.nativeEnum(Frequency).optional(),
|
||||
interval: z.number().int(),
|
||||
count: z.number().int(),
|
||||
freq: z.nativeEnum(Frequency),
|
||||
until: z.string().optional(),
|
||||
});
|
||||
|
||||
@@ -175,14 +175,16 @@ export class InputBookingsService_2024_08_13 {
|
||||
|
||||
const occurrence = recurringEventSchema.parse(eventType.recurringEvent);
|
||||
const repeatsEvery = occurrence.interval;
|
||||
const repeatsTimes = occurrence.count;
|
||||
|
||||
if (inputBooking.recurrenceCount && inputBooking.recurrenceCount > occurrence.count) {
|
||||
throw new BadRequestException(
|
||||
"Provided recurrence count is higher than the event type's recurring event count."
|
||||
);
|
||||
}
|
||||
const repeatsTimes = inputBooking.recurrenceCount || occurrence.count;
|
||||
// note(Lauris): timeBetween 0=yearly, 1=monthly and 2=weekly
|
||||
const timeBetween = occurrence.freq;
|
||||
|
||||
if (!repeatsTimes) {
|
||||
throw new Error("Repeats times is required");
|
||||
}
|
||||
|
||||
const events = [];
|
||||
const recurringEventId = uuidv4();
|
||||
|
||||
|
||||
@@ -3,13 +3,14 @@ import { SchedulesRepository_2024_06_11 } from "@/ee/schedules/schedules_2024_06
|
||||
import { AtomsController } from "@/modules/atoms/controllers/atoms.controller";
|
||||
import { EventTypesAtomService } from "@/modules/atoms/services/event-types-atom.service";
|
||||
import { MembershipsRepository } from "@/modules/memberships/memberships.repository";
|
||||
import { OrganizationsModule } from "@/modules/organizations/organizations.module";
|
||||
import { PrismaModule } from "@/modules/prisma/prisma.module";
|
||||
import { UsersService } from "@/modules/users/services/users.service";
|
||||
import { UsersRepository } from "@/modules/users/users.repository";
|
||||
import { Module } from "@nestjs/common";
|
||||
|
||||
@Module({
|
||||
imports: [PrismaModule, EventTypesModule_2024_06_14],
|
||||
imports: [PrismaModule, EventTypesModule_2024_06_14, OrganizationsModule],
|
||||
providers: [
|
||||
EventTypesAtomService,
|
||||
MembershipsRepository,
|
||||
|
||||
@@ -64,4 +64,20 @@ export class AtomsController {
|
||||
data: eventType,
|
||||
};
|
||||
}
|
||||
|
||||
@Patch("/organizations/:organizationId/teams/:teamId/event-types/:eventTypeId")
|
||||
@Version(VERSION_NEUTRAL)
|
||||
@UseGuards(ApiAuthGuard)
|
||||
async updateAtomTeamEventType(
|
||||
@GetUser() user: UserWithProfile,
|
||||
@Param("eventTypeId", ParseIntPipe) eventTypeId: number,
|
||||
@Param("teamId", ParseIntPipe) teamId: number,
|
||||
@Body() body: UpdateEventTypeReturn
|
||||
): Promise<ApiResponse<UpdateEventTypeReturn>> {
|
||||
const eventType = await this.eventTypesService.updateTeamEventType(eventTypeId, body, user, teamId);
|
||||
return {
|
||||
status: SUCCESS_STATUS,
|
||||
data: eventType,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import { EventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/event-types.service";
|
||||
import { MembershipsRepository } from "@/modules/memberships/memberships.repository";
|
||||
import { OrganizationsEventTypesService } from "@/modules/organizations/services/event-types/organizations-event-types.service";
|
||||
import { PrismaReadService } from "@/modules/prisma/prisma-read.service";
|
||||
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
|
||||
import { UsersService } from "@/modules/users/services/users.service";
|
||||
import { UserWithProfile } from "@/modules/users/users.repository";
|
||||
import { Injectable, NotFoundException } from "@nestjs/common";
|
||||
import { Injectable, NotFoundException, ForbiddenException } from "@nestjs/common";
|
||||
|
||||
import {
|
||||
updateEventType,
|
||||
@@ -21,11 +22,11 @@ export class EventTypesAtomService {
|
||||
private readonly usersService: UsersService,
|
||||
private readonly dbWrite: PrismaWriteService,
|
||||
private readonly dbRead: PrismaReadService,
|
||||
private readonly eventTypeService: EventTypesService_2024_06_14
|
||||
private readonly eventTypeService: EventTypesService_2024_06_14,
|
||||
private readonly teamEventTypeService: OrganizationsEventTypesService
|
||||
) {}
|
||||
|
||||
async getUserEventType(user: UserWithProfile, eventTypeId: number) {
|
||||
this.eventTypeService.checkUserOwnsEventType(user.id, { id: eventTypeId, userId: user.id });
|
||||
const organizationId = this.usersService.getUserMainOrgId(user);
|
||||
|
||||
const isUserOrganizationAdmin = organizationId
|
||||
@@ -45,12 +46,22 @@ export class EventTypesAtomService {
|
||||
throw new NotFoundException(`Event type with id ${eventTypeId} not found`);
|
||||
}
|
||||
|
||||
this.eventTypeService.checkUserOwnsEventType(user.id, eventType.eventType);
|
||||
if (eventType?.team?.id) {
|
||||
await this.checkTeamOwnsEventType(user.id, eventType.eventType.id, eventType.team.id);
|
||||
} else {
|
||||
this.eventTypeService.checkUserOwnsEventType(user.id, eventType.eventType);
|
||||
}
|
||||
|
||||
return eventType;
|
||||
}
|
||||
|
||||
async updateEventType(eventTypeId: number, body: TUpdateEventTypeInputSchema, user: UserWithProfile) {
|
||||
this.eventTypeService.checkCanUpdateEventType(user.id, eventTypeId, body.scheduleId);
|
||||
async updateTeamEventType(
|
||||
eventTypeId: number,
|
||||
body: TUpdateEventTypeInputSchema,
|
||||
user: UserWithProfile,
|
||||
teamId: number
|
||||
) {
|
||||
await this.checkCanUpdateTeamEventType(user.id, eventTypeId, teamId, body.scheduleId);
|
||||
const eventTypeUser = await this.eventTypeService.getUserToUpdateEvent(user);
|
||||
const bookingFields = [...(body.bookingFields || [])];
|
||||
|
||||
@@ -77,4 +88,62 @@ export class EventTypesAtomService {
|
||||
|
||||
return eventType.eventType;
|
||||
}
|
||||
|
||||
async updateEventType(eventTypeId: number, body: TUpdateEventTypeInputSchema, user: UserWithProfile) {
|
||||
await this.eventTypeService.checkCanUpdateEventType(user.id, eventTypeId, body.scheduleId);
|
||||
const eventTypeUser = await this.eventTypeService.getUserToUpdateEvent(user);
|
||||
const bookingFields = [...(body.bookingFields || [])];
|
||||
|
||||
if (
|
||||
!bookingFields.find((field) => field.type === "email") &&
|
||||
!bookingFields.find((field) => field.type === "phone")
|
||||
) {
|
||||
bookingFields.push(systemBeforeFieldEmail);
|
||||
}
|
||||
|
||||
const eventType = await updateEventType({
|
||||
input: { id: eventTypeId, ...body, bookingFields },
|
||||
ctx: {
|
||||
user: eventTypeUser,
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
prisma: this.dbWrite.prisma,
|
||||
},
|
||||
});
|
||||
|
||||
if (!eventType) {
|
||||
throw new NotFoundException(`Event type with id ${eventTypeId} not found`);
|
||||
}
|
||||
|
||||
return eventType.eventType;
|
||||
}
|
||||
|
||||
async checkCanUpdateTeamEventType(userId: number, eventTypeId: number, teamId: number, scheduleId: number) {
|
||||
await this.checkTeamOwnsEventType(userId, eventTypeId, teamId);
|
||||
await this.teamEventTypeService.validateEventTypeExists(teamId, eventTypeId);
|
||||
await this.eventTypeService.checkUserOwnsSchedule(userId, scheduleId);
|
||||
}
|
||||
|
||||
async checkTeamOwnsEventType(userId: number, eventTypeId: number, teamId: number) {
|
||||
const membership = await this.dbRead.prisma.membership.findFirst({
|
||||
where: {
|
||||
userId,
|
||||
teamId,
|
||||
accepted: true,
|
||||
OR: [{ role: "ADMIN" }, { role: "OWNER" }],
|
||||
},
|
||||
select: {
|
||||
team: {
|
||||
select: {
|
||||
eventTypes: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
if (!membership?.team?.eventTypes?.some((item) => item.id === eventTypeId)) {
|
||||
throw new ForbiddenException(
|
||||
`Access denied. Either the team with ID=${teamId} does not own the event type with ID=${eventTypeId}, or your MEMBER role does not have permission to access this resource.`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ import { CONFERENCING_APPS, GOOGLE_MEET, SUCCESS_STATUS } from "@calcom/platform
|
||||
path: "/v2/conferencing",
|
||||
version: API_VERSIONS_VALUES,
|
||||
})
|
||||
@DocsTags("Platform / Conferencing")
|
||||
@DocsTags("Conferencing")
|
||||
export class ConferencingController {
|
||||
private readonly logger = new Logger("Platform Gcal Provider");
|
||||
|
||||
|
||||
+1
@@ -162,6 +162,7 @@ describe("Organizations Team Endpoints", () => {
|
||||
const responseBody: ApiSuccessResponse<OrgMeTeamOutputDto[]> = response.body;
|
||||
expect(responseBody.data.find((t) => t.id === teamCreatedViaApi.id)).toBeDefined();
|
||||
expect(responseBody.data.some((t) => t.accepted)).toBeTruthy();
|
||||
expect(responseBody.data.find((t) => t.id === teamCreatedViaApi.id)?.role).toBe("OWNER");
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
+7
-6
@@ -67,7 +67,7 @@ export class OrganizationsTeamsController {
|
||||
}
|
||||
|
||||
@Get("/me")
|
||||
@ApiOperation({ summary: "Get team membership for user" })
|
||||
@ApiOperation({ summary: "Get teams membership for user" })
|
||||
@Roles("ORG_MEMBER")
|
||||
@PlatformPlan("ESSENTIALS")
|
||||
async getMyTeams(
|
||||
@@ -84,13 +84,14 @@ export class OrganizationsTeamsController {
|
||||
);
|
||||
return {
|
||||
status: SUCCESS_STATUS,
|
||||
data: teams.map((team) =>
|
||||
plainToClass(
|
||||
data: teams.map((team) => {
|
||||
const me = team.members.find((member) => member.userId === user.id);
|
||||
return plainToClass(
|
||||
OrgMeTeamOutputDto,
|
||||
{ ...team, accepted: team.members.find((member) => member.userId === user.id)?.accepted ?? false },
|
||||
me ? { ...team, role: me.role, accepted: me.accepted } : team,
|
||||
{ strategy: "excludeAll" }
|
||||
)
|
||||
),
|
||||
);
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -100,6 +100,7 @@ import { Module } from "@nestjs/common";
|
||||
OrganizationsWebhooksService,
|
||||
WebhooksRepository,
|
||||
WebhooksService,
|
||||
OrganizationsEventTypesService,
|
||||
],
|
||||
controllers: [
|
||||
OrganizationsTeamsController,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { ApiProperty } from "@nestjs/swagger";
|
||||
import { MembershipRole } from "@prisma/client";
|
||||
import { Expose, Type } from "class-transformer";
|
||||
import { IsEnum, IsString, ValidateNested } from "class-validator";
|
||||
|
||||
@@ -9,6 +10,14 @@ export class OrgMeTeamOutputDto extends OrgTeamOutputDto {
|
||||
@IsString()
|
||||
@Expose()
|
||||
readonly accepted!: boolean;
|
||||
|
||||
@ApiProperty({
|
||||
example: MembershipRole.MEMBER,
|
||||
enum: [MembershipRole.ADMIN, MembershipRole.OWNER, MembershipRole.MEMBER],
|
||||
})
|
||||
@IsEnum([MembershipRole.ADMIN, MembershipRole.OWNER, MembershipRole.MEMBER])
|
||||
@Expose()
|
||||
readonly role!: MembershipRole;
|
||||
}
|
||||
|
||||
export class OrgTeamsOutputResponseDto {
|
||||
|
||||
+1
-1
@@ -97,7 +97,7 @@ export class OrganizationsTeamsRepository {
|
||||
},
|
||||
},
|
||||
include: {
|
||||
members: { select: { accepted: true, userId: true } },
|
||||
members: { select: { accepted: true, userId: true, role: true } },
|
||||
},
|
||||
skip,
|
||||
take,
|
||||
|
||||
@@ -63,121 +63,6 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing/{app}/connect": {
|
||||
"post": {
|
||||
"operationId": "ConferencingController_connect",
|
||||
"summary": "connect your conferencing application",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "app",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ConferencingAppOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": [
|
||||
"Platform / Conferencing"
|
||||
]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing": {
|
||||
"get": {
|
||||
"operationId": "ConferencingController_listConferencingApps",
|
||||
"summary": "list your conferencing applications",
|
||||
"parameters": [],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ConferencingAppsOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": [
|
||||
"Platform / Conferencing"
|
||||
]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing/{app}/default": {
|
||||
"post": {
|
||||
"operationId": "ConferencingController_default",
|
||||
"summary": "set your default conferencing application",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "app",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/SetDefaultConferencingAppOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": [
|
||||
"Platform / Conferencing"
|
||||
]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing/{app}/disconnect": {
|
||||
"delete": {
|
||||
"operationId": "ConferencingController_disconnect",
|
||||
"summary": "disconnect your conferencing application",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "app",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ConferencingAppOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": [
|
||||
"Platform / Conferencing"
|
||||
]
|
||||
}
|
||||
},
|
||||
"/v2/gcal/oauth/auth-url": {
|
||||
"get": {
|
||||
"operationId": "GcalController_redirect",
|
||||
@@ -2120,7 +2005,7 @@
|
||||
"/v2/organizations/{orgId}/teams/me": {
|
||||
"get": {
|
||||
"operationId": "OrganizationsTeamsController_getMyTeams",
|
||||
"summary": "Get team membership for user",
|
||||
"summary": "Get teams membership for user",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "orgId",
|
||||
@@ -3657,6 +3542,121 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing/{app}/connect": {
|
||||
"post": {
|
||||
"operationId": "ConferencingController_connect",
|
||||
"summary": "Connect your conferencing application",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "app",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ConferencingAppOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": [
|
||||
"Conferencing"
|
||||
]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing": {
|
||||
"get": {
|
||||
"operationId": "ConferencingController_listConferencingApps",
|
||||
"summary": "List your conferencing applications",
|
||||
"parameters": [],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ConferencingAppsOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": [
|
||||
"Conferencing"
|
||||
]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing/{app}/default": {
|
||||
"post": {
|
||||
"operationId": "ConferencingController_default",
|
||||
"summary": "Set your default conferencing application",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "app",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/SetDefaultConferencingAppOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": [
|
||||
"Conferencing"
|
||||
]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing/{app}/disconnect": {
|
||||
"delete": {
|
||||
"operationId": "ConferencingController_disconnect",
|
||||
"summary": "Disconnect your conferencing application",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "app",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ConferencingAppOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": [
|
||||
"Conferencing"
|
||||
]
|
||||
}
|
||||
},
|
||||
"/v2/destination-calendars": {
|
||||
"put": {
|
||||
"operationId": "DestinationCalendarsController_updateDestinationCalendars",
|
||||
@@ -11149,7 +11149,9 @@
|
||||
"RECORDING_READY",
|
||||
"INSTANT_MEETING",
|
||||
"RECORDING_TRANSCRIPTION_GENERATED",
|
||||
"OOO_CREATED"
|
||||
"OOO_CREATED",
|
||||
"AFTER_HOSTS_CAL_VIDEO_NO_SHOW",
|
||||
"AFTER_GUESTS_CAL_VIDEO_NO_SHOW"
|
||||
]
|
||||
},
|
||||
"active": {
|
||||
@@ -11223,7 +11225,9 @@
|
||||
"RECORDING_READY",
|
||||
"INSTANT_MEETING",
|
||||
"RECORDING_TRANSCRIPTION_GENERATED",
|
||||
"OOO_CREATED"
|
||||
"OOO_CREATED",
|
||||
"AFTER_HOSTS_CAL_VIDEO_NO_SHOW",
|
||||
"AFTER_GUESTS_CAL_VIDEO_NO_SHOW"
|
||||
]
|
||||
},
|
||||
"active": {
|
||||
@@ -12219,6 +12223,12 @@
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"meetingUrl": {
|
||||
"type": "string",
|
||||
"description": "Deprecated - use 'location' instead. Meeting URL just for this booking. Displayed in email and calendar event. If not provided then cal video link will be generated.",
|
||||
"example": "https://example.com/meeting",
|
||||
"deprecated": true
|
||||
},
|
||||
"location": {
|
||||
"type": "string",
|
||||
"description": "Location for this booking. Displayed in email and calendar event.",
|
||||
@@ -12230,6 +12240,11 @@
|
||||
"example": {
|
||||
"customField": "customValue"
|
||||
}
|
||||
},
|
||||
"recurrenceCount": {
|
||||
"type": "number",
|
||||
"description": "The number of recurrences. If not provided then event type recurrence count will be used. Can't be more than\n event type recurrence count",
|
||||
"example": 5
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -13126,7 +13141,7 @@
|
||||
"type": {
|
||||
"type": "string",
|
||||
"example": "google_video",
|
||||
"description": "type of conferencing app"
|
||||
"description": "Type of conferencing app"
|
||||
},
|
||||
"userId": {
|
||||
"type": "number",
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
"@storybook/blocks": "^7.6.3",
|
||||
"@storybook/nextjs": "^7.6.3",
|
||||
"@storybook/preview-api": "^7.6.3",
|
||||
"next": "^13.5.4",
|
||||
"next": "^13.5.6",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"storybook-addon-rtl-direction": "^0.0.19"
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"dependencies": {
|
||||
"highlight.js": "^11.6.0",
|
||||
"isarray": "2.0.5",
|
||||
"next": "^13.5.4",
|
||||
"next": "^13.5.6",
|
||||
"openapi-snippet": "^0.13.0",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
|
||||
+7
-1
@@ -1,5 +1,6 @@
|
||||
import { _generateMetadata } from "app/_utils";
|
||||
import { getFixedT } from "app/_utils";
|
||||
import { revalidatePath } from "next/cache";
|
||||
|
||||
import { getServerSessionForAppDir } from "@calcom/feature-auth/lib/get-server-session-for-app-dir";
|
||||
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
|
||||
@@ -16,9 +17,14 @@ const Page = async () => {
|
||||
const session = await getServerSessionForAppDir();
|
||||
|
||||
const t = await getFixedT(session?.user.locale || "en");
|
||||
const revalidatePage = async () => {
|
||||
"use server";
|
||||
revalidatePath("settings/my-account/general");
|
||||
};
|
||||
|
||||
return (
|
||||
<SettingsHeader title={t("general")} description={t("general_description")} borderInShellHeader={true}>
|
||||
<GeneralQueryView />
|
||||
<GeneralQueryView revalidatePage={revalidatePage} />
|
||||
</SettingsHeader>
|
||||
);
|
||||
};
|
||||
@@ -598,9 +598,7 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
<td className="flex w-full flex-col flex-wrap items-end justify-end space-x-2 space-y-2 py-4 pl-4 text-right text-sm font-medium ltr:pr-4 rtl:pl-4 sm:flex-row sm:flex-nowrap sm:items-start sm:space-y-0 sm:pl-0">
|
||||
{isUpcoming && !isCancelled ? (
|
||||
<>
|
||||
{isPending && (userId === booking.user?.id || booking.isUserTeamAdminOrOwner) && (
|
||||
<TableActions actions={pendingActions} />
|
||||
)}
|
||||
{isPending && <TableActions actions={pendingActions} />}
|
||||
{isConfirmed && <TableActions actions={bookedActions} />}
|
||||
{isRejected && <div className="text-subtle text-sm">{t("rejected")}</div>}
|
||||
</>
|
||||
|
||||
@@ -232,7 +232,7 @@ export const EditLocationDialog = (props: ISetLocationDialog) => {
|
||||
<div className="mt-3 text-center sm:mt-0 sm:text-left" />
|
||||
|
||||
<p className="text-emphasis mb-2 ml-1 mt-6 text-sm font-bold">{t("current_location")}:</p>
|
||||
<p className="text-emphasis mb-2 ml-1 text-sm">
|
||||
<p className="text-emphasis mb-2 ml-1 break-all text-sm">
|
||||
{getHumanReadableLocationValue(booking.location, t)}
|
||||
</p>
|
||||
<Form
|
||||
|
||||
@@ -3,6 +3,7 @@ import { useEffect } from "react";
|
||||
import { useForm } from "react-hook-form";
|
||||
import { z } from "zod";
|
||||
|
||||
import { emailSchema } from "@calcom/lib/emailSchema";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import {
|
||||
Dialog,
|
||||
@@ -37,7 +38,7 @@ const SecondaryEmailModal = ({
|
||||
const formMethods = useForm<FormValues>({
|
||||
resolver: zodResolver(
|
||||
z.object({
|
||||
email: z.string().email(),
|
||||
email: emailSchema,
|
||||
})
|
||||
),
|
||||
});
|
||||
|
||||
@@ -24,7 +24,9 @@ export const OAuthClientsDropdown = ({
|
||||
{Array.isArray(oauthClients) && oauthClients.length > 0 ? (
|
||||
<Dropdown modal={false}>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button color="secondary">{initialClientName}</Button>
|
||||
<Button color="secondary" EndIcon="chevron-down">
|
||||
{initialClientName}
|
||||
</Button>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent>
|
||||
{oauthClients.map((client) => {
|
||||
|
||||
@@ -7,6 +7,7 @@ import { z } from "zod";
|
||||
|
||||
import { isPasswordValid } from "@calcom/features/auth/lib/isPasswordValid";
|
||||
import { WEBSITE_URL } from "@calcom/lib/constants";
|
||||
import { emailRegex } from "@calcom/lib/emailSchema";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { EmailField, EmptyScreen, Label, PasswordField, TextField } from "@calcom/ui";
|
||||
|
||||
@@ -39,7 +40,7 @@ export const AdminUser = (props: { onSubmit: () => void; onError: () => void; on
|
||||
username: z
|
||||
.string()
|
||||
.refine((val) => val.trim().length >= 1, { message: t("at_least_characters", { count: 1 }) }),
|
||||
email_address: z.string().email({ message: t("enter_valid_email") }),
|
||||
email_address: z.string().regex(emailRegex, { message: t("enter_valid_email") }),
|
||||
full_name: z.string().min(3, t("at_least_characters", { count: 3 })),
|
||||
password: z.string().superRefine((data, ctx) => {
|
||||
const isStrict = true;
|
||||
|
||||
@@ -212,7 +212,7 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
|
||||
autoCorrect="none"
|
||||
disabled={disabled}
|
||||
className={classNames(
|
||||
"border-l-1 mb-0 mt-0 rounded-md rounded-l-none font-sans text-sm leading-4 focus:!ring-0",
|
||||
"border-l-1 my-0 rounded-md rounded-l-none font-sans text-sm leading-4 focus:!ring-0",
|
||||
isInputUsernamePremium
|
||||
? "border border-orange-400 focus:border focus:border-orange-400"
|
||||
: "border focus:border",
|
||||
@@ -262,7 +262,7 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
|
||||
)}
|
||||
</div>
|
||||
{paymentMsg}
|
||||
{markAsError && <p className="mt-1 text-xs text-red-500">Username is already taken</p>}
|
||||
{markAsError && <p className="mt-1 text-xs text-red-500">{t("username_already_taken")}</p>}
|
||||
|
||||
<Dialog open={openDialogSaveUsername}>
|
||||
<DialogContent
|
||||
|
||||
@@ -6,20 +6,21 @@ import { checkPremiumUsername } from "@calcom/features/ee/common/lib/checkPremiu
|
||||
import { isSAMLLoginEnabled } from "@calcom/features/ee/sso/lib/saml";
|
||||
import { getFeatureFlag } from "@calcom/features/flags/server/utils";
|
||||
import { IS_SELF_HOSTED, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { emailSchema } from "@calcom/lib/emailSchema";
|
||||
import slugify from "@calcom/lib/slugify";
|
||||
import { teamMetadataSchema } from "@calcom/prisma/zod-utils";
|
||||
|
||||
import { IS_GOOGLE_LOGIN_ENABLED } from "@server/lib/constants";
|
||||
import { ssrInit } from "@server/lib/ssr";
|
||||
|
||||
const checkValidEmail = (email: string) => z.string().email().safeParse(email).success;
|
||||
const checkValidEmail = (email: string) => emailSchema.safeParse(email).success;
|
||||
|
||||
const querySchema = z.object({
|
||||
username: z
|
||||
.string()
|
||||
.optional()
|
||||
.transform((val) => val || ""),
|
||||
email: z.string().email().optional(),
|
||||
email: emailSchema.optional(),
|
||||
});
|
||||
|
||||
export const getServerSideProps = async (ctx: GetServerSidePropsContext) => {
|
||||
|
||||
@@ -4,6 +4,7 @@ import type { GetServerSidePropsContext } from "next";
|
||||
import {
|
||||
generateGuestMeetingTokenFromOwnerMeetingToken,
|
||||
setEnableRecordingUIAndUserIdForOrganizer,
|
||||
updateMeetingTokenIfExpired,
|
||||
} from "@calcom/app-store/dailyvideo/lib/VideoApiAdapter";
|
||||
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
|
||||
import { getCalVideoReference } from "@calcom/features/get-cal-video-reference";
|
||||
@@ -78,10 +79,21 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||
|
||||
const oldVideoReference = getCalVideoReference(bookingObj.references);
|
||||
|
||||
const endTime = new Date(booking.endTime);
|
||||
const fourteenDaysAfter = new Date(endTime.getTime() + 14 * 24 * 60 * 60 * 1000);
|
||||
const epochTimeFourteenDaysAfter = Math.floor(fourteenDaysAfter.getTime() / 1000);
|
||||
|
||||
const videoReferencePassword = await updateMeetingTokenIfExpired({
|
||||
bookingReferenceId: oldVideoReference.id,
|
||||
roomName: oldVideoReference.uid,
|
||||
meetingToken: oldVideoReference.meetingPassword,
|
||||
exp: epochTimeFourteenDaysAfter,
|
||||
});
|
||||
|
||||
// set meetingPassword for guests
|
||||
if (session?.user.id !== bookingObj.user?.id) {
|
||||
const guestMeetingPassword = await generateGuestMeetingTokenFromOwnerMeetingToken(
|
||||
oldVideoReference.meetingPassword,
|
||||
videoReferencePassword,
|
||||
session?.user.id
|
||||
);
|
||||
|
||||
@@ -93,7 +105,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||
else {
|
||||
const meetingPassword = await setEnableRecordingUIAndUserIdForOrganizer(
|
||||
oldVideoReference.id,
|
||||
oldVideoReference.meetingPassword,
|
||||
videoReferencePassword,
|
||||
session?.user.id
|
||||
);
|
||||
if (!!meetingPassword) {
|
||||
|
||||
@@ -12,6 +12,7 @@ import { z } from "zod";
|
||||
import { SAMLLogin } from "@calcom/features/auth/SAMLLogin";
|
||||
import { ErrorCode } from "@calcom/features/auth/lib/ErrorCode";
|
||||
import { HOSTED_CAL_FEATURES, WEBAPP_URL, WEBSITE_URL } from "@calcom/lib/constants";
|
||||
import { emailRegex } from "@calcom/lib/emailSchema";
|
||||
import { getSafeRedirectUrl } from "@calcom/lib/getSafeRedirectUrl";
|
||||
import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams";
|
||||
import { useLastUsed, LastUsed } from "@calcom/lib/hooks/useLastUsed";
|
||||
@@ -59,7 +60,7 @@ PageProps & WithNonceProps<{}>) {
|
||||
email: z
|
||||
.string()
|
||||
.min(1, `${t("error_required_field")}`)
|
||||
.email(`${t("enter_valid_email")}`),
|
||||
.regex(emailRegex, `${t("enter_valid_email")}`),
|
||||
...(!!totpEmail ? {} : { password: z.string().min(1, `${t("error_required_field")}`) }),
|
||||
})
|
||||
// Passthrough other fields like totpCode
|
||||
|
||||
@@ -193,14 +193,9 @@ const AppearanceView = ({
|
||||
<Form
|
||||
form={userAppThemeFormMethods}
|
||||
handleSubmit={({ appTheme }) => {
|
||||
if (appTheme === "light" || appTheme === "dark") {
|
||||
mutation.mutate({
|
||||
appTheme,
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (appTheme === "system") appTheme = null;
|
||||
mutation.mutate({
|
||||
appTheme: null,
|
||||
appTheme,
|
||||
});
|
||||
}}>
|
||||
<div className="border-subtle flex flex-col justify-between border-x px-6 py-8 sm:flex-row">
|
||||
@@ -231,6 +226,7 @@ const AppearanceView = ({
|
||||
</div>
|
||||
<SectionBottomActions className="mb-6" align="end">
|
||||
<Button
|
||||
loading={mutation.isPending}
|
||||
disabled={isUserAppThemeSubmitting || !isUserAppThemeDirty}
|
||||
type="submit"
|
||||
data-testid="update-app-theme-btn"
|
||||
|
||||
@@ -68,9 +68,14 @@ interface GeneralViewProps {
|
||||
localeProp: string;
|
||||
user: RouterOutputs["viewer"]["me"];
|
||||
travelSchedules: RouterOutputs["viewer"]["getTravelSchedules"];
|
||||
revalidatePage: GeneralQueryViewProps["revalidatePage"];
|
||||
}
|
||||
|
||||
const GeneralQueryView = () => {
|
||||
type GeneralQueryViewProps = {
|
||||
revalidatePage: () => Promise<void>;
|
||||
};
|
||||
|
||||
const GeneralQueryView = ({ revalidatePage }: GeneralQueryViewProps) => {
|
||||
const { t } = useLocale();
|
||||
|
||||
const { data: user, isPending } = trpc.viewer.me.useQuery();
|
||||
@@ -82,10 +87,17 @@ const GeneralQueryView = () => {
|
||||
if (!user) {
|
||||
throw new Error(t("something_went_wrong"));
|
||||
}
|
||||
return <GeneralView user={user} travelSchedules={travelSchedules || []} localeProp={user.locale} />;
|
||||
return (
|
||||
<GeneralView
|
||||
user={user}
|
||||
travelSchedules={travelSchedules || []}
|
||||
localeProp={user.locale}
|
||||
revalidatePage={revalidatePage}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const GeneralView = ({ localeProp, user, travelSchedules }: GeneralViewProps) => {
|
||||
const GeneralView = ({ localeProp, user, travelSchedules, revalidatePage }: GeneralViewProps) => {
|
||||
const utils = trpc.useContext();
|
||||
const {
|
||||
t,
|
||||
@@ -105,6 +117,7 @@ const GeneralView = ({ localeProp, user, travelSchedules }: GeneralViewProps) =>
|
||||
if (res.locale) {
|
||||
window.calNewLocale = res.locale;
|
||||
}
|
||||
await revalidatePage();
|
||||
},
|
||||
onError: () => {
|
||||
showToast(t("error_updating_settings"), "error");
|
||||
@@ -177,7 +190,7 @@ const GeneralView = ({ localeProp, user, travelSchedules }: GeneralViewProps) =>
|
||||
<div>
|
||||
<Form
|
||||
form={formMethods}
|
||||
handleSubmit={(values) => {
|
||||
handleSubmit={async (values) => {
|
||||
setIsUpdateBtnLoading(true);
|
||||
mutation.mutate({
|
||||
...values,
|
||||
|
||||
@@ -12,6 +12,7 @@ import { z } from "zod";
|
||||
import { ErrorCode } from "@calcom/features/auth/lib/ErrorCode";
|
||||
import SectionBottomActions from "@calcom/features/settings/SectionBottomActions";
|
||||
import { APP_NAME, FULL_NAME_LENGTH_MAX_LIMIT } from "@calcom/lib/constants";
|
||||
import { emailSchema } from "@calcom/lib/emailSchema";
|
||||
import { getUserAvatarUrl } from "@calcom/lib/getAvatarUrl";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { md } from "@calcom/lib/markdownIt";
|
||||
@@ -523,12 +524,12 @@ const ProfileForm = ({
|
||||
.max(FULL_NAME_LENGTH_MAX_LIMIT, {
|
||||
message: t("max_limit_allowed_hint", { limit: FULL_NAME_LENGTH_MAX_LIMIT }),
|
||||
}),
|
||||
email: z.string().email(),
|
||||
email: emailSchema,
|
||||
bio: z.string(),
|
||||
secondaryEmails: z.array(
|
||||
z.object({
|
||||
id: z.number(),
|
||||
email: z.string().email(),
|
||||
email: emailSchema,
|
||||
emailVerified: z.union([z.string(), z.null()]).optional(),
|
||||
emailPrimary: z.boolean().optional(),
|
||||
})
|
||||
|
||||
@@ -7,6 +7,7 @@ import Shell from "@calcom/features/shell/Shell";
|
||||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { Button } from "@calcom/ui";
|
||||
import { PlatformPricing } from "@calcom/web/components/settings/platform/pricing/platform-pricing/index";
|
||||
|
||||
import NoPlatformPlan from "@components/settings/platform/dashboard/NoPlatformPlan";
|
||||
import { useGetUserAttributes } from "@components/settings/platform/hooks/useGetUserAttributes";
|
||||
@@ -23,13 +24,33 @@ export default function PlatformBillingUpgrade() {
|
||||
const onContactSupportClick = async () => {
|
||||
await open();
|
||||
};
|
||||
const { isUserLoading, isUserBillingDataLoading, isPlatformUser, userBillingData } = useGetUserAttributes();
|
||||
const { isUserLoading, isUserBillingDataLoading, isPlatformUser, userBillingData, isPaidUser, userOrgId } =
|
||||
useGetUserAttributes();
|
||||
|
||||
if (isUserLoading || (isUserBillingDataLoading && !userBillingData)) {
|
||||
return <div className="m-5">Loading...</div>;
|
||||
}
|
||||
|
||||
if (!isPlatformUser) return <NoPlatformPlan />;
|
||||
if (isPlatformUser && !isPaidUser)
|
||||
return (
|
||||
<PlatformPricing
|
||||
teamId={userOrgId}
|
||||
heading={
|
||||
<div className="mb-5 text-center text-2xl font-semibold">
|
||||
<h1>Subscribe to Platform</h1>
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
);
|
||||
|
||||
if (!isPlatformUser)
|
||||
return (
|
||||
<div>
|
||||
<Shell isPlatformUser={true} hideHeadingOnMobile withoutMain={false} SidebarContainer={<></>}>
|
||||
<NoPlatformPlan />
|
||||
</Shell>
|
||||
</div>
|
||||
);
|
||||
|
||||
return (
|
||||
<div>
|
||||
|
||||
@@ -2,9 +2,12 @@
|
||||
|
||||
import { useRouter } from "next/navigation";
|
||||
|
||||
import { useOrgBranding } from "@calcom/features/ee/organizations/context/provider";
|
||||
import { TeamEventTypeForm } from "@calcom/features/ee/teams/components/TeamEventTypeForm";
|
||||
import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams";
|
||||
import { useCreateEventType } from "@calcom/lib/hooks/useCreateEventType";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { WizardLayout } from "@calcom/ui";
|
||||
import { Button, showToast } from "@calcom/ui";
|
||||
|
||||
@@ -35,13 +38,29 @@ export const CreateTeamEventType = () => {
|
||||
);
|
||||
};
|
||||
|
||||
const { data: team } = trpc.viewer.teams.get.useQuery(
|
||||
{ teamId: teamId ?? -1, isOrg: false },
|
||||
{ enabled: !!teamId }
|
||||
);
|
||||
|
||||
const { form, createMutation, isManagedEventType } = useCreateEventType(onSuccessMutation, onErrorMutation);
|
||||
|
||||
const orgBranding = useOrgBranding();
|
||||
const urlPrefix = orgBranding?.fullDomain ?? process.env.NEXT_PUBLIC_WEBSITE_URL;
|
||||
|
||||
return (
|
||||
<TeamEventTypeForm
|
||||
isTeamAdminOrOwner={true}
|
||||
teamSlug={team?.slug}
|
||||
teamId={teamId}
|
||||
isTeamAdminOrOwner={true}
|
||||
urlPrefix={urlPrefix}
|
||||
isPending={createMutation.isPending}
|
||||
form={form}
|
||||
isManagedEventType={isManagedEventType}
|
||||
handleSubmit={(values) => {
|
||||
createMutation.mutate(values);
|
||||
}}
|
||||
SubmitButton={SubmitButton}
|
||||
onSuccessMutation={onSuccessMutation}
|
||||
onErrorMutation={onErrorMutation}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -178,6 +178,7 @@ const nextConfig = {
|
||||
serverComponentsExternalPackages: ["next-i18next"],
|
||||
optimizePackageImports: ["@calcom/ui"],
|
||||
instrumentationHook: true,
|
||||
serverActions: true,
|
||||
},
|
||||
i18n: {
|
||||
...i18n,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@calcom/web",
|
||||
"version": "4.5.11",
|
||||
"version": "4.6.4",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"analyze": "ANALYZE=true next build",
|
||||
@@ -99,7 +99,7 @@
|
||||
"memory-cache": "^0.2.0",
|
||||
"micro": "^10.0.1",
|
||||
"mime-types": "^2.1.35",
|
||||
"next": "^13.5.4",
|
||||
"next": "^13.5.6",
|
||||
"next-auth": "^4.22.1",
|
||||
"next-axiom": "^0.17.0",
|
||||
"next-collect": "^0.2.1",
|
||||
@@ -124,7 +124,6 @@
|
||||
"react-multi-email": "^0.5.3",
|
||||
"react-phone-input-2": "^2.15.1",
|
||||
"react-phone-number-input": "^3.2.7",
|
||||
"react-query": "^3.39.3",
|
||||
"react-schemaorg": "^2.0.0",
|
||||
"react-select": "^5.7.0",
|
||||
"react-timezone-select": "^1.4.0",
|
||||
|
||||
@@ -67,7 +67,39 @@ class MyDocument extends Document<Props> {
|
||||
nonce={nonce}
|
||||
id="newLocale"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `window.calNewLocale = "${newLocale}";`,
|
||||
__html: `
|
||||
window.calNewLocale = "${newLocale}";
|
||||
(function applyTheme() {
|
||||
try {
|
||||
const appTheme = localStorage.getItem('app-theme');
|
||||
if (!appTheme) return;
|
||||
|
||||
let bookingTheme, username;
|
||||
for (let i = 0; i < localStorage.length; i++) {
|
||||
const key = localStorage.key(i);
|
||||
if (key.startsWith('booking-theme:')) {
|
||||
bookingTheme = localStorage.getItem(key);
|
||||
username = key.split("booking-theme:")[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const onReady = () => {
|
||||
const isBookingPage = username && window.location.pathname.slice(1).startsWith(username);
|
||||
|
||||
if (document.body) {
|
||||
document.body.classList.add(isBookingPage ? bookingTheme : appTheme);
|
||||
} else {
|
||||
requestAnimationFrame(onReady);
|
||||
}
|
||||
};
|
||||
|
||||
requestAnimationFrame(onReady);
|
||||
} catch (e) {
|
||||
console.error('Error applying theme:', e);
|
||||
}
|
||||
})();
|
||||
`,
|
||||
}}
|
||||
/>
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/api/logo?type=apple-touch-icon" />
|
||||
|
||||
@@ -1,17 +1,13 @@
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { z } from "zod";
|
||||
|
||||
import { passwordResetRequest } from "@calcom/features/auth/lib/passwordResetRequest";
|
||||
import { checkRateLimitAndThrowError } from "@calcom/lib/checkRateLimitAndThrowError";
|
||||
import { emailSchema } from "@calcom/lib/emailSchema";
|
||||
import { defaultHandler } from "@calcom/lib/server";
|
||||
import prisma from "@calcom/prisma";
|
||||
|
||||
async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
const email = z
|
||||
.string()
|
||||
.email()
|
||||
.transform((val) => val.toLowerCase())
|
||||
.safeParse(req.body?.email);
|
||||
const email = emailSchema.transform((val) => val.toLowerCase()).safeParse(req.body?.email);
|
||||
|
||||
if (!email.success) {
|
||||
return res.status(400).json({ message: "email is required" });
|
||||
|
||||
@@ -3,6 +3,7 @@ import z from "zod";
|
||||
|
||||
import { hashPassword } from "@calcom/features/auth/lib/hashPassword";
|
||||
import { isPasswordValid } from "@calcom/features/auth/lib/isPasswordValid";
|
||||
import { emailRegex } from "@calcom/lib/emailSchema";
|
||||
import { HttpError } from "@calcom/lib/http-error";
|
||||
import { defaultHandler, defaultResponder } from "@calcom/lib/server";
|
||||
import slugify from "@calcom/lib/slugify";
|
||||
@@ -14,7 +15,7 @@ const querySchema = z.object({
|
||||
.string()
|
||||
.refine((val) => val.trim().length >= 1, { message: "Please enter at least one character" }),
|
||||
full_name: z.string().min(3, "Please enter at least 3 characters"),
|
||||
email_address: z.string().email({ message: "Please enter a valid email" }),
|
||||
email_address: z.string().regex(emailRegex, { message: "Please enter a valid email" }),
|
||||
password: z.string().refine((val) => isPasswordValid(val.trim(), false, true), {
|
||||
message:
|
||||
"The password must be a minimum of 15 characters long containing at least one number and have a mixture of uppercase and lowercase letters",
|
||||
|
||||
@@ -3,6 +3,7 @@ import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import getRawBody from "raw-body";
|
||||
import z from "zod";
|
||||
|
||||
import { emailSchema } from "@calcom/lib/emailSchema";
|
||||
import { default as webPrisma } from "@calcom/prisma";
|
||||
|
||||
export const config = {
|
||||
@@ -13,7 +14,7 @@ export const config = {
|
||||
|
||||
const helpscoutRequestBodySchema = z.object({
|
||||
customer: z.object({
|
||||
email: z.string().email(),
|
||||
email: emailSchema,
|
||||
}),
|
||||
});
|
||||
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { Meta } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
import AppearancePage from "~/settings/my-account/appearance-view";
|
||||
|
||||
const Page = () => {
|
||||
const { t } = useLocale();
|
||||
|
||||
return (
|
||||
<>
|
||||
<Meta title={t("appearance")} description={t("appearance_description")} borderInShellHeader={false} />
|
||||
<AppearancePage />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
Page.getLayout = getLayout;
|
||||
Page.PageWrapper = PageWrapper;
|
||||
|
||||
export default Page;
|
||||
@@ -1,31 +0,0 @@
|
||||
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { Meta } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
import { CalendarListContainer } from "@components/apps/CalendarListContainer";
|
||||
|
||||
import AddCalendarButton from "~/settings/my-account/components/AddCalendarButton";
|
||||
|
||||
const Page = () => {
|
||||
const { t } = useLocale();
|
||||
|
||||
return (
|
||||
<>
|
||||
<Meta
|
||||
title={t("calendars")}
|
||||
description={t("calendars_description")}
|
||||
CTA={<AddCalendarButton />}
|
||||
borderInShellHeader={false}
|
||||
/>
|
||||
<div className="mt-8">
|
||||
<CalendarListContainer />
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
Page.getLayout = getLayout;
|
||||
Page.PageWrapper = PageWrapper;
|
||||
|
||||
export default Page;
|
||||
@@ -1,36 +0,0 @@
|
||||
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { Button, Meta } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
import ConferencingView from "~/settings/my-account/conferencing-view";
|
||||
|
||||
const Page = () => {
|
||||
const { t } = useLocale();
|
||||
|
||||
const AddConferencingButton = () => {
|
||||
return (
|
||||
<Button color="secondary" StartIcon="plus" href="/apps/categories/conferencing">
|
||||
{t("add")}
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<Meta
|
||||
title={t("conferencing")}
|
||||
description={t("conferencing_description")}
|
||||
CTA={<AddConferencingButton />}
|
||||
borderInShellHeader={true}
|
||||
/>
|
||||
<ConferencingView />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
Page.getLayout = getLayout;
|
||||
Page.PageWrapper = PageWrapper;
|
||||
|
||||
export default Page;
|
||||
@@ -1,23 +0,0 @@
|
||||
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { Meta } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
import GeneralQueryView from "~/settings/my-account/general-view";
|
||||
|
||||
const Page = () => {
|
||||
const { t } = useLocale();
|
||||
|
||||
return (
|
||||
<>
|
||||
<Meta title={t("general")} description={t("general_description")} borderInShellHeader={true} />
|
||||
<GeneralQueryView />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
Page.getLayout = getLayout;
|
||||
Page.PageWrapper = PageWrapper;
|
||||
|
||||
export default Page;
|
||||
@@ -1,31 +0,0 @@
|
||||
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
|
||||
import CreateNewOutOfOfficeEntryButton from "@calcom/features/settings/outOfOffice/CreateNewOutOfOfficeEntryButton";
|
||||
import { OutOfOfficeEntriesList } from "@calcom/features/settings/outOfOffice/OutOfOfficeEntriesList";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { Meta, SkeletonText } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const Page = () => {
|
||||
const { t } = useLocale();
|
||||
|
||||
const { isPending } = trpc.viewer.outOfOfficeReasonList.useQuery();
|
||||
|
||||
return (
|
||||
<>
|
||||
<Meta
|
||||
title={t("out_of_office")}
|
||||
description={t("out_of_office_description")}
|
||||
borderInShellHeader={false}
|
||||
CTA={isPending ? <SkeletonText className="h-8 w-20" /> : <CreateNewOutOfOfficeEntryButton />}
|
||||
/>
|
||||
<OutOfOfficeEntriesList />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
Page.getLayout = getLayout;
|
||||
Page.PageWrapper = PageWrapper;
|
||||
|
||||
export default Page;
|
||||
@@ -1,27 +0,0 @@
|
||||
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
|
||||
import { APP_NAME } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { Meta } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
import ProfileView from "~/settings/my-account/profile-view";
|
||||
|
||||
const Page = () => {
|
||||
const { t } = useLocale();
|
||||
return (
|
||||
<>
|
||||
<Meta
|
||||
title={t("profile")}
|
||||
description={t("profile_description", { appName: APP_NAME })}
|
||||
borderInShellHeader={true}
|
||||
/>
|
||||
<ProfileView />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
Page.getLayout = getLayout;
|
||||
Page.PageWrapper = PageWrapper;
|
||||
|
||||
export default Page;
|
||||
@@ -1,5 +1,5 @@
|
||||
import MembersView from "@calcom/features/ee/organizations/pages/settings/members";
|
||||
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
|
||||
import SettingsLayout from "@calcom/features/settings/layouts/SettingsLayout";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
@@ -8,6 +8,10 @@ export {
|
||||
type PageProps,
|
||||
} from "@calcom/features/ee/organizations/pages/settings/getServerSidePropsMembers";
|
||||
|
||||
export const getLayout = (page: React.ReactElement) => (
|
||||
<SettingsLayout containerClassName="lg:max-w-screen-2xl">{page}</SettingsLayout>
|
||||
);
|
||||
|
||||
const Page = () => <MembersView />;
|
||||
|
||||
Page.getLayout = getLayout;
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
import PlatformMembersView from "@calcom/features/ee/platform/pages/settings/members";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const Page = () => <PlatformMembersView />;
|
||||
|
||||
Page.PageWrapper = PageWrapper;
|
||||
|
||||
export default Page;
|
||||
@@ -49,7 +49,7 @@ export async function acceptTeamOrOrgInvite(page: Page) {
|
||||
}
|
||||
|
||||
async function inviteAnEmail(page: Page, invitedUserEmail: string) {
|
||||
await page.locator('button:text("Add")').click();
|
||||
await page.getByTestId("new-organization-member-button").click();
|
||||
await page.locator('input[name="inviteUser"]').fill(invitedUserEmail);
|
||||
await submitAndWaitForResponse(page, "/api/trpc/teams/inviteMember?batch=1", {
|
||||
action: () => page.locator('button:text("Send invite")').click(),
|
||||
|
||||
@@ -106,7 +106,7 @@ test.describe("Organization", () => {
|
||||
const invitedUserEmail = users.trackEmail({ username: "rick", domain: "domain.com" });
|
||||
// '-domain' because the email doesn't match orgAutoAcceptEmail
|
||||
const usernameDerivedFromEmail = `${invitedUserEmail.split("@")[0]}-domain`;
|
||||
await inviteAnEmail(page, invitedUserEmail);
|
||||
await inviteAnEmail(page, invitedUserEmail, true);
|
||||
await expectUserToBeAMemberOfTeam({
|
||||
page,
|
||||
teamId: team.id,
|
||||
@@ -164,7 +164,7 @@ test.describe("Organization", () => {
|
||||
|
||||
await test.step("By invite link", async () => {
|
||||
await page.goto(`/settings/teams/${team.id}/members`);
|
||||
const inviteLink = await copyInviteLink(page);
|
||||
const inviteLink = await copyInviteLink(page, true);
|
||||
const email = users.trackEmail({ username: "rick", domain: "domain.com" });
|
||||
// '-domain' because the email doesn't match orgAutoAcceptEmail
|
||||
const usernameDerivedFromEmail = `${email.split("@")[0]}-domain`;
|
||||
@@ -333,7 +333,7 @@ test.describe("Organization", () => {
|
||||
await page.goto(`/settings/teams/${team.id}/members`);
|
||||
const invitedUserEmail = users.trackEmail({ username: "rick", domain: "example.com" });
|
||||
const usernameDerivedFromEmail = invitedUserEmail.split("@")[0];
|
||||
await inviteAnEmail(page, invitedUserEmail);
|
||||
await inviteAnEmail(page, invitedUserEmail, true);
|
||||
await expectUserToBeAMemberOfTeam({
|
||||
page,
|
||||
teamId: team.id,
|
||||
@@ -391,7 +391,7 @@ test.describe("Organization", () => {
|
||||
await test.step("By invite link", async () => {
|
||||
await page.goto(`/settings/teams/${team.id}/members`);
|
||||
|
||||
const inviteLink = await copyInviteLink(page);
|
||||
const inviteLink = await copyInviteLink(page, true);
|
||||
const email = users.trackEmail({ username: "rick", domain: "example.com" });
|
||||
// '-domain' because the email doesn't match orgAutoAcceptEmail
|
||||
const usernameDerivedFromEmail = `${email.split("@")[0]}`;
|
||||
@@ -481,8 +481,12 @@ export async function signupFromEmailInviteLink({
|
||||
await signupPage.close();
|
||||
}
|
||||
|
||||
async function inviteAnEmail(page: Page, invitedUserEmail: string) {
|
||||
await page.locator('button:text("Add")').click();
|
||||
async function inviteAnEmail(page: Page, invitedUserEmail: string, teamPage?: boolean) {
|
||||
if (teamPage) {
|
||||
await page.getByTestId("new-member-button").click();
|
||||
} else {
|
||||
await page.getByTestId("new-organization-member-button").click();
|
||||
}
|
||||
await page.locator('input[name="inviteUser"]').fill(invitedUserEmail);
|
||||
const submitPromise = page.waitForResponse("/api/trpc/teams/inviteMember?batch=1");
|
||||
await page.locator('button:text("Send invite")').click();
|
||||
@@ -558,8 +562,12 @@ function assertInviteLink(inviteLink: string | null | undefined): asserts invite
|
||||
if (!inviteLink) throw new Error("Invite link not found");
|
||||
}
|
||||
|
||||
async function copyInviteLink(page: Page) {
|
||||
await page.locator('button:text("Add")').click();
|
||||
async function copyInviteLink(page: Page, teamPage?: boolean) {
|
||||
if (teamPage) {
|
||||
await page.getByTestId("new-member-button").click();
|
||||
} else {
|
||||
await page.getByTestId("new-organization-member-button").click();
|
||||
}
|
||||
const inviteLink = await getInviteLink(page);
|
||||
return inviteLink;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ test.describe("Team", () => {
|
||||
username: "rick",
|
||||
domain: `domain-${Date.now()}.com`,
|
||||
});
|
||||
await page.locator(`button:text("${t("add")}")`).click();
|
||||
await page.getByTestId("new-member-button").click();
|
||||
await page.locator('input[name="inviteUser"]').fill(invitedUserEmail);
|
||||
await page.locator(`button:text("${t("send_invite")}")`).click();
|
||||
const inviteLink = await expectInvitationEmailToBeReceived(
|
||||
@@ -74,7 +74,8 @@ test.describe("Team", () => {
|
||||
email: `user-invite-${Date.now()}@domain.com`,
|
||||
password: "P4ssw0rd!",
|
||||
});
|
||||
await page.locator(`button:text("${t("add")}")`).click();
|
||||
|
||||
await page.getByTestId("new-member-button").click();
|
||||
const inviteLink = await getInviteLink(page);
|
||||
|
||||
const context = await browser.newContext();
|
||||
@@ -105,7 +106,7 @@ test.describe("Team", () => {
|
||||
username: "rick",
|
||||
domain: `example.com`,
|
||||
});
|
||||
await page.locator(`button:text("${t("add")}")`).click();
|
||||
await page.getByTestId("new-member-button").click();
|
||||
await page.locator('input[name="inviteUser"]').fill(invitedUserEmail);
|
||||
await page.locator(`button:text("${t("send_invite")}")`).click();
|
||||
await expectInvitationEmailToBeReceived(
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "سيتم توفير رقم الهاتف",
|
||||
"before_event_trigger": "قبل بدء الحدث",
|
||||
"event_cancelled_trigger": "عند إلغاء هذا الحدث",
|
||||
"after_hosts_cal_video_no_show": "بعد عدم انضمام المضيفين إلى فيديو Cal",
|
||||
"after_guests_cal_video_no_show": "بعد عدم انضمام الضيوف إلى فيديو Cal",
|
||||
"new_event_trigger": "متى تم حجز الحدث الجديد",
|
||||
"email_host_action": "إرسال رسالة إلكترونية إلى المضيف",
|
||||
"email_attendee_action": "إرسال رسالة إلكترونية إلى الحضور",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "إرسال بريد إلكتروني إلى عنوان بريد إلكتروني محدد",
|
||||
"after_event_trigger": "بعد انتهاء الحدث",
|
||||
"how_long_after": "كم من الوقت بعد انتهاء الحدث؟",
|
||||
"how_long_after_hosts_no_show": "كم من الوقت بعد عدم ظهور المضيفين في اجتماع فيديو Cal؟",
|
||||
"how_long_after_guests_no_show": "كم من الوقت بعد عدم ظهور الضيوف في اجتماع فيديو Cal؟",
|
||||
"how_long_after_user_no_show_minutes": "كم من الوقت بعد عدم ظهور المستخدمين في اجتماع فيديو Cal؟",
|
||||
"no_available_slots": "لا توجد فترات زمنية متاحة",
|
||||
"time_available": "الوقت المتاح",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "لا يمكنك العثور على تطبيق المؤتمرات المناسب؟ قم بزيارة <1>متجر التطبيقات</1> الخاص بنا.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "إعادة تثبيت التطبيق",
|
||||
"reschedule_reason": "سبب إعادة الجدولة",
|
||||
"choose_common_schedule_team_event": "اختر جدولًا زمنيًا مشتركًا",
|
||||
"choose_common_schedule_team_event_description": "قم بتمكين هذا الخيار إذا كنت ترغب في استخدام جدول زمني مشترك بين المضيفين. عند تعطيل هذا الخيار، سيتم حجز كل مضيف على أساس جدوله الافتراضي.",
|
||||
"choose_common_schedule_team_event_description": "قم بتمكين هذا إذا كنت ترغب في استخدام جدول مشترك بين المضيفين. عند التعطيل، سيتم حجز كل مضيف بناءً على جدوله الافتراضي أو الجدول الذي تم اختياره.",
|
||||
"reason": "السبب",
|
||||
"sender_id": "معرّف المرسل",
|
||||
"sender_id_error_message": "يسمح بالحروف والأرقام والمسافات فقط (بحد أقصى 11 حرفًا)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "خيار جديد",
|
||||
"update_profile": "تحديث العضو",
|
||||
"attribute_updated_successfully": "تم تحديث السمة بنجاح",
|
||||
"attribute_deleted_successfully": "تم حذف السمة بنجاح",
|
||||
"attributes_edited_successfully": "تم تعديل السمات بنجاح",
|
||||
"attribute_meta_description": "إدارة السمات لأعضاء فريقك",
|
||||
"attributes_edit_description": "تعديل السمات لأعضاء فريقك",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "منذ بداية الشهر",
|
||||
"year_to_date": "منذ بداية السنة",
|
||||
"custom_range": "نطاق مخصص",
|
||||
"show_all_columns": "عرض جميع الأعمدة",
|
||||
"toggle_columns": "تبديل الأعمدة",
|
||||
"no_columns_found": "لم يتم العثور على أعمدة",
|
||||
"salesforce_create_record_as": "عند الحجز، أضف الأحداث والمشاركين الجدد كالتالي:",
|
||||
"salesforce_lead": "عميل محتمل",
|
||||
"salesforce_contact_under_account": "جهة اتصال تحت حساب",
|
||||
"salesforce_skip_entry_creation": "تخطي إنشاء سجل {{entry}} إذا لم يكن موجودًا في Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "إذا لم تكن جهة الاتصال موجودة تحت حساب، قم بإنشاء عميل محتمل جديد من المشارك",
|
||||
"salesforce_create_new_contact_under_account": "إنشاء جهة اتصال جديدة تحت حساب بناءً على نطاق البريد الإلكتروني للمشارك وجهات الاتصال الموجودة",
|
||||
"mass_assign_attributes": "تعيين السمات بشكل جماعي",
|
||||
"salesforce_book_directly_with_attendee_owner": "إذا كان المشارك موجودًا في Salesforce، احجز مباشرة مع المالك",
|
||||
"salesforce_check_owner_of": "الكيان الذي يجب التحقق من مالكه للحجز مباشرة",
|
||||
"account": "حساب",
|
||||
"choose_hosts_schedule": "اختر جداول المضيفين",
|
||||
"hosts_schedule_description": "يمكنك اختيار جدول مختلف لكل مضيف. يتم اختيار جدول المضيف الافتراضي لكل مضيف بشكل افتراضي.",
|
||||
"no_hosts_description": "لا يوجد مضيفون معينون، أضف مضيفين في علامة التبويب التعيين.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ أضف السلاسل الجديدة أعلاه هنا ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Telefon nömrəsi təmin ediləcək",
|
||||
"before_event_trigger": "tədbir başlamazdan əvvəl",
|
||||
"event_cancelled_trigger": "tədbir ləğv edildikdə",
|
||||
"after_hosts_cal_video_no_show": "Ev sahibləri Cal video görüşünə qoşulmadıqdan sonra",
|
||||
"after_guests_cal_video_no_show": "Qonaqlar Cal video görüşünə qoşulmadıqdan sonra",
|
||||
"new_event_trigger": "yeni tədbir sifariş edildikdə",
|
||||
"email_host_action": "ev sahibinə e-poçt göndərin",
|
||||
"email_attendee_action": "iştirakçılara e-poçt göndərin",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "müəyyən bir e-poçt ünvanına e-poçt göndərin",
|
||||
"after_event_trigger": "hadisə bitdikdən sonra",
|
||||
"how_long_after": "Hadisə bitdikdən nə qədər sonra?",
|
||||
"how_long_after_hosts_no_show": "Ev sahibləri Cal video görüşünə gəlmədikdən nə qədər sonra?",
|
||||
"how_long_after_guests_no_show": "Qonaqlar Cal video görüşünə gəlmədikdən nə qədər sonra?",
|
||||
"how_long_after_user_no_show_minutes": "İstifadəçilər Cal video görüşünə gəlmədikdən nə qədər sonra?",
|
||||
"no_available_slots": "Mövcud vaxtlar yoxdur",
|
||||
"time_available": "Mövcud vaxt",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Düzgün konfrans tətbiqini tapa bilmirsiniz? <1>Tətbiq Mağazamızı</1> ziyarət edin.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Tətbiqi yenidən quraşdırın",
|
||||
"reschedule_reason": "Yenidən planlaşdırma səbəbi",
|
||||
"choose_common_schedule_team_event": "Ümumi cədvəli seçin",
|
||||
"choose_common_schedule_team_event_description": "Əgər ev sahibləri arasında ümumi cədvəldən istifadə etmək istəyirsinizsə, bunu aktiv edin. Deaktiv edildikdə, hər bir ev sahibi öz standart cədvəlinə əsasən rezervasiya ediləcək.",
|
||||
"choose_common_schedule_team_event_description": "Əgər hostlar arasında ümumi cədvəldən istifadə etmək istəyirsinizsə, bunu aktivləşdirin. Deaktiv edildikdə, hər host öz standart cədvəlinə və ya seçilmiş cədvəlinə əsasən rezervasiya ediləcək.",
|
||||
"reason": "Səbəb",
|
||||
"sender_id": "Göndərən ID",
|
||||
"sender_id_error_message": "Yalnız hərflər, rəqəmlər və boşluqlar icazəlidir (maks. 11 simvol)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Yeni seçim",
|
||||
"update_profile": "Üzvü yenilə",
|
||||
"attribute_updated_successfully": "Atribut uğurla yeniləndi",
|
||||
"attribute_deleted_successfully": "Atribut uğurla silindi",
|
||||
"attributes_edited_successfully": "Atributlar uğurla redaktə edildi",
|
||||
"attribute_meta_description": "Komanda üzvləriniz üçün atributları idarə edin",
|
||||
"attributes_edit_description": "Komanda üzvləriniz üçün atributları redaktə edin",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "bu ayın tarixinə qədər",
|
||||
"year_to_date": "bu ilin tarixinə qədər",
|
||||
"custom_range": "xüsusi aralıq",
|
||||
"show_all_columns": "Bütün sütunları göstər",
|
||||
"toggle_columns": "Sütunları dəyiş",
|
||||
"no_columns_found": "Sütun tapılmadı",
|
||||
"salesforce_create_record_as": "Rezervasiya zamanı tədbirləri əlavə edin və yeni iştirakçıları belə qeyd edin:",
|
||||
"salesforce_lead": "Potensial müştəri",
|
||||
"salesforce_contact_under_account": "Hesab altında əlaqə",
|
||||
"salesforce_skip_entry_creation": "Əgər {{entry}} Salesforce-da mövcud deyilsə, qeyd yaratmağı keçin",
|
||||
"salesforce_if_account_does_not_exist": "Əgər əlaqə hesab altında mövcud deyilsə, iştirakçıdan yeni potensial müştəri yaradın",
|
||||
"salesforce_create_new_contact_under_account": "İştirakçının email domeni və mövcud əlaqələr əsasında hesab altında yeni əlaqə yaradın",
|
||||
"mass_assign_attributes": "Atributları kütləvi təyin et",
|
||||
"salesforce_book_directly_with_attendee_owner": "Əgər iştirakçı Salesforce-da mövcuddursa, birbaşa sahib ilə rezervasiya edin",
|
||||
"salesforce_check_owner_of": "Birbaşa rezervasiya etmək üçün sahibini yoxlayacaq obyekt",
|
||||
"account": "Hesab",
|
||||
"choose_hosts_schedule": "Hostların cədvəlini seçin",
|
||||
"hosts_schedule_description": "Hər bir host üçün fərqli cədvəl seçə bilərsiniz. Hər hostun standart cədvəli avtomatik olaraq seçilir.",
|
||||
"no_hosts_description": "Host təyin edilməyib, təyinat sekmesinde host əlavə edin.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Yeni sətirləri bura əlavə edin ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Bude uvedeno telefonní číslo",
|
||||
"before_event_trigger": "před zahájením události",
|
||||
"event_cancelled_trigger": "při zrušení události",
|
||||
"after_hosts_cal_video_no_show": "Po tom, co se hostitelé nepřipojí k cal video",
|
||||
"after_guests_cal_video_no_show": "Po tom, co se hosté nepřipojí k cal video",
|
||||
"new_event_trigger": "při rezervaci nové události",
|
||||
"email_host_action": "odeslání e-mailu hostiteli",
|
||||
"email_attendee_action": "odeslat e-mail účastníkům",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "odeslat e-mail na specifickou e-mailovou adresu",
|
||||
"after_event_trigger": "po ukončení události",
|
||||
"how_long_after": "Jak dlouho po ukončení události?",
|
||||
"how_long_after_hosts_no_show": "Jak dlouho po tom, co se hostitelé neobjeví na cal video schůzce?",
|
||||
"how_long_after_guests_no_show": "Jak dlouho po tom, co se hosté neobjeví na cal video schůzce?",
|
||||
"how_long_after_user_no_show_minutes": "Jak dlouho po tom, co se uživatelé neobjeví na cal video schůzce?",
|
||||
"no_available_slots": "Žádné dostupné sloty",
|
||||
"time_available": "Dostupný čas",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Nemůžete najít správnou konferenční aplikaci? Navštivte náš <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Přeinstalovat aplikaci",
|
||||
"reschedule_reason": "Důvod změny termínu",
|
||||
"choose_common_schedule_team_event": "Vyberte společný plán",
|
||||
"choose_common_schedule_team_event_description": "Tuto možnost povolte, pokud chcete používat společný plán mezi hostiteli. Při zakázání této možnosti bude každý hostitel rezervován na základě svého výchozího plánu.",
|
||||
"choose_common_schedule_team_event_description": "Povolte tuto možnost, pokud chcete použít společný rozvrh mezi hostiteli. Pokud je zakázána, každý hostitel bude rezervován podle svého výchozího rozvrhu nebo zvoleného rozvrhu.",
|
||||
"reason": "Důvod",
|
||||
"sender_id": "ID odesílatele",
|
||||
"sender_id_error_message": "Povolena jsou pouze písmena, číslice a mezery (max. 11 znaků)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nová možnost",
|
||||
"update_profile": "Aktualizovat člena",
|
||||
"attribute_updated_successfully": "Atribut úspěšně aktualizován",
|
||||
"attribute_deleted_successfully": "Atribut byl úspěšně smazán",
|
||||
"attributes_edited_successfully": "Atributy úspěšně upraveny",
|
||||
"attribute_meta_description": "Spravujte atributy pro členy svého týmu",
|
||||
"attributes_edit_description": "Upravte atributy pro členy svého týmu",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "od začátku měsíce",
|
||||
"year_to_date": "od začátku roku",
|
||||
"custom_range": "vlastní rozsah",
|
||||
"show_all_columns": "Zobrazit všechny sloupce",
|
||||
"toggle_columns": "Přepnout sloupce",
|
||||
"no_columns_found": "Žádné sloupce nebyly nalezeny",
|
||||
"salesforce_create_record_as": "Při rezervaci přidejte události a nové účastníky jako:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Kontakt pod účtem",
|
||||
"salesforce_skip_entry_creation": "Přeskočit vytvoření záznamu {{entry}}, pokud neexistuje v Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Pokud kontakt neexistuje pod účtem, vytvořte nový lead z účastníka",
|
||||
"salesforce_create_new_contact_under_account": "Vytvořte nový kontakt pod účtem na základě e-mailové domény účastníka a existujících kontaktů",
|
||||
"mass_assign_attributes": "Hromadné přiřazení atributů",
|
||||
"salesforce_book_directly_with_attendee_owner": "Pokud účastník existuje v Salesforce, rezervujte přímo s vlastníkem",
|
||||
"salesforce_check_owner_of": "Entita ke kontrole vlastníka pro přímou rezervaci",
|
||||
"account": "Účet",
|
||||
"choose_hosts_schedule": "Vyberte rozvrhy hostitelů",
|
||||
"hosts_schedule_description": "Můžete vybrat jiný rozvrh pro každého hostitele. Výchozí rozvrh každého hostitele je vybrán automaticky.",
|
||||
"no_hosts_description": "Žádní hostitelé nejsou přiřazeni, přidejte hostitele na kartě přiřazení.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Přidejte své nové řetězce nahoru ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Telefonnummer vil blive angivet",
|
||||
"before_event_trigger": "før begivenheden starter",
|
||||
"event_cancelled_trigger": "når begivenheden er aflyst",
|
||||
"after_hosts_cal_video_no_show": "Efter værter ikke deltager i cal video",
|
||||
"after_guests_cal_video_no_show": "Efter gæster ikke deltager i cal video",
|
||||
"new_event_trigger": "når ny begivenhed er booket",
|
||||
"email_host_action": "send e-mail til vært",
|
||||
"email_attendee_action": "send e-mail til deltagere",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "send e-mail til en specifik e-mailadresse",
|
||||
"after_event_trigger": "efter begivenheden slutter",
|
||||
"how_long_after": "Hvor længe efter begivenheden slutter?",
|
||||
"how_long_after_hosts_no_show": "Hvor lang tid efter værter ikke dukker op til cal video møde?",
|
||||
"how_long_after_guests_no_show": "Hvor lang tid efter gæster ikke dukker op til cal video møde?",
|
||||
"how_long_after_user_no_show_minutes": "Hvor lang tid efter brugerne ikke dukker op til cal video møde?",
|
||||
"no_available_slots": "Ingen ledige tidsrum",
|
||||
"time_available": "Tid tilgængelig",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Kan du ikke finde den rigtige konferenceapp? Besøg vores <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Geninstaller app",
|
||||
"reschedule_reason": "Årsag til omlægning",
|
||||
"choose_common_schedule_team_event": "Vælg en fælles tidsplan",
|
||||
"choose_common_schedule_team_event_description": "Aktivér dette hvis du ønsker at bruge en fælles tidsplan mellem værter. Når deaktiveret, vil hver vært blive booket baseret på deres standardtidsplan.",
|
||||
"choose_common_schedule_team_event_description": "Aktivér dette, hvis du vil bruge en fælles tidsplan mellem værter. Når det er deaktiveret, vil hver vært blive booket baseret på deres standardtidsplan eller deres valgte tidsplan.",
|
||||
"reason": "Årsag",
|
||||
"sender_id": "Afsender ID",
|
||||
"sender_id_error_message": "Kun bogstaver, tal og mellemrum tilladt (maks. 11 tegn)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Ny mulighed",
|
||||
"update_profile": "Opdater medlem",
|
||||
"attribute_updated_successfully": "Egenskab opdateret med succes",
|
||||
"attribute_deleted_successfully": "Attribut slettet med succes",
|
||||
"attributes_edited_successfully": "Egenskaber redigeret med succes",
|
||||
"attribute_meta_description": "Administrer egenskaber for dine teammedlemmer",
|
||||
"attributes_edit_description": "Rediger egenskaber for dine teammedlemmer",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "måned til dato",
|
||||
"year_to_date": "år til dato",
|
||||
"custom_range": "tilpasset interval",
|
||||
"show_all_columns": "Vis alle kolonner",
|
||||
"toggle_columns": "Skift kolonner",
|
||||
"no_columns_found": "Ingen kolonner fundet",
|
||||
"salesforce_create_record_as": "Ved booking, tilføj begivenheder og nye deltagere som:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Kontakt under en konto",
|
||||
"salesforce_skip_entry_creation": "Spring oprettelse af {{entry}}-post over, hvis de ikke findes i Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Hvis kontakten ikke findes under en konto, opret nyt lead fra deltager",
|
||||
"salesforce_create_new_contact_under_account": "Opret en ny kontakt under en konto baseret på deltagerens e-maildomæne og eksisterende kontakter",
|
||||
"mass_assign_attributes": "Masse tildel attributter",
|
||||
"salesforce_book_directly_with_attendee_owner": "Hvis deltageren findes i Salesforce, book direkte med ejeren",
|
||||
"salesforce_check_owner_of": "Enhed til at tjekke ejeren af for at booke direkte",
|
||||
"account": "Konto",
|
||||
"choose_hosts_schedule": "Vælg værternes tidsplaner",
|
||||
"hosts_schedule_description": "Du kan vælge en anden tidsplan for hver vært. Hver værts standardtidsplan er valgt som standard.",
|
||||
"no_hosts_description": "Ingen værter tildelt, tilføj værter i tildelingsfanen.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Tilføj dine nye strenge ovenfor her ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Telefonnummer wird angegeben",
|
||||
"before_event_trigger": "vor Beginn des Termins",
|
||||
"event_cancelled_trigger": "wenn der Termin abgesagt wird",
|
||||
"after_hosts_cal_video_no_show": "Nachdem Gastgeber nicht zum Cal-Video erscheinen",
|
||||
"after_guests_cal_video_no_show": "Nachdem Gäste nicht zum Cal-Video erscheinen",
|
||||
"new_event_trigger": "wenn ein neuer Termin gebucht wird",
|
||||
"email_host_action": "E-Mail an den Veranstalter senden",
|
||||
"email_attendee_action": "E-Mail an Teilnehmende senden",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "eine E-Mail an eine bestimmte E-Mail-Adresse senden",
|
||||
"after_event_trigger": "nach Ende des Termins",
|
||||
"how_long_after": "Wie lange nach Ende des Termins?",
|
||||
"how_long_after_hosts_no_show": "Wie lange nachdem Gastgeber nicht zum Cal-Video-Meeting erscheinen?",
|
||||
"how_long_after_guests_no_show": "Wie lange nachdem Gäste nicht zum Cal-Video-Meeting erscheinen?",
|
||||
"how_long_after_user_no_show_minutes": "Wie viele Minuten nachdem die Teilnehmer nicht zum Cal-Video-Meeting erscheinen?",
|
||||
"no_available_slots": "Keine verfügbaren Plätze",
|
||||
"time_available": "Zeit verfügbar",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Können Sie die richtige Konferenz-App nicht finden? Besuchen Sie unseren <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "App neu installieren",
|
||||
"reschedule_reason": "Verlegungsgrund",
|
||||
"choose_common_schedule_team_event": "Gemeinsamen Zeitplan auswählen",
|
||||
"choose_common_schedule_team_event_description": "Aktivieren Sie dies, wenn Sie einen gemeinsamen Zeitplan zwischen Hosts verwenden möchten. Wenn deaktiviert, ist jeder Host basierend auf seinen Standardplan buchbar.",
|
||||
"choose_common_schedule_team_event_description": "Aktivieren Sie dies, wenn Sie einen gemeinsamen Zeitplan für alle Gastgeber verwenden möchten. Wenn deaktiviert, wird jeder Gastgeber basierend auf seinem Standardzeitplan oder seinem gewählten Zeitplan gebucht.",
|
||||
"reason": "Grund",
|
||||
"sender_id": "Absender-ID",
|
||||
"sender_id_error_message": "Nur Buchstaben, Zahlen und Leerzeichen erlaubt (max. 11 Zeichen)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Neue Option",
|
||||
"update_profile": "Mitglied aktualisieren",
|
||||
"attribute_updated_successfully": "Attribut erfolgreich aktualisiert",
|
||||
"attribute_deleted_successfully": "Attribut erfolgreich gelöscht",
|
||||
"attributes_edited_successfully": "Attribute erfolgreich bearbeitet",
|
||||
"attribute_meta_description": "Verwalten Sie Attribute für Ihre Teammitglieder",
|
||||
"attributes_edit_description": "Bearbeiten Sie Attribute für Ihre Teammitglieder",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "aktueller Monat",
|
||||
"year_to_date": "aktuelles Jahr",
|
||||
"custom_range": "benutzerdefinierter Zeitraum",
|
||||
"show_all_columns": "Alle Spalten anzeigen",
|
||||
"toggle_columns": "Spalten ein-/ausblenden",
|
||||
"no_columns_found": "Keine Spalten gefunden",
|
||||
"salesforce_create_record_as": "Bei der Buchung Ereignisse und neue Teilnehmer hinzufügen als:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Kontakt unter einem Account",
|
||||
"salesforce_skip_entry_creation": "Überspringen Sie die Erstellung eines {{entry}}-Datensatzes, wenn dieser nicht in Salesforce existiert",
|
||||
"salesforce_if_account_does_not_exist": "Wenn der Kontakt nicht unter einem Account existiert, erstellen Sie einen neuen Lead aus dem Teilnehmer",
|
||||
"salesforce_create_new_contact_under_account": "Erstellen Sie einen neuen Kontakt unter einem Account basierend auf der E-Mail-Domain des Teilnehmers und bestehenden Kontakten",
|
||||
"mass_assign_attributes": "Attribute massenweise zuweisen",
|
||||
"salesforce_book_directly_with_attendee_owner": "Wenn der Teilnehmer in Salesforce existiert, buchen Sie direkt beim Besitzer",
|
||||
"salesforce_check_owner_of": "Entität, deren Besitzer für die direkte Buchung überprüft werden soll",
|
||||
"account": "Account",
|
||||
"choose_hosts_schedule": "Zeitpläne der Gastgeber auswählen",
|
||||
"hosts_schedule_description": "Sie können für jeden Gastgeber einen anderen Zeitplan auswählen. Standardmäßig wird der Standardzeitplan jedes Gastgebers ausgewählt.",
|
||||
"no_hosts_description": "Keine Gastgeber zugewiesen. Fügen Sie Gastgeber im Zuweisungs-Tab hinzu.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Fügen Sie Ihre neuen Code-Zeilen über dieser hinzu ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
"event_request_cancelled": "Your scheduled event was canceled",
|
||||
"organizer": "Organizer",
|
||||
"need_to_reschedule_or_cancel": "Need to reschedule or cancel?",
|
||||
"you_can_view_booking_details_with_this_url":"You can view the booking details from this url {{url}} and add the event to your calendar",
|
||||
"you_can_view_booking_details_with_this_url": "You can view the booking details from this url {{url}} and add the event to your calendar",
|
||||
"no_options_available": "No options available",
|
||||
"cancellation_reason": "Reason for cancellation (optional)",
|
||||
"cancellation_reason_placeholder": "Why are you cancelling?",
|
||||
@@ -601,7 +601,7 @@
|
||||
"enter_address": "Enter address",
|
||||
"in_person_attendee_address": "In Person (Attendee Address)",
|
||||
"somewhere_else": "Somewhere Else",
|
||||
"custom_attendee_location":"Custom attendee location",
|
||||
"custom_attendee_location": "Custom attendee location",
|
||||
"any_location": "Any location",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
@@ -1702,7 +1702,7 @@
|
||||
"invalid_credential_action": "Reinstall app",
|
||||
"reschedule_reason": "Reschedule reason",
|
||||
"choose_common_schedule_team_event": "Choose a common schedule",
|
||||
"choose_common_schedule_team_event_description": "Enable this if you want to use a common schedule between hosts. When disabled, each host will be booked based on their default schedule.",
|
||||
"choose_common_schedule_team_event_description": "Enable this if you want to use a common schedule between hosts. When disabled, each host will be booked based on their default schedule or their choosen schedule.",
|
||||
"reason": "Reason",
|
||||
"sender_id": "Sender ID",
|
||||
"sender_id_error_message": "Only letters, numbers and spaces allowed (max. 11 characters)",
|
||||
@@ -2484,7 +2484,7 @@
|
||||
"add_emails": "Add Emails",
|
||||
"add_email_description": "Add an email address to replace your primary or to use as an alternative email on your event types.",
|
||||
"confirm_email": "Confirm your email",
|
||||
"confirming_your_booking_sms":"$t(hey_there) {{name}}, confirming your booking on {{date}}.",
|
||||
"confirming_your_booking_sms": "$t(hey_there) {{name}}, confirming your booking on {{date}}.",
|
||||
"scheduler_first_name": "The first name of the person booking",
|
||||
"scheduler_last_name": "The last name of the person booking",
|
||||
"scheduler_name": "Scheduler Name",
|
||||
@@ -2592,19 +2592,20 @@
|
||||
"event_expired": "This event is expired",
|
||||
"skip_contact_creation": "Skip creating contacts if they do not exist in {{appName}} ",
|
||||
"skip_writing_to_calendar_note": "If your ICS link is read-only (e.g., Proton Calendar), check the box above to avoid errors. You'll also need to manually update your calendar for changes.",
|
||||
"attributes":"Attributes",
|
||||
"attributes": "Attributes",
|
||||
"new_attribute": "New attribute",
|
||||
"add_attributes": "Add attributes",
|
||||
"add_attributes_description": "Add attributes to your team members",
|
||||
"new_option": "New option",
|
||||
"update_profile":"Update member",
|
||||
"update_profile": "Update member",
|
||||
"attribute_updated_successfully": "Attribute updated successfully",
|
||||
"attribute_deleted_successfully": "Attribute deleted successfully",
|
||||
"attributes_edited_successfully": "Attributes edited successfully",
|
||||
"attribute_meta_description": "Manage attributes for your team members",
|
||||
"attributes_edit_description": "Edit attributes for your team members",
|
||||
"back_to_attributes": "Back to attributes",
|
||||
"delete_attribute": "Are you sure you want to delete this option?",
|
||||
"delete_attribute_description":"This option is assigned to {{numberOfUsers}} members. Deleting it will remove it from their profile.",
|
||||
"delete_attribute_description": "This option is assigned to {{numberOfUsers}} members. Deleting it will remove it from their profile.",
|
||||
"disable_all_emails_to_attendees": "Disable standard emails to attendees related to this event type",
|
||||
"disable_all_emails_description": "Disables standard email communication related to this event type, including booking confirmations, reminders, and cancellations.",
|
||||
"disable_all_emails_to_hosts": "Disable standard emails to hosts related to this event type",
|
||||
@@ -2627,7 +2628,7 @@
|
||||
"stripe_connect_atom_loading_label": "Checking Stripe credentials",
|
||||
"booking_question_response_variables": "Booking question response variables",
|
||||
"managed_by_teamAdmins": "Managed by {{teamAdmins}}",
|
||||
"number_of_options":"{{count}} options",
|
||||
"number_of_options": "{{count}} options",
|
||||
"reschedule_with_same_round_robin_host_title": "Reschedule with same Round-Robin host",
|
||||
"reschedule_with_same_round_robin_host_description": "Rescheduled events will be assigned to the same host as initially scheduled",
|
||||
"disable_input_if_prefilled": "Disable input if the URL identifier is prefilled",
|
||||
@@ -2644,6 +2645,21 @@
|
||||
"month_to_date": "month to date",
|
||||
"year_to_date": "year to date",
|
||||
"custom_range": "custom range",
|
||||
"show_all_columns": "Show all columns",
|
||||
"toggle_columns": "Toggle columns",
|
||||
"no_columns_found": "No columns found",
|
||||
"salesforce_create_record_as": "On booking, add events on and new attendees as:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Contact under an account",
|
||||
"salesforce_skip_entry_creation": "Skip creating {{entry}} record if they do not exist in Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "If the contact does not exist under an account, create new lead from attendee",
|
||||
"salesforce_create_new_contact_under_account": "Create a new contact under an account based on email domain of attendee and existing contacts",
|
||||
"mass_assign_attributes": "Mass assign attributes",
|
||||
"salesforce_book_directly_with_attendee_owner": "If attendee exists in Salesforce, book directly with the owner",
|
||||
"salesforce_check_owner_of": "Entity to check owner of to book directly",
|
||||
"account": "Account",
|
||||
"choose_hosts_schedule": "Choose host schedules",
|
||||
"hosts_schedule_description": "You can select a different schedule for each host. Each host's default schedule is chosen by default.",
|
||||
"no_hosts_description": "No hosts assigned, add hosts in assignment tab.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Se proporcionará el número de teléfono",
|
||||
"before_event_trigger": "antes de que comience el evento",
|
||||
"event_cancelled_trigger": "cuando el evento está cancelado",
|
||||
"after_hosts_cal_video_no_show": "Después de que los anfitriones no se unan al video de Cal",
|
||||
"after_guests_cal_video_no_show": "Después de que los invitados no se unan al video de Cal",
|
||||
"new_event_trigger": "cuando se reserva un nuevo evento",
|
||||
"email_host_action": "enviar correo electrónico al anfitrión",
|
||||
"email_attendee_action": "enviar correo electrónico a los asistentes",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "enviar correo electrónico a una dirección específica",
|
||||
"after_event_trigger": "después de que termine el evento",
|
||||
"how_long_after": "¿Cuánto tiempo después de que termine el evento?",
|
||||
"how_long_after_hosts_no_show": "¿Cuánto tiempo después de que los anfitriones no se presenten en la reunión de video de Cal?",
|
||||
"how_long_after_guests_no_show": "¿Cuánto tiempo después de que los invitados no se presenten en la reunión de video de Cal?",
|
||||
"how_long_after_user_no_show_minutes": "¿Cuánto tiempo después de que los usuarios no se presenten en la reunión de video de Cal?",
|
||||
"no_available_slots": "No hay espacios disponibles",
|
||||
"time_available": "Tiempo disponible",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "¿No puedes encontrar la aplicación de conferencias adecuada? Visita nuestra <1>Tienda de Aplicaciones</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Reinstalar la aplicación",
|
||||
"reschedule_reason": "Razón para reprogramar",
|
||||
"choose_common_schedule_team_event": "Elige un horario común",
|
||||
"choose_common_schedule_team_event_description": "Habilita esto si deseas usar un horario común entre los anfitriones. Cuando está deshabilitado, cada anfitrión será reservado según su horario predeterminado.",
|
||||
"choose_common_schedule_team_event_description": "Activa esto si deseas usar un horario común entre los anfitriones. Cuando está desactivado, cada anfitrión será reservado según su horario predeterminado o el horario que hayan elegido.",
|
||||
"reason": "Razón",
|
||||
"sender_id": "ID del remitente",
|
||||
"sender_id_error_message": "Solo se permiten letras, números y espacios (máx. 11 caracteres)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nueva opción",
|
||||
"update_profile": "Actualizar miembro",
|
||||
"attribute_updated_successfully": "Atributo actualizado con éxito",
|
||||
"attribute_deleted_successfully": "Atributo eliminado exitosamente",
|
||||
"attributes_edited_successfully": "Atributos editados con éxito",
|
||||
"attribute_meta_description": "Gestiona los atributos de los miembros de tu equipo",
|
||||
"attributes_edit_description": "Edita los atributos de los miembros de tu equipo",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "mes hasta la fecha",
|
||||
"year_to_date": "año hasta la fecha",
|
||||
"custom_range": "rango personalizado",
|
||||
"show_all_columns": "Mostrar todas las columnas",
|
||||
"toggle_columns": "Alternar columnas",
|
||||
"no_columns_found": "No se encontraron columnas",
|
||||
"salesforce_create_record_as": "Al reservar, agregar eventos y nuevos asistentes como:",
|
||||
"salesforce_lead": "Cliente potencial",
|
||||
"salesforce_contact_under_account": "Contacto bajo una cuenta",
|
||||
"salesforce_skip_entry_creation": "Omitir la creación del registro de {{entry}} si no existe en Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Si el contacto no existe bajo una cuenta, crear un nuevo cliente potencial a partir del asistente",
|
||||
"salesforce_create_new_contact_under_account": "Crear un nuevo contacto bajo una cuenta basado en el dominio de correo electrónico del asistente y los contactos existentes",
|
||||
"mass_assign_attributes": "Asignar atributos en masa",
|
||||
"salesforce_book_directly_with_attendee_owner": "Si el asistente existe en Salesforce, reservar directamente con el propietario",
|
||||
"salesforce_check_owner_of": "Entidad de la cual verificar el propietario para reservar directamente",
|
||||
"account": "Cuenta",
|
||||
"choose_hosts_schedule": "Elegir horarios de los anfitriones",
|
||||
"hosts_schedule_description": "Puedes seleccionar un horario diferente para cada anfitrión. Por defecto, se elige el horario predeterminado de cada anfitrión.",
|
||||
"no_hosts_description": "No hay anfitriones asignados, agrega anfitriones en la pestaña de asignación.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Agrega tus nuevas cadenas arriba de esta línea ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Se proporcionará el número de teléfono",
|
||||
"before_event_trigger": "antes del inicio del evento",
|
||||
"event_cancelled_trigger": "cuando se cancela el evento",
|
||||
"after_hosts_cal_video_no_show": "Después de que los anfitriones no se unan al video de Cal",
|
||||
"after_guests_cal_video_no_show": "Después de que los invitados no se unan al video de Cal",
|
||||
"new_event_trigger": "cuando se reserva un nuevo evento",
|
||||
"email_host_action": "enviar correo electrónico al anfitrión",
|
||||
"email_attendee_action": "enviar correo electrónico a los asistentes",
|
||||
@@ -1334,7 +1336,7 @@
|
||||
"new_seat_title": "Alguien se ha añadido a un evento",
|
||||
"variable": "Variable",
|
||||
"event_name_variable": "Nombre del evento",
|
||||
"attendee_name_variable": "Nombre del asistente",
|
||||
"attendee_name_variable": "Nombre completo del asistente",
|
||||
"event_date_variable": "Fecha del evento",
|
||||
"event_time_variable": "Hora del evento",
|
||||
"organizer_name_variable": "Nombre del organizador",
|
||||
@@ -1490,7 +1492,7 @@
|
||||
"location_info": "Ubicación del evento",
|
||||
"additional_notes_variable": "Notas Adicionales",
|
||||
"additional_notes_info": "Notas adicionales de la reserva",
|
||||
"attendee_name_info": "Nombre de la persona que reserva",
|
||||
"attendee_name_info": "Nombre completo de la persona que reserva",
|
||||
"organizer_name_info": "Nombre del organizador",
|
||||
"to": "Para",
|
||||
"workflow_turned_on_successfully": "El flujo de trabajo {{workflowName}} se ha activado {{offOn}} con éxito",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "enviar un correo electrónico a una dirección específica",
|
||||
"after_event_trigger": "después de que el evento termine",
|
||||
"how_long_after": "¿Cuánto tiempo después de que termine el evento?",
|
||||
"how_long_after_hosts_no_show": "¿Cuánto tiempo después de que los anfitriones no se presenten en la reunión de video de Cal?",
|
||||
"how_long_after_guests_no_show": "¿Cuánto tiempo después de que los invitados no se presenten en la reunión de video de Cal?",
|
||||
"how_long_after_user_no_show_minutes": "¿Cuánto tiempo después de que los usuarios no se presenten en la reunión de video de Cal?",
|
||||
"no_available_slots": "No hay espacios disponibles",
|
||||
"time_available": "Tiempo disponible",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "¿No encuentra la aplicación de conferencias adecuada? Visite nuestra <1>Tienda de aplicaciones</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Reinstalar aplicación",
|
||||
"reschedule_reason": "Razón de la reprogramación",
|
||||
"choose_common_schedule_team_event": "Elige un horario común para todos",
|
||||
"choose_common_schedule_team_event_description": "Habilite esto si desea utilizar un cronograma común entre anfitriones. Cuando esté desactivado, cada anfitrión se reservará en relación a su horario predeterminado.",
|
||||
"choose_common_schedule_team_event_description": "Activa esta opción si deseas utilizar un horario común entre los anfitriones. Cuando está desactivada, cada anfitrión será reservado según su horario predeterminado o el horario que haya elegido.",
|
||||
"reason": "Motivo",
|
||||
"sender_id": "ID del remitente",
|
||||
"sender_id_error_message": "Sólo se permiten letras, números y espacios (máx. 11 caracteres)",
|
||||
@@ -2210,7 +2215,7 @@
|
||||
"no_other_teams_found_description": "No hay otros equipos en esta organización.",
|
||||
"attendee_first_name_variable": "Nombre del asistente",
|
||||
"attendee_last_name_variable": "Apellido del asistente",
|
||||
"attendee_first_name_info": "Nombre de la persona que reserva",
|
||||
"attendee_first_name_info": "Primer nombre de la persona que reserva",
|
||||
"attendee_last_name_info": "Apellido de la persona que reserva",
|
||||
"your_monthly_digest": "Su resumen mensual",
|
||||
"member_name": "Nombre del miembro",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nueva opción",
|
||||
"update_profile": "Actualizar miembro",
|
||||
"attribute_updated_successfully": "Atributo actualizado con éxito",
|
||||
"attribute_deleted_successfully": "Atributo eliminado con éxito",
|
||||
"attributes_edited_successfully": "Atributos editados con éxito",
|
||||
"attribute_meta_description": "Gestionar atributos para los miembros de tu equipo",
|
||||
"attributes_edit_description": "Editar atributos para los miembros de tu equipo",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "mes hasta la fecha",
|
||||
"year_to_date": "año hasta la fecha",
|
||||
"custom_range": "rango personalizado",
|
||||
"show_all_columns": "Mostrar todas las columnas",
|
||||
"toggle_columns": "Alternar columnas",
|
||||
"no_columns_found": "No se encontraron columnas",
|
||||
"salesforce_create_record_as": "Al reservar, agregar eventos y nuevos asistentes como:",
|
||||
"salesforce_lead": "Cliente potencial",
|
||||
"salesforce_contact_under_account": "Contacto bajo una cuenta",
|
||||
"salesforce_skip_entry_creation": "Omitir la creación del registro de {{entry}} si no existe en Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Si el contacto no existe bajo una cuenta, crear un nuevo cliente potencial a partir del asistente",
|
||||
"salesforce_create_new_contact_under_account": "Crear un nuevo contacto bajo una cuenta basado en el dominio de correo electrónico del asistente y los contactos existentes",
|
||||
"mass_assign_attributes": "Asignar atributos en masa",
|
||||
"salesforce_book_directly_with_attendee_owner": "Si el asistente existe en Salesforce, reservar directamente con el propietario",
|
||||
"salesforce_check_owner_of": "Entidad de la que verificar el propietario para reservar directamente",
|
||||
"account": "Cuenta",
|
||||
"choose_hosts_schedule": "Elegir horarios de los anfitriones",
|
||||
"hosts_schedule_description": "Puedes seleccionar un horario diferente para cada anfitrión. Por defecto, se elige el horario predeterminado de cada anfitrión.",
|
||||
"no_hosts_description": "No hay anfitriones asignados, añade anfitriones en la pestaña de asignación.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Agregue sus nuevas cadenas arriba ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Telefoninumber antakse",
|
||||
"before_event_trigger": "enne ürituse algust",
|
||||
"event_cancelled_trigger": "Kui sündmus tühistatakse",
|
||||
"after_hosts_cal_video_no_show": "Pärast seda, kui võõrustajad ei liitu Cal videokõnega",
|
||||
"after_guests_cal_video_no_show": "Pärast seda, kui külalised ei liitu Cal videokõnega",
|
||||
"new_event_trigger": "kui uus sündmus on broneeritud",
|
||||
"email_host_action": "saada e-kiri hostile",
|
||||
"email_attendee_action": "saada osalejatele e-kiri",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "saada e-kiri kindlale e-posti aadressile",
|
||||
"after_event_trigger": "pärast sündmuse lõppu",
|
||||
"how_long_after": "Kui kaua pärast ürituse lõppu?",
|
||||
"how_long_after_hosts_no_show": "Kui kaua pärast seda, kui võõrustajad ei ilmu Cal videokoosolekule?",
|
||||
"how_long_after_guests_no_show": "Kui kaua pärast seda, kui külalised ei ilmu Cal videokoosolekule?",
|
||||
"how_long_after_user_no_show_minutes": "Kui mitu minutit pärast seda, kui kasutajad ei ilmu Cal videokoosolekule?",
|
||||
"no_available_slots": "Saadaolevaid teenindusaegu pole",
|
||||
"time_available": "Aeg saadaval",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Ei leia õiget konverentsirakendust? Külastage meie <1>Rakenduste Poodi</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "installige rakendus uuesti",
|
||||
"reschedule_reason": "Ajastamise põhjus",
|
||||
"choose_common_schedule_team_event": "Valige ühine ajakava",
|
||||
"choose_common_schedule_team_event_description": "Lubage see, kui soovite kasutada hostide vahel ühist ajakava. Kui see on keelatud, broneeritakse iga host nende vaikegraafiku alusel.",
|
||||
"choose_common_schedule_team_event_description": "Luba see, kui soovid võõrustajate vahel kasutada ühist ajakava. Kui see on keelatud, broneeritakse iga võõrustaja aeg vastavalt nende vaikimisi ajakavale või nende valitud ajakavale.",
|
||||
"reason": "Põhjus",
|
||||
"sender_id": "Saatja ID",
|
||||
"sender_id_error_message": "Lubatud on ainult tähed, numbrid ja tühikud (max 11 tähemärki)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Uus valik",
|
||||
"update_profile": "Uuenda liiget",
|
||||
"attribute_updated_successfully": "Atribuut edukalt uuendatud",
|
||||
"attribute_deleted_successfully": "Atribuut on edukalt kustutatud",
|
||||
"attributes_edited_successfully": "Atribuudid edukalt muudetud",
|
||||
"attribute_meta_description": "Halda atribuute oma meeskonnaliikmete jaoks",
|
||||
"attributes_edit_description": "Muuda atribuute oma meeskonnaliikmete jaoks",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "kuu algusest tänaseni",
|
||||
"year_to_date": "aasta algusest tänaseni",
|
||||
"custom_range": "kohandatud vahemik",
|
||||
"show_all_columns": "Näita kõiki veerge",
|
||||
"toggle_columns": "Lülita veerud sisse/välja",
|
||||
"no_columns_found": "Veerge ei leitud",
|
||||
"salesforce_create_record_as": "Broneeringu korral lisa sündmused ja uued osalejad kui:",
|
||||
"salesforce_lead": "Müügivihje",
|
||||
"salesforce_contact_under_account": "Kontakt konto all",
|
||||
"salesforce_skip_entry_creation": "Jäta {{entry}} kirje loomata, kui seda Salesforce'is ei eksisteeri",
|
||||
"salesforce_if_account_does_not_exist": "Kui kontakti ei eksisteeri konto all, loo osaleja andmetest uus müügivihje",
|
||||
"salesforce_create_new_contact_under_account": "Loo uus kontakt konto alla, põhinedes osaleja e-posti domeenile ja olemasolevatele kontaktidele",
|
||||
"mass_assign_attributes": "Massiline atribuutide määramine",
|
||||
"salesforce_book_directly_with_attendee_owner": "Kui osaleja eksisteerib Salesforce'is, broneeri otse omanikuga",
|
||||
"salesforce_check_owner_of": "Üksus, mille omanikku kontrollida otsebroneerimiseks",
|
||||
"account": "Konto",
|
||||
"choose_hosts_schedule": "Vali võõrustajate ajakavad",
|
||||
"hosts_schedule_description": "Saad valida igale võõrustajale erineva ajakava. Vaikimisi on valitud iga võõrustaja tavaline ajakava.",
|
||||
"no_hosts_description": "Võõrustajaid pole määratud, lisa need määramise vahekaardil.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Un numéro de téléphone sera fourni",
|
||||
"before_event_trigger": "avant le début de l'événement",
|
||||
"event_cancelled_trigger": "lorsque l'événement est annulé",
|
||||
"after_hosts_cal_video_no_show": "Après que les hôtes ne rejoignent pas la vidéo Cal",
|
||||
"after_guests_cal_video_no_show": "Après que les invités ne rejoignent pas la vidéo Cal",
|
||||
"new_event_trigger": "lorsqu'un nouvel événement est réservé",
|
||||
"email_host_action": "envoyer un e-mail à l'hôte",
|
||||
"email_attendee_action": "envoyer un e-mail aux participants",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "envoyer un e-mail à une adresse e-mail spécifique",
|
||||
"after_event_trigger": "après la fin de l'événement",
|
||||
"how_long_after": "Combien de temps après la fin de l'événement ?",
|
||||
"how_long_after_hosts_no_show": "Combien de temps après que les hôtes ne se présentent pas à la réunion vidéo Cal ?",
|
||||
"how_long_after_guests_no_show": "Combien de temps après que les invités ne se présentent pas à la réunion vidéo Cal ?",
|
||||
"how_long_after_user_no_show_minutes": "Combien de minutes après que les utilisateurs ne se présentent pas à la réunion vidéo Cal ?",
|
||||
"no_available_slots": "Aucun créneau disponible",
|
||||
"time_available": "Disponibilités",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Vous ne trouvez pas l'application de visioconférence adaptée ? Visitez notre <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Réinstaller l'application",
|
||||
"reschedule_reason": "Raison de la replanification",
|
||||
"choose_common_schedule_team_event": "Choisissez un horaire commun",
|
||||
"choose_common_schedule_team_event_description": "Activez cette option si vous souhaitez utiliser des disponibilités communes entre les hôtes. Si cette option est désactivée, chaque hôte recevra les réservations en fonction de ses disponibilités par défaut.",
|
||||
"choose_common_schedule_team_event_description": "Activez cette option si vous souhaitez utiliser un horaire commun entre les hôtes. Lorsqu'elle est désactivée, chaque hôte sera réservé en fonction de son horaire par défaut ou de l'horaire qu'il a choisi.",
|
||||
"reason": "Raison",
|
||||
"sender_id": "ID de l'expéditeur",
|
||||
"sender_id_error_message": "Seules les lettres, chiffres et espaces sont autorisés (max. 11 caractères)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nouvelle option",
|
||||
"update_profile": "Mettre à jour le membre",
|
||||
"attribute_updated_successfully": "Attribut mis à jour avec succès",
|
||||
"attribute_deleted_successfully": "Attribut supprimé avec succès",
|
||||
"attributes_edited_successfully": "Attributs modifiés avec succès",
|
||||
"attribute_meta_description": "Gérer les attributs de vos membres d'équipe",
|
||||
"attributes_edit_description": "Modifier les attributs de vos membres d'équipe",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "mois en cours",
|
||||
"year_to_date": "année en cours",
|
||||
"custom_range": "période personnalisée",
|
||||
"show_all_columns": "Afficher toutes les colonnes",
|
||||
"toggle_columns": "Basculer les colonnes",
|
||||
"no_columns_found": "Aucune colonne trouvée",
|
||||
"salesforce_create_record_as": "Lors de la réservation, ajouter les événements et les nouveaux participants en tant que :",
|
||||
"salesforce_lead": "Prospect",
|
||||
"salesforce_contact_under_account": "Contact sous un compte",
|
||||
"salesforce_skip_entry_creation": "Ne pas créer d'enregistrement {{entry}} s'il n'existe pas dans Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Si le contact n'existe pas sous un compte, créer un nouveau prospect à partir du participant",
|
||||
"salesforce_create_new_contact_under_account": "Créer un nouveau contact sous un compte basé sur le domaine e-mail du participant et les contacts existants",
|
||||
"mass_assign_attributes": "Attribuer des attributs en masse",
|
||||
"salesforce_book_directly_with_attendee_owner": "Si le participant existe dans Salesforce, réserver directement avec le propriétaire",
|
||||
"salesforce_check_owner_of": "Entité dont il faut vérifier le propriétaire pour réserver directement",
|
||||
"account": "Compte",
|
||||
"choose_hosts_schedule": "Choisir les horaires des hôtes",
|
||||
"hosts_schedule_description": "Vous pouvez sélectionner un horaire différent pour chaque hôte. L'horaire par défaut de chaque hôte est choisi par défaut.",
|
||||
"no_hosts_description": "Aucun hôte assigné, ajoutez des hôtes dans l'onglet d'affectation.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Ajoutez vos nouvelles chaînes ci-dessus ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "מספר הטלפון יסופק",
|
||||
"before_event_trigger": "לפני שהאירוע מתחיל",
|
||||
"event_cancelled_trigger": "כאשר אירוע מבוטל",
|
||||
"after_hosts_cal_video_no_show": "לאחר שהמארחים לא מצטרפים לשיחת הווידאו ב-Cal",
|
||||
"after_guests_cal_video_no_show": "לאחר שהאורחים לא מצטרפים לשיחת הווידאו ב-Cal",
|
||||
"new_event_trigger": "כאשר אירוע חדש מוזמן",
|
||||
"email_host_action": "שלח מייל למארח",
|
||||
"email_attendee_action": "שליחת דוא\"ל למשתתפים",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "לשלוח דוא״ל לכתובת מסוימת",
|
||||
"after_event_trigger": "לאחר סיום האירוע",
|
||||
"how_long_after": "כמה זמן לאחר סיום האירוע?",
|
||||
"how_long_after_hosts_no_show": "כמה זמן לאחר שהמארחים לא מופיעים בשיחת הווידאו ב-Cal?",
|
||||
"how_long_after_guests_no_show": "כמה זמן לאחר שהאורחים לא מופיעים בשיחת הווידאו ב-Cal?",
|
||||
"how_long_after_user_no_show_minutes": "כמה זמן לאחר שהמשתמשים לא מופיעים בשיחת הווידאו ב-Cal?",
|
||||
"no_available_slots": "אין חלונות זמן זמינים",
|
||||
"time_available": "זמן זמין",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "לא מוצאים את אפליקציית הווידאו המתאימה? בקרו ב<1>חנות האפליקציות</1> שלנו.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "להתקין את היישום מחדש",
|
||||
"reschedule_reason": "הסיבה לקביעת מועד חדש",
|
||||
"choose_common_schedule_team_event": "בחירת לוח זמנים משותף",
|
||||
"choose_common_schedule_team_event_description": "יש להפעיל אפשרות זו אם רוצים להשתמש בלוח זמנים משותף בין המארחים. אם האפשרות הזו מבוטלת, כל מארח יוזמן לפי לוח הזמנים המשמש כברירת המחדל שלו.",
|
||||
"choose_common_schedule_team_event_description": "הפעל אפשרות זו אם ברצונך להשתמש בלוח זמנים משותף בין המארחים. כאשר האפשרות מבוטלת, כל מארח יוזמן על פי לוח הזמנים המוגדר כברירת מחדל או לוח הזמנים שנבחר.",
|
||||
"reason": "סיבה",
|
||||
"sender_id": "מזהה השולח/ת",
|
||||
"sender_id_error_message": "מותר להשתמש רק באותיות, במספרים וברווחים (לכל היותר 11 תווים)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "אפשרות חדשה",
|
||||
"update_profile": "עדכן חבר צוות",
|
||||
"attribute_updated_successfully": "המאפיין עודכן בהצלחה",
|
||||
"attribute_deleted_successfully": "התכונה נמחקה בהצלחה",
|
||||
"attributes_edited_successfully": "המאפיינים נערכו בהצלחה",
|
||||
"attribute_meta_description": "נהל מאפיינים עבור חברי הצוות שלך",
|
||||
"attributes_edit_description": "ערוך מאפיינים עבור חברי הצוות שלך",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "מתחילת החודש",
|
||||
"year_to_date": "מתחילת השנה",
|
||||
"custom_range": "טווח מותאם אישית",
|
||||
"show_all_columns": "הצג את כל העמודות",
|
||||
"toggle_columns": "החלף עמודות",
|
||||
"no_columns_found": "לא נמצאו עמודות",
|
||||
"salesforce_create_record_as": "בעת הזמנה, הוסף אירועים וחדשים משתתפים כ:",
|
||||
"salesforce_lead": "ליד",
|
||||
"salesforce_contact_under_account": "איש קשר תחת חשבון",
|
||||
"salesforce_skip_entry_creation": "דלג על יצירת רשומת {{entry}} אם הם לא קיימים ב-Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "אם איש הקשר לא קיים תחת חשבון, צור ליד חדש מהמשתתף",
|
||||
"salesforce_create_new_contact_under_account": "צור איש קשר חדש תחת חשבון בהתבסס על דומיין האימייל של המשתתף ואנשי קשר קיימים",
|
||||
"mass_assign_attributes": "הקצאת מאפיינים באופן גורף",
|
||||
"salesforce_book_directly_with_attendee_owner": "אם המשתתף קיים ב-Salesforce, הזמן ישירות עם הבעלים",
|
||||
"salesforce_check_owner_of": "ישות לבדוק את הבעלים שלה כדי להזמין ישירות",
|
||||
"account": "חשבון",
|
||||
"choose_hosts_schedule": "בחר לוחות זמנים למארחים",
|
||||
"hosts_schedule_description": "ניתן לבחור לוח זמנים שונה לכל מארח. לוח הזמנים המוגדר כברירת מחדל נבחר עבור כל מארח.",
|
||||
"no_hosts_description": "לא הוקצו מארחים, הוסף מארחים בלשונית ההקצאה.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "A telefonszámot megadjuk",
|
||||
"before_event_trigger": "az esemény kezdete előtt",
|
||||
"event_cancelled_trigger": "amikor az esemény le lett mondva",
|
||||
"after_hosts_cal_video_no_show": "Miután a házigazdák nem csatlakoznak a cal videóhoz",
|
||||
"after_guests_cal_video_no_show": "Miután a vendégek nem csatlakoznak a cal videóhoz",
|
||||
"new_event_trigger": "új esemény lefoglalásakor",
|
||||
"email_host_action": "küldjön e-mailt a házigazdának",
|
||||
"email_attendee_action": "küldjön e-mailt a résztvevőknek",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "küldjön e-mailt egy adott e-mail címre",
|
||||
"after_event_trigger": "az esemény befejezése után",
|
||||
"how_long_after": "Mennyi idővel az esemény vége után?",
|
||||
"how_long_after_hosts_no_show": "Mennyi idő után, ha a házigazdák nem jelennek meg a cal videó találkozón?",
|
||||
"how_long_after_guests_no_show": "Mennyi idő után, ha a vendégek nem jelennek meg a cal videó találkozón?",
|
||||
"how_long_after_user_no_show_minutes": "Mennyi idő után, ha a felhasználók nem jelennek meg a cal videó találkozón?",
|
||||
"no_available_slots": "Nincsenek elérhető helyek",
|
||||
"time_available": "Rendelkezésre álló idő",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Nem találja a megfelelő konferencia alkalmazást? Látogasson el az <1>App Store</1>-unkba.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Alkalmazás újratelepítése",
|
||||
"reschedule_reason": "Időpontmódosítás oka",
|
||||
"choose_common_schedule_team_event": "Válasszon közös menetrendet",
|
||||
"choose_common_schedule_team_event_description": "Engedélyezze ezt, ha közös ütemezést szeretne használni a szervezők között. Ha le van tiltva, minden szervező az alapértelmezett ütemezésük alapján lesz lefoglalva.",
|
||||
"choose_common_schedule_team_event_description": "Engedélyezze ezt, ha közös ütemtervet szeretne használni a házigazdák között. Ha le van tiltva, minden házigazda az alapértelmezett vagy a választott ütemterv alapján lesz foglalva.",
|
||||
"reason": "Ok",
|
||||
"sender_id": "Feladó azonosítója",
|
||||
"sender_id_error_message": "Csak betűk, számok és szóközök megengedettek (max. 11 karakter)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Új opció",
|
||||
"update_profile": "Tag frissítése",
|
||||
"attribute_updated_successfully": "Az attribútum sikeresen frissítve",
|
||||
"attribute_deleted_successfully": "Attribútum sikeresen törölve",
|
||||
"attributes_edited_successfully": "Az attribútumok sikeresen szerkesztve",
|
||||
"attribute_meta_description": "Attribútumok kezelése a csapattagok számára",
|
||||
"attributes_edit_description": "Attribútumok szerkesztése a csapattagok számára",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "hónap elejétől",
|
||||
"year_to_date": "év elejétől",
|
||||
"custom_range": "egyéni tartomány",
|
||||
"show_all_columns": "Összes oszlop megjelenítése",
|
||||
"toggle_columns": "Oszlopok váltása",
|
||||
"no_columns_found": "Nincsenek oszlopok",
|
||||
"salesforce_create_record_as": "Foglaláskor adja hozzá az eseményeket és az új résztvevőket mint:",
|
||||
"salesforce_lead": "Érdeklődő",
|
||||
"salesforce_contact_under_account": "Kapcsolat egy fiók alatt",
|
||||
"salesforce_skip_entry_creation": "Hagyja ki a(z) {{entry}} rekord létrehozását, ha nem létezik a Salesforce-ban",
|
||||
"salesforce_if_account_does_not_exist": "Ha a kapcsolat nem létezik egy fiók alatt, hozzon létre új érdeklődőt a résztvevőből",
|
||||
"salesforce_create_new_contact_under_account": "Hozzon létre új kapcsolatot egy fiók alatt a résztvevő e-mail domainje és meglévő kapcsolatok alapján",
|
||||
"mass_assign_attributes": "Attribútumok tömeges hozzárendelése",
|
||||
"salesforce_book_directly_with_attendee_owner": "Ha a résztvevő létezik a Salesforce-ban, foglaljon közvetlenül a tulajdonossal",
|
||||
"salesforce_check_owner_of": "Entitás, amelynek tulajdonosát ellenőrizni kell a közvetlen foglaláshoz",
|
||||
"account": "Fiók",
|
||||
"choose_hosts_schedule": "Válassza ki a házigazdák ütemtervét",
|
||||
"hosts_schedule_description": "Minden házigazdához különböző ütemtervet választhat. Alapértelmezés szerint minden házigazda alapértelmezett ütemterve van kiválasztva.",
|
||||
"no_hosts_description": "Nincsenek hozzárendelt házigazdák, adjon hozzá házigazdákat a hozzárendelési fülön.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Adja hozzá az új karakterláncokat fent ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Verrà fornito il numero di telefono",
|
||||
"before_event_trigger": "prima dell'inizio dell'evento",
|
||||
"event_cancelled_trigger": "quando l'evento viene cancellato",
|
||||
"after_hosts_cal_video_no_show": "Dopo che gli host non si uniscono al video di Cal",
|
||||
"after_guests_cal_video_no_show": "Dopo che gli ospiti non si uniscono al video di Cal",
|
||||
"new_event_trigger": "quando viene prenotato un nuovo evento",
|
||||
"email_host_action": "invia e-mail all'organizzatore",
|
||||
"email_attendee_action": "invia e-mail ai partecipanti",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "invia e-mail a un indirizzo e-mail specifico",
|
||||
"after_event_trigger": "dopo la fine dell'evento",
|
||||
"how_long_after": "Quanto tempo dopo la fine dell'evento?",
|
||||
"how_long_after_hosts_no_show": "Quanto tempo dopo che gli host non si presentano alla riunione video di Cal?",
|
||||
"how_long_after_guests_no_show": "Quanto tempo dopo che gli ospiti non si presentano alla riunione video di Cal?",
|
||||
"how_long_after_user_no_show_minutes": "Quanto tempo dopo che gli utenti non si presentano alla riunione video di Cal?",
|
||||
"no_available_slots": "Nessuna fascia oraria disponibile",
|
||||
"time_available": "Tempo disponibile",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Non riesci a trovare l'app di conferenza giusta? Visita il nostro <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Reinstalla app",
|
||||
"reschedule_reason": "Motivo della riprogrammazione",
|
||||
"choose_common_schedule_team_event": "Scegli un programma comune",
|
||||
"choose_common_schedule_team_event_description": "Abilita questa opzione se desideri utilizzare un programma comune per tutti gli organizzatori. Quando l'opzione è disabilitata, ciascun organizzatore verrà prenotato in base al proprio programma predefinito.",
|
||||
"choose_common_schedule_team_event_description": "Abilita questa opzione se desideri utilizzare un orario comune tra gli host. Quando disabilitato, ogni host verrà prenotato in base al proprio orario predefinito o all'orario scelto.",
|
||||
"reason": "Motivo",
|
||||
"sender_id": "Id mittente",
|
||||
"sender_id_error_message": "Sono consentiti solo lettere, numeri e spazi (massimo 11 caratteri)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nuova opzione",
|
||||
"update_profile": "Aggiorna membro",
|
||||
"attribute_updated_successfully": "Attributo aggiornato con successo",
|
||||
"attribute_deleted_successfully": "Attributo eliminato con successo",
|
||||
"attributes_edited_successfully": "Attributi modificati con successo",
|
||||
"attribute_meta_description": "Gestisci gli attributi per i membri del tuo team",
|
||||
"attributes_edit_description": "Modifica gli attributi per i membri del tuo team",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "mese corrente",
|
||||
"year_to_date": "anno corrente",
|
||||
"custom_range": "intervallo personalizzato",
|
||||
"show_all_columns": "Mostra tutte le colonne",
|
||||
"toggle_columns": "Attiva/disattiva colonne",
|
||||
"no_columns_found": "Nessuna colonna trovata",
|
||||
"salesforce_create_record_as": "Al momento della prenotazione, aggiungi eventi e nuovi partecipanti come:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Contatto sotto un account",
|
||||
"salesforce_skip_entry_creation": "Salta la creazione del record {{entry}} se non esistono in Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Se il contatto non esiste sotto un account, crea un nuovo lead dal partecipante",
|
||||
"salesforce_create_new_contact_under_account": "Crea un nuovo contatto sotto un account basato sul dominio email del partecipante e contatti esistenti",
|
||||
"mass_assign_attributes": "Assegna attributi in massa",
|
||||
"salesforce_book_directly_with_attendee_owner": "Se il partecipante esiste in Salesforce, prenota direttamente con il proprietario",
|
||||
"salesforce_check_owner_of": "Entità per verificare il proprietario per prenotare direttamente",
|
||||
"account": "Account",
|
||||
"choose_hosts_schedule": "Scegli gli orari degli host",
|
||||
"hosts_schedule_description": "Puoi selezionare un orario diverso per ogni host. L'orario predefinito di ciascun host è selezionato di default.",
|
||||
"no_hosts_description": "Nessun host assegnato, aggiungi host nella scheda di assegnazione.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Aggiungi le tue nuove stringhe qui sopra ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "電話番号が提供されます",
|
||||
"before_event_trigger": "イベント開始前に",
|
||||
"event_cancelled_trigger": "イベントキャンセル時",
|
||||
"after_hosts_cal_video_no_show": "ホストがCalビデオに参加しない場合",
|
||||
"after_guests_cal_video_no_show": "ゲストがCalビデオに参加しない場合",
|
||||
"new_event_trigger": "新しいイベント予約時に",
|
||||
"email_host_action": "ホストにメールを送信",
|
||||
"email_attendee_action": "出席者にメールを送る",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "特定のメールアドレスにメールを送信する",
|
||||
"after_event_trigger": "イベントの終了後",
|
||||
"how_long_after": "イベント終了後のどのくらい後にしますか?",
|
||||
"how_long_after_hosts_no_show": "ホストがCalビデオ会議に現れない場合、どのくらい後に?",
|
||||
"how_long_after_guests_no_show": "ゲストがCalビデオ会議に現れない場合、どのくらい後に?",
|
||||
"how_long_after_user_no_show_minutes": "ユーザーがCalビデオ会議に現れない場合、何分後に?",
|
||||
"no_available_slots": "利用可能な時間帯がありません",
|
||||
"time_available": "利用可能な時間帯",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "適切な会議アプリが見つかりませんか?<1>アプリストア</1>をご覧ください。",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "アプリを再インストール",
|
||||
"reschedule_reason": "スケジュール変更の理由",
|
||||
"choose_common_schedule_team_event": "共通のスケジュールを選択",
|
||||
"choose_common_schedule_team_event_description": "ホスト間で共通のスケジュールを使用する場合には、これを有効にしてください。無効にすると、各ホストに対してはデフォルトのスケジュールに基づいて予約が行われます。",
|
||||
"choose_common_schedule_team_event_description": "ホスト間で共通のスケジュールを使用する場合はこれを有効にします。無効にすると、各ホストはデフォルトのスケジュールまたは選択されたスケジュールに基づいて予約されます。",
|
||||
"reason": "理由",
|
||||
"sender_id": "送信者 ID",
|
||||
"sender_id_error_message": "文字、数字、スペースのみが使用可能です (最大 11 文字)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "新しいオプション",
|
||||
"update_profile": "メンバーを更新",
|
||||
"attribute_updated_successfully": "属性が正常に更新されました",
|
||||
"attribute_deleted_successfully": "属性が正常に削除されました",
|
||||
"attributes_edited_successfully": "属性が正常に編集されました",
|
||||
"attribute_meta_description": "チームメンバーの属性を管理",
|
||||
"attributes_edit_description": "チームメンバーの属性を編集",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "月初から今日まで",
|
||||
"year_to_date": "年初から今日まで",
|
||||
"custom_range": "カスタム範囲",
|
||||
"show_all_columns": "すべての列を表示",
|
||||
"toggle_columns": "列を切り替える",
|
||||
"no_columns_found": "列が見つかりません",
|
||||
"salesforce_create_record_as": "予約時にイベントを追加し、新しい参加者を次のように追加します:",
|
||||
"salesforce_lead": "リード",
|
||||
"salesforce_contact_under_account": "アカウント下の連絡先",
|
||||
"salesforce_skip_entry_creation": "{{entry}} レコードがSalesforceに存在しない場合、作成をスキップする",
|
||||
"salesforce_if_account_does_not_exist": "連絡先がアカウントに存在しない場合、参加者から新しいリードを作成する",
|
||||
"salesforce_create_new_contact_under_account": "参加者のメールドメインと既存の連絡先に基づいて、新しい連絡先をアカウント下に作成する",
|
||||
"mass_assign_attributes": "属性の一括割り当て",
|
||||
"salesforce_book_directly_with_attendee_owner": "参加者がSalesforceに存在する場合、所有者と直接予約する",
|
||||
"salesforce_check_owner_of": "直接予約するために所有者を確認するエンティティ",
|
||||
"account": "アカウント",
|
||||
"choose_hosts_schedule": "ホストのスケジュールを選択",
|
||||
"hosts_schedule_description": "各ホストに異なるスケジュールを選択できます。各ホストのデフォルトスケジュールが初期設定として選択されています。",
|
||||
"no_hosts_description": "ホストが割り当てられていません。割り当てタブでホストを追加してください。",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ この上に新しい文字列を追加してください ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "លេខទូរស័ព្ទនឹងត្រូវបានផ្តល់",
|
||||
"before_event_trigger": "មុនព្រឹត្តិការណ៍ចាប់ផ្តើម",
|
||||
"event_cancelled_trigger": "ពេលព្រឹត្តិការណ៍ត្រូវបានលុបចោល",
|
||||
"after_hosts_cal_video_no_show": "បន្ទាប់ពីម្ចាស់ផ្ទះមិនចូលរួមវីដេអូ cal",
|
||||
"after_guests_cal_video_no_show": "បន្ទាប់ពីភ្ញៀវមិនចូលរួមវីដេអូ cal",
|
||||
"new_event_trigger": "ពេលមានការកក់ព្រឹត្តិការណ៍ថ្មី",
|
||||
"email_host_action": "ផ្ញើអ៊ីមែលទៅម្ចាស់",
|
||||
"email_attendee_action": "ផ្ញើអ៊ីមែលទៅអ្នកចូលរួម",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "ផ្ញើអ៊ីមែលទៅអាសយដ្ឋានអ៊ីមែលជាក់លាក់",
|
||||
"after_event_trigger": "បន្ទាប់ពីព្រឹត្តិការណ៍បញ្ចប់",
|
||||
"how_long_after": "បន្ទាប់ពីព្រឹត្តិការណ៍បញ្ចប់យូរប៉ុណ្ណា?",
|
||||
"how_long_after_hosts_no_show": "តើបន្ទាប់ពីម្ចាស់ផ្ទះមិនបង្ហាញខ្លួនក្នុងកិច្ចប្រជុំវីដេអូ cal រយៈពេលប៉ុន្មាន?",
|
||||
"how_long_after_guests_no_show": "តើបន្ទាប់ពីភ្ញៀវមិនបង្ហាញខ្លួនក្នុងកិច្ចប្រជុំវីដេអូ cal រយៈពេលប៉ុន្មាន?",
|
||||
"how_long_after_user_no_show_minutes": "តើបន្ទាប់ពីអ្នកប្រើមិនបង្ហាញខ្លួនក្នុងកិច្ចប្រជុំវីដេអូ cal រយៈពេលប៉ុន្មាននាទី?",
|
||||
"no_available_slots": "គ្មានពេលទំនេរ",
|
||||
"time_available": "ពេលវេលាទំនេរ",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "រកមិនឃើញកម្មវិធីសន្និសីទត្រឹមត្រូវ? ចូលទៅកាន់ <1>App Store</1> របស់យើង។",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "ដំឡើងកម្មវិធីឡើងវិញ",
|
||||
"reschedule_reason": "មូលហេតុការកំណត់ពេលថ្មី",
|
||||
"choose_common_schedule_team_event": "ជ្រើសរើសកាលវិភាគរួម",
|
||||
"choose_common_schedule_team_event_description": "បើកមុខងារនេះប្រសិនបើអ្នកចង់ប្រើកាលវិភាគរួមរវាងម្ចាស់ផ្ទះ។ នៅពេលបិទ ម្ចាស់ផ្ទះនីមួយៗនឹងត្រូវបានកក់ដោយផ្អែកលើកាលវិភាគលំនាំដើមរបស់ពួកគេ។",
|
||||
"choose_common_schedule_team_event_description": "បើកមុខងារនេះប្រសិនបើអ្នកចង់ប្រើកាលវិភាគរួមរវាងម្ចាស់ផ្ទះ។ នៅពេលបិទ ម្ចាស់ផ្ទះនីមួយៗនឹងត្រូវបានកក់ដោយផ្អែកលើកាលវិភាគលំនាំដើមរបស់ពួកគេ ឬកាលវិភាគដែលពួកគេបានជ្រើសរើស។",
|
||||
"reason": "មូលហេតុ",
|
||||
"sender_id": "លេខសម្គាល់អ្នកផ្ញើ",
|
||||
"sender_id_error_message": "អនុញ្ញាតអក្សរ លេខ និងចន្លោះតែប៉ុណ្ណោះ (ច្រើនបំផុត 11 តួអក្សរ)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "ជម្រើសថ្មី",
|
||||
"update_profile": "ធ្វើបច្ចុប្បន្នភាពសមាជិក",
|
||||
"attribute_updated_successfully": "គុណលក្ខណៈត្រូវបានធ្វើបច្ចុប្បន្នភាពដោយជោគជ័យ",
|
||||
"attribute_deleted_successfully": "លក្ខណៈពិសេសត្រូវបានលុបដោយជោគជ័យ",
|
||||
"attributes_edited_successfully": "គុណលក្ខណៈត្រូវបានកែសម្រួលដោយជោគជ័យ",
|
||||
"attribute_meta_description": "គ្រប់គ្រងគុណលក្ខណៈសម្រាប់សមាជិកក្រុមរបស់អ្នក",
|
||||
"attributes_edit_description": "កែសម្រួលគុណលក្ខណៈសម្រាប់សមាជិកក្រុមរបស់អ្នក",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "ខែនេះ",
|
||||
"year_to_date": "ឆ្នាំនេះ",
|
||||
"custom_range": "ជួរដែលកំណត់ដោយខ្លួនឯង",
|
||||
"show_all_columns": "បង្ហាញជួរឈរទាំងអស់",
|
||||
"toggle_columns": "បិទបើកជួរឈរ",
|
||||
"no_columns_found": "រកមិនឃើញជួរឈរ",
|
||||
"salesforce_create_record_as": "នៅពេលកក់ សូមបន្ថែមព្រឹត្តិការណ៍និងអ្នកចូលរួមថ្មីជា៖",
|
||||
"salesforce_lead": "អ្នកដឹកនាំ",
|
||||
"salesforce_contact_under_account": "ទំនាក់ទំនងក្រោមគណនី",
|
||||
"salesforce_skip_entry_creation": "រំលងការបង្កើតកំណត់ត្រា {{entry}} ប្រសិនបើពួកគេមិនមាននៅក្នុង Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "ប្រសិនបើទំនាក់ទំនងមិនមានក្រោមគណនី សូមបង្កើតអ្នកដឹកនាំថ្មីពីអ្នកចូលរួម",
|
||||
"salesforce_create_new_contact_under_account": "បង្កើតទំនាក់ទំនងថ្មីក្រោមគណនីដោយផ្អែកលើដែនអ៊ីមែលរបស់អ្នកចូលរួម និងទំនាក់ទំនងដែលមានស្រាប់",
|
||||
"mass_assign_attributes": "ផ្ដល់គុណលក្ខណៈជាសាធារណៈ",
|
||||
"salesforce_book_directly_with_attendee_owner": "ប្រសិនបើអ្នកចូលរួមមាននៅក្នុង Salesforce សូមកក់ដោយផ្ទាល់ជាមួយម្ចាស់",
|
||||
"salesforce_check_owner_of": "អង្គភាពត្រូវពិនិត្យម្ចាស់ដើម្បីកក់ដោយផ្ទាល់",
|
||||
"account": "គណនី",
|
||||
"choose_hosts_schedule": "ជ្រើសរើសកាលវិភាគរបស់ម្ចាស់ផ្ទះ",
|
||||
"hosts_schedule_description": "អ្នកអាចជ្រើសរើសកាលវិភាគផ្សេងៗសម្រាប់ម្ចាស់ផ្ទះនីមួយៗ។ កាលវិភាគលំនាំដើមរបស់ម្ចាស់ផ្ទះនីមួយៗត្រូវបានជ្រើសរើសជាលំនាំដើម។",
|
||||
"no_hosts_description": "មិនមានម្ចាស់ផ្ទះបានចាត់តាំងទេ សូមបន្ថែមម្ចាស់ផ្ទះនៅក្នុងផ្ទាំងចាត់តាំង។",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ បន្ថែមខ្សែអក្សរថ្មីរបស់អ្នកនៅខាងលើនេះ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "전화 번호는 제공됩니다",
|
||||
"before_event_trigger": "이벤트 시작 전",
|
||||
"event_cancelled_trigger": "이벤트 취소 시",
|
||||
"after_hosts_cal_video_no_show": "호스트가 Cal 비디오에 참여하지 않은 후",
|
||||
"after_guests_cal_video_no_show": "게스트가 Cal 비디오에 참여하지 않은 후",
|
||||
"new_event_trigger": "새 이벤트 예약 시",
|
||||
"email_host_action": "호스트에게 이메일 발송",
|
||||
"email_attendee_action": "참석자들에게 이메일 전송",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "특정 이메일 주소로 이메일 발송",
|
||||
"after_event_trigger": "이벤트 종료 후",
|
||||
"how_long_after": "이벤트 종료 후 얼마나 경과해야 합니까?",
|
||||
"how_long_after_hosts_no_show": "호스트가 Cal 비디오 회의에 나타나지 않은 후 얼마나 시간이 지나야 하나요?",
|
||||
"how_long_after_guests_no_show": "게스트가 Cal 비디오 회의에 나타나지 않은 후 얼마나 시간이 지나야 하나요?",
|
||||
"how_long_after_user_no_show_minutes": "사용자가 Cal 비디오 회의에 나타나지 않은 후 얼마나 시간이 지나야 하나요?",
|
||||
"no_available_slots": "사용 가능한 슬롯 없음",
|
||||
"time_available": "시간 사용 가능",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "적절한 화상 회의 앱을 찾을 수 없나요? <1>앱 스토어</1>를 방문하세요.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "앱 재설치",
|
||||
"reschedule_reason": "일정 변경 사유",
|
||||
"choose_common_schedule_team_event": "공통 일정 선택",
|
||||
"choose_common_schedule_team_event_description": "호스트 간에 공통 일정을 사용하려면 이 옵션을 활성화하세요. 비활성화되면 각 호스트는 기본 일정에 따라 예약됩니다.",
|
||||
"choose_common_schedule_team_event_description": "호스트 간에 공통 일정을 사용하려면 이 옵션을 활성화하십시오. 비활성화하면 각 호스트는 기본 일정 또는 선택한 일정에 따라 예약됩니다.",
|
||||
"reason": "사유",
|
||||
"sender_id": "발신자 ID",
|
||||
"sender_id_error_message": "영문, 숫자, 공백만 허용(최대 11자)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "새 옵션",
|
||||
"update_profile": "회원 정보 업데이트",
|
||||
"attribute_updated_successfully": "속성이 성공적으로 업데이트되었습니다",
|
||||
"attribute_deleted_successfully": "속성이 성공적으로 삭제되었습니다",
|
||||
"attributes_edited_successfully": "속성이 성공적으로 편집되었습니다",
|
||||
"attribute_meta_description": "팀원의 속성을 관리하세요",
|
||||
"attributes_edit_description": "팀원의 속성을 편집하세요",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "이번 달 현재까지",
|
||||
"year_to_date": "올해 현재까지",
|
||||
"custom_range": "사용자 지정 범위",
|
||||
"show_all_columns": "모든 열 표시",
|
||||
"toggle_columns": "열 전환",
|
||||
"no_columns_found": "열을 찾을 수 없습니다",
|
||||
"salesforce_create_record_as": "예약 시, 이벤트를 추가하고 새로운 참석자를 다음으로 추가합니다:",
|
||||
"salesforce_lead": "리드",
|
||||
"salesforce_contact_under_account": "계정 내 연락처",
|
||||
"salesforce_skip_entry_creation": "{{entry}} 기록이 Salesforce에 존재하지 않으면 생성을 건너뜁니다",
|
||||
"salesforce_if_account_does_not_exist": "연락처가 계정에 존재하지 않으면, 참석자로부터 새로운 리드를 생성합니다",
|
||||
"salesforce_create_new_contact_under_account": "참석자의 이메일 도메인과 기존 연락처를 기반으로 계정 내에 새로운 연락처를 생성합니다",
|
||||
"mass_assign_attributes": "속성 일괄 할당",
|
||||
"salesforce_book_directly_with_attendee_owner": "참석자가 Salesforce에 존재하면, 소유자와 직접 예약합니다",
|
||||
"salesforce_check_owner_of": "직접 예약하기 위해 소유자를 확인할 엔터티",
|
||||
"account": "계정",
|
||||
"choose_hosts_schedule": "호스트 일정 선택",
|
||||
"hosts_schedule_description": "각 호스트에 대해 다른 일정을 선택할 수 있습니다. 각 호스트의 기본 일정이 기본적으로 선택됩니다.",
|
||||
"no_hosts_description": "할당 탭에서 호스트를 추가하십시오. 현재 할당된 호스트가 없습니다.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 여기에 새 문자열을 추가하세요 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Telefoonnummer wordt verstrekt",
|
||||
"before_event_trigger": "voordat de gebeurtenis begint",
|
||||
"event_cancelled_trigger": "wanneer de gebeurtenis is geannuleerd",
|
||||
"after_hosts_cal_video_no_show": "Nadat hosts niet deelnemen aan cal video",
|
||||
"after_guests_cal_video_no_show": "Nadat gasten niet deelnemen aan cal video",
|
||||
"new_event_trigger": "wanneer een nieuwe gebeurtenis is geboekt",
|
||||
"email_host_action": "e-mail naar organisator versturen",
|
||||
"email_attendee_action": "e-mail naar deelnemers versturen",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "e-mail versturen naar een specifiek e-mailadres",
|
||||
"after_event_trigger": "na afloop van gebeurtenis",
|
||||
"how_long_after": "Hoelang na afloop van de gebeurtenis?",
|
||||
"how_long_after_hosts_no_show": "Hoe lang nadat hosts niet verschijnen bij een cal videovergadering?",
|
||||
"how_long_after_guests_no_show": "Hoe lang nadat gasten niet verschijnen bij een cal videovergadering?",
|
||||
"how_long_after_user_no_show_minutes": "Hoe lang nadat gebruikers niet verschijnen bij een cal videovergadering?",
|
||||
"no_available_slots": "Geen beschikbare tijdvakken",
|
||||
"time_available": "Tijd beschikbaar",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Kun je de juiste conferentie-app niet vinden? Bezoek onze <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Herinstalleer de app",
|
||||
"reschedule_reason": "Reden voor opnieuw plannen",
|
||||
"choose_common_schedule_team_event": "Kies een gezamenlijke planning",
|
||||
"choose_common_schedule_team_event_description": "Schakel dit in als u een gemeenschappelijke planning tussen organisatoren wilt gebruiken. Indien uitgeschakeld, wordt elke organisator geboekt op basis van zijn standaardplanning.",
|
||||
"choose_common_schedule_team_event_description": "Schakel dit in als u een gemeenschappelijk schema tussen hosts wilt gebruiken. Wanneer dit is uitgeschakeld, wordt elke host geboekt op basis van hun standaardschema of hun gekozen schema.",
|
||||
"reason": "Reden",
|
||||
"sender_id": "Afzender-ID",
|
||||
"sender_id_error_message": "Alleen letters, cijfers en spaties toegestaan (max. 11 tekens)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nieuwe optie",
|
||||
"update_profile": "Lid bijwerken",
|
||||
"attribute_updated_successfully": "Attribuut succesvol bijgewerkt",
|
||||
"attribute_deleted_successfully": "Attribuut succesvol verwijderd",
|
||||
"attributes_edited_successfully": "Attributen succesvol bewerkt",
|
||||
"attribute_meta_description": "Beheer attributen voor je teamleden",
|
||||
"attributes_edit_description": "Bewerk attributen voor je teamleden",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "maand tot nu toe",
|
||||
"year_to_date": "jaar tot nu toe",
|
||||
"custom_range": "aangepast bereik",
|
||||
"show_all_columns": "Toon alle kolommen",
|
||||
"toggle_columns": "Kolommen wisselen",
|
||||
"no_columns_found": "Geen kolommen gevonden",
|
||||
"salesforce_create_record_as": "Bij boeking, voeg evenementen toe en nieuwe deelnemers als:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Contact onder een account",
|
||||
"salesforce_skip_entry_creation": "Sla het aanmaken van {{entry}} record over als deze niet in Salesforce bestaat",
|
||||
"salesforce_if_account_does_not_exist": "Als de contactpersoon niet onder een account bestaat, maak een nieuwe lead van de deelnemer",
|
||||
"salesforce_create_new_contact_under_account": "Maak een nieuw contact onder een account op basis van het e-maildomein van de deelnemer en bestaande contacten",
|
||||
"mass_assign_attributes": "Attribuuttoewijzing in bulk",
|
||||
"salesforce_book_directly_with_attendee_owner": "Als de deelnemer in Salesforce bestaat, boek direct met de eigenaar",
|
||||
"salesforce_check_owner_of": "Entiteit om eigenaar van te controleren voor directe boeking",
|
||||
"account": "Account",
|
||||
"choose_hosts_schedule": "Kies hostschema's",
|
||||
"hosts_schedule_description": "U kunt een ander schema selecteren voor elke host. Standaard is het standaardschema van elke host geselecteerd.",
|
||||
"no_hosts_description": "Geen hosts toegewezen, voeg hosts toe in het toewijzingstabblad.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Voeg uw nieuwe strings hierboven toe ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Telefonnummer vil bli oppgitt",
|
||||
"before_event_trigger": "før hendelsen starter",
|
||||
"event_cancelled_trigger": "når arrangementet er avlyst",
|
||||
"after_hosts_cal_video_no_show": "Etter at verter ikke blir med på cal video",
|
||||
"after_guests_cal_video_no_show": "Etter at gjester ikke blir med på cal video",
|
||||
"new_event_trigger": "når en ny hendelse er booket",
|
||||
"email_host_action": "send e-post til vert",
|
||||
"email_attendee_action": "send e-post til deltakere",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "sende e-post til en bestemt e-postadresse",
|
||||
"after_event_trigger": "etter at hendelsen er ferdig",
|
||||
"how_long_after": "Hvor lenge etter at hendelsen er ferdig?",
|
||||
"how_long_after_hosts_no_show": "Hvor lenge etter at verter ikke dukker opp på cal videomøte?",
|
||||
"how_long_after_guests_no_show": "Hvor lenge etter at gjester ikke dukker opp på cal videomøte?",
|
||||
"how_long_after_user_no_show_minutes": "Hvor lenge etter at brukerne ikke dukker opp på cal videomøte?",
|
||||
"no_available_slots": "Ingen Tilgjengelige tidsluker",
|
||||
"time_available": "Tilgjengelig tid",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Kan du ikke finne riktig konferanseapp? Besøk vår <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Installer appen på nytt",
|
||||
"reschedule_reason": "Årsak for endring av tidspunkt",
|
||||
"choose_common_schedule_team_event": "Velg en felles timeplan",
|
||||
"choose_common_schedule_team_event_description": "Aktiver dette hvis du vil bruke en felles tidsplan mellom verter. Når den er deaktivert, vil hver vert bookes basert på deres standard tidsplan.",
|
||||
"choose_common_schedule_team_event_description": "Aktiver dette hvis du vil bruke en felles plan mellom verter. Når det er deaktivert, vil hver vert bli booket basert på sin standardplan eller sin valgte plan.",
|
||||
"reason": "Årsak",
|
||||
"sender_id": "Avsender ID",
|
||||
"sender_id_error_message": "Kun bokstaver, tall og mellomrom er tillatt (maks. 11 tegn)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nytt alternativ",
|
||||
"update_profile": "Oppdater medlem",
|
||||
"attribute_updated_successfully": "Egenskap oppdatert vellykket",
|
||||
"attribute_deleted_successfully": "Attributet ble slettet",
|
||||
"attributes_edited_successfully": "Egenskaper redigert vellykket",
|
||||
"attribute_meta_description": "Administrer egenskaper for teammedlemmene dine",
|
||||
"attributes_edit_description": "Rediger egenskaper for teammedlemmene dine",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "måned til dags dato",
|
||||
"year_to_date": "år til dags dato",
|
||||
"custom_range": "tilpasset periode",
|
||||
"show_all_columns": "Vis alle kolonner",
|
||||
"toggle_columns": "Veksle kolonner",
|
||||
"no_columns_found": "Ingen kolonner funnet",
|
||||
"salesforce_create_record_as": "Ved booking, legg til hendelser og nye deltakere som:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Kontakt under en konto",
|
||||
"salesforce_skip_entry_creation": "Hopp over å opprette {{entry}}-post hvis de ikke finnes i Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Hvis kontakten ikke finnes under en konto, opprett ny lead fra deltaker",
|
||||
"salesforce_create_new_contact_under_account": "Opprett en ny kontakt under en konto basert på e-postdomenet til deltaker og eksisterende kontakter",
|
||||
"mass_assign_attributes": "Masseopptildel attributter",
|
||||
"salesforce_book_directly_with_attendee_owner": "Hvis deltaker finnes i Salesforce, book direkte med eieren",
|
||||
"salesforce_check_owner_of": "Enhet for å sjekke eier av for å booke direkte",
|
||||
"account": "Konto",
|
||||
"choose_hosts_schedule": "Velg vertsplaner",
|
||||
"hosts_schedule_description": "Du kan velge en annen plan for hver vert. Hver verts standardplan er valgt som standard.",
|
||||
"no_hosts_description": "Ingen verter tildelt, legg til verter i tildelingsfanen.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Legg til dine nye strenger over her ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Numer telefonu zostanie podany.",
|
||||
"before_event_trigger": "przed rozpoczęciem wydarzenia",
|
||||
"event_cancelled_trigger": "gdy wydarzenie zostanie anulowane",
|
||||
"after_hosts_cal_video_no_show": "Po tym, jak gospodarze nie dołączą do wideo na Cal",
|
||||
"after_guests_cal_video_no_show": "Po tym, jak goście nie dołączą do wideo na Cal",
|
||||
"new_event_trigger": "gdy nowe wydarzenie zostanie zarezerwowane",
|
||||
"email_host_action": "wyślij wiadomość e-mail do hosta",
|
||||
"email_attendee_action": "wyślij wiadomość e-mail do uczestników",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "wyślij wiadomość e-mail na określony adres e-mail",
|
||||
"after_event_trigger": "po zakończeniu wydarzenia",
|
||||
"how_long_after": "Jak długo po zakończeniu wydarzenia?",
|
||||
"how_long_after_hosts_no_show": "Jak długo po tym, jak gospodarze nie pojawią się na spotkaniu wideo na Cal?",
|
||||
"how_long_after_guests_no_show": "Jak długo po tym, jak goście nie pojawią się na spotkaniu wideo na Cal?",
|
||||
"how_long_after_user_no_show_minutes": "Jak długo po tym, jak użytkownicy nie pojawią się na spotkaniu wideo na Cal?",
|
||||
"no_available_slots": "Brak dostępnych przedziałów",
|
||||
"time_available": "Dostępny czas",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Nie możesz znaleźć odpowiedniej aplikacji do wideokonferencji? Odwiedź nasz <1>Sklep z Aplikacjami</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Zainstaluj ponownie aplikację",
|
||||
"reschedule_reason": "Powód zmiany terminu",
|
||||
"choose_common_schedule_team_event": "Wybierz wspólny harmonogram",
|
||||
"choose_common_schedule_team_event_description": "Włącz tę opcję, jeśli chcesz używać wspólnego harmonogramu gospodarzy. Jeśli ją wyłączysz, rezerwacje u każdego gospodarza będą dokonywane na podstawie jego domyślnego harmonogramu.",
|
||||
"choose_common_schedule_team_event_description": "Włącz to, jeśli chcesz używać wspólnego harmonogramu między gospodarzami. Gdy jest wyłączone, każdy gospodarz będzie rezerwowany na podstawie swojego domyślnego harmonogramu lub wybranego harmonogramu.",
|
||||
"reason": "Powód",
|
||||
"sender_id": "Identyfikator nadawcy",
|
||||
"sender_id_error_message": "Dozwolone są tylko litery, cyfry i spacje (maksymalnie 11 znaków)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nowa opcja",
|
||||
"update_profile": "Aktualizuj członka",
|
||||
"attribute_updated_successfully": "Atrybut zaktualizowany pomyślnie",
|
||||
"attribute_deleted_successfully": "Atrybut został pomyślnie usunięty",
|
||||
"attributes_edited_successfully": "Atrybuty edytowane pomyślnie",
|
||||
"attribute_meta_description": "Zarządzaj atrybutami członków zespołu",
|
||||
"attributes_edit_description": "Edytuj atrybuty członków zespołu",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "od początku miesiąca",
|
||||
"year_to_date": "od początku roku",
|
||||
"custom_range": "zakres niestandardowy",
|
||||
"show_all_columns": "Pokaż wszystkie kolumny",
|
||||
"toggle_columns": "Przełącz kolumny",
|
||||
"no_columns_found": "Nie znaleziono kolumn",
|
||||
"salesforce_create_record_as": "Podczas rezerwacji dodaj wydarzenia i nowych uczestników jako:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Kontakt w ramach konta",
|
||||
"salesforce_skip_entry_creation": "Pomiń tworzenie rekordu {{entry}}, jeśli nie istnieje w Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Jeśli kontakt nie istnieje w ramach konta, utwórz nowy lead z uczestnika",
|
||||
"salesforce_create_new_contact_under_account": "Utwórz nowy kontakt w ramach konta na podstawie domeny e-mail uczestnika i istniejących kontaktów",
|
||||
"mass_assign_attributes": "Masowe przypisywanie atrybutów",
|
||||
"salesforce_book_directly_with_attendee_owner": "Jeśli uczestnik istnieje w Salesforce, zarezerwuj bezpośrednio z właścicielem",
|
||||
"salesforce_check_owner_of": "Podmiot do sprawdzenia właściciela w celu bezpośredniej rezerwacji",
|
||||
"account": "Konto",
|
||||
"choose_hosts_schedule": "Wybierz harmonogramy gospodarzy",
|
||||
"hosts_schedule_description": "Możesz wybrać inny harmonogram dla każdego gospodarza. Domyślny harmonogram każdego gospodarza jest wybierany automatycznie.",
|
||||
"no_hosts_description": "Brak przypisanych gospodarzy, dodaj gospodarzy w zakładce przypisania.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Dodaj nowe ciągi powyżej ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "O número de telefone será fornecido",
|
||||
"before_event_trigger": "antes do início do evento",
|
||||
"event_cancelled_trigger": "quando o evento for cancelado",
|
||||
"after_hosts_cal_video_no_show": "Após os anfitriões não entrarem no vídeo do Cal",
|
||||
"after_guests_cal_video_no_show": "Após os convidados não entrarem no vídeo do Cal",
|
||||
"new_event_trigger": "quando um novo evento for reservado",
|
||||
"email_host_action": "enviar e-mail para a(o) anfitriã(o)",
|
||||
"email_attendee_action": "enviar e-mail aos participantes",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "enviar e-mail para um endereço de e-mail específico",
|
||||
"after_event_trigger": "após o término do evento",
|
||||
"how_long_after": "Quanto tempo após o término do evento?",
|
||||
"how_long_after_hosts_no_show": "Quanto tempo após os anfitriões não aparecerem na reunião de vídeo do Cal?",
|
||||
"how_long_after_guests_no_show": "Quanto tempo após os convidados não aparecerem na reunião de vídeo do Cal?",
|
||||
"how_long_after_user_no_show_minutes": "Quanto tempo após os usuários não aparecerem na reunião de vídeo do Cal?",
|
||||
"no_available_slots": "Não há espaços disponíveis",
|
||||
"time_available": "Tempo disponível",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Não consegue encontrar o aplicativo de conferência certo? Visite nossa <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Reinstale o aplicativo",
|
||||
"reschedule_reason": "Motivo de reagendamento",
|
||||
"choose_common_schedule_team_event": "Escolha uma agenda compartilhada",
|
||||
"choose_common_schedule_team_event_description": "Ative esta opção se você quiser usar uma agenda compartilhada entre os anfitriões. Ao desativar esta opção, cada anfitriã(o) será reservado conforme seu horário padrão.",
|
||||
"choose_common_schedule_team_event_description": "Ative esta opção se quiser usar um horário comum entre os anfitriões. Quando desativado, cada anfitrião será agendado com base em seu horário padrão ou no horário escolhido.",
|
||||
"reason": "Motivo",
|
||||
"sender_id": "ID do remetente",
|
||||
"sender_id_error_message": "Apenas letras, números e espaços permitidos (no máx. 11 caracteres)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nova opção",
|
||||
"update_profile": "Atualizar membro",
|
||||
"attribute_updated_successfully": "Atributo atualizado com sucesso",
|
||||
"attribute_deleted_successfully": "Atributo excluído com sucesso",
|
||||
"attributes_edited_successfully": "Atributos editados com sucesso",
|
||||
"attribute_meta_description": "Gerencie atributos para os membros da sua equipe",
|
||||
"attributes_edit_description": "Edite atributos para os membros da sua equipe",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "mês até a data",
|
||||
"year_to_date": "ano até a data",
|
||||
"custom_range": "intervalo personalizado",
|
||||
"show_all_columns": "Mostrar todas as colunas",
|
||||
"toggle_columns": "Alternar colunas",
|
||||
"no_columns_found": "Nenhuma coluna encontrada",
|
||||
"salesforce_create_record_as": "Ao agendar, adicione eventos e novos participantes como:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Contato em uma conta",
|
||||
"salesforce_skip_entry_creation": "Pular a criação do registro de {{entry}} se não existir no Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Se o contato não existir em uma conta, criar novo lead a partir do participante",
|
||||
"salesforce_create_new_contact_under_account": "Criar um novo contato em uma conta com base no domínio de e-mail do participante e contatos existentes",
|
||||
"mass_assign_attributes": "Atribuir atributos em massa",
|
||||
"salesforce_book_directly_with_attendee_owner": "Se o participante existir no Salesforce, agendar diretamente com o proprietário",
|
||||
"salesforce_check_owner_of": "Entidade para verificar o proprietário para agendar diretamente",
|
||||
"account": "Conta",
|
||||
"choose_hosts_schedule": "Escolher horários dos anfitriões",
|
||||
"hosts_schedule_description": "Você pode selecionar um horário diferente para cada anfitrião. O horário padrão de cada anfitrião é escolhido por padrão.",
|
||||
"no_hosts_description": "Nenhum anfitrião atribuído, adicione anfitriões na aba de atribuição.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Adicione suas novas strings aqui em cima ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Será fornecido um número de telefone",
|
||||
"before_event_trigger": "antes do evento iniciar",
|
||||
"event_cancelled_trigger": "quando o evento for cancelado",
|
||||
"after_hosts_cal_video_no_show": "Após os anfitriões não se juntarem ao vídeo do Cal",
|
||||
"after_guests_cal_video_no_show": "Após os convidados não se juntarem ao vídeo do Cal",
|
||||
"new_event_trigger": "quando um novo evento for reservado",
|
||||
"email_host_action": "enviar email ao anfitrião",
|
||||
"email_attendee_action": "enviar e-mail aos participantes",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "enviar e-mail para um endereço de e-mail específico",
|
||||
"after_event_trigger": "depois do fim do evento",
|
||||
"how_long_after": "Quanto tempo após o fim do evento?",
|
||||
"how_long_after_hosts_no_show": "Quanto tempo após os anfitriões não aparecerem na reunião de vídeo do Cal?",
|
||||
"how_long_after_guests_no_show": "Quanto tempo após os convidados não aparecerem na reunião de vídeo do Cal?",
|
||||
"how_long_after_user_no_show_minutes": "Quanto tempo após os utilizadores não aparecerem na reunião de vídeo do Cal?",
|
||||
"no_available_slots": "Sem vagas disponíveis",
|
||||
"time_available": "Tempo disponível",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Não consegue encontrar a aplicação de conferência certa? Visite a nossa <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Reinstalar aplicação",
|
||||
"reschedule_reason": "Motivo do reagendamento",
|
||||
"choose_common_schedule_team_event": "Escolha uma agenda comum",
|
||||
"choose_common_schedule_team_event_description": "Ative esta opção se quiser utilizar uma agenda comum entre anfitriões. Quando desativada, cada anfitrião será reservado com base na respetiva agenda pré-definida.",
|
||||
"choose_common_schedule_team_event_description": "Ative esta opção se quiser usar um horário comum entre os anfitriões. Quando desativado, cada anfitrião será agendado com base no seu horário padrão ou no horário escolhido.",
|
||||
"reason": "Motivo",
|
||||
"sender_id": "Identificação do remetente",
|
||||
"sender_id_error_message": "Apenas são permitidas letras, números e espaços (máx. 11 caracteres)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nova opção",
|
||||
"update_profile": "Atualizar membro",
|
||||
"attribute_updated_successfully": "Atributo atualizado com sucesso",
|
||||
"attribute_deleted_successfully": "Atributo eliminado com sucesso",
|
||||
"attributes_edited_successfully": "Atributos editados com sucesso",
|
||||
"attribute_meta_description": "Gerir atributos para os membros da sua equipa",
|
||||
"attributes_edit_description": "Editar atributos para os membros da sua equipa",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "mês até à data",
|
||||
"year_to_date": "ano até à data",
|
||||
"custom_range": "intervalo personalizado",
|
||||
"show_all_columns": "Mostrar todas as colunas",
|
||||
"toggle_columns": "Alternar colunas",
|
||||
"no_columns_found": "Nenhuma coluna encontrada",
|
||||
"salesforce_create_record_as": "Ao agendar, adicionar eventos em e novos participantes como:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Contacto sob uma conta",
|
||||
"salesforce_skip_entry_creation": "Ignorar a criação do registo de {{entry}} se não existir no Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Se o contacto não existir sob uma conta, criar um novo lead a partir do participante",
|
||||
"salesforce_create_new_contact_under_account": "Criar um novo contacto sob uma conta com base no domínio de email do participante e contactos existentes",
|
||||
"mass_assign_attributes": "Atribuir atributos em massa",
|
||||
"salesforce_book_directly_with_attendee_owner": "Se o participante existir no Salesforce, agendar diretamente com o proprietário",
|
||||
"salesforce_check_owner_of": "Entidade para verificar o proprietário para agendar diretamente",
|
||||
"account": "Conta",
|
||||
"choose_hosts_schedule": "Escolher horários dos anfitriões",
|
||||
"hosts_schedule_description": "Pode selecionar um horário diferente para cada anfitrião. O horário padrão de cada anfitrião é escolhido por defeito.",
|
||||
"no_hosts_description": "Nenhum anfitrião atribuído, adicione anfitriões na aba de atribuição.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Numărul de telefon va fi furnizat",
|
||||
"before_event_trigger": "înainte de începerea evenimentului",
|
||||
"event_cancelled_trigger": "la anularea evenimentului",
|
||||
"after_hosts_cal_video_no_show": "După ce gazdele nu se alătură la cal video",
|
||||
"after_guests_cal_video_no_show": "După ce invitații nu se alătură la cal video",
|
||||
"new_event_trigger": "când este rezervat noul eveniment",
|
||||
"email_host_action": "trimiteți e-mail la gazdă",
|
||||
"email_attendee_action": "trimiteți e-mail participanților",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "trimiteți e-mail către o anumită adresă de e-mail",
|
||||
"after_event_trigger": "după finalul evenimentului",
|
||||
"how_long_after": "La cât timp după finalul evenimentului?",
|
||||
"how_long_after_hosts_no_show": "Cât timp după ce gazdele nu apar la întâlnirea video cal?",
|
||||
"how_long_after_guests_no_show": "Cât timp după ce invitații nu apar la întâlnirea video cal?",
|
||||
"how_long_after_user_no_show_minutes": "Cât timp după ce utilizatorii nu apar la întâlnirea video cal?",
|
||||
"no_available_slots": "Niciun interval disponibil",
|
||||
"time_available": "Oră disponibilă",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Nu găsești aplicația de conferință potrivită? Vizitează <1>App Store-ul</1> nostru.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Reinstalează aplicația",
|
||||
"reschedule_reason": "Motiv reprogramare",
|
||||
"choose_common_schedule_team_event": "Alegeți un program comun",
|
||||
"choose_common_schedule_team_event_description": "Activați această opțiune dacă doriți să folosiți un program comun între gazde. Atunci când este dezactivată, fiecare gazdă va fi rezervată în funcție de programul său implicit.",
|
||||
"choose_common_schedule_team_event_description": "Activează această opțiune dacă dorești să folosești un program comun între gazde. Când este dezactivată, fiecare gazdă va fi rezervată pe baza programului său implicit sau a programului ales.",
|
||||
"reason": "Motiv",
|
||||
"sender_id": "ID expeditor",
|
||||
"sender_id_error_message": "Sunt permise doar litere, numere și spații (maxim 11 caractere)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Opțiune nouă",
|
||||
"update_profile": "Actualizați membrul",
|
||||
"attribute_updated_successfully": "Atribut actualizat cu succes",
|
||||
"attribute_deleted_successfully": "Atributul a fost șters cu succes",
|
||||
"attributes_edited_successfully": "Atribute editate cu succes",
|
||||
"attribute_meta_description": "Gestionați atributele pentru membrii echipei dvs.",
|
||||
"attributes_edit_description": "Editați atributele pentru membrii echipei dvs.",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "luna până în prezent",
|
||||
"year_to_date": "anul până în prezent",
|
||||
"custom_range": "interval personalizat",
|
||||
"show_all_columns": "Afișează toate coloanele",
|
||||
"toggle_columns": "Comută coloanele",
|
||||
"no_columns_found": "Nu au fost găsite coloane",
|
||||
"salesforce_create_record_as": "La rezervare, adaugă evenimentele și noii participanți ca:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Contact sub un cont",
|
||||
"salesforce_skip_entry_creation": "Sari peste crearea înregistrării {{entry}} dacă nu există în Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Dacă contactul nu există sub un cont, creează un lead nou din participant",
|
||||
"salesforce_create_new_contact_under_account": "Creează un contact nou sub un cont pe baza domeniului de email al participantului și a contactelor existente",
|
||||
"mass_assign_attributes": "Atribuire în masă a atributelor",
|
||||
"salesforce_book_directly_with_attendee_owner": "Dacă participantul există în Salesforce, rezervă direct cu proprietarul",
|
||||
"salesforce_check_owner_of": "Entitatea pentru a verifica proprietarul pentru a rezerva direct",
|
||||
"account": "Cont",
|
||||
"choose_hosts_schedule": "Alege programele gazdelor",
|
||||
"hosts_schedule_description": "Poți selecta un program diferit pentru fiecare gazdă. Programul implicit al fiecărei gazde este selectat în mod prestabilit.",
|
||||
"no_hosts_description": "Nicio gazdă nu este atribuită, adaugă gazde în fila de atribuire.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Adăugați stringurile noi deasupra acestui rând ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Broj telefona će biti dostavljen",
|
||||
"before_event_trigger": "pre početka događaja",
|
||||
"event_cancelled_trigger": "kada je događaj otkazan",
|
||||
"after_hosts_cal_video_no_show": "Nakon što se domaćini ne pojave na Cal video sastanku",
|
||||
"after_guests_cal_video_no_show": "Nakon što se gosti ne pojave na Cal video sastanku",
|
||||
"new_event_trigger": "kada je zakazan novi događaj",
|
||||
"email_host_action": "pošalji imejl domaćinu",
|
||||
"email_attendee_action": "pošalji imejl učesnicima",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "pošalji imejl na određene imejl adrese",
|
||||
"after_event_trigger": "nakon što se događaj završi",
|
||||
"how_long_after": "Koliko vremena nakon što se događaj završi?",
|
||||
"how_long_after_hosts_no_show": "Koliko dugo nakon što se domaćini ne pojave na Cal video sastanku?",
|
||||
"how_long_after_guests_no_show": "Koliko dugo nakon što se gosti ne pojave na Cal video sastanku?",
|
||||
"how_long_after_user_no_show_minutes": "Koliko minuta nakon što se korisnici ne pojave na Cal video sastanku?",
|
||||
"no_available_slots": "Nema dostupnih termina",
|
||||
"time_available": "Dostupno vreme",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Ne možete pronaći odgovarajuću aplikaciju za konferencije? Posetite naš <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Ponovo instalirajte aplikaciju",
|
||||
"reschedule_reason": "Razlog za promenu rasporeda",
|
||||
"choose_common_schedule_team_event": "Izaberite zajednički raspored",
|
||||
"choose_common_schedule_team_event_description": "Omogućite to ako želite da koristite zajednički raspored između domaćina. Kada je onemogućen, svaki domaćin može rezervisati na osnovu svog podrazumevanog rasporeda.",
|
||||
"choose_common_schedule_team_event_description": "Омогућите ово ако желите да користите заједнички распоред између домаћина. Када је онемогућено, сваки домаћин ће бити резервисан на основу свог подразумеваног распореда или изабраног распореда.",
|
||||
"reason": "Razlog",
|
||||
"sender_id": "ID pošiljaoca",
|
||||
"sender_id_error_message": "Dozvoljena su samo slova, brojevi i razmaci (maks. 11 znakova)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nova opcija",
|
||||
"update_profile": "Ažuriraj člana",
|
||||
"attribute_updated_successfully": "Atribut uspešno ažuriran",
|
||||
"attribute_deleted_successfully": "Атрибут је успешно обрисан",
|
||||
"attributes_edited_successfully": "Atributi uspešno izmenjeni",
|
||||
"attribute_meta_description": "Upravljajte atributima za članove vašeg tima",
|
||||
"attributes_edit_description": "Izmenite atribute za članove vašeg tima",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "od početka meseca do danas",
|
||||
"year_to_date": "od početka godine do danas",
|
||||
"custom_range": "prilagođeni opseg",
|
||||
"show_all_columns": "Прикажи све колоне",
|
||||
"toggle_columns": "Укључи/искључи колоне",
|
||||
"no_columns_found": "Нису пронађене колоне",
|
||||
"salesforce_create_record_as": "Prilikom zakazivanja, dodaj događaje i nove učesnike kao:",
|
||||
"salesforce_lead": "Potencijalni klijent",
|
||||
"salesforce_contact_under_account": "Kontakt pod nalogom",
|
||||
"salesforce_skip_entry_creation": "Preskoči kreiranje {{entry}} zapisa ako ne postoje u Salesforce-u",
|
||||
"salesforce_if_account_does_not_exist": "Ako kontakt ne postoji pod nalogom, kreiraj novog potencijalnog klijenta od učesnika",
|
||||
"salesforce_create_new_contact_under_account": "Kreiraj novi kontakt pod nalogom na osnovu email domena učesnika i postojećih kontakata",
|
||||
"mass_assign_attributes": "Masovno dodeljivanje atributa",
|
||||
"salesforce_book_directly_with_attendee_owner": "Ako učesnik postoji u Salesforce-u, zakaži direktno sa vlasnikom",
|
||||
"salesforce_check_owner_of": "Entitet čijeg vlasnika treba proveriti za direktno zakazivanje",
|
||||
"account": "Nalog",
|
||||
"choose_hosts_schedule": "Изаберите распореде домаћина",
|
||||
"hosts_schedule_description": "Можете изабрати различит распоред за сваког домаћина. Подразумевано је изабран подразумевани распоред сваког домаћина.",
|
||||
"no_hosts_description": "Нема додељених домаћина, додајте домаћине у картици за доделу.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Dodajte svoje nove stringove iznad ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Telefonnummer kommer att anges",
|
||||
"before_event_trigger": "innan händelsen startar",
|
||||
"event_cancelled_trigger": "när händelsen ställs in",
|
||||
"after_hosts_cal_video_no_show": "Efter att värdarna inte ansluter till cal video",
|
||||
"after_guests_cal_video_no_show": "Efter att gästerna inte ansluter till cal video",
|
||||
"new_event_trigger": "när ny händelse bokas",
|
||||
"email_host_action": "skicka e-post till värd",
|
||||
"email_attendee_action": "skicka e-post till deltagare",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "skicka e-post till en specifik e-postadress",
|
||||
"after_event_trigger": "efter händelsens slut",
|
||||
"how_long_after": "Hur länge efter händelsens slut?",
|
||||
"how_long_after_hosts_no_show": "Hur länge efter att värdarna inte dyker upp på cal video-mötet?",
|
||||
"how_long_after_guests_no_show": "Hur länge efter att gästerna inte dyker upp på cal video-mötet?",
|
||||
"how_long_after_user_no_show_minutes": "Hur länge efter att användarna inte dyker upp på cal video-mötet?",
|
||||
"no_available_slots": "Inga tillgängliga tider",
|
||||
"time_available": "Tid tillgänglig",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Kan du inte hitta rätt konferensapp? Besök vår <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Installera om appen",
|
||||
"reschedule_reason": "Anledning till ombokning",
|
||||
"choose_common_schedule_team_event": "Välj ett gemensamt schema",
|
||||
"choose_common_schedule_team_event_description": "Aktivera den här funktionen om du vill använda ett gemensamt schema mellan värdarna. När den är inaktiverad bokas varje värd enligt sitt standardschema.",
|
||||
"choose_common_schedule_team_event_description": "Aktivera detta om du vill använda ett gemensamt schema mellan värdarna. När det är inaktiverat kommer varje värd att bokas baserat på sitt standardschema eller det valda schemat.",
|
||||
"reason": "Orsak",
|
||||
"sender_id": "Avsändar-ID",
|
||||
"sender_id_error_message": "Endast bokstäver, siffror och mellanslag tillåts (maximalt 11 tecken)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Nytt alternativ",
|
||||
"update_profile": "Uppdatera medlem",
|
||||
"attribute_updated_successfully": "Egenskapen uppdaterades framgångsrikt",
|
||||
"attribute_deleted_successfully": "Attributet har raderats framgångsrikt",
|
||||
"attributes_edited_successfully": "Egenskaperna redigerades framgångsrikt",
|
||||
"attribute_meta_description": "Hantera egenskaper för dina teammedlemmar",
|
||||
"attributes_edit_description": "Redigera egenskaper för dina teammedlemmar",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "månad till datum",
|
||||
"year_to_date": "år till datum",
|
||||
"custom_range": "anpassat intervall",
|
||||
"show_all_columns": "Visa alla kolumner",
|
||||
"toggle_columns": "Växla kolumner",
|
||||
"no_columns_found": "Inga kolumner hittades",
|
||||
"salesforce_create_record_as": "Vid bokning, lägg till händelser och nya deltagare som:",
|
||||
"salesforce_lead": "Lead",
|
||||
"salesforce_contact_under_account": "Kontakt under ett konto",
|
||||
"salesforce_skip_entry_creation": "Hoppa över att skapa {{entry}}-post om den inte finns i Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Om kontakten inte finns under ett konto, skapa en ny lead från deltagaren",
|
||||
"salesforce_create_new_contact_under_account": "Skapa en ny kontakt under ett konto baserat på deltagarens e-postdomän och befintliga kontakter",
|
||||
"mass_assign_attributes": "Massuppdatera attribut",
|
||||
"salesforce_book_directly_with_attendee_owner": "Om deltagaren finns i Salesforce, boka direkt med ägaren",
|
||||
"salesforce_check_owner_of": "Entitet att kontrollera ägare av för att boka direkt",
|
||||
"account": "Konto",
|
||||
"choose_hosts_schedule": "Välj värdarnas scheman",
|
||||
"hosts_schedule_description": "Du kan välja ett annat schema för varje värd. Varje värds standardschema är valt som standard.",
|
||||
"no_hosts_description": "Inga värdar tilldelade, lägg till värdar i tilldelningsfliken.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Telefon numarası sağlanacaktır",
|
||||
"before_event_trigger": "etkinlik başlamadan önce",
|
||||
"event_cancelled_trigger": "etkinlik iptal edildiğinde",
|
||||
"after_hosts_cal_video_no_show": "Ev sahipleri Cal video toplantısına katılmadığında",
|
||||
"after_guests_cal_video_no_show": "Misafirler Cal video toplantısına katılmadığında",
|
||||
"new_event_trigger": "yeni bir etkinlik için rezervasyon yapıldığında",
|
||||
"email_host_action": "organizatöre e-posta gönder",
|
||||
"email_attendee_action": "katılımcılara e-posta gönder",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "belirli bir e-posta adresine e-posta gönder",
|
||||
"after_event_trigger": "etkinlik sona erdikten sonra",
|
||||
"how_long_after": "Etkinlik sona erdikten ne kadar sonra?",
|
||||
"how_long_after_hosts_no_show": "Ev sahipleri Cal video toplantısına katılmadığında ne kadar süre sonra?",
|
||||
"how_long_after_guests_no_show": "Misafirler Cal video toplantısına katılmadığında ne kadar süre sonra?",
|
||||
"how_long_after_user_no_show_minutes": "Kullanıcılar Cal video toplantısına katılmadığında kaç dakika sonra?",
|
||||
"no_available_slots": "Uygun yer yok",
|
||||
"time_available": "Uygun zaman",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Doğru konferans uygulamasını bulamıyor musunuz? <1>Uygulama Mağazamızı</1> ziyaret edin.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Uygulamayı yeniden yükleyin",
|
||||
"reschedule_reason": "Yeniden planlama nedeni",
|
||||
"choose_common_schedule_team_event": "Ortak bir program seçin",
|
||||
"choose_common_schedule_team_event_description": "Toplantı sahipleri arasında ortak bir plan kullanmak istiyorsanız bunu etkinleştirin. Devre dışı bırakıldığında, her toplantı sahibi varsayılan programına göre rezerve edilir.",
|
||||
"choose_common_schedule_team_event_description": "Ev sahipleri arasında ortak bir program kullanmak istiyorsanız bunu etkinleştirin. Devre dışı bırakıldığında, her ev sahibi varsayılan programına veya seçilen programına göre rezerve edilir.",
|
||||
"reason": "Sebep",
|
||||
"sender_id": "Gönderici Kimliği",
|
||||
"sender_id_error_message": "Sadece harflere, sayılara ve boşluklara izin verilir (en fazla 11 karakter)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Yeni seçenek",
|
||||
"update_profile": "Üyeyi güncelle",
|
||||
"attribute_updated_successfully": "Öznitelik başarıyla güncellendi",
|
||||
"attribute_deleted_successfully": "Özellik başarıyla silindi",
|
||||
"attributes_edited_successfully": "Öznitelikler başarıyla düzenlendi",
|
||||
"attribute_meta_description": "Takım üyeleriniz için öznitelikleri yönetin",
|
||||
"attributes_edit_description": "Takım üyeleriniz için öznitelikleri düzenleyin",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "ayın başından bugüne",
|
||||
"year_to_date": "yılın başından bugüne",
|
||||
"custom_range": "özel aralık",
|
||||
"show_all_columns": "Tüm sütunları göster",
|
||||
"toggle_columns": "Sütunları değiştir",
|
||||
"no_columns_found": "Sütun bulunamadı",
|
||||
"salesforce_create_record_as": "Rezervasyon sırasında, etkinlikleri ekleyin ve yeni katılımcıları şu şekilde ekleyin:",
|
||||
"salesforce_lead": "Potansiyel Müşteri",
|
||||
"salesforce_contact_under_account": "Bir hesap altında İletişim",
|
||||
"salesforce_skip_entry_creation": "{{entry}} kaydı Salesforce'ta yoksa oluşturmayı atla",
|
||||
"salesforce_if_account_does_not_exist": "İletişim bir hesap altında yoksa, katılımcıdan yeni potansiyel müşteri oluştur",
|
||||
"salesforce_create_new_contact_under_account": "Katılımcının e-posta alanı ve mevcut iletişimler temelinde bir hesap altında yeni bir iletişim oluştur",
|
||||
"mass_assign_attributes": "Özellikleri toplu olarak atama",
|
||||
"salesforce_book_directly_with_attendee_owner": "Katılımcı Salesforce'ta mevcutsa, doğrudan sahibiyle rezervasyon yap",
|
||||
"salesforce_check_owner_of": "Doğrudan rezervasyon yapmak için sahibini kontrol edilecek varlık",
|
||||
"account": "Hesap",
|
||||
"choose_hosts_schedule": "Ev sahibi programlarını seçin",
|
||||
"hosts_schedule_description": "Her ev sahibi için farklı bir program seçebilirsiniz. Her ev sahibinin varsayılan programı varsayılan olarak seçilir.",
|
||||
"no_hosts_description": "Atanmış ev sahibi yok, atama sekmesinde ev sahipleri ekleyin.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Yeni dizelerinizi yukarıya ekleyin ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Номер телефону буде надано",
|
||||
"before_event_trigger": "до початку заходу",
|
||||
"event_cancelled_trigger": "у момент скасування заходу",
|
||||
"after_hosts_cal_video_no_show": "Після того, як господарі не приєдналися до відеозустрічі на Cal",
|
||||
"after_guests_cal_video_no_show": "Після того, як гості не приєдналися до відеозустрічі на Cal",
|
||||
"new_event_trigger": "у момент бронювання нового заходу",
|
||||
"email_host_action": "надсилати електронний лист ведучому",
|
||||
"email_attendee_action": "надіслати ел. лист учасникам",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "надсилати електронний лист на вказану адресу",
|
||||
"after_event_trigger": "після завершення заходу",
|
||||
"how_long_after": "Через який час після завершення заходу?",
|
||||
"how_long_after_hosts_no_show": "Скільки часу після того, як господарі не з'явилися на відеозустрічі на Cal?",
|
||||
"how_long_after_guests_no_show": "Скільки часу після того, як гості не з'явилися на відеозустрічі на Cal?",
|
||||
"how_long_after_user_no_show_minutes": "Скільки часу після того, як користувачі не з'явилися на відеозустрічі на Cal?",
|
||||
"no_available_slots": "Немає доступних вікон",
|
||||
"time_available": "Доступний час",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Не можете знайти потрібний додаток для конференцій? Відвідайте наш <1>App Store</1>.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Перевстановіть додаток",
|
||||
"reschedule_reason": "Причина перенесення",
|
||||
"choose_common_schedule_team_event": "Виберіть спільний розклад",
|
||||
"choose_common_schedule_team_event_description": "Увімкніть цей параметр, щоб використовувати спільний для двох ведучих розклад. Якщо цей параметр вимкнено, бронювання для кожного з ведучих відбуватиметься за їхніми власними графіками.",
|
||||
"choose_common_schedule_team_event_description": "Увімкніть це, якщо ви хочете використовувати спільний розклад між ведучими. Коли вимкнено, кожен ведучий буде заброньований відповідно до свого стандартного або обраного розкладу.",
|
||||
"reason": "Причина",
|
||||
"sender_id": "ID відправника",
|
||||
"sender_id_error_message": "Дозволяються тільки літери, цифри та пробіли (макс. 11 символів)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Нова опція",
|
||||
"update_profile": "Оновити профіль",
|
||||
"attribute_updated_successfully": "Атрибут успішно оновлено",
|
||||
"attribute_deleted_successfully": "Атрибут успішно видалено",
|
||||
"attributes_edited_successfully": "Атрибути успішно відредаговано",
|
||||
"attribute_meta_description": "Керуйте атрибутами для членів вашої команди",
|
||||
"attributes_edit_description": "Редагуйте атрибути для членів вашої команди",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "з початку місяця",
|
||||
"year_to_date": "з початку року",
|
||||
"custom_range": "власний діапазон",
|
||||
"show_all_columns": "Показати всі стовпці",
|
||||
"toggle_columns": "Перемкнути стовпці",
|
||||
"no_columns_found": "Стовпці не знайдено",
|
||||
"salesforce_create_record_as": "Під час бронювання додати події та нових учасників як:",
|
||||
"salesforce_lead": "Лід",
|
||||
"salesforce_contact_under_account": "Контакт під обліковим записом",
|
||||
"salesforce_skip_entry_creation": "Пропустити створення запису {{entry}}, якщо вони не існують у Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Якщо контакт не існує під обліковим записом, створити новий лід з учасника",
|
||||
"salesforce_create_new_contact_under_account": "Створити новий контакт під обліковим записом на основі домену електронної пошти учасника та існуючих контактів",
|
||||
"mass_assign_attributes": "Масове призначення атрибутів",
|
||||
"salesforce_book_directly_with_attendee_owner": "Якщо учасник існує в Salesforce, бронювати безпосередньо з власником",
|
||||
"salesforce_check_owner_of": "Сутність для перевірки власника для прямого бронювання",
|
||||
"account": "Обліковий запис",
|
||||
"choose_hosts_schedule": "Виберіть розклад для ведучих",
|
||||
"hosts_schedule_description": "Ви можете вибрати інший розклад для кожного ведучого. За замовчуванням обрано стандартний розклад кожного ведучого.",
|
||||
"no_hosts_description": "Ведучих не призначено, додайте ведучих на вкладці призначення.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "Số điện thoại sẽ được cung ứng",
|
||||
"before_event_trigger": "trước khi sự kiện bắt đầu",
|
||||
"event_cancelled_trigger": "khi sự kiện bị huỷ",
|
||||
"after_hosts_cal_video_no_show": "Sau khi người tổ chức không tham gia video trên Cal",
|
||||
"after_guests_cal_video_no_show": "Sau khi khách mời không tham gia video trên Cal",
|
||||
"new_event_trigger": "khi sự kiện mới được đặt lịch hẹn",
|
||||
"email_host_action": "gửi email đến chủ sự kiện",
|
||||
"email_attendee_action": "gửi email đến người tham gia",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "gửi email đến một địa chỉ email cụ thể",
|
||||
"after_event_trigger": "sau khi sự kiện kết thúc",
|
||||
"how_long_after": "Bao lâu sau khi sự kiện kết thúc?",
|
||||
"how_long_after_hosts_no_show": "Bao lâu sau khi người tổ chức không xuất hiện trong cuộc họp video trên Cal?",
|
||||
"how_long_after_guests_no_show": "Bao lâu sau khi khách mời không xuất hiện trong cuộc họp video trên Cal?",
|
||||
"how_long_after_user_no_show_minutes": "Bao lâu sau khi người dùng không xuất hiện trong cuộc họp video trên Cal?",
|
||||
"no_available_slots": "Không còn khoảng thời gian trống",
|
||||
"time_available": "Thời gian trống",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "Không tìm thấy ứng dụng hội nghị phù hợp? Ghé thăm <1>App Store</1> của chúng tôi.",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "Cài đặt lại ứng dụng",
|
||||
"reschedule_reason": "Lý do dời lịch",
|
||||
"choose_common_schedule_team_event": "Chọn một lịch chung",
|
||||
"choose_common_schedule_team_event_description": "Bật mục này nếu bạn muốn dùng lịch thông thường giữa các chủ sự kiện. Khi tắt đi, mỗi chủ sự kiện sẽ được đặt lịch theo lịch mặc định của họ.",
|
||||
"choose_common_schedule_team_event_description": "Bật tùy chọn này nếu bạn muốn sử dụng lịch trình chung giữa các người tổ chức. Khi tắt, mỗi người tổ chức sẽ được đặt lịch dựa trên lịch trình mặc định của họ hoặc lịch trình đã chọn.",
|
||||
"reason": "Lý do",
|
||||
"sender_id": "ID người gửi",
|
||||
"sender_id_error_message": "Chỉ được phép sử dụng chữ cái, số và khoảng trắng (tối đa 11 ký tự)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "Tùy chọn mới",
|
||||
"update_profile": "Cập nhật thành viên",
|
||||
"attribute_updated_successfully": "Thuộc tính đã được cập nhật thành công",
|
||||
"attribute_deleted_successfully": "Thuộc tính đã được xóa thành công",
|
||||
"attributes_edited_successfully": "Thuộc tính đã được chỉnh sửa thành công",
|
||||
"attribute_meta_description": "Quản lý thuộc tính cho các thành viên trong nhóm của bạn",
|
||||
"attributes_edit_description": "Chỉnh sửa thuộc tính cho các thành viên trong nhóm của bạn",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "từ đầu tháng đến nay",
|
||||
"year_to_date": "từ đầu năm đến nay",
|
||||
"custom_range": "phạm vi tùy chỉnh",
|
||||
"show_all_columns": "Hiển thị tất cả các cột",
|
||||
"toggle_columns": "Chuyển đổi cột",
|
||||
"no_columns_found": "Không tìm thấy cột nào",
|
||||
"salesforce_create_record_as": "Khi đặt lịch, thêm sự kiện và người tham dự mới dưới dạng:",
|
||||
"salesforce_lead": "Khách hàng tiềm năng",
|
||||
"salesforce_contact_under_account": "Liên hệ dưới một tài khoản",
|
||||
"salesforce_skip_entry_creation": "Bỏ qua việc tạo bản ghi {{entry}} nếu chúng không tồn tại trong Salesforce",
|
||||
"salesforce_if_account_does_not_exist": "Nếu liên hệ không tồn tại dưới một tài khoản, tạo khách hàng tiềm năng mới từ người tham dự",
|
||||
"salesforce_create_new_contact_under_account": "Tạo liên hệ mới dưới một tài khoản dựa trên tên miền email của người tham dự và các liên hệ hiện có",
|
||||
"mass_assign_attributes": "Gán thuộc tính hàng loạt",
|
||||
"salesforce_book_directly_with_attendee_owner": "Nếu người tham dự tồn tại trong Salesforce, đặt lịch trực tiếp với chủ sở hữu",
|
||||
"salesforce_check_owner_of": "Thực thể để kiểm tra chủ sở hữu để đặt lịch trực tiếp",
|
||||
"account": "Tài khoản",
|
||||
"choose_hosts_schedule": "Chọn lịch trình của người tổ chức",
|
||||
"hosts_schedule_description": "Bạn có thể chọn lịch trình khác nhau cho từng người tổ chức. Lịch trình mặc định của mỗi người tổ chức sẽ được chọn theo mặc định.",
|
||||
"no_hosts_description": "Không có người tổ chức nào được chỉ định, hãy thêm người tổ chức trong tab phân công.",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "将提供电话号码",
|
||||
"before_event_trigger": "活动开始前",
|
||||
"event_cancelled_trigger": "活动取消后",
|
||||
"after_hosts_cal_video_no_show": "主持人未加入 Cal 视频后的处理",
|
||||
"after_guests_cal_video_no_show": "嘉宾未加入 Cal 视频后的处理",
|
||||
"new_event_trigger": "预约新活动时",
|
||||
"email_host_action": "向主持人发送电子邮件",
|
||||
"email_attendee_action": "向参与者发送电子邮件",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "将电子邮件发送到指定的电子邮件地址",
|
||||
"after_event_trigger": "活动结束后",
|
||||
"how_long_after": "活动结束后多久?",
|
||||
"how_long_after_hosts_no_show": "主持人未出现在 Cal 视频会议后多长时间?",
|
||||
"how_long_after_guests_no_show": "嘉宾未出现在 Cal 视频会议后多长时间?",
|
||||
"how_long_after_user_no_show_minutes": "用户未出现在 Cal 视频会议后多长时间?",
|
||||
"no_available_slots": "没有可用的时间段",
|
||||
"time_available": "可用时间",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "找不到合适的会议应用?访问我们的<1>应用商店</1>。",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "重新安装应用",
|
||||
"reschedule_reason": "重新安排原因",
|
||||
"choose_common_schedule_team_event": "选择通用时间表",
|
||||
"choose_common_schedule_team_event_description": "如果您希望在主持人之间使用通用时间表,请启用此选项。如果禁用,将根据主持人的默认时间表预约每个主持人。",
|
||||
"choose_common_schedule_team_event_description": "如果您希望在主持人之间使用通用日程,请启用此选项。禁用时,每位主持人将根据其默认日程或选择的日程进行预订。",
|
||||
"reason": "原因",
|
||||
"sender_id": "发件人 ID",
|
||||
"sender_id_error_message": "只允许字母、数字和空格(最多 11 个字符)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "新选项",
|
||||
"update_profile": "更新成员",
|
||||
"attribute_updated_successfully": "属性更新成功",
|
||||
"attribute_deleted_successfully": "属性删除成功",
|
||||
"attributes_edited_successfully": "属性编辑成功",
|
||||
"attribute_meta_description": "管理团队成员的属性",
|
||||
"attributes_edit_description": "编辑团队成员的属性",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "本月至今",
|
||||
"year_to_date": "今年至今",
|
||||
"custom_range": "自定义范围",
|
||||
"show_all_columns": "显示所有列",
|
||||
"toggle_columns": "切换列",
|
||||
"no_columns_found": "未找到列",
|
||||
"salesforce_create_record_as": "预订时,将事件添加到,并将新参与者添加为:",
|
||||
"salesforce_lead": "潜在客户",
|
||||
"salesforce_contact_under_account": "账户下的联系人",
|
||||
"salesforce_skip_entry_creation": "如果{{entry}}记录在Salesforce中不存在,则跳过创建",
|
||||
"salesforce_if_account_does_not_exist": "如果联系人不在某个账户下,则从参与者创建新的潜在客户",
|
||||
"salesforce_create_new_contact_under_account": "根据参与者的电子邮件域和现有联系人,在账户下创建新联系人",
|
||||
"mass_assign_attributes": "批量分配属性",
|
||||
"salesforce_book_directly_with_attendee_owner": "如果参与者在Salesforce中存在,则直接与所有者预订",
|
||||
"salesforce_check_owner_of": "检查实体的所有者以直接预订",
|
||||
"account": "账户",
|
||||
"choose_hosts_schedule": "选择主持人日程",
|
||||
"hosts_schedule_description": "您可以为每位主持人选择不同的日程。默认情况下,每位主持人的默认日程被选中。",
|
||||
"no_hosts_description": "未分配主持人,请在分配选项卡中添加主持人。",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 在此上方添加您的新字符串 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -1227,6 +1227,8 @@
|
||||
"number_provided": "將提供電話號碼",
|
||||
"before_event_trigger": "活動開始前",
|
||||
"event_cancelled_trigger": "活動取消時",
|
||||
"after_hosts_cal_video_no_show": "主持人未加入 Cal 視訊後",
|
||||
"after_guests_cal_video_no_show": "賓客未加入 Cal 視訊後",
|
||||
"new_event_trigger": "預約新活動時",
|
||||
"email_host_action": "傳送電子郵件給主辦者",
|
||||
"email_attendee_action": "傳送電子郵件給與會者",
|
||||
@@ -1643,6 +1645,9 @@
|
||||
"email_address_action": "寄電子郵件至特定的電子郵件地址",
|
||||
"after_event_trigger": "活動結束過後",
|
||||
"how_long_after": "活動結束過後多久?",
|
||||
"how_long_after_hosts_no_show": "主持人未出現在 Cal 視訊會議後多久?",
|
||||
"how_long_after_guests_no_show": "賓客未出現在 Cal 視訊會議後多久?",
|
||||
"how_long_after_user_no_show_minutes": "用戶未出現在 Cal 視訊會議後多久?",
|
||||
"no_available_slots": "沒有可預約的時段",
|
||||
"time_available": "開放時間",
|
||||
"cant_find_the_right_conferencing_app_visit_our_app_store": "找不到合適的會議應用?訪問我們的 <1>應用商店</1>。",
|
||||
@@ -1697,7 +1702,7 @@
|
||||
"invalid_credential_action": "重新安裝應用程式",
|
||||
"reschedule_reason": "重新預約的原因",
|
||||
"choose_common_schedule_team_event": "選擇公用行程表",
|
||||
"choose_common_schedule_team_event_description": "若要在多個主辦者之間使用公用行程表,請啟用此選項。停用時,會根據每個主辦者預設的行程表預約對方的時間。",
|
||||
"choose_common_schedule_team_event_description": "如果您希望在主持人之間使用共同的排程,請啟用此選項。禁用時,每位主持人將根據其預設排程或選擇的排程進行預訂。",
|
||||
"reason": "原因",
|
||||
"sender_id": "傳送者 ID",
|
||||
"sender_id_error_message": "只能使用字母、數字和空格 (最多 11 個字元)",
|
||||
@@ -2590,6 +2595,7 @@
|
||||
"new_option": "新選項",
|
||||
"update_profile": "更新成員",
|
||||
"attribute_updated_successfully": "屬性更新成功",
|
||||
"attribute_deleted_successfully": "屬性已成功刪除",
|
||||
"attributes_edited_successfully": "屬性編輯成功",
|
||||
"attribute_meta_description": "管理您的團隊成員的屬性",
|
||||
"attributes_edit_description": "編輯您的團隊成員的屬性",
|
||||
@@ -2635,6 +2641,21 @@
|
||||
"month_to_date": "本月至今",
|
||||
"year_to_date": "本年至今",
|
||||
"custom_range": "自訂範圍",
|
||||
"show_all_columns": "顯示所有欄位",
|
||||
"toggle_columns": "切換欄位",
|
||||
"no_columns_found": "未找到欄位",
|
||||
"salesforce_create_record_as": "預約時,將事件和新參加者新增為:",
|
||||
"salesforce_lead": "潛在客戶",
|
||||
"salesforce_contact_under_account": "帳戶下的聯絡人",
|
||||
"salesforce_skip_entry_creation": "如果 {{entry}} 記錄不存在於 Salesforce 中,則跳過創建",
|
||||
"salesforce_if_account_does_not_exist": "如果聯絡人不存在於帳戶下,則從參加者創建新的潛在客戶",
|
||||
"salesforce_create_new_contact_under_account": "根據參加者的電子郵件域和現有聯絡人,在帳戶下創建新的聯絡人",
|
||||
"mass_assign_attributes": "批量分配屬性",
|
||||
"salesforce_book_directly_with_attendee_owner": "如果參加者存在於 Salesforce 中,則直接與擁有者預約",
|
||||
"salesforce_check_owner_of": "檢查實體的擁有者以直接預約",
|
||||
"account": "帳戶",
|
||||
"choose_hosts_schedule": "選擇主持人的排程",
|
||||
"hosts_schedule_description": "您可以為每位主持人選擇不同的排程。每位主持人的預設排程會自動選擇。",
|
||||
"no_hosts_description": "未分配主持人,請在分配標籤中添加主持人。",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 請在此處新增您的字串 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,9 @@ describe("Tests to Check if Event Types have empty Assignment", () => {
|
||||
checkForEmptyAssignment({
|
||||
assignedUsers: [],
|
||||
assignAllTeamMembers: false,
|
||||
hosts: [{ userId: 101, isFixed: false, priority: 2, weight: 100, weightAdjustment: 0 }],
|
||||
hosts: [
|
||||
{ userId: 101, isFixed: false, priority: 2, weight: 100, weightAdjustment: 0, scheduleId: null },
|
||||
],
|
||||
isManagedEventType: true,
|
||||
})
|
||||
).toBe(true);
|
||||
@@ -61,7 +63,9 @@ describe("Tests to Check if Event Types have empty Assignment", () => {
|
||||
checkForEmptyAssignment({
|
||||
assignedUsers: [],
|
||||
assignAllTeamMembers: false,
|
||||
hosts: [{ userId: 101, isFixed: false, priority: 2, weight: 100, weightAdjustment: 0 }],
|
||||
hosts: [
|
||||
{ userId: 101, isFixed: false, priority: 2, weight: 100, weightAdjustment: 0, scheduleId: null },
|
||||
],
|
||||
isManagedEventType: false,
|
||||
})
|
||||
).toBe(false);
|
||||
|
||||
@@ -1896,4 +1896,141 @@ describe("getSchedule", () => {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Round robin event", async () => {
|
||||
test("correctly get slots for event with round robin hosts choosen schedule (non-default)", async () => {
|
||||
vi.setSystemTime("2024-05-21T00:00:13Z");
|
||||
|
||||
const plus1DateString = "2024-05-22";
|
||||
const plus2DateString = "2024-05-23";
|
||||
|
||||
// An event with no common schedule and hosts choosen schedule (non-default schedule)
|
||||
await createBookingScenario({
|
||||
eventTypes: [
|
||||
{
|
||||
id: 1,
|
||||
slotInterval: 60,
|
||||
length: 60,
|
||||
hosts: [
|
||||
{
|
||||
userId: 101,
|
||||
isFixed: false,
|
||||
scheduleId: 2,
|
||||
},
|
||||
{
|
||||
userId: 102,
|
||||
isFixed: false,
|
||||
scheduleId: 3,
|
||||
},
|
||||
],
|
||||
schedulingType: "ROUND_ROBIN",
|
||||
schedule: null,
|
||||
},
|
||||
],
|
||||
users: [
|
||||
{
|
||||
...TestData.users.example,
|
||||
email: "example@example.com",
|
||||
id: 101,
|
||||
schedules: [TestData.schedules.IstMorningShift, TestData.schedules.IstEveningShift],
|
||||
defaultScheduleId: 1,
|
||||
},
|
||||
{
|
||||
...TestData.users.example,
|
||||
email: "example1@example.com",
|
||||
id: 102,
|
||||
schedules: [TestData.schedules.IstEveningShift, TestData.schedules.IstMorningShift],
|
||||
defaultScheduleId: 4,
|
||||
},
|
||||
],
|
||||
bookings: [],
|
||||
});
|
||||
|
||||
const scheduleWithHostChoosenSch = await getSchedule({
|
||||
input: {
|
||||
eventTypeId: 1,
|
||||
eventTypeSlug: "",
|
||||
startTime: `${plus1DateString}T18:30:00.000Z`,
|
||||
endTime: `${plus2DateString}T18:29:59.999Z`,
|
||||
timeZone: Timezones["+5:30"],
|
||||
isTeamEvent: true,
|
||||
teamMemberEmail: "test@test.com",
|
||||
},
|
||||
});
|
||||
|
||||
// expect only slots of IstEveningShift , as this is the choosen schedule for hosts
|
||||
expect(scheduleWithHostChoosenSch).toHaveTimeSlots(
|
||||
[`11:30:00.000Z`, `12:30:00.000Z`, `13:30:00.000Z`, `14:30:00.000Z`, `15:30:00.000Z`],
|
||||
{
|
||||
dateString: plus2DateString,
|
||||
}
|
||||
);
|
||||
});
|
||||
test("correctly get slots for event with commom schedule", async () => {
|
||||
vi.setSystemTime("2024-05-21T00:00:13Z");
|
||||
|
||||
const plus1DateString = "2024-05-22";
|
||||
const plus2DateString = "2024-05-23";
|
||||
|
||||
// An event with common schedule
|
||||
await createBookingScenario({
|
||||
eventTypes: [
|
||||
{
|
||||
id: 1,
|
||||
slotInterval: 60,
|
||||
length: 60,
|
||||
hosts: [
|
||||
{
|
||||
userId: 101,
|
||||
isFixed: false,
|
||||
},
|
||||
{
|
||||
userId: 102,
|
||||
isFixed: false,
|
||||
},
|
||||
],
|
||||
schedule: TestData.schedules.IstEveningShift,
|
||||
schedulingType: "ROUND_ROBIN",
|
||||
},
|
||||
],
|
||||
users: [
|
||||
{
|
||||
...TestData.users.example,
|
||||
email: "example@example.com",
|
||||
id: 101,
|
||||
schedules: [TestData.schedules.IstMorningShift],
|
||||
defaultScheduleId: 1,
|
||||
},
|
||||
{
|
||||
...TestData.users.example,
|
||||
email: "example1@example.com",
|
||||
id: 102,
|
||||
schedules: [TestData.schedules.IstMidShift],
|
||||
defaultScheduleId: 2,
|
||||
},
|
||||
],
|
||||
bookings: [],
|
||||
});
|
||||
|
||||
const scheduleWithEventCommonSch = await getSchedule({
|
||||
input: {
|
||||
eventTypeId: 1,
|
||||
eventTypeSlug: "",
|
||||
startTime: `${plus1DateString}T18:30:00.000Z`,
|
||||
endTime: `${plus2DateString}T18:29:59.999Z`,
|
||||
timeZone: Timezones["+5:30"],
|
||||
isTeamEvent: true,
|
||||
teamMemberEmail: "test@test.com",
|
||||
},
|
||||
});
|
||||
|
||||
// expect only slots of IstEveningShift , as this is the common schedule of event
|
||||
expect(scheduleWithEventCommonSch).toHaveTimeSlots(
|
||||
[`11:30:00.000Z`, `12:30:00.000Z`, `13:30:00.000Z`, `14:30:00.000Z`, `15:30:00.000Z`],
|
||||
{
|
||||
dateString: plus2DateString,
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -78,6 +78,7 @@ type InputWorkflowReminder = {
|
||||
type InputHost = {
|
||||
userId: number;
|
||||
isFixed?: boolean;
|
||||
scheduleId?: number | null;
|
||||
};
|
||||
/**
|
||||
* Data to be mocked
|
||||
@@ -165,7 +166,7 @@ export type InputEventType = {
|
||||
};
|
||||
requiresConfirmation?: boolean;
|
||||
destinationCalendar?: Prisma.DestinationCalendarCreateInput;
|
||||
schedule?: InputUser["schedules"][number];
|
||||
schedule?: InputUser["schedules"][number] | null;
|
||||
bookingLimits?: IntervalLimit;
|
||||
durationLimits?: IntervalLimit;
|
||||
owner?: number;
|
||||
@@ -222,6 +223,13 @@ async function addHostsToDb(eventTypes: InputEventType[]) {
|
||||
id: host.userId,
|
||||
},
|
||||
},
|
||||
schedule: host.scheduleId
|
||||
? {
|
||||
connect: {
|
||||
id: host.scheduleId,
|
||||
},
|
||||
}
|
||||
: undefined,
|
||||
};
|
||||
|
||||
await prismock.host.create({
|
||||
|
||||
@@ -1346,6 +1346,10 @@
|
||||
}
|
||||
},
|
||||
"description": "Meeting location"
|
||||
},
|
||||
"smsReminderNumber": {
|
||||
"type": "number",
|
||||
"description": "SMS reminder number"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1389,10 +1393,6 @@
|
||||
"seatsShowAvailabilityCount": {
|
||||
"type": "boolean",
|
||||
"description": "Show the number of available seats"
|
||||
},
|
||||
"smsReminderNumber": {
|
||||
"type": "number",
|
||||
"description": "SMS reminder number"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1405,15 +1405,18 @@
|
||||
"responses": {
|
||||
"name": "Hello Hello",
|
||||
"email": "hello@gmail.com",
|
||||
"metadata": {},
|
||||
"location": "Calcom HQ"
|
||||
"smsReminderNumber": null,
|
||||
"location": {
|
||||
"value": "userPhone",
|
||||
"optionValue": ""
|
||||
}
|
||||
},
|
||||
"timeZone": "Europe/London",
|
||||
"language": "en",
|
||||
"title": "Debugging between Syed Ali Shahbaz and Hello Hello",
|
||||
"description": null,
|
||||
"status": "PENDING",
|
||||
"smsReminderNumber": null
|
||||
"metadata": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,84 +59,6 @@
|
||||
"tags": ["Platform / Cal Provider"]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing": {
|
||||
"get": {
|
||||
"operationId": "ConferencingController_listConferencingApps",
|
||||
"summary": "List your conferencing applications",
|
||||
"parameters": [],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ConferencingAppsOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": ["Platform / Conferencing"]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing/{app}/default": {
|
||||
"post": {
|
||||
"operationId": "ConferencingController_default",
|
||||
"summary": "Set your default conferencing application",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "app",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/SetDefaultConferencingAppOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": ["Platform / Conferencing"]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing/{app}/disconnect": {
|
||||
"delete": {
|
||||
"operationId": "ConferencingController_disconnect",
|
||||
"summary": "Disconnect your conferencing application",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "app",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ConferencingAppOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": ["Platform / Conferencing"]
|
||||
}
|
||||
},
|
||||
"/v2/gcal/oauth/auth-url": {
|
||||
"get": {
|
||||
"operationId": "GcalController_redirect",
|
||||
@@ -3435,6 +3357,113 @@
|
||||
"tags": ["Calendars"]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing/{app}/connect": {
|
||||
"post": {
|
||||
"operationId": "ConferencingController_connect",
|
||||
"summary": "Connect your conferencing application",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "app",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ConferencingAppOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": ["Conferencing"]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing": {
|
||||
"get": {
|
||||
"operationId": "ConferencingController_listConferencingApps",
|
||||
"summary": "List your conferencing applications",
|
||||
"parameters": [],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ConferencingAppsOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": ["Conferencing"]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing/{app}/default": {
|
||||
"post": {
|
||||
"operationId": "ConferencingController_default",
|
||||
"summary": "Set your default conferencing application",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "app",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/SetDefaultConferencingAppOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": ["Conferencing"]
|
||||
}
|
||||
},
|
||||
"/v2/conferencing/{app}/disconnect": {
|
||||
"delete": {
|
||||
"operationId": "ConferencingController_disconnect",
|
||||
"summary": "Disconnect your conferencing application",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "app",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ConferencingAppOutputResponseDto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": ["Conferencing"]
|
||||
}
|
||||
},
|
||||
"/v2/destination-calendars": {
|
||||
"put": {
|
||||
"operationId": "DestinationCalendarsController_updateDestinationCalendars",
|
||||
@@ -10030,7 +10059,9 @@
|
||||
"RECORDING_READY",
|
||||
"INSTANT_MEETING",
|
||||
"RECORDING_TRANSCRIPTION_GENERATED",
|
||||
"OOO_CREATED"
|
||||
"OOO_CREATED",
|
||||
"AFTER_HOSTS_CAL_VIDEO_NO_SHOW",
|
||||
"AFTER_GUESTS_CAL_VIDEO_NO_SHOW"
|
||||
]
|
||||
},
|
||||
"active": {
|
||||
@@ -10094,7 +10125,9 @@
|
||||
"RECORDING_READY",
|
||||
"INSTANT_MEETING",
|
||||
"RECORDING_TRANSCRIPTION_GENERATED",
|
||||
"OOO_CREATED"
|
||||
"OOO_CREATED",
|
||||
"AFTER_HOSTS_CAL_VIDEO_NO_SHOW",
|
||||
"AFTER_GUESTS_CAL_VIDEO_NO_SHOW"
|
||||
]
|
||||
},
|
||||
"active": {
|
||||
@@ -11685,6 +11718,73 @@
|
||||
}
|
||||
},
|
||||
"required": ["status", "data"]
|
||||
},
|
||||
"ConferencingAppsOutputDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "number",
|
||||
"description": "Id of the conferencing app credentials"
|
||||
},
|
||||
"type": {
|
||||
"type": "string",
|
||||
"example": "google_video",
|
||||
"description": "Type of conferencing app"
|
||||
},
|
||||
"userId": {
|
||||
"type": "number",
|
||||
"description": "Id of the user associated to the conferencing app"
|
||||
},
|
||||
"invalid": {
|
||||
"type": "boolean",
|
||||
"nullable": true,
|
||||
"example": true,
|
||||
"description": "Whether if the connection is working or not."
|
||||
}
|
||||
},
|
||||
"required": ["id", "type", "userId"]
|
||||
},
|
||||
"ConferencingAppOutputResponseDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"status": {
|
||||
"type": "string",
|
||||
"example": "success",
|
||||
"enum": ["success", "error"]
|
||||
},
|
||||
"data": {
|
||||
"$ref": "#/components/schemas/ConferencingAppsOutputDto"
|
||||
}
|
||||
},
|
||||
"required": ["status", "data"]
|
||||
},
|
||||
"ConferencingAppsOutputResponseDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"status": {
|
||||
"type": "string",
|
||||
"example": "success",
|
||||
"enum": ["success", "error"]
|
||||
},
|
||||
"data": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/ConferencingAppsOutputDto"
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["status", "data"]
|
||||
},
|
||||
"SetDefaultConferencingAppOutputResponseDto": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"status": {
|
||||
"type": "string",
|
||||
"example": "success",
|
||||
"enum": ["success", "error"]
|
||||
}
|
||||
},
|
||||
"required": ["status"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 9.3 KiB |
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 6.0 KiB |
@@ -0,0 +1,6 @@
|
||||
<svg width="153" height="40" viewBox="0 0 153 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="153" height="40" fill="#8A05FF"/>
|
||||
<path d="M17.5001 21L18.2051 21.705L19.5001 20.415V26.5H20.5001V20.415L21.7951 21.705L22.5001 21L20.0001 18.5L17.5001 21Z" fill="white"/>
|
||||
<path d="M23.7501 23H23.5001V22H23.7501C24.3468 22.0239 24.9286 21.8097 25.3674 21.4047C25.8062 20.9996 26.0662 20.4368 26.0901 19.84C26.1139 19.2433 25.8998 18.6615 25.4947 18.2227C25.0896 17.7838 24.5268 17.5239 23.9301 17.5H23.5001L23.4501 17.09C23.3391 16.2483 22.926 15.4755 22.2876 14.9157C21.6492 14.3559 20.8291 14.0473 19.9801 14.0473C19.131 14.0473 18.3109 14.3559 17.6725 14.9157C17.0341 15.4755 16.621 16.2483 16.5101 17.09L16.5001 17.5H16.0701C15.4733 17.5239 14.9105 17.7838 14.5054 18.2227C14.1003 18.6615 13.8862 19.2433 13.9101 19.84C13.9339 20.4368 14.1939 20.9996 14.6327 21.4047C15.0715 21.8097 15.6533 22.0239 16.2501 22H16.5001V23H16.2501C15.4483 22.995 14.6766 22.6937 14.0835 22.1541C13.4905 21.6145 13.1178 20.8747 13.0371 20.077C12.9565 19.2792 13.1736 18.4798 13.6467 17.8325C14.1198 17.1851 14.8155 16.7355 15.6001 16.57C15.8159 15.5633 16.3705 14.661 17.1712 14.0138C17.9719 13.3665 18.9704 13.0134 20.0001 13.0134C21.0297 13.0134 22.0282 13.3665 22.8289 14.0138C23.6296 14.661 24.1842 15.5633 24.4001 16.57C25.1846 16.7355 25.8803 17.1851 26.3534 17.8325C26.8265 18.4798 27.0436 19.2792 26.963 20.077C26.8823 20.8747 26.5096 21.6145 25.9166 22.1541C25.3235 22.6937 24.5518 22.995 23.7501 23Z" fill="white"/>
|
||||
<path d="M39.0632 25H35.4372V14.99H39.0632C41.8212 14.99 43.5152 16.782 43.5152 20.002C43.5152 23.222 41.8212 25 39.0632 25ZM36.6972 23.88H39.0632C41.6112 23.88 42.1992 21.962 42.1992 20.002C42.1992 18.042 41.6112 16.11 39.0632 16.11H36.6972V23.88ZM51.4309 21.164C51.4309 21.374 51.4309 21.612 51.4169 21.724H45.8309C45.8589 22.984 46.5589 24.244 48.1409 24.244C49.5409 24.244 50.0729 23.306 50.1989 22.802H51.3329C50.9689 24.132 49.9609 25.21 48.1269 25.21C45.8729 25.21 44.6549 23.586 44.6549 21.416C44.6549 19.134 46.0129 17.65 48.1269 17.65C50.2129 17.65 51.4309 19.078 51.4309 21.164ZM45.8309 20.744H50.2409C50.2409 19.568 49.4009 18.616 48.0709 18.616C46.8389 18.616 45.9009 19.498 45.8309 20.744ZM56.1898 17.664C57.9818 17.664 59.4098 19.078 59.4098 21.43C59.4098 23.782 57.9818 25.196 56.1898 25.196C55.0418 25.196 54.3698 24.692 53.9498 24.076H53.9218V27.478H52.8018V17.86H53.9218V18.742H53.9498C54.3698 18.196 55.0418 17.664 56.1898 17.664ZM56.0778 24.216C57.5478 24.216 58.2338 22.83 58.2338 21.43C58.2338 20.03 57.5478 18.644 56.0778 18.644C54.7478 18.644 53.9218 19.75 53.9218 21.43C53.9218 23.11 54.7478 24.216 56.0778 24.216ZM61.9094 25H60.7894V14.99H61.9094V25ZM66.7855 25.21C64.6015 25.21 63.2855 23.656 63.2855 21.43C63.2855 19.204 64.6015 17.65 66.7855 17.65C68.9555 17.65 70.2715 19.204 70.2715 21.43C70.2715 23.656 68.9555 25.21 66.7855 25.21ZM66.7855 24.23C68.3815 24.23 69.0955 22.956 69.0955 21.43C69.0955 19.904 68.3815 18.63 66.7855 18.63C65.1755 18.63 64.4615 19.904 64.4615 21.43C64.4615 22.956 65.1755 24.23 66.7855 24.23ZM72.202 27.506C71.95 27.506 71.782 27.492 71.46 27.436V26.484C71.698 26.512 71.81 26.526 72.02 26.526C72.608 26.526 73.252 26.162 73.56 24.93L70.662 17.86H71.922L74.12 23.544H74.148L76.248 17.86H77.452L74.568 25.21C73.854 27.016 73.168 27.506 72.202 27.506ZM84.237 17.86V18.84H82.837V23.138C82.837 23.894 83.019 24.09 83.649 24.09C83.887 24.09 83.999 24.076 84.237 24.048V25C83.915 25.056 83.747 25.07 83.495 25.07C82.445 25.07 81.717 24.706 81.717 23.082V18.84H80.667V17.86H81.717V15.48H82.837V17.86H84.237ZM88.5095 25.21C86.3255 25.21 85.0095 23.656 85.0095 21.43C85.0095 19.204 86.3255 17.65 88.5095 17.65C90.6795 17.65 91.9955 19.204 91.9955 21.43C91.9955 23.656 90.6795 25.21 88.5095 25.21ZM88.5095 24.23C90.1055 24.23 90.8195 22.956 90.8195 21.43C90.8195 19.904 90.1055 18.63 88.5095 18.63C86.8995 18.63 86.1855 19.904 86.1855 21.43C86.1855 22.956 86.8995 24.23 88.5095 24.23ZM97.98 25H96.72V14.99H100.738C102.936 14.99 104.084 16.026 104.084 17.874C104.084 19.12 103.314 20.072 102.264 20.324V20.352C104.518 20.786 103.692 24.748 104.224 24.916V25H102.866C102.432 24.58 103.384 20.954 100.85 20.954H97.98V25ZM97.98 19.834H100.444C101.97 19.834 102.824 19.148 102.824 17.902C102.824 16.754 102.18 16.11 100.486 16.11H97.98V19.834ZM111.962 21.164C111.962 21.374 111.962 21.612 111.948 21.724H106.362C106.39 22.984 107.09 24.244 108.672 24.244C110.072 24.244 110.604 23.306 110.73 22.802H111.864C111.5 24.132 110.492 25.21 108.658 25.21C106.404 25.21 105.186 23.586 105.186 21.416C105.186 19.134 106.544 17.65 108.658 17.65C110.744 17.65 111.962 19.078 111.962 21.164ZM106.362 20.744H110.772C110.772 19.568 109.932 18.616 108.602 18.616C107.37 18.616 106.432 19.498 106.362 20.744ZM116.833 17.664C118.135 17.664 119.227 18.378 119.227 20.016V25H118.107V20.296C118.107 19.372 117.673 18.644 116.553 18.644C115.293 18.644 114.453 19.442 114.453 20.548V25H113.333V17.86H114.453V18.714H114.481C114.859 18.21 115.615 17.664 116.833 17.664ZM126.047 18.784V14.99H127.167V25H126.047V24.118H126.019C125.599 24.664 124.927 25.196 123.779 25.196C121.987 25.196 120.559 23.782 120.559 21.43C120.559 19.078 121.987 17.664 123.779 17.664C124.927 17.664 125.599 18.168 126.019 18.784H126.047ZM123.891 24.216C125.221 24.216 126.047 23.11 126.047 21.43C126.047 19.75 125.221 18.644 123.891 18.644C122.421 18.644 121.735 20.03 121.735 21.43C121.735 22.83 122.421 24.216 123.891 24.216ZM135.323 21.164C135.323 21.374 135.323 21.612 135.309 21.724H129.723C129.751 22.984 130.451 24.244 132.033 24.244C133.433 24.244 133.965 23.306 134.091 22.802H135.225C134.861 24.132 133.853 25.21 132.019 25.21C129.765 25.21 128.547 23.586 128.547 21.416C128.547 19.134 129.905 17.65 132.019 17.65C134.105 17.65 135.323 19.078 135.323 21.164ZM129.723 20.744H134.133C134.133 19.568 133.293 18.616 131.963 18.616C130.731 18.616 129.793 19.498 129.723 20.744ZM139.816 17.664C140.082 17.664 140.278 17.678 140.474 17.706V18.826C140.306 18.798 140.18 18.784 140.012 18.784C138.696 18.784 137.814 19.82 137.814 21.192V25H136.694V17.86H137.814V19.274H137.842C138.22 18.336 138.794 17.664 139.816 17.664Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.0 KiB |
+16
-2
@@ -24,7 +24,7 @@
|
||||
"topbarLinks": [
|
||||
{
|
||||
"name": "Support",
|
||||
"url": "mailto:support@cal.com"
|
||||
"url": "https://go.cal.com/support"
|
||||
}
|
||||
],
|
||||
"topbarCtaButton": {
|
||||
@@ -129,7 +129,10 @@
|
||||
"pages": [
|
||||
"self-hosting/deployments/aws",
|
||||
"self-hosting/deployments/azure",
|
||||
"self-hosting/deployments/elastio",
|
||||
"self-hosting/deployments/gcp",
|
||||
"self-hosting/deployments/railway",
|
||||
"self-hosting/deployments/render",
|
||||
"self-hosting/deployments/vercel"
|
||||
]
|
||||
},
|
||||
@@ -182,9 +185,20 @@
|
||||
"group": "Getting Started",
|
||||
"pages": [
|
||||
"platform/introduction",
|
||||
{
|
||||
"group": "Atoms",
|
||||
"icon": "atom",
|
||||
"pages": [
|
||||
"platform/atoms/google-calendar-connect",
|
||||
"platform/atoms/outlook-calendar-connect",
|
||||
"platform/atoms/apple-calendar-connect",
|
||||
"platform/atoms/availability-settings",
|
||||
"platform/atoms/booker",
|
||||
"platform/atoms/calendar-settings"
|
||||
]
|
||||
},
|
||||
"platform/quickstart",
|
||||
"platform/booking-redirects",
|
||||
"platform/atoms-reference",
|
||||
"platform/faq"
|
||||
]
|
||||
},
|
||||
|
||||
@@ -1,231 +0,0 @@
|
||||
---
|
||||
title: Atoms reference
|
||||
description: Everything related to atoms from props to styling.
|
||||
---
|
||||
|
||||
## Props
|
||||
|
||||
Below is a list of tables that contains all the available props each atom contains.
|
||||
|
||||
<Info>Please ensure all custom classnames are valid [Tailwind CSS](https://tailwindcss.com/) classnames.</Info>
|
||||
|
||||
### 1. Google calendar connect atom
|
||||
<p></p>
|
||||
|
||||
| Name | Required | Description |
|
||||
|:--------------------|:----------|:-----------------------------------------------------------------------------------------------------------|
|
||||
| className | No | To pass in custom classnames from outside for styling the atom |
|
||||
| label | No | The label for the connect button |
|
||||
| alreadyConnectedLabel | No | Label to display when atom is in already connected state |
|
||||
| loadingLabel | No | Label to display when atom is in loading state |
|
||||
| onCheckError | No | A callback function to handle errors when checking the connection status |
|
||||
|
||||
|
||||
### 2. Outlook calendar connect atom
|
||||
<p></p>
|
||||
|
||||
| Name | Required | Description |
|
||||
|:--------------------|:----------|:-----------------------------------------------------------------------------------------------------------|
|
||||
| className | No | To pass in custom classnames from outside for styling the atom |
|
||||
| label | No | The label for the connect button |
|
||||
| alreadyConnectedLabel | No | Label to display when atom is in already connected state |
|
||||
| loadingLabel | No | Label to display when atom is in loading state |
|
||||
| onCheckError | No | A callback function to handle errors when checking the connection status |
|
||||
| redir | No | A custom redirect URL link where the user gets redirected after successful authentication |
|
||||
|
||||
|
||||
### 3. Apple calendar connect atom
|
||||
<p></p>
|
||||
|
||||
| Name | Required | Description |
|
||||
|:--------------------|:----------|:-----------------------------------------------------------------------------------------------------------|
|
||||
| className | No | To pass in custom classnames from outside for styling the atom |
|
||||
| label | No | The label for the connect button |
|
||||
| alreadyConnectedLabel | No | Label to display when atom is in already connected state |
|
||||
| loadingLabel | No | Label to display when atom is in loading state |
|
||||
| onCheckError | No | A callback function to handle errors when checking the connection status |
|
||||
|
||||
|
||||
### 4. Availability settings atom
|
||||
<p></p>
|
||||
|
||||
| Name | Required | Description |
|
||||
|:--------------------|:----------|:-----------------------------------------------------------------------------------------------------------|
|
||||
| id | No | The ID of the schedule which fetches a user's availability |
|
||||
| labels | No | Helpful if you want to pass in custom labels for i18n |
|
||||
| customClassNames | No | To pass in custom classnames from outside for styling the atom |
|
||||
| onUpdateSuccess | No | A callback function to handle updating user availability successfully |
|
||||
| onBeforeUpdate | No | Validates schedule before it is sent to the server; if true, the schedule is sent, else it is not |
|
||||
| onUpdateError | No | A callback function that gets triggered when the user availability fails to update |
|
||||
| onDeleteSuccess | No | A callback function that gets triggered when the user availability is deleted successfully |
|
||||
| onDeleteError | No | A callback function that gets triggered when the user availability fails to delete |
|
||||
| enableOverrides | No | Allows user to enable or disable date overrides display in the atom; defaults to disabled |
|
||||
|
||||
|
||||
### 5. Booker atom
|
||||
<p></p>
|
||||
|
||||
| Name | Required | Description |
|
||||
|:----------------------------|:----------|:-------------------------------------------------------------------------------------------------------|
|
||||
| username | Yes | Username of the person whose schedule is to be displayed |
|
||||
| eventSlug | Yes | Unique slug created for a particular event |
|
||||
| orgBannerUrl | No | URL of the user's current organization |
|
||||
| customClassNames | No | To pass in custom classnames from outside for styling the atom |
|
||||
| month | No | The exact month for displaying a user's availability; defaults to the current month |
|
||||
| selectedDate | No | Default selected date for which the slot picker opens |
|
||||
| hideBranding | No | For hiding any branding on the booker |
|
||||
| isAway | No | Sets the booker component to the away state |
|
||||
| allowsDynamicBooking | No | Boolean indicating if the booking is a dynamic booking |
|
||||
| bookingData | No | Data for rescheduling a booking passed in via this prop |
|
||||
| defaultFormValues | No | Prefilled values for booking form fields like name, email, guests, notes, reschedule reason, etc. |
|
||||
| isTeamEvent | No | Boolean indicating if it is a team event |
|
||||
| duration | No | Refers to a multiple-duration event type; selects default if not passed |
|
||||
| durationConfig | No | Configures selectable options for a multi-duration event type |
|
||||
| hashedLink | No | Refers to the private link from event types page |
|
||||
| isInstantMeeting | No | Boolean indicating if the booking is an instant meeting |
|
||||
| rescheduleUid | No | Unique ID generated during rescheduling |
|
||||
| bookingUid | No | Unique ID generated during booking |
|
||||
| locationUrl | No | Custom meeting link URL instead of a Cal.com link |
|
||||
| firstName | No | First name of the attendee |
|
||||
| lastName | No | Last name of the attendee |
|
||||
| guests | No | Invite a guest to join a meeting |
|
||||
| name | No | Host name |
|
||||
| onCreateBookingSuccess | No | Callback function for successful booking creation |
|
||||
| onCreateBookingError | No | Callback function triggered on booking creation failure |
|
||||
| onCreateRecurringBookingSuccess | No | Callback function for successful recurring booking creation |
|
||||
| onCreateRecurringBookingError | No | Callback function triggered on recurring booking creation failure |
|
||||
| onCreateInstantBookingSuccess | No | Callback function for successful instant booking creation |
|
||||
| onCreateInstantBookingError | No | Callback function triggered on instant booking creation failure |
|
||||
| onReserveSlotSuccess | No | Callback function for successful slot reservation |
|
||||
| onReserveSlotError | No | Callback function triggered on slot reservation failure |
|
||||
| onDeleteSlotSuccess | No | Callback function for successful slot deletion |
|
||||
| onDeleteSlotError | No | Callback function triggered on slot deletion failure |
|
||||
|
||||
|
||||
<Info>Booker embed atom shares the same prop interface as the Booker atom. Hence, you can pass in the same props to both the Booker Embed atom and the Booker atom.</Info>
|
||||
|
||||
### 6. Calendar settings atom
|
||||
<p></p>
|
||||
|
||||
| Name | Required | Description |
|
||||
|:------------|:----------|:-----------------------------------------------------------------------------------------------------------|
|
||||
| classNames | No | To pass in custom classnames from outside for styling the atom |
|
||||
|
||||
|
||||
### 7. Destination calendar settings atom
|
||||
<p></p>
|
||||
|
||||
| Name | Required | Description |
|
||||
|:--------------|:----------|:-----------------------------------------------------------------------------------------------------------|
|
||||
| statusLoader | No | To pass in a custom component for the loading state |
|
||||
| classNames | No | To pass in custom classnames from outside for styling the atom |
|
||||
|
||||
|
||||
### 8. Selected calendar settings atom
|
||||
<p></p>
|
||||
|
||||
| Name | Required | Description |
|
||||
|:------------|:----------|:-----------------------------------------------------------------------------------------------------------|
|
||||
| classNames | No | To pass in custom classnames from outside for styling the atom |
|
||||
|
||||
|
||||
## Styling
|
||||
|
||||
Below is a list of tables that contains all the available classnames that can be used for each atom.
|
||||
|
||||
### 1. Google calendar connect atom
|
||||
<p></p>
|
||||
|
||||
| Name | Description |
|
||||
|:------------|:-----------------------------------------------------|
|
||||
| className | Pass in custom classnames from outside for styling the button |
|
||||
|
||||
|
||||
### 2. Outlook calendar connect atom
|
||||
<p></p>
|
||||
|
||||
| Name | Description |
|
||||
|:------------|:-----------------------------------------------------|
|
||||
| className | Pass in custom classnames from outside for styling the button |
|
||||
|
||||
|
||||
### 3. Apple calendar connect atom
|
||||
<p></p>
|
||||
|
||||
| Name | Description |
|
||||
|:------------|:-----------------------------------------------------|
|
||||
| className | Pass in custom classnames from outside for styling the button |
|
||||
|
||||
|
||||
### 4. Availability settings atom
|
||||
<p></p>
|
||||
|
||||
Availability settings atom accepts custom styles via the **customClassNames** prop. All the props that we see below fall under this **customClassNames** prop.
|
||||
|
||||
| Name | Description |
|
||||
|:---------------------------|:-----------------------------------------------------------------------|
|
||||
| containerClassName | Adds styling to the whole availability settings component |
|
||||
| ctaClassName | Adds stylings only to certain call-to-action buttons |
|
||||
| editableHeadingClassName | Editable heading or title can be styled |
|
||||
| formClassName | Form which contains the days and toggles |
|
||||
| timezoneSelectClassName | Adds styling to the timezone select component |
|
||||
| subtitlesClassName | Styles the subtitle |
|
||||
| scheduleContainer | Styles the entire schedule component |
|
||||
| scheduleDay | Adds styling to just the day of a particular schedule |
|
||||
| dayRanges | Adds styling to day ranges |
|
||||
| timeRanges | Time ranges in the availability settings can be customized |
|
||||
| labelAndSwitchContainer | Adds styling to label and switches |
|
||||
| overridesModalClassNames | Adds styling to the date overrides modal |
|
||||
|
||||
|
||||
### 5. Booker atom
|
||||
<p></p>
|
||||
|
||||
Booker atom accepts custom styles via the **customClassNames** prop. All the props that we see below fall under this **customClassNames** prop. In terms of styling there are four major classnames for the Booker, i.e. **bookerContainer**, **eventMetaCustomClassNames**, **datePickerCustomClassNames** and **availableTimeSlotsCustomClassNames**. Most of the classnames below fall under one of these sub classes.
|
||||
|
||||
| Name | Description |
|
||||
|:-----------------------------|:----------------------------------------------------------------------|
|
||||
| bookerContainer | Adds styling to the whole of the booker atom |
|
||||
| eventMetaContainer | Styles the event meta component containing details about an event |
|
||||
| eventMetaTitle | Adds styles to the event meta title |
|
||||
| eventMetaTimezoneSelect | Adds styles to the event meta timezone selector |
|
||||
| datePickerContainer | Adds styling to the date picker |
|
||||
| datePickerTitle | Styles the date picker title |
|
||||
| datePickerDays | Adds styling to all days in the date picker |
|
||||
| datePickerDate | Adds styling to all dates in the date picker |
|
||||
| datePickerDatesActive | Styles only the dates with available slots |
|
||||
| datePickerToggle | Styles the left and right toggle buttons |
|
||||
| availableTimeSlotsContainer | Adds styling to the available time slots component |
|
||||
| availableTimeSlotsHeaderContainer | Styles only the header container |
|
||||
| availableTimeSlotsTitle | Adds styles to the title |
|
||||
| availableTimeSlotsTimeFormatToggle | Adds styles to the format toggle buttons |
|
||||
| availableTimes | Styles all the available times container |
|
||||
|
||||
|
||||
### 6. Calendar settings atom
|
||||
<p></p>
|
||||
|
||||
| Name | Description |
|
||||
|:-----------------------------------------|:--------------------------------------------------------------|
|
||||
| calendarSettingsCustomClassnames | Adds styling to the entire calendar settings atom |
|
||||
| destinationCalendarSettingsCustomClassnames | Adds styling only to the destination calendar container |
|
||||
| selectedCalendarSettingsCustomClassnames | Adds styling only to the selected calendar container |
|
||||
|
||||
|
||||
### 7. Destination calendar settings atom
|
||||
<p></p>
|
||||
|
||||
| Name | Description |
|
||||
|:------------|:-----------------------------------------------------|
|
||||
| classNames | Pass in custom classnames from outside for styling the atom |
|
||||
|
||||
|
||||
### 8. Selected calendar settings atom
|
||||
<p></p>
|
||||
|
||||
| Name | Description |
|
||||
|:------------|:-----------------------------------------------------|
|
||||
| classNames | Pass in custom classnames from outside for styling the atom |
|
||||
|
||||
|
||||
<Note>Please note that sometimes the custom classnames may fail to override the styling with the classnames that you might have passed via props. That is because the **clsx** utility function that we use to override classnames inside our components has some limitations. A simple get around to solve this issue is to just prefix your classnames with **!** property just before passing in any classname.</Note>
|
||||
@@ -0,0 +1,90 @@
|
||||
---
|
||||
title: "Apple calendar connect"
|
||||
---
|
||||
|
||||
The Apple calendar connect button is used to effortlessly syncs a user's apple calendar. This allows users to create, view and edit events, with options available for type and time all from the platform.
|
||||
|
||||
Below code snippet can be used to render the Apple calendar connect button
|
||||
|
||||
```js
|
||||
import { Connect } from "@calcom/atoms";
|
||||
|
||||
export default function ConnectCalendar() {
|
||||
return (
|
||||
<main>
|
||||
<Connect.AppleCalendar />
|
||||
</main>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
For a demonstration of the Apple calendar connect integration, please refer to the video below.
|
||||
|
||||
<p></p>
|
||||
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://www.loom.com/embed/0db65d94754443ae91fed28f9bc10509?sid=d7b823cc-cda1-4d18-881a-aa49242b873d"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowfullscreen="true"
|
||||
></iframe>
|
||||
|
||||
<p></p>
|
||||
|
||||
The apple calendar atom works a bit differently than outlook and google calendar. We don’t get redirected to an OAuth consent page, instead a modal appears which prompts us to create an app specific password to use with Cal.com
|
||||
|
||||
Similar to Outlook and Google calendar, the Apple calendar connect supports integration for both single and multiple users. The above video demonstration showcases the integration for a single user. To enable integration for multiple users, simply pass the prop `isMultiCalendar` as `true`.
|
||||
|
||||
Below code snippet can be used to render the Apple calendar connect button for multiple users
|
||||
|
||||
```js
|
||||
import { Connect } from "@calcom/atoms";
|
||||
|
||||
export default function ConnectCalendar() {
|
||||
return (
|
||||
<main>
|
||||
<Connect.AppleCalendar isMultiCalendar={true} />
|
||||
</main>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
For a demonstration of the Apple calendar connect integration for multiple users, please refer to the video below.
|
||||
|
||||
<p></p>
|
||||
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://www.loom.com/embed/5844146fbcf840f99e35f9620a34186d?sid=a13f4ebf-f565-4488-8352-4e68080ef237"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowfullscreen="true"
|
||||
></iframe>
|
||||
|
||||
<p></p>
|
||||
|
||||
We offer all kinds of customizations to the Outlook calendar connect via props. Below is a list of props that can be passed to the Google calendar connect.
|
||||
|
||||
<p></p>
|
||||
|
||||
| Name | Required | Description |
|
||||
| :-------------------- | :------- | :----------------------------------------------------------------------- |
|
||||
| className | No | To pass in custom classnames from outside for styling the atom |
|
||||
| label | No | The label for the connect button |
|
||||
| alreadyConnectedLabel | No | Label to display when atom is in already connected state |
|
||||
| loadingLabel | No | Label to display when atom is in loading state |
|
||||
| onCheckError | No | A callback function to handle errors when checking the connection status |
|
||||
| initialData | No | Initial data to be passed |
|
||||
| isMultiCalendar | No | Specfies if the button supports integration for multiple users |
|
||||
| tooltip | No | In case user wants to pass external tooltip component |
|
||||
| tooltipSide | No | Specifies what direction the tooltip appears |
|
||||
| isClickable | No | Boolean to disable button or not |
|
||||
| onSuccess | No | A callback function to handle success when checking the connection status|
|
||||
|
||||
<Note>
|
||||
If you try to put your Apple Id password in the password field, it will throw an error. It only accepts an
|
||||
app specific password generated from https://appleid.apple.com/account/manage.
|
||||
</Note>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user