@acorex/modules 21.0.0-next.37 → 21.0.0-next.40

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 (393) hide show
  1. package/fesm2022/{acorex-modules-ai-management-acorex-modules-ai-management-WuqoH4OL.mjs → acorex-modules-ai-management-acorex-modules-ai-management-Bqfx8OTv.mjs} +718 -106
  2. package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-Bqfx8OTv.mjs.map +1 -0
  3. package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-column.component-D0ruV6aJ.mjs +44 -0
  4. package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-column.component-D0ruV6aJ.mjs.map +1 -0
  5. package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-DyczMN-R.mjs +256 -0
  6. package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-DyczMN-R.mjs.map +1 -0
  7. package/fesm2022/{acorex-modules-ai-management-agent.entity-DK9GNMdR.mjs → acorex-modules-ai-management-agent.entity-CpSXisAh.mjs} +83 -94
  8. package/fesm2022/acorex-modules-ai-management-agent.entity-CpSXisAh.mjs.map +1 -0
  9. package/fesm2022/{acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CWXEW9yL.mjs → acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CYk2rB36.mjs} +62 -20
  10. package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CYk2rB36.mjs.map +1 -0
  11. package/fesm2022/{acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-CNKwIqUE.mjs → acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-BDcW8BRI.mjs} +3 -5
  12. package/fesm2022/{acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-CNKwIqUE.mjs.map → acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-BDcW8BRI.mjs.map} +1 -1
  13. package/fesm2022/{acorex-modules-ai-management-assist.entity-DX2U9sd5.mjs → acorex-modules-ai-management-assist.entity-7uTePpME.mjs} +2 -2
  14. package/fesm2022/{acorex-modules-ai-management-assist.entity-DX2U9sd5.mjs.map → acorex-modules-ai-management-assist.entity-7uTePpME.mjs.map} +1 -1
  15. package/fesm2022/acorex-modules-ai-management-index-DUojDUau.mjs +2 -0
  16. package/fesm2022/{acorex-modules-ai-management-index-KX3TVRXr.mjs.map → acorex-modules-ai-management-index-DUojDUau.mjs.map} +1 -1
  17. package/fesm2022/{acorex-modules-ai-management-model.entity-BeuDUahR.mjs → acorex-modules-ai-management-model.entity-C9J3trsK.mjs} +2 -2
  18. package/fesm2022/{acorex-modules-ai-management-model.entity-BeuDUahR.mjs.map → acorex-modules-ai-management-model.entity-C9J3trsK.mjs.map} +1 -1
  19. package/fesm2022/{acorex-modules-ai-management-open-ai-endpoint.entity-D-9unl6i.mjs → acorex-modules-ai-management-open-ai-endpoint.entity-kHsxkjEd.mjs} +2 -2
  20. package/fesm2022/{acorex-modules-ai-management-open-ai-endpoint.entity-D-9unl6i.mjs.map → acorex-modules-ai-management-open-ai-endpoint.entity-kHsxkjEd.mjs.map} +1 -1
  21. package/fesm2022/acorex-modules-ai-management.mjs +1 -1
  22. package/fesm2022/acorex-modules-application-management.mjs +1 -1
  23. package/fesm2022/acorex-modules-application-management.mjs.map +1 -1
  24. package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-BNK6C-Ng.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-CMS2WJDu.mjs} +510 -437
  25. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-CMS2WJDu.mjs.map +1 -0
  26. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-Ds8pRzvE.mjs → acorex-modules-assessment-management-assessment-case.entity-C-Q4hu8o.mjs} +2 -2
  27. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-Ds8pRzvE.mjs.map → acorex-modules-assessment-management-assessment-case.entity-C-Q4hu8o.mjs.map} +1 -1
  28. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-tq1Q4wkS.mjs → acorex-modules-assessment-management-assessment-session.entity-CQI_FpUd.mjs} +2 -2
  29. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-tq1Q4wkS.mjs.map → acorex-modules-assessment-management-assessment-session.entity-CQI_FpUd.mjs.map} +1 -1
  30. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-yf0PnWC0.mjs → acorex-modules-assessment-management-fill-assessment-session.command-Bpvco5iD.mjs} +2 -2
  31. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-yf0PnWC0.mjs.map → acorex-modules-assessment-management-fill-assessment-session.command-Bpvco5iD.mjs.map} +1 -1
  32. package/fesm2022/{acorex-modules-assessment-management-index-B2SncZAW.mjs → acorex-modules-assessment-management-index-_fPuBQeK.mjs} +25 -26
  33. package/fesm2022/acorex-modules-assessment-management-index-_fPuBQeK.mjs.map +1 -0
  34. package/fesm2022/{acorex-modules-assessment-management-preview-question.command-DPzL8C44.mjs → acorex-modules-assessment-management-preview-question.command-drR6nq76.mjs} +10 -11
  35. package/fesm2022/acorex-modules-assessment-management-preview-question.command-drR6nq76.mjs.map +1 -0
  36. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BrI5gFtx.mjs → acorex-modules-assessment-management-preview-questionnaire.command-CY8tZWdG.mjs} +2 -2
  37. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BrI5gFtx.mjs.map → acorex-modules-assessment-management-preview-questionnaire.command-CY8tZWdG.mjs.map} +1 -1
  38. package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-XD5IJpvW.mjs → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-DV9irFZ0.mjs} +2 -2
  39. package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-XD5IJpvW.mjs.map → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-DV9irFZ0.mjs.map} +1 -1
  40. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-CZ32sQ9M.mjs → acorex-modules-assessment-management-question-bank-item.entity-DO4bTKKo.mjs} +2 -2
  41. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-CZ32sQ9M.mjs.map → acorex-modules-assessment-management-question-bank-item.entity-DO4bTKKo.mjs.map} +1 -1
  42. package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-C7gf4s1y.mjs → acorex-modules-assessment-management-questionnaire-calculation.entity-B-N0v4zs.mjs} +2 -2
  43. package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-C7gf4s1y.mjs.map → acorex-modules-assessment-management-questionnaire-calculation.entity-B-N0v4zs.mjs.map} +1 -1
  44. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-BZyIlYWg.mjs → acorex-modules-assessment-management-questionnaire-viewer-popup.component-Cc-o6qmY.mjs} +3 -3
  45. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-BZyIlYWg.mjs.map → acorex-modules-assessment-management-questionnaire-viewer-popup.component-Cc-o6qmY.mjs.map} +1 -1
  46. package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-CmmThk2f.mjs → acorex-modules-assessment-management-questionnaire.entity-CJWNlaJs.mjs} +3 -3
  47. package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-CmmThk2f.mjs.map → acorex-modules-assessment-management-questionnaire.entity-CJWNlaJs.mjs.map} +1 -1
  48. package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-GLqvK8wB.mjs → acorex-modules-assessment-management-save-questionnaire-questions.command-C3gOkZa5.mjs} +2 -2
  49. package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-GLqvK8wB.mjs.map → acorex-modules-assessment-management-save-questionnaire-questions.command-C3gOkZa5.mjs.map} +1 -1
  50. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-CU1TVonZ.mjs → acorex-modules-assessment-management-view-session-answers.command-AvTbWvGE.mjs} +2 -2
  51. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-CU1TVonZ.mjs.map → acorex-modules-assessment-management-view-session-answers.command-AvTbWvGE.mjs.map} +1 -1
  52. package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
  53. package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-BDs0ZgD5.mjs → acorex-modules-asset-management-acorex-modules-asset-management-BRap9yt6.mjs} +761 -133
  54. package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-BRap9yt6.mjs.map +1 -0
  55. package/fesm2022/acorex-modules-asset-management-asset-rental-history.entity-B_QZI3Cy.mjs +302 -0
  56. package/fesm2022/acorex-modules-asset-management-asset-rental-history.entity-B_QZI3Cy.mjs.map +1 -0
  57. package/fesm2022/acorex-modules-asset-management-asset-status.rules-BL0Osjqv.mjs +98 -0
  58. package/fesm2022/acorex-modules-asset-management-asset-status.rules-BL0Osjqv.mjs.map +1 -0
  59. package/fesm2022/{acorex-modules-asset-management-asset-system-history.entity-CSCwWY_F.mjs → acorex-modules-asset-management-asset-system-assignment.entity-BRz8vItS.mjs} +77 -48
  60. package/fesm2022/acorex-modules-asset-management-asset-system-assignment.entity-BRz8vItS.mjs.map +1 -0
  61. package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-CcefMT8J.mjs → acorex-modules-asset-management-asset-system-type.entity-b_o5UnuE.mjs} +72 -40
  62. package/fesm2022/acorex-modules-asset-management-asset-system-type.entity-b_o5UnuE.mjs.map +1 -0
  63. package/fesm2022/{acorex-modules-asset-management-assetSystem.entity-Dq2ASslk.mjs → acorex-modules-asset-management-asset-system.entity-C6ak4u9z.mjs} +41 -29
  64. package/fesm2022/acorex-modules-asset-management-asset-system.entity-C6ak4u9z.mjs.map +1 -0
  65. package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-6Rauu2Z1.mjs → acorex-modules-asset-management-asset-type-section-component.entity-BQjGo1s1.mjs} +2 -2
  66. package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-6Rauu2Z1.mjs.map → acorex-modules-asset-management-asset-type-section-component.entity-BQjGo1s1.mjs.map} +1 -1
  67. package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-r_H1QGwp.mjs → acorex-modules-asset-management-asset-type-section.entity-C1DJZZFy.mjs} +6 -48
  68. package/fesm2022/acorex-modules-asset-management-asset-type-section.entity-C1DJZZFy.mjs.map +1 -0
  69. package/fesm2022/{acorex-modules-asset-management-asset-type.entity-cWVqpbHH.mjs → acorex-modules-asset-management-asset-type.entity-CtOnArR9.mjs} +68 -105
  70. package/fesm2022/acorex-modules-asset-management-asset-type.entity-CtOnArR9.mjs.map +1 -0
  71. package/fesm2022/{acorex-modules-asset-management-asset.entity-CamZGWTM.mjs → acorex-modules-asset-management-asset.entity-BaET-kSd.mjs} +257 -245
  72. package/fesm2022/acorex-modules-asset-management-asset.entity-BaET-kSd.mjs.map +1 -0
  73. package/fesm2022/acorex-modules-asset-management-assetLifecycleState.provider-DZ5r2zx7.mjs +192 -0
  74. package/fesm2022/acorex-modules-asset-management-assetLifecycleState.provider-DZ5r2zx7.mjs.map +1 -0
  75. package/fesm2022/acorex-modules-asset-management-status.provider-C41t4e2U.mjs +363 -0
  76. package/fesm2022/acorex-modules-asset-management-status.provider-C41t4e2U.mjs.map +1 -0
  77. package/fesm2022/acorex-modules-asset-management.mjs +1 -1
  78. package/fesm2022/acorex-modules-business-core.mjs +17 -11
  79. package/fesm2022/acorex-modules-business-core.mjs.map +1 -1
  80. package/fesm2022/acorex-modules-common.mjs +166 -122
  81. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  82. package/fesm2022/acorex-modules-conversation.mjs +4786 -4080
  83. package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
  84. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-yqfev--M.mjs +8486 -0
  85. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-yqfev--M.mjs.map +1 -0
  86. package/fesm2022/acorex-modules-dashboard-management-index-CYnWQ2od.mjs +127 -0
  87. package/fesm2022/acorex-modules-dashboard-management-index-CYnWQ2od.mjs.map +1 -0
  88. package/fesm2022/acorex-modules-dashboard-management.mjs +1 -7708
  89. package/fesm2022/acorex-modules-dashboard-management.mjs.map +1 -1
  90. package/fesm2022/acorex-modules-data-management.mjs +63 -35
  91. package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
  92. package/fesm2022/acorex-modules-document-management.mjs +131 -62
  93. package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
  94. package/fesm2022/acorex-modules-financial-core.mjs.map +1 -1
  95. package/fesm2022/acorex-modules-form-template-management.mjs +1 -1
  96. package/fesm2022/acorex-modules-form-template-management.mjs.map +1 -1
  97. package/fesm2022/{acorex-modules-health-core-allergy-type.entity-CS8a-AUb.mjs → acorex-modules-health-core-allergy-type.entity-BvJmDMcr.mjs} +3 -3
  98. package/fesm2022/acorex-modules-health-core-allergy-type.entity-BvJmDMcr.mjs.map +1 -0
  99. package/fesm2022/{acorex-modules-health-core-blood-type.entity-ZgFOuvG4.mjs → acorex-modules-health-core-blood-type.entity-Vpw9y9J5.mjs} +3 -3
  100. package/fesm2022/acorex-modules-health-core-blood-type.entity-Vpw9y9J5.mjs.map +1 -0
  101. package/fesm2022/{acorex-modules-health-core-body-part.entity-JGLwrFE2.mjs → acorex-modules-health-core-body-part.entity-Cz2NEAqm.mjs} +3 -3
  102. package/fesm2022/acorex-modules-health-core-body-part.entity-Cz2NEAqm.mjs.map +1 -0
  103. package/fesm2022/{acorex-modules-health-core-chronic-condition-type.entity-DrxEPQj1.mjs → acorex-modules-health-core-chronic-condition-type.entity-CKWVW0Rg.mjs} +3 -3
  104. package/fesm2022/acorex-modules-health-core-chronic-condition-type.entity-CKWVW0Rg.mjs.map +1 -0
  105. package/fesm2022/{acorex-modules-health-core-disability-status.entity-UaAQFFMC.mjs → acorex-modules-health-core-disability-status.entity-C7NwwT0i.mjs} +3 -3
  106. package/fesm2022/acorex-modules-health-core-disability-status.entity-C7NwwT0i.mjs.map +1 -0
  107. package/fesm2022/{acorex-modules-health-core-injury-type.entity-DcIn0rxz.mjs → acorex-modules-health-core-injury-type.entity-bfzL6j8C.mjs} +3 -3
  108. package/fesm2022/acorex-modules-health-core-injury-type.entity-bfzL6j8C.mjs.map +1 -0
  109. package/fesm2022/{acorex-modules-health-core-vaccination-type.entity-zYd6KLRC.mjs → acorex-modules-health-core-vaccination-type.entity-CqymQfWK.mjs} +3 -3
  110. package/fesm2022/acorex-modules-health-core-vaccination-type.entity-CqymQfWK.mjs.map +1 -0
  111. package/fesm2022/acorex-modules-health-core.mjs +7 -7
  112. package/fesm2022/acorex-modules-health-core.mjs.map +1 -1
  113. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-Ck9q-IWW.mjs +1922 -0
  114. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-Ck9q-IWW.mjs.map +1 -0
  115. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-BRUrGVh1.mjs → acorex-modules-human-capital-management-approve-leave-request.command-qYSPyG_q.mjs} +2 -2
  116. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-BRUrGVh1.mjs.map → acorex-modules-human-capital-management-approve-leave-request.command-qYSPyG_q.mjs.map} +1 -1
  117. package/fesm2022/acorex-modules-human-capital-management-assign-position-assignment.command-Da3u1fo5.mjs +90 -0
  118. package/fesm2022/acorex-modules-human-capital-management-assign-position-assignment.command-Da3u1fo5.mjs.map +1 -0
  119. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-B16M3F8s.mjs → acorex-modules-human-capital-management-cancel-leave-request.command-DstI60jo.mjs} +2 -2
  120. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-B16M3F8s.mjs.map → acorex-modules-human-capital-management-cancel-leave-request.command-DstI60jo.mjs.map} +1 -1
  121. package/fesm2022/{acorex-modules-human-capital-management-employee.entity-BRpqFRuI.mjs → acorex-modules-human-capital-management-employee.entity-DjMQm3VC.mjs} +71 -25
  122. package/fesm2022/acorex-modules-human-capital-management-employee.entity-DjMQm3VC.mjs.map +1 -0
  123. package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-7ZGZYxGM.mjs → acorex-modules-human-capital-management-employment-type.entity-v8WzEHiE.mjs} +5 -5
  124. package/fesm2022/acorex-modules-human-capital-management-employment-type.entity-v8WzEHiE.mjs.map +1 -0
  125. package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-B3Rk84bJ.mjs → acorex-modules-human-capital-management-leave-request.entity-B9Bf-Nnm.mjs} +71 -21
  126. package/fesm2022/acorex-modules-human-capital-management-leave-request.entity-B9Bf-Nnm.mjs.map +1 -0
  127. package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-OKu8_PP1.mjs → acorex-modules-human-capital-management-leave-type.entity-Bpfd_hNb.mjs} +5 -6
  128. package/fesm2022/acorex-modules-human-capital-management-leave-type.entity-Bpfd_hNb.mjs.map +1 -0
  129. package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-D_C459kx.mjs → acorex-modules-human-capital-management-position-assignment.entity-f0IDrLSn.mjs} +81 -7
  130. package/fesm2022/acorex-modules-human-capital-management-position-assignment.entity-f0IDrLSn.mjs.map +1 -0
  131. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-C0_moDp9.mjs → acorex-modules-human-capital-management-reject-leave-request.command-DxNsroYI.mjs} +2 -2
  132. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-C0_moDp9.mjs.map → acorex-modules-human-capital-management-reject-leave-request.command-DxNsroYI.mjs.map} +1 -1
  133. package/fesm2022/acorex-modules-human-capital-management-revoke-position-assignment.command-C3J9pcfh.mjs +97 -0
  134. package/fesm2022/acorex-modules-human-capital-management-revoke-position-assignment.command-C3J9pcfh.mjs.map +1 -0
  135. package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1629
  136. package/fesm2022/acorex-modules-human-capital-management.mjs.map +1 -1
  137. package/fesm2022/{acorex-modules-learning-management-certificate-definition.entity-27VKYxw1.mjs → acorex-modules-learning-management-certificate-definition.entity-C_r1Djcx.mjs} +4 -4
  138. package/fesm2022/acorex-modules-learning-management-certificate-definition.entity-C_r1Djcx.mjs.map +1 -0
  139. package/fesm2022/{acorex-modules-learning-management-certificate-type.entity-CBM6N-PD.mjs → acorex-modules-learning-management-certificate-type.entity-DAJNtUya.mjs} +42 -20
  140. package/fesm2022/acorex-modules-learning-management-certificate-type.entity-DAJNtUya.mjs.map +1 -0
  141. package/fesm2022/{acorex-modules-learning-management-certificate.entity-BRBJQYji.mjs → acorex-modules-learning-management-certificate.entity-CSD_CX4V.mjs} +5 -5
  142. package/fesm2022/acorex-modules-learning-management-certificate.entity-CSD_CX4V.mjs.map +1 -0
  143. package/fesm2022/{acorex-modules-learning-management-course-type.entity-B1c6PDLq.mjs → acorex-modules-learning-management-course-type.entity-DmjeLMxV.mjs} +39 -17
  144. package/fesm2022/acorex-modules-learning-management-course-type.entity-DmjeLMxV.mjs.map +1 -0
  145. package/fesm2022/{acorex-modules-learning-management-course.entity-BN8XHAPz.mjs → acorex-modules-learning-management-course.entity-DUUgeikJ.mjs} +3 -3
  146. package/fesm2022/acorex-modules-learning-management-course.entity-DUUgeikJ.mjs.map +1 -0
  147. package/fesm2022/{acorex-modules-learning-management-learning-path.entity-8QlM3R4B.mjs → acorex-modules-learning-management-learning-path.entity-Zo--bDto.mjs} +39 -17
  148. package/fesm2022/acorex-modules-learning-management-learning-path.entity-Zo--bDto.mjs.map +1 -0
  149. package/fesm2022/{acorex-modules-learning-management-skill-level.entity-DXOWslpB.mjs → acorex-modules-learning-management-skill-level.entity-XVCTHW3O.mjs} +10 -10
  150. package/fesm2022/acorex-modules-learning-management-skill-level.entity-XVCTHW3O.mjs.map +1 -0
  151. package/fesm2022/{acorex-modules-learning-management-skill.entity-DrLts807.mjs → acorex-modules-learning-management-skill.entity-VXkLbaD4.mjs} +35 -13
  152. package/fesm2022/acorex-modules-learning-management-skill.entity-VXkLbaD4.mjs.map +1 -0
  153. package/fesm2022/{acorex-modules-learning-management-training-definition.entity-NQqJ5avw.mjs → acorex-modules-learning-management-training-definition.entity-BbVZ9_go.mjs} +3 -3
  154. package/fesm2022/acorex-modules-learning-management-training-definition.entity-BbVZ9_go.mjs.map +1 -0
  155. package/fesm2022/{acorex-modules-learning-management-training-type.entity-CoyDCeen.mjs → acorex-modules-learning-management-training-type.entity-C1otrA63.mjs} +36 -14
  156. package/fesm2022/acorex-modules-learning-management-training-type.entity-C1otrA63.mjs.map +1 -0
  157. package/fesm2022/{acorex-modules-learning-management-training.entity-BCGn0T3H.mjs → acorex-modules-learning-management-training.entity-C4KDv1uh.mjs} +3 -3
  158. package/fesm2022/acorex-modules-learning-management-training.entity-C4KDv1uh.mjs.map +1 -0
  159. package/fesm2022/acorex-modules-learning-management.mjs +716 -19
  160. package/fesm2022/acorex-modules-learning-management.mjs.map +1 -1
  161. package/fesm2022/acorex-modules-location-management.mjs +18 -99
  162. package/fesm2022/acorex-modules-location-management.mjs.map +1 -1
  163. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-CfHMiVos.mjs +7102 -0
  164. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-CfHMiVos.mjs.map +1 -0
  165. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-DQJJtCqU.mjs → acorex-modules-maintenance-management-failure-effect.entity-DKbARwJh.mjs} +2 -2
  166. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-DQJJtCqU.mjs.map → acorex-modules-maintenance-management-failure-effect.entity-DKbARwJh.mjs.map} +1 -1
  167. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-gg2fpT2N.mjs → acorex-modules-maintenance-management-failure-mode-asset-type.entity-Br0lvFfu.mjs} +2 -2
  168. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-gg2fpT2N.mjs.map → acorex-modules-maintenance-management-failure-mode-asset-type.entity-Br0lvFfu.mjs.map} +1 -1
  169. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-CHUaAnID.mjs → acorex-modules-maintenance-management-failure-mode-mechanism.entity-Dydg4AJ7.mjs} +2 -2
  170. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-CHUaAnID.mjs.map → acorex-modules-maintenance-management-failure-mode-mechanism.entity-Dydg4AJ7.mjs.map} +1 -1
  171. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-B93x1uP_.mjs → acorex-modules-maintenance-management-failure-mode-solution.entity-DHiVJHFj.mjs} +2 -2
  172. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-B93x1uP_.mjs.map → acorex-modules-maintenance-management-failure-mode-solution.entity-DHiVJHFj.mjs.map} +1 -1
  173. package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-McM3l12Q.mjs → acorex-modules-maintenance-management-failure-register-cause.entity-CZfm0U8u.mjs} +2 -2
  174. package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-McM3l12Q.mjs.map → acorex-modules-maintenance-management-failure-register-cause.entity-CZfm0U8u.mjs.map} +1 -1
  175. package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-_jjy1oeg.mjs → acorex-modules-maintenance-management-failure-register-effect.entity-DbCAFveJ.mjs} +2 -2
  176. package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-_jjy1oeg.mjs.map → acorex-modules-maintenance-management-failure-register-effect.entity-DbCAFveJ.mjs.map} +1 -1
  177. package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-5CmdhowW.mjs → acorex-modules-maintenance-management-failure-register-mechanism.entity-D83Yo6dT.mjs} +2 -2
  178. package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-5CmdhowW.mjs.map → acorex-modules-maintenance-management-failure-register-mechanism.entity-D83Yo6dT.mjs.map} +1 -1
  179. package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-D_lQrda5.mjs → acorex-modules-maintenance-management-failure-register.entity-zKGo9bOs.mjs} +4 -4
  180. package/fesm2022/acorex-modules-maintenance-management-failure-register.entity-zKGo9bOs.mjs.map +1 -0
  181. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BIZxoVIS.mjs → acorex-modules-maintenance-management-failure-severity.entity-Cnvdmt0N.mjs} +2 -2
  182. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BIZxoVIS.mjs.map → acorex-modules-maintenance-management-failure-severity.entity-Cnvdmt0N.mjs.map} +1 -1
  183. package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-CzX0phT-.mjs +391 -0
  184. package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-CzX0phT-.mjs.map +1 -0
  185. package/fesm2022/acorex-modules-maintenance-management.mjs +1 -3579
  186. package/fesm2022/acorex-modules-maintenance-management.mjs.map +1 -1
  187. package/fesm2022/acorex-modules-measurement-core.mjs.map +1 -1
  188. package/fesm2022/{acorex-modules-notification-management-notification-page.component-DDhCqJtg.mjs → acorex-modules-notification-management-notification-page.component-D0we6H1f.mjs} +5 -5
  189. package/fesm2022/{acorex-modules-notification-management-notification-page.component-DDhCqJtg.mjs.map → acorex-modules-notification-management-notification-page.component-D0we6H1f.mjs.map} +1 -1
  190. package/fesm2022/acorex-modules-notification-management.mjs +36 -22
  191. package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
  192. package/fesm2022/acorex-modules-organization-management-JOB_DEFINITION_SKILLS_PAGE_COMPONENT_KEY-BYfbGGOE.mjs +8 -0
  193. package/fesm2022/acorex-modules-organization-management-JOB_DEFINITION_SKILLS_PAGE_COMPONENT_KEY-BYfbGGOE.mjs.map +1 -0
  194. package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-CnAHfj2t.mjs +925 -0
  195. package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-CnAHfj2t.mjs.map +1 -0
  196. package/fesm2022/acorex-modules-organization-management-business-unit.entity-Dpf7-aeM.mjs +372 -0
  197. package/fesm2022/acorex-modules-organization-management-business-unit.entity-Dpf7-aeM.mjs.map +1 -0
  198. package/fesm2022/{acorex-modules-organization-management-chart.entity-bRxA8XHZ.mjs → acorex-modules-organization-management-chart.entity-CQX81AiE.mjs} +37 -33
  199. package/fesm2022/acorex-modules-organization-management-chart.entity-CQX81AiE.mjs.map +1 -0
  200. package/fesm2022/{acorex-modules-organization-management-company.entity-BohMJQNi.mjs → acorex-modules-organization-management-company.entity-D-RWQ_8O.mjs} +8 -10
  201. package/fesm2022/acorex-modules-organization-management-company.entity-D-RWQ_8O.mjs.map +1 -0
  202. package/fesm2022/acorex-modules-organization-management-data-source-evaluator-scope.provider-BrKtojM9.mjs +48 -0
  203. package/fesm2022/acorex-modules-organization-management-data-source-evaluator-scope.provider-BrKtojM9.mjs.map +1 -0
  204. package/fesm2022/acorex-modules-organization-management-entity.provider-BdaKwTZq.mjs +61 -0
  205. package/fesm2022/acorex-modules-organization-management-entity.provider-BdaKwTZq.mjs.map +1 -0
  206. package/fesm2022/acorex-modules-organization-management-feature-definition.provider-EzMuHJ2K.mjs +19 -0
  207. package/fesm2022/acorex-modules-organization-management-feature-definition.provider-EzMuHJ2K.mjs.map +1 -0
  208. package/fesm2022/acorex-modules-organization-management-job-definition-matrix-page.utils-DD3jLujN.mjs +61 -0
  209. package/fesm2022/acorex-modules-organization-management-job-definition-matrix-page.utils-DD3jLujN.mjs.map +1 -0
  210. package/fesm2022/acorex-modules-organization-management-job-definition-pages-component.provider-C8_Ab3Q7.mjs +28 -0
  211. package/fesm2022/acorex-modules-organization-management-job-definition-pages-component.provider-C8_Ab3Q7.mjs.map +1 -0
  212. package/fesm2022/acorex-modules-organization-management-job-definition-responsibilities-page.component-DHUlvoOO.mjs +223 -0
  213. package/fesm2022/acorex-modules-organization-management-job-definition-responsibilities-page.component-DHUlvoOO.mjs.map +1 -0
  214. package/fesm2022/acorex-modules-organization-management-job-definition-skills-page.component-BpVESnnH.mjs +219 -0
  215. package/fesm2022/acorex-modules-organization-management-job-definition-skills-page.component-BpVESnnH.mjs.map +1 -0
  216. package/fesm2022/{acorex-modules-organization-management-job-definition.entity-S9Jlmr-o.mjs → acorex-modules-organization-management-job-definition.entity-H8VAbZ_r.mjs} +21 -154
  217. package/fesm2022/acorex-modules-organization-management-job-definition.entity-H8VAbZ_r.mjs.map +1 -0
  218. package/fesm2022/acorex-modules-organization-management-job-level.datasource-Dxfq0cGw.mjs +95 -0
  219. package/fesm2022/acorex-modules-organization-management-job-level.datasource-Dxfq0cGw.mjs.map +1 -0
  220. package/fesm2022/acorex-modules-organization-management-job-level.entity-Bdja794J.mjs +271 -0
  221. package/fesm2022/acorex-modules-organization-management-job-level.entity-Bdja794J.mjs.map +1 -0
  222. package/fesm2022/acorex-modules-organization-management-menu.provider-DnvNM-pk.mjs +192 -0
  223. package/fesm2022/acorex-modules-organization-management-menu.provider-DnvNM-pk.mjs.map +1 -0
  224. package/fesm2022/acorex-modules-organization-management-org-chart.page-COkMtxFO.mjs +1740 -0
  225. package/fesm2022/acorex-modules-organization-management-org-chart.page-COkMtxFO.mjs.map +1 -0
  226. package/fesm2022/acorex-modules-organization-management-organization-code-identifier-rules.provider-pocBJezL.mjs +37 -0
  227. package/fesm2022/acorex-modules-organization-management-organization-code-identifier-rules.provider-pocBJezL.mjs.map +1 -0
  228. package/fesm2022/acorex-modules-organization-management-permission-definition.provider-BDLIuqxU.mjs +76 -0
  229. package/fesm2022/acorex-modules-organization-management-permission-definition.provider-BDLIuqxU.mjs.map +1 -0
  230. package/fesm2022/{acorex-modules-organization-management-position.entity-DLPufeWz.mjs → acorex-modules-organization-management-position.entity-BpbzqtEY.mjs} +113 -112
  231. package/fesm2022/acorex-modules-organization-management-position.entity-BpbzqtEY.mjs.map +1 -0
  232. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-mMZywr0X.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CGkXAtH2.mjs} +26 -29
  233. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CGkXAtH2.mjs.map +1 -0
  234. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-CfRBMxLk.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-Dw-tX5XI.mjs} +2 -2
  235. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-CfRBMxLk.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-Dw-tX5XI.mjs.map} +1 -1
  236. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-B06t1G1E.mjs → acorex-modules-organization-management-responsibilities-matrix.component-D_ClGAIJ.mjs} +14 -21
  237. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix.component-D_ClGAIJ.mjs.map +1 -0
  238. package/fesm2022/acorex-modules-organization-management-responsibility-level.entity-CzkogsDv.mjs +135 -0
  239. package/fesm2022/acorex-modules-organization-management-responsibility-level.entity-CzkogsDv.mjs.map +1 -0
  240. package/fesm2022/{acorex-modules-organization-management-responsibility.entity-CMmr3wJa.mjs → acorex-modules-organization-management-responsibility.entity-DfKM6HV7.mjs} +5 -7
  241. package/fesm2022/acorex-modules-organization-management-responsibility.entity-DfKM6HV7.mjs.map +1 -0
  242. package/fesm2022/acorex-modules-organization-management-settings.provider-DaeJkP0y.mjs +228 -0
  243. package/fesm2022/acorex-modules-organization-management-settings.provider-DaeJkP0y.mjs.map +1 -0
  244. package/fesm2022/acorex-modules-organization-management-team-business-unit.entity-Cm9qcAG7.mjs +300 -0
  245. package/fesm2022/acorex-modules-organization-management-team-business-unit.entity-Cm9qcAG7.mjs.map +1 -0
  246. package/fesm2022/acorex-modules-organization-management-team-member-role.entity-B3xgLE6N.mjs +150 -0
  247. package/fesm2022/acorex-modules-organization-management-team-member-role.entity-B3xgLE6N.mjs.map +1 -0
  248. package/fesm2022/{acorex-modules-organization-management-team-member.entity-8sTjn5Jn.mjs → acorex-modules-organization-management-team-member.entity-Dk9t9S1r.mjs} +6 -17
  249. package/fesm2022/acorex-modules-organization-management-team-member.entity-Dk9t9S1r.mjs.map +1 -0
  250. package/fesm2022/{acorex-modules-organization-management-team.entity-CGR0UlYl.mjs → acorex-modules-organization-management-team.entity-BbcFYP20.mjs} +113 -42
  251. package/fesm2022/acorex-modules-organization-management-team.entity-BbcFYP20.mjs.map +1 -0
  252. package/fesm2022/acorex-modules-organization-management.mjs +1 -2216
  253. package/fesm2022/acorex-modules-organization-management.mjs.map +1 -1
  254. package/fesm2022/acorex-modules-platform-dev-tools-menu.provider-BFueKnuF.mjs +40 -0
  255. package/fesm2022/acorex-modules-platform-dev-tools-menu.provider-BFueKnuF.mjs.map +1 -0
  256. package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs +33 -0
  257. package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs.map +1 -0
  258. package/fesm2022/acorex-modules-platform-dev-tools.mjs +14 -94
  259. package/fesm2022/acorex-modules-platform-dev-tools.mjs.map +1 -1
  260. package/fesm2022/{acorex-modules-report-management-report-runner-root-page.component-DPSNAAct.mjs → acorex-modules-report-management-report-runner-root-page.component-BjKrHoBg.mjs} +107 -107
  261. package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-BjKrHoBg.mjs.map +1 -0
  262. package/fesm2022/acorex-modules-report-management.mjs +3 -3
  263. package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
  264. package/fesm2022/{acorex-modules-reservation-management-acorex-modules-reservation-management-BMemqW2V.mjs → acorex-modules-reservation-management-acorex-modules-reservation-management-BoUiTlmu.mjs} +65 -76
  265. package/fesm2022/acorex-modules-reservation-management-acorex-modules-reservation-management-BoUiTlmu.mjs.map +1 -0
  266. package/fesm2022/{acorex-modules-reservation-management-reservation-class-status.entity-Bg7d38wV.mjs → acorex-modules-reservation-management-reservation-class-status.entity-D-ZdqKa8.mjs} +2 -2
  267. package/fesm2022/{acorex-modules-reservation-management-reservation-class-status.entity-Bg7d38wV.mjs.map → acorex-modules-reservation-management-reservation-class-status.entity-D-ZdqKa8.mjs.map} +1 -1
  268. package/fesm2022/{acorex-modules-reservation-management-reservation-resource-type.entity-BK-rLEXi.mjs → acorex-modules-reservation-management-reservation-resource-type.entity-zPD-Psml.mjs} +2 -2
  269. package/fesm2022/{acorex-modules-reservation-management-reservation-resource-type.entity-BK-rLEXi.mjs.map → acorex-modules-reservation-management-reservation-resource-type.entity-zPD-Psml.mjs.map} +1 -1
  270. package/fesm2022/{acorex-modules-reservation-management-reservation-status-transition.entity-2ngXhKAV.mjs → acorex-modules-reservation-management-reservation-status-transition.entity-CQ85ZAGF.mjs} +2 -2
  271. package/fesm2022/{acorex-modules-reservation-management-reservation-status-transition.entity-2ngXhKAV.mjs.map → acorex-modules-reservation-management-reservation-status-transition.entity-CQ85ZAGF.mjs.map} +1 -1
  272. package/fesm2022/acorex-modules-reservation-management.mjs +1 -1
  273. package/fesm2022/acorex-modules-security-management.mjs +507 -179
  274. package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
  275. package/fesm2022/{acorex-modules-task-management-task-board.page-C1H_GTqy.mjs → acorex-modules-task-management-task-board.page-DA2563QE.mjs} +15 -10
  276. package/fesm2022/acorex-modules-task-management-task-board.page-DA2563QE.mjs.map +1 -0
  277. package/fesm2022/acorex-modules-task-management.mjs +280 -226
  278. package/fesm2022/acorex-modules-task-management.mjs.map +1 -1
  279. package/fesm2022/acorex-modules-workflow-management-WORKFLOW_DEFINITION_ACTIVITIES_PAGE_COMPONENT_KEY-D6q__Ewd.mjs +5 -0
  280. package/fesm2022/acorex-modules-workflow-management-WORKFLOW_DEFINITION_ACTIVITIES_PAGE_COMPONENT_KEY-D6q__Ewd.mjs.map +1 -0
  281. package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-column.component-C8lgSjfc.mjs → acorex-modules-workflow-management-activity-command-configurator-widget-column.component-CDo0QVFy.mjs} +14 -6
  282. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-column.component-CDo0QVFy.mjs.map +1 -0
  283. package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BGUPxGXP.mjs → acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BYJpDQRs.mjs} +31 -16
  284. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BYJpDQRs.mjs.map +1 -0
  285. package/fesm2022/{acorex-modules-workflow-management-activity-definition.entity-Bvs1OfE_.mjs → acorex-modules-workflow-management-activity-definition.entity-B3DkgDQb.mjs} +10 -12
  286. package/fesm2022/acorex-modules-workflow-management-activity-definition.entity-B3DkgDQb.mjs.map +1 -0
  287. package/fesm2022/acorex-modules-workflow-management-index-Bx2uYraH.mjs +295 -0
  288. package/fesm2022/acorex-modules-workflow-management-index-Bx2uYraH.mjs.map +1 -0
  289. package/fesm2022/{acorex-modules-workflow-management-index-DWIDQsWq.mjs → acorex-modules-workflow-management-index-C9Qc07oK.mjs} +125 -3
  290. package/fesm2022/acorex-modules-workflow-management-index-C9Qc07oK.mjs.map +1 -0
  291. package/fesm2022/acorex-modules-workflow-management-index-D8fjNgQJ.mjs +726 -0
  292. package/fesm2022/acorex-modules-workflow-management-index-D8fjNgQJ.mjs.map +1 -0
  293. package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs +56 -0
  294. package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs.map +1 -0
  295. package/fesm2022/{acorex-modules-workflow-management-workflow-definition.entity-aJou58ED.mjs → acorex-modules-workflow-management-workflow-definition.entity-DqPVpcSv.mjs} +101 -140
  296. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-DqPVpcSv.mjs.map +1 -0
  297. package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-Cq7LE7u5.mjs → acorex-modules-workflow-management-workflow-instance.entity-D-KnWlsU.mjs} +10 -1
  298. package/fesm2022/acorex-modules-workflow-management-workflow-instance.entity-D-KnWlsU.mjs.map +1 -0
  299. package/fesm2022/{acorex-modules-workflow-management-workflow-task-popover.component-CIakASVR.mjs → acorex-modules-workflow-management-workflow-task-popover.component-NpUx0sB5.mjs} +11 -7
  300. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-NpUx0sB5.mjs.map +1 -0
  301. package/fesm2022/acorex-modules-workflow-management.mjs +996 -423
  302. package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
  303. package/organization-management/README.md +5 -1
  304. package/package.json +2 -2
  305. package/types/acorex-modules-ai-management.d.ts +91 -16
  306. package/types/acorex-modules-asset-management.d.ts +214 -83
  307. package/types/acorex-modules-business-core.d.ts +8 -11
  308. package/types/acorex-modules-common.d.ts +20 -8
  309. package/types/acorex-modules-conversation.d.ts +1 -0
  310. package/types/acorex-modules-dashboard-management.d.ts +348 -177
  311. package/types/acorex-modules-data-management.d.ts +2 -2
  312. package/types/acorex-modules-document-management.d.ts +7 -4
  313. package/types/acorex-modules-financial-core.d.ts +26 -19
  314. package/types/acorex-modules-form-template-management.d.ts +3 -3
  315. package/types/acorex-modules-health-core.d.ts +23 -29
  316. package/types/acorex-modules-human-capital-management.d.ts +28 -2
  317. package/types/acorex-modules-learning-management.d.ts +242 -105
  318. package/types/acorex-modules-maintenance-management.d.ts +563 -41
  319. package/types/acorex-modules-measurement-core.d.ts +95 -33
  320. package/types/acorex-modules-notification-management.d.ts +7 -3
  321. package/types/acorex-modules-organization-management.d.ts +272 -109
  322. package/types/acorex-modules-security-management.d.ts +40 -1
  323. package/types/acorex-modules-task-management.d.ts +20 -15
  324. package/types/acorex-modules-workflow-management.d.ts +121 -15
  325. package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-WuqoH4OL.mjs.map +0 -1
  326. package/fesm2022/acorex-modules-ai-management-agent.entity-DK9GNMdR.mjs.map +0 -1
  327. package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CWXEW9yL.mjs.map +0 -1
  328. package/fesm2022/acorex-modules-ai-management-index-KX3TVRXr.mjs +0 -2
  329. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-BNK6C-Ng.mjs.map +0 -1
  330. package/fesm2022/acorex-modules-assessment-management-index-B2SncZAW.mjs.map +0 -1
  331. package/fesm2022/acorex-modules-assessment-management-preview-question.command-DPzL8C44.mjs.map +0 -1
  332. package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-BDs0ZgD5.mjs.map +0 -1
  333. package/fesm2022/acorex-modules-asset-management-asset-system-history.entity-CSCwWY_F.mjs.map +0 -1
  334. package/fesm2022/acorex-modules-asset-management-asset-system-type.entity-CcefMT8J.mjs.map +0 -1
  335. package/fesm2022/acorex-modules-asset-management-asset-type-section.entity-r_H1QGwp.mjs.map +0 -1
  336. package/fesm2022/acorex-modules-asset-management-asset-type.entity-cWVqpbHH.mjs.map +0 -1
  337. package/fesm2022/acorex-modules-asset-management-asset.entity-CamZGWTM.mjs.map +0 -1
  338. package/fesm2022/acorex-modules-asset-management-assetSystem.entity-Dq2ASslk.mjs.map +0 -1
  339. package/fesm2022/acorex-modules-health-core-allergy-type.entity-CS8a-AUb.mjs.map +0 -1
  340. package/fesm2022/acorex-modules-health-core-blood-type.entity-ZgFOuvG4.mjs.map +0 -1
  341. package/fesm2022/acorex-modules-health-core-body-part.entity-JGLwrFE2.mjs.map +0 -1
  342. package/fesm2022/acorex-modules-health-core-chronic-condition-type.entity-DrxEPQj1.mjs.map +0 -1
  343. package/fesm2022/acorex-modules-health-core-disability-status.entity-UaAQFFMC.mjs.map +0 -1
  344. package/fesm2022/acorex-modules-health-core-injury-type.entity-DcIn0rxz.mjs.map +0 -1
  345. package/fesm2022/acorex-modules-health-core-vaccination-type.entity-zYd6KLRC.mjs.map +0 -1
  346. package/fesm2022/acorex-modules-human-capital-management-employee.entity-BRpqFRuI.mjs.map +0 -1
  347. package/fesm2022/acorex-modules-human-capital-management-employment-type.entity-7ZGZYxGM.mjs.map +0 -1
  348. package/fesm2022/acorex-modules-human-capital-management-leave-request.entity-B3Rk84bJ.mjs.map +0 -1
  349. package/fesm2022/acorex-modules-human-capital-management-leave-type.entity-OKu8_PP1.mjs.map +0 -1
  350. package/fesm2022/acorex-modules-human-capital-management-position-assignment.entity-D_C459kx.mjs.map +0 -1
  351. package/fesm2022/acorex-modules-learning-management-certificate-definition.entity-27VKYxw1.mjs.map +0 -1
  352. package/fesm2022/acorex-modules-learning-management-certificate-type.entity-CBM6N-PD.mjs.map +0 -1
  353. package/fesm2022/acorex-modules-learning-management-certificate.entity-BRBJQYji.mjs.map +0 -1
  354. package/fesm2022/acorex-modules-learning-management-course-type.entity-B1c6PDLq.mjs.map +0 -1
  355. package/fesm2022/acorex-modules-learning-management-course.entity-BN8XHAPz.mjs.map +0 -1
  356. package/fesm2022/acorex-modules-learning-management-learning-path.entity-8QlM3R4B.mjs.map +0 -1
  357. package/fesm2022/acorex-modules-learning-management-skill-level.entity-DXOWslpB.mjs.map +0 -1
  358. package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-edit.component-CaeZ9P_I.mjs +0 -162
  359. package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-edit.component-CaeZ9P_I.mjs.map +0 -1
  360. package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-view.component-1oWMtdrN.mjs +0 -70
  361. package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-view.component-1oWMtdrN.mjs.map +0 -1
  362. package/fesm2022/acorex-modules-learning-management-skill-matrix.component-_cFwIN-z.mjs +0 -468
  363. package/fesm2022/acorex-modules-learning-management-skill-matrix.component-_cFwIN-z.mjs.map +0 -1
  364. package/fesm2022/acorex-modules-learning-management-skill.entity-DrLts807.mjs.map +0 -1
  365. package/fesm2022/acorex-modules-learning-management-training-definition.entity-NQqJ5avw.mjs.map +0 -1
  366. package/fesm2022/acorex-modules-learning-management-training-type.entity-CoyDCeen.mjs.map +0 -1
  367. package/fesm2022/acorex-modules-learning-management-training.entity-BCGn0T3H.mjs.map +0 -1
  368. package/fesm2022/acorex-modules-maintenance-management-failure-register.entity-D_lQrda5.mjs.map +0 -1
  369. package/fesm2022/acorex-modules-organization-management-business-unit-type.entity-C-EKX6Oy.mjs +0 -91
  370. package/fesm2022/acorex-modules-organization-management-business-unit-type.entity-C-EKX6Oy.mjs.map +0 -1
  371. package/fesm2022/acorex-modules-organization-management-chart.entity-bRxA8XHZ.mjs.map +0 -1
  372. package/fesm2022/acorex-modules-organization-management-company.entity-BohMJQNi.mjs.map +0 -1
  373. package/fesm2022/acorex-modules-organization-management-job-definition.entity-S9Jlmr-o.mjs.map +0 -1
  374. package/fesm2022/acorex-modules-organization-management-org-chart.page-eRTHzLDQ.mjs +0 -784
  375. package/fesm2022/acorex-modules-organization-management-org-chart.page-eRTHzLDQ.mjs.map +0 -1
  376. package/fesm2022/acorex-modules-organization-management-position.entity-DLPufeWz.mjs.map +0 -1
  377. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-mMZywr0X.mjs.map +0 -1
  378. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix.component-B06t1G1E.mjs.map +0 -1
  379. package/fesm2022/acorex-modules-organization-management-responsibility.entity-CMmr3wJa.mjs.map +0 -1
  380. package/fesm2022/acorex-modules-organization-management-team-member-role.entity-CZ4MibH4.mjs +0 -88
  381. package/fesm2022/acorex-modules-organization-management-team-member-role.entity-CZ4MibH4.mjs.map +0 -1
  382. package/fesm2022/acorex-modules-organization-management-team-member.entity-8sTjn5Jn.mjs.map +0 -1
  383. package/fesm2022/acorex-modules-organization-management-team.entity-CGR0UlYl.mjs.map +0 -1
  384. package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-DPSNAAct.mjs.map +0 -1
  385. package/fesm2022/acorex-modules-reservation-management-acorex-modules-reservation-management-BMemqW2V.mjs.map +0 -1
  386. package/fesm2022/acorex-modules-task-management-task-board.page-C1H_GTqy.mjs.map +0 -1
  387. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-column.component-C8lgSjfc.mjs.map +0 -1
  388. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BGUPxGXP.mjs.map +0 -1
  389. package/fesm2022/acorex-modules-workflow-management-activity-definition.entity-Bvs1OfE_.mjs.map +0 -1
  390. package/fesm2022/acorex-modules-workflow-management-index-DWIDQsWq.mjs.map +0 -1
  391. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-aJou58ED.mjs.map +0 -1
  392. package/fesm2022/acorex-modules-workflow-management-workflow-instance.entity-Cq7LE7u5.mjs.map +0 -1
  393. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-CIakASVR.mjs.map +0 -1
