Merge branch 'main' into auth/pm-8111/browser-refresh-login-component
This commit is contained in:
commit
743d94df58
|
@ -72,7 +72,7 @@
|
||||||
"message": "Organisation beitreten"
|
"message": "Organisation beitreten"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "$ORGANIZATIONNAME$ beitreten",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -1418,10 +1418,10 @@
|
||||||
"message": "Vorschläge zum Auto-Ausfüllen in Formularfeldern anzeigen"
|
"message": "Vorschläge zum Auto-Ausfüllen in Formularfeldern anzeigen"
|
||||||
},
|
},
|
||||||
"showInlineMenuIdentitiesLabel": {
|
"showInlineMenuIdentitiesLabel": {
|
||||||
"message": "Display identities as suggestions"
|
"message": "Zeige Identitäten als Vorschläge"
|
||||||
},
|
},
|
||||||
"showInlineMenuCardsLabel": {
|
"showInlineMenuCardsLabel": {
|
||||||
"message": "Display cards as suggestions"
|
"message": "Zeige Karten als Vorschläge"
|
||||||
},
|
},
|
||||||
"showInlineMenuOnIconSelectionLabel": {
|
"showInlineMenuOnIconSelectionLabel": {
|
||||||
"message": "Vorschläge anzeigen, wenn Symbol ausgewählt ist"
|
"message": "Vorschläge anzeigen, wenn Symbol ausgewählt ist"
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
"message": "Συμμετοχή στον οργανισμό"
|
"message": "Συμμετοχή στον οργανισμό"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "Συμμετοχή στο $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
"message": "Liity organisaatioon"
|
"message": "Liity organisaatioon"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "Liity organisaatioon $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -1418,10 +1418,10 @@
|
||||||
"message": "Näytä automaattitäytön ehdotukset lomakekentissä"
|
"message": "Näytä automaattitäytön ehdotukset lomakekentissä"
|
||||||
},
|
},
|
||||||
"showInlineMenuIdentitiesLabel": {
|
"showInlineMenuIdentitiesLabel": {
|
||||||
"message": "Display identities as suggestions"
|
"message": "Näytä identiteetit ehdotuksina"
|
||||||
},
|
},
|
||||||
"showInlineMenuCardsLabel": {
|
"showInlineMenuCardsLabel": {
|
||||||
"message": "Display cards as suggestions"
|
"message": "Näytä kortit ehdotuksina"
|
||||||
},
|
},
|
||||||
"showInlineMenuOnIconSelectionLabel": {
|
"showInlineMenuOnIconSelectionLabel": {
|
||||||
"message": "Näytä ehdotukset kun kuvaketta painetaan"
|
"message": "Näytä ehdotukset kun kuvaketta painetaan"
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
"message": "Join organization"
|
"message": "Join organization"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "הצטרפות אל $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
|
|
@ -156,13 +156,13 @@
|
||||||
"message": "Riempimento automatico"
|
"message": "Riempimento automatico"
|
||||||
},
|
},
|
||||||
"autoFillLogin": {
|
"autoFillLogin": {
|
||||||
"message": "Autocompletamento login"
|
"message": "Riempi automaticamente login"
|
||||||
},
|
},
|
||||||
"autoFillCard": {
|
"autoFillCard": {
|
||||||
"message": "Autocompletamento carta"
|
"message": "Riempi automaticamente carta"
|
||||||
},
|
},
|
||||||
"autoFillIdentity": {
|
"autoFillIdentity": {
|
||||||
"message": "Autocompletamento identità"
|
"message": "Riempi automaticamente identità"
|
||||||
},
|
},
|
||||||
"generatePasswordCopied": {
|
"generatePasswordCopied": {
|
||||||
"message": "Genera password e copiala"
|
"message": "Genera password e copiala"
|
||||||
|
@ -216,7 +216,7 @@
|
||||||
"message": "Enter your account email address and your password hint will be sent to you"
|
"message": "Enter your account email address and your password hint will be sent to you"
|
||||||
},
|
},
|
||||||
"passwordHint": {
|
"passwordHint": {
|
||||||
"message": "Suggerimento password"
|
"message": "Suggerimento per la password"
|
||||||
},
|
},
|
||||||
"enterEmailToGetHint": {
|
"enterEmailToGetHint": {
|
||||||
"message": "Inserisci l'indirizzo email del tuo account per ricevere il suggerimento per la password principale."
|
"message": "Inserisci l'indirizzo email del tuo account per ricevere il suggerimento per la password principale."
|
||||||
|
@ -791,10 +791,10 @@
|
||||||
"message": "Rendi la 2FA facile"
|
"message": "Rendi la 2FA facile"
|
||||||
},
|
},
|
||||||
"totpHelper": {
|
"totpHelper": {
|
||||||
"message": "Bitwarden può memorizzare e autocompletare codici di verifica 2FA. Copia e incolla la chiave in questo campo."
|
"message": "Bitwarden può memorizzare e riempire automaticamente i codici di verifica 2FA. Copia e incolla la chiave in questo campo."
|
||||||
},
|
},
|
||||||
"totpHelperWithCapture": {
|
"totpHelperWithCapture": {
|
||||||
"message": "Bitwarden può memorizzare e autocompletare codici di verifica 2FA. Selezionare l'icona della fotocamera per creare uno screenshot del codice QR dell'autenticatore di questo sito web, oppure copia e incolla la chiave in questo campo."
|
"message": "Bitwarden può memorizzare e riempire automaticamente i codici di verifica 2FA. Selezionare l'icona della fotocamera per creare uno screenshot del codice QR dell'autenticatore di questo sito web, oppure copia e incolla la chiave in questo campo."
|
||||||
},
|
},
|
||||||
"learnMoreAboutAuthenticators": {
|
"learnMoreAboutAuthenticators": {
|
||||||
"message": "Ulteriori informazioni sugli autenticatori"
|
"message": "Ulteriori informazioni sugli autenticatori"
|
||||||
|
@ -953,7 +953,7 @@
|
||||||
"message": "Mostra le carte nella sezione Scheda"
|
"message": "Mostra le carte nella sezione Scheda"
|
||||||
},
|
},
|
||||||
"showCardsCurrentTabDesc": {
|
"showCardsCurrentTabDesc": {
|
||||||
"message": "Mostra le carte nella sezione Scheda per un riempimento automatico più facile."
|
"message": "Mostra le carte nella sezione Scheda per riempirle automaticamente."
|
||||||
},
|
},
|
||||||
"showIdentitiesInVaultView": {
|
"showIdentitiesInVaultView": {
|
||||||
"message": "Mostra le identità come suggerimenti di riempimento automatico nella vista cassaforte"
|
"message": "Mostra le identità come suggerimenti di riempimento automatico nella vista cassaforte"
|
||||||
|
@ -1451,13 +1451,13 @@
|
||||||
"message": "Riempi automaticamente al caricamento della pagina"
|
"message": "Riempi automaticamente al caricamento della pagina"
|
||||||
},
|
},
|
||||||
"enableAutoFillOnPageLoad": {
|
"enableAutoFillOnPageLoad": {
|
||||||
"message": "Abilita l'auto-completamento al caricamento della pagina"
|
"message": "Riempi automaticamente al caricamento della pagina"
|
||||||
},
|
},
|
||||||
"enableAutoFillOnPageLoadDesc": {
|
"enableAutoFillOnPageLoadDesc": {
|
||||||
"message": "Se sono rilevati campi di login, riempili automaticamente quando la pagina si carica."
|
"message": "Se sono rilevati campi di login, riempili automaticamente quando la pagina si carica."
|
||||||
},
|
},
|
||||||
"autofillOnPageLoadWarning": {
|
"autofillOnPageLoadWarning": {
|
||||||
"message": "$OPENTAG$Attenzione:$CLOSETAG$ Siti Web compromessi o non attendibili possono sfruttare l'auto-riempimento al caricamento della pagina.",
|
"message": "$OPENTAG$Attenzione:$CLOSETAG$ Siti Web compromessi o non attendibili possono sfruttare il riempimento automatico al caricamento della pagina.",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"openTag": {
|
"openTag": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -2795,7 +2795,7 @@
|
||||||
"message": "La tua sessione è scaduta. Torna indietro e prova ad accedere di nuovo."
|
"message": "La tua sessione è scaduta. Torna indietro e prova ad accedere di nuovo."
|
||||||
},
|
},
|
||||||
"exportingPersonalVaultTitle": {
|
"exportingPersonalVaultTitle": {
|
||||||
"message": "Esportazione cassaforte personale"
|
"message": "Esportando cassaforte individuale"
|
||||||
},
|
},
|
||||||
"exportingIndividualVaultDescription": {
|
"exportingIndividualVaultDescription": {
|
||||||
"message": "Solo gli elementi della cassaforte personale associati a $EMAIL$ saranno esportati. Gli elementi della cassaforte dell'organizzazione non saranno inclusi. Solo le informazioni sugli elementi della cassaforte saranno esportate e non includeranno gli allegati.",
|
"message": "Solo gli elementi della cassaforte personale associati a $EMAIL$ saranno esportati. Gli elementi della cassaforte dell'organizzazione non saranno inclusi. Solo le informazioni sugli elementi della cassaforte saranno esportate e non includeranno gli allegati.",
|
||||||
|
@ -3010,7 +3010,7 @@
|
||||||
"message": "per ritornare alle impostazioni preconfigurate"
|
"message": "per ritornare alle impostazioni preconfigurate"
|
||||||
},
|
},
|
||||||
"serverVersion": {
|
"serverVersion": {
|
||||||
"message": "Versione Server"
|
"message": "Versione server"
|
||||||
},
|
},
|
||||||
"selfHostedServer": {
|
"selfHostedServer": {
|
||||||
"message": "self-hosted"
|
"message": "self-hosted"
|
||||||
|
@ -3106,7 +3106,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autofillPageLoadPolicyActivated": {
|
"autofillPageLoadPolicyActivated": {
|
||||||
"message": "Le politiche della tua organizzazione hanno abilitato l'autocompletamento al caricamento della pagina."
|
"message": "Le politiche della tua organizzazione hanno abilitato il riempimento automatico al caricamento della pagina."
|
||||||
},
|
},
|
||||||
"howToAutofill": {
|
"howToAutofill": {
|
||||||
"message": "Come riempire automaticamente"
|
"message": "Come riempire automaticamente"
|
||||||
|
@ -3130,22 +3130,22 @@
|
||||||
"message": "Impostazioni di riempimento automatico"
|
"message": "Impostazioni di riempimento automatico"
|
||||||
},
|
},
|
||||||
"autofillKeyboardShortcutSectionTitle": {
|
"autofillKeyboardShortcutSectionTitle": {
|
||||||
"message": "Scorciatoia auto-riempimento"
|
"message": "Scorciatoia del riempimento automatico"
|
||||||
},
|
},
|
||||||
"autofillKeyboardShortcutUpdateLabel": {
|
"autofillKeyboardShortcutUpdateLabel": {
|
||||||
"message": "Cambia scorciatoia"
|
"message": "Cambia scorciatoia"
|
||||||
},
|
},
|
||||||
"autofillKeyboardManagerShortcutsLabel": {
|
"autofillKeyboardManagerShortcutsLabel": {
|
||||||
"message": "Gestisci scorciatoia"
|
"message": "Gestisci scorciatoie"
|
||||||
},
|
},
|
||||||
"autofillShortcut": {
|
"autofillShortcut": {
|
||||||
"message": "Scorciatoia da tastiera per riempire automaticamente"
|
"message": "Scorciatoia da tastiera per riempire automaticamente"
|
||||||
},
|
},
|
||||||
"autofillLoginShortcutNotSet": {
|
"autofillLoginShortcutNotSet": {
|
||||||
"message": "Non è stata impostata nessuna scorciatoia per il riempimento automatico. Cambiala nelle impostazioni del browser."
|
"message": "Non è stata impostata nessuna scorciatoia per il riempimento automatico. Aggiungila dalle impostazioni del browser."
|
||||||
},
|
},
|
||||||
"autofillLoginShortcutText": {
|
"autofillLoginShortcutText": {
|
||||||
"message": "La scorciatoia per l'auto-riempimento è $COMMAND$.\nGestisci tutte le scorciatoie dalle impostazioni del browser.",
|
"message": "La scorciatoia per il riempimento automatico è $COMMAND$. Gestisci tutte le scorciatoie dalle impostazioni del browser.",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"command": {
|
"command": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -3946,7 +3946,7 @@
|
||||||
"message": "Suggerimenti per il riempimento automatico"
|
"message": "Suggerimenti per il riempimento automatico"
|
||||||
},
|
},
|
||||||
"autofillSuggestionsTip": {
|
"autofillSuggestionsTip": {
|
||||||
"message": "Salva un elemento login per questo sito da riempire automaticamente"
|
"message": "Salva un elemento di accesso per questo sito da riempire automaticamente"
|
||||||
},
|
},
|
||||||
"yourVaultIsEmpty": {
|
"yourVaultIsEmpty": {
|
||||||
"message": "La tua cassaforte è vuota"
|
"message": "La tua cassaforte è vuota"
|
||||||
|
@ -4343,7 +4343,7 @@
|
||||||
"message": "Usa le caselle di controllo se vuoi riempire automaticamente la casella di controllo di un modulo, come una email da ricordare"
|
"message": "Usa le caselle di controllo se vuoi riempire automaticamente la casella di controllo di un modulo, come una email da ricordare"
|
||||||
},
|
},
|
||||||
"linkedHelpText": {
|
"linkedHelpText": {
|
||||||
"message": "Utilizzare un campo collegato quando si verificano problemi di riempimento automatico per un sito web specifico."
|
"message": "Usa un campo collegato quando si verificano problemi di riempimento automatico per un sito web specifico."
|
||||||
},
|
},
|
||||||
"linkedLabelHelpText": {
|
"linkedLabelHelpText": {
|
||||||
"message": "Inserisci l'id html del campo, il nome, l'aria-label o il segnaposto."
|
"message": "Inserisci l'id html del campo, il nome, l'aria-label o il segnaposto."
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -72,7 +72,7 @@
|
||||||
"message": "Придружи Организацију"
|
"message": "Придружи Организацију"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "Придружити се $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -1418,10 +1418,10 @@
|
||||||
"message": "Прикажи предлоге за ауто-попуњавање у пољима обрасца"
|
"message": "Прикажи предлоге за ауто-попуњавање у пољима обрасца"
|
||||||
},
|
},
|
||||||
"showInlineMenuIdentitiesLabel": {
|
"showInlineMenuIdentitiesLabel": {
|
||||||
"message": "Display identities as suggestions"
|
"message": "Приказати идентитете као предлоге"
|
||||||
},
|
},
|
||||||
"showInlineMenuCardsLabel": {
|
"showInlineMenuCardsLabel": {
|
||||||
"message": "Display cards as suggestions"
|
"message": "Приказати картице као предлоге"
|
||||||
},
|
},
|
||||||
"showInlineMenuOnIconSelectionLabel": {
|
"showInlineMenuOnIconSelectionLabel": {
|
||||||
"message": "Приказати предлоге када је изабрана икона"
|
"message": "Приказати предлоге када је изабрана икона"
|
||||||
|
@ -2663,7 +2663,7 @@
|
||||||
"description": "Used as a card title description on the set password page to explain why the user is there"
|
"description": "Used as a card title description on the set password page to explain why the user is there"
|
||||||
},
|
},
|
||||||
"cardMetrics": {
|
"cardMetrics": {
|
||||||
"message": "out of $TOTAL$",
|
"message": "од $TOTAL$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"total": {
|
"total": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
"message": "Приєднатися до організації"
|
"message": "Приєднатися до організації"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "Приєднатися до $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -1418,10 +1418,10 @@
|
||||||
"message": "Пропозиції автозаповнення на полях форм"
|
"message": "Пропозиції автозаповнення на полях форм"
|
||||||
},
|
},
|
||||||
"showInlineMenuIdentitiesLabel": {
|
"showInlineMenuIdentitiesLabel": {
|
||||||
"message": "Display identities as suggestions"
|
"message": "Показувати посвідчення як пропозиції"
|
||||||
},
|
},
|
||||||
"showInlineMenuCardsLabel": {
|
"showInlineMenuCardsLabel": {
|
||||||
"message": "Display cards as suggestions"
|
"message": "Показувати картки як пропозиції"
|
||||||
},
|
},
|
||||||
"showInlineMenuOnIconSelectionLabel": {
|
"showInlineMenuOnIconSelectionLabel": {
|
||||||
"message": "Показувати пропозиції, якщо вибрано піктограму"
|
"message": "Показувати пропозиції, якщо вибрано піктограму"
|
||||||
|
|
|
@ -49,17 +49,22 @@
|
||||||
<!-- Display when no matching ciphers exist -->
|
<!-- Display when no matching ciphers exist -->
|
||||||
<ng-container *ngIf="!displayedCiphers.length">
|
<ng-container *ngIf="!displayedCiphers.length">
|
||||||
<bit-no-items class="tw-text-main" [icon]="noResultsIcon">
|
<bit-no-items class="tw-text-main" [icon]="noResultsIcon">
|
||||||
<ng-container slot="title">{{ "noMatchingLoginsForSite" | i18n }}</ng-container>
|
<ng-container slot="title">{{
|
||||||
<ng-container slot="description">{{ "searchSavePasskeyNewLogin" | i18n }}</ng-container>
|
(hasSearched ? "noItemsMatchSearch" : "noMatchingLoginsForSite") | i18n
|
||||||
|
}}</ng-container>
|
||||||
|
<ng-container slot="description">{{
|
||||||
|
(hasSearched ? "searchSavePasskeyNewLogin" : "clearFiltersOrTryAnother") | i18n
|
||||||
|
}}</ng-container>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
bitButton
|
bitButton
|
||||||
buttonType="primary"
|
buttonType="primary"
|
||||||
slot="button"
|
slot="button"
|
||||||
type="button"
|
type="button"
|
||||||
(click)="saveNewLogin()"
|
(click)="hasSearched ? clearSearch() : saveNewLogin()"
|
||||||
[loading]="loading"
|
[loading]="loading"
|
||||||
>
|
>
|
||||||
{{ "savePasskeyNewLogin" | i18n }}
|
{{ (hasSearched ? "multiSelectClearAll" : "savePasskeyNewLogin") | i18n }}
|
||||||
</button>
|
</button>
|
||||||
</bit-no-items>
|
</bit-no-items>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@ -100,17 +105,22 @@
|
||||||
<!-- Display when no matching ciphers exist -->
|
<!-- Display when no matching ciphers exist -->
|
||||||
<ng-container *ngIf="!displayedCiphers.length">
|
<ng-container *ngIf="!displayedCiphers.length">
|
||||||
<bit-no-items class="tw-text-main" [icon]="noResultsIcon">
|
<bit-no-items class="tw-text-main" [icon]="noResultsIcon">
|
||||||
<ng-container slot="title">{{ "noItemsMatchSearch" | i18n }}</ng-container>
|
<ng-container slot="title">{{
|
||||||
<ng-container slot="description">{{ "clearFiltersOrTryAnother" | i18n }}</ng-container>
|
(hasSearched ? "noItemsMatchSearch" : "noMatchingLoginsForSite") | i18n
|
||||||
|
}}</ng-container>
|
||||||
|
<ng-container slot="description">{{
|
||||||
|
(hasSearched ? "searchSavePasskeyNewLogin" : "clearFiltersOrTryAnother") | i18n
|
||||||
|
}}</ng-container>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
bitButton
|
bitButton
|
||||||
buttonType="primary"
|
buttonType="primary"
|
||||||
slot="button"
|
slot="button"
|
||||||
type="button"
|
type="button"
|
||||||
(click)="saveNewLogin()"
|
(click)="hasSearched ? clearSearch() : saveNewLogin()"
|
||||||
[loading]="loading"
|
[loading]="loading"
|
||||||
>
|
>
|
||||||
{{ "savePasskeyNewLogin" | i18n }}
|
{{ (hasSearched ? "multiSelectClearAll" : "savePasskeyNewLogin") | i18n }}
|
||||||
</button>
|
</button>
|
||||||
</bit-no-items>
|
</bit-no-items>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
|
@ -91,7 +91,6 @@ interface ViewData {
|
||||||
export class Fido2Component implements OnInit, OnDestroy {
|
export class Fido2Component implements OnInit, OnDestroy {
|
||||||
private destroy$ = new Subject<void>();
|
private destroy$ = new Subject<void>();
|
||||||
private message$ = new BehaviorSubject<BrowserFido2Message>(null);
|
private message$ = new BehaviorSubject<BrowserFido2Message>(null);
|
||||||
private hasSearched = false;
|
|
||||||
protected BrowserFido2MessageTypes = BrowserFido2MessageTypes;
|
protected BrowserFido2MessageTypes = BrowserFido2MessageTypes;
|
||||||
protected cipher: CipherView;
|
protected cipher: CipherView;
|
||||||
protected ciphers?: CipherView[] = [];
|
protected ciphers?: CipherView[] = [];
|
||||||
|
@ -104,6 +103,7 @@ export class Fido2Component implements OnInit, OnDestroy {
|
||||||
protected noResultsIcon = Icons.NoResults;
|
protected noResultsIcon = Icons.NoResults;
|
||||||
protected passkeyAction: PasskeyActionValue = PasskeyActions.Register;
|
protected passkeyAction: PasskeyActionValue = PasskeyActions.Register;
|
||||||
protected PasskeyActions = PasskeyActions;
|
protected PasskeyActions = PasskeyActions;
|
||||||
|
protected hasSearched = false;
|
||||||
protected searchText: string;
|
protected searchText: string;
|
||||||
protected searchTypeSearch = false;
|
protected searchTypeSearch = false;
|
||||||
protected senderTabId?: string;
|
protected senderTabId?: string;
|
||||||
|
@ -370,19 +370,30 @@ export class Fido2Component implements OnInit, OnDestroy {
|
||||||
return this.equivalentDomains;
|
return this.equivalentDomains;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async clearSearch() {
|
||||||
|
this.searchText = "";
|
||||||
|
await this.setDisplayedCiphersToAllDomainMatch();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async setDisplayedCiphersToAllDomainMatch() {
|
||||||
|
const equivalentDomains = await this.getEquivalentDomains();
|
||||||
|
this.displayedCiphers = this.ciphers.filter((cipher) =>
|
||||||
|
cipher.login.matchesUri(this.url, equivalentDomains),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
protected async search() {
|
protected async search() {
|
||||||
this.hasSearched = await this.searchService.isSearchable(this.searchText);
|
this.hasSearched = true;
|
||||||
if (this.hasSearched) {
|
const isSearchable = await this.searchService.isSearchable(this.searchText);
|
||||||
|
|
||||||
|
if (isSearchable) {
|
||||||
this.displayedCiphers = await this.searchService.searchCiphers(
|
this.displayedCiphers = await this.searchService.searchCiphers(
|
||||||
this.searchText,
|
this.searchText,
|
||||||
null,
|
null,
|
||||||
this.ciphers,
|
this.ciphers,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
const equivalentDomains = await this.getEquivalentDomains();
|
await this.setDisplayedCiphersToAllDomainMatch();
|
||||||
this.displayedCiphers = this.ciphers.filter((cipher) =>
|
|
||||||
cipher.login.matchesUri(this.url, equivalentDomains),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,8 +41,19 @@
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-footer" *ngIf="accountSwitcherEnabled && canOverrideBrowserAutofillSetting">
|
<div class="box-footer" *ngIf="accountSwitcherEnabled || !canOverrideBrowserAutofillSetting">
|
||||||
{{ "showInlineMenuOnFormFieldsDescAlt" | i18n }}
|
<span *ngIf="accountSwitcherEnabled">{{ "showInlineMenuOnFormFieldsDescAlt" | i18n }}</span>
|
||||||
|
<span *ngIf="!canOverrideBrowserAutofillSetting">
|
||||||
|
{{ "turnOffBrowserBuiltInPasswordManagerSettings" | i18n }}
|
||||||
|
<a
|
||||||
|
[attr.href]="disablePasswordManagerLink"
|
||||||
|
(click)="openDisablePasswordManagerLink($event)"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
>
|
||||||
|
{{ "turnOffBrowserBuiltInPasswordManagerSettingsLink" | i18n }}
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -86,7 +97,7 @@
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-footer">
|
<div class="box-footer" *ngIf="canOverrideBrowserAutofillSetting">
|
||||||
<span *ngIf="accountSwitcherEnabled">{{ "showInlineMenuOnFormFieldsDescAlt" | i18n }}</span>
|
<span *ngIf="accountSwitcherEnabled">{{ "showInlineMenuOnFormFieldsDescAlt" | i18n }}</span>
|
||||||
{{ "turnOffBrowserBuiltInPasswordManagerSettings" | i18n }}
|
{{ "turnOffBrowserBuiltInPasswordManagerSettings" | i18n }}
|
||||||
<a
|
<a
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<h2 bitTypography="h6">{{ "autofillSuggestionsSectionTitle" | i18n }}</h2>
|
<h2 bitTypography="h6">{{ "autofillSuggestionsSectionTitle" | i18n }}</h2>
|
||||||
</bit-section-header>
|
</bit-section-header>
|
||||||
<bit-card>
|
<bit-card>
|
||||||
<bit-form-control>
|
<bit-form-control [disableMargin]="!enableInlineMenu && !canOverrideBrowserAutofillSetting">
|
||||||
<input
|
<input
|
||||||
bitCheckbox
|
bitCheckbox
|
||||||
id="show-inline-menu"
|
id="show-inline-menu"
|
||||||
|
@ -26,6 +26,22 @@
|
||||||
>
|
>
|
||||||
{{ "showInlineMenuOnFormFieldsDescAlt" | i18n }}
|
{{ "showInlineMenuOnFormFieldsDescAlt" | i18n }}
|
||||||
</bit-hint>
|
</bit-hint>
|
||||||
|
<bit-hint
|
||||||
|
*ngIf="!canOverrideBrowserAutofillSetting"
|
||||||
|
[class]="!enableInlineMenu ? 'tw-text-sm tw-mb-6' : 'tw-text-sm'"
|
||||||
|
>
|
||||||
|
{{ "turnOffBrowserBuiltInPasswordManagerSettings" | i18n }}
|
||||||
|
<a
|
||||||
|
bitLink
|
||||||
|
class="tw-no-underline"
|
||||||
|
rel="noreferrer"
|
||||||
|
target="_blank"
|
||||||
|
(click)="openURI($event, disablePasswordManagerURI)"
|
||||||
|
[attr.href]="disablePasswordManagerURI"
|
||||||
|
>
|
||||||
|
{{ "turnOffBrowserBuiltInPasswordManagerSettingsLink" | i18n }}
|
||||||
|
</a>
|
||||||
|
</bit-hint>
|
||||||
</bit-form-control>
|
</bit-form-control>
|
||||||
<bit-form-control
|
<bit-form-control
|
||||||
*ngIf="inlineMenuPositioningImprovementsEnabled && enableInlineMenu"
|
*ngIf="inlineMenuPositioningImprovementsEnabled && enableInlineMenu"
|
||||||
|
@ -68,19 +84,6 @@
|
||||||
<bit-label for="show-autofill-suggestions-on-icon">
|
<bit-label for="show-autofill-suggestions-on-icon">
|
||||||
{{ "showInlineMenuOnIconSelectionLabel" | i18n }}
|
{{ "showInlineMenuOnIconSelectionLabel" | i18n }}
|
||||||
</bit-label>
|
</bit-label>
|
||||||
<bit-hint class="tw-text-sm" *ngIf="!canOverrideBrowserAutofillSetting">
|
|
||||||
{{ "turnOffBrowserBuiltInPasswordManagerSettings" | i18n }}
|
|
||||||
<a
|
|
||||||
bitLink
|
|
||||||
class="tw-no-underline"
|
|
||||||
rel="noreferrer"
|
|
||||||
target="_blank"
|
|
||||||
(click)="openURI($event, disablePasswordManagerURI)"
|
|
||||||
[attr.href]="disablePasswordManagerURI"
|
|
||||||
>
|
|
||||||
{{ "turnOffBrowserBuiltInPasswordManagerSettingsLink" | i18n }}
|
|
||||||
</a>
|
|
||||||
</bit-hint>
|
|
||||||
</bit-form-control>
|
</bit-form-control>
|
||||||
<bit-form-control *ngIf="canOverrideBrowserAutofillSetting">
|
<bit-form-control *ngIf="canOverrideBrowserAutofillSetting">
|
||||||
<input
|
<input
|
||||||
|
|
|
@ -104,6 +104,7 @@ import { ViewComponent } from "../vault/popup/components/vault/view.component";
|
||||||
import { AddEditV2Component } from "../vault/popup/components/vault-v2/add-edit/add-edit-v2.component";
|
import { AddEditV2Component } from "../vault/popup/components/vault-v2/add-edit/add-edit-v2.component";
|
||||||
import { AssignCollections } from "../vault/popup/components/vault-v2/assign-collections/assign-collections.component";
|
import { AssignCollections } from "../vault/popup/components/vault-v2/assign-collections/assign-collections.component";
|
||||||
import { AttachmentsV2Component } from "../vault/popup/components/vault-v2/attachments/attachments-v2.component";
|
import { AttachmentsV2Component } from "../vault/popup/components/vault-v2/attachments/attachments-v2.component";
|
||||||
|
import { PasswordHistoryV2Component } from "../vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component";
|
||||||
import { ViewV2Component } from "../vault/popup/components/vault-v2/view-v2/view-v2.component";
|
import { ViewV2Component } from "../vault/popup/components/vault-v2/view-v2/view-v2.component";
|
||||||
import { AppearanceV2Component } from "../vault/popup/settings/appearance-v2.component";
|
import { AppearanceV2Component } from "../vault/popup/settings/appearance-v2.component";
|
||||||
import { AppearanceComponent } from "../vault/popup/settings/appearance.component";
|
import { AppearanceComponent } from "../vault/popup/settings/appearance.component";
|
||||||
|
@ -257,12 +258,11 @@ const routes: Routes = [
|
||||||
canActivate: [authGuard],
|
canActivate: [authGuard],
|
||||||
data: { state: "view-cipher" } satisfies RouteDataProperties,
|
data: { state: "view-cipher" } satisfies RouteDataProperties,
|
||||||
}),
|
}),
|
||||||
{
|
...extensionRefreshSwap(PasswordHistoryComponent, PasswordHistoryV2Component, {
|
||||||
path: "cipher-password-history",
|
path: "cipher-password-history",
|
||||||
component: PasswordHistoryComponent,
|
|
||||||
canActivate: [authGuard],
|
canActivate: [authGuard],
|
||||||
data: { state: "cipher-password-history" } satisfies RouteDataProperties,
|
data: { state: "cipher-password-history" } satisfies RouteDataProperties,
|
||||||
},
|
}),
|
||||||
...extensionRefreshSwap(AddEditComponent, AddEditV2Component, {
|
...extensionRefreshSwap(AddEditComponent, AddEditV2Component, {
|
||||||
path: "add-cipher",
|
path: "add-cipher",
|
||||||
canActivate: [authGuard, debounceNavigationGuard()],
|
canActivate: [authGuard, debounceNavigationGuard()],
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
<popup-page>
|
||||||
|
<popup-header slot="header" pageTitle="{{ 'passwordHistory' | i18n }}" showBackButton>
|
||||||
|
<ng-container slot="end">
|
||||||
|
<app-pop-out></app-pop-out>
|
||||||
|
</ng-container>
|
||||||
|
</popup-header>
|
||||||
|
<vault-password-history-view *ngIf="cipherId" [cipherId]="cipherId" />
|
||||||
|
</popup-page>
|
|
@ -0,0 +1,56 @@
|
||||||
|
import { ComponentFixture, TestBed } from "@angular/core/testing";
|
||||||
|
import { ActivatedRoute } from "@angular/router";
|
||||||
|
import { mock } from "jest-mock-extended";
|
||||||
|
import { Subject } from "rxjs";
|
||||||
|
|
||||||
|
import { WINDOW } from "@bitwarden/angular/services/injection-tokens";
|
||||||
|
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
|
||||||
|
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
||||||
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
|
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||||
|
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||||
|
|
||||||
|
import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service";
|
||||||
|
|
||||||
|
import { PasswordHistoryV2Component } from "./vault-password-history-v2.component";
|
||||||
|
|
||||||
|
describe("PasswordHistoryV2Component", () => {
|
||||||
|
let component: PasswordHistoryV2Component;
|
||||||
|
let fixture: ComponentFixture<PasswordHistoryV2Component>;
|
||||||
|
const params$ = new Subject();
|
||||||
|
const back = jest.fn().mockResolvedValue(undefined);
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
back.mockClear();
|
||||||
|
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
imports: [PasswordHistoryV2Component],
|
||||||
|
providers: [
|
||||||
|
{ provide: WINDOW, useValue: window },
|
||||||
|
{ provide: PlatformUtilsService, useValue: mock<PlatformUtilsService>() },
|
||||||
|
{ provide: ConfigService, useValue: mock<ConfigService>() },
|
||||||
|
{ provide: CipherService, useValue: mock<CipherService>() },
|
||||||
|
{ provide: AccountService, useValue: mock<AccountService>() },
|
||||||
|
{ provide: PopupRouterCacheService, useValue: { back } },
|
||||||
|
{ provide: ActivatedRoute, useValue: { queryParams: params$ } },
|
||||||
|
{ provide: I18nService, useValue: { t: (key: string) => key } },
|
||||||
|
],
|
||||||
|
}).compileComponents();
|
||||||
|
|
||||||
|
fixture = TestBed.createComponent(PasswordHistoryV2Component);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("sets the cipherId from the params", () => {
|
||||||
|
params$.next({ cipherId: "444-33-33-1111" });
|
||||||
|
|
||||||
|
expect(component["cipherId"]).toBe("444-33-33-1111");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("navigates back when a cipherId is not in the params", () => {
|
||||||
|
params$.next({});
|
||||||
|
|
||||||
|
expect(back).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,50 @@
|
||||||
|
import { NgIf } from "@angular/common";
|
||||||
|
import { Component, OnInit } from "@angular/core";
|
||||||
|
import { ActivatedRoute } from "@angular/router";
|
||||||
|
import { first } from "rxjs/operators";
|
||||||
|
|
||||||
|
import { JslibModule } from "@bitwarden/angular/jslib.module";
|
||||||
|
import { CipherId } from "@bitwarden/common/types/guid";
|
||||||
|
|
||||||
|
import { PasswordHistoryViewComponent } from "../../../../../../../../libs/vault/src/components/password-history-view/password-history-view.component";
|
||||||
|
import { PopOutComponent } from "../../../../../platform/popup/components/pop-out.component";
|
||||||
|
import { PopupHeaderComponent } from "../../../../../platform/popup/layout/popup-header.component";
|
||||||
|
import { PopupPageComponent } from "../../../../../platform/popup/layout/popup-page.component";
|
||||||
|
import { PopupRouterCacheService } from "../../../../../platform/popup/view-cache/popup-router-cache.service";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
standalone: true,
|
||||||
|
selector: "vault-password-history-v2",
|
||||||
|
templateUrl: "vault-password-history-v2.component.html",
|
||||||
|
imports: [
|
||||||
|
JslibModule,
|
||||||
|
PopupPageComponent,
|
||||||
|
PopOutComponent,
|
||||||
|
PopupHeaderComponent,
|
||||||
|
PasswordHistoryViewComponent,
|
||||||
|
NgIf,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
export class PasswordHistoryV2Component implements OnInit {
|
||||||
|
protected cipherId: CipherId;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private browserRouterHistory: PopupRouterCacheService,
|
||||||
|
private route: ActivatedRoute,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
|
||||||
|
this.route.queryParams.pipe(first()).subscribe((params) => {
|
||||||
|
if (params.cipherId) {
|
||||||
|
this.cipherId = params.cipherId;
|
||||||
|
} else {
|
||||||
|
this.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
close() {
|
||||||
|
void this.browserRouterHistory.back();
|
||||||
|
}
|
||||||
|
}
|
|
@ -178,7 +178,7 @@ Le soluzioni di gestione delle credenziali crittografate end-to-end di Bitwarden
|
||||||
<value>Gestisci tutte le tue password e i tuoi login da una cassaforte sicura</value>
|
<value>Gestisci tutte le tue password e i tuoi login da una cassaforte sicura</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ScreenshotAutofill" xml:space="preserve">
|
<data name="ScreenshotAutofill" xml:space="preserve">
|
||||||
<value>Riempi velocemente le tue credenziali di accesso in qualunque sito che visiti</value>
|
<value>Riempi velocemente le tue credenziali di accesso in qualunque sito visitato</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ScreenshotMenu" xml:space="preserve">
|
<data name="ScreenshotMenu" xml:space="preserve">
|
||||||
<value>La tua cassaforte è facilmente accessibile dal menu contestuale (tasto destro del mouse)</value>
|
<value>La tua cassaforte è facilmente accessibile dal menu contestuale (tasto destro del mouse)</value>
|
||||||
|
|
|
@ -603,7 +603,7 @@
|
||||||
"message": "Organisation beitreten"
|
"message": "Organisation beitreten"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "$ORGANIZATIONNAME$ beitreten",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
"message": "Φίλτρα"
|
"message": "Φίλτρα"
|
||||||
},
|
},
|
||||||
"allItems": {
|
"allItems": {
|
||||||
"message": "Όλα τα αντικείμενα"
|
"message": "Όλα τα στοιχεία"
|
||||||
},
|
},
|
||||||
"favorites": {
|
"favorites": {
|
||||||
"message": "Αγαπημένα"
|
"message": "Αγαπημένα"
|
||||||
|
@ -603,7 +603,7 @@
|
||||||
"message": "Συμμετοχή σε οργανισμό"
|
"message": "Συμμετοχή σε οργανισμό"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "Συμμετοχή στο $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
|
|
@ -603,7 +603,7 @@
|
||||||
"message": "Liity organisaatioon"
|
"message": "Liity organisaatioon"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "Liity organisaatioon $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
|
|
@ -600,10 +600,10 @@
|
||||||
"message": "Master password hint"
|
"message": "Master password hint"
|
||||||
},
|
},
|
||||||
"joinOrganization": {
|
"joinOrganization": {
|
||||||
"message": "Join organization"
|
"message": "הצטרפות לארגון"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "הצטרפות אל $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -603,7 +603,7 @@
|
||||||
"message": "Придружи Организацију"
|
"message": "Придружи Организацију"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "Придружити се $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -1762,7 +1762,7 @@
|
||||||
"description": "Used as a card title description on the set password page to explain why the user is there"
|
"description": "Used as a card title description on the set password page to explain why the user is there"
|
||||||
},
|
},
|
||||||
"cardMetrics": {
|
"cardMetrics": {
|
||||||
"message": "out of $TOTAL$",
|
"message": "од $TOTAL$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"total": {
|
"total": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
|
|
@ -3,6 +3,9 @@
|
||||||
<bit-tab label="Raw Data">
|
<bit-tab label="Raw Data">
|
||||||
<tools-password-health></tools-password-health>
|
<tools-password-health></tools-password-health>
|
||||||
</bit-tab>
|
</bit-tab>
|
||||||
|
<bit-tab label="Raw Data + members">
|
||||||
|
<tools-password-health-members></tools-password-health-members>
|
||||||
|
</bit-tab>
|
||||||
<!-- <bit-tab label="{{ 'allApplicationsWithCount' | i18n: apps.length }}">
|
<!-- <bit-tab label="{{ 'allApplicationsWithCount' | i18n: apps.length }}">
|
||||||
<h2 bitTypography="h2">{{ "allApplications" | i18n }}</h2>
|
<h2 bitTypography="h2">{{ "allApplications" | i18n }}</h2>
|
||||||
<tools-application-table></tools-application-table>
|
<tools-application-table></tools-application-table>
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { HeaderModule } from "../../layouts/header/header.module";
|
||||||
|
|
||||||
import { ApplicationTableComponent } from "./application-table.component";
|
import { ApplicationTableComponent } from "./application-table.component";
|
||||||
import { NotifiedMembersTableComponent } from "./notified-members-table.component";
|
import { NotifiedMembersTableComponent } from "./notified-members-table.component";
|
||||||
|
import { PasswordHealthMembersComponent } from "./password-health-members.component";
|
||||||
import { PasswordHealthComponent } from "./password-health.component";
|
import { PasswordHealthComponent } from "./password-health.component";
|
||||||
|
|
||||||
export enum AccessIntelligenceTabType {
|
export enum AccessIntelligenceTabType {
|
||||||
|
@ -28,6 +29,7 @@ export enum AccessIntelligenceTabType {
|
||||||
JslibModule,
|
JslibModule,
|
||||||
HeaderModule,
|
HeaderModule,
|
||||||
PasswordHealthComponent,
|
PasswordHealthComponent,
|
||||||
|
PasswordHealthMembersComponent,
|
||||||
NotifiedMembersTableComponent,
|
NotifiedMembersTableComponent,
|
||||||
TabsModule,
|
TabsModule,
|
||||||
],
|
],
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
<bit-container>
|
||||||
|
<p>{{ "passwordsReportDesc" | i18n }}</p>
|
||||||
|
<div *ngIf="loading">
|
||||||
|
<i
|
||||||
|
class="bwi bwi-spinner bwi-spin tw-text-muted"
|
||||||
|
title="{{ 'loading' | i18n }}"
|
||||||
|
aria-hidden="true"
|
||||||
|
></i>
|
||||||
|
<span class="tw-sr-only">{{ "loading" | i18n }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="tw-mt-4" *ngIf="!loading">
|
||||||
|
<bit-table [dataSource]="dataSource">
|
||||||
|
<ng-container header>
|
||||||
|
<tr bitRow>
|
||||||
|
<th bitCell></th>
|
||||||
|
<th bitCell bitSortable="name">{{ "name" | i18n }}</th>
|
||||||
|
<th bitCell class="tw-text-right">{{ "weakness" | i18n }}</th>
|
||||||
|
<th bitCell class="tw-text-right">{{ "timesReused" | i18n }}</th>
|
||||||
|
<th bitCell class="tw-text-right">{{ "timesExposed" | i18n }}</th>
|
||||||
|
<th bitCell class="tw-text-right">{{ "totalMembers" | i18n }}</th>
|
||||||
|
</tr>
|
||||||
|
</ng-container>
|
||||||
|
<ng-template body let-rows$>
|
||||||
|
<tr bitRow *ngFor="let r of rows$ | async">
|
||||||
|
<td bitCell>
|
||||||
|
<app-vault-icon [cipher]="r"></app-vault-icon>
|
||||||
|
</td>
|
||||||
|
<td bitCell>
|
||||||
|
<ng-container>
|
||||||
|
<span>{{ r.name }}</span>
|
||||||
|
</ng-container>
|
||||||
|
<br />
|
||||||
|
<small>{{ r.subTitle }}</small>
|
||||||
|
</td>
|
||||||
|
<td bitCell class="tw-text-right">
|
||||||
|
<span
|
||||||
|
bitBadge
|
||||||
|
*ngIf="passwordStrengthMap.has(r.id)"
|
||||||
|
[variant]="passwordStrengthMap.get(r.id)[1]"
|
||||||
|
>
|
||||||
|
{{ passwordStrengthMap.get(r.id)[0] | i18n }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td bitCell class="tw-text-right">
|
||||||
|
<span bitBadge *ngIf="passwordUseMap.has(r.login.password)" variant="warning">
|
||||||
|
{{ "reusedXTimes" | i18n: passwordUseMap.get(r.login.password) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td bitCell class="tw-text-right">
|
||||||
|
<span bitBadge *ngIf="exposedPasswordMap.has(r.id)" variant="warning">
|
||||||
|
{{ "exposedXTimes" | i18n: exposedPasswordMap.get(r.id) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td bitCell class="tw-text-right" data-testid="total-membership">
|
||||||
|
{{ totalMembersMap.get(r.id) || 0 }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</ng-template>
|
||||||
|
</bit-table>
|
||||||
|
</div>
|
||||||
|
</bit-container>
|
|
@ -0,0 +1,233 @@
|
||||||
|
import { CommonModule } from "@angular/common";
|
||||||
|
import { Component, DestroyRef, inject, OnInit } from "@angular/core";
|
||||||
|
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
|
||||||
|
import { ActivatedRoute } from "@angular/router";
|
||||||
|
import { from, map, switchMap, tap } from "rxjs";
|
||||||
|
|
||||||
|
import { JslibModule } from "@bitwarden/angular/jslib.module";
|
||||||
|
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
|
||||||
|
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
|
||||||
|
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
|
||||||
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
|
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
||||||
|
import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength";
|
||||||
|
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||||
|
import { CipherType } from "@bitwarden/common/vault/enums";
|
||||||
|
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
|
||||||
|
import {
|
||||||
|
BadgeModule,
|
||||||
|
BadgeVariant,
|
||||||
|
ContainerComponent,
|
||||||
|
TableDataSource,
|
||||||
|
TableModule,
|
||||||
|
} from "@bitwarden/components";
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-restricted-imports
|
||||||
|
import { HeaderModule } from "../../layouts/header/header.module";
|
||||||
|
// eslint-disable-next-line no-restricted-imports
|
||||||
|
import { OrganizationBadgeModule } from "../../vault/individual-vault/organization-badge/organization-badge.module";
|
||||||
|
// eslint-disable-next-line no-restricted-imports
|
||||||
|
import { PipesModule } from "../../vault/individual-vault/pipes/pipes.module";
|
||||||
|
// eslint-disable-next-line no-restricted-imports
|
||||||
|
import { cipherData } from "../reports/pages/reports-ciphers.mock";
|
||||||
|
|
||||||
|
import { userData } from "./password-health.mock";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
standalone: true,
|
||||||
|
selector: "tools-password-health-members",
|
||||||
|
templateUrl: "password-health-members.component.html",
|
||||||
|
imports: [
|
||||||
|
BadgeModule,
|
||||||
|
OrganizationBadgeModule,
|
||||||
|
CommonModule,
|
||||||
|
ContainerComponent,
|
||||||
|
PipesModule,
|
||||||
|
JslibModule,
|
||||||
|
HeaderModule,
|
||||||
|
TableModule,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
export class PasswordHealthMembersComponent implements OnInit {
|
||||||
|
passwordStrengthMap = new Map<string, [string, BadgeVariant]>();
|
||||||
|
|
||||||
|
weakPasswordCiphers: CipherView[] = [];
|
||||||
|
|
||||||
|
passwordUseMap = new Map<string, number>();
|
||||||
|
|
||||||
|
exposedPasswordMap = new Map<string, number>();
|
||||||
|
|
||||||
|
dataSource = new TableDataSource<CipherView>();
|
||||||
|
|
||||||
|
totalMembersMap = new Map<string, number>();
|
||||||
|
|
||||||
|
reportCiphers: CipherView[] = [];
|
||||||
|
reportCipherIds: string[] = [];
|
||||||
|
|
||||||
|
organization: Organization;
|
||||||
|
|
||||||
|
loading = true;
|
||||||
|
|
||||||
|
private destroyRef = inject(DestroyRef);
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
protected cipherService: CipherService,
|
||||||
|
protected passwordStrengthService: PasswordStrengthServiceAbstraction,
|
||||||
|
protected organizationService: OrganizationService,
|
||||||
|
protected auditService: AuditService,
|
||||||
|
protected i18nService: I18nService,
|
||||||
|
protected activatedRoute: ActivatedRoute,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.activatedRoute.paramMap
|
||||||
|
.pipe(
|
||||||
|
takeUntilDestroyed(this.destroyRef),
|
||||||
|
map((params) => params.get("organizationId")),
|
||||||
|
switchMap((organizationId) => {
|
||||||
|
return from(this.organizationService.get(organizationId));
|
||||||
|
}),
|
||||||
|
tap((organization) => {
|
||||||
|
this.organization = organization;
|
||||||
|
}),
|
||||||
|
switchMap(() => from(this.setCiphers())),
|
||||||
|
)
|
||||||
|
.subscribe();
|
||||||
|
|
||||||
|
// mock data - will be replaced with actual data
|
||||||
|
userData.forEach((user) => {
|
||||||
|
user.cipherIds.forEach((cipherId: string) => {
|
||||||
|
if (this.totalMembersMap.has(cipherId)) {
|
||||||
|
this.totalMembersMap.set(cipherId, (this.totalMembersMap.get(cipherId) || 0) + 1);
|
||||||
|
} else {
|
||||||
|
this.totalMembersMap.set(cipherId, 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCiphers() {
|
||||||
|
// const allCiphers = await this.cipherService.getAllFromApiForOrganization(this.organization.id);
|
||||||
|
const allCiphers = cipherData;
|
||||||
|
allCiphers.forEach(async (cipher) => {
|
||||||
|
this.findWeakPassword(cipher);
|
||||||
|
this.findReusedPassword(cipher);
|
||||||
|
await this.findExposedPassword(cipher);
|
||||||
|
});
|
||||||
|
this.dataSource.data = this.reportCiphers;
|
||||||
|
this.loading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected checkForExistingCipher(ciph: CipherView) {
|
||||||
|
if (!this.reportCipherIds.includes(ciph.id)) {
|
||||||
|
this.reportCipherIds.push(ciph.id);
|
||||||
|
this.reportCiphers.push(ciph);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async findExposedPassword(cipher: CipherView) {
|
||||||
|
const { type, login, isDeleted, edit, viewPassword, id } = cipher;
|
||||||
|
if (
|
||||||
|
type !== CipherType.Login ||
|
||||||
|
login.password == null ||
|
||||||
|
login.password === "" ||
|
||||||
|
isDeleted ||
|
||||||
|
(!this.organization && !edit) ||
|
||||||
|
!viewPassword
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const exposedCount = await this.auditService.passwordLeaked(login.password);
|
||||||
|
if (exposedCount > 0) {
|
||||||
|
this.exposedPasswordMap.set(id, exposedCount);
|
||||||
|
this.checkForExistingCipher(cipher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected findReusedPassword(cipher: CipherView) {
|
||||||
|
const { type, login, isDeleted, edit, viewPassword } = cipher;
|
||||||
|
if (
|
||||||
|
type !== CipherType.Login ||
|
||||||
|
login.password == null ||
|
||||||
|
login.password === "" ||
|
||||||
|
isDeleted ||
|
||||||
|
(!this.organization && !edit) ||
|
||||||
|
!viewPassword
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.passwordUseMap.has(login.password)) {
|
||||||
|
this.passwordUseMap.set(login.password, this.passwordUseMap.get(login.password) || 0 + 1);
|
||||||
|
} else {
|
||||||
|
this.passwordUseMap.set(login.password, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.checkForExistingCipher(cipher);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected findWeakPassword(cipher: CipherView): void {
|
||||||
|
const { type, login, isDeleted, edit, viewPassword } = cipher;
|
||||||
|
if (
|
||||||
|
type !== CipherType.Login ||
|
||||||
|
login.password == null ||
|
||||||
|
login.password === "" ||
|
||||||
|
isDeleted ||
|
||||||
|
(!this.organization && !edit) ||
|
||||||
|
!viewPassword
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasUserName = this.isUserNameNotEmpty(cipher);
|
||||||
|
let userInput: string[] = [];
|
||||||
|
if (hasUserName) {
|
||||||
|
const atPosition = login.username.indexOf("@");
|
||||||
|
if (atPosition > -1) {
|
||||||
|
userInput = userInput
|
||||||
|
.concat(
|
||||||
|
login.username
|
||||||
|
.substring(0, atPosition)
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.split(/[^A-Za-z0-9]/),
|
||||||
|
)
|
||||||
|
.filter((i) => i.length >= 3);
|
||||||
|
} else {
|
||||||
|
userInput = login.username
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.split(/[^A-Za-z0-9]/)
|
||||||
|
.filter((i) => i.length >= 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const { score } = this.passwordStrengthService.getPasswordStrength(
|
||||||
|
login.password,
|
||||||
|
null,
|
||||||
|
userInput.length > 0 ? userInput : null,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (score != null && score <= 2) {
|
||||||
|
this.passwordStrengthMap.set(cipher.id, this.scoreKey(score));
|
||||||
|
this.checkForExistingCipher(cipher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private isUserNameNotEmpty(c: CipherView): boolean {
|
||||||
|
return !Utils.isNullOrWhitespace(c.login.username);
|
||||||
|
}
|
||||||
|
|
||||||
|
private scoreKey(score: number): [string, BadgeVariant] {
|
||||||
|
switch (score) {
|
||||||
|
case 4:
|
||||||
|
return ["strong", "success"];
|
||||||
|
case 3:
|
||||||
|
return ["good", "primary"];
|
||||||
|
case 2:
|
||||||
|
return ["weak", "warning"];
|
||||||
|
default:
|
||||||
|
return ["veryWeak", "danger"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
export const userData: any[] = [
|
||||||
|
{
|
||||||
|
userName: "David Brent",
|
||||||
|
email: "david.brent@wernhamhogg.uk",
|
||||||
|
usesKeyConnector: true,
|
||||||
|
cipherIds: [
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228ab1",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228ab2",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228xy4",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001227nm5",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
userName: "Tim Canterbury",
|
||||||
|
email: "tim.canterbury@wernhamhogg.uk",
|
||||||
|
usesKeyConnector: false,
|
||||||
|
cipherIds: [
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228ab2",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228cd3",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228xy4",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001227nm5",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
userName: "Gareth Keenan",
|
||||||
|
email: "gareth.keenan@wernhamhogg.uk",
|
||||||
|
usesKeyConnector: true,
|
||||||
|
cipherIds: [
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228cd3",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228xy4",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001227nm5",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001227nm7",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
userName: "Dawn Tinsley",
|
||||||
|
email: "dawn.tinsley@wernhamhogg.uk",
|
||||||
|
usesKeyConnector: true,
|
||||||
|
cipherIds: [
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228ab2",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228cd3",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228xy4",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
userName: "Keith Bishop",
|
||||||
|
email: "keith.bishop@wernhamhogg.uk",
|
||||||
|
usesKeyConnector: false,
|
||||||
|
cipherIds: [
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228ab1",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228cd3",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228xy4",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001227nm5",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
userName: "Chris Finch",
|
||||||
|
email: "chris.finch@wernhamhogg.uk",
|
||||||
|
usesKeyConnector: true,
|
||||||
|
cipherIds: [
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228ab2",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228cd3",
|
||||||
|
"cbea34a8-bde4-46ad-9d19-b05001228xy4",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
|
@ -6,6 +6,7 @@
|
||||||
<vault-cipher-form-generator
|
<vault-cipher-form-generator
|
||||||
[type]="params.type"
|
[type]="params.type"
|
||||||
(valueGenerated)="onValueGenerated($event)"
|
(valueGenerated)="onValueGenerated($event)"
|
||||||
|
disableMargin
|
||||||
></vault-cipher-form-generator>
|
></vault-cipher-form-generator>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container bitDialogFooter>
|
<ng-container bitDialogFooter>
|
||||||
|
|
|
@ -3,34 +3,7 @@
|
||||||
{{ "passwordHistory" | i18n }}
|
{{ "passwordHistory" | i18n }}
|
||||||
</span>
|
</span>
|
||||||
<ng-container bitDialogContent>
|
<ng-container bitDialogContent>
|
||||||
<div *ngIf="history && history.length">
|
<vault-password-history-view [cipherId]="cipherId" />
|
||||||
<bit-item *ngFor="let h of history">
|
|
||||||
<div class="tw-pl-3 tw-py-2">
|
|
||||||
<bit-color-password
|
|
||||||
class="tw-text-base"
|
|
||||||
[password]="h.password"
|
|
||||||
[showCount]="false"
|
|
||||||
></bit-color-password>
|
|
||||||
<div class="tw-text-sm tw-text-muted">{{ h.lastUsedDate | date: "medium" }}</div>
|
|
||||||
</div>
|
|
||||||
<ng-container slot="end">
|
|
||||||
<bit-item-action>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
bitIconButton="bwi-clone"
|
|
||||||
aria-label="Copy"
|
|
||||||
appStopClick
|
|
||||||
(click)="copy(h.password)"
|
|
||||||
>
|
|
||||||
<i class="bwi bwi-lg bwi-clone" aria-hidden="true"></i>
|
|
||||||
</button>
|
|
||||||
</bit-item-action>
|
|
||||||
</ng-container>
|
|
||||||
</bit-item>
|
|
||||||
</div>
|
|
||||||
<div class="no-items" *ngIf="!history || !history.length">
|
|
||||||
<p>{{ "noPasswordsInList" | i18n }}</p>
|
|
||||||
</div>
|
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container bitDialogFooter>
|
<ng-container bitDialogFooter>
|
||||||
<button bitButton (click)="close()" buttonType="primary" type="button">
|
<button bitButton (click)="close()" buttonType="primary" type="button">
|
||||||
|
|
|
@ -1,22 +1,11 @@
|
||||||
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
|
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
|
||||||
import { CommonModule } from "@angular/common";
|
import { CommonModule } from "@angular/common";
|
||||||
import { OnInit, Inject, Component } from "@angular/core";
|
import { Inject, Component } from "@angular/core";
|
||||||
import { firstValueFrom, map } from "rxjs";
|
|
||||||
|
|
||||||
import { WINDOW } from "@bitwarden/angular/services/injection-tokens";
|
import { CipherId } from "@bitwarden/common/types/guid";
|
||||||
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
|
|
||||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
|
||||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
|
||||||
import { CipherId, UserId } from "@bitwarden/common/types/guid";
|
|
||||||
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
|
||||||
import { PasswordHistoryView } from "@bitwarden/common/vault/models/view/password-history.view";
|
import { PasswordHistoryView } from "@bitwarden/common/vault/models/view/password-history.view";
|
||||||
import {
|
import { AsyncActionsModule, DialogModule, DialogService } from "@bitwarden/components";
|
||||||
AsyncActionsModule,
|
import { PasswordHistoryViewComponent } from "@bitwarden/vault";
|
||||||
DialogModule,
|
|
||||||
DialogService,
|
|
||||||
ToastService,
|
|
||||||
ItemModule,
|
|
||||||
} from "@bitwarden/components";
|
|
||||||
|
|
||||||
import { SharedModule } from "../../shared/shared.module";
|
import { SharedModule } from "../../shared/shared.module";
|
||||||
|
|
||||||
|
@ -34,9 +23,15 @@ export interface ViewPasswordHistoryDialogParams {
|
||||||
selector: "app-vault-password-history",
|
selector: "app-vault-password-history",
|
||||||
templateUrl: "password-history.component.html",
|
templateUrl: "password-history.component.html",
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [CommonModule, AsyncActionsModule, DialogModule, ItemModule, SharedModule],
|
imports: [
|
||||||
|
CommonModule,
|
||||||
|
AsyncActionsModule,
|
||||||
|
DialogModule,
|
||||||
|
SharedModule,
|
||||||
|
PasswordHistoryViewComponent,
|
||||||
|
],
|
||||||
})
|
})
|
||||||
export class PasswordHistoryComponent implements OnInit {
|
export class PasswordHistoryComponent {
|
||||||
/**
|
/**
|
||||||
* The ID of the cipher to display the password history for.
|
* The ID of the cipher to display the password history for.
|
||||||
*/
|
*/
|
||||||
|
@ -50,22 +45,10 @@ export class PasswordHistoryComponent implements OnInit {
|
||||||
/**
|
/**
|
||||||
* The constructor for the password history dialog component.
|
* The constructor for the password history dialog component.
|
||||||
* @param params The parameters passed to the password history dialog.
|
* @param params The parameters passed to the password history dialog.
|
||||||
* @param cipherService The cipher service - used to get the cipher to display the password history for.
|
|
||||||
* @param platformUtilsService The platform utils service - used to copy passwords to the clipboard.
|
|
||||||
* @param i18nService The i18n service - used to translate strings.
|
|
||||||
* @param accountService The account service - used to get the active account to decrypt the cipher.
|
|
||||||
* @param win The window object - used to copy passwords to the clipboard.
|
|
||||||
* @param toastService The toast service - used to display feedback to the user when a password is copied.
|
|
||||||
* @param dialogRef The dialog reference - used to close the dialog.
|
* @param dialogRef The dialog reference - used to close the dialog.
|
||||||
**/
|
**/
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(DIALOG_DATA) public params: ViewPasswordHistoryDialogParams,
|
@Inject(DIALOG_DATA) public params: ViewPasswordHistoryDialogParams,
|
||||||
protected cipherService: CipherService,
|
|
||||||
protected platformUtilsService: PlatformUtilsService,
|
|
||||||
protected i18nService: I18nService,
|
|
||||||
protected accountService: AccountService,
|
|
||||||
@Inject(WINDOW) private win: Window,
|
|
||||||
protected toastService: ToastService,
|
|
||||||
private dialogRef: DialogRef<PasswordHistoryComponent>,
|
private dialogRef: DialogRef<PasswordHistoryComponent>,
|
||||||
) {
|
) {
|
||||||
/**
|
/**
|
||||||
|
@ -74,44 +57,6 @@ export class PasswordHistoryComponent implements OnInit {
|
||||||
this.cipherId = params.cipherId;
|
this.cipherId = params.cipherId;
|
||||||
}
|
}
|
||||||
|
|
||||||
async ngOnInit() {
|
|
||||||
await this.init();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copies a password to the clipboard.
|
|
||||||
* @param password The password to copy.
|
|
||||||
*/
|
|
||||||
copy(password: string) {
|
|
||||||
const copyOptions = this.win != null ? { window: this.win } : undefined;
|
|
||||||
this.platformUtilsService.copyToClipboard(password, copyOptions);
|
|
||||||
this.toastService.showToast({
|
|
||||||
variant: "info",
|
|
||||||
title: "",
|
|
||||||
message: this.i18nService.t("valueCopied", this.i18nService.t("password")),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes the password history dialog component.
|
|
||||||
*/
|
|
||||||
protected async init() {
|
|
||||||
const cipher = await this.cipherService.get(this.cipherId);
|
|
||||||
const activeAccount = await firstValueFrom(
|
|
||||||
this.accountService.activeAccount$.pipe(map((a: { id: string | undefined }) => a)),
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!activeAccount || !activeAccount.id) {
|
|
||||||
throw new Error("Active account is not available.");
|
|
||||||
}
|
|
||||||
|
|
||||||
const activeUserId = activeAccount.id as UserId;
|
|
||||||
const decCipher = await cipher.decrypt(
|
|
||||||
await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId),
|
|
||||||
);
|
|
||||||
this.history = decCipher.passwordHistory == null ? [] : decCipher.passwordHistory;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closes the password history dialog.
|
* Closes the password history dialog.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopieer wagwoord",
|
"message": "Kopieer wagwoord",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopieer gebruikersnaam",
|
"message": "Kopieer gebruikersnaam",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "نسخ كلمة المرور",
|
"message": "نسخ كلمة المرور",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "نسخ اسم المستخدم",
|
"message": "نسخ اسم المستخدم",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Parolu kopyala",
|
"message": "Parolu kopyala",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Parol kopyalandı"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "İstifadəçi adını kopyala",
|
"message": "İstifadəçi adını kopyala",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
@ -1197,7 +1200,7 @@
|
||||||
"message": "Bu kolleksiyadakı bütün elementlərə baxmaq üçün icazəniz yoxdur."
|
"message": "Bu kolleksiyadakı bütün elementlərə baxmaq üçün icazəniz yoxdur."
|
||||||
},
|
},
|
||||||
"youDoNotHavePermissions": {
|
"youDoNotHavePermissions": {
|
||||||
"message": "You do not have permissions to this collection"
|
"message": "Bu kolleksiya ilə bağlı icazəniz yoxdur"
|
||||||
},
|
},
|
||||||
"noCollectionsInList": {
|
"noCollectionsInList": {
|
||||||
"message": "Siyahılanacaq heç bir kolleksiya yoxdur."
|
"message": "Siyahılanacaq heç bir kolleksiya yoxdur."
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Скапіяваць пароль",
|
"message": "Скапіяваць пароль",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Скапіяваць імя карыстальніка",
|
"message": "Скапіяваць імя карыстальніка",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Копиране на паролата",
|
"message": "Копиране на паролата",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Паролата е копирана"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Копиране на потребителското име",
|
"message": "Копиране на потребителското име",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
@ -1197,7 +1200,7 @@
|
||||||
"message": "Нямате права да преглеждате всички елементи в тази колекция."
|
"message": "Нямате права да преглеждате всички елементи в тази колекция."
|
||||||
},
|
},
|
||||||
"youDoNotHavePermissions": {
|
"youDoNotHavePermissions": {
|
||||||
"message": "You do not have permissions to this collection"
|
"message": "Нямате права за тази колекция"
|
||||||
},
|
},
|
||||||
"noCollectionsInList": {
|
"noCollectionsInList": {
|
||||||
"message": "Няма колекции за показване."
|
"message": "Няма колекции за показване."
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "পাসওয়ার্ড অনুলিপিত করুন",
|
"message": "পাসওয়ার্ড অনুলিপিত করুন",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "ব্যবহারকারীর নাম অনুলিপিত করুন",
|
"message": "ব্যবহারকারীর নাম অনুলিপিত করুন",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopirajte Lozinku",
|
"message": "Kopirajte Lozinku",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopirajte Korisničko ime",
|
"message": "Kopirajte Korisničko ime",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copia la contrasenya",
|
"message": "Copia la contrasenya",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copia el nom d'usuari",
|
"message": "Copia el nom d'usuari",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopírovat heslo",
|
"message": "Kopírovat heslo",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Heslo bylo zkopírováno"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopírovat uživatelské jméno",
|
"message": "Kopírovat uživatelské jméno",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopiér adgangskode",
|
"message": "Kopiér adgangskode",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Adgangskode kopieret"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopiér brugernavn",
|
"message": "Kopiér brugernavn",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Passwort kopieren",
|
"message": "Passwort kopieren",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Passwort kopiert"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Benutzername kopieren",
|
"message": "Benutzername kopieren",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
@ -1197,7 +1200,7 @@
|
||||||
"message": "Du hast nicht die Berechtigung, alle Einträge in dieser Sammlung anzuzeigen."
|
"message": "Du hast nicht die Berechtigung, alle Einträge in dieser Sammlung anzuzeigen."
|
||||||
},
|
},
|
||||||
"youDoNotHavePermissions": {
|
"youDoNotHavePermissions": {
|
||||||
"message": "You do not have permissions to this collection"
|
"message": "Du hast keine Berechtigung für diese Sammlung"
|
||||||
},
|
},
|
||||||
"noCollectionsInList": {
|
"noCollectionsInList": {
|
||||||
"message": "Keine Sammlungen vorhanden."
|
"message": "Keine Sammlungen vorhanden."
|
||||||
|
@ -3785,7 +3788,7 @@
|
||||||
"message": "Organisation beitreten"
|
"message": "Organisation beitreten"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "$ORGANIZATIONNAME$ beitreten",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -5209,13 +5212,13 @@
|
||||||
"message": "Die Mitglieder anzeigen und auswählen, denen du Zugriff auf den Secrets Manager gewähren möchtest."
|
"message": "Die Mitglieder anzeigen und auswählen, denen du Zugriff auf den Secrets Manager gewähren möchtest."
|
||||||
},
|
},
|
||||||
"openYourOrganizations": {
|
"openYourOrganizations": {
|
||||||
"message": "Open your organization's"
|
"message": "Öffne deine Organisations-"
|
||||||
},
|
},
|
||||||
"usingTheMenuSelect": {
|
"usingTheMenuSelect": {
|
||||||
"message": "Using the menu, select"
|
"message": "Using the menu, select"
|
||||||
},
|
},
|
||||||
"toGrantAccessToSelectedMembers": {
|
"toGrantAccessToSelectedMembers": {
|
||||||
"message": "to grant access to selected members."
|
"message": "um Zugriff auf ausgewählte Mitglieder zu gewähren."
|
||||||
},
|
},
|
||||||
"sendVaultCardTryItNow": {
|
"sendVaultCardTryItNow": {
|
||||||
"message": "probiere es jetzt aus",
|
"message": "probiere es jetzt aus",
|
||||||
|
@ -8205,10 +8208,10 @@
|
||||||
"message": "Sammlungserstellung und -löschung auf Eigentümer und Administratoren beschränken"
|
"message": "Sammlungserstellung und -löschung auf Eigentümer und Administratoren beschränken"
|
||||||
},
|
},
|
||||||
"limitCollectionCreationDesc": {
|
"limitCollectionCreationDesc": {
|
||||||
"message": "Limit collection creation to owners and admins"
|
"message": "Begrenze die Erstellung von Sammlungen auf Besitzer und Administratoren"
|
||||||
},
|
},
|
||||||
"limitCollectionDeletionDesc": {
|
"limitCollectionDeletionDesc": {
|
||||||
"message": "Limit collection deletion to owners and admins"
|
"message": "Begrenze das Löschen von Sammlungen auf Besitzer und Administratoren"
|
||||||
},
|
},
|
||||||
"allowAdminAccessToAllCollectionItemsDesc": {
|
"allowAdminAccessToAllCollectionItemsDesc": {
|
||||||
"message": "Besitzer und Administratoren können alle Sammlungen und Einträge verwalten"
|
"message": "Besitzer und Administratoren können alle Sammlungen und Einträge verwalten"
|
||||||
|
@ -8827,7 +8830,7 @@
|
||||||
"message": "35% Rabatt"
|
"message": "35% Rabatt"
|
||||||
},
|
},
|
||||||
"monthPerMember": {
|
"monthPerMember": {
|
||||||
"message": "month per member"
|
"message": "Monat pro Mitglied"
|
||||||
},
|
},
|
||||||
"seats": {
|
"seats": {
|
||||||
"message": "Benutzerplätze"
|
"message": "Benutzerplätze"
|
||||||
|
@ -9396,19 +9399,19 @@
|
||||||
"message": "Zugriff bearbeiten"
|
"message": "Zugriff bearbeiten"
|
||||||
},
|
},
|
||||||
"textHelpText": {
|
"textHelpText": {
|
||||||
"message": "Use text fields for data like security questions"
|
"message": "Verwende Textfelder für Daten wie Sicherheitsfragen"
|
||||||
},
|
},
|
||||||
"hiddenHelpText": {
|
"hiddenHelpText": {
|
||||||
"message": "Use hidden fields for sensitive data like a password"
|
"message": "Verwende versteckte Felder für vertrauliche Daten wie ein Passwort"
|
||||||
},
|
},
|
||||||
"checkBoxHelpText": {
|
"checkBoxHelpText": {
|
||||||
"message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email"
|
"message": "Verwende Kontrollkästchen, wenn du das Kontrollkästchen eines Formulars automatisch ausfüllen möchtest, wie eine Erinnerungs-E-Mail"
|
||||||
},
|
},
|
||||||
"linkedHelpText": {
|
"linkedHelpText": {
|
||||||
"message": "Use a linked field when you are experiencing autofill issues for a specific website."
|
"message": "Verwende ein verknüpftes Feld, wenn du Probleme mit dem automatischen Ausfüllen einer bestimmten Website hast."
|
||||||
},
|
},
|
||||||
"linkedLabelHelpText": {
|
"linkedLabelHelpText": {
|
||||||
"message": "Enter the the field's html id, name, aria-label, or placeholder."
|
"message": "Gib die HTML ID des Felds, Name, Aria-Label oder einen Platzhalter ein."
|
||||||
},
|
},
|
||||||
"addAttachment": {
|
"addAttachment": {
|
||||||
"message": "Anhang hinzufügen"
|
"message": "Anhang hinzufügen"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Αντιγραφή κωδικού πρόσβασης",
|
"message": "Αντιγραφή κωδικού πρόσβασης",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Αντιγραφή ονόματος χρήστη",
|
"message": "Αντιγραφή ονόματος χρήστη",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopii pasvorton",
|
"message": "Kopii pasvorton",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopii uzantnomon",
|
"message": "Kopii uzantnomon",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copiar contraseña",
|
"message": "Copiar contraseña",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copiar usuario",
|
"message": "Copiar usuario",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopeeri parool",
|
"message": "Kopeeri parool",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopeeri kasutajanimi",
|
"message": "Kopeeri kasutajanimi",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopiatu pasahitza",
|
"message": "Kopiatu pasahitza",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopiatu erabiltzaile-izena",
|
"message": "Kopiatu erabiltzaile-izena",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "کپی کلمه عبور",
|
"message": "کپی کلمه عبور",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "کپی نام کاربری",
|
"message": "کپی نام کاربری",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopioi salasana",
|
"message": "Kopioi salasana",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopioi käyttäjätunnus",
|
"message": "Kopioi käyttäjätunnus",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopyahin ang password",
|
"message": "Kopyahin ang password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopyahin ang username",
|
"message": "Kopyahin ang username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copier le mot de passe",
|
"message": "Copier le mot de passe",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Mot de passe copié"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copier le nom d'utilisateur",
|
"message": "Copier le nom d'utilisateur",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "העתק סיסמה",
|
"message": "העתק סיסמה",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "העתק שם משתמש",
|
"message": "העתק שם משתמש",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopiraj lozinku",
|
"message": "Kopiraj lozinku",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopiraj korisničko ime",
|
"message": "Kopiraj korisničko ime",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Jelszó másolása",
|
"message": "Jelszó másolása",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "A jelszó másolásra került."
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Felhasználónév másolása",
|
"message": "Felhasználónév másolása",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
@ -1197,7 +1200,7 @@
|
||||||
"message": "Nincs jogosultság a gyűjtemény összes elemének megtekintésére."
|
"message": "Nincs jogosultság a gyűjtemény összes elemének megtekintésére."
|
||||||
},
|
},
|
||||||
"youDoNotHavePermissions": {
|
"youDoNotHavePermissions": {
|
||||||
"message": "You do not have permissions to this collection"
|
"message": "Nincs engedély ehhez a gyűjteményhez"
|
||||||
},
|
},
|
||||||
"noCollectionsInList": {
|
"noCollectionsInList": {
|
||||||
"message": "Nincsenek megjeleníthető gyűjtemények."
|
"message": "Nincsenek megjeleníthető gyűjtemények."
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Salin Kata Sandi",
|
"message": "Salin Kata Sandi",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Salin Nama Pengguna",
|
"message": "Salin Nama Pengguna",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copia password",
|
"message": "Copia password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copia nome utente",
|
"message": "Copia nome utente",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
@ -9402,10 +9405,10 @@
|
||||||
"message": "Use hidden fields for sensitive data like a password"
|
"message": "Use hidden fields for sensitive data like a password"
|
||||||
},
|
},
|
||||||
"checkBoxHelpText": {
|
"checkBoxHelpText": {
|
||||||
"message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email"
|
"message": "Usa le caselle di controllo se vuoi riempire automaticamente una casella di controllo, come \"Rimani connesso\""
|
||||||
},
|
},
|
||||||
"linkedHelpText": {
|
"linkedHelpText": {
|
||||||
"message": "Use a linked field when you are experiencing autofill issues for a specific website."
|
"message": "Usa un campo collegato quando si verificano problemi di riempimento automatico per un sito web specifico."
|
||||||
},
|
},
|
||||||
"linkedLabelHelpText": {
|
"linkedLabelHelpText": {
|
||||||
"message": "Enter the the field's html id, name, aria-label, or placeholder."
|
"message": "Enter the the field's html id, name, aria-label, or placeholder."
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "パスワードのコピー",
|
"message": "パスワードのコピー",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "ユーザー名のコピー",
|
"message": "ユーザー名のコピー",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "ასლირება პაროლის",
|
"message": "ასლირება პაროლის",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "ასლირება მომხმარებლის სახელის",
|
"message": "ასლირება მომხმარებლის სახელის",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "ಪಾಸ್ವರ್ಡ್ ನಕಲಿಸಿ",
|
"message": "ಪಾಸ್ವರ್ಡ್ ನಕಲಿಸಿ",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "ಬಳಕೆಹೆಸರು ನಕಲಿಸು",
|
"message": "ಬಳಕೆಹೆಸರು ನಕಲಿಸು",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "비밀번호 복사",
|
"message": "비밀번호 복사",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "사용자 이름 복사",
|
"message": "사용자 이름 복사",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Ievietot paroli starpliktuvē",
|
"message": "Ievietot paroli starpliktuvē",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Ievietot lietotājvārdu starpliktuvē",
|
"message": "Ievietot lietotājvārdu starpliktuvē",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
@ -1197,7 +1200,7 @@
|
||||||
"message": "Nav atļaujas apskatīt visus šī krājuma vienumus."
|
"message": "Nav atļaujas apskatīt visus šī krājuma vienumus."
|
||||||
},
|
},
|
||||||
"youDoNotHavePermissions": {
|
"youDoNotHavePermissions": {
|
||||||
"message": "You do not have permissions to this collection"
|
"message": "Nav atļauju šim krājumam"
|
||||||
},
|
},
|
||||||
"noCollectionsInList": {
|
"noCollectionsInList": {
|
||||||
"message": "Nav krājumu, ko parādīt."
|
"message": "Nav krājumu, ko parādīt."
|
||||||
|
@ -8205,10 +8208,10 @@
|
||||||
"message": "Ļaut krājumu izveidošanu un izdzēšanu tikai īpašniekiem un pārvaldniekiem"
|
"message": "Ļaut krājumu izveidošanu un izdzēšanu tikai īpašniekiem un pārvaldniekiem"
|
||||||
},
|
},
|
||||||
"limitCollectionCreationDesc": {
|
"limitCollectionCreationDesc": {
|
||||||
"message": "Limit collection creation to owners and admins"
|
"message": "Ļaut krājumu izveidošanu tikai īpašniekiem un pārvaldītājiem"
|
||||||
},
|
},
|
||||||
"limitCollectionDeletionDesc": {
|
"limitCollectionDeletionDesc": {
|
||||||
"message": "Limit collection deletion to owners and admins"
|
"message": "Ļaut krājumu izdzēšanu tikai īpašniekiem un pārvaldītājiem"
|
||||||
},
|
},
|
||||||
"allowAdminAccessToAllCollectionItemsDesc": {
|
"allowAdminAccessToAllCollectionItemsDesc": {
|
||||||
"message": "Īpašnieki un pārvaldnieki var pārvaldīt visus krājumus un vienumus"
|
"message": "Īpašnieki un pārvaldnieki var pārvaldīt visus krājumus un vienumus"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "പാസ്വേഡ് ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുക",
|
"message": "പാസ്വേഡ് ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുക",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "ഉപയോക്തൃനാമം പകർത്തുക",
|
"message": "ഉപയോക്തൃനാമം പകർത്തുക",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopier passordet",
|
"message": "Kopier passordet",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopier brukernavnet",
|
"message": "Kopier brukernavnet",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Wachtwoord kopiëren",
|
"message": "Wachtwoord kopiëren",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Wachtwoord gekopieerd"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Gebruikersnaam kopiëren",
|
"message": "Gebruikersnaam kopiëren",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
@ -1197,7 +1200,7 @@
|
||||||
"message": "Je hebt geen rechten om alle items in deze collectie te zien."
|
"message": "Je hebt geen rechten om alle items in deze collectie te zien."
|
||||||
},
|
},
|
||||||
"youDoNotHavePermissions": {
|
"youDoNotHavePermissions": {
|
||||||
"message": "Je hebt geen rechten voor deze collectie"
|
"message": "Je hebt geen rechten op deze collectie"
|
||||||
},
|
},
|
||||||
"noCollectionsInList": {
|
"noCollectionsInList": {
|
||||||
"message": "Er zijn geen verzamelingen om weer te geven."
|
"message": "Er zijn geen verzamelingen om weer te geven."
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopier passordet",
|
"message": "Kopier passordet",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopier brukarnamnet",
|
"message": "Kopier brukarnamnet",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopiuj hasło",
|
"message": "Kopiuj hasło",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopiuj nazwę użytkownika",
|
"message": "Kopiuj nazwę użytkownika",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
{
|
{
|
||||||
"allApplications": {
|
"allApplications": {
|
||||||
"message": "All applications"
|
"message": "Todos os aplicativos"
|
||||||
},
|
},
|
||||||
"priorityApplications": {
|
"priorityApplications": {
|
||||||
"message": "Priority applications"
|
"message": "Aplicações prioritárias"
|
||||||
},
|
},
|
||||||
"accessIntelligence": {
|
"accessIntelligence": {
|
||||||
"message": "Access Intelligence"
|
"message": "Acessar a Inteligência"
|
||||||
},
|
},
|
||||||
"notifiedMembers": {
|
"notifiedMembers": {
|
||||||
"message": "Notified members"
|
"message": "Membros notificados"
|
||||||
},
|
},
|
||||||
"allApplicationsWithCount": {
|
"allApplicationsWithCount": {
|
||||||
"message": "All applications ($COUNT$)",
|
"message": "Todas as aplicações ($COUNT$)",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priorityApplicationsWithCount": {
|
"priorityApplicationsWithCount": {
|
||||||
"message": "Priority applications ($COUNT$)",
|
"message": "Aplicações prioritárias ($COUNT$)",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notifiedMembersWithCount": {
|
"notifiedMembersWithCount": {
|
||||||
"message": "Notified members ($COUNT$)",
|
"message": "Membros notificados ($COUNT$)",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {
|
"count": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -39,25 +39,25 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"application": {
|
"application": {
|
||||||
"message": "Application"
|
"message": "Aplicativo"
|
||||||
},
|
},
|
||||||
"atRiskPasswords": {
|
"atRiskPasswords": {
|
||||||
"message": "At-risk passwords"
|
"message": "Senhas de risco"
|
||||||
},
|
},
|
||||||
"totalPasswords": {
|
"totalPasswords": {
|
||||||
"message": "Total passwords"
|
"message": "Total de senhas"
|
||||||
},
|
},
|
||||||
"atRiskMembers": {
|
"atRiskMembers": {
|
||||||
"message": "At-risk members"
|
"message": "Membros de risco"
|
||||||
},
|
},
|
||||||
"totalMembers": {
|
"totalMembers": {
|
||||||
"message": "Total members"
|
"message": "Total de membros"
|
||||||
},
|
},
|
||||||
"atRiskApplications": {
|
"atRiskApplications": {
|
||||||
"message": "At-risk applications"
|
"message": "Aplicações de risco"
|
||||||
},
|
},
|
||||||
"totalApplications": {
|
"totalApplications": {
|
||||||
"message": "Total applications"
|
"message": "Todos os aplicativos"
|
||||||
},
|
},
|
||||||
"whatTypeOfItem": {
|
"whatTypeOfItem": {
|
||||||
"message": "Que tipo de item é este?"
|
"message": "Que tipo de item é este?"
|
||||||
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copiar Senha",
|
"message": "Copiar Senha",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Senha copiada"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copiar Nome de Usuário",
|
"message": "Copiar Nome de Usuário",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
@ -1197,7 +1200,7 @@
|
||||||
"message": "Você não tem permissão para visualizar todos os itens desta coleção."
|
"message": "Você não tem permissão para visualizar todos os itens desta coleção."
|
||||||
},
|
},
|
||||||
"youDoNotHavePermissions": {
|
"youDoNotHavePermissions": {
|
||||||
"message": "You do not have permissions to this collection"
|
"message": "Você não tem permissões para essa coleção"
|
||||||
},
|
},
|
||||||
"noCollectionsInList": {
|
"noCollectionsInList": {
|
||||||
"message": "Não há coleções para listar."
|
"message": "Não há coleções para listar."
|
||||||
|
@ -1507,7 +1510,7 @@
|
||||||
"description": "deprecated. Use avoidAmbiguous instead."
|
"description": "deprecated. Use avoidAmbiguous instead."
|
||||||
},
|
},
|
||||||
"avoidAmbiguous": {
|
"avoidAmbiguous": {
|
||||||
"message": "Avoid ambiguous characters",
|
"message": "Evitar caracteres ambíguos",
|
||||||
"description": "Label for the avoid ambiguous characters checkbox."
|
"description": "Label for the avoid ambiguous characters checkbox."
|
||||||
},
|
},
|
||||||
"regeneratePassword": {
|
"regeneratePassword": {
|
||||||
|
@ -1535,7 +1538,7 @@
|
||||||
"message": "Caracteres Especiais (!@#$%^&*)"
|
"message": "Caracteres Especiais (!@#$%^&*)"
|
||||||
},
|
},
|
||||||
"uppercaseDescription": {
|
"uppercaseDescription": {
|
||||||
"message": "Include uppercase characters",
|
"message": "Incluir caracteres maiúsculos",
|
||||||
"description": "Tooltip for the password generator uppercase character checkbox"
|
"description": "Tooltip for the password generator uppercase character checkbox"
|
||||||
},
|
},
|
||||||
"uppercaseLabel": {
|
"uppercaseLabel": {
|
||||||
|
@ -1543,7 +1546,7 @@
|
||||||
"description": "Label for the password generator uppercase character checkbox"
|
"description": "Label for the password generator uppercase character checkbox"
|
||||||
},
|
},
|
||||||
"lowercaseDescription": {
|
"lowercaseDescription": {
|
||||||
"message": "Include lowercase characters",
|
"message": "Incluir caracteres minúsculos",
|
||||||
"description": "Full description for the password generator lowercase character checkbox"
|
"description": "Full description for the password generator lowercase character checkbox"
|
||||||
},
|
},
|
||||||
"lowercaseLabel": {
|
"lowercaseLabel": {
|
||||||
|
@ -1551,15 +1554,15 @@
|
||||||
"description": "Label for the password generator lowercase character checkbox"
|
"description": "Label for the password generator lowercase character checkbox"
|
||||||
},
|
},
|
||||||
"numbersDescription": {
|
"numbersDescription": {
|
||||||
"message": "Include numbers",
|
"message": "Incluir números",
|
||||||
"description": "Full description for the password generator numbers checkbox"
|
"description": "Full description for the password generator numbers checkbox"
|
||||||
},
|
},
|
||||||
"numbersLabel": {
|
"numbersLabel": {
|
||||||
"message": "0-9",
|
"message": "0 – 9",
|
||||||
"description": "Label for the password generator numbers checkbox"
|
"description": "Label for the password generator numbers checkbox"
|
||||||
},
|
},
|
||||||
"specialCharactersDescription": {
|
"specialCharactersDescription": {
|
||||||
"message": "Include special characters",
|
"message": "Incluir caracteres especiais",
|
||||||
"description": "Full description for the password generator special characters checkbox"
|
"description": "Full description for the password generator special characters checkbox"
|
||||||
},
|
},
|
||||||
"specialCharactersLabel": {
|
"specialCharactersLabel": {
|
||||||
|
@ -2718,10 +2721,10 @@
|
||||||
"message": "Faturas"
|
"message": "Faturas"
|
||||||
},
|
},
|
||||||
"noUnpaidInvoices": {
|
"noUnpaidInvoices": {
|
||||||
"message": "No unpaid invoices."
|
"message": "Sem faturas não pagas."
|
||||||
},
|
},
|
||||||
"noPaidInvoices": {
|
"noPaidInvoices": {
|
||||||
"message": "No paid invoices."
|
"message": "Sem faturas pagas."
|
||||||
},
|
},
|
||||||
"paid": {
|
"paid": {
|
||||||
"message": "Pago",
|
"message": "Pago",
|
||||||
|
@ -3785,7 +3788,7 @@
|
||||||
"message": "Junte-se a Organização"
|
"message": "Junte-se a Organização"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "Entrar em $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -7935,7 +7938,7 @@
|
||||||
"description": "Used as a card title description on the set password page to explain why the user is there"
|
"description": "Used as a card title description on the set password page to explain why the user is there"
|
||||||
},
|
},
|
||||||
"cardMetrics": {
|
"cardMetrics": {
|
||||||
"message": "out of $TOTAL$",
|
"message": "fora do $TOTAL$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"total": {
|
"total": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -8205,7 +8208,7 @@
|
||||||
"message": "Limitar criação de coleção e exclusão a proprietários e administradores"
|
"message": "Limitar criação de coleção e exclusão a proprietários e administradores"
|
||||||
},
|
},
|
||||||
"limitCollectionCreationDesc": {
|
"limitCollectionCreationDesc": {
|
||||||
"message": "Limit collection creation to owners and admins"
|
"message": "Limitar criação de coleção e exclusão a proprietários e administradores"
|
||||||
},
|
},
|
||||||
"limitCollectionDeletionDesc": {
|
"limitCollectionDeletionDesc": {
|
||||||
"message": "Limit collection deletion to owners and admins"
|
"message": "Limit collection deletion to owners and admins"
|
||||||
|
@ -9396,27 +9399,27 @@
|
||||||
"message": "Edit access"
|
"message": "Edit access"
|
||||||
},
|
},
|
||||||
"textHelpText": {
|
"textHelpText": {
|
||||||
"message": "Use text fields for data like security questions"
|
"message": "Utilize campos de texto para dados como perguntas de segurança"
|
||||||
},
|
},
|
||||||
"hiddenHelpText": {
|
"hiddenHelpText": {
|
||||||
"message": "Use hidden fields for sensitive data like a password"
|
"message": "Use campos ocultos para dados confidenciais como uma senha"
|
||||||
},
|
},
|
||||||
"checkBoxHelpText": {
|
"checkBoxHelpText": {
|
||||||
"message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email"
|
"message": "Use caixas de seleção se gostaria de preencher automaticamente a caixa de seleção de um formulário, como um e-mail de lembrança"
|
||||||
},
|
},
|
||||||
"linkedHelpText": {
|
"linkedHelpText": {
|
||||||
"message": "Use a linked field when you are experiencing autofill issues for a specific website."
|
"message": "Use um campo vinculado quando estiver enfrentando problemas com o auto-preenchimento para um site específico."
|
||||||
},
|
},
|
||||||
"linkedLabelHelpText": {
|
"linkedLabelHelpText": {
|
||||||
"message": "Enter the the field's html id, name, aria-label, or placeholder."
|
"message": "Digite o Id html do campo, nome, nome aria-label, ou marcador de posição"
|
||||||
},
|
},
|
||||||
"addAttachment": {
|
"addAttachment": {
|
||||||
"message": "Add attachment"
|
"message": "Adicionar anexo"
|
||||||
},
|
},
|
||||||
"maxFileSizeSansPunctuation": {
|
"maxFileSizeSansPunctuation": {
|
||||||
"message": "Maximum file size is 500 MB"
|
"message": "O tamanho máximo do arquivo é 500 MB"
|
||||||
},
|
},
|
||||||
"permanentlyDeleteAttachmentConfirmation": {
|
"permanentlyDeleteAttachmentConfirmation": {
|
||||||
"message": "Are you sure you want to permanently delete this attachment?"
|
"message": "Tem certeza de que deseja excluir permanentemente esse anexo?"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copiar palavra-passe",
|
"message": "Copiar palavra-passe",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Palavra-passe copiada"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copiar nome de utilizador",
|
"message": "Copiar nome de utilizador",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copiere parolă",
|
"message": "Copiere parolă",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copiere nume utilizator",
|
"message": "Copiere nume utilizator",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Скопировать пароль",
|
"message": "Скопировать пароль",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Пароль скопирован"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Скопировать имя пользователя",
|
"message": "Скопировать имя пользователя",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopírovať heslo",
|
"message": "Kopírovať heslo",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Heslo skopírované"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopírovať používateľské meno",
|
"message": "Kopírovať používateľské meno",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopiraj geslo",
|
"message": "Kopiraj geslo",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopiraj uporabniško ime",
|
"message": "Kopiraj uporabniško ime",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Копирај лозинку",
|
"message": "Копирај лозинку",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Копирај име",
|
"message": "Копирај име",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
@ -1197,7 +1200,7 @@
|
||||||
"message": "Немате дозволу да видите све ставке у овој колекцији."
|
"message": "Немате дозволу да видите све ставке у овој колекцији."
|
||||||
},
|
},
|
||||||
"youDoNotHavePermissions": {
|
"youDoNotHavePermissions": {
|
||||||
"message": "You do not have permissions to this collection"
|
"message": "Немате дозволе за ову колекцију"
|
||||||
},
|
},
|
||||||
"noCollectionsInList": {
|
"noCollectionsInList": {
|
||||||
"message": "Нема колекције у листи."
|
"message": "Нема колекције у листи."
|
||||||
|
@ -3785,7 +3788,7 @@
|
||||||
"message": "Придружи Организацију"
|
"message": "Придружи Организацију"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "Придружити се $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -7935,7 +7938,7 @@
|
||||||
"description": "Used as a card title description on the set password page to explain why the user is there"
|
"description": "Used as a card title description on the set password page to explain why the user is there"
|
||||||
},
|
},
|
||||||
"cardMetrics": {
|
"cardMetrics": {
|
||||||
"message": "out of $TOTAL$",
|
"message": "од $TOTAL$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"total": {
|
"total": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -8205,10 +8208,10 @@
|
||||||
"message": "Ограничите креирање и брисање збирке на власнике и администраторе"
|
"message": "Ограничите креирање и брисање збирке на власнике и администраторе"
|
||||||
},
|
},
|
||||||
"limitCollectionCreationDesc": {
|
"limitCollectionCreationDesc": {
|
||||||
"message": "Limit collection creation to owners and admins"
|
"message": "Ограничите креирање збирке на власнике и администраторе"
|
||||||
},
|
},
|
||||||
"limitCollectionDeletionDesc": {
|
"limitCollectionDeletionDesc": {
|
||||||
"message": "Limit collection deletion to owners and admins"
|
"message": "Ограничите брисање збирке на власнике и администраторе"
|
||||||
},
|
},
|
||||||
"allowAdminAccessToAllCollectionItemsDesc": {
|
"allowAdminAccessToAllCollectionItemsDesc": {
|
||||||
"message": "Власници и администратори могу да управљају свим колекцијама и ставкама"
|
"message": "Власници и администратори могу да управљају свим колекцијама и ставкама"
|
||||||
|
@ -9396,19 +9399,19 @@
|
||||||
"message": "Edit access"
|
"message": "Edit access"
|
||||||
},
|
},
|
||||||
"textHelpText": {
|
"textHelpText": {
|
||||||
"message": "Use text fields for data like security questions"
|
"message": "Користите текстуална поља за податке као што су безбедносна питања"
|
||||||
},
|
},
|
||||||
"hiddenHelpText": {
|
"hiddenHelpText": {
|
||||||
"message": "Use hidden fields for sensitive data like a password"
|
"message": "Користите скривена поља за осетљиве податке као што је лозинка"
|
||||||
},
|
},
|
||||||
"checkBoxHelpText": {
|
"checkBoxHelpText": {
|
||||||
"message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email"
|
"message": "Користите поља за потврду ако желите да аутоматски попуните поље за потврду обрасца, на пример имејл за памћење"
|
||||||
},
|
},
|
||||||
"linkedHelpText": {
|
"linkedHelpText": {
|
||||||
"message": "Use a linked field when you are experiencing autofill issues for a specific website."
|
"message": "Користите повезано поље када имате проблема са аутоматским попуњавањем за одређену веб локацију."
|
||||||
},
|
},
|
||||||
"linkedLabelHelpText": {
|
"linkedLabelHelpText": {
|
||||||
"message": "Enter the the field's html id, name, aria-label, or placeholder."
|
"message": "Унесите html Ид поља, име, aria-label, или placeholder."
|
||||||
},
|
},
|
||||||
"addAttachment": {
|
"addAttachment": {
|
||||||
"message": "Додај прилог"
|
"message": "Додај прилог"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopiraj lozinku",
|
"message": "Kopiraj lozinku",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopiraj Korisničko Ime",
|
"message": "Kopiraj Korisničko Ime",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Kopiera lösenord",
|
"message": "Kopiera lösenord",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kopiera användarnamn",
|
"message": "Kopiera användarnamn",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Copy password",
|
"message": "Copy password",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Copy username",
|
"message": "Copy username",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "คัดลอกรหัสผ่าน",
|
"message": "คัดลอกรหัสผ่าน",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "คัดลอกชื่อผู้ใช้",
|
"message": "คัดลอกชื่อผู้ใช้",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Parolayı kopyala",
|
"message": "Parolayı kopyala",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Parola kopyalandı"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Kullanıcı adını kopyala",
|
"message": "Kullanıcı adını kopyala",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
@ -1197,7 +1200,7 @@
|
||||||
"message": "Bu koleksiyondaki tüm kayıtları görmek için izniniz yok."
|
"message": "Bu koleksiyondaki tüm kayıtları görmek için izniniz yok."
|
||||||
},
|
},
|
||||||
"youDoNotHavePermissions": {
|
"youDoNotHavePermissions": {
|
||||||
"message": "You do not have permissions to this collection"
|
"message": "Bu koleksiyona erişme izniniz yok"
|
||||||
},
|
},
|
||||||
"noCollectionsInList": {
|
"noCollectionsInList": {
|
||||||
"message": "Listelenecek koleksiyon yok."
|
"message": "Listelenecek koleksiyon yok."
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Копіювати пароль",
|
"message": "Копіювати пароль",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Пароль скопійовано"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Копіювати ім'я користувача",
|
"message": "Копіювати ім'я користувача",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
@ -1197,7 +1200,7 @@
|
||||||
"message": "У вас немає повноважень на перегляд усіх записів у цій збірці."
|
"message": "У вас немає повноважень на перегляд усіх записів у цій збірці."
|
||||||
},
|
},
|
||||||
"youDoNotHavePermissions": {
|
"youDoNotHavePermissions": {
|
||||||
"message": "You do not have permissions to this collection"
|
"message": "У вас немає дозволів для цієї збірки"
|
||||||
},
|
},
|
||||||
"noCollectionsInList": {
|
"noCollectionsInList": {
|
||||||
"message": "Немає збірок."
|
"message": "Немає збірок."
|
||||||
|
@ -3785,7 +3788,7 @@
|
||||||
"message": "Приєднатися до організації"
|
"message": "Приєднатися до організації"
|
||||||
},
|
},
|
||||||
"joinOrganizationName": {
|
"joinOrganizationName": {
|
||||||
"message": "Join $ORGANIZATIONNAME$",
|
"message": "Приєднатися до $ORGANIZATIONNAME$",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"organizationName": {
|
"organizationName": {
|
||||||
"content": "$1",
|
"content": "$1",
|
||||||
|
@ -8205,10 +8208,10 @@
|
||||||
"message": "Дозволити створення та видалення збірок лише власникам та адміністраторам"
|
"message": "Дозволити створення та видалення збірок лише власникам та адміністраторам"
|
||||||
},
|
},
|
||||||
"limitCollectionCreationDesc": {
|
"limitCollectionCreationDesc": {
|
||||||
"message": "Limit collection creation to owners and admins"
|
"message": "Дозволити створення збірок лише власникам та адміністраторам"
|
||||||
},
|
},
|
||||||
"limitCollectionDeletionDesc": {
|
"limitCollectionDeletionDesc": {
|
||||||
"message": "Limit collection deletion to owners and admins"
|
"message": "Дозволити видалення збірок лише власникам та адміністраторам"
|
||||||
},
|
},
|
||||||
"allowAdminAccessToAllCollectionItemsDesc": {
|
"allowAdminAccessToAllCollectionItemsDesc": {
|
||||||
"message": "Власники та адміністратори можуть керувати всіма збірками та записами"
|
"message": "Власники та адміністратори можуть керувати всіма збірками та записами"
|
||||||
|
@ -9396,19 +9399,19 @@
|
||||||
"message": "Редагувати доступ"
|
"message": "Редагувати доступ"
|
||||||
},
|
},
|
||||||
"textHelpText": {
|
"textHelpText": {
|
||||||
"message": "Use text fields for data like security questions"
|
"message": "Використовуйте текстові поля для даних, як-от секретні запитання"
|
||||||
},
|
},
|
||||||
"hiddenHelpText": {
|
"hiddenHelpText": {
|
||||||
"message": "Use hidden fields for sensitive data like a password"
|
"message": "Використовуйте приховані поля для конфіденційних даних, як-от пароль"
|
||||||
},
|
},
|
||||||
"checkBoxHelpText": {
|
"checkBoxHelpText": {
|
||||||
"message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email"
|
"message": "Використовуйте прапорці, якщо хочете автоматично заповнювати поля, як-от адресу е-пошти"
|
||||||
},
|
},
|
||||||
"linkedHelpText": {
|
"linkedHelpText": {
|
||||||
"message": "Use a linked field when you are experiencing autofill issues for a specific website."
|
"message": "Використовуйте пов'язане поле у разі виникнення проблем з автозаповненням для певного вебсайту."
|
||||||
},
|
},
|
||||||
"linkedLabelHelpText": {
|
"linkedLabelHelpText": {
|
||||||
"message": "Enter the the field's html id, name, aria-label, or placeholder."
|
"message": "Введіть html-ідентифікатор поля, назву, мітку або заповнювач."
|
||||||
},
|
},
|
||||||
"addAttachment": {
|
"addAttachment": {
|
||||||
"message": "Додати вкладення"
|
"message": "Додати вкладення"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "Sao chép mật khẩu",
|
"message": "Sao chép mật khẩu",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "Sao chép tên đăng nhập",
|
"message": "Sao chép tên đăng nhập",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "复制密码",
|
"message": "复制密码",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "复制用户名",
|
"message": "复制用户名",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -663,6 +663,9 @@
|
||||||
"message": "複製密碼",
|
"message": "複製密碼",
|
||||||
"description": "Copy password to clipboard"
|
"description": "Copy password to clipboard"
|
||||||
},
|
},
|
||||||
|
"passwordCopied": {
|
||||||
|
"message": "Password copied"
|
||||||
|
},
|
||||||
"copyUsername": {
|
"copyUsername": {
|
||||||
"message": "複製使用者名稱",
|
"message": "複製使用者名稱",
|
||||||
"description": "Copy username to clipboard"
|
"description": "Copy username to clipboard"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<bit-section>
|
<bit-section [disableMargin]="disableMargin">
|
||||||
<bit-section-header *ngIf="showHeader">
|
<bit-section-header *ngIf="showHeader">
|
||||||
<h6 bitTypography="h6">{{ "options" | i18n }}</h6>
|
<h6 bitTypography="h6">{{ "options" | i18n }}</h6>
|
||||||
</bit-section-header>
|
</bit-section-header>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { coerceBooleanProperty } from "@angular/cdk/coercion";
|
||||||
import { OnInit, Input, Output, EventEmitter, Component, OnDestroy } from "@angular/core";
|
import { OnInit, Input, Output, EventEmitter, Component, OnDestroy } from "@angular/core";
|
||||||
import { FormBuilder } from "@angular/forms";
|
import { FormBuilder } from "@angular/forms";
|
||||||
import { BehaviorSubject, skip, takeUntil, Subject } from "rxjs";
|
import { BehaviorSubject, skip, takeUntil, Subject } from "rxjs";
|
||||||
|
@ -47,6 +48,9 @@ export class PassphraseSettingsComponent implements OnInit, OnDestroy {
|
||||||
@Input()
|
@Input()
|
||||||
showHeader: boolean = true;
|
showHeader: boolean = true;
|
||||||
|
|
||||||
|
/** Removes bottom margin from `bit-section` */
|
||||||
|
@Input({ transform: coerceBooleanProperty }) disableMargin = false;
|
||||||
|
|
||||||
/** Emits settings updates and completes if the settings become unavailable.
|
/** Emits settings updates and completes if the settings become unavailable.
|
||||||
* @remarks this does not emit the initial settings. If you would like
|
* @remarks this does not emit the initial settings. If you would like
|
||||||
* to receive live settings updates including the initial update,
|
* to receive live settings updates including the initial update,
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
class="tw-mt-6"
|
class="tw-mt-6"
|
||||||
*ngIf="(algorithm$ | async)?.id === 'password'"
|
*ngIf="(algorithm$ | async)?.id === 'password'"
|
||||||
[userId]="this.userId$ | async"
|
[userId]="this.userId$ | async"
|
||||||
|
[disableMargin]="disableMargin"
|
||||||
(onUpdated)="generate$.next()"
|
(onUpdated)="generate$.next()"
|
||||||
/>
|
/>
|
||||||
<tools-passphrase-settings
|
<tools-passphrase-settings
|
||||||
|
@ -39,4 +40,5 @@
|
||||||
*ngIf="(algorithm$ | async)?.id === 'passphrase'"
|
*ngIf="(algorithm$ | async)?.id === 'passphrase'"
|
||||||
[userId]="this.userId$ | async"
|
[userId]="this.userId$ | async"
|
||||||
(onUpdated)="generate$.next()"
|
(onUpdated)="generate$.next()"
|
||||||
|
[disableMargin]="disableMargin"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { coerceBooleanProperty } from "@angular/cdk/coercion";
|
||||||
import { Component, EventEmitter, Input, NgZone, OnDestroy, OnInit, Output } from "@angular/core";
|
import { Component, EventEmitter, Input, NgZone, OnDestroy, OnInit, Output } from "@angular/core";
|
||||||
import {
|
import {
|
||||||
BehaviorSubject,
|
BehaviorSubject,
|
||||||
|
@ -45,6 +46,9 @@ export class PasswordGeneratorComponent implements OnInit, OnDestroy {
|
||||||
@Input()
|
@Input()
|
||||||
userId: UserId | null;
|
userId: UserId | null;
|
||||||
|
|
||||||
|
/** Removes bottom margin, passed to downstream components */
|
||||||
|
@Input({ transform: coerceBooleanProperty }) disableMargin = false;
|
||||||
|
|
||||||
/** tracks the currently selected credential type */
|
/** tracks the currently selected credential type */
|
||||||
protected credentialType$ = new BehaviorSubject<PasswordAlgorithm>(null);
|
protected credentialType$ = new BehaviorSubject<PasswordAlgorithm>(null);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<bit-section>
|
<bit-section [disableMargin]="disableMargin">
|
||||||
<bit-section-header *ngIf="showHeader">
|
<bit-section-header *ngIf="showHeader">
|
||||||
<h2 bitTypography="h6">{{ "options" | i18n }}</h2>
|
<h2 bitTypography="h6">{{ "options" | i18n }}</h2>
|
||||||
</bit-section-header>
|
</bit-section-header>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { coerceBooleanProperty } from "@angular/cdk/coercion";
|
||||||
import { OnInit, Input, Output, EventEmitter, Component, OnDestroy } from "@angular/core";
|
import { OnInit, Input, Output, EventEmitter, Component, OnDestroy } from "@angular/core";
|
||||||
import { FormBuilder } from "@angular/forms";
|
import { FormBuilder } from "@angular/forms";
|
||||||
import { BehaviorSubject, takeUntil, Subject, map, filter, tap, debounceTime, skip } from "rxjs";
|
import { BehaviorSubject, takeUntil, Subject, map, filter, tap, debounceTime, skip } from "rxjs";
|
||||||
|
@ -55,6 +56,9 @@ export class PasswordSettingsComponent implements OnInit, OnDestroy {
|
||||||
@Input()
|
@Input()
|
||||||
waitMs: number = 100;
|
waitMs: number = 100;
|
||||||
|
|
||||||
|
/** Removes bottom margin from `bit-section` */
|
||||||
|
@Input({ transform: coerceBooleanProperty }) disableMargin = false;
|
||||||
|
|
||||||
/** Emits settings updates and completes if the settings become unavailable.
|
/** Emits settings updates and completes if the settings become unavailable.
|
||||||
* @remarks this does not emit the initial settings. If you would like
|
* @remarks this does not emit the initial settings. If you would like
|
||||||
* to receive live settings updates including the initial update,
|
* to receive live settings updates including the initial update,
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue