@sd-angular/core 19.0.35 → 19.0.38

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.
Files changed (82) hide show
  1. package/README.md +2 -4
  2. package/components/index.d.ts +1 -0
  3. package/components/query-builder/src/query-builder.model.d.ts +1 -1
  4. package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts +1 -1
  5. package/components/table/src/table.component.d.ts +1 -1
  6. package/components/timeline/index.d.ts +2 -0
  7. package/components/{history/models/history.model.d.ts → timeline/models/timeline.model.d.ts} +1 -1
  8. package/components/timeline/src/timeline.component.d.ts +7 -0
  9. package/configurations/src/sd-core.configuration.d.ts +0 -1
  10. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
  11. package/fesm2022/sd-angular-core-components-query-bar.mjs +8 -8
  12. package/fesm2022/sd-angular-core-components-query-bar.mjs.map +1 -1
  13. package/fesm2022/sd-angular-core-components-query-builder.mjs +2 -2
  14. package/fesm2022/sd-angular-core-components-query-builder.mjs.map +1 -1
  15. package/fesm2022/sd-angular-core-components-tab-router.mjs +11 -5
  16. package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
  17. package/fesm2022/sd-angular-core-components-table.mjs +110 -39
  18. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  19. package/fesm2022/sd-angular-core-components-timeline.mjs +49 -0
  20. package/fesm2022/sd-angular-core-components-timeline.mjs.map +1 -0
  21. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  22. package/fesm2022/sd-angular-core-components.mjs +1 -0
  23. package/fesm2022/sd-angular-core-components.mjs.map +1 -1
  24. package/fesm2022/sd-angular-core-configurations.mjs.map +1 -1
  25. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +1 -1
  26. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  27. package/fesm2022/sd-angular-core-forms-date-range.mjs +1 -1
  28. package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
  29. package/fesm2022/sd-angular-core-forms-date.mjs +1 -1
  30. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  31. package/fesm2022/sd-angular-core-forms-datetime.mjs +1 -1
  32. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  33. package/fesm2022/sd-angular-core-forms-inline-text.mjs +1 -1
  34. package/fesm2022/sd-angular-core-forms-inline-text.mjs.map +1 -1
  35. package/fesm2022/sd-angular-core-forms-input-color.mjs +1 -1
  36. package/fesm2022/sd-angular-core-forms-input-color.mjs.map +1 -1
  37. package/fesm2022/sd-angular-core-forms-input-number.mjs +1 -1
  38. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  39. package/fesm2022/sd-angular-core-forms-input.mjs +1 -1
  40. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  41. package/fesm2022/sd-angular-core-forms-select.mjs +1 -1
  42. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  43. package/fesm2022/sd-angular-core-i18n.mjs +10 -10
  44. package/fesm2022/sd-angular-core-i18n.mjs.map +1 -1
  45. package/fesm2022/sd-angular-core-modules-auth.mjs +35 -3
  46. package/fesm2022/sd-angular-core-modules-auth.mjs.map +1 -1
  47. package/fesm2022/sd-angular-core-modules-authom.mjs +847 -241
  48. package/fesm2022/sd-angular-core-modules-authom.mjs.map +1 -1
  49. package/fesm2022/sd-angular-core-modules-layout.mjs +4 -4
  50. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  51. package/fesm2022/sd-angular-core-services-cache.mjs +1 -1
  52. package/fesm2022/sd-angular-core-services-cache.mjs.map +1 -1
  53. package/fesm2022/sd-angular-core-services-confirm.mjs +2 -2
  54. package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
  55. package/fesm2022/sd-angular-core-services-storage.mjs.map +1 -1
  56. package/i18n/src/en.d.ts +1 -1
  57. package/modules/authom/authom.auth-configuration.d.ts +18 -0
  58. package/modules/authom/authom.configuration.d.ts +158 -2
  59. package/modules/authom/authom.event.d.ts +44 -0
  60. package/modules/authom/authom.guard.d.ts +13 -0
  61. package/modules/authom/authom.interceptor.d.ts +7 -1
  62. package/modules/authom/authom.module.d.ts +35 -5
  63. package/modules/authom/authom.return-url.d.ts +37 -0
  64. package/modules/authom/authom.service.d.ts +109 -15
  65. package/modules/authom/authom.session-channel.d.ts +26 -0
  66. package/modules/authom/index.d.ts +19 -9
  67. package/package.json +17 -19
  68. package/utilities/extensions/src/string.extension.d.ts +6 -2
  69. package/utilities/models/src/maybe-async.model.d.ts +1 -1
  70. package/components/base/index.d.ts +0 -1
  71. package/components/base/src/base-secure.component.d.ts +0 -8
  72. package/components/history/index.d.ts +0 -1
  73. package/components/history/src/history.component.d.ts +0 -7
  74. package/fesm2022/sd-angular-core-components-base.mjs +0 -23
  75. package/fesm2022/sd-angular-core-components-base.mjs.map +0 -1
  76. package/fesm2022/sd-angular-core-components-history.mjs +0 -51
  77. package/fesm2022/sd-angular-core-components-history.mjs.map +0 -1
  78. package/fesm2022/sd-angular-core-services-license.mjs +0 -97
  79. package/fesm2022/sd-angular-core-services-license.mjs.map +0 -1
  80. package/services/license/index.d.ts +0 -1
  81. package/services/license/src/license.service.d.ts +0 -9
  82. /package/components/{history → timeline}/pipes/view-date.pipe.d.ts +0 -0
