@acorex-platform/extension-communication-hcm-client 0.0.32 → 0.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-communication-hcm-client-contracts.mjs","sources":["../../../../libs/extensions/communication/hcm/contracts/src/root-config.ts","../../../../libs/extensions/communication/hcm/contracts/src/commands.keys.ts","../../../../libs/extensions/communication/hcm/contracts/src/acorex-platform-extension-communication-hcm-client-contracts.ts"],"sourcesContent":["//#region ---- Module Config ----\n\nconst config = {\n i18n: 'extensions-communication-hcm',\n};\n\nconst MODULE_NAME = 'CommunicationHcmExtension';\n\nexport const RootConfig = {\n config,\n module: {\n name: MODULE_NAME,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-cake-candles',\n },\n birthday: {\n /** Stable ContentManagement.TextTemplate id (see AXM_TEXT_TEMPLATE_IDS.employeeHappyBirthday). */\n templateId: 'c7100007-0001-4111-b111-070707070707',\n providerKey: 'communication-hcm',\n /** Default cron for the seeded Job Schedule — manage timing in Job Schedules UI. */\n defaultCron: '0 6 * * *',\n },\n joining: {\n /** Stable ContentManagement.TextTemplate id (see AXM_TEXT_TEMPLATE_IDS.employeeJoiningCompany). */\n templateId: 'c7100008-0001-4111-b111-080808080808',\n providerKey: 'communication-hcm',\n /** Default cron for the seeded Job Schedule — manage timing in Job Schedules UI. */\n defaultCron: '0 6 * * *',\n },\n birthdayDigest: {\n /** Stable ContentManagement.TextTemplate id (see AXM_TEXT_TEMPLATE_IDS.employeeBirthdayDigest). */\n templateId: 'c710000d-0001-4111-b111-0d0d0d0d0d0d',\n providerKey: 'communication-hcm',\n defaultCron: '0 6 * * *',\n },\n joiningDigest: {\n /** Stable ContentManagement.TextTemplate id (see AXM_TEXT_TEMPLATE_IDS.employeeJoiningDigest). */\n templateId: 'c710000e-0001-4111-b111-0e0e0e0e0e0e',\n providerKey: 'communication-hcm',\n defaultCron: '0 6 * * *',\n },\n tenantLoginDigest: {\n /** Stable ContentManagement.TextTemplate id (see AXM_TEXT_TEMPLATE_IDS.tenantLoginDigest). */\n templateId: 'c710000f-0001-4111-b111-0f0f0f0f0f0f',\n providerKey: 'communication-hcm',\n defaultCron: '0 7 * * *',\n /** Tenants with no DeviceSessions.lastLoginDate inside this many days. */\n windowDays: 30,\n },\n} as const;\n\n//#endregion\n","//#region ---- Communication HCM command keys ----\n\nexport const AXECommunicationHcmCommandKeys = {\n EmployeeBirthdayRun: 'CommunicationHcmExtension:EmployeeBirthday:Run',\n EmployeeJoiningRun: 'CommunicationHcmExtension:EmployeeJoining:Run',\n EmployeeBirthdayDigestRun: 'CommunicationHcmExtension:EmployeeBirthdayDigest:Run',\n EmployeeJoiningDigestRun: 'CommunicationHcmExtension:EmployeeJoiningDigest:Run',\n TenantLoginDigestRun: 'CommunicationHcmExtension:TenantLoginDigest:Run',\n} as const;\n\nexport const AXE_COMMUNICATION_HCM_EMPLOYEE_BIRTHDAY_COMMAND_KEY =\n AXECommunicationHcmCommandKeys.EmployeeBirthdayRun;\n\nexport const AXE_COMMUNICATION_HCM_EMPLOYEE_JOINING_COMMAND_KEY =\n AXECommunicationHcmCommandKeys.EmployeeJoiningRun;\n\nexport const AXE_COMMUNICATION_HCM_EMPLOYEE_BIRTHDAY_DIGEST_COMMAND_KEY =\n AXECommunicationHcmCommandKeys.EmployeeBirthdayDigestRun;\n\nexport const AXE_COMMUNICATION_HCM_EMPLOYEE_JOINING_DIGEST_COMMAND_KEY =\n AXECommunicationHcmCommandKeys.EmployeeJoiningDigestRun;\n\nexport const AXE_COMMUNICATION_HCM_TENANT_LOGIN_DIGEST_COMMAND_KEY =\n AXECommunicationHcmCommandKeys.TenantLoginDigestRun;\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;AAEA,MAAM,MAAM,GAAG;AACb,IAAA,IAAI,EAAE,8BAA8B;CACrC;AAED,MAAM,WAAW,GAAG,2BAA2B;AAExC,MAAM,UAAU,GAAG;IACxB,MAAM;AACN,IAAA,MAAM,EAAE;AACN,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,KAAK,EAAE,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,CAAA,aAAA,CAAe;AACrC,QAAA,IAAI,EAAE,0BAA0B;AACjC,KAAA;AACD,IAAA,QAAQ,EAAE;;AAER,QAAA,UAAU,EAAE,sCAAsC;AAClD,QAAA,WAAW,EAAE,mBAAmB;;AAEhC,QAAA,WAAW,EAAE,WAAW;AACzB,KAAA;AACD,IAAA,OAAO,EAAE;;AAEP,QAAA,UAAU,EAAE,sCAAsC;AAClD,QAAA,WAAW,EAAE,mBAAmB;;AAEhC,QAAA,WAAW,EAAE,WAAW;AACzB,KAAA;AACD,IAAA,cAAc,EAAE;;AAEd,QAAA,UAAU,EAAE,sCAAsC;AAClD,QAAA,WAAW,EAAE,mBAAmB;AAChC,QAAA,WAAW,EAAE,WAAW;AACzB,KAAA;AACD,IAAA,aAAa,EAAE;;AAEb,QAAA,UAAU,EAAE,sCAAsC;AAClD,QAAA,WAAW,EAAE,mBAAmB;AAChC,QAAA,WAAW,EAAE,WAAW;AACzB,KAAA;AACD,IAAA,iBAAiB,EAAE;;AAEjB,QAAA,UAAU,EAAE,sCAAsC;AAClD,QAAA,WAAW,EAAE,mBAAmB;AAChC,QAAA,WAAW,EAAE,WAAW;;AAExB,QAAA,UAAU,EAAE,EAAE;AACf,KAAA;;AAGH;;ACnDA;AAEO,MAAM,8BAA8B,GAAG;AAC5C,IAAA,mBAAmB,EAAE,gDAAgD;AACrE,IAAA,kBAAkB,EAAE,+CAA+C;AACnE,IAAA,yBAAyB,EAAE,sDAAsD;AACjF,IAAA,wBAAwB,EAAE,qDAAqD;AAC/E,IAAA,oBAAoB,EAAE,iDAAiD;;AAGlE,MAAM,mDAAmD,GAC9D,8BAA8B,CAAC;AAE1B,MAAM,kDAAkD,GAC7D,8BAA8B,CAAC;AAE1B,MAAM,0DAA0D,GACrE,8BAA8B,CAAC;AAE1B,MAAM,yDAAyD,GACpE,8BAA8B,CAAC;AAE1B,MAAM,qDAAqD,GAChE,8BAA8B,CAAC;AAEjC;;ACzBA;;AAEG
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-communication-hcm-client-contracts.mjs","sources":["../../../../libs/extensions/communication/hcm/contracts/src/root-config.ts","../../../../libs/extensions/communication/hcm/contracts/src/commands.keys.ts","../../../../libs/extensions/communication/hcm/contracts/src/acorex-platform-extension-communication-hcm-client-contracts.ts"],"sourcesContent":["//#region ---- Module Config ----\n\nconst config = {\n i18n: 'extensions-communication-hcm',\n};\n\nconst MODULE_NAME = 'CommunicationHcmExtension';\n\nexport const RootConfig = {\n config,\n module: {\n name: MODULE_NAME,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-cake-candles',\n },\n birthday: {\n /** Stable ContentManagement.TextTemplate id (see AXM_TEXT_TEMPLATE_IDS.employeeHappyBirthday). */\n templateId: 'c7100007-0001-4111-b111-070707070707',\n providerKey: 'communication-hcm',\n /** Default cron for the seeded Job Schedule — manage timing in Job Schedules UI. */\n defaultCron: '0 6 * * *',\n },\n joining: {\n /** Stable ContentManagement.TextTemplate id (see AXM_TEXT_TEMPLATE_IDS.employeeJoiningCompany). */\n templateId: 'c7100008-0001-4111-b111-080808080808',\n providerKey: 'communication-hcm',\n /** Default cron for the seeded Job Schedule — manage timing in Job Schedules UI. */\n defaultCron: '0 6 * * *',\n },\n birthdayDigest: {\n /** Stable ContentManagement.TextTemplate id (see AXM_TEXT_TEMPLATE_IDS.employeeBirthdayDigest). */\n templateId: 'c710000d-0001-4111-b111-0d0d0d0d0d0d',\n providerKey: 'communication-hcm',\n defaultCron: '0 6 * * *',\n },\n joiningDigest: {\n /** Stable ContentManagement.TextTemplate id (see AXM_TEXT_TEMPLATE_IDS.employeeJoiningDigest). */\n templateId: 'c710000e-0001-4111-b111-0e0e0e0e0e0e',\n providerKey: 'communication-hcm',\n defaultCron: '0 6 * * *',\n },\n tenantLoginDigest: {\n /** Stable ContentManagement.TextTemplate id (see AXM_TEXT_TEMPLATE_IDS.tenantLoginDigest). */\n templateId: 'c710000f-0001-4111-b111-0f0f0f0f0f0f',\n providerKey: 'communication-hcm',\n defaultCron: '0 7 * * *',\n /** Tenants with no DeviceSessions.lastLoginDate inside this many days. */\n windowDays: 30,\n },\n} as const;\n\n//#endregion\n","//#region ---- Communication HCM command keys ----\n\nexport const AXECommunicationHcmCommandKeys = {\n EmployeeBirthdayRun: 'CommunicationHcmExtension:EmployeeBirthday:Run',\n EmployeeJoiningRun: 'CommunicationHcmExtension:EmployeeJoining:Run',\n EmployeeBirthdayDigestRun: 'CommunicationHcmExtension:EmployeeBirthdayDigest:Run',\n EmployeeJoiningDigestRun: 'CommunicationHcmExtension:EmployeeJoiningDigest:Run',\n TenantLoginDigestRun: 'CommunicationHcmExtension:TenantLoginDigest:Run',\n} as const;\n\nexport const AXE_COMMUNICATION_HCM_EMPLOYEE_BIRTHDAY_COMMAND_KEY =\n AXECommunicationHcmCommandKeys.EmployeeBirthdayRun;\n\nexport const AXE_COMMUNICATION_HCM_EMPLOYEE_JOINING_COMMAND_KEY =\n AXECommunicationHcmCommandKeys.EmployeeJoiningRun;\n\nexport const AXE_COMMUNICATION_HCM_EMPLOYEE_BIRTHDAY_DIGEST_COMMAND_KEY =\n AXECommunicationHcmCommandKeys.EmployeeBirthdayDigestRun;\n\nexport const AXE_COMMUNICATION_HCM_EMPLOYEE_JOINING_DIGEST_COMMAND_KEY =\n AXECommunicationHcmCommandKeys.EmployeeJoiningDigestRun;\n\nexport const AXE_COMMUNICATION_HCM_TENANT_LOGIN_DIGEST_COMMAND_KEY =\n AXECommunicationHcmCommandKeys.TenantLoginDigestRun;\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;AAEA,MAAM,MAAM,GAAG;AACb,IAAA,IAAI,EAAE,8BAA8B;CACrC;AAED,MAAM,WAAW,GAAG,2BAA2B;AAExC,MAAM,UAAU,GAAG;IACxB,MAAM;AACN,IAAA,MAAM,EAAE;AACN,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,KAAK,EAAE,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,CAAA,aAAA,CAAe;AACrC,QAAA,IAAI,EAAE,0BAA0B;AACjC,KAAA;AACD,IAAA,QAAQ,EAAE;;AAER,QAAA,UAAU,EAAE,sCAAsC;AAClD,QAAA,WAAW,EAAE,mBAAmB;;AAEhC,QAAA,WAAW,EAAE,WAAW;AACzB,KAAA;AACD,IAAA,OAAO,EAAE;;AAEP,QAAA,UAAU,EAAE,sCAAsC;AAClD,QAAA,WAAW,EAAE,mBAAmB;;AAEhC,QAAA,WAAW,EAAE,WAAW;AACzB,KAAA;AACD,IAAA,cAAc,EAAE;;AAEd,QAAA,UAAU,EAAE,sCAAsC;AAClD,QAAA,WAAW,EAAE,mBAAmB;AAChC,QAAA,WAAW,EAAE,WAAW;AACzB,KAAA;AACD,IAAA,aAAa,EAAE;;AAEb,QAAA,UAAU,EAAE,sCAAsC;AAClD,QAAA,WAAW,EAAE,mBAAmB;AAChC,QAAA,WAAW,EAAE,WAAW;AACzB,KAAA;AACD,IAAA,iBAAiB,EAAE;;AAEjB,QAAA,UAAU,EAAE,sCAAsC;AAClD,QAAA,WAAW,EAAE,mBAAmB;AAChC,QAAA,WAAW,EAAE,WAAW;;AAExB,QAAA,UAAU,EAAE,EAAE;AACf,KAAA;;AAGH;;ACnDA;AAEO,MAAM,8BAA8B,GAAG;AAC5C,IAAA,mBAAmB,EAAE,gDAAgD;AACrE,IAAA,kBAAkB,EAAE,+CAA+C;AACnE,IAAA,yBAAyB,EAAE,sDAAsD;AACjF,IAAA,wBAAwB,EAAE,qDAAqD;AAC/E,IAAA,oBAAoB,EAAE,iDAAiD;;AAGlE,MAAM,mDAAmD,GAC9D,8BAA8B,CAAC;AAE1B,MAAM,kDAAkD,GAC7D,8BAA8B,CAAC;AAE1B,MAAM,0DAA0D,GACrE,8BAA8B,CAAC;AAE1B,MAAM,yDAAyD,GACpE,8BAA8B,CAAC;AAE1B,MAAM,qDAAqD,GAChE,8BAA8B,CAAC;AAEjC;;ACzBA;;AAEG;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-communication-hcm-client.mjs","sources":["../../../../libs/extensions/communication/hcm/client/src/lib/org-chart/org-chart-email-node-contribution.provider.ts","../../../../libs/extensions/communication/hcm/client/src/lib/communication-hcm-extension.module.ts","../../../../libs/extensions/communication/hcm/client/src/acorex-platform-extension-communication-hcm-client.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXDialogService } from '@acorex/components/dialog';\nimport {\n resolveMultiLanguageString,\n AXTranslationService,\n} from '@acorex/core/translation';\nimport {\n COMMUNICATION_MANAGEMENT_EMAIL_SHOW_DIALOG_COMMAND_KEY,\n type CommunicationManagementEmailSendResult,\n type CommunicationManagementEmailShowDialogInput,\n} from '@acorex-platform/module-communication-management-client/contracts';\nimport {\n AXM_ORG_CHART_COMMUNICATION_SUBMENU_GROUP_ID,\n AXM_ORG_CHART_COMMUNICATION_SUBMENU_ICON,\n AXM_ORG_CHART_COMMUNICATION_SUBMENU_TITLE_I18N_KEY,\n AXM_ORG_CHART_EMPLOYEE_SUBMENU_GROUP_ID,\n AXM_ORG_CHART_EMPLOYEE_SUBMENU_ICON,\n AXM_ORG_CHART_EMPLOYEE_SUBMENU_TITLE_I18N_KEY,\n axmResolveOrgChartFlyoutEmployeeId,\n type AXMOrgChartNodeContributionContext,\n AXMOrgChartNodeContributionProvider,\n type AXMOrgChartNodeMenuAction,\n} from '@acorex-platform/module-organization-management-client';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { inject, Injectable, LOCALE_ID } from '@angular/core';\n\n//#endregion\n\n/** Human Capital employee entity key for `AXPEntityService` (must match seeded entity id). */\nconst HCM_EMPLOYEE_ENTITY_KEY = 'HumanCapitalManagement.Employee';\n\n/** Person entity key used when employee rows omit nested `person.emails`. */\nconst PERSON_CORE_PERSON_ENTITY_KEY = 'PersonCore.Person';\n\n/** Console filter: `[OrgChartEmail]` */\nconst ORG_CHART_EMAIL_LOG_PREFIX = '[OrgChartEmail]';\n\nconst i18nKey = (suffix: string): string =>\n `@communication-management:email.org-chart.${suffix}`;\n\n//#region ---- Provider ----\n\n/**\n * Adds org chart context menu entries: **group** email on business unit nodes (Communication flyout); **private**\n * email to the assigned person on company root, BU, position, or employee nodes under the **Employee** flyout.\n * Group actions share `AXM_ORG_CHART_COMMUNICATION_SUBMENU_GROUP_ID` with the conversation org-chart extension.\n */\n@Injectable()\nexport class AXMOrgChartEmailNodeContributionProvider\n implements AXMOrgChartNodeContributionProvider\n{\n private readonly entityService = inject(AXPEntityService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly dialogService = inject(AXDialogService);\n private readonly translation = inject(AXTranslationService);\n private readonly localeId = inject(LOCALE_ID);\n private readonly commandService = inject(AXPCommandService);\n\n async getMenuActions(\n context: AXMOrgChartNodeContributionContext,\n ): Promise<AXMOrgChartNodeMenuAction[]> {\n const actions: AXMOrgChartNodeMenuAction[] = [];\n\n if (context.nodeKind === 'business-unit') {\n const buId = this.resolveBusinessUnitId(context);\n actions.push({\n id: 'communication-hcm.org-chart.group-email-bu',\n title: i18nKey('group-email-bu'),\n icon: 'fa-light fa-users',\n order: 110,\n break: 'both',\n disabled: !buId,\n submenuGroupId: AXM_ORG_CHART_COMMUNICATION_SUBMENU_GROUP_ID,\n submenuGroupTitle: AXM_ORG_CHART_COMMUNICATION_SUBMENU_TITLE_I18N_KEY,\n submenuGroupIcon: AXM_ORG_CHART_COMMUNICATION_SUBMENU_ICON,\n execute: async (ctx: AXMOrgChartNodeContributionContext) => {\n await this.openGroupEmailForBusinessUnit(ctx);\n },\n });\n }\n\n const flyoutEmployeeId = axmResolveOrgChartFlyoutEmployeeId(context);\n if (flyoutEmployeeId) {\n const menuId = this.resolvePrivateEmailActionId(context);\n const emailDisabled =\n await this.isSendEmailDisabledForEmployee(flyoutEmployeeId);\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'getMenuActions private email',\n {\n nodeKind: context.nodeKind,\n menuId,\n flyoutEmployeeId,\n sendEmailDisabled: emailDisabled,\n },\n );\n actions.push({\n id: menuId,\n title: i18nKey('send-email'),\n icon: 'fa-light fa-envelope',\n order: 42,\n disabled: emailDisabled,\n submenuGroupId: AXM_ORG_CHART_EMPLOYEE_SUBMENU_GROUP_ID,\n submenuGroupTitle: AXM_ORG_CHART_EMPLOYEE_SUBMENU_TITLE_I18N_KEY,\n submenuGroupIcon: AXM_ORG_CHART_EMPLOYEE_SUBMENU_ICON,\n execute: async (ctx: AXMOrgChartNodeContributionContext) => {\n await this.openPrivateEmailForFlyoutPerson(ctx);\n },\n });\n }\n\n return actions;\n }\n\n private resolvePrivateEmailActionId(\n context: AXMOrgChartNodeContributionContext,\n ): string {\n switch (context.nodeKind) {\n case 'company-root':\n return 'communication-hcm.org-chart.private-email-top-executive';\n case 'business-unit':\n return 'communication-hcm.org-chart.private-email-bu-head';\n case 'employee':\n return 'communication-hcm.org-chart.send-email-employee';\n case 'position':\n return 'communication-hcm.org-chart.send-email-position-occupant';\n default:\n return 'communication-hcm.org-chart.send-email-employee';\n }\n }\n\n private resolvePrivateEmailSubjectLabel(\n context: AXMOrgChartNodeContributionContext,\n ): string {\n switch (context.nodeKind) {\n case 'company-root':\n return this.resolveTopExecutiveEmailSubjectName(context);\n case 'position': {\n const occ = context.node.metadata?.['occupant'] as\n | Record<string, unknown>\n | undefined;\n const dn = occ?.['displayName'];\n return typeof dn === 'string' && dn.trim().length > 0\n ? dn.trim()\n : this.resolveNodeTitle(context);\n }\n default:\n return this.resolveNodeTitle(context);\n }\n }\n\n private async openPrivateEmailForFlyoutPerson(\n context: AXMOrgChartNodeContributionContext,\n ): Promise<void> {\n const employeeId = axmResolveOrgChartFlyoutEmployeeId(context);\n if (!employeeId) {\n await this.showError('load-employee');\n return;\n }\n let email: string | undefined;\n try {\n email = await this.resolvePrimaryEmailForEmployeeId(employeeId);\n } catch {\n await this.showError('load-employee');\n return;\n }\n if (!email) {\n await this.showError('no-email');\n return;\n }\n const label = this.resolvePrivateEmailSubjectLabel(context);\n await this.openSendEmailDialog({\n to: email,\n subject: this.translation.translateSync(\n i18nKey('prefilled-subject-private'),\n {\n params: { unit: label },\n },\n ),\n });\n }\n\n private resolveBusinessUnitId(\n context: AXMOrgChartNodeContributionContext,\n ): string | undefined {\n const raw =\n context.node.entity?.id ??\n (context.node.metadata?.['businessUnitId'] as string | undefined) ??\n (context.node.metadata?.['unitId'] as string | undefined);\n if (raw == null || String(raw).trim().length === 0) {\n return undefined;\n }\n return String(raw).trim();\n }\n\n private async isSendEmailDisabledForEmployee(\n employeeId: string,\n ): Promise<boolean> {\n let email: string | undefined;\n try {\n email = await this.resolvePrimaryEmailForEmployeeId(employeeId);\n } catch (err) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'isSendEmailDisabledForEmployee: resolvePrimaryEmail threw',\n {\n employeeId,\n err,\n },\n );\n return true;\n }\n if (!email) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'isSendEmailDisabledForEmployee: disabled - no resolvable email',\n {\n employeeId,\n },\n );\n return true;\n }\n const userId = await this.resolveUserIdForEmployee(employeeId);\n const currentUserId = this.sessionService.user?.id;\n if (userId && currentUserId != null && userId === currentUserId) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'isSendEmailDisabledForEmployee: disabled - same user as session',\n {\n employeeId,\n employeeUserId: userId,\n sessionUserId: currentUserId,\n resolvedEmail: email,\n },\n );\n return true;\n }\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'isSendEmailDisabledForEmployee: enabled',\n {\n employeeId,\n employeeUserId: userId ?? null,\n sessionUserId: currentUserId ?? null,\n resolvedEmail: email,\n },\n );\n return false;\n }\n\n private async resolveUserIdForEmployee(\n employeeId: string,\n ): Promise<string | undefined> {\n const row = await this.entityService\n .withEntity(HCM_EMPLOYEE_ENTITY_KEY)\n .data()\n .byKey(employeeId);\n const userId = (row as { userId?: string } | null)?.userId;\n return userId != null && String(userId).trim().length > 0\n ? String(userId)\n : undefined;\n }\n\n private resolveNodeTitle(\n context: AXMOrgChartNodeContributionContext,\n ): string {\n const raw = context.node.title;\n if (typeof raw === 'string') {\n return (\n raw.trim() || this.translation.translateSync(i18nKey('fallback-unit'))\n );\n }\n return (\n resolveMultiLanguageString(raw, this.localeId).trim() ||\n this.translation.translateSync(i18nKey('fallback-unit'))\n );\n }\n\n private async showError(key: string): Promise<void> {\n const title = await this.translation.translateAsync(i18nKey('error-title'));\n const message = await this.translation.translateAsync(\n i18nKey(`errors.${key}`),\n );\n await this.dialogService.alert(title, message, 'danger');\n }\n\n private async openSendEmailDialog(\n input: CommunicationManagementEmailShowDialogInput,\n ): Promise<void> {\n await this.commandService.execute<\n CommunicationManagementEmailShowDialogInput,\n CommunicationManagementEmailSendResult | null\n >(COMMUNICATION_MANAGEMENT_EMAIL_SHOW_DIALOG_COMMAND_KEY, input);\n }\n\n private resolveTopExecutiveEmailSubjectName(\n context: AXMOrgChartNodeContributionContext,\n ): string {\n const topRole = context.node.metadata?.['topRole'] as\n | Record<string, unknown>\n | undefined;\n const rawName = topRole?.['employeeName'];\n if (typeof rawName === 'string' && rawName.trim().length > 0) {\n return rawName.trim();\n }\n return this.resolveNodeTitle(context);\n }\n\n private async openGroupEmailForBusinessUnit(\n context: AXMOrgChartNodeContributionContext,\n ): Promise<void> {\n const buId = this.resolveBusinessUnitId(context);\n if (!buId) {\n await this.showError('no-business-unit');\n return;\n }\n let to: string;\n try {\n to = await this.loadRecipientEmailsForBusinessUnit(buId);\n } catch {\n await this.showError('load-emails');\n return;\n }\n if (!to.trim()) {\n await this.showError('no-members');\n return;\n }\n const unitTitle = this.resolveNodeTitle(context);\n await this.openSendEmailDialog({\n to,\n subject: this.translation.translateSync(\n i18nKey('prefilled-subject-group'),\n {\n params: { unit: unitTitle },\n },\n ),\n });\n }\n\n /**\n * Collects distinct work/person email values for active employees whose primary BU matches\n * {@link businessUnitId}. Omits the signed-in user's mailbox when it can be resolved (same idea as group chat).\n */\n private async loadRecipientEmailsForBusinessUnit(\n businessUnitId: string,\n ): Promise<string> {\n const filter = {\n logic: 'and' as const,\n filters: [\n {\n field: 'activePrimaryBusinessUnitId',\n value: businessUnitId,\n operator: { type: 'equal' as const },\n },\n ],\n };\n const { items } = await this.entityService\n .withEntity(HCM_EMPLOYEE_ENTITY_KEY)\n .data()\n .query({\n skip: 0,\n take: 500,\n filter,\n });\n const currentUserId = this.sessionService.user?.id;\n const emails = new Set<string>();\n for (const row of items as Array<{ id?: string; userId?: string }>) {\n const uid =\n row.userId != null && String(row.userId).trim()\n ? String(row.userId)\n : undefined;\n if (currentUserId != null && uid === currentUserId) {\n continue;\n }\n const employeeId =\n row.id != null && String(row.id).trim() ? String(row.id) : undefined;\n if (!employeeId) {\n continue;\n }\n const email = await this.resolvePrimaryEmailForEmployeeId(employeeId);\n if (email) {\n emails.add(email);\n }\n }\n return [...emails].join(', ');\n }\n\n /**\n * Resolves a mailbox for org-chart actions. Uses {@link PersonCore.Person} before the denormalized\n * `employee.person` snapshot so edits saved only to Person (or a fresh Person row) are visible even\n * when the employee record still embeds an older `person` from seed or partial merges.\n */\n private async resolvePrimaryEmailForEmployeeId(\n employeeId: string,\n ): Promise<string | undefined> {\n const row = await this.entityService\n .withEntity(HCM_EMPLOYEE_ENTITY_KEY)\n .data()\n .byKey(employeeId);\n if (row == null || typeof row !== 'object') {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: employee row missing',\n { employeeId },\n );\n return undefined;\n }\n const er = row as {\n emails?: unknown;\n personId?: string;\n person?: { emails?: unknown };\n ['person.emails']?: unknown;\n };\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: employee row snapshot',\n {\n employeeId,\n personId: er.personId ?? null,\n topLevelEmailsCount: Array.isArray(er.emails) ? er.emails.length : 0,\n flatPersonEmailsCount: Array.isArray(er['person.emails'])\n ? er['person.emails'].length\n : 0,\n nestedPersonEmailsCount: Array.isArray(er.person?.emails)\n ? er.person!.emails.length\n : 0,\n },\n );\n\n const fromEmployeeTop = this.extractPrimaryEmailFromEmailsList(er.emails);\n if (fromEmployeeTop) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: source employee.emails',\n {\n employeeId,\n email: fromEmployeeTop,\n },\n );\n return fromEmployeeTop;\n }\n const fromFlat = this.extractPrimaryEmailFromEmailsList(\n er['person.emails'],\n );\n if (fromFlat) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: source employee[\"person.emails\"]',\n {\n employeeId,\n email: fromFlat,\n },\n );\n return fromFlat;\n }\n const personId = er.personId;\n if (personId != null && String(personId).trim().length > 0) {\n const personKey = String(personId).trim();\n const personRow = await this.entityService\n .withEntity(PERSON_CORE_PERSON_ENTITY_KEY)\n .data()\n .byKey(personKey);\n const fromPersonCore =\n this.extractPrimaryEmailFromPersonLikeRow(personRow);\n const pr = personRow as { emails?: unknown } | null | undefined;\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: PersonCore.Person byKey',\n {\n employeeId,\n personId: personKey,\n personRowFound: personRow != null,\n personEmailsCount: Array.isArray(pr?.emails) ? pr.emails.length : 0,\n resolved: fromPersonCore ?? null,\n },\n );\n if (fromPersonCore) {\n return fromPersonCore;\n }\n } else {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: no personId on employee',\n { employeeId },\n );\n }\n const fromNested = this.extractPrimaryEmailFromEmailsList(\n er.person?.emails,\n );\n if (fromNested) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: source employee.person.emails (fallback)',\n {\n employeeId,\n email: fromNested,\n },\n );\n } else {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: no email from any source',\n { employeeId },\n );\n }\n return fromNested;\n }\n\n /**\n * Reads the first usable address from `emails`, nested `person.emails`, or flattened `person.emails`.\n */\n private extractPrimaryEmailFromPersonLikeRow(\n row: unknown,\n ): string | undefined {\n if (row == null || typeof row !== 'object') {\n return undefined;\n }\n const r = row as {\n emails?: unknown;\n person?: { emails?: unknown };\n ['person.emails']?: unknown;\n };\n return (\n this.extractPrimaryEmailFromEmailsList(r.emails) ??\n this.extractPrimaryEmailFromEmailsList(r['person.emails']) ??\n this.extractPrimaryEmailFromEmailsList(r.person?.emails)\n );\n }\n\n /** First entry in the list that looks like an email address. */\n private extractPrimaryEmailFromEmailsList(list: unknown): string | undefined {\n if (!Array.isArray(list) || !list.length) {\n return undefined;\n }\n for (const entry of list) {\n const t = this.extractEmailStringFromContactEntry(entry);\n if (t) {\n return t;\n }\n }\n return undefined;\n }\n\n /**\n * Peels repeater / ContactBox shapes: plain string, `{ value: string }`, or nested\n * `{ value: { value: string } }` as produced by some repeaters (see entity-data-selector normalization).\n */\n private extractEmailStringFromContactEntry(\n entry: unknown,\n ): string | undefined {\n const raw = this.unwrapContactScalar(entry);\n if (raw == null) {\n return undefined;\n }\n const t = String(raw).trim();\n return t.includes('@') ? t : undefined;\n }\n\n private unwrapContactScalar(entry: unknown): string | undefined {\n if (entry == null) {\n return undefined;\n }\n if (typeof entry === 'string') {\n return entry;\n }\n if (typeof entry !== 'object') {\n return undefined;\n }\n const o = entry as Record<string, unknown>;\n const direct = o['email'] ?? o['address'];\n if (typeof direct === 'string') {\n return direct;\n }\n const v = o['value'];\n if (typeof v === 'string') {\n return v;\n }\n if (v != null && typeof v === 'object' && 'value' in v) {\n const inner = (v as { value?: unknown }).value;\n return typeof inner === 'string' ? inner : undefined;\n }\n return undefined;\n }\n}\n\n//#endregion\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AXM_ORG_CHART_NODE_CONTRIBUTOR } from '@acorex-platform/module-organization-management-client';\nimport { AXMOrgChartEmailNodeContributionProvider } from './org-chart/org-chart-email-node-contribution.provider';\n\n//#region ---- Communication HCM extension client module ----\n\n@NgModule({\n imports: [CommonModule],\n providers: [\n {\n provide: AXM_ORG_CHART_NODE_CONTRIBUTOR,\n useClass: AXMOrgChartEmailNodeContributionProvider,\n multi: true,\n },\n ],\n})\nexport class AXECommunicationHcmExtensionModule {}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-communication-hcm-client.mjs","sources":["../../../../libs/extensions/communication/hcm/client/src/lib/org-chart/org-chart-email-node-contribution.provider.ts","../../../../libs/extensions/communication/hcm/client/src/lib/communication-hcm-extension.module.ts","../../../../libs/extensions/communication/hcm/client/src/acorex-platform-extension-communication-hcm-client.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXDialogService } from '@acorex/components/dialog';\nimport {\n resolveMultiLanguageString,\n AXTranslationService,\n} from '@acorex/core/translation';\nimport {\n COMMUNICATION_MANAGEMENT_EMAIL_SHOW_DIALOG_COMMAND_KEY,\n type CommunicationManagementEmailSendResult,\n type CommunicationManagementEmailShowDialogInput,\n} from '@acorex-platform/module-communication-management-client/contracts';\nimport {\n AXM_ORG_CHART_COMMUNICATION_SUBMENU_GROUP_ID,\n AXM_ORG_CHART_COMMUNICATION_SUBMENU_ICON,\n AXM_ORG_CHART_COMMUNICATION_SUBMENU_TITLE_I18N_KEY,\n AXM_ORG_CHART_EMPLOYEE_SUBMENU_GROUP_ID,\n AXM_ORG_CHART_EMPLOYEE_SUBMENU_ICON,\n AXM_ORG_CHART_EMPLOYEE_SUBMENU_TITLE_I18N_KEY,\n axmResolveOrgChartFlyoutEmployeeId,\n type AXMOrgChartNodeContributionContext,\n AXMOrgChartNodeContributionProvider,\n type AXMOrgChartNodeMenuAction,\n} from '@acorex-platform/module-organization-management-client';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { inject, Injectable, LOCALE_ID } from '@angular/core';\n\n//#endregion\n\n/** Human Capital employee entity key for `AXPEntityService` (must match seeded entity id). */\nconst HCM_EMPLOYEE_ENTITY_KEY = 'HumanCapitalManagement.Employee';\n\n/** Person entity key used when employee rows omit nested `person.emails`. */\nconst PERSON_CORE_PERSON_ENTITY_KEY = 'PersonCore.Person';\n\n/** Console filter: `[OrgChartEmail]` */\nconst ORG_CHART_EMAIL_LOG_PREFIX = '[OrgChartEmail]';\n\nconst i18nKey = (suffix: string): string =>\n `@communication-management:email.org-chart.${suffix}`;\n\n//#region ---- Provider ----\n\n/**\n * Adds org chart context menu entries: **group** email on business unit nodes (Communication flyout); **private**\n * email to the assigned person on company root, BU, position, or employee nodes under the **Employee** flyout.\n * Group actions share `AXM_ORG_CHART_COMMUNICATION_SUBMENU_GROUP_ID` with the conversation org-chart extension.\n */\n@Injectable()\nexport class AXMOrgChartEmailNodeContributionProvider\n implements AXMOrgChartNodeContributionProvider\n{\n private readonly entityService = inject(AXPEntityService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly dialogService = inject(AXDialogService);\n private readonly translation = inject(AXTranslationService);\n private readonly localeId = inject(LOCALE_ID);\n private readonly commandService = inject(AXPCommandService);\n\n async getMenuActions(\n context: AXMOrgChartNodeContributionContext,\n ): Promise<AXMOrgChartNodeMenuAction[]> {\n const actions: AXMOrgChartNodeMenuAction[] = [];\n\n if (context.nodeKind === 'business-unit') {\n const buId = this.resolveBusinessUnitId(context);\n actions.push({\n id: 'communication-hcm.org-chart.group-email-bu',\n title: i18nKey('group-email-bu'),\n icon: 'fa-light fa-users',\n order: 110,\n break: 'both',\n disabled: !buId,\n submenuGroupId: AXM_ORG_CHART_COMMUNICATION_SUBMENU_GROUP_ID,\n submenuGroupTitle: AXM_ORG_CHART_COMMUNICATION_SUBMENU_TITLE_I18N_KEY,\n submenuGroupIcon: AXM_ORG_CHART_COMMUNICATION_SUBMENU_ICON,\n execute: async (ctx: AXMOrgChartNodeContributionContext) => {\n await this.openGroupEmailForBusinessUnit(ctx);\n },\n });\n }\n\n const flyoutEmployeeId = axmResolveOrgChartFlyoutEmployeeId(context);\n if (flyoutEmployeeId) {\n const menuId = this.resolvePrivateEmailActionId(context);\n const emailDisabled =\n await this.isSendEmailDisabledForEmployee(flyoutEmployeeId);\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'getMenuActions private email',\n {\n nodeKind: context.nodeKind,\n menuId,\n flyoutEmployeeId,\n sendEmailDisabled: emailDisabled,\n },\n );\n actions.push({\n id: menuId,\n title: i18nKey('send-email'),\n icon: 'fa-light fa-envelope',\n order: 42,\n disabled: emailDisabled,\n submenuGroupId: AXM_ORG_CHART_EMPLOYEE_SUBMENU_GROUP_ID,\n submenuGroupTitle: AXM_ORG_CHART_EMPLOYEE_SUBMENU_TITLE_I18N_KEY,\n submenuGroupIcon: AXM_ORG_CHART_EMPLOYEE_SUBMENU_ICON,\n execute: async (ctx: AXMOrgChartNodeContributionContext) => {\n await this.openPrivateEmailForFlyoutPerson(ctx);\n },\n });\n }\n\n return actions;\n }\n\n private resolvePrivateEmailActionId(\n context: AXMOrgChartNodeContributionContext,\n ): string {\n switch (context.nodeKind) {\n case 'company-root':\n return 'communication-hcm.org-chart.private-email-top-executive';\n case 'business-unit':\n return 'communication-hcm.org-chart.private-email-bu-head';\n case 'employee':\n return 'communication-hcm.org-chart.send-email-employee';\n case 'position':\n return 'communication-hcm.org-chart.send-email-position-occupant';\n default:\n return 'communication-hcm.org-chart.send-email-employee';\n }\n }\n\n private resolvePrivateEmailSubjectLabel(\n context: AXMOrgChartNodeContributionContext,\n ): string {\n switch (context.nodeKind) {\n case 'company-root':\n return this.resolveTopExecutiveEmailSubjectName(context);\n case 'position': {\n const occ = context.node.metadata?.['occupant'] as\n | Record<string, unknown>\n | undefined;\n const dn = occ?.['displayName'];\n return typeof dn === 'string' && dn.trim().length > 0\n ? dn.trim()\n : this.resolveNodeTitle(context);\n }\n default:\n return this.resolveNodeTitle(context);\n }\n }\n\n private async openPrivateEmailForFlyoutPerson(\n context: AXMOrgChartNodeContributionContext,\n ): Promise<void> {\n const employeeId = axmResolveOrgChartFlyoutEmployeeId(context);\n if (!employeeId) {\n await this.showError('load-employee');\n return;\n }\n let email: string | undefined;\n try {\n email = await this.resolvePrimaryEmailForEmployeeId(employeeId);\n } catch {\n await this.showError('load-employee');\n return;\n }\n if (!email) {\n await this.showError('no-email');\n return;\n }\n const label = this.resolvePrivateEmailSubjectLabel(context);\n await this.openSendEmailDialog({\n to: email,\n subject: this.translation.translateSync(\n i18nKey('prefilled-subject-private'),\n {\n params: { unit: label },\n },\n ),\n });\n }\n\n private resolveBusinessUnitId(\n context: AXMOrgChartNodeContributionContext,\n ): string | undefined {\n const raw =\n context.node.entity?.id ??\n (context.node.metadata?.['businessUnitId'] as string | undefined) ??\n (context.node.metadata?.['unitId'] as string | undefined);\n if (raw == null || String(raw).trim().length === 0) {\n return undefined;\n }\n return String(raw).trim();\n }\n\n private async isSendEmailDisabledForEmployee(\n employeeId: string,\n ): Promise<boolean> {\n let email: string | undefined;\n try {\n email = await this.resolvePrimaryEmailForEmployeeId(employeeId);\n } catch (err) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'isSendEmailDisabledForEmployee: resolvePrimaryEmail threw',\n {\n employeeId,\n err,\n },\n );\n return true;\n }\n if (!email) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'isSendEmailDisabledForEmployee: disabled - no resolvable email',\n {\n employeeId,\n },\n );\n return true;\n }\n const userId = await this.resolveUserIdForEmployee(employeeId);\n const currentUserId = this.sessionService.user?.id;\n if (userId && currentUserId != null && userId === currentUserId) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'isSendEmailDisabledForEmployee: disabled - same user as session',\n {\n employeeId,\n employeeUserId: userId,\n sessionUserId: currentUserId,\n resolvedEmail: email,\n },\n );\n return true;\n }\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'isSendEmailDisabledForEmployee: enabled',\n {\n employeeId,\n employeeUserId: userId ?? null,\n sessionUserId: currentUserId ?? null,\n resolvedEmail: email,\n },\n );\n return false;\n }\n\n private async resolveUserIdForEmployee(\n employeeId: string,\n ): Promise<string | undefined> {\n const row = await this.entityService\n .withEntity(HCM_EMPLOYEE_ENTITY_KEY)\n .data()\n .byKey(employeeId);\n const userId = (row as { userId?: string } | null)?.userId;\n return userId != null && String(userId).trim().length > 0\n ? String(userId)\n : undefined;\n }\n\n private resolveNodeTitle(\n context: AXMOrgChartNodeContributionContext,\n ): string {\n const raw = context.node.title;\n if (typeof raw === 'string') {\n return (\n raw.trim() || this.translation.translateSync(i18nKey('fallback-unit'))\n );\n }\n return (\n resolveMultiLanguageString(raw, this.localeId).trim() ||\n this.translation.translateSync(i18nKey('fallback-unit'))\n );\n }\n\n private async showError(key: string): Promise<void> {\n const title = await this.translation.translateAsync(i18nKey('error-title'));\n const message = await this.translation.translateAsync(\n i18nKey(`errors.${key}`),\n );\n await this.dialogService.alert(title, message, 'danger');\n }\n\n private async openSendEmailDialog(\n input: CommunicationManagementEmailShowDialogInput,\n ): Promise<void> {\n await this.commandService.execute<\n CommunicationManagementEmailShowDialogInput,\n CommunicationManagementEmailSendResult | null\n >(COMMUNICATION_MANAGEMENT_EMAIL_SHOW_DIALOG_COMMAND_KEY, input);\n }\n\n private resolveTopExecutiveEmailSubjectName(\n context: AXMOrgChartNodeContributionContext,\n ): string {\n const topRole = context.node.metadata?.['topRole'] as\n | Record<string, unknown>\n | undefined;\n const rawName = topRole?.['employeeName'];\n if (typeof rawName === 'string' && rawName.trim().length > 0) {\n return rawName.trim();\n }\n return this.resolveNodeTitle(context);\n }\n\n private async openGroupEmailForBusinessUnit(\n context: AXMOrgChartNodeContributionContext,\n ): Promise<void> {\n const buId = this.resolveBusinessUnitId(context);\n if (!buId) {\n await this.showError('no-business-unit');\n return;\n }\n let to: string;\n try {\n to = await this.loadRecipientEmailsForBusinessUnit(buId);\n } catch {\n await this.showError('load-emails');\n return;\n }\n if (!to.trim()) {\n await this.showError('no-members');\n return;\n }\n const unitTitle = this.resolveNodeTitle(context);\n await this.openSendEmailDialog({\n to,\n subject: this.translation.translateSync(\n i18nKey('prefilled-subject-group'),\n {\n params: { unit: unitTitle },\n },\n ),\n });\n }\n\n /**\n * Collects distinct work/person email values for active employees whose primary BU matches\n * {@link businessUnitId}. Omits the signed-in user's mailbox when it can be resolved (same idea as group chat).\n */\n private async loadRecipientEmailsForBusinessUnit(\n businessUnitId: string,\n ): Promise<string> {\n const filter = {\n logic: 'and' as const,\n filters: [\n {\n field: 'activePrimaryBusinessUnitId',\n value: businessUnitId,\n operator: { type: 'equal' as const },\n },\n ],\n };\n const { items } = await this.entityService\n .withEntity(HCM_EMPLOYEE_ENTITY_KEY)\n .data()\n .query({\n skip: 0,\n take: 500,\n filter,\n });\n const currentUserId = this.sessionService.user?.id;\n const emails = new Set<string>();\n for (const row of items as Array<{ id?: string; userId?: string }>) {\n const uid =\n row.userId != null && String(row.userId).trim()\n ? String(row.userId)\n : undefined;\n if (currentUserId != null && uid === currentUserId) {\n continue;\n }\n const employeeId =\n row.id != null && String(row.id).trim() ? String(row.id) : undefined;\n if (!employeeId) {\n continue;\n }\n const email = await this.resolvePrimaryEmailForEmployeeId(employeeId);\n if (email) {\n emails.add(email);\n }\n }\n return [...emails].join(', ');\n }\n\n /**\n * Resolves a mailbox for org-chart actions. Uses {@link PersonCore.Person} before the denormalized\n * `employee.person` snapshot so edits saved only to Person (or a fresh Person row) are visible even\n * when the employee record still embeds an older `person` from seed or partial merges.\n */\n private async resolvePrimaryEmailForEmployeeId(\n employeeId: string,\n ): Promise<string | undefined> {\n const row = await this.entityService\n .withEntity(HCM_EMPLOYEE_ENTITY_KEY)\n .data()\n .byKey(employeeId);\n if (row == null || typeof row !== 'object') {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: employee row missing',\n { employeeId },\n );\n return undefined;\n }\n const er = row as {\n emails?: unknown;\n personId?: string;\n person?: { emails?: unknown };\n ['person.emails']?: unknown;\n };\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: employee row snapshot',\n {\n employeeId,\n personId: er.personId ?? null,\n topLevelEmailsCount: Array.isArray(er.emails) ? er.emails.length : 0,\n flatPersonEmailsCount: Array.isArray(er['person.emails'])\n ? er['person.emails'].length\n : 0,\n nestedPersonEmailsCount: Array.isArray(er.person?.emails)\n ? er.person!.emails.length\n : 0,\n },\n );\n\n const fromEmployeeTop = this.extractPrimaryEmailFromEmailsList(er.emails);\n if (fromEmployeeTop) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: source employee.emails',\n {\n employeeId,\n email: fromEmployeeTop,\n },\n );\n return fromEmployeeTop;\n }\n const fromFlat = this.extractPrimaryEmailFromEmailsList(\n er['person.emails'],\n );\n if (fromFlat) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: source employee[\"person.emails\"]',\n {\n employeeId,\n email: fromFlat,\n },\n );\n return fromFlat;\n }\n const personId = er.personId;\n if (personId != null && String(personId).trim().length > 0) {\n const personKey = String(personId).trim();\n const personRow = await this.entityService\n .withEntity(PERSON_CORE_PERSON_ENTITY_KEY)\n .data()\n .byKey(personKey);\n const fromPersonCore =\n this.extractPrimaryEmailFromPersonLikeRow(personRow);\n const pr = personRow as { emails?: unknown } | null | undefined;\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: PersonCore.Person byKey',\n {\n employeeId,\n personId: personKey,\n personRowFound: personRow != null,\n personEmailsCount: Array.isArray(pr?.emails) ? pr.emails.length : 0,\n resolved: fromPersonCore ?? null,\n },\n );\n if (fromPersonCore) {\n return fromPersonCore;\n }\n } else {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: no personId on employee',\n { employeeId },\n );\n }\n const fromNested = this.extractPrimaryEmailFromEmailsList(\n er.person?.emails,\n );\n if (fromNested) {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: source employee.person.emails (fallback)',\n {\n employeeId,\n email: fromNested,\n },\n );\n } else {\n console.debug(\n ORG_CHART_EMAIL_LOG_PREFIX,\n 'resolvePrimaryEmail: no email from any source',\n { employeeId },\n );\n }\n return fromNested;\n }\n\n /**\n * Reads the first usable address from `emails`, nested `person.emails`, or flattened `person.emails`.\n */\n private extractPrimaryEmailFromPersonLikeRow(\n row: unknown,\n ): string | undefined {\n if (row == null || typeof row !== 'object') {\n return undefined;\n }\n const r = row as {\n emails?: unknown;\n person?: { emails?: unknown };\n ['person.emails']?: unknown;\n };\n return (\n this.extractPrimaryEmailFromEmailsList(r.emails) ??\n this.extractPrimaryEmailFromEmailsList(r['person.emails']) ??\n this.extractPrimaryEmailFromEmailsList(r.person?.emails)\n );\n }\n\n /** First entry in the list that looks like an email address. */\n private extractPrimaryEmailFromEmailsList(list: unknown): string | undefined {\n if (!Array.isArray(list) || !list.length) {\n return undefined;\n }\n for (const entry of list) {\n const t = this.extractEmailStringFromContactEntry(entry);\n if (t) {\n return t;\n }\n }\n return undefined;\n }\n\n /**\n * Peels repeater / ContactBox shapes: plain string, `{ value: string }`, or nested\n * `{ value: { value: string } }` as produced by some repeaters (see entity-data-selector normalization).\n */\n private extractEmailStringFromContactEntry(\n entry: unknown,\n ): string | undefined {\n const raw = this.unwrapContactScalar(entry);\n if (raw == null) {\n return undefined;\n }\n const t = String(raw).trim();\n return t.includes('@') ? t : undefined;\n }\n\n private unwrapContactScalar(entry: unknown): string | undefined {\n if (entry == null) {\n return undefined;\n }\n if (typeof entry === 'string') {\n return entry;\n }\n if (typeof entry !== 'object') {\n return undefined;\n }\n const o = entry as Record<string, unknown>;\n const direct = o['email'] ?? o['address'];\n if (typeof direct === 'string') {\n return direct;\n }\n const v = o['value'];\n if (typeof v === 'string') {\n return v;\n }\n if (v != null && typeof v === 'object' && 'value' in v) {\n const inner = (v as { value?: unknown }).value;\n return typeof inner === 'string' ? inner : undefined;\n }\n return undefined;\n }\n}\n\n//#endregion\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AXM_ORG_CHART_NODE_CONTRIBUTOR } from '@acorex-platform/module-organization-management-client';\nimport { AXMOrgChartEmailNodeContributionProvider } from './org-chart/org-chart-email-node-contribution.provider';\n\n//#region ---- Communication HCM extension client module ----\n\n@NgModule({\n imports: [CommonModule],\n providers: [\n {\n provide: AXM_ORG_CHART_NODE_CONTRIBUTOR,\n useClass: AXMOrgChartEmailNodeContributionProvider,\n multi: true,\n },\n ],\n})\nexport class AXECommunicationHcmExtensionModule {}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|