@acorex-platform/module-auth-client 0.0.33 → 0.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/fesm2022/{acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs → acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs} +275 -92
  2. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs.map +1 -0
  3. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-TPCkYJej.mjs → acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs} +5 -5
  4. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-TPCkYJej.mjs.map → acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs.map} +1 -1
  5. package/fesm2022/acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs.map +1 -1
  6. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-DHwnPkUO.mjs → acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs} +2 -2
  7. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-DHwnPkUO.mjs.map → acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs.map} +1 -1
  8. package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-BZK_W29M.mjs → acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs} +2 -2
  9. package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-BZK_W29M.mjs.map → acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs.map} +1 -1
  10. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs +63 -1
  11. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs.map +1 -1
  12. package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-module-auth-client-edit-signature.command-TjOLhvKL.mjs.map +1 -1
  14. package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-DBdELID4.mjs → acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs} +2 -2
  15. package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-DBdELID4.mjs.map → acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs.map} +1 -1
  16. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs → acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs} +2 -2
  17. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs.map → acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs.map} +1 -1
  18. package/fesm2022/{acorex-platform-module-auth-client-login.module-DushGqH6.mjs → acorex-platform-module-auth-client-login.module-CXl61yOu.mjs} +3 -3
  19. package/fesm2022/{acorex-platform-module-auth-client-login.module-DushGqH6.mjs.map → acorex-platform-module-auth-client-login.module-CXl61yOu.mjs.map} +1 -1
  20. package/fesm2022/{acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs → acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs} +4 -4
  21. package/fesm2022/{acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs.map → acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs.map} +1 -1
  22. package/fesm2022/acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs.map +1 -1
  23. package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs → acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs} +3 -3
  24. package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs.map → acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs.map} +1 -1
  25. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs +265 -0
  26. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs.map +1 -0
  27. package/fesm2022/{acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs → acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs} +3 -3
  28. package/fesm2022/{acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs.map → acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs.map} +1 -1
  29. package/fesm2022/{acorex-platform-module-auth-client-password.component-D5QDAaKY.mjs → acorex-platform-module-auth-client-password.component-BoWDVby5.mjs} +10 -5
  30. package/fesm2022/acorex-platform-module-auth-client-password.component-BoWDVby5.mjs.map +1 -0
  31. package/fesm2022/acorex-platform-module-auth-client-pin-code.constants-CRsFG7fg.mjs.map +1 -1
  32. package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BEVkQ3jh.mjs → acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs} +4 -4
  33. package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BEVkQ3jh.mjs.map → acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs.map} +1 -1
  34. package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-o7Eq3zuR.mjs → acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs} +4 -4
  35. package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-o7Eq3zuR.mjs.map → acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs.map} +1 -1
  36. package/fesm2022/acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs.map +1 -1
  37. package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-D0QS8joQ.mjs → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs} +3 -3
  38. package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-D0QS8joQ.mjs.map → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs.map} +1 -1
  39. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-CfQySdD8.mjs → acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs} +4 -4
  40. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-CfQySdD8.mjs.map → acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs.map} +1 -1
  41. package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-CPHQXCpS.mjs → acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs} +7 -7
  42. package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-CPHQXCpS.mjs.map → acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs.map} +1 -1
  43. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BMHOG5m4.mjs → acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs} +4 -4
  44. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BMHOG5m4.mjs.map → acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs.map} +1 -1
  45. package/fesm2022/{acorex-platform-module-auth-client-register.module-CFIHZOYj.mjs → acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs} +4 -4
  46. package/fesm2022/{acorex-platform-module-auth-client-register.module-CFIHZOYj.mjs.map → acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs.map} +1 -1
  47. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-CdlJF48g.mjs → acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs} +2 -2
  48. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-CdlJF48g.mjs.map → acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs.map} +1 -1
  49. package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-CcwDb6Wb.mjs → acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs} +3 -3
  50. package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-CcwDb6Wb.mjs.map → acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs.map} +1 -1
  51. package/fesm2022/{acorex-platform-module-auth-client-result.component-DWv1hmQR.mjs → acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs} +2 -2
  52. package/fesm2022/{acorex-platform-module-auth-client-result.component-DWv1hmQR.mjs.map → acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs.map} +1 -1
  53. package/fesm2022/{acorex-platform-module-auth-client-routes-IX2qmeqU.mjs → acorex-platform-module-auth-client-routes-B6iJHJ60.mjs} +3 -3
  54. package/fesm2022/{acorex-platform-module-auth-client-routes-IX2qmeqU.mjs.map → acorex-platform-module-auth-client-routes-B6iJHJ60.mjs.map} +1 -1
  55. package/fesm2022/acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs +195 -0
  56. package/fesm2022/acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs.map +1 -0
  57. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-CcGFA6Op.mjs → acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs} +5 -5
  58. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-CcGFA6Op.mjs.map → acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs.map} +1 -1
  59. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-BSZhRCN7.mjs → acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs} +3 -3
  60. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-BSZhRCN7.mjs.map → acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs.map} +1 -1
  61. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-Bm32dRFz.mjs → acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs} +5 -5
  62. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-Bm32dRFz.mjs.map → acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs.map} +1 -1
  63. package/fesm2022/{acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs → acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs} +27 -25
  64. package/fesm2022/acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs.map +1 -0
  65. package/fesm2022/acorex-platform-module-auth-client-show-profile-command-BWoDxIdx.mjs.map +1 -1
  66. package/fesm2022/acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs.map +1 -1
  67. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-DKTvZ1-I.mjs → acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs} +5 -5
  68. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-DKTvZ1-I.mjs.map → acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs.map} +1 -1
  69. package/fesm2022/{acorex-platform-module-auth-client-two-factor-code.component-nsB4v25Z.mjs → acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs} +3 -3
  70. package/fesm2022/{acorex-platform-module-auth-client-two-factor-code.component-nsB4v25Z.mjs.map → acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs.map} +1 -1
  71. package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-BnH72Bob.mjs → acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs} +2 -2
  72. package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-BnH72Bob.mjs.map → acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs.map} +1 -1
  73. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-CWmD9wNM.mjs → acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs} +2 -2
  74. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-CWmD9wNM.mjs.map → acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs.map} +1 -1
  75. package/fesm2022/acorex-platform-module-auth-client.mjs +1 -1
  76. package/package.json +2 -2
  77. package/types/acorex-platform-module-auth-client-contracts.d.ts +30 -2
  78. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs.map +0 -1
  79. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-BHAf7500.mjs +0 -190
  80. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-BHAf7500.mjs.map +0 -1
  81. package/fesm2022/acorex-platform-module-auth-client-password.component-D5QDAaKY.mjs.map +0 -1
  82. package/fesm2022/acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-get-user-activity.query-DBdELID4.mjs","sources":["../../../../libs/modules/auth/client/src/lib/features/queries/get-user-activity.query.ts"],"sourcesContent":["import {\n runtimeQueryFailure,\n runtimeQuerySuccessObject,\n} from '@acorex-platform/framework-shared/core';\nimport type { AXPQuery, AXPQueryFetchResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXDataSourceFilterOption } from '@acorex/cdk/common';\nimport {\n AXMSecurityManagementDeviceSessionsEntityModel,\n RootConfig as SecurityManagementRootConfig,\n} from '@acorex-platform/module-security-management-client/contracts';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\n\nimport { Injectable, inject } from '@angular/core';\nimport { isEmpty } from 'lodash';\n\nimport {\n AXPUserActivityDataSourceItem,\n AXPUserActivityLoadParams,\n} from '../../shared/datasources/user-activity/user-activity.types';\nimport {\n buildUserActivityDataSourceItem,\n resolveDefaultUserActivityDateRange,\n resolveSmartUserActivityDateRange,\n} from '../../shared/datasources/user-activity/user-activity.utils';\n\n//#region ---- Types ----\n\nexport interface AXMGetUserActivityQueryInput {\n userId: string;\n startDate?: string | Date;\n endDate?: string | Date;\n}\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction coerceDate(value: string | Date | undefined, fallback: Date): Date {\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed;\n }\n }\n return fallback;\n}\n\n//#endregion\n\n//#region ---- Query ----\n\n/**\n * User activity heatmap — replaces the `auth-user-activity` DI data source.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMGetUserActivityQuery\n implements AXPQuery<AXMGetUserActivityQueryInput, AXPUserActivityDataSourceItem | null>\n{\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n\n //#endregion\n\n //#region ---- Query Execution ----\n\n async fetch(\n input?: AXMGetUserActivityQueryInput | null,\n ): AXPQueryFetchResultPromise<AXPUserActivityDataSourceItem | null> {\n try {\n if (isEmpty(input?.userId)) {\n return runtimeQuerySuccessObject(null);\n }\n\n const sessions = await this.loadUserSessions(input!.userId);\n let range: { startDate: Date; endDate: Date };\n if (input?.startDate != null && input?.endDate != null) {\n const fallback = resolveDefaultUserActivityDateRange();\n range = {\n startDate: coerceDate(input.startDate, fallback.startDate),\n endDate: coerceDate(input.endDate, fallback.endDate),\n };\n } else {\n range = resolveSmartUserActivityDateRange(sessions, input!.userId);\n }\n const params: AXPUserActivityLoadParams = {\n userId: input!.userId,\n startDate: range.startDate,\n endDate: range.endDate,\n };\n\n const item = buildUserActivityDataSourceItem(params, sessions);\n return runtimeQuerySuccessObject(item);\n } catch (error) {\n return runtimeQueryFailure(\n error instanceof Error ? error.message : 'Unknown error occurred',\n );\n }\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private async loadUserSessions(\n userId: string,\n ): Promise<AXMSecurityManagementDeviceSessionsEntityModel[]> {\n const response = await this.entityService\n .withEntity(\n SecurityManagementRootConfig.module.name,\n SecurityManagementRootConfig.entities.deviceSessions.name,\n )\n .data<string, AXMSecurityManagementDeviceSessionsEntityModel>()\n .query({\n skip: 0,\n take: 1000,\n filter: {\n field: 'userId',\n operator: { type: 'equal' },\n value: userId,\n } as AXDataSourceFilterOption,\n });\n\n return response.items ?? [];\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":["SecurityManagementRootConfig"],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs","sources":["../../../../libs/modules/auth/client/src/lib/features/queries/get-user-activity.query.ts"],"sourcesContent":["import {\n runtimeQueryFailure,\n runtimeQuerySuccessObject,\n} from '@acorex-platform/framework-shared/core';\nimport type { AXPQuery, AXPQueryFetchResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXDataSourceFilterOption } from '@acorex/cdk/common';\nimport {\n AXMSecurityManagementDeviceSessionsEntityModel,\n RootConfig as SecurityManagementRootConfig,\n} from '@acorex-platform/module-security-management-client/contracts';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\n\nimport { Injectable, inject } from '@angular/core';\nimport { isEmpty } from 'lodash';\n\nimport {\n AXPUserActivityDataSourceItem,\n AXPUserActivityLoadParams,\n} from '../../shared/datasources/user-activity/user-activity.types';\nimport {\n buildUserActivityDataSourceItem,\n resolveDefaultUserActivityDateRange,\n resolveSmartUserActivityDateRange,\n} from '../../shared/datasources/user-activity/user-activity.utils';\n\n//#region ---- Types ----\n\nexport interface AXMGetUserActivityQueryInput {\n userId: string;\n startDate?: string | Date;\n endDate?: string | Date;\n}\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction coerceDate(value: string | Date | undefined, fallback: Date): Date {\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed;\n }\n }\n return fallback;\n}\n\n//#endregion\n\n//#region ---- Query ----\n\n/**\n * User activity heatmap — replaces the `auth-user-activity` DI data source.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMGetUserActivityQuery\n implements AXPQuery<AXMGetUserActivityQueryInput, AXPUserActivityDataSourceItem | null>\n{\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n\n //#endregion\n\n //#region ---- Query Execution ----\n\n async fetch(\n input?: AXMGetUserActivityQueryInput | null,\n ): AXPQueryFetchResultPromise<AXPUserActivityDataSourceItem | null> {\n try {\n if (isEmpty(input?.userId)) {\n return runtimeQuerySuccessObject(null);\n }\n\n const sessions = await this.loadUserSessions(input!.userId);\n let range: { startDate: Date; endDate: Date };\n if (input?.startDate != null && input?.endDate != null) {\n const fallback = resolveDefaultUserActivityDateRange();\n range = {\n startDate: coerceDate(input.startDate, fallback.startDate),\n endDate: coerceDate(input.endDate, fallback.endDate),\n };\n } else {\n range = resolveSmartUserActivityDateRange(sessions, input!.userId);\n }\n const params: AXPUserActivityLoadParams = {\n userId: input!.userId,\n startDate: range.startDate,\n endDate: range.endDate,\n };\n\n const item = buildUserActivityDataSourceItem(params, sessions);\n return runtimeQuerySuccessObject(item);\n } catch (error) {\n return runtimeQueryFailure(\n error instanceof Error ? error.message : 'Unknown error occurred',\n );\n }\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private async loadUserSessions(\n userId: string,\n ): Promise<AXMSecurityManagementDeviceSessionsEntityModel[]> {\n const response = await this.entityService\n .withEntity(\n SecurityManagementRootConfig.module.name,\n SecurityManagementRootConfig.entities.deviceSessions.name,\n )\n .data<string, AXMSecurityManagementDeviceSessionsEntityModel>()\n .query({\n skip: 0,\n take: 1000,\n filter: {\n field: 'userId',\n operator: { type: 'equal' },\n value: userId,\n } as AXDataSourceFilterOption,\n });\n\n return response.items ?? [];\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":["SecurityManagementRootConfig"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, Injectable } from '@angular/core';