@@ -1,12 +1,44 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, signal, Injectable } from '@angular/core';
3
- import { Subject } from 'rxjs';
4
- import { normalizeAsync, resolveMaybeAsync } from '@sdcorejs/utils/models';
3
+ import { isObservable, from, Observable, of, Subject } from 'rxjs';
4
+ import { isPromiseLike, isSubscribableLike, resolveMaybeAsync } from '@sdcorejs/utils/models';
5
5
  import { toSignal } from '@angular/core/rxjs-interop';
6
6
  import { Router } from '@angular/router';
7
7
 
8
8
  const SD_AUTH_CONFIGURATION = new InjectionToken('sd.auth.configuration');
9
9
 
10
+ /**
11
+ * Chuyển một `MaybeAsync` thành Observable thật của RxJS.
12
+ *
13
+ * why: từ `@sdcorejs/utils` 1.2, `normalizeAsync` trả về một subscribable cấu trúc
14
+ * (`SubscribableLike`) mà teardown có thể là `void`, trong khi `toSignal` đòi
15
+ * `Observable | Subscribable` với teardown là `Unsubscribable`. Bọc lại thay vì rút gọn
16
+ * bằng `resolveMaybeAsync`, để KHÔNG thu về đúng một giá trị đầu tiên: cấu hình nào phát
17
+ * lại mỗi khi claims đổi vẫn phải giữ được tính sống.
18
+ */
19
+ const toObservable = (source) => {
20
+ if (isObservable(source))
21
+ return source;
22
+ if (isPromiseLike(source))
23
+ return from(source);
24
+ if (isSubscribableLike(source)) {
25
+ return new Observable(subscriber => {
26
+ const teardown = source.subscribe({
27
+ next: value => subscriber.next(value),
28
+ error: error => subscriber.error(error),
29
+ complete: () => subscriber.complete(),
30
+ });
31
+ return () => {
32
+ if (typeof teardown === 'function') {
33
+ teardown();
34
+ return;
35
+ }
36
+ teardown?.unsubscribe?.();
37
+ };
38
+ });
39
+ }
40
+ return of(source);
41
+ };
10
42
  class SdAuthService {
11
43
  // Đăng nhập
12
44
  // #signin = new Subject<void>();
@@ -30,7 +62,7 @@ class SdAuthService {
30
62
  email: 'guest@gmail.com',
31
63
  };
32
64
  if (this.authConfiguration?.guard?.authInfo) {
33
- this.getAuthInfo = toSignal(normalizeAsync(this.authConfiguration.guard?.authInfo()), {
65
+ this.getAuthInfo = toSignal(toObservable(this.authConfiguration.guard.authInfo()), {
34
66
  initialValue: defaultUser,
35
67
  });
36
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-modules-auth.mjs","sources":["../../../projects/sd-angular/modules/auth/configurations/auth.configuration.ts","../../../projects/sd-angular/modules/auth/services/auth.service.ts","../../../projects/sd-angular/modules/auth/guards/auth.guard.ts","../../../projects/sd-angular/modules/auth/guards/portal.guard.ts","../../../projects/sd-angular/modules/auth/sd-angular-core-modules-auth.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { MaybeAsync } from '@sdcorejs/utils/models';\nimport { SdAuthInfo } from '../services';\n\nexport interface ISdAuthConfiguration {\n action?: IAuthConfigurationAction;\n guard?: IAuthConfigurationGuard;\n}\n\nexport const SD_AUTH_CONFIGURATION = new InjectionToken<ISdAuthConfiguration>('sd.auth.configuration');\n\ninterface IAuthConfigurationAction {\n signout: () => MaybeAsync<void>;\n changePassword?: () => MaybeAsync<void>;\n}\n\ninterface IAuthConfigurationGuard {\n auth?: CanActivate['canActivate'];\n portal?: CanActivate['canActivate'];\n authInfo: () => MaybeAsync<SdAuthInfo>;\n}\n","import { inject, Injectable, signal, Signal } from '@angular/core';\nimport { from, Observable, Subject } from 'rxjs';\nimport { ISdAuthConfiguration, SD_AUTH_CONFIGURATION } from '../configurations';\nimport { normalizeAsync, resolveMaybeAsync } from '@sdcorejs/utils/models';\nimport { SdAuthInfo } from './auth.model';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAuthService {\n // Đăng nhập\n // #signin = new Subject<void>();\n // signin$?: Observable<void>;\n getAuthInfo?: Signal<SdAuthInfo | undefined>;\n\n // Đăng xuất\n #signout = new Subject<void>();\n signout$?: Observable<void>;\n\n // Thay đổi mật khẩu\n #changePassword = new Subject<void>();\n changePassword$?: Observable<void>;\n private readonly authConfiguration: ISdAuthConfiguration | null = inject(SD_AUTH_CONFIGURATION, { optional: true });\n\n constructor() {\n // this.#handleSignin();\n this.#handleSignout();\n this.#handleChangePassword();\n const defaultUser = {\n id: 'guest-id',\n username: 'guest',\n firstName: 'Guest',\n email: 'guest@gmail.com',\n };\n if (this.authConfiguration?.guard?.authInfo) {\n this.getAuthInfo = toSignal(normalizeAsync(this.authConfiguration.guard?.authInfo()), {\n initialValue: defaultUser,\n });\n } else {\n this.getAuthInfo = signal(defaultUser);\n }\n }\n\n // #handleSignin = () => {\n // this.signin$ = this.#signin.asObservable();\n // };\n\n #handleSignout = () => {\n this.signout$ = this.#signout.asObservable();\n };\n\n #handleChangePassword = () => {\n this.changePassword$ = this.#changePassword.asObservable();\n };\n signout = () => {\n if (this.authConfiguration?.action?.signout) {\n resolveMaybeAsync(this.authConfiguration.action.signout()).then(() => {\n this.#signout.next();\n });\n }\n };\n\n changePassword = () => {\n if (this.authConfiguration?.action?.changePassword) {\n resolveMaybeAsync(this.authConfiguration.action.changePassword()).then(() => {\n this.#changePassword.next();\n });\n }\n };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { ISdAuthConfiguration, SD_AUTH_CONFIGURATION } from '../configurations';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAuthGuard implements CanActivate {\n private readonly authConfiguration: ISdAuthConfiguration | null = inject(SD_AUTH_CONFIGURATION, { optional: true });\n protected readonly router = inject(Router);\n\n canActivate = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n if (this.authConfiguration?.guard?.auth) {\n return this.authConfiguration.guard.auth(route, state);\n }\n // Nếu chưa tích hợp Auth Guard thì pass canActive\n return true;\n };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { ISdAuthConfiguration, SD_AUTH_CONFIGURATION } from '../configurations';\n\n@Injectable({ providedIn: 'root' })\nexport class SdPortalGuard implements CanActivate {\n private readonly authConfiguration: ISdAuthConfiguration | null = inject(SD_AUTH_CONFIGURATION, { optional: true });\n protected readonly router = inject(Router);\n\n canActivate = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n if (this.authConfiguration?.guard?.portal) {\n return this.authConfiguration.guard.portal(route, state);\n }\n // Nếu chưa tích hợp Portal Guard thì pass canActive\n return true;\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":"sd-angular-core-modules-auth.mjs","sources":["../../../projects/sd-angular/modules/auth/configurations/auth.configuration.ts","../../../projects/sd-angular/modules/auth/services/auth.service.ts","../../../projects/sd-angular/modules/auth/guards/auth.guard.ts","../../../projects/sd-angular/modules/auth/guards/portal.guard.ts","../../../projects/sd-angular/modules/auth/sd-angular-core-modules-auth.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { MaybeAsync } from '@sdcorejs/utils/models';\nimport { SdAuthInfo } from '../services';\n\nexport interface ISdAuthConfiguration {\n action?: IAuthConfigurationAction;\n guard?: IAuthConfigurationGuard;\n}\n\nexport const SD_AUTH_CONFIGURATION = new InjectionToken<ISdAuthConfiguration>('sd.auth.configuration');\n\ninterface IAuthConfigurationAction {\n signout: () => MaybeAsync<void>;\n changePassword?: () => MaybeAsync<void>;\n}\n\ninterface IAuthConfigurationGuard {\n auth?: CanActivate['canActivate'];\n portal?: CanActivate['canActivate'];\n authInfo: () => MaybeAsync<SdAuthInfo>;\n}\n","import { inject, Injectable, signal, Signal } from '@angular/core';\nimport { from, isObservable, Observable, of, Subject } from 'rxjs';\nimport { ISdAuthConfiguration, SD_AUTH_CONFIGURATION } from '../configurations';\nimport { isPromiseLike, isSubscribableLike, MaybeAsync, resolveMaybeAsync, SubscriptionLike } from '@sdcorejs/utils/models';\nimport { SdAuthInfo } from './auth.model';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n/**\n * Chuyển một `MaybeAsync` thành Observable thật của RxJS.\n *\n * why: từ `@sdcorejs/utils` 1.2, `normalizeAsync` trả về một subscribable cấu trúc\n * (`SubscribableLike`) mà teardown có thể là `void`, trong khi `toSignal` đòi\n * `Observable | Subscribable` với teardown là `Unsubscribable`. Bọc lại thay vì rút gọn\n * bằng `resolveMaybeAsync`, để KHÔNG thu về đúng một giá trị đầu tiên: cấu hình nào phát\n * lại mỗi khi claims đổi vẫn phải giữ được tính sống.\n */\nconst toObservable = <T>(source: MaybeAsync<T>): Observable<T> => {\n if (isObservable(source)) return source as Observable<T>;\n if (isPromiseLike<T>(source)) return from(source);\n if (isSubscribableLike<T>(source)) {\n return new Observable<T>(subscriber => {\n const teardown = source.subscribe({\n next: value => subscriber.next(value),\n error: error => subscriber.error(error),\n complete: () => subscriber.complete(),\n });\n return () => {\n if (typeof teardown === 'function') {\n teardown();\n return;\n }\n (teardown as SubscriptionLike | undefined)?.unsubscribe?.();\n };\n });\n }\n return of(source as T);\n};\n\n@Injectable({ providedIn: 'root' })\nexport class SdAuthService {\n // Đăng nhập\n // #signin = new Subject<void>();\n // signin$?: Observable<void>;\n getAuthInfo?: Signal<SdAuthInfo | undefined>;\n\n // Đăng xuất\n #signout = new Subject<void>();\n signout$?: Observable<void>;\n\n // Thay đổi mật khẩu\n #changePassword = new Subject<void>();\n changePassword$?: Observable<void>;\n private readonly authConfiguration: ISdAuthConfiguration | null = inject(SD_AUTH_CONFIGURATION, { optional: true });\n\n constructor() {\n // this.#handleSignin();\n this.#handleSignout();\n this.#handleChangePassword();\n const defaultUser = {\n id: 'guest-id',\n username: 'guest',\n firstName: 'Guest',\n email: 'guest@gmail.com',\n };\n if (this.authConfiguration?.guard?.authInfo) {\n this.getAuthInfo = toSignal(toObservable<SdAuthInfo>(this.authConfiguration.guard.authInfo()), {\n initialValue: defaultUser,\n });\n } else {\n this.getAuthInfo = signal(defaultUser);\n }\n }\n\n // #handleSignin = () => {\n // this.signin$ = this.#signin.asObservable();\n // };\n\n #handleSignout = () => {\n this.signout$ = this.#signout.asObservable();\n };\n\n #handleChangePassword = () => {\n this.changePassword$ = this.#changePassword.asObservable();\n };\n signout = () => {\n if (this.authConfiguration?.action?.signout) {\n resolveMaybeAsync(this.authConfiguration.action.signout()).then(() => {\n this.#signout.next();\n });\n }\n };\n\n changePassword = () => {\n if (this.authConfiguration?.action?.changePassword) {\n resolveMaybeAsync(this.authConfiguration.action.changePassword()).then(() => {\n this.#changePassword.next();\n });\n }\n };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { ISdAuthConfiguration, SD_AUTH_CONFIGURATION } from '../configurations';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAuthGuard implements CanActivate {\n private readonly authConfiguration: ISdAuthConfiguration | null = inject(SD_AUTH_CONFIGURATION, { optional: true });\n protected readonly router = inject(Router);\n\n canActivate = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n if (this.authConfiguration?.guard?.auth) {\n return this.authConfiguration.guard.auth(route, state);\n }\n // Nếu chưa tích hợp Auth Guard thì pass canActive\n return true;\n };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { ISdAuthConfiguration, SD_AUTH_CONFIGURATION } from '../configurations';\n\n@Injectable({ providedIn: 'root' })\nexport class SdPortalGuard implements CanActivate {\n private readonly authConfiguration: ISdAuthConfiguration | null = inject(SD_AUTH_CONFIGURATION, { optional: true });\n protected readonly router = inject(Router);\n\n canActivate = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n if (this.authConfiguration?.guard?.portal) {\n return this.authConfiguration.guard.portal(route, state);\n }\n // Nếu chưa tích hợp Portal Guard thì pass canActive\n return true;\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}