cloud-ide-auth 1.0.47 → 1.0.49
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-Bzzm6JA2.mjs → cloud-ide-auth-reset-password.component-CvXau3Mm.mjs} +4 -4
- package/fesm2022/{cloud-ide-auth-reset-password.component-Bzzm6JA2.mjs.map → cloud-ide-auth-reset-password.component-CvXau3Mm.mjs.map} +1 -1
- package/fesm2022/cloud-ide-auth-sign-in.component-B02aT1tF.mjs +119 -0
- package/fesm2022/{cloud-ide-auth-sign-in.component-qkjuyKiz.mjs.map → cloud-ide-auth-sign-in.component-B02aT1tF.mjs.map} +1 -1
- package/fesm2022/cloud-ide-auth.mjs +22 -22
- package/fesm2022/cloud-ide-auth.mjs.map +1 -1
- package/package.json +1 -1
- package/fesm2022/cloud-ide-auth-sign-in.component-qkjuyKiz.mjs +0 -119
|
@@ -132,13 +132,13 @@ class CideAuthResetPasswordComponent {
|
|
|
132
132
|
}, 3000);
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
136
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.
|
|
135
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthResetPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
136
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", 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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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 tw-mb-4\">\n <cide-ele-input \n id=\"new_password\" \n formControlName=\"new_password\"\n type=\"password\"\n placeholder=\"Enter new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('new_password')?.invalid && resetPassswordForm.get('new_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('new_password')?.errors?.['required']) {\n Password is required\n } @else if (resetPassswordForm.get('new_password')?.errors?.['minlength']) {\n Password must be at least 6 characters\n }\n </div>\n }\n </div>\n <!-- Confirm Password -->\n <div class=\"tw-m-auto tw-w-80 tw-mb-4\">\n <cide-ele-input \n id=\"confirm_password\" \n formControlName=\"confirm_password\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('confirm_password')?.invalid && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('confirm_password')?.errors?.['required']) {\n Please confirm your password\n }\n </div>\n }\n @if (resetPassswordForm.errors?.['passwordMismatch'] && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n Passwords do not match\n </div>\n }\n </div>\n <!-- Reset Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button \n type=\"submit\" class=\"tw-w-full\"\n cideEleButton \n id=\"reset_password_button\" \n [loading]=\"loading()\" \n [disabled]=\"!resetPassswordForm.valid || loading() || !resetToken\">\n Reset Password\n </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", "step", "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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { 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], cide-ele-button", 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: "component", type: CideEleThemeToggleComponent, selector: "cide-ele-theme-toggle", inputs: ["size"] }] });
|
|
137
137
|
}
|
|
138
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
138
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthResetPasswordComponent, decorators: [{
|
|
139
139
|
type: Component,
|
|
140
140
|
args: [{ selector: 'cide-auth-reset-password', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, CideEleThemeToggleComponent], 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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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 tw-mb-4\">\n <cide-ele-input \n id=\"new_password\" \n formControlName=\"new_password\"\n type=\"password\"\n placeholder=\"Enter new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('new_password')?.invalid && resetPassswordForm.get('new_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('new_password')?.errors?.['required']) {\n Password is required\n } @else if (resetPassswordForm.get('new_password')?.errors?.['minlength']) {\n Password must be at least 6 characters\n }\n </div>\n }\n </div>\n <!-- Confirm Password -->\n <div class=\"tw-m-auto tw-w-80 tw-mb-4\">\n <cide-ele-input \n id=\"confirm_password\" \n formControlName=\"confirm_password\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('confirm_password')?.invalid && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('confirm_password')?.errors?.['required']) {\n Please confirm your password\n }\n </div>\n }\n @if (resetPassswordForm.errors?.['passwordMismatch'] && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n Passwords do not match\n </div>\n }\n </div>\n <!-- Reset Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button \n type=\"submit\" class=\"tw-w-full\"\n cideEleButton \n id=\"reset_password_button\" \n [loading]=\"loading()\" \n [disabled]=\"!resetPassswordForm.valid || loading() || !resetToken\">\n Reset Password\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>" }]
|
|
141
141
|
}], ctorParameters: () => [] });
|
|
142
142
|
|
|
143
143
|
export { CideAuthResetPasswordComponent };
|
|
144
|
-
//# sourceMappingURL=cloud-ide-auth-reset-password.component-
|
|
144
|
+
//# sourceMappingURL=cloud-ide-auth-reset-password.component-CvXau3Mm.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-ide-auth-reset-password.component-Bzzm6JA2.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, signal, OnInit } from '@angular/core';\nimport { CideEleButtonComponent, CideInputComponent, CideEleThemeToggleComponent } from 'cloud-ide-element';\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { FormGroupModel } from '../sign-in/sign-in.component';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { MResetPassword, controllerResponse } from 'cloud-ide-lms-model';\n\n// Custom validator for password matching\nfunction passwordMatchValidator(control: AbstractControl): ValidationErrors | null {\n const password = control.get('new_password');\n const confirmPassword = control.get('confirm_password');\n \n if (!password || !confirmPassword) {\n return null;\n }\n \n return password.value === confirmPassword.value ? null : { passwordMismatch: true };\n}\n\n@Component({\n selector: 'cide-auth-reset-password',\n standalone: true,\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, CideEleThemeToggleComponent],\n templateUrl: './reset-password.component.html',\n styleUrl: './reset-password.component.css'\n})\nexport class CideAuthResetPasswordComponent implements OnInit {\n public resetPassswordForm: FormGroupModel<{new_password: string, confirm_password: string}>;\n public erro_message = signal<string>('');\n public loading = signal<boolean>(false);\n public resetToken: string = '';\n\n private authService = inject(CloudIdeAuthService);\n private route = inject(Router);\n private activatedRoute = inject(ActivatedRoute);\n\n constructor() {\n this.resetPassswordForm = new FormGroup({\n new_password: new FormControl('', [Validators.required, Validators.minLength(6)]),\n confirm_password: new FormControl('', [Validators.required])\n }, { validators: passwordMatchValidator }) as unknown as FormGroupModel<{new_password: string, confirm_password: string}>;\n }\n\n ngOnInit(): void {\n // Extract the reset token from route parameters using snapshot for immediate access\n const routeParams = this.activatedRoute.snapshot.params;\n this.resetToken = routeParams['rout_token'] || '';\n \n // If token not found in route params (might be due to dots in JWT), try extracting from URL directly\n if (!this.resetToken && typeof window !== 'undefined') {\n const url = window.location.href;\n const resetPasswordMatch = url.match(/\\/reset-password\\/(.+)$/);\n if (resetPasswordMatch && resetPasswordMatch[1]) {\n // Extract token from URL, handling potential hash fragments\n this.resetToken = resetPasswordMatch[1].split('#')[0].split('?')[0];\n console.log('Reset Password: Token extracted from URL directly');\n }\n }\n \n // Debug logging to help diagnose route parameter issues\n console.log('Reset Password Component - Route Params:', routeParams);\n console.log('Reset Password Component - Extracted Token:', this.resetToken ? 'Token found' : 'No token');\n console.log('Reset Password Component - Current URL:', typeof window !== 'undefined' ? window.location.href : 'N/A');\n \n // Also subscribe to handle route parameter changes (for navigation within the same component)\n this.activatedRoute.params.subscribe(params => {\n const token = params['rout_token'] || '';\n if (token && token !== this.resetToken) {\n this.resetToken = token;\n this.erro_message.set(''); // Clear any previous error\n }\n });\n \n // Validate token exists and is not empty\n if (!this.resetToken || this.resetToken.trim() === '') {\n this.erro_message.set('Invalid reset password link. Missing token. Please request a new one.');\n console.error('Reset Password: No token found in route parameters or URL');\n } else {\n // Token is present, clear any error messages\n this.erro_message.set('');\n console.log('Reset Password: Token successfully extracted');\n }\n }\n\n onForgotPasssword() {\n // Mark all fields as touched to show validation errors\n this.resetPassswordForm.markAllAsTouched();\n \n if (this.resetPassswordForm.valid && this.resetToken) {\n this.loading.set(true);\n this.erro_message.set('');\n \n const newPassword = this.resetPassswordForm?.get('new_password')?.value || '';\n const confirmPassword = this.resetPassswordForm?.get('confirm_password')?.value || '';\n \n // Double check password match\n if (newPassword !== confirmPassword) {\n this.loading.set(false);\n this.erro_message.set('Passwords do not match. Please try again.');\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n return;\n }\n\n const resetPasssword: MResetPassword = {\n user_password: newPassword,\n user_username: \"\",\n sylog_config_data: {\n reset_password_link: \"\",\n reset_password_secret: this.resetToken,\n request_timestamp: new Date()\n }\n };\n \n this.authService.resetPassword(resetPasssword)?.subscribe({\n next: (response) => {\n if (response?.success === true) {\n this.loading.set(false);\n this.erro_message.set('');\n this.route.navigate(['auth', 'sign-in']);\n } else {\n this.loading.set(false);\n const errorMessage = response?.message || 'Failed to reset password. Please try again.';\n this.erro_message.set(errorMessage);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n },\n error: (response: { error: controllerResponse }) => {\n this.loading.set(false);\n const errorMessage = response?.error?.message || 'Failed to reset password. Please try again.';\n this.erro_message.set(errorMessage);\n console.error('Reset password error:', response);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n });\n } else {\n if (!this.resetToken) {\n this.erro_message.set('Invalid reset password link. Please request a new one.');\n } else if (!this.resetPassswordForm.valid) {\n this.erro_message.set('Please fill in all required fields correctly.');\n }\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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 tw-mb-4\">\n <cide-ele-input \n id=\"new_password\" \n formControlName=\"new_password\"\n type=\"password\"\n placeholder=\"Enter new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('new_password')?.invalid && resetPassswordForm.get('new_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('new_password')?.errors?.['required']) {\n Password is required\n } @else if (resetPassswordForm.get('new_password')?.errors?.['minlength']) {\n Password must be at least 6 characters\n }\n </div>\n }\n </div>\n <!-- Confirm Password -->\n <div class=\"tw-m-auto tw-w-80 tw-mb-4\">\n <cide-ele-input \n id=\"confirm_password\" \n formControlName=\"confirm_password\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('confirm_password')?.invalid && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('confirm_password')?.errors?.['required']) {\n Please confirm your password\n }\n </div>\n }\n @if (resetPassswordForm.errors?.['passwordMismatch'] && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n Passwords do not match\n </div>\n }\n </div>\n <!-- Reset Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button \n type=\"submit\" class=\"tw-w-full\"\n cideEleButton \n id=\"reset_password_button\" \n [loading]=\"loading()\" \n [disabled]=\"!resetPassswordForm.valid || loading() || !resetToken\">\n Reset Password\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cloud-ide-auth-reset-password.component-CvXau3Mm.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, signal, OnInit } from '@angular/core';\nimport { CideEleButtonComponent, CideInputComponent, CideEleThemeToggleComponent } from 'cloud-ide-element';\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { FormGroupModel } from '../sign-in/sign-in.component';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { MResetPassword, controllerResponse } from 'cloud-ide-lms-model';\n\n// Custom validator for password matching\nfunction passwordMatchValidator(control: AbstractControl): ValidationErrors | null {\n const password = control.get('new_password');\n const confirmPassword = control.get('confirm_password');\n \n if (!password || !confirmPassword) {\n return null;\n }\n \n return password.value === confirmPassword.value ? null : { passwordMismatch: true };\n}\n\n@Component({\n selector: 'cide-auth-reset-password',\n standalone: true,\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, CideEleThemeToggleComponent],\n templateUrl: './reset-password.component.html',\n styleUrl: './reset-password.component.css'\n})\nexport class CideAuthResetPasswordComponent implements OnInit {\n public resetPassswordForm: FormGroupModel<{new_password: string, confirm_password: string}>;\n public erro_message = signal<string>('');\n public loading = signal<boolean>(false);\n public resetToken: string = '';\n\n private authService = inject(CloudIdeAuthService);\n private route = inject(Router);\n private activatedRoute = inject(ActivatedRoute);\n\n constructor() {\n this.resetPassswordForm = new FormGroup({\n new_password: new FormControl('', [Validators.required, Validators.minLength(6)]),\n confirm_password: new FormControl('', [Validators.required])\n }, { validators: passwordMatchValidator }) as unknown as FormGroupModel<{new_password: string, confirm_password: string}>;\n }\n\n ngOnInit(): void {\n // Extract the reset token from route parameters using snapshot for immediate access\n const routeParams = this.activatedRoute.snapshot.params;\n this.resetToken = routeParams['rout_token'] || '';\n \n // If token not found in route params (might be due to dots in JWT), try extracting from URL directly\n if (!this.resetToken && typeof window !== 'undefined') {\n const url = window.location.href;\n const resetPasswordMatch = url.match(/\\/reset-password\\/(.+)$/);\n if (resetPasswordMatch && resetPasswordMatch[1]) {\n // Extract token from URL, handling potential hash fragments\n this.resetToken = resetPasswordMatch[1].split('#')[0].split('?')[0];\n console.log('Reset Password: Token extracted from URL directly');\n }\n }\n \n // Debug logging to help diagnose route parameter issues\n console.log('Reset Password Component - Route Params:', routeParams);\n console.log('Reset Password Component - Extracted Token:', this.resetToken ? 'Token found' : 'No token');\n console.log('Reset Password Component - Current URL:', typeof window !== 'undefined' ? window.location.href : 'N/A');\n \n // Also subscribe to handle route parameter changes (for navigation within the same component)\n this.activatedRoute.params.subscribe(params => {\n const token = params['rout_token'] || '';\n if (token && token !== this.resetToken) {\n this.resetToken = token;\n this.erro_message.set(''); // Clear any previous error\n }\n });\n \n // Validate token exists and is not empty\n if (!this.resetToken || this.resetToken.trim() === '') {\n this.erro_message.set('Invalid reset password link. Missing token. Please request a new one.');\n console.error('Reset Password: No token found in route parameters or URL');\n } else {\n // Token is present, clear any error messages\n this.erro_message.set('');\n console.log('Reset Password: Token successfully extracted');\n }\n }\n\n onForgotPasssword() {\n // Mark all fields as touched to show validation errors\n this.resetPassswordForm.markAllAsTouched();\n \n if (this.resetPassswordForm.valid && this.resetToken) {\n this.loading.set(true);\n this.erro_message.set('');\n \n const newPassword = this.resetPassswordForm?.get('new_password')?.value || '';\n const confirmPassword = this.resetPassswordForm?.get('confirm_password')?.value || '';\n \n // Double check password match\n if (newPassword !== confirmPassword) {\n this.loading.set(false);\n this.erro_message.set('Passwords do not match. Please try again.');\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n return;\n }\n\n const resetPasssword: MResetPassword = {\n user_password: newPassword,\n user_username: \"\",\n sylog_config_data: {\n reset_password_link: \"\",\n reset_password_secret: this.resetToken,\n request_timestamp: new Date()\n }\n };\n \n this.authService.resetPassword(resetPasssword)?.subscribe({\n next: (response) => {\n if (response?.success === true) {\n this.loading.set(false);\n this.erro_message.set('');\n this.route.navigate(['auth', 'sign-in']);\n } else {\n this.loading.set(false);\n const errorMessage = response?.message || 'Failed to reset password. Please try again.';\n this.erro_message.set(errorMessage);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n },\n error: (response: { error: controllerResponse }) => {\n this.loading.set(false);\n const errorMessage = response?.error?.message || 'Failed to reset password. Please try again.';\n this.erro_message.set(errorMessage);\n console.error('Reset password error:', response);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n });\n } else {\n if (!this.resetToken) {\n this.erro_message.set('Invalid reset password link. Please request a new one.');\n } else if (!this.resetPassswordForm.valid) {\n this.erro_message.set('Please fill in all required fields correctly.');\n }\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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 tw-mb-4\">\n <cide-ele-input \n id=\"new_password\" \n formControlName=\"new_password\"\n type=\"password\"\n placeholder=\"Enter new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('new_password')?.invalid && resetPassswordForm.get('new_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('new_password')?.errors?.['required']) {\n Password is required\n } @else if (resetPassswordForm.get('new_password')?.errors?.['minlength']) {\n Password must be at least 6 characters\n }\n </div>\n }\n </div>\n <!-- Confirm Password -->\n <div class=\"tw-m-auto tw-w-80 tw-mb-4\">\n <cide-ele-input \n id=\"confirm_password\" \n formControlName=\"confirm_password\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('confirm_password')?.invalid && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('confirm_password')?.errors?.['required']) {\n Please confirm your password\n }\n </div>\n }\n @if (resetPassswordForm.errors?.['passwordMismatch'] && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n Passwords do not match\n </div>\n }\n </div>\n <!-- Reset Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button \n type=\"submit\" class=\"tw-w-full\"\n cideEleButton \n id=\"reset_password_button\" \n [loading]=\"loading()\" \n [disabled]=\"!resetPassswordForm.valid || loading() || !resetToken\">\n Reset Password\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, signal, inject, Injector, 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, CideEleThemeToggleComponent } 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
|
+
loginForm;
|
|
16
|
+
erro_message = signal('', ...(ngDevMode ? [{ debugName: "erro_message" }] : []));
|
|
17
|
+
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
18
|
+
returnUrl = '/control-panel'; // Default return URL
|
|
19
|
+
router = inject(Router);
|
|
20
|
+
activatedRoute = inject(ActivatedRoute);
|
|
21
|
+
authService = inject(CloudIdeAuthService);
|
|
22
|
+
appStateService = inject(AppStateHelperService);
|
|
23
|
+
injector = inject(Injector);
|
|
24
|
+
constructor() {
|
|
25
|
+
super();
|
|
26
|
+
this.loginForm = new FormGroup({
|
|
27
|
+
custom_login_method: new FormControl('pass'),
|
|
28
|
+
user_username: new FormControl(''),
|
|
29
|
+
user_password: new FormControl(''),
|
|
30
|
+
mpin_pin: new FormControl(''),
|
|
31
|
+
stay_sign_in: new FormControl(true)
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
ngOnInit() {
|
|
35
|
+
super.ngOnInit();
|
|
36
|
+
// Get return URL from route parameters or default to '/control-panel'
|
|
37
|
+
this.returnUrl = this.activatedRoute.snapshot.queryParams['returnUrl'] || 'control-panel';
|
|
38
|
+
// If user is already authenticated, redirect to the return URL
|
|
39
|
+
if (this.authService.isAuthenticated() && !this.authService.isTokenExpired()) {
|
|
40
|
+
this.router.navigateByUrl(this.returnUrl);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
onSignIn() {
|
|
44
|
+
if (this.loginForm.valid) {
|
|
45
|
+
this.loading.set(true);
|
|
46
|
+
this.authService.signIn(this.loginForm?.value)?.subscribe({
|
|
47
|
+
next: async (response) => {
|
|
48
|
+
this.loading.set(false);
|
|
49
|
+
if (response?.success === true) {
|
|
50
|
+
// Store user data in auth service
|
|
51
|
+
this.authService.storeUserData(response?.data?.auth_user_mst || {});
|
|
52
|
+
// Synchronize AppStateService with the same user data
|
|
53
|
+
this.appStateService.setUser(response?.data?.auth_user_mst || null);
|
|
54
|
+
// Store active entity data
|
|
55
|
+
const entity = response?.data?.core_system_entity || null;
|
|
56
|
+
this.appStateService.setActiveEntity(entity);
|
|
57
|
+
// Load currency configuration from financial config after login
|
|
58
|
+
// Note: The app should handle fetching financial config and setting it
|
|
59
|
+
// This is just a placeholder - implement based on your app's structure
|
|
60
|
+
if (entity?._id) {
|
|
61
|
+
try {
|
|
62
|
+
const { CurrencyService } = await import('cloud-ide-element');
|
|
63
|
+
const currencyService = this.injector.get(CurrencyService);
|
|
64
|
+
// TODO: Fetch financial config from your app's service
|
|
65
|
+
// Example:
|
|
66
|
+
// const financialConfigService = this.injector.get(CideAccFinancialConfigService);
|
|
67
|
+
// const response = await financialConfigService
|
|
68
|
+
// .getFinancialConfigById({ accfincfg_entity_id_syen: entity._id })
|
|
69
|
+
// .toPromise();
|
|
70
|
+
// if (response?.success && response?.data) {
|
|
71
|
+
// currencyService.loadFromFinancialConfigData(response.data);
|
|
72
|
+
// }
|
|
73
|
+
console.log('✅ Currency service initialized (using default INR or previously set config)');
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.warn('⚠️ Failed to initialize currency service:', error);
|
|
77
|
+
// Continue with default currency config (INR)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Store token through the service setter which saves to localStorage
|
|
81
|
+
this.authService.auth_token = (response?.token || '');
|
|
82
|
+
console.log(response?.token);
|
|
83
|
+
// Navigate to the return URL or control panel
|
|
84
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
85
|
+
this.router.navigateByUrl(this.returnUrl);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Handle case where API returns success: false
|
|
89
|
+
const errorMessage = response?.message || response?.error_code || 'Login failed. Please check your credentials and try again.';
|
|
90
|
+
this.erro_message.set(errorMessage);
|
|
91
|
+
// Clear error message after 5 seconds
|
|
92
|
+
setTimeout(() => {
|
|
93
|
+
this.erro_message.set('');
|
|
94
|
+
}, 5000);
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
error: (response) => {
|
|
98
|
+
this.loading.set(false);
|
|
99
|
+
const errorMessage = response?.error?.message || 'Login failed. Please check your credentials and try again.';
|
|
100
|
+
this.erro_message.set(errorMessage);
|
|
101
|
+
console.error('Login error:', response);
|
|
102
|
+
// Clear error message after 5 seconds
|
|
103
|
+
setTimeout(() => {
|
|
104
|
+
this.erro_message.set('');
|
|
105
|
+
}, 5000);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthSignInComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
111
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", 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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 tw-text-gray-900\">SignIn to CloudIDE sys</div>\n <!-- Error Logger -->\n @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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\" type=\"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-600 hover: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]=\"loading()\" [disabled]=\"!loginForm.valid || loading()\">Sign In</button>\n </div>\n </div>\n </form>\n </div>\n</div>", styles: [":root[data-theme=dark] .cide-font-poppins,:root.dark-mode .cide-font-poppins,html[data-theme=dark] .cide-font-poppins,html.dark-mode .cide-font-poppins{background-color:var(--cide-theme-dark-color)!important}:root[data-theme=dark] .tw-bg-white,:root.dark-mode .tw-bg-white,html[data-theme=dark] .tw-bg-white,html.dark-mode .tw-bg-white{background-color:var(--cide-theme-light-color)!important}:root[data-theme=dark] .tw-text-gray-900,:root.dark-mode .tw-text-gray-900,html[data-theme=dark] .tw-text-gray-900,html.dark-mode .tw-text-gray-900{color:var(--cide-theme-text-color)!important}:root[data-theme=dark] .tw-text-blue-600,:root[data-theme=dark] .tw-text-blue-700,:root.dark-mode .tw-text-blue-600,:root.dark-mode .tw-text-blue-700,html[data-theme=dark] .tw-text-blue-600,html[data-theme=dark] .tw-text-blue-700,html.dark-mode .tw-text-blue-600,html.dark-mode .tw-text-blue-700{color:var(--cide-theme-primary-color)!important}:root[data-theme=dark] .tw-shadow-xl,:root.dark-mode .tw-shadow-xl,html[data-theme=dark] .tw-shadow-xl,html.dark-mode .tw-shadow-xl{box-shadow:0 20px 25px -5px var(--cide-theme-shadow-color),0 10px 10px -5px var(--cide-theme-shadow-color)!important}\n"], 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", "step", "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], cide-ele-button", 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"] }, { kind: "component", type: CideEleThemeToggleComponent, selector: "cide-ele-theme-toggle", inputs: ["size"] }] });
|
|
112
|
+
}
|
|
113
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthSignInComponent, decorators: [{
|
|
114
|
+
type: Component,
|
|
115
|
+
args: [{ selector: 'cide-auth-sign-in', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, RouterLink, CideEleThemeToggleComponent], 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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 tw-text-gray-900\">SignIn to CloudIDE sys</div>\n <!-- Error Logger -->\n @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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\" type=\"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-600 hover: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]=\"loading()\" [disabled]=\"!loginForm.valid || loading()\">Sign In</button>\n </div>\n </div>\n </form>\n </div>\n</div>", styles: [":root[data-theme=dark] .cide-font-poppins,:root.dark-mode .cide-font-poppins,html[data-theme=dark] .cide-font-poppins,html.dark-mode .cide-font-poppins{background-color:var(--cide-theme-dark-color)!important}:root[data-theme=dark] .tw-bg-white,:root.dark-mode .tw-bg-white,html[data-theme=dark] .tw-bg-white,html.dark-mode .tw-bg-white{background-color:var(--cide-theme-light-color)!important}:root[data-theme=dark] .tw-text-gray-900,:root.dark-mode .tw-text-gray-900,html[data-theme=dark] .tw-text-gray-900,html.dark-mode .tw-text-gray-900{color:var(--cide-theme-text-color)!important}:root[data-theme=dark] .tw-text-blue-600,:root[data-theme=dark] .tw-text-blue-700,:root.dark-mode .tw-text-blue-600,:root.dark-mode .tw-text-blue-700,html[data-theme=dark] .tw-text-blue-600,html[data-theme=dark] .tw-text-blue-700,html.dark-mode .tw-text-blue-600,html.dark-mode .tw-text-blue-700{color:var(--cide-theme-primary-color)!important}:root[data-theme=dark] .tw-shadow-xl,:root.dark-mode .tw-shadow-xl,html[data-theme=dark] .tw-shadow-xl,html.dark-mode .tw-shadow-xl{box-shadow:0 20px 25px -5px var(--cide-theme-shadow-color),0 10px 10px -5px var(--cide-theme-shadow-color)!important}\n"] }]
|
|
116
|
+
}], ctorParameters: () => [], propDecorators: { shared_wrapper_setup_param: [{ type: i0.Input, args: [{ isSignal: true, alias: "shared_wrapper_setup_param", required: false }] }] } });
|
|
117
|
+
|
|
118
|
+
export { CideAuthSignInComponent };
|
|
119
|
+
//# sourceMappingURL=cloud-ide-auth-sign-in.component-B02aT1tF.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-ide-auth-sign-in.component-qkjuyKiz.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, signal, Injector } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { loginMethod, MLogin, controllerResponse } from 'cloud-ide-lms-model';\nimport { Router, RouterLink, ActivatedRoute } from '@angular/router';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { CideEleButtonComponent, CideInputComponent, CideEleThemeToggleComponent } 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, CideEleThemeToggleComponent],\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 loginForm: FormGroupModel<MLogin>;\n public erro_message = signal<string>('');\n public loading = signal<boolean>(false);\n private returnUrl: string = '/control-panel'; // Default return URL\n protected override router = inject(Router);\n private activatedRoute = inject(ActivatedRoute);\n private authService = inject(CloudIdeAuthService);\n private appStateService = inject(AppStateHelperService);\n private injector = inject(Injector);\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\n onSignIn(): void {\n if (this.loginForm.valid) {\n this.loading.set(true);\n this.authService.signIn(this.loginForm?.value as MLogin)?.subscribe({\n next: async (response) => {\n this.loading.set(false);\n \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 const entity = response?.data?.core_system_entity || null;\n this.appStateService.setActiveEntity(entity);\n\n // Load currency configuration from financial config after login\n // Note: The app should handle fetching financial config and setting it\n // This is just a placeholder - implement based on your app's structure\n if (entity?._id) {\n try {\n const { CurrencyService } = await import('cloud-ide-element');\n const currencyService = this.injector.get(CurrencyService);\n \n // TODO: Fetch financial config from your app's service\n // Example:\n // const financialConfigService = this.injector.get(CideAccFinancialConfigService);\n // const response = await financialConfigService\n // .getFinancialConfigById({ accfincfg_entity_id_syen: entity._id })\n // .toPromise();\n // if (response?.success && response?.data) {\n // currencyService.loadFromFinancialConfigData(response.data);\n // }\n \n console.log('✅ Currency service initialized (using default INR or previously set config)');\n } catch (error) {\n console.warn('⚠️ Failed to initialize currency service:', error);\n // Continue with default currency config (INR)\n }\n }\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, 200));\n this.router.navigateByUrl(this.returnUrl);\n } else {\n // Handle case where API returns success: false\n const errorMessage = response?.message || response?.error_code || 'Login failed. Please check your credentials and try again.';\n this.erro_message.set(errorMessage);\n \n // Clear error message after 5 seconds\n setTimeout(() => {\n this.erro_message.set('');\n }, 5000);\n }\n },\n error: (response: { error: controllerResponse }) => {\n this.loading.set(false);\n \n const errorMessage = response?.error?.message || 'Login failed. Please check your credentials and try again.';\n this.erro_message.set(errorMessage);\n console.error('Login error:', response);\n \n // Clear error message after 5 seconds\n setTimeout(() => {\n this.erro_message.set('');\n }, 5000);\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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 tw-text-gray-900\">SignIn to CloudIDE sys</div>\n <!-- Error Logger -->\n @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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-600 hover: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]=\"loading()\" [disabled]=\"!loginForm.valid || loading()\">Sign In</button>\n </div>\n </div>\n </form>\n </div>\n</div>"],"names":[],"mappings":";;;;;;;;;;AAoBM,MAAO,uBAAwB,SAAQ,6BAA6B,CAAA;IACxD,0BAA0B,GAAG,KAAK,CAA0C;AAC1F,QAAA,cAAc,EAAE;AACjB,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,4BAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACK,IAAA,SAAS;AACT,IAAA,YAAY,GAAG,MAAM,CAAS,EAAE,wDAAC;AACjC,IAAA,OAAO,GAAG,MAAM,CAAU,KAAK,mDAAC;AAC/B,IAAA,SAAS,GAAW,gBAAgB,CAAC;AAC1B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAClC,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACzC,IAAA,eAAe,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC/C,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACnC,IAAA,WAAA,GAAA;AAEE,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC;AAC7B,YAAA,mBAAmB,EAAE,IAAI,WAAW,CAAc,MAAM,CAAC;AACzD,YAAA,aAAa,EAAE,IAAI,WAAW,CAAC,EAAE,CAAC;AAClC,YAAA,aAAa,EAAE,IAAI,WAAW,CAAC,EAAE,CAAC;AAClC,YAAA,QAAQ,EAAE,IAAI,WAAW,CAAC,EAAE,CAAC;AAC7B,YAAA,YAAY,EAAE,IAAI,WAAW,CAAC,IAAI;AACnC,SAAA,CAAsC;;IAGhC,QAAQ,GAAA;QACf,KAAK,CAAC,QAAQ,EAAE;;AAGhB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,eAAe;;AAGzF,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE;YAC5E,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;;;IAK7C,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAe,CAAC,EAAE,SAAS,CAAC;AAClE,gBAAA,IAAI,EAAE,OAAO,QAAQ,KAAI;AACvB,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAEvB,oBAAA,IAAI,QAAQ,EAAE,OAAO,KAAK,IAAI,EAAE;;AAE9B,wBAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,IAAI,EAAE,CAAC;;AAGnE,wBAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC;;wBAGnE,MAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,EAAE,kBAAkB,IAAI,IAAI;AACzD,wBAAA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,MAAM,CAAC;;;;AAK5C,wBAAA,IAAI,MAAM,EAAE,GAAG,EAAE;AACf,4BAAA,IAAI;gCACF,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,OAAO,mBAAmB,CAAC;gCAC7D,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;;;;;;;;;;AAY1D,gCAAA,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC;;4BAC1F,OAAO,KAAK,EAAE;AACd,gCAAA,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,KAAK,CAAC;;;;;AAMpE,wBAAA,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;AACrD,wBAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;;AAG5B,wBAAA,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;wBACtD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;;yBACpC;;wBAEL,MAAM,YAAY,GAAG,QAAQ,EAAE,OAAO,IAAI,QAAQ,EAAE,UAAU,IAAI,4DAA4D;AAC9H,wBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;;wBAGnC,UAAU,CAAC,MAAK;AACd,4BAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;yBAC1B,EAAE,IAAI,CAAC;;iBAEX;AACD,gBAAA,KAAK,EAAE,CAAC,QAAuC,KAAI;AACjD,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;oBAEvB,MAAM,YAAY,GAAG,QAAQ,EAAE,KAAK,EAAE,OAAO,IAAI,4DAA4D;AAC7G,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;AACnC,oBAAA,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,CAAC;;oBAGvC,UAAU,CAAC,MAAK;AACd,wBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;qBAC1B,EAAE,IAAI,CAAC;;AAEX,aAAA,CAAC;;;uGAhHK,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBpC,g4EAgDM,EAAA,MAAA,EAAA,CAAA,+pCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDhCM,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,cAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,wBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,MAAA,EAAA,OAAA,EAAA,IAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,KAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,0DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,IAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,YAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,oOAAE,2BAA2B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIrH,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,EAAE,sBAAsB,EAAE,UAAU,EAAE,2BAA2B,CAAC,EAAA,QAAA,EAAA,g4EAAA,EAAA,MAAA,EAAA,CAAA,+pCAAA,CAAA,EAAA;;;;;"}
|
|
1
|
+
{"version":3,"file":"cloud-ide-auth-sign-in.component-B02aT1tF.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, signal, Injector } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { loginMethod, MLogin, controllerResponse } from 'cloud-ide-lms-model';\nimport { Router, RouterLink, ActivatedRoute } from '@angular/router';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { CideEleButtonComponent, CideInputComponent, CideEleThemeToggleComponent } 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, CideEleThemeToggleComponent],\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 loginForm: FormGroupModel<MLogin>;\n public erro_message = signal<string>('');\n public loading = signal<boolean>(false);\n private returnUrl: string = '/control-panel'; // Default return URL\n protected override router = inject(Router);\n private activatedRoute = inject(ActivatedRoute);\n private authService = inject(CloudIdeAuthService);\n private appStateService = inject(AppStateHelperService);\n private injector = inject(Injector);\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\n onSignIn(): void {\n if (this.loginForm.valid) {\n this.loading.set(true);\n this.authService.signIn(this.loginForm?.value as MLogin)?.subscribe({\n next: async (response) => {\n this.loading.set(false);\n \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 const entity = response?.data?.core_system_entity || null;\n this.appStateService.setActiveEntity(entity);\n\n // Load currency configuration from financial config after login\n // Note: The app should handle fetching financial config and setting it\n // This is just a placeholder - implement based on your app's structure\n if (entity?._id) {\n try {\n const { CurrencyService } = await import('cloud-ide-element');\n const currencyService = this.injector.get(CurrencyService);\n \n // TODO: Fetch financial config from your app's service\n // Example:\n // const financialConfigService = this.injector.get(CideAccFinancialConfigService);\n // const response = await financialConfigService\n // .getFinancialConfigById({ accfincfg_entity_id_syen: entity._id })\n // .toPromise();\n // if (response?.success && response?.data) {\n // currencyService.loadFromFinancialConfigData(response.data);\n // }\n \n console.log('✅ Currency service initialized (using default INR or previously set config)');\n } catch (error) {\n console.warn('⚠️ Failed to initialize currency service:', error);\n // Continue with default currency config (INR)\n }\n }\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, 200));\n this.router.navigateByUrl(this.returnUrl);\n } else {\n // Handle case where API returns success: false\n const errorMessage = response?.message || response?.error_code || 'Login failed. Please check your credentials and try again.';\n this.erro_message.set(errorMessage);\n \n // Clear error message after 5 seconds\n setTimeout(() => {\n this.erro_message.set('');\n }, 5000);\n }\n },\n error: (response: { error: controllerResponse }) => {\n this.loading.set(false);\n \n const errorMessage = response?.error?.message || 'Login failed. Please check your credentials and try again.';\n this.erro_message.set(errorMessage);\n console.error('Login error:', response);\n \n // Clear error message after 5 seconds\n setTimeout(() => {\n this.erro_message.set('');\n }, 5000);\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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 tw-text-gray-900\">SignIn to CloudIDE sys</div>\n <!-- Error Logger -->\n @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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\" type=\"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-600 hover: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]=\"loading()\" [disabled]=\"!loginForm.valid || loading()\">Sign In</button>\n </div>\n </div>\n </form>\n </div>\n</div>"],"names":[],"mappings":"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"}
|
|
@@ -196,10 +196,10 @@ class CloudIdeAuthService {
|
|
|
196
196
|
this.signOut();
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
200
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.
|
|
199
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CloudIdeAuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
200
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CloudIdeAuthService, providedIn: 'root' });
|
|
201
201
|
}
|
|
202
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
202
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CloudIdeAuthService, decorators: [{
|
|
203
203
|
type: Injectable,
|
|
204
204
|
args: [{
|
|
205
205
|
providedIn: 'root'
|
|
@@ -207,12 +207,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
|
|
|
207
207
|
}], ctorParameters: () => [] });
|
|
208
208
|
|
|
209
209
|
class CloudIdeAuthComponent {
|
|
210
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
211
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.
|
|
210
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CloudIdeAuthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
211
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: CloudIdeAuthComponent, isStandalone: true, selector: "cide-auth-wrapper", ngImport: i0, template: `
|
|
212
212
|
<router-outlet></router-outlet>
|
|
213
213
|
`, isInline: true, styles: [""], dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
|
|
214
214
|
}
|
|
215
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
215
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CloudIdeAuthComponent, decorators: [{
|
|
216
216
|
type: Component,
|
|
217
217
|
args: [{ selector: 'cide-auth-wrapper', standalone: true, imports: [RouterOutlet], template: `
|
|
218
218
|
<router-outlet></router-outlet>
|
|
@@ -309,10 +309,10 @@ class CideAuthForgotPasswordComponent {
|
|
|
309
309
|
}
|
|
310
310
|
});
|
|
311
311
|
}
|
|
312
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
313
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.
|
|
312
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthForgotPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
313
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", 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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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 tw-mb-4\">\n <cide-ele-input \n id=\"user_username\" \n formControlName=\"user_username\"\n placeholder=\"Enter your username\"\n [required]=\"true\">\n </cide-ele-input>\n @if (forgotPassswordForm.get('user_username')?.invalid && forgotPassswordForm.get('user_username')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (forgotPassswordForm.get('user_username')?.errors?.['required']) {\n Username is required\n } @else if (forgotPassswordForm.get('user_username')?.errors?.['minlength']) {\n Username must be at least 8 characters\n } @else if (forgotPassswordForm.get('user_username')?.errors?.['maxlength']) {\n Username must be at most 20 characters\n }\n </div>\n }\n </div>\n <!-- Forgot Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button \n type=\"submit\"\n cideEleButton \n id=\"reset_password_link_button\" \n [loading]=\"loading()\" \n [disabled]=\"loading()\">\n Reset Password\n </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", "step", "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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { 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], cide-ele-button", 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: "component", type: CideEleThemeToggleComponent, selector: "cide-ele-theme-toggle", inputs: ["size"] }] });
|
|
314
314
|
}
|
|
315
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
315
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthForgotPasswordComponent, decorators: [{
|
|
316
316
|
type: Component,
|
|
317
317
|
args: [{ selector: 'cide-auth-forgot-password', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, CideEleThemeToggleComponent], 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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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 tw-mb-4\">\n <cide-ele-input \n id=\"user_username\" \n formControlName=\"user_username\"\n placeholder=\"Enter your username\"\n [required]=\"true\">\n </cide-ele-input>\n @if (forgotPassswordForm.get('user_username')?.invalid && forgotPassswordForm.get('user_username')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (forgotPassswordForm.get('user_username')?.errors?.['required']) {\n Username is required\n } @else if (forgotPassswordForm.get('user_username')?.errors?.['minlength']) {\n Username must be at least 8 characters\n } @else if (forgotPassswordForm.get('user_username')?.errors?.['maxlength']) {\n Username must be at most 20 characters\n }\n </div>\n }\n </div>\n <!-- Forgot Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button \n type=\"submit\"\n cideEleButton \n id=\"reset_password_link_button\" \n [loading]=\"loading()\" \n [disabled]=\"loading()\">\n Reset Password\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>" }]
|
|
318
318
|
}], ctorParameters: () => [] });
|
|
@@ -401,10 +401,10 @@ class ReLoginService {
|
|
|
401
401
|
this.isLoading.set(false);
|
|
402
402
|
}
|
|
403
403
|
}
|
|
404
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
405
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.
|
|
404
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ReLoginService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
405
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ReLoginService, providedIn: 'root' });
|
|
406
406
|
}
|
|
407
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
407
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ReLoginService, decorators: [{
|
|
408
408
|
type: Injectable,
|
|
409
409
|
args: [{
|
|
410
410
|
providedIn: 'root'
|
|
@@ -492,10 +492,10 @@ class ReLoginFloatingService {
|
|
|
492
492
|
this.containerId = null;
|
|
493
493
|
}
|
|
494
494
|
}
|
|
495
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
496
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.
|
|
495
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ReLoginFloatingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
496
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ReLoginFloatingService, providedIn: 'root' });
|
|
497
497
|
}
|
|
498
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
498
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ReLoginFloatingService, decorators: [{
|
|
499
499
|
type: Injectable,
|
|
500
500
|
args: [{
|
|
501
501
|
providedIn: 'root'
|
|
@@ -558,8 +558,8 @@ class CideAuthReLoginComponent extends CideLytSharedWrapperComponent {
|
|
|
558
558
|
});
|
|
559
559
|
}
|
|
560
560
|
}
|
|
561
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.
|
|
562
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.
|
|
561
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthReLoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
562
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: CideAuthReLoginComponent, isStandalone: true, selector: "cide-auth-re-login", 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: `
|
|
563
563
|
<div class="tw-w-full tw-max-w-md tw-mx-auto tw-p-6">
|
|
564
564
|
<div class="tw-text-center tw-mb-6">
|
|
565
565
|
<h2 class="tw-text-2xl tw-font-semibold tw-text-gray-900 tw-mb-2">Session Expired</h2>
|
|
@@ -601,7 +601,7 @@ class CideAuthReLoginComponent extends CideLytSharedWrapperComponent {
|
|
|
601
601
|
</div>
|
|
602
602
|
`, 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.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", "step", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton], cide-ele-button", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }] });
|
|
603
603
|
}
|
|
604
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.
|
|
604
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthReLoginComponent, decorators: [{
|
|
605
605
|
type: Component,
|
|
606
606
|
args: [{ selector: 'cide-auth-re-login', standalone: true, imports: [
|
|
607
607
|
CommonModule,
|
|
@@ -649,7 +649,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
|
|
|
649
649
|
</form>
|
|
650
650
|
</div>
|
|
651
651
|
` }]
|
|
652
|
-
}], ctorParameters: () => [] });
|
|
652
|
+
}], ctorParameters: () => [], propDecorators: { shared_wrapper_setup_param: [{ type: i0.Input, args: [{ isSignal: true, alias: "shared_wrapper_setup_param", required: false }] }] } });
|
|
653
653
|
|
|
654
654
|
var reLogin_component = /*#__PURE__*/Object.freeze({
|
|
655
655
|
__proto__: null,
|
|
@@ -657,7 +657,7 @@ var reLogin_component = /*#__PURE__*/Object.freeze({
|
|
|
657
657
|
});
|
|
658
658
|
|
|
659
659
|
const authRoutes = {
|
|
660
|
-
path: "auth",
|
|
660
|
+
path: "auth", // localhost:4200/auth/sign-in
|
|
661
661
|
loadComponent: () => Promise.resolve().then(function () { return cloudIdeAuth_component; }).then(c => c.CloudIdeAuthComponent),
|
|
662
662
|
children: [
|
|
663
663
|
{
|
|
@@ -667,7 +667,7 @@ const authRoutes = {
|
|
|
667
667
|
},
|
|
668
668
|
{
|
|
669
669
|
path: "sign-in",
|
|
670
|
-
loadComponent: () => import('./cloud-ide-auth-sign-in.component-
|
|
670
|
+
loadComponent: () => import('./cloud-ide-auth-sign-in.component-B02aT1tF.mjs').then(c => c.CideAuthSignInComponent)
|
|
671
671
|
},
|
|
672
672
|
{
|
|
673
673
|
path: "forgot-password",
|
|
@@ -675,7 +675,7 @@ const authRoutes = {
|
|
|
675
675
|
},
|
|
676
676
|
{
|
|
677
677
|
path: "reset-password/:rout_token",
|
|
678
|
-
loadComponent: () => import('./cloud-ide-auth-reset-password.component-
|
|
678
|
+
loadComponent: () => import('./cloud-ide-auth-reset-password.component-CvXau3Mm.mjs').then(c => c.CideAuthResetPasswordComponent)
|
|
679
679
|
}
|
|
680
680
|
]
|
|
681
681
|
};
|
|
@@ -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/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';\nimport { Injectable, inject } from '@angular/core';\nimport {\n authRoutesUrl, cidePath, hostManagerRoutesUrl, AuthUserMst,\n loginControllerResponse, MLogin, MForgotPassword, ForgotPasswordControllerResponse,\n MResetPassword, ResetPasswordControllerResponse, customEncrypt\n} from 'cloud-ide-lms-model';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CloudIdeAuthService {\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 // View-only token for public APIs\n private readonly VIEW_ONLY_TOKEN_STORAGE_KEY = 'cloud_ide_view_only_token';\n private _view_only_token: string = '';\n\n get view_only_token(): string {\n return this._view_only_token;\n }\n\n set view_only_token(value: string) {\n this._view_only_token = value;\n if (!this.isLocalStorageAvailable()) {\n return;\n }\n if (value) {\n localStorage.setItem(this.VIEW_ONLY_TOKEN_STORAGE_KEY, value);\n } else {\n localStorage.removeItem(this.VIEW_ONLY_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 view-only token\n const storedViewOnlyToken = localStorage.getItem(this.VIEW_ONLY_TOKEN_STORAGE_KEY);\n if (storedViewOnlyToken) {\n this._view_only_token = storedViewOnlyToken;\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 // Silent error handling for auth data loading\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 // Create a copy to avoid mutating the original\n const loginPayload: MLogin = new MLogin(body);\n \n if (loginPayload?.user_password) {\n if (loginPayload?.user_password?.length <= 6) {\n // MPIN - no encryption needed for MPIN\n loginPayload.custom_login_method = \"mpin\";\n loginPayload.mpin_pin = loginPayload?.user_password;\n loginPayload.user_password = \"\";\n } else {\n // Password - encrypt before sending\n loginPayload.custom_login_method = \"pass\";\n loginPayload.user_password = customEncrypt(loginPayload.user_password);\n }\n }\n return this.http?.post(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, authRoutesUrl?.module, authRoutesUrl?.signIn]), loginPayload);\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 // Encrypt password before sending\n if (payload.user_password) {\n payload.user_password = customEncrypt(payload.user_password);\n }\n return this.http?.post(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, authRoutesUrl?.module, authRoutesUrl?.resetPassword]), payload);\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 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 // Silent error handling for parsing user data\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, signal } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators } 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, controllerResponse } from 'cloud-ide-lms-model';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { CideEleButtonComponent, CideInputComponent, CideEleThemeToggleComponent } from 'cloud-ide-element';\n\n@Component({\n selector: 'cide-auth-forgot-password',\n standalone: true,\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, CideEleThemeToggleComponent],\n templateUrl: './forgot-password.component.html',\n styleUrl: './forgot-password.component.css'\n})\nexport class CideAuthForgotPasswordComponent {\n public forgotPassswordForm: FormGroupModel<MForgotPassword>;\n public erro_message = signal<string>('');\n public loading = signal<boolean>(false);\n\n private authService = inject(CloudIdeAuthService);\n private route = inject(Router);\n\n constructor() {\n this.forgotPassswordForm = new FormGroup({\n custom_forgot_password_method: new FormControl<forgotPasswordMethod>('username'),\n user_username: new FormControl('', [Validators.required, Validators.minLength(8), Validators.maxLength(20)]),\n user_emailid: new FormControl(''),\n user_mobileno: new FormControl(),\n }) as unknown as FormGroupModel<MForgotPassword>;\n }\n\n onForgotPasssword() {\n // Mark all fields as touched to show validation errors\n this.forgotPassswordForm.markAllAsTouched();\n \n // Clear previous error messages\n this.erro_message.set('');\n \n // Check if form has basic Angular validators passed\n if (!this.forgotPassswordForm.valid) {\n const usernameControl = this.forgotPassswordForm.get('user_username');\n if (usernameControl?.errors?.['required']) {\n this.erro_message.set('Username is required');\n } else if (usernameControl?.errors?.['minlength']) {\n this.erro_message.set('Username must be at least 8 characters');\n } else if (usernameControl?.errors?.['maxlength']) {\n this.erro_message.set('Username must be at most 20 characters');\n } else {\n this.erro_message.set('Please fill in all required fields correctly');\n }\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n return;\n }\n\n // Create the model and validate using custom validation\n const forgotPasswordPayload = new MForgotPassword(this.forgotPassswordForm?.value as MForgotPassword);\n const validate = validateRequestModal(forgotPasswordPayload);\n \n if (validate !== true) {\n // Custom validation failed\n this.loading.set(false);\n const errorKey = validate.first;\n // Get the error message from errorLogger using the first key\n const errorMessage = (validate.errorLogger as Record<string, string>)?.[errorKey] || 'Validation failed. Please check your input.';\n this.erro_message.set(errorMessage);\n console.error('Forgot password validation error:', validate);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n return;\n }\n\n // All validations passed, make API call\n this.loading.set(true);\n this.authService.forgotPassword(forgotPasswordPayload)?.subscribe({\n next: (response) => {\n this.loading.set(false);\n if (response?.success === true) {\n this.erro_message.set('');\n this.route.navigate(['auth', 'sign-in']);\n } else {\n // API returned success: false\n const errorMessage = response?.message || 'Failed to process forgot password request. Please try again.';\n this.erro_message.set(errorMessage);\n console.error('Forgot password API error:', response);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n },\n error: (response: { error: controllerResponse }) => {\n this.loading.set(false);\n const errorMessage = response?.error?.message || 'Failed to process forgot password request. Please try again.';\n this.erro_message.set(errorMessage);\n console.error('Forgot password error:', response);\n setTimeout(() => {\n this.erro_message.set('');\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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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 tw-mb-4\">\n <cide-ele-input \n id=\"user_username\" \n formControlName=\"user_username\"\n placeholder=\"Enter your username\"\n [required]=\"true\">\n </cide-ele-input>\n @if (forgotPassswordForm.get('user_username')?.invalid && forgotPassswordForm.get('user_username')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (forgotPassswordForm.get('user_username')?.errors?.['required']) {\n Username is required\n } @else if (forgotPassswordForm.get('user_username')?.errors?.['minlength']) {\n Username must be at least 8 characters\n } @else if (forgotPassswordForm.get('user_username')?.errors?.['maxlength']) {\n Username must be at most 20 characters\n }\n </div>\n }\n </div>\n <!-- Forgot Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button \n type=\"submit\"\n cideEleButton \n id=\"reset_password_link_button\" \n [loading]=\"loading()\" \n [disabled]=\"loading()\">\n Reset Password\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>","import { Injectable, inject, signal } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject, Observable, catchError, of } from 'rxjs';\nimport {\n authRoutesUrl,\n cidePath,\n hostManagerRoutesUrl,\n MReLogin,\n reLoginControllerResponse,\n AuthUserMst,\n customEncrypt,\n controllerResponse\n} from 'cloud-ide-lms-model';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\n\n/**\n * Service to handle re-login functionality when 401 errors occur\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ReLoginService {\n private http = inject(HttpClient);\n private authService = inject(CloudIdeAuthService);\n\n // Observable to control re-login dialog visibility\n private showReLoginSubject = new BehaviorSubject<boolean>(false);\n public showReLogin$ = this.showReLoginSubject.asObservable();\n\n // Signal for re-login state\n isLoading = signal<boolean>(false);\n error = signal<string | null>(null);\n\n /**\n * Show re-login dialog\n */\n showReLogin(): void {\n // Only show if we have a token (session expired scenario)\n if (this.authService.auth_token) {\n this.showReLoginSubject.next(true);\n }\n }\n\n /**\n * Hide re-login dialog\n */\n hideReLogin(): void {\n this.showReLoginSubject.next(false);\n this.error.set(null);\n }\n\n\n /**\n * Perform re-login with MPIN or password\n */\n reLogin(payload: MReLogin): Observable<reLoginControllerResponse> {\n this.isLoading.set(true);\n this.error.set(null);\n\n // Create a copy to avoid mutating the original\n const reLoginPayload: MReLogin = {\n ...payload,\n token: this.authService.auth_token\n };\n\n // Encrypt password if provided (MPIN doesn't need encryption)\n if (reLoginPayload.user_password && reLoginPayload.custom_login_method === 'pass') {\n reLoginPayload.user_password = customEncrypt(reLoginPayload.user_password);\n }\n\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n authRoutesUrl.module,\n authRoutesUrl.createReLoginSession\n ]);\n\n return this.http.post<reLoginControllerResponse>(url, reLoginPayload).pipe(\n catchError((response: { error: controllerResponse }) => {\n this.isLoading.set(false);\n const errorMessage = response?.error?.message || 'Re-login failed';\n this.error.set(errorMessage);\n return of({\n success: false,\n message: errorMessage\n } as reLoginControllerResponse);\n })\n );\n }\n\n /**\n * Handle successful re-login\n */\n handleReLoginSuccess(response: reLoginControllerResponse): void {\n if (response.success && response.token) {\n // Update auth token\n this.authService.auth_token = response.token;\n\n // Update user data if available\n if (response.data) {\n const userData = response.data as AuthUserMst;\n this.authService.storeUserData(userData);\n }\n\n // Hide re-login dialog\n this.hideReLogin();\n this.isLoading.set(false);\n } else {\n this.error.set(response.message || 'Re-login failed');\n this.isLoading.set(false);\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { CideEleFloatingContainerService } from 'cloud-ide-element';\nimport { ReLoginService } from './re-login.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DestroyRef } from '@angular/core';\nimport type { FloatingContainerConfig } from 'cloud-ide-element';\n\n/**\n * Service to manage re-login component in floating container\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ReLoginFloatingService {\n private containerService = inject(CideEleFloatingContainerService);\n private reLoginService = inject(ReLoginService);\n private readonly destroyRef = inject(DestroyRef);\n private containerId: string | null = null;\n\n constructor() {\n // Register the component when service is initialized\n this.registerReLoginComponent();\n\n // Subscribe to re-login service to show/hide dialog\n this.reLoginService.showReLogin$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((shouldShow) => {\n if (shouldShow && !this.containerId) {\n this.show();\n } else if (!shouldShow && this.containerId) {\n this.hide();\n }\n });\n }\n\n /**\n * Register re-login component with floating container service\n */\n private async registerReLoginComponent(): Promise<void> {\n if (this.containerService.isComponentRegistered('re-login')) {\n return;\n }\n\n try {\n const module = await import('./re-login.component');\n if (!module.CideAuthReLoginComponent) {\n throw new Error('Component class not found in module');\n }\n this.containerService.registerComponent('re-login', module.CideAuthReLoginComponent);\n } catch (error) {\n console.error('Failed to register re-login component:', error);\n }\n }\n\n /**\n * Show re-login in floating container\n */\n async show(): Promise<string | null> {\n // Ensure component is registered\n if (!this.containerService.isComponentRegistered('re-login')) {\n await this.registerReLoginComponent();\n }\n\n const config: FloatingContainerConfig = {\n id: 're-login-container',\n title: 'Re-Login Required',\n icon: 'lock',\n backdrop: true,\n width: '420px',\n height: 'auto',\n minWidth: '400px',\n minHeight: '200px',\n resizable: false,\n draggable: true,\n closable: false, // Prevent closing - user must re-login\n minimizable: false,\n maximizable: false,\n componentId: 're-login',\n componentConfig: {\n inputs: {},\n outputs: {}\n }\n };\n\n this.containerId = this.containerService.show(config);\n return this.containerId;\n }\n\n /**\n * Hide re-login floating container\n */\n hide(): void {\n if (this.containerId) {\n this.containerService.hide(this.containerId);\n this.containerId = null;\n }\n }\n}\n","import { Component, inject, OnInit, OnDestroy, signal, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DestroyRef } from '@angular/core';\nimport {\n loginMethod,\n MReLogin,\n reLoginControllerResponse\n} from 'cloud-ide-lms-model';\nimport { CideInputComponent, CideEleButtonComponent } from 'cloud-ide-element';\nimport { ReLoginService } from './re-login.service';\nimport { CideLytSharedWrapperComponent, CideLytSharedWrapperSetupParam } from 'cloud-ide-layout';\n\n@Component({\n selector: 'cide-auth-re-login',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideEleButtonComponent\n ],\n template: `\n <div class=\"tw-w-full tw-max-w-md tw-mx-auto tw-p-6\">\n <div class=\"tw-text-center tw-mb-6\">\n <h2 class=\"tw-text-2xl tw-font-semibold tw-text-gray-900 tw-mb-2\">Session Expired</h2>\n <p class=\"tw-text-sm tw-text-gray-600\">Please re-authenticate to continue</p>\n </div>\n\n @if (error()) {\n <div class=\"tw-mb-4 tw-p-3 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\n <p class=\"tw-text-sm tw-text-red-600\">{{ error() }}</p>\n </div>\n }\n\n <form [formGroup]=\"reLoginForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"tw-space-y-4\">\n <!-- Single input field for both password and MPIN -->\n <div>\n <cide-ele-input\n id=\"user_password_mpin\"\n formControlName=\"user_password\"\n type=\"password\"\n placeholder=\"Enter your password or MPIN\"\n [required]=\"true\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-flex tw-gap-3 tw-pt-4\">\n <button\n type=\"submit\"\n cideEleButton\n variant=\"primary\"\n [loading]=\"isLoading()\"\n [disabled]=\"!reLoginForm.valid || isLoading()\"\n class=\"tw-flex-1\">\n Re-Login\n </button>\n </div>\n </div>\n </form>\n </div>\n `,\n styles: []\n})\nexport class CideAuthReLoginComponent extends CideLytSharedWrapperComponent implements OnInit, OnDestroy {\n public override shared_wrapper_setup_param = input<Partial<CideLytSharedWrapperSetupParam>>({\n sypg_page_code: \"auth_relogin_dialog\"\n });\n\n private reLoginService = inject(ReLoginService);\n private readonly destroyRef = inject(DestroyRef);\n\n isLoading = this.reLoginService.isLoading;\n error = this.reLoginService.error;\n\n reLoginForm = new FormGroup({\n custom_login_method: new FormControl<loginMethod>('pass'),\n user_password: new FormControl<string>('')\n });\n\n constructor() {\n super();\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n // Set default login method to password\n this.reLoginForm.patchValue({\n custom_login_method: 'pass'\n });\n }\n\n ngOnDestroy(): void {\n // Cleanup handled by takeUntilDestroyed\n }\n\n onSubmit(): void {\n if (this.reLoginForm.valid) {\n const formValue = this.reLoginForm.value;\n const passwordValue = formValue.user_password || '';\n \n // Auto-detect MPIN vs Password based on length (same as login screen)\n // If length <= 6, treat as MPIN, otherwise as password\n let customLoginMethod: loginMethod = 'pass';\n let userPassword: string | undefined = passwordValue;\n let mpinPin: string | undefined = undefined;\n\n if (passwordValue && passwordValue.length <= 6) {\n customLoginMethod = 'mpin';\n mpinPin = passwordValue;\n userPassword = undefined;\n }\n\n const payload: MReLogin = new MReLogin({\n custom_login_method: customLoginMethod,\n user_password: userPassword,\n mpin_pin: mpinPin\n } as MReLogin);\n\n this.reLoginService.reLogin(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: reLoginControllerResponse) => {\n this.reLoginService.handleReLoginSuccess(response);\n },\n error: () => {\n // Error is handled in the service\n }\n });\n }\n }\n}\n\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 // Check if user is authenticated using current state (without refreshing first)\r\n const isAuthenticated = appState.isUserAuthenticated() && !authService.isTokenExpired();\r\n \r\n // Defer state refresh to next change detection cycle to avoid ExpressionChangedAfterItHasBeenCheckedError\r\n Promise.resolve().then(() => {\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 \r\n if (isAuthenticated) {\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/auth/re-login/re-login.service';\nexport * from './lib/auth/re-login/re-login-floating.service';\nexport * from './lib/auth/re-login/re-login.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';\nimport { Injectable, inject } from '@angular/core';\nimport {\n authRoutesUrl, cidePath, hostManagerRoutesUrl, AuthUserMst,\n loginControllerResponse, MLogin, MForgotPassword, ForgotPasswordControllerResponse,\n MResetPassword, ResetPasswordControllerResponse, customEncrypt\n} from 'cloud-ide-lms-model';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CloudIdeAuthService {\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 // View-only token for public APIs\n private readonly VIEW_ONLY_TOKEN_STORAGE_KEY = 'cloud_ide_view_only_token';\n private _view_only_token: string = '';\n\n get view_only_token(): string {\n return this._view_only_token;\n }\n\n set view_only_token(value: string) {\n this._view_only_token = value;\n if (!this.isLocalStorageAvailable()) {\n return;\n }\n if (value) {\n localStorage.setItem(this.VIEW_ONLY_TOKEN_STORAGE_KEY, value);\n } else {\n localStorage.removeItem(this.VIEW_ONLY_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 view-only token\n const storedViewOnlyToken = localStorage.getItem(this.VIEW_ONLY_TOKEN_STORAGE_KEY);\n if (storedViewOnlyToken) {\n this._view_only_token = storedViewOnlyToken;\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 // Silent error handling for auth data loading\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 // Create a copy to avoid mutating the original\n const loginPayload: MLogin = new MLogin(body);\n \n if (loginPayload?.user_password) {\n if (loginPayload?.user_password?.length <= 6) {\n // MPIN - no encryption needed for MPIN\n loginPayload.custom_login_method = \"mpin\";\n loginPayload.mpin_pin = loginPayload?.user_password;\n loginPayload.user_password = \"\";\n } else {\n // Password - encrypt before sending\n loginPayload.custom_login_method = \"pass\";\n loginPayload.user_password = customEncrypt(loginPayload.user_password);\n }\n }\n return this.http?.post(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, authRoutesUrl?.module, authRoutesUrl?.signIn]), loginPayload);\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 // Encrypt password before sending\n if (payload.user_password) {\n payload.user_password = customEncrypt(payload.user_password);\n }\n return this.http?.post(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, authRoutesUrl?.module, authRoutesUrl?.resetPassword]), payload);\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 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 // Silent error handling for parsing user data\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, signal } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators } 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, controllerResponse } from 'cloud-ide-lms-model';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { CideEleButtonComponent, CideInputComponent, CideEleThemeToggleComponent } from 'cloud-ide-element';\n\n@Component({\n selector: 'cide-auth-forgot-password',\n standalone: true,\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, CideEleThemeToggleComponent],\n templateUrl: './forgot-password.component.html',\n styleUrl: './forgot-password.component.css'\n})\nexport class CideAuthForgotPasswordComponent {\n public forgotPassswordForm: FormGroupModel<MForgotPassword>;\n public erro_message = signal<string>('');\n public loading = signal<boolean>(false);\n\n private authService = inject(CloudIdeAuthService);\n private route = inject(Router);\n\n constructor() {\n this.forgotPassswordForm = new FormGroup({\n custom_forgot_password_method: new FormControl<forgotPasswordMethod>('username'),\n user_username: new FormControl('', [Validators.required, Validators.minLength(8), Validators.maxLength(20)]),\n user_emailid: new FormControl(''),\n user_mobileno: new FormControl(),\n }) as unknown as FormGroupModel<MForgotPassword>;\n }\n\n onForgotPasssword() {\n // Mark all fields as touched to show validation errors\n this.forgotPassswordForm.markAllAsTouched();\n \n // Clear previous error messages\n this.erro_message.set('');\n \n // Check if form has basic Angular validators passed\n if (!this.forgotPassswordForm.valid) {\n const usernameControl = this.forgotPassswordForm.get('user_username');\n if (usernameControl?.errors?.['required']) {\n this.erro_message.set('Username is required');\n } else if (usernameControl?.errors?.['minlength']) {\n this.erro_message.set('Username must be at least 8 characters');\n } else if (usernameControl?.errors?.['maxlength']) {\n this.erro_message.set('Username must be at most 20 characters');\n } else {\n this.erro_message.set('Please fill in all required fields correctly');\n }\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n return;\n }\n\n // Create the model and validate using custom validation\n const forgotPasswordPayload = new MForgotPassword(this.forgotPassswordForm?.value as MForgotPassword);\n const validate = validateRequestModal(forgotPasswordPayload);\n \n if (validate !== true) {\n // Custom validation failed\n this.loading.set(false);\n const errorKey = validate.first;\n // Get the error message from errorLogger using the first key\n const errorMessage = (validate.errorLogger as Record<string, string>)?.[errorKey] || 'Validation failed. Please check your input.';\n this.erro_message.set(errorMessage);\n console.error('Forgot password validation error:', validate);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n return;\n }\n\n // All validations passed, make API call\n this.loading.set(true);\n this.authService.forgotPassword(forgotPasswordPayload)?.subscribe({\n next: (response) => {\n this.loading.set(false);\n if (response?.success === true) {\n this.erro_message.set('');\n this.route.navigate(['auth', 'sign-in']);\n } else {\n // API returned success: false\n const errorMessage = response?.message || 'Failed to process forgot password request. Please try again.';\n this.erro_message.set(errorMessage);\n console.error('Forgot password API error:', response);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n },\n error: (response: { error: controllerResponse }) => {\n this.loading.set(false);\n const errorMessage = response?.error?.message || 'Failed to process forgot password request. Please try again.';\n this.erro_message.set(errorMessage);\n console.error('Forgot password error:', response);\n setTimeout(() => {\n this.erro_message.set('');\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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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 tw-mb-4\">\n <cide-ele-input \n id=\"user_username\" \n formControlName=\"user_username\"\n placeholder=\"Enter your username\"\n [required]=\"true\">\n </cide-ele-input>\n @if (forgotPassswordForm.get('user_username')?.invalid && forgotPassswordForm.get('user_username')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (forgotPassswordForm.get('user_username')?.errors?.['required']) {\n Username is required\n } @else if (forgotPassswordForm.get('user_username')?.errors?.['minlength']) {\n Username must be at least 8 characters\n } @else if (forgotPassswordForm.get('user_username')?.errors?.['maxlength']) {\n Username must be at most 20 characters\n }\n </div>\n }\n </div>\n <!-- Forgot Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button \n type=\"submit\"\n cideEleButton \n id=\"reset_password_link_button\" \n [loading]=\"loading()\" \n [disabled]=\"loading()\">\n Reset Password\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>","import { Injectable, inject, signal } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject, Observable, catchError, of } from 'rxjs';\nimport {\n authRoutesUrl,\n cidePath,\n hostManagerRoutesUrl,\n MReLogin,\n reLoginControllerResponse,\n AuthUserMst,\n customEncrypt,\n controllerResponse\n} from 'cloud-ide-lms-model';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\n\n/**\n * Service to handle re-login functionality when 401 errors occur\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ReLoginService {\n private http = inject(HttpClient);\n private authService = inject(CloudIdeAuthService);\n\n // Observable to control re-login dialog visibility\n private showReLoginSubject = new BehaviorSubject<boolean>(false);\n public showReLogin$ = this.showReLoginSubject.asObservable();\n\n // Signal for re-login state\n isLoading = signal<boolean>(false);\n error = signal<string | null>(null);\n\n /**\n * Show re-login dialog\n */\n showReLogin(): void {\n // Only show if we have a token (session expired scenario)\n if (this.authService.auth_token) {\n this.showReLoginSubject.next(true);\n }\n }\n\n /**\n * Hide re-login dialog\n */\n hideReLogin(): void {\n this.showReLoginSubject.next(false);\n this.error.set(null);\n }\n\n\n /**\n * Perform re-login with MPIN or password\n */\n reLogin(payload: MReLogin): Observable<reLoginControllerResponse> {\n this.isLoading.set(true);\n this.error.set(null);\n\n // Create a copy to avoid mutating the original\n const reLoginPayload: MReLogin = {\n ...payload,\n token: this.authService.auth_token\n };\n\n // Encrypt password if provided (MPIN doesn't need encryption)\n if (reLoginPayload.user_password && reLoginPayload.custom_login_method === 'pass') {\n reLoginPayload.user_password = customEncrypt(reLoginPayload.user_password);\n }\n\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n authRoutesUrl.module,\n authRoutesUrl.createReLoginSession\n ]);\n\n return this.http.post<reLoginControllerResponse>(url, reLoginPayload).pipe(\n catchError((response: { error: controllerResponse }) => {\n this.isLoading.set(false);\n const errorMessage = response?.error?.message || 'Re-login failed';\n this.error.set(errorMessage);\n return of({\n success: false,\n message: errorMessage\n } as reLoginControllerResponse);\n })\n );\n }\n\n /**\n * Handle successful re-login\n */\n handleReLoginSuccess(response: reLoginControllerResponse): void {\n if (response.success && response.token) {\n // Update auth token\n this.authService.auth_token = response.token;\n\n // Update user data if available\n if (response.data) {\n const userData = response.data as AuthUserMst;\n this.authService.storeUserData(userData);\n }\n\n // Hide re-login dialog\n this.hideReLogin();\n this.isLoading.set(false);\n } else {\n this.error.set(response.message || 'Re-login failed');\n this.isLoading.set(false);\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { CideEleFloatingContainerService } from 'cloud-ide-element';\nimport { ReLoginService } from './re-login.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DestroyRef } from '@angular/core';\nimport type { FloatingContainerConfig } from 'cloud-ide-element';\n\n/**\n * Service to manage re-login component in floating container\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ReLoginFloatingService {\n private containerService = inject(CideEleFloatingContainerService);\n private reLoginService = inject(ReLoginService);\n private readonly destroyRef = inject(DestroyRef);\n private containerId: string | null = null;\n\n constructor() {\n // Register the component when service is initialized\n this.registerReLoginComponent();\n\n // Subscribe to re-login service to show/hide dialog\n this.reLoginService.showReLogin$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((shouldShow) => {\n if (shouldShow && !this.containerId) {\n this.show();\n } else if (!shouldShow && this.containerId) {\n this.hide();\n }\n });\n }\n\n /**\n * Register re-login component with floating container service\n */\n private async registerReLoginComponent(): Promise<void> {\n if (this.containerService.isComponentRegistered('re-login')) {\n return;\n }\n\n try {\n const module = await import('./re-login.component');\n if (!module.CideAuthReLoginComponent) {\n throw new Error('Component class not found in module');\n }\n this.containerService.registerComponent('re-login', module.CideAuthReLoginComponent);\n } catch (error) {\n console.error('Failed to register re-login component:', error);\n }\n }\n\n /**\n * Show re-login in floating container\n */\n async show(): Promise<string | null> {\n // Ensure component is registered\n if (!this.containerService.isComponentRegistered('re-login')) {\n await this.registerReLoginComponent();\n }\n\n const config: FloatingContainerConfig = {\n id: 're-login-container',\n title: 'Re-Login Required',\n icon: 'lock',\n backdrop: true,\n width: '420px',\n height: 'auto',\n minWidth: '400px',\n minHeight: '200px',\n resizable: false,\n draggable: true,\n closable: false, // Prevent closing - user must re-login\n minimizable: false,\n maximizable: false,\n componentId: 're-login',\n componentConfig: {\n inputs: {},\n outputs: {}\n }\n };\n\n this.containerId = this.containerService.show(config);\n return this.containerId;\n }\n\n /**\n * Hide re-login floating container\n */\n hide(): void {\n if (this.containerId) {\n this.containerService.hide(this.containerId);\n this.containerId = null;\n }\n }\n}\n","import { Component, inject, OnInit, OnDestroy, signal, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DestroyRef } from '@angular/core';\nimport {\n loginMethod,\n MReLogin,\n reLoginControllerResponse\n} from 'cloud-ide-lms-model';\nimport { CideInputComponent, CideEleButtonComponent } from 'cloud-ide-element';\nimport { ReLoginService } from './re-login.service';\nimport { CideLytSharedWrapperComponent, CideLytSharedWrapperSetupParam } from 'cloud-ide-layout';\n\n@Component({\n selector: 'cide-auth-re-login',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideEleButtonComponent\n ],\n template: `\n <div class=\"tw-w-full tw-max-w-md tw-mx-auto tw-p-6\">\n <div class=\"tw-text-center tw-mb-6\">\n <h2 class=\"tw-text-2xl tw-font-semibold tw-text-gray-900 tw-mb-2\">Session Expired</h2>\n <p class=\"tw-text-sm tw-text-gray-600\">Please re-authenticate to continue</p>\n </div>\n\n @if (error()) {\n <div class=\"tw-mb-4 tw-p-3 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-lg\">\n <p class=\"tw-text-sm tw-text-red-600\">{{ error() }}</p>\n </div>\n }\n\n <form [formGroup]=\"reLoginForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"tw-space-y-4\">\n <!-- Single input field for both password and MPIN -->\n <div>\n <cide-ele-input\n id=\"user_password_mpin\"\n formControlName=\"user_password\"\n type=\"password\"\n placeholder=\"Enter your password or MPIN\"\n [required]=\"true\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-flex tw-gap-3 tw-pt-4\">\n <button\n type=\"submit\"\n cideEleButton\n variant=\"primary\"\n [loading]=\"isLoading()\"\n [disabled]=\"!reLoginForm.valid || isLoading()\"\n class=\"tw-flex-1\">\n Re-Login\n </button>\n </div>\n </div>\n </form>\n </div>\n `,\n styles: []\n})\nexport class CideAuthReLoginComponent extends CideLytSharedWrapperComponent implements OnInit, OnDestroy {\n public override shared_wrapper_setup_param = input<Partial<CideLytSharedWrapperSetupParam>>({\n sypg_page_code: \"auth_relogin_dialog\"\n });\n\n private reLoginService = inject(ReLoginService);\n private readonly destroyRef = inject(DestroyRef);\n\n isLoading = this.reLoginService.isLoading;\n error = this.reLoginService.error;\n\n reLoginForm = new FormGroup({\n custom_login_method: new FormControl<loginMethod>('pass'),\n user_password: new FormControl<string>('')\n });\n\n constructor() {\n super();\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n // Set default login method to password\n this.reLoginForm.patchValue({\n custom_login_method: 'pass'\n });\n }\n\n ngOnDestroy(): void {\n // Cleanup handled by takeUntilDestroyed\n }\n\n onSubmit(): void {\n if (this.reLoginForm.valid) {\n const formValue = this.reLoginForm.value;\n const passwordValue = formValue.user_password || '';\n \n // Auto-detect MPIN vs Password based on length (same as login screen)\n // If length <= 6, treat as MPIN, otherwise as password\n let customLoginMethod: loginMethod = 'pass';\n let userPassword: string | undefined = passwordValue;\n let mpinPin: string | undefined = undefined;\n\n if (passwordValue && passwordValue.length <= 6) {\n customLoginMethod = 'mpin';\n mpinPin = passwordValue;\n userPassword = undefined;\n }\n\n const payload: MReLogin = new MReLogin({\n custom_login_method: customLoginMethod,\n user_password: userPassword,\n mpin_pin: mpinPin\n } as MReLogin);\n\n this.reLoginService.reLogin(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: reLoginControllerResponse) => {\n this.reLoginService.handleReLoginSuccess(response);\n },\n error: () => {\n // Error is handled in the service\n }\n });\n }\n }\n}\n\n","import { Route } from '@angular/router';\r\n\r\nexport const authRoutes: Route = {\r\n path: \"auth\", // localhost:4200/auth/sign-in\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 // Check if user is authenticated using current state (without refreshing first)\r\n const isAuthenticated = appState.isUserAuthenticated() && !authService.isTokenExpired();\r\n \r\n // Defer state refresh to next change detection cycle to avoid ExpressionChangedAfterItHasBeenCheckedError\r\n Promise.resolve().then(() => {\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 \r\n if (isAuthenticated) {\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/auth/re-login/re-login.service';\nexport * from './lib/auth/re-login/re-login-floating.service';\nexport * from './lib/auth/re-login/re-login.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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"}
|
package/package.json
CHANGED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, signal, inject, Injector, 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, CideEleThemeToggleComponent } 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
|
-
loginForm;
|
|
16
|
-
erro_message = signal('', ...(ngDevMode ? [{ debugName: "erro_message" }] : []));
|
|
17
|
-
loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
18
|
-
returnUrl = '/control-panel'; // Default return URL
|
|
19
|
-
router = inject(Router);
|
|
20
|
-
activatedRoute = inject(ActivatedRoute);
|
|
21
|
-
authService = inject(CloudIdeAuthService);
|
|
22
|
-
appStateService = inject(AppStateHelperService);
|
|
23
|
-
injector = inject(Injector);
|
|
24
|
-
constructor() {
|
|
25
|
-
super();
|
|
26
|
-
this.loginForm = new FormGroup({
|
|
27
|
-
custom_login_method: new FormControl('pass'),
|
|
28
|
-
user_username: new FormControl(''),
|
|
29
|
-
user_password: new FormControl(''),
|
|
30
|
-
mpin_pin: new FormControl(''),
|
|
31
|
-
stay_sign_in: new FormControl(true)
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
ngOnInit() {
|
|
35
|
-
super.ngOnInit();
|
|
36
|
-
// Get return URL from route parameters or default to '/control-panel'
|
|
37
|
-
this.returnUrl = this.activatedRoute.snapshot.queryParams['returnUrl'] || 'control-panel';
|
|
38
|
-
// If user is already authenticated, redirect to the return URL
|
|
39
|
-
if (this.authService.isAuthenticated() && !this.authService.isTokenExpired()) {
|
|
40
|
-
this.router.navigateByUrl(this.returnUrl);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
onSignIn() {
|
|
44
|
-
if (this.loginForm.valid) {
|
|
45
|
-
this.loading.set(true);
|
|
46
|
-
this.authService.signIn(this.loginForm?.value)?.subscribe({
|
|
47
|
-
next: async (response) => {
|
|
48
|
-
this.loading.set(false);
|
|
49
|
-
if (response?.success === true) {
|
|
50
|
-
// Store user data in auth service
|
|
51
|
-
this.authService.storeUserData(response?.data?.auth_user_mst || {});
|
|
52
|
-
// Synchronize AppStateService with the same user data
|
|
53
|
-
this.appStateService.setUser(response?.data?.auth_user_mst || null);
|
|
54
|
-
// Store active entity data
|
|
55
|
-
const entity = response?.data?.core_system_entity || null;
|
|
56
|
-
this.appStateService.setActiveEntity(entity);
|
|
57
|
-
// Load currency configuration from financial config after login
|
|
58
|
-
// Note: The app should handle fetching financial config and setting it
|
|
59
|
-
// This is just a placeholder - implement based on your app's structure
|
|
60
|
-
if (entity?._id) {
|
|
61
|
-
try {
|
|
62
|
-
const { CurrencyService } = await import('cloud-ide-element');
|
|
63
|
-
const currencyService = this.injector.get(CurrencyService);
|
|
64
|
-
// TODO: Fetch financial config from your app's service
|
|
65
|
-
// Example:
|
|
66
|
-
// const financialConfigService = this.injector.get(CideAccFinancialConfigService);
|
|
67
|
-
// const response = await financialConfigService
|
|
68
|
-
// .getFinancialConfigById({ accfincfg_entity_id_syen: entity._id })
|
|
69
|
-
// .toPromise();
|
|
70
|
-
// if (response?.success && response?.data) {
|
|
71
|
-
// currencyService.loadFromFinancialConfigData(response.data);
|
|
72
|
-
// }
|
|
73
|
-
console.log('✅ Currency service initialized (using default INR or previously set config)');
|
|
74
|
-
}
|
|
75
|
-
catch (error) {
|
|
76
|
-
console.warn('⚠️ Failed to initialize currency service:', error);
|
|
77
|
-
// Continue with default currency config (INR)
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
// Store token through the service setter which saves to localStorage
|
|
81
|
-
this.authService.auth_token = (response?.token || '');
|
|
82
|
-
console.log(response?.token);
|
|
83
|
-
// Navigate to the return URL or control panel
|
|
84
|
-
await new Promise(resolve => setTimeout(resolve, 200));
|
|
85
|
-
this.router.navigateByUrl(this.returnUrl);
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
// Handle case where API returns success: false
|
|
89
|
-
const errorMessage = response?.message || response?.error_code || 'Login failed. Please check your credentials and try again.';
|
|
90
|
-
this.erro_message.set(errorMessage);
|
|
91
|
-
// Clear error message after 5 seconds
|
|
92
|
-
setTimeout(() => {
|
|
93
|
-
this.erro_message.set('');
|
|
94
|
-
}, 5000);
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
error: (response) => {
|
|
98
|
-
this.loading.set(false);
|
|
99
|
-
const errorMessage = response?.error?.message || 'Login failed. Please check your credentials and try again.';
|
|
100
|
-
this.erro_message.set(errorMessage);
|
|
101
|
-
console.error('Login error:', response);
|
|
102
|
-
// Clear error message after 5 seconds
|
|
103
|
-
setTimeout(() => {
|
|
104
|
-
this.erro_message.set('');
|
|
105
|
-
}, 5000);
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthSignInComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
111
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 tw-text-gray-900\">SignIn to CloudIDE sys</div>\n <!-- Error Logger -->\n @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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-600 hover: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]=\"loading()\" [disabled]=\"!loginForm.valid || loading()\">Sign In</button>\n </div>\n </div>\n </form>\n </div>\n</div>", styles: [":root[data-theme=dark] .cide-font-poppins,:root.dark-mode .cide-font-poppins,html[data-theme=dark] .cide-font-poppins,html.dark-mode .cide-font-poppins{background-color:var(--cide-theme-dark-color)!important}:root[data-theme=dark] .tw-bg-white,:root.dark-mode .tw-bg-white,html[data-theme=dark] .tw-bg-white,html.dark-mode .tw-bg-white{background-color:var(--cide-theme-light-color)!important}:root[data-theme=dark] .tw-text-gray-900,:root.dark-mode .tw-text-gray-900,html[data-theme=dark] .tw-text-gray-900,html.dark-mode .tw-text-gray-900{color:var(--cide-theme-text-color)!important}:root[data-theme=dark] .tw-text-blue-600,:root[data-theme=dark] .tw-text-blue-700,:root.dark-mode .tw-text-blue-600,:root.dark-mode .tw-text-blue-700,html[data-theme=dark] .tw-text-blue-600,html[data-theme=dark] .tw-text-blue-700,html.dark-mode .tw-text-blue-600,html.dark-mode .tw-text-blue-700{color:var(--cide-theme-primary-color)!important}:root[data-theme=dark] .tw-shadow-xl,:root.dark-mode .tw-shadow-xl,html[data-theme=dark] .tw-shadow-xl,html.dark-mode .tw-shadow-xl{box-shadow:0 20px 25px -5px var(--cide-theme-shadow-color),0 10px 10px -5px var(--cide-theme-shadow-color)!important}\n"], 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", "step", "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], cide-ele-button", 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"] }, { kind: "component", type: CideEleThemeToggleComponent, selector: "cide-ele-theme-toggle", inputs: ["size"] }] });
|
|
112
|
-
}
|
|
113
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideAuthSignInComponent, decorators: [{
|
|
114
|
-
type: Component,
|
|
115
|
-
args: [{ selector: 'cide-auth-sign-in', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, RouterLink, CideEleThemeToggleComponent], 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 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\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 tw-text-gray-900\">SignIn to CloudIDE sys</div>\n <!-- Error Logger -->\n @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\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-600 hover: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]=\"loading()\" [disabled]=\"!loginForm.valid || loading()\">Sign In</button>\n </div>\n </div>\n </form>\n </div>\n</div>", styles: [":root[data-theme=dark] .cide-font-poppins,:root.dark-mode .cide-font-poppins,html[data-theme=dark] .cide-font-poppins,html.dark-mode .cide-font-poppins{background-color:var(--cide-theme-dark-color)!important}:root[data-theme=dark] .tw-bg-white,:root.dark-mode .tw-bg-white,html[data-theme=dark] .tw-bg-white,html.dark-mode .tw-bg-white{background-color:var(--cide-theme-light-color)!important}:root[data-theme=dark] .tw-text-gray-900,:root.dark-mode .tw-text-gray-900,html[data-theme=dark] .tw-text-gray-900,html.dark-mode .tw-text-gray-900{color:var(--cide-theme-text-color)!important}:root[data-theme=dark] .tw-text-blue-600,:root[data-theme=dark] .tw-text-blue-700,:root.dark-mode .tw-text-blue-600,:root.dark-mode .tw-text-blue-700,html[data-theme=dark] .tw-text-blue-600,html[data-theme=dark] .tw-text-blue-700,html.dark-mode .tw-text-blue-600,html.dark-mode .tw-text-blue-700{color:var(--cide-theme-primary-color)!important}:root[data-theme=dark] .tw-shadow-xl,:root.dark-mode .tw-shadow-xl,html[data-theme=dark] .tw-shadow-xl,html.dark-mode .tw-shadow-xl{box-shadow:0 20px 25px -5px var(--cide-theme-shadow-color),0 10px 10px -5px var(--cide-theme-shadow-color)!important}\n"] }]
|
|
116
|
-
}], ctorParameters: () => [] });
|
|
117
|
-
|
|
118
|
-
export { CideAuthSignInComponent };
|
|
119
|
-
//# sourceMappingURL=cloud-ide-auth-sign-in.component-qkjuyKiz.mjs.map
|