@@ -0,0 +1,1740 @@
1
+ import { AXPanViewDirective } from '@acorex/cdk/pan-view';
2
+ import { AXBadgeModule } from '@acorex/components/badge';
3
+ import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
4
+ import * as i1 from '@acorex/components/button';
5
+ import { AXButtonModule } from '@acorex/components/button';
6
+ import * as i2 from '@acorex/components/decorators';
7
+ import { AXDecoratorModule } from '@acorex/components/decorators';
8
+ import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
9
+ import { AXLoadingModule } from '@acorex/components/loading';
10
+ import * as i2$1 from '@acorex/components/menu';
11
+ import { AXContextMenuComponent, AXMenuModule } from '@acorex/components/menu';
12
+ import * as i6 from '@acorex/components/search-box';
13
+ import { AXSearchBoxModule } from '@acorex/components/search-box';
14
+ import * as i7 from '@acorex/components/switch';
15
+ import { AXSwitchModule } from '@acorex/components/switch';
16
+ import * as i3 from '@acorex/core/translation';
17
+ import { AXTranslationModule, AXTranslationService, createMultiLanguageString, resolveMultiLanguageString } from '@acorex/core/translation';
18
+ import { AXPDataGenerator, AXPPlatformScope, AXPDeviceService, getActionButton } from '@acorex/platform/core';
19
+ import { AXPAvatarComponent, AXPThemeLayoutBlockComponent } from '@acorex/platform/layout/components';
20
+ import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPageLayoutBase } from '@acorex/platform/layout/views';
21
+ import * as i3$1 from '@angular/common';
22
+ import { AsyncPipe, CommonModule } from '@angular/common';
23
+ import * as i0 from '@angular/core';
24
+ import { inject, input, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, Injectable, signal, viewChild, NgZone, Injector, ViewContainerRef, LOCALE_ID, afterNextRender } from '@angular/core';
25
+ import * as i1$1 from '@angular/forms';
26
+ import { FormsModule } from '@angular/forms';
27
+ import { ActivatedRoute, RouterModule } from '@angular/router';
28
+ import set from 'lodash-es/set';
29
+ import { A as AXM_ORG_CHART_HOST, a as AXMOrgChartNodeType, b as AXM_ORG_CHART_NODE_CONTRIBUTOR, R as RootConfig, n as normalizeVacantLeafSeatsSetting, c as AXPOrganizationManagementSettings, p as parseOrgChartMode, d as AXMOrgChartCategory, e as AXMOrgChartDetailPanelComponent } from './acorex-modules-organization-management-acorex-modules-organization-management-CnAHfj2t.mjs';
30
+ import { AXLoadingDialogService } from '@acorex/components/loading-dialog';
31
+ import { AXPExportService, AXPSettingsService } from '@acorex/platform/common';
32
+ import { AXPEntityService } from '@acorex/platform/layout/entity';
33
+ import { AXPCommandService } from '@acorex/platform/runtime';
34
+
35
+ //#region ---- Imports ----
36
+ //#endregion
37
+ //#region ---- Component ----
38
+ /** Business unit node: merged unit (head slot) or compact card. */
39
+ class AXMOrgChartBusinessUnitNodeComponent {
40
+ constructor() {
41
+ this.host = inject(AXM_ORG_CHART_HOST);
42
+ this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
43
+ this.unitFooterMetrics = computed(() => {
44
+ const node = this.data();
45
+ const items = [];
46
+ const roster = this.host.getSubtreeRosterCounts(node);
47
+ if (roster) {
48
+ items.push({
49
+ icon: 'fa-users',
50
+ value: String(roster.people),
51
+ title: this.host.chartML.people,
52
+ });
53
+ items.push({
54
+ icon: 'fa-briefcase',
55
+ value: String(roster.positions),
56
+ title: this.host.chartML.positions,
57
+ });
58
+ }
59
+ const teams = this.host.getTeamsMembershipCount(node);
60
+ if (teams != null && teams > 0) {
61
+ items.push({
62
+ icon: 'fa-people-group',
63
+ value: String(teams),
64
+ title: this.host.chartML.teams,
65
+ });
66
+ }
67
+ return items;
68
+ }, ...(ngDevMode ? [{ debugName: "unitFooterMetrics" }] : /* istanbul ignore next */ []));
69
+ }
70
+ isRegional() {
71
+ return this.data().metadata?.['isRegional'] === true;
72
+ }
73
+ getColorKey() {
74
+ return this.isRegional() ? 'accent1' : 'accent2';
75
+ }
76
+ resolveNodeColorToken() {
77
+ const raw = this.data().metadata?.['unitTypeColor'];
78
+ if (typeof raw === 'string' && raw.trim().length > 0) {
79
+ return raw.trim();
80
+ }
81
+ return this.getColorKey();
82
+ }
83
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartBusinessUnitNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
84
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMOrgChartBusinessUnitNodeComponent, isStandalone: true, selector: "axm-org-chart-business-unit-node", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div>\n @if (data().metadata?.['chartTemplate'] === 'merged-unit') {\n @let leadIcon = data().icon ?? 'fa-building';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--business-unit\"\n [class.axm-org-chart-card--vacant]=\"!!data().metadata?.['unitHead']?.['vacant']\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors(resolveNodeColorToken())\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle && host.shouldShowOrgCardSubtitle(data())) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n @if (data().metadata?.['unitHead']; as unitHead) {\n <section class=\"axm-org-chart-card__person\">\n <div class=\"axm-org-chart-card__person-label\">{{ host.chartML.buHead | translate | async }}</div>\n <div class=\"axm-org-chart-card__person-row\">\n <axp-avatar\n [fullName]=\"unitHead['employeeName'] ?? ''\"\n [placeholder]=\"unitHead['vacant'] || !unitHead['employeeName']\"\n [size]=\"44\"\n />\n <div class=\"axm-org-chart-card__person-text\">\n @if (unitHead['vacant'] || !unitHead['employeeName']) {\n <span class=\"axm-org-chart-card__person-vacant\">{{\n host.chartML.vacant | translate | async\n }}</span>\n } @else {\n <span class=\"axm-org-chart-card__person-name\">{{ unitHead['employeeName'] }}</span>\n }\n @if (unitHead['positionTitle']) {\n <span class=\"axm-org-chart-card__person-role\">{{ unitHead['positionTitle'] | translate | async }}</span>\n }\n </div>\n </div>\n </section>\n }\n </div>\n @if (unitFooterMetrics().length > 0) {\n <div class=\"axm-org-chart-card__footer\">\n @for (m of unitFooterMetrics(); track $index) {\n <div class=\"axm-org-chart-card__metric\">\n <i [class]=\"'fa-light fa-fw axm-org-chart-card__metric-icon ' + m.icon\"></i>\n <div class=\"axm-org-chart-card__metric-col\">\n <span class=\"axm-org-chart-card__metric-value\">{{ m.value }}</span>\n <span\n class=\"axm-org-chart-card__metric-title\"\n [title]=\"(m.title | translate | async) ?? ''\"\n >{{ m.title | translate | async }}</span\n >\n </div>\n </div>\n }\n </div>\n }\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n } @else {\n @let leadIcon = data().icon ?? 'fa-building';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--business-unit\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors(resolveNodeColorToken())\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle && host.shouldShowOrgCardSubtitle(data())) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n </div>\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n", dependencies: [{ 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: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAvatarComponent, selector: "axp-avatar", inputs: ["size", "src", "fullName", "fallbackText", "placeholder"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
85
+ }
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartBusinessUnitNodeComponent, decorators: [{
87
+ type: Component,
88
+ args: [{ selector: 'axm-org-chart-business-unit-node', imports: [AXButtonModule, AXDecoratorModule, AXPAvatarComponent, AXTranslationModule, AsyncPipe], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div>\n @if (data().metadata?.['chartTemplate'] === 'merged-unit') {\n @let leadIcon = data().icon ?? 'fa-building';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--business-unit\"\n [class.axm-org-chart-card--vacant]=\"!!data().metadata?.['unitHead']?.['vacant']\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors(resolveNodeColorToken())\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle && host.shouldShowOrgCardSubtitle(data())) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n @if (data().metadata?.['unitHead']; as unitHead) {\n <section class=\"axm-org-chart-card__person\">\n <div class=\"axm-org-chart-card__person-label\">{{ host.chartML.buHead | translate | async }}</div>\n <div class=\"axm-org-chart-card__person-row\">\n <axp-avatar\n [fullName]=\"unitHead['employeeName'] ?? ''\"\n [placeholder]=\"unitHead['vacant'] || !unitHead['employeeName']\"\n [size]=\"44\"\n />\n <div class=\"axm-org-chart-card__person-text\">\n @if (unitHead['vacant'] || !unitHead['employeeName']) {\n <span class=\"axm-org-chart-card__person-vacant\">{{\n host.chartML.vacant | translate | async\n }}</span>\n } @else {\n <span class=\"axm-org-chart-card__person-name\">{{ unitHead['employeeName'] }}</span>\n }\n @if (unitHead['positionTitle']) {\n <span class=\"axm-org-chart-card__person-role\">{{ unitHead['positionTitle'] | translate | async }}</span>\n }\n </div>\n </div>\n </section>\n }\n </div>\n @if (unitFooterMetrics().length > 0) {\n <div class=\"axm-org-chart-card__footer\">\n @for (m of unitFooterMetrics(); track $index) {\n <div class=\"axm-org-chart-card__metric\">\n <i [class]=\"'fa-light fa-fw axm-org-chart-card__metric-icon ' + m.icon\"></i>\n <div class=\"axm-org-chart-card__metric-col\">\n <span class=\"axm-org-chart-card__metric-value\">{{ m.value }}</span>\n <span\n class=\"axm-org-chart-card__metric-title\"\n [title]=\"(m.title | translate | async) ?? ''\"\n >{{ m.title | translate | async }}</span\n >\n </div>\n </div>\n }\n </div>\n }\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n } @else {\n @let leadIcon = data().icon ?? 'fa-building';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--business-unit\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors(resolveNodeColorToken())\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle && host.shouldShowOrgCardSubtitle(data())) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n </div>\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n" }]
89
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }] } });
90
+
91
+ //#region ---- Imports ----
92
+ //#endregion
93
+ //#region ---- Component ----
94
+ /** Company node: merged executive (Chief executive slot) or compact company card. */
95
+ class AXMOrgChartCompanyNodeComponent {
96
+ constructor() {
97
+ this.host = inject(AXM_ORG_CHART_HOST);
98
+ this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
99
+ this.companyFooterMetrics = computed(() => {
100
+ const node = this.data();
101
+ const items = [];
102
+ const roster = this.host.getSubtreeRosterCounts(node);
103
+ if (roster) {
104
+ items.push({
105
+ icon: 'fa-users',
106
+ value: String(roster.people),
107
+ title: this.host.chartML.people,
108
+ });
109
+ items.push({
110
+ icon: 'fa-briefcase',
111
+ value: String(roster.positions),
112
+ title: this.host.chartML.positions,
113
+ });
114
+ }
115
+ const teams = this.host.getTeamsMembershipCount(node);
116
+ if (teams != null && teams > 0) {
117
+ items.push({
118
+ icon: 'fa-people-group',
119
+ value: String(teams),
120
+ title: this.host.chartML.teams,
121
+ });
122
+ }
123
+ return items;
124
+ }, ...(ngDevMode ? [{ debugName: "companyFooterMetrics" }] : /* istanbul ignore next */ []));
125
+ }
126
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartCompanyNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
127
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMOrgChartCompanyNodeComponent, isStandalone: true, selector: "axm-org-chart-company-node", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div>\n @if (data().metadata?.['chartTemplate'] === 'merged-executive') {\n @let leadIcon = data().icon ?? 'fa-building';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--company\"\n [class.axm-org-chart-card--vacant]=\"!!data().metadata?.['topRole']?.['vacant']\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('primary')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n @if (data().metadata?.['topRole']; as topRole) {\n <section class=\"axm-org-chart-card__person\">\n <div class=\"axm-org-chart-card__person-label\">{{ host.chartML.chiefExecutive | translate | async }}</div>\n <div class=\"axm-org-chart-card__person-row\">\n <axp-avatar\n [fullName]=\"topRole['employeeName'] ?? ''\"\n [placeholder]=\"topRole['vacant'] || !topRole['employeeName']\"\n [size]=\"44\"\n />\n <div class=\"axm-org-chart-card__person-text\">\n @if (topRole['vacant'] || !topRole['employeeName']) {\n <span class=\"axm-org-chart-card__person-vacant\">{{\n host.chartML.vacant | translate | async\n }}</span>\n } @else {\n <span class=\"axm-org-chart-card__person-name\">{{ topRole['employeeName'] }}</span>\n }\n @if (topRole['positionTitle']) {\n <span class=\"axm-org-chart-card__person-role\">{{ topRole['positionTitle'] | translate | async }}</span>\n }\n </div>\n </div>\n </section>\n }\n </div>\n @if (companyFooterMetrics().length > 0) {\n <div class=\"axm-org-chart-card__footer\">\n @for (m of companyFooterMetrics(); track $index) {\n <div class=\"axm-org-chart-card__metric\">\n <i [class]=\"'fa-light fa-fw axm-org-chart-card__metric-icon ' + m.icon\"></i>\n <div class=\"axm-org-chart-card__metric-col\">\n <span class=\"axm-org-chart-card__metric-value\">{{ m.value }}</span>\n <span\n class=\"axm-org-chart-card__metric-title\"\n [title]=\"(m.title | translate | async) ?? ''\"\n >{{ m.title | translate | async }}</span\n >\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else {\n @let leadIcon = data().icon ?? 'fa-building';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--company\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('primary')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n </div>\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n", dependencies: [{ 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: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAvatarComponent, selector: "axp-avatar", inputs: ["size", "src", "fullName", "fallbackText", "placeholder"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
128
+ }
129
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartCompanyNodeComponent, decorators: [{
130
+ type: Component,
131
+ args: [{ selector: 'axm-org-chart-company-node', imports: [AXButtonModule, AXDecoratorModule, AXPAvatarComponent, AXTranslationModule, AsyncPipe], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div>\n @if (data().metadata?.['chartTemplate'] === 'merged-executive') {\n @let leadIcon = data().icon ?? 'fa-building';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--company\"\n [class.axm-org-chart-card--vacant]=\"!!data().metadata?.['topRole']?.['vacant']\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('primary')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n @if (data().metadata?.['topRole']; as topRole) {\n <section class=\"axm-org-chart-card__person\">\n <div class=\"axm-org-chart-card__person-label\">{{ host.chartML.chiefExecutive | translate | async }}</div>\n <div class=\"axm-org-chart-card__person-row\">\n <axp-avatar\n [fullName]=\"topRole['employeeName'] ?? ''\"\n [placeholder]=\"topRole['vacant'] || !topRole['employeeName']\"\n [size]=\"44\"\n />\n <div class=\"axm-org-chart-card__person-text\">\n @if (topRole['vacant'] || !topRole['employeeName']) {\n <span class=\"axm-org-chart-card__person-vacant\">{{\n host.chartML.vacant | translate | async\n }}</span>\n } @else {\n <span class=\"axm-org-chart-card__person-name\">{{ topRole['employeeName'] }}</span>\n }\n @if (topRole['positionTitle']) {\n <span class=\"axm-org-chart-card__person-role\">{{ topRole['positionTitle'] | translate | async }}</span>\n }\n </div>\n </div>\n </section>\n }\n </div>\n @if (companyFooterMetrics().length > 0) {\n <div class=\"axm-org-chart-card__footer\">\n @for (m of companyFooterMetrics(); track $index) {\n <div class=\"axm-org-chart-card__metric\">\n <i [class]=\"'fa-light fa-fw axm-org-chart-card__metric-icon ' + m.icon\"></i>\n <div class=\"axm-org-chart-card__metric-col\">\n <span class=\"axm-org-chart-card__metric-value\">{{ m.value }}</span>\n <span\n class=\"axm-org-chart-card__metric-title\"\n [title]=\"(m.title | translate | async) ?? ''\"\n >{{ m.title | translate | async }}</span\n >\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else {\n @let leadIcon = data().icon ?? 'fa-building';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--company\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('primary')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n </div>\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n" }]
132
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }] } });
133
+
134
+ //#region ---- Imports ----
135
+ //#endregion
136
+ //#region ---- Component ----
137
+ /** Employee node: person-forward card or compact icon card. */
138
+ class AXMOrgChartEmployeeNodeComponent {
139
+ constructor() {
140
+ this.host = inject(AXM_ORG_CHART_HOST);
141
+ this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
142
+ this.employeeFooterMetrics = computed(() => {
143
+ const teams = this.host.getTeamsMembershipCount(this.data());
144
+ if (teams == null || teams <= 0) {
145
+ return [];
146
+ }
147
+ return [
148
+ {
149
+ icon: 'fa-people-group',
150
+ value: String(teams),
151
+ title: this.host.chartML.teams,
152
+ },
153
+ ];
154
+ }, ...(ngDevMode ? [{ debugName: "employeeFooterMetrics" }] : /* istanbul ignore next */ []));
155
+ }
156
+ /** Frame color for employee merged cards — distinct from business units (`accent2`). */
157
+ getColorKey() {
158
+ return 'accent3';
159
+ }
160
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartEmployeeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
161
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMOrgChartEmployeeNodeComponent, isStandalone: true, selector: "axm-org-chart-employee-node", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div>\n @if (data().metadata?.['chartTemplate'] === 'employee-card') {\n @let titleText = (data().title | translate | async) ?? '';\n @let subtitleText = data().subtitle ? ((data().subtitle | translate | async) ?? '') : '';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--employee\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors(getColorKey())\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--person\">\n <axp-avatar [fullName]=\"titleText\" [placeholder]=\"!titleText.trim()\" [size]=\"56\" />\n <div class=\"axm-org-chart-card__person-text\">\n @if (titleText.trim()) {\n <span class=\"axm-org-chart-card__person-name\" [title]=\"titleText\">{{ titleText }}</span>\n }\n @if (subtitleText) {\n <span class=\"axm-org-chart-card__person-role\">{{ subtitleText }}</span>\n }\n </div>\n </div>\n </div>\n @if (employeeFooterMetrics().length > 0) {\n <div class=\"axm-org-chart-card__footer\">\n @for (m of employeeFooterMetrics(); track $index) {\n <div class=\"axm-org-chart-card__metric\">\n <i [class]=\"'fa-light fa-fw axm-org-chart-card__metric-icon ' + m.icon\"></i>\n <div class=\"axm-org-chart-card__metric-col\">\n <span class=\"axm-org-chart-card__metric-value\">{{ m.value }}</span>\n <span\n class=\"axm-org-chart-card__metric-title\"\n [title]=\"(m.title | translate | async) ?? ''\"\n >{{ m.title | translate | async }}</span\n >\n </div>\n </div>\n }\n </div>\n }\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n } @else {\n @let leadIcon = data().icon ?? 'fa-address-card';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--employee\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('surface')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n </div>\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n", dependencies: [{ 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: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAvatarComponent, selector: "axp-avatar", inputs: ["size", "src", "fullName", "fallbackText", "placeholder"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
162
+ }
163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartEmployeeNodeComponent, decorators: [{
164
+ type: Component,
165
+ args: [{ selector: 'axm-org-chart-employee-node', imports: [AXButtonModule, AXDecoratorModule, AXPAvatarComponent, AXTranslationModule, AsyncPipe], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div>\n @if (data().metadata?.['chartTemplate'] === 'employee-card') {\n @let titleText = (data().title | translate | async) ?? '';\n @let subtitleText = data().subtitle ? ((data().subtitle | translate | async) ?? '') : '';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--employee\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors(getColorKey())\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--person\">\n <axp-avatar [fullName]=\"titleText\" [placeholder]=\"!titleText.trim()\" [size]=\"56\" />\n <div class=\"axm-org-chart-card__person-text\">\n @if (titleText.trim()) {\n <span class=\"axm-org-chart-card__person-name\" [title]=\"titleText\">{{ titleText }}</span>\n }\n @if (subtitleText) {\n <span class=\"axm-org-chart-card__person-role\">{{ subtitleText }}</span>\n }\n </div>\n </div>\n </div>\n @if (employeeFooterMetrics().length > 0) {\n <div class=\"axm-org-chart-card__footer\">\n @for (m of employeeFooterMetrics(); track $index) {\n <div class=\"axm-org-chart-card__metric\">\n <i [class]=\"'fa-light fa-fw axm-org-chart-card__metric-icon ' + m.icon\"></i>\n <div class=\"axm-org-chart-card__metric-col\">\n <span class=\"axm-org-chart-card__metric-value\">{{ m.value }}</span>\n <span\n class=\"axm-org-chart-card__metric-title\"\n [title]=\"(m.title | translate | async) ?? ''\"\n >{{ m.title | translate | async }}</span\n >\n </div>\n </div>\n }\n </div>\n }\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n } @else {\n @let leadIcon = data().icon ?? 'fa-address-card';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--employee\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('surface')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n </div>\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n" }]
166
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }] } });
167
+
168
+ //#region ---- Imports ----
169
+ //#endregion
170
+ //#region ---- Component ----
171
+ /** Position node: merged manager (occupant slot), IC seat, or compact card. */
172
+ class AXMOrgChartPositionNodeComponent {
173
+ constructor() {
174
+ this.host = inject(AXM_ORG_CHART_HOST);
175
+ this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
176
+ this.icFooterMetrics = computed(() => {
177
+ const roster = this.host.getSubtreeRosterCounts(this.data());
178
+ if (!roster) {
179
+ return [];
180
+ }
181
+ return [
182
+ {
183
+ icon: 'fa-users',
184
+ value: String(roster.people),
185
+ title: this.host.chartML.people,
186
+ },
187
+ {
188
+ icon: 'fa-briefcase',
189
+ value: String(roster.positions),
190
+ title: this.host.chartML.positions,
191
+ },
192
+ ];
193
+ }, ...(ngDevMode ? [{ debugName: "icFooterMetrics" }] : /* istanbul ignore next */ []));
194
+ this.managerFooterMetrics = computed(() => {
195
+ const stats = this.data().metadata?.['stats'];
196
+ const directReports = stats?.['directReports'];
197
+ if (typeof directReports !== 'number' || !Number.isFinite(directReports) || directReports <= 0) {
198
+ return [];
199
+ }
200
+ return [
201
+ {
202
+ icon: 'fa-users',
203
+ value: String(Math.max(0, Math.floor(directReports))),
204
+ title: this.host.chartML.directReports,
205
+ },
206
+ ];
207
+ }, ...(ngDevMode ? [{ debugName: "managerFooterMetrics" }] : /* istanbul ignore next */ []));
208
+ }
209
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartPositionNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
210
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMOrgChartPositionNodeComponent, isStandalone: true, selector: "axm-org-chart-position-node", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div>\n @if (data().metadata?.['chartTemplate'] === 'merged-manager') {\n @let leadIcon = 'fa-user-tie';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--position\"\n [class.axm-org-chart-card--vacant]=\"!!data().metadata?.['vacant']\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('accent3')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle && host.shouldShowOrgCardSubtitle(data())) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n </div>\n </div>\n <section class=\"axm-org-chart-card__person\">\n <div class=\"axm-org-chart-card__person-row\">\n <axp-avatar\n [fullName]=\"data().metadata?.['occupant']?.['displayName'] ?? ''\"\n [placeholder]=\"!!data().metadata?.['vacant'] || !data().metadata?.['occupant']?.['displayName']\"\n [size]=\"44\"\n />\n <div class=\"axm-org-chart-card__person-text\">\n @if (!!data().metadata?.['vacant'] || !data().metadata?.['occupant']?.['displayName']) {\n <span class=\"axm-org-chart-card__person-vacant\">{{ host.chartML.vacant | translate | async }}</span>\n } @else {\n <span class=\"axm-org-chart-card__person-name\">{{ data().metadata?.['occupant']?.['displayName'] }}</span>\n }\n @if (\n data().description &&\n !data().metadata?.['vacant'] &&\n data().metadata?.['occupant']?.['displayName']\n ) {\n <span class=\"axm-org-chart-card__person-role\">{{ data().description! | translate | async }}</span>\n }\n </div>\n </div>\n </section>\n </div>\n @if (managerFooterMetrics().length > 0) {\n <div class=\"axm-org-chart-card__footer\">\n @for (m of managerFooterMetrics(); track $index) {\n <div class=\"axm-org-chart-card__metric\">\n <i [class]=\"'fa-light fa-fw axm-org-chart-card__metric-icon ' + m.icon\"></i>\n <div class=\"axm-org-chart-card__metric-col\">\n <span class=\"axm-org-chart-card__metric-value\">{{ m.value }}</span>\n <span\n class=\"axm-org-chart-card__metric-title\"\n [title]=\"(m.title | translate | async) ?? ''\"\n >{{ m.title | translate | async }}</span\n >\n </div>\n </div>\n }\n </div>\n }\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n } @else if (data().metadata?.['chartTemplate'] === 'position-ic') {\n @let leadIcon = data().icon ?? 'fa-user-tie';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--position\"\n [class.axm-org-chart-card--vacant]=\"!!data().metadata?.['vacant']\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('accent3')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n } @else if (data().metadata?.['vacant']) {\n <span class=\"axm-org-chart-card__subtitle\">{{ host.chartML.vacant | translate | async }}</span>\n }\n </div>\n </div>\n </div>\n @if (icFooterMetrics().length > 0) {\n <div class=\"axm-org-chart-card__footer\">\n @for (m of icFooterMetrics(); track $index) {\n <div class=\"axm-org-chart-card__metric\">\n <i [class]=\"'fa-light fa-fw axm-org-chart-card__metric-icon ' + m.icon\"></i>\n <div class=\"axm-org-chart-card__metric-col\">\n <span class=\"axm-org-chart-card__metric-value\">{{ m.value }}</span>\n <span\n class=\"axm-org-chart-card__metric-title\"\n [title]=\"(m.title | translate | async) ?? ''\"\n >{{ m.title | translate | async }}</span\n >\n </div>\n </div>\n }\n </div>\n }\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n } @else {\n @let leadIcon = data().icon ?? 'fa-user-tie';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--position\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('accent3')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n </div>\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n", dependencies: [{ 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: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAvatarComponent, selector: "axp-avatar", inputs: ["size", "src", "fullName", "fallbackText", "placeholder"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
211
+ }
212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartPositionNodeComponent, decorators: [{
213
+ type: Component,
214
+ args: [{ selector: 'axm-org-chart-position-node', imports: [AXButtonModule, AXDecoratorModule, AXPAvatarComponent, AXTranslationModule, AsyncPipe], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div>\n @if (data().metadata?.['chartTemplate'] === 'merged-manager') {\n @let leadIcon = 'fa-user-tie';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--position\"\n [class.axm-org-chart-card--vacant]=\"!!data().metadata?.['vacant']\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('accent3')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle && host.shouldShowOrgCardSubtitle(data())) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n </div>\n </div>\n <section class=\"axm-org-chart-card__person\">\n <div class=\"axm-org-chart-card__person-row\">\n <axp-avatar\n [fullName]=\"data().metadata?.['occupant']?.['displayName'] ?? ''\"\n [placeholder]=\"!!data().metadata?.['vacant'] || !data().metadata?.['occupant']?.['displayName']\"\n [size]=\"44\"\n />\n <div class=\"axm-org-chart-card__person-text\">\n @if (!!data().metadata?.['vacant'] || !data().metadata?.['occupant']?.['displayName']) {\n <span class=\"axm-org-chart-card__person-vacant\">{{ host.chartML.vacant | translate | async }}</span>\n } @else {\n <span class=\"axm-org-chart-card__person-name\">{{ data().metadata?.['occupant']?.['displayName'] }}</span>\n }\n @if (\n data().description &&\n !data().metadata?.['vacant'] &&\n data().metadata?.['occupant']?.['displayName']\n ) {\n <span class=\"axm-org-chart-card__person-role\">{{ data().description! | translate | async }}</span>\n }\n </div>\n </div>\n </section>\n </div>\n @if (managerFooterMetrics().length > 0) {\n <div class=\"axm-org-chart-card__footer\">\n @for (m of managerFooterMetrics(); track $index) {\n <div class=\"axm-org-chart-card__metric\">\n <i [class]=\"'fa-light fa-fw axm-org-chart-card__metric-icon ' + m.icon\"></i>\n <div class=\"axm-org-chart-card__metric-col\">\n <span class=\"axm-org-chart-card__metric-value\">{{ m.value }}</span>\n <span\n class=\"axm-org-chart-card__metric-title\"\n [title]=\"(m.title | translate | async) ?? ''\"\n >{{ m.title | translate | async }}</span\n >\n </div>\n </div>\n }\n </div>\n }\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n } @else if (data().metadata?.['chartTemplate'] === 'position-ic') {\n @let leadIcon = data().icon ?? 'fa-user-tie';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--position\"\n [class.axm-org-chart-card--vacant]=\"!!data().metadata?.['vacant']\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('accent3')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n } @else if (data().metadata?.['vacant']) {\n <span class=\"axm-org-chart-card__subtitle\">{{ host.chartML.vacant | translate | async }}</span>\n }\n </div>\n </div>\n </div>\n @if (icFooterMetrics().length > 0) {\n <div class=\"axm-org-chart-card__footer\">\n @for (m of icFooterMetrics(); track $index) {\n <div class=\"axm-org-chart-card__metric\">\n <i [class]=\"'fa-light fa-fw axm-org-chart-card__metric-icon ' + m.icon\"></i>\n <div class=\"axm-org-chart-card__metric-col\">\n <span class=\"axm-org-chart-card__metric-value\">{{ m.value }}</span>\n <span\n class=\"axm-org-chart-card__metric-title\"\n [title]=\"(m.title | translate | async) ?? ''\"\n >{{ m.title | translate | async }}</span\n >\n </div>\n </div>\n }\n </div>\n }\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n } @else {\n @let leadIcon = data().icon ?? 'fa-user-tie';\n <div\n #node\n class=\"--node-container --merged-card axm-org-chart-card axm-org-chart-card--position\"\n [attr.data-chart-node-id]=\"data().id\"\n [class.--selected]=\"host.isNodeSelected(data())\"\n [style]=\"host.getNodeColors('accent3')\"\n (click)=\"host.selectNode(data())\"\n (contextmenu)=\"host.selectNode(data())\"\n >\n <div class=\"--container\">\n <div class=\"axm-org-chart-card__accent\" aria-hidden=\"true\"></div>\n <div class=\"axm-org-chart-card__body\">\n <div class=\"axm-org-chart-card__header axm-org-chart-card__header--org\">\n <div class=\"axm-org-chart-card__leading-icon\">\n <i [class]=\"'fa-light fa-xl fa-fw ' + leadIcon\"></i>\n </div>\n <div class=\"axm-org-chart-card__title-block\">\n <span class=\"axm-org-chart-card__title\" [title]=\"(data().title | translate | async) ?? ''\">{{\n data().title | translate | async\n }}</span>\n @if (data().subtitle) {\n <span class=\"axm-org-chart-card__subtitle\" [title]=\"(data().subtitle! | translate | async) ?? ''\">{{\n data().subtitle! | translate | async\n }}</span>\n }\n @if (data().description) {\n <span class=\"axm-org-chart-card__desc\">{{ data().description | translate | async }}</span>\n }\n </div>\n </div>\n </div>\n @if (data().children && data().children!.length > 0) {\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"host.toggleNode(data(), node)\">\n <ax-icon\n icon=\"fa-solid\"\n [class]=\"data().isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"\n ></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n" }]
215
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }] } });
216
+
217
+ //#region ---- Imports ----
218
+ //#endregion
219
+ //#region ---- Component ----
220
+ /**
221
+ * Picks the org chart card by node type. Uses a static @switch (not NgComponentOutlet) so
222
+ * components render reliably when the host is created in code and moved into an SVG foreignObject.
223
+ */
224
+ class AXMOrgChartNodeOutletComponent {
225
+ constructor() {
226
+ this.NodeTypes = AXMOrgChartNodeType;
227
+ this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
228
+ }
229
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartNodeOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
230
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMOrgChartNodeOutletComponent, isStandalone: true, selector: "axm-org-chart-node-outlet", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "axm-org-chart-node-outlet" }, ngImport: i0, template: "@switch (data().type) {\n@case (NodeTypes.Company) {\n<axm-org-chart-company-node [data]=\"data()\" />\n} @case (NodeTypes.BusinessUnit) {\n<axm-org-chart-business-unit-node [data]=\"data()\" />\n} @case (NodeTypes.Position) {\n<axm-org-chart-position-node [data]=\"data()\" />\n} @case (NodeTypes.Employee) {\n<axm-org-chart-employee-node [data]=\"data()\" />\n} @default {\n<axm-org-chart-company-node [data]=\"data()\" />\n} }", styles: ["axm-org-chart-node-outlet{display:block;width:100%;min-height:1px;box-sizing:border-box}\n"], dependencies: [{ kind: "component", type: AXMOrgChartCompanyNodeComponent, selector: "axm-org-chart-company-node", inputs: ["data"] }, { kind: "component", type: AXMOrgChartBusinessUnitNodeComponent, selector: "axm-org-chart-business-unit-node", inputs: ["data"] }, { kind: "component", type: AXMOrgChartPositionNodeComponent, selector: "axm-org-chart-position-node", inputs: ["data"] }, { kind: "component", type: AXMOrgChartEmployeeNodeComponent, selector: "axm-org-chart-employee-node", inputs: ["data"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
231
+ }
232
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartNodeOutletComponent, decorators: [{
233
+ type: Component,
234
+ args: [{ selector: 'axm-org-chart-node-outlet', imports: [
235
+ AXMOrgChartCompanyNodeComponent,
236
+ AXMOrgChartBusinessUnitNodeComponent,
237
+ AXMOrgChartPositionNodeComponent,
238
+ AXMOrgChartEmployeeNodeComponent,
239
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
240
+ class: 'axm-org-chart-node-outlet',
241
+ }, template: "@switch (data().type) {\n@case (NodeTypes.Company) {\n<axm-org-chart-company-node [data]=\"data()\" />\n} @case (NodeTypes.BusinessUnit) {\n<axm-org-chart-business-unit-node [data]=\"data()\" />\n} @case (NodeTypes.Position) {\n<axm-org-chart-position-node [data]=\"data()\" />\n} @case (NodeTypes.Employee) {\n<axm-org-chart-employee-node [data]=\"data()\" />\n} @default {\n<axm-org-chart-company-node [data]=\"data()\" />\n} }", styles: ["axm-org-chart-node-outlet{display:block;width:100%;min-height:1px;box-sizing:border-box}\n"] }]
242
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }] } });
243
+
244
+ //#region ---- Imports ----
245
+ //#endregion
246
+ //#region ---- Service ----
247
+ class AXMOrgChartNodeContributionService {
248
+ constructor() {
249
+ this.contributors = inject(AXM_ORG_CHART_NODE_CONTRIBUTOR, { optional: true }) ?? [];
250
+ }
251
+ /**
252
+ * Collects and sorts menu actions contributed by all providers for the current node context.
253
+ */
254
+ async getMenuActions(context) {
255
+ const buckets = await Promise.all(this.contributors.map((provider) => provider.getMenuActions(context)));
256
+ return buckets
257
+ .flat()
258
+ .sort((a, b) => (a.order ?? Number.MAX_SAFE_INTEGER) - (b.order ?? Number.MAX_SAFE_INTEGER));
259
+ }
260
+ /**
261
+ * Collects and sorts related info blocks contributed for the selected node.
262
+ * This is used by the upcoming node detail drawer.
263
+ */
264
+ async getInfoContributions(context) {
265
+ const buckets = await Promise.all(this.contributors.map((provider) => provider.getInfoContributions?.(context) ?? Promise.resolve([])));
266
+ return buckets
267
+ .flat()
268
+ .sort((a, b) => (a.order ?? Number.MAX_SAFE_INTEGER) - (b.order ?? Number.MAX_SAFE_INTEGER));
269
+ }
270
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartNodeContributionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
271
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartNodeContributionService }); }
272
+ }
273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartNodeContributionService, decorators: [{
274
+ type: Injectable
275
+ }] });
276
+
277
+ /**
278
+ * Drops leaf vacant seat position nodes from the persisted chart tree (matches generator behavior when
279
+ * `showVacantLeafSeats` is false).
280
+ */
281
+ function omitVacantLeafSeatNodes(root) {
282
+ const clone = structuredClone(root);
283
+ const visit = (node) => {
284
+ if (!node.children?.length) {
285
+ return;
286
+ }
287
+ node.children = node.children.filter((child) => {
288
+ const hideVacantSeat = child.type === AXMOrgChartNodeType.Position && child.metadata?.['vacant'] === true;
289
+ return !hideVacantSeat;
290
+ });
291
+ for (const child of node.children) {
292
+ visit(child);
293
+ }
294
+ };
295
+ visit(clone);
296
+ return clone;
297
+ }
298
+
299
+ class AXMOrgChartService {
300
+ constructor() {
301
+ this.entityService = inject(AXPEntityService);
302
+ this.chartData = this.entityService
303
+ .withEntity(RootConfig.module.name, RootConfig.entities.chart.name)
304
+ .data();
305
+ this.loadingDialog = inject(AXLoadingDialogService);
306
+ this.exportService = inject(AXPExportService);
307
+ this.translationService = inject(AXTranslationService);
308
+ this.commandService = inject(AXPCommandService);
309
+ this.settingsService = inject(AXPSettingsService);
310
+ this._modesBundle = signal(null, ...(ngDevMode ? [{ debugName: "_modesBundle" }] : /* istanbul ignore next */ []));
311
+ this._selectedMode = signal('structure', ...(ngDevMode ? [{ debugName: "_selectedMode" }] : /* istanbul ignore next */ []));
312
+ this._showVacantLeafSeats = signal(true, ...(ngDevMode ? [{ debugName: "_showVacantLeafSeats" }] : /* istanbul ignore next */ []));
313
+ this._rootNode = signal({
314
+ id: AXPDataGenerator.uuid(),
315
+ type: AXMOrgChartNodeType.Company,
316
+ title: createMultiLanguageString('Company', 'شرکت'),
317
+ }, ...(ngDevMode ? [{ debugName: "_rootNode" }] : /* istanbul ignore next */ []));
318
+ this.rootNode = this._rootNode.asReadonly();
319
+ this.selectedMode = this._selectedMode.asReadonly();
320
+ this.showVacantLeafSeats = this._showVacantLeafSeats.asReadonly();
321
+ }
322
+ /**
323
+ * Applies user prefs resolved before first paint (route resolver). Does not persist.
324
+ */
325
+ applyHydratedUiPrefs(prefs) {
326
+ if (!prefs) {
327
+ return;
328
+ }
329
+ if (prefs.selectedMode !== undefined) {
330
+ this._selectedMode.set(prefs.selectedMode);
331
+ }
332
+ if (prefs.showVacantLeafSeats !== undefined) {
333
+ this._showVacantLeafSeats.set(prefs.showVacantLeafSeats);
334
+ }
335
+ }
336
+ /**
337
+ * Applies current mode + vacant visibility from the cached bundle onto {@link rootNode}.
338
+ */
339
+ applyDisplayRoot() {
340
+ const bundle = this._modesBundle();
341
+ if (!bundle?.modes) {
342
+ return;
343
+ }
344
+ const modeKey = this._selectedMode();
345
+ let tree = structuredClone(bundle.modes[modeKey]);
346
+ if (!this._showVacantLeafSeats()) {
347
+ tree = omitVacantLeafSeatNodes(tree);
348
+ }
349
+ this._rootNode.set(tree);
350
+ }
351
+ setChartMode(mode) {
352
+ this._selectedMode.set(mode);
353
+ this.applyDisplayRoot();
354
+ this.persistChartMode(mode);
355
+ }
356
+ setShowVacantLeafSeats(value) {
357
+ const normalized = normalizeVacantLeafSeatsSetting(value);
358
+ if (normalized === undefined) {
359
+ return;
360
+ }
361
+ this._showVacantLeafSeats.set(normalized);
362
+ this.applyDisplayRoot();
363
+ this.persistShowVacantLeafSeats(normalized);
364
+ }
365
+ //#region ---- User chart preferences (settings) ----
366
+ /**
367
+ * Reads persisted chart UI preferences into signals (does not persist).
368
+ */
369
+ async restoreChartUiFromSettings() {
370
+ try {
371
+ const userScope = this.settingsService.scope(AXPPlatformScope.User);
372
+ const modeRaw = await userScope.get(AXPOrganizationManagementSettings.HierarchyChartMode);
373
+ const mode = parseOrgChartMode(modeRaw);
374
+ if (mode !== undefined) {
375
+ this._selectedMode.set(mode);
376
+ }
377
+ const vacantRaw = await userScope.get(AXPOrganizationManagementSettings.HierarchyChartShowVacantLeafSeats);
378
+ const vacant = normalizeVacantLeafSeatsSetting(vacantRaw);
379
+ if (vacant !== undefined) {
380
+ this._showVacantLeafSeats.set(vacant);
381
+ }
382
+ }
383
+ catch {
384
+ // Keep constructor defaults when settings are unavailable.
385
+ }
386
+ }
387
+ persistChartMode(mode) {
388
+ void this.settingsService
389
+ .scope(AXPPlatformScope.User)
390
+ .set(AXPOrganizationManagementSettings.HierarchyChartMode, mode)
391
+ .catch(() => { });
392
+ }
393
+ persistShowVacantLeafSeats(value) {
394
+ void this.settingsService
395
+ .scope(AXPPlatformScope.User)
396
+ .set(AXPOrganizationManagementSettings.HierarchyChartShowVacantLeafSeats, value)
397
+ .catch(() => { });
398
+ }
399
+ //#endregion
400
+ async load() {
401
+ const first = (await this.chartData.query({
402
+ skip: 0,
403
+ take: 1,
404
+ sort: [{ field: 'version', dir: 'desc' }],
405
+ })).items[0];
406
+ const structure = first?.structure;
407
+ if (structure?.modes?.structure &&
408
+ structure?.modes?.location &&
409
+ structure?.modes?.reporting &&
410
+ structure?.modes?.positionHierarchy) {
411
+ this._modesBundle.set(structure);
412
+ await this.restoreChartUiFromSettings();
413
+ this.applyDisplayRoot();
414
+ return;
415
+ }
416
+ await this.generate();
417
+ await this.load();
418
+ }
419
+ async generate() {
420
+ await this.commandService.execute('OrganizationManagement.OrgChart:Generate', {});
421
+ }
422
+ //#region ---- Printing ----
423
+ async printChart(element) {
424
+ const d = this.loadingDialog.show({
425
+ title: 'Printing Organization Chart...',
426
+ mode: 'determinate',
427
+ progressColor: 'primary',
428
+ progressValue: 0,
429
+ status: '0/10',
430
+ text: 'Initializing print process...',
431
+ buttons: [{ text: 'Cancel', color: 'danger', onClick: () => d.close() }],
432
+ });
433
+ try {
434
+ await this.updateStep(d, await this.translate('@organization-management:organization-chart.states.preparing-document'), 10, '1/10');
435
+ const chartElement = element;
436
+ const { originalStyles, modifiedStyles } = this.expandChart(chartElement);
437
+ await this.updateStep(d, await this.translate('@organization-management:organization-chart.states.rendering-chart-image'), 25, '2.5/10');
438
+ const blob = await this.exportService.generateBlobFromElement(chartElement, {
439
+ popup: true,
440
+ filter: (node) => !(node instanceof Element && node.classList.contains('--toggle')),
441
+ bgcolor: 'transparent',
442
+ scale: 2,
443
+ quality: 1,
444
+ height: Number.parseInt(modifiedStyles.modifiedHeight),
445
+ width: Number.parseInt(modifiedStyles.modifiedWidth),
446
+ });
447
+ await this.updateStep(d, await this.translate('@organization-management:organization-chart.states.finalizing-image-processing'), 50, '5/10');
448
+ this.restoreChartStyles(chartElement, originalStyles);
449
+ await this.updateStep(d, await this.translate('@organization-management:organization-chart.states.downloading-image'), 75, '7.5/10');
450
+ this.exportService.download(blob, 'org-chart.png');
451
+ await this.updateStep(d, await this.translate('@organization-management:organization-chart.states.process-complete'), 100, '10/10');
452
+ setTimeout(() => d.close(), 1500);
453
+ }
454
+ catch (err) {
455
+ console.error('Error capturing chart:', err);
456
+ await this.updateStep(d, await this.translate('@organization-management:organization-chart.states.failed-to-generate-chart-image'), 100, 'Error', 'danger');
457
+ d.close();
458
+ }
459
+ }
460
+ expandChart(chartElement) {
461
+ const originalStyles = {
462
+ originalOverflow: chartElement.style.overflow,
463
+ originalWidth: chartElement.style.width,
464
+ originalHeight: chartElement.style.height,
465
+ };
466
+ const modifiedStyles = {
467
+ modifiedOverflow: 'visible',
468
+ modifiedWidth: `${chartElement.scrollWidth}px`,
469
+ modifiedHeight: `${chartElement.scrollHeight}px`,
470
+ };
471
+ chartElement.style.overflow = modifiedStyles.modifiedOverflow;
472
+ chartElement.style.width = modifiedStyles.modifiedWidth;
473
+ chartElement.style.height = modifiedStyles.modifiedHeight;
474
+ return { originalStyles, modifiedStyles };
475
+ }
476
+ restoreChartStyles(chartElement, originalStyles) {
477
+ chartElement.style.overflow = originalStyles.originalOverflow;
478
+ chartElement.style.width = originalStyles.originalWidth;
479
+ chartElement.style.height = originalStyles.originalHeight;
480
+ }
481
+ async updateStep(dialog, text, progress, status, color = 'primary') {
482
+ return new Promise((resolve) => {
483
+ dialog.setProgressColor(color);
484
+ dialog.setProgressText(text);
485
+ dialog.setProgressValue(progress);
486
+ dialog.setProgressStatus(status);
487
+ resolve();
488
+ });
489
+ }
490
+ async translate(key) {
491
+ return (await this.translationService.translateAsync(key)) + '...';
492
+ }
493
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
494
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartService }); }
495
+ }
496
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartService, decorators: [{
497
+ type: Injectable
498
+ }] });
499
+
500
+ //#endregion
501
+ //#region ---- Component ----
502
+ /**
503
+ * Component for displaying and interacting with an organizational chart.
504
+ */
505
+ class AXMOrgChartPage extends AXPPageLayoutBaseComponent {
506
+ //#endregion
507
+ //#region ---- Constructor ----
508
+ constructor() {
509
+ super();
510
+ //#region ---- Services & Dependencies ----
511
+ this.rootConfig = RootConfig;
512
+ this.treeContainer = viewChild.required('chart');
513
+ this.parent = viewChild.required('parent');
514
+ this.contextMenu = viewChild(AXContextMenuComponent, ...(ngDevMode ? [{ debugName: "contextMenu" }] : /* istanbul ignore next */ []));
515
+ this.panView = viewChild(AXPanViewDirective, ...(ngDevMode ? [{ debugName: "panView" }] : /* istanbul ignore next */ []));
516
+ this.ngzone = inject(NgZone);
517
+ this.pageInjector = inject(Injector);
518
+ this.viewContainerRef = inject(ViewContainerRef);
519
+ // printing is handled by service itself
520
+ this.chartService = inject(AXMOrgChartService);
521
+ this.nodeContributionService = inject(AXMOrgChartNodeContributionService);
522
+ this.route = inject(ActivatedRoute);
523
+ this.localeId = inject(LOCALE_ID);
524
+ this.deviceService = inject(AXPDeviceService);
525
+ //#endregion
526
+ //#region ---- Chart State & UI Metadata ----
527
+ this.NODE_STROKE_COLOR = 'rgba(var(--ax-sys-color-primary-400))';
528
+ this.LINK_STROKE_WIDTH = 1;
529
+ /**
530
+ * SVG `foreignObject` viewport and tree layout spacing.
531
+ * Keep card `min-width` in `org-chart.page.scss` aligned with {@link chartNodeWidth}.
532
+ */
533
+ this.chartNodeWidth = 360;
534
+ this.chartNodeHeight = 280;
535
+ this.chartHorizontalSpacing = 24;
536
+ this.chartVerticalSpacing = 48;
537
+ /** Nudges card content inside the allocated foreignObject band (connectors use rendered bounds). */
538
+ this.chartNodeYOffset = 10;
539
+ this.isFullscreen = signal(false, ...(ngDevMode ? [{ debugName: "isFullscreen" }] : /* istanbul ignore next */ []));
540
+ this.panX = signal(0, ...(ngDevMode ? [{ debugName: "panX" }] : /* istanbul ignore next */ []));
541
+ this.panY = signal(0, ...(ngDevMode ? [{ debugName: "panY" }] : /* istanbul ignore next */ []));
542
+ this.panZoomLevel = signal(100, ...(ngDevMode ? [{ debugName: "panZoomLevel" }] : /* istanbul ignore next */ []));
543
+ this.zoomPercentageLabel = computed(() => `${Math.round(this.panZoomLevel())}%`, ...(ngDevMode ? [{ debugName: "zoomPercentageLabel" }] : /* istanbul ignore next */ []));
544
+ this.isChartRendered = false;
545
+ this.selectedNodeId = signal(null, ...(ngDevMode ? [{ debugName: "selectedNodeId" }] : /* istanbul ignore next */ []));
546
+ /** Large layouts: optional side panel with {@link getNodeInfoItems} for the selected node (same UX pattern as document drive). */
547
+ this.isDetailPanelOpen = signal(false, ...(ngDevMode ? [{ debugName: "isDetailPanelOpen" }] : /* istanbul ignore next */ []));
548
+ this.activeContextNode = null;
549
+ this.activeContextMenuActions = new Map();
550
+ this.nodeTypes = [
551
+ { title: 'Company', color: 'primary', icon: 'fal fa-building', category: AXMOrgChartCategory.Company },
552
+ { title: 'Business Unit', color: 'accent2', icon: 'fal fa-sitemap', category: AXMOrgChartCategory.BusinessUnit },
553
+ { title: 'Position', color: 'accent3', icon: 'fal fa-user-tie', category: AXMOrgChartCategory.Position },
554
+ { title: 'Employee', color: 'surface', icon: 'fal fa-address-card', category: AXMOrgChartCategory.Employee },
555
+ ];
556
+ /**
557
+ * UI chrome for chart cards; align copy with `organization-chart.organization-chart.nodes` / mock `org-chart-labels`.
558
+ */
559
+ this.chartML = {
560
+ vacant: createMultiLanguageString('Vacant', 'خالی'),
561
+ directReports: createMultiLanguageString('Direct reports', 'گزارش مستقیم'),
562
+ teams: createMultiLanguageString('Teams', 'تیم‌ها'),
563
+ people: createMultiLanguageString('People', 'اعضا'),
564
+ positions: createMultiLanguageString('Positions', 'سمت‌ها'),
565
+ /** Label above the chief executive slot on merged company cards. */
566
+ chiefExecutive: createMultiLanguageString('Chief executive', 'مدیر اجرایی'),
567
+ buHead: createMultiLanguageString('Head', 'سرپرست'),
568
+ buPosition: createMultiLanguageString('Position', 'عنوان سمت'),
569
+ unitType: createMultiLanguageString('Unit type', 'نوع واحد'),
570
+ businessUnit: createMultiLanguageString('Business unit', 'واحد سازمانی'),
571
+ location: createMultiLanguageString('Location', 'موقعیت'),
572
+ code: createMultiLanguageString('Code', 'کد'),
573
+ capacity: createMultiLanguageString('Capacity', 'ظرفیت'),
574
+ level: createMultiLanguageString('Level', 'سطح'),
575
+ email: createMultiLanguageString('Email', 'ایمیل'),
576
+ phone: createMultiLanguageString('Phone', 'تلفن'),
577
+ employmentType: createMultiLanguageString('Employment type', 'نوع همکاری'),
578
+ workMode: createMultiLanguageString('Work mode', 'نحوه کار'),
579
+ more: '@organization-management:organization-chart.node-actions.more',
580
+ add: '@organization-management:organization-chart.node-actions.add',
581
+ noActionsAvailable: '@organization-management:organization-chart.node-actions.no-actions',
582
+ };
583
+ /**
584
+ * Selected tree node for the detail panel; stays in sync with {@link selectedNodeId}.
585
+ */
586
+ this.detailPanelSelectedNode = computed(() => {
587
+ const id = this.selectedNodeId();
588
+ if (id == null || id === '') {
589
+ return null;
590
+ }
591
+ return this.findNodeInTree(this.chartService.rootNode(), id);
592
+ }, ...(ngDevMode ? [{ debugName: "detailPanelSelectedNode" }] : /* istanbul ignore next */ []));
593
+ /** Bound to `ax-search-box` in the page toolbar. */
594
+ this.chartSearchQuery = '';
595
+ this.chartSearchPendingPresentation = 'none';
596
+ this.chartSearchPendingFocusId = null;
597
+ //#endregion
598
+ //#region ---- Initialization ----
599
+ this.#initialize = afterNextRender(async () => {
600
+ this.d3 = await import('d3');
601
+ await this.refresh();
602
+ });
603
+ this.chartService.applyHydratedUiPrefs(this.route.snapshot.data['orgChartUi']);
604
+ }
605
+ //#endregion
606
+ //#region ---- Initialization ----
607
+ #initialize;
608
+ //#endregion
609
+ //#region ---- Detail Panel ----
610
+ toggleDetailPanel() {
611
+ this.isDetailPanelOpen.update((open) => !open);
612
+ }
613
+ //#endregion
614
+ //#region ---- Pan & Fullscreen ----
615
+ /**
616
+ * Zooms in the chart.
617
+ */
618
+ zoomIn() {
619
+ this.panView()?.zoomIn();
620
+ }
621
+ /**
622
+ * Zooms out the chart.
623
+ */
624
+ zoomOut() {
625
+ this.panView()?.zoomOut();
626
+ }
627
+ /**
628
+ * Resets the zoom level and pan position of the chart.
629
+ */
630
+ zoomReset() {
631
+ this.panView()?.resetPosition();
632
+ }
633
+ /**
634
+ * Toggles fullscreen mode for the chart.
635
+ */
636
+ toggleFullscreen() {
637
+ if (this.isFullscreen()) {
638
+ document.exitFullscreen();
639
+ this.isFullscreen.set(false);
640
+ }
641
+ else {
642
+ this.parent().nativeElement.requestFullscreen();
643
+ this.isFullscreen.set(true);
644
+ }
645
+ document.querySelector(`foreignObject[node="node-${this.chartService.rootNode().id}"]`)?.scrollIntoView({
646
+ behavior: 'smooth',
647
+ block: 'start',
648
+ inline: 'center',
649
+ });
650
+ }
651
+ //#endregion
652
+ //#region ---- Chart Search ----
653
+ onChartSearchValueChanged(event) {
654
+ const v = event.value;
655
+ this.chartSearchQuery = typeof v === 'string' ? v : '';
656
+ this.applyChartSearchFromQuery();
657
+ }
658
+ applyChartSearchFromQuery() {
659
+ const q = this.chartSearchQuery.trim().toLowerCase();
660
+ if (!q) {
661
+ this.chartSearchPendingPresentation = 'none';
662
+ this.chartSearchPendingFocusId = null;
663
+ this.applySearchHitClasses(new Set());
664
+ return;
665
+ }
666
+ const matches = this.findNodesMatchingChartSearch(this.chartService.rootNode(), q);
667
+ if (matches.length === 0) {
668
+ this.chartSearchPendingPresentation = 'none';
669
+ this.chartSearchPendingFocusId = null;
670
+ this.applySearchHitClasses(new Set());
671
+ return;
672
+ }
673
+ for (const node of matches) {
674
+ this.ensureExpandedPathToNode(node.id);
675
+ }
676
+ this.chartSearchPendingPresentation = matches.length === 1 ? 'fit-one' : 'fit-all';
677
+ this.chartSearchPendingFocusId = matches.length === 1 ? matches[0].id : null;
678
+ this.redrawChart();
679
+ }
680
+ completeChartRenderPresentation() {
681
+ requestAnimationFrame(() => {
682
+ requestAnimationFrame(() => {
683
+ this.ngzone.run(() => {
684
+ const q = this.chartSearchQuery.trim().toLowerCase();
685
+ const mode = this.chartSearchPendingPresentation;
686
+ const focusId = this.chartSearchPendingFocusId;
687
+ this.chartSearchPendingPresentation = 'none';
688
+ this.chartSearchPendingFocusId = null;
689
+ if (!q) {
690
+ this.applySearchHitClasses(new Set());
691
+ return;
692
+ }
693
+ const matches = this.findNodesMatchingChartSearch(this.chartService.rootNode(), q);
694
+ this.applySearchHitClasses(new Set(matches.map((m) => m.id)));
695
+ if (matches.length === 0) {
696
+ return;
697
+ }
698
+ if (mode === 'fit-one' && focusId != null && focusId !== '') {
699
+ const node = this.findNodeInTree(this.chartService.rootNode(), focusId);
700
+ if (node) {
701
+ this.selectNode(node);
702
+ }
703
+ this.panView()?.resetPosition();
704
+ requestAnimationFrame(() => this.centerChartOnForeignObject(focusId));
705
+ }
706
+ else if (mode === 'fit-all') {
707
+ this.panView()?.resetPosition();
708
+ }
709
+ });
710
+ });
711
+ });
712
+ }
713
+ findNodesMatchingChartSearch(root, q) {
714
+ const all = [];
715
+ this.collectAllChartNodes(root, all);
716
+ return all.filter((n) => this.nodeMatchesChartSearchText(n, q));
717
+ }
718
+ collectAllChartNodes(node, out) {
719
+ out.push(node);
720
+ for (const child of node.children ?? []) {
721
+ this.collectAllChartNodes(child, out);
722
+ }
723
+ }
724
+ nodeMatchesChartSearchText(node, q) {
725
+ const parts = [];
726
+ parts.push(resolveMultiLanguageString(node.title, this.localeId));
727
+ if (node.subtitle != null) {
728
+ parts.push(resolveMultiLanguageString(node.subtitle, this.localeId));
729
+ }
730
+ if (node.description != null) {
731
+ parts.push(resolveMultiLanguageString(node.description, this.localeId));
732
+ }
733
+ const haystack = parts.join(' ').trim().toLowerCase();
734
+ return haystack.includes(q);
735
+ }
736
+ findPathToRootNode(root, id) {
737
+ if (root.id === id) {
738
+ return [root];
739
+ }
740
+ for (const child of root.children ?? []) {
741
+ const sub = this.findPathToRootNode(child, id);
742
+ if (sub) {
743
+ return [root, ...sub];
744
+ }
745
+ }
746
+ return null;
747
+ }
748
+ ensureExpandedPathToNode(targetId) {
749
+ const path = this.findPathToRootNode(this.chartService.rootNode(), targetId);
750
+ if (path == null) {
751
+ return;
752
+ }
753
+ for (let i = 0; i < path.length - 1; i++) {
754
+ path[i].isExpanded = true;
755
+ }
756
+ }
757
+ applySearchHitClasses(ids) {
758
+ const nodes = document.querySelectorAll('foreignObject.axp-chart-node');
759
+ for (let i = 0; i < nodes.length; i++) {
760
+ const fo = nodes[i];
761
+ const raw = fo.getAttribute('node');
762
+ const nodeId = raw?.startsWith('node-') === true ? raw.slice('node-'.length) : (raw ?? '');
763
+ const container = fo.querySelector('.--node-container');
764
+ if (container == null) {
765
+ continue;
766
+ }
767
+ if (ids.has(nodeId)) {
768
+ container.classList.add('--search-hit');
769
+ }
770
+ else {
771
+ container.classList.remove('--search-hit');
772
+ }
773
+ }
774
+ }
775
+ centerChartOnForeignObject(nodeId) {
776
+ const fo = document.querySelector(`foreignObject[node="node-${nodeId}"]`);
777
+ const panel = this.parent().nativeElement;
778
+ if (fo == null) {
779
+ return;
780
+ }
781
+ const foRect = fo.getBoundingClientRect();
782
+ const cRect = panel.getBoundingClientRect();
783
+ const dx = cRect.left + cRect.width / 2 - (foRect.left + foRect.width / 2);
784
+ const dy = cRect.top + cRect.height / 2 - (foRect.top + foRect.height / 2);
785
+ this.panX.update((x) => x + dx);
786
+ this.panY.update((y) => y + dy);
787
+ this.syncPanViewTransformFromSignals();
788
+ }
789
+ /**
790
+ * Applies the same transform formula as {@link AXPanViewDirective} so programmatic pan updates take effect immediately.
791
+ */
792
+ syncPanViewTransformFromSignals() {
793
+ const el = this.treeContainer().nativeElement;
794
+ el.style.transform = `translate(${this.panX()}px, ${this.panY()}px) scale(${this.panZoomLevel() / 100})`;
795
+ }
796
+ //#endregion
797
+ //#region ---- Chart Layout Metrics ----
798
+ /**
799
+ * Calculates the maximum depth of the organizational chart.
800
+ * @param node - The root node of the chart.
801
+ * @returns The maximum depth of the chart.
802
+ */
803
+ calculateMaxDepth(node) {
804
+ if (!node.children || node.children.length === 0 || node.isExpanded === false) {
805
+ return 1;
806
+ }
807
+ return 1 + Math.max(...node.children.map((child) => this.calculateMaxDepth(child)));
808
+ }
809
+ /**
810
+ * Calculates the maximum breadth of the organizational chart.
811
+ * @param node - The root node of the chart.
812
+ * @returns The maximum breadth of the chart.
813
+ */
814
+ calculateMaxBreadth(node) {
815
+ if (!node.children || node.children.length === 0 || node.isExpanded === false) {
816
+ return 1;
817
+ }
818
+ return node.children.reduce((acc, child) => acc + this.calculateMaxBreadth(child), 0);
819
+ }
820
+ //#endregion
821
+ //#region ---- Chart Rendering ----
822
+ /**
823
+ * Creates and renders the organizational chart.
824
+ * @param el - The container element for the chart.
825
+ * @param data - The root node of the organizational chart.
826
+ */
827
+ createChart(el, data) {
828
+ if (!this.d3) {
829
+ return;
830
+ }
831
+ const nw = this.chartNodeWidth;
832
+ const nh = this.chartNodeHeight;
833
+ const hGap = this.chartHorizontalSpacing;
834
+ const vGap = this.chartVerticalSpacing;
835
+ const yOff = this.chartNodeYOffset;
836
+ this.ngzone.runOutsideAngular(() => {
837
+ this.clearChart(el);
838
+ const newSvg = this.d3.select(el).append('svg');
839
+ const root = this.d3.hierarchy(data);
840
+ root.descendants().forEach((node) => {
841
+ if (node.data.isExpanded === false) {
842
+ node.children = undefined;
843
+ }
844
+ });
845
+ const treeLayout = this.d3
846
+ .tree()
847
+ .nodeSize([nw + hGap, nh + vGap]);
848
+ treeLayout(root);
849
+ let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;
850
+ root.descendants().forEach((d) => {
851
+ if (d.x < minX)
852
+ minX = d.x;
853
+ if (d.x > maxX)
854
+ maxX = d.x;
855
+ if (d.y < minY)
856
+ minY = d.y;
857
+ if (d.y > maxY)
858
+ maxY = d.y;
859
+ });
860
+ const CONTAINER_WIDTH = maxX - minX + nw + 2 * hGap;
861
+ const CONTAINER_HEIGHT = maxY - minY + nh + 2 * vGap;
862
+ newSvg.attr('width', CONTAINER_WIDTH).attr('height', CONTAINER_HEIGHT);
863
+ const g = newSvg
864
+ .append('g')
865
+ .attr('transform', `translate(${-minX + nw / 2 + hGap / 2}, ${-minY + nh / 2 + vGap / 2})`);
866
+ const linksLayer = g.append('g').attr('class', 'axp-chart-links');
867
+ const nodesLayer = g.append('g').attr('class', 'axp-chart-nodes');
868
+ linksLayer
869
+ .selectAll('.link')
870
+ .data(root.links())
871
+ .enter()
872
+ .append('path')
873
+ .attr('class', 'link')
874
+ .attr('d', (d) => this.computeOrgChartLinkPath(d, nw, nh, yOff))
875
+ .attr('fill', 'none')
876
+ .attr('stroke', this.NODE_STROKE_COLOR)
877
+ .attr('stroke-width', this.LINK_STROKE_WIDTH)
878
+ .attr('from', (d) => `node-${d.source.data.id}`)
879
+ .attr('to', (d) => `node-${d.target.data.id}`);
880
+ nodesLayer
881
+ .selectAll('.axp-chart-node')
882
+ .data(root.descendants())
883
+ .enter()
884
+ .append('foreignObject')
885
+ .attr('class', 'axp-chart-node')
886
+ .attr('node', (d) => `node-${d.data.id}`)
887
+ .attr('x', (d) => d.x - nw / 2)
888
+ .attr('y', (d) => d.y - nh / 2 + yOff)
889
+ .attr('width', nw)
890
+ .attr('height', nh)
891
+ .each((d) => this.renderNodeTemplate(d.data, d.x, d.y));
892
+ const svgEl = newSvg.node();
893
+ if (svgEl) {
894
+ this.scheduleChartLinkPathRefresh(svgEl, nw, nh, yOff);
895
+ }
896
+ });
897
+ if (!this.isChartRendered) {
898
+ // document.querySelector(`foreignObject[node="node-${data.id}"] .--heading-container`)?.scrollIntoView({
899
+ // behavior: 'smooth',
900
+ // block: 'center',
901
+ // inline: 'center',
902
+ // });
903
+ this.isChartRendered = true;
904
+ this.panView()?.resetPosition();
905
+ }
906
+ this.ngzone.run(() => {
907
+ this.completeChartRenderPresentation();
908
+ });
909
+ }
910
+ /**
911
+ * Orthogonal elbow between two nodes using measured card bounds inside each foreignObject when available.
912
+ */
913
+ computeOrgChartLinkPath(d, nodeWidth, nodeHeight, nodeYOffset) {
914
+ const source = d.source;
915
+ const target = d.target;
916
+ const EDGE_PADDING = 2;
917
+ const MIN_VERTICAL_GAP = 10;
918
+ const sourceBounds = this.getRenderedNodeBounds(source.data.id);
919
+ const targetBounds = this.getRenderedNodeBounds(target.data.id);
920
+ const foSourceTop = source.y - nodeHeight / 2 + nodeYOffset;
921
+ const foTargetTop = target.y - nodeHeight / 2 + nodeYOffset;
922
+ let sourceBottomY = sourceBounds != null
923
+ ? foSourceTop + sourceBounds.topOffset + sourceBounds.height
924
+ : source.y + nodeHeight / 2 + nodeYOffset - EDGE_PADDING;
925
+ let targetTopY = targetBounds != null
926
+ ? foTargetTop + targetBounds.topOffset
927
+ : target.y - nodeHeight / 2 + nodeYOffset + EDGE_PADDING;
928
+ sourceBottomY += EDGE_PADDING;
929
+ targetTopY -= EDGE_PADDING;
930
+ if (sourceBottomY >= targetTopY - MIN_VERTICAL_GAP) {
931
+ sourceBottomY = source.y + nodeYOffset;
932
+ targetTopY = target.y - 10;
933
+ }
934
+ return `M${source.x},${sourceBottomY}V${(sourceBottomY + targetTopY) / 2}H${target.x}V${targetTopY}`;
935
+ }
936
+ /**
937
+ * Node templates render asynchronously; remap connectors after layout so edges use real card heights.
938
+ */
939
+ scheduleChartLinkPathRefresh(svg, nodeWidth, nodeHeight, nodeYOffset) {
940
+ requestAnimationFrame(() => {
941
+ requestAnimationFrame(() => {
942
+ requestAnimationFrame(() => {
943
+ this.ngzone.runOutsideAngular(() => {
944
+ this.refreshChartLinkPaths(svg, nodeWidth, nodeHeight, nodeYOffset);
945
+ });
946
+ });
947
+ });
948
+ });
949
+ }
950
+ refreshChartLinkPaths(svg, nodeWidth, nodeHeight, nodeYOffset) {
951
+ if (!this.d3) {
952
+ return;
953
+ }
954
+ this.d3
955
+ .select(svg)
956
+ .selectAll('g.axp-chart-links path.link')
957
+ .attr('d', (d) => this.computeOrgChartLinkPath(d, nodeWidth, nodeHeight, nodeYOffset));
958
+ }
959
+ /**
960
+ * Reads rendered bounds for a node card inside its foreignObject.
961
+ */
962
+ getRenderedNodeBounds(nodeId) {
963
+ const foreignObject = document.querySelector(`foreignObject[node="node-${nodeId}"]`);
964
+ const nodeContainer = foreignObject?.querySelector('.--node-container');
965
+ if (!foreignObject || !nodeContainer) {
966
+ return null;
967
+ }
968
+ return {
969
+ topOffset: nodeContainer.offsetTop,
970
+ height: nodeContainer.offsetHeight,
971
+ };
972
+ }
973
+ /**
974
+ * Renders the node template for a given organizational node.
975
+ * @param data - The node data.
976
+ * @param x - The x-coordinate of the node.
977
+ * @param y - The y-coordinate of the node.
978
+ */
979
+ renderNodeTemplate(data, _x, _y) {
980
+ if (data.type == null) {
981
+ set(data, 'type', AXMOrgChartNodeType.Company);
982
+ }
983
+ set(data, 'category', data.type);
984
+ // D3 runs inside runOutsideAngular; created views must be updated inside the zone.
985
+ this.ngzone.run(() => {
986
+ // Dynamic subviews can use an injector that does not inherit the page `providers`.
987
+ // Bridge `AXM_ORG_CHART_HOST` explicitly so child node components can inject it.
988
+ const nodeTreeInjector = Injector.create({
989
+ parent: this.pageInjector,
990
+ providers: [{ provide: AXM_ORG_CHART_HOST, useValue: this }],
991
+ });
992
+ const ref = this.viewContainerRef.createComponent(AXMOrgChartNodeOutletComponent, { injector: nodeTreeInjector });
993
+ ref.setInput('data', data);
994
+ const nodeElement = this.d3.select(this.treeContainer().nativeElement).select(`[node="node-${data.id}"]`);
995
+ const element = nodeElement.node();
996
+ if (element) {
997
+ element.appendChild(ref.location.nativeElement);
998
+ ref.changeDetectorRef.detectChanges();
999
+ }
1000
+ else {
1001
+ ref.destroy();
1002
+ }
1003
+ });
1004
+ }
1005
+ /**
1006
+ * Toggles the expansion state of a node.
1007
+ * @param data - The node data.
1008
+ * @param el - The HTML element representing the node.
1009
+ */
1010
+ toggleNode(data, _el) {
1011
+ data.isExpanded = data.isExpanded === undefined ? false : !data.isExpanded;
1012
+ this.selectedNodeId.set(data.id);
1013
+ this.createChart(this.treeContainer().nativeElement, this.chartService.rootNode());
1014
+ // el.scrollIntoView({
1015
+ // behavior: 'smooth',
1016
+ // });
1017
+ }
1018
+ /**
1019
+ * Clears the chart from the container element.
1020
+ * @param el - The container element.
1021
+ */
1022
+ clearChart(el) {
1023
+ if (this.d3) {
1024
+ this.d3.select(el).select('svg').remove();
1025
+ this.viewContainerRef.clear();
1026
+ }
1027
+ }
1028
+ redrawChart() {
1029
+ if (!this.d3 || !this.treeContainer()?.nativeElement) {
1030
+ return;
1031
+ }
1032
+ this.createChart(this.treeContainer().nativeElement, this.chartService.rootNode());
1033
+ }
1034
+ async refresh() {
1035
+ if (this.d3) {
1036
+ await this.chartService.load();
1037
+ this.redrawChart();
1038
+ }
1039
+ }
1040
+ onVacantLeafSeatsChange(event) {
1041
+ if (!event.isUserInteraction) {
1042
+ return;
1043
+ }
1044
+ this.chartService.setShowVacantLeafSeats(event.value);
1045
+ this.redrawChart();
1046
+ }
1047
+ //#endregion
1048
+ //#region ---- Context Menu ----
1049
+ /**
1050
+ * Handles right-click on the chart surface. Context menu items must be ready before `showAt`;
1051
+ * `AXContextMenuComponent` assigns `items` synchronously after `onOpening`, so async `onOpening` handlers leave the menu empty.
1052
+ */
1053
+ onOrgChartSurfaceContextMenu(e) {
1054
+ const hit = e.target instanceof HTMLElement ? e.target : null;
1055
+ const container = hit?.closest('.axp-chart-node .--node-container');
1056
+ if (!(container instanceof HTMLElement)) {
1057
+ return;
1058
+ }
1059
+ e.preventDefault();
1060
+ e.stopPropagation();
1061
+ void this.openOrgChartContextMenuFromDom(e.clientX, e.clientY, container);
1062
+ }
1063
+ async openOrgChartContextMenuFromDom(clientX, clientY, targetElement) {
1064
+ const node = this.resolveNodeFromTarget(targetElement);
1065
+ if (!node) {
1066
+ return;
1067
+ }
1068
+ await this.openOrgChartContextMenuAt(clientX, clientY, node, targetElement);
1069
+ }
1070
+ /**
1071
+ * Loads actions, builds menu items with sync translation, then opens the context menu with a pre-filled opening event.
1072
+ */
1073
+ async openOrgChartContextMenuAt(clientX, clientY, node, targetElement) {
1074
+ this.selectNode(node);
1075
+ this.activeContextNode = node;
1076
+ this.activeContextMenuActions.clear();
1077
+ const context = this.createNodeContributionContext(node);
1078
+ const actions = await this.nodeContributionService.getMenuActions(context);
1079
+ const items = [];
1080
+ if (!actions.length) {
1081
+ items.push({
1082
+ name: 'org-chart.no-actions',
1083
+ text: this.translateService.translateSync(this.chartML.noActionsAvailable),
1084
+ icon: 'fa-light fa-circle-info',
1085
+ disabled: true,
1086
+ });
1087
+ }
1088
+ else {
1089
+ const addActions = actions.filter((action) => this.isAddNodeMenuAction(action));
1090
+ const nonAddActions = actions.filter((action) => !this.isAddNodeMenuAction(action));
1091
+ if (addActions.length > 0) {
1092
+ items.push({
1093
+ name: 'org-chart.group.add',
1094
+ text: this.translateService.translateSync(this.chartML.add),
1095
+ icon: 'fa-light fa-plus',
1096
+ break: true,
1097
+ items: addActions.map((action) => this.buildContextMenuLeafItem(action)),
1098
+ });
1099
+ }
1100
+ items.push(...this.buildGroupedNonAddContextMenuItems(nonAddActions));
1101
+ }
1102
+ const menu = this.contextMenu();
1103
+ if (!menu) {
1104
+ return;
1105
+ }
1106
+ this.ngzone.run(() => {
1107
+ const openingEvent = {
1108
+ sender: menu,
1109
+ canceled: false,
1110
+ targetElement,
1111
+ items,
1112
+ };
1113
+ menu.showAt({ x: clientX, y: clientY }, targetElement, openingEvent);
1114
+ });
1115
+ }
1116
+ resolveOrgChartNodeMenuTitleSync(action) {
1117
+ if (typeof action.title !== 'string') {
1118
+ return this.translateService.resolve(action.title);
1119
+ }
1120
+ if (action.titleParams && Object.keys(action.titleParams).length > 0) {
1121
+ return this.translateService.translateSync(action.title, { params: action.titleParams });
1122
+ }
1123
+ return this.translateService.translateSync(action.title);
1124
+ }
1125
+ isAddNodeMenuAction(action) {
1126
+ if (typeof action.title === 'string' &&
1127
+ action.title.startsWith('@organization-management:organization-chart.node-actions.add-')) {
1128
+ return true;
1129
+ }
1130
+ if (/^add([\-._:]|$)/i.test(action.id) || /[.\-_]add([\-._:]|$)/i.test(action.id)) {
1131
+ return true;
1132
+ }
1133
+ const resolvedTitle = this.resolveOrgChartNodeMenuTitleSync(action).trim();
1134
+ return /^add(\s|-)/i.test(resolvedTitle) || resolvedTitle.startsWith('افزودن');
1135
+ }
1136
+ /**
1137
+ * Builds top-level context rows for non-add actions, collapsing {@link AXMOrgChartNodeMenuAction.submenuGroupId} sets into one flyout.
1138
+ */
1139
+ buildGroupedNonAddContextMenuItems(actions) {
1140
+ const groups = new Map();
1141
+ const singles = [];
1142
+ for (const action of actions) {
1143
+ const gid = action.submenuGroupId?.trim();
1144
+ if (!gid) {
1145
+ singles.push(action);
1146
+ continue;
1147
+ }
1148
+ let bucket = groups.get(gid);
1149
+ if (!bucket) {
1150
+ bucket = {
1151
+ title: this.resolveSubmenuGroupTitleSync(action),
1152
+ icon: action.submenuGroupIcon,
1153
+ actions: [],
1154
+ breakAfter: false,
1155
+ };
1156
+ groups.set(gid, bucket);
1157
+ }
1158
+ bucket.actions.push(action);
1159
+ if (action.break === true) {
1160
+ bucket.breakAfter = true;
1161
+ }
1162
+ if (!bucket.icon && action.submenuGroupIcon) {
1163
+ bucket.icon = action.submenuGroupIcon;
1164
+ }
1165
+ }
1166
+ const ordered = [];
1167
+ for (const action of singles) {
1168
+ ordered.push({ kind: 'single', action });
1169
+ }
1170
+ for (const groupId of groups.keys()) {
1171
+ ordered.push({ kind: 'group', groupId });
1172
+ }
1173
+ const orderOf = (entry) => {
1174
+ if (entry.kind === 'single') {
1175
+ return entry.action.order ?? Number.MAX_SAFE_INTEGER;
1176
+ }
1177
+ const bucket = groups.get(entry.groupId);
1178
+ if (!bucket || bucket.actions.length === 0) {
1179
+ return Number.MAX_SAFE_INTEGER;
1180
+ }
1181
+ return Math.min(...bucket.actions.map((a) => a.order ?? Number.MAX_SAFE_INTEGER));
1182
+ };
1183
+ ordered.sort((a, b) => orderOf(a) - orderOf(b));
1184
+ const items = [];
1185
+ for (const entry of ordered) {
1186
+ if (entry.kind === 'single') {
1187
+ items.push(this.buildContextMenuLeafItem(entry.action));
1188
+ continue;
1189
+ }
1190
+ const bucket = groups.get(entry.groupId);
1191
+ if (!bucket || bucket.actions.length === 0) {
1192
+ continue;
1193
+ }
1194
+ const sortedMembers = [...bucket.actions].sort((a, b) => (a.order ?? Number.MAX_SAFE_INTEGER) - (b.order ?? Number.MAX_SAFE_INTEGER));
1195
+ if (sortedMembers.length === 1) {
1196
+ const only = sortedMembers[0];
1197
+ items.push(this.buildContextMenuLeafItem({
1198
+ ...only,
1199
+ break: bucket.breakAfter ? true : only.break,
1200
+ }));
1201
+ continue;
1202
+ }
1203
+ items.push({
1204
+ name: `org-chart.submenu.${entry.groupId}`,
1205
+ text: bucket.title,
1206
+ icon: bucket.icon ?? 'fa-light fa-comments',
1207
+ break: bucket.breakAfter,
1208
+ items: sortedMembers.map((action) => this.buildContextMenuLeafItem({
1209
+ ...action,
1210
+ break: false,
1211
+ })),
1212
+ });
1213
+ }
1214
+ return items;
1215
+ }
1216
+ resolveSubmenuGroupTitleSync(action) {
1217
+ const raw = action.submenuGroupTitle;
1218
+ if (raw == null) {
1219
+ return '';
1220
+ }
1221
+ if (typeof raw !== 'string') {
1222
+ return this.translateService.resolve(raw);
1223
+ }
1224
+ return this.translateService.translateSync(raw);
1225
+ }
1226
+ buildContextMenuLeafItem(action) {
1227
+ this.activeContextMenuActions.set(action.id, action);
1228
+ return {
1229
+ name: action.id,
1230
+ text: this.resolveOrgChartNodeMenuTitleSync(action),
1231
+ icon: action.icon,
1232
+ color: action.color,
1233
+ disabled: action.disabled,
1234
+ break: action.break,
1235
+ };
1236
+ }
1237
+ async handleContextMenuItemClick(e) {
1238
+ const actionId = e.item.name;
1239
+ if (!actionId || !this.activeContextNode) {
1240
+ return;
1241
+ }
1242
+ const action = this.activeContextMenuActions.get(actionId);
1243
+ if (!action || action.disabled) {
1244
+ return;
1245
+ }
1246
+ await action.execute(this.createNodeContributionContext(this.activeContextNode));
1247
+ }
1248
+ //#endregion
1249
+ //#region ---- Node Selection & Host API ----
1250
+ isNodeSelected(data) {
1251
+ return this.selectedNodeId() === data.id;
1252
+ }
1253
+ selectNode(data) {
1254
+ this.selectedNodeId.set(data.id);
1255
+ }
1256
+ openNodeContextMenuFromMore(event, data) {
1257
+ const nativeEvent = this.resolveNativeMouseEvent(event);
1258
+ if (!nativeEvent) {
1259
+ return;
1260
+ }
1261
+ nativeEvent.preventDefault();
1262
+ nativeEvent.stopPropagation();
1263
+ const fromCurrent = nativeEvent.currentTarget instanceof HTMLElement
1264
+ ? nativeEvent.currentTarget.closest('.--node-container')
1265
+ : null;
1266
+ const fromTarget = nativeEvent.target instanceof HTMLElement ? nativeEvent.target.closest('.--node-container') : null;
1267
+ const fromPoint = document.elementFromPoint(nativeEvent.clientX, nativeEvent.clientY);
1268
+ const anchor = (fromCurrent ?? fromTarget ?? fromPoint);
1269
+ if (!(anchor instanceof HTMLElement)) {
1270
+ return;
1271
+ }
1272
+ void this.openOrgChartContextMenuAt(nativeEvent.clientX, nativeEvent.clientY, data, anchor);
1273
+ }
1274
+ resolveNodeFromTarget(target) {
1275
+ if (!target) {
1276
+ return null;
1277
+ }
1278
+ let el = target;
1279
+ while (el) {
1280
+ const id = el.getAttribute('data-chart-node-id');
1281
+ if (id) {
1282
+ const fromTree = this.findNodeInTree(this.chartService.rootNode(), id);
1283
+ if (fromTree) {
1284
+ return fromTree;
1285
+ }
1286
+ }
1287
+ el = el.parentElement;
1288
+ }
1289
+ const directNode = target.__data__?.data;
1290
+ if (directNode && typeof directNode.id === 'string') {
1291
+ return directNode;
1292
+ }
1293
+ const foreignObject = target.closest('foreignObject.axp-chart-node');
1294
+ const fromFo = foreignObject?.__data__?.data;
1295
+ if (fromFo && typeof fromFo.id === 'string') {
1296
+ return fromFo;
1297
+ }
1298
+ return null;
1299
+ }
1300
+ findNodeInTree(root, id) {
1301
+ if (root.id === id) {
1302
+ return root;
1303
+ }
1304
+ for (const child of root.children ?? []) {
1305
+ const found = this.findNodeInTree(child, id);
1306
+ if (found) {
1307
+ return found;
1308
+ }
1309
+ }
1310
+ return null;
1311
+ }
1312
+ resolveNativeMouseEvent(event) {
1313
+ if (event instanceof MouseEvent) {
1314
+ return event;
1315
+ }
1316
+ if (typeof event === 'object' &&
1317
+ event != null &&
1318
+ 'nativeEvent' in event &&
1319
+ event.nativeEvent instanceof MouseEvent) {
1320
+ return event.nativeEvent;
1321
+ }
1322
+ return null;
1323
+ }
1324
+ createNodeContributionContext(node) {
1325
+ return {
1326
+ node,
1327
+ nodeKind: this.resolveNodeKind(node),
1328
+ selectedMode: this.chartService.selectedMode(),
1329
+ refreshChart: async () => {
1330
+ await this.refresh();
1331
+ this.recompute();
1332
+ },
1333
+ };
1334
+ }
1335
+ resolveNodeKind(node) {
1336
+ if (node.type === AXMOrgChartNodeType.Company) {
1337
+ return 'company-root';
1338
+ }
1339
+ if (node.type === AXMOrgChartNodeType.BusinessUnit) {
1340
+ return 'business-unit';
1341
+ }
1342
+ if (node.type === AXMOrgChartNodeType.Position) {
1343
+ return 'position';
1344
+ }
1345
+ if (node.type === AXMOrgChartNodeType.Employee) {
1346
+ return 'employee';
1347
+ }
1348
+ return 'other';
1349
+ }
1350
+ //#endregion
1351
+ //#region ---- Print & Card Presentation ----
1352
+ /**
1353
+ * Prints the organizational chart.
1354
+ */
1355
+ async printChart() {
1356
+ let [panX, panY, panZoomLevel] = [this.panX(), this.panY(), this.panZoomLevel()];
1357
+ (this.panX.set(0), this.panY.set(0), this.panZoomLevel.set(100));
1358
+ await this.chartService.printChart(this.treeContainer().nativeElement);
1359
+ (this.panX.set(panX), this.panY.set(panY), this.panZoomLevel.set(panZoomLevel));
1360
+ }
1361
+ /**
1362
+ * Parses hex or comma-separated `rgb(...)` into comma-separated channels for `rgba(var(--node-*))`.
1363
+ */
1364
+ parseCssColorToRgbCommaChannels(color) {
1365
+ const s = color.trim();
1366
+ const hex6 = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(s);
1367
+ if (hex6) {
1368
+ return `${parseInt(hex6[1], 16)}, ${parseInt(hex6[2], 16)}, ${parseInt(hex6[3], 16)}`;
1369
+ }
1370
+ const hex3 = /^#?([a-f\d])([a-f\d])([a-f\d])$/i.exec(s);
1371
+ if (hex3) {
1372
+ return `${parseInt(hex3[1] + hex3[1], 16)}, ${parseInt(hex3[2] + hex3[2], 16)}, ${parseInt(hex3[3] + hex3[3], 16)}`;
1373
+ }
1374
+ const rgb = /^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/i.exec(s);
1375
+ if (rgb) {
1376
+ return `${rgb[1]}, ${rgb[2]}, ${rgb[3]}`;
1377
+ }
1378
+ return null;
1379
+ }
1380
+ contrastingRgbCommaChannels(bgComma) {
1381
+ const parts = bgComma.split(',').map((p) => Number(p.trim()));
1382
+ const [r, g, b] = parts;
1383
+ const luminance = 0.2126 * (r / 255) + 0.7152 * (g / 255) + 0.0722 * (b / 255);
1384
+ return luminance > 0.55 ? '15, 23, 42' : '255, 255, 255';
1385
+ }
1386
+ darkenRgbCommaChannels(bgComma, factor) {
1387
+ const parts = bgComma.split(',').map((p) => Math.round(Number(p.trim()) * factor));
1388
+ return `${parts[0]}, ${parts[1]}, ${parts[2]}`;
1389
+ }
1390
+ /**
1391
+ * Gets the node colors based on the provided color.
1392
+ * @param color - Semantic token (for example primary, accent2) or a literal CSS color (hex / rgb).
1393
+ * @returns An object containing the node's background, text, and border colors.
1394
+ */
1395
+ getNodeColors(color) {
1396
+ const literal = this.parseCssColorToRgbCommaChannels(color);
1397
+ if (literal) {
1398
+ return {
1399
+ '--node-bg-color': literal,
1400
+ '--node-text-color': this.contrastingRgbCommaChannels(literal),
1401
+ '--node-border-color': this.darkenRgbCommaChannels(literal, 0.82),
1402
+ };
1403
+ }
1404
+ if (color.includes('surface')) {
1405
+ return {
1406
+ '--node-bg-color': `var(--ax-sys-color-${color})`,
1407
+ '--node-text-color': `var(--ax-sys-color-on-${color})`,
1408
+ '--node-border-color': `var(--ax-sys-color-border-${color})`,
1409
+ };
1410
+ }
1411
+ return {
1412
+ '--node-bg-color': `var(--ax-sys-color-${color}-surface)`,
1413
+ '--node-text-color': `var(--ax-sys-color-on-${color}-surface)`,
1414
+ '--node-border-color': `var(--ax-sys-color-border-${color}-surface)`,
1415
+ };
1416
+ }
1417
+ /**
1418
+ * Merged cards render the assignee in the body; suppressing `subtitle` avoids repeating name/role lines
1419
+ * (including for charts persisted before subtitle generation was tightened).
1420
+ */
1421
+ shouldShowOrgCardSubtitle(data) {
1422
+ const md = data.metadata ?? {};
1423
+ const template = md['chartTemplate'];
1424
+ if (template === 'merged-unit') {
1425
+ const uh = md['unitHead'];
1426
+ if (uh && uh['vacant'] !== true && typeof uh['employeeName'] === 'string' && uh['employeeName'].trim().length > 0) {
1427
+ return false;
1428
+ }
1429
+ }
1430
+ if (template === 'merged-manager') {
1431
+ if (md['vacant'] === true) {
1432
+ return true;
1433
+ }
1434
+ const occ = md['occupant'];
1435
+ const dn = occ?.['displayName'];
1436
+ if (typeof dn === 'string' && dn.trim().length > 0) {
1437
+ return false;
1438
+ }
1439
+ }
1440
+ return true;
1441
+ }
1442
+ //#endregion
1443
+ //#region ---- Node Card Data ----
1444
+ getSubtreeRosterCounts(data) {
1445
+ if (data.type === AXMOrgChartNodeType.Position &&
1446
+ data.metadata?.['chartTemplate'] === 'position-ic') {
1447
+ const stats = data.metadata?.['stats'];
1448
+ const subtreePeopleRaw = stats?.['subtreePeople'];
1449
+ let people;
1450
+ if (typeof subtreePeopleRaw === 'number' && Number.isFinite(subtreePeopleRaw)) {
1451
+ people = Math.max(0, Math.floor(subtreePeopleRaw));
1452
+ }
1453
+ else if (data.metadata?.['vacant'] === true) {
1454
+ people = 0;
1455
+ }
1456
+ else {
1457
+ const childCount = data.children?.length ?? 0;
1458
+ people = childCount > 0 ? childCount : 1;
1459
+ }
1460
+ /** One catalog seat row in the chart. */
1461
+ return { people, positions: 1 };
1462
+ }
1463
+ if (data.type !== AXMOrgChartNodeType.BusinessUnit && data.type !== AXMOrgChartNodeType.Company) {
1464
+ return null;
1465
+ }
1466
+ if (data.metadata?.['isRegional'] === true) {
1467
+ return null;
1468
+ }
1469
+ const stats = data.metadata?.['stats'];
1470
+ const peopleRaw = stats?.['subtreePeople'];
1471
+ const positionsRaw = stats?.['subtreePositionSeatCount'];
1472
+ if (typeof peopleRaw !== 'number' || !Number.isFinite(peopleRaw)) {
1473
+ return null;
1474
+ }
1475
+ if (typeof positionsRaw !== 'number' || !Number.isFinite(positionsRaw)) {
1476
+ return null;
1477
+ }
1478
+ return {
1479
+ people: Math.max(0, Math.floor(peopleRaw)),
1480
+ positions: Math.max(0, Math.floor(positionsRaw)),
1481
+ };
1482
+ }
1483
+ getTeamsMembershipCount(data) {
1484
+ const stats = data.metadata?.['stats'];
1485
+ const candidates = [
1486
+ stats?.['teamMemberships'],
1487
+ stats?.['teamMembershipCount'],
1488
+ stats?.['teams'],
1489
+ stats?.['teamsCount'],
1490
+ data.metadata?.['teamMemberships'],
1491
+ data.metadata?.['teamMembershipCount'],
1492
+ data.metadata?.['teamsCount'],
1493
+ data.metadata?.['teams'],
1494
+ ];
1495
+ for (const candidate of candidates) {
1496
+ if (typeof candidate === 'number' && Number.isFinite(candidate) && candidate >= 0) {
1497
+ return candidate;
1498
+ }
1499
+ }
1500
+ return null;
1501
+ }
1502
+ /**
1503
+ * Metadata rows for {@link AXMOrgChartDetailPanelComponent} only (key-value list is not shown on chart cards).
1504
+ */
1505
+ getNodeInfoItems(data) {
1506
+ const metadata = data.metadata ?? {};
1507
+ const toText = (value) => {
1508
+ if (value == null) {
1509
+ return null;
1510
+ }
1511
+ if (typeof value === 'number' || typeof value === 'boolean') {
1512
+ return String(value);
1513
+ }
1514
+ if (typeof value === 'string') {
1515
+ const trimmed = value.trim();
1516
+ return trimmed.length ? trimmed : null;
1517
+ }
1518
+ return null;
1519
+ };
1520
+ const resolveFirst = (...candidates) => {
1521
+ for (const candidate of candidates) {
1522
+ const text = toText(candidate);
1523
+ if (text != null) {
1524
+ return text;
1525
+ }
1526
+ }
1527
+ return null;
1528
+ };
1529
+ const createInfo = (label, value) => {
1530
+ return value == null ? null : { label, value };
1531
+ };
1532
+ const items = [];
1533
+ const teamMembershipCount = this.getTeamsMembershipCount(data);
1534
+ if (data.type === AXMOrgChartNodeType.BusinessUnit) {
1535
+ const unitHead = metadata['unitHead'];
1536
+ if (unitHead) {
1537
+ const vacant = unitHead['vacant'] === true;
1538
+ const rawName = unitHead['employeeName'];
1539
+ const nameText = vacant || typeof rawName !== 'string' || !rawName.trim()
1540
+ ? resolveMultiLanguageString(this.chartML.vacant, this.localeId)
1541
+ : rawName.trim();
1542
+ const posRaw = unitHead['positionTitle'];
1543
+ let positionText = null;
1544
+ if (typeof posRaw === 'string') {
1545
+ const t = posRaw.trim();
1546
+ positionText = t.length ? t : null;
1547
+ }
1548
+ else if (posRaw != null && typeof posRaw === 'object') {
1549
+ const t = resolveMultiLanguageString(posRaw, this.localeId).trim();
1550
+ positionText = t.length ? t : null;
1551
+ }
1552
+ const buLeadRows = [
1553
+ createInfo(this.chartML.buHead, nameText),
1554
+ createInfo(this.chartML.buPosition, positionText),
1555
+ ].filter((item) => item != null);
1556
+ items.push(...buLeadRows);
1557
+ }
1558
+ }
1559
+ if (data.type === AXMOrgChartNodeType.BusinessUnit || data.type === AXMOrgChartNodeType.Company) {
1560
+ const unitType = resolveFirst(metadata['unitTypeTitle'], metadata['unitType'], metadata['typeLabel']);
1561
+ const location = resolveFirst(metadata['locationName'], metadata['regionName'], metadata['countryName']);
1562
+ const infoCandidates = [
1563
+ createInfo(this.chartML.unitType, unitType),
1564
+ createInfo(this.chartML.location, location),
1565
+ ];
1566
+ if (teamMembershipCount != null) {
1567
+ infoCandidates.push({ label: this.chartML.teams, value: String(teamMembershipCount) });
1568
+ }
1569
+ items.push(...infoCandidates.filter((item) => item != null));
1570
+ }
1571
+ if (data.type === AXMOrgChartNodeType.Position) {
1572
+ const vacantIcSeat = metadata['vacant'] === true && metadata['chartTemplate'] === 'position-ic';
1573
+ const ouMl = metadata['organizationalUnitTitle'];
1574
+ const ouDisplay = ouMl != null && typeof ouMl === 'object'
1575
+ ? resolveMultiLanguageString(ouMl, this.localeId)
1576
+ : null;
1577
+ const level = resolveFirst(metadata['jobLevelTitle'], metadata['jobLevel'], metadata['grade']);
1578
+ const code = resolveFirst(metadata['code'], metadata['positionCode']);
1579
+ const capacity = resolveFirst(metadata['capacity']);
1580
+ const positionItems = vacantIcSeat
1581
+ ? [createInfo(this.chartML.businessUnit, ouDisplay)]
1582
+ : [
1583
+ createInfo(this.chartML.businessUnit, ouDisplay),
1584
+ createInfo(this.chartML.level, level),
1585
+ createInfo(this.chartML.code, code),
1586
+ createInfo(this.chartML.capacity, capacity),
1587
+ ];
1588
+ items.push(...positionItems.filter((item) => item != null));
1589
+ }
1590
+ if (data.type === AXMOrgChartNodeType.Employee || data.metadata?.['chartTemplate'] === 'employee-card') {
1591
+ const email = resolveFirst(metadata['email'], metadata['workEmail']);
1592
+ const phone = resolveFirst(metadata['phone'], metadata['mobile']);
1593
+ const employmentType = resolveFirst(metadata['employmentTypeTitle'], metadata['employmentType']);
1594
+ const workMode = resolveFirst(metadata['workModeTitle'], metadata['workMode']);
1595
+ const employeeInfo = [
1596
+ createInfo(this.chartML.email, email),
1597
+ createInfo(this.chartML.phone, phone),
1598
+ createInfo(this.chartML.employmentType, employmentType),
1599
+ createInfo(this.chartML.workMode, workMode),
1600
+ ];
1601
+ /** Teams count is rendered on employee chart cards — omit here to avoid duplicate rows. */
1602
+ items.push(...employeeInfo.filter((item) => item != null));
1603
+ }
1604
+ return items.slice(0, 8);
1605
+ }
1606
+ //#endregion
1607
+ //#region ---- Page Layout Integration ----
1608
+ /**
1609
+ * Translation key for the hierarchy chart mode shown under the page title.
1610
+ */
1611
+ chartModeDescriptionTranslationKey(mode) {
1612
+ const keys = {
1613
+ structure: '@organization-management:organization-chart.options.mode.structure',
1614
+ location: '@organization-management:organization-chart.options.mode.location',
1615
+ reporting: '@organization-management:organization-chart.options.mode.reporting',
1616
+ positionHierarchy: '@organization-management:organization-chart.options.mode.positionHierarchy',
1617
+ };
1618
+ return keys[mode];
1619
+ }
1620
+ updateVar(oldValue, newValue) {
1621
+ oldValue.cat = newValue;
1622
+ }
1623
+ async getPageTitle() {
1624
+ return await this.translateService.translateAsync('@organization-management:organization-chart.components.chart.title');
1625
+ }
1626
+ async getPageDescription() {
1627
+ const mode = this.chartService.selectedMode();
1628
+ const modeKey = this.chartModeDescriptionTranslationKey(mode);
1629
+ return await this.translateService.translateAsync(modeKey);
1630
+ }
1631
+ getTitleActions() {
1632
+ const mode = this.chartService.selectedMode();
1633
+ const modes = ['structure', 'location', 'reporting', 'positionHierarchy'];
1634
+ return modes.map((m) => ({
1635
+ title: this.chartModeDescriptionTranslationKey(m),
1636
+ command: {
1637
+ name: 'chart-mode',
1638
+ metadata: { mode: m, isSelected: mode === m, hideSelectionCheckSuffix: true },
1639
+ },
1640
+ // Prefix renders `fa-light {{ icon }}` (matches dashboard title-action check placement).
1641
+ icon: mode === m ? 'fa-check' : '',
1642
+ }));
1643
+ }
1644
+ async getSecondaryMenuItems() {
1645
+ return [
1646
+ {
1647
+ ...getActionButton('print'),
1648
+ command: {
1649
+ name: 'print',
1650
+ },
1651
+ },
1652
+ {
1653
+ ...getActionButton('refresh'),
1654
+ command: {
1655
+ name: 'refresh',
1656
+ },
1657
+ },
1658
+ ];
1659
+ }
1660
+ async getPageBreadcrumbs() {
1661
+ return [
1662
+ {
1663
+ title: await this.translateService.translateAsync('@organization-management:module.menus.root.title'),
1664
+ },
1665
+ ];
1666
+ }
1667
+ async execute(command) {
1668
+ if (command.name === 'chart-mode') {
1669
+ const mode = command.metadata?.['mode'];
1670
+ if (mode) {
1671
+ this.chartService.setChartMode(mode);
1672
+ this.redrawChart();
1673
+ this.recompute();
1674
+ }
1675
+ return;
1676
+ }
1677
+ if (command.name == 'print') {
1678
+ await this.printChart();
1679
+ }
1680
+ if (command.name == 'refresh') {
1681
+ await this.chartService.generate();
1682
+ await this.refresh();
1683
+ this.recompute();
1684
+ }
1685
+ }
1686
+ //#endregion
1687
+ //#region ---- Lifecycle ----
1688
+ ngOnDestroy() {
1689
+ this.clearChart(this.treeContainer().nativeElement);
1690
+ }
1691
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartPage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1692
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMOrgChartPage, isStandalone: true, selector: "ng-component", providers: [
1693
+ AXMOrgChartService,
1694
+ AXMOrgChartNodeContributionService,
1695
+ {
1696
+ provide: AXPPageLayoutBase,
1697
+ useExisting: AXMOrgChartPage,
1698
+ },
1699
+ { provide: AXM_ORG_CHART_HOST, useExisting: AXMOrgChartPage },
1700
+ ], viewQueries: [{ propertyName: "treeContainer", first: true, predicate: ["chart"], descendants: true, isSignal: true }, { propertyName: "parent", first: true, predicate: ["parent"], descendants: true, isSignal: true }, { propertyName: "contextMenu", first: true, predicate: AXContextMenuComponent, descendants: true, isSignal: true }, { propertyName: "panView", first: true, predicate: AXPanViewDirective, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <axp-page-toolbar>\n <axp-layout-prefix>\n <div class=\"ax-flex ax-flex-wrap ax-items-center ax-gap-3\">\n <ax-search-box class=\"ax-w-72\" [(ngModel)]=\"chartSearchQuery\"\n (onValueChanged)=\"onChartSearchValueChanged($event)\" [placeholder]=\"\n ('@organization-management:organization-chart.components.chart.search-placeholder' | translate | async) || ''\n \">\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n @if (chartService.selectedMode() !== 'reporting') {\n <div class=\"ax-flex ax-items-center ax-gap-2 ax-flex-shrink-0 ax-whitespace-nowrap\">\n <span class=\"ax-text-sm\">{{\n '@organization-management:organization-chart.components.generate-dialog.fields.show-vacant-leaf-seats.label'\n | translate\n | async\n }}</span>\n <ax-switch [ngModel]=\"chartService.showVacantLeafSeats()\"\n (onValueChanged)=\"onVacantLeafSeatsChange($event)\"></ax-switch>\n </div>\n }\n </div>\n </axp-layout-prefix>\n <axp-layout-suffix>\n @if (deviceService.isLarge()) {\n <ax-button (onClick)=\"toggleDetailPanel()\">\n <ax-icon icon=\"{{ isDetailPanelOpen() ? 'fa-solid fa-square-info' : 'fa-light fa-square-info' }}\"></ax-icon>\n </ax-button>\n }\n </axp-layout-suffix>\n </axp-page-toolbar>\n <axp-page-content class=\"ax-overflow-hidden ax-flex ax-flex-col\">\n <div class=\"ax-flex ax-flex-row ax-gap-4 ax-flex-1 ax-min-h-0 ax-overflow-hidden\" #parent id=\"parent\">\n <div class=\"ax-flex-1 ax-min-w-0 ax-min-h-0 ax-overflow-hidden ax-relative ax-light\">\n <div #chart axPanView [(panX)]=\"panX\" [(panY)]=\"panY\" [freeMode]=\"true\" [(zoom)]=\"panZoomLevel\"\n [fitContent]=\"true\" wrapperClasses=\"h\" class=\"ax-light\" (contextmenu)=\"onOrgChartSurfaceContextMenu($event)\">\n </div>\n <div class=\"axm-org-chart-page__floating-zoom\">\n <ax-button look=\"blank\" class=\"ax-sm __zoom-button\" (onClick)=\"zoomOut()\">\n <ax-icon class=\"fa-solid fa-minus\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" class=\"ax-sm __zoom-value\" [text]=\"zoomPercentageLabel()\"\n (onClick)=\"zoomReset()\"></ax-button>\n <ax-button look=\"blank\" class=\"ax-sm __zoom-button\" (onClick)=\"zoomIn()\">\n <ax-icon class=\"fa-solid fa-plus\"></ax-icon>\n </ax-button>\n </div>\n <ax-context-menu [orientation]=\"'vertical'\" [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\">\n </ax-context-menu>\n </div>\n @if (isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-org-chart-detail-panel class=\"ax-sticky ax-top-0 ax-z-10 ax-max-h-full ax-flex-none\"\n [node]=\"detailPanelSelectedNode()\" (panelClose)=\"toggleDetailPanel()\" />\n }\n </div>\n </axp-page-content>\n</axp-page-layout>", styles: ["@charset \"UTF-8\";foreignObject.axp-chart-node{overflow:visible}.axp-chart-links path.link{pointer-events:none}.axp-chart-node{display:flex;align-items:center;justify-content:center}.axp-chart-node .--node-container{position:relative;cursor:pointer}.axp-chart-node .--node-container.--merged-card{box-sizing:border-box;width:100%;max-width:100%}.axp-chart-node .--node-container{--node-bg-color: var(--ax-sys-color-primary-surface);--node-text-color: var(--ax-sys-color-on-primary-surface);--node-border-color: var(--ax-sys-color-border-primary-surface)}.axp-chart-node .--node-container.--selected .--container{border-width:2px;border-style:dashed;--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.axp-chart-node .--node-container.--search-hit .--container{box-shadow:0 0 0 2px rgb(var(--ax-sys-color-warning-500)),0 0 12px color-mix(in srgb,rgb(var(--ax-sys-color-warning-500)) 35%,transparent)}.axp-chart-node .--node-container .--container{display:flex;max-height:100%;width:100%;flex-direction:column;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);border-color:rgba(var(--node-border-color))}.axp-chart-node .--node-container .--toggle{position:absolute;left:0;right:0;bottom:-.75rem;display:flex;width:100%;-webkit-user-select:none;user-select:none;align-items:center;justify-content:center}.axp-chart-node .--node-container.--merged-card .--container{width:100%;min-width:0px}.axp-chart-node .--node-container.axm-org-chart-card{border-radius:1rem;--oc-body-mix: 18%;--axm-org-chart-card-body-bg: radial-gradient(ellipse 130% 75% at 105% -5%, color-mix(in srgb, rgb(var(--node-bg-color)) var(--oc-body-mix), rgb(var(--ax-sys-color-lightest-surface))) 0%, color-mix(in srgb, rgb(var(--node-bg-color)) 6%, rgb(var(--ax-sys-color-lightest-surface))) 55%, color-mix(in srgb, rgb(var(--node-bg-color)) 2%, rgb(var(--ax-sys-color-lightest-surface))) 100%);--oc-ring-1: color-mix(in srgb, rgb(var(--node-bg-color)) 8%, transparent);--oc-ring-2: transparent;--oc-ring-3: transparent;border:1px solid color-mix(in srgb,rgb(var(--node-bg-color)) 12%,transparent);box-shadow:0 1px 2px #0000000a,0 12px 32px #00000014,0 32px 64px -24px #0000001a,0 0 36px var(--oc-ring-1),0 0 16px var(--oc-ring-2),0 0 28px var(--oc-ring-3),inset 0 1px #fffc}.axp-chart-node .--node-container.axm-org-chart-card.axm-org-chart-card--vacant{border-width:2px;border-style:dashed;border-color:color-mix(in srgb,rgb(var(--node-bg-color)) 50%,rgb(var(--ax-sys-color-border-primary-surface)))}.dark .axp-chart-node .--node-container.axm-org-chart-card{border-color:color-mix(in srgb,rgb(var(--node-bg-color)) 22%,rgb(var(--ax-sys-color-border-primary-surface)));box-shadow:0 1px 2px #00000061,0 14px 36px #0000006b,0 28px 64px -28px #0000007a,0 0 30px var(--oc-ring-1),0 0 14px var(--oc-ring-2),0 0 24px var(--oc-ring-3)}.dark .axp-chart-node .--node-container.axm-org-chart-card.axm-org-chart-card--vacant{border-color:color-mix(in srgb,rgb(var(--node-bg-color)) 58%,rgb(var(--ax-sys-color-border-primary-surface)))}.axp-chart-node .--node-container.axm-org-chart-card.--selected:not(.--search-hit){--oc-ring-1: color-mix(in srgb, rgb(var(--node-bg-color)) 32%, transparent);--oc-ring-2: color-mix(in srgb, rgb(var(--node-bg-color)) 22%, transparent)}.axp-chart-node .--node-container.axm-org-chart-card.--search-hit:not(.--selected){--oc-ring-1: color-mix(in srgb, rgb(var(--ax-sys-color-warning-500)) 30%, transparent);--oc-ring-2: color-mix(in srgb, rgb(var(--ax-sys-color-warning-500)) 20%, transparent)}.axp-chart-node .--node-container.axm-org-chart-card.--selected.--search-hit{--oc-ring-1: color-mix(in srgb, rgb(var(--ax-sys-color-warning-500)) 28%, transparent);--oc-ring-2: color-mix(in srgb, rgb(var(--ax-sys-color-warning-500)) 18%, transparent);--oc-ring-3: color-mix(in srgb, rgb(var(--node-bg-color)) 24%, transparent)}.axp-chart-node .--node-container.axm-org-chart-card .--container{overflow:hidden;border-radius:1rem;border-width:0px;border-style:none;box-shadow:none}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__accent{width:100%;flex:none;height:6px;border-top-left-radius:inherit;border-top-right-radius:inherit;border-bottom-left-radius:1.5rem;border-bottom-right-radius:0;background:linear-gradient(90deg,color-mix(in srgb,rgb(var(--node-bg-color)) 70%,white),rgb(var(--node-bg-color)),color-mix(in srgb,rgb(var(--node-bg-color)) 88%,black))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__body{position:relative;display:flex;width:100%;min-width:0px;flex-direction:column;overflow:hidden;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__body:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__body{background-color:rgb(var(--ax-sys-color-lightest-surface));background-image:var(--axm-org-chart-card-body-bg, none)}.axp-chart-node .--node-container.axm-org-chart-card.axm-org-chart-card--employee .axm-org-chart-card__header--person .axm-org-chart-card__person-name{font-size:1rem;line-height:1.5rem;font-weight:600}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__header--org{display:flex;min-width:0px;align-items:flex-start;gap:1rem;padding:1rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__header--person{display:flex;min-width:0px;align-items:center;gap:1rem;padding:1rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__leading-icon{display:flex;width:3rem;height:3rem;flex:none;align-items:center;justify-content:center;border-radius:.75rem;color:rgb(var(--node-bg-color));background-color:color-mix(in srgb,rgb(var(--node-bg-color)) 16%,white)}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__title-block{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column;gap:.125rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1rem;line-height:1.5rem;font-weight:600;line-height:1.25;color:rgba(var(--ax-sys-color-on-surface))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;line-height:1.375;opacity:.9;color:rgba(var(--ax-sys-color-on-surface-variant))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__desc{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;font-size:.75rem;line-height:1rem;line-height:1.375;opacity:.85;color:rgba(var(--ax-sys-color-on-surface-variant))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person{border-width:0px;padding:.5rem 1rem 1rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-label{margin-bottom:.5rem;font-size:.75rem;line-height:1rem;font-weight:700;line-height:1.25;color:rgb(var(--node-bg-color))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-row{display:flex;min-width:0px;align-items:center;gap:1rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-text{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column;gap:.125rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;line-height:1.25rem;font-weight:700;line-height:1.25;color:rgba(var(--ax-sys-color-on-surface))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-role{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;line-height:1.375;color:rgba(var(--ax-sys-color-on-surface-variant))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-vacant{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;font-weight:500;text-transform:uppercase;letter-spacing:.025em;color:color-mix(in srgb,rgb(var(--node-bg-color)) 72%,rgb(var(--ax-sys-color-on-surface-variant)))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__footer{display:flex;flex-direction:row;justify-content:center;padding-top:1rem;padding-bottom:1rem;border-top-width:1px;min-height:3.5rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__footer>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)));--tw-divide-opacity: 1;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-divide-opacity, 1))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__footer:is(.ax-dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgba(var(--ax-sys-color-border-darkest-surface),var(--tw-divide-opacity, 1))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__footer:is(.ax-dark *){--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-darkest-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__metric{display:flex;flex:1 1 0%;align-items:center;justify-content:center;gap:.5rem;padding:.5rem 1rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__metric-icon{flex:none;font-size:.875rem;line-height:1.25rem;opacity:.95;color:rgb(var(--node-bg-color))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__metric-col{display:flex;min-width:0px;flex:none;flex-direction:column;align-items:center;gap:.125rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__metric-value{font-size:.875rem;line-height:1.25rem;font-weight:600;line-height:1}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__metric-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:1.25;opacity:.75;color:rgba(var(--ax-sys-color-on-surface-variant))}#parent:fullscreen{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}.axm-org-chart-page__floating-zoom{position:absolute;bottom:1rem;z-index:20;display:flex;align-items:center;gap:.25rem;border-radius:1rem;padding:.375rem;border-width:1px;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));inset-inline-end:1rem;backdrop-filter:blur(10px);box-shadow:0 8px 20px -12px #0000003d,0 2px 8px #00000014,inset 0 1px #ffffffbf}.axm-org-chart-page__floating-zoom .__zoom-button{border-radius:.75rem;color:rgba(var(--ax-sys-color-on-surface))}.axm-org-chart-page__floating-zoom .__zoom-button:hover{background-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 10%,white)}.axm-org-chart-page__floating-zoom .__zoom-value{min-width:4rem;border-radius:.75rem;font-weight:600;color:rgba(var(--ax-sys-color-on-surface))}.axm-org-chart-page__floating-zoom .__zoom-value:hover{background-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 10%,white)}\n"], dependencies: [{ 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: RouterModule }, { kind: "ngmodule", type:
1701
+ //
1702
+ AXMenuModule }, { kind: "component", type: i2$1.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { 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: AXDropdownButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i3.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "directive", type: AXPanViewDirective, selector: "[axPanView]", inputs: ["zoomStep", "minZoom", "maxZoom", "freeMode", "fitContent", "disablePan", "disableZoom", "wrapperClasses", "panX", "panY", "zoom"], outputs: ["panXChange", "panYChange", "zoomChange", "positionChange"], exportAs: ["axPanView"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i6.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXSwitchModule }, { kind: "component", type: i7.AXSwitchComponent, selector: "ax-switch", inputs: ["disabled", "readonly", "color", "tabIndex", "value", "name", "isLoading"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged", "readonlyChange", "disabledChange"] }, { kind: "component", type:
1703
+ //
1704
+ AXPThemeLayoutBlockComponent, selector: " axp-page-content, axp-page-footer-container, axp-page-footer, axp-page-header, axp-page-header-container, axp-page-toolbar, axp-layout-content, axp-layout-page-content, axp-layout-sections, axp-layout-body, axp-layout-page-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title-bar, axp-layout-title, axp-layout-title-actions, axp-layout-nav-button, axp-layout-description, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXMOrgChartDetailPanelComponent, selector: "axm-org-chart-detail-panel", inputs: ["node"], outputs: ["panelClose"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1705
+ }
1706
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMOrgChartPage, decorators: [{
1707
+ type: Component,
1708
+ args: [{ imports: [
1709
+ CommonModule,
1710
+ FormsModule,
1711
+ RouterModule,
1712
+ //
1713
+ AXMenuModule,
1714
+ AXButtonModule,
1715
+ AXDropdownButtonModule,
1716
+ AXTranslationModule,
1717
+ AXDecoratorModule,
1718
+ AXPanViewDirective,
1719
+ AXLoadingModule,
1720
+ AXBreadcrumbsModule,
1721
+ AXBadgeModule,
1722
+ AXSearchBoxModule,
1723
+ AXSwitchModule,
1724
+ //
1725
+ AXPThemeLayoutBlockComponent,
1726
+ AXPPageLayoutComponent,
1727
+ AXMOrgChartDetailPanelComponent,
1728
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
1729
+ AXMOrgChartService,
1730
+ AXMOrgChartNodeContributionService,
1731
+ {
1732
+ provide: AXPPageLayoutBase,
1733
+ useExisting: AXMOrgChartPage,
1734
+ },
1735
+ { provide: AXM_ORG_CHART_HOST, useExisting: AXMOrgChartPage },
1736
+ ], template: "<axp-page-layout *translate=\"let t\">\n <axp-page-toolbar>\n <axp-layout-prefix>\n <div class=\"ax-flex ax-flex-wrap ax-items-center ax-gap-3\">\n <ax-search-box class=\"ax-w-72\" [(ngModel)]=\"chartSearchQuery\"\n (onValueChanged)=\"onChartSearchValueChanged($event)\" [placeholder]=\"\n ('@organization-management:organization-chart.components.chart.search-placeholder' | translate | async) || ''\n \">\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n @if (chartService.selectedMode() !== 'reporting') {\n <div class=\"ax-flex ax-items-center ax-gap-2 ax-flex-shrink-0 ax-whitespace-nowrap\">\n <span class=\"ax-text-sm\">{{\n '@organization-management:organization-chart.components.generate-dialog.fields.show-vacant-leaf-seats.label'\n | translate\n | async\n }}</span>\n <ax-switch [ngModel]=\"chartService.showVacantLeafSeats()\"\n (onValueChanged)=\"onVacantLeafSeatsChange($event)\"></ax-switch>\n </div>\n }\n </div>\n </axp-layout-prefix>\n <axp-layout-suffix>\n @if (deviceService.isLarge()) {\n <ax-button (onClick)=\"toggleDetailPanel()\">\n <ax-icon icon=\"{{ isDetailPanelOpen() ? 'fa-solid fa-square-info' : 'fa-light fa-square-info' }}\"></ax-icon>\n </ax-button>\n }\n </axp-layout-suffix>\n </axp-page-toolbar>\n <axp-page-content class=\"ax-overflow-hidden ax-flex ax-flex-col\">\n <div class=\"ax-flex ax-flex-row ax-gap-4 ax-flex-1 ax-min-h-0 ax-overflow-hidden\" #parent id=\"parent\">\n <div class=\"ax-flex-1 ax-min-w-0 ax-min-h-0 ax-overflow-hidden ax-relative ax-light\">\n <div #chart axPanView [(panX)]=\"panX\" [(panY)]=\"panY\" [freeMode]=\"true\" [(zoom)]=\"panZoomLevel\"\n [fitContent]=\"true\" wrapperClasses=\"h\" class=\"ax-light\" (contextmenu)=\"onOrgChartSurfaceContextMenu($event)\">\n </div>\n <div class=\"axm-org-chart-page__floating-zoom\">\n <ax-button look=\"blank\" class=\"ax-sm __zoom-button\" (onClick)=\"zoomOut()\">\n <ax-icon class=\"fa-solid fa-minus\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" class=\"ax-sm __zoom-value\" [text]=\"zoomPercentageLabel()\"\n (onClick)=\"zoomReset()\"></ax-button>\n <ax-button look=\"blank\" class=\"ax-sm __zoom-button\" (onClick)=\"zoomIn()\">\n <ax-icon class=\"fa-solid fa-plus\"></ax-icon>\n </ax-button>\n </div>\n <ax-context-menu [orientation]=\"'vertical'\" [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\">\n </ax-context-menu>\n </div>\n @if (isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-org-chart-detail-panel class=\"ax-sticky ax-top-0 ax-z-10 ax-max-h-full ax-flex-none\"\n [node]=\"detailPanelSelectedNode()\" (panelClose)=\"toggleDetailPanel()\" />\n }\n </div>\n </axp-page-content>\n</axp-page-layout>", styles: ["@charset \"UTF-8\";foreignObject.axp-chart-node{overflow:visible}.axp-chart-links path.link{pointer-events:none}.axp-chart-node{display:flex;align-items:center;justify-content:center}.axp-chart-node .--node-container{position:relative;cursor:pointer}.axp-chart-node .--node-container.--merged-card{box-sizing:border-box;width:100%;max-width:100%}.axp-chart-node .--node-container{--node-bg-color: var(--ax-sys-color-primary-surface);--node-text-color: var(--ax-sys-color-on-primary-surface);--node-border-color: var(--ax-sys-color-border-primary-surface)}.axp-chart-node .--node-container.--selected .--container{border-width:2px;border-style:dashed;--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.axp-chart-node .--node-container.--search-hit .--container{box-shadow:0 0 0 2px rgb(var(--ax-sys-color-warning-500)),0 0 12px color-mix(in srgb,rgb(var(--ax-sys-color-warning-500)) 35%,transparent)}.axp-chart-node .--node-container .--container{display:flex;max-height:100%;width:100%;flex-direction:column;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);border-color:rgba(var(--node-border-color))}.axp-chart-node .--node-container .--toggle{position:absolute;left:0;right:0;bottom:-.75rem;display:flex;width:100%;-webkit-user-select:none;user-select:none;align-items:center;justify-content:center}.axp-chart-node .--node-container.--merged-card .--container{width:100%;min-width:0px}.axp-chart-node .--node-container.axm-org-chart-card{border-radius:1rem;--oc-body-mix: 18%;--axm-org-chart-card-body-bg: radial-gradient(ellipse 130% 75% at 105% -5%, color-mix(in srgb, rgb(var(--node-bg-color)) var(--oc-body-mix), rgb(var(--ax-sys-color-lightest-surface))) 0%, color-mix(in srgb, rgb(var(--node-bg-color)) 6%, rgb(var(--ax-sys-color-lightest-surface))) 55%, color-mix(in srgb, rgb(var(--node-bg-color)) 2%, rgb(var(--ax-sys-color-lightest-surface))) 100%);--oc-ring-1: color-mix(in srgb, rgb(var(--node-bg-color)) 8%, transparent);--oc-ring-2: transparent;--oc-ring-3: transparent;border:1px solid color-mix(in srgb,rgb(var(--node-bg-color)) 12%,transparent);box-shadow:0 1px 2px #0000000a,0 12px 32px #00000014,0 32px 64px -24px #0000001a,0 0 36px var(--oc-ring-1),0 0 16px var(--oc-ring-2),0 0 28px var(--oc-ring-3),inset 0 1px #fffc}.axp-chart-node .--node-container.axm-org-chart-card.axm-org-chart-card--vacant{border-width:2px;border-style:dashed;border-color:color-mix(in srgb,rgb(var(--node-bg-color)) 50%,rgb(var(--ax-sys-color-border-primary-surface)))}.dark .axp-chart-node .--node-container.axm-org-chart-card{border-color:color-mix(in srgb,rgb(var(--node-bg-color)) 22%,rgb(var(--ax-sys-color-border-primary-surface)));box-shadow:0 1px 2px #00000061,0 14px 36px #0000006b,0 28px 64px -28px #0000007a,0 0 30px var(--oc-ring-1),0 0 14px var(--oc-ring-2),0 0 24px var(--oc-ring-3)}.dark .axp-chart-node .--node-container.axm-org-chart-card.axm-org-chart-card--vacant{border-color:color-mix(in srgb,rgb(var(--node-bg-color)) 58%,rgb(var(--ax-sys-color-border-primary-surface)))}.axp-chart-node .--node-container.axm-org-chart-card.--selected:not(.--search-hit){--oc-ring-1: color-mix(in srgb, rgb(var(--node-bg-color)) 32%, transparent);--oc-ring-2: color-mix(in srgb, rgb(var(--node-bg-color)) 22%, transparent)}.axp-chart-node .--node-container.axm-org-chart-card.--search-hit:not(.--selected){--oc-ring-1: color-mix(in srgb, rgb(var(--ax-sys-color-warning-500)) 30%, transparent);--oc-ring-2: color-mix(in srgb, rgb(var(--ax-sys-color-warning-500)) 20%, transparent)}.axp-chart-node .--node-container.axm-org-chart-card.--selected.--search-hit{--oc-ring-1: color-mix(in srgb, rgb(var(--ax-sys-color-warning-500)) 28%, transparent);--oc-ring-2: color-mix(in srgb, rgb(var(--ax-sys-color-warning-500)) 18%, transparent);--oc-ring-3: color-mix(in srgb, rgb(var(--node-bg-color)) 24%, transparent)}.axp-chart-node .--node-container.axm-org-chart-card .--container{overflow:hidden;border-radius:1rem;border-width:0px;border-style:none;box-shadow:none}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__accent{width:100%;flex:none;height:6px;border-top-left-radius:inherit;border-top-right-radius:inherit;border-bottom-left-radius:1.5rem;border-bottom-right-radius:0;background:linear-gradient(90deg,color-mix(in srgb,rgb(var(--node-bg-color)) 70%,white),rgb(var(--node-bg-color)),color-mix(in srgb,rgb(var(--node-bg-color)) 88%,black))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__body{position:relative;display:flex;width:100%;min-width:0px;flex-direction:column;overflow:hidden;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__body:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__body{background-color:rgb(var(--ax-sys-color-lightest-surface));background-image:var(--axm-org-chart-card-body-bg, none)}.axp-chart-node .--node-container.axm-org-chart-card.axm-org-chart-card--employee .axm-org-chart-card__header--person .axm-org-chart-card__person-name{font-size:1rem;line-height:1.5rem;font-weight:600}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__header--org{display:flex;min-width:0px;align-items:flex-start;gap:1rem;padding:1rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__header--person{display:flex;min-width:0px;align-items:center;gap:1rem;padding:1rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__leading-icon{display:flex;width:3rem;height:3rem;flex:none;align-items:center;justify-content:center;border-radius:.75rem;color:rgb(var(--node-bg-color));background-color:color-mix(in srgb,rgb(var(--node-bg-color)) 16%,white)}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__title-block{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column;gap:.125rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1rem;line-height:1.5rem;font-weight:600;line-height:1.25;color:rgba(var(--ax-sys-color-on-surface))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;line-height:1.375;opacity:.9;color:rgba(var(--ax-sys-color-on-surface-variant))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__desc{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;font-size:.75rem;line-height:1rem;line-height:1.375;opacity:.85;color:rgba(var(--ax-sys-color-on-surface-variant))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person{border-width:0px;padding:.5rem 1rem 1rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-label{margin-bottom:.5rem;font-size:.75rem;line-height:1rem;font-weight:700;line-height:1.25;color:rgb(var(--node-bg-color))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-row{display:flex;min-width:0px;align-items:center;gap:1rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-text{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column;gap:.125rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;line-height:1.25rem;font-weight:700;line-height:1.25;color:rgba(var(--ax-sys-color-on-surface))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-role{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;line-height:1.375;color:rgba(var(--ax-sys-color-on-surface-variant))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__person-vacant{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;font-weight:500;text-transform:uppercase;letter-spacing:.025em;color:color-mix(in srgb,rgb(var(--node-bg-color)) 72%,rgb(var(--ax-sys-color-on-surface-variant)))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__footer{display:flex;flex-direction:row;justify-content:center;padding-top:1rem;padding-bottom:1rem;border-top-width:1px;min-height:3.5rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__footer>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)));--tw-divide-opacity: 1;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-divide-opacity, 1))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__footer:is(.ax-dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgba(var(--ax-sys-color-border-darkest-surface),var(--tw-divide-opacity, 1))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__footer:is(.ax-dark *){--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-darkest-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__metric{display:flex;flex:1 1 0%;align-items:center;justify-content:center;gap:.5rem;padding:.5rem 1rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__metric-icon{flex:none;font-size:.875rem;line-height:1.25rem;opacity:.95;color:rgb(var(--node-bg-color))}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__metric-col{display:flex;min-width:0px;flex:none;flex-direction:column;align-items:center;gap:.125rem}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__metric-value{font-size:.875rem;line-height:1.25rem;font-weight:600;line-height:1}.axp-chart-node .--node-container.axm-org-chart-card .axm-org-chart-card__metric-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:1.25;opacity:.75;color:rgba(var(--ax-sys-color-on-surface-variant))}#parent:fullscreen{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}.axm-org-chart-page__floating-zoom{position:absolute;bottom:1rem;z-index:20;display:flex;align-items:center;gap:.25rem;border-radius:1rem;padding:.375rem;border-width:1px;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));inset-inline-end:1rem;backdrop-filter:blur(10px);box-shadow:0 8px 20px -12px #0000003d,0 2px 8px #00000014,inset 0 1px #ffffffbf}.axm-org-chart-page__floating-zoom .__zoom-button{border-radius:.75rem;color:rgba(var(--ax-sys-color-on-surface))}.axm-org-chart-page__floating-zoom .__zoom-button:hover{background-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 10%,white)}.axm-org-chart-page__floating-zoom .__zoom-value{min-width:4rem;border-radius:.75rem;font-weight:600;color:rgba(var(--ax-sys-color-on-surface))}.axm-org-chart-page__floating-zoom .__zoom-value:hover{background-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 10%,white)}\n"] }]
1737
+ }], ctorParameters: () => [], propDecorators: { treeContainer: [{ type: i0.ViewChild, args: ['chart', { isSignal: true }] }], parent: [{ type: i0.ViewChild, args: ['parent', { isSignal: true }] }], contextMenu: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXContextMenuComponent), { isSignal: true }] }], panView: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXPanViewDirective), { isSignal: true }] }] } });
1738
+
1739
+ export { AXMOrgChartPage };
1740
+ //# sourceMappingURL=acorex-modules-organization-management-org-chart.page-COkMtxFO.mjs.map