2019-04-02 05:27:54 +02:00
|
|
|
<div class="modal fade" tabindex="-1" role="dialog" aria-modal="true" attr.aria-label="{{'generatePassword' | i18n}}">
|
|
|
|
<div class="modal-dialog modal-sm" role="document">
|
2018-01-29 15:33:43 +01:00
|
|
|
<div class="modal-content">
|
|
|
|
<div class="modal-body">
|
2020-02-28 22:58:51 +01:00
|
|
|
<app-callout type="info" *ngIf="policyInEffect">
|
|
|
|
{{'passwordGeneratorPolicyInEffect' | i18n}}
|
|
|
|
</app-callout>
|
2019-04-01 19:40:49 +02:00
|
|
|
<div class="password-block">
|
|
|
|
<div class="password-wrapper" [innerHTML]="password | colorPassword" appSelectCopy></div>
|
|
|
|
</div>
|
2018-01-29 22:13:37 +01:00
|
|
|
<div class="box">
|
|
|
|
<div class="box-content condensed">
|
2019-02-21 22:53:32 +01:00
|
|
|
<a class="box-content-row" href="#" appStopClick appBlurClick (click)="regenerate()">
|
2019-04-02 05:08:54 +02:00
|
|
|
<i class="fa fa-fw fa-refresh" aria-hidden="true"></i> {{'regeneratePassword' | i18n}}
|
2018-01-29 22:13:37 +01:00
|
|
|
</a>
|
2019-02-21 22:53:32 +01:00
|
|
|
<a class="box-content-row" href="#" appStopClick appBlurClick (click)="copy()">
|
2019-04-02 05:08:54 +02:00
|
|
|
<i class="fa fa-fw fa-clipboard" aria-hidden="true"></i> {{'copyPassword' | i18n}}
|
2018-01-29 22:13:37 +01:00
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="box">
|
|
|
|
<div class="box-header">
|
2019-04-02 05:08:54 +02:00
|
|
|
<button type="button" (click)="toggleOptions()" appA11yTitle="{{'toggleVisibility' | i18n}}">
|
|
|
|
<i class="fa fa-plus-square-o" aria-hidden="true" [hidden]="showOptions"></i>
|
|
|
|
<i class="fa fa-minus-square-o" aria-hidden="true" [hidden]="!showOptions"></i>
|
2018-02-01 03:13:42 +01:00
|
|
|
{{'options' | i18n}}
|
|
|
|
</button>
|
2018-01-29 22:13:37 +01:00
|
|
|
</div>
|
2018-02-01 03:33:55 +01:00
|
|
|
<div class="box-content condensed" [hidden]="!showOptions">
|
2018-10-09 15:13:22 +02:00
|
|
|
<div class="box-content-row" appBoxRow>
|
|
|
|
<label for="type" class="sr-only">{{'type' | i18n}}</label>
|
|
|
|
<select id="type" [(ngModel)]="options.type" (change)="saveOptions()">
|
|
|
|
<option value="password">{{'password' | i18n}}</option>
|
|
|
|
<option value="passphrase">{{'passphrase' | i18n}}</option>
|
|
|
|
</select>
|
2018-01-29 22:13:37 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-10-09 15:13:22 +02:00
|
|
|
<div class="box" [hidden]="!showOptions" *ngIf="options.type === 'passphrase'">
|
2018-01-29 22:13:37 +01:00
|
|
|
<div class="box-content condensed">
|
2018-01-30 20:33:06 +01:00
|
|
|
<div class="box-content-row box-content-row-input" appBoxRow>
|
2018-10-09 15:13:22 +02:00
|
|
|
<label for="num-words">{{'numWords' | i18n}}</label>
|
|
|
|
<input id="num-words" type="number" min="3" max="20" (input)="saveOptions()"
|
2019-02-21 22:53:32 +01:00
|
|
|
[(ngModel)]="options.numWords">
|
2018-01-29 22:13:37 +01:00
|
|
|
</div>
|
2018-01-30 20:33:06 +01:00
|
|
|
<div class="box-content-row box-content-row-input" appBoxRow>
|
2018-10-09 15:13:22 +02:00
|
|
|
<label for="word-separator">{{'wordSeparator' | i18n}}</label>
|
|
|
|
<input id="word-separator" type="text" maxlength="1" (input)="saveOptions()"
|
2019-02-21 22:53:32 +01:00
|
|
|
[(ngModel)]="options.wordSeparator">
|
2018-01-29 22:13:37 +01:00
|
|
|
</div>
|
2019-07-02 22:51:58 +02:00
|
|
|
<div class="box-content-row box-content-row-checkbox" appBoxRow>
|
|
|
|
<label for="capitalize">{{'capitalize' | i18n}}</label>
|
|
|
|
<input id="capitalize" type="checkbox" (change)="saveOptions()"
|
|
|
|
[(ngModel)]="options.capitalize">
|
|
|
|
</div>
|
|
|
|
<div class="box-content-row box-content-row-checkbox" appBoxRow>
|
|
|
|
<label for="include-number">{{'includeNumber' | i18n}}</label>
|
|
|
|
<input id="include-number" type="checkbox" (change)="saveOptions()"
|
|
|
|
[(ngModel)]="options.includeNumber">
|
|
|
|
</div>
|
2018-01-29 22:13:37 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2018-10-09 15:13:22 +02:00
|
|
|
<ng-container *ngIf="options.type === 'password'">
|
|
|
|
<div class="box" [hidden]="!showOptions">
|
|
|
|
<div class="box-content condensed">
|
|
|
|
<div class="box-content-row box-content-row-slider" appBoxRow>
|
|
|
|
<label for="length">{{'length' | i18n}}</label>
|
|
|
|
<input id="length" type="number" min="5" max="128" [(ngModel)]="options.length"
|
2019-02-21 22:53:32 +01:00
|
|
|
(blur)="saveOptions()">
|
2018-10-09 15:13:22 +02:00
|
|
|
<input id="lengthRange" type="range" min="5" max="128" step="1"
|
2019-02-21 22:53:32 +01:00
|
|
|
[(ngModel)]="options.length" (change)="sliderChanged()" (input)="sliderInput()">
|
2018-10-09 15:13:22 +02:00
|
|
|
</div>
|
|
|
|
<div class="box-content-row box-content-row-checkbox" appBoxRow>
|
|
|
|
<label for="uppercase">A-Z</label>
|
|
|
|
<input id="uppercase" type="checkbox" (change)="saveOptions()"
|
2020-02-27 19:13:55 +01:00
|
|
|
[disabled]="enforcedPolicyOptions?.useUppercase" [(ngModel)]="options.uppercase">
|
2018-10-09 15:13:22 +02:00
|
|
|
</div>
|
|
|
|
<div class="box-content-row box-content-row-checkbox" appBoxRow>
|
|
|
|
<label for="lowercase">a-z</label>
|
|
|
|
<input id="lowercase" type="checkbox" (change)="saveOptions()"
|
2020-02-27 19:13:55 +01:00
|
|
|
[disabled]="enforcedPolicyOptions?.useLowercase" [(ngModel)]="options.lowercase">
|
2018-10-09 15:13:22 +02:00
|
|
|
</div>
|
|
|
|
<div class="box-content-row box-content-row-checkbox" appBoxRow>
|
|
|
|
<label for="numbers">0-9</label>
|
|
|
|
<input id="numbers" type="checkbox" (change)="saveOptions()"
|
2020-02-27 19:13:55 +01:00
|
|
|
[disabled]="enforcedPolicyOptions?.useNumbers" [(ngModel)]="options.number">
|
2018-10-09 15:13:22 +02:00
|
|
|
</div>
|
|
|
|
<div class="box-content-row box-content-row-checkbox" appBoxRow>
|
|
|
|
<label for="special">!@#$%^&*</label>
|
|
|
|
<input id="special" type="checkbox" (change)="saveOptions()"
|
2020-02-27 19:13:55 +01:00
|
|
|
[disabled]="enforcedPolicyOptions?.useSpecial" [(ngModel)]="options.special">
|
2018-10-09 15:13:22 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="box" [hidden]="!showOptions">
|
|
|
|
<div class="box-content condensed">
|
|
|
|
<div class="box-content-row box-content-row-input" appBoxRow>
|
|
|
|
<label for="min-number">{{'minNumbers' | i18n}}</label>
|
2020-02-27 19:13:55 +01:00
|
|
|
<input id="min-number" type="number" min="0" max="9" (blur)="saveOptions()"
|
2019-02-21 22:53:32 +01:00
|
|
|
[(ngModel)]="options.minNumber">
|
2018-10-09 15:13:22 +02:00
|
|
|
</div>
|
|
|
|
<div class="box-content-row box-content-row-input" appBoxRow>
|
|
|
|
<label for="min-special">{{'minSpecial' | i18n}}</label>
|
2020-02-27 19:13:55 +01:00
|
|
|
<input id="min-special" type="number" min="0" max="9" (blur)="saveOptions()"
|
2019-02-21 22:53:32 +01:00
|
|
|
[(ngModel)]="options.minSpecial">
|
2018-10-09 15:13:22 +02:00
|
|
|
</div>
|
|
|
|
<div class="box-content-row box-content-row-checkbox" appBoxRow>
|
|
|
|
<label for="ambiguous">{{'ambiguous' | i18n}}</label>
|
|
|
|
<input id="ambiguous" type="checkbox" (change)="saveOptions()"
|
2019-02-21 22:53:32 +01:00
|
|
|
[(ngModel)]="avoidAmbiguous">
|
2018-10-09 15:13:22 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</ng-container>
|
2018-01-29 18:14:19 +01:00
|
|
|
</div>
|
|
|
|
<div class="modal-footer">
|
2018-02-01 03:13:42 +01:00
|
|
|
<button type="button" class="primary" appBlurClick *ngIf="showSelect" (click)="select()"
|
2019-04-02 04:43:42 +02:00
|
|
|
appA11yTitle="{{'select' | i18n}}">
|
2019-04-02 04:56:28 +02:00
|
|
|
<i class="fa fa-lg fa-fw fa-check" aria-hidden="true"></i>
|
2018-01-29 22:13:37 +01:00
|
|
|
</button>
|
2018-08-02 05:21:32 +02:00
|
|
|
<button type="button" data-dismiss="modal">{{(showSelect ? 'cancel' : 'close') | i18n}}</button>
|
2018-01-29 15:33:43 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|