From 77116aeb813bb3ffaff1f31a03c310d90ac6a03e Mon Sep 17 00:00:00 2001
From: Muthukrishnanmatriot
 <76949556+muthukrishnanmatriot@users.noreply.github.com>
Date: Wed, 29 Sep 2021 10:21:49 +0530
Subject: [PATCH] TMSS-937 - update the code for access request and forgot pass

---
 .../tmss_webapp/src/authenticate/auth.js       | 13 +++++++++----
 .../tmss_webapp/src/authenticate/login.js      | 18 +++++++++++++++---
 .../tmss_webapp/src/layout/sass/_login.scss    |  5 ++++-
 .../tmss_webapp/src/services/auth.service.js   |  6 ++++++
 .../src/services/reservation.service.js        |  9 ---------
 .../tmss_webapp/src/utils/ui.constants.js      |  1 +
 6 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.js b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.js
index d8f7191c119..fd9e89a35ce 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/auth.js
@@ -7,21 +7,26 @@ const axios = require('axios');
  * Global functions to authenticate user and get user details from browser local storage.
  */
 const Auth = {
-    /** To check if user already logged in and the token is available in the browser local storage */
+    /** To check if user already logged in 
+     * - First it will check the API token is available in the browser local storage
+     * - If not then check the Keycloak authendication
+     * - Return false if no authentication found
+     */
     isAuthenticated: async () => {
         let user = localStorage.getItem("user");
         if (user) {
             user = JSON.parse(user);
             return Auth.getUserPermission(user);
-        }else {
+        }   else {
+            //Keycloak authendication
             const res = await AuthService.keycloakAuthenticate();
-            if(res && res.is_authenticated){
+            if (res && res.is_authenticated) {
                 localStorage.setItem("loginType", 'Keycloak');
                 const cookies = document.cookie.split(';').reduce((prev, current) => {
                     const [name, value] = current.split(/\s?(.*?)=(.*)/).splice(1, 2);
                     prev[name] = value;
                     return prev;
-                  }, {});
+                }, {});
                 const userDetails = {'name':res.username, 'token': cookies.csrftoken};
                 axios.defaults.headers.common['Authorization'] = `Token ${cookies.csrftoken}`;
                 localStorage.setItem("user", JSON.stringify(userDetails));
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/login.js b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/login.js
index b753bc278a5..a7fdb5d9ef7 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/login.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/login.js
@@ -24,6 +24,7 @@ export class Login extends Component {
         this.formSubmit = this.formSubmit.bind(this);
         this.doKeyCloakLogin = this.doKeyCloakLogin.bind(this);
         this.forgetPassword = this.forgetPassword.bind(this);
+        this.requestAccess = this.requestAccess.bind(this);
     }
 
     /**
@@ -89,6 +90,13 @@ export class Login extends Component {
         window.location.href = UIConstants.FORGET_PASSWORD_URL;
     }
 
+    /**
+     * Redirect to Request access page
+     */
+    async requestAccess() {
+        window.location.href = UIConstants.REQUEST_ACCESS_URL;
+    }
+
     render() {
         if (this.state.redirect) {
             return (<Redirect to={{pathname: this.state.redirect}} />);
@@ -139,15 +147,19 @@ export class Login extends Component {
                                                 <div className="row form-footer">
                                                     <div className="col-md-6 button-div" style={{textAlign: 'left'}} >
                                                             <button className="btn btn-primary"
-                                                                onClick={this.doKeyCloakLogin}>Login with KeyCloak</button>
+                                                                onClick={this.doKeyCloakLogin}>Login with Keycloak</button>
                                                     </div>
                                                     <div className="col-md-6 button-div">                                                            
                                                             <button className="btn btn-primary" style={{marginLeft: '1em'}}
                                                                 disabled={Object.keys(this.state.validFields).length<2} 
                                                                 onClick={this.login}>Login</button>
                                                     </div>
-                                                    <div className="col-md-6 forget-paswd" style={{marginTop: '10px'}}>
-                                                        <a href="#" onClick={this.forgetPassword}>Forget Password?</a>
+                                                     
+                                                    <div className="col-md-6 login-form-link">
+                                                        <a href="#" onClick={this.requestAccess}>Request access</a>
+                                                    </div>
+                                                    <div className="col-md-6 forget-paswd login-form-link">
+                                                        <a href="#" onClick={this.forgetPassword}>Forgot Password?</a>
                                                     </div>
                                                 </div>
                                                 {this.state.error &&
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_login.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_login.scss
index d1df063e62e..f4bdc19ca37 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_login.scss
+++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/sass/_login.scss
@@ -48,7 +48,7 @@
     background-color: #cccccc38;
 }
 .form-footer .forget-paswd{
-    text-align: left;
+    text-align: right;
 }
 .button-div{
     text-align: right;
@@ -82,6 +82,9 @@
 .login-form .form-field i {
     padding-right: 5px;
 }
+.login-form-link {
+    margin-top: 10px;
+}
 
 @media screen and (max-width: 1100px){
     .bg-login{
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/auth.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/auth.service.js
index b5ebebf66c0..7565cda27e2 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/services/auth.service.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/services/auth.service.js
@@ -24,6 +24,11 @@ const AuthService = {
             return null;
         }
     },
+    /**
+     * Deauthenticate the user login
+     *  - Based on login type it will access the API/Keycloak url
+     * @param {*} token 
+     */
     deAuthenticate: async(token) => {
         let contentType = '';
         try {
@@ -31,6 +36,7 @@ const AuthService = {
             if (loginType && loginType === 'Application') {
                 await axios.delete("/api/token-deauth/");
             }   else {
+                //If logintype is keycloak set Content-Type to 'application/x-www-form-urlencoded; charset=UTF-8'
                 let token = '';
                 let user = localStorage.getItem("user");
                 if (user) {
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/reservation.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/reservation.service.js
index 3ca64af657c..b150f448db2 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/services/reservation.service.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/services/reservation.service.js
@@ -109,15 +109,6 @@ const ReservationService = {
             console.error(error);
         }
     },
-    getReservationStrategyTemplates: async function () {
-        try {
-            const url = `/api/reservation_strategy_template/?ordering=id`;
-            const response = await axios.get(url);
-            return response.data.results;
-        } catch (error) {
-            console.error(error);
-        }
-    },
 }
 
 export default ReservationService;
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js b/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js
index 3cc679dfc5e..8c305945d2d 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/utils/ui.constants.js
@@ -2,6 +2,7 @@ const UIConstants = {
     KEYCLOAK_AUTH_URL: '/oidc/authenticate/',
     KEYCLOAK_LOGOUT_URL: '/oidc/logout/',
     KEYCLOAK_AUTHENTICATE_URL: '/api/authentication_state/',
+    REQUEST_ACCESS_URL: '',
     FORGET_PASSWORD_URL: 'https://webportal.astron.nl/pwm/private/Login',
     tooltipOptions: {position: 'left', event: 'hover', className:"p-tooltip-custom"},
     timeline: {
-- 
GitLab