keycloak-aplcache

Details

diff --git a/services/src/main/java/org/keycloak/services/resources/account/AccountCredentialResource.java b/services/src/main/java/org/keycloak/services/resources/account/AccountCredentialResource.java
index 42cf4e4..3af53c5 100644
--- a/services/src/main/java/org/keycloak/services/resources/account/AccountCredentialResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/account/AccountCredentialResource.java
@@ -1,5 +1,6 @@
 package org.keycloak.services.resources.account;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import org.keycloak.credential.CredentialModel;
 import org.keycloak.credential.CredentialProvider;
 import org.keycloak.credential.PasswordCredentialProvider;
@@ -92,6 +93,7 @@ public class AccountCredentialResource {
 
     }
 
+    @JsonIgnoreProperties(ignoreUnknown=true)
     public static class PasswordUpdate {
 
         private String currentPassword;
diff --git a/themes/src/main/resources/theme/keycloak-preview/account/resources/app/content/password-page/password-page.component.html b/themes/src/main/resources/theme/keycloak-preview/account/resources/app/content/password-page/password-page.component.html
index 8e4aceb..c10d780 100644
--- a/themes/src/main/resources/theme/keycloak-preview/account/resources/app/content/password-page/password-page.component.html
+++ b/themes/src/main/resources/theme/keycloak-preview/account/resources/app/content/password-page/password-page.component.html
@@ -5,7 +5,7 @@
 <div class="col-sm-12 card-pf">
   <div class="card-pf-body p-b">
     <span class="i pficon pficon-info"></span>
-    {{'passwordLastUpdateMessage' | translate}} <strong></strong>
+    {{'passwordLastUpdateMessage' | translate}} <strong>{{lastPasswordUpdate | date:'medium'}}</strong>
   </div>
 </div>
 
@@ -26,17 +26,17 @@
             <input readonly="" value="this is not a login form" style="display: none;" type="text">
             <input readonly="" value="this is not a login form" style="display: none;" type="password">
             <div class="form-group">
-                <label for="password" class="control-label">{{'currentPassword' | translate}}</label>
-                <input ngModel class="form-control" id="password" name="password" autofocus="" autocomplete="off" type="password">
+                <label for="password" class="control-label">{{'currentPassword' | translate}}</label><span class="required">*</span>
+                <input ngModel class="form-control" #password id="password" name="currentPassword" autofocus="" autocomplete="off" type="password">
             </div>
 
             <div class="form-group">
-                <label for="password-new" class="control-label">{{'passwordNew' | translate}}</label>
+                <label for="password-new" class="control-label">{{'passwordNew' | translate}}</label><span class="required">*</span>
                 <input ngModel class="form-control" id="newPassword" name="newPassword" autocomplete="off" type="password">
             </div>
 
             <div class="form-group">
-                <label for="password-confirm" class="control-label">{{'passwordConfirm' | translate}}</label>
+                <label for="password-confirm" class="control-label">{{'passwordConfirm' | translate}}</label><span class="required">*</span>
                 <input ngModel class="form-control" id="confirmation" name="confirmation" autocomplete="off" type="password">
             </div>
 
diff --git a/themes/src/main/resources/theme/keycloak-preview/account/resources/app/content/password-page/password-page.component.ts b/themes/src/main/resources/theme/keycloak-preview/account/resources/app/content/password-page/password-page.component.ts
index dc9e62c..177298f 100644
--- a/themes/src/main/resources/theme/keycloak-preview/account/resources/app/content/password-page/password-page.component.ts
+++ b/themes/src/main/resources/theme/keycloak-preview/account/resources/app/content/password-page/password-page.component.ts
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import {Component, OnInit, ViewChild} from '@angular/core';
+import {Component, OnInit, ViewChild, Renderer2} from '@angular/core';
 import {Response} from '@angular/http';
 import {FormGroup} from '@angular/forms';
 
@@ -28,19 +28,31 @@ import {AccountServiceClient} from '../../account-service/account.service';
 export class PasswordPageComponent implements OnInit {
 
     @ViewChild('formGroup') private formGroup: FormGroup;
+    private lastPasswordUpdate: number;
     
-    constructor(private accountSvc: AccountServiceClient) {
+    constructor(private accountSvc: AccountServiceClient, private renderer: Renderer2) {
+        this.accountSvc.doGetRequest("/credentials/password", (res: Response) => this.handleGetResponse(res));
     }
     
     public changePassword() {
         console.log("posting: " + JSON.stringify(this.formGroup.value));
-        this.accountSvc.doPostRequest("/credentials", (res: Response) => this.handlePostResponse(res), this.formGroup.value);
+        this.accountSvc.doPostRequest("/credentials/password", (res: Response) => this.handlePostResponse(res), this.formGroup.value);
+        this.renderer.selectRootElement('#password').focus();
     }
     
     protected handlePostResponse(res: Response) {
       console.log('**** response from account POST ***');
       console.log(JSON.stringify(res));
       console.log('***************************************');
+      this.formGroup.reset();
+      this.accountSvc.doGetRequest("/credentials/password", (res: Response) => this.handleGetResponse(res));
+    }
+    
+    protected handleGetResponse(res: Response) {
+        console.log('**** response from account POST ***');
+        console.log(JSON.stringify(res));
+        console.log('***************************************');
+        this.lastPasswordUpdate = res.json()['lastUpdate'];
     }
 
     ngOnInit() {