@koalarx/ui 20.0.47 → 20.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.
@@ -2,6 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { OnInit } from '@angular/core';
3
3
 
4
4
  declare class KlRoot implements OnInit {
5
+ private readonly authorization;
5
6
  routerLoaderColor: i0.InputSignal<string>;
6
7
  ngOnInit(): void;
7
8
  static ɵfac: i0.ɵɵFactoryDeclaration<KlRoot, never>;
@@ -1,6 +1,6 @@
1
1
  import { HttpClientErrorsMiddleware } from '@koalarx/ui/core/middlewares';
2
+ import { AuthConfig } from '@koalarx/ui/core/models';
2
3
  import { KoalaLanguage, Translation } from '@koalarx/ui/core/translations';
3
- import * as i0 from '@angular/core';
4
4
 
5
5
  declare const GENERIC_COMPONENT_CONTAINER_NAME = ".kl-generic-component-container";
6
6
 
@@ -9,6 +9,7 @@ declare class AppConfig {
9
9
  private _language;
10
10
  private _translation;
11
11
  private _httpClientErrorsMiddleware;
12
+ private _authConfig;
12
13
  set hostApi(hostApi: string | undefined);
13
14
  get hostApi(): string | undefined;
14
15
  set language(language: KoalaLanguage | undefined);
@@ -17,8 +18,8 @@ declare class AppConfig {
17
18
  get translation(): Translation;
18
19
  set httpClientErrorsMiddleware(httpClientErrorsMiddleware: HttpClientErrorsMiddleware | undefined);
19
20
  get httpClientErrorsMiddleware(): HttpClientErrorsMiddleware | undefined;
20
- static ɵfac: i0.ɵɵFactoryDeclaration<AppConfig, never>;
21
- static ɵprov: i0.ɵɵInjectableDeclaration<AppConfig>;
21
+ set authConfig(authConfig: AuthConfig | undefined);
22
+ get authConfig(): AuthConfig | undefined;
22
23
  }
23
24
 
24
25
  export { AppConfig, GENERIC_COMPONENT_CONTAINER_NAME };
@@ -0,0 +1,11 @@
1
+ import { CanActivate, MaybeAsync, GuardResult } from '@angular/router';
2
+ import * as i0 from '@angular/core';
3
+
4
+ declare class AuthGuard implements CanActivate {
5
+ private readonly authService;
6
+ canActivate(): MaybeAsync<GuardResult>;
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<AuthGuard, never>;
8
+ static ɵprov: i0.ɵɵInjectableDeclaration<AuthGuard>;
9
+ }
10
+
11
+ export { AuthGuard };
@@ -0,0 +1,3 @@
1
+ {
2
+ "module": "../../fesm2022/koalarx-ui-core-guards.mjs"
3
+ }
@@ -13,4 +13,25 @@ interface QueryPagination extends SortFilterType {
13
13
  limit?: number;
14
14
  }
15
15
 
16
- export type { GetManyResult, QueryPagination, QueryPaginationDirection, SortFilterType };
16
+ interface AuthConfig {
17
+ storageTokenKey: string;
18
+ storageRefreshTokenKey: string;
19
+ homeRoute?: string;
20
+ loginRoute?: string;
21
+ userInfo: {
22
+ url: string;
23
+ };
24
+ refreshToken: {
25
+ url: string;
26
+ data: {
27
+ tokenKeyName: string;
28
+ refreshTokenKeyName?: string;
29
+ };
30
+ response: {
31
+ accessTokenKeyName: string;
32
+ refreshTokenKeyName: string;
33
+ };
34
+ };
35
+ }
36
+
37
+ export type { AuthConfig, GetManyResult, QueryPagination, QueryPaginationDirection, SortFilterType };
@@ -2,6 +2,7 @@ interface Translation {
2
2
  confirm: {
3
3
  btnLabelYes: string;
4
4
  btnLabelNo: string;
5
+ askAreYouSureMessage: string;
5
6
  };
6
7
  codeViewer: {
7
8
  copyToClipboard: string;
@@ -43,6 +44,9 @@ interface Translation {
43
44
  '0': string;
44
45
  unknowError: string;
45
46
  };
47
+ jwtAuthorizationService: {
48
+ questionLogoutMessage: string;
49
+ };
46
50
  }
47
51
 
48
52
  type KoalaLanguage = 'en' | 'ptBr';
@@ -1,13 +1,15 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, Component } from '@angular/core';
2
+ import { inject, input, Component } from '@angular/core';
3
3
  import { DialogContainer } from '@koalarx/ui/core/components/dialog';
4
4
  import { LoaderPageContent } from '@koalarx/ui/core/components/loader-page';
5
5
  import { SideWindowContainer } from '@koalarx/ui/core/components/side-window';
6
6
  import { SnackbarContainer } from '@koalarx/ui/core/components/snackbar';
7
+ import { Authorization } from '@koalarx/ui/shared/services';
7
8
  import { LoadingBarRouterModule } from '@ngx-loading-bar/router';
8
9
  import * as i1 from '@ngx-loading-bar/core';
9
10
 
10
11
  class KlRoot {
12
+ authorization = inject(Authorization);
11
13
  routerLoaderColor = input('#6A1B9A');
12
14
  ngOnInit() {
13
15
  if (document.querySelector('html')?.getAttribute('data-theme') === null) {
@@ -1 +1 @@
1
- {"version":3,"file":"koalarx-ui-core-components-kl-root.mjs","sources":["../../projects/koala-ui/core/components/kl-root/kl-root.ts","../../projects/koala-ui/core/components/kl-root/kl-root.html","../../projects/koala-ui/core/components/kl-root/koalarx-ui-core-components-kl-root.ts"],"sourcesContent":["import { Component, input, OnInit } from '@angular/core';\nimport { DialogContainer } from '@koalarx/ui/core/components/dialog';\nimport { LoaderPageContent } from '@koalarx/ui/core/components/loader-page';\nimport { SideWindowContainer } from '@koalarx/ui/core/components/side-window';\nimport { SnackbarContainer } from '@koalarx/ui/core/components/snackbar';\nimport { LoadingBarRouterModule } from '@ngx-loading-bar/router';\n\n@Component({\n selector: 'kl-root',\n templateUrl: './kl-root.html',\n imports: [\n DialogContainer,\n LoadingBarRouterModule,\n SideWindowContainer,\n SnackbarContainer,\n LoaderPageContent,\n ],\n})\nexport class KlRoot implements OnInit {\n routerLoaderColor = input<string>('#6A1B9A');\n\n ngOnInit(): void {\n if (document.querySelector('html')?.getAttribute('data-theme') === null) {\n document.querySelector('html')?.setAttribute('data-theme', 'light');\n }\n }\n}\n","<ngx-loading-bar\n [color]=\"routerLoaderColor()\"\n height=\"4px\"\n [includeSpinner]=\"false\"\n/>\n\n<main class=\"overflow-x-hidden\">\n <kl-loader-page-content />\n <kl-snackbar-container />\n <kl-dialog-container />\n <kl-side-window-container />\n <div class=\"kl-generic-component-container\"></div>\n\n <ng-content />\n</main>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;MAkBa,MAAM,CAAA;AACjB,IAAA,iBAAiB,GAAG,KAAK,CAAS,SAAS,CAAC;IAE5C,QAAQ,GAAA;AACN,QAAA,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;AACvE,YAAA,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC;;;uGAL5D,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClBnB,4VAeA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDJI,eAAe,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,sBAAsB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,mBAAmB,EAAA,QAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,iBAAiB,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,iBAAiB,EAAA,QAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,CAAA;;2FAGR,MAAM,EAAA,UAAA,EAAA,CAAA;kBAXlB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,EAEV,OAAA,EAAA;wBACP,eAAe;wBACf,sBAAsB;wBACtB,mBAAmB;wBACnB,iBAAiB;wBACjB,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,4VAAA,EAAA;;;AEhBH;;AAEG;;;;"}
1
+ {"version":3,"file":"koalarx-ui-core-components-kl-root.mjs","sources":["../../projects/koala-ui/core/components/kl-root/kl-root.ts","../../projects/koala-ui/core/components/kl-root/kl-root.html","../../projects/koala-ui/core/components/kl-root/koalarx-ui-core-components-kl-root.ts"],"sourcesContent":["import { Component, inject, input, OnInit } from '@angular/core';\nimport { DialogContainer } from '@koalarx/ui/core/components/dialog';\nimport { LoaderPageContent } from '@koalarx/ui/core/components/loader-page';\nimport { SideWindowContainer } from '@koalarx/ui/core/components/side-window';\nimport { SnackbarContainer } from '@koalarx/ui/core/components/snackbar';\nimport { Authorization } from '@koalarx/ui/shared/services';\nimport { LoadingBarRouterModule } from '@ngx-loading-bar/router';\n\n@Component({\n selector: 'kl-root',\n templateUrl: './kl-root.html',\n imports: [\n DialogContainer,\n LoadingBarRouterModule,\n SideWindowContainer,\n SnackbarContainer,\n LoaderPageContent,\n ],\n})\nexport class KlRoot implements OnInit {\n private readonly authorization = inject(Authorization);\n\n routerLoaderColor = input<string>('#6A1B9A');\n\n ngOnInit(): void {\n if (document.querySelector('html')?.getAttribute('data-theme') === null) {\n document.querySelector('html')?.setAttribute('data-theme', 'light');\n }\n }\n}\n","<ngx-loading-bar\n [color]=\"routerLoaderColor()\"\n height=\"4px\"\n [includeSpinner]=\"false\"\n/>\n\n<main class=\"overflow-x-hidden\">\n <kl-loader-page-content />\n <kl-snackbar-container />\n <kl-dialog-container />\n <kl-side-window-container />\n <div class=\"kl-generic-component-container\"></div>\n\n <ng-content />\n</main>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;MAmBa,MAAM,CAAA;AACA,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAEtD,IAAA,iBAAiB,GAAG,KAAK,CAAS,SAAS,CAAC;IAE5C,QAAQ,GAAA;AACN,QAAA,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;AACvE,YAAA,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC;;;uGAP5D,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBnB,4VAeA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDHI,eAAe,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,sBAAsB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,mBAAmB,EAAA,QAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,iBAAiB,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,iBAAiB,EAAA,QAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,CAAA;;2FAGR,MAAM,EAAA,UAAA,EAAA,CAAA;kBAXlB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,EAEV,OAAA,EAAA;wBACP,eAAe;wBACf,sBAAsB;wBACtB,mBAAmB;wBACnB,iBAAiB;wBACjB,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,4VAAA,EAAA;;;AEjBH;;AAEG;;;;"}
@@ -1,5 +1,3 @@
1
- import * as i0 from '@angular/core';
2
- import { Injectable } from '@angular/core';
3
1
  import { en } from '@koalarx/ui/core/translations';
4
2
 
5
3
  const GENERIC_COMPONENT_CONTAINER_NAME = '.kl-generic-component-container';
@@ -9,6 +7,7 @@ class AppConfig {
9
7
  _language;
10
8
  _translation;
11
9
  _httpClientErrorsMiddleware;
10
+ _authConfig;
12
11
  set hostApi(hostApi) {
13
12
  this._hostApi = hostApi;
14
13
  }
@@ -33,13 +32,13 @@ class AppConfig {
33
32
  get httpClientErrorsMiddleware() {
34
33
  return this._httpClientErrorsMiddleware;
35
34
  }
36
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AppConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
37
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AppConfig, providedIn: 'root' });
35
+ set authConfig(authConfig) {
36
+ this._authConfig = authConfig;
37
+ }
38
+ get authConfig() {
39
+ return this._authConfig;
40
+ }
38
41
  }
39
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AppConfig, decorators: [{
40
- type: Injectable,
41
- args: [{ providedIn: 'root' }]
42
- }] });
43
42
 
44
43
  /**
45
44
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"koalarx-ui-core-config.mjs","sources":["../../projects/koala-ui/core/config/constants.ts","../../projects/koala-ui/core/config/app-config.ts","../../projects/koala-ui/core/config/koalarx-ui-core-config.ts"],"sourcesContent":["export const GENERIC_COMPONENT_CONTAINER_NAME =\n '.kl-generic-component-container';\n","import { Injectable } from '@angular/core';\nimport { HttpClientErrorsMiddleware } from '@koalarx/ui/core/middlewares';\nimport { KoalaLanguage, Translation, en } from '@koalarx/ui/core/translations';\n\n@Injectable({ providedIn: 'root' })\nexport class AppConfig {\n private _hostApi: string | undefined;\n private _language: KoalaLanguage | undefined;\n private _translation: Translation | undefined;\n private _httpClientErrorsMiddleware: HttpClientErrorsMiddleware | undefined;\n\n set hostApi(hostApi: string | undefined) {\n this._hostApi = hostApi;\n }\n\n get hostApi(): string | undefined {\n return this._hostApi;\n }\n\n set language(language: KoalaLanguage | undefined) {\n this._language = language;\n }\n\n get language(): KoalaLanguage | undefined {\n return this._language;\n }\n\n set translation(translation: Translation | undefined) {\n this._translation = translation;\n }\n\n get translation(): Translation {\n return this._translation ?? en;\n }\n\n set httpClientErrorsMiddleware(\n httpClientErrorsMiddleware: HttpClientErrorsMiddleware | undefined\n ) {\n this._httpClientErrorsMiddleware = httpClientErrorsMiddleware;\n }\n\n get httpClientErrorsMiddleware(): HttpClientErrorsMiddleware | undefined {\n return this._httpClientErrorsMiddleware;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAAO,MAAM,gCAAgC,GAC3C;;MCIW,SAAS,CAAA;AACZ,IAAA,QAAQ;AACR,IAAA,SAAS;AACT,IAAA,YAAY;AACZ,IAAA,2BAA2B;IAEnC,IAAI,OAAO,CAAC,OAA2B,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;;AAGzB,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;;IAGtB,IAAI,QAAQ,CAAC,QAAmC,EAAA;AAC9C,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;;AAG3B,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;;IAGvB,IAAI,WAAW,CAAC,WAAoC,EAAA;AAClD,QAAA,IAAI,CAAC,YAAY,GAAG,WAAW;;AAGjC,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,YAAY,IAAI,EAAE;;IAGhC,IAAI,0BAA0B,CAC5B,0BAAkE,EAAA;AAElE,QAAA,IAAI,CAAC,2BAA2B,GAAG,0BAA0B;;AAG/D,IAAA,IAAI,0BAA0B,GAAA;QAC5B,OAAO,IAAI,CAAC,2BAA2B;;uGArC9B,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAT,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAS,cADI,MAAM,EAAA,CAAA;;2FACnB,SAAS,EAAA,UAAA,EAAA,CAAA;kBADrB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACJlC;;AAEG;;;;"}
1
+ {"version":3,"file":"koalarx-ui-core-config.mjs","sources":["../../projects/koala-ui/core/config/constants.ts","../../projects/koala-ui/core/config/app-config.ts","../../projects/koala-ui/core/config/koalarx-ui-core-config.ts"],"sourcesContent":["export const GENERIC_COMPONENT_CONTAINER_NAME =\n '.kl-generic-component-container';\n","import { HttpClientErrorsMiddleware } from '@koalarx/ui/core/middlewares';\nimport { AuthConfig } from '@koalarx/ui/core/models';\nimport { KoalaLanguage, Translation, en } from '@koalarx/ui/core/translations';\n\nexport class AppConfig {\n private _hostApi: string | undefined;\n private _language: KoalaLanguage | undefined;\n private _translation: Translation | undefined;\n private _httpClientErrorsMiddleware: HttpClientErrorsMiddleware | undefined;\n private _authConfig: AuthConfig | undefined;\n\n set hostApi(hostApi: string | undefined) {\n this._hostApi = hostApi;\n }\n\n get hostApi(): string | undefined {\n return this._hostApi;\n }\n\n set language(language: KoalaLanguage | undefined) {\n this._language = language;\n }\n\n get language(): KoalaLanguage | undefined {\n return this._language;\n }\n\n set translation(translation: Translation | undefined) {\n this._translation = translation;\n }\n\n get translation(): Translation {\n return this._translation ?? en;\n }\n\n set httpClientErrorsMiddleware(\n httpClientErrorsMiddleware: HttpClientErrorsMiddleware | undefined\n ) {\n this._httpClientErrorsMiddleware = httpClientErrorsMiddleware;\n }\n\n get httpClientErrorsMiddleware(): HttpClientErrorsMiddleware | undefined {\n return this._httpClientErrorsMiddleware;\n }\n\n set authConfig(authConfig: AuthConfig | undefined) {\n this._authConfig = authConfig;\n }\n\n get authConfig(): AuthConfig | undefined {\n return this._authConfig;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;AAAO,MAAM,gCAAgC,GAC3C;;MCGW,SAAS,CAAA;AACZ,IAAA,QAAQ;AACR,IAAA,SAAS;AACT,IAAA,YAAY;AACZ,IAAA,2BAA2B;AAC3B,IAAA,WAAW;IAEnB,IAAI,OAAO,CAAC,OAA2B,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;;AAGzB,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;;IAGtB,IAAI,QAAQ,CAAC,QAAmC,EAAA;AAC9C,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;;AAG3B,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;;IAGvB,IAAI,WAAW,CAAC,WAAoC,EAAA;AAClD,QAAA,IAAI,CAAC,YAAY,GAAG,WAAW;;AAGjC,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,YAAY,IAAI,EAAE;;IAGhC,IAAI,0BAA0B,CAC5B,0BAAkE,EAAA;AAElE,QAAA,IAAI,CAAC,2BAA2B,GAAG,0BAA0B;;AAG/D,IAAA,IAAI,0BAA0B,GAAA;QAC5B,OAAO,IAAI,CAAC,2BAA2B;;IAGzC,IAAI,UAAU,CAAC,UAAkC,EAAA;AAC/C,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU;;AAG/B,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,WAAW;;AAE1B;;ACpDD;;AAEG;;;;"}
@@ -0,0 +1,22 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import { Authorization } from '@koalarx/ui/shared/services';
4
+
5
+ class AuthGuard {
6
+ authService = inject(Authorization);
7
+ canActivate() {
8
+ return this.authService.isAuthenticated();
9
+ }
10
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AuthGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AuthGuard });
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AuthGuard, decorators: [{
14
+ type: Injectable
15
+ }] });
16
+
17
+ /**
18
+ * Generated bundle index. Do not edit.
19
+ */
20
+
21
+ export { AuthGuard };
22
+ //# sourceMappingURL=koalarx-ui-core-guards.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"koalarx-ui-core-guards.mjs","sources":["../../projects/koala-ui/core/guards/auth.guard.ts","../../projects/koala-ui/core/guards/koalarx-ui-core-guards.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { CanActivate, GuardResult, MaybeAsync } from '@angular/router';\nimport { Authorization } from '@koalarx/ui/shared/services';\n\n@Injectable()\nexport class AuthGuard implements CanActivate {\n private readonly authService = inject(Authorization);\n\n canActivate(): MaybeAsync<GuardResult> {\n return this.authService.isAuthenticated();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAKa,SAAS,CAAA;AACH,IAAA,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC;IAEpD,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;;uGAJhC,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAT,SAAS,EAAA,CAAA;;2FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBADrB;;;ACJD;;AAEG;;;;"}
@@ -2,6 +2,7 @@ const en = {
2
2
  confirm: {
3
3
  btnLabelYes: 'Yes',
4
4
  btnLabelNo: 'No',
5
+ askAreYouSureMessage: 'Are you sure you want to continue?',
5
6
  },
6
7
  codeViewer: {
7
8
  copyToClipboard: 'Copy to clipboard',
@@ -43,12 +44,16 @@ const en = {
43
44
  '0': 'We identified an instability in communication with our server, this may occur due to rapid internet drops, slow connection, or server overload, please try again.',
44
45
  unknowError: 'An unknown error occurred, please try again.',
45
46
  },
47
+ jwtAuthorizationService: {
48
+ questionLogoutMessage: 'You are about to <b>log out of the system</b>.',
49
+ },
46
50
  };
47
51
 
48
52
  const ptBr = {
49
53
  confirm: {
50
54
  btnLabelYes: 'Sim',
51
55
  btnLabelNo: 'Não',
56
+ askAreYouSureMessage: 'Tem certeza de que deseja continuar?',
52
57
  },
53
58
  codeViewer: {
54
59
  copyToClipboard: 'Copiar',
@@ -90,6 +95,9 @@ const ptBr = {
90
95
  '0': 'Identificamos uma instabilidade na comunicação com nosso servidor, isto pode ocorrer devido a rápidas quedas de internet, conexão lenta ou sobrecarga no servidor, por favor, tente novamente.',
91
96
  unknowError: 'Ocorreu um erro desconhecido, por favor, tente novamente.',
92
97
  },
98
+ jwtAuthorizationService: {
99
+ questionLogoutMessage: 'Você está prestes a <b>deslogar do sistema</b>.',
100
+ },
93
101
  };
94
102
 
95
103
  function getTranslationByLanguage(language) {
@@ -1 +1 @@
1
- {"version":3,"file":"koalarx-ui-core-translations.mjs","sources":["../../projects/koala-ui/core/translations/en.ts","../../projects/koala-ui/core/translations/ptbr.ts","../../projects/koala-ui/core/translations/get-translation-by-language.ts","../../projects/koala-ui/core/translations/koalarx-ui-core-translations.ts"],"sourcesContent":["import { Translation } from './translation.model';\n\nexport const en: Translation = {\n confirm: {\n btnLabelYes: 'Yes',\n btnLabelNo: 'No',\n },\n codeViewer: {\n copyToClipboard: 'Copy to clipboard',\n copiedToClipboard: 'Copied to clipboard',\n },\n form: {\n required: 'This field is required.',\n invalidEmail: 'Invalid email address',\n invalidMinLength: (minLength: number) =>\n `The field must have at least ${minLength} characters.`,\n invalidCPF: 'Invalid CPF',\n invalidCNPJ: 'Invalid CNPJ',\n invalidURL: 'Invalid URL',\n invalidPasswordHasSpecialCharacters:\n 'The password must contain special characters.',\n invalidPasswordHasLowercase: 'The password must contain lowercase letters.',\n invalidPasswordHasUppercase: 'The password must contain uppercase letters.',\n invalidPasswordHasNumber: 'The password must contain numbers.',\n invalidConfirmPassword: 'The confirmation password does not match.',\n },\n onThisPage: {\n title: 'On this page',\n },\n datatable: {\n btnFilterLabel: 'Filter',\n clearFilterTooltip: 'Clear filters',\n addFilterTooltip: 'Add filter',\n reloadListTooltip: 'Reload data',\n labelItemsPerPage: 'Items per page limit',\n loadMoreBtnLabel: 'Load more',\n paginatorPagesFeedback: (currentPage: number, lastPage: number) =>\n `Page ${currentPage} of ${lastPage}`,\n },\n feedbackRequestInterceptor: {\n '400': 'An error occurred related to the submitted data',\n '401': 'Unauthorized access, please log in again.',\n '403': 'Access denied.',\n '404': 'No record found from the provided data.',\n '409': 'This record already exists',\n '422': 'Validation error in the submitted data.',\n '500': 'Please contact our support via WhatsApp.',\n '0': 'We identified an instability in communication with our server, this may occur due to rapid internet drops, slow connection, or server overload, please try again.',\n unknowError: 'An unknown error occurred, please try again.',\n },\n};\n","import { Translation } from './translation.model';\n\nexport const ptBr: Translation = {\n confirm: {\n btnLabelYes: 'Sim',\n btnLabelNo: 'Não',\n },\n codeViewer: {\n copyToClipboard: 'Copiar',\n copiedToClipboard: 'Copiado',\n },\n form: {\n required: 'O campo é obrigatório.',\n invalidEmail: 'E-mail inválido',\n invalidMinLength: (minLength: number) =>\n `O campo deve ter no mínimo ${minLength} caracteres.`,\n invalidCPF: 'CPF inválido',\n invalidCNPJ: 'CNPJ inválido',\n invalidURL: 'URL inválida',\n invalidPasswordHasSpecialCharacters:\n 'A senha deve conter caracteres especiais.',\n invalidPasswordHasLowercase: 'A senha deve conter letras minúsculas.',\n invalidPasswordHasUppercase: 'A senha deve conter letras maiúsculas.',\n invalidPasswordHasNumber: 'A senha deve conter números.',\n invalidConfirmPassword: 'A confirmação da senha não confere.',\n },\n onThisPage: {\n title: 'Nesta página',\n },\n datatable: {\n btnFilterLabel: 'Filtro',\n clearFilterTooltip: 'Limpar filtros',\n addFilterTooltip: 'Adicionar filtro',\n reloadListTooltip: 'Recarregar dados',\n labelItemsPerPage: 'Limite de itens por carregamento',\n loadMoreBtnLabel: 'Carregar mais',\n paginatorPagesFeedback: (currentPage: number, lastPage: number) =>\n `Página ${currentPage} de ${lastPage}`,\n },\n feedbackRequestInterceptor: {\n '400': 'Ocorreu um erro relacionado aos dados enviados',\n '401': 'Acesso não autorizado, por favor, faça login novamente.',\n '403': 'Acesso negado.',\n '404': 'Nenhum registro encontrado a partir dos dados informados.',\n '409': 'Este registro já existe',\n '422': 'Erro de validação nos dados enviados.',\n '500': 'Entre em contato com nosso suporte pelo canal do whatsapp.',\n '0': 'Identificamos uma instabilidade na comunicação com nosso servidor, isto pode ocorrer devido a rápidas quedas de internet, conexão lenta ou sobrecarga no servidor, por favor, tente novamente.',\n unknowError: 'Ocorreu um erro desconhecido, por favor, tente novamente.',\n },\n};\n","import { en } from './en';\nimport { ptBr } from './ptbr';\nimport { Translation } from './translation.model';\n\nexport type KoalaLanguage = 'en' | 'ptBr';\n\nexport function getTranslationByLanguage(language: KoalaLanguage): Translation {\n switch (language) {\n case 'en':\n return en;\n case 'ptBr':\n return ptBr;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"koalarx-ui-core-translations.mjs","sources":["../../projects/koala-ui/core/translations/en.ts","../../projects/koala-ui/core/translations/ptbr.ts","../../projects/koala-ui/core/translations/get-translation-by-language.ts","../../projects/koala-ui/core/translations/koalarx-ui-core-translations.ts"],"sourcesContent":["import { Translation } from './translation.model';\n\nexport const en: Translation = {\n confirm: {\n btnLabelYes: 'Yes',\n btnLabelNo: 'No',\n askAreYouSureMessage: 'Are you sure you want to continue?',\n },\n codeViewer: {\n copyToClipboard: 'Copy to clipboard',\n copiedToClipboard: 'Copied to clipboard',\n },\n form: {\n required: 'This field is required.',\n invalidEmail: 'Invalid email address',\n invalidMinLength: (minLength: number) =>\n `The field must have at least ${minLength} characters.`,\n invalidCPF: 'Invalid CPF',\n invalidCNPJ: 'Invalid CNPJ',\n invalidURL: 'Invalid URL',\n invalidPasswordHasSpecialCharacters:\n 'The password must contain special characters.',\n invalidPasswordHasLowercase: 'The password must contain lowercase letters.',\n invalidPasswordHasUppercase: 'The password must contain uppercase letters.',\n invalidPasswordHasNumber: 'The password must contain numbers.',\n invalidConfirmPassword: 'The confirmation password does not match.',\n },\n onThisPage: {\n title: 'On this page',\n },\n datatable: {\n btnFilterLabel: 'Filter',\n clearFilterTooltip: 'Clear filters',\n addFilterTooltip: 'Add filter',\n reloadListTooltip: 'Reload data',\n labelItemsPerPage: 'Items per page limit',\n loadMoreBtnLabel: 'Load more',\n paginatorPagesFeedback: (currentPage: number, lastPage: number) =>\n `Page ${currentPage} of ${lastPage}`,\n },\n feedbackRequestInterceptor: {\n '400': 'An error occurred related to the submitted data',\n '401': 'Unauthorized access, please log in again.',\n '403': 'Access denied.',\n '404': 'No record found from the provided data.',\n '409': 'This record already exists',\n '422': 'Validation error in the submitted data.',\n '500': 'Please contact our support via WhatsApp.',\n '0': 'We identified an instability in communication with our server, this may occur due to rapid internet drops, slow connection, or server overload, please try again.',\n unknowError: 'An unknown error occurred, please try again.',\n },\n jwtAuthorizationService: {\n questionLogoutMessage: 'You are about to <b>log out of the system</b>.',\n },\n};\n","import { Translation } from './translation.model';\n\nexport const ptBr: Translation = {\n confirm: {\n btnLabelYes: 'Sim',\n btnLabelNo: 'Não',\n askAreYouSureMessage: 'Tem certeza de que deseja continuar?',\n },\n codeViewer: {\n copyToClipboard: 'Copiar',\n copiedToClipboard: 'Copiado',\n },\n form: {\n required: 'O campo é obrigatório.',\n invalidEmail: 'E-mail inválido',\n invalidMinLength: (minLength: number) =>\n `O campo deve ter no mínimo ${minLength} caracteres.`,\n invalidCPF: 'CPF inválido',\n invalidCNPJ: 'CNPJ inválido',\n invalidURL: 'URL inválida',\n invalidPasswordHasSpecialCharacters:\n 'A senha deve conter caracteres especiais.',\n invalidPasswordHasLowercase: 'A senha deve conter letras minúsculas.',\n invalidPasswordHasUppercase: 'A senha deve conter letras maiúsculas.',\n invalidPasswordHasNumber: 'A senha deve conter números.',\n invalidConfirmPassword: 'A confirmação da senha não confere.',\n },\n onThisPage: {\n title: 'Nesta página',\n },\n datatable: {\n btnFilterLabel: 'Filtro',\n clearFilterTooltip: 'Limpar filtros',\n addFilterTooltip: 'Adicionar filtro',\n reloadListTooltip: 'Recarregar dados',\n labelItemsPerPage: 'Limite de itens por carregamento',\n loadMoreBtnLabel: 'Carregar mais',\n paginatorPagesFeedback: (currentPage: number, lastPage: number) =>\n `Página ${currentPage} de ${lastPage}`,\n },\n feedbackRequestInterceptor: {\n '400': 'Ocorreu um erro relacionado aos dados enviados',\n '401': 'Acesso não autorizado, por favor, faça login novamente.',\n '403': 'Acesso negado.',\n '404': 'Nenhum registro encontrado a partir dos dados informados.',\n '409': 'Este registro já existe',\n '422': 'Erro de validação nos dados enviados.',\n '500': 'Entre em contato com nosso suporte pelo canal do whatsapp.',\n '0': 'Identificamos uma instabilidade na comunicação com nosso servidor, isto pode ocorrer devido a rápidas quedas de internet, conexão lenta ou sobrecarga no servidor, por favor, tente novamente.',\n unknowError: 'Ocorreu um erro desconhecido, por favor, tente novamente.',\n },\n jwtAuthorizationService: {\n questionLogoutMessage: 'Você está prestes a <b>deslogar do sistema</b>.',\n },\n};\n","import { en } from './en';\nimport { ptBr } from './ptbr';\nimport { Translation } from './translation.model';\n\nexport type KoalaLanguage = 'en' | 'ptBr';\n\nexport function getTranslationByLanguage(language: KoalaLanguage): Translation {\n switch (language) {\n case 'en':\n return en;\n case 'ptBr':\n return ptBr;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -12,11 +12,11 @@ class ConfirmContent {
12
12
  this.dialogRef.dismiss({ type });
13
13
  }
14
14
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ConfirmContent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: ConfirmContent, isStandalone: true, selector: "kl-confirm-content", ngImport: i0, template: "<kl-dialog-content>\n <div content>\n <p class=\"text-center\" [innerHTML]=\"message\"></p>\n <p class=\"text-center\">Tem certeza de que deseja continuar?</p>\n </div>\n\n <div class=\"flex items-center justify-center gap-2 w-full\" actions>\n <button klButton color=\"error\" (click)=\"close('no')\">\n {{translations.btnLabelNo}}\n </button>\n <button klButton color=\"accent\" outline (click)=\"close('yes')\">\n {{translations.btnLabelYes}}\n </button>\n </div>\n</kl-dialog-content>\n", dependencies: [{ kind: "component", type: DialogContent, selector: "kl-dialog-content" }, { kind: "directive", type: Button, selector: "button[klButton], a[klButton]", inputs: ["color", "type", "circle", "outline", "soft", "showLoader", "disabled", "size"] }] });
15
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: ConfirmContent, isStandalone: true, selector: "kl-confirm-content", ngImport: i0, template: "<kl-dialog-content>\n <div content>\n <p class=\"text-center\" [innerHTML]=\"message\"></p>\n <p class=\"text-center\">{{translations.askAreYouSureMessage}}</p>\n </div>\n\n <div class=\"flex items-center justify-center gap-2 w-full\" actions>\n <button klButton color=\"error\" (click)=\"close('no')\">\n {{translations.btnLabelNo}}\n </button>\n <button klButton color=\"accent\" outline (click)=\"close('yes')\">\n {{translations.btnLabelYes}}\n </button>\n </div>\n</kl-dialog-content>\n", dependencies: [{ kind: "component", type: DialogContent, selector: "kl-dialog-content" }, { kind: "directive", type: Button, selector: "button[klButton], a[klButton]", inputs: ["color", "type", "circle", "outline", "soft", "showLoader", "disabled", "size"] }] });
16
16
  }
17
17
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ConfirmContent, decorators: [{
18
18
  type: Component,
19
- args: [{ selector: 'kl-confirm-content', imports: [DialogContent, Button], template: "<kl-dialog-content>\n <div content>\n <p class=\"text-center\" [innerHTML]=\"message\"></p>\n <p class=\"text-center\">Tem certeza de que deseja continuar?</p>\n </div>\n\n <div class=\"flex items-center justify-center gap-2 w-full\" actions>\n <button klButton color=\"error\" (click)=\"close('no')\">\n {{translations.btnLabelNo}}\n </button>\n <button klButton color=\"accent\" outline (click)=\"close('yes')\">\n {{translations.btnLabelYes}}\n </button>\n </div>\n</kl-dialog-content>\n" }]
19
+ args: [{ selector: 'kl-confirm-content', imports: [DialogContent, Button], template: "<kl-dialog-content>\n <div content>\n <p class=\"text-center\" [innerHTML]=\"message\"></p>\n <p class=\"text-center\">{{translations.askAreYouSureMessage}}</p>\n </div>\n\n <div class=\"flex items-center justify-center gap-2 w-full\" actions>\n <button klButton color=\"error\" (click)=\"close('no')\">\n {{translations.btnLabelNo}}\n </button>\n <button klButton color=\"accent\" outline (click)=\"close('yes')\">\n {{translations.btnLabelYes}}\n </button>\n </div>\n</kl-dialog-content>\n" }]
20
20
  }] });
21
21
 
22
22
  class Confirm {
@@ -1 +1 @@
1
- {"version":3,"file":"koalarx-ui-shared-components-confirm.mjs","sources":["../../projects/koala-ui/shared/components/confirm/confirm-content.ts","../../projects/koala-ui/shared/components/confirm/confirm-content.html","../../projects/koala-ui/shared/components/confirm/confirm.ts","../../projects/koala-ui/shared/components/confirm/koalarx-ui-shared-components-confirm.ts"],"sourcesContent":["import { Component, inject } from '@angular/core';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport {\n DIALOG_DATA,\n DialogContent,\n DialogRef,\n} from '@koalarx/ui/shared/components/dialog';\nimport { Button } from '@koalarx/ui/shared/directives';\n\n@Component({\n selector: 'kl-confirm-content',\n templateUrl: './confirm-content.html',\n imports: [DialogContent, Button],\n})\nexport class ConfirmContent {\n readonly translations = inject(AppConfig).translation.confirm;\n private readonly dialogRef = inject(DialogRef);\n\n message = inject<string>(DIALOG_DATA);\n\n close(type: 'yes' | 'no') {\n this.dialogRef.dismiss({ type });\n }\n}\n","<kl-dialog-content>\n <div content>\n <p class=\"text-center\" [innerHTML]=\"message\"></p>\n <p class=\"text-center\">Tem certeza de que deseja continuar?</p>\n </div>\n\n <div class=\"flex items-center justify-center gap-2 w-full\" actions>\n <button klButton color=\"error\" (click)=\"close('no')\">\n {{translations.btnLabelNo}}\n </button>\n <button klButton color=\"accent\" outline (click)=\"close('yes')\">\n {{translations.btnLabelYes}}\n </button>\n </div>\n</kl-dialog-content>\n","import { inject, Injectable } from '@angular/core';\nimport { Dialog } from '@koalarx/ui/shared/components/dialog';\nimport { ConfirmContent } from './confirm-content';\n\nexport interface ConfirmConfig {\n message: string;\n yesCallback?: () => void;\n noCallback?: () => void;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class Confirm {\n private readonly dialog = inject(Dialog);\n\n open(config: ConfirmConfig) {\n this.dialog.open(ConfirmContent, {\n data: config.message,\n afterClosed: {\n trigger: {},\n callback: (confirm: { type: 'yes' | 'no' }) => {\n if (confirm.type === 'yes' && config.yesCallback) {\n config.yesCallback();\n } else if (confirm.type === 'no' && config.noCallback) {\n config.noCallback();\n }\n },\n },\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;MAca,cAAc,CAAA;IAChB,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,OAAO;AAC5C,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AAE9C,IAAA,OAAO,GAAG,MAAM,CAAS,WAAW,CAAC;AAErC,IAAA,KAAK,CAAC,IAAkB,EAAA;QACtB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;;uGAPvB,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,ECd3B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,4gBAeA,EDHY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,aAAa,8DAAE,MAAM,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEpB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAL1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAErB,OAAA,EAAA,CAAC,aAAa,EAAE,MAAM,CAAC,EAAA,QAAA,EAAA,4gBAAA,EAAA;;;MEDrB,OAAO,CAAA;AACD,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAExC,IAAA,IAAI,CAAC,MAAqB,EAAA;AACxB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;YAC/B,IAAI,EAAE,MAAM,CAAC,OAAO;AACpB,YAAA,WAAW,EAAE;AACX,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,QAAQ,EAAE,CAAC,OAA+B,KAAI;oBAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,WAAW,EAAE;wBAChD,MAAM,CAAC,WAAW,EAAE;;yBACf,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,EAAE;wBACrD,MAAM,CAAC,UAAU,EAAE;;iBAEtB;AACF,aAAA;AACF,SAAA,CAAC;;uGAhBO,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAP,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,OAAO,cADM,MAAM,EAAA,CAAA;;2FACnB,OAAO,EAAA,UAAA,EAAA,CAAA;kBADnB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACVlC;;AAEG;;;;"}
1
+ {"version":3,"file":"koalarx-ui-shared-components-confirm.mjs","sources":["../../projects/koala-ui/shared/components/confirm/confirm-content.ts","../../projects/koala-ui/shared/components/confirm/confirm-content.html","../../projects/koala-ui/shared/components/confirm/confirm.ts","../../projects/koala-ui/shared/components/confirm/koalarx-ui-shared-components-confirm.ts"],"sourcesContent":["import { Component, inject } from '@angular/core';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport {\n DIALOG_DATA,\n DialogContent,\n DialogRef,\n} from '@koalarx/ui/shared/components/dialog';\nimport { Button } from '@koalarx/ui/shared/directives';\n\n@Component({\n selector: 'kl-confirm-content',\n templateUrl: './confirm-content.html',\n imports: [DialogContent, Button],\n})\nexport class ConfirmContent {\n readonly translations = inject(AppConfig).translation.confirm;\n private readonly dialogRef = inject(DialogRef);\n\n message = inject<string>(DIALOG_DATA);\n\n close(type: 'yes' | 'no') {\n this.dialogRef.dismiss({ type });\n }\n}\n","<kl-dialog-content>\n <div content>\n <p class=\"text-center\" [innerHTML]=\"message\"></p>\n <p class=\"text-center\">{{translations.askAreYouSureMessage}}</p>\n </div>\n\n <div class=\"flex items-center justify-center gap-2 w-full\" actions>\n <button klButton color=\"error\" (click)=\"close('no')\">\n {{translations.btnLabelNo}}\n </button>\n <button klButton color=\"accent\" outline (click)=\"close('yes')\">\n {{translations.btnLabelYes}}\n </button>\n </div>\n</kl-dialog-content>\n","import { inject, Injectable } from '@angular/core';\nimport { Dialog } from '@koalarx/ui/shared/components/dialog';\nimport { ConfirmContent } from './confirm-content';\n\nexport interface ConfirmConfig {\n message: string;\n yesCallback?: () => void;\n noCallback?: () => void;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class Confirm {\n private readonly dialog = inject(Dialog);\n\n open(config: ConfirmConfig) {\n this.dialog.open(ConfirmContent, {\n data: config.message,\n afterClosed: {\n trigger: {},\n callback: (confirm: { type: 'yes' | 'no' }) => {\n if (confirm.type === 'yes' && config.yesCallback) {\n config.yesCallback();\n } else if (confirm.type === 'no' && config.noCallback) {\n config.noCallback();\n }\n },\n },\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;MAca,cAAc,CAAA;IAChB,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,OAAO;AAC5C,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AAE9C,IAAA,OAAO,GAAG,MAAM,CAAS,WAAW,CAAC;AAErC,IAAA,KAAK,CAAC,IAAkB,EAAA;QACtB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;;uGAPvB,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,ECd3B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,6gBAeA,EDHY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,aAAa,8DAAE,MAAM,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEpB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAL1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAErB,OAAA,EAAA,CAAC,aAAa,EAAE,MAAM,CAAC,EAAA,QAAA,EAAA,6gBAAA,EAAA;;;MEDrB,OAAO,CAAA;AACD,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAExC,IAAA,IAAI,CAAC,MAAqB,EAAA;AACxB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;YAC/B,IAAI,EAAE,MAAM,CAAC,OAAO;AACpB,YAAA,WAAW,EAAE;AACX,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,QAAQ,EAAE,CAAC,OAA+B,KAAI;oBAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,WAAW,EAAE;wBAChD,MAAM,CAAC,WAAW,EAAE;;yBACf,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,EAAE;wBACrD,MAAM,CAAC,UAAU,EAAE;;iBAEtB;AACF,aAAA;AACF,SAAA,CAAC;;uGAhBO,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAP,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,OAAO,cADM,MAAM,EAAA,CAAA;;2FACnB,OAAO,EAAA,UAAA,EAAA,CAAA;kBADnB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACVlC;;AAEG;;;;"}
@@ -0,0 +1,159 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, signal, computed, effect, Injectable } from '@angular/core';
4
+ import { Router } from '@angular/router';
5
+ import { AppConfig } from '@koalarx/ui/core/config';
6
+ import { Confirm } from '@koalarx/ui/shared/components/confirm';
7
+ import { jwtDecode } from 'jwt-decode';
8
+ import { first } from 'rxjs/internal/operators/first';
9
+ import { tap } from 'rxjs/internal/operators/tap';
10
+
11
+ class Authorization {
12
+ appConfig = inject(AppConfig);
13
+ translation = this.appConfig.translation.jwtAuthorizationService;
14
+ authConfig = this.appConfig.authConfig;
15
+ _accessToken = signal(localStorage.getItem(this.authConfig.storageTokenKey));
16
+ _refreshToken = signal(localStorage.getItem(this.authConfig.storageRefreshTokenKey));
17
+ _isAuthenticated = signal(false);
18
+ _userinfo = signal(null);
19
+ router = inject(Router);
20
+ http = inject(HttpClient);
21
+ confirm = inject(Confirm);
22
+ get accessToken() {
23
+ const accessToken = this._accessToken();
24
+ return accessToken;
25
+ }
26
+ set accessToken(accessToken) {
27
+ if (accessToken) {
28
+ localStorage.setItem(this.authConfig.storageTokenKey, accessToken);
29
+ }
30
+ else {
31
+ localStorage.removeItem(this.authConfig.storageTokenKey);
32
+ }
33
+ this._accessToken.set(accessToken);
34
+ }
35
+ get refreshToken() {
36
+ const refreshToken = this._refreshToken();
37
+ return refreshToken;
38
+ }
39
+ set refreshToken(refreshToken) {
40
+ if (refreshToken) {
41
+ localStorage.setItem(this.authConfig.storageRefreshTokenKey, refreshToken);
42
+ }
43
+ else {
44
+ localStorage.removeItem(this.authConfig.storageRefreshTokenKey);
45
+ }
46
+ this._refreshToken.set(refreshToken);
47
+ }
48
+ get isAuthenticated() {
49
+ return this._isAuthenticated.asReadonly();
50
+ }
51
+ get userinfo() {
52
+ return this._userinfo.asReadonly();
53
+ }
54
+ get isExpired() {
55
+ return computed(() => {
56
+ const accessToken = this._accessToken();
57
+ if (accessToken) {
58
+ const decodedToken = jwtDecode(accessToken);
59
+ if (decodedToken) {
60
+ const exp = new Date((decodedToken.exp ?? 0) * 1000);
61
+ const now = new Date();
62
+ return exp < now;
63
+ }
64
+ }
65
+ return true;
66
+ });
67
+ }
68
+ get hasToken() {
69
+ return computed(() => !!this._accessToken());
70
+ }
71
+ constructor() {
72
+ if (this.appConfig.authConfig) {
73
+ this.init();
74
+ }
75
+ }
76
+ init() {
77
+ effect(() => {
78
+ const userInfo = this._userinfo();
79
+ if (userInfo) {
80
+ this.updateAuthState();
81
+ }
82
+ });
83
+ effect(() => {
84
+ const isAuthenticated = this.isAuthenticated();
85
+ if (isAuthenticated &&
86
+ (!this.authConfig.loginRoute ||
87
+ (this.authConfig.loginRoute &&
88
+ location.hash.includes(this.authConfig.loginRoute))) &&
89
+ this.authConfig.homeRoute) {
90
+ this.router.navigate([this.authConfig.homeRoute]);
91
+ }
92
+ });
93
+ effect(() => {
94
+ const hasToken = this.hasToken();
95
+ if (hasToken) {
96
+ this.loadUserInfo();
97
+ }
98
+ else if (this.authConfig.loginRoute &&
99
+ !location.hash.includes(this.authConfig.loginRoute)) {
100
+ this.router.navigate([this.authConfig.loginRoute]);
101
+ }
102
+ });
103
+ }
104
+ updateAuthState() {
105
+ this._isAuthenticated.set(this.hasToken() && !this.isExpired() && !!this._userinfo());
106
+ }
107
+ logoutUser() {
108
+ localStorage.removeItem(this.authConfig.storageTokenKey);
109
+ localStorage.removeItem(this.authConfig.storageRefreshTokenKey);
110
+ this._userinfo.set(null);
111
+ this._refreshToken.set(null);
112
+ this._accessToken.set(null);
113
+ this.updateAuthState();
114
+ }
115
+ loadUserInfo() {
116
+ this.http.get(this.authConfig.userInfo.url).subscribe({
117
+ next: (userInfo) => this._userinfo.set(userInfo),
118
+ error: () => this.logoutUser(),
119
+ });
120
+ }
121
+ logout(force = false) {
122
+ if (force) {
123
+ this.logoutUser();
124
+ return;
125
+ }
126
+ this.confirm.open({
127
+ message: this.translation.questionLogoutMessage,
128
+ yesCallback: () => this.logoutUser(),
129
+ });
130
+ }
131
+ updateToken() {
132
+ return this.http.post(this.authConfig.refreshToken.url, {}).pipe(tap({
133
+ next: (response) => {
134
+ this.accessToken =
135
+ response[this.authConfig.refreshToken.response.accessTokenKeyName];
136
+ this.refreshToken =
137
+ response[this.authConfig.refreshToken.response.refreshTokenKeyName];
138
+ this.updateAuthState();
139
+ },
140
+ error: () => {
141
+ this.logout(true);
142
+ this.router.navigate([this.authConfig.loginRoute]);
143
+ },
144
+ }), first());
145
+ }
146
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: Authorization, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
147
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: Authorization, providedIn: 'root' });
148
+ }
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: Authorization, decorators: [{
150
+ type: Injectable,
151
+ args: [{ providedIn: 'root' }]
152
+ }], ctorParameters: () => [] });
153
+
154
+ /**
155
+ * Generated bundle index. Do not edit.
156
+ */
157
+
158
+ export { Authorization };
159
+ //# sourceMappingURL=koalarx-ui-shared-services.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"koalarx-ui-shared-services.mjs","sources":["../../projects/koala-ui/shared/services/authorization.ts","../../projects/koala-ui/shared/services/koalarx-ui-shared-services.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\nimport { computed, effect, inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport { AuthConfig } from '@koalarx/ui/core/models';\nimport { Confirm } from '@koalarx/ui/shared/components/confirm';\nimport { jwtDecode } from 'jwt-decode';\nimport { first } from 'rxjs/internal/operators/first';\nimport { tap } from 'rxjs/internal/operators/tap';\n\n@Injectable({ providedIn: 'root' })\nexport class Authorization<TUser = any> {\n private readonly appConfig = inject(AppConfig);\n private readonly translation =\n this.appConfig.translation.jwtAuthorizationService;\n private readonly authConfig = this.appConfig.authConfig as AuthConfig;\n private _accessToken = signal<string | null>(\n localStorage.getItem(this.authConfig.storageTokenKey)\n );\n private _refreshToken = signal<string | null>(\n localStorage.getItem(this.authConfig.storageRefreshTokenKey)\n );\n private _isAuthenticated = signal<boolean>(false);\n private _userinfo = signal<TUser | null>(null);\n private readonly router = inject(Router);\n private readonly http = inject(HttpClient);\n private readonly confirm = inject(Confirm);\n\n get accessToken() {\n const accessToken = this._accessToken();\n return accessToken;\n }\n\n set accessToken(accessToken: string | null) {\n if (accessToken) {\n localStorage.setItem(this.authConfig.storageTokenKey, accessToken);\n } else {\n localStorage.removeItem(this.authConfig.storageTokenKey);\n }\n\n this._accessToken.set(accessToken);\n }\n\n get refreshToken() {\n const refreshToken = this._refreshToken();\n return refreshToken;\n }\n\n set refreshToken(refreshToken: string | null) {\n if (refreshToken) {\n localStorage.setItem(\n this.authConfig.storageRefreshTokenKey,\n refreshToken\n );\n } else {\n localStorage.removeItem(this.authConfig.storageRefreshTokenKey);\n }\n\n this._refreshToken.set(refreshToken);\n }\n\n get isAuthenticated() {\n return this._isAuthenticated.asReadonly();\n }\n\n get userinfo() {\n return this._userinfo.asReadonly();\n }\n\n get isExpired() {\n return computed(() => {\n const accessToken = this._accessToken();\n\n if (accessToken) {\n const decodedToken = jwtDecode(accessToken);\n\n if (decodedToken) {\n const exp = new Date((decodedToken.exp ?? 0) * 1000);\n const now = new Date();\n\n return exp < now;\n }\n }\n\n return true;\n });\n }\n\n get hasToken() {\n return computed(() => !!this._accessToken());\n }\n\n constructor() {\n if (this.appConfig.authConfig) {\n this.init();\n }\n }\n\n private init() {\n effect(() => {\n const userInfo = this._userinfo();\n\n if (userInfo) {\n this.updateAuthState();\n }\n });\n\n effect(() => {\n const isAuthenticated = this.isAuthenticated();\n\n if (\n isAuthenticated &&\n (!this.authConfig.loginRoute ||\n (this.authConfig.loginRoute &&\n location.hash.includes(this.authConfig.loginRoute))) &&\n this.authConfig.homeRoute\n ) {\n this.router.navigate([this.authConfig.homeRoute]);\n }\n });\n\n effect(() => {\n const hasToken = this.hasToken();\n\n if (hasToken) {\n this.loadUserInfo();\n } else if (\n this.authConfig.loginRoute &&\n !location.hash.includes(this.authConfig.loginRoute)\n ) {\n this.router.navigate([this.authConfig.loginRoute]);\n }\n });\n }\n\n private updateAuthState() {\n this._isAuthenticated.set(\n this.hasToken() && !this.isExpired() && !!this._userinfo()\n );\n }\n\n private logoutUser() {\n localStorage.removeItem(this.authConfig.storageTokenKey);\n localStorage.removeItem(this.authConfig.storageRefreshTokenKey);\n this._userinfo.set(null);\n this._refreshToken.set(null);\n this._accessToken.set(null);\n this.updateAuthState();\n }\n\n private loadUserInfo() {\n this.http.get<TUser>(this.authConfig.userInfo.url).subscribe({\n next: (userInfo) => this._userinfo.set(userInfo),\n error: () => this.logoutUser(),\n });\n }\n\n logout(force = false) {\n if (force) {\n this.logoutUser();\n return;\n }\n\n this.confirm.open({\n message: this.translation.questionLogoutMessage,\n yesCallback: () => this.logoutUser(),\n });\n }\n\n updateToken() {\n return this.http.post<any>(this.authConfig.refreshToken.url, {}).pipe(\n tap({\n next: (response) => {\n this.accessToken =\n response[this.authConfig.refreshToken.response.accessTokenKeyName];\n this.refreshToken =\n response[this.authConfig.refreshToken.response.refreshTokenKeyName];\n this.updateAuthState();\n },\n error: () => {\n this.logout(true);\n this.router.navigate([this.authConfig.loginRoute]);\n },\n }),\n first()\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,12 +1,46 @@
1
1
  import { provideHttpClient, HTTP_INTERCEPTORS, withInterceptorsFromDi, HttpClient } from '@angular/common/http';
2
2
  import { AppConfig } from '@koalarx/ui/core/config';
3
+ import { getTranslationByLanguage } from '@koalarx/ui/core/translations';
3
4
  import { provideMarkdown, MARKED_OPTIONS } from 'ngx-markdown';
4
5
  import { provideEnvironmentNgxMask } from 'ngx-mask';
5
6
  import * as i0 from '@angular/core';
6
7
  import { inject, Injectable } from '@angular/core';
8
+ import { Authorization } from '@koalarx/ui/shared/services';
9
+ import { switchMap } from 'rxjs/internal/operators/switchMap';
7
10
  import { HttpErrorFeedbackAlert } from '@koalarx/ui/shared/utils';
8
11
  import { tap } from 'rxjs/internal/operators/tap';
9
12
 
13
+ class AuthorizationInterceptor {
14
+ authorization = inject(Authorization);
15
+ authConfig = inject(AppConfig).authConfig;
16
+ setAuthorization(request) {
17
+ if (this.authorization.hasToken()) {
18
+ return request.clone({
19
+ headers: request.headers.set('Authorization', `Bearer ${request.url === this.authConfig?.refreshToken?.url
20
+ ? this.authorization.refreshToken
21
+ : this.authorization.accessToken}`),
22
+ });
23
+ }
24
+ return request.clone();
25
+ }
26
+ intercept(request, next) {
27
+ const clonedReq = this.setAuthorization(request);
28
+ if (this.authorization.hasToken() &&
29
+ this.authorization.isExpired() &&
30
+ !this.authConfig?.refreshToken?.url) {
31
+ return this.authorization
32
+ .updateToken()
33
+ .pipe(switchMap(() => next.handle(this.setAuthorization(request))));
34
+ }
35
+ return next.handle(clonedReq);
36
+ }
37
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AuthorizationInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
38
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AuthorizationInterceptor });
39
+ }
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AuthorizationInterceptor, decorators: [{
41
+ type: Injectable
42
+ }] });
43
+
10
44
  class FeedbackRequestInterceptor {
11
45
  httpError = inject(HttpErrorFeedbackAlert);
12
46
  intercept(request, next) {
@@ -21,109 +55,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
21
55
  type: Injectable
22
56
  }] });
