cloud-ide-auth 1.0.60 → 1.0.63

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.
@@ -1,14 +1,14 @@
1
1
  import { HttpClient } from '@angular/common/http';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, Injectable, Component, signal, DestroyRef, input } from '@angular/core';
3
+ import { inject, Injectable, Component, signal, DestroyRef, Injector, input } from '@angular/core';
4
4
  import { MLogin, customEncrypt, cidePath, hostManagerRoutesUrl, authRoutesUrl, MResetPassword, MEntitySwitch, generateObjectFromString, MEntityByDomain, generateStringFromObject, coreRoutesUrl, MForgotPassword, validateRequestModal, MReLogin } from 'cloud-ide-lms-model';
5
- import { BehaviorSubject, of, catchError as catchError$1 } from 'rxjs';
5
+ import { BehaviorSubject, of, from, catchError as catchError$1 } from 'rxjs';
6
6
  import { RouterOutlet, Router, ActivatedRoute } from '@angular/router';
7
7
  import * as i1 from '@angular/forms';
8
8
  import { FormGroup, FormControl, Validators, ReactiveFormsModule } from '@angular/forms';
9
9
  import { CommonModule } from '@angular/common';
10
- import { map, catchError } from 'rxjs/operators';
11
- import { CideInputComponent, CideEleButtonComponent, CideEleThemeToggleComponent, CideEleFloatingContainerService } from 'cloud-ide-element';
10
+ import { map, catchError, switchMap } from 'rxjs/operators';
11
+ import { CideInputComponent, CideEleButtonComponent, CideEleThemeToggleComponent, CideEleFileImageDirective, CideEleFloatingContainerService } from 'cloud-ide-element';
12
12
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
13
13
  import { AppStateHelperService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';
14
14
  import { AUTH_SERVICE_TOKEN, APP_STATE_SERVICE_TOKEN } from 'cloud-ide-shared';
@@ -357,12 +357,15 @@ class CideAuthForgotPasswordComponent {
357
357
  forgotPassswordForm;
358
358
  erro_message = signal('', ...(ngDevMode ? [{ debugName: "erro_message" }] : []));
359
359
  loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
360
+ entityLoading = signal(false, ...(ngDevMode ? [{ debugName: "entityLoading" }] : []));
360
361
  entityId = signal(null, ...(ngDevMode ? [{ debugName: "entityId" }] : []));
362
+ entityInfo = signal({}, ...(ngDevMode ? [{ debugName: "entityInfo" }] : []));
361
363
  authService = inject(CloudIdeAuthService);
362
364
  router = inject(Router);
363
365
  activatedRoute = inject(ActivatedRoute);
364
366
  entityDetectionService = inject(EntityDetectionService);
365
367
  destroyRef = inject(DestroyRef);
368
+ injector = inject(Injector);
366
369
  constructor() {
367
370
  this.forgotPassswordForm = new FormGroup({
368
371
  custom_forgot_password_method: new FormControl('username'),
@@ -372,13 +375,28 @@ class CideAuthForgotPasswordComponent {
372
375
  });
373
376
  }
374
377
  ngOnInit() {
375
- // Detect entity ID from domain or route parameter
378
+ // Detect entity ID from domain or route parameter and load entity details
376
379
  const routeParams = this.activatedRoute.snapshot.params;
377
- this.entityDetectionService.detectEntityId(routeParams).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
378
- next: (entityId) => {
379
- if (entityId) {
380
- this.entityId.set(entityId);
381
- console.log('Entity ID detected:', entityId);
380
+ this.entityDetectionService.detectEntityId(routeParams).pipe(switchMap((entityId) => {
381
+ if (entityId) {
382
+ this.entityId.set(entityId);
383
+ console.log('Entity ID detected:', entityId);
384
+ this.entityLoading.set(true); // Start loading
385
+ // Load entity details using entity management service
386
+ return this.loadEntityDetails(entityId).pipe(catchError((error) => {
387
+ console.warn('Failed to load entity details:', error);
388
+ this.entityLoading.set(false); // Stop loading on error
389
+ return of(null);
390
+ }));
391
+ }
392
+ this.entityLoading.set(false); // No entity to load
393
+ return of(null);
394
+ }), takeUntilDestroyed(this.destroyRef)).subscribe({
395
+ next: (entityData) => {
396
+ this.entityLoading.set(false); // Stop loading
397
+ if (entityData) {
398
+ // Update entity info with name and logo
399
+ this.entityInfo.set(entityData);
382
400
  }
383
401
  // Navigate to clean URL (remove :query param) if it exists
384
402
  if (routeParams['query']) {
@@ -389,10 +407,37 @@ class CideAuthForgotPasswordComponent {
389
407
  }
390
408
  },
391
409
  error: (error) => {
392
- console.warn('Entity detection failed:', error);
410
+ this.entityLoading.set(false); // Stop loading on error
411
+ console.warn('Entity detection or loading failed:', error);
393
412
  }
394
413
  });
395
414
  }
415
+ /**
416
+ * Load entity details by ID
417
+ * @param entityId - Entity ID to load
418
+ * @returns Observable of entity data or null
419
+ */
420
+ loadEntityDetails(entityId) {
421
+ // Dynamically import entity management service to avoid circular dependencies
422
+ return from(import('cloud-ide-core')).pipe(switchMap((module) => {
423
+ try {
424
+ const entityService = this.injector.get(module.CideCoreEntityManagementService);
425
+ return entityService.getEntityById(entityId).pipe(map((response) => {
426
+ if (response?.success && response?.data) {
427
+ return response.data;
428
+ }
429
+ return null;
430
+ }));
431
+ }
432
+ catch (error) {
433
+ console.warn('Failed to get entity service:', error);
434
+ return of(null);
435
+ }
436
+ }), catchError((error) => {
437
+ console.warn('Failed to import entity service:', error);
438
+ return of(null);
439
+ }));
440
+ }
396
441
  onForgotPasssword() {
397
442
  // Mark all fields as touched to show validation errors
398
443
  this.forgotPassswordForm.markAllAsTouched();
@@ -469,11 +514,11 @@ class CideAuthForgotPasswordComponent {
469
514
  });
470
515
  }
471
516
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthForgotPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
472
- 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"] }] });
517
+ 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 @if (entityLoading()) {\n <!-- Loading state - show only loader -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-32\">\n <div class=\"tw-animate-spin tw-rounded-full tw-h-12 tw-w-12 tw-border-b-2 tw-border-blue-600\"></div>\n </div>\n </div>\n } @else {\n <!-- Content shown after entity is loaded -->\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 @if (entityInfo().syen_photo_id_cyfm) {\n <img cideEleFileImage [fileId]=\"(entityInfo().syen_photo_id_cyfm || '')\" [altText]=\"(entityInfo().syen_name || '') + ' Logo'\" \n class=\"tw-m-auto tw-h-full tw-object-contain\" />\n } @else {\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full tw-object-contain\"\n alt=\"Cloud IDE Logo\" />\n }\n </div>\n <!-- 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 }\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"] }, { kind: "directive", type: CideEleFileImageDirective, selector: "[cideEleFileImage]", inputs: ["fileId", "altText"] }] });
473
518
  }
