Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3536728e0 | ||
|
|
e22fec93b1 | ||
|
|
f81716fbb2 | ||
|
|
0b66ddc6db | ||
|
|
382a27f134 | ||
|
|
ac5ee225d5 | ||
|
|
d8fd6f5c25 | ||
|
|
0e333aa71c | ||
|
|
ae70786b2b | ||
|
|
2df553b58b | ||
|
|
d4afa1436d | ||
|
|
88efa0a2b2 | ||
|
|
b563e41623 | ||
|
|
f097f852ad | ||
|
|
aea8588a21 | ||
|
|
7e0c684348 | ||
|
|
21956f096d | ||
|
|
d1adfa3bf9 | ||
|
|
62976a4c77 | ||
|
|
93489709a8 | ||
|
|
050102fde2 | ||
|
|
c1112ab2ab | ||
|
|
34d4c3d775 | ||
|
|
e477e5892c | ||
|
|
ad44ca9f2a | ||
|
|
868cf91c35 | ||
|
|
8b9693ea60 | ||
|
|
935115d7c1 | ||
|
|
eae74c568c | ||
|
|
9e9dd6070d | ||
|
|
5af10a2f61 | ||
|
|
3936a0ae94 | ||
|
|
c2a3d8b8df |
@@ -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
|
||||
|
||||
Vendored
+2
@@ -0,0 +1,2 @@
|
||||
undecided:
|
||||
- "@calcom/prisma"
|
||||
Vendored
+8
@@ -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,
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
+26
-9
@@ -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);
|
||||
|
||||
|
||||
+10
-2
@@ -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
|
||||
|
||||
@@ -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;
|
||||
+1
-1
@@ -16,7 +16,7 @@ const Page = async () => {
|
||||
|
||||
return (
|
||||
<SettingsHeader title={t("general")} description={t("general_description")} borderInShellHeader={true}>
|
||||
<LegacyPage isAppDir={true} />
|
||||
<LegacyPage />
|
||||
</SettingsHeader>
|
||||
);
|
||||
};
|
||||
+1
-1
@@ -19,7 +19,7 @@ const Page = async () => {
|
||||
title={t("profile")}
|
||||
description={t("profile_org_description")}
|
||||
borderInShellHeader={true}>
|
||||
<LegacyPage isAppDir={true} />
|
||||
<LegacyPage />
|
||||
</SettingsHeader>
|
||||
);
|
||||
};
|
||||
+2
-2
@@ -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>
|
||||
);
|
||||
};
|
||||
+8
-4
@@ -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>
|
||||
);
|
||||
};
|
||||
+1
-1
@@ -16,7 +16,7 @@ const Page = async () => {
|
||||
|
||||
return (
|
||||
<SettingsHeader title={t("profile")} description={t("profile_team_description")}>
|
||||
<LegacyPage isAppDir={true} />
|
||||
<LegacyPage />
|
||||
</SettingsHeader>
|
||||
);
|
||||
};
|
||||
+1
-1
@@ -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>
|
||||
);
|
||||
};
|
||||
+7
-2
@@ -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;
|
||||
@@ -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 ?? ""),
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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}`;
|
||||
|
||||
@@ -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 |
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user