cloud-ide-auth 1.0.17 → 1.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/cloud-ide-auth-reset-password.component-B24IDvdM.mjs +61 -0
- package/fesm2022/cloud-ide-auth-reset-password.component-B24IDvdM.mjs.map +1 -0
- package/fesm2022/cloud-ide-auth-sign-in.component-bTGPd3Zc.mjs +84 -0
- package/fesm2022/cloud-ide-auth-sign-in.component-bTGPd3Zc.mjs.map +1 -0
- package/fesm2022/cloud-ide-auth.mjs +389 -13
- package/fesm2022/cloud-ide-auth.mjs.map +1 -1
- package/index.d.ts +79 -4
- package/package.json +1 -1
- package/fesm2022/cloud-ide-auth-reset-password.component-BZiK83P_.mjs +0 -61
- package/fesm2022/cloud-ide-auth-reset-password.component-BZiK83P_.mjs.map +0 -1
- package/fesm2022/cloud-ide-auth-sign-in.component-CVfjGwuu.mjs +0 -84
- package/fesm2022/cloud-ide-auth-sign-in.component-CVfjGwuu.mjs.map +0 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Component } from '@angular/core';
|
|
3
|
+
import { CideInputComponent, CideEleButtonComponent } from 'cloud-ide-element';
|
|
4
|
+
import * as i1 from '@angular/forms';
|
|
5
|
+
import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
+
import { CommonModule } from '@angular/common';
|
|
7
|
+
import { Router } from '@angular/router';
|
|
8
|
+
import { CloudIdeAuthService } from './cloud-ide-auth.mjs';
|
|
9
|
+
|
|
10
|
+
class CideAuthResetPasswordComponent {
|
|
11
|
+
setup_param = { form_loading: false };
|
|
12
|
+
resetPassswordForm;
|
|
13
|
+
erro_message = "";
|
|
14
|
+
authService = inject(CloudIdeAuthService);
|
|
15
|
+
route = inject(Router);
|
|
16
|
+
constructor() {
|
|
17
|
+
this.resetPassswordForm = new FormGroup({
|
|
18
|
+
user_new_password: new FormControl(''),
|
|
19
|
+
user_confirm_password: new FormControl('')
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
onForgotPasssword() {
|
|
23
|
+
if (this.resetPassswordForm.valid) {
|
|
24
|
+
this.setup_param.form_loading = true;
|
|
25
|
+
const resetPasssword = {
|
|
26
|
+
user_password: this.resetPassswordForm?.get('user_password')?.value || '',
|
|
27
|
+
user_username: "",
|
|
28
|
+
sylog_config_data: {
|
|
29
|
+
reset_password_link: "",
|
|
30
|
+
reset_password_secret: "",
|
|
31
|
+
request_timestamp: new Date()
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
this.authService.resetPassword(resetPasssword)?.subscribe({
|
|
35
|
+
next: (response) => {
|
|
36
|
+
if (response?.success === true) {
|
|
37
|
+
this.setup_param.form_loading = false;
|
|
38
|
+
this.route.navigate(['auth', 'sign-in']);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
error: (error) => {
|
|
42
|
+
this.setup_param.form_loading = false;
|
|
43
|
+
this.erro_message = error?.error?.message;
|
|
44
|
+
console.log(error);
|
|
45
|
+
setTimeout(() => {
|
|
46
|
+
this.erro_message = "";
|
|
47
|
+
}, 3000);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthResetPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
53
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: CideAuthResetPasswordComponent, isStandalone: true, selector: "cide-auth-reset-password", ngImport: i0, template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\r\n<!-- Main Div Outer Div-->\r\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\r\n <!-- Forrm Wrapper -->\r\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\r\n <!-- Logo Wrapper -->\r\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\r\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\r\n alt=\"Cloud IDE Logo\" />\r\n </div> <!-- Entity name here -->\r\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Reset Password</div>\r\n <!-- Error Logger -->\r\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\r\n \r\n <!-- section for controls -->\r\n <form [formGroup]=\"resetPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\r\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\r\n <!-- New Password -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"new_password\" formControlName=\"new_password\"></cide-ele-input>\r\n </div>\r\n <!-- Confirm Password -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"confirm_password\" formControlName=\"confirm_password\"></cide-ele-input>\r\n </div> <!-- Forgot Password button -->\r\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\r\n <button cideEleButton id=\"reset_password_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!resetPassswordForm.valid\">Reset Password</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>", styles: [""], dependencies: [{ kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }] });
|
|
54
|
+
}
|
|
55
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthResetPasswordComponent, decorators: [{
|
|
56
|
+
type: Component,
|
|
57
|
+
args: [{ selector: 'cide-auth-reset-password', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent], template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\r\n<!-- Main Div Outer Div-->\r\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\r\n <!-- Forrm Wrapper -->\r\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\r\n <!-- Logo Wrapper -->\r\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\r\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\r\n alt=\"Cloud IDE Logo\" />\r\n </div> <!-- Entity name here -->\r\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Reset Password</div>\r\n <!-- Error Logger -->\r\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\r\n \r\n <!-- section for controls -->\r\n <form [formGroup]=\"resetPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\r\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\r\n <!-- New Password -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"new_password\" formControlName=\"new_password\"></cide-ele-input>\r\n </div>\r\n <!-- Confirm Password -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"confirm_password\" formControlName=\"confirm_password\"></cide-ele-input>\r\n </div> <!-- Forgot Password button -->\r\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\r\n <button cideEleButton id=\"reset_password_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!resetPassswordForm.valid\">Reset Password</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>" }]
|
|
58
|
+
}], ctorParameters: () => [] });
|
|
59
|
+
|
|
60
|
+
export { CideAuthResetPasswordComponent };
|
|
61
|
+
//# sourceMappingURL=cloud-ide-auth-reset-password.component-B24IDvdM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-ide-auth-reset-password.component-B24IDvdM.mjs","sources":["../../../projects/cloud-ide-auth/src/lib/auth/reset-password/reset-password.component.ts","../../../projects/cloud-ide-auth/src/lib/auth/reset-password/reset-password.component.html"],"sourcesContent":["import { Component, inject } from '@angular/core';\r\nimport { CideEleButtonComponent, CideInputComponent } from 'cloud-ide-element';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Router } from '@angular/router';\r\nimport { FormGroupModel } from '../sign-in/sign-in.component';\r\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\r\nimport { MResetPassword } from 'cloud-ide-lms-model';\r\n\r\n@Component({\r\n selector: 'cide-auth-reset-password',\r\n standalone: true,\r\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent],\r\n templateUrl: './reset-password.component.html',\r\n styleUrl: './reset-password.component.css'\r\n})\r\nexport class CideAuthResetPasswordComponent {\r\n public setup_param = { form_loading: false };\r\n public resetPassswordForm: FormGroupModel<{user_new_password: string, user_confirm_password: string}>;\r\n public erro_message = \"\";\r\n\r\n private authService = inject(CloudIdeAuthService);\r\n private route = inject(Router);\r\n\r\n constructor() {\r\n\r\n this.resetPassswordForm = new FormGroup({\r\n user_new_password: new FormControl(''),\r\n user_confirm_password: new FormControl('')\r\n }) as unknown as FormGroupModel<{user_new_password: string, user_confirm_password: string}>;\r\n }\r\n\r\n onForgotPasssword() {\r\n if (this.resetPassswordForm.valid) {\r\n this.setup_param.form_loading = true;\r\n const resetPasssword : MResetPassword= {\r\n user_password: this.resetPassswordForm?.get('user_password')?.value || '',\r\n user_username: \"\",\r\n sylog_config_data: {\r\n reset_password_link: \"\",\r\n reset_password_secret: \"\",\r\n request_timestamp: new Date()\r\n }\r\n }\r\n this.authService.resetPassword(resetPasssword)?.subscribe({\r\n next: (response) => {\r\n if (response?.success === true) {\r\n this.setup_param.form_loading = false;\r\n this.route.navigate(['auth', 'sign-in'])\r\n }\r\n },\r\n error: (error) => {\r\n this.setup_param.form_loading = false;\r\n this.erro_message = error?.error?.message;\r\n console.log(error)\r\n setTimeout(() => {\r\n this.erro_message = \"\"\r\n }, 3000)\r\n }\r\n });\r\n }\r\n }\r\n}\r\n\r\n","<!-- https://play.tailwindcss.com/lfO85drpUy -->\r\n<!-- Main Div Outer Div-->\r\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\r\n <!-- Forrm Wrapper -->\r\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\r\n <!-- Logo Wrapper -->\r\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\r\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\r\n alt=\"Cloud IDE Logo\" />\r\n </div> <!-- Entity name here -->\r\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Reset Password</div>\r\n <!-- Error Logger -->\r\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\r\n \r\n <!-- section for controls -->\r\n <form [formGroup]=\"resetPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\r\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\r\n <!-- New Password -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"new_password\" formControlName=\"new_password\"></cide-ele-input>\r\n </div>\r\n <!-- Confirm Password -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"confirm_password\" formControlName=\"confirm_password\"></cide-ele-input>\r\n </div> <!-- Forgot Password button -->\r\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\r\n <button cideEleButton id=\"reset_password_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!resetPassswordForm.valid\">Reset Password</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, inject, Component } from '@angular/core';
|
|
3
|
+
import * as i1 from '@angular/forms';
|
|
4
|
+
import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
5
|
+
import { CommonModule } from '@angular/common';
|
|
6
|
+
import { Router, ActivatedRoute, RouterLink } from '@angular/router';
|
|
7
|
+
import { CloudIdeAuthService } from './cloud-ide-auth.mjs';
|
|
8
|
+
import { CideInputComponent, CideEleButtonComponent } from 'cloud-ide-element';
|
|
9
|
+
import { CideLytSharedWrapperComponent, AppStateHelperService } from 'cloud-ide-layout';
|
|
10
|
+
|
|
11
|
+
class CideAuthSignInComponent extends CideLytSharedWrapperComponent {
|
|
12
|
+
shared_wrapper_setup_param = input({
|
|
13
|
+
sypg_page_code: "auth_sign_in"
|
|
14
|
+
}, ...(ngDevMode ? [{ debugName: "shared_wrapper_setup_param" }] : []));
|
|
15
|
+
setup_param = { form_loading: false };
|
|
16
|
+
loginForm;
|
|
17
|
+
erro_message = "";
|
|
18
|
+
returnUrl = '/control-panel'; // Default return URL
|
|
19
|
+
router = inject(Router);
|
|
20
|
+
activatedRoute = inject(ActivatedRoute);
|
|
21
|
+
authService = inject(CloudIdeAuthService);
|
|
22
|
+
appStateService = inject(AppStateHelperService);
|
|
23
|
+
constructor() {
|
|
24
|
+
super();
|
|
25
|
+
this.loginForm = new FormGroup({
|
|
26
|
+
custom_login_method: new FormControl('pass'),
|
|
27
|
+
user_username: new FormControl(''),
|
|
28
|
+
user_password: new FormControl(''),
|
|
29
|
+
mpin_pin: new FormControl(''),
|
|
30
|
+
stay_sign_in: new FormControl(true)
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
ngOnInit() {
|
|
34
|
+
super.ngOnInit();
|
|
35
|
+
// Get return URL from route parameters or default to '/control-panel'
|
|
36
|
+
this.returnUrl = this.activatedRoute.snapshot.queryParams['returnUrl'] || 'control-panel';
|
|
37
|
+
// If user is already authenticated, redirect to the return URL
|
|
38
|
+
if (this.authService.isAuthenticated() && !this.authService.isTokenExpired()) {
|
|
39
|
+
this.router.navigateByUrl(this.returnUrl);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
onSignIn() {
|
|
43
|
+
if (this.loginForm.valid) {
|
|
44
|
+
this.setup_param.form_loading = true;
|
|
45
|
+
this.authService.signIn(this.loginForm?.value)?.subscribe({
|
|
46
|
+
next: async (response) => {
|
|
47
|
+
if (response?.success === true) {
|
|
48
|
+
// Store user data in auth service
|
|
49
|
+
this.authService.storeUserData(response?.data?.auth_user_mst || {});
|
|
50
|
+
// Synchronize AppStateService with the same user data
|
|
51
|
+
this.appStateService.setUser(response?.data?.auth_user_mst || null);
|
|
52
|
+
// Store active entity data
|
|
53
|
+
this.appStateService.setActiveEntity(response?.data?.core_system_entity || null);
|
|
54
|
+
// Store token through the service setter which saves to localStorage
|
|
55
|
+
this.authService.auth_token = (response?.token || '');
|
|
56
|
+
console.log(response?.token);
|
|
57
|
+
// Navigate to the return URL or control panel
|
|
58
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
59
|
+
this.router.navigateByUrl(this.returnUrl);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
error: (error) => {
|
|
63
|
+
this.setup_param.form_loading = false;
|
|
64
|
+
this.erro_message = error?.error?.message;
|
|
65
|
+
console.log(error);
|
|
66
|
+
// Modern ES2022+ pattern: Use Promise-based delay
|
|
67
|
+
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
68
|
+
delay(3000).then(() => {
|
|
69
|
+
this.erro_message = "";
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthSignInComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
76
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.1.7", type: CideAuthSignInComponent, isStandalone: true, selector: "cide-auth-sign-in", inputs: { shared_wrapper_setup_param: { classPropertyName: "shared_wrapper_setup_param", publicName: "shared_wrapper_setup_param", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\r\n<!-- Main Div Outer Div-->\r\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\r\n <!-- Login Forrm Wrapper -->\r\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\r\n <!-- Logo Wrapper -->\r\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\r\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\r\n alt=\"Cloud IDE Logo\" />\r\n </div> <!-- Entity name here -->\r\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">SignIn to CloudIDE sys</div>\r\n <!-- Error Logger -->\r\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\r\n \r\n <!-- section for controls -->\r\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onSignIn()\" novalidate>\r\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\r\n <!-- Username -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\r\n </div>\r\n <!-- Password -->\r\n <div class=\"tw-m-auto tw-mt-4 tw-w-80\">\r\n <cide-ele-input id=\"user_password_mpin\" formControlName=\"user_password\"></cide-ele-input>\r\n </div>\r\n <!-- Forgot password -->\r\n <div class=\"tw-m-auto tw-mt-3 tw-flex tw-w-80 tw-justify-between\">\r\n <div>\r\n <cide-ele-input id=\"stay_sign_in\" formControlName=\"stay_sign_in\"></cide-ele-input>\r\n </div>\r\n <div>\r\n <a routerLink=\"/auth/forgot-password\" class=\"tw-text-blue-700\">Forgot Password?</a>\r\n </div>\r\n </div> <!-- Sign in button -->\r\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\r\n <button type=\"submit\" class=\"tw-w-full\" cideEleButton id=\"stay_sin_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!loginForm.valid\">a</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div>", styles: [""], dependencies: [{ kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
77
|
+
}
|
|
78
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthSignInComponent, decorators: [{
|
|
79
|
+
type: Component,
|
|
80
|
+
args: [{ selector: 'cide-auth-sign-in', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, RouterLink], template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\r\n<!-- Main Div Outer Div-->\r\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\r\n <!-- Login Forrm Wrapper -->\r\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\r\n <!-- Logo Wrapper -->\r\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\r\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\r\n alt=\"Cloud IDE Logo\" />\r\n </div> <!-- Entity name here -->\r\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">SignIn to CloudIDE sys</div>\r\n <!-- Error Logger -->\r\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\r\n \r\n <!-- section for controls -->\r\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onSignIn()\" novalidate>\r\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\r\n <!-- Username -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\r\n </div>\r\n <!-- Password -->\r\n <div class=\"tw-m-auto tw-mt-4 tw-w-80\">\r\n <cide-ele-input id=\"user_password_mpin\" formControlName=\"user_password\"></cide-ele-input>\r\n </div>\r\n <!-- Forgot password -->\r\n <div class=\"tw-m-auto tw-mt-3 tw-flex tw-w-80 tw-justify-between\">\r\n <div>\r\n <cide-ele-input id=\"stay_sign_in\" formControlName=\"stay_sign_in\"></cide-ele-input>\r\n </div>\r\n <div>\r\n <a routerLink=\"/auth/forgot-password\" class=\"tw-text-blue-700\">Forgot Password?</a>\r\n </div>\r\n </div> <!-- Sign in button -->\r\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\r\n <button type=\"submit\" class=\"tw-w-full\" cideEleButton id=\"stay_sin_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!loginForm.valid\">a</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div>" }]
|
|
81
|
+
}], ctorParameters: () => [] });
|
|
82
|
+
|
|
83
|
+
export { CideAuthSignInComponent };
|
|
84
|
+
//# sourceMappingURL=cloud-ide-auth-sign-in.component-bTGPd3Zc.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-ide-auth-sign-in.component-bTGPd3Zc.mjs","sources":["../../../projects/cloud-ide-auth/src/lib/auth/sign-in/sign-in.component.ts","../../../projects/cloud-ide-auth/src/lib/auth/sign-in/sign-in.component.html"],"sourcesContent":["import { Component, inject, input, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { loginMethod, MLogin } from 'cloud-ide-lms-model';\r\nimport { Router, RouterLink, ActivatedRoute } from '@angular/router';\r\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\r\nimport { CideEleButtonComponent, CideInputComponent } from 'cloud-ide-element';\r\nimport { CideLytSharedWrapperComponent, CideLytSharedWrapperSetupParam, AppStateHelperService } from 'cloud-ide-layout';\r\n\r\nexport type FormGroupModel<T> = FormGroup<{\r\n [K in keyof T]: FormControl<T[K]>\r\n}>\r\n\r\n@Component({\r\n selector: 'cide-auth-sign-in',\r\n standalone: true,\r\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, RouterLink],\r\n templateUrl: './sign-in.component.html',\r\n styleUrl: './sign-in.component.css'\r\n})\r\nexport class CideAuthSignInComponent extends CideLytSharedWrapperComponent implements OnInit {\r\n public override shared_wrapper_setup_param = input<Partial<CideLytSharedWrapperSetupParam>>({\r\n sypg_page_code: \"auth_sign_in\"\r\n });\r\n public setup_param = { form_loading: false };\r\n public loginForm: FormGroupModel<MLogin>;\r\n public erro_message = \"\";\r\n private returnUrl: string = '/control-panel'; // Default return URL\r\n protected override router = inject(Router);\r\n private activatedRoute = inject(ActivatedRoute);\r\n private authService = inject(CloudIdeAuthService);\r\n private appStateService = inject(AppStateHelperService);\r\n constructor(\r\n ) {\r\n super();\r\n\r\n this.loginForm = new FormGroup({\r\n custom_login_method: new FormControl<loginMethod>('pass'),\r\n user_username: new FormControl(''),\r\n user_password: new FormControl(''),\r\n mpin_pin: new FormControl(''),\r\n stay_sign_in: new FormControl(true)\r\n }) as unknown as FormGroupModel<MLogin>;\r\n }\r\n\r\n override ngOnInit(): void {\r\n super.ngOnInit();\r\n\r\n // Get return URL from route parameters or default to '/control-panel'\r\n this.returnUrl = this.activatedRoute.snapshot.queryParams['returnUrl'] || 'control-panel';\r\n\r\n // If user is already authenticated, redirect to the return URL\r\n if (this.authService.isAuthenticated() && !this.authService.isTokenExpired()) {\r\n this.router.navigateByUrl(this.returnUrl);\r\n }\r\n }\r\n\r\n onSignIn(): void {\r\n if (this.loginForm.valid) {\r\n this.setup_param.form_loading = true;\r\n this.authService.signIn(this.loginForm?.value as MLogin)?.subscribe({\r\n next: async (response) => {\r\n if (response?.success === true) {\r\n // Store user data in auth service\r\n this.authService.storeUserData(response?.data?.auth_user_mst || {});\r\n\r\n // Synchronize AppStateService with the same user data \r\n this.appStateService.setUser(response?.data?.auth_user_mst || null);\r\n\r\n // Store active entity data\r\n this.appStateService.setActiveEntity(response?.data?.core_system_entity || null);\r\n\r\n // Store token through the service setter which saves to localStorage\r\n this.authService.auth_token = (response?.token || '');\r\n console.log(response?.token);\r\n\r\n // Navigate to the return URL or control panel\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n this.router.navigateByUrl(this.returnUrl);\r\n }\r\n },\r\n error: (error) => {\r\n this.setup_param.form_loading = false;\r\n this.erro_message = error?.error?.message;\r\n console.log(error);\r\n // Modern ES2022+ pattern: Use Promise-based delay\r\n const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\r\n delay(3000).then(() => {\r\n this.erro_message = \"\";\r\n });\r\n }\r\n });\r\n }\r\n }\r\n}","<!-- https://play.tailwindcss.com/lfO85drpUy -->\r\n<!-- Main Div Outer Div-->\r\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\r\n <!-- Login Forrm Wrapper -->\r\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\r\n <!-- Logo Wrapper -->\r\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\r\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\r\n alt=\"Cloud IDE Logo\" />\r\n </div> <!-- Entity name here -->\r\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">SignIn to CloudIDE sys</div>\r\n <!-- Error Logger -->\r\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\r\n \r\n <!-- section for controls -->\r\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onSignIn()\" novalidate>\r\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\r\n <!-- Username -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\r\n </div>\r\n <!-- Password -->\r\n <div class=\"tw-m-auto tw-mt-4 tw-w-80\">\r\n <cide-ele-input id=\"user_password_mpin\" formControlName=\"user_password\"></cide-ele-input>\r\n </div>\r\n <!-- Forgot password -->\r\n <div class=\"tw-m-auto tw-mt-3 tw-flex tw-w-80 tw-justify-between\">\r\n <div>\r\n <cide-ele-input id=\"stay_sign_in\" formControlName=\"stay_sign_in\"></cide-ele-input>\r\n </div>\r\n <div>\r\n <a routerLink=\"/auth/forgot-password\" class=\"tw-text-blue-700\">Forgot Password?</a>\r\n </div>\r\n </div> <!-- Sign in button -->\r\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\r\n <button type=\"submit\" class=\"tw-w-full\" cideEleButton id=\"stay_sin_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!loginForm.valid\">a</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div>"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { inject, Injectable, Component } from '@angular/core';
|
|
4
|
-
import { cidePath, hostManagerRoutesUrl, authRoutesUrl, MResetPassword, validateRequestModal, MForgotPassword } from 'cloud-ide-lms-model';
|
|
5
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import { inject, Injectable, Component, signal, DestroyRef } from '@angular/core';
|
|
4
|
+
import { cidePath, hostManagerRoutesUrl, authRoutesUrl, MResetPassword, validateRequestModal, MForgotPassword, MReLogin } from 'cloud-ide-lms-model';
|
|
5
|
+
import { BehaviorSubject, catchError, of } from 'rxjs';
|
|
6
6
|
import { RouterOutlet, Router } from '@angular/router';
|
|
7
7
|
import * as i1 from '@angular/forms';
|
|
8
|
-
import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
8
|
+
import { FormGroup, FormControl, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
9
9
|
import { CommonModule } from '@angular/common';
|
|
10
|
-
import { CideInputComponent, CideEleButtonComponent } from 'cloud-ide-element';
|
|
10
|
+
import { CideInputComponent, CideEleButtonComponent, CideEleFloatingContainerService } from 'cloud-ide-element';
|
|
11
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
11
12
|
import { AUTH_SERVICE_TOKEN, APP_STATE_SERVICE_TOKEN } from 'cloud-ide-shared';
|
|
12
13
|
|
|
13
14
|
class CloudIdeAuthService {
|
|
@@ -68,7 +69,7 @@ class CloudIdeAuthService {
|
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
71
|
catch (error) {
|
|
71
|
-
|
|
72
|
+
// Silent error handling for auth data loading
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
// Store user data in localStorage
|
|
@@ -136,7 +137,6 @@ class CloudIdeAuthService {
|
|
|
136
137
|
return Date.now() >= expiration;
|
|
137
138
|
}
|
|
138
139
|
catch (error) {
|
|
139
|
-
console.error('Error checking token expiration:', error);
|
|
140
140
|
return true; // Assume expired if there's an error
|
|
141
141
|
}
|
|
142
142
|
}
|
|
@@ -151,7 +151,7 @@ class CloudIdeAuthService {
|
|
|
151
151
|
this.auth_user_mst.next(userData);
|
|
152
152
|
}
|
|
153
153
|
catch (error) {
|
|
154
|
-
|
|
154
|
+
// Silent error handling for parsing user data
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
157
|
}
|
|
@@ -235,11 +235,11 @@ class CideAuthForgotPasswordComponent {
|
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
237
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthForgotPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
238
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: CideAuthForgotPasswordComponent, isStandalone: true, selector: "cide-auth-forgot-password", ngImport: i0, template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\n<!-- Main Div Outer Div-->\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\n <!-- Forrm Wrapper -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <!-- Logo Wrapper -->\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\n alt=\"Cloud IDE Logo\" />\n </div> <!-- Entity name here -->\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Forgot Password</div>\n <!-- Error Logger -->\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\n \n <!-- section for controls -->\n <form [formGroup]=\"forgotPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\n <!-- Username -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\n </div> <!-- Forgot Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button cideEleButton id=\"reset_password_link_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!forgotPassswordForm.valid\">Reset Password</button>\n </div>\n </div>\n </form>\n </div>\n </div>", styles: [""], dependencies: [{ kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }] });
|
|
238
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: CideAuthForgotPasswordComponent, isStandalone: true, selector: "cide-auth-forgot-password", ngImport: i0, template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\r\n<!-- Main Div Outer Div-->\r\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\r\n <!-- Forrm Wrapper -->\r\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\r\n <!-- Logo Wrapper -->\r\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\r\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\r\n alt=\"Cloud IDE Logo\" />\r\n </div> <!-- Entity name here -->\r\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Forgot Password</div>\r\n <!-- Error Logger -->\r\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\r\n \r\n <!-- section for controls -->\r\n <form [formGroup]=\"forgotPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\r\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\r\n <!-- Username -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\r\n </div> <!-- Forgot Password button -->\r\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\r\n <button cideEleButton id=\"reset_password_link_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!forgotPassswordForm.valid\">Reset Password</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>", styles: [""], dependencies: [{ kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }] });
|
|
239
239
|
}
|
|
240
240
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthForgotPasswordComponent, decorators: [{
|
|
241
241
|
type: Component,
|
|
242
|
-
args: [{ selector: 'cide-auth-forgot-password', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent], template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\n<!-- Main Div Outer Div-->\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\n <!-- Forrm Wrapper -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <!-- Logo Wrapper -->\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\n alt=\"Cloud IDE Logo\" />\n </div> <!-- Entity name here -->\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Forgot Password</div>\n <!-- Error Logger -->\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\n \n <!-- section for controls -->\n <form [formGroup]=\"forgotPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\n <!-- Username -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\n </div> <!-- Forgot Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button cideEleButton id=\"reset_password_link_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!forgotPassswordForm.valid\">Reset Password</button>\n </div>\n </div>\n </form>\n </div>\n </div>" }]
|
|
242
|
+
args: [{ selector: 'cide-auth-forgot-password', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent], template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\r\n<!-- Main Div Outer Div-->\r\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\r\n <!-- Forrm Wrapper -->\r\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\r\n <!-- Logo Wrapper -->\r\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\r\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\r\n alt=\"Cloud IDE Logo\" />\r\n </div> <!-- Entity name here -->\r\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Forgot Password</div>\r\n <!-- Error Logger -->\r\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\r\n \r\n <!-- section for controls -->\r\n <form [formGroup]=\"forgotPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\r\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\r\n <!-- Username -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\r\n </div> <!-- Forgot Password button -->\r\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\r\n <button cideEleButton id=\"reset_password_link_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!forgotPassswordForm.valid\">Reset Password</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>" }]
|
|
243
243
|
}], ctorParameters: () => [] });
|
|
244
244
|
|
|
245
245
|
var forgotPassword_component = /*#__PURE__*/Object.freeze({
|
|
@@ -247,6 +247,382 @@ var forgotPassword_component = /*#__PURE__*/Object.freeze({
|
|
|
247
247
|
CideAuthForgotPasswordComponent: CideAuthForgotPasswordComponent
|
|
248
248
|
});
|
|
249
249
|
|
|
250
|
+
/**
|
|
251
|
+
* Service to handle re-login functionality when 401 errors occur
|
|
252
|
+
*/
|
|
253
|
+
class ReLoginService {
|
|
254
|
+
http = inject(HttpClient);
|
|
255
|
+
authService = inject(CloudIdeAuthService);
|
|
256
|
+
// Observable to control re-login dialog visibility
|
|
257
|
+
showReLoginSubject = new BehaviorSubject(false);
|
|
258
|
+
showReLogin$ = this.showReLoginSubject.asObservable();
|
|
259
|
+
// Signal for re-login state
|
|
260
|
+
isLoading = signal(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
|
|
261
|
+
error = signal(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
|
|
262
|
+
/**
|
|
263
|
+
* Show re-login dialog
|
|
264
|
+
*/
|
|
265
|
+
showReLogin() {
|
|
266
|
+
// Only show if we have a token (session expired scenario)
|
|
267
|
+
if (this.authService.auth_token) {
|
|
268
|
+
this.showReLoginSubject.next(true);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Hide re-login dialog
|
|
273
|
+
*/
|
|
274
|
+
hideReLogin() {
|
|
275
|
+
this.showReLoginSubject.next(false);
|
|
276
|
+
this.error.set(null);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Perform re-login with MPIN or password
|
|
280
|
+
*/
|
|
281
|
+
reLogin(payload) {
|
|
282
|
+
this.isLoading.set(true);
|
|
283
|
+
this.error.set(null);
|
|
284
|
+
// Add token to payload
|
|
285
|
+
const reLoginPayload = {
|
|
286
|
+
...payload,
|
|
287
|
+
token: this.authService.auth_token
|
|
288
|
+
};
|
|
289
|
+
const url = cidePath.join([
|
|
290
|
+
hostManagerRoutesUrl.cideSuiteHost,
|
|
291
|
+
authRoutesUrl.module,
|
|
292
|
+
authRoutesUrl.createReLoginSession
|
|
293
|
+
]);
|
|
294
|
+
return this.http.post(url, reLoginPayload).pipe(catchError((err) => {
|
|
295
|
+
this.isLoading.set(false);
|
|
296
|
+
this.error.set(err?.error?.message || 'Re-login failed');
|
|
297
|
+
return of({
|
|
298
|
+
success: false,
|
|
299
|
+
message: err?.error?.message || 'Re-login failed'
|
|
300
|
+
});
|
|
301
|
+
}));
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Handle successful re-login
|
|
305
|
+
*/
|
|
306
|
+
handleReLoginSuccess(response) {
|
|
307
|
+
if (response.success && response.token) {
|
|
308
|
+
// Update auth token
|
|
309
|
+
this.authService.auth_token = response.token;
|
|
310
|
+
// Update user data if available
|
|
311
|
+
if (response.data) {
|
|
312
|
+
const userData = response.data;
|
|
313
|
+
this.authService.storeUserData(userData);
|
|
314
|
+
}
|
|
315
|
+
// Hide re-login dialog
|
|
316
|
+
this.hideReLogin();
|
|
317
|
+
this.isLoading.set(false);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
this.error.set(response.message || 'Re-login failed');
|
|
321
|
+
this.isLoading.set(false);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ReLoginService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
325
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ReLoginService, providedIn: 'root' });
|
|
326
|
+
}
|
|
327
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ReLoginService, decorators: [{
|
|
328
|
+
type: Injectable,
|
|
329
|
+
args: [{
|
|
330
|
+
providedIn: 'root'
|
|
331
|
+
}]
|
|
332
|
+
}] });
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Service to manage re-login component in floating container
|
|
336
|
+
*/
|
|
337
|
+
class ReLoginFloatingService {
|
|
338
|
+
containerService = inject(CideEleFloatingContainerService);
|
|
339
|
+
reLoginService = inject(ReLoginService);
|
|
340
|
+
destroyRef = inject(DestroyRef);
|
|
341
|
+
containerId = null;
|
|
342
|
+
constructor() {
|
|
343
|
+
// Register the component when service is initialized
|
|
344
|
+
this.registerReLoginComponent();
|
|
345
|
+
// Subscribe to re-login service to show/hide dialog
|
|
346
|
+
this.reLoginService.showReLogin$
|
|
347
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
348
|
+
.subscribe((shouldShow) => {
|
|
349
|
+
if (shouldShow && !this.containerId) {
|
|
350
|
+
this.show();
|
|
351
|
+
}
|
|
352
|
+
else if (!shouldShow && this.containerId) {
|
|
353
|
+
this.hide();
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Register re-login component with floating container service
|
|
359
|
+
*/
|
|
360
|
+
async registerReLoginComponent() {
|
|
361
|
+
if (this.containerService.isComponentRegistered('re-login')) {
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
try {
|
|
365
|
+
const module = await Promise.resolve().then(function () { return reLogin_component; });
|
|
366
|
+
if (!module.CideAuthReLoginComponent) {
|
|
367
|
+
throw new Error('Component class not found in module');
|
|
368
|
+
}
|
|
369
|
+
this.containerService.registerComponent('re-login', module.CideAuthReLoginComponent);
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
console.error('Failed to register re-login component:', error);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Show re-login in floating container
|
|
377
|
+
*/
|
|
378
|
+
async show() {
|
|
379
|
+
// Ensure component is registered
|
|
380
|
+
if (!this.containerService.isComponentRegistered('re-login')) {
|
|
381
|
+
await this.registerReLoginComponent();
|
|
382
|
+
}
|
|
383
|
+
const config = {
|
|
384
|
+
id: 're-login-container',
|
|
385
|
+
title: 'Re-Login Required',
|
|
386
|
+
icon: 'lock',
|
|
387
|
+
width: '420px',
|
|
388
|
+
height: 'auto',
|
|
389
|
+
minWidth: '400px',
|
|
390
|
+
minHeight: '200px',
|
|
391
|
+
resizable: false,
|
|
392
|
+
draggable: true,
|
|
393
|
+
closable: false, // Prevent closing - user must re-login
|
|
394
|
+
minimizable: false,
|
|
395
|
+
maximizable: false,
|
|
396
|
+
componentId: 're-login',
|
|
397
|
+
componentConfig: {
|
|
398
|
+
inputs: {},
|
|
399
|
+
outputs: {}
|
|
400
|
+
}
|
|
401
|
+
};
|
|
402
|
+
this.containerId = this.containerService.show(config);
|
|
403
|
+
return this.containerId;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Hide re-login floating container
|
|
407
|
+
*/
|
|
408
|
+
hide() {
|
|
409
|
+
if (this.containerId) {
|
|
410
|
+
this.containerService.hide(this.containerId);
|
|
411
|
+
this.containerId = null;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ReLoginFloatingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
415
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ReLoginFloatingService, providedIn: 'root' });
|
|
416
|
+
}
|
|
417
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: ReLoginFloatingService, decorators: [{
|
|
418
|
+
type: Injectable,
|
|
419
|
+
args: [{
|
|
420
|
+
providedIn: 'root'
|
|
421
|
+
}]
|
|
422
|
+
}], ctorParameters: () => [] });
|
|
423
|
+
|
|
424
|
+
class CideAuthReLoginComponent {
|
|
425
|
+
reLoginService = inject(ReLoginService);
|
|
426
|
+
destroyRef = inject(DestroyRef);
|
|
427
|
+
loginMethod = signal('pass', ...(ngDevMode ? [{ debugName: "loginMethod" }] : []));
|
|
428
|
+
isLoading = this.reLoginService.isLoading;
|
|
429
|
+
error = this.reLoginService.error;
|
|
430
|
+
reLoginForm = new FormGroup({
|
|
431
|
+
custom_login_method: new FormControl('pass', [Validators.required]),
|
|
432
|
+
user_password: new FormControl(''),
|
|
433
|
+
mpin_pin: new FormControl('')
|
|
434
|
+
});
|
|
435
|
+
ngOnInit() {
|
|
436
|
+
// Subscribe to re-login service to determine login method
|
|
437
|
+
// For now, default to password - this could be configured from settings
|
|
438
|
+
this.loginMethod.set('pass');
|
|
439
|
+
this.reLoginForm.patchValue({
|
|
440
|
+
custom_login_method: 'pass'
|
|
441
|
+
});
|
|
442
|
+
// Update validators based on login method
|
|
443
|
+
this.updateValidators();
|
|
444
|
+
}
|
|
445
|
+
ngOnDestroy() {
|
|
446
|
+
// Cleanup handled by takeUntilDestroyed
|
|
447
|
+
}
|
|
448
|
+
updateValidators() {
|
|
449
|
+
const method = this.loginMethod();
|
|
450
|
+
if (method === 'pass') {
|
|
451
|
+
this.reLoginForm.get('user_password')?.setValidators([Validators.required]);
|
|
452
|
+
this.reLoginForm.get('mpin_pin')?.clearValidators();
|
|
453
|
+
this.reLoginForm.get('mpin_pin')?.setValue('');
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
this.reLoginForm.get('mpin_pin')?.setValidators([Validators.required, Validators.minLength(4), Validators.maxLength(6)]);
|
|
457
|
+
this.reLoginForm.get('user_password')?.clearValidators();
|
|
458
|
+
this.reLoginForm.get('user_password')?.setValue('');
|
|
459
|
+
}
|
|
460
|
+
this.reLoginForm.get('user_password')?.updateValueAndValidity();
|
|
461
|
+
this.reLoginForm.get('mpin_pin')?.updateValueAndValidity();
|
|
462
|
+
}
|
|
463
|
+
onSubmit() {
|
|
464
|
+
if (this.reLoginForm.valid) {
|
|
465
|
+
const formValue = this.reLoginForm.value;
|
|
466
|
+
const payload = new MReLogin({
|
|
467
|
+
custom_login_method: formValue.custom_login_method || 'pass',
|
|
468
|
+
user_password: formValue.user_password || undefined,
|
|
469
|
+
mpin_pin: formValue.mpin_pin || undefined
|
|
470
|
+
});
|
|
471
|
+
this.reLoginService.reLogin(payload)
|
|
472
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
473
|
+
.subscribe({
|
|
474
|
+
next: (response) => {
|
|
475
|
+
this.reLoginService.handleReLoginSuccess(response);
|
|
476
|
+
},
|
|
477
|
+
error: () => {
|
|
478
|
+
// Error is handled in the service
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
onCancel() {
|
|
484
|
+
this.reLoginService.hideReLogin();
|
|
485
|
+
}
|
|
486
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthReLoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
487
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CideAuthReLoginComponent, isStandalone: true, selector: "cide-auth-re-login", ngImport: i0, template: `
|
|
488
|
+
<div class="tw-w-full tw-max-w-md tw-mx-auto tw-p-6">
|
|
489
|
+
<div class="tw-text-center tw-mb-6">
|
|
490
|
+
<h2 class="tw-text-2xl tw-font-semibold tw-text-gray-900 tw-mb-2">Session Expired</h2>
|
|
491
|
+
<p class="tw-text-sm tw-text-gray-600">Please re-authenticate to continue</p>
|
|
492
|
+
</div>
|
|
493
|
+
|
|
494
|
+
@if (error()) {
|
|
495
|
+
<div class="tw-mb-4 tw-p-3 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg">
|
|
496
|
+
<p class="tw-text-sm tw-text-red-600">{{ error() }}</p>
|
|
497
|
+
</div>
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
<form [formGroup]="reLoginForm" (ngSubmit)="onSubmit()" novalidate>
|
|
501
|
+
<div class="tw-space-y-4">
|
|
502
|
+
@if (loginMethod() === 'pass') {
|
|
503
|
+
<div>
|
|
504
|
+
<cide-ele-input
|
|
505
|
+
label="Password"
|
|
506
|
+
formControlName="user_password"
|
|
507
|
+
type="password"
|
|
508
|
+
placeholder="Enter your password"
|
|
509
|
+
[required]="true">
|
|
510
|
+
</cide-ele-input>
|
|
511
|
+
</div>
|
|
512
|
+
} @else {
|
|
513
|
+
<div>
|
|
514
|
+
<cide-ele-input
|
|
515
|
+
label="MPIN"
|
|
516
|
+
formControlName="mpin_pin"
|
|
517
|
+
type="password"
|
|
518
|
+
placeholder="Enter your MPIN"
|
|
519
|
+
[maxlength]="6"
|
|
520
|
+
[required]="true">
|
|
521
|
+
</cide-ele-input>
|
|
522
|
+
</div>
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
<div class="tw-flex tw-gap-3 tw-pt-4">
|
|
526
|
+
<button
|
|
527
|
+
type="submit"
|
|
528
|
+
cideEleButton
|
|
529
|
+
variant="primary"
|
|
530
|
+
[loading]="isLoading()"
|
|
531
|
+
[disabled]="!reLoginForm.valid || isLoading()"
|
|
532
|
+
class="tw-flex-1">
|
|
533
|
+
Re-Login
|
|
534
|
+
</button>
|
|
535
|
+
<button
|
|
536
|
+
type="button"
|
|
537
|
+
cideEleButton
|
|
538
|
+
variant="outline"
|
|
539
|
+
[disabled]="isLoading()"
|
|
540
|
+
(click)="onCancel()"
|
|
541
|
+
class="tw-flex-1">
|
|
542
|
+
Cancel
|
|
543
|
+
</button>
|
|
544
|
+
</div>
|
|
545
|
+
</div>
|
|
546
|
+
</form>
|
|
547
|
+
</div>
|
|
548
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }] });
|
|
549
|
+
}
|
|
550
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthReLoginComponent, decorators: [{
|
|
551
|
+
type: Component,
|
|
552
|
+
args: [{ selector: 'cide-auth-re-login', standalone: true, imports: [
|
|
553
|
+
CommonModule,
|
|
554
|
+
ReactiveFormsModule,
|
|
555
|
+
CideInputComponent,
|
|
556
|
+
CideEleButtonComponent
|
|
557
|
+
], template: `
|
|
558
|
+
<div class="tw-w-full tw-max-w-md tw-mx-auto tw-p-6">
|
|
559
|
+
<div class="tw-text-center tw-mb-6">
|
|
560
|
+
<h2 class="tw-text-2xl tw-font-semibold tw-text-gray-900 tw-mb-2">Session Expired</h2>
|
|
561
|
+
<p class="tw-text-sm tw-text-gray-600">Please re-authenticate to continue</p>
|
|
562
|
+
</div>
|
|
563
|
+
|
|
564
|
+
@if (error()) {
|
|
565
|
+
<div class="tw-mb-4 tw-p-3 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg">
|
|
566
|
+
<p class="tw-text-sm tw-text-red-600">{{ error() }}</p>
|
|
567
|
+
</div>
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
<form [formGroup]="reLoginForm" (ngSubmit)="onSubmit()" novalidate>
|
|
571
|
+
<div class="tw-space-y-4">
|
|
572
|
+
@if (loginMethod() === 'pass') {
|
|
573
|
+
<div>
|
|
574
|
+
<cide-ele-input
|
|
575
|
+
label="Password"
|
|
576
|
+
formControlName="user_password"
|
|
577
|
+
type="password"
|
|
578
|
+
placeholder="Enter your password"
|
|
579
|
+
[required]="true">
|
|
580
|
+
</cide-ele-input>
|
|
581
|
+
</div>
|
|
582
|
+
} @else {
|
|
583
|
+
<div>
|
|
584
|
+
<cide-ele-input
|
|
585
|
+
label="MPIN"
|
|
586
|
+
formControlName="mpin_pin"
|
|
587
|
+
type="password"
|
|
588
|
+
placeholder="Enter your MPIN"
|
|
589
|
+
[maxlength]="6"
|
|
590
|
+
[required]="true">
|
|
591
|
+
</cide-ele-input>
|
|
592
|
+
</div>
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
<div class="tw-flex tw-gap-3 tw-pt-4">
|
|
596
|
+
<button
|
|
597
|
+
type="submit"
|
|
598
|
+
cideEleButton
|
|
599
|
+
variant="primary"
|
|
600
|
+
[loading]="isLoading()"
|
|
601
|
+
[disabled]="!reLoginForm.valid || isLoading()"
|
|
602
|
+
class="tw-flex-1">
|
|
603
|
+
Re-Login
|
|
604
|
+
</button>
|
|
605
|
+
<button
|
|
606
|
+
type="button"
|
|
607
|
+
cideEleButton
|
|
608
|
+
variant="outline"
|
|
609
|
+
[disabled]="isLoading()"
|
|
610
|
+
(click)="onCancel()"
|
|
611
|
+
class="tw-flex-1">
|
|
612
|
+
Cancel
|
|
613
|
+
</button>
|
|
614
|
+
</div>
|
|
615
|
+
</div>
|
|
616
|
+
</form>
|
|
617
|
+
</div>
|
|
618
|
+
` }]
|
|
619
|
+
}] });
|
|
620
|
+
|
|
621
|
+
var reLogin_component = /*#__PURE__*/Object.freeze({
|
|
622
|
+
__proto__: null,
|
|
623
|
+
CideAuthReLoginComponent: CideAuthReLoginComponent
|
|
624
|
+
});
|
|
625
|
+
|
|
250
626
|
const authRoutes = {
|
|
251
627
|
path: "auth",
|
|
252
628
|
loadComponent: () => Promise.resolve().then(function () { return cloudIdeAuth_component; }).then(c => c.CloudIdeAuthComponent),
|
|
@@ -258,7 +634,7 @@ const authRoutes = {
|
|
|
258
634
|
},
|
|
259
635
|
{
|
|
260
636
|
path: "sign-in",
|
|
261
|
-
loadComponent: () => import('./cloud-ide-auth-sign-in.component-
|
|
637
|
+
loadComponent: () => import('./cloud-ide-auth-sign-in.component-bTGPd3Zc.mjs').then(c => c.CideAuthSignInComponent)
|
|
262
638
|
},
|
|
263
639
|
{
|
|
264
640
|
path: "forgot-password",
|
|
@@ -266,7 +642,7 @@ const authRoutes = {
|
|
|
266
642
|
},
|
|
267
643
|
{
|
|
268
644
|
path: "reset-password/:rout_token",
|
|
269
|
-
loadComponent: () => import('./cloud-ide-auth-reset-password.component-
|
|
645
|
+
loadComponent: () => import('./cloud-ide-auth-reset-password.component-B24IDvdM.mjs').then(c => c.CideAuthResetPasswordComponent)
|
|
270
646
|
}
|
|
271
647
|
]
|
|
272
648
|
};
|
|
@@ -298,5 +674,5 @@ const authGuard = (route, state) => {
|
|
|
298
674
|
* Generated bundle index. Do not edit.
|
|
299
675
|
*/
|
|
300
676
|
|
|
301
|
-
export { CideAuthForgotPasswordComponent, CloudIdeAuthComponent, CloudIdeAuthService, authGuard, authRoutes };
|
|
677
|
+
export { CideAuthForgotPasswordComponent, CideAuthReLoginComponent, CloudIdeAuthComponent, CloudIdeAuthService, ReLoginFloatingService, ReLoginService, authGuard, authRoutes };
|
|
302
678
|
//# sourceMappingURL=cloud-ide-auth.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-ide-auth.mjs","sources":["../../../projects/cloud-ide-auth/src/lib/cloud-ide-auth.service.ts","../../../projects/cloud-ide-auth/src/lib/cloud-ide-auth.component.ts","../../../projects/cloud-ide-auth/src/lib/auth/forgot-password/forgot-password.component.ts","../../../projects/cloud-ide-auth/src/lib/auth/forgot-password/forgot-password.component.html","../../../projects/cloud-ide-auth/src/lib/cloud-ide-auth.routes.ts","../../../projects/cloud-ide-auth/src/lib/guards/auth.guard.ts","../../../projects/cloud-ide-auth/src/public-api.ts","../../../projects/cloud-ide-auth/src/cloud-ide-auth.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport {\n authRoutesUrl, cidePath, hostManagerRoutesUrl, AuthUserMst,\n loginControllerResponse, MLogin, MForgotPassword, ForgotPasswordControllerResponse,\n MResetPassword, ResetPasswordControllerResponse\n} from 'cloud-ide-lms-model';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { IAuthService } from 'cloud-ide-shared';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CloudIdeAuthService implements IAuthService {\n public auth_user_mst: BehaviorSubject<AuthUserMst> = new BehaviorSubject({});\n private _auth_token: string = \"\";\n\n // Storage keys\n private readonly TOKEN_STORAGE_KEY = 'cide_auth_token';\n private readonly USER_STORAGE_KEY = 'cide_auth_user';\n\n // Modern Angular v20 dependency injection pattern\n private http = inject(HttpClient);\n\n constructor() {\n // Modern Angular v20 pattern: Use constructor for initialization only\n this.loadAuthDataFromStorage();\n }\n\n /**\n * Check if localStorage is available (browser environment)\n */\n private isLocalStorageAvailable(): boolean {\n try {\n return typeof window !== 'undefined' && typeof localStorage !== 'undefined';\n } catch {\n return false;\n }\n }\n\n // Getter and setter for auth_token with localStorage persistence\n get auth_token(): string {\n return this._auth_token;\n }\n\n set auth_token(value: string) {\n this._auth_token = value;\n if (!this.isLocalStorageAvailable()) {\n return;\n }\n if (value) {\n localStorage.setItem(this.TOKEN_STORAGE_KEY, value);\n } else {\n localStorage.removeItem(this.TOKEN_STORAGE_KEY);\n }\n }\n\n // Load authentication data from localStorage on service initialization\n private loadAuthDataFromStorage(): void {\n if (!this.isLocalStorageAvailable()) {\n return;\n }\n\n try {\n // Load token\n const storedToken = localStorage.getItem(this.TOKEN_STORAGE_KEY);\n if (storedToken) {\n this._auth_token = storedToken;\n }\n\n // Load user data\n const storedUserData = localStorage.getItem(this.USER_STORAGE_KEY);\n if (storedUserData) {\n const userData = JSON.parse(storedUserData);\n this.auth_user_mst.next(userData);\n }\n } catch (error) {\n console.error('Error loading auth data from storage:', error);\n }\n }\n\n // Store user data in localStorage\n public storeUserData(userData: AuthUserMst): void {\n if (userData) {\n this.auth_user_mst.next(userData);\n if (this.isLocalStorageAvailable()) {\n localStorage.setItem(this.USER_STORAGE_KEY, JSON.stringify(userData));\n }\n }\n }\n\n signIn(body: MLogin): Observable<loginControllerResponse> {\n if (body?.user_password) {\n if (body?.user_password?.length <= 6) {\n body.custom_login_method = \"mpin\";\n body.mpin_pin = body?.user_password;\n body.user_password = \"\";\n }\n }\n return this.http?.post(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, authRoutesUrl?.module, authRoutesUrl?.signIn]), body);\n }\n\n forgotPassword(body: MForgotPassword): Observable<ForgotPasswordControllerResponse> {\n return this.http?.post(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, authRoutesUrl?.module, authRoutesUrl?.forgotPassword]), body);\n }\n\n resetPassword(body: MResetPassword): Observable<ResetPasswordControllerResponse> {\n const payload = new MResetPassword(body);\n if (payload?.Validate) {\n payload?.Validate();\n }\n return this.http?.post(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, authRoutesUrl?.module, authRoutesUrl?.resetPassword]), body);\n }\n\n // Sign out the user and clear all stored auth data\n signOut(): void {\n // Clear token and user data from memory\n this._auth_token = \"\";\n this.auth_user_mst.next({});\n\n // Clear stored data\n if (this.isLocalStorageAvailable()) {\n localStorage.removeItem(this.TOKEN_STORAGE_KEY);\n localStorage.removeItem(this.USER_STORAGE_KEY);\n }\n }\n\n // Check if user is authenticated\n isAuthenticated(): boolean {\n return !!this._auth_token;\n }\n\n // Get current user data \n getCurrentUser(): AuthUserMst {\n return this.auth_user_mst.getValue();\n }\n\n // Check if token is expired\n isTokenExpired(): boolean {\n try {\n if (!this._auth_token) {\n return true;\n }\n\n // Extract the payload from the JWT token\n const tokenParts = this._auth_token.split('.');\n if (tokenParts.length !== 3) {\n return true; // Not a valid JWT token\n }\n\n const payload = JSON.parse(atob(tokenParts[1]));\n\n // Check expiration time\n const expiration = payload.exp * 1000; // Convert seconds to milliseconds\n return Date.now() >= expiration;\n } catch (error) {\n console.error('Error checking token expiration:', error);\n return true; // Assume expired if there's an error\n }\n }\n\n // Refresh auth data if needed based on stored data\n refreshAuthState(): void {\n // If we have a token but no user data, try to load user data\n if (this._auth_token && this.auth_user_mst && Object.keys(this.auth_user_mst.getValue()).length === 0 && this.isLocalStorageAvailable()) {\n const storedUserData = localStorage.getItem(this.USER_STORAGE_KEY);\n if (storedUserData) {\n try {\n const userData = JSON.parse(storedUserData);\n this.auth_user_mst.next(userData);\n } catch (error) {\n console.error('Error parsing stored user data:', error);\n }\n }\n }\n\n // If token is expired, sign out\n if (this.isTokenExpired()) {\n this.signOut();\n }\n }\n}\n","import { Component } from '@angular/core';\r\nimport { RouterOutlet } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'cide-auth-wrapper',\r\n standalone: true,\r\n imports: [RouterOutlet],\r\n template: `\r\n <router-outlet></router-outlet>\r\n `,\r\n styles: ``\r\n})\r\nexport class CloudIdeAuthComponent {\r\n\r\n}\r\n","import { Component, inject } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { FormGroupModel } from '../sign-in/sign-in.component';\nimport { forgotPasswordMethod, MForgotPassword, validateRequestModal } from 'cloud-ide-lms-model';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { CideEleButtonComponent, CideInputComponent } from 'cloud-ide-element';\n\n@Component({\n selector: 'cide-auth-forgot-password',\n standalone: true,\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent],\n templateUrl: './forgot-password.component.html',\n styleUrl: './forgot-password.component.css'\n})\nexport class CideAuthForgotPasswordComponent {\n public setup_param = { form_loading: false };\n public forgotPassswordForm: FormGroupModel<MForgotPassword>;\n public erro_message = \"\";\n\n private authService = inject(CloudIdeAuthService);\n private route = inject(Router);\n\n constructor() {\n\n this.forgotPassswordForm = new FormGroup({\n custom_forgot_password_method: new FormControl<forgotPasswordMethod>('username'),\n user_username: new FormControl(''),\n user_emailid: new FormControl(''),\n user_mobileno: new FormControl(),\n }) as unknown as FormGroupModel<MForgotPassword>;\n }\n\n onForgotPasssword() {\n if (this.forgotPassswordForm.valid) {\n this.setup_param.form_loading = true;\n const validate = validateRequestModal(new MForgotPassword(this.forgotPassswordForm?.value as MForgotPassword));\n console.log(validate)\n if(validate === true){\n this.authService.forgotPassword(this.forgotPassswordForm?.value as MForgotPassword)?.subscribe({\n next: (response) => {\n if (response?.success === true) {\n this.setup_param.form_loading = false;\n this.route.navigate(['auth', 'sign-in'])\n }\n },\n error: (error) => {\n this.setup_param.form_loading = false;\n this.erro_message = error?.error?.message;\n console.log(error)\n setTimeout(() => {\n this.erro_message = \"\"\n }, 3000)\n }\n });\n } else {\n this.setup_param.form_loading = false;\n this.erro_message = validate.first;\n setTimeout(() => {\n this.erro_message = \"\"\n }, 3000)\n }\n }\n }\n}","<!-- https://play.tailwindcss.com/lfO85drpUy -->\n<!-- Main Div Outer Div-->\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\n <!-- Forrm Wrapper -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <!-- Logo Wrapper -->\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\n alt=\"Cloud IDE Logo\" />\n </div> <!-- Entity name here -->\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Forgot Password</div>\n <!-- Error Logger -->\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\n \n <!-- section for controls -->\n <form [formGroup]=\"forgotPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\n <!-- Username -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\n </div> <!-- Forgot Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button cideEleButton id=\"reset_password_link_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!forgotPassswordForm.valid\">Reset Password</button>\n </div>\n </div>\n </form>\n </div>\n </div>","import { Route } from '@angular/router';\r\n\r\nexport const authRoutes: Route = {\r\n path: \"auth\",\r\n loadComponent: () => import('./cloud-ide-auth.component').then(c => c.CloudIdeAuthComponent),\r\n children: [\r\n {\r\n path: \"\",\r\n pathMatch: 'full',\r\n redirectTo: 'sign-in'\r\n },\r\n {\r\n path: \"sign-in\",\r\n loadComponent: () => import('./auth/sign-in/sign-in.component').then(c => c.CideAuthSignInComponent)\r\n },\r\n {\r\n path: \"forgot-password\",\r\n loadComponent: () => import('./auth/forgot-password/forgot-password.component').then(c => c.CideAuthForgotPasswordComponent)\r\n },\r\n {\r\n path: \"reset-password/:rout_token\",\r\n loadComponent: () => import('./auth/reset-password/reset-password.component').then(c => c.CideAuthResetPasswordComponent)\r\n }\r\n ]\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn, Router } from '@angular/router';\r\nimport { IAuthService, AUTH_SERVICE_TOKEN, IAppStateService, APP_STATE_SERVICE_TOKEN } from 'cloud-ide-shared';\r\n\r\nexport const authGuard: CanActivateFn = (route, state) => {\r\n const authService = inject(AUTH_SERVICE_TOKEN) as IAuthService;\r\n const appState = inject(APP_STATE_SERVICE_TOKEN) as IAppStateService;\r\n const router = inject(Router);\r\n \r\n // Refresh auth state to make sure it's current\r\n authService.refreshAuthState();\r\n \r\n // Refresh app state from localStorage to ensure synchronization\r\n appState.refreshFromLocalStorage();\r\n \r\n // Check if user is authenticated using app state (modern approach)\r\n if (appState.isUserAuthenticated() && !authService.isTokenExpired()) {\r\n return true;\r\n }\r\n \r\n // Redirect to login page with the intended destination\r\n router.navigate(['/auth/sign-in'], { \r\n queryParams: { returnUrl: state.url }\r\n });\r\n \r\n return false;\r\n};\r\n","/*\n * Public API Surface of cloud-ide-auth\n */\n\nexport * from './lib/cloud-ide-auth.service';\nexport * from './lib/cloud-ide-auth.component';\nexport * from './lib/auth/forgot-password/forgot-password.component';\nexport * from './lib/cloud-ide-auth.routes';\nexport * from './lib/guards/auth.guard';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cloud-ide-auth.mjs","sources":["../../../projects/cloud-ide-auth/src/lib/cloud-ide-auth.service.ts","../../../projects/cloud-ide-auth/src/lib/cloud-ide-auth.component.ts","../../../projects/cloud-ide-auth/src/lib/auth/forgot-password/forgot-password.component.ts","../../../projects/cloud-ide-auth/src/lib/auth/forgot-password/forgot-password.component.html","../../../projects/cloud-ide-auth/src/lib/auth/re-login/re-login.service.ts","../../../projects/cloud-ide-auth/src/lib/auth/re-login/re-login-floating.service.ts","../../../projects/cloud-ide-auth/src/lib/auth/re-login/re-login.component.ts","../../../projects/cloud-ide-auth/src/lib/cloud-ide-auth.routes.ts","../../../projects/cloud-ide-auth/src/lib/guards/auth.guard.ts","../../../projects/cloud-ide-auth/src/public-api.ts","../../../projects/cloud-ide-auth/src/cloud-ide-auth.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport {\r\n authRoutesUrl, cidePath, hostManagerRoutesUrl, AuthUserMst,\r\n loginControllerResponse, MLogin, MForgotPassword, ForgotPasswordControllerResponse,\r\n MResetPassword, ResetPasswordControllerResponse\r\n} from 'cloud-ide-lms-model';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CloudIdeAuthService {\r\n public auth_user_mst: BehaviorSubject<AuthUserMst> = new BehaviorSubject({});\r\n private _auth_token: string = \"\";\r\n\r\n // Storage keys\r\n private readonly TOKEN_STORAGE_KEY = 'cide_auth_token';\r\n private readonly USER_STORAGE_KEY = 'cide_auth_user';\r\n\r\n // Modern Angular v20 dependency injection pattern\r\n private http = inject(HttpClient);\r\n\r\n constructor() {\r\n // Modern Angular v20 pattern: Use constructor for initialization only\r\n this.loadAuthDataFromStorage();\r\n }\r\n\r\n /**\r\n * Check if localStorage is available (browser environment)\r\n */\r\n private isLocalStorageAvailable(): boolean {\r\n try {\r\n return typeof window !== 'undefined' && typeof localStorage !== 'undefined';\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // Getter and setter for auth_token with localStorage persistence\r\n get auth_token(): string {\r\n return this._auth_token;\r\n }\r\n\r\n set auth_token(value: string) {\r\n this._auth_token = value;\r\n if (!this.isLocalStorageAvailable()) {\r\n return;\r\n }\r\n if (value) {\r\n localStorage.setItem(this.TOKEN_STORAGE_KEY, value);\r\n } else {\r\n localStorage.removeItem(this.TOKEN_STORAGE_KEY);\r\n }\r\n }\r\n\r\n // Load authentication data from localStorage on service initialization\r\n private loadAuthDataFromStorage(): void {\r\n if (!this.isLocalStorageAvailable()) {\r\n return;\r\n }\r\n\r\n try {\r\n // Load token\r\n const storedToken = localStorage.getItem(this.TOKEN_STORAGE_KEY);\r\n if (storedToken) {\r\n this._auth_token = storedToken;\r\n }\r\n\r\n // Load user data\r\n const storedUserData = localStorage.getItem(this.USER_STORAGE_KEY);\r\n if (storedUserData) {\r\n const userData = JSON.parse(storedUserData);\r\n this.auth_user_mst.next(userData);\r\n }\r\n } catch (error) {\r\n // Silent error handling for auth data loading\r\n }\r\n }\r\n\r\n // Store user data in localStorage\r\n public storeUserData(userData: AuthUserMst): void {\r\n if (userData) {\r\n this.auth_user_mst.next(userData);\r\n if (this.isLocalStorageAvailable()) {\r\n localStorage.setItem(this.USER_STORAGE_KEY, JSON.stringify(userData));\r\n }\r\n }\r\n }\r\n\r\n signIn(body: MLogin): Observable<loginControllerResponse> {\r\n if (body?.user_password) {\r\n if (body?.user_password?.length <= 6) {\r\n body.custom_login_method = \"mpin\";\r\n body.mpin_pin = body?.user_password;\r\n body.user_password = \"\";\r\n }\r\n }\r\n return this.http?.post(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, authRoutesUrl?.module, authRoutesUrl?.signIn]), body);\r\n }\r\n\r\n forgotPassword(body: MForgotPassword): Observable<ForgotPasswordControllerResponse> {\r\n return this.http?.post(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, authRoutesUrl?.module, authRoutesUrl?.forgotPassword]), body);\r\n }\r\n\r\n resetPassword(body: MResetPassword): Observable<ResetPasswordControllerResponse> {\r\n const payload = new MResetPassword(body);\r\n if (payload?.Validate) {\r\n payload?.Validate();\r\n }\r\n return this.http?.post(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, authRoutesUrl?.module, authRoutesUrl?.resetPassword]), body);\r\n }\r\n\r\n // Sign out the user and clear all stored auth data\r\n signOut(): void {\r\n // Clear token and user data from memory\r\n this._auth_token = \"\";\r\n this.auth_user_mst.next({});\r\n\r\n // Clear stored data\r\n if (this.isLocalStorageAvailable()) {\r\n localStorage.removeItem(this.TOKEN_STORAGE_KEY);\r\n localStorage.removeItem(this.USER_STORAGE_KEY);\r\n }\r\n }\r\n\r\n // Check if user is authenticated\r\n isAuthenticated(): boolean {\r\n return !!this._auth_token;\r\n }\r\n\r\n // Get current user data \r\n getCurrentUser(): AuthUserMst {\r\n return this.auth_user_mst.getValue();\r\n }\r\n\r\n // Check if token is expired\r\n isTokenExpired(): boolean {\r\n try {\r\n if (!this._auth_token) {\r\n return true;\r\n }\r\n\r\n // Extract the payload from the JWT token\r\n const tokenParts = this._auth_token.split('.');\r\n if (tokenParts.length !== 3) {\r\n return true; // Not a valid JWT token\r\n }\r\n\r\n const payload = JSON.parse(atob(tokenParts[1]));\r\n\r\n // Check expiration time\r\n const expiration = payload.exp * 1000; // Convert seconds to milliseconds\r\n return Date.now() >= expiration;\r\n } catch (error) {\r\n return true; // Assume expired if there's an error\r\n }\r\n }\r\n\r\n // Refresh auth data if needed based on stored data\r\n refreshAuthState(): void {\r\n // If we have a token but no user data, try to load user data\r\n if (this._auth_token && this.auth_user_mst && Object.keys(this.auth_user_mst.getValue()).length === 0 && this.isLocalStorageAvailable()) {\r\n const storedUserData = localStorage.getItem(this.USER_STORAGE_KEY);\r\n if (storedUserData) {\r\n try {\r\n const userData = JSON.parse(storedUserData);\r\n this.auth_user_mst.next(userData);\r\n } catch (error) {\r\n // Silent error handling for parsing user data\r\n }\r\n }\r\n }\r\n\r\n // If token is expired, sign out\r\n if (this.isTokenExpired()) {\r\n this.signOut();\r\n }\r\n }\r\n}\r\n","import { Component } from '@angular/core';\r\nimport { RouterOutlet } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'cide-auth-wrapper',\r\n standalone: true,\r\n imports: [RouterOutlet],\r\n template: `\r\n <router-outlet></router-outlet>\r\n `,\r\n styles: ``\r\n})\r\nexport class CloudIdeAuthComponent {\r\n\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Router } from '@angular/router';\r\nimport { FormGroupModel } from '../sign-in/sign-in.component';\r\nimport { forgotPasswordMethod, MForgotPassword, validateRequestModal } from 'cloud-ide-lms-model';\r\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\r\nimport { CideEleButtonComponent, CideInputComponent } from 'cloud-ide-element';\r\n\r\n@Component({\r\n selector: 'cide-auth-forgot-password',\r\n standalone: true,\r\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent],\r\n templateUrl: './forgot-password.component.html',\r\n styleUrl: './forgot-password.component.css'\r\n})\r\nexport class CideAuthForgotPasswordComponent {\r\n public setup_param = { form_loading: false };\r\n public forgotPassswordForm: FormGroupModel<MForgotPassword>;\r\n public erro_message = \"\";\r\n\r\n private authService = inject(CloudIdeAuthService);\r\n private route = inject(Router);\r\n\r\n constructor() {\r\n\r\n this.forgotPassswordForm = new FormGroup({\r\n custom_forgot_password_method: new FormControl<forgotPasswordMethod>('username'),\r\n user_username: new FormControl(''),\r\n user_emailid: new FormControl(''),\r\n user_mobileno: new FormControl(),\r\n }) as unknown as FormGroupModel<MForgotPassword>;\r\n }\r\n\r\n onForgotPasssword() {\r\n if (this.forgotPassswordForm.valid) {\r\n this.setup_param.form_loading = true;\r\n const validate = validateRequestModal(new MForgotPassword(this.forgotPassswordForm?.value as MForgotPassword));\r\n console.log(validate)\r\n if(validate === true){\r\n this.authService.forgotPassword(this.forgotPassswordForm?.value as MForgotPassword)?.subscribe({\r\n next: (response) => {\r\n if (response?.success === true) {\r\n this.setup_param.form_loading = false;\r\n this.route.navigate(['auth', 'sign-in'])\r\n }\r\n },\r\n error: (error) => {\r\n this.setup_param.form_loading = false;\r\n this.erro_message = error?.error?.message;\r\n console.log(error)\r\n setTimeout(() => {\r\n this.erro_message = \"\"\r\n }, 3000)\r\n }\r\n });\r\n } else {\r\n this.setup_param.form_loading = false;\r\n this.erro_message = validate.first;\r\n setTimeout(() => {\r\n this.erro_message = \"\"\r\n }, 3000)\r\n }\r\n }\r\n }\r\n}","<!-- https://play.tailwindcss.com/lfO85drpUy -->\r\n<!-- Main Div Outer Div-->\r\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\r\n <!-- Forrm Wrapper -->\r\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\r\n <!-- Logo Wrapper -->\r\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\r\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\r\n alt=\"Cloud IDE Logo\" />\r\n </div> <!-- Entity name here -->\r\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Forgot Password</div>\r\n <!-- Error Logger -->\r\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\r\n \r\n <!-- section for controls -->\r\n <form [formGroup]=\"forgotPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\r\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\r\n <!-- Username -->\r\n <div class=\"tw-m-auto tw-w-80\">\r\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\r\n </div> <!-- Forgot Password button -->\r\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\r\n <button cideEleButton id=\"reset_password_link_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!forgotPassswordForm.valid\">Reset Password</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>","import { Injectable, inject, signal } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { BehaviorSubject, Observable, catchError, of } from 'rxjs';\r\nimport {\r\n authRoutesUrl,\r\n cidePath,\r\n hostManagerRoutesUrl,\r\n MReLogin,\r\n reLoginControllerResponse,\r\n AuthUserMst\r\n} from 'cloud-ide-lms-model';\r\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\r\n\r\n/**\r\n * Service to handle re-login functionality when 401 errors occur\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ReLoginService {\r\n private http = inject(HttpClient);\r\n private authService = inject(CloudIdeAuthService);\r\n\r\n // Observable to control re-login dialog visibility\r\n private showReLoginSubject = new BehaviorSubject<boolean>(false);\r\n public showReLogin$ = this.showReLoginSubject.asObservable();\r\n\r\n // Signal for re-login state\r\n isLoading = signal<boolean>(false);\r\n error = signal<string | null>(null);\r\n\r\n /**\r\n * Show re-login dialog\r\n */\r\n showReLogin(): void {\r\n // Only show if we have a token (session expired scenario)\r\n if (this.authService.auth_token) {\r\n this.showReLoginSubject.next(true);\r\n }\r\n }\r\n\r\n /**\r\n * Hide re-login dialog\r\n */\r\n hideReLogin(): void {\r\n this.showReLoginSubject.next(false);\r\n this.error.set(null);\r\n }\r\n\r\n /**\r\n * Perform re-login with MPIN or password\r\n */\r\n reLogin(payload: MReLogin): Observable<reLoginControllerResponse> {\r\n this.isLoading.set(true);\r\n this.error.set(null);\r\n\r\n // Add token to payload\r\n const reLoginPayload: MReLogin = {\r\n ...payload,\r\n token: this.authService.auth_token\r\n };\r\n\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n authRoutesUrl.module,\r\n authRoutesUrl.createReLoginSession\r\n ]);\r\n\r\n return this.http.post<reLoginControllerResponse>(url, reLoginPayload).pipe(\r\n catchError((err) => {\r\n this.isLoading.set(false);\r\n this.error.set(err?.error?.message || 'Re-login failed');\r\n return of({\r\n success: false,\r\n message: err?.error?.message || 'Re-login failed'\r\n } as reLoginControllerResponse);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Handle successful re-login\r\n */\r\n handleReLoginSuccess(response: reLoginControllerResponse): void {\r\n if (response.success && response.token) {\r\n // Update auth token\r\n this.authService.auth_token = response.token;\r\n\r\n // Update user data if available\r\n if (response.data) {\r\n const userData = response.data as AuthUserMst;\r\n this.authService.storeUserData(userData);\r\n }\r\n\r\n // Hide re-login dialog\r\n this.hideReLogin();\r\n this.isLoading.set(false);\r\n } else {\r\n this.error.set(response.message || 'Re-login failed');\r\n this.isLoading.set(false);\r\n }\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { CideEleFloatingContainerService } from 'cloud-ide-element';\r\nimport { ReLoginService } from './re-login.service';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DestroyRef } from '@angular/core';\r\nimport type { FloatingContainerConfig } from 'cloud-ide-element';\r\n\r\n/**\r\n * Service to manage re-login component in floating container\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ReLoginFloatingService {\r\n private containerService = inject(CideEleFloatingContainerService);\r\n private reLoginService = inject(ReLoginService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private containerId: string | null = null;\r\n\r\n constructor() {\r\n // Register the component when service is initialized\r\n this.registerReLoginComponent();\r\n\r\n // Subscribe to re-login service to show/hide dialog\r\n this.reLoginService.showReLogin$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((shouldShow) => {\r\n if (shouldShow && !this.containerId) {\r\n this.show();\r\n } else if (!shouldShow && this.containerId) {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Register re-login component with floating container service\r\n */\r\n private async registerReLoginComponent(): Promise<void> {\r\n if (this.containerService.isComponentRegistered('re-login')) {\r\n return;\r\n }\r\n\r\n try {\r\n const module = await import('./re-login.component');\r\n if (!module.CideAuthReLoginComponent) {\r\n throw new Error('Component class not found in module');\r\n }\r\n this.containerService.registerComponent('re-login', module.CideAuthReLoginComponent);\r\n } catch (error) {\r\n console.error('Failed to register re-login component:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Show re-login in floating container\r\n */\r\n async show(): Promise<string | null> {\r\n // Ensure component is registered\r\n if (!this.containerService.isComponentRegistered('re-login')) {\r\n await this.registerReLoginComponent();\r\n }\r\n\r\n const config: FloatingContainerConfig = {\r\n id: 're-login-container',\r\n title: 'Re-Login Required',\r\n icon: 'lock',\r\n width: '420px',\r\n height: 'auto',\r\n minWidth: '400px',\r\n minHeight: '200px',\r\n resizable: false,\r\n draggable: true,\r\n closable: false, // Prevent closing - user must re-login\r\n minimizable: false,\r\n maximizable: false,\r\n componentId: 're-login',\r\n componentConfig: {\r\n inputs: {},\r\n outputs: {}\r\n }\r\n };\r\n\r\n this.containerId = this.containerService.show(config);\r\n return this.containerId;\r\n }\r\n\r\n /**\r\n * Hide re-login floating container\r\n */\r\n hide(): void {\r\n if (this.containerId) {\r\n this.containerService.hide(this.containerId);\r\n this.containerId = null;\r\n }\r\n }\r\n}\r\n","import { Component, inject, OnInit, OnDestroy, signal, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DestroyRef } from '@angular/core';\r\nimport {\r\n loginMethod,\r\n MReLogin,\r\n reLoginControllerResponse\r\n} from 'cloud-ide-lms-model';\r\nimport { CideInputComponent, CideEleButtonComponent } from 'cloud-ide-element';\r\nimport { ReLoginService } from './re-login.service';\r\n\r\n@Component({\r\n selector: 'cide-auth-re-login',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n CideInputComponent,\r\n CideEleButtonComponent\r\n ],\r\n template: `\r\n <div class=\"tw-w-full tw-max-w-md tw-mx-auto tw-p-6\">\r\n <div class=\"tw-text-center tw-mb-6\">\r\n <h2 class=\"tw-text-2xl tw-font-semibold tw-text-gray-900 tw-mb-2\">Session Expired</h2>\r\n <p class=\"tw-text-sm tw-text-gray-600\">Please re-authenticate to continue</p>\r\n </div>\r\n\r\n @if (error()) {\r\n <div class=\"tw-mb-4 tw-p-3 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\r\n <p class=\"tw-text-sm tw-text-red-600\">{{ error() }}</p>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"reLoginForm\" (ngSubmit)=\"onSubmit()\" novalidate>\r\n <div class=\"tw-space-y-4\">\r\n @if (loginMethod() === 'pass') {\r\n <div>\r\n <cide-ele-input\r\n label=\"Password\"\r\n formControlName=\"user_password\"\r\n type=\"password\"\r\n placeholder=\"Enter your password\"\r\n [required]=\"true\">\r\n </cide-ele-input>\r\n </div>\r\n } @else {\r\n <div>\r\n <cide-ele-input\r\n label=\"MPIN\"\r\n formControlName=\"mpin_pin\"\r\n type=\"password\"\r\n placeholder=\"Enter your MPIN\"\r\n [maxlength]=\"6\"\r\n [required]=\"true\">\r\n </cide-ele-input>\r\n </div>\r\n }\r\n\r\n <div class=\"tw-flex tw-gap-3 tw-pt-4\">\r\n <button\r\n type=\"submit\"\r\n cideEleButton\r\n variant=\"primary\"\r\n [loading]=\"isLoading()\"\r\n [disabled]=\"!reLoginForm.valid || isLoading()\"\r\n class=\"tw-flex-1\">\r\n Re-Login\r\n </button>\r\n <button\r\n type=\"button\"\r\n cideEleButton\r\n variant=\"outline\"\r\n [disabled]=\"isLoading()\"\r\n (click)=\"onCancel()\"\r\n class=\"tw-flex-1\">\r\n Cancel\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class CideAuthReLoginComponent implements OnInit, OnDestroy {\r\n private reLoginService = inject(ReLoginService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n loginMethod = signal<loginMethod>('pass');\r\n isLoading = this.reLoginService.isLoading;\r\n error = this.reLoginService.error;\r\n\r\n reLoginForm = new FormGroup({\r\n custom_login_method: new FormControl<loginMethod>('pass', [Validators.required]),\r\n user_password: new FormControl<string>(''),\r\n mpin_pin: new FormControl<string>('')\r\n });\r\n\r\n ngOnInit(): void {\r\n // Subscribe to re-login service to determine login method\r\n // For now, default to password - this could be configured from settings\r\n this.loginMethod.set('pass');\r\n this.reLoginForm.patchValue({\r\n custom_login_method: 'pass'\r\n });\r\n\r\n // Update validators based on login method\r\n this.updateValidators();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup handled by takeUntilDestroyed\r\n }\r\n\r\n private updateValidators(): void {\r\n const method = this.loginMethod();\r\n \r\n if (method === 'pass') {\r\n this.reLoginForm.get('user_password')?.setValidators([Validators.required]);\r\n this.reLoginForm.get('mpin_pin')?.clearValidators();\r\n this.reLoginForm.get('mpin_pin')?.setValue('');\r\n } else {\r\n this.reLoginForm.get('mpin_pin')?.setValidators([Validators.required, Validators.minLength(4), Validators.maxLength(6)]);\r\n this.reLoginForm.get('user_password')?.clearValidators();\r\n this.reLoginForm.get('user_password')?.setValue('');\r\n }\r\n\r\n this.reLoginForm.get('user_password')?.updateValueAndValidity();\r\n this.reLoginForm.get('mpin_pin')?.updateValueAndValidity();\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.reLoginForm.valid) {\r\n const formValue = this.reLoginForm.value;\r\n const payload: MReLogin = new MReLogin({\r\n custom_login_method: formValue.custom_login_method || 'pass',\r\n user_password: formValue.user_password || undefined,\r\n mpin_pin: formValue.mpin_pin || undefined\r\n } as MReLogin);\r\n\r\n this.reLoginService.reLogin(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response: reLoginControllerResponse) => {\r\n this.reLoginService.handleReLoginSuccess(response);\r\n },\r\n error: () => {\r\n // Error is handled in the service\r\n }\r\n });\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.reLoginService.hideReLogin();\r\n }\r\n}\r\n","import { Route } from '@angular/router';\r\n\r\nexport const authRoutes: Route = {\r\n path: \"auth\",\r\n loadComponent: () => import('./cloud-ide-auth.component').then(c => c.CloudIdeAuthComponent),\r\n children: [\r\n {\r\n path: \"\",\r\n pathMatch: 'full',\r\n redirectTo: 'sign-in'\r\n },\r\n {\r\n path: \"sign-in\",\r\n loadComponent: () => import('./auth/sign-in/sign-in.component').then(c => c.CideAuthSignInComponent)\r\n },\r\n {\r\n path: \"forgot-password\",\r\n loadComponent: () => import('./auth/forgot-password/forgot-password.component').then(c => c.CideAuthForgotPasswordComponent)\r\n },\r\n {\r\n path: \"reset-password/:rout_token\",\r\n loadComponent: () => import('./auth/reset-password/reset-password.component').then(c => c.CideAuthResetPasswordComponent)\r\n }\r\n ]\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn, Router } from '@angular/router';\r\nimport { IAuthService, AUTH_SERVICE_TOKEN, IAppStateService, APP_STATE_SERVICE_TOKEN } from 'cloud-ide-shared';\r\n\r\nexport const authGuard: CanActivateFn = (route, state) => {\r\n const authService = inject(AUTH_SERVICE_TOKEN) as IAuthService;\r\n const appState = inject(APP_STATE_SERVICE_TOKEN) as IAppStateService;\r\n const router = inject(Router);\r\n \r\n // Refresh auth state to make sure it's current\r\n authService.refreshAuthState();\r\n \r\n // Refresh app state from localStorage to ensure synchronization\r\n appState.refreshFromLocalStorage();\r\n \r\n // Check if user is authenticated using app state (modern approach)\r\n if (appState.isUserAuthenticated() && !authService.isTokenExpired()) {\r\n return true;\r\n }\r\n \r\n // Redirect to login page with the intended destination\r\n router.navigate(['/auth/sign-in'], { \r\n queryParams: { returnUrl: state.url }\r\n });\r\n \r\n return false;\r\n};\r\n","/*\r\n * Public API Surface of cloud-ide-auth\r\n */\r\n\r\nexport * from './lib/cloud-ide-auth.service';\r\nexport * from './lib/cloud-ide-auth.component';\r\nexport * from './lib/auth/forgot-password/forgot-password.component';\r\nexport * from './lib/auth/re-login/re-login.service';\r\nexport * from './lib/auth/re-login/re-login-floating.service';\r\nexport * from './lib/auth/re-login/re-login.component';\r\nexport * from './lib/cloud-ide-auth.routes';\r\nexport * from './lib/guards/auth.guard';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { AuthUserMst, MLogin, loginControllerResponse, MForgotPassword, ForgotPasswordControllerResponse, MResetPassword, ResetPasswordControllerResponse } from 'cloud-ide-lms-model';
|
|
1
|
+
import { AuthUserMst, MLogin, loginControllerResponse, MForgotPassword, ForgotPasswordControllerResponse, MResetPassword, ResetPasswordControllerResponse, MReLogin, reLoginControllerResponse, loginMethod } from 'cloud-ide-lms-model';
|
|
2
2
|
import { BehaviorSubject, Observable } from 'rxjs';
|
|
3
|
-
import { IAuthService } from 'cloud-ide-shared';
|
|
4
3
|
import * as i0 from '@angular/core';
|
|
4
|
+
import { OnInit, OnDestroy } from '@angular/core';
|
|
5
5
|
import { FormGroup, FormControl } from '@angular/forms';
|
|
6
6
|
import { Route, CanActivateFn } from '@angular/router';
|
|
7
7
|
|
|
8
|
-
declare class CloudIdeAuthService
|
|
8
|
+
declare class CloudIdeAuthService {
|
|
9
9
|
auth_user_mst: BehaviorSubject<AuthUserMst>;
|
|
10
10
|
private _auth_token;
|
|
11
11
|
private readonly TOKEN_STORAGE_KEY;
|
|
@@ -55,8 +55,83 @@ declare class CideAuthForgotPasswordComponent {
|
|
|
55
55
|
static ɵcmp: i0.ɵɵComponentDeclaration<CideAuthForgotPasswordComponent, "cide-auth-forgot-password", never, {}, {}, never, never, true, never>;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Service to handle re-login functionality when 401 errors occur
|
|
60
|
+
*/
|
|
61
|
+
declare class ReLoginService {
|
|
62
|
+
private http;
|
|
63
|
+
private authService;
|
|
64
|
+
private showReLoginSubject;
|
|
65
|
+
showReLogin$: Observable<boolean>;
|
|
66
|
+
isLoading: i0.WritableSignal<boolean>;
|
|
67
|
+
error: i0.WritableSignal<string | null>;
|
|
68
|
+
/**
|
|
69
|
+
* Show re-login dialog
|
|
70
|
+
*/
|
|
71
|
+
showReLogin(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Hide re-login dialog
|
|
74
|
+
*/
|
|
75
|
+
hideReLogin(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Perform re-login with MPIN or password
|
|
78
|
+
*/
|
|
79
|
+
reLogin(payload: MReLogin): Observable<reLoginControllerResponse>;
|
|
80
|
+
/**
|
|
81
|
+
* Handle successful re-login
|
|
82
|
+
*/
|
|
83
|
+
handleReLoginSuccess(response: reLoginControllerResponse): void;
|
|
84
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ReLoginService, never>;
|
|
85
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ReLoginService>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Service to manage re-login component in floating container
|
|
90
|
+
*/
|
|
91
|
+
declare class ReLoginFloatingService {
|
|
92
|
+
private containerService;
|
|
93
|
+
private reLoginService;
|
|
94
|
+
private readonly destroyRef;
|
|
95
|
+
private containerId;
|
|
96
|
+
constructor();
|
|
97
|
+
/**
|
|
98
|
+
* Register re-login component with floating container service
|
|
99
|
+
*/
|
|
100
|
+
private registerReLoginComponent;
|
|
101
|
+
/**
|
|
102
|
+
* Show re-login in floating container
|
|
103
|
+
*/
|
|
104
|
+
show(): Promise<string | null>;
|
|
105
|
+
/**
|
|
106
|
+
* Hide re-login floating container
|
|
107
|
+
*/
|
|
108
|
+
hide(): void;
|
|
109
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ReLoginFloatingService, never>;
|
|
110
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ReLoginFloatingService>;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
declare class CideAuthReLoginComponent implements OnInit, OnDestroy {
|
|
114
|
+
private reLoginService;
|
|
115
|
+
private readonly destroyRef;
|
|
116
|
+
loginMethod: i0.WritableSignal<loginMethod>;
|
|
117
|
+
isLoading: i0.WritableSignal<boolean>;
|
|
118
|
+
error: i0.WritableSignal<string | null>;
|
|
119
|
+
reLoginForm: FormGroup<{
|
|
120
|
+
custom_login_method: FormControl<loginMethod | null>;
|
|
121
|
+
user_password: FormControl<string | null>;
|
|
122
|
+
mpin_pin: FormControl<string | null>;
|
|
123
|
+
}>;
|
|
124
|
+
ngOnInit(): void;
|
|
125
|
+
ngOnDestroy(): void;
|
|
126
|
+
private updateValidators;
|
|
127
|
+
onSubmit(): void;
|
|
128
|
+
onCancel(): void;
|
|
129
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CideAuthReLoginComponent, never>;
|
|
130
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CideAuthReLoginComponent, "cide-auth-re-login", never, {}, {}, never, never, true, never>;
|
|
131
|
+
}
|
|
132
|
+
|
|
58
133
|
declare const authRoutes: Route;
|
|
59
134
|
|
|
60
135
|
declare const authGuard: CanActivateFn;
|
|
61
136
|
|
|
62
|
-
export { CideAuthForgotPasswordComponent, CloudIdeAuthComponent, CloudIdeAuthService, authGuard, authRoutes };
|
|
137
|
+
export { CideAuthForgotPasswordComponent, CideAuthReLoginComponent, CloudIdeAuthComponent, CloudIdeAuthService, ReLoginFloatingService, ReLoginService, authGuard, authRoutes };
|
package/package.json
CHANGED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, Component } from '@angular/core';
|
|
3
|
-
import { CideInputComponent, CideEleButtonComponent } from 'cloud-ide-element';
|
|
4
|
-
import * as i1 from '@angular/forms';
|
|
5
|
-
import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
-
import { CommonModule } from '@angular/common';
|
|
7
|
-
import { Router } from '@angular/router';
|
|
8
|
-
import { CloudIdeAuthService } from './cloud-ide-auth.mjs';
|
|
9
|
-
|
|
10
|
-
class CideAuthResetPasswordComponent {
|
|
11
|
-
setup_param = { form_loading: false };
|
|
12
|
-
resetPassswordForm;
|
|
13
|
-
erro_message = "";
|
|
14
|
-
authService = inject(CloudIdeAuthService);
|
|
15
|
-
route = inject(Router);
|
|
16
|
-
constructor() {
|
|
17
|
-
this.resetPassswordForm = new FormGroup({
|
|
18
|
-
user_new_password: new FormControl(''),
|
|
19
|
-
user_confirm_password: new FormControl('')
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
onForgotPasssword() {
|
|
23
|
-
if (this.resetPassswordForm.valid) {
|
|
24
|
-
this.setup_param.form_loading = true;
|
|
25
|
-
const resetPasssword = {
|
|
26
|
-
user_password: this.resetPassswordForm?.get('user_password')?.value || '',
|
|
27
|
-
user_username: "",
|
|
28
|
-
sylog_config_data: {
|
|
29
|
-
reset_password_link: "",
|
|
30
|
-
reset_password_secret: "",
|
|
31
|
-
request_timestamp: new Date()
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
this.authService.resetPassword(resetPasssword)?.subscribe({
|
|
35
|
-
next: (response) => {
|
|
36
|
-
if (response?.success === true) {
|
|
37
|
-
this.setup_param.form_loading = false;
|
|
38
|
-
this.route.navigate(['auth', 'sign-in']);
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
error: (error) => {
|
|
42
|
-
this.setup_param.form_loading = false;
|
|
43
|
-
this.erro_message = error?.error?.message;
|
|
44
|
-
console.log(error);
|
|
45
|
-
setTimeout(() => {
|
|
46
|
-
this.erro_message = "";
|
|
47
|
-
}, 3000);
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthResetPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
53
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: CideAuthResetPasswordComponent, isStandalone: true, selector: "cide-auth-reset-password", ngImport: i0, template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\n<!-- Main Div Outer Div-->\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\n <!-- Forrm Wrapper -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <!-- Logo Wrapper -->\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\n alt=\"Cloud IDE Logo\" />\n </div> <!-- Entity name here -->\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Reset Password</div>\n <!-- Error Logger -->\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\n \n <!-- section for controls -->\n <form [formGroup]=\"resetPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\n <!-- New Password -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"new_password\" formControlName=\"new_password\"></cide-ele-input>\n </div>\n <!-- Confirm Password -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"confirm_password\" formControlName=\"confirm_password\"></cide-ele-input>\n </div> <!-- Forgot Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button cideEleButton id=\"reset_password_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!resetPassswordForm.valid\">Reset Password</button>\n </div>\n </div>\n </form>\n </div>\n </div>", styles: [""], dependencies: [{ kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }] });
|
|
54
|
-
}
|
|
55
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthResetPasswordComponent, decorators: [{
|
|
56
|
-
type: Component,
|
|
57
|
-
args: [{ selector: 'cide-auth-reset-password', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent], template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\n<!-- Main Div Outer Div-->\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\n <!-- Forrm Wrapper -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <!-- Logo Wrapper -->\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\n alt=\"Cloud IDE Logo\" />\n </div> <!-- Entity name here -->\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Reset Password</div>\n <!-- Error Logger -->\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\n \n <!-- section for controls -->\n <form [formGroup]=\"resetPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\n <!-- New Password -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"new_password\" formControlName=\"new_password\"></cide-ele-input>\n </div>\n <!-- Confirm Password -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"confirm_password\" formControlName=\"confirm_password\"></cide-ele-input>\n </div> <!-- Forgot Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button cideEleButton id=\"reset_password_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!resetPassswordForm.valid\">Reset Password</button>\n </div>\n </div>\n </form>\n </div>\n </div>" }]
|
|
58
|
-
}], ctorParameters: () => [] });
|
|
59
|
-
|
|
60
|
-
export { CideAuthResetPasswordComponent };
|
|
61
|
-
//# sourceMappingURL=cloud-ide-auth-reset-password.component-BZiK83P_.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-ide-auth-reset-password.component-BZiK83P_.mjs","sources":["../../../projects/cloud-ide-auth/src/lib/auth/reset-password/reset-password.component.ts","../../../projects/cloud-ide-auth/src/lib/auth/reset-password/reset-password.component.html"],"sourcesContent":["import { Component, inject } from '@angular/core';\nimport { CideEleButtonComponent, CideInputComponent } from 'cloud-ide-element';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { FormGroupModel } from '../sign-in/sign-in.component';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { MResetPassword } from 'cloud-ide-lms-model';\n\n@Component({\n selector: 'cide-auth-reset-password',\n standalone: true,\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent],\n templateUrl: './reset-password.component.html',\n styleUrl: './reset-password.component.css'\n})\nexport class CideAuthResetPasswordComponent {\n public setup_param = { form_loading: false };\n public resetPassswordForm: FormGroupModel<{user_new_password: string, user_confirm_password: string}>;\n public erro_message = \"\";\n\n private authService = inject(CloudIdeAuthService);\n private route = inject(Router);\n\n constructor() {\n\n this.resetPassswordForm = new FormGroup({\n user_new_password: new FormControl(''),\n user_confirm_password: new FormControl('')\n }) as unknown as FormGroupModel<{user_new_password: string, user_confirm_password: string}>;\n }\n\n onForgotPasssword() {\n if (this.resetPassswordForm.valid) {\n this.setup_param.form_loading = true;\n const resetPasssword : MResetPassword= {\n user_password: this.resetPassswordForm?.get('user_password')?.value || '',\n user_username: \"\",\n sylog_config_data: {\n reset_password_link: \"\",\n reset_password_secret: \"\",\n request_timestamp: new Date()\n }\n }\n this.authService.resetPassword(resetPasssword)?.subscribe({\n next: (response) => {\n if (response?.success === true) {\n this.setup_param.form_loading = false;\n this.route.navigate(['auth', 'sign-in'])\n }\n },\n error: (error) => {\n this.setup_param.form_loading = false;\n this.erro_message = error?.error?.message;\n console.log(error)\n setTimeout(() => {\n this.erro_message = \"\"\n }, 3000)\n }\n });\n }\n }\n}\n\n","<!-- https://play.tailwindcss.com/lfO85drpUy -->\n<!-- Main Div Outer Div-->\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\n <!-- Forrm Wrapper -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <!-- Logo Wrapper -->\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\n alt=\"Cloud IDE Logo\" />\n </div> <!-- Entity name here -->\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Reset Password</div>\n <!-- Error Logger -->\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\n \n <!-- section for controls -->\n <form [formGroup]=\"resetPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\n <!-- New Password -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"new_password\" formControlName=\"new_password\"></cide-ele-input>\n </div>\n <!-- Confirm Password -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"confirm_password\" formControlName=\"confirm_password\"></cide-ele-input>\n </div> <!-- Forgot Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button cideEleButton id=\"reset_password_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!resetPassswordForm.valid\">Reset Password</button>\n </div>\n </div>\n </form>\n </div>\n </div>"],"names":[],"mappings":"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"}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, inject, Component } from '@angular/core';
|
|
3
|
-
import * as i1 from '@angular/forms';
|
|
4
|
-
import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
5
|
-
import { CommonModule } from '@angular/common';
|
|
6
|
-
import { Router, ActivatedRoute, RouterLink } from '@angular/router';
|
|
7
|
-
import { CloudIdeAuthService } from './cloud-ide-auth.mjs';
|
|
8
|
-
import { CideInputComponent, CideEleButtonComponent } from 'cloud-ide-element';
|
|
9
|
-
import { CideLytSharedWrapperComponent, AppStateHelperService } from 'cloud-ide-layout';
|
|
10
|
-
|
|
11
|
-
class CideAuthSignInComponent extends CideLytSharedWrapperComponent {
|
|
12
|
-
shared_wrapper_setup_param = input({
|
|
13
|
-
sypg_page_code: "auth_sign_in"
|
|
14
|
-
}, ...(ngDevMode ? [{ debugName: "shared_wrapper_setup_param" }] : []));
|
|
15
|
-
setup_param = { form_loading: false };
|
|
16
|
-
loginForm;
|
|
17
|
-
erro_message = "";
|
|
18
|
-
returnUrl = '/control-panel'; // Default return URL
|
|
19
|
-
router = inject(Router);
|
|
20
|
-
activatedRoute = inject(ActivatedRoute);
|
|
21
|
-
authService = inject(CloudIdeAuthService);
|
|
22
|
-
appStateService = inject(AppStateHelperService);
|
|
23
|
-
constructor() {
|
|
24
|
-
super();
|
|
25
|
-
this.loginForm = new FormGroup({
|
|
26
|
-
custom_login_method: new FormControl('pass'),
|
|
27
|
-
user_username: new FormControl(''),
|
|
28
|
-
user_password: new FormControl(''),
|
|
29
|
-
mpin_pin: new FormControl(''),
|
|
30
|
-
stay_sign_in: new FormControl(true)
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
ngOnInit() {
|
|
34
|
-
super.ngOnInit();
|
|
35
|
-
// Get return URL from route parameters or default to '/control-panel'
|
|
36
|
-
this.returnUrl = this.activatedRoute.snapshot.queryParams['returnUrl'] || 'control-panel';
|
|
37
|
-
// If user is already authenticated, redirect to the return URL
|
|
38
|
-
if (this.authService.isAuthenticated() && !this.authService.isTokenExpired()) {
|
|
39
|
-
this.router.navigateByUrl(this.returnUrl);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
onSignIn() {
|
|
43
|
-
if (this.loginForm.valid) {
|
|
44
|
-
this.setup_param.form_loading = true;
|
|
45
|
-
this.authService.signIn(this.loginForm?.value)?.subscribe({
|
|
46
|
-
next: async (response) => {
|
|
47
|
-
if (response?.success === true) {
|
|
48
|
-
// Store user data in auth service
|
|
49
|
-
this.authService.storeUserData(response?.data?.auth_user_mst || {});
|
|
50
|
-
// Synchronize AppStateService with the same user data
|
|
51
|
-
this.appStateService.setUser(response?.data?.auth_user_mst || null);
|
|
52
|
-
// Store active entity data
|
|
53
|
-
this.appStateService.setActiveEntity(response?.data?.core_system_entity || null);
|
|
54
|
-
// Store token through the service setter which saves to localStorage
|
|
55
|
-
this.authService.auth_token = (response?.token || '');
|
|
56
|
-
console.log(response?.token);
|
|
57
|
-
// Navigate to the return URL or control panel
|
|
58
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
59
|
-
this.router.navigateByUrl(this.returnUrl);
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
error: (error) => {
|
|
63
|
-
this.setup_param.form_loading = false;
|
|
64
|
-
this.erro_message = error?.error?.message;
|
|
65
|
-
console.log(error);
|
|
66
|
-
// Modern ES2022+ pattern: Use Promise-based delay
|
|
67
|
-
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
68
|
-
delay(3000).then(() => {
|
|
69
|
-
this.erro_message = "";
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthSignInComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
76
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.1.7", type: CideAuthSignInComponent, isStandalone: true, selector: "cide-auth-sign-in", inputs: { shared_wrapper_setup_param: { classPropertyName: "shared_wrapper_setup_param", publicName: "shared_wrapper_setup_param", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\n<!-- Main Div Outer Div-->\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\n <!-- Login Forrm Wrapper -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <!-- Logo Wrapper -->\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\n alt=\"Cloud IDE Logo\" />\n </div> <!-- Entity name here -->\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">SignIn to CloudIDE sys</div>\n <!-- Error Logger -->\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\n \n <!-- section for controls -->\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onSignIn()\" novalidate>\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\n <!-- Username -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\n </div>\n <!-- Password -->\n <div class=\"tw-m-auto tw-mt-4 tw-w-80\">\n <cide-ele-input id=\"user_password_mpin\" formControlName=\"user_password\"></cide-ele-input>\n </div>\n <!-- Forgot password -->\n <div class=\"tw-m-auto tw-mt-3 tw-flex tw-w-80 tw-justify-between\">\n <div>\n <cide-ele-input id=\"stay_sign_in\" formControlName=\"stay_sign_in\"></cide-ele-input>\n </div>\n <div>\n <a routerLink=\"/auth/forgot-password\" class=\"tw-text-blue-700\">Forgot Password?</a>\n </div>\n </div> <!-- Sign in button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button type=\"submit\" class=\"tw-w-full\" cideEleButton id=\"stay_sin_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!loginForm.valid\">a</button>\n </div>\n </div>\n </form>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
77
|
-
}
|
|
78
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthSignInComponent, decorators: [{
|
|
79
|
-
type: Component,
|
|
80
|
-
args: [{ selector: 'cide-auth-sign-in', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, RouterLink], template: "<!-- https://play.tailwindcss.com/lfO85drpUy -->\n<!-- Main Div Outer Div-->\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\n <!-- Login Forrm Wrapper -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <!-- Logo Wrapper -->\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\n alt=\"Cloud IDE Logo\" />\n </div> <!-- Entity name here -->\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">SignIn to CloudIDE sys</div>\n <!-- Error Logger -->\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\n \n <!-- section for controls -->\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onSignIn()\" novalidate>\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\n <!-- Username -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\n </div>\n <!-- Password -->\n <div class=\"tw-m-auto tw-mt-4 tw-w-80\">\n <cide-ele-input id=\"user_password_mpin\" formControlName=\"user_password\"></cide-ele-input>\n </div>\n <!-- Forgot password -->\n <div class=\"tw-m-auto tw-mt-3 tw-flex tw-w-80 tw-justify-between\">\n <div>\n <cide-ele-input id=\"stay_sign_in\" formControlName=\"stay_sign_in\"></cide-ele-input>\n </div>\n <div>\n <a routerLink=\"/auth/forgot-password\" class=\"tw-text-blue-700\">Forgot Password?</a>\n </div>\n </div> <!-- Sign in button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button type=\"submit\" class=\"tw-w-full\" cideEleButton id=\"stay_sin_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!loginForm.valid\">a</button>\n </div>\n </div>\n </form>\n </div>\n</div>" }]
|
|
81
|
-
}], ctorParameters: () => [] });
|
|
82
|
-
|
|
83
|
-
export { CideAuthSignInComponent };
|
|
84
|
-
//# sourceMappingURL=cloud-ide-auth-sign-in.component-CVfjGwuu.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-ide-auth-sign-in.component-CVfjGwuu.mjs","sources":["../../../projects/cloud-ide-auth/src/lib/auth/sign-in/sign-in.component.ts","../../../projects/cloud-ide-auth/src/lib/auth/sign-in/sign-in.component.html"],"sourcesContent":["import { Component, inject, input, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { loginMethod, MLogin } from 'cloud-ide-lms-model';\nimport { Router, RouterLink, ActivatedRoute } from '@angular/router';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { CideEleButtonComponent, CideInputComponent } from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, CideLytSharedWrapperSetupParam, AppStateHelperService } from 'cloud-ide-layout';\n\nexport type FormGroupModel<T> = FormGroup<{\n [K in keyof T]: FormControl<T[K]>\n}>\n\n@Component({\n selector: 'cide-auth-sign-in',\n standalone: true,\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, RouterLink],\n templateUrl: './sign-in.component.html',\n styleUrl: './sign-in.component.css'\n})\nexport class CideAuthSignInComponent extends CideLytSharedWrapperComponent implements OnInit {\n public override shared_wrapper_setup_param = input<Partial<CideLytSharedWrapperSetupParam>>({\n sypg_page_code: \"auth_sign_in\"\n });\n public setup_param = { form_loading: false };\n public loginForm: FormGroupModel<MLogin>;\n public erro_message = \"\";\n private returnUrl: string = '/control-panel'; // Default return URL\n private router = inject(Router);\n private activatedRoute = inject(ActivatedRoute);\n private authService = inject(CloudIdeAuthService);\n private appStateService = inject(AppStateHelperService);\n constructor(\n ) {\n super();\n\n this.loginForm = new FormGroup({\n custom_login_method: new FormControl<loginMethod>('pass'),\n user_username: new FormControl(''),\n user_password: new FormControl(''),\n mpin_pin: new FormControl(''),\n stay_sign_in: new FormControl(true)\n }) as unknown as FormGroupModel<MLogin>;\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n\n // Get return URL from route parameters or default to '/control-panel'\n this.returnUrl = this.activatedRoute.snapshot.queryParams['returnUrl'] || 'control-panel';\n\n // If user is already authenticated, redirect to the return URL\n if (this.authService.isAuthenticated() && !this.authService.isTokenExpired()) {\n this.router.navigateByUrl(this.returnUrl);\n }\n }\n\n onSignIn(): void {\n if (this.loginForm.valid) {\n this.setup_param.form_loading = true;\n this.authService.signIn(this.loginForm?.value as MLogin)?.subscribe({\n next: async (response) => {\n if (response?.success === true) {\n // Store user data in auth service\n this.authService.storeUserData(response?.data?.auth_user_mst || {});\n\n // Synchronize AppStateService with the same user data \n this.appStateService.setUser(response?.data?.auth_user_mst || null);\n\n // Store active entity data\n this.appStateService.setActiveEntity(response?.data?.core_system_entity || null);\n\n // Store token through the service setter which saves to localStorage\n this.authService.auth_token = (response?.token || '');\n console.log(response?.token);\n\n // Navigate to the return URL or control panel\n await new Promise(resolve => setTimeout(resolve, 2000));\n this.router.navigateByUrl(this.returnUrl);\n }\n },\n error: (error) => {\n this.setup_param.form_loading = false;\n this.erro_message = error?.error?.message;\n console.log(error);\n // Modern ES2022+ pattern: Use Promise-based delay\n const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n delay(3000).then(() => {\n this.erro_message = \"\";\n });\n }\n });\n }\n }\n}","<!-- https://play.tailwindcss.com/lfO85drpUy -->\n<!-- Main Div Outer Div-->\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3\">\n <!-- Login Forrm Wrapper -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <!-- Logo Wrapper -->\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\n alt=\"Cloud IDE Logo\" />\n </div> <!-- Entity name here -->\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">SignIn to CloudIDE sys</div>\n <!-- Error Logger -->\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-text-center tw-text-red-500 tw-h-4 tw-text-sm\">{{erro_message}}</div>\n \n <!-- section for controls -->\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onSignIn()\" novalidate>\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\n <!-- Username -->\n <div class=\"tw-m-auto tw-w-80\">\n <cide-ele-input id=\"user_username\" formControlName=\"user_username\"></cide-ele-input>\n </div>\n <!-- Password -->\n <div class=\"tw-m-auto tw-mt-4 tw-w-80\">\n <cide-ele-input id=\"user_password_mpin\" formControlName=\"user_password\"></cide-ele-input>\n </div>\n <!-- Forgot password -->\n <div class=\"tw-m-auto tw-mt-3 tw-flex tw-w-80 tw-justify-between\">\n <div>\n <cide-ele-input id=\"stay_sign_in\" formControlName=\"stay_sign_in\"></cide-ele-input>\n </div>\n <div>\n <a routerLink=\"/auth/forgot-password\" class=\"tw-text-blue-700\">Forgot Password?</a>\n </div>\n </div> <!-- Sign in button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button type=\"submit\" class=\"tw-w-full\" cideEleButton id=\"stay_sin_button\" [loading]=\"setup_param.form_loading\" [disabled]=\"!loginForm.valid\">a</button>\n </div>\n </div>\n </form>\n </div>\n</div>"],"names":[],"mappings":"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"}
|