23
57
 
24
- const en = {
25
- confirm: {
26
- btnLabelYes: 'Yes',
27
- btnLabelNo: 'No',
28
- },
29
- codeViewer: {
30
- copyToClipboard: 'Copy to clipboard',
31
- copiedToClipboard: 'Copied to clipboard',
32
- },
33
- form: {
34
- required: 'This field is required.',
35
- invalidEmail: 'Invalid email address',
36
- invalidMinLength: (minLength) => `The field must have at least ${minLength} characters.`,
37
- invalidCPF: 'Invalid CPF',
38
- invalidCNPJ: 'Invalid CNPJ',
39
- invalidURL: 'Invalid URL',
40
- invalidPasswordHasSpecialCharacters: 'The password must contain special characters.',
41
- invalidPasswordHasLowercase: 'The password must contain lowercase letters.',
42
- invalidPasswordHasUppercase: 'The password must contain uppercase letters.',
43
- invalidPasswordHasNumber: 'The password must contain numbers.',
44
- invalidConfirmPassword: 'The confirmation password does not match.',
45
- },
46
- onThisPage: {
47
- title: 'On this page',
48
- },
49
- datatable: {
50
- btnFilterLabel: 'Filter',
51
- clearFilterTooltip: 'Clear filters',
52
- addFilterTooltip: 'Add filter',
53
- reloadListTooltip: 'Reload data',
54
- labelItemsPerPage: 'Items per page limit',
55
- loadMoreBtnLabel: 'Load more',
56
- paginatorPagesFeedback: (currentPage, lastPage) => `Page ${currentPage} of ${lastPage}`,
57
- },
58
- feedbackRequestInterceptor: {
59
- '400': 'An error occurred related to the submitted data',
60
- '401': 'Unauthorized access, please log in again.',
61
- '403': 'Access denied.',
62
- '404': 'No record found from the provided data.',
63
- '409': 'This record already exists',
64
- '422': 'Validation error in the submitted data.',
65
- '500': 'Please contact our support via WhatsApp.',
66
- '0': 'We identified an instability in communication with our server, this may occur due to rapid internet drops, slow connection, or server overload, please try again.',
67
- unknowError: 'An unknown error occurred, please try again.',
68
- },
69
- };
70
-
71
- const ptBr = {
72
- confirm: {
73
- btnLabelYes: 'Sim',
74
- btnLabelNo: 'Não',
75
- },
76
- codeViewer: {
77
- copyToClipboard: 'Copiar',
78
- copiedToClipboard: 'Copiado',
79
- },
80
- form: {
81
- required: 'O campo é obrigatório.',
82
- invalidEmail: 'E-mail inválido',
83
- invalidMinLength: (minLength) => `O campo deve ter no mínimo ${minLength} caracteres.`,
84
- invalidCPF: 'CPF inválido',
85
- invalidCNPJ: 'CNPJ inválido',
86
- invalidURL: 'URL inválida',
87
- invalidPasswordHasSpecialCharacters: 'A senha deve conter caracteres especiais.',
88
- invalidPasswordHasLowercase: 'A senha deve conter letras minúsculas.',
89
- invalidPasswordHasUppercase: 'A senha deve conter letras maiúsculas.',
90
- invalidPasswordHasNumber: 'A senha deve conter números.',
91
- invalidConfirmPassword: 'A confirmação da senha não confere.',
92
- },
93
- onThisPage: {
94
- title: 'Nesta página',
95
- },
96
- datatable: {
97
- btnFilterLabel: 'Filtro',
98
- clearFilterTooltip: 'Limpar filtros',
99
- addFilterTooltip: 'Adicionar filtro',
100
- reloadListTooltip: 'Recarregar dados',
101
- labelItemsPerPage: 'Limite de itens por carregamento',
102
- loadMoreBtnLabel: 'Carregar mais',
103
- paginatorPagesFeedback: (currentPage, lastPage) => `Página ${currentPage} de ${lastPage}`,
104
- },
105
- feedbackRequestInterceptor: {
106
- '400': 'Ocorreu um erro relacionado aos dados enviados',
107
- '401': 'Acesso não autorizado, por favor, faça login novamente.',
108
- '403': 'Acesso negado.',
109
- '404': 'Nenhum registro encontrado a partir dos dados informados.',
110
- '409': 'Este registro já existe',
111
- '422': 'Erro de validação nos dados enviados.',
112
- '500': 'Entre em contato com nosso suporte pelo canal do whatsapp.',
113
- '0': 'Identificamos uma instabilidade na comunicação com nosso servidor, isto pode ocorrer devido a rápidas quedas de internet, conexão lenta ou sobrecarga no servidor, por favor, tente novamente.',
114
- unknowError: 'Ocorreu um erro desconhecido, por favor, tente novamente.',
115
- },
116
- };
117
-
118
- function getTranslationByLanguage(language) {
119
- switch (language) {
120
- case 'en':
121
- return en;
122
- case 'ptBr':
123
- return ptBr;
124
- }
125
- }
126
-
127
58
  const maskOptions = {
128
59
  validation: false,
129
60
  thousandSeparator: '.',
@@ -134,7 +65,8 @@ function provideKoala(config) {
134
65
  appConfig.translation = getTranslationByLanguage(config?.language ?? 'en');
135
66
  appConfig.hostApi = config?.hostApi;
136
67
  appConfig.httpClientErrorsMiddleware = config?.httpClientErrorsMiddleware;
137
- return [
68
+ appConfig.authConfig = config?.authConfig;
69
+ const providers = [
138
70
  provideEnvironmentNgxMask(maskOptions),
139
71
  provideHttpClient(withInterceptorsFromDi()),
140
72
  provideMarkdown({
@@ -158,6 +90,14 @@ function provideKoala(config) {
158
90
  useValue: appConfig,
159
91
  },
160
92
  ];
93
+ if (config?.authConfig) {
94
+ providers.push({
95
+ provide: HTTP_INTERCEPTORS,
96
+ useClass: config?.authorizationInterceptor ?? AuthorizationInterceptor,
97
+ multi: true,
98
+ });
99
+ }
100
+ return providers;
161
101
  }
162
102
 
163
103
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"koalarx-ui.mjs","sources":["../../projects/koala-ui/core/interceptors/feedback-request-interceptor.ts","../../projects/koala-ui/core/translations/en.ts","../../projects/koala-ui/core/translations/ptbr.ts","../../projects/koala-ui/core/translations/get-translation-by-language.ts","../../projects/koala-ui/core/koala-provider.ts","../../projects/koala-ui/koalarx-ui.ts"],"sourcesContent":["import {\n HttpInterceptor as AngularHttpInterceptor,\n HttpEvent,\n HttpHandler,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { HttpErrorFeedbackAlert } from '@koalarx/ui/shared/utils';\nimport { Observable } from 'rxjs/internal/Observable';\nimport { tap } from 'rxjs/internal/operators/tap';\n\n@Injectable()\nexport class FeedbackRequestInterceptor implements AngularHttpInterceptor {\n private readonly httpError = inject(HttpErrorFeedbackAlert);\n\n intercept(\n request: HttpRequest<any>,\n next: HttpHandler\n ): Observable<HttpEvent<any>> {\n return next.handle(request.clone()).pipe(\n tap({\n error: (error) => this.httpError.tapError(error),\n })\n );\n }\n}\n","import { Translation } from './translation.model';\n\nexport const en: Translation = {\n confirm: {\n btnLabelYes: 'Yes',\n btnLabelNo: 'No',\n },\n codeViewer: {\n copyToClipboard: 'Copy to clipboard',\n copiedToClipboard: 'Copied to clipboard',\n },\n form: {\n required: 'This field is required.',\n invalidEmail: 'Invalid email address',\n invalidMinLength: (minLength: number) =>\n `The field must have at least ${minLength} characters.`,\n invalidCPF: 'Invalid CPF',\n invalidCNPJ: 'Invalid CNPJ',\n invalidURL: 'Invalid URL',\n invalidPasswordHasSpecialCharacters:\n 'The password must contain special characters.',\n invalidPasswordHasLowercase: 'The password must contain lowercase letters.',\n invalidPasswordHasUppercase: 'The password must contain uppercase letters.',\n invalidPasswordHasNumber: 'The password must contain numbers.',\n invalidConfirmPassword: 'The confirmation password does not match.',\n },\n onThisPage: {\n title: 'On this page',\n },\n datatable: {\n btnFilterLabel: 'Filter',\n clearFilterTooltip: 'Clear filters',\n addFilterTooltip: 'Add filter',\n reloadListTooltip: 'Reload data',\n labelItemsPerPage: 'Items per page limit',\n loadMoreBtnLabel: 'Load more',\n paginatorPagesFeedback: (currentPage: number, lastPage: number) =>\n `Page ${currentPage} of ${lastPage}`,\n },\n feedbackRequestInterceptor: {\n '400': 'An error occurred related to the submitted data',\n '401': 'Unauthorized access, please log in again.',\n '403': 'Access denied.',\n '404': 'No record found from the provided data.',\n '409': 'This record already exists',\n '422': 'Validation error in the submitted data.',\n '500': 'Please contact our support via WhatsApp.',\n '0': 'We identified an instability in communication with our server, this may occur due to rapid internet drops, slow connection, or server overload, please try again.',\n unknowError: 'An unknown error occurred, please try again.',\n },\n};\n","import { Translation } from './translation.model';\n\nexport const ptBr: Translation = {\n confirm: {\n btnLabelYes: 'Sim',\n btnLabelNo: 'Não',\n },\n codeViewer: {\n copyToClipboard: 'Copiar',\n copiedToClipboard: 'Copiado',\n },\n form: {\n required: 'O campo é obrigatório.',\n invalidEmail: 'E-mail inválido',\n invalidMinLength: (minLength: number) =>\n `O campo deve ter no mínimo ${minLength} caracteres.`,\n invalidCPF: 'CPF inválido',\n invalidCNPJ: 'CNPJ inválido',\n invalidURL: 'URL inválida',\n invalidPasswordHasSpecialCharacters:\n 'A senha deve conter caracteres especiais.',\n invalidPasswordHasLowercase: 'A senha deve conter letras minúsculas.',\n invalidPasswordHasUppercase: 'A senha deve conter letras maiúsculas.',\n invalidPasswordHasNumber: 'A senha deve conter números.',\n invalidConfirmPassword: 'A confirmação da senha não confere.',\n },\n onThisPage: {\n title: 'Nesta página',\n },\n datatable: {\n btnFilterLabel: 'Filtro',\n clearFilterTooltip: 'Limpar filtros',\n addFilterTooltip: 'Adicionar filtro',\n reloadListTooltip: 'Recarregar dados',\n labelItemsPerPage: 'Limite de itens por carregamento',\n loadMoreBtnLabel: 'Carregar mais',\n paginatorPagesFeedback: (currentPage: number, lastPage: number) =>\n `Página ${currentPage} de ${lastPage}`,\n },\n feedbackRequestInterceptor: {\n '400': 'Ocorreu um erro relacionado aos dados enviados',\n '401': 'Acesso não autorizado, por favor, faça login novamente.',\n '403': 'Acesso negado.',\n '404': 'Nenhum registro encontrado a partir dos dados informados.',\n '409': 'Este registro já existe',\n '422': 'Erro de validação nos dados enviados.',\n '500': 'Entre em contato com nosso suporte pelo canal do whatsapp.',\n '0': 'Identificamos uma instabilidade na comunicação com nosso servidor, isto pode ocorrer devido a rápidas quedas de internet, conexão lenta ou sobrecarga no servidor, por favor, tente novamente.',\n unknowError: 'Ocorreu um erro desconhecido, por favor, tente novamente.',\n },\n};\n","import { en } from './en';\nimport { ptBr } from './ptbr';\nimport { Translation } from './translation.model';\n\nexport type KoalaLanguage = 'en' | 'ptBr';\n\nexport function getTranslationByLanguage(language: KoalaLanguage): Translation {\n switch (language) {\n case 'en':\n return en;\n case 'ptBr':\n return ptBr;\n }\n}\n","import {\n HTTP_INTERCEPTORS,\n HttpClient,\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { Provider } from '@angular/core';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport { HttpClientErrorsMiddleware } from '@koalarx/ui/core/middlewares';\nimport { MARKED_OPTIONS, provideMarkdown } from 'ngx-markdown';\nimport { NgxMaskConfig, provideEnvironmentNgxMask } from 'ngx-mask';\nimport { FeedbackRequestInterceptor } from './interceptors/feedback-request-interceptor';\nimport { getTranslationByLanguage, KoalaLanguage } from './translations';\n\nconst maskOptions: Partial<NgxMaskConfig> = {\n validation: false,\n thousandSeparator: '.',\n};\n\ninterface KoalaSettings {\n hostApi?: string;\n language?: KoalaLanguage;\n httpClientErrorsMiddleware?: HttpClientErrorsMiddleware;\n}\n\nexport function provideKoala(config?: KoalaSettings): Provider {\n const appConfig = new AppConfig();\n\n appConfig.language = config?.language ?? 'en';\n appConfig.translation = getTranslationByLanguage(config?.language ?? 'en');\n appConfig.hostApi = config?.hostApi;\n appConfig.httpClientErrorsMiddleware = config?.httpClientErrorsMiddleware;\n\n return [\n provideEnvironmentNgxMask(maskOptions),\n provideHttpClient(withInterceptorsFromDi()),\n provideMarkdown({\n loader: HttpClient,\n markedOptions: {\n provide: MARKED_OPTIONS,\n useValue: {\n gfm: true,\n breaks: true,\n pedantic: false,\n },\n },\n }),\n {\n provide: HTTP_INTERCEPTORS,\n useClass: FeedbackRequestInterceptor,\n multi: true,\n },\n {\n provide: AppConfig,\n useValue: appConfig,\n },\n ];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"koalarx-ui.mjs","sources":["../../projects/koala-ui/core/interceptors/authorization-interceptor.ts","../../projects/koala-ui/core/interceptors/feedback-request-interceptor.ts","../../projects/koala-ui/core/koala-provider.ts","../../projects/koala-ui/koalarx-ui.ts"],"sourcesContent":["import {\n HttpInterceptor as AngularHttpInterceptor,\n HttpEvent,\n HttpHandler,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport { Authorization } from '@koalarx/ui/shared/services';\nimport { Observable } from 'rxjs/internal/Observable';\nimport { switchMap } from 'rxjs/internal/operators/switchMap';\n\n@Injectable()\nexport class AuthorizationInterceptor implements AngularHttpInterceptor {\n private readonly authorization = inject(Authorization);\n private readonly authConfig = inject(AppConfig).authConfig;\n\n private setAuthorization(request: HttpRequest<any>) {\n if (this.authorization.hasToken()) {\n return request.clone({\n headers: request.headers.set(\n 'Authorization',\n `Bearer ${\n request.url === this.authConfig?.refreshToken?.url\n ? this.authorization.refreshToken\n : this.authorization.accessToken\n }`\n ),\n });\n }\n\n return request.clone();\n }\n\n intercept(\n request: HttpRequest<any>,\n next: HttpHandler\n ): Observable<HttpEvent<any>> {\n const clonedReq = this.setAuthorization(request);\n\n if (\n this.authorization.hasToken() &&\n this.authorization.isExpired() &&\n !this.authConfig?.refreshToken?.url\n ) {\n return this.authorization\n .updateToken()\n .pipe(switchMap(() => next.handle(this.setAuthorization(request))));\n }\n\n return next.handle(clonedReq);\n }\n}\n","import {\n HttpInterceptor as AngularHttpInterceptor,\n HttpEvent,\n HttpHandler,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { HttpErrorFeedbackAlert } from '@koalarx/ui/shared/utils';\nimport { Observable } from 'rxjs/internal/Observable';\nimport { tap } from 'rxjs/internal/operators/tap';\n\n@Injectable()\nexport class FeedbackRequestInterceptor implements AngularHttpInterceptor {\n private readonly httpError = inject(HttpErrorFeedbackAlert);\n\n intercept(\n request: HttpRequest<any>,\n next: HttpHandler\n ): Observable<HttpEvent<any>> {\n return next.handle(request.clone()).pipe(\n tap({\n error: (error) => this.httpError.tapError(error),\n })\n );\n }\n}\n","import {\n HTTP_INTERCEPTORS,\n HttpClient,\n HttpInterceptor,\n provideHttpClient,\n withInterceptorsFromDi,\n} from '@angular/common/http';\nimport { Provider } from '@angular/core';\nimport { AppConfig } from '@koalarx/ui/core/config';\nimport { HttpClientErrorsMiddleware } from '@koalarx/ui/core/middlewares';\nimport { AuthConfig } from '@koalarx/ui/core/models';\nimport {\n getTranslationByLanguage,\n KoalaLanguage,\n} from '@koalarx/ui/core/translations';\nimport { MARKED_OPTIONS, provideMarkdown } from 'ngx-markdown';\nimport { NgxMaskConfig, provideEnvironmentNgxMask } from 'ngx-mask';\nimport { AuthorizationInterceptor } from './interceptors/authorization-interceptor';\nimport { FeedbackRequestInterceptor } from './interceptors/feedback-request-interceptor';\n\nconst maskOptions: Partial<NgxMaskConfig> = {\n validation: false,\n thousandSeparator: '.',\n};\n\ninterface KoalaSettings {\n hostApi?: string;\n language?: KoalaLanguage;\n httpClientErrorsMiddleware?: HttpClientErrorsMiddleware;\n authConfig: AuthConfig;\n authorizationInterceptor?: HttpInterceptor;\n}\n\nexport function provideKoala(config?: KoalaSettings): Provider {\n const appConfig = new AppConfig();\n\n appConfig.language = config?.language ?? 'en';\n appConfig.translation = getTranslationByLanguage(config?.language ?? 'en');\n appConfig.hostApi = config?.hostApi;\n appConfig.httpClientErrorsMiddleware = config?.httpClientErrorsMiddleware;\n appConfig.authConfig = config?.authConfig;\n\n const providers: Provider = [\n provideEnvironmentNgxMask(maskOptions),\n provideHttpClient(withInterceptorsFromDi()),\n provideMarkdown({\n loader: HttpClient,\n markedOptions: {\n provide: MARKED_OPTIONS,\n useValue: {\n gfm: true,\n breaks: true,\n pedantic: false,\n },\n },\n }),\n {\n provide: HTTP_INTERCEPTORS,\n useClass: FeedbackRequestInterceptor,\n multi: true,\n },\n {\n provide: AppConfig,\n useValue: appConfig,\n },\n ];\n\n if (config?.authConfig) {\n providers.push({\n provide: HTTP_INTERCEPTORS,\n useClass: config?.authorizationInterceptor ?? AuthorizationInterceptor,\n multi: true,\n });\n }\n\n return providers;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,12 +1,15 @@
1
+ import { HttpInterceptor } from '@angular/common/http';
1
2
  import { Provider } from '@angular/core';
2
3
  import { HttpClientErrorsMiddleware } from '@koalarx/ui/core/middlewares';
3
-
4
- type KoalaLanguage = 'en' | 'ptBr';
4
+ import { AuthConfig } from '@koalarx/ui/core/models';
5
+ import { KoalaLanguage } from '@koalarx/ui/core/translations';
5
6
 
6
7
  interface KoalaSettings {
7
8
  hostApi?: string;
8
9
  language?: KoalaLanguage;
9
10
  httpClientErrorsMiddleware?: HttpClientErrorsMiddleware;
11
+ authConfig: AuthConfig;
12
+ authorizationInterceptor?: HttpInterceptor;
10
13
  }
11
14
  declare function provideKoala(config?: KoalaSettings): Provider;
12
15
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koalarx/ui",
3
- "version": "20.0.47",
3
+ "version": "20.1.2",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=20.0.0",
6
6
  "@angular/core": ">=20.0.0"
@@ -66,6 +66,10 @@
66
66
  "types": "./core/config/index.d.ts",
67
67
  "default": "./fesm2022/koalarx-ui-core-config.mjs"
68
68
  },
69
+ "./core/guards": {
70
+ "types": "./core/guards/index.d.ts",
71
+ "default": "./fesm2022/koalarx-ui-core-guards.mjs"
72
+ },
69
73
  "./core/middlewares": {
70
74
  "types": "./core/middlewares/index.d.ts",
71
75
  "default": "./fesm2022/koalarx-ui-core-middlewares.mjs"
@@ -82,6 +86,10 @@
82
86
  "types": "./shared/directives/index.d.ts",
83
87
  "default": "./fesm2022/koalarx-ui-shared-directives.mjs"
84
88
  },
89
+ "./shared/services": {
90
+ "types": "./shared/services/index.d.ts",
91
+ "default": "./fesm2022/koalarx-ui-shared-services.mjs"
92
+ },
85
93
  "./shared/utils": {
86
94
  "types": "./shared/utils/index.d.ts",
87
95
  "default": "./fesm2022/koalarx-ui-shared-utils.mjs"
@@ -4,6 +4,7 @@ declare class ConfirmContent {
4
4
  readonly translations: {
5
5
  btnLabelYes: string;
6
6
  btnLabelNo: string;
7
+ askAreYouSureMessage: string;
7
8
  };
8
9
  private readonly dialogRef;
9
10
  message: string;
@@ -0,0 +1,34 @@
1
+ import * as rxjs from 'rxjs';
2
+ import * as _angular_core from '@angular/core';
3
+
4
+ declare class Authorization<TUser = any> {
5
+ private readonly appConfig;
6
+ private readonly translation;
7
+ private readonly authConfig;
8
+ private _accessToken;
9
+ private _refreshToken;
10
+ private _isAuthenticated;
11
+ private _userinfo;
12
+ private readonly router;
13
+ private readonly http;
14
+ private readonly confirm;
15
+ get accessToken(): string | null;
16
+ set accessToken(accessToken: string | null);
17
+ get refreshToken(): string | null;
18
+ set refreshToken(refreshToken: string | null);
19
+ get isAuthenticated(): _angular_core.Signal<boolean>;
20
+ get userinfo(): _angular_core.Signal<TUser | null>;
21
+ get isExpired(): _angular_core.Signal<boolean>;
22
+ get hasToken(): _angular_core.Signal<boolean>;
23
+ constructor();
24
+ private init;
25
+ private updateAuthState;
26
+ private logoutUser;
27
+ private loadUserInfo;
28
+ logout(force?: boolean): void;
29
+ updateToken(): rxjs.Observable<any>;
30
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Authorization<any>, never>;
31
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<Authorization<any>>;
32
+ }
33
+
34
+ export { Authorization };
@@ -0,0 +1,3 @@
1
+ {
2
+ "module": "../../fesm2022/koalarx-ui-shared-services.mjs"
3
+ }