mirror of
https://github.com/bitwarden/browser
synced 2026-01-07 02:53:28 +00:00
* WIP admin console layout * Update icons * Migrate more things * Migrate the last pages * Move header to web * Fix story not working * Convert header component to standalone * Migrate org layout to standalone * Enable org switcher * Add AC to product switcher * Migrate provider portal to vertical nav * Migrate PM * Prettier fixes * Change AC and PP to use secondary variant layout & update logos * Remove full width setting * Remove commented code * Add header to report pages * Add provider portal banner * Fix banner for billing pages * Move vault title to header * Prevent scrollbar jumping * Move send button to header * Replace search input with bit-search * Remove unused files and css * Add banner * Tweak storage option * Fix duplicate nav item after merge * Migrate banner state to state provider framework * [AC-2078] Fix device approvals header * [PM-5861] Hide AC from product switcher for users that do not have access * [PM-5860] Fix Vault and Send page headers * [AC-2075] Fix missing link on reporting nav group * [AC-2079] Hide Payment Method and Billing History pages for self-hosted instances * [AC-2090] Hide reports/event log nav items for users that do not have permission * [AC-2092] Fix missing provider portal option in product switcher on page load * Add null check for organization in org layout component * [AC-2094] Fix missing page header for new client orgs page * [AC-2093] Update New client button styling * Fix failing test after merge * [PM-2087] Use disk-local for web layout banner * [PM-6041] Update banner copy to read "web app" * [PM-6094] Update banner link to marketing URL * [PM-6114] add CL container component to VVR pages (#7802) * create bit-container component * add container to all page components * Fix linting errors after merge with main * Fix product switcher stories * Fix web-header stories * mock org state properly in product switcher stories (#7956) * refactor: move web layout migration banner logic into a service (#7958) * make CL codeowner of web header files * move migration banner logic to service; update stories * [PM-5862] Ensure a sync has run before hiding navigation links * Remove leftover banner global state * Re-add dropped selfHosted ngIf * Add rel noreferrer * Remove comment --------- Co-authored-by: Shane Melton <smelton@bitwarden.com> Co-authored-by: Will Martin <contact@willmartian.com>
267 lines
8.7 KiB
HTML
267 lines
8.7 KiB
HTML
<app-header></app-header>
|
|
|
|
<bit-container>
|
|
<p>
|
|
{{ "emergencyAccessDesc" | i18n }}
|
|
<a href="https://bitwarden.com/help/emergency-access/" target="_blank" rel="noreferrer">
|
|
{{ "learnMore" | i18n }}.
|
|
</a>
|
|
</p>
|
|
|
|
<p *ngIf="isOrganizationOwner">
|
|
<b>{{ "warning" | i18n }}:</b> {{ "emergencyAccessOwnerWarning" | i18n }}
|
|
</p>
|
|
|
|
<div class="page-header d-flex">
|
|
<h2>
|
|
{{ "trustedEmergencyContacts" | i18n }}
|
|
<app-premium-badge></app-premium-badge>
|
|
</h2>
|
|
<div class="ml-auto d-flex">
|
|
<button
|
|
class="btn btn-sm btn-outline-primary ml-3"
|
|
type="button"
|
|
(click)="invite()"
|
|
[disabled]="!canAccessPremium"
|
|
>
|
|
<i aria-hidden="true" class="bwi bwi-plus bwi-fw"></i>
|
|
{{ "addEmergencyContact" | i18n }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<table
|
|
class="table table-hover table-list mb-0"
|
|
*ngIf="trustedContacts && trustedContacts.length"
|
|
>
|
|
<tbody>
|
|
<tr *ngFor="let c of trustedContacts; let i = index">
|
|
<td width="30">
|
|
<bit-avatar
|
|
[text]="c | userName"
|
|
[id]="c.granteeId"
|
|
[color]="c.avatarColor"
|
|
size="small"
|
|
></bit-avatar>
|
|
</td>
|
|
<td>
|
|
<a href="#" appStopClick (click)="edit(c)">{{ c.email }}</a>
|
|
<span
|
|
bitBadge
|
|
variant="secondary"
|
|
*ngIf="c.status === emergencyAccessStatusType.Invited"
|
|
>{{ "invited" | i18n }}</span
|
|
>
|
|
<span
|
|
bitBadge
|
|
variant="warning"
|
|
*ngIf="c.status === emergencyAccessStatusType.Accepted"
|
|
>{{ "accepted" | i18n }}</span
|
|
>
|
|
<span
|
|
bitBadge
|
|
variant="warning"
|
|
*ngIf="c.status === emergencyAccessStatusType.RecoveryInitiated"
|
|
>{{ "emergencyAccessRecoveryInitiated" | i18n }}</span
|
|
>
|
|
<span bitBadge *ngIf="c.status === emergencyAccessStatusType.RecoveryApproved">{{
|
|
"emergencyAccessRecoveryApproved" | i18n
|
|
}}</span>
|
|
|
|
<span bitBadge *ngIf="c.type === emergencyAccessType.View">{{ "view" | i18n }}</span>
|
|
<span bitBadge *ngIf="c.type === emergencyAccessType.Takeover">{{
|
|
"takeover" | i18n
|
|
}}</span>
|
|
|
|
<small class="text-muted d-block" *ngIf="c.name">{{ c.name }}</small>
|
|
</td>
|
|
<td class="table-list-options">
|
|
<button
|
|
[bitMenuTriggerFor]="trustedContactOptions"
|
|
class="tw-border-none tw-bg-transparent tw-text-main"
|
|
type="button"
|
|
appA11yTitle="{{ 'options' | i18n }}"
|
|
>
|
|
<i class="bwi bwi-ellipsis-v bwi-lg" aria-hidden="true"></i>
|
|
</button>
|
|
<bit-menu #trustedContactOptions>
|
|
<button
|
|
type="button"
|
|
bitMenuItem
|
|
*ngIf="c.status === emergencyAccessStatusType.Invited"
|
|
(click)="reinvite(c)"
|
|
>
|
|
<i class="bwi bwi-fw bwi-envelope" aria-hidden="true"></i>
|
|
{{ "resendInvitation" | i18n }}
|
|
</button>
|
|
<button
|
|
type="button"
|
|
bitMenuItem
|
|
*ngIf="c.status === emergencyAccessStatusType.Accepted"
|
|
(click)="confirm(c)"
|
|
>
|
|
<i class="bwi bwi-fw bwi-check" aria-hidden="true"></i>
|
|
{{ "confirm" | i18n }}
|
|
</button>
|
|
<button
|
|
type="button"
|
|
bitMenuItem
|
|
*ngIf="c.status === emergencyAccessStatusType.RecoveryInitiated"
|
|
(click)="approve(c)"
|
|
>
|
|
<i class="bwi bwi-fw bwi-check" aria-hidden="true"></i>
|
|
{{ "approve" | i18n }}
|
|
</button>
|
|
<button
|
|
type="button"
|
|
bitMenuItem
|
|
*ngIf="
|
|
c.status === emergencyAccessStatusType.RecoveryInitiated ||
|
|
c.status === emergencyAccessStatusType.RecoveryApproved
|
|
"
|
|
(click)="reject(c)"
|
|
>
|
|
<i class="bwi bwi-fw bwi-close" aria-hidden="true"></i>
|
|
{{ "reject" | i18n }}
|
|
</button>
|
|
<button type="button" bitMenuItem (click)="remove(c)">
|
|
<i class="bwi bwi-fw bwi-close" aria-hidden="true"></i>
|
|
{{ "remove" | i18n }}
|
|
</button>
|
|
</bit-menu>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<ng-container *ngIf="!trustedContacts || !trustedContacts.length">
|
|
<p *ngIf="loaded">{{ "noTrustedContacts" | i18n }}</p>
|
|
<ng-container *ngIf="!loaded">
|
|
<i
|
|
class="bwi bwi-spinner bwi-spin text-muted"
|
|
title="{{ 'loading' | i18n }}"
|
|
aria-hidden="true"
|
|
></i>
|
|
<span class="sr-only">{{ "loading" | i18n }}</span>
|
|
</ng-container>
|
|
</ng-container>
|
|
|
|
<div class="page-header spaced-header">
|
|
<h2>{{ "designatedEmergencyContacts" | i18n }}</h2>
|
|
</div>
|
|
|
|
<table
|
|
class="table table-hover table-list mb-0"
|
|
*ngIf="grantedContacts && grantedContacts.length"
|
|
>
|
|
<tbody>
|
|
<tr *ngFor="let c of grantedContacts; let i = index">
|
|
<td width="30">
|
|
<bit-avatar
|
|
[text]="c | userName"
|
|
[id]="c.grantorId"
|
|
[color]="c.avatarColor"
|
|
size="small"
|
|
></bit-avatar>
|
|
</td>
|
|
<td>
|
|
<span>{{ c.email }}</span>
|
|
<span bitBadge *ngIf="c.status === emergencyAccessStatusType.Invited">{{
|
|
"invited" | i18n
|
|
}}</span>
|
|
<span
|
|
bitBadge
|
|
variant="warning"
|
|
*ngIf="c.status === emergencyAccessStatusType.Accepted"
|
|
>{{ "accepted" | i18n }}</span
|
|
>
|
|
<span
|
|
bitBadge
|
|
variant="warning"
|
|
*ngIf="c.status === emergencyAccessStatusType.RecoveryInitiated"
|
|
>{{ "emergencyAccessRecoveryInitiated" | i18n }}</span
|
|
>
|
|
<span
|
|
bitBadge
|
|
variant="success"
|
|
*ngIf="c.status === emergencyAccessStatusType.RecoveryApproved"
|
|
>{{ "emergencyAccessRecoveryApproved" | i18n }}</span
|
|
>
|
|
|
|
<span bitBadge *ngIf="c.type === emergencyAccessType.View">{{ "view" | i18n }}</span>
|
|
<span bitBadge *ngIf="c.type === emergencyAccessType.Takeover">{{
|
|
"takeover" | i18n
|
|
}}</span>
|
|
|
|
<small class="text-muted d-block" *ngIf="c.name">{{ c.name }}</small>
|
|
</td>
|
|
<td class="table-list-options">
|
|
<button
|
|
[bitMenuTriggerFor]="grantedContactOptions"
|
|
class="tw-border-none tw-bg-transparent tw-text-main"
|
|
type="button"
|
|
appA11yTitle="{{ 'options' | i18n }}"
|
|
>
|
|
<i class="bwi bwi-ellipsis-v bwi-lg" aria-hidden="true"></i>
|
|
</button>
|
|
<bit-menu #grantedContactOptions>
|
|
<button
|
|
type="button"
|
|
bitMenuItem
|
|
*ngIf="c.status === emergencyAccessStatusType.Confirmed"
|
|
(click)="requestAccess(c)"
|
|
>
|
|
<i class="bwi bwi-fw bwi-envelope" aria-hidden="true"></i>
|
|
{{ "requestAccess" | i18n }}
|
|
</button>
|
|
<button
|
|
type="button"
|
|
bitMenuItem
|
|
*ngIf="
|
|
c.status === emergencyAccessStatusType.RecoveryApproved &&
|
|
c.type === emergencyAccessType.Takeover
|
|
"
|
|
(click)="takeover(c)"
|
|
>
|
|
<i class="bwi bwi-fw bwi-key" aria-hidden="true"></i>
|
|
{{ "takeover" | i18n }}
|
|
</button>
|
|
<button
|
|
type="button"
|
|
bitMenuItem
|
|
*ngIf="
|
|
c.status === emergencyAccessStatusType.RecoveryApproved &&
|
|
c.type === emergencyAccessType.View
|
|
"
|
|
[routerLink]="c.id"
|
|
>
|
|
<i class="bwi bwi-fw bwi-eye" aria-hidden="true"></i>
|
|
{{ "view" | i18n }}
|
|
</button>
|
|
<button type="button" bitMenuItem (click)="remove(c)">
|
|
<i class="bwi bwi-fw bwi-close" aria-hidden="true"></i>
|
|
{{ "remove" | i18n }}
|
|
</button>
|
|
</bit-menu>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<ng-container *ngIf="!grantedContacts || !grantedContacts.length">
|
|
<p *ngIf="loaded">{{ "noGrantedAccess" | i18n }}</p>
|
|
<ng-container *ngIf="!loaded">
|
|
<i
|
|
class="bwi bwi-spinner bwi-spin text-muted"
|
|
title="{{ 'loading' | i18n }}"
|
|
aria-hidden="true"
|
|
></i>
|
|
<span class="sr-only">{{ "loading" | i18n }}</span>
|
|
</ng-container>
|
|
</ng-container>
|
|
</bit-container>
|
|
|
|
<ng-template #addEdit></ng-template>
|
|
<ng-template #takeoverTemplate></ng-template>
|
|
<ng-template #confirmTemplate></ng-template>
|