3
- import { j as AXPIdleLockService } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs';
3
+ import { j as AXPIdleLockService } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs';
4
4
 
5
5
  //#region ---- Lock screen command ----
6
6
  /** Locks the session overlay when Lock When Idle is enabled. */
@@ -27,4 +27,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
27
27
  }] });
28
28
 
29
29
  export { AXPLockScreenCommand };
30
- //# sourceMappingURL=acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs.map
30
+ //# sourceMappingURL=acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs","sources":["../../../../libs/modules/auth/client/src/lib/commands/lock-screen.command.ts"],"sourcesContent":["import { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXPIdleLockService } from '../shared/services/idle-lock.service';\n\n//#region ---- Lock screen command ----\n\n/** Locks the session overlay when Lock When Idle is enabled. */\n@Injectable({ providedIn: 'root' })\nexport class AXPLockScreenCommand implements AXPCommand {\n //#region ---- Services & Dependencies ----\n\n private readonly idleLockService = inject(AXPIdleLockService);\n\n //#endregion\n\n //#region ---- Command ----\n\n async execute(): AXPCommandExecuteResultPromise<void> {\n await this.idleLockService.refreshLockState();\n\n if (this.idleLockService.canLock()) {\n this.idleLockService.lockScreen();\n }\n\n return { success: true, kind: 'object', data: undefined };\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;AAMA;AAEA;MAEa,oBAAoB,CAAA;AADjC,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAiB9D,IAAA;;;AAXC,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;AAE7C,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE;AAClC,YAAA,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;QACnC;AAEA,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;IAC3D;8GAjBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA,CAAA;;2FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;;;"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs","sources":["../../../../libs/modules/auth/client/src/lib/commands/lock-screen.command.ts"],"sourcesContent":["import { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXPIdleLockService } from '../shared/services/idle-lock.service';\n\n//#region ---- Lock screen command ----\n\n/** Locks the session overlay when Lock When Idle is enabled. */\n@Injectable({ providedIn: 'root' })\nexport class AXPLockScreenCommand implements AXPCommand {\n //#region ---- Services & Dependencies ----\n\n private readonly idleLockService = inject(AXPIdleLockService);\n\n //#endregion\n\n //#region ---- Command ----\n\n async execute(): AXPCommandExecuteResultPromise<void> {\n await this.idleLockService.refreshLockState();\n\n if (this.idleLockService.canLock()) {\n this.idleLockService.lockScreen();\n }\n\n return { success: true, kind: 'object', data: undefined };\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;AAMA;AAEA;MAEa,oBAAoB,CAAA;AADjC,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAiB9D,IAAA;;;AAXC,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;AAE7C,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE;AAClC,YAAA,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;QACnC;AAEA,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;IAC3D;8GAjBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA,CAAA;;2FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, NgModule } from '@angular/core';
3
3
  import { ROUTES } from '@angular/router';
4
- import { u as AXM_LOGIN_GUARD_TOKEN } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs';
4
+ import { u as AXM_LOGIN_GUARD_TOKEN } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs';
5
5
 
6
6
  function routesFacory() {
7
7
  const loginGuard = inject(AXM_LOGIN_GUARD_TOKEN);
@@ -9,7 +9,7 @@ function routesFacory() {
9
9
  {
10
10
  path: 'login',
11
11
  canActivate: [loginGuard],
12
- loadComponent: () => import('./acorex-platform-module-auth-client-password.component-D5QDAaKY.mjs').then((c) => c.AXPLoginPasswordComponent),
12
+ loadComponent: () => import('./acorex-platform-module-auth-client-password.component-BoWDVby5.mjs').then((c) => c.AXPLoginPasswordComponent),
13
13
  },
14
14
  ];
15
15
  return routes;
@@ -41,4 +41,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
41
41
  }] });
42
42
 
43
43
  export { AXPSignInModule };
