1
0
mirror of https://github.com/bitwarden/browser.git synced 2024-12-22 16:29:09 +01:00

[PM-1826] [PM-2168] [Tech debt] Migrate file-password-prompt to dialog (#5666)

* Migrate file-password-prompt to Dialog

* Fix issue with cancel/empty password returned

* Removed unneeded click handler to cancel dialog

* Added margin as requested by design

* Only apply margin to top of field

* Call submit when clicking on Import data

* Add form and and submit trigger
This commit is contained in:
Daniel James Smith 2023-06-29 21:59:17 +02:00 committed by GitHub
parent 3abb1c9a3b
commit 24d9ac88ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 43 additions and 62 deletions

View File

@ -1,22 +1,12 @@
<!-- Please remove this disable statement when editing this file! --> <form (submit)="submit()">
<!-- eslint-disable tailwindcss/no-custom-classname --> <bit-dialog>
<div <span bitDialogTitle>
class="modal fade" {{ "confirmVaultImport" | i18n }}
role="dialog" </span>
aria-modal="true"
[attr.aria-labelledby]="'confirmVaultImport' | i18n" <div bitDialogContent>
>
<div class="modal-dialog modal-dialog-scrollable" role="document">
<form #form (ngSubmit)="submit()">
<div class="form-group modal-content">
<h2 class="tw-my-6 tw-ml-3.5 tw-font-semibold" id="confirmVaultImport">
{{ "confirmVaultImport" | i18n | uppercase }}
</h2>
<div
class="tw-border-0 tw-border-t tw-border-solid tw-border-secondary-300 tw-px-3.5 tw-pt-3.5"
>
{{ "confirmVaultImportDesc" | i18n }} {{ "confirmVaultImportDesc" | i18n }}
<bit-form-field class="tw-pt-3.5"> <bit-form-field class="tw-mt-6">
<bit-label>{{ "confirmFilePassword" | i18n }}</bit-label> <bit-label>{{ "confirmFilePassword" | i18n }}</bit-label>
<input <input
bitInput bitInput
@ -29,17 +19,14 @@
<button type="button" bitSuffix bitIconButton bitPasswordInputToggle></button> <button type="button" bitSuffix bitIconButton bitPasswordInputToggle></button>
</bit-form-field> </bit-form-field>
</div> </div>
<div
class="tw-flex tw-w-full tw-flex-wrap tw-items-center tw-border-0 tw-border-t tw-border-solid tw-border-secondary-300 tw-bg-background-alt tw-px-3.5 tw-pb-3.5 tw-pt-4" <ng-container bitDialogFooter>
> <button bitButton buttonType="primary" type="submit">
<button bitButton buttonType="primary" class="tw-mr-2" type="submit" appBlurClick>
<span>{{ "importData" | i18n }}</span> <span>{{ "importData" | i18n }}</span>
</button> </button>
<button bitButton buttonType="secondary" type="button" (click)="cancel()"> <button bitButton bitDialogClose buttonType="secondary" type="button">
<span>{{ "cancel" | i18n }}</span> <span>{{ "cancel" | i18n }}</span>
</button> </button>
</div> </ng-container>
</div> </bit-dialog>
</form> </form>
</div>
</div>

View File

@ -1,26 +1,20 @@
import { DialogRef } from "@angular/cdk/dialog";
import { Component } from "@angular/core"; import { Component } from "@angular/core";
import { FormControl, Validators } from "@angular/forms"; import { FormControl, Validators } from "@angular/forms";
import { ModalRef } from "@bitwarden/angular/components/modal/modal.ref";
@Component({ @Component({
templateUrl: "file-password-prompt.component.html", templateUrl: "file-password-prompt.component.html",
}) })
export class FilePasswordPromptComponent { export class FilePasswordPromptComponent {
filePassword = new FormControl("", Validators.required); filePassword = new FormControl("", Validators.required);
constructor(private modalRef: ModalRef) {} constructor(public dialogRef: DialogRef) {}
submit() { submit() {
this.filePassword.markAsTouched(); this.filePassword.markAsTouched();
if (!this.filePassword.valid) { if (!this.filePassword.valid) {
return; return;
} }
this.dialogRef.close(this.filePassword.value);
this.modalRef.close(this.filePassword.value);
}
cancel() {
this.modalRef.close(null);
} }
} }

View File

@ -1,7 +1,7 @@
import { Component, OnDestroy, OnInit } from "@angular/core"; import { Component, OnDestroy, OnInit } from "@angular/core";
import { Router } from "@angular/router"; import { Router } from "@angular/router";
import * as JSZip from "jszip"; import * as JSZip from "jszip";
import { Subject } from "rxjs"; import { Subject, lastValueFrom } from "rxjs";
import { takeUntil } from "rxjs/operators"; import { takeUntil } from "rxjs/operators";
import Swal, { SweetAlertIcon } from "sweetalert2"; import Swal, { SweetAlertIcon } from "sweetalert2";
@ -270,15 +270,11 @@ export class ImportComponent implements OnInit, OnDestroy {
} }
async getFilePassword(): Promise<string> { async getFilePassword(): Promise<string> {
const ref = this.modalService.open(FilePasswordPromptComponent, { const dialog = this.dialogService.open<string>(FilePasswordPromptComponent, {
allowMultipleModals: true, ariaModal: true,
}); });
if (ref == null) { return await lastValueFrom(dialog.closed);
return null;
}
return await ref.onClosedPromise();
} }
ngOnDestroy(): void { ngOnDestroy(): void {

View File

@ -62,6 +62,10 @@ export class BitwardenPasswordProtectedImporter extends BitwardenJsonImporter im
jdoc: BitwardenPasswordProtectedFileFormat, jdoc: BitwardenPasswordProtectedFileFormat,
password: string password: string
): Promise<boolean> { ): Promise<boolean> {
if (this.isNullOrWhitespace(password)) {
return false;
}
this.key = await this.cryptoService.makePinKey( this.key = await this.cryptoService.makePinKey(
password, password,
jdoc.salt, jdoc.salt,