Compare commits
13 Commits
fix/shortc
...
release/20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
399a238bf4 | ||
|
|
b20ab72298 | ||
|
|
f723e6496a | ||
|
|
8c0aff8863 | ||
|
|
64c5077506 | ||
|
|
2afc87847d | ||
|
|
878ec833ce | ||
|
|
039de8015f | ||
|
|
f67b366b90 | ||
|
|
77e8a36ab0 | ||
|
|
d7cc9f5dbc | ||
|
|
4ba135f3b9 | ||
|
|
24894e05dc |
@@ -31,6 +31,7 @@ MICROSOFT_CLIENT_ID="************************************************"
|
|||||||
MICROSOFT_CLIENT_SECRET="************************************************"
|
MICROSOFT_CLIENT_SECRET="************************************************"
|
||||||
MICROSOFT_CALLBACK_URL="http://localhost:3170/v1/auth/microsoft/callback"
|
MICROSOFT_CALLBACK_URL="http://localhost:3170/v1/auth/microsoft/callback"
|
||||||
MICROSOFT_SCOPE="user.read"
|
MICROSOFT_SCOPE="user.read"
|
||||||
|
MICROSOFT_TENANT="common"
|
||||||
|
|
||||||
# Mailer config
|
# Mailer config
|
||||||
MAILER_SMTP_URL="smtps://user@domain.com:pass@smtp.domain.com"
|
MAILER_SMTP_URL="smtps://user@domain.com:pass@smtp.domain.com"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "hoppscotch-backend",
|
"name": "hoppscotch-backend",
|
||||||
"version": "2023.4.6",
|
"version": "2023.4.7",
|
||||||
"description": "",
|
"description": "",
|
||||||
"author": "",
|
"author": "",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
|||||||
@@ -236,11 +236,11 @@ export class AdminService {
|
|||||||
const user = await this.userService.findUserByEmail(userEmail);
|
const user = await this.userService.findUserByEmail(userEmail);
|
||||||
if (O.isNone(user)) return E.left(USER_NOT_FOUND);
|
if (O.isNone(user)) return E.left(USER_NOT_FOUND);
|
||||||
|
|
||||||
const isUserAlreadyMember = await this.teamService.getTeamMemberTE(
|
const teamMember = await this.teamService.getTeamMemberTE(
|
||||||
teamID,
|
teamID,
|
||||||
user.value.uid,
|
user.value.uid,
|
||||||
)();
|
)();
|
||||||
if (E.left(isUserAlreadyMember)) {
|
if (E.isLeft(teamMember)) {
|
||||||
const addedUser = await this.teamService.addMemberToTeamWithEmail(
|
const addedUser = await this.teamService.addMemberToTeamWithEmail(
|
||||||
teamID,
|
teamID,
|
||||||
userEmail,
|
userEmail,
|
||||||
@@ -248,6 +248,18 @@ export class AdminService {
|
|||||||
);
|
);
|
||||||
if (E.isLeft(addedUser)) return E.left(addedUser.left);
|
if (E.isLeft(addedUser)) return E.left(addedUser.left);
|
||||||
|
|
||||||
|
const userInvitation =
|
||||||
|
await this.teamInvitationService.getTeamInviteByEmailAndTeamID(
|
||||||
|
userEmail,
|
||||||
|
teamID,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (E.isRight(userInvitation)) {
|
||||||
|
await this.teamInvitationService.revokeInvitation(
|
||||||
|
userInvitation.right.id,
|
||||||
|
)();
|
||||||
|
}
|
||||||
|
|
||||||
return E.right(addedUser.right);
|
return E.right(addedUser.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export class MicrosoftStrategy extends PassportStrategy(Strategy) {
|
|||||||
clientSecret: process.env.MICROSOFT_CLIENT_SECRET,
|
clientSecret: process.env.MICROSOFT_CLIENT_SECRET,
|
||||||
callbackURL: process.env.MICROSOFT_CALLBACK_URL,
|
callbackURL: process.env.MICROSOFT_CALLBACK_URL,
|
||||||
scope: [process.env.MICROSOFT_SCOPE],
|
scope: [process.env.MICROSOFT_SCOPE],
|
||||||
passReqToCallback: true,
|
tenant: process.env.MICROSOFT_TENANT,
|
||||||
store: true,
|
store: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export const AUTH_FAIL = 'auth/fail';
|
|||||||
export const JSON_INVALID = 'json_invalid';
|
export const JSON_INVALID = 'json_invalid';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tried to delete an user data document from fb firestore but failed.
|
* Tried to delete a user data document from fb firestore but failed.
|
||||||
* (FirebaseService)
|
* (FirebaseService)
|
||||||
*/
|
*/
|
||||||
export const USER_FB_DOCUMENT_DELETION_FAILED =
|
export const USER_FB_DOCUMENT_DELETION_FAILED =
|
||||||
@@ -231,7 +231,7 @@ export const TEAM_COLL_INVALID_JSON = 'team_coll/invalid_json';
|
|||||||
export const TEAM_NOT_OWNER = 'team_coll/team_not_owner' as const;
|
export const TEAM_NOT_OWNER = 'team_coll/team_not_owner' as const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tried to perform action on a request that doesn't accept their member role level
|
* Tried to perform an action on a request that doesn't accept their member role level
|
||||||
* (GqlRequestTeamMemberGuard)
|
* (GqlRequestTeamMemberGuard)
|
||||||
*/
|
*/
|
||||||
export const TEAM_REQ_NOT_REQUIRED_ROLE = 'team_req/not_required_role';
|
export const TEAM_REQ_NOT_REQUIRED_ROLE = 'team_req/not_required_role';
|
||||||
@@ -262,7 +262,7 @@ export const TEAM_REQ_REORDERING_FAILED = 'team_req/reordering_failed' as const;
|
|||||||
export const SENDER_EMAIL_INVALID = 'mailer/sender_email_invalid' as const;
|
export const SENDER_EMAIL_INVALID = 'mailer/sender_email_invalid' as const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tried to perform action on a request when the user is not even member of the team
|
* Tried to perform an action on a request when the user is not even a member of the team
|
||||||
* (GqlRequestTeamMemberGuard, GqlCollectionTeamMemberGuard)
|
* (GqlRequestTeamMemberGuard, GqlCollectionTeamMemberGuard)
|
||||||
*/
|
*/
|
||||||
export const TEAM_REQ_NOT_MEMBER = 'team_req/not_member';
|
export const TEAM_REQ_NOT_MEMBER = 'team_req/not_member';
|
||||||
@@ -307,7 +307,7 @@ export const SHORTCODE_INVALID_JSON = 'shortcode/invalid_json' as const;
|
|||||||
export const SHORTCODE_ALREADY_EXISTS = 'shortcode/already_exists' as const;
|
export const SHORTCODE_ALREADY_EXISTS = 'shortcode/already_exists' as const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invalid or non-existent TEAM ENVIRONMMENT ID
|
* Invalid or non-existent TEAM ENVIRONMENT ID
|
||||||
* (TeamEnvironmentsService)
|
* (TeamEnvironmentsService)
|
||||||
*/
|
*/
|
||||||
export const TEAM_ENVIRONMENT_NOT_FOUND = 'team_environment/not_found' as const;
|
export const TEAM_ENVIRONMENT_NOT_FOUND = 'team_environment/not_found' as const;
|
||||||
@@ -340,7 +340,7 @@ export const USER_SETTINGS_NULL_SETTINGS =
|
|||||||
'user_settings/null_settings' as const;
|
'user_settings/null_settings' as const;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Global environment doesnt exists for the user
|
* Global environment doesn't exist for the user
|
||||||
* (UserEnvironmentsService)
|
* (UserEnvironmentsService)
|
||||||
*/
|
*/
|
||||||
export const USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXISTS =
|
export const USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXISTS =
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import * as T from 'fp-ts/Task';
|
|||||||
import * as O from 'fp-ts/Option';
|
import * as O from 'fp-ts/Option';
|
||||||
import * as TO from 'fp-ts/TaskOption';
|
import * as TO from 'fp-ts/TaskOption';
|
||||||
import * as TE from 'fp-ts/TaskEither';
|
import * as TE from 'fp-ts/TaskEither';
|
||||||
|
import * as E from 'fp-ts/Either';
|
||||||
import { pipe, flow, constVoid } from 'fp-ts/function';
|
import { pipe, flow, constVoid } from 'fp-ts/function';
|
||||||
import { PrismaService } from 'src/prisma/prisma.service';
|
import { PrismaService } from 'src/prisma/prisma.service';
|
||||||
import { Team, TeamMemberRole } from 'src/team/team.model';
|
import { Team, TeamMemberRole } from 'src/team/team.model';
|
||||||
@@ -10,6 +11,7 @@ import { Email } from 'src/types/Email';
|
|||||||
import { User } from 'src/user/user.model';
|
import { User } from 'src/user/user.model';
|
||||||
import { TeamService } from 'src/team/team.service';
|
import { TeamService } from 'src/team/team.service';
|
||||||
import {
|
import {
|
||||||
|
INVALID_EMAIL,
|
||||||
TEAM_INVITE_ALREADY_MEMBER,
|
TEAM_INVITE_ALREADY_MEMBER,
|
||||||
TEAM_INVITE_EMAIL_DO_NOT_MATCH,
|
TEAM_INVITE_EMAIL_DO_NOT_MATCH,
|
||||||
TEAM_INVITE_MEMBER_HAS_INVITE,
|
TEAM_INVITE_MEMBER_HAS_INVITE,
|
||||||
@@ -19,6 +21,7 @@ import { TeamInvitation } from './team-invitation.model';
|
|||||||
import { MailerService } from 'src/mailer/mailer.service';
|
import { MailerService } from 'src/mailer/mailer.service';
|
||||||
import { UserService } from 'src/user/user.service';
|
import { UserService } from 'src/user/user.service';
|
||||||
import { PubSubService } from 'src/pubsub/pubsub.service';
|
import { PubSubService } from 'src/pubsub/pubsub.service';
|
||||||
|
import { validateEmail } from '../utils';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class TeamInvitationService {
|
export class TeamInvitationService {
|
||||||
@@ -63,6 +66,32 @@ export class TeamInvitationService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the team invite for an invitee with email and teamID.
|
||||||
|
* @param inviteeEmail invitee email
|
||||||
|
* @param teamID team id
|
||||||
|
* @returns an Either of team invitation for the invitee or error
|
||||||
|
*/
|
||||||
|
async getTeamInviteByEmailAndTeamID(inviteeEmail: string, teamID: string) {
|
||||||
|
const isEmailValid = validateEmail(inviteeEmail);
|
||||||
|
if (!isEmailValid) return E.left(INVALID_EMAIL);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const teamInvite = await this.prisma.teamInvitation.findUniqueOrThrow({
|
||||||
|
where: {
|
||||||
|
teamID_inviteeEmail: {
|
||||||
|
inviteeEmail: inviteeEmail,
|
||||||
|
teamID: teamID,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return E.right(teamInvite);
|
||||||
|
} catch (e) {
|
||||||
|
return E.left(TEAM_INVITE_NO_INVITE_FOUND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
createInvitation(
|
createInvitation(
|
||||||
creator: User,
|
creator: User,
|
||||||
team: Team,
|
team: Team,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { HttpStatus } from '@nestjs/common';
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
** Custom interface to handle errors specific to Auth module
|
** Custom interface to handle errors specific to Auth module
|
||||||
** Since its REST we need to return HTTP status code along with error message
|
** Since its REST we need to return the HTTP status code along with the error message
|
||||||
*/
|
*/
|
||||||
export type AuthError = {
|
export type AuthError = {
|
||||||
message: string;
|
message: string;
|
||||||
|
|||||||
@@ -5,29 +5,29 @@
|
|||||||
"choose_file": "Válasszon egy fájlt",
|
"choose_file": "Válasszon egy fájlt",
|
||||||
"clear": "Törlés",
|
"clear": "Törlés",
|
||||||
"clear_all": "Összes törlése",
|
"clear_all": "Összes törlése",
|
||||||
"close": "Close",
|
"close": "Bezárás",
|
||||||
"connect": "Kapcsolódás",
|
"connect": "Kapcsolódás",
|
||||||
"connecting": "Connecting",
|
"connecting": "Kapcsolódás",
|
||||||
"copy": "Másolás",
|
"copy": "Másolás",
|
||||||
"delete": "Törlés",
|
"delete": "Törlés",
|
||||||
"disconnect": "Leválasztás",
|
"disconnect": "Leválasztás",
|
||||||
"dismiss": "Eltüntetés",
|
"dismiss": "Eltüntetés",
|
||||||
"dont_save": "Ne mentse",
|
"dont_save": "Ne mentse",
|
||||||
"download_file": "Fájl letöltése",
|
"download_file": "Fájl letöltése",
|
||||||
"drag_to_reorder": "Drag to reorder",
|
"drag_to_reorder": "Húzza az átrendezéshez",
|
||||||
"duplicate": "Kettőzés",
|
"duplicate": "Kettőzés",
|
||||||
"edit": "Szerkesztés",
|
"edit": "Szerkesztés",
|
||||||
"filter": "Filter",
|
"filter": "Szűrő",
|
||||||
"go_back": "Vissza",
|
"go_back": "Vissza",
|
||||||
"go_forward": "Go forward",
|
"go_forward": "Előre",
|
||||||
"group_by": "Group by",
|
"group_by": "Csoportosítás",
|
||||||
"label": "Címke",
|
"label": "Címke",
|
||||||
"learn_more": "Tudjon meg többet",
|
"learn_more": "Tudjon meg többet",
|
||||||
"less": "Kevesebb",
|
"less": "Kevesebb",
|
||||||
"more": "Több",
|
"more": "Több",
|
||||||
"new": "Új",
|
"new": "Új",
|
||||||
"no": "Nem",
|
"no": "Nem",
|
||||||
"open_workspace": "Open workspace",
|
"open_workspace": "Munkaterület megnyitása",
|
||||||
"paste": "Beillesztés",
|
"paste": "Beillesztés",
|
||||||
"prettify": "Csinosítás",
|
"prettify": "Csinosítás",
|
||||||
"remove": "Eltávolítás",
|
"remove": "Eltávolítás",
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
"search": "Keresés",
|
"search": "Keresés",
|
||||||
"send": "Küldés",
|
"send": "Küldés",
|
||||||
"start": "Indítás",
|
"start": "Indítás",
|
||||||
"starting": "Starting",
|
"starting": "Indítás",
|
||||||
"stop": "Leállítás",
|
"stop": "Leállítás",
|
||||||
"to_close": "a bezáráshoz",
|
"to_close": "a bezáráshoz",
|
||||||
"to_navigate": "a navigáláshoz",
|
"to_navigate": "a navigáláshoz",
|
||||||
@@ -118,16 +118,16 @@
|
|||||||
},
|
},
|
||||||
"collection": {
|
"collection": {
|
||||||
"created": "Gyűjtemény létrehozva",
|
"created": "Gyűjtemény létrehozva",
|
||||||
"different_parent": "Cannot reorder collection with different parent",
|
"different_parent": "Nem lehet átrendezni a különböző szülővel rendelkező gyűjteményt",
|
||||||
"edit": "Gyűjtemény szerkesztése",
|
"edit": "Gyűjtemény szerkesztése",
|
||||||
"invalid_name": "Adjon nevet a gyűjteménynek",
|
"invalid_name": "Adjon nevet a gyűjteménynek",
|
||||||
"invalid_root_move": "Collection already in the root",
|
"invalid_root_move": "A gyűjtemény már a gyökérben van",
|
||||||
"moved": "Moved Successfully",
|
"moved": "Sikeresen áthelyezve",
|
||||||
"my_collections": "Saját gyűjtemények",
|
"my_collections": "Saját gyűjtemények",
|
||||||
"name": "Saját új gyűjtemény",
|
"name": "Saját új gyűjtemény",
|
||||||
"name_length_insufficient": "A gyűjtemény nevének legalább 3 karakter hosszúságúnak kell lennie",
|
"name_length_insufficient": "A gyűjtemény nevének legalább 3 karakter hosszúságúnak kell lennie",
|
||||||
"new": "Új gyűjtemény",
|
"new": "Új gyűjtemény",
|
||||||
"order_changed": "Collection Order Updated",
|
"order_changed": "Gyűjtemény sorrendje frissítve",
|
||||||
"renamed": "Gyűjtemény átnevezve",
|
"renamed": "Gyűjtemény átnevezve",
|
||||||
"request_in_use": "A kérés használatban",
|
"request_in_use": "A kérés használatban",
|
||||||
"save_as": "Mentés másként",
|
"save_as": "Mentés másként",
|
||||||
@@ -147,7 +147,7 @@
|
|||||||
"remove_team": "Biztosan törölni szeretné ezt a csapatot?",
|
"remove_team": "Biztosan törölni szeretné ezt a csapatot?",
|
||||||
"remove_telemetry": "Biztosan ki szeretné kapcsolni a telemetriát?",
|
"remove_telemetry": "Biztosan ki szeretné kapcsolni a telemetriát?",
|
||||||
"request_change": "Biztosan el szeretné vetni a jelenlegi kérést? Minden mentetlen változtatás el fog veszni.",
|
"request_change": "Biztosan el szeretné vetni a jelenlegi kérést? Minden mentetlen változtatás el fog veszni.",
|
||||||
"save_unsaved_tab": "Do you want to save changes made in this tab?",
|
"save_unsaved_tab": "Szeretné menteni az ezen a lapon elvégzett változtatásokat?",
|
||||||
"sync": "Szeretné visszaállítani a munkaterületét a felhőből? Ez el fogja vetni a helyi folyamatát."
|
"sync": "Szeretné visszaállítani a munkaterületét a felhőből? Ez el fogja vetni a helyi folyamatát."
|
||||||
},
|
},
|
||||||
"count": {
|
"count": {
|
||||||
@@ -180,8 +180,8 @@
|
|||||||
"profile": "Jelentkezzen be a profilja megtekintéséhez",
|
"profile": "Jelentkezzen be a profilja megtekintéséhez",
|
||||||
"protocols": "A protokollok üresek",
|
"protocols": "A protokollok üresek",
|
||||||
"schema": "Kapcsolódjon egy GraphQL-végponthoz a séma megtekintéséhez",
|
"schema": "Kapcsolódjon egy GraphQL-végponthoz a séma megtekintéséhez",
|
||||||
"shortcodes": "Shortcodes are empty",
|
"shortcodes": "A rövid kódok üresek",
|
||||||
"subscription": "Subscriptions are empty",
|
"subscription": "A feliratkozások üresek",
|
||||||
"team_name": "A csapat neve üres",
|
"team_name": "A csapat neve üres",
|
||||||
"teams": "Ön nem tartozik semmilyen csapathoz",
|
"teams": "Ön nem tartozik semmilyen csapathoz",
|
||||||
"tests": "Nincsenek tesztek ehhez a kéréshez"
|
"tests": "Nincsenek tesztek ehhez a kéréshez"
|
||||||
@@ -194,13 +194,13 @@
|
|||||||
"deleted": "Környezet törlése",
|
"deleted": "Környezet törlése",
|
||||||
"edit": "Környezet szerkesztése",
|
"edit": "Környezet szerkesztése",
|
||||||
"invalid_name": "Adjon nevet a környezetnek",
|
"invalid_name": "Adjon nevet a környezetnek",
|
||||||
"my_environments": "My Environments",
|
"my_environments": "Saját környezetek",
|
||||||
"nested_overflow": "az egymásba ágyazott környezeti változók 10 szintre vannak korlátozva",
|
"nested_overflow": "az egymásba ágyazott környezeti változók 10 szintre vannak korlátozva",
|
||||||
"new": "Új környezet",
|
"new": "Új környezet",
|
||||||
"no_environment": "Nincs környezet",
|
"no_environment": "Nincs környezet",
|
||||||
"no_environment_description": "Nem lettek környezetek kiválasztva. Válassza ki, hogy mit kell tenni a következő változókkal.",
|
"no_environment_description": "Nem lettek környezetek kiválasztva. Válassza ki, hogy mit kell tenni a következő változókkal.",
|
||||||
"select": "Környezet kiválasztása",
|
"select": "Környezet kiválasztása",
|
||||||
"team_environments": "Team Environments",
|
"team_environments": "Csapatkörnyezetek",
|
||||||
"title": "Környezetek",
|
"title": "Környezetek",
|
||||||
"updated": "Környezet frissítve",
|
"updated": "Környezet frissítve",
|
||||||
"variable_list": "Változólista"
|
"variable_list": "Változólista"
|
||||||
@@ -209,9 +209,9 @@
|
|||||||
"browser_support_sse": "Úgy tűnik, hogy ez a böngésző nem támogatja a kiszolgáló által küldött eseményeket.",
|
"browser_support_sse": "Úgy tűnik, hogy ez a böngésző nem támogatja a kiszolgáló által küldött eseményeket.",
|
||||||
"check_console_details": "Nézze meg a konzolnaplót a részletekért.",
|
"check_console_details": "Nézze meg a konzolnaplót a részletekért.",
|
||||||
"curl_invalid_format": "A cURL nincs megfelelően formázva",
|
"curl_invalid_format": "A cURL nincs megfelelően formázva",
|
||||||
"danger_zone": "Danger zone",
|
"danger_zone": "Veszélyes zóna",
|
||||||
"delete_account": "Your account is currently an owner in these teams:",
|
"delete_account": "Az Ön fiókja jelenleg tulajdonos ezekben a csapatokban:",
|
||||||
"delete_account_description": "You must either remove yourself, transfer ownership, or delete these teams before you can delete your account.",
|
"delete_account_description": "El kell távolítani magát, át kell adnia a tulajdonjogot vagy törölnie kell ezeket a csapatokat, mielőtt törölhetné a fiókját.",
|
||||||
"empty_req_name": "Üres kérésnév",
|
"empty_req_name": "Üres kérésnév",
|
||||||
"f12_details": "(F12 a részletekért)",
|
"f12_details": "(F12 a részletekért)",
|
||||||
"gql_prettify_invalid_query": "Nem sikerült csinosítani egy érvénytelen lekérdezést, oldja meg a lekérdezés szintaktikai hibáit, és próbálja újra",
|
"gql_prettify_invalid_query": "Nem sikerült csinosítani egy érvénytelen lekérdezést, oldja meg a lekérdezés szintaktikai hibáit, és próbálja újra",
|
||||||
@@ -219,13 +219,13 @@
|
|||||||
"incorrect_email": "Hibás e-mail",
|
"incorrect_email": "Hibás e-mail",
|
||||||
"invalid_link": "Érvénytelen hivatkozás",
|
"invalid_link": "Érvénytelen hivatkozás",
|
||||||
"invalid_link_description": "A kattintott hivatkozás érvénytelen vagy lejárt.",
|
"invalid_link_description": "A kattintott hivatkozás érvénytelen vagy lejárt.",
|
||||||
"json_parsing_failed": "Invalid JSON",
|
"json_parsing_failed": "Érvénytelen JSON",
|
||||||
"json_prettify_invalid_body": "Nem sikerült csinosítani egy érvénytelen törzset, oldja meg a JSON szintaktikai hibáit, és próbálja újra",
|
"json_prettify_invalid_body": "Nem sikerült csinosítani egy érvénytelen törzset, oldja meg a JSON szintaktikai hibáit, és próbálja újra",
|
||||||
"network_error": "Úgy tűnik, hogy hálózati hiba van. Próbálja újra.",
|
"network_error": "Úgy tűnik, hogy hálózati hiba van. Próbálja újra.",
|
||||||
"network_fail": "Nem sikerült elküldeni a kérést",
|
"network_fail": "Nem sikerült elküldeni a kérést",
|
||||||
"no_duration": "Nincs időtartam",
|
"no_duration": "Nincs időtartam",
|
||||||
"no_results_found": "No matches found",
|
"no_results_found": "Nincs találat",
|
||||||
"page_not_found": "This page could not be found",
|
"page_not_found": "Ez az oldal nem található",
|
||||||
"script_fail": "Nem sikerült végrehajtani a kérés előtti parancsfájlt",
|
"script_fail": "Nem sikerült végrehajtani a kérés előtti parancsfájlt",
|
||||||
"something_went_wrong": "Valami elromlott",
|
"something_went_wrong": "Valami elromlott",
|
||||||
"test_script_fail": "Nem sikerült végrehajtani a kérés utáni parancsfájlt"
|
"test_script_fail": "Nem sikerült végrehajtani a kérés utáni parancsfájlt"
|
||||||
@@ -238,9 +238,9 @@
|
|||||||
"title": "Exportálás"
|
"title": "Exportálás"
|
||||||
},
|
},
|
||||||
"filter": {
|
"filter": {
|
||||||
"all": "All",
|
"all": "Összes",
|
||||||
"none": "None",
|
"none": "Nincs",
|
||||||
"starred": "Starred"
|
"starred": "Csillagozott"
|
||||||
},
|
},
|
||||||
"folder": {
|
"folder": {
|
||||||
"created": "Mappa létrehozva",
|
"created": "Mappa létrehozva",
|
||||||
@@ -256,7 +256,7 @@
|
|||||||
"subscriptions": "Feliratkozások"
|
"subscriptions": "Feliratkozások"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"time": "Time",
|
"time": "Idő",
|
||||||
"url": "URL"
|
"url": "URL"
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
@@ -316,32 +316,32 @@
|
|||||||
"zen_mode": "Zen mód"
|
"zen_mode": "Zen mód"
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"close_unsaved_tab": "You have unsaved changes",
|
"close_unsaved_tab": "Elmentetlen változtatásai vannak",
|
||||||
"collections": "Gyűjtemények",
|
"collections": "Gyűjtemények",
|
||||||
"confirm": "Megerősítés",
|
"confirm": "Megerősítés",
|
||||||
"edit_request": "Kérés szerkesztése",
|
"edit_request": "Kérés szerkesztése",
|
||||||
"import_export": "Importálás és exportálás"
|
"import_export": "Importálás és exportálás"
|
||||||
},
|
},
|
||||||
"mqtt": {
|
"mqtt": {
|
||||||
"already_subscribed": "You are already subscribed to this topic.",
|
"already_subscribed": "Ön már feliratkozott erre a témára.",
|
||||||
"clean_session": "Clean Session",
|
"clean_session": "Munkamenet törlése",
|
||||||
"clear_input": "Clear input",
|
"clear_input": "Bevitel törlése",
|
||||||
"clear_input_on_send": "Clear input on send",
|
"clear_input_on_send": "Bevitel törlése küldéskor",
|
||||||
"client_id": "Client ID",
|
"client_id": "Ügyfél-azonosító",
|
||||||
"color": "Pick a color",
|
"color": "Válasszon színt",
|
||||||
"communication": "Kommunikáció",
|
"communication": "Kommunikáció",
|
||||||
"connection_config": "Connection Config",
|
"connection_config": "Kapcsolat beállításai",
|
||||||
"connection_not_authorized": "This MQTT connection does not use any authentication.",
|
"connection_not_authorized": "Ez az MQTT-kapcsolat nem használ semmilyen hitelesítést.",
|
||||||
"invalid_topic": "Please provide a topic for the subscription",
|
"invalid_topic": "Adjon témát a feliratkozáshoz",
|
||||||
"keep_alive": "Keep Alive",
|
"keep_alive": "Életben tartás",
|
||||||
"log": "Napló",
|
"log": "Napló",
|
||||||
"lw_message": "Last-Will Message",
|
"lw_message": "Utolsó kívánság üzenet",
|
||||||
"lw_qos": "Last-Will QoS",
|
"lw_qos": "Utolsó kívánság QoS",
|
||||||
"lw_retain": "Last-Will Retain",
|
"lw_retain": "Utolsó kívánság megtartás",
|
||||||
"lw_topic": "Last-Will Topic",
|
"lw_topic": "Utolsó kívánság téma",
|
||||||
"message": "Üzenet",
|
"message": "Üzenet",
|
||||||
"new": "New Subscription",
|
"new": "Új feliratkozás",
|
||||||
"not_connected": "Please start a MQTT connection first.",
|
"not_connected": "Először indítson egy MQTT-kapcsolatot.",
|
||||||
"publish": "Közzététel",
|
"publish": "Közzététel",
|
||||||
"qos": "QoS",
|
"qos": "QoS",
|
||||||
"ssl": "SSL",
|
"ssl": "SSL",
|
||||||
@@ -368,7 +368,7 @@
|
|||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
"app_settings": "Alkalmazás beállításai",
|
"app_settings": "Alkalmazás beállításai",
|
||||||
"default_hopp_displayname": "Unnamed User",
|
"default_hopp_displayname": "Névtelen felhasználó",
|
||||||
"editor": "Szerkesztő",
|
"editor": "Szerkesztő",
|
||||||
"editor_description": "A szerkesztők hozzáadhatnak, szerkeszthetnek és törölhetnek kéréseket.",
|
"editor_description": "A szerkesztők hozzáadhatnak, szerkeszthetnek és törölhetnek kéréseket.",
|
||||||
"email_verification_mail": "Egy ellenőrző e-mail el lett küldve az e-mail-címére. Kattintson a hivatkozásra az e-mail-címe ellenőrzéséhez.",
|
"email_verification_mail": "Egy ellenőrző e-mail el lett küldve az e-mail-címére. Kattintson a hivatkozásra az e-mail-címe ellenőrzéséhez.",
|
||||||
@@ -391,26 +391,26 @@
|
|||||||
"choose_language": "Nyelv kiválasztása",
|
"choose_language": "Nyelv kiválasztása",
|
||||||
"content_type": "Tartalom típusa",
|
"content_type": "Tartalom típusa",
|
||||||
"content_type_titles": {
|
"content_type_titles": {
|
||||||
"others": "Others",
|
"others": "Egyebek",
|
||||||
"structured": "Structured",
|
"structured": "Szerkesztett",
|
||||||
"text": "Text"
|
"text": "Szöveg"
|
||||||
},
|
},
|
||||||
"copy_link": "Hivatkozás másolása",
|
"copy_link": "Hivatkozás másolása",
|
||||||
"different_collection": "Cannot reorder requests from different collections",
|
"different_collection": "Nem lehet átrendezni a különböző gyűjteményekből érkező kéréseket",
|
||||||
"duplicated": "Request duplicated",
|
"duplicated": "Kérés megkettőzve",
|
||||||
"duration": "Időtartam",
|
"duration": "Időtartam",
|
||||||
"enter_curl": "cURL megadása",
|
"enter_curl": "cURL-parancs megadása",
|
||||||
"generate_code": "Kód előállítása",
|
"generate_code": "Kód előállítása",
|
||||||
"generated_code": "Előállított kód",
|
"generated_code": "Előállított kód",
|
||||||
"header_list": "Fejléclista",
|
"header_list": "Fejléclista",
|
||||||
"invalid_name": "Adjon nevet a kérésnek",
|
"invalid_name": "Adjon nevet a kérésnek",
|
||||||
"method": "Módszer",
|
"method": "Módszer",
|
||||||
"moved": "Request moved",
|
"moved": "Kérés áthelyezve",
|
||||||
"name": "Kérés neve",
|
"name": "Kérés neve",
|
||||||
"new": "Új kérés",
|
"new": "Új kérés",
|
||||||
"order_changed": "Request Order Updated",
|
"order_changed": "Kérés sorrendje frissítve",
|
||||||
"override": "Felülbírálás",
|
"override": "Felülbírálás",
|
||||||
"override_help": "A <kbd>Content-Type</kbd> beállítása a fejlécekben",
|
"override_help": "<kbd>Content-Type</kbd> beállítása a fejlécekben",
|
||||||
"overriden": "Felülbírálva",
|
"overriden": "Felülbírálva",
|
||||||
"parameter_list": "Lekérdezési paraméterek",
|
"parameter_list": "Lekérdezési paraméterek",
|
||||||
"parameters": "Paraméterek",
|
"parameters": "Paraméterek",
|
||||||
@@ -429,12 +429,12 @@
|
|||||||
"type": "Kérés típusa",
|
"type": "Kérés típusa",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"variables": "Változók",
|
"variables": "Változók",
|
||||||
"view_my_links": "View my links"
|
"view_my_links": "Saját hivatkozások megtekintése"
|
||||||
},
|
},
|
||||||
"response": {
|
"response": {
|
||||||
"audio": "Audio",
|
"audio": "Hang",
|
||||||
"body": "Válasz törzse",
|
"body": "Válasz törzse",
|
||||||
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)",
|
"filter_response_body": "JSON-válasz törzsének szűrése (JSONPath szintaxist használ)",
|
||||||
"headers": "Fejlécek",
|
"headers": "Fejlécek",
|
||||||
"html": "HTML",
|
"html": "HTML",
|
||||||
"image": "Kép",
|
"image": "Kép",
|
||||||
@@ -446,14 +446,14 @@
|
|||||||
"status": "Állapot",
|
"status": "Állapot",
|
||||||
"time": "Idő",
|
"time": "Idő",
|
||||||
"title": "Válasz",
|
"title": "Válasz",
|
||||||
"video": "Video",
|
"video": "Videó",
|
||||||
"waiting_for_connection": "várakozás kapcsolódásra",
|
"waiting_for_connection": "várakozás kapcsolódásra",
|
||||||
"xml": "XML"
|
"xml": "XML"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"accent_color": "Kiemelőszín",
|
"accent_color": "Kiemelőszín",
|
||||||
"account": "Fiók",
|
"account": "Fiók",
|
||||||
"account_deleted": "Your account has been deleted",
|
"account_deleted": "A fiókja törölve lett",
|
||||||
"account_description": "A fiókbeállítások személyre szabása.",
|
"account_description": "A fiókbeállítások személyre szabása.",
|
||||||
"account_email_description": "Az Ön elsődleges e-mail-címe.",
|
"account_email_description": "Az Ön elsődleges e-mail-címe.",
|
||||||
"account_name_description": "Ez a megjelenített neve.",
|
"account_name_description": "Ez a megjelenített neve.",
|
||||||
@@ -462,8 +462,8 @@
|
|||||||
"change_font_size": "Betűméret megváltoztatása",
|
"change_font_size": "Betűméret megváltoztatása",
|
||||||
"choose_language": "Nyelv kiválasztása",
|
"choose_language": "Nyelv kiválasztása",
|
||||||
"dark_mode": "Sötét",
|
"dark_mode": "Sötét",
|
||||||
"delete_account": "Delete account",
|
"delete_account": "Fiók törlése",
|
||||||
"delete_account_description": "Once you delete your account, all your data will be permanently deleted. This action cannot be undone.",
|
"delete_account_description": "Ha törli a fiókját, akkor az összes adata véglegesen törlésre kerül. Ezt a műveletet nem lehet visszavonni.",
|
||||||
"expand_navigation": "Navigáció kinyitása",
|
"expand_navigation": "Navigáció kinyitása",
|
||||||
"experiments": "Kísérletek",
|
"experiments": "Kísérletek",
|
||||||
"experiments_notice": "Ez olyan kísérletek gyűjteménye, amelyeken dolgozunk, és amelyek hasznosak, szórakoztatóak lehetnek, mindkettő, vagy egyik sem. Ezek nem véglegesek és nem stabilak, ezért ha valami túl furcsa dolog történik, ne essen pánikba. Egyszerűen kapcsolja ki a hibás dolgot. Viccet félretéve, ",
|
"experiments_notice": "Ez olyan kísérletek gyűjteménye, amelyeken dolgozunk, és amelyek hasznosak, szórakoztatóak lehetnek, mindkettő, vagy egyik sem. Ezek nem véglegesek és nem stabilak, ezért ha valami túl furcsa dolog történik, ne essen pánikba. Egyszerűen kapcsolja ki a hibás dolgot. Viccet félretéve, ",
|
||||||
@@ -490,8 +490,8 @@
|
|||||||
"proxy_use_toggle": "A proxy középprogram használata a kérések küldéséhez",
|
"proxy_use_toggle": "A proxy középprogram használata a kérések küldéséhez",
|
||||||
"read_the": "Olvassa el:",
|
"read_the": "Olvassa el:",
|
||||||
"reset_default": "Visszaállítás az alapértelmezettre",
|
"reset_default": "Visszaállítás az alapértelmezettre",
|
||||||
"short_codes": "Short codes",
|
"short_codes": "Rövid kódok",
|
||||||
"short_codes_description": "Short codes which were created by you.",
|
"short_codes_description": "Az Ön által létrehozott rövid kódok.",
|
||||||
"sidebar_on_left": "Oldalsáv a bal oldalon",
|
"sidebar_on_left": "Oldalsáv a bal oldalon",
|
||||||
"sync": "Szinkronizálás",
|
"sync": "Szinkronizálás",
|
||||||
"sync_collections": "Gyűjtemények",
|
"sync_collections": "Gyűjtemények",
|
||||||
@@ -505,16 +505,16 @@
|
|||||||
"theme_description": "Az alkalmazás témájának személyre szabása.",
|
"theme_description": "Az alkalmazás témájának személyre szabása.",
|
||||||
"use_experimental_url_bar": "Kísérleti URL-sáv használata a környezet kiemelésével",
|
"use_experimental_url_bar": "Kísérleti URL-sáv használata a környezet kiemelésével",
|
||||||
"user": "Felhasználó",
|
"user": "Felhasználó",
|
||||||
"verified_email": "Verified email",
|
"verified_email": "Ellenőrzött e-mail-cím",
|
||||||
"verify_email": "E-mail-cím ellenőrzése"
|
"verify_email": "E-mail-cím ellenőrzése"
|
||||||
},
|
},
|
||||||
"shortcodes": {
|
"shortcodes": {
|
||||||
"actions": "Actions",
|
"actions": "Műveletek",
|
||||||
"created_on": "Created on",
|
"created_on": "Létrehozva",
|
||||||
"deleted": "Shortcode deleted",
|
"deleted": "Rövid kód törölve",
|
||||||
"method": "Method",
|
"method": "Módszer",
|
||||||
"not_found": "Shortcode not found",
|
"not_found": "A rövid kód nem található",
|
||||||
"short_code": "Short code",
|
"short_code": "Rövid kód",
|
||||||
"url": "URL"
|
"url": "URL"
|
||||||
},
|
},
|
||||||
"shortcut": {
|
"shortcut": {
|
||||||
@@ -556,9 +556,9 @@
|
|||||||
"title": "Kérés"
|
"title": "Kérés"
|
||||||
},
|
},
|
||||||
"response": {
|
"response": {
|
||||||
"copy": "Copy response to clipboard",
|
"copy": "Válasz másolása a vágólapra",
|
||||||
"download": "Download response as file",
|
"download": "Válasz letöltés fájlként",
|
||||||
"title": "Response"
|
"title": "Válasz"
|
||||||
},
|
},
|
||||||
"theme": {
|
"theme": {
|
||||||
"black": "Téma átváltása fekete módra",
|
"black": "Téma átváltása fekete módra",
|
||||||
@@ -576,8 +576,8 @@
|
|||||||
},
|
},
|
||||||
"socketio": {
|
"socketio": {
|
||||||
"communication": "Kommunikáció",
|
"communication": "Kommunikáció",
|
||||||
"connection_not_authorized": "This SocketIO connection does not use any authentication.",
|
"connection_not_authorized": "Ez a SocketIO-kapcsolat nem használ semmilyen hitelesítést.",
|
||||||
"event_name": "Esemény neve",
|
"event_name": "Esemény vagy téma neve",
|
||||||
"events": "Események",
|
"events": "Események",
|
||||||
"log": "Napló",
|
"log": "Napló",
|
||||||
"url": "URL"
|
"url": "URL"
|
||||||
@@ -594,9 +594,9 @@
|
|||||||
"connected": "Kapcsolódva",
|
"connected": "Kapcsolódva",
|
||||||
"connected_to": "Kapcsolódva ehhez: {name}",
|
"connected_to": "Kapcsolódva ehhez: {name}",
|
||||||
"connecting_to": "Kapcsolódás ehhez: {name}…",
|
"connecting_to": "Kapcsolódás ehhez: {name}…",
|
||||||
"connection_error": "Failed to connect",
|
"connection_error": "Nem sikerült kapcsolódni",
|
||||||
"connection_failed": "Connection failed",
|
"connection_failed": "A kapcsolódás sikertelen",
|
||||||
"connection_lost": "Connection lost",
|
"connection_lost": "A kapcsolat elveszett",
|
||||||
"copied_to_clipboard": "Vágólapra másolva",
|
"copied_to_clipboard": "Vágólapra másolva",
|
||||||
"deleted": "Törölve",
|
"deleted": "Törölve",
|
||||||
"deprecated": "ELAVULT",
|
"deprecated": "ELAVULT",
|
||||||
@@ -611,17 +611,17 @@
|
|||||||
"history_deleted": "Előzmények törölve",
|
"history_deleted": "Előzmények törölve",
|
||||||
"linewrap": "Sorok tördelése",
|
"linewrap": "Sorok tördelése",
|
||||||
"loading": "Betöltés…",
|
"loading": "Betöltés…",
|
||||||
"message_received": "Message: {message} arrived on topic: {topic}",
|
"message_received": "Üzenet: {message} érkezett ehhez a témához: {topic}",
|
||||||
"mqtt_subscription_failed": "Something went wrong while subscribing to topic: {topic}",
|
"mqtt_subscription_failed": "Valami elromlott a következő témára való feliratkozás során: {topic}",
|
||||||
"none": "Nincs",
|
"none": "Nincs",
|
||||||
"nothing_found": "Semmi sem található ehhez:",
|
"nothing_found": "Semmi sem található ehhez:",
|
||||||
"published_error": "Something went wrong while publishing msg: {topic} to topic: {message}",
|
"published_error": "Valami elromlott a következő üzenet közzététele során: {topic}, ehhez a témához: {message}",
|
||||||
"published_message": "Published message: {message} to topic: {topic}",
|
"published_message": "Közzétett üzenet: {message}, ehhez a témához: {topic}",
|
||||||
"reconnection_error": "Failed to reconnect",
|
"reconnection_error": "Nem sikerült újrakapcsolódni",
|
||||||
"subscribed_failed": "Failed to subscribe to topic: {topic}",
|
"subscribed_failed": "Nem sikerült feliratkozni erre a témára: {topic}",
|
||||||
"subscribed_success": "Successfully subscribed to topic: {topic}",
|
"subscribed_success": "Sikeresen feliratkozott erre a témára: {topic}",
|
||||||
"unsubscribed_failed": "Failed to unsubscribe from topic: {topic}",
|
"unsubscribed_failed": "Nem sikerült leiratkozni erről a témáról: {topic}",
|
||||||
"unsubscribed_success": "Successfully unsubscribed from topic: {topic}",
|
"unsubscribed_success": "Sikeresen leiratkozott erről a témáról: {topic}",
|
||||||
"waiting_send_request": "Várakozás a kérés elküldésére"
|
"waiting_send_request": "Várakozás a kérés elküldésére"
|
||||||
},
|
},
|
||||||
"support": {
|
"support": {
|
||||||
@@ -641,7 +641,7 @@
|
|||||||
"body": "Törzs",
|
"body": "Törzs",
|
||||||
"collections": "Gyűjtemények",
|
"collections": "Gyűjtemények",
|
||||||
"documentation": "Dokumentáció",
|
"documentation": "Dokumentáció",
|
||||||
"environments": "Environments",
|
"environments": "Környezetek",
|
||||||
"headers": "Fejlécek",
|
"headers": "Fejlécek",
|
||||||
"history": "Előzmények",
|
"history": "Előzmények",
|
||||||
"mqtt": "MQTT",
|
"mqtt": "MQTT",
|
||||||
@@ -666,7 +666,7 @@
|
|||||||
"email_do_not_match": "Az e-mail-cím nem egyezik a fiókja részleteivel. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
"email_do_not_match": "Az e-mail-cím nem egyezik a fiókja részleteivel. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
||||||
"exit": "Kilépés a csapatból",
|
"exit": "Kilépés a csapatból",
|
||||||
"exit_disabled": "Csak a tulajdonos nem léphet ki a csapatból",
|
"exit_disabled": "Csak a tulajdonos nem léphet ki a csapatból",
|
||||||
"invalid_coll_id": "Invalid collection ID",
|
"invalid_coll_id": "Érvénytelen gyűjteményazonosító",
|
||||||
"invalid_email_format": "Az e-mail formátuma érvénytelen",
|
"invalid_email_format": "Az e-mail formátuma érvénytelen",
|
||||||
"invalid_id": "Érvénytelen csapatazonosító. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
"invalid_id": "Érvénytelen csapatazonosító. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
||||||
"invalid_invite_link": "Érvénytelen meghívási hivatkozás",
|
"invalid_invite_link": "Érvénytelen meghívási hivatkozás",
|
||||||
@@ -690,7 +690,7 @@
|
|||||||
"member_removed": "Felhasználó eltávolítva",
|
"member_removed": "Felhasználó eltávolítva",
|
||||||
"member_role_updated": "Felhasználói szerepek frissítve",
|
"member_role_updated": "Felhasználói szerepek frissítve",
|
||||||
"members": "Tagok",
|
"members": "Tagok",
|
||||||
"more_members": "+{count} more",
|
"more_members": "+{count} további",
|
||||||
"name_length_insufficient": "A csapat nevének legalább 6 karakter hosszúságúnak kell lennie",
|
"name_length_insufficient": "A csapat nevének legalább 6 karakter hosszúságúnak kell lennie",
|
||||||
"name_updated": "Csapatnév frissítve",
|
"name_updated": "Csapatnév frissítve",
|
||||||
"new": "Új csapat",
|
"new": "Új csapat",
|
||||||
@@ -698,13 +698,13 @@
|
|||||||
"new_name": "Saját új csapat",
|
"new_name": "Saját új csapat",
|
||||||
"no_access": "Nincs szerkesztési jogosultsága ezekhez a gyűjteményekhez",
|
"no_access": "Nincs szerkesztési jogosultsága ezekhez a gyűjteményekhez",
|
||||||
"no_invite_found": "A meghívás nem található. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
"no_invite_found": "A meghívás nem található. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
||||||
"no_request_found": "Request not found.",
|
"no_request_found": "A kérés nem található.",
|
||||||
"not_found": "A csapat nem található. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
"not_found": "A csapat nem található. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
||||||
"not_valid_viewer": "Ön nem érvényes megtekintő. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
"not_valid_viewer": "Ön nem érvényes megtekintő. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
||||||
"parent_coll_move": "Cannot move collection to a child collection",
|
"parent_coll_move": "Nem lehet áthelyezni a gyűjteményt egy gyermekgyűjteménybe",
|
||||||
"pending_invites": "Függőben lévő meghívások",
|
"pending_invites": "Függőben lévő meghívások",
|
||||||
"permissions": "Jogosultságok",
|
"permissions": "Jogosultságok",
|
||||||
"same_target_destination": "Same target and destination",
|
"same_target_destination": "Ugyanaz a cél és célhely",
|
||||||
"saved": "Csapat elmentve",
|
"saved": "Csapat elmentve",
|
||||||
"select_a_team": "Csapat kiválasztása",
|
"select_a_team": "Csapat kiválasztása",
|
||||||
"title": "Csapatok",
|
"title": "Csapatok",
|
||||||
@@ -712,9 +712,9 @@
|
|||||||
"we_sent_invite_link_description": "Kérje meg az összes meghívottat, hogy nézzék meg a beérkező leveleiket. Kattintsanak a hivatkozásra a csapathoz való csatlakozáshoz."
|
"we_sent_invite_link_description": "Kérje meg az összes meghívottat, hogy nézzék meg a beérkező leveleiket. Kattintsanak a hivatkozásra a csapathoz való csatlakozáshoz."
|
||||||
},
|
},
|
||||||
"team_environment": {
|
"team_environment": {
|
||||||
"deleted": "Environment Deleted",
|
"deleted": "Környezet törölve",
|
||||||
"duplicate": "Environment Duplicated",
|
"duplicate": "Környezet megkettőzve",
|
||||||
"not_found": "Environment not found."
|
"not_found": "A környezet nem található."
|
||||||
},
|
},
|
||||||
"test": {
|
"test": {
|
||||||
"failed": "teszt sikertelen",
|
"failed": "teszt sikertelen",
|
||||||
@@ -734,9 +734,9 @@
|
|||||||
"url": "URL"
|
"url": "URL"
|
||||||
},
|
},
|
||||||
"workspace": {
|
"workspace": {
|
||||||
"change": "Change workspace",
|
"change": "Munkaterület váltása",
|
||||||
"personal": "My Workspace",
|
"personal": "Saját munkaterület",
|
||||||
"team": "Team Workspace",
|
"team": "Csapat-munkaterület",
|
||||||
"title": "Workspaces"
|
"title": "Munkaterületek"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@hoppscotch/common",
|
"name": "@hoppscotch/common",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "2023.4.6",
|
"version": "2023.4.7",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "pnpm exec npm-run-all -p -l dev:*",
|
"dev": "pnpm exec npm-run-all -p -l dev:*",
|
||||||
"dev:vite": "vite",
|
"dev:vite": "vite",
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ declare module '@vue/runtime-core' {
|
|||||||
HoppSmartLink: typeof import('@hoppscotch/ui')['HoppSmartLink']
|
HoppSmartLink: typeof import('@hoppscotch/ui')['HoppSmartLink']
|
||||||
HoppSmartModal: typeof import('@hoppscotch/ui')['HoppSmartModal']
|
HoppSmartModal: typeof import('@hoppscotch/ui')['HoppSmartModal']
|
||||||
HoppSmartPicture: typeof import('@hoppscotch/ui')['HoppSmartPicture']
|
HoppSmartPicture: typeof import('@hoppscotch/ui')['HoppSmartPicture']
|
||||||
|
HoppSmartPlaceholder: typeof import('@hoppscotch/ui')['HoppSmartPlaceholder']
|
||||||
HoppSmartProgressRing: typeof import('@hoppscotch/ui')['HoppSmartProgressRing']
|
HoppSmartProgressRing: typeof import('@hoppscotch/ui')['HoppSmartProgressRing']
|
||||||
HoppSmartRadioGroup: typeof import('@hoppscotch/ui')['HoppSmartRadioGroup']
|
HoppSmartRadioGroup: typeof import('@hoppscotch/ui')['HoppSmartRadioGroup']
|
||||||
HoppSmartSlideOver: typeof import('@hoppscotch/ui')['HoppSmartSlideOver']
|
HoppSmartSlideOver: typeof import('@hoppscotch/ui')['HoppSmartSlideOver']
|
||||||
|
|||||||
@@ -44,8 +44,9 @@
|
|||||||
class="flex flex-col items-center justify-center p-4 text-secondaryLight"
|
class="flex flex-col items-center justify-center p-4 text-secondaryLight"
|
||||||
>
|
>
|
||||||
<icon-lucide-search class="pb-2 opacity-75 svg-icons" />
|
<icon-lucide-search class="pb-2 opacity-75 svg-icons" />
|
||||||
<span class="my-2 text-center">
|
<span class="my-2 text-center flex flex-col">
|
||||||
{{ t("state.nothing_found") }} "{{ filterText }}"
|
{{ t("state.nothing_found") }}
|
||||||
|
<span class="break-all">"{{ filterText }}"</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -284,6 +284,14 @@ const importerAction = async (stepResults: StepReturnValue[]) => {
|
|||||||
emit("import-to-teams", result)
|
emit("import-to-teams", result)
|
||||||
} else {
|
} else {
|
||||||
appendRESTCollections(result)
|
appendRESTCollections(result)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_IMPORT_COLLECTION",
|
||||||
|
importer: importerModule.value!.name,
|
||||||
|
platform: "rest",
|
||||||
|
workspaceType: "personal",
|
||||||
|
})
|
||||||
|
|
||||||
fileImported()
|
fileImported()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex flex-col flex-1 bg-primary">
|
<div class="flex flex-col flex-1">
|
||||||
<div
|
<div
|
||||||
class="sticky z-10 flex justify-between flex-1 border-b bg-primary border-dividerLight"
|
class="sticky z-10 flex justify-between flex-1 border-b bg-primary border-dividerLight"
|
||||||
:style="
|
:style="
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ import {
|
|||||||
import { GQLError } from "~/helpers/backend/GQLClient"
|
import { GQLError } from "~/helpers/backend/GQLClient"
|
||||||
import { computedWithControl } from "@vueuse/core"
|
import { computedWithControl } from "@vueuse/core"
|
||||||
import { currentActiveTab } from "~/helpers/rest/tab"
|
import { currentActiveTab } from "~/helpers/rest/tab"
|
||||||
|
import { platform } from "~/platform"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
const toast = useToast()
|
const toast = useToast()
|
||||||
@@ -223,6 +224,13 @@ const saveRequestAs = async () => {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
createdNow: true,
|
||||||
|
platform: "rest",
|
||||||
|
workspaceType: "personal",
|
||||||
|
})
|
||||||
|
|
||||||
requestSaved()
|
requestSaved()
|
||||||
} else if (picked.value.pickedType === "my-folder") {
|
} else if (picked.value.pickedType === "my-folder") {
|
||||||
if (!isHoppRESTRequest(requestUpdated))
|
if (!isHoppRESTRequest(requestUpdated))
|
||||||
@@ -243,6 +251,13 @@ const saveRequestAs = async () => {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
createdNow: true,
|
||||||
|
platform: "rest",
|
||||||
|
workspaceType: "personal",
|
||||||
|
})
|
||||||
|
|
||||||
requestSaved()
|
requestSaved()
|
||||||
} else if (picked.value.pickedType === "my-request") {
|
} else if (picked.value.pickedType === "my-request") {
|
||||||
if (!isHoppRESTRequest(requestUpdated))
|
if (!isHoppRESTRequest(requestUpdated))
|
||||||
@@ -264,17 +279,38 @@ const saveRequestAs = async () => {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
createdNow: false,
|
||||||
|
platform: "rest",
|
||||||
|
workspaceType: "personal",
|
||||||
|
})
|
||||||
|
|
||||||
requestSaved()
|
requestSaved()
|
||||||
} else if (picked.value.pickedType === "teams-collection") {
|
} else if (picked.value.pickedType === "teams-collection") {
|
||||||
if (!isHoppRESTRequest(requestUpdated))
|
if (!isHoppRESTRequest(requestUpdated))
|
||||||
throw new Error("requestUpdated is not a REST Request")
|
throw new Error("requestUpdated is not a REST Request")
|
||||||
|
|
||||||
updateTeamCollectionOrFolder(picked.value.collectionID, requestUpdated)
|
updateTeamCollectionOrFolder(picked.value.collectionID, requestUpdated)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
createdNow: true,
|
||||||
|
platform: "rest",
|
||||||
|
workspaceType: "team",
|
||||||
|
})
|
||||||
} else if (picked.value.pickedType === "teams-folder") {
|
} else if (picked.value.pickedType === "teams-folder") {
|
||||||
if (!isHoppRESTRequest(requestUpdated))
|
if (!isHoppRESTRequest(requestUpdated))
|
||||||
throw new Error("requestUpdated is not a REST Request")
|
throw new Error("requestUpdated is not a REST Request")
|
||||||
|
|
||||||
updateTeamCollectionOrFolder(picked.value.folderID, requestUpdated)
|
updateTeamCollectionOrFolder(picked.value.folderID, requestUpdated)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
createdNow: true,
|
||||||
|
platform: "rest",
|
||||||
|
workspaceType: "team",
|
||||||
|
})
|
||||||
} else if (picked.value.pickedType === "teams-request") {
|
} else if (picked.value.pickedType === "teams-request") {
|
||||||
if (!isHoppRESTRequest(requestUpdated))
|
if (!isHoppRESTRequest(requestUpdated))
|
||||||
throw new Error("requestUpdated is not a REST Request")
|
throw new Error("requestUpdated is not a REST Request")
|
||||||
@@ -292,6 +328,13 @@ const saveRequestAs = async () => {
|
|||||||
title: requestUpdated.name,
|
title: requestUpdated.name,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
createdNow: false,
|
||||||
|
platform: "rest",
|
||||||
|
workspaceType: "team",
|
||||||
|
})
|
||||||
|
|
||||||
pipe(
|
pipe(
|
||||||
updateTeamRequest(picked.value.requestID, data),
|
updateTeamRequest(picked.value.requestID, data),
|
||||||
TE.match(
|
TE.match(
|
||||||
@@ -313,6 +356,13 @@ const saveRequestAs = async () => {
|
|||||||
requestUpdated as HoppGQLRequest
|
requestUpdated as HoppGQLRequest
|
||||||
)
|
)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
createdNow: false,
|
||||||
|
platform: "gql",
|
||||||
|
workspaceType: "team",
|
||||||
|
})
|
||||||
|
|
||||||
requestSaved()
|
requestSaved()
|
||||||
} else if (picked.value.pickedType === "gql-my-folder") {
|
} else if (picked.value.pickedType === "gql-my-folder") {
|
||||||
// TODO: Check for GQL request ?
|
// TODO: Check for GQL request ?
|
||||||
@@ -321,6 +371,13 @@ const saveRequestAs = async () => {
|
|||||||
requestUpdated as HoppGQLRequest
|
requestUpdated as HoppGQLRequest
|
||||||
)
|
)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
createdNow: true,
|
||||||
|
platform: "gql",
|
||||||
|
workspaceType: "team",
|
||||||
|
})
|
||||||
|
|
||||||
requestSaved()
|
requestSaved()
|
||||||
} else if (picked.value.pickedType === "gql-my-collection") {
|
} else if (picked.value.pickedType === "gql-my-collection") {
|
||||||
// TODO: Check for GQL request ?
|
// TODO: Check for GQL request ?
|
||||||
@@ -329,6 +386,13 @@ const saveRequestAs = async () => {
|
|||||||
requestUpdated as HoppGQLRequest
|
requestUpdated as HoppGQLRequest
|
||||||
)
|
)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
createdNow: true,
|
||||||
|
platform: "gql",
|
||||||
|
workspaceType: "team",
|
||||||
|
})
|
||||||
|
|
||||||
requestSaved()
|
requestSaved()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex flex-col flex-1 bg-primary">
|
<div class="flex flex-col flex-1">
|
||||||
<div
|
<div
|
||||||
class="sticky z-10 flex justify-between flex-1 border-b bg-primary border-dividerLight"
|
class="sticky z-10 flex justify-between flex-1 border-b bg-primary border-dividerLight"
|
||||||
:style="
|
:style="
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import { useToast } from "@composables/toast"
|
|||||||
import { useI18n } from "@composables/i18n"
|
import { useI18n } from "@composables/i18n"
|
||||||
import { HoppGQLRequest, makeCollection } from "@hoppscotch/data"
|
import { HoppGQLRequest, makeCollection } from "@hoppscotch/data"
|
||||||
import { addGraphqlCollection } from "~/newstore/collections"
|
import { addGraphqlCollection } from "~/newstore/collections"
|
||||||
|
import { platform } from "~/platform"
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
@@ -79,6 +80,13 @@ export default defineComponent({
|
|||||||
)
|
)
|
||||||
|
|
||||||
this.hideModal()
|
this.hideModal()
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_CREATE_COLLECTION",
|
||||||
|
isRootCollection: true,
|
||||||
|
platform: "gql",
|
||||||
|
workspaceType: "personal",
|
||||||
|
})
|
||||||
},
|
},
|
||||||
hideModal() {
|
hideModal() {
|
||||||
this.name = null
|
this.name = null
|
||||||
|
|||||||
@@ -244,6 +244,14 @@ const importFromJSON = () => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
appendGraphqlCollections(collections)
|
appendGraphqlCollections(collections)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_IMPORT_COLLECTION",
|
||||||
|
importer: "json",
|
||||||
|
workspaceType: "personal",
|
||||||
|
platform: "gql",
|
||||||
|
})
|
||||||
|
|
||||||
fileImported()
|
fileImported()
|
||||||
}
|
}
|
||||||
reader.readAsText(inputChooseFileToImportFrom.value.files[0])
|
reader.readAsText(inputChooseFileToImportFrom.value.files[0])
|
||||||
@@ -257,6 +265,12 @@ const exportJSON = () => {
|
|||||||
const url = URL.createObjectURL(file)
|
const url = URL.createObjectURL(file)
|
||||||
a.href = url
|
a.href = url
|
||||||
|
|
||||||
|
platform?.analytics?.logEvent({
|
||||||
|
type: "HOPP_EXPORT_COLLECTION",
|
||||||
|
exporter: "json",
|
||||||
|
platform: "gql",
|
||||||
|
})
|
||||||
|
|
||||||
// TODO: get uri from meta
|
// TODO: get uri from meta
|
||||||
a.download = `${url.split("/").pop()!.split("#")[0].split("?")[0]}.json`
|
a.download = `${url.split("/").pop()!.split("#")[0].split("?")[0]}.json`
|
||||||
document.body.appendChild(a)
|
document.body.appendChild(a)
|
||||||
|
|||||||
@@ -153,6 +153,7 @@ import IconArchive from "~icons/lucide/archive"
|
|||||||
import { useI18n } from "@composables/i18n"
|
import { useI18n } from "@composables/i18n"
|
||||||
import { useReadonlyStream } from "@composables/stream"
|
import { useReadonlyStream } from "@composables/stream"
|
||||||
import { useColorMode } from "@composables/theming"
|
import { useColorMode } from "@composables/theming"
|
||||||
|
import { platform } from "~/platform"
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
@@ -285,6 +286,13 @@ export default defineComponent({
|
|||||||
response: "",
|
response: "",
|
||||||
})
|
})
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
platform: "gql",
|
||||||
|
createdNow: true,
|
||||||
|
workspaceType: "personal",
|
||||||
|
})
|
||||||
|
|
||||||
this.displayModalAddRequest(false)
|
this.displayModalAddRequest(false)
|
||||||
},
|
},
|
||||||
addRequest(payload) {
|
addRequest(payload) {
|
||||||
@@ -294,6 +302,14 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
onAddFolder({ name, path }) {
|
onAddFolder({ name, path }) {
|
||||||
addGraphqlFolder(name, path)
|
addGraphqlFolder(name, path)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_CREATE_COLLECTION",
|
||||||
|
isRootCollection: false,
|
||||||
|
platform: "gql",
|
||||||
|
workspaceType: "personal",
|
||||||
|
})
|
||||||
|
|
||||||
this.displayModalAddFolder(false)
|
this.displayModalAddFolder(false)
|
||||||
},
|
},
|
||||||
addFolder(payload) {
|
addFolder(payload) {
|
||||||
|
|||||||
@@ -599,11 +599,25 @@ const addNewRootCollection = (name: string) => {
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_CREATE_COLLECTION",
|
||||||
|
platform: "rest",
|
||||||
|
workspaceType: "personal",
|
||||||
|
isRootCollection: true,
|
||||||
|
})
|
||||||
|
|
||||||
displayModalAdd(false)
|
displayModalAdd(false)
|
||||||
} else if (hasTeamWriteAccess.value) {
|
} else if (hasTeamWriteAccess.value) {
|
||||||
if (!collectionsType.value.selectedTeam) return
|
if (!collectionsType.value.selectedTeam) return
|
||||||
modalLoadingState.value = true
|
modalLoadingState.value = true
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_CREATE_COLLECTION",
|
||||||
|
platform: "rest",
|
||||||
|
workspaceType: "team",
|
||||||
|
isRootCollection: true,
|
||||||
|
})
|
||||||
|
|
||||||
pipe(
|
pipe(
|
||||||
createNewRootCollection(name, collectionsType.value.selectedTeam.id),
|
createNewRootCollection(name, collectionsType.value.selectedTeam.id),
|
||||||
TE.match(
|
TE.match(
|
||||||
@@ -652,6 +666,13 @@ const onAddRequest = (requestName: string) => {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
workspaceType: "personal",
|
||||||
|
createdNow: true,
|
||||||
|
platform: "rest",
|
||||||
|
})
|
||||||
|
|
||||||
displayModalAddRequest(false)
|
displayModalAddRequest(false)
|
||||||
} else if (hasTeamWriteAccess.value) {
|
} else if (hasTeamWriteAccess.value) {
|
||||||
const folder = editingFolder.value
|
const folder = editingFolder.value
|
||||||
@@ -667,6 +688,13 @@ const onAddRequest = (requestName: string) => {
|
|||||||
title: requestName,
|
title: requestName,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
workspaceType: "team",
|
||||||
|
platform: "rest",
|
||||||
|
createdNow: true,
|
||||||
|
})
|
||||||
|
|
||||||
pipe(
|
pipe(
|
||||||
createRequestInCollection(folder.id, data),
|
createRequestInCollection(folder.id, data),
|
||||||
TE.match(
|
TE.match(
|
||||||
@@ -712,6 +740,14 @@ const onAddFolder = (folderName: string) => {
|
|||||||
if (collectionsType.value.type === "my-collections") {
|
if (collectionsType.value.type === "my-collections") {
|
||||||
if (!path) return
|
if (!path) return
|
||||||
addRESTFolder(folderName, path)
|
addRESTFolder(folderName, path)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_CREATE_COLLECTION",
|
||||||
|
workspaceType: "personal",
|
||||||
|
isRootCollection: false,
|
||||||
|
platform: "rest",
|
||||||
|
})
|
||||||
|
|
||||||
displayModalAddFolder(false)
|
displayModalAddFolder(false)
|
||||||
} else if (hasTeamWriteAccess.value) {
|
} else if (hasTeamWriteAccess.value) {
|
||||||
const folder = editingFolder.value
|
const folder = editingFolder.value
|
||||||
@@ -719,6 +755,13 @@ const onAddFolder = (folderName: string) => {
|
|||||||
|
|
||||||
modalLoadingState.value = true
|
modalLoadingState.value = true
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_CREATE_COLLECTION",
|
||||||
|
workspaceType: "personal",
|
||||||
|
isRootCollection: false,
|
||||||
|
platform: "rest",
|
||||||
|
})
|
||||||
|
|
||||||
pipe(
|
pipe(
|
||||||
createChildCollection(folderName, folder.id),
|
createChildCollection(folderName, folder.id),
|
||||||
TE.match(
|
TE.match(
|
||||||
@@ -1884,6 +1927,12 @@ const exportData = async (
|
|||||||
}
|
}
|
||||||
|
|
||||||
const exportJSONCollection = async () => {
|
const exportJSONCollection = async () => {
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_EXPORT_COLLECTION",
|
||||||
|
exporter: "json",
|
||||||
|
platform: "rest",
|
||||||
|
})
|
||||||
|
|
||||||
await getJSONCollection()
|
await getJSONCollection()
|
||||||
|
|
||||||
initializeDownloadCollection(collectionJSON.value, null)
|
initializeDownloadCollection(collectionJSON.value, null)
|
||||||
@@ -1895,6 +1944,12 @@ const createCollectionGist = async () => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_EXPORT_COLLECTION",
|
||||||
|
exporter: "gist",
|
||||||
|
platform: "rest",
|
||||||
|
})
|
||||||
|
|
||||||
creatingGistCollection.value = true
|
creatingGistCollection.value = true
|
||||||
await getJSONCollection()
|
await getJSONCollection()
|
||||||
|
|
||||||
@@ -1925,6 +1980,12 @@ const importToTeams = async (collection: HoppCollection<HoppRESTRequest>[]) => {
|
|||||||
|
|
||||||
importingMyCollections.value = true
|
importingMyCollections.value = true
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_EXPORT_COLLECTION",
|
||||||
|
exporter: "import-to-teams",
|
||||||
|
platform: "rest",
|
||||||
|
})
|
||||||
|
|
||||||
pipe(
|
pipe(
|
||||||
importJSONToTeam(
|
importJSONToTeam(
|
||||||
JSON.stringify(collection),
|
JSON.stringify(collection),
|
||||||
|
|||||||
@@ -190,6 +190,12 @@ const createEnvironmentGist = async () => {
|
|||||||
)
|
)
|
||||||
|
|
||||||
toast.success(t("export.gist_created").toString())
|
toast.success(t("export.gist_created").toString())
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_EXPORT_ENVIRONMENT",
|
||||||
|
platform: "rest",
|
||||||
|
})
|
||||||
|
|
||||||
window.open(res.data.html_url)
|
window.open(res.data.html_url)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
toast.error(t("error.something_went_wrong").toString())
|
toast.error(t("error.something_went_wrong").toString())
|
||||||
@@ -249,6 +255,13 @@ const openDialogChooseFileToImportFrom = () => {
|
|||||||
|
|
||||||
const importToTeams = async (content: Environment[]) => {
|
const importToTeams = async (content: Environment[]) => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_IMPORT_ENVIRONMENT",
|
||||||
|
platform: "rest",
|
||||||
|
workspaceType: "team",
|
||||||
|
})
|
||||||
|
|
||||||
for (const [i, env] of content.entries()) {
|
for (const [i, env] of content.entries()) {
|
||||||
if (i === content.length - 1) {
|
if (i === content.length - 1) {
|
||||||
await pipe(
|
await pipe(
|
||||||
@@ -301,6 +314,12 @@ const importFromJSON = () => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_IMPORT_ENVIRONMENT",
|
||||||
|
platform: "rest",
|
||||||
|
workspaceType: "personal",
|
||||||
|
})
|
||||||
|
|
||||||
const reader = new FileReader()
|
const reader = new FileReader()
|
||||||
|
|
||||||
reader.onload = ({ target }) => {
|
reader.onload = ({ target }) => {
|
||||||
@@ -352,6 +371,7 @@ const importFromPostman = ({
|
|||||||
const environment: Environment = { name, variables: [] }
|
const environment: Environment = { name, variables: [] }
|
||||||
values.forEach(({ key, value }) => environment.variables.push({ key, value }))
|
values.forEach(({ key, value }) => environment.variables.push({ key, value }))
|
||||||
const environments = [environment]
|
const environments = [environment]
|
||||||
|
|
||||||
importFromHoppscotch(environments)
|
importFromHoppscotch(environments)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ import { useToast } from "@composables/toast"
|
|||||||
import { useReadonlyStream } from "@composables/stream"
|
import { useReadonlyStream } from "@composables/stream"
|
||||||
import { useColorMode } from "@composables/theming"
|
import { useColorMode } from "@composables/theming"
|
||||||
import { environmentsStore } from "~/newstore/environments"
|
import { environmentsStore } from "~/newstore/environments"
|
||||||
|
import { platform } from "~/platform"
|
||||||
|
|
||||||
type EnvironmentVariable = {
|
type EnvironmentVariable = {
|
||||||
id: number
|
id: number
|
||||||
@@ -311,6 +312,11 @@ const saveEnvironment = () => {
|
|||||||
index: envList.value.length - 1,
|
index: envList.value.length - 1,
|
||||||
})
|
})
|
||||||
toast.success(`${t("environment.created")}`)
|
toast.success(`${t("environment.created")}`)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_CREATE_ENVIRONMENT",
|
||||||
|
workspaceType: "personal",
|
||||||
|
})
|
||||||
} else if (props.editingEnvironmentIndex === "Global") {
|
} else if (props.editingEnvironmentIndex === "Global") {
|
||||||
// Editing the Global environment
|
// Editing the Global environment
|
||||||
setGlobalEnvVariables(environmentUpdated.variables)
|
setGlobalEnvVariables(environmentUpdated.variables)
|
||||||
|
|||||||
@@ -156,6 +156,7 @@ import IconTrash from "~icons/lucide/trash"
|
|||||||
import IconTrash2 from "~icons/lucide/trash-2"
|
import IconTrash2 from "~icons/lucide/trash-2"
|
||||||
import IconDone from "~icons/lucide/check"
|
import IconDone from "~icons/lucide/check"
|
||||||
import IconPlus from "~icons/lucide/plus"
|
import IconPlus from "~icons/lucide/plus"
|
||||||
|
import { platform } from "~/platform"
|
||||||
|
|
||||||
type EnvironmentVariable = {
|
type EnvironmentVariable = {
|
||||||
id: number
|
id: number
|
||||||
@@ -294,6 +295,11 @@ const saveEnvironment = async () => {
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (props.action === "new") {
|
if (props.action === "new") {
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_CREATE_ENVIRONMENT",
|
||||||
|
workspaceType: "team",
|
||||||
|
})
|
||||||
|
|
||||||
await pipe(
|
await pipe(
|
||||||
createTeamEnvironment(
|
createTeamEnvironment(
|
||||||
JSON.stringify(filterdVariables),
|
JSON.stringify(filterdVariables),
|
||||||
|
|||||||
@@ -143,33 +143,51 @@
|
|||||||
<div class="flex flex-1 border-b border-dividerLight">
|
<div class="flex flex-1 border-b border-dividerLight">
|
||||||
<SmartEnvInput
|
<SmartEnvInput
|
||||||
v-model="basicUsername"
|
v-model="basicUsername"
|
||||||
|
:environment-highlights="false"
|
||||||
:placeholder="t('authorization.username')"
|
:placeholder="t('authorization.username')"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-1 border-b border-dividerLight">
|
<div class="flex flex-1 border-b border-dividerLight">
|
||||||
<SmartEnvInput
|
<SmartEnvInput
|
||||||
v-model="basicPassword"
|
v-model="basicPassword"
|
||||||
|
:environment-highlights="false"
|
||||||
:placeholder="t('authorization.password')"
|
:placeholder="t('authorization.password')"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="authType === 'bearer'">
|
<div v-if="authType === 'bearer'">
|
||||||
<div class="flex flex-1 border-b border-dividerLight">
|
<div class="flex flex-1 border-b border-dividerLight">
|
||||||
<SmartEnvInput v-model="bearerToken" placeholder="Token" />
|
<SmartEnvInput
|
||||||
|
v-model="bearerToken"
|
||||||
|
:environment-highlights="false"
|
||||||
|
placeholder="Token"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="authType === 'oauth-2'">
|
<div v-if="authType === 'oauth-2'">
|
||||||
<div class="flex flex-1 border-b border-dividerLight">
|
<div class="flex flex-1 border-b border-dividerLight">
|
||||||
<SmartEnvInput v-model="oauth2Token" placeholder="Token" />
|
<SmartEnvInput
|
||||||
|
v-model="oauth2Token"
|
||||||
|
:environment-highlights="false"
|
||||||
|
placeholder="Token"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<HttpOAuth2Authorization />
|
<HttpOAuth2Authorization />
|
||||||
</div>
|
</div>
|
||||||
<div v-if="authType === 'api-key'">
|
<div v-if="authType === 'api-key'">
|
||||||
<div class="flex flex-1 border-b border-dividerLight">
|
<div class="flex flex-1 border-b border-dividerLight">
|
||||||
<SmartEnvInput v-model="apiKey" placeholder="Key" />
|
<SmartEnvInput
|
||||||
|
v-model="apiKey"
|
||||||
|
:environment-highlights="false"
|
||||||
|
placeholder="Key"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-1 border-b border-dividerLight">
|
<div class="flex flex-1 border-b border-dividerLight">
|
||||||
<SmartEnvInput v-model="apiValue" placeholder="Value" />
|
<SmartEnvInput
|
||||||
|
v-model="apiValue"
|
||||||
|
:environment-highlights="false"
|
||||||
|
placeholder="Value"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center border-b border-dividerLight">
|
<div class="flex items-center border-b border-dividerLight">
|
||||||
<span class="flex items-center">
|
<span class="flex items-center">
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
<HoppButtonPrimary
|
<HoppButtonPrimary
|
||||||
id="get"
|
id="get"
|
||||||
name="get"
|
name="get"
|
||||||
|
:loading="isLoading"
|
||||||
:label="!connected ? t('action.connect') : t('action.disconnect')"
|
:label="!connected ? t('action.connect') : t('action.disconnect')"
|
||||||
class="w-32"
|
class="w-32"
|
||||||
@click="onConnectClick"
|
@click="onConnectClick"
|
||||||
@@ -31,7 +32,12 @@ import { GQLConnection } from "~/helpers/GQLConnection"
|
|||||||
import { getCurrentStrategyID } from "~/helpers/network"
|
import { getCurrentStrategyID } from "~/helpers/network"
|
||||||
import { useReadonlyStream, useStream } from "@composables/stream"
|
import { useReadonlyStream, useStream } from "@composables/stream"
|
||||||
import { useI18n } from "@composables/i18n"
|
import { useI18n } from "@composables/i18n"
|
||||||
import { gqlHeaders$, gqlURL$, setGQLURL } from "~/newstore/GQLSession"
|
import {
|
||||||
|
gqlAuth$,
|
||||||
|
gqlHeaders$,
|
||||||
|
gqlURL$,
|
||||||
|
setGQLURL,
|
||||||
|
} from "~/newstore/GQLSession"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
|
|
||||||
@@ -40,15 +46,21 @@ const props = defineProps<{
|
|||||||
}>()
|
}>()
|
||||||
|
|
||||||
const connected = useReadonlyStream(props.conn.connected$, false)
|
const connected = useReadonlyStream(props.conn.connected$, false)
|
||||||
|
const isLoading = useReadonlyStream(props.conn.isLoading$, false)
|
||||||
const headers = useReadonlyStream(gqlHeaders$, [])
|
const headers = useReadonlyStream(gqlHeaders$, [])
|
||||||
|
const auth = useReadonlyStream(gqlAuth$, {
|
||||||
|
authType: "none",
|
||||||
|
authActive: true,
|
||||||
|
})
|
||||||
|
|
||||||
const url = useStream(gqlURL$, "", setGQLURL)
|
const url = useStream(gqlURL$, "", setGQLURL)
|
||||||
|
|
||||||
const onConnectClick = () => {
|
const onConnectClick = () => {
|
||||||
if (!connected.value) {
|
if (!connected.value) {
|
||||||
props.conn.connect(url.value, headers.value as any)
|
props.conn.connect(url.value, headers.value as any, auth.value)
|
||||||
|
|
||||||
platform.analytics?.logHoppRequestRunToAnalytics({
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_REQUEST_RUN",
|
||||||
platform: "graphql-schema",
|
platform: "graphql-schema",
|
||||||
strategy: getCurrentStrategyID(),
|
strategy: getCurrentStrategyID(),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -748,7 +748,8 @@ const runQuery = async () => {
|
|||||||
console.error(e)
|
console.error(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
platform.analytics?.logHoppRequestRunToAnalytics({
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_REQUEST_RUN",
|
||||||
platform: "graphql-query",
|
platform: "graphql-query",
|
||||||
strategy: getCurrentStrategyID(),
|
strategy: getCurrentStrategyID(),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -72,9 +72,11 @@
|
|||||||
class="flex items-center justify-between flex-1 min-w-0 transition cursor-pointer focus:outline-none text-secondaryLight text-tiny group"
|
class="flex items-center justify-between flex-1 min-w-0 transition cursor-pointer focus:outline-none text-secondaryLight text-tiny group"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="inline-flex items-center justify-center px-4 py-2 transition group-hover:text-secondary"
|
class="inline-flex items-center justify-center px-4 py-2 transition group-hover:text-secondary truncate"
|
||||||
>
|
>
|
||||||
<icon-lucide-chevron-right class="mr-2 indicator" />
|
<icon-lucide-chevron-right
|
||||||
|
class="mr-2 indicator flex flex-shrink-0"
|
||||||
|
/>
|
||||||
<span
|
<span
|
||||||
:class="[
|
:class="[
|
||||||
{ 'capitalize-first': groupSelection === 'TIME' },
|
{ 'capitalize-first': groupSelection === 'TIME' },
|
||||||
|
|||||||
@@ -165,6 +165,7 @@ import IconCheck from "~icons/lucide/check"
|
|||||||
import IconWrapText from "~icons/lucide/wrap-text"
|
import IconWrapText from "~icons/lucide/wrap-text"
|
||||||
import { currentActiveTab } from "~/helpers/rest/tab"
|
import { currentActiveTab } from "~/helpers/rest/tab"
|
||||||
import cloneDeep from "lodash-es/cloneDeep"
|
import cloneDeep from "lodash-es/cloneDeep"
|
||||||
|
import { platform } from "~/platform"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
|
|
||||||
@@ -248,6 +249,10 @@ watch(
|
|||||||
(goingToShow) => {
|
(goingToShow) => {
|
||||||
if (goingToShow) {
|
if (goingToShow) {
|
||||||
request.value = cloneDeep(currentActiveTab.value.document.request)
|
request.value = cloneDeep(currentActiveTab.value.document.request)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_REST_CODEGEN_OPENED",
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -338,7 +338,7 @@ watch(workingHeaders, (headersList) => {
|
|||||||
|
|
||||||
// Sync logic between headers and working/bulk headers
|
// Sync logic between headers and working/bulk headers
|
||||||
watch(
|
watch(
|
||||||
request.value.headers,
|
() => request.value.headers,
|
||||||
(newHeadersList) => {
|
(newHeadersList) => {
|
||||||
// Sync should overwrite working headers
|
// Sync should overwrite working headers
|
||||||
const filteredWorkingHeaders = pipe(
|
const filteredWorkingHeaders = pipe(
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ import IconClipboard from "~icons/lucide/clipboard"
|
|||||||
import IconCheck from "~icons/lucide/check"
|
import IconCheck from "~icons/lucide/check"
|
||||||
import IconTrash2 from "~icons/lucide/trash-2"
|
import IconTrash2 from "~icons/lucide/trash-2"
|
||||||
import { currentActiveTab } from "~/helpers/rest/tab"
|
import { currentActiveTab } from "~/helpers/rest/tab"
|
||||||
|
import { platform } from "~/platform"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
|
|
||||||
@@ -144,6 +145,10 @@ const handleImport = () => {
|
|||||||
try {
|
try {
|
||||||
const req = parseCurlToHoppRESTReq(text)
|
const req = parseCurlToHoppRESTReq(text)
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_REST_IMPORT_CURL",
|
||||||
|
})
|
||||||
|
|
||||||
currentActiveTab.value.document.request = req
|
currentActiveTab.value.document.request = req
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e)
|
console.error(e)
|
||||||
|
|||||||
@@ -324,7 +324,8 @@ const newSendRequest = async () => {
|
|||||||
loading.value = true
|
loading.value = true
|
||||||
|
|
||||||
// Log the request run into analytics
|
// Log the request run into analytics
|
||||||
platform.analytics?.logHoppRequestRunToAnalytics({
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_REQUEST_RUN",
|
||||||
platform: "rest",
|
platform: "rest",
|
||||||
strategy: getCurrentStrategyID(),
|
strategy: getCurrentStrategyID(),
|
||||||
})
|
})
|
||||||
@@ -446,6 +447,11 @@ const copyRequest = async () => {
|
|||||||
shareLink.value = ""
|
shareLink.value = ""
|
||||||
fetchingShareLink.value = true
|
fetchingShareLink.value = true
|
||||||
const shortcodeResult = await createShortcode(tab.value.document.request)()
|
const shortcodeResult = await createShortcode(tab.value.document.request)()
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SHORTCODE_CREATED",
|
||||||
|
})
|
||||||
|
|
||||||
if (E.isLeft(shortcodeResult)) {
|
if (E.isLeft(shortcodeResult)) {
|
||||||
toast.error(`${shortcodeResult.left.error}`)
|
toast.error(`${shortcodeResult.left.error}`)
|
||||||
shareLink.value = `${t("error.something_went_wrong")}`
|
shareLink.value = `${t("error.something_went_wrong")}`
|
||||||
@@ -516,6 +522,14 @@ const saveRequest = () => {
|
|||||||
editRESTRequest(saveCtx.folderPath, saveCtx.requestIndex, req)
|
editRESTRequest(saveCtx.folderPath, saveCtx.requestIndex, req)
|
||||||
|
|
||||||
tab.value.document.isDirty = false
|
tab.value.document.isDirty = false
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
platform: "rest",
|
||||||
|
createdNow: false,
|
||||||
|
workspaceType: "personal",
|
||||||
|
})
|
||||||
|
|
||||||
toast.success(`${t("request.saved")}`)
|
toast.success(`${t("request.saved")}`)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
tab.value.document.saveContext = undefined
|
tab.value.document.saveContext = undefined
|
||||||
@@ -526,6 +540,13 @@ const saveRequest = () => {
|
|||||||
|
|
||||||
// TODO: handle error case (NOTE: overwriteRequestTeams is async)
|
// TODO: handle error case (NOTE: overwriteRequestTeams is async)
|
||||||
try {
|
try {
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SAVE_REQUEST",
|
||||||
|
platform: "rest",
|
||||||
|
createdNow: false,
|
||||||
|
workspaceType: "team",
|
||||||
|
})
|
||||||
|
|
||||||
runMutation(UpdateRequestDocument, {
|
runMutation(UpdateRequestDocument, {
|
||||||
requestID: saveCtx.requestID,
|
requestID: saveCtx.requestID,
|
||||||
data: {
|
data: {
|
||||||
|
|||||||
@@ -54,7 +54,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useI18n } from "@composables/i18n"
|
import { useI18n } from "@composables/i18n"
|
||||||
import { HoppRESTRequest } from "@hoppscotch/data"
|
import { HoppRESTRequest } from "@hoppscotch/data"
|
||||||
import { computed, ref, watch } from "vue"
|
import { useVModel } from "@vueuse/core"
|
||||||
|
import { computed, ref } from "vue"
|
||||||
|
|
||||||
export type RequestOptionTabs =
|
export type RequestOptionTabs =
|
||||||
| "params"
|
| "params"
|
||||||
@@ -70,15 +71,7 @@ const emit = defineEmits<{
|
|||||||
(e: "update:modelValue", value: HoppRESTRequest): void
|
(e: "update:modelValue", value: HoppRESTRequest): void
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
const request = ref(props.modelValue)
|
const request = useVModel(props, "modelValue", emit)
|
||||||
|
|
||||||
watch(
|
|
||||||
() => request.value,
|
|
||||||
(newVal) => {
|
|
||||||
emit("update:modelValue", newVal)
|
|
||||||
},
|
|
||||||
{ deep: true }
|
|
||||||
)
|
|
||||||
|
|
||||||
const selectedRealtimeTab = ref<RequestOptionTabs>("params")
|
const selectedRealtimeTab = ref<RequestOptionTabs>("params")
|
||||||
|
|
||||||
|
|||||||
@@ -28,9 +28,11 @@
|
|||||||
class="flex items-center justify-between flex-1 min-w-0 transition cursor-pointer focus:outline-none text-secondaryLight text-tiny group"
|
class="flex items-center justify-between flex-1 min-w-0 transition cursor-pointer focus:outline-none text-secondaryLight text-tiny group"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="inline-flex items-center justify-center px-4 py-2 transition group-hover:text-secondary"
|
class="inline-flex items-center justify-center px-4 py-2 transition group-hover:text-secondary truncate"
|
||||||
>
|
>
|
||||||
<icon-lucide-chevron-right class="mr-2 indicator" />
|
<icon-lucide-chevron-right
|
||||||
|
class="mr-2 indicator flex flex-shrink-0"
|
||||||
|
/>
|
||||||
<span class="truncate capitalize-first">
|
<span class="truncate capitalize-first">
|
||||||
{{ t("environment.title") }}
|
{{ t("environment.title") }}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ const props = withDefaults(
|
|||||||
envs?: { key: string; value: string; source: string }[] | null
|
envs?: { key: string; value: string; source: string }[] | null
|
||||||
focus?: boolean
|
focus?: boolean
|
||||||
selectTextOnMount?: boolean
|
selectTextOnMount?: boolean
|
||||||
|
environmentHighlights?: boolean
|
||||||
readonly?: boolean
|
readonly?: boolean
|
||||||
}>(),
|
}>(),
|
||||||
{
|
{
|
||||||
@@ -53,6 +54,7 @@ const props = withDefaults(
|
|||||||
envs: null,
|
envs: null,
|
||||||
focus: false,
|
focus: false,
|
||||||
readonly: false,
|
readonly: false,
|
||||||
|
environmentHighlights: true,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -142,7 +144,7 @@ const initView = (el: any) => {
|
|||||||
tooltips({
|
tooltips({
|
||||||
position: "absolute",
|
position: "absolute",
|
||||||
}),
|
}),
|
||||||
envTooltipPlugin,
|
props.environmentHighlights ? envTooltipPlugin : [],
|
||||||
placeholderExt(props.placeholder),
|
placeholderExt(props.placeholder),
|
||||||
EditorView.domEventHandlers({
|
EditorView.domEventHandlers({
|
||||||
paste(ev) {
|
paste(ev) {
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ import { createTeam } from "~/helpers/backend/mutations/Team"
|
|||||||
import { TeamNameCodec } from "~/helpers/backend/types/TeamName"
|
import { TeamNameCodec } from "~/helpers/backend/types/TeamName"
|
||||||
import { useI18n } from "@composables/i18n"
|
import { useI18n } from "@composables/i18n"
|
||||||
import { useToast } from "@composables/toast"
|
import { useToast } from "@composables/toast"
|
||||||
|
import { platform } from "~/platform"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
|
|
||||||
@@ -68,6 +69,12 @@ const addNewTeam = async () => {
|
|||||||
TE.fromEither,
|
TE.fromEither,
|
||||||
TE.mapLeft(() => "invalid_name" as const),
|
TE.mapLeft(() => "invalid_name" as const),
|
||||||
TE.chainW(createTeam),
|
TE.chainW(createTeam),
|
||||||
|
TE.chainFirstIOK(
|
||||||
|
() => () =>
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_CREATE_TEAM",
|
||||||
|
})
|
||||||
|
),
|
||||||
TE.match(
|
TE.match(
|
||||||
(err) => {
|
(err) => {
|
||||||
// err is of type "invalid_name" | GQLError<Err>
|
// err is of type "invalid_name" | GQLError<Err>
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ export class GQLConnection {
|
|||||||
|
|
||||||
private timeoutSubscription: any
|
private timeoutSubscription: any
|
||||||
|
|
||||||
public connect(url: string, headers: GQLHeader[]) {
|
public connect(url: string, headers: GQLHeader[], auth: HoppGQLAuth) {
|
||||||
if (this.connected$.value) {
|
if (this.connected$.value) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"A connection is already running. Close it before starting another."
|
"A connection is already running. Close it before starting another."
|
||||||
@@ -110,7 +110,7 @@ export class GQLConnection {
|
|||||||
this.connected$.next(true)
|
this.connected$.next(true)
|
||||||
|
|
||||||
const poll = async () => {
|
const poll = async () => {
|
||||||
await this.getSchema(url, headers)
|
await this.getSchema(url, headers, auth)
|
||||||
this.timeoutSubscription = setTimeout(() => {
|
this.timeoutSubscription = setTimeout(() => {
|
||||||
poll()
|
poll()
|
||||||
}, GQL_SCHEMA_POLL_INTERVAL)
|
}, GQL_SCHEMA_POLL_INTERVAL)
|
||||||
@@ -135,7 +135,11 @@ export class GQLConnection {
|
|||||||
this.schema$.next(null)
|
this.schema$.next(null)
|
||||||
}
|
}
|
||||||
|
|
||||||
private async getSchema(url: string, headers: GQLHeader[]) {
|
private async getSchema(
|
||||||
|
url: string,
|
||||||
|
reqHeaders: GQLHeader[],
|
||||||
|
auth: HoppGQLAuth
|
||||||
|
) {
|
||||||
try {
|
try {
|
||||||
this.isLoading$.next(true)
|
this.isLoading$.next(true)
|
||||||
|
|
||||||
@@ -143,10 +147,38 @@ export class GQLConnection {
|
|||||||
query: getIntrospectionQuery(),
|
query: getIntrospectionQuery(),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const headers = reqHeaders.filter((x) => x.active && x.key !== "")
|
||||||
|
|
||||||
|
// TODO: Support a better b64 implementation than btoa ?
|
||||||
|
if (auth.authType === "basic") {
|
||||||
|
const username = auth.username
|
||||||
|
const password = auth.password
|
||||||
|
|
||||||
|
headers.push({
|
||||||
|
active: true,
|
||||||
|
key: "Authorization",
|
||||||
|
value: `Basic ${btoa(`${username}:${password}`)}`,
|
||||||
|
})
|
||||||
|
} else if (auth.authType === "bearer" || auth.authType === "oauth-2") {
|
||||||
|
headers.push({
|
||||||
|
active: true,
|
||||||
|
key: "Authorization",
|
||||||
|
value: `Bearer ${auth.token}`,
|
||||||
|
})
|
||||||
|
} else if (auth.authType === "api-key") {
|
||||||
|
const { key, value, addTo } = auth
|
||||||
|
|
||||||
|
if (addTo === "Headers") {
|
||||||
|
headers.push({
|
||||||
|
active: true,
|
||||||
|
key,
|
||||||
|
value,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const finalHeaders: Record<string, string> = {}
|
const finalHeaders: Record<string, string> = {}
|
||||||
headers
|
headers.forEach((x) => (finalHeaders[x.key] = x.value))
|
||||||
.filter((x) => x.active && x.key !== "")
|
|
||||||
.forEach((x) => (finalHeaders[x.key] = x.value))
|
|
||||||
|
|
||||||
const reqOptions = {
|
const reqOptions = {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
|
|||||||
@@ -71,9 +71,11 @@ const parseURL = (urlText: string | number) =>
|
|||||||
* @returns URL object
|
* @returns URL object
|
||||||
*/
|
*/
|
||||||
export function getURLObject(parsedArguments: parser.Arguments) {
|
export function getURLObject(parsedArguments: parser.Arguments) {
|
||||||
|
const location = parsedArguments.location ?? undefined
|
||||||
|
|
||||||
return pipe(
|
return pipe(
|
||||||
// contains raw url strings
|
// contains raw url strings
|
||||||
parsedArguments._.slice(1),
|
[...parsedArguments._.slice(1), location],
|
||||||
A.findFirstMap(parseURL),
|
A.findFirstMap(parseURL),
|
||||||
// no url found
|
// no url found
|
||||||
O.getOrElse(() => new URL(defaultRESTReq.endpoint))
|
O.getOrElse(() => new URL(defaultRESTReq.endpoint))
|
||||||
|
|||||||
@@ -105,7 +105,8 @@ export class MQTTConnection {
|
|||||||
this.handleError(e)
|
this.handleError(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
platform.analytics?.logHoppRequestRunToAnalytics({
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_REQUEST_RUN",
|
||||||
platform: "mqtt",
|
platform: "mqtt",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,7 +113,8 @@ export class SIOConnection {
|
|||||||
this.handleError(error, "CONNECTION")
|
this.handleError(error, "CONNECTION")
|
||||||
}
|
}
|
||||||
|
|
||||||
platform.analytics?.logHoppRequestRunToAnalytics({
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_REQUEST_RUN",
|
||||||
platform: "socketio",
|
platform: "socketio",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,8 @@ export class SSEConnection {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
platform.analytics?.logHoppRequestRunToAnalytics({
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_REQUEST_RUN",
|
||||||
platform: "sse",
|
platform: "sse",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,8 @@ export class WSConnection {
|
|||||||
this.handleError(error as SyntaxError)
|
this.handleError(error as SyntaxError)
|
||||||
}
|
}
|
||||||
|
|
||||||
platform.analytics?.logHoppRequestRunToAnalytics({
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_REQUEST_RUN",
|
||||||
platform: "wss",
|
platform: "wss",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { refWithControl } from "@vueuse/core"
|
|||||||
import { HoppRESTResponse } from "../types/HoppRESTResponse"
|
import { HoppRESTResponse } from "../types/HoppRESTResponse"
|
||||||
import { getDefaultRESTRequest } from "./default"
|
import { getDefaultRESTRequest } from "./default"
|
||||||
import { HoppTestResult } from "../types/HoppTestResult"
|
import { HoppTestResult } from "../types/HoppTestResult"
|
||||||
|
import { platform } from "~/platform"
|
||||||
|
|
||||||
export type HoppRESTTab = {
|
export type HoppRESTTab = {
|
||||||
id: string
|
id: string
|
||||||
@@ -147,6 +148,10 @@ export function createNewTab(document: HoppRESTDocument, switchToIt = true) {
|
|||||||
currentTabID.value = id
|
currentTabID.value = id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_REST_NEW_TAB_OPENED",
|
||||||
|
})
|
||||||
|
|
||||||
return tab
|
return tab
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -275,7 +275,4 @@ export const gqlResponse$ = gqlSessionStore.subject$.pipe(
|
|||||||
distinctUntilChanged()
|
distinctUntilChanged()
|
||||||
)
|
)
|
||||||
|
|
||||||
export const gqlAuth$ = gqlSessionStore.subject$.pipe(
|
export const gqlAuth$ = gqlSessionStore.subject$.pipe(pluck("request", "auth"))
|
||||||
pluck("request", "auth"),
|
|
||||||
distinctUntilChanged()
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ import {
|
|||||||
loadTabsFromPersistedState,
|
loadTabsFromPersistedState,
|
||||||
persistableTabState,
|
persistableTabState,
|
||||||
} from "~/helpers/rest/tab"
|
} from "~/helpers/rest/tab"
|
||||||
|
import { debounceTime } from "rxjs"
|
||||||
|
import { gqlSessionStore, setGQLSession } from "./GQLSession"
|
||||||
|
|
||||||
function checkAndMigrateOldSettings() {
|
function checkAndMigrateOldSettings() {
|
||||||
if (window.localStorage.getItem("selectedEnvIndex")) {
|
if (window.localStorage.getItem("selectedEnvIndex")) {
|
||||||
@@ -333,12 +335,35 @@ export function setupRESTTabsPersistence() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// temporary persistence for GQL session
|
||||||
|
export function setupGQLPersistence() {
|
||||||
|
try {
|
||||||
|
const state = window.localStorage.getItem("gqlState")
|
||||||
|
if (state) {
|
||||||
|
const data = JSON.parse(state)
|
||||||
|
data["schema"] = ""
|
||||||
|
data["response"] = ""
|
||||||
|
setGQLSession(data)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(
|
||||||
|
`Failed parsing persisted GraphQL state, state:`,
|
||||||
|
window.localStorage.getItem("gqlState")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
gqlSessionStore.subject$.pipe(debounceTime(500)).subscribe((state) => {
|
||||||
|
window.localStorage.setItem("gqlState", JSON.stringify(state))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function setupLocalPersistence() {
|
export function setupLocalPersistence() {
|
||||||
checkAndMigrateOldSettings()
|
checkAndMigrateOldSettings()
|
||||||
|
|
||||||
setupLocalStatePersistence()
|
setupLocalStatePersistence()
|
||||||
setupSettingsPersistence()
|
setupSettingsPersistence()
|
||||||
setupRESTTabsPersistence()
|
setupRESTTabsPersistence()
|
||||||
|
setupGQLPersistence()
|
||||||
setupHistoryPersistence()
|
setupHistoryPersistence()
|
||||||
setupCollectionsPersistence()
|
setupCollectionsPersistence()
|
||||||
setupGlobalEnvsPersistence()
|
setupGlobalEnvsPersistence()
|
||||||
|
|||||||
@@ -14,12 +14,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onBeforeUnmount, watch } from "vue"
|
|
||||||
import { useReadonlyStream } from "@composables/stream"
|
|
||||||
import { useI18n } from "@composables/i18n"
|
|
||||||
import { usePageHead } from "@composables/head"
|
import { usePageHead } from "@composables/head"
|
||||||
import { startPageProgress, completePageProgress } from "@modules/loadingbar"
|
import { useI18n } from "@composables/i18n"
|
||||||
import { GQLConnection } from "@helpers/GQLConnection"
|
import { GQLConnection } from "@helpers/GQLConnection"
|
||||||
|
import { computed, onBeforeUnmount } from "vue"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
|
|
||||||
@@ -28,16 +26,10 @@ usePageHead({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const gqlConn = new GQLConnection()
|
const gqlConn = new GQLConnection()
|
||||||
const isLoading = useReadonlyStream(gqlConn.isLoading$, false)
|
|
||||||
|
|
||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
if (gqlConn.connected$.value) {
|
if (gqlConn.connected$.value) {
|
||||||
gqlConn.disconnect()
|
gqlConn.disconnect()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
watch(isLoading, () => {
|
|
||||||
if (isLoading.value) startPageProgress()
|
|
||||||
else completePageProgress()
|
|
||||||
})
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ import IconHome from "~icons/lucide/home"
|
|||||||
import IconRefreshCW from "~icons/lucide/refresh-cw"
|
import IconRefreshCW from "~icons/lucide/refresh-cw"
|
||||||
import { createNewTab } from "~/helpers/rest/tab"
|
import { createNewTab } from "~/helpers/rest/tab"
|
||||||
import { getDefaultRESTRequest } from "~/helpers/rest/default"
|
import { getDefaultRESTRequest } from "~/helpers/rest/default"
|
||||||
|
import { platform } from "~/platform"
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
@@ -120,6 +121,10 @@ const addRequestToTab = () => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
platform.analytics?.logEvent({
|
||||||
|
type: "HOPP_SHORTCODE_RESOLVED",
|
||||||
|
})
|
||||||
|
|
||||||
const request: unknown = JSON.parse(data.right.shortcode?.request as string)
|
const request: unknown = JSON.parse(data.right.shortcode?.request as string)
|
||||||
|
|
||||||
createNewTab({
|
createNewTab({
|
||||||
|
|||||||
@@ -5,8 +5,50 @@ export type HoppRequestEvent =
|
|||||||
}
|
}
|
||||||
| { platform: "wss" | "sse" | "socketio" | "mqtt" }
|
| { platform: "wss" | "sse" | "socketio" | "mqtt" }
|
||||||
|
|
||||||
|
export type AnalyticsEvent =
|
||||||
|
| ({ type: "HOPP_REQUEST_RUN" } & HoppRequestEvent)
|
||||||
|
| {
|
||||||
|
type: "HOPP_CREATE_ENVIRONMENT"
|
||||||
|
workspaceType: "personal" | "team"
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: "HOPP_CREATE_COLLECTION"
|
||||||
|
platform: "rest" | "gql"
|
||||||
|
isRootCollection: boolean
|
||||||
|
workspaceType: "personal" | "team"
|
||||||
|
}
|
||||||
|
| { type: "HOPP_CREATE_TEAM" }
|
||||||
|
| {
|
||||||
|
type: "HOPP_SAVE_REQUEST"
|
||||||
|
createdNow: boolean
|
||||||
|
workspaceType: "personal" | "team"
|
||||||
|
platform: "rest" | "gql"
|
||||||
|
}
|
||||||
|
| { type: "HOPP_SHORTCODE_CREATED" }
|
||||||
|
| { type: "HOPP_SHORTCODE_RESOLVED" }
|
||||||
|
| { type: "HOPP_REST_NEW_TAB_OPENED" }
|
||||||
|
| {
|
||||||
|
type: "HOPP_IMPORT_COLLECTION"
|
||||||
|
importer: string
|
||||||
|
workspaceType: "personal" | "team"
|
||||||
|
platform: "rest" | "gql"
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: "HOPP_IMPORT_ENVIRONMENT"
|
||||||
|
workspaceType: "personal" | "team"
|
||||||
|
platform: "rest" | "gql"
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: "HOPP_EXPORT_COLLECTION"
|
||||||
|
exporter: string
|
||||||
|
platform: "rest" | "gql"
|
||||||
|
}
|
||||||
|
| { type: "HOPP_EXPORT_ENVIRONMENT"; platform: "rest" | "gql" }
|
||||||
|
| { type: "HOPP_REST_CODEGEN_OPENED" }
|
||||||
|
| { type: "HOPP_REST_IMPORT_CURL" }
|
||||||
|
|
||||||
export type AnalyticsPlatformDef = {
|
export type AnalyticsPlatformDef = {
|
||||||
initAnalytics: () => void
|
initAnalytics: () => void
|
||||||
logHoppRequestRunToAnalytics: (ev: HoppRequestEvent) => void
|
logEvent: (ev: AnalyticsEvent) => void
|
||||||
logPageView: (pagePath: string) => void
|
logPageView: (pagePath: string) => void
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@hoppscotch/selfhost-web",
|
"name": "@hoppscotch/selfhost-web",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "2023.4.6",
|
"version": "2023.4.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev:vite": "vite",
|
"dev:vite": "vite",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "hoppscotch-sh-admin",
|
"name": "hoppscotch-sh-admin",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "2023.4.6",
|
"version": "2023.4.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "pnpm exec npm-run-all -p -l dev:*",
|
"dev": "pnpm exec npm-run-all -p -l dev:*",
|
||||||
|
|||||||
@@ -383,7 +383,7 @@ export const auth = {
|
|||||||
await this.signInWithEmailLink(deviceIdentifier, window.location.href);
|
await this.signInWithEmailLink(deviceIdentifier, window.location.href);
|
||||||
|
|
||||||
removeLocalConfig('deviceIdentifier');
|
removeLocalConfig('deviceIdentifier');
|
||||||
window.location.href = '/';
|
window.location.href = import.meta.env.VITE_ADMIN_URL;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user