Compare commits

..
33 Commits
Author SHA1 Message Date
GitHub Actions b3536728e0 chore: release v4.7.12
Post release / release (push) Canceled after 0s
2024-11-26 20:22:01 +00:00
Eunjae LeeandOmar López e22fec93b1 fix: provide fixed widths for DataTable columns (#17853)
Co-authored-by: Omar López <zomars@me.com>
2024-11-26 20:17:33 +00:00
Joe Au-Yeung f81716fbb2 feat: Salesforce - pass company booking response to the Lead field (#17860)
* Catch undefined app option properties

* Add `getCompanyNameFromBookingResponse` method

* Pass bookingResponse when Lead is being created

* Pass bookingResponse from CRMManager

* Handle empty company response

* Return the company value
2024-11-26 19:14:44 +00:00
Anik Dhabal Babu 0b66ddc6db fix: unable to remove banner (#17857) 2024-11-26 18:42:41 +00:00
Somay Chauhan 382a27f134 fix: round robin host reschedule error (#17855) 2024-11-26 18:08:58 +00:00
Calcom BotandReplexica ac5ee225d5 feat: update translations via @replexica (#17854)
* chore: sync with main

* feat: update translations via @replexica

---------

Co-authored-by: Replexica <support@replexica.com>
2024-11-26 16:46:54 +00:00
Anik Dhabal Babu d8fd6f5c25 chore: exclude emails form field refactor (#17824)
* chore: exclude emails refactor

* Update
2024-11-26 21:30:28 +05:30
Benny Joo 0e333aa71c fix: use tags icon for attr (#17841) 2024-11-26 12:52:21 -03:00
Carina WollendorferandCarinaWolli ae70786b2b fix: send attendee email with event updates of reassignment (#17836)
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
2024-11-26 10:33:00 -05:00
Benny Joo 2df553b58b chore: use app router for settings/platform/members page (#17849)
* use i18n strings

* migrate platform/members page
2024-11-26 15:33:01 +01:00
Morgan d4afa1436d chore: make throttler logs verbose (#17845) 2024-11-26 09:42:27 +00:00
Morgan 88efa0a2b2 fix: oauth client users controller permissions (#17822)
* fix: oauth client users controller permissions

* fixup! fix: oauth client users controller permissions

* fixup! fixup! fix: oauth client users controller permissions

* fixup! fixup! fixup! fix: oauth client users controller permissions
2024-11-26 09:41:03 +00:00
Calcom BotandReplexica b563e41623 feat: update translations via @replexica (#17842)
Co-authored-by: Replexica <support@replexica.com>
2024-11-25 22:17:54 +00:00
Benny Joo f097f852ad chore: settings/organizations - remove pages router and use app router (#16774)
* remove pages router and use app router

* remove future/settings/organizations files

* fix billing page

* sync SettingsLayoutAppDirClient and fix members page

* fix attribute pages

* remove isAppDir where not needed anymore

* add CTA button for members view
2024-11-25 16:49:00 -05:00
Joe Au-Yeung aea8588a21 fix: Salesforce owner check, handle no contact email (#17834) 2024-11-25 19:38:06 +00:00
Benny Joo 7e0c684348 fix: UI issue in Phone Input dropdown (#17837) 2024-11-25 19:35:09 +00:00
Keith Williams 21956f096d chore: Add check to skip DB migrations as part of build (#17827) 2024-11-25 16:33:51 -03:00
Benny Joo d1adfa3bf9 fix (#17812) 2024-11-25 14:07:55 -05:00
Benny JooandKeith Williams 62976a4c77 feat: AI description - Backend for adding translation objects to EventType model (#17657)
* feat: AI description - DB model + frontend + backend (fetch only)

* fix types and add validation to backend

* improve log

* improve

* import type

* add EventTypeTranslationRepository

* fix replexica error

* fix replexica error

* fix

* fix test

* wip

* wip

* add createManyDescriptionTranslations method

* improve logic

* refactor

* update replexica type

* improve typing

* Renamed descriptionTranslations to fieldTranslations

* log errors in replexica service

* handle translations in background

* don't create, upsert instead

* make sure that description is updated

* simplify

* fix

* Update packages/trpc/server/routers/viewer/eventTypes/update.handler.ts

* improve filter logic in frontend

* implement background job using Tasker

* update schema

* update schema again

* rename

* rename id to uid

* add migration

* fix type

* update

* update schema and migration sql

* fix migration

* fix type check

* fix type check 2

* improve find logic in EventMeta

* add more validation

* add logger

* rename

* upgrade replexica/sdk to 0.7.0

* upgrade replexica to 0.7.0

* use batchLocalizeText

* add comments

* override browser locale if user is a signed in calcom user

* fix type in replexica

* fix migration sql

* fix type

* use dynamic import

* do not use batchLocalizeText

* fix

* add more validations

* fix type error

* address comment

* update locales

* update locales

---------

Co-authored-by: Keith Williams <keithwillcode@gmail.com>
2024-11-25 18:37:42 +00:00
GitHub Actions 93489709a8 chore: release v4.7.11
Post release / release (push) Canceled after 0s
2024-11-25 16:35:44 +00:00
Amit Sharma 050102fde2 fix: OOO redirect, email wrong formatting (#17829) 2024-11-25 16:11:44 +00:00
Morgan c1112ab2ab fix: extract clientId header manually apiv2 (Revert) (#17832)
This reverts commit b0bf87f3ed.
2024-11-25 15:59:39 +00:00
Morgan 34d4c3d775 fix: api v2 webhook issue (#17831) 2024-11-25 15:52:00 +00:00
Somay Chauhan e477e5892c feat: added customClassnames for event-setup tab (#17240)
* feat: added customClassnames for event-setup tab

* Update EventTypePlatformWrapper.tsx

* better classnames naming

* added classNames to common types

* updated classnames to use the common exported types

* udpate

* better classnames

* better classname names

* classnames -> classNames

* added default styling

* Update Locations.tsx

* Update event-types.tsx

* update

* locationSelectCustomClassNames -> LocationSelectCustomClassNames

* Update documentation.json

* fix: better classnames

* Update types.ts
2024-11-25 09:59:09 +00:00
ad44ca9f2a fix: change order of eventtypes and routingforms (#17615)
* change order of eventtypes and routingforms

* for workflows

* for filtered workflows

* update slug of first expected event-type

* updated due to latest merges

* test to ensure new eventtype added is first in the list

* test for workflows

---------

Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2024-11-25 06:25:05 -03:00
Somay ChauhanandMorgan 868cf91c35 refactor: conferencing apps atoms web wrapper (#17732)
* conferencing apps atoms web wrapper

* Update DisconnectIntegrationModal.tsx

* formating changes

* handleBulkUpdateDefaultLocation -> bulkUpdateFunction

* fix: type error for handleRemoveApp

* fix: type error for handleRemoveApp

* refactor: removed ConferencingView component and migrated its functionality to ConferencingAppsViewWebWrapper

* refactor: moved AppList, AppListCard to packages/features

* fix: type changes

---------

Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
2024-11-25 09:53:38 +02:00
Lauris Skraucis 8b9693ea60 fix: v2 booking location (#17817)
* fix: create-booking.input dont require location to be url

* fix: return video call url for booking location

* try to debug test

* remove test file
2024-11-25 07:34:59 +00:00
Somay Chauhan 935115d7c1 feat: added custom classnames for event-limits tab (#17478)
* added custom classnames for event limits tab

* added classNames to common types

* updated classnames to use the common exported types

* undo

* Update EventTypePlatformWrapper.tsx

* better clasnames naming

* added example classnames for demo

* fix: better calssnames

bookingFrequencyLimitSection-> bookingFrequencyLimit
totalDurationLimitSection-> totalDurationLimit
futureBookingLimitSection-> futureBookingLimit
offsetStartTimesSection-> offsetStartTimes

* suffix->addOn

* Update types.ts
2024-11-25 07:13:58 +00:00
Somay Chauhan eae74c568c feat: added custom classnames for event-advanced tab (#17479)
* feat: added custom classnames to event-advanced tab

* added more calssnames

* added classNames to common types

* undo extra changes

* Update EventTypePlatformWrapper.tsx

* Update types.ts

* Update EventTypePlatformWrapper.tsx

* better classnames

* Update EventTypePlatformWrapper.tsx

* addeed CustomEventTypeModalClassNames

* added example classnames for demo and some changes

* fix: better classnames

* timezoneLockToggle -> timezoneLock

* Update types.ts

* Update CustomEventTypeModal.tsx
2024-11-25 12:11:27 +05:30
Somay Chauhan 9e9dd6070d feat: added custom classnames to event-assignment tab atom (#17527)
* added classNames to common types

* Update types.ts

* feat: added custom classnames to event-assignment tab atom

* Update EventTypePlatformWrapper.tsx

* update: better classnames

* added example clasnames for demo

* fix: classnames

* fix: type check

* fixed classnames

* fix: better calssnames

assingAllTeamMembersToggle -> assingAllTeamMembers
enableWeightsToggle -> enableWeights
assingAllTeamMembersToggle -> assingAllTeamMembers
2024-11-25 06:10:22 +01:00
Amit SharmaandPeer Richelsen 5af10a2f61 feat: past and overlapping ooo (#17373)
* feat: past and overlapping ooo

* use existing props

* added e2e test

* disallow duplicates added tests

---------

Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2024-11-24 18:58:22 +00:00
Peer Richelsen 3936a0ae94 target blank for settings link (#17815) 2024-11-23 21:12:44 +00:00
Morgan c2a3d8b8df fix: extract trpc and react-awesome-query-builder from atoms (#17801)
* wip

* fix: externalize react-awesome-query-builder

* fix: move useSession to webWrapper

* fixup! Merge branch 'main' into fix-platform-event-types-segment

* fixup! fixup! Merge branch 'main' into fix-platform-event-types-segment

* fixup! fixup! fixup! Merge branch 'main' into fix-platform-event-types-segment

* fixup! fixup! fixup! fixup! Merge branch 'main' into fix-platform-event-types-segment
2024-11-23 12:29:16 +00:00
214 changed files with 3494 additions and 1260 deletions
-1
View File
@@ -348,7 +348,6 @@ AB_TEST_BUCKET_PROBABILITY=50
# whether we redirect to the future/event-types from event-types or not
APP_ROUTER_EVENT_TYPES_ENABLED=0
APP_ROUTER_SETTINGS_DEVELOPER_ENABLED=0
APP_ROUTER_SETTINGS_ORG_ENABLED=0
APP_ROUTER_APPS_INSTALLED_CATEGORY_ENABLED=0
APP_ROUTER_APPS_SLUG_ENABLED=0
APP_ROUTER_APPS_SLUG_SETUP_ENABLED=0
+2
View File
@@ -0,0 +1,2 @@
undecided:
- "@calcom/prisma"
+8
View File
@@ -0,0 +1,8 @@
undecided:
- calcom-monorepo
- "@calcom/app-store-cli"
- "@calcom/platform-constants"
- "@calcom/platform-enums"
- "@calcom/platform-types"
- "@calcom/platform-utils"
- "@calcom/prisma"
@@ -160,10 +160,10 @@ export class BookingsController_2024_04_15 {
@Post("/")
async createBooking(
@Req() req: BookingRequest,
@Body() body: CreateBookingInput_2024_04_15
@Body() body: CreateBookingInput_2024_04_15,
@Headers(X_CAL_CLIENT_ID) clientId?: string
): Promise<ApiResponse<Partial<BookingResponse>>> {
const clientIdHeader = req.get(X_CAL_CLIENT_ID);
const oAuthClientId = clientIdHeader?.toString();
const oAuthClientId = clientId?.toString();
const { orgSlug, locationUrl } = body;
req.headers["x-cal-force-slug"] = orgSlug;
try {
@@ -191,10 +191,10 @@ export class BookingsController_2024_04_15 {
async cancelBooking(
@Req() req: BookingRequest,
@Param("bookingId") bookingId: string,
@Body() _: CancelBookingInput_2024_04_15
@Body() _: CancelBookingInput_2024_04_15,
@Headers(X_CAL_CLIENT_ID) clientId?: string
): Promise<ApiResponse<{ bookingId: number; bookingUid: string; onlyRemovedAttendee: boolean }>> {
const clientIdHeader = req.get(X_CAL_CLIENT_ID);
const oAuthClientId = clientIdHeader?.toString();
const oAuthClientId = clientId?.toString();
if (bookingId) {
try {
req.body.id = parseInt(bookingId);
@@ -245,10 +245,10 @@ export class BookingsController_2024_04_15 {
@Post("/recurring")
async createRecurringBooking(
@Req() req: BookingRequest,
@Body() _: CreateRecurringBookingInput_2024_04_15[]
@Body() _: CreateRecurringBookingInput_2024_04_15[],
@Headers(X_CAL_CLIENT_ID) clientId?: string
): Promise<ApiResponse<BookingResponse[]>> {
const clientIdHeader = req.get(X_CAL_CLIENT_ID);
const oAuthClientId = clientIdHeader?.toString();
const oAuthClientId = clientId?.toString();
try {
const recurringEventId = uuidv4();
for (const recurringEvent of req.body) {
@@ -283,10 +283,10 @@ export class BookingsController_2024_04_15 {
@Post("/instant")
async createInstantBooking(
@Req() req: BookingRequest,
@Body() _: CreateBookingInput_2024_04_15
@Body() _: CreateBookingInput_2024_04_15,
@Headers(X_CAL_CLIENT_ID) clientId?: string
): Promise<ApiResponse<Awaited<ReturnType<typeof handleInstantMeeting>>>> {
const clientIdHeader = req.get(X_CAL_CLIENT_ID);
const oAuthClientId = clientIdHeader?.toString();
const oAuthClientId = clientId?.toString();
req.userId = (await this.getOwnerId(req)) ?? -1;
try {
const instantMeeting = await handleInstantMeeting(
@@ -333,7 +333,7 @@ export class BookingsController_2024_04_15 {
}
private async getOAuthClientsParams(clientId: string): Promise<OAuthRequestParams> {
const res = DEFAULT_PLATFORM_PARAMS;
const res = { ...DEFAULT_PLATFORM_PARAMS };
try {
const client = await this.oAuthClientRepository.getOAuthClient(clientId);
// fetch oAuthClient from db and use data stored in db to set these values
@@ -56,12 +56,7 @@ type DatabaseBooking = Booking & {
type BookingWithUser = Booking & { user: { id: number; name: string | null; email: string } | null };
const bookingUserMetadataSchema = bookingMetadataSchema.transform((data) => {
if (data === null) return {};
// note(Lauris): return only user defined metadata
const { videoCallUrl, ...rest } = data;
return rest;
});
type DatabaseMetadata = z.infer<typeof bookingMetadataSchema>;
const seatedBookingMetadataSchema = z.object({}).catchall(z.string());
@@ -73,9 +68,9 @@ export class OutputBookingsService_2024_08_13 {
const dateStart = DateTime.fromISO(databaseBooking.startTime.toISOString());
const dateEnd = DateTime.fromISO(databaseBooking.endTime.toISOString());
const duration = dateEnd.diff(dateStart, "minutes").minutes;
const bookingResponses = bookingResponsesSchema.parse(databaseBooking.responses);
const metadata = bookingUserMetadataSchema.parse(databaseBooking.metadata);
const metadata = bookingMetadataSchema.parse(databaseBooking.metadata);
const location = metadata?.videoCallUrl || databaseBooking.location;
const booking = {
id: databaseBooking.id,
@@ -101,9 +96,9 @@ export class OutputBookingsService_2024_08_13 {
absent: !!attendee.noShow,
})),
guests: bookingResponses.guests,
location: databaseBooking.location,
location,
// note(Lauris): meetingUrl is deprecated
meetingUrl: databaseBooking.location,
meetingUrl: location,
absentHost: !!databaseBooking.noShowHost,
createdAt: databaseBooking.createdAt,
};
@@ -111,10 +106,18 @@ export class OutputBookingsService_2024_08_13 {
const bookingTransformed = plainToClass(BookingOutput_2024_08_13, booking, { strategy: "excludeAll" });
// note(Lauris): I don't know why plainToClass erases bookings responses and metadata so attaching manually
bookingTransformed.bookingFieldsResponses = bookingResponses;
bookingTransformed.metadata = metadata;
bookingTransformed.metadata = this.getUserDefinedMetadata(metadata);
return bookingTransformed;
}
getUserDefinedMetadata(databaseMetadata: DatabaseMetadata) {
if (databaseMetadata === null) return {};
const { videoCallUrl, ...userDefinedMetadata } = databaseMetadata;
return userDefinedMetadata;
}
async getOutputRecurringBookings(bookingsIds: number[]) {
const transformed = [];
@@ -134,9 +137,9 @@ export class OutputBookingsService_2024_08_13 {
const dateStart = DateTime.fromISO(databaseBooking.startTime.toISOString());
const dateEnd = DateTime.fromISO(databaseBooking.endTime.toISOString());
const duration = dateEnd.diff(dateStart, "minutes").minutes;
const bookingResponses = bookingResponsesSchema.parse(databaseBooking.responses);
const metadata = bookingUserMetadataSchema.parse(databaseBooking.metadata);
const metadata = bookingMetadataSchema.parse(databaseBooking.metadata);
const location = metadata?.videoCallUrl || databaseBooking.location;
const booking = {
id: databaseBooking.id,
@@ -162,9 +165,9 @@ export class OutputBookingsService_2024_08_13 {
absent: !!attendee.noShow,
})),
guests: bookingResponses.guests,
location: databaseBooking.location,
location,
// note(Lauris): meetingUrl is deprecated
meetingUrl: databaseBooking.location,
meetingUrl: location,
recurringBookingUid: databaseBooking.recurringEventId,
absentHost: !!databaseBooking.noShowHost,
bookingFieldsResponses: databaseBooking.responses,
@@ -176,7 +179,7 @@ export class OutputBookingsService_2024_08_13 {
});
// note(Lauris): I don't know why plainToClass erases bookings responses and metadata so attaching manually
bookingTransformed.bookingFieldsResponses = bookingResponses;
bookingTransformed.metadata = metadata;
bookingTransformed.metadata = this.getUserDefinedMetadata(metadata);
return bookingTransformed;
}
@@ -192,6 +195,8 @@ export class OutputBookingsService_2024_08_13 {
const dateStart = DateTime.fromISO(databaseBooking.startTime.toISOString());
const dateEnd = DateTime.fromISO(databaseBooking.endTime.toISOString());
const duration = dateEnd.diff(dateStart, "minutes").minutes;
const metadata = bookingMetadataSchema.parse(databaseBooking.metadata);
const location = metadata?.videoCallUrl || databaseBooking.location;
const booking = {
id: databaseBooking.id,
@@ -208,9 +213,9 @@ export class OutputBookingsService_2024_08_13 {
// note(Lauris): eventTypeId is deprecated
eventTypeId: databaseBooking.eventTypeId,
attendees: [],
location: databaseBooking.location,
location,
// note(Lauris): meetingUrl is deprecated
meetingUrl: databaseBooking.location,
meetingUrl: location,
absentHost: !!databaseBooking.noShowHost,
createdAt: databaseBooking.createdAt,
};
@@ -285,6 +290,8 @@ export class OutputBookingsService_2024_08_13 {
const dateStart = DateTime.fromISO(databaseBooking.startTime.toISOString());
const dateEnd = DateTime.fromISO(databaseBooking.endTime.toISOString());
const duration = dateEnd.diff(dateStart, "minutes").minutes;
const metadata = bookingMetadataSchema.parse(databaseBooking.metadata);
const location = metadata?.videoCallUrl || databaseBooking.location;
const booking = {
id: databaseBooking.id,
@@ -302,9 +309,9 @@ export class OutputBookingsService_2024_08_13 {
// note(Lauris): eventTypeId is deprecated
eventTypeId: databaseBooking.eventTypeId,
attendees: [],
location: databaseBooking.location,
location,
// note(Lauris): meetingUrl is deprecated
meetingUrl: databaseBooking.location,
meetingUrl: location,
recurringBookingUid: databaseBooking.recurringEventId,
absentHost: !!databaseBooking.noShowHost,
createdAt: databaseBooking.createdAt,
+3 -17
View File
@@ -1,6 +1,6 @@
import { WinstonTransport as AxiomTransport } from "@axiomhq/winston";
import type { LoggerOptions } from "winston";
import { format, transports as Transports } from "winston";
import { format, transports as Transports, config } from "winston";
import type Transport from "winston-transport";
const formattedTimestamp = format.timestamp({
@@ -8,14 +8,7 @@ const formattedTimestamp = format.timestamp({
});
const colorizer = format.colorize({
colors: {
fatal: "red",
error: "red",
warn: "yellow",
info: "blue",
debug: "white",
trace: "grey",
},
colors: config.npm.colors,
});
const WINSTON_DEV_FORMAT = format.combine(
@@ -26,14 +19,7 @@ const WINSTON_DEV_FORMAT = format.combine(
);
const WINSTON_PROD_FORMAT = format.combine(format.errors({ stack: true }), formattedTimestamp, format.json());
export const logLevels = {
fatal: 0,
error: 1,
warn: 2,
info: 3,
debug: 4,
trace: 5,
} as const;
export const logLevels = config.npm.levels;
export const loggerConfig = (): LoggerOptions => {
const isProduction = process.env.NODE_ENV === "production";
+8 -8
View File
@@ -56,7 +56,7 @@ export class CustomThrottlerGuard extends ThrottlerGuard {
const request = context.switchToHttp().getRequest<Request>();
const response = context.switchToHttp().getResponse<Response>();
const tracker = await this.getTracker(request);
this.logger.log(
this.logger.verbose(
`Tracker "${tracker}" generated based on: Bearer token "${request.get(
"Authorization"
)}", OAuth client ID "${request.get(X_CAL_CLIENT_ID)}" and IP "${request.ip}"`
@@ -89,7 +89,7 @@ export class CustomThrottlerGuard extends ThrottlerGuard {
private async handleNonApiKeyRequest(tracker: string, response: Response): Promise<boolean> {
const rateLimit = this.getDefaultRateLimit(tracker);
this.logger.log(`Tracker "${tracker}" uses default rate limits because it is not tracking api key:
this.logger.verbose(`Tracker "${tracker}" uses default rate limits because it is not tracking api key:
${JSON.stringify(rateLimit, null, 2)}
`);
@@ -135,7 +135,7 @@ export class CustomThrottlerGuard extends ThrottlerGuard {
const cachedRateLimits = await this.storageService.redis.get(cacheKey);
if (cachedRateLimits) {
this.logger.log(`Tracker "${tracker}" rate limits retrieved from redis cache:
this.logger.verbose(`Tracker "${tracker}" rate limits retrieved from redis cache:
${cachedRateLimits}
`);
return rateLimitsSchema.parse(JSON.parse(cachedRateLimits));
@@ -158,13 +158,13 @@ export class CustomThrottlerGuard extends ThrottlerGuard {
});
if (rateLimits) {
this.logger.log(`Tracker "${tracker}" rate limits retrieved from database:
this.logger.verbose(`Tracker "${tracker}" rate limits retrieved from database:
${JSON.stringify(rateLimits, null, 2)}`);
}
if (!rateLimits || rateLimits.length === 0) {
rateLimits = [this.getDefaultRateLimit(tracker)];
this.logger.log(`Tracker "${tracker}" rate limits not found in database. Using default rate limits:
this.logger.verbose(`Tracker "${tracker}" rate limits not found in database. Using default rate limits:
${JSON.stringify(rateLimits, null, 2)}`);
}
@@ -194,10 +194,10 @@ export class CustomThrottlerGuard extends ThrottlerGuard {
);
response.setHeader(`X-RateLimit-Reset-${nameFirstUpper}`, timeToBlockExpire || timeToExpire);
this.logger.log(
this.logger.verbose(
`Tracker "${tracker}" rate limit "${name}" incremented. isBlocked ${isBlocked}, totalHits ${totalHits}, timeToExpire ${timeToExpire}, timeToBlockExpire ${timeToBlockExpire}`
);
this.logger.log(
this.logger.verbose(
`Tracker "${tracker}" rate limit "${name}" response headers:
X-RateLimit-Limit-${nameFirstUpper}: ${limit},
X-RateLimit-Remaining-${nameFirstUpper}: ${timeToBlockExpire ? 0 : Math.max(0, limit - totalHits)},
@@ -227,7 +227,7 @@ export class CustomThrottlerGuard extends ThrottlerGuard {
return `ip_${request.ip}`;
}
this.logger.log(`no tracker found: ${request.url}`);
this.logger.verbose(`no tracker found: ${request.url}`);
return "unknown";
}
}
@@ -16,6 +16,7 @@ import { Test } from "@nestjs/testing";
import { PlatformOAuthClient, Team, User, EventType } from "@prisma/client";
import * as request from "supertest";
import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture";
import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.repository.fixture";
import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture";
import { ProfileRepositoryFixture } from "test/fixtures/repository/profiles.repository.fixture";
import { SchedulesRepositoryFixture } from "test/fixtures/repository/schedules.repository.fixture";
@@ -79,6 +80,7 @@ describe("OAuth Client Users Endpoints", () => {
let eventTypesRepositoryFixture: EventTypesRepositoryFixture;
let schedulesRepositoryFixture: SchedulesRepositoryFixture;
let profilesRepositoryFixture: ProfileRepositoryFixture;
let membershipsRepositoryFixture: MembershipRepositoryFixture;
let postResponseData: CreateManagedUserOutput["data"];
@@ -103,26 +105,33 @@ describe("OAuth Client Users Endpoints", () => {
eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef);
schedulesRepositoryFixture = new SchedulesRepositoryFixture(moduleRef);
profilesRepositoryFixture = new ProfileRepositoryFixture(moduleRef);
membershipsRepositoryFixture = new MembershipRepositoryFixture(moduleRef);
platformAdmin = await userRepositoryFixture.create({ email: platformAdminEmail });
organization = await teamRepositoryFixture.create({ name: "organization" });
organization = await teamRepositoryFixture.create({
name: "organization",
isPlatform: true,
isOrganization: true,
});
oAuthClient = await createOAuthClient(organization.id);
await profilesRepositoryFixture.create({
uid: "asd-asd",
uid: "asd1qwwqeqw-asddsadasd",
username: platformAdminEmail,
organization: { connect: { id: organization.id } },
movedFromUser: {
connect: {
id: platformAdmin.id,
},
},
user: {
connect: { id: platformAdmin.id },
},
});
await membershipsRepositoryFixture.create({
role: "OWNER",
user: { connect: { id: platformAdmin.id } },
team: { connect: { id: organization.id } },
accepted: true,
});
await app.init();
});
@@ -370,7 +379,7 @@ describe("OAuth Client Users Endpoints", () => {
let teamRepositoryFixture: TeamRepositoryFixture;
let eventTypesRepositoryFixture: EventTypesRepositoryFixture;
let profileRepositoryFixture: ProfileRepositoryFixture;
let membershipsRepositoryFixture: MembershipRepositoryFixture;
let postResponseData: CreateManagedUserOutput["data"];
const userEmail = "oauth-client-users-user@gmail.com";
@@ -390,10 +399,11 @@ describe("OAuth Client Users Endpoints", () => {
teamRepositoryFixture = new TeamRepositoryFixture(moduleRef);
eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef);
profileRepositoryFixture = new ProfileRepositoryFixture(moduleRef);
membershipsRepositoryFixture = new MembershipRepositoryFixture(moduleRef);
organization = await teamRepositoryFixture.create({
name: "Testy Organization",
isOrganization: true,
isPlatform: true,
});
owner = await userRepositoryFixture.create({
@@ -417,6 +427,13 @@ describe("OAuth Client Users Endpoints", () => {
},
});
await membershipsRepositoryFixture.create({
role: "OWNER",
user: { connect: { id: owner.id } },
team: { connect: { id: organization.id } },
accepted: true,
});
oAuthClient1 = await createOAuthClient(organization.id);
oAuthClient2 = await createOAuthClient(organization.id);
@@ -1,6 +1,8 @@
import { API_VERSIONS_VALUES } from "@/lib/api-versions";
import { Locales } from "@/lib/enums/locales";
import { MembershipRoles } from "@/modules/auth/decorators/roles/membership-roles.decorator";
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
import { OrganizationRolesGuard } from "@/modules/auth/guards/organization-roles/organization-roles.guard";
import { CreateManagedUserOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/create-managed-user.output";
import { GetManagedUserOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/get-managed-user.output";
import { GetManagedUsersOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/get-managed-users.output";
@@ -29,7 +31,7 @@ import {
NotFoundException,
} from "@nestjs/common";
import { ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger";
import { User } from "@prisma/client";
import { User, MembershipRole } from "@prisma/client";
import { SUCCESS_STATUS } from "@calcom/platform-constants";
import { Pagination } from "@calcom/platform-types";
@@ -38,7 +40,7 @@ import { Pagination } from "@calcom/platform-types";
path: "/v2/oauth-clients/:clientId/users",
version: API_VERSIONS_VALUES,
})
@UseGuards(ApiAuthGuard, OAuthClientGuard)
@UseGuards(ApiAuthGuard, OAuthClientGuard, OrganizationRolesGuard)
@DocsTags("Platform / Managed Users")
export class OAuthClientUsersController {
private readonly logger = new Logger("UserController");
@@ -52,6 +54,7 @@ export class OAuthClientUsersController {
@Get("/")
@ApiOperation({ summary: "Get all managed users" })
@MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER])
async getManagedUsers(
@Param("clientId") oAuthClientId: string,
@Query() queryParams: Pagination
@@ -73,6 +76,7 @@ export class OAuthClientUsersController {
@Post("/")
@ApiOperation({ summary: "Create a managed user" })
@MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER])
async createUser(
@Param("clientId") oAuthClientId: string,
@Body() body: CreateManagedUserInput
@@ -104,6 +108,7 @@ export class OAuthClientUsersController {
@Get("/:userId")
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: "Get a managed user" })
@MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER])
async getUserById(
@Param("clientId") clientId: string,
@Param("userId") userId: number
@@ -119,6 +124,7 @@ export class OAuthClientUsersController {
@Patch("/:userId")
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: "Update a managed user" })
@MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER])
async updateUser(
@Param("clientId") clientId: string,
@Param("userId") userId: number,
@@ -138,6 +144,7 @@ export class OAuthClientUsersController {
@Delete("/:userId")
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: "Delete a managed user" })
@MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER])
async deleteUser(
@Param("clientId") clientId: string,
@Param("userId") userId: number
@@ -156,6 +163,7 @@ export class OAuthClientUsersController {
@Post("/:userId/force-refresh")
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: "Force refresh tokens" })
@MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER])
async forceRefresh(
@Param("userId") userId: number,
@Param("clientId") oAuthClientId: string
-1
View File
@@ -8,7 +8,6 @@ import { FUTURE_ROUTES_ENABLED_COOKIE_NAME, FUTURE_ROUTES_OVERRIDE_COOKIE_NAME }
const ROUTES: [URLPattern, boolean][] = [
["/event-types", process.env.APP_ROUTER_EVENT_TYPES_ENABLED === "1"] as const,
["/settings/developer/:path*", process.env.APP_ROUTER_SETTINGS_DEVELOPER_ENABLED === "1"] as const,
["/settings/organizations/:path*", process.env.APP_ROUTER_SETTINGS_ORG_ENABLED === "1"] as const,
["/apps/installed/:category", process.env.APP_ROUTER_APPS_INSTALLED_CATEGORY_ENABLED === "1"] as const,
["/apps/:slug", process.env.APP_ROUTER_APPS_SLUG_ENABLED === "1"] as const,
["/apps/:slug/setup", process.env.APP_ROUTER_APPS_SLUG_SETUP_ENABLED === "1"] as const,
@@ -1,11 +0,0 @@
import { _generateMetadata } from "app/_utils";
import Page from "@calcom/ee/organizations/pages/settings/attributes/attributes-edit-view";
export const generateMetadata = async () =>
await _generateMetadata(
() => "Attribute",
(t) => t("edit_attribute_description")
);
export default Page;
@@ -1,11 +0,0 @@
import { _generateMetadata } from "app/_utils";
import Page from "@calcom/ee/organizations/pages/settings/attributes/attributes-create-view";
export const generateMetadata = async () =>
await _generateMetadata(
() => "Attribute",
() => "Create an attribute for your team members"
);
export default Page;
@@ -1,11 +0,0 @@
import { _generateMetadata } from "app/_utils";
import Page from "@calcom/ee/organizations/pages/settings/attributes/attributes-list-view";
export const generateMetadata = async () =>
await _generateMetadata(
(t) => t("attributes"),
(t) => t("attribute_meta_description")
);
export default Page;
@@ -1,5 +0,0 @@
import BillingPage, { generateMetadata } from "../../billing/page";
export { generateMetadata };
export default BillingPage;
@@ -1,11 +1,8 @@
import { _generateMetadata } from "app/_utils";
import { getFixedT } from "app/_utils";
import { ConferencingAppsViewWebWrapper } from "@calcom/atoms/monorepo";
import { getServerSessionForAppDir } from "@calcom/feature-auth/lib/get-server-session-for-app-dir";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
import { Button } from "@calcom/ui";
import ConferencingView from "~/settings/my-account/conferencing-view";
export const generateMetadata = async () =>
await _generateMetadata(
@@ -17,22 +14,12 @@ const Page = async () => {
const session = await getServerSessionForAppDir();
const t = await getFixedT(session?.user.locale || "en");
const AddConferencingButton = () => {
return (
<Button color="secondary" StartIcon="plus" href="/apps/categories/conferencing">
{t("add")}
</Button>
);
};
return (
<SettingsHeader
<ConferencingAppsViewWebWrapper
title={t("conferencing")}
description={t("conferencing_description")}
CTA={<AddConferencingButton />}
borderInShellHeader={true}>
<ConferencingView />
</SettingsHeader>
add={t("add")}
/>
);
};
@@ -0,0 +1,24 @@
import { _generateMetadata, getFixedT } from "app/_utils";
import OrgAttributesEditPage from "@calcom/ee/organizations/pages/settings/attributes/attributes-edit-view";
import { getServerSessionForAppDir } from "@calcom/features/auth/lib/get-server-session-for-app-dir";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
export const generateMetadata = async () =>
await _generateMetadata(
(t) => t("attribute"),
(t) => t("edit_attribute_description")
);
const Page = async () => {
const session = await getServerSessionForAppDir();
const t = await getFixedT(session?.user.locale || "en");
return (
<SettingsHeader title={t("attribute")} description={t("edit_attribute_description")}>
<OrgAttributesEditPage />
</SettingsHeader>
);
};
export default Page;
@@ -0,0 +1,24 @@
import { _generateMetadata, getFixedT } from "app/_utils";
import OrgAttributesCreatePage from "@calcom/ee/organizations/pages/settings/attributes/attributes-create-view";
import { getServerSessionForAppDir } from "@calcom/features/auth/lib/get-server-session-for-app-dir";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
export const generateMetadata = async () =>
await _generateMetadata(
(t) => t("attribute"),
(t) => t("create_attribute_description")
);
const Page = async () => {
const session = await getServerSessionForAppDir();
const t = await getFixedT(session?.user.locale || "en");
return (
<SettingsHeader title={t("attribute")} description={t("create_attribute_description")}>
<OrgAttributesCreatePage />
</SettingsHeader>
);
};
export default Page;
@@ -0,0 +1,24 @@
import { _generateMetadata, getFixedT } from "app/_utils";
import OrgSettingsAttributesPage from "@calcom/ee/organizations/pages/settings/attributes/attributes-list-view";
import { getServerSessionForAppDir } from "@calcom/features/auth/lib/get-server-session-for-app-dir";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
export const generateMetadata = async () =>
await _generateMetadata(
(t) => t("attributes"),
(t) => t("attribute_meta_description")
);
const Page = async () => {
const session = await getServerSessionForAppDir();
const t = await getFixedT(session?.user.locale || "en");
return (
<SettingsHeader title={t("attributes")} description={t("attribute_meta_description")}>
<OrgSettingsAttributesPage />
</SettingsHeader>
);
};
export default Page;
@@ -0,0 +1,5 @@
import BillingPage, { generateMetadata } from "app/future/settings/(settings)/billing/page";
export { generateMetadata };
export default BillingPage;
@@ -16,7 +16,7 @@ const Page = async () => {
return (
<SettingsHeader title={t("general")} description={t("general_description")} borderInShellHeader={true}>
<LegacyPage isAppDir={true} />
<LegacyPage />
</SettingsHeader>
);
};
@@ -19,7 +19,7 @@ const Page = async () => {
title={t("profile")}
description={t("profile_org_description")}
borderInShellHeader={true}>
<LegacyPage isAppDir={true} />
<LegacyPage />
</SettingsHeader>
);
};
@@ -15,8 +15,8 @@ const Page = async () => {
const t = await getFixedT(session?.user.locale || "en");
return (
<SettingsHeader title={t("profile")} description={t("profile_org_description")}>
<OrgSSOView isAppDir={true} />
<SettingsHeader title={t("sso_configuration")} description={t("sso_configuration_description_orgs")}>
<OrgSSOView />
</SettingsHeader>
);
};
@@ -1,7 +1,9 @@
import { _generateMetadata, getFixedT } from "app/_utils";
import { getServerSessionForAppDir } from "@calcom/features/auth/lib/get-server-session-for-app-dir";
import LegacyPage from "@calcom/features/ee/organizations/pages/settings/other-team-members-view";
import LegacyPage, {
TeamMembersCTA,
} from "@calcom/features/ee/organizations/pages/settings/other-team-members-view";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
export const generateMetadata = async () =>
@@ -15,9 +17,11 @@ const Page = async () => {
const t = await getFixedT(session?.user.locale || "en");
return (
// TODO: Add CTA Button
<SettingsHeader title={t("team_members")} description={t("members_team_description")}>
<LegacyPage isAppDir={true} />
<SettingsHeader
title={t("team_members")}
description={t("members_team_description")}
CTA={<TeamMembersCTA />}>
<LegacyPage />
</SettingsHeader>
);
};
@@ -16,7 +16,7 @@ const Page = async () => {
return (
<SettingsHeader title={t("profile")} description={t("profile_team_description")}>
<LegacyPage isAppDir={true} />
<LegacyPage />
</SettingsHeader>
);
};
@@ -16,7 +16,7 @@ const Page = async () => {
return (
<SettingsHeader title={t("org_admin_other_teams")} description={t("org_admin_other_teams_description")}>
<LegacyPage isAppDir={true} />
<LegacyPage />
</SettingsHeader>
);
};
@@ -1,8 +1,10 @@
import { _generateMetadata, getFixedT } from "app/_utils";
import { WithLayout } from "app/layoutHOC";
import { getServerSessionForAppDir } from "@calcom/features/auth/lib/get-server-session-for-app-dir";
import LegacyPage from "@calcom/features/ee/organizations/pages/settings/members";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
import SettingsLayoutAppDir from "@calcom/features/settings/appDir/SettingsLayoutAppDir";
export const generateMetadata = async () =>
await _generateMetadata(
@@ -16,9 +18,12 @@ const Page = async () => {
return (
<SettingsHeader title={t("organization_members")} description={t("organization_description")}>
<LegacyPage isAppDir={true} />
<LegacyPage />
</SettingsHeader>
);
};
export default Page;
const getLayout = async (page: React.ReactElement) =>
await SettingsLayoutAppDir({ children: page, containerClassName: "lg:max-w-screen-2xl" });
export default WithLayout({ ServerPage: Page, getServerLayout: getLayout })<"P">;
@@ -0,0 +1,14 @@
import { _generateMetadata } from "app/_utils";
import { WithLayout } from "app/layoutHOC";
import PlatformMembersView from "@calcom/features/ee/platform/pages/settings/members";
export const generateMetadata = async () =>
await _generateMetadata(
(t) => t("platform_members"),
(t) => t("platform_members_description")
);
export default WithLayout({
Page: PlatformMembersView,
});
@@ -7,6 +7,7 @@ import {
SelectedCalendarsSettingsWebWrapper,
DestinationCalendarSettingsWebWrapper,
} from "@calcom/atoms/monorepo";
import AppListCard from "@calcom/features/apps/components/AppListCard";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { trpc } from "@calcom/trpc/react";
import {
@@ -21,7 +22,6 @@ import {
import { QueryCell } from "@lib/QueryCell";
import useRouterQuery from "@lib/hooks/useRouterQuery";
import AppListCard from "@components/AppListCard";
import SubHeadingTitleWithConnections from "@components/integrations/SubHeadingTitleWithConnections";
type Props = {
@@ -3,19 +3,28 @@
import { useReducer } from "react";
import getAppCategoryTitle from "@calcom/app-store/_utils/getAppCategoryTitle";
import type { UpdateDefaultConferencingAppParams } from "@calcom/features/apps/components/AppList";
import { AppList } from "@calcom/features/apps/components/AppList";
import DisconnectIntegrationModal from "@calcom/features/apps/components/DisconnectIntegrationModal";
import type { RemoveAppParams } from "@calcom/features/apps/components/DisconnectIntegrationModal";
import type { BulkUpdatParams } from "@calcom/features/eventtypes/components/BulkEditDefaultForEventsModal";
import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { AppCategories } from "@calcom/prisma/enums";
import { trpc } from "@calcom/trpc/react";
import type { inferSSRProps } from "@calcom/types/inferSSRProps";
import type { Icon } from "@calcom/ui";
import { AppSkeletonLoader as SkeletonLoader, Button, EmptyScreen, ShellSubHeading } from "@calcom/ui";
import {
AppSkeletonLoader as SkeletonLoader,
Button,
EmptyScreen,
ShellSubHeading,
showToast,
} from "@calcom/ui";
import { QueryCell } from "@lib/QueryCell";
import type { querySchemaType, getServerSideProps } from "@lib/apps/installed/[category]/getServerSideProps";
import { AppList } from "@components/apps/AppList";
import { CalendarListContainer } from "@components/apps/CalendarListContainer";
import InstalledAppsLayout from "@components/apps/layouts/InstalledAppsLayout";
@@ -31,6 +40,7 @@ const IntegrationsContainer = ({
handleDisconnect,
}: IntegrationsContainerProps): JSX.Element => {
const { t } = useLocale();
const utils = trpc.useUtils();
const query = trpc.viewer.integrations.useQuery({
variant,
exclude,
@@ -38,6 +48,42 @@ const IntegrationsContainer = ({
includeTeamInstalledApps: true,
});
const { data: defaultConferencingApp } = trpc.viewer.getUsersDefaultConferencingApp.useQuery();
const updateDefaultAppMutation = trpc.viewer.updateUserDefaultConferencingApp.useMutation();
const updateLocationsMutation = trpc.viewer.eventTypes.bulkUpdateToDefaultLocation.useMutation();
const handleUpdateDefaultConferencingApp = ({ appSlug, callback }: UpdateDefaultConferencingAppParams) => {
updateDefaultAppMutation.mutate(
{ appSlug },
{
onSuccess: () => {
showToast("Default app updated successfully", "success");
utils.viewer.getUsersDefaultConferencingApp.invalidate();
callback();
},
onError: (error) => {
showToast(`Error: ${error.message}`, "error");
},
}
);
};
const handleBulkUpdateDefaultLocation = ({ eventTypeIds, callback }: BulkUpdatParams) => {
updateLocationsMutation.mutate(
{
eventTypeIds,
},
{
onSuccess: () => {
utils.viewer.getUsersDefaultConferencingApp.invalidate();
callback();
},
}
);
};
// TODO: Refactor and reuse getAppCategories?
const emptyIcon: Record<AppCategories, React.ComponentProps<typeof Icon>["name"]> = {
calendar: "calendar",
@@ -95,7 +141,15 @@ const IntegrationsContainer = ({
}
/>
<AppList handleDisconnect={handleDisconnect} data={data} variant={variant} />
<AppList
handleDisconnect={handleDisconnect}
data={data}
variant={variant}
defaultConferencingApp={defaultConferencingApp}
handleUpdateDefaultConferencingApp={handleUpdateDefaultConferencingApp}
handleBulkUpdateDefaultLocation={handleBulkUpdateDefaultLocation}
isBulkUpdateDefaultLocationPending={updateDefaultAppMutation.isPending}
/>
</div>
);
}}
@@ -114,6 +168,7 @@ export type PageProps = inferSSRProps<typeof getServerSideProps>;
export default function InstalledApps(props: PageProps) {
const searchParams = useCompatSearchParams();
const { t } = useLocale();
const utils = trpc.useUtils();
const category = searchParams?.get("category") as querySchemaType["category"];
const categoryList: AppCategories[] = Object.values(AppCategories).filter((category) => {
// Exclude calendar and other from categoryList, we handle those slightly differently below
@@ -136,6 +191,26 @@ export default function InstalledApps(props: PageProps) {
updateData({ isOpen: true, credentialId, teamId });
};
const deleteCredentialMutation = trpc.viewer.deleteCredential.useMutation();
const handleRemoveApp = ({ credentialId, teamId, callback }: RemoveAppParams) => {
deleteCredentialMutation.mutate(
{ id: credentialId, teamId },
{
onSuccess: () => {
showToast(t("app_removed_successfully"), "success");
callback();
utils.viewer.integrations.invalidate();
utils.viewer.connectedCalendars.invalidate();
},
onError: () => {
showToast(t("error_removing_app"), "error");
callback();
},
}
);
};
return (
<>
<InstalledAppsLayout heading={t("installed_apps")} subtitle={t("manage_your_connected_apps")}>
@@ -156,6 +231,7 @@ export default function InstalledApps(props: PageProps) {
isOpen={data.isOpen}
credentialId={data.credentialId}
teamId={data.teamId}
handleRemoveApp={handleRemoveApp}
/>
</>
);
@@ -4,6 +4,7 @@ import { useRouter } from "next/navigation";
import { useState } from "react";
import { AvailabilitySettings } from "@calcom/atoms/monorepo";
import type { BulkUpdatParams } from "@calcom/features/eventtypes/components/BulkEditDefaultForEventsModal";
import { withErrorFromUnknown } from "@calcom/lib/getClientErrorFromUnknown";
import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams";
import { useLocale } from "@calcom/lib/hooks/useLocale";
@@ -47,13 +48,22 @@ export const AvailabilitySettingsWebWrapper = ({
const [isBulkUpdateModalOpen, setIsBulkUpdateModalOpen] = useState(false);
const bulkUpdateDefaultAvailabilityMutation =
trpc.viewer.availability.schedule.bulkUpdateToDefaultAvailability.useMutation({
onSuccess: () => {
utils.viewer.availability.list.invalidate();
setIsBulkUpdateModalOpen(false);
showToast(t("success"), "success");
trpc.viewer.availability.schedule.bulkUpdateToDefaultAvailability.useMutation();
const bulkUpdateFunction = ({ eventTypeIds, callback }: BulkUpdatParams) => {
bulkUpdateDefaultAvailabilityMutation.mutate(
{
eventTypeIds,
},
});
{
onSuccess: () => {
utils.viewer.availability.list.invalidate();
callback();
showToast(t("success"), "success");
},
}
);
};
const isDefaultSchedule = me.data?.defaultScheduleId === scheduleId;
@@ -130,7 +140,7 @@ export const AvailabilitySettingsWebWrapper = ({
bulkUpdateModalProps={{
isOpen: isBulkUpdateModalOpen,
setIsOpen: setIsBulkUpdateModalOpen,
save: bulkUpdateDefaultAvailabilityMutation.mutate,
save: bulkUpdateFunction,
isSaving: bulkUpdateDefaultAvailabilityMutation.isPending,
}}
/>
@@ -7,6 +7,7 @@ import { useCallback, useState } from "react";
import SkeletonLoader from "@calcom/features/availability/components/SkeletonLoader";
import { BulkEditDefaultForEventsModal } from "@calcom/features/eventtypes/components/BulkEditDefaultForEventsModal";
import type { BulkUpdatParams } from "@calcom/features/eventtypes/components/BulkEditDefaultForEventsModal";
import { NewScheduleButton, ScheduleListItem } from "@calcom/features/schedules";
import Shell from "@calcom/features/shell/Shell";
import { AvailabilitySliderTable } from "@calcom/features/timezone-buddy/components/AvailabilitySliderTable";
@@ -80,13 +81,22 @@ export function AvailabilityList({ schedules }: RouterOutputs["viewer"]["availab
});
const bulkUpdateDefaultAvailabilityMutation =
trpc.viewer.availability.schedule.bulkUpdateToDefaultAvailability.useMutation({
onSuccess: () => {
utils.viewer.availability.list.invalidate();
setBulkUpdateModal(false);
showToast(t("success"), "success");
trpc.viewer.availability.schedule.bulkUpdateToDefaultAvailability.useMutation();
const bulkUpdateFunction = ({ eventTypeIds, callback }: BulkUpdatParams) => {
bulkUpdateDefaultAvailabilityMutation.mutate(
{
eventTypeIds,
},
});
{
onSuccess: () => {
utils.viewer.availability.list.invalidate();
showToast(t("success"), "success");
callback();
},
}
);
};
const duplicateMutation = trpc.viewer.availability.schedule.duplicate.useMutation({
onSuccess: async ({ schedule }) => {
@@ -149,7 +159,7 @@ export function AvailabilityList({ schedules }: RouterOutputs["viewer"]["availab
isPending={bulkUpdateDefaultAvailabilityMutation.isPending}
open={bulkUpdateModal}
setOpen={setBulkUpdateModal}
bulkUpdateFunction={bulkUpdateDefaultAvailabilityMutation.mutate}
bulkUpdateFunction={bulkUpdateFunction}
description={t("default_schedules_bulk_description")}
/>
)}
@@ -1,100 +0,0 @@
"use client";
import { useReducer } from "react";
import DisconnectIntegrationModal from "@calcom/features/apps/components/DisconnectIntegrationModal";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { trpc } from "@calcom/trpc/react";
import { Button, EmptyScreen, SkeletonContainer, SkeletonText } from "@calcom/ui";
import { QueryCell } from "@lib/QueryCell";
import { AppList } from "@components/apps/AppList";
const SkeletonLoader = () => {
return (
<SkeletonContainer>
<div className="divide-subtle border-subtle space-y-6 rounded-b-lg border border-t-0 px-6 py-4">
<SkeletonText className="h-8 w-full" />
<SkeletonText className="h-8 w-full" />
</div>
</SkeletonContainer>
);
};
type ModalState = {
isOpen: boolean;
credentialId: null | number;
};
const ConferencingView = () => {
const { t } = useLocale();
const [modal, updateModal] = useReducer(
(data: ModalState, partialData: Partial<ModalState>) => ({ ...data, ...partialData }),
{
isOpen: false,
credentialId: null,
}
);
const query = trpc.viewer.integrations.useQuery({
variant: "conferencing",
onlyInstalled: true,
});
const handleModelClose = () => {
updateModal({ isOpen: false, credentialId: null });
};
const handleDisconnect = (credentialId: number) => {
updateModal({ isOpen: true, credentialId });
};
return (
<>
<div className="bg-default w-full sm:mx-0 xl:mt-0">
<QueryCell
query={query}
customLoader={<SkeletonLoader />}
success={({ data }) => {
if (!data.items.length) {
return (
<EmptyScreen
Icon="calendar"
headline={t("no_category_apps", {
category: t("conferencing").toLowerCase(),
})}
description={t("no_category_apps_description_conferencing")}
buttonRaw={
<Button
color="secondary"
data-testid="connect-conferencing-apps"
href="/apps/categories/conferencing">
{t("connect_conference_apps")}
</Button>
}
/>
);
}
return (
<AppList
listClassName="rounded-lg rounded-t-none border-t-0 max-w-full"
handleDisconnect={handleDisconnect}
data={data}
variant="conferencing"
/>
);
}}
/>
</div>
<DisconnectIntegrationModal
handleModelClose={handleModelClose}
isOpen={modal.isOpen}
credentialId={modal.credentialId}
/>
</>
);
};
export default ConferencingView;
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@calcom/web",
"version": "4.7.10",
"version": "4.7.12",
"private": true,
"scripts": {
"analyze": "ANALYZE=true next build",
@@ -64,7 +64,7 @@
"@radix-ui/react-switch": "^1.0.0",
"@radix-ui/react-toggle-group": "^1.0.0",
"@radix-ui/react-tooltip": "^1.0.0",
"@replexica/sdk": "^0.6.0",
"@replexica/sdk": "^0.7.0",
"@sentry/nextjs": "^8.8.0",
"@stripe/react-stripe-js": "^1.10.0",
"@stripe/stripe-js": "^1.35.0",
@@ -1,23 +0,0 @@
import { getServerSideProps } from "@calcom/features/ee/organizations/pages/organization";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Meta } from "@calcom/ui";
import PageWrapper from "@components/PageWrapper";
import AboutOrganizationForm, { LayoutWrapper } from "~/settings/organizations/[id]/about-view";
const Page = () => {
const { t } = useLocale();
return (
<>
<Meta title={t("about_your_organization")} description={t("about_your_organization_description")} />
<AboutOrganizationForm />
</>
);
};
Page.getLayout = LayoutWrapper;
Page.PageWrapper = PageWrapper;
export default Page;
export { getServerSideProps };
@@ -1,24 +0,0 @@
import { getServerSideProps } from "@calcom/features/ee/organizations/pages/organization";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Meta } from "@calcom/ui";
import PageWrapper from "@components/PageWrapper";
import AddNewTeamsForm, { LayoutWrapper } from "~/settings/organizations/[id]/add-teams-view";
const Page = () => {
const { t } = useLocale();
return (
<>
<Meta title={t("create_your_teams")} description={t("create_your_teams_description")} />
<AddNewTeamsForm />
</>
);
};
Page.getLayout = LayoutWrapper;
Page.PageWrapper = PageWrapper;
export default Page;
export { getServerSideProps };
@@ -1,27 +0,0 @@
import { getServerSideProps } from "@calcom/features/ee/organizations/pages/organization";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Meta } from "@calcom/ui";
import PageWrapper from "@components/PageWrapper";
import OrgAddNewTeamMembers, { LayoutWrapper } from "~/settings/organizations/[id]/onboard-members-view";
const Page = () => {
const { t } = useLocale();
return (
<>
<Meta
title={t("invite_organization_admins")}
description={t("invite_organization_admins_description")}
/>
<OrgAddNewTeamMembers />
</>
);
};
Page.getLayout = LayoutWrapper;
Page.PageWrapper = PageWrapper;
export default Page;
export { getServerSideProps };
@@ -1,25 +0,0 @@
import AdminAPIView from "@calcom/features/ee/organizations/pages/settings/admin-api";
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";
const Page = () => {
const { t } = useLocale();
return (
<>
<Meta
title={`${t("admin")} ${t("api_reference")}`}
description={t("leverage_our_api")}
borderInShellHeader={false}
/>
<AdminAPIView />
</>
);
};
Page.PageWrapper = PageWrapper;
Page.getLayout = getLayout;
export default Page;
@@ -1,9 +0,0 @@
import OrgAppearanceView from "@calcom/features/ee/organizations/pages/settings/appearance";
import type { CalPageWrapper } from "@components/PageWrapper";
import PageWrapper from "@components/PageWrapper";
const Page = OrgAppearanceView as CalPageWrapper;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,24 +0,0 @@
"use client";
import OrgAttributesEditPage, {
getLayout,
} from "@calcom/ee/organizations/pages/settings/attributes/attributes-edit-view";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Meta } from "@calcom/ui";
import PageWrapper from "@components/PageWrapper";
const Page = () => {
const { t } = useLocale();
return (
<>
<Meta title="Attribute" description={t("edit_attribute_description")} />
<OrgAttributesEditPage />
</>
);
};
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,20 +0,0 @@
import OrgAttributesCreatePage, {
getLayout,
} from "@calcom/ee/organizations/pages/settings/attributes/attributes-create-view";
import { Meta } from "@calcom/ui";
import PageWrapper from "@components/PageWrapper";
const Page = () => {
return (
<>
<Meta title="Attribute" description="Create an attribute for your team members" />
<OrgAttributesCreatePage />
</>
);
};
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,21 +0,0 @@
import OrgSettingsAttributesPage, {
getLayout,
} from "@calcom/ee/organizations/pages/settings/attributes/attributes-list-view";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Meta } from "@calcom/ui";
import PageWrapper from "@components/PageWrapper";
const Page = () => {
const { t } = useLocale();
return (
<>
<Meta title={t("attributes")} description={t("attribute_meta_description")} />
<OrgSettingsAttributesPage />
</>
);
};
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,3 +0,0 @@
import BillingPage from "../../settings/billing/index";
export default BillingPage;
@@ -1,22 +0,0 @@
"use client";
import DirectorySyncTeamView from "@calcom/features/ee/dsync/page/team-dsync-view";
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";
const Page = () => {
const { t } = useLocale();
return (
<>
<Meta title={t("directory_sync")} description={t("directory_sync_description")} />
<DirectorySyncTeamView />
</>
);
};
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,11 +0,0 @@
import OrgGeneralView from "@calcom/features/ee/organizations/pages/settings/general";
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
import PageWrapper from "@components/PageWrapper";
const Page = () => <OrgGeneralView />;
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,20 +0,0 @@
import MembersView from "@calcom/features/ee/organizations/pages/settings/members";
import SettingsLayout from "@calcom/features/settings/layouts/SettingsLayout";
import PageWrapper from "@components/PageWrapper";
export {
getServerSidePropsForMembers as getServerSideProps,
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;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,26 +0,0 @@
import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Meta } from "@calcom/ui";
import { getServerSideProps } from "@lib/settings/organizations/new/getServerSideProps";
import PageWrapper from "@components/PageWrapper";
import CreateANewOrganizationForm, { LayoutWrapper } from "~/settings/organizations/new/create-new-view";
const Page = () => {
const { t } = useLocale();
return (
<LicenseRequired>
<Meta title={t("set_up_your_organization")} description={t("organizations_description")} />
<CreateANewOrganizationForm />
</LicenseRequired>
);
};
Page.getLayout = LayoutWrapper;
Page.PageWrapper = PageWrapper;
export default Page;
export { getServerSideProps };
@@ -1,27 +0,0 @@
"use client";
import PrivacyView from "@calcom/features/ee/organizations/pages/settings/privacy";
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";
const Page = () => {
const { t } = useLocale();
return (
<>
<Meta
borderInShellHeader={false}
title={t("privacy")}
description={t("privacy_organization_description")}
/>
<PrivacyView />
</>
);
};
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,11 +0,0 @@
import OrgProfileView from "@calcom/features/ee/organizations/pages/settings/profile";
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
import PageWrapper from "@components/PageWrapper";
const Page = () => <OrgProfileView />;
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,11 +0,0 @@
import OrgSSOView from "@calcom/features/ee/sso/page/orgs-sso-view";
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
import PageWrapper from "@components/PageWrapper";
const Page = () => <OrgSSOView />;
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,11 +0,0 @@
import TeamAppearenceView from "@calcom/features/ee/teams/pages/team-appearance-view";
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
import PageWrapper from "@components/PageWrapper";
const Page = () => <TeamAppearenceView />;
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,11 +0,0 @@
import TeamMembersView from "@calcom/features/ee/organizations/pages/settings/other-team-members-view";
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
import PageWrapper from "@components/PageWrapper";
const Page = () => <TeamMembersView />;
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,11 +0,0 @@
import OtherTeamProfileView from "@calcom/features/ee/organizations/pages/settings/other-team-profile-view";
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
import PageWrapper from "@components/PageWrapper";
const Page = () => <OtherTeamProfileView />;
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,11 +0,0 @@
import OtherTeamListView from "@calcom/features/ee/organizations/pages/settings/other-team-listing-view";
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
import PageWrapper from "@components/PageWrapper";
const Page = () => <OtherTeamListView />;
Page.getLayout = getLayout;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -1,9 +0,0 @@
import PlatformMembersView from "@calcom/features/ee/platform/pages/settings/members";
import PageWrapper from "@components/PageWrapper";
const Page = () => <PlatformMembersView />;
Page.PageWrapper = PageWrapper;
export default Page;
@@ -64,7 +64,7 @@ test.describe("Embed Code Generator Tests", () => {
await page.waitForTimeout(1000);
await expectToContainValidPreviewIframe(page, {
embedType: "inline",
calLink: `${pro.username}/30-min`,
calLink: `${pro.username}/multiple-duration`,
});
});
@@ -102,7 +102,7 @@ test.describe("Embed Code Generator Tests", () => {
await page.waitForTimeout(1000);
await expectToContainValidPreviewIframe(page, {
embedType: "floating-popup",
calLink: `${pro.username}/30-min`,
calLink: `${pro.username}/multiple-duration`,
});
});
@@ -140,7 +140,7 @@ test.describe("Embed Code Generator Tests", () => {
await page.waitForTimeout(1000);
await expectToContainValidPreviewIframe(page, {
embedType: "element-click",
calLink: `${pro.username}/30-min`,
calLink: `${pro.username}/multiple-duration`,
});
});
});
@@ -238,7 +238,7 @@ test.describe("Embed Code Generator Tests", () => {
await page.waitForTimeout(1000);
await expectToContainValidPreviewIframe(page, {
embedType: "inline",
calLink: `${user.username}/30-min`,
calLink: `${user.username}/multiple-duration`,
bookerUrl: getOrgFullOrigin(org?.slug ?? ""),
});
});
@@ -279,7 +279,7 @@ test.describe("Embed Code Generator Tests", () => {
await page.waitForTimeout(1000);
await expectToContainValidPreviewIframe(page, {
embedType: "floating-popup",
calLink: `${user.username}/30-min`,
calLink: `${user.username}/multiple-duration`,
bookerUrl: getOrgFullOrigin(org?.slug ?? ""),
});
});
@@ -319,7 +319,7 @@ test.describe("Embed Code Generator Tests", () => {
await page.waitForTimeout(1000);
await expectToContainValidPreviewIframe(page, {
embedType: "element-click",
calLink: `${user.username}/30-min`,
calLink: `${user.username}/multiple-duration`,
bookerUrl: getOrgFullOrigin(org?.slug ?? ""),
});
});
+10
View File
@@ -61,6 +61,16 @@ testBothFutureAndLegacyRoutes.describe("Event Types tests", () => {
await expect(page.locator(`text='${eventTitle}'`)).toBeVisible();
});
test("new event type appears first in the list", async ({ page }) => {
const nonce = randomString(3);
const eventTitle = `hello ${nonce}`;
await createNewEventType(page, { eventTitle });
await page.goto("/event-types");
const firstEvent = page.locator("[data-testid=event-types] > li a").first();
const firstEventTitle = await firstEvent.getAttribute("title");
await expect(firstEventTitle).toBe(eventTitle);
});
test("enabling recurring event comes with default options", async ({ page }) => {
const nonce = randomString(3);
const eventTitle = `my recurring event ${nonce}`;
+7 -1
View File
@@ -2,9 +2,15 @@ import { expect } from "@playwright/test";
import { test } from "./lib/fixtures";
test("Icons render properly", async ({ page }, testInfo) => {
// Set a consistent viewport size across all environments
test.use({
viewport: { width: 1265, height: 1320 }, // Match the expected dimensions
});
test("Icons render properly", async ({ page }) => {
await page.goto("/icons");
await expect(page).toHaveScreenshot("icons.png", {
maxDiffPixelRatio: 0.05,
fullPage: true,
});
});
Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 KiB

After

Width:  |  Height:  |  Size: 298 KiB

+112 -1
View File
@@ -197,10 +197,121 @@ test.describe("Out of office", () => {
await expect(page.getByTestId("away-emoji")).toBeTruthy();
});
test("User can create Entry for past", async ({ page, users }) => {
const user = await users.create({ name: "userOne" });
await user.apiLogin();
await page.goto("/settings/my-account/out-of-office");
await page.getByTestId("add_entry_ooo").click();
await page.locator('[id="date"]').click();
await selectToAndFromDates(page, "13", "22", true);
// send request
await saveAndWaitForResponse(page);
const ooo = await prisma.outOfOfficeEntry.findMany({
where: {
userId: user.id,
},
orderBy: {
createdAt: "desc",
},
select: {
start: true,
end: true,
},
take: 1,
});
const latestEntry = ooo[0];
const currentDate = dayjs();
const fromDate = dayjs(latestEntry.start);
const toDate = dayjs(latestEntry.end);
expect(toDate.isBefore(currentDate)).toBe(true);
expect(fromDate.isBefore(currentDate)).toBe(true);
});
test("User can create overriding entries", async ({ page, users }) => {
const user = await users.create({ name: "userOne" });
await user.apiLogin();
await page.goto("/settings/my-account/out-of-office");
await page.getByTestId("add_entry_ooo").click();
await page.locator('[id="date"]').click();
await selectToAndFromDates(page, "13", "22");
// send request
await saveAndWaitForResponse(page);
await expect(page.locator(`data-testid=table-redirect-n-a`)).toBeVisible();
// add another entry
await page.getByTestId("add_entry_ooo").click();
await page.locator('[id="date"]').click();
await selectToAndFromDates(page, "11", "24");
// send request
await saveAndWaitForResponse(page);
await expect(page.locator(`data-testid=table-redirect-n-a`)).toHaveCount(2);
});
test("User cannot create duplicate entries", async ({ page, users }) => {
const user = await users.create({ name: "userOne" });
await user.apiLogin();
await page.goto("/settings/my-account/out-of-office");
await page.getByTestId("add_entry_ooo").click();
await page.locator('[id="date"]').click();
await selectToAndFromDates(page, "13", "22");
// send request
await saveAndWaitForResponse(page);
await expect(page.locator(`data-testid=table-redirect-n-a`)).toBeVisible();
// add another entry
await page.getByTestId("add_entry_ooo").click();
await page.locator('[id="date"]').click();
await selectToAndFromDates(page, "13", "22");
// send request
await saveAndWaitForResponse(page, 409);
});
});
async function saveAndWaitForResponse(page: Page) {
async function saveAndWaitForResponse(page: Page, expectedStatusCode = 200) {
await submitAndWaitForResponse(page, "/api/trpc/viewer/outOfOfficeCreateOrUpdate?batch=1", {
action: () => page.getByTestId("create-or-edit-entry-ooo-redirect").click(),
expectedStatusCode,
});
}
async function selectToAndFromDates(page: Page, fromDate: string, toDate: string, isRangeInPast = false) {
// deselects by default selected range start day
await page.locator(`button[name="day"].rdp-day_range_start`).click();
const month = isRangeInPast ? "previous" : "next";
await page.locator(`button[name="${month}-month"]`).click();
await page.locator(`button[name="day"]:has-text("${fromDate}")`).nth(0).click();
await page.locator(`button[name="day"]:has-text("${toDate}")`).nth(0).click();
}
+5
View File
@@ -596,6 +596,11 @@
<path d="m16 6-4 4-4-4" ></path>
<path d="M16 18a4 4 0 0 0-8 0" ></path>
</symbol>
<symbol class="lucide lucide-tags" viewBox="0 0 24 24" fill="inherit" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" id="tags">
<path d="m15 5 6.3 6.3a2.4 2.4 0 0 1 0 3.4L17 19" ></path>
<path d="M9.586 5.586A2 2 0 0 0 8.172 5H3a1 1 0 0 0-1 1v5.172a2 2 0 0 0 .586 1.414L8.29 18.29a2.426 2.426 0 0 0 3.42 0l3.58-3.58a2.426 2.426 0 0 0 0-3.42z" ></path>
<circle cx="6.5" cy="9.5" r=".5" fill="currentColor" ></circle>
</symbol>
<symbol class="lucide lucide-terminal" viewBox="0 0 24 24" fill="inherit" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" id="terminal">
<polyline points="4 17 10 11 4 5" ></polyline>
<line x1="12" x2="20" y1="19" y2="19" ></line>

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

@@ -130,7 +130,9 @@
"download_your_transcripts": "تحميل تسجيلاتك",
"your_meeting_has_been_booked": "لقد تم حجز الاجتماع الخاص بك",
"event_type_has_been_rescheduled_on_time_date": "تم إعادة جدولة {{title}} إلى {{date}}.",
"event_type_has_been_updated": "تم تحديث {{title}} الخاص بك.",
"event_has_been_rescheduled": "تم التحديث - تم إعادة جدولة الحدث الخاص بك",
"event_has_been_updated": "تم تحديث الموعد",
"your_event_has_been_rescheduled": "تمت إعادة جدولة الحدث الخاص بك",
"request_reschedule_subtitle": "ألغى {{organizer}} الحجز وطلب منك اختيار حجز في وقت آخر.",
"request_reschedule_title_organizer": "لقد طلبت من {{attendee}} إعادة جدولة موعد",
@@ -1643,6 +1645,8 @@
"format": "التنسيق",
"uppercase_for_letters": "استخدم الحروف الكبيرة لجميع الأحرف",
"replace_whitespaces_underscores": "استبدل المساحات البيضاء بالشرطات السفلية",
"platform_members": "أعضاء المنصة",
"platform_members_description": "إدارة المسؤولين والأعضاء في فريق منصتك",
"platform_billing": "فوترة المنصة",
"manage_billing": "إدارة الفواتير",
"manage_billing_description": "إدارة كل ما يخص الفواتير",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "أضف سمات لأعضاء فريقك",
"new_option": "خيار جديد",
"update_profile": "تحديث العضو",
"attribute": "السمة",
"create_attribute_description": "إنشاء سمة لأعضاء فريقك",
"edit_attribute_description": "تعديل سمة لأعضاء فريقك",
"attribute_updated_successfully": "تم تحديث السمة بنجاح",
"attribute_deleted_successfully": "تم حذف السمة بنجاح",
"attributes_edited_successfully": "تم تعديل السمات بنجاح",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Transkriptlərinizi yükləyin",
"your_meeting_has_been_booked": "Görüşünüz təyin edilib",
"event_type_has_been_rescheduled_on_time_date": "{{title}} {{date}} tarixinə təxirə salınıb.",
"event_type_has_been_updated": "{{title}} yeniləndi.",
"event_has_been_rescheduled": "Yeniləndi - Tədbiriniz təxirə salınıb",
"event_has_been_updated": "Tədbir yeniləndi",
"your_event_has_been_rescheduled": "Tədbir yenidən planlaşdırıldı",
"request_reschedule_subtitle": "{{organizer}} rezervasiyanı ləğv edib və sizdən başqa bir vaxt seçməyinizi xahiş edir.",
"request_reschedule_title_organizer": "{{attendee}}-dən təxirə salmağı xahiş etdiniz",
@@ -1643,6 +1645,8 @@
"format": "Format",
"uppercase_for_letters": "Bütün hərfləri böyük hərflərlə yaz",
"replace_whitespaces_underscores": "Boşluqları alt xətlərlə əvəz et",
"platform_members": "Platforma üzvləri",
"platform_members_description": "Platforma komandasındakı admin və üzvləri idarə edin",
"platform_billing": "Platforma ödənişi",
"manage_billing": "Ödənişləri idarə et",
"manage_billing_description": "Bütün ödəniş işlərini idarə et",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Komanda üzvlərinizə atributlar əlavə edin",
"new_option": "Yeni seçim",
"update_profile": "Üzvü yenilə",
"attribute": "Atribut",
"create_attribute_description": "Komanda üzvləriniz üçün atribut yaradın",
"edit_attribute_description": "Komanda üzvləriniz üçün atributu redaktə edin",
"attribute_updated_successfully": "Atribut uğurla yeniləndi",
"attribute_deleted_successfully": "Atribut uğurla silindi",
"attributes_edited_successfully": "Atributlar uğurla redaktə edildi",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Изтеглете вашите транскрипти",
"your_meeting_has_been_booked": "Вашата среща е резервирана",
"event_type_has_been_rescheduled_on_time_date": "Вашият {{title}} е пренасрочен за {{date}}.",
"event_type_has_been_updated": "Вашият {{title}} беше актуализиран.",
"event_has_been_rescheduled": "Актуализация - Вашето събитие е пренасрочено",
"event_has_been_updated": "Събитието беше актуализирано",
"your_event_has_been_rescheduled": "Вашето събитие е пренасрочено",
"request_reschedule_subtitle": "{{organizer}} отмени резервацията и поиска да изберете друго време.",
"request_reschedule_title_organizer": "Поискахте {{attendee}} да пренасрочи",
@@ -1643,6 +1645,8 @@
"format": "Формат",
"uppercase_for_letters": "Използвайте главни букви за всички букви",
"replace_whitespaces_underscores": "Заменете интервалите с долни черти",
"platform_members": "Членове на платформата",
"platform_members_description": "Управлявайте администраторите и членовете във вашия екип на платформата",
"platform_billing": "Таксуване в платформата",
"manage_billing": "Управление на таксуването",
"manage_billing_description": "Управлявайте всичко свързано с таксуването",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Добави атрибути към членовете на екипа",
"new_option": "Нова опция",
"update_profile": "Актуализирай профила",
"attribute": "Атрибут",
"create_attribute_description": "Създайте атрибут за членовете на вашия екип",
"edit_attribute_description": "Редактирайте атрибут за членовете на вашия екип",
"attribute_updated_successfully": "Атрибутът е актуализиран успешно",
"attribute_deleted_successfully": "Атрибутът е изтрит успешно",
"attributes_edited_successfully": "Атрибутите са редактирани успешно",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Descarrega les teves transcripcions",
"your_meeting_has_been_booked": "La teva reunió ha estat reservada",
"event_type_has_been_rescheduled_on_time_date": "El teu {{title}} ha estat reprogramat per al {{date}}.",
"event_type_has_been_updated": "El teu {{title}} s'ha actualitzat.",
"event_has_been_rescheduled": "Actualització - El teu esdeveniment ha estat reprogramat",
"event_has_been_updated": "L'esdeveniment s'ha actualitzat",
"your_event_has_been_rescheduled": "El teu esdeveniment ha estat reprogramat",
"request_reschedule_subtitle": "{{organizer}} ha cancel·lat la reserva i t'ha demanat que triïs un altre moment.",
"request_reschedule_title_organizer": "Has demanat a {{attendee}} que reprogrami",
@@ -1643,6 +1645,8 @@
"format": "Format",
"uppercase_for_letters": "Utilitza majúscules per a totes les lletres",
"replace_whitespaces_underscores": "Substitueix els espais en blanc per guions baixos",
"platform_members": "Membres de la plataforma",
"platform_members_description": "Gestiona els administradors i membres del teu equip de plataforma",
"platform_billing": "Facturació de la plataforma",
"manage_billing": "Gestionar la facturació",
"manage_billing_description": "Gestiona tot el relacionat amb la facturació",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Afegeix atributs als membres del teu equip",
"new_option": "Nova opció",
"update_profile": "Actualitzar membre",
"attribute": "Atribut",
"create_attribute_description": "Crea un atribut per als membres del teu equip",
"edit_attribute_description": "Edita un atribut per als membres del teu equip",
"attribute_updated_successfully": "Atribut actualitzat correctament",
"attribute_deleted_successfully": "Atribut eliminat correctament",
"attributes_edited_successfully": "Atributs editats correctament",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Stáhněte si své přepisy",
"your_meeting_has_been_booked": "Vaše schůzka byla rezervována",
"event_type_has_been_rescheduled_on_time_date": "Váš {{title}} byl přeplánován na {{date}}.",
"event_type_has_been_updated": "Váš {{title}} byl aktualizován.",
"event_has_been_rescheduled": "Změna - Vaše událost byla přesunuta na jindy",
"event_has_been_updated": "Událost byla aktualizována",
"your_event_has_been_rescheduled": "Vaše událost byla přeplánována",
"request_reschedule_subtitle": "{{organizer}} zrušil rezervaci a požádal vás, abyste si vybrali jiný termín.",
"request_reschedule_title_organizer": "Požádali jste uživatele {{attendee}} o změnu časového plánu",
@@ -1643,6 +1645,8 @@
"format": "Formát",
"uppercase_for_letters": "Použít velká písmena pro všechna písmena",
"replace_whitespaces_underscores": "Nahradit mezery podtržítky",
"platform_members": "Členové platformy",
"platform_members_description": "Spravujte administrátory a členy vašeho platformního týmu",
"platform_billing": "Fakturace platformy",
"manage_billing": "Spravovat fakturaci",
"manage_billing_description": "Spravovat vše ohledně fakturace",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Přidejte atributy členům svého týmu",
"new_option": "Nová možnost",
"update_profile": "Aktualizovat člena",
"attribute": "Atribut",
"create_attribute_description": "Vytvořit atribut pro členy vašeho týmu",
"edit_attribute_description": "Upravit atribut pro členy vašeho týmu",
"attribute_updated_successfully": "Atribut úspěšně aktualizován",
"attribute_deleted_successfully": "Atribut byl úspěšně smazán",
"attributes_edited_successfully": "Atributy úspěšně upraveny",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Download dine transskriptioner",
"your_meeting_has_been_booked": "Dit møde er blevet booket",
"event_type_has_been_rescheduled_on_time_date": "Din {{title}} er blevet flyttet til {{date}}.",
"event_type_has_been_updated": "Din {{title}} er blevet opdateret.",
"event_has_been_rescheduled": "Opdateret - Din begivenhed er blevet flyttet",
"event_has_been_updated": "Begivenheden er blevet opdateret",
"your_event_has_been_rescheduled": "Din begivenhed er blevet omplanlagt",
"request_reschedule_subtitle": "{{organizer}} har aflyst bookingen og bedt dig vælge et andet tidspunkt.",
"request_reschedule_title_organizer": "Du har anmodet {{attendee}} om at omlægge",
@@ -1643,6 +1645,8 @@
"format": "Formatér",
"uppercase_for_letters": "Brug store bogstaver for alle bogstaver",
"replace_whitespaces_underscores": "Erstat blanke tegn med understregninger",
"platform_members": "Platformmedlemmer",
"platform_members_description": "Administrer administratorer og medlemmer i dit platformteam",
"platform_billing": "Platformsfakturering",
"manage_billing": "Håndtér fakturering",
"manage_billing_description": "Håndtér alt omkring fakturering",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Tilføj egenskaber til dine teammedlemmer",
"new_option": "Ny mulighed",
"update_profile": "Opdater medlem",
"attribute": "Attribut",
"create_attribute_description": "Opret et attribut for dine teammedlemmer",
"edit_attribute_description": "Rediger et attribut for dine teammedlemmer",
"attribute_updated_successfully": "Egenskab opdateret med succes",
"attribute_deleted_successfully": "Attribut slettet med succes",
"attributes_edited_successfully": "Egenskaber redigeret med succes",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Ihre Transkripte herunterladen",
"your_meeting_has_been_booked": "Ihr Termin wurde gebucht",
"event_type_has_been_rescheduled_on_time_date": "Ihr {{title}} wurde auf den {{date}} verschoben.",
"event_type_has_been_updated": "Dein {{title}} wurde aktualisiert.",
"event_has_been_rescheduled": "Ihr Termin wurde verschoben.",
"event_has_been_updated": "Termin wurde aktualisiert",
"your_event_has_been_rescheduled": "Ihr Termin wurde umgeplant",
"request_reschedule_subtitle": "{{organizer}} hat den Termin abgesagt und Sie gebeten, eine andere Zeit auszuwählen.",
"request_reschedule_title_organizer": "Sie haben {{attendee}} zur Neuplanung aufgefordert",
@@ -1643,6 +1645,8 @@
"format": "Format",
"uppercase_for_letters": "Großbuchstaben für alle Buchstaben verwenden",
"replace_whitespaces_underscores": "Leerzeichen durch Unterstriche ersetzen",
"platform_members": "Plattform-Mitglieder",
"platform_members_description": "Verwalten Sie die Administratoren und Mitglieder in Ihrem Plattform-Team",
"platform_billing": "Plattform-Abrechnung",
"manage_billing": "Abrechnung verwalten",
"manage_billing_description": "Alles zur Abrechnung verwalten",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Fügen Sie Ihren Teammitgliedern Attribute hinzu",
"new_option": "Neue Option",
"update_profile": "Mitglied aktualisieren",
"attribute": "Attribut",
"create_attribute_description": "Erstelle ein Attribut für deine Teammitglieder",
"edit_attribute_description": "Bearbeite ein Attribut für deine Teammitglieder",
"attribute_updated_successfully": "Attribut erfolgreich aktualisiert",
"attribute_deleted_successfully": "Attribut erfolgreich gelöscht",
"attributes_edited_successfully": "Attribute erfolgreich bearbeitet",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Κατεβάστε τις απομαγνητοφωνήσεις σας",
"your_meeting_has_been_booked": "Η συνάντησή σας έχει κλειστεί",
"event_type_has_been_rescheduled_on_time_date": "Το {{title}} σας έχει επαναπρογραμματιστεί για τις {{date}}.",
"event_type_has_been_updated": "Το {{title}} ενημερώθηκε.",
"event_has_been_rescheduled": "Ενημέρωση - Το συμβάν σας έχει επαναπρογραμματιστεί",
"event_has_been_updated": "Το συμβάν ενημερώθηκε",
"your_event_has_been_rescheduled": "Το συμβάν σας έχει επαναπρογραμματιστεί",
"request_reschedule_subtitle": "Ο/Η {{organizer}} ακύρωσε την κράτηση και ζήτησε να επιλέξετε άλλη ώρα.",
"request_reschedule_title_organizer": "Ζητήσατε από τον/την {{attendee}} να επαναπρογραμματίσει",
@@ -1643,6 +1645,8 @@
"format": "Μορφή",
"uppercase_for_letters": "Χρησιμοποιήστε κεφαλαία για όλα τα γράμματα",
"replace_whitespaces_underscores": "Αντικαταστήστε τα κενά με κάτω παύλες",
"platform_members": "Μέλη πλατφόρμας",
"platform_members_description": "Διαχειριστείτε τους διαχειριστές και τα μέλη στην ομάδα της πλατφόρμας σας",
"platform_billing": "Τιμολόγηση πλατφόρμας",
"manage_billing": "Διαχείριση τιμολόγησης",
"manage_billing_description": "Διαχειριστείτε όλα τα θέματα τιμολόγησης",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Προσθέστε χαρακτηριστικά στα μέλη της ομάδας σας",
"new_option": "Νέα επιλογή",
"update_profile": "Ενημέρωση μέλους",
"attribute": "Χαρακτηριστικό",
"create_attribute_description": "Δημιουργήστε ένα χαρακτηριστικό για τα μέλη της ομάδας σας",
"edit_attribute_description": "Επεξεργαστείτε ένα χαρακτηριστικό για τα μέλη της ομάδας σας",
"attribute_updated_successfully": "Το χαρακτηριστικό ενημερώθηκε με επιτυχία",
"attribute_deleted_successfully": "Το χαρακτηριστικό διαγράφηκε με επιτυχία",
"attributes_edited_successfully": "Τα χαρακτηριστικά τροποποιήθηκαν με επιτυχία",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Download your Transcripts",
"your_meeting_has_been_booked": "Your meeting has been booked",
"event_type_has_been_rescheduled_on_time_date": "Your {{title}} has been rescheduled to {{date}}.",
"event_type_has_been_updated": "Your {{title}} has been updated.",
"event_has_been_rescheduled": "Updated - Your event has been rescheduled",
"event_has_been_updated": "Event has been updated",
"your_event_has_been_rescheduled": "Your event has been rescheduled",
"request_reschedule_subtitle": "{{organizer}} has canceled the booking and requested you to pick another time.",
"request_reschedule_title_organizer": "You have requested {{attendee}} to reschedule",
@@ -1643,6 +1645,8 @@
"format": "Format",
"uppercase_for_letters": "Use uppercase for all letters",
"replace_whitespaces_underscores": "Replace whitespaces with underscores",
"platform_members": "Platform members",
"platform_members_description": "Manage the admins and members in your platform team",
"platform_billing": "Platform billing",
"manage_billing": "Manage billing",
"manage_billing_description": "Manage all things billing",
@@ -2642,6 +2646,9 @@
"add_attributes_description": "Add attributes to your team members",
"new_option": "New option",
"update_profile": "Update member",
"attribute": "Attribute",
"create_attribute_description": "Create an attribute for your team members",
"edit_attribute_description": "Edit an attribute for your team members",
"attribute_updated_successfully": "Attribute updated successfully",
"attribute_deleted_successfully": "Attribute deleted successfully",
"attributes_edited_successfully": "Attributes edited successfully",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Descarga tus transcripciones",
"your_meeting_has_been_booked": "Tu reunión ha sido reservada",
"event_type_has_been_rescheduled_on_time_date": "Tu {{title}} ha sido reprogramado para {{date}}.",
"event_type_has_been_updated": "Tu {{title}} ha sido actualizado.",
"event_has_been_rescheduled": "Actualización - Tu evento ha sido reprogramado",
"event_has_been_updated": "El evento ha sido actualizado",
"your_event_has_been_rescheduled": "Tu evento ha sido reprogramado",
"request_reschedule_subtitle": "{{organizer}} ha cancelado la reserva y te ha solicitado elegir otro horario.",
"request_reschedule_title_organizer": "Has solicitado a {{attendee}} reprogramar",
@@ -1643,6 +1645,8 @@
"format": "Formato",
"uppercase_for_letters": "Usa mayúsculas para todas las letras",
"replace_whitespaces_underscores": "Reemplaza los espacios en blanco con guiones bajos",
"platform_members": "Miembros de la plataforma",
"platform_members_description": "Administra los administradores y miembros en tu equipo de plataforma",
"platform_billing": "Facturación de la plataforma",
"manage_billing": "Gestionar facturación",
"manage_billing_description": "Gestiona todo lo relacionado con la facturación",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Agregar atributos a los miembros de su equipo",
"new_option": "Nueva opción",
"update_profile": "Actualizar miembro",
"attribute": "Atributo",
"create_attribute_description": "Crear un atributo para los miembros de tu equipo",
"edit_attribute_description": "Editar un atributo para los miembros de tu equipo",
"attribute_updated_successfully": "Atributo actualizado con éxito",
"attribute_deleted_successfully": "Atributo eliminado exitosamente",
"attributes_edited_successfully": "Atributos editados con éxito",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Descarga tus Transcripciones",
"your_meeting_has_been_booked": "Su reunión ha sido reservada",
"event_type_has_been_rescheduled_on_time_date": "Tu {{title}} ha sido reprogramado para el {{date}}.",
"event_type_has_been_updated": "Tu {{title}} ha sido actualizado.",
"event_has_been_rescheduled": "Tu evento ha sido reprogramado.",
"event_has_been_updated": "El evento ha sido actualizado",
"your_event_has_been_rescheduled": "Tu evento ha sido reprogramado",
"request_reschedule_subtitle": "{{organizer}} ha cancelado la reserva y le ha solicitado que elija otra hora.",
"request_reschedule_title_organizer": "Le ha solicitado a {{attendee}} que reprograme",
@@ -1643,6 +1645,8 @@
"format": "Formato",
"uppercase_for_letters": "Use mayúsculas para todas las letras",
"replace_whitespaces_underscores": "Reemplace espacios en blanco con guiones bajos",
"platform_members": "Miembros de la plataforma",
"platform_members_description": "Gestiona los administradores y miembros en tu equipo de plataforma",
"platform_billing": "Facturación de la plataforma",
"manage_billing": "Gestione la facturación",
"manage_billing_description": "Gestione todo lo relacionado con la facturación",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Añadir atributos a los miembros de tu equipo",
"new_option": "Nueva opción",
"update_profile": "Actualizar miembro",
"attribute": "Atributo",
"create_attribute_description": "Crear un atributo para los miembros de tu equipo",
"edit_attribute_description": "Editar un atributo para los miembros de tu equipo",
"attribute_updated_successfully": "Atributo actualizado con éxito",
"attribute_deleted_successfully": "Atributo eliminado con éxito",
"attributes_edited_successfully": "Atributos editados con éxito",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Laadi alla oma ärakirjad",
"your_meeting_has_been_booked": "Teie koosolek on broneeritud",
"event_type_has_been_rescheduled_on_time_date": "Teie {{title}} on ümber ajastatud kuupäevaks {{date}}.",
"event_type_has_been_updated": "Sinu {{title}} on uuendatud.",
"event_has_been_rescheduled": "Värskendatud – teie üritus on ümber ajastatud",
"event_has_been_updated": "Sündmus on uuendatud",
"your_event_has_been_rescheduled": "Teie sündmus on ümber planeeritud",
"request_reschedule_subtitle": "{{organizer}} tühistas broneeringu ja palus teil valida teise aja.",
"request_reschedule_title_organizer": "Olete taotlenud {{osaleja}} ajastamise muutmist",
@@ -1643,6 +1645,8 @@
"format": "Formaat",
"uppercase_for_letters": "Kasuta kõigi tähtede jaoks suurtähti",
"replace_whitespaces_underscores": "Asenda tühikud alakriipsudega",
"platform_members": "Platvormi liikmed",
"platform_members_description": "Halda oma platvormi meeskonna administraatoreid ja liikmeid",
"platform_billing": "Platvormi arveldus",
"manage_billing": "Arvelduse haldamine",
"manage_billing_description": "Hallake kõike arveldust",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Lisa atribuute oma meeskonnaliikmetele",
"new_option": "Uus valik",
"update_profile": "Uuenda liiget",
"attribute": "Atribuut",
"create_attribute_description": "Loo oma meeskonnaliikmetele atribuut",
"edit_attribute_description": "Muuda oma meeskonnaliikmete atribuuti",
"attribute_updated_successfully": "Atribuut edukalt uuendatud",
"attribute_deleted_successfully": "Atribuut on edukalt kustutatud",
"attributes_edited_successfully": "Atribuudid edukalt muudetud",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Deskargatu zure transkripzioak",
"your_meeting_has_been_booked": "Zure bileraren erreserba egin da",
"event_type_has_been_rescheduled_on_time_date": "Zure {{title}} getaeraren programazioa aldatu egin da {{date}}(e)ra.",
"event_type_has_been_updated": "Zure {{title}} eguneratu da.",
"event_has_been_rescheduled": "Eguneratuta - Zure gertaeraren programazioa aldatu egin da",
"event_has_been_updated": "Gertaera eguneratu da",
"your_event_has_been_rescheduled": "Zure gertaera berriz programatu da",
"request_reschedule_subtitle": "{{organizer}}(e)k erreserba bertan behera utzi du eta beste denbora-tarte bat hautatzeko eskatu dizu.",
"request_reschedule_title_organizer": "Beste denbora-tarte bat hautatzeko eskatu diozu {{attendee}}(r)i",
@@ -1643,6 +1645,8 @@
"format": "Formatua",
"uppercase_for_letters": "Letra larriz idatzi letra guztiak",
"replace_whitespaces_underscores": "Ordeztu hutsuneak azpimarra batekin",
"platform_members": "Plataformako kideak",
"platform_members_description": "Kudeatu zure plataformako taldeko administratzaileak eta kideak",
"platform_billing": "Plataformaren fakturazioa",
"manage_billing": "Fakturazioa kudeatu",
"manage_billing_description": "Kudeatu fakturazioari buruzko guztia",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Gehitu atributuak zure taldekideei",
"new_option": "Aukera berria",
"update_profile": "Eguneratu kidea",
"attribute": "Atributua",
"create_attribute_description": "Sortu atributu bat zure taldekideentzat",
"edit_attribute_description": "Editatu zure taldekideen atributua",
"attribute_updated_successfully": "Atributua behar bezala eguneratu da",
"attribute_deleted_successfully": "Atributua behar bezala ezabatu da",
"attributes_edited_successfully": "Atributuak behar bezala editatu dira",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Téléchargez vos transcriptions",
"your_meeting_has_been_booked": "Votre rendez-vous a été réservé",
"event_type_has_been_rescheduled_on_time_date": "Votre {{title}} a été replanifié le {{date}}",
"event_type_has_been_updated": "Votre {{title}} a été mis(e) à jour.",
"event_has_been_rescheduled": "Mise à jour - Votre événement a été replanifié",
"event_has_been_updated": "L'événement a été mis à jour",
"your_event_has_been_rescheduled": "Votre événement a été replanifié",
"request_reschedule_subtitle": "{{organizer}} a annulé la réservation et vous a demandé de choisir un autre moment.",
"request_reschedule_title_organizer": "Vous avez demandé à {{attendee}} de replanifier la réservation",
@@ -1643,6 +1645,8 @@
"format": "Format",
"uppercase_for_letters": "Utilisez des majuscules pour toutes les lettres.",
"replace_whitespaces_underscores": "Remplacez les espaces par des tirets bas.",
"platform_members": "Membres de la plateforme",
"platform_members_description": "Gérez les administrateurs et les membres de votre équipe sur la plateforme",
"platform_billing": "Facturation de la plateforme",
"manage_billing": "Gérer la facturation",
"manage_billing_description": "Gérez tout ce qui est en lien avec la facturation.",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Ajouter des attributs à vos membres d'équipe",
"new_option": "Nouvelle option",
"update_profile": "Mettre à jour le membre",
"attribute": "Attribut",
"create_attribute_description": "Créer un attribut pour les membres de votre équipe",
"edit_attribute_description": "Modifier un attribut pour les membres de votre équipe",
"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",
@@ -130,7 +130,9 @@
"download_your_transcripts": "הורדת התמלולים שלך",
"your_meeting_has_been_booked": "הפגישה שלך הוזמנה",
"event_type_has_been_rescheduled_on_time_date": "{{title}} תוזמן מחדש לתאריך {{date}}.",
"event_type_has_been_updated": "ה-{{title}} עודכן בהצלחה.",
"event_has_been_rescheduled": "עודכן – מועד האירוע שלך השתנה",
"event_has_been_updated": "האירוע עודכן",
"your_event_has_been_rescheduled": "האירוע שלך תוזמן מחדש",
"request_reschedule_subtitle": "{{organizer}} ביטל/ה את ההזמנה וביקש/ה שתבחר/י מועד אחר.",
"request_reschedule_title_organizer": "ביקשת מ{{attendee}} לקבוע מועד חדש",
@@ -1643,6 +1645,8 @@
"format": "פורמט",
"uppercase_for_letters": "שימוש באותיות רישיות עבור כל האותיות",
"replace_whitespaces_underscores": "החלפת רווחים במקפים תחתונים",
"platform_members": "חברי פלטפורמה",
"platform_members_description": "ניהול מנהלים וחברים בצוות הפלטפורמה שלך",
"platform_billing": "חיוב פלטפורמה",
"manage_billing": "ניהול החיוב",
"manage_billing_description": "ניהול כל מה שקשור לחיובים",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "הוסף מאפיינים לחברי הצוות שלך",
"new_option": "אפשרות חדשה",
"update_profile": "עדכן חבר צוות",
"attribute": "מאפיין",
"create_attribute_description": "צור מאפיין עבור חברי הצוות שלך",
"edit_attribute_description": "ערוך מאפיין עבור חברי הצוות שלך",
"attribute_updated_successfully": "המאפיין עודכן בהצלחה",
"attribute_deleted_successfully": "התכונה נמחקה בהצלחה",
"attributes_edited_successfully": "המאפיינים נערכו בהצלחה",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Töltse le az átiratait",
"your_meeting_has_been_booked": "A találkozód le lett foglalva",
"event_type_has_been_rescheduled_on_time_date": "{{title}} át lett ütemezve ekkorra: {{date}}.",
"event_type_has_been_updated": "A(z) {{title}} frissítve lett.",
"event_has_been_rescheduled": "Frissítve - Az időpontod át lett ütemezve",
"event_has_been_updated": "Az esemény frissítve lett",
"your_event_has_been_rescheduled": "Az eseménye átütemezésre került",
"request_reschedule_subtitle": "{{organizer}} lemondta a foglalást és kérte, hogy válassz egy másik időpontot.",
"request_reschedule_title_organizer": "{{attendee}} időpontmódosítást kér",
@@ -1643,6 +1645,8 @@
"format": "Formátum",
"uppercase_for_letters": "Használjon nagybetűt minden betűhöz",
"replace_whitespaces_underscores": "Cserélje ki a szóközöket aláhúzásjelre",
"platform_members": "Platform tagok",
"platform_members_description": "Platform csapatod adminisztrátorainak és tagjainak kezelése",
"platform_billing": "Platform számlázás",
"manage_billing": "Számlázás kezelése",
"manage_billing_description": "Számlázással kapcsolatos teendők",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Attribútumok hozzáadása a csapattagokhoz",
"new_option": "Új opció",
"update_profile": "Tag frissítése",
"attribute": "Attribútum",
"create_attribute_description": "Attribútum létrehozása a csapattagok számára",
"edit_attribute_description": "Csapattagok attribútumának szerkeszté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",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Scarica le trascrizioni",
"your_meeting_has_been_booked": "Il tuo meeting è stata prenotato",
"event_type_has_been_rescheduled_on_time_date": "Il tuo {{title}} è stato riprogrammato per il {{date}}.",
"event_type_has_been_updated": "Il tuo {{title}} è stato aggiornato.",
"event_has_been_rescheduled": "Aggiornato: il tuo evento è stato riprogrammato",
"event_has_been_updated": "L'evento è stato aggiornato",
"your_event_has_been_rescheduled": "Il tuo evento è stato riprogrammato",
"request_reschedule_subtitle": "{{organizer}} ha cancellato la prenotazione e ti ha chiesto di scegliere un altro orario.",
"request_reschedule_title_organizer": "Hai richiesto a {{attendee}} di riprogrammare",
@@ -1643,6 +1645,8 @@
"format": "Formato",
"uppercase_for_letters": "Usa tutte lettere maiuscole",
"replace_whitespaces_underscores": "Sostituisci spazi con sottolineature",
"platform_members": "Membri della piattaforma",
"platform_members_description": "Gestisci gli amministratori e i membri del tuo team della piattaforma",
"platform_billing": "Fatturazione della piattaforma",
"manage_billing": "Gestisci fatturazione",
"manage_billing_description": "Gestisci tutto ciò che riguarda la fatturazione",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Aggiungi attributi ai membri del tuo team",
"new_option": "Nuova opzione",
"update_profile": "Aggiorna membro",
"attribute": "Attributo",
"create_attribute_description": "Crea un attributo per i membri del tuo team",
"edit_attribute_description": "Modifica un attributo per i membri del tuo team",
"attribute_updated_successfully": "Attributo aggiornato con successo",
"attribute_deleted_successfully": "Attributo eliminato con successo",
"attributes_edited_successfully": "Attributi modificati con successo",
@@ -130,7 +130,9 @@
"download_your_transcripts": "トランスクリプトをダウンロード",
"your_meeting_has_been_booked": "ミーティングが予約されました",
"event_type_has_been_rescheduled_on_time_date": "あなたの {{title}} は {{date}} に再スケジュールされました。",
"event_type_has_been_updated": "{{title}}が更新されました。",
"event_has_been_rescheduled": "更新 - イベントのスケジュールが変更されました",
"event_has_been_updated": "イベントが更新されました",
"your_event_has_been_rescheduled": "イベントが再スケジュールされました",
"request_reschedule_subtitle": "{{organizer}} が予約をキャンセルし、別の時間帯を選ぶようにリクエストしています。",
"request_reschedule_title_organizer": "{{attendee}} にスケジュールの変更をリクエストしました",
@@ -1643,6 +1645,8 @@
"format": "書式",
"uppercase_for_letters": "すべての文字に大文字を使用する",
"replace_whitespaces_underscores": "空白をアンダーバー「 _ 」に置き換える",
"platform_members": "プラットフォームメンバー",
"platform_members_description": "プラットフォームチームの管理者とメンバーを管理する",
"platform_billing": "プラットフォーム請求",
"manage_billing": "請求を管理する",
"manage_billing_description": "請求に関するすべての事柄を管理する",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "チームメンバーに属性を追加",
"new_option": "新しいオプション",
"update_profile": "メンバーを更新",
"attribute": "属性",
"create_attribute_description": "チームメンバーの属性を作成する",
"edit_attribute_description": "チームメンバーの属性を編集する",
"attribute_updated_successfully": "属性が正常に更新されました",
"attribute_deleted_successfully": "属性が正常に削除されました",
"attributes_edited_successfully": "属性が正常に編集されました",
@@ -130,7 +130,9 @@
"download_your_transcripts": "ទាញយកសេចក្តីថ្លែងការណ៍របស់អ្នក",
"your_meeting_has_been_booked": "ការប្រជុំរបស់អ្នកត្រូវបានកក់ទុក",
"event_type_has_been_rescheduled_on_time_date": "{{title}} របស់អ្នកត្រូវបានកំណត់ពេលវេលាឡើងវិញ ទៅថ្ងៃ {{date}}.",
"event_type_has_been_updated": "{{title}} របស់អ្នកត្រូវបានធ្វើបច្ចុប្បន្នភាព។",
"event_has_been_rescheduled": "បានធ្វើបច្ចុប្បន្នភាព - ព្រឹត្តិការណ៍របស់អ្នកត្រូវបានកំណត់ពេលឡើងវិញ",
"event_has_been_updated": "ព្រឹត្តិការណ៍ត្រូវបានធ្វើបច្ចុប្បន្នភាព",
"your_event_has_been_rescheduled": "ព្រឹត្តិការណ៍របស់អ្នកត្រូវបានកំណត់ពេលឡើងវិញ",
"request_reschedule_subtitle": "{{organizer}} បានលុបចោលការកក់ ហើយស្នើឱ្យអ្នកជ្រើសរើសពេលផ្សេងទៀត។",
"request_reschedule_title_organizer": "អ្នកបានស្នើសុំ {{attendee}} ដើម្បីរៀបចំកាលវិភាគឡើងវិញ",
@@ -1643,6 +1645,8 @@
"format": "ទ្រង់ទ្រាយ",
"uppercase_for_letters": "ប្រើអក្សរធំសម្រាប់អក្សរទាំងអស់",
"replace_whitespaces_underscores": "ជំនួសចន្លោះទទេដោយសញ្ញាគូសក្រោម",
"platform_members": "សមាជិកវេទិកា",
"platform_members_description": "គ្រប់គ្រងអ្នកគ្រប់គ្រង និងសមាជិកនៅក្នុងក្រុមវេទិការបស់អ្នក",
"platform_billing": "ការគិតថ្លៃវេទិកា",
"manage_billing": "គ្រប់គ្រងវិក្កយបត្រ",
"manage_billing_description": "គ្រប់គ្រងរឿងទាំងអស់ដែលទាក់ទងនឹងវិក្កយបត្រ",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "បន្ថែមគុណលក្ខណៈទៅសមាជិកក្រុមរបស់អ្នក",
"new_option": "ជម្រើសថ្មី",
"update_profile": "ធ្វើបច្ចុប្បន្នភាពសមាជិក",
"attribute": "គុណលក្ខណៈ",
"create_attribute_description": "បង្កើតគុណលក្ខណៈសម្រាប់សមាជិកក្រុមរបស់អ្នក",
"edit_attribute_description": "កែសម្រួលគុណលក្ខណៈសម្រាប់សមាជិកក្រុមរបស់អ្នក",
"attribute_updated_successfully": "គុណលក្ខណៈត្រូវបានធ្វើបច្ចុប្បន្នភាពដោយជោគជ័យ",
"attribute_deleted_successfully": "លក្ខណៈពិសេសត្រូវបានលុបដោយជោគជ័យ",
"attributes_edited_successfully": "គុណលក្ខណៈត្រូវបានកែសម្រួលដោយជោគជ័យ",
@@ -130,7 +130,9 @@
"download_your_transcripts": "대화록 다운로드",
"your_meeting_has_been_booked": "회의가 예약되었습니다.",
"event_type_has_been_rescheduled_on_time_date": "귀하의 {{title}} 일정이 {{date}}로 변경되었습니다.",
"event_type_has_been_updated": "{{title}}이(가) 업데이트되었습니다.",
"event_has_been_rescheduled": "업데이트 - 이벤트 일정이 변경되었습니다.",
"event_has_been_updated": "이벤트가 업데이트되었습니다",
"your_event_has_been_rescheduled": "이벤트가 일정 변경되었습니다",
"request_reschedule_subtitle": "{{organizer}}에서 예약을 취소하고 다른 시간을 선택할 것을 요청했습니다.",
"request_reschedule_title_organizer": "{{attendee}}에게 일정 변경을 요청하셨습니다",
@@ -1643,6 +1645,8 @@
"format": "형식",
"uppercase_for_letters": "모든 문자에 대문자 사용",
"replace_whitespaces_underscores": "공백을 밑줄로 바꾸기",
"platform_members": "플랫폼 멤버",
"platform_members_description": "플랫폼 팀의 관리자와 멤버를 관리하세요",
"platform_billing": "플랫폼 결제",
"manage_billing": "대금청구 관리",
"manage_billing_description": "대금청구의 모든 항목 관리",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "팀원에게 속성을 추가하세요",
"new_option": "새 옵션",
"update_profile": "회원 정보 업데이트",
"attribute": "속성",
"create_attribute_description": "팀원을 위한 속성 생성",
"edit_attribute_description": "팀원을 위한 속성 편집",
"attribute_updated_successfully": "속성이 성공적으로 업데이트되었습니다",
"attribute_deleted_successfully": "속성이 성공적으로 삭제되었습니다",
"attributes_edited_successfully": "속성이 성공적으로 편집되었습니다",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Download je Transcripts",
"your_meeting_has_been_booked": "Uw afspraak is geboekt",
"event_type_has_been_rescheduled_on_time_date": "Uw {{title}} is verplaatst naar {{date}}.",
"event_type_has_been_updated": "Je {{title}} is bijgewerkt.",
"event_has_been_rescheduled": "Bijgewerkt - Uw gebeurtenis is verplaatst",
"event_has_been_updated": "Afspraak is bijgewerkt",
"your_event_has_been_rescheduled": "Je afspraak is verzet",
"request_reschedule_subtitle": "{{organizer}} heeft de boeking geannuleerd en u verzocht een andere tijd te kiezen.",
"request_reschedule_title_organizer": "U heeft {{attendee}} gevraagd om te verplaatsen",
@@ -1643,6 +1645,8 @@
"format": "Formatteren",
"uppercase_for_letters": "Gebruik hoofdletters voor alle letters",
"replace_whitespaces_underscores": "Vervang spaties door onderstrepingstekens",
"platform_members": "Platformleden",
"platform_members_description": "Beheer de beheerders en leden in je platformteam",
"platform_billing": "Platformfacturering",
"manage_billing": "Facturering beheren",
"manage_billing_description": "Alles beheren wat met facturering te maken heeft",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Voeg attributen toe aan je teamleden",
"new_option": "Nieuwe optie",
"update_profile": "Lid bijwerken",
"attribute": "Kenmerk",
"create_attribute_description": "Maak een kenmerk aan voor je teamleden",
"edit_attribute_description": "Bewerk een kenmerk voor je teamleden",
"attribute_updated_successfully": "Attribuut succesvol bijgewerkt",
"attribute_deleted_successfully": "Attribuut succesvol verwijderd",
"attributes_edited_successfully": "Attributen succesvol bewerkt",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Last ned dine transkripsjoner",
"your_meeting_has_been_booked": "Møtet ditt er booket",
"event_type_has_been_rescheduled_on_time_date": "Din {{title}} har blitt flyttet til {{date}}.",
"event_type_has_been_updated": "Din {{title}} har blitt oppdatert.",
"event_has_been_rescheduled": "Oppdatert – Hendelsen din har blitt endret",
"event_has_been_updated": "Avtalen har blitt oppdatert",
"your_event_has_been_rescheduled": "Hendelsen din har blitt omplanlagt",
"request_reschedule_subtitle": "{{organizer}} har kansellert bestillingen og bedt deg velge et annet tidspunkt.",
"request_reschedule_title_organizer": "Du har bedt {{attendee}} om å endre tidspunkt",
@@ -1643,6 +1645,8 @@
"format": "Format",
"uppercase_for_letters": "Bruk store bokstaver for alle bokstaver",
"replace_whitespaces_underscores": "Erstatt mellomrom med understrek",
"platform_members": "Plattformmedlemmer",
"platform_members_description": "Administrer administratorer og medlemmer i plattformteamet ditt",
"platform_billing": "Plattformfakturering",
"manage_billing": "Administrer betaling",
"manage_billing_description": "Administrer alt av betaling",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Legg til egenskaper for teammedlemmene dine",
"new_option": "Nytt alternativ",
"update_profile": "Oppdater medlem",
"attribute": "Attributt",
"create_attribute_description": "Opprett en attributt for teammedlemmene dine",
"edit_attribute_description": "Rediger en attributt for teammedlemmene dine",
"attribute_updated_successfully": "Egenskap oppdatert vellykket",
"attribute_deleted_successfully": "Attributet ble slettet",
"attributes_edited_successfully": "Egenskaper redigert vellykket",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Pobierz swoje transkrypcje",
"your_meeting_has_been_booked": "Twoje spotkanie zostało zarezerwowane",
"event_type_has_been_rescheduled_on_time_date": "Twój {{title}} został przełożony na {{date}}.",
"event_type_has_been_updated": "Twój {{title}} został zaktualizowany.",
"event_has_been_rescheduled": "Zaktualizowano - Twoje wydarzenie zostało przełożone",
"event_has_been_updated": "Wydarzenie zostało zaktualizowane",
"your_event_has_been_rescheduled": "Twoje wydarzenie zostało przełożone",
"request_reschedule_subtitle": "Organizator ({{organizer}}) anulował rezerwację i prosi Cię o wybranie innego terminu.",
"request_reschedule_title_organizer": "{{attendee}} poproszono o zmianę harmonogramu",
@@ -1643,6 +1645,8 @@
"format": "Formatowanie",
"uppercase_for_letters": "Użyj wielkich liter w przypadku wszystkich liter",
"replace_whitespaces_underscores": "Zastąp spacje podkreśleniami",
"platform_members": "Członkowie platformy",
"platform_members_description": "Zarządzaj administratorami i członkami w zespole twojej platformy",
"platform_billing": "Rozliczenia platformy",
"manage_billing": "Zarządzaj płatnościami",
"manage_billing_description": "Zarządzaj wszystkimi kwestiami dotyczącymi płatności",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Dodaj atrybuty do członków zespołu",
"new_option": "Nowa opcja",
"update_profile": "Aktualizuj członka",
"attribute": "Atrybut",
"create_attribute_description": "Utwórz atrybut dla członków swojego zespołu",
"edit_attribute_description": "Edytuj atrybut dla członków swojego zespołu",
"attribute_updated_successfully": "Atrybut zaktualizowany pomyślnie",
"attribute_deleted_successfully": "Atrybut został pomyślnie usunięty",
"attributes_edited_successfully": "Atrybuty edytowane pomyślnie",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Baixe suas transcrições",
"your_meeting_has_been_booked": "A sua reunião foi agendada",
"event_type_has_been_rescheduled_on_time_date": "Seu {{title}} foi remarcado para {{date}}.",
"event_type_has_been_updated": "Seu {{title}} foi atualizado.",
"event_has_been_rescheduled": "Atualização - O seu evento foi reagendado",
"event_has_been_updated": "O evento foi atualizado",
"your_event_has_been_rescheduled": "Seu evento foi reagendado",
"request_reschedule_subtitle": "{{organizer}} cancelou a reserva e solicitou que você escolhesse outro horário.",
"request_reschedule_title_organizer": "Você solicitou que {{attendee}} reagendasse",
@@ -1643,6 +1645,8 @@
"format": "Formato",
"uppercase_for_letters": "Use letras maiúsculas para todas as letras",
"replace_whitespaces_underscores": "Substituir espaços em branco com sublinhados",
"platform_members": "Membros da plataforma",
"platform_members_description": "Gerencie os administradores e membros da sua equipe da plataforma",
"platform_billing": "Faturamento da plataforma",
"manage_billing": "Gerencie o faturamento",
"manage_billing_description": "Gerencie tudo do faturamento",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Adicionar atributos aos membros da sua equipe",
"new_option": "Nova opção",
"update_profile": "Atualizar membro",
"attribute": "Atributo",
"create_attribute_description": "Criar um atributo para os membros da sua equipe",
"edit_attribute_description": "Editar um atributo para os membros da sua equipe",
"attribute_updated_successfully": "Atributo atualizado com sucesso",
"attribute_deleted_successfully": "Atributo excluído com sucesso",
"attributes_edited_successfully": "Atributos editados com sucesso",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Transferir as suas transcrições",
"your_meeting_has_been_booked": "A sua reunião foi reservada",
"event_type_has_been_rescheduled_on_time_date": "Seu {{title}} foi remarcado para {{date}}.",
"event_type_has_been_updated": "Seu {{title}} foi atualizado.",
"event_has_been_rescheduled": "O seu evento foi reagendado.",
"event_has_been_updated": "O evento foi atualizado",
"your_event_has_been_rescheduled": "O seu evento foi reagendado",
"request_reschedule_subtitle": "{{organizer}} cancelou a reserva e pediu que escolhesse outro horário.",
"request_reschedule_title_organizer": "Solicitou um reagendamento a {{attendee}}",
@@ -1643,6 +1645,8 @@
"format": "Formato",
"uppercase_for_letters": "Utilize letras maiúsculas para todas as letras",
"replace_whitespaces_underscores": "Substituir espaços em branco com carateres de sublinhado",
"platform_members": "Membros da plataforma",
"platform_members_description": "Gerencie os administradores e membros da sua equipe da plataforma",
"platform_billing": "Faturação da plataforma",
"manage_billing": "Gerir faturação",
"manage_billing_description": "Gerir tudo o que esteja relacionado com a faturação",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Adicionar atributos aos membros da sua equipa",
"new_option": "Nova opção",
"update_profile": "Atualizar membro",
"attribute": "Atributo",
"create_attribute_description": "Criar um atributo para os membros da sua equipe",
"edit_attribute_description": "Editar um atributo para os membros da sua equipe",
"attribute_updated_successfully": "Atributo atualizado com sucesso",
"attribute_deleted_successfully": "Atributo eliminado com sucesso",
"attributes_edited_successfully": "Atributos editados com sucesso",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Descarcă Transcrierile Tale",
"your_meeting_has_been_booked": "Întâlnirea dvs. a fost programată",
"event_type_has_been_rescheduled_on_time_date": "{{title}} dvs. a fost reprogramat la {{date}}.",
"event_type_has_been_updated": "{{title}} a fost actualizat.",
"event_has_been_rescheduled": "Evenimentul dvs. a fost reprogramat.",
"event_has_been_updated": "Evenimentul a fost actualizat",
"your_event_has_been_rescheduled": "Evenimentul dvs. a fost reprogramat",
"request_reschedule_subtitle": "{{organizer}} a anulat rezervarea și v-a cerut să alegeți o altă dată.",
"request_reschedule_title_organizer": "I-ați cerut lui {{attendee}} să reprogrameze",
@@ -1643,6 +1645,8 @@
"format": "Format",
"uppercase_for_letters": "Utilizați majuscule pentru toate literele",
"replace_whitespaces_underscores": "Înlocuiți spațiile cu caractere de subliniere",
"platform_members": "Membrii platformei",
"platform_members_description": "Gestionează administratorii și membrii din echipa platformei tale",
"platform_billing": "Facturare platformă",
"manage_billing": "Gestionați facturarea",
"manage_billing_description": "Gestionați toate aspectele legate de facturare",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Adăugați atribute membrilor echipei dvs.",
"new_option": "Opțiune nouă",
"update_profile": "Actualizați membrul",
"attribute": "Atribut",
"create_attribute_description": "Creează un atribut pentru membrii echipei tale",
"edit_attribute_description": "Editează un atribut pentru membrii echipei tale",
"attribute_updated_successfully": "Atribut actualizat cu succes",
"attribute_deleted_successfully": "Atributul a fost șters cu succes",
"attributes_edited_successfully": "Atribute editate cu succes",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Скачать ваши стенограммы",
"your_meeting_has_been_booked": "Ваша встреча была забронирована",
"event_type_has_been_rescheduled_on_time_date": "Ваше {{title}} было перенесено на {{date}}.",
"event_type_has_been_updated": "Ваш {{title}} был обновлен.",
"event_has_been_rescheduled": "Ваше событие было перенесено.",
"event_has_been_updated": "Событие обновлено",
"your_event_has_been_rescheduled": "Ваша встреча была перенесена",
"request_reschedule_subtitle": "{{organizer}} отменил(-а) бронирование и попросил(-а) вас выбрать другое время.",
"request_reschedule_title_organizer": "Вы запросили у {{attendee}} изменение расписания",
@@ -1643,6 +1645,8 @@
"format": "Формат",
"uppercase_for_letters": "Использовать только прописные буквы",
"replace_whitespaces_underscores": "Заменить пробелы подчеркиванием",
"platform_members": "Участники платформы",
"platform_members_description": "Управляйте администраторами и участниками вашей команды на платформе",
"platform_billing": "Биллинг платформы",
"manage_billing": "Управление биллингом",
"manage_billing_description": "Управление всем, что связано с биллингом",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Добавьте атрибуты для членов вашей команды",
"new_option": "Новый вариант",
"update_profile": "Обновить профиль",
"attribute": "Атрибут",
"create_attribute_description": "Создать атрибут для участников вашей команды",
"edit_attribute_description": "Редактировать атрибут для участников вашей команды",
"attribute_updated_successfully": "Атрибут успешно обновлен",
"attribute_deleted_successfully": "Атрибут успешно удален",
"attributes_edited_successfully": "Атрибуты успешно отредактированы",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Stiahnite si svoje prepisy",
"your_meeting_has_been_booked": "Vaše stretnutie bolo rezervované",
"event_type_has_been_rescheduled_on_time_date": "Vaša {{title}} bola preplánovaná na {{date}}.",
"event_type_has_been_updated": "Váš {{title}} bol aktualizovaný.",
"event_has_been_rescheduled": "Aktualizované - Vaša udalosť bola preplánovaná",
"event_has_been_updated": "Udalosť bola aktualizovaná",
"your_event_has_been_rescheduled": "Vaša udalosť bola preplánovaná",
"request_reschedule_subtitle": "{{organizer}} zrušil rezerváciu a požiadal vás, aby ste si vybrali iný čas.",
"request_reschedule_title_organizer": "Požiadali ste {{attendee}}, aby preplánoval",
@@ -1643,6 +1645,8 @@
"format": "Formát",
"uppercase_for_letters": "Použiť veľké písmená pre všetky písmená",
"replace_whitespaces_underscores": "Nahradiť medzery podčiarkovníkmi",
"platform_members": "Členovia platformy",
"platform_members_description": "Spravujte administrátorov a členov vášho tímu platformy",
"platform_billing": "Fakturácia platformy",
"manage_billing": "Spravovať fakturáciu",
"manage_billing_description": "Spravujte všetky záležitosti týkajúce sa fakturácie",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Pridať atribúty členom vášho tímu",
"new_option": "Nová možnosť",
"update_profile": "Aktualizovať člena",
"attribute": "Atribút",
"create_attribute_description": "Vytvorte atribút pre členov vášho tímu",
"edit_attribute_description": "Upravte atribút pre členov vášho tímu",
"attribute_updated_successfully": "Atribút úspešne aktualizovaný",
"attribute_deleted_successfully": "Atribút úspešne odstránený",
"attributes_edited_successfully": "Atribúty úspešne upravené",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Preuzmite svoje transkripte",
"your_meeting_has_been_booked": "Sastanak je zakazan",
"event_type_has_been_rescheduled_on_time_date": "Ваш {{титле}} је померен за {{дате}}.",
"event_type_has_been_updated": "Vaš {{title}} je ažuriran.",
"event_has_been_rescheduled": "Ažurirano - Vaš dogadjaj je odložen",
"event_has_been_updated": "Događaj je ažuriran",
"your_event_has_been_rescheduled": "Vaš događaj je ponovo zakazan",
"request_reschedule_subtitle": "{{organizer}} je otkazao/la rezervaciju i tražio/la je da odaberete drugo vreme.",
"request_reschedule_title_organizer": "Zatražili ste da {{attendee}} promeni vreme rezervacije",
@@ -1643,6 +1645,8 @@
"format": "Format",
"uppercase_for_letters": "Koristite velika slova za sva slova",
"replace_whitespaces_underscores": "Zamenite prazna mesta donjom crtom",
"platform_members": "Članovi platforme",
"platform_members_description": "Upravljajte administratorima i članovima vašeg platformskog tima",
"platform_billing": "Naplata platforme",
"manage_billing": "Upravljajte naplatom",
"manage_billing_description": "Upravljajte svim u vezi sa naplatom",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Dodajte atribute članovima vašeg tima",
"new_option": "Nova opcija",
"update_profile": "Ažuriraj člana",
"attribute": "Atribut",
"create_attribute_description": "Kreiraj atribut za članove tvog tima",
"edit_attribute_description": "Izmeni atribut za članove tvog tima",
"attribute_updated_successfully": "Atribut uspešno ažuriran",
"attribute_deleted_successfully": "Атрибут је успешно обрисан",
"attributes_edited_successfully": "Atributi uspešno izmenjeni",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Ladda ner dina transkript",
"your_meeting_has_been_booked": "Ditt möte har bokats",
"event_type_has_been_rescheduled_on_time_date": "Din {{title}} har ändrats till {{date}}.",
"event_type_has_been_updated": "Din {{title}} har uppdaterats.",
"event_has_been_rescheduled": "Uppdatering - Din bokning har blivit omplanerad",
"event_has_been_updated": "Händelsen har uppdaterats",
"your_event_has_been_rescheduled": "Ditt event har omschemalagts",
"request_reschedule_subtitle": "{{organizer}} har avbokat bokningen och bett dig att välja en annan tid.",
"request_reschedule_title_organizer": "Du har begärt att {{attendee}} ska boka om",
@@ -1643,6 +1645,8 @@
"format": "Formatera",
"uppercase_for_letters": "Använd versaler för alla bokstäver",
"replace_whitespaces_underscores": "Ersätt blanktecken med understreck",
"platform_members": "Plattformsmedlemmar",
"platform_members_description": "Hantera administratörer och medlemmar i ditt plattformsteam",
"platform_billing": "Plattformsfakturering",
"manage_billing": "Hantera fakturering",
"manage_billing_description": "Hantera allt som faktureras",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Lägg till egenskaper till dina teammedlemmar",
"new_option": "Nytt alternativ",
"update_profile": "Uppdatera medlem",
"attribute": "Attribut",
"create_attribute_description": "Skapa ett attribut för dina teammedlemmar",
"edit_attribute_description": "Redigera ett attribut för dina teammedlemmar",
"attribute_updated_successfully": "Egenskapen uppdaterades framgångsrikt",
"attribute_deleted_successfully": "Attributet har raderats framgångsrikt",
"attributes_edited_successfully": "Egenskaperna redigerades framgångsrikt",
@@ -130,7 +130,9 @@
"download_your_transcripts": "Transkriptlerinizi İndirin",
"your_meeting_has_been_booked": "Toplantı rezervasyonunuz yapıldı",
"event_type_has_been_rescheduled_on_time_date": "{{title}}, {{date}} olarak yeniden planlandı.",
"event_type_has_been_updated": "{{title}} güncellendi.",
"event_has_been_rescheduled": "Güncellendi - Etkinliğiniz yeniden planlandı",
"event_has_been_updated": "Etkinlik güncellendi",
"your_event_has_been_rescheduled": "Etkinliğiniz yeniden planlandı",
"request_reschedule_subtitle": "{{organizer}} rezervasyonu iptal etti ve sizden başka bir saat seçmenizi istiyor.",
"request_reschedule_title_organizer": "{{attendee}} adlı kişiye yeniden planlama talebinde bulundunuz",
@@ -1643,6 +1645,8 @@
"format": "Biçim",
"uppercase_for_letters": "Tüm harfleri büyük harf olarak kullanın",
"replace_whitespaces_underscores": "Boşlukları alt çizgi ile değiştir",
"platform_members": "Platform üyeleri",
"platform_members_description": "Platform ekibinizdeki yöneticileri ve üyeleri yönetin",
"platform_billing": "Platform faturalandırması",
"manage_billing": "Faturalandırmayı yönetin",
"manage_billing_description": "Faturalandırmayla ilgili her şeyi yönetin",
@@ -2638,6 +2642,9 @@
"add_attributes_description": "Takım üyelerinize öznitelikler ekleyin",
"new_option": "Yeni seçenek",
"update_profile": "Üyeyi güncelle",
"attribute": "Özellik",
"create_attribute_description": "Ekip üyelerin için bir özellik oluştur",
"edit_attribute_description": "Ekip üyelerin için bir özelliği düzenle",
"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",

Some files were not shown because too many files have changed in this diff Show More