44
- //# sourceMappingURL=acorex-platform-module-auth-client-login.module-DushGqH6.mjs.map
44
+ //# sourceMappingURL=acorex-platform-module-auth-client-login.module-CXl61yOu.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-login.module-DushGqH6.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/login/login.module.ts"],"sourcesContent":["import { NgModule, inject } from '@angular/core';\nimport { ROUTES, Routes } from '@angular/router';\nimport { AXM_LOGIN_GUARD_TOKEN } from '../../auth.config';\n\nfunction routesFacory() {\n const loginGuard = inject(AXM_LOGIN_GUARD_TOKEN);\n const routes: Routes = [\n {\n path: 'login',\n canActivate: [loginGuard],\n loadComponent: () =>\n import('./password/password.component').then((c) => c.AXPLoginPasswordComponent),\n },\n ];\n return routes;\n}\n\n@NgModule({\n imports: [],\n exports: [],\n providers: [\n {\n provide: ROUTES,\n multi: true,\n useFactory: routesFacory,\n },\n ],\n})\nexport class AXPSignInModule {}\n"],"names":[],"mappings":";;;;;AAIA,SAAS,YAAY,GAAA;AACnB,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAChD,IAAA,MAAM,MAAM,GAAW;AACrB,QAAA;AACE,YAAA,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,CAAC,UAAU,CAAC;AACzB,YAAA,aAAa,EAAE,MACb,OAAO,sEAA+B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,yBAAyB,CAAC;AACnF,SAAA;KACF;AACD,IAAA,OAAO,MAAM;AACf;MAaa,eAAe,CAAA;8GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;+GAAf,eAAe,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,EAAA,SAAA,EARf;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,MAAM;AACf,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,UAAU,EAAE,YAAY;AACzB,aAAA;AACF,SAAA,EAAA,CAAA,CAAA;;2FAEU,eAAe,EAAA,UAAA,EAAA,CAAA;kBAX3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,MAAM;AACf,4BAAA,KAAK,EAAE,IAAI;AACX,4BAAA,UAAU,EAAE,YAAY;AACzB,yBAAA;AACF,qBAAA;AACF,iBAAA;;;;;"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-login.module-CXl61yOu.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/login/login.module.ts"],"sourcesContent":["import { NgModule, inject } from '@angular/core';\nimport { ROUTES, Routes } from '@angular/router';\nimport { AXM_LOGIN_GUARD_TOKEN } from '../../auth.config';\n\nfunction routesFacory() {\n const loginGuard = inject(AXM_LOGIN_GUARD_TOKEN);\n const routes: Routes = [\n {\n path: 'login',\n canActivate: [loginGuard],\n loadComponent: () =>\n import('./password/password.component').then((c) => c.AXPLoginPasswordComponent),\n },\n ];\n return routes;\n}\n\n@NgModule({\n imports: [],\n exports: [],\n providers: [\n {\n provide: ROUTES,\n multi: true,\n useFactory: routesFacory,\n },\n ],\n})\nexport class AXPSignInModule {}\n"],"names":[],"mappings":";;;;;AAIA,SAAS,YAAY,GAAA;AACnB,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAChD,IAAA,MAAM,MAAM,GAAW;AACrB,QAAA;AACE,YAAA,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,CAAC,UAAU,CAAC;AACzB,YAAA,aAAa,EAAE,MACb,OAAO,sEAA+B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,yBAAyB,CAAC;AACnF,SAAA;KACF;AACD,IAAA,OAAO,MAAM;AACf;MAaa,eAAe,CAAA;8GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;+GAAf,eAAe,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,EAAA,SAAA,EARf;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,MAAM;AACf,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,UAAU,EAAE,YAAY;AACzB,aAAA;AACF,SAAA,EAAA,CAAA,CAAA;;2FAEU,eAAe,EAAA,UAAA,EAAA,CAAA;kBAX3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,MAAM;AACf,4BAAA,KAAK,EAAE,IAAI;AACX,4BAAA,UAAU,EAAE,YAAY;AACzB,yBAAA;AACF,qBAAA;AACF,iBAAA;;;"}
@@ -8,7 +8,7 @@ import * as i0 from '@angular/core';
8
8
  import { inject, signal, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
9
9
  import * as i1 from '@angular/router';
10
10
  import { RouterModule } from '@angular/router';
11
- import { t as AXMAuthPlatformSettingsService } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs';
11
+ import { t as AXMAuthPlatformSettingsService } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs';
12
12
 
13
13
  //#region ----- Auth master layout -----
14
14
  class AXPAuthMasterLayoutComponent {
@@ -28,12 +28,12 @@ class AXPAuthMasterLayoutComponent {
28
28
  void this.platformBranding.resolvePlatformTitle().then((title) => this.platformTitle.set(title));
29
29
  }
30
30
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAuthMasterLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPAuthMasterLayoutComponent, isStandalone: true, selector: "ng-component", providers: [AXPContextStore], ngImport: i0, template: "<div class=\"w-full h-full flex overflow-hidden\">\n <div\n class=\"axp-auth-master__form-pane flex-1 min-h-0 lightest-surface dark:darker-surface overflow-y-auto px-6 sm:px-8 md:px-10 lg:px-0\"\n >\n <!-- ----- Stack: logo + form vertically centered; footer pinned below ----- -->\n <div\n class=\"axp-auth-master__stack w-full min-h-full flex flex-col items-center\"\n >\n <div\n class=\"axp-auth-master__main w-full grow flex flex-col items-center justify-center gap-5 pt-6 pb-4 sm:pt-8 lg:pt-0 lg:gap-0\"\n >\n <!-- ----- Platform branding on viewports without the side panel ----- -->\n <div class=\"axp-auth-master__brand lg:hidden shrink-0 w-full flex justify-center\">\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onLight\"\n format=\"full\"\n [size]=\"240\"\n [attr.alt]=\"platformTitle()\"\n class=\"axp-auth-master__logo\"\n ></axp-logo>\n </div>\n <div class=\"axp-auth-master__form-body w-full flex flex-col items-center\">\n <router-outlet></router-outlet>\n </div>\n </div>\n <div class=\"flex justify-between shrink-0 pt-2 pb-1\">\n <div class=\"auth-footer-links\">\n <axp-component-slot name=\"auth-footer-links\"></axp-component-slot>\n </div>\n </div>\n </div>\n </div>\n <div class=\"hidden lg:flex bg-primary-500 flex-1 axp-auth-bk text-white\">\n <div class=\"flex w-full flex-col justify-between px-48 py-20 text-center \">\n <div>\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onDark\"\n format=\"full\"\n [size]=\"280\"\n [attr.alt]=\"platformTitle()\"\n class=\"w-[280px] max-w-full mx-auto\"\n ></axp-logo>\n </div>\n <div>\n <p class=\"font-black text-4xl mb-4\">{{ slogan | translate | async }}</p>\n <p>{{ description | translate | async }}</p>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@layer properties;.axp-auth-master__form-pane{-webkit-overflow-scrolling:touch;padding-top:max(1.75rem,calc(env(safe-area-inset-top,0px) + 1.25rem));padding-bottom:max(1.5rem,env(safe-area-inset-bottom,0px))}@media(min-width:1024px){.axp-auth-master__form-pane{padding-top:3rem;padding-bottom:3rem}}.axp-auth-master__brand{padding-top:.5rem;margin-bottom:.25rem}.axp-auth-master__logo{width:min(15rem,85vw);max-width:100%}@media(min-width:640px){.axp-auth-master__logo{width:min(16.25rem,90vw)}}.axp-auth-master__form-body>*:not(router-outlet){display:block;width:100%}.auth-footer-links{gap:calc(var(--spacing, .25rem) * 5);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.auth-footer-links a{background-color:transparent;color:var(--ax-comp-bg,var(--color-on-surface))}.auth-footer-links a.ax-state-selected{color:var(--ax-comp-bg-darker,var(--color-on-surface))}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "ngmodule", type: AXPComponentSlotModule }, { kind: "directive", type: i1$1.AXPComponentSlotDirective, selector: "axp-component-slot", inputs: ["name", "host", "context"], exportAs: ["slot"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager, encapsulation: i0.ViewEncapsulation.None }); }
31
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPAuthMasterLayoutComponent, isStandalone: true, selector: "ng-component", providers: [AXPContextStore], ngImport: i0, template: "<div class=\"w-full h-full flex overflow-hidden\">\n <div\n class=\"axp-auth-master__form-pane flex-1 min-h-0 lightest-surface dark:darker-surface overflow-y-auto px-6 sm:px-8 md:px-10 lg:px-0\"\n >\n <!-- ----- Stack: logo + form vertically centered; footer pinned below ----- -->\n <div\n class=\"axp-auth-master__stack w-full min-h-full flex flex-col items-center\"\n >\n <div\n class=\"axp-auth-master__main w-full grow flex flex-col items-center justify-center gap-5 pt-6 pb-4 sm:pt-8 lg:pt-0 lg:gap-0\"\n >\n <!-- ----- Platform branding on viewports without the side panel ----- -->\n <div class=\"axp-auth-master__brand lg:hidden shrink-0 w-full flex justify-center\">\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onLight\"\n format=\"full\"\n [size]=\"240\"\n [attr.alt]=\"platformTitle()\"\n class=\"axp-auth-master__logo\"\n ></axp-logo>\n </div>\n <div class=\"axp-auth-master__form-body w-full flex flex-col items-center\">\n <router-outlet></router-outlet>\n </div>\n </div>\n <div class=\"flex justify-between shrink-0 pt-2 pb-1\">\n <div class=\"auth-footer-links\">\n <axp-component-slot name=\"auth-footer-links\"></axp-component-slot>\n </div>\n </div>\n </div>\n </div>\n <div class=\"hidden lg:flex bg-primary-500 flex-1 axp-auth-bk text-white\">\n <div class=\"flex w-full flex-col justify-between px-48 py-20 text-center \">\n <div>\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onDark\"\n format=\"full\"\n [size]=\"280\"\n [attr.alt]=\"platformTitle()\"\n class=\"w-[280px] max-w-full mx-auto\"\n ></axp-logo>\n </div>\n <div>\n <p class=\"font-black text-4xl mb-4\">{{ slogan | translate | async }}</p>\n <p>{{ description | translate | async }}</p>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@layer properties;.axp-auth-master__form-pane{-webkit-overflow-scrolling:touch;padding-top:max(1.75rem,calc(env(safe-area-inset-top,0px) + 1.25rem));padding-bottom:max(1.5rem,env(safe-area-inset-bottom,0px))}@media(min-width:1024px){.axp-auth-master__form-pane{padding-top:3rem;padding-bottom:3rem}}.axp-auth-master__brand{padding-top:.5rem;margin-bottom:.25rem}.axp-auth-master__logo{width:min(15rem,85vw);max-width:100%}@media(min-width:640px){.axp-auth-master__logo{width:min(16.25rem,90vw)}}.axp-auth-master__form-body>*:not(router-outlet){display:block;width:100%}.auth-footer-links{gap:calc(var(--spacing, .25rem) * 5);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.auth-footer-links a{background-color:transparent;color:var(--ax-comp-ink, var(--ax-comp-bg, var(--color-on-surface)))}.auth-footer-links a.ax-state-selected{color:var(--ax-comp-ink-darker, var(--ax-comp-bg-darker, var(--color-on-surface)))}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "ngmodule", type: AXPComponentSlotModule }, { kind: "directive", type: i1$1.AXPComponentSlotDirective, selector: "axp-component-slot", inputs: ["name", "host", "context"], exportAs: ["slot"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager, encapsulation: i0.ViewEncapsulation.None }); }
32
32
  }
33
33
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAuthMasterLayoutComponent, decorators: [{
34
34
  type: Component,
35
- args: [{ imports: [RouterModule, AXPLogoComponent, AXPComponentSlotModule, AXTranslationModule, AsyncPipe], providers: [AXPContextStore], changeDetection: ChangeDetectionStrategy.Eager, encapsulation: ViewEncapsulation.None, template: "<div class=\"w-full h-full flex overflow-hidden\">\n <div\n class=\"axp-auth-master__form-pane flex-1 min-h-0 lightest-surface dark:darker-surface overflow-y-auto px-6 sm:px-8 md:px-10 lg:px-0\"\n >\n <!-- ----- Stack: logo + form vertically centered; footer pinned below ----- -->\n <div\n class=\"axp-auth-master__stack w-full min-h-full flex flex-col items-center\"\n >\n <div\n class=\"axp-auth-master__main w-full grow flex flex-col items-center justify-center gap-5 pt-6 pb-4 sm:pt-8 lg:pt-0 lg:gap-0\"\n >\n <!-- ----- Platform branding on viewports without the side panel ----- -->\n <div class=\"axp-auth-master__brand lg:hidden shrink-0 w-full flex justify-center\">\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onLight\"\n format=\"full\"\n [size]=\"240\"\n [attr.alt]=\"platformTitle()\"\n class=\"axp-auth-master__logo\"\n ></axp-logo>\n </div>\n <div class=\"axp-auth-master__form-body w-full flex flex-col items-center\">\n <router-outlet></router-outlet>\n </div>\n </div>\n <div class=\"flex justify-between shrink-0 pt-2 pb-1\">\n <div class=\"auth-footer-links\">\n <axp-component-slot name=\"auth-footer-links\"></axp-component-slot>\n </div>\n </div>\n </div>\n </div>\n <div class=\"hidden lg:flex bg-primary-500 flex-1 axp-auth-bk text-white\">\n <div class=\"flex w-full flex-col justify-between px-48 py-20 text-center \">\n <div>\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onDark\"\n format=\"full\"\n [size]=\"280\"\n [attr.alt]=\"platformTitle()\"\n class=\"w-[280px] max-w-full mx-auto\"\n ></axp-logo>\n </div>\n <div>\n <p class=\"font-black text-4xl mb-4\">{{ slogan | translate | async }}</p>\n <p>{{ description | translate | async }}</p>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@layer properties;.axp-auth-master__form-pane{-webkit-overflow-scrolling:touch;padding-top:max(1.75rem,calc(env(safe-area-inset-top,0px) + 1.25rem));padding-bottom:max(1.5rem,env(safe-area-inset-bottom,0px))}@media(min-width:1024px){.axp-auth-master__form-pane{padding-top:3rem;padding-bottom:3rem}}.axp-auth-master__brand{padding-top:.5rem;margin-bottom:.25rem}.axp-auth-master__logo{width:min(15rem,85vw);max-width:100%}@media(min-width:640px){.axp-auth-master__logo{width:min(16.25rem,90vw)}}.axp-auth-master__form-body>*:not(router-outlet){display:block;width:100%}.auth-footer-links{gap:calc(var(--spacing, .25rem) * 5);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.auth-footer-links a{background-color:transparent;color:var(--ax-comp-bg,var(--color-on-surface))}.auth-footer-links a.ax-state-selected{color:var(--ax-comp-bg-darker,var(--color-on-surface))}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
35
+ args: [{ imports: [RouterModule, AXPLogoComponent, AXPComponentSlotModule, AXTranslationModule, AsyncPipe], providers: [AXPContextStore], changeDetection: ChangeDetectionStrategy.Eager, encapsulation: ViewEncapsulation.None, template: "<div class=\"w-full h-full flex overflow-hidden\">\n <div\n class=\"axp-auth-master__form-pane flex-1 min-h-0 lightest-surface dark:darker-surface overflow-y-auto px-6 sm:px-8 md:px-10 lg:px-0\"\n >\n <!-- ----- Stack: logo + form vertically centered; footer pinned below ----- -->\n <div\n class=\"axp-auth-master__stack w-full min-h-full flex flex-col items-center\"\n >\n <div\n class=\"axp-auth-master__main w-full grow flex flex-col items-center justify-center gap-5 pt-6 pb-4 sm:pt-8 lg:pt-0 lg:gap-0\"\n >\n <!-- ----- Platform branding on viewports without the side panel ----- -->\n <div class=\"axp-auth-master__brand lg:hidden shrink-0 w-full flex justify-center\">\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onLight\"\n format=\"full\"\n [size]=\"240\"\n [attr.alt]=\"platformTitle()\"\n class=\"axp-auth-master__logo\"\n ></axp-logo>\n </div>\n <div class=\"axp-auth-master__form-body w-full flex flex-col items-center\">\n <router-outlet></router-outlet>\n </div>\n </div>\n <div class=\"flex justify-between shrink-0 pt-2 pb-1\">\n <div class=\"auth-footer-links\">\n <axp-component-slot name=\"auth-footer-links\"></axp-component-slot>\n </div>\n </div>\n </div>\n </div>\n <div class=\"hidden lg:flex bg-primary-500 flex-1 axp-auth-bk text-white\">\n <div class=\"flex w-full flex-col justify-between px-48 py-20 text-center \">\n <div>\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onDark\"\n format=\"full\"\n [size]=\"280\"\n [attr.alt]=\"platformTitle()\"\n class=\"w-[280px] max-w-full mx-auto\"\n ></axp-logo>\n </div>\n <div>\n <p class=\"font-black text-4xl mb-4\">{{ slogan | translate | async }}</p>\n <p>{{ description | translate | async }}</p>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@layer properties;.axp-auth-master__form-pane{-webkit-overflow-scrolling:touch;padding-top:max(1.75rem,calc(env(safe-area-inset-top,0px) + 1.25rem));padding-bottom:max(1.5rem,env(safe-area-inset-bottom,0px))}@media(min-width:1024px){.axp-auth-master__form-pane{padding-top:3rem;padding-bottom:3rem}}.axp-auth-master__brand{padding-top:.5rem;margin-bottom:.25rem}.axp-auth-master__logo{width:min(15rem,85vw);max-width:100%}@media(min-width:640px){.axp-auth-master__logo{width:min(16.25rem,90vw)}}.axp-auth-master__form-body>*:not(router-outlet){display:block;width:100%}.auth-footer-links{gap:calc(var(--spacing, .25rem) * 5);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.auth-footer-links a{background-color:transparent;color:var(--ax-comp-ink, var(--ax-comp-bg, var(--color-on-surface)))}.auth-footer-links a.ax-state-selected{color:var(--ax-comp-ink-darker, var(--ax-comp-bg-darker, var(--color-on-surface)))}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
36
36
  }], ctorParameters: () => [] });
37
37
 
38
38
  export { AXPAuthMasterLayoutComponent };
39
- //# sourceMappingURL=acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs.map
39
+ //# sourceMappingURL=acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs","sources":["../../../../libs/modules/auth/client/src/lib/shared/layouts/master/master.layout.ts","../../../../libs/modules/auth/client/src/lib/shared/layouts/master/master.layout.html"],"sourcesContent":["import { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPPlatformBrandingService } from '@acorex-platform/framework-client/common';\nimport { AXPComponentSlotModule, AXPContextStore, AXPLogoComponent } from '@acorex-platform/framework-client/core';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, inject, signal } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { AXMAuthPlatformSettingsService } from '../../../auth-platform-settings.service';\n\n//#region ----- Auth master layout -----\n\n@Component({\n templateUrl: 'master.layout.html',\n styleUrls: ['master.layout.css'],\n imports: [RouterModule, AXPLogoComponent, AXPComponentSlotModule, AXTranslationModule, AsyncPipe],\n providers: [AXPContextStore],\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXPAuthMasterLayoutComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly authPlatformSettings = inject(AXMAuthPlatformSettingsService);\n private readonly platformBranding = inject(AXPPlatformBrandingService);\n\n protected readonly platformTitle = signal('');\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n void this.platformBranding.resolvePlatformTitle().then((title) => this.platformTitle.set(title));\n }\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n /** Plain string or MLS map — rendered via translate pipe. */\n protected readonly slogan = this.authPlatformSettings.slogan();\n protected readonly description = this.authPlatformSettings.description();\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"w-full h-full flex overflow-hidden\">\n <div\n class=\"axp-auth-master__form-pane flex-1 min-h-0 lightest-surface dark:darker-surface overflow-y-auto px-6 sm:px-8 md:px-10 lg:px-0\"\n >\n <!-- ----- Stack: logo + form vertically centered; footer pinned below ----- -->\n <div\n class=\"axp-auth-master__stack w-full min-h-full flex flex-col items-center\"\n >\n <div\n class=\"axp-auth-master__main w-full grow flex flex-col items-center justify-center gap-5 pt-6 pb-4 sm:pt-8 lg:pt-0 lg:gap-0\"\n >\n <!-- ----- Platform branding on viewports without the side panel ----- -->\n <div class=\"axp-auth-master__brand lg:hidden shrink-0 w-full flex justify-center\">\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onLight\"\n format=\"full\"\n [size]=\"240\"\n [attr.alt]=\"platformTitle()\"\n class=\"axp-auth-master__logo\"\n ></axp-logo>\n </div>\n <div class=\"axp-auth-master__form-body w-full flex flex-col items-center\">\n <router-outlet></router-outlet>\n </div>\n </div>\n <div class=\"flex justify-between shrink-0 pt-2 pb-1\">\n <div class=\"auth-footer-links\">\n <axp-component-slot name=\"auth-footer-links\"></axp-component-slot>\n </div>\n </div>\n </div>\n </div>\n <div class=\"hidden lg:flex bg-primary-500 flex-1 axp-auth-bk text-white\">\n <div class=\"flex w-full flex-col justify-between px-48 py-20 text-center \">\n <div>\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onDark\"\n format=\"full\"\n [size]=\"280\"\n [attr.alt]=\"platformTitle()\"\n class=\"w-[280px] max-w-full mx-auto\"\n ></axp-logo>\n </div>\n <div>\n <p class=\"font-black text-4xl mb-4\">{{ slogan | translate | async }}</p>\n <p>{{ description | translate | async }}</p>\n </div>\n </div>\n </div>\n</div>\n"],"names":["i2"],"mappings":";;;;;;;;;;;;AAQA;MAUa,4BAA4B,CAAA;;;AAYvC,IAAA,WAAA,GAAA;;AATiB,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,8BAA8B,CAAC;AAC7D,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,0BAA0B,CAAC;QAEnD,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,EAAE;0FAAC;;;;AAe1B,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;AAC3C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE;QATtE,KAAK,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClG;8GAdW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,SAAA,EAJ5B,CAAC,eAAe,CAAC,0BCd9B,u/DAoDA,EAAA,MAAA,EAAA,CAAA,k1CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvCY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,0FAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAKrF,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBARxC,SAAS;8BAGC,CAAC,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,SAAS,CAAC,aACtF,CAAC,eAAe,CAAC,EAAA,eAAA,EACX,uBAAuB,CAAC,KAAK,EAAA,aAAA,EAC/B,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,u/DAAA,EAAA,MAAA,EAAA,CAAA,k1CAAA,CAAA,EAAA;;;;;"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs","sources":["../../../../libs/modules/auth/client/src/lib/shared/layouts/master/master.layout.ts","../../../../libs/modules/auth/client/src/lib/shared/layouts/master/master.layout.html"],"sourcesContent":["import { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPPlatformBrandingService } from '@acorex-platform/framework-client/common';\nimport { AXPComponentSlotModule, AXPContextStore, AXPLogoComponent } from '@acorex-platform/framework-client/core';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, inject, signal } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { AXMAuthPlatformSettingsService } from '../../../auth-platform-settings.service';\n\n//#region ----- Auth master layout -----\n\n@Component({\n templateUrl: 'master.layout.html',\n styleUrls: ['master.layout.css'],\n imports: [RouterModule, AXPLogoComponent, AXPComponentSlotModule, AXTranslationModule, AsyncPipe],\n providers: [AXPContextStore],\n changeDetection: ChangeDetectionStrategy.Eager,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AXPAuthMasterLayoutComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly authPlatformSettings = inject(AXMAuthPlatformSettingsService);\n private readonly platformBranding = inject(AXPPlatformBrandingService);\n\n protected readonly platformTitle = signal('');\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n void this.platformBranding.resolvePlatformTitle().then((title) => this.platformTitle.set(title));\n }\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n /** Plain string or MLS map — rendered via translate pipe. */\n protected readonly slogan = this.authPlatformSettings.slogan();\n protected readonly description = this.authPlatformSettings.description();\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"w-full h-full flex overflow-hidden\">\n <div\n class=\"axp-auth-master__form-pane flex-1 min-h-0 lightest-surface dark:darker-surface overflow-y-auto px-6 sm:px-8 md:px-10 lg:px-0\"\n >\n <!-- ----- Stack: logo + form vertically centered; footer pinned below ----- -->\n <div\n class=\"axp-auth-master__stack w-full min-h-full flex flex-col items-center\"\n >\n <div\n class=\"axp-auth-master__main w-full grow flex flex-col items-center justify-center gap-5 pt-6 pb-4 sm:pt-8 lg:pt-0 lg:gap-0\"\n >\n <!-- ----- Platform branding on viewports without the side panel ----- -->\n <div class=\"axp-auth-master__brand lg:hidden shrink-0 w-full flex justify-center\">\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onLight\"\n format=\"full\"\n [size]=\"240\"\n [attr.alt]=\"platformTitle()\"\n class=\"axp-auth-master__logo\"\n ></axp-logo>\n </div>\n <div class=\"axp-auth-master__form-body w-full flex flex-col items-center\">\n <router-outlet></router-outlet>\n </div>\n </div>\n <div class=\"flex justify-between shrink-0 pt-2 pb-1\">\n <div class=\"auth-footer-links\">\n <axp-component-slot name=\"auth-footer-links\"></axp-component-slot>\n </div>\n </div>\n </div>\n </div>\n <div class=\"hidden lg:flex bg-primary-500 flex-1 axp-auth-bk text-white\">\n <div class=\"flex w-full flex-col justify-between px-48 py-20 text-center \">\n <div>\n <axp-logo\n logoKey=\"platform\"\n appearance=\"onDark\"\n format=\"full\"\n [size]=\"280\"\n [attr.alt]=\"platformTitle()\"\n class=\"w-[280px] max-w-full mx-auto\"\n ></axp-logo>\n </div>\n <div>\n <p class=\"font-black text-4xl mb-4\">{{ slogan | translate | async }}</p>\n <p>{{ description | translate | async }}</p>\n </div>\n </div>\n </div>\n</div>\n"],"names":["i2"],"mappings":";;;;;;;;;;;;AAQA;MAUa,4BAA4B,CAAA;;;AAYvC,IAAA,WAAA,GAAA;;AATiB,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,8BAA8B,CAAC;AAC7D,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,0BAA0B,CAAC;QAEnD,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,EAAE;0FAAC;;;;AAe1B,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;AAC3C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE;QATtE,KAAK,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClG;8GAdW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,SAAA,EAJ5B,CAAC,eAAe,CAAC,0BCd9B,u/DAoDA,EAAA,MAAA,EAAA,CAAA,m4CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvCY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,0FAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAKrF,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBARxC,SAAS;8BAGC,CAAC,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,SAAS,CAAC,aACtF,CAAC,eAAe,CAAC,EAAA,eAAA,EACX,uBAAuB,CAAC,KAAK,EAAA,aAAA,EAC/B,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,u/DAAA,EAAA,MAAA,EAAA,CAAA,m4CAAA,CAAA,EAAA;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs","sources":["../../../../libs/modules/auth/client/src/lib/menu.provider.ts"],"sourcesContent":["import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPMenuProvider, AXPMenuProviderContext } from '@acorex-platform/framework-client/common';\nimport { inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\n\nexport class AXMSecurityManagementModuleMenuProvider implements AXPMenuProvider {\n private sessionService = inject(AXPSessionService);\n\n async provide(context: AXPMenuProviderContext): Promise<void> {\n const isAuthorized = await firstValueFrom(this.sessionService.isAuthorized$);\n if (!isAuthorized) {\n return;\n }\n // user:profile menu removed - profile actions are in header popover\n }\n}\n"],"names":[],"mappings":";;;;MAKa,uCAAuC,CAAA;AAApD,IAAA,WAAA,GAAA;AACU,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;IASpD;IAPE,MAAM,OAAO,CAAC,OAA+B,EAAA;QAC3C,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;QAC5E,IAAI,CAAC,YAAY,EAAE;YACjB;QACF;;IAEF;AACD;;;;"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs","sources":["../../../../libs/modules/auth/client/src/lib/menu.provider.ts"],"sourcesContent":["import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPMenuProvider, AXPMenuProviderContext } from '@acorex-platform/framework-client/common';\nimport { inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\n\nexport class AXMSecurityManagementModuleMenuProvider implements AXPMenuProvider {\n private sessionService = inject(AXPSessionService);\n\n async provide(context: AXPMenuProviderContext): Promise<void> {\n const isAuthorized = await firstValueFrom(this.sessionService.isAuthorized$);\n if (!isAuthorized) {\n return;\n }\n // user:profile menu removed - profile actions are in header popover\n }\n}\n"],"names":[],"mappings":";;;;MAKa,uCAAuC,CAAA;AAApD,IAAA,WAAA,GAAA;AACU,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;IASpD;IAPE,MAAM,OAAO,CAAC,OAA+B,EAAA;QAC3C,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;QAC5E,IAAI,CAAC,YAAY,EAAE;YACjB;QACF;;IAEF;AACD;;"}
@@ -6,7 +6,7 @@ import { AXTranslationModule } from '@acorex/core/translation';
6
6
  import { AXPSessionService, resolvePlatformOAuthRedirectUri } from '@acorex-platform/framework-client/auth';
7
7
  import { AXPHomePageService } from '@acorex-platform/framework-client/common';
8
8
  import { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';
9
- import * as i3 from '@angular/common';
9
+ import * as i5$1 from '@angular/common';
10
10
  import { CommonModule } from '@angular/common';
11
11
  import * as i0 from '@angular/core';
12
12
  import { inject, ChangeDetectionStrategy, Component } from '@angular/core';
@@ -90,7 +90,7 @@ class AXPOAuthCallbackComponent {
90
90
  this.router.navigate(['/']);
91
91
  }
92
92
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOAuthCallbackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
93
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPOAuthCallbackComponent, isStandalone: true, selector: "axp-oauth-callback", ngImport: i0, template: "<ng-container *translate=\"let t\">\n <div class=\"h-full flex flex-col items-center justify-center p-8\">\n <div class=\"w-96 text-center\">\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <axp-state-message\n mode=\"loading\"\n icon=\"fa-solid fa-spinner fa-spin\"\n [title]=\"(status$ | async) || '@auth:state-message.loading.title'\"\n [description]=\"'@auth:state-message.loading.description'\"\n >\n </axp-state-message>\n }\n\n <!-- Error State -->\n @if ((error$ | async) && !(isLoading$ | async)) {\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@auth:state-message.error.title'\"\n [description]=\"(error$ | async) || '@auth:state-message.error.description'\"\n >\n <div slot=\"actions\" class=\"flex flex-col gap-2 sm:flex-row sm:justify-center\">\n <ax-button color=\"primary\" text=\"Try Again\" (onClick)=\"handleRetry()\" class=\"w-full sm:w-auto\">\n </ax-button>\n <ax-button color=\"default\" text=\"Go Home\" (onClick)=\"handleGoHome()\" class=\"w-full sm:w-auto\">\n </ax-button>\n </div>\n </axp-state-message>\n }\n\n <!-- Success State (briefly shown before redirect) -->\n @if (!(isLoading$ | async) && !(error$ | async)) {\n <axp-state-message\n mode=\"success\"\n icon=\"fa-solid fa-check\"\n [title]=\"'@auth:state-message.success.title'\"\n [description]=\"'@auth:state-message.success.description'\"\n >\n </axp-state-message>\n }\n </div>\n </div>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
93
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPOAuthCallbackComponent, isStandalone: true, selector: "axp-oauth-callback", ngImport: i0, template: "<ng-container *translate=\"let t\">\n <div class=\"h-full flex flex-col items-center justify-center p-8\">\n <div class=\"w-96 text-center\">\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <axp-state-message\n mode=\"loading\"\n icon=\"fa-solid fa-spinner fa-spin\"\n [title]=\"(status$ | async) || '@auth:state-message.loading.title'\"\n [description]=\"'@auth:state-message.loading.description'\"\n >\n </axp-state-message>\n }\n\n <!-- Error State -->\n @if ((error$ | async) && !(isLoading$ | async)) {\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@auth:state-message.error.title'\"\n [description]=\"(error$ | async) || '@auth:state-message.error.description'\"\n >\n <div slot=\"actions\" class=\"flex flex-col gap-2 sm:flex-row sm:justify-center\">\n <ax-button color=\"primary\" text=\"Try Again\" (onClick)=\"handleRetry()\" class=\"w-full sm:w-auto\">\n </ax-button>\n <ax-button color=\"default\" text=\"Go Home\" (onClick)=\"handleGoHome()\" class=\"w-full sm:w-auto\">\n </ax-button>\n </div>\n </axp-state-message>\n }\n\n <!-- Success State (briefly shown before redirect) -->\n @if (!(isLoading$ | async) && !(error$ | async)) {\n <axp-state-message\n mode=\"success\"\n icon=\"fa-solid fa-check\"\n [title]=\"'@auth:state-message.success.title'\"\n [description]=\"'@auth:state-message.success.description'\"\n >\n </axp-state-message>\n }\n </div>\n </div>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "pipe", type: i5$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
94
94
  }
95
95
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOAuthCallbackComponent, decorators: [{
96
96
  type: Component,
@@ -98,4 +98,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
98
98
  }] });
99
99
 
100
100
  export { AXPOAuthCallbackComponent };
101
- //# sourceMappingURL=acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs.map
101
+ //# sourceMappingURL=acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/callback/oauth-callback.component.ts","../../../../libs/modules/auth/client/src/lib/pages/callback/oauth-callback.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPSessionService, resolvePlatformOAuthRedirectUri } from '@acorex-platform/framework-client/auth';\nimport { AXPHomePageService } from '@acorex-platform/framework-client/common';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { BehaviorSubject } from 'rxjs';\n@Component({\n selector: 'axp-oauth-callback',\n templateUrl: './oauth-callback.component.html',\n imports: [CommonModule, AXButtonModule, AXLoadingModule, AXTranslationModule, AXPStateMessageComponent],\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: true,\n})\nexport class AXPOAuthCallbackComponent implements OnInit {\n //#region ---- Services & Dependencies ----\n\n private sessionService = inject(AXPSessionService);\n private router = inject(Router);\n private route = inject(ActivatedRoute);\n private homePageService = inject(AXPHomePageService);\n\n //#endregion\n\n //#region ---- Properties ----\n\n protected isLoading$ = new BehaviorSubject<boolean>(true);\n protected error$ = new BehaviorSubject<string | null>(null);\n protected status$ = new BehaviorSubject<string>('Processing authorization...');\n private exchangeStarted = false;\n // Removed: @Input() flow\n\n //#endregion\n\n //#region ---- Lifecycle Methods ----\n\n async ngOnInit(): Promise<void> {\n if (this.exchangeStarted) {\n return;\n }\n this.exchangeStarted = true;\n\n try {\n const queryParams = this.route.snapshot.queryParams;\n const code = queryParams['code'];\n const error = queryParams['error'];\n // Removed: flowParam and its assignment\n if (error) {\n throw new Error(`OAuth error: ${error} - ${queryParams['error_description'] || 'Unknown error'}`);\n }\n if (!code) {\n throw new Error('No authorization code received from OAuth provider');\n }\n this.status$.next('Exchanging authorization code for tokens...');\n\n const redirectUri = resolvePlatformOAuthRedirectUri();\n // Strategy is resolved inside updateToken (session + pending OAuth key).\n await this.sessionService.updateToken({ code, redirectUri });\n this.status$.next('Authentication successful! Redirecting...');\n await this.navigateAfterSuccess();\n } catch (error) {\n console.error('OAuth callback error:', error);\n const message =\n error instanceof Error && error.message.trim()\n ? error.message\n : 'Authentication failed. Please try again.';\n this.error$.next(message);\n await this.sessionService.signout();\n this.isLoading$.next(false);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n //#endregion\n\n //#region ---- Navigation ----\n\n private async navigateAfterSuccess(): Promise<void> {\n // Use await with router.navigate to ensure navigation completes\n if (this.sessionService.tenant?.id == null) {\n await this.router.navigate(['/auth/account/tenant-chooser']);\n return;\n }\n if (this.sessionService.application?.id == null) {\n await this.router.navigate(['/auth/account/app-chooser']);\n return;\n }\n // Navigate to home page\n await this.homePageService.navigateTo();\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected handleRetry(): void {\n this.router.navigate(['/auth/login']);\n }\n\n protected handleGoHome(): void {\n this.router.navigate(['/']);\n }\n\n //#endregion\n}\n","<ng-container *translate=\"let t\">\n <div class=\"h-full flex flex-col items-center justify-center p-8\">\n <div class=\"w-96 text-center\">\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <axp-state-message\n mode=\"loading\"\n icon=\"fa-solid fa-spinner fa-spin\"\n [title]=\"(status$ | async) || '@auth:state-message.loading.title'\"\n [description]=\"'@auth:state-message.loading.description'\"\n >\n </axp-state-message>\n }\n\n <!-- Error State -->\n @if ((error$ | async) && !(isLoading$ | async)) {\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@auth:state-message.error.title'\"\n [description]=\"(error$ | async) || '@auth:state-message.error.description'\"\n >\n <div slot=\"actions\" class=\"flex flex-col gap-2 sm:flex-row sm:justify-center\">\n <ax-button color=\"primary\" text=\"Try Again\" (onClick)=\"handleRetry()\" class=\"w-full sm:w-auto\">\n </ax-button>\n <ax-button color=\"default\" text=\"Go Home\" (onClick)=\"handleGoHome()\" class=\"w-full sm:w-auto\">\n </ax-button>\n </div>\n </axp-state-message>\n }\n\n <!-- Success State (briefly shown before redirect) -->\n @if (!(isLoading$ | async) && !(error$ | async)) {\n <axp-state-message\n mode=\"success\"\n icon=\"fa-solid fa-check\"\n [title]=\"'@auth:state-message.success.title'\"\n [description]=\"'@auth:state-message.success.description'\"\n >\n </axp-state-message>\n }\n </div>\n </div>\n</ng-container>\n"],"names":["i2"],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/callback/oauth-callback.component.ts","../../../../libs/modules/auth/client/src/lib/pages/callback/oauth-callback.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPSessionService, resolvePlatformOAuthRedirectUri } from '@acorex-platform/framework-client/auth';\nimport { AXPHomePageService } from '@acorex-platform/framework-client/common';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { BehaviorSubject } from 'rxjs';\n@Component({\n selector: 'axp-oauth-callback',\n templateUrl: './oauth-callback.component.html',\n imports: [CommonModule, AXButtonModule, AXLoadingModule, AXTranslationModule, AXPStateMessageComponent],\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: true,\n})\nexport class AXPOAuthCallbackComponent implements OnInit {\n //#region ---- Services & Dependencies ----\n\n private sessionService = inject(AXPSessionService);\n private router = inject(Router);\n private route = inject(ActivatedRoute);\n private homePageService = inject(AXPHomePageService);\n\n //#endregion\n\n //#region ---- Properties ----\n\n protected isLoading$ = new BehaviorSubject<boolean>(true);\n protected error$ = new BehaviorSubject<string | null>(null);\n protected status$ = new BehaviorSubject<string>('Processing authorization...');\n private exchangeStarted = false;\n // Removed: @Input() flow\n\n //#endregion\n\n //#region ---- Lifecycle Methods ----\n\n async ngOnInit(): Promise<void> {\n if (this.exchangeStarted) {\n return;\n }\n this.exchangeStarted = true;\n\n try {\n const queryParams = this.route.snapshot.queryParams;\n const code = queryParams['code'];\n const error = queryParams['error'];\n // Removed: flowParam and its assignment\n if (error) {\n throw new Error(`OAuth error: ${error} - ${queryParams['error_description'] || 'Unknown error'}`);\n }\n if (!code) {\n throw new Error('No authorization code received from OAuth provider');\n }\n this.status$.next('Exchanging authorization code for tokens...');\n\n const redirectUri = resolvePlatformOAuthRedirectUri();\n // Strategy is resolved inside updateToken (session + pending OAuth key).\n await this.sessionService.updateToken({ code, redirectUri });\n this.status$.next('Authentication successful! Redirecting...');\n await this.navigateAfterSuccess();\n } catch (error) {\n console.error('OAuth callback error:', error);\n const message =\n error instanceof Error && error.message.trim()\n ? error.message\n : 'Authentication failed. Please try again.';\n this.error$.next(message);\n await this.sessionService.signout();\n this.isLoading$.next(false);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n //#endregion\n\n //#region ---- Navigation ----\n\n private async navigateAfterSuccess(): Promise<void> {\n // Use await with router.navigate to ensure navigation completes\n if (this.sessionService.tenant?.id == null) {\n await this.router.navigate(['/auth/account/tenant-chooser']);\n return;\n }\n if (this.sessionService.application?.id == null) {\n await this.router.navigate(['/auth/account/app-chooser']);\n return;\n }\n // Navigate to home page\n await this.homePageService.navigateTo();\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected handleRetry(): void {\n this.router.navigate(['/auth/login']);\n }\n\n protected handleGoHome(): void {\n this.router.navigate(['/']);\n }\n\n //#endregion\n}\n","<ng-container *translate=\"let t\">\n <div class=\"h-full flex flex-col items-center justify-center p-8\">\n <div class=\"w-96 text-center\">\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <axp-state-message\n mode=\"loading\"\n icon=\"fa-solid fa-spinner fa-spin\"\n [title]=\"(status$ | async) || '@auth:state-message.loading.title'\"\n [description]=\"'@auth:state-message.loading.description'\"\n >\n </axp-state-message>\n }\n\n <!-- Error State -->\n @if ((error$ | async) && !(isLoading$ | async)) {\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@auth:state-message.error.title'\"\n [description]=\"(error$ | async) || '@auth:state-message.error.description'\"\n >\n <div slot=\"actions\" class=\"flex flex-col gap-2 sm:flex-row sm:justify-center\">\n <ax-button color=\"primary\" text=\"Try Again\" (onClick)=\"handleRetry()\" class=\"w-full sm:w-auto\">\n </ax-button>\n <ax-button color=\"default\" text=\"Go Home\" (onClick)=\"handleGoHome()\" class=\"w-full sm:w-auto\">\n </ax-button>\n </div>\n </axp-state-message>\n }\n\n <!-- Success State (briefly shown before redirect) -->\n @if (!(isLoading$ | async) && !(error$ | async)) {\n <axp-state-message\n mode=\"success\"\n icon=\"fa-solid fa-check\"\n [title]=\"'@auth:state-message.success.title'\"\n [description]=\"'@auth:state-message.success.description'\"\n >\n </axp-state-message>\n }\n </div>\n </div>\n</ng-container>\n"],"names":["i2","i3"],"mappings":"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"}
@@ -0,0 +1,265 @@
1
+ import { AXPopupService } from '@acorex/components/popup';
2
+ import * as i5$1 from '@acorex/core/translation';
3
+ import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
4
+ import * as i0 from '@angular/core';
5
+ import { signal, inject, ChangeDetectorRef, ViewEncapsulation, ChangeDetectionStrategy, Component, Injectable } from '@angular/core';
6
+ import * as i1 from '@acorex/components/button';
7
+ import { AXButtonModule } from '@acorex/components/button';
8
+ import { AXDataSource } from '@acorex/cdk/common';
9
+ import * as i3 from '@acorex/components/decorators';
10
+ import { AXDecoratorModule } from '@acorex/components/decorators';
11
+ import { AXDropdownModule } from '@acorex/components/dropdown';
12
+ import { AXPopoverModule } from '@acorex/components/popover';
13
+ import * as i4 from '@acorex/components/select-box';
14
+ import { AXSelectBoxModule } from '@acorex/components/select-box';
15
+ import { AXBasePageComponent } from '@acorex/components/page';
16
+ import { AXFormatService, AXFormatModule } from '@acorex/core/format';
17
+ import { AXPSettingsService } from '@acorex-platform/framework-client/common';
18
+ import { AXPRegionalSetting } from '@acorex-platform/framework-shared/core';
19
+ import * as i5 from '@angular/common';
20
+ import { CommonModule } from '@angular/common';
21
+ import * as i1$1 from '@angular/forms';
22
+ import { FormsModule } from '@angular/forms';
23
+ import { AXP_AUTH_INACTIVE_SESSION_TERMINATION_OPTION_DEFINITIONS, AXPAuthSettings, isAuthInactiveSessionTerminationValue } from '@acorex-platform/module-auth-client/contracts';
24
+ import { A as AXMUserDeviceSessionsService } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs';
25
+
26
+ //#endregion
27
+ //#region ----- Constants -----
28
+ const ONE_WEEK_MS = 7 * 24 * 60 * 60 * 1000;
29
+ //#endregion
30
+ //#region ----- Helpers -----
31
+ function parseSessionDate(value) {
32
+ if (value instanceof Date) {
33
+ return Number.isNaN(value.getTime()) ? undefined : value;
34
+ }
35
+ if (typeof value === 'string' || typeof value === 'number') {
36
+ const parsed = new Date(value);
37
+ return Number.isNaN(parsed.getTime()) ? undefined : parsed;
38
+ }
39
+ return undefined;
40
+ }
41
+ /** Drops year tokens from a regional date pattern (keeps day/month + separators). */
42
+ function omitYearFromDateFormat(format) {
43
+ let result = format.replace(/Y{2,4}/gi, '').replace(/y{2,4}/g, '');
44
+ result = result.replace(/^[/\-.\s]+|[/\-.\s]+$/g, '');
45
+ result = result.replace(/[/\-.\s]{2,}/g, (match) => match.charAt(0));
46
+ return result.trim() || format;
47
+ }
48
+ //#endregion
49
+ class AXMUserSessionsComponent extends AXBasePageComponent {
50
+ //#endregion
51
+ //#region ----- Lifecycle -----
52
+ constructor() {
53
+ super();
54
+ //#region ----- State -----
55
+ this.items = signal([], /* @ts-ignore */
56
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
57
+ this.activeSessionView = signal(undefined, /* @ts-ignore */
58
+ ...(ngDevMode ? [{ debugName: "activeSessionView" }] : /* istanbul ignore next */ []));
59
+ this.expireTime = signal(null, /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "expireTime" }] : /* istanbul ignore next */ []));
61
+ //#endregion
62
+ //#region ----- Services & Dependencies -----
63
+ this.userDeviceSessionsService = inject(AXMUserDeviceSessionsService);
64
+ this.settingsService = inject(AXPSettingsService);
65
+ this.translateService = inject(AXTranslationService);
66
+ this.formatService = inject(AXFormatService);
67
+ this.cdRef = inject(ChangeDetectorRef);
68
+ //#endregion
69
+ //#region ----- Data Sources -----
70
+ this.expirationItems = [];
71
+ this.dataSource = new AXDataSource({
72
+ pageSize: 10,
73
+ key: 'id',
74
+ load: async () => ({
75
+ items: this.expirationItems,
76
+ total: this.expirationItems.length,
77
+ }),
78
+ });
79
+ void this.loadUserSessions();
80
+ }
81
+ //#endregion
82
+ //#region ----- UI Handlers -----
83
+ getSessionIcon(session) {
84
+ if (!session) {
85
+ return 'fa-solid fa-question';
86
+ }
87
+ const haystack = [session.browser, session.operatingSystem, session.deviceName]
88
+ .map((part) => (part ?? '').toLowerCase())
89
+ .join(' ');
90
+ if (haystack.includes('firefox')) {
91
+ return 'fa-brands fa-firefox';
92
+ }
93
+ if (haystack.includes('chrome') || haystack.includes('chromium')) {
94
+ return 'fa-brands fa-chrome';
95
+ }
96
+ if (haystack.includes('edge')) {
97
+ return 'fa-brands fa-edge';
98
+ }
99
+ if (haystack.includes('safari')) {
100
+ return 'fa-brands fa-safari';
101
+ }
102
+ if (haystack.includes('opera')) {
103
+ return 'fa-brands fa-opera';
104
+ }
105
+ if (haystack.includes('windows')) {
106
+ return 'fa-brands fa-windows';
107
+ }
108
+ if (haystack.includes('mac') || haystack.includes('iphone') || haystack.includes('ipad') || haystack.includes('ios')) {
109
+ return 'fa-brands fa-apple';
110
+ }
111
+ if (haystack.includes('android')) {
112
+ return 'fa-brands fa-android';
113
+ }
114
+ if (haystack.includes('linux')) {
115
+ return 'fa-brands fa-linux';
116
+ }
117
+ return 'fa-solid fa-desktop';
118
+ }
119
+ onChangeSessionExpireTime(e) {
120
+ const selectedId = e.component.selectedItems[0]?.id;
121
+ if (!selectedId) {
122
+ return;
123
+ }
124
+ this.expireTime.set(selectedId);
125
+ void this.userDeviceSessionsService.setInactiveSessionTermination(selectedId);
126
+ }
127
+ async onTerminate(sessionId) {
128
+ if (!sessionId) {
129
+ console.error('No item to terminate');
130
+ return;
131
+ }
132
+ // Never terminate the current browser session from a row action.
133
+ if (sessionId === this.activeSessionView()?.session.id) {
134
+ return;
135
+ }
136
+ await this.userDeviceSessionsService.terminateSession(sessionId);
137
+ await this.loadUserSessions();
138
+ }
139
+ async onTerminateAll() {
140
+ await this.userDeviceSessionsService.terminateAllSession();
141
+ await this.loadUserSessions();
142
+ }
143
+ //#endregion
144
+ //#region ----- Private Methods -----
145
+ async resolveSessionMeta(session) {
146
+ const place = (session.location ?? '').trim() ||
147
+ (await this.translateService.translateAsync('@auth:sessions.meta.unknown-location'));
148
+ const detailParts = [place, (session.ipAddress ?? '').trim()].filter(Boolean);
149
+ const placeAndIp = detailParts.join(' · ');
150
+ const lastSeen = await this.resolveLastSeenLabel(session.lastLoginDate);
151
+ if (!lastSeen) {
152
+ return placeAndIp;
153
+ }
154
+ return `${placeAndIp}, ${lastSeen}`;
155
+ }
156
+ formatSessionTitle(session) {
157
+ return [session.deviceName, session.browser]
158
+ .map((part) => (part ?? '').trim())
159
+ .filter(Boolean)
160
+ .join(' · ');
161
+ }
162
+ formatSessionSubtitle(session) {
163
+ return (session.operatingSystem ?? '').trim();
164
+ }
165
+ async resolveLastSeenLabel(lastLoginDate) {
166
+ const date = parseSessionDate(lastLoginDate);
167
+ if (!date) {
168
+ return '';
169
+ }
170
+ const ageMs = Date.now() - date.getTime();
171
+ if (ageMs >= 0 && ageMs < ONE_WEEK_MS) {
172
+ return this.formatService.format(date, 'timeleft');
173
+ }
174
+ const dateFormat = await this.settingsService.get(AXPRegionalSetting.ShortDate);
175
+ const timeFormat = await this.settingsService.get(AXPRegionalSetting.ShortTime);
176
+ const sameYear = date.getFullYear() === new Date().getFullYear();
177
+ const datePart = sameYear ? omitYearFromDateFormat(dateFormat ?? '') : (dateFormat ?? '');
178
+ const format = `${datePart} ${timeFormat ?? ''}`.trim();
179
+ return this.formatService.format(date, 'datetime', { format });
180
+ }
181
+ async loadUserSessions() {
182
+ try {
183
+ // Options come from the auth settings definition (shared contracts catalog).
184
+ this.expirationItems = await Promise.all(AXP_AUTH_INACTIVE_SESSION_TERMINATION_OPTION_DEFINITIONS.map(async (option) => ({
185
+ id: option.id,
186
+ name: await this.translateService.translateAsync(option.titleKey),
187
+ })));
188
+ const sessions = await this.userDeviceSessionsService.getSessions();
189
+ const items = await Promise.all(sessions.map(async (item) => ({
190
+ ...item,
191
+ icon: this.getSessionIcon(item),
192
+ title: this.formatSessionTitle(item),
193
+ subtitle: this.formatSessionSubtitle(item),
194
+ metaLabel: await this.resolveSessionMeta(item),
195
+ })));
196
+ this.items.set(items);
197
+ try {
198
+ const activeSession = await this.userDeviceSessionsService.getCurrentActiveSessions();
199
+ this.activeSessionView.set({
200
+ session: activeSession,
201
+ title: this.formatSessionTitle(activeSession),
202
+ subtitle: this.formatSessionSubtitle(activeSession),
203
+ metaLabel: await this.resolveSessionMeta(activeSession),
204
+ });
205
+ }
206
+ catch (error) {
207
+ console.warn('No active session found:', error);
208
+ this.activeSessionView.set(undefined);
209
+ }
210
+ const inactiveSessionTermination = await this.settingsService.get(AXPAuthSettings.InactiveSessionTermination);
211
+ if (isAuthInactiveSessionTerminationValue(inactiveSessionTermination)) {
212
+ this.expireTime.set(inactiveSessionTermination);
213
+ }
214
+ await this.dataSource.refresh();
215
+ this.cdRef.markForCheck();
216
+ }
217
+ catch (error) {
218
+ console.error('Error loading user sessions', error);
219
+ }
220
+ }
221
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMUserSessionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
222
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMUserSessionsComponent, isStandalone: true, selector: "axm-user-sessions", host: { classAttribute: "axm-user-sessions" }, usesInheritance: true, ngImport: i0, template: "<ax-content>\n <div class=\"axm-user-sessions__content flex flex-col gap-4 p-6 w-full min-w-0\">\n <!-- ----- This device (current session) ----- -->\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.this-device.title' | translate | async }}\n </p>\n <div class=\"axm-user-sessions__row\">\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--primary\">\n <i class=\"{{ getSessionIcon(activeSessionView()?.session) }}\"></i>\n </div>\n <!--->\n <!-- ----- Current session details when available ----- -->\n @if (activeSessionView(); as current) {\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ current.title }}</div>\n @if (current.subtitle) {\n <div class=\"font-normal text-sm\">{{ current.subtitle }}</div>\n }\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">{{ current.metaLabel }}</p>\n </div>\n }\n </div>\n\n <!--->\n <!-- ----- Other sessions: terminate-all + device list ----- -->\n @if (items().length > 0) {\n <!-- ----- Terminate all other sessions (never current) ----- -->\n <div\n class=\"axm-user-sessions__row cursor-pointer\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onTerminateAll()\"\n (keydown.enter)=\"onTerminateAll()\"\n >\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--danger\">\n <i class=\"ax-icon ax-icon-clear\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">\n {{ '@auth:sessions.terminate-all.title' | translate | async }}\n </div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-sm\">\n {{ '@auth:sessions.terminate-all.description' | translate | async }}\n </p>\n </div>\n </div>\n\n <!-- ----- Other active devices ----- -->\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.active-devices.title' | translate | async }}\n </p>\n @for (item of items(); track item.id) {\n <div class=\"axm-user-sessions__row\">\n <div class=\"axm-user-sessions__icon\">\n <i class=\"{{ item.icon }}\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ item.title }}</div>\n @if (item.subtitle) {\n <div class=\"font-normal text-sm\">{{ item.subtitle }}</div>\n }\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">{{ item.metaLabel }}</p>\n </div>\n <ax-button\n class=\"axm-user-sessions__action\"\n look=\"blank\"\n color=\"danger\"\n [attr.aria-label]=\"('@general:actions.remove.title' | translate | async) ?? ''\"\n (onClick)=\"onTerminate(item.id)\"\n >\n <ax-icon icon=\"fa-light fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n }\n }\n </div>\n</ax-content>\n<ax-footer>\n <ax-suffix>\n <div class=\"axm-user-sessions__footer flex w-full min-w-0 flex-col gap-1 px-4 py-2\">\n <p class=\"m-0 text-start font-medium text-base text-danger-500\">\n {{ '@auth:sessions.terminate-old.title' | translate | async }}\n </p>\n <div class=\"axm-user-sessions__footer-setting\">\n <div class=\"axm-user-sessions__footer-label font-normal text-base text-on-lightest text-start\">\n {{ '@auth:sessions.terminate-old.inactive-for' | translate | async }}\n </div>\n <div class=\"axm-user-sessions__footer-select\">\n <ax-select-box\n [ngModel]=\"expireTime()\"\n (onValueChanged)=\"onChangeSessionExpireTime($event)\"\n [dataSource]=\"dataSource\"\n textField=\"name\"\n valueField=\"id\"\n [placeholder]=\"('@auth:sessions.terminate-old.placeholder' | translate | async) ?? ''\"\n >\n </ax-select-box>\n </div>\n </div>\n </div>\n </ax-suffix>\n</ax-footer>\n", styles: ["@layer properties;.axm-user-sessions__content,.axm-user-sessions__footer{box-sizing:border-box}.axm-user-sessions__row{display:flex;width:100%;min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-lightest-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));padding:calc(var(--spacing, .25rem) * 3);color:rgba(var(--ax-sys-color-on-lightest-surface))}.axm-user-sessions__icon{display:grid;width:calc(var(--spacing, .25rem) * 12);height:calc(var(--spacing, .25rem) * 12);flex-shrink:0;place-items:center;border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px}.axm-user-sessions__icon--primary{border-color:rgba(var(--ax-sys-color-primary-200));background-color:rgba(var(--ax-sys-color-primary-50));color:rgba(var(--ax-sys-color-primary-500))}.axm-user-sessions__icon--danger{border-color:rgba(var(--ax-sys-color-danger-200));background-color:rgba(var(--ax-sys-color-danger-50));color:rgba(var(--ax-sys-color-danger-500))}.axm-user-sessions__icon i{margin:0;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));--tw-leading: 1;line-height:1}.axm-user-sessions__meta{color:rgb(var(--ax-sys-color-on-lighter-surface))}.axm-user-sessions__action{pointer-events:auto;position:relative;z-index:10;flex-shrink:0;cursor:pointer}.axm-user-sessions__footer-setting{display:flex;width:100%;min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 3)}.axm-user-sessions__footer-label{flex-shrink:0}.axm-user-sessions__footer-select{margin-inline-start:auto;min-width:calc(var(--spacing, .25rem) * 48);flex:0 1 18rem}@media(max-width:640px){.axm-user-sessions__footer-setting{flex-wrap:wrap}.axm-user-sessions__footer-select{margin-inline-start:0px;max-width:none;flex:1 1 100%}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i4.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "itemHeight", "maxVisibleItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
223
+ }
224
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMUserSessionsComponent, decorators: [{
225
+ type: Component,
226
+ args: [{ selector: 'axm-user-sessions', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'axm-user-sessions' }, imports: [
227
+ AXButtonModule,
228
+ AXDecoratorModule,
229
+ CommonModule,
230
+ FormsModule,
231
+ AXFormatModule,
232
+ AXSelectBoxModule,
233
+ AXDropdownModule,
234
+ AXPopoverModule,
235
+ AXTranslationModule,
236
+ ], template: "<ax-content>\n <div class=\"axm-user-sessions__content flex flex-col gap-4 p-6 w-full min-w-0\">\n <!-- ----- This device (current session) ----- -->\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.this-device.title' | translate | async }}\n </p>\n <div class=\"axm-user-sessions__row\">\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--primary\">\n <i class=\"{{ getSessionIcon(activeSessionView()?.session) }}\"></i>\n </div>\n <!--->\n <!-- ----- Current session details when available ----- -->\n @if (activeSessionView(); as current) {\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ current.title }}</div>\n @if (current.subtitle) {\n <div class=\"font-normal text-sm\">{{ current.subtitle }}</div>\n }\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">{{ current.metaLabel }}</p>\n </div>\n }\n </div>\n\n <!--->\n <!-- ----- Other sessions: terminate-all + device list ----- -->\n @if (items().length > 0) {\n <!-- ----- Terminate all other sessions (never current) ----- -->\n <div\n class=\"axm-user-sessions__row cursor-pointer\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onTerminateAll()\"\n (keydown.enter)=\"onTerminateAll()\"\n >\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--danger\">\n <i class=\"ax-icon ax-icon-clear\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">\n {{ '@auth:sessions.terminate-all.title' | translate | async }}\n </div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-sm\">\n {{ '@auth:sessions.terminate-all.description' | translate | async }}\n </p>\n </div>\n </div>\n\n <!-- ----- Other active devices ----- -->\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.active-devices.title' | translate | async }}\n </p>\n @for (item of items(); track item.id) {\n <div class=\"axm-user-sessions__row\">\n <div class=\"axm-user-sessions__icon\">\n <i class=\"{{ item.icon }}\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ item.title }}</div>\n @if (item.subtitle) {\n <div class=\"font-normal text-sm\">{{ item.subtitle }}</div>\n }\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">{{ item.metaLabel }}</p>\n </div>\n <ax-button\n class=\"axm-user-sessions__action\"\n look=\"blank\"\n color=\"danger\"\n [attr.aria-label]=\"('@general:actions.remove.title' | translate | async) ?? ''\"\n (onClick)=\"onTerminate(item.id)\"\n >\n <ax-icon icon=\"fa-light fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n }\n }\n </div>\n</ax-content>\n<ax-footer>\n <ax-suffix>\n <div class=\"axm-user-sessions__footer flex w-full min-w-0 flex-col gap-1 px-4 py-2\">\n <p class=\"m-0 text-start font-medium text-base text-danger-500\">\n {{ '@auth:sessions.terminate-old.title' | translate | async }}\n </p>\n <div class=\"axm-user-sessions__footer-setting\">\n <div class=\"axm-user-sessions__footer-label font-normal text-base text-on-lightest text-start\">\n {{ '@auth:sessions.terminate-old.inactive-for' | translate | async }}\n </div>\n <div class=\"axm-user-sessions__footer-select\">\n <ax-select-box\n [ngModel]=\"expireTime()\"\n (onValueChanged)=\"onChangeSessionExpireTime($event)\"\n [dataSource]=\"dataSource\"\n textField=\"name\"\n valueField=\"id\"\n [placeholder]=\"('@auth:sessions.terminate-old.placeholder' | translate | async) ?? ''\"\n >\n </ax-select-box>\n </div>\n </div>\n </div>\n </ax-suffix>\n</ax-footer>\n", styles: ["@layer properties;.axm-user-sessions__content,.axm-user-sessions__footer{box-sizing:border-box}.axm-user-sessions__row{display:flex;width:100%;min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-lightest-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));padding:calc(var(--spacing, .25rem) * 3);color:rgba(var(--ax-sys-color-on-lightest-surface))}.axm-user-sessions__icon{display:grid;width:calc(var(--spacing, .25rem) * 12);height:calc(var(--spacing, .25rem) * 12);flex-shrink:0;place-items:center;border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px}.axm-user-sessions__icon--primary{border-color:rgba(var(--ax-sys-color-primary-200));background-color:rgba(var(--ax-sys-color-primary-50));color:rgba(var(--ax-sys-color-primary-500))}.axm-user-sessions__icon--danger{border-color:rgba(var(--ax-sys-color-danger-200));background-color:rgba(var(--ax-sys-color-danger-50));color:rgba(var(--ax-sys-color-danger-500))}.axm-user-sessions__icon i{margin:0;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)));--tw-leading: 1;line-height:1}.axm-user-sessions__meta{color:rgb(var(--ax-sys-color-on-lighter-surface))}.axm-user-sessions__action{pointer-events:auto;position:relative;z-index:10;flex-shrink:0;cursor:pointer}.axm-user-sessions__footer-setting{display:flex;width:100%;min-width:0px;align-items:center;gap:calc(var(--spacing, .25rem) * 3)}.axm-user-sessions__footer-label{flex-shrink:0}.axm-user-sessions__footer-select{margin-inline-start:auto;min-width:calc(var(--spacing, .25rem) * 48);flex:0 1 18rem}@media(max-width:640px){.axm-user-sessions__footer-setting{flex-wrap:wrap}.axm-user-sessions__footer-select{margin-inline-start:0px;max-width:none;flex:1 1 100%}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
237
+ }], ctorParameters: () => [] });
238
+
239
+ //#region ---- Open sessions command ----
240
+ /** Opens the active sessions popup for the current user. */
241
+ class AXPOpenSessionsCommand {
242
+ constructor() {
243
+ //#region ---- Services & Dependencies ----
244
+ this.popupService = inject(AXPopupService);
245
+ this.translateService = inject(AXTranslationService);
246
+ }
247
+ //#endregion
248
+ //#region ---- Command ----
249
+ async execute() {
250
+ await this.popupService.open(AXMUserSessionsComponent, {
251
+ title: await this.translateService.translateAsync('@auth:profile.sessions'),
252
+ size: 'md',
253
+ });
254
+ return { success: true, kind: 'object', data: undefined };
255
+ }
256
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOpenSessionsCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
257
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOpenSessionsCommand, providedIn: 'root' }); }
258
+ }
259
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOpenSessionsCommand, decorators: [{
260
+ type: Injectable,
261
+ args: [{ providedIn: 'root' }]
262
+ }] });
263
+
264
+ export { AXPOpenSessionsCommand };
265
+ //# sourceMappingURL=acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs.map