@flusys/ng-auth 9.1.0 → 9.1.2
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/README.md +2 -0
- package/fesm2022/flusys-ng-auth-administration-page.component-DmN4KqiR.mjs +146 -0
- package/fesm2022/flusys-ng-auth-administration-page.component-DmN4KqiR.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-branch-form.component-Df_sMC2G.mjs +743 -0
- package/fesm2022/flusys-ng-auth-branch-form.component-Df_sMC2G.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-branch-list.component-CWat6QWN.mjs +775 -0
- package/fesm2022/flusys-ng-auth-branch-list.component-CWat6QWN.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-company-form.component-BvZ4Pn8j.mjs +198 -0
- package/fesm2022/flusys-ng-auth-company-form.component-BvZ4Pn8j.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-company-list.component-Corh9AIh.mjs +241 -0
- package/fesm2022/flusys-ng-auth-company-list.component-Corh9AIh.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-extension-order.util-2XWSLqii.mjs +6 -0
- package/fesm2022/flusys-ng-auth-extension-order.util-2XWSLqii.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-forgot-password-page.component-BRTVZPX6.mjs +384 -0
- package/fesm2022/flusys-ng-auth-forgot-password-page.component-BRTVZPX6.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-login-page.component-DQl52Qau.mjs +1074 -0
- package/fesm2022/flusys-ng-auth-login-page.component-DQl52Qau.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-profile-page.component-b-8rPEXQ.mjs +1792 -0
- package/fesm2022/flusys-ng-auth-profile-page.component-b-8rPEXQ.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-register-page.component-D99y1jiA.mjs +1513 -0
- package/fesm2022/flusys-ng-auth-register-page.component-D99y1jiA.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-reset-password-page.component-C0tN_AW1.mjs +538 -0
- package/fesm2022/flusys-ng-auth-reset-password-page.component-C0tN_AW1.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-social-callback-page.component-gTD7_LJY.mjs +217 -0
- package/fesm2022/flusys-ng-auth-social-callback-page.component-gTD7_LJY.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-social-config-page.component-DpGmcb9n.mjs +541 -0
- package/fesm2022/flusys-ng-auth-social-config-page.component-DpGmcb9n.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-user-form.component-CM9UYc0q.mjs +1171 -0
- package/fesm2022/flusys-ng-auth-user-form.component-CM9UYc0q.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-user-list.component-Bew7gz-H.mjs +1046 -0
- package/fesm2022/flusys-ng-auth-user-list.component-Bew7gz-H.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth-verify-email-page.component-DB9iKvt3.mjs +545 -0
- package/fesm2022/flusys-ng-auth-verify-email-page.component-DB9iKvt3.mjs.map +1 -0
- package/fesm2022/flusys-ng-auth.mjs +3030 -10735
- package/fesm2022/flusys-ng-auth.mjs.map +1 -1
- package/package.json +5 -5
- package/types/flusys-ng-auth.d.ts +978 -1558
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusys-ng-auth-login-page.component-DQl52Qau.mjs","names":[],"sources":["../../../projects/ng-auth/pages/login/login-page.component.ts"],"sourcesContent":["import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { RouterLink } from '@angular/router';\nimport {\n APP_CONFIG,\n isCompanyFeatureEnabled,\n isServiceEnabled,\n isSignUpEnabled,\n} from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport {\n CheckboxComponent,\n FButtonDirective,\n InputTextDirective,\n MessageService,\n PasswordComponent,\n SelectComponent,\n TreeSelectComponent,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport {\n buildBranchTreeNodes,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n IBranchSelectionInfo,\n ICompanyWithBranches,\n ILoginRequest,\n isCompanySelectionResponse,\n ISelectRequest,\n isEmailVerificationRequired,\n isLoginResponse,\n} from '../../interfaces/auth.interface';\nimport { SocialLoginButtonsComponent } from '../../components/social-login-buttons.component';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport { EmailPolicyService } from '../../services/email-policy.service';\n\ninterface ILoginFormModel {\n email: string;\n password: string;\n rememberMe: boolean;\n}\n\ninterface ISelectionFormModel {\n companyId: string;\n branchId: string;\n rememberSelection: boolean;\n}\n\ntype LoginStep = 'credentials' | 'company-selection' | 'email-verification';\n\n@Component({\n selector: 'lib-login-page',\n imports: [\n CheckboxComponent,\n FButtonDirective,\n InputTextDirective,\n PasswordComponent,\n SelectComponent,\n TreeSelectComponent,\n UiIconComponent,\n RouterLink,\n FormField,\n AppFloatingConfigurator,\n SocialLoginButtonsComponent,\n TranslatePipe,\n ],\n template: `\n <app-floating-configurator />\n <div\n class=\"bg-surface-ground flex items-center justify-center min-h-screen\"\n >\n <div\n class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\"\n >\n <div\n class=\"w-full\"\n style=\"border-radius: var(--f-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\"\n >\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--f-content-border-radius); background: var(--f-content-background)\"\n >\n <!-- Step Indicator (only when company feature enabled) -->\n @if (companyFeatureEnabled()) {\n <div class=\"flex items-center justify-center mb-6 gap-2\">\n <div\n class=\"flex items-center justify-center w-8 h-8 rounded-full text-sm font-semibold transition-colors\"\n [class.bg-primary]=\"currentStep() === 'credentials'\"\n [class.text-primary-contrast]=\"\n currentStep() === 'credentials'\n \"\n [class.bg-surface-200]=\"currentStep() !== 'credentials'\"\n [class.dark:bg-surface-700]=\"currentStep() !== 'credentials'\"\n [class.text-muted-color]=\"currentStep() !== 'credentials'\"\n >\n 1\n </div>\n <div class=\"w-12 h-0.5 bg-surface-200 dark:bg-surface-700\"></div>\n <div\n class=\"flex items-center justify-center w-8 h-8 rounded-full text-sm font-semibold transition-colors\"\n [class.bg-primary]=\"currentStep() === 'company-selection'\"\n [class.text-primary-contrast]=\"\n currentStep() === 'company-selection'\n \"\n [class.bg-surface-200]=\"currentStep() !== 'company-selection'\"\n [class.dark:bg-surface-700]=\"currentStep() !== 'company-selection'\"\n [class.text-muted-color]=\"\n currentStep() !== 'company-selection'\n \"\n >\n 2\n </div>\n </div>\n }\n\n <!-- Step 1: Credentials -->\n @if (currentStep() === 'credentials') {\n <div class=\"text-center mb-8\">\n <div\n class=\"text-3xl font-medium mb-4 text-color truncate\"\n [title]=\"savedUserName() ? welcomeBackText() : null\"\n >\n @if (savedUserName()) {\n {{ welcomeBackText() }}\n } @else {\n {{ 'auth.login.welcome' | translate }}\n }\n </div>\n <span class=\"text-muted-color font-medium\">{{\n 'auth.login.sign.in.to.continue' | translate\n }}</span>\n </div>\n\n <form (submit)=\"onSubmit($event)\">\n <label\n for=\"email\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.email.label' | translate }}\n </label>\n <input\n fInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n class=\"w-full\"\n [formField]=\"loginForm.email\"\n autocomplete=\"email\"\n />\n @if (emailValidationError()) {\n <small class=\"text-danger block mt-1\">{{\n emailValidationError()\n }}</small>\n }\n <div class=\"mb-4\"></div>\n\n <label\n for=\"password\"\n class=\"block font-medium text-lg mb-2 text-color\"\n >\n {{ 'auth.password.label' | translate }}\n </label>\n <div class=\"mb-4\">\n <f-password\n [inputId]=\"'password'\"\n [placeholder]=\"'auth.password.placeholder' | translate\"\n class=\"w-full\"\n [formField]=\"loginForm.password\"\n autocomplete=\"current-password\"\n />\n </div>\n\n <div\n class=\"flex flex-col sm:flex-row items-start sm:items-center justify-between mt-2 mb-8 gap-4\"\n >\n <f-checkbox [formField]=\"loginForm.rememberMe\" [label]=\"'auth.field.remember.me' | translate\" />\n @if (emailFeatureEnabled()) {\n <span\n class=\"font-medium no-underline cursor-pointer text-primary\"\n style=\"margin-inline-start: 0.5rem;\"\n routerLink=\"/auth/forgot-password\"\n >\n {{ 'auth.password.forgot' | translate }}\n </span>\n }\n </div>\n\n <button\n fButton\n class=\"w-full\"\n type=\"submit\"\n [disabled]=\"!isLoginFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.login.sign.in' | translate }}</span>\n </button>\n\n <lib-social-login-buttons [returnUrl]=\"returnUrl()\" />\n\n @if (signUpEnabled()) {\n <div class=\"flex items-center justify-center mt-4 gap-2\">\n <span class=\"font-medium\">{{\n 'auth.login.no.account' | translate\n }}</span>\n <a\n routerLink=\"/auth/register\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\n {{ 'auth.login.sign.up' | translate }}\n </a>\n </div>\n }\n </form>\n }\n\n <!-- Email Verification Required -->\n @if (currentStep() === 'email-verification') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <ui-icon name=\"envelope\" class=\"text-6xl text-warn\"></ui-icon>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.login.email.not.verified' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.login.verify.email.message' | translate }}\n </p>\n <button\n fButton\n class=\"w-full mb-4\"\n (click)=\"onResendVerification()\"\n [disabled]=\"isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.verify.resend' | translate }}</span>\n </button>\n <div class=\"mt-4\">\n <span\n class=\"font-semibold text-primary cursor-pointer\"\n (click)=\"goBackToCredentials()\"\n >\n {{ 'auth.login.back.to.sign.in' | translate }}\n </span>\n </div>\n </div>\n }\n\n <!-- Step 2: Company Selection -->\n @if (currentStep() === 'company-selection') {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.login.select.company' | translate }}\n </div>\n <div class=\"text-muted-color font-medium\">\n {{ 'auth.login.select.company.message' | translate }}\n </div>\n </div>\n\n <form (submit)=\"onSelectCompany($event)\">\n <label\n for=\"company\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'shared.company' | translate }}\n </label>\n <f-select\n inputId=\"company\"\n class=\"w-full mb-4\"\n [options]=\"companies()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"selectionForm.companyId\"\n [placeholder]=\"'auth.login.select.company.option' | translate\"\n (onChange)=\"onCompanyChange()\"\n />\n\n <label\n for=\"branch\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.login.branch.label' | translate }}\n </label>\n <f-treeselect\n inputId=\"branch\"\n class=\"w-full mb-4\"\n [options]=\"branchTreeNodes()\"\n [formField]=\"selectionForm.branchId\"\n [placeholder]=\"'auth.login.select.branch.option' | translate\"\n [filter]=\"true\"\n [filterPlaceholder]=\"'shared.search' | translate\"\n [emptyMessage]=\"'shared.no.results' | translate\"\n />\n\n <div class=\"flex items-center mt-2 mb-8\">\n <f-checkbox\n [formField]=\"selectionForm.rememberSelection\"\n [label]=\"'auth.login.remember.selection' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col sm:flex-row gap-4\">\n <button\n fButton\n class=\"w-full\"\n severity=\"secondary\"\n [outlined]=\"true\"\n type=\"button\"\n (click)=\"goBackToCredentials()\"\n >\n <span pButtonLabel>{{ 'shared.back' | translate }}</span>\n </button>\n <button\n fButton\n class=\"w-full\"\n type=\"submit\"\n [disabled]=\"!isSelectionFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'shared.continue' | translate }}</span>\n </button>\n </div>\n </form>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class LoginPageComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly authApi = inject(AuthApiService);\n private readonly authState = inject(AuthStateService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n\n private readonly emailPolicy = inject(EmailPolicyService);\n\n private translate(\n key: string,\n vars?: Record<string, unknown>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly returnUrl = input<string>('');\n readonly currentStep = signal<LoginStep>('credentials');\n readonly isLoading = signal(false);\n readonly unverifiedEmail = signal('');\n readonly savedUserName = signal(this.authState.getSavedUserName());\n readonly welcomeBackText = computed(() =>\n this.translate('auth.login.welcome.back', { name: this.savedUserName()! }),\n );\n\n readonly loginFormModel = signal<ILoginFormModel>({\n email: '',\n password: '',\n rememberMe: true,\n });\n\n readonly loginForm = form(this.loginFormModel, (f) => {\n required(f.email, {\n message: this.translate('auth.validation.email.required'),\n });\n required(f.password, {\n message: this.translate('auth.validation.password.required'),\n });\n });\n\n readonly emailValidationError = computed(() =>\n this.emailPolicy.validate(this.loginFormModel().email),\n );\n\n readonly isLoginFormValid = computed(() => {\n const formValid = this.loginForm().valid();\n return formValid && !this.emailValidationError();\n });\n\n readonly selectionFormModel = signal<ISelectionFormModel>({\n companyId: '',\n branchId: '',\n rememberSelection: true,\n });\n\n readonly selectionForm = form(this.selectionFormModel, (f) => {\n required(f.companyId, {\n message: this.translate('auth.validation.company.required'),\n });\n required(f.branchId, {\n message: this.translate('auth.validation.branch.required'),\n });\n });\n\n readonly isSelectionFormValid = computed(() => this.selectionForm().valid());\n readonly companyFeatureEnabled = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n readonly emailFeatureEnabled = computed(() =>\n isServiceEnabled(this.appConfig, 'email'),\n );\n readonly signUpEnabled = computed(() => isSignUpEnabled(this.appConfig));\n\n private sessionId: string | null = null;\n readonly companies = signal<ICompanyWithBranches[]>([]);\n readonly userName = signal<string>('');\n\n readonly branches = computed<IBranchSelectionInfo[]>(() => {\n const companyId = this.selectionFormModel().companyId;\n if (!companyId) return [];\n const company = this.companies().find((c) => c.id === companyId);\n return company?.branches ?? [];\n });\n\n readonly branchTreeNodes = computed(() =>\n buildBranchTreeNodes(this.branches()),\n );\n\n constructor() {\n effect(() => {\n if (this.authState.requiresCompanySelection()) {\n this.restorePendingSelectionState();\n }\n });\n }\n\n private restorePendingSelectionState(): void {\n const availableCompanies = this.authState.availableCompanies();\n const sessionId = this.authState.selectionSessionId();\n const name = this.authState.userName();\n\n if (availableCompanies.length > 0 && sessionId) {\n this.companies.set(availableCompanies);\n this.sessionId = sessionId;\n this.userName.set(name);\n this.currentStep.set('company-selection');\n this.autoSelectIfSingle();\n }\n }\n\n onSubmit(event: Event): void {\n event.preventDefault();\n\n if (!this.isLoginFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.required.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n const formData = this.loginFormModel();\n const loginData: ILoginRequest = {\n email: formData.email,\n password: formData.password,\n rememberMe: formData.rememberMe,\n };\n\n this.authApi\n .login(loginData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n\n if (isEmailVerificationRequired(response)) {\n if (!response.data) return;\n this.unverifiedEmail.set(response.data.email);\n this.currentStep.set('email-verification');\n return;\n }\n\n if (isCompanySelectionResponse(response)) {\n if (!response.data) return;\n this.sessionId = response.data.sessionId;\n this.companies.set(response.data.companies);\n this.userName.set(\n response.data.user.name ?? response.data.user.email,\n );\n this.authState.setSelectionState(response.data);\n this.currentStep.set('company-selection');\n this.autoSelectIfSingle();\n } else if (isLoginResponse(response)) {\n if (!response.data) return;\n this.authState.setLoginState(response.data);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(response.messageKey, response.messageVariables)\n : (response.message ?? this.translate('auth.login.success')),\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n }\n },\n error: (error) => {\n this.isLoading.set(false);\n const messageKey = error?.error?.messageKey;\n const detail = messageKey\n ? this.translate(messageKey, error?.error?.messageVariables)\n : error?.error?.message;\n this.messageService.add({\n severity: 'error',\n summary: this.translate('auth.login.title'),\n detail,\n });\n },\n });\n }\n\n onCompanyChange(): void {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: '',\n }));\n\n const branches = this.branches();\n if (branches.length === 1) {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: branches[0].id,\n }));\n }\n }\n\n onSelectCompany(event: Event): void {\n event.preventDefault();\n\n if (!this.isSelectionFormValid()) {\n this.messageService.add({\n severity: 'warn',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('auth.login.requires.selection'),\n });\n return;\n }\n\n if (!this.sessionId) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.error'),\n detail: this.translate('auth.session.expired'),\n });\n this.goBackToCredentials();\n return;\n }\n\n this.isLoading.set(true);\n\n const formData = this.selectionFormModel();\n const selectData: ISelectRequest = {\n sessionId: this.sessionId,\n companyId: formData.companyId!,\n branchId: formData.branchId!,\n rememberMe: this.loginFormModel().rememberMe,\n };\n\n this.authApi\n .select(selectData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n if (!response.data) return;\n this.authState.setLoginState(response.data);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(response.messageKey, response.messageVariables)\n : response.message,\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n goBackToCredentials(): void {\n this.sessionId = null;\n this.companies.set([]);\n this.unverifiedEmail.set('');\n this.selectionFormModel.set({\n companyId: '',\n branchId: '',\n rememberSelection: true,\n });\n this.authState.resetState();\n this.currentStep.set('credentials');\n }\n\n onResendVerification(): void {\n const email = this.unverifiedEmail();\n if (!email) return;\n\n this.isLoading.set(true);\n\n this.authApi\n .resendVerification(email)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(response.messageKey, response.messageVariables)\n : response.message,\n });\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n private autoSelectIfSingle(): void {\n if (this.companies().length === 1) {\n this.selectionFormModel.update((model) => ({\n ...model,\n companyId: this.companies()[0].id,\n }));\n this.onCompanyChange();\n }\n\n const storedCompanyId = this.authState.getStoredCompanyId();\n const storedBranchId = this.authState.getStoredBranchId();\n\n if (storedCompanyId) {\n const company = this.companies().find((c) => c.id === storedCompanyId);\n if (company) {\n this.selectionFormModel.update((model) => ({\n ...model,\n companyId: storedCompanyId,\n }));\n if (storedBranchId) {\n const branch = company.branches.find((b) => b.id === storedBranchId);\n if (branch) {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: storedBranchId,\n }));\n }\n }\n }\n }\n }\n}\n"],"mappings":"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"}
|