474
519
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthForgotPasswordComponent, decorators: [{
475
520
  type: Component,
476
- 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>" }]
521
+ args: [{ selector: 'cide-auth-forgot-password', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, CideEleThemeToggleComponent, CideEleFileImageDirective], 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 @if (entityLoading()) {\n <!-- Loading state - show only loader -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-32\">\n <div class=\"tw-animate-spin tw-rounded-full tw-h-12 tw-w-12 tw-border-b-2 tw-border-blue-600\"></div>\n </div>\n </div>\n } @else {\n <!-- Content shown after entity is loaded -->\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 @if (entityInfo().syen_photo_id_cyfm) {\n <img cideEleFileImage [fileId]=\"(entityInfo().syen_photo_id_cyfm || '')\" [altText]=\"(entityInfo().syen_name || '') + ' Logo'\" \n class=\"tw-m-auto tw-h-full tw-object-contain\" />\n } @else {\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full tw-object-contain\"\n alt=\"Cloud IDE Logo\" />\n }\n </div>\n <!-- 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 }\n </div>" }]
477
522
  }], ctorParameters: () => [] });
478
523
 
479
524
  var forgotPassword_component = /*#__PURE__*/Object.freeze({
@@ -832,11 +877,11 @@ const authRoutes = {
832
877
  },
833
878
  {
834
879
  path: "sign-in/:query",
835
- loadComponent: () => import('./cloud-ide-auth-sign-in.component-DMKeoh99.mjs').then(c => c.CideAuthSignInComponent)
880
+ loadComponent: () => import('./cloud-ide-auth-sign-in.component-BSKnMmWw.mjs').then(c => c.CideAuthSignInComponent)
836
881
  },
837
882
  {
838
883
  path: "sign-in",
839
- loadComponent: () => import('./cloud-ide-auth-sign-in.component-DMKeoh99.mjs').then(c => c.CideAuthSignInComponent)
884
+ loadComponent: () => import('./cloud-ide-auth-sign-in.component-BSKnMmWw.mjs').then(c => c.CideAuthSignInComponent)
840
885
  },
841
886
  {
842
887
  path: "forgot-password/:query",
@@ -848,11 +893,11 @@ const authRoutes = {
848
893
  },
849
894
  {
850
895
  path: "reset-password/:rout_token/:query",
851
- loadComponent: () => import('./cloud-ide-auth-reset-password.component-C2HX3oYD.mjs').then(c => c.CideAuthResetPasswordComponent)
896
+ loadComponent: () => import('./cloud-ide-auth-reset-password.component-C0NGvfEA.mjs').then(c => c.CideAuthResetPasswordComponent)
852
897
  },
853
898
  {
854
899
  path: "reset-password/:rout_token",
855
- loadComponent: () => import('./cloud-ide-auth-reset-password.component-C2HX3oYD.mjs').then(c => c.CideAuthResetPasswordComponent)
900
+ loadComponent: () => import('./cloud-ide-auth-reset-password.component-C0NGvfEA.mjs').then(c => c.CideAuthResetPasswordComponent)
856
901
  }
857
902
  ]
858
903
  };
@@ -892,4 +937,4 @@ const authGuard = (route, state) => {
892
937
  */
893
938
 
894
939
  export { CloudIdeAuthService as C, EntityDetectionService as E, ReLoginService as R, CloudIdeAuthComponent as a, CideAuthForgotPasswordComponent as b, ReLoginFloatingService as c, CideAuthReLoginComponent as d, authRoutes as e, authGuard as f };
895
- //# sourceMappingURL=cloud-ide-auth-cloud-ide-auth-zDzqfSbR.mjs.map
940
+ //# sourceMappingURL=cloud-ide-auth-cloud-ide-auth-Di3w2WrS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-ide-auth-cloud-ide-auth-Di3w2WrS.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/services/entity-detection.service.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, MEntitySwitch, switchEntityControllerResponse\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 // Single source of truth: localStorage is the authoritative source\n get auth_token(): string {\n // Always read from localStorage as single source of truth\n if (this.isLocalStorageAvailable()) {\n const storedToken = localStorage.getItem(this.TOKEN_STORAGE_KEY);\n if (storedToken) {\n // Sync in-memory value with localStorage\n this._auth_token = storedToken;\n return storedToken;\n }\n }\n return this._auth_token;\n }\n\n set auth_token(value: string) {\n // Update in-memory value\n this._auth_token = value;\n \n // Save to localStorage as single source of truth\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 // Always read from localStorage as single source of truth\n if (this.isLocalStorageAvailable()) {\n const storedToken = localStorage.getItem(this.VIEW_ONLY_TOKEN_STORAGE_KEY);\n if (storedToken) {\n // Sync in-memory value with localStorage\n this._view_only_token = storedToken;\n return storedToken;\n }\n }\n return this._view_only_token;\n }\n\n set view_only_token(value: string) {\n // Update in-memory value\n this._view_only_token = value;\n \n // Save to localStorage as single source of truth\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 /**\n * Switch entity for logged-in user\n * Creates a new auth_logs entry and updates the entity mapping\n * @param entityId - Entity ID to switch to\n * @returns Observable with new token and entity data\n */\n switchEntity(entityId: string): Observable<switchEntityControllerResponse> {\n const payload: MEntitySwitch = new MEntitySwitch({\n syen_id: entityId\n });\n \n return this.http?.post<switchEntityControllerResponse>(\n cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, authRoutesUrl?.module, authRoutesUrl?.switchEntity]),\n payload\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 { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable, of } from 'rxjs';\r\nimport { map, catchError } from 'rxjs/operators';\r\nimport {\r\n cidePath,\r\n hostManagerRoutesUrl,\r\n coreRoutesUrl,\r\n generateStringFromObject,\r\n generateObjectFromString,\r\n entityByDomainControllerResponse,\r\n MEntityByDomain\r\n} from 'cloud-ide-lms-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EntityDetectionService {\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Extract and normalize domain from current URL\r\n * @returns Normalized domain string (without www. prefix, lowercase)\r\n */\r\n getDomainFromUrl(): string {\r\n if (typeof window === 'undefined') {\r\n return '';\r\n }\r\n const hostname = window.location.hostname;\r\n // Remove 'www.' prefix if present and convert to lowercase\r\n return hostname.replace(/^www\\./, '').toLowerCase();\r\n }\r\n\r\n /**\r\n * Extract entity ID from route parameters (object-to-string format)\r\n * @param routeParams - Route parameters object (e.g., { query: 'suwrklfs' })\r\n * @returns Entity ID string or null\r\n */\r\n getEntityIdFromRoute(routeParams?: any): string | null {\r\n if (!routeParams || !routeParams['query']) {\r\n return null;\r\n }\r\n\r\n try {\r\n const queryData = generateObjectFromString(routeParams['query']);\r\n return queryData?.syen_id || null;\r\n } catch (error) {\r\n console.warn('Failed to decode route parameter:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Lookup entity ID by domain using API\r\n * @param domain - Domain string to lookup\r\n * @returns Observable of entity ID string or null\r\n */\r\n lookupEntityByDomain(domain: string): Observable<string | null> {\r\n if (!domain) {\r\n return of(null);\r\n }\r\n\r\n const domainPayload: MEntityByDomain = new MEntityByDomain({ domain });\r\n const query = generateStringFromObject(domainPayload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.entityByDomain,\r\n query\r\n ]);\r\n\r\n return this.http.get<entityByDomainControllerResponse>(url).pipe(\r\n map((response) => {\r\n if (response?.success && response?.data?._id) {\r\n return response.data._id;\r\n }\r\n return null;\r\n }),\r\n catchError((error) => {\r\n console.warn('Domain lookup failed:', error);\r\n return of(null);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Detect entity ID using priority:\r\n * 1. Domain lookup (primary)\r\n * 2. Route parameter (fallback)\r\n * @param routeParams - Optional route parameters for fallback\r\n * @returns Observable of entity ID string or null\r\n */\r\n detectEntityId(routeParams?: any): Observable<string | null> {\r\n // First, try domain lookup\r\n const domain = this.getDomainFromUrl();\r\n \r\n if (domain) {\r\n return this.lookupEntityByDomain(domain).pipe(\r\n map((entityId) => {\r\n // If domain lookup succeeds, return the entity ID\r\n if (entityId) {\r\n return entityId;\r\n }\r\n // If domain lookup fails, try route parameter fallback\r\n return this.getEntityIdFromRoute(routeParams);\r\n })\r\n );\r\n }\r\n\r\n // If no domain, try route parameter fallback\r\n const routeEntityId = this.getEntityIdFromRoute(routeParams);\r\n return of(routeEntityId);\r\n }\r\n}\r\n\r\n\r\n","import { Component, inject, signal, OnInit, DestroyRef, Injector } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { FormGroupModel } from '../sign-in/sign-in.component';\nimport { forgotPasswordMethod, MForgotPassword, validateRequestModal, controllerResponse, CoreSystemEntity } from 'cloud-ide-lms-model';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { EntityDetectionService } from '../../services/entity-detection.service';\nimport { CideEleButtonComponent, CideInputComponent, CideEleThemeToggleComponent, CideEleFileImageDirective } from 'cloud-ide-element';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { switchMap, catchError, map } from 'rxjs/operators';\nimport { of, from } from 'rxjs';\n\n@Component({\n selector: 'cide-auth-forgot-password',\n standalone: true,\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, CideEleThemeToggleComponent, CideEleFileImageDirective],\n templateUrl: './forgot-password.component.html',\n styleUrl: './forgot-password.component.css'\n})\nexport class CideAuthForgotPasswordComponent implements OnInit {\n public forgotPassswordForm: FormGroupModel<MForgotPassword>;\n public erro_message = signal<string>('');\n public loading = signal<boolean>(false);\n public entityLoading = signal<boolean>(false);\n private entityId = signal<string | null>(null);\n public entityInfo = signal<CoreSystemEntity>({});\n\n private authService = inject(CloudIdeAuthService);\n private router = inject(Router);\n private activatedRoute = inject(ActivatedRoute);\n private entityDetectionService = inject(EntityDetectionService);\n private destroyRef = inject(DestroyRef);\n private injector = inject(Injector);\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 ngOnInit(): void {\n // Detect entity ID from domain or route parameter and load entity details\n const routeParams = this.activatedRoute.snapshot.params;\n this.entityDetectionService.detectEntityId(routeParams).pipe(\n switchMap((entityId) => {\n if (entityId) {\n this.entityId.set(entityId);\n console.log('Entity ID detected:', entityId);\n this.entityLoading.set(true); // Start loading\n \n // Load entity details using entity management service\n return this.loadEntityDetails(entityId).pipe(\n catchError((error) => {\n console.warn('Failed to load entity details:', error);\n this.entityLoading.set(false); // Stop loading on error\n return of(null);\n })\n );\n }\n this.entityLoading.set(false); // No entity to load\n return of(null);\n }),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe({\n next: (entityData) => {\n this.entityLoading.set(false); // Stop loading\n if (entityData) {\n // Update entity info with name and logo\n this.entityInfo.set(entityData);\n }\n \n // Navigate to clean URL (remove :query param) if it exists\n if (routeParams['query']) {\n this.router.navigate(['auth', 'forgot-password'], {\n queryParams: this.activatedRoute.snapshot.queryParams,\n replaceUrl: true\n });\n }\n },\n error: (error) => {\n this.entityLoading.set(false); // Stop loading on error\n console.warn('Entity detection or loading failed:', error);\n }\n });\n }\n\n /**\n * Load entity details by ID\n * @param entityId - Entity ID to load\n * @returns Observable of entity data or null\n */\n private loadEntityDetails(entityId: string) {\n // Dynamically import entity management service to avoid circular dependencies\n return from(import('cloud-ide-core')).pipe(\n switchMap((module) => {\n try {\n const entityService = this.injector.get(module.CideCoreEntityManagementService);\n return entityService.getEntityById(entityId).pipe(\n map((response) => {\n if (response?.success && response?.data) {\n return response.data as CoreSystemEntity;\n }\n return null;\n })\n );\n } catch (error) {\n console.warn('Failed to get entity service:', error);\n return of(null);\n }\n }),\n catchError((error) => {\n console.warn('Failed to import entity service:', error);\n return of(null);\n })\n );\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 formValue = {\n ...this.forgotPassswordForm.value,\n syen_id: this.entityId() || undefined\n } as MForgotPassword;\n const forgotPasswordPayload = new MForgotPassword(formValue);\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.router.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 @if (entityLoading()) {\n <!-- Loading state - show only loader -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-32\">\n <div class=\"tw-animate-spin tw-rounded-full tw-h-12 tw-w-12 tw-border-b-2 tw-border-blue-600\"></div>\n </div>\n </div>\n } @else {\n <!-- Content shown after entity is loaded -->\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 @if (entityInfo().syen_photo_id_cyfm) {\n <img cideEleFileImage [fileId]=\"(entityInfo().syen_photo_id_cyfm || '')\" [altText]=\"(entityInfo().syen_name || '') + ' Logo'\" \n class=\"tw-m-auto tw-h-full tw-object-contain\" />\n } @else {\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full tw-object-contain\"\n alt=\"Cloud IDE Logo\" />\n }\n </div>\n <!-- 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 }\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 loginResponseData\n} from 'cloud-ide-lms-model';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { AppStateHelperService } from 'cloud-ide-layout';\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 private appStateService = inject(AppStateHelperService);\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 loginResponseData;\n this.authService.storeUserData(userData?.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 }\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';\n\nexport const authRoutes: Route = {\n path: \"auth\", // localhost:4200/auth/sign-in\n loadComponent: () => import('./cloud-ide-auth.component').then(c => c.CloudIdeAuthComponent),\n children: [\n {\n path: \"\",\n pathMatch: 'full',\n redirectTo: 'sign-in'\n },\n {\n path: \"sign-in/:query\",\n loadComponent: () => import('./auth/sign-in/sign-in.component').then(c => c.CideAuthSignInComponent)\n },\n {\n path: \"sign-in\",\n loadComponent: () => import('./auth/sign-in/sign-in.component').then(c => c.CideAuthSignInComponent)\n },\n {\n path: \"forgot-password/:query\",\n loadComponent: () => import('./auth/forgot-password/forgot-password.component').then(c => c.CideAuthForgotPasswordComponent)\n },\n {\n path: \"forgot-password\",\n loadComponent: () => import('./auth/forgot-password/forgot-password.component').then(c => c.CideAuthForgotPasswordComponent)\n },\n {\n path: \"reset-password/:rout_token/:query\",\n loadComponent: () => import('./auth/reset-password/reset-password.component').then(c => c.CideAuthResetPasswordComponent)\n },\n {\n path: \"reset-password/:rout_token\",\n loadComponent: () => import('./auth/reset-password/reset-password.component').then(c => c.CideAuthResetPasswordComponent)\n }\n ]\n}\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 } else {\r\n console.log('User is not authenticated, redirecting to login page', appState.isUserAuthenticated(), !authService.isTokenExpired());\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":["catchError"],"mappings":"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"}
@@ -0,0 +1,215 @@
1
+ import * as i0 from '@angular/core';
2
+ import { signal, inject, DestroyRef, Injector, Component } from '@angular/core';
3
+ import { CideInputComponent, CideEleButtonComponent, CideEleThemeToggleComponent, CideEleFileImageDirective } from 'cloud-ide-element';
4
+ import * as i1 from '@angular/forms';
5
+ import { FormGroup, FormControl, Validators, ReactiveFormsModule } from '@angular/forms';
6
+ import { CommonModule } from '@angular/common';
7
+ import { Router, ActivatedRoute } from '@angular/router';
8
+ import { C as CloudIdeAuthService, E as EntityDetectionService } from './cloud-ide-auth-cloud-ide-auth-Di3w2WrS.mjs';
9
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
10
+ import { switchMap, catchError, map } from 'rxjs/operators';
11
+ import { of, from } from 'rxjs';
12
+
13
+ // Custom validator for password matching
14
+ function passwordMatchValidator(control) {
15
+ const password = control.get('new_password');
16
+ const confirmPassword = control.get('confirm_password');
17
+ if (!password || !confirmPassword) {
18
+ return null;
19
+ }
20
+ return password.value === confirmPassword.value ? null : { passwordMismatch: true };
21
+ }
22
+ class CideAuthResetPasswordComponent {
23
+ resetPassswordForm;
24
+ erro_message = signal('', ...(ngDevMode ? [{ debugName: "erro_message" }] : []));
25
+ loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
26
+ entityLoading = signal(false, ...(ngDevMode ? [{ debugName: "entityLoading" }] : []));
27
+ resetToken = '';
28
+ entityId = signal(null, ...(ngDevMode ? [{ debugName: "entityId" }] : []));
29
+ entityInfo = signal({}, ...(ngDevMode ? [{ debugName: "entityInfo" }] : []));
30
+ authService = inject(CloudIdeAuthService);
31
+ router = inject(Router);
32
+ activatedRoute = inject(ActivatedRoute);
33
+ entityDetectionService = inject(EntityDetectionService);
34
+ destroyRef = inject(DestroyRef);
35
+ injector = inject(Injector);
36
+ constructor() {
37
+ this.resetPassswordForm = new FormGroup({
38
+ new_password: new FormControl('', [Validators.required, Validators.minLength(6)]),
39
+ confirm_password: new FormControl('', [Validators.required])
40
+ }, { validators: passwordMatchValidator });
41
+ }
42
+ ngOnInit() {
43
+ // Extract the reset token from route parameters using snapshot for immediate access
44
+ const routeParams = this.activatedRoute.snapshot.params;
45
+ this.resetToken = routeParams['rout_token'] || '';
46
+ // If token not found in route params (might be due to dots in JWT), try extracting from URL directly
47
+ if (!this.resetToken && typeof window !== 'undefined') {
48
+ const url = window.location.href;
49
+ const resetPasswordMatch = url.match(/\/reset-password\/(.+)$/);
50
+ if (resetPasswordMatch && resetPasswordMatch[1]) {
51
+ // Extract token from URL, handling potential hash fragments
52
+ this.resetToken = resetPasswordMatch[1].split('#')[0].split('?')[0];
53
+ console.log('Reset Password: Token extracted from URL directly');
54
+ }
55
+ }
56
+ // Debug logging to help diagnose route parameter issues
57
+ console.log('Reset Password Component - Route Params:', routeParams);
58
+ console.log('Reset Password Component - Extracted Token:', this.resetToken ? 'Token found' : 'No token');
59
+ console.log('Reset Password Component - Current URL:', typeof window !== 'undefined' ? window.location.href : 'N/A');
60
+ // Also subscribe to handle route parameter changes (for navigation within the same component)
61
+ this.activatedRoute.params.subscribe(params => {
62
+ const token = params['rout_token'] || '';
63
+ if (token && token !== this.resetToken) {
64
+ this.resetToken = token;
65
+ this.erro_message.set(''); // Clear any previous error
66
+ }
67
+ });
68
+ // Validate token exists and is not empty
69
+ if (!this.resetToken || this.resetToken.trim() === '') {
70
+ this.erro_message.set('Invalid reset password link. Missing token. Please request a new one.');
71
+ console.error('Reset Password: No token found in route parameters or URL');
72
+ }
73
+ else {
74
+ // Token is present, clear any error messages
75
+ this.erro_message.set('');
76
+ console.log('Reset Password: Token successfully extracted');
77
+ }
78
+ // Detect entity ID from domain or route parameter and load entity details (preserve rout_token)
79
+ this.entityDetectionService.detectEntityId(routeParams).pipe(switchMap((entityId) => {
80
+ if (entityId) {
81
+ this.entityId.set(entityId);
82
+ console.log('Entity ID detected:', entityId);
83
+ this.entityLoading.set(true); // Start loading
84
+ // Load entity details using entity management service
85
+ return this.loadEntityDetails(entityId).pipe(catchError((error) => {
86
+ console.warn('Failed to load entity details:', error);
87
+ this.entityLoading.set(false); // Stop loading on error
88
+ return of(null);
89
+ }));
90
+ }
91
+ this.entityLoading.set(false); // No entity to load
92
+ return of(null);
93
+ }), takeUntilDestroyed(this.destroyRef)).subscribe({
94
+ next: (entityData) => {
95
+ this.entityLoading.set(false); // Stop loading
96
+ if (entityData) {
97
+ // Update entity info with name and logo
98
+ this.entityInfo.set(entityData);
99
+ }
100
+ // Navigate to clean URL (preserve rout_token, remove :query param) if it exists
101
+ if (routeParams['query'] && this.resetToken) {
102
+ this.router.navigate(['auth', 'reset-password', this.resetToken], {
103
+ queryParams: this.activatedRoute.snapshot.queryParams,
104
+ replaceUrl: true
105
+ });
106
+ }
107
+ },
108
+ error: (error) => {
109
+ this.entityLoading.set(false); // Stop loading on error
110
+ console.warn('Entity detection or loading failed:', error);
111
+ }
112
+ });
113
+ }
114
+ /**
115
+ * Load entity details by ID
116
+ * @param entityId - Entity ID to load
117
+ * @returns Observable of entity data or null
118
+ */
119
+ loadEntityDetails(entityId) {
120
+ // Dynamically import entity management service to avoid circular dependencies
121
+ return from(import('cloud-ide-core')).pipe(switchMap((module) => {
122
+ try {
123
+ const entityService = this.injector.get(module.CideCoreEntityManagementService);
124
+ return entityService.getEntityById(entityId).pipe(map((response) => {
125
+ if (response?.success && response?.data) {
126
+ return response.data;
127
+ }
128
+ return null;
129
+ }));
130
+ }
131
+ catch (error) {
132
+ console.warn('Failed to get entity service:', error);
133
+ return of(null);
134
+ }
135
+ }), catchError((error) => {
136
+ console.warn('Failed to import entity service:', error);
137
+ return of(null);
138
+ }));
139
+ }
140
+ onForgotPasssword() {
141
+ // Mark all fields as touched to show validation errors
142
+ this.resetPassswordForm.markAllAsTouched();
143
+ if (this.resetPassswordForm.valid && this.resetToken) {
144
+ this.loading.set(true);
145
+ this.erro_message.set('');
146
+ const newPassword = this.resetPassswordForm?.get('new_password')?.value || '';
147
+ const confirmPassword = this.resetPassswordForm?.get('confirm_password')?.value || '';
148
+ // Double check password match
149
+ if (newPassword !== confirmPassword) {
150
+ this.loading.set(false);
151
+ this.erro_message.set('Passwords do not match. Please try again.');
152
+ setTimeout(() => {
153
+ this.erro_message.set('');
154
+ }, 3000);
155
+ return;
156
+ }
157
+ const resetPasssword = {
158
+ user_password: newPassword,
159
+ user_username: "",
160
+ syen_id: this.entityId() || undefined,
161
+ sylog_config_data: {
162
+ reset_password_link: "",
163
+ reset_password_secret: this.resetToken,
164
+ request_timestamp: new Date()
165
+ }
166
+ };
167
+ this.authService.resetPassword(resetPasssword)?.subscribe({
168
+ next: (response) => {
169
+ if (response?.success === true) {
170
+ this.loading.set(false);
171
+ this.erro_message.set('');
172
+ this.router.navigate(['auth', 'sign-in']);
173
+ }
174
+ else {
175
+ this.loading.set(false);
176
+ const errorMessage = response?.message || 'Failed to reset password. Please try again.';
177
+ this.erro_message.set(errorMessage);
178
+ setTimeout(() => {
179
+ this.erro_message.set('');
180
+ }, 3000);
181
+ }
182
+ },
183
+ error: (response) => {
184
+ this.loading.set(false);
185
+ const errorMessage = response?.error?.message || 'Failed to reset password. Please try again.';
186
+ this.erro_message.set(errorMessage);
187
+ console.error('Reset password error:', response);
188
+ setTimeout(() => {
189
+ this.erro_message.set('');
190
+ }, 3000);
191
+ }
192
+ });
193
+ }
194
+ else {
195
+ if (!this.resetToken) {
196
+ this.erro_message.set('Invalid reset password link. Please request a new one.');
197
+ }
198
+ else if (!this.resetPassswordForm.valid) {
199
+ this.erro_message.set('Please fill in all required fields correctly.');
200
+ }
201
+ setTimeout(() => {
202
+ this.erro_message.set('');
203
+ }, 3000);
204
+ }
205
+ }
206
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthResetPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
207
+ 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 @if (entityLoading()) {\n <!-- Loading state - show only loader -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-32\">\n <div class=\"tw-animate-spin tw-rounded-full tw-h-12 tw-w-12 tw-border-b-2 tw-border-blue-600\"></div>\n </div>\n </div>\n } @else {\n <!-- Content shown after entity is loaded -->\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 @if (entityInfo().syen_photo_id_cyfm) {\n <img cideEleFileImage [fileId]=\"(entityInfo().syen_photo_id_cyfm || '')\" [altText]=\"(entityInfo().syen_name || '') + ' Logo'\" \n class=\"tw-m-auto tw-h-full tw-object-contain\" />\n } @else {\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full tw-object-contain\"\n alt=\"Cloud IDE Logo\" />\n }\n </div>\n <!-- 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 }\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"] }, { kind: "directive", type: CideEleFileImageDirective, selector: "[cideEleFileImage]", inputs: ["fileId", "altText"] }] });
208
+ }
209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CideAuthResetPasswordComponent, decorators: [{
210
+ type: Component,
211
+ args: [{ selector: 'cide-auth-reset-password', standalone: true, imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, CideEleThemeToggleComponent, CideEleFileImageDirective], 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 @if (entityLoading()) {\n <!-- Loading state - show only loader -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <div class=\"tw-flex tw-items-center tw-justify-center tw-h-32\">\n <div class=\"tw-animate-spin tw-rounded-full tw-h-12 tw-w-12 tw-border-b-2 tw-border-blue-600\"></div>\n </div>\n </div>\n } @else {\n <!-- Content shown after entity is loaded -->\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 @if (entityInfo().syen_photo_id_cyfm) {\n <img cideEleFileImage [fileId]=\"(entityInfo().syen_photo_id_cyfm || '')\" [altText]=\"(entityInfo().syen_name || '') + ' Logo'\" \n class=\"tw-m-auto tw-h-full tw-object-contain\" />\n } @else {\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full tw-object-contain\"\n alt=\"Cloud IDE Logo\" />\n }\n </div>\n <!-- 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 }\n </div>" }]
212
+ }], ctorParameters: () => [] });
213
+
214
+ export { CideAuthResetPasswordComponent };
215
+ //# sourceMappingURL=cloud-ide-auth-reset-password.component-C0NGvfEA.mjs.map