-<div class="cd-col-form">
- <form #frm="ngForm"
- [formGroup]="userForm"
- novalidate>
- <div class="card">
- <div i18n="form title"
- class="card-header">{{ action | titlecase }} {{ resource | upperFirst }}</div>
-
- <div class="card-body">
- <!-- Old password -->
- <div class="form-group row">
- <label class="cd-col-form-label required"
- for="oldpassword"
- i18n>Old password</label>
- <div class="cd-col-form-input">
- <div class="input-group">
- <input class="form-control"
- type="password"
- placeholder="Old password..."
- id="oldpassword"
- formControlName="oldpassword"
- autocomplete="new-password"
- autofocus>
- <button class="btn btn-light"
- cdPasswordButton="oldpassword">
- </button>
- </div>
- <span class="invalid-feedback"
- *ngIf="userForm.showError('oldpassword', frm, 'required')"
- i18n>This field is required.</span>
- <span class="invalid-feedback"
- *ngIf="userForm.showError('oldpassword', frm, 'notmatch')"
- i18n>The old and new passwords must be different.</span>
- </div>
- </div>
-
- <!-- New password -->
- <div class="form-group row">
- <label class="cd-col-form-label"
- for="newpassword">
- <span class="required"
- i18n>New password</span>
- <cd-helper *ngIf="passwordPolicyHelpText.length > 0"
- class="text-pre-wrap"
- html="{{ passwordPolicyHelpText }}">
- </cd-helper>
- </label>
- <div class="cd-col-form-input">
- <div class="input-group">
- <input class="form-control"
- type="password"
- placeholder="Password..."
- id="newpassword"
- autocomplete="new-password"
- formControlName="newpassword">
- <button type="button"
- class="btn btn-light"
- cdPasswordButton="newpassword">
- </button>
- </div>
- <div class="password-strength-level">
- <div class="{{ passwordStrengthLevelClass }}"
- data-toggle="tooltip"
- title="{{ passwordValuation }}">
- </div>
- </div>
- <span class="invalid-feedback"
- *ngIf="userForm.showError('newpassword', frm, 'required')"
- i18n>This field is required.</span>
- <span class="invalid-feedback"
- *ngIf="userForm.showError('newpassword', frm, 'notmatch')"
- i18n>The old and new passwords must be different.</span>
- <span class="invalid-feedback"
- *ngIf="userForm.showError('newpassword', frm, 'passwordPolicy')">
- {{ passwordValuation }}
- </span>
- </div>
- </div>
-
- <!-- Confirm new password -->
- <div class="form-group row">
- <label class="cd-col-form-label required"
- for="confirmnewpassword"
- i18n>Confirm new password</label>
- <div class="cd-col-form-input">
- <div class="input-group">
- <input class="form-control"
- type="password"
- autocomplete="new-password"
- placeholder="Confirm new password..."
- id="confirmnewpassword"
- formControlName="confirmnewpassword">
- <button class="btn btn-light"
- cdPasswordButton="confirmnewpassword">
- </button>
- </div>
- <span class="invalid-feedback"
- *ngIf="userForm.showError('confirmnewpassword', frm, 'required')"
- i18n>This field is required.</span>
- <span class="invalid-feedback"
- *ngIf="userForm.showError('confirmnewpassword', frm, 'match')"
- i18n>Password confirmation doesn't match the new password.</span>
- </div>
- </div>
+<form [formGroup]="userForm"
+ novalidate>
+ <div cdsGrid
+ [useCssGrid]="true"
+ [narrow]="true"
+ [fullWidth]="true">
+ <div cdsCol
+ [columnNumbers]="{sm: 4, md: 8}">
+ <div cdsRow
+ class="form-heading">
+ <h3>{{ action | titlecase }} {{ resource | upperFirst }}</h3>
+ <cd-help-text [formAllFieldsRequired]="true"></cd-help-text>
</div>
-
- <div class="card-footer">
+ <div cdsRow
+ class="form-item">
+ <cds-password-label
+ [invalid]="!userForm.controls.oldpassword.valid && userForm.controls.oldpassword.dirty"
+ [invalidText]="oldPasswordInvalid">
+ Old Password
+ <input cdsPassword
+ formControlName="oldpassword"
+ autocomplete="oldpassword"
+ [invalid]="!userForm.controls.oldpassword.valid && userForm.controls.oldpassword.dirty"
+ id="oldpassword"
+ autofocus>
+ </cds-password-label>
+ </div>
+ <div cdsRow
+ class="form-item">
+ <cds-password-label
+ [invalid]="!userForm.controls.newpassword.valid && userForm.controls.newpassword.dirty"
+ [invalidText]="newPasswordInvalid"
+ [helperText]="passwordPolicyHelpText">
+ New Password
+ <input cdsPassword
+ formControlName="newpassword"
+ autocomplete="newpassword"
+ [invalid]="!userForm.controls.newpassword.valid && userForm.controls.newpassword.dirty"
+ id="newpassword">
+ </cds-password-label>
+ </div>
+ <div cdsRow
+ class="form-item">
+ <cds-password-label
+ [invalid]="!userForm.controls.confirmnewpassword.valid && userForm.controls.confirmnewpassword.dirty"
+ [invalidText]="confirmNewPasswordInvalid">
+ Confirm New Password
+ <input cdsPassword
+ formControlName="confirmnewpassword"
+ autocomplete="confirmnewpassword"
+ [invalid]="!userForm.controls.confirmnewpassword.valid && userForm.controls.confirmnewpassword.dirty"
+ id="confirmnewpassword">
+ </cds-password-label>
+ </div>
+ <div cdsRow>
<cd-form-button-panel (submitActionEvent)="onSubmit()"
[form]="userForm"
[submitText]="(action | titlecase) + ' ' + (resource | upperFirst)"
- wrappingClass="text-right"></cd-form-button-panel>
+ wrappingClass="text-right form-button"></cd-form-button-panel>
</div>
</div>
- </form>
-</div>
+ </div>
+</form>
+
+<ng-template #oldPasswordInvalid>
+ <span class="invalid-feedback"
+ *ngIf="userForm.showError('oldpassword', null, 'required')"
+ i18n>{{INVALID_TEXTS['required']}}</span>
+ <span class="invalid-feedback"
+ *ngIf="userForm.showError('oldpassword', null, 'notmatch')"
+ i18n>{{INVALID_TEXTS['notmatch']}}</span>
+</ng-template>
+
+<ng-template #newPasswordInvalid>
+ <span class="invalid-feedback"
+ *ngIf="userForm.showError('newpassword', null, 'required')"
+ i18n>{{INVALID_TEXTS['required']}}</span>
+ <span class="invalid-feedback"
+ *ngIf="userForm.showError('newpassword', null, 'notmatch')"
+ i18n>{{INVALID_TEXTS['notmatch']}}</span>
+ <span class="invalid-feedback"
+ *ngIf="userForm.showError('newpassword', null, 'passwordPolicy')"
+ i18n>{{INVALID_TEXTS['passwordPolicy']}}</span>
+</ng-template>
+
+<ng-template #confirmNewPasswordInvalid>
+ <span class="invalid-feedback"
+ *ngIf="userForm.showError('confirmnewpassword', null, 'required')"
+ i18n>{{INVALID_TEXTS['required']}}</span>
+ <span class="invalid-feedback"
+ *ngIf="userForm.showError('confirmnewpassword', null, 'match')"
+ i18n>{{INVALID_TEXTS['match']}}</span>
+</ng-template>