@acorex/modules 21.0.0-next.51 → 21.0.0-next.54

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 (311) hide show
  1. package/ai-management/README.md +1 -0
  2. package/fesm2022/{acorex-modules-ai-management-assist.entity-513RdKsz.mjs → acorex-modules-ai-management-assist.entity-CnyoIO-Z.mjs} +24 -16
  3. package/fesm2022/acorex-modules-ai-management-assist.entity-CnyoIO-Z.mjs.map +1 -0
  4. package/fesm2022/acorex-modules-ai-management.mjs +374 -35
  5. package/fesm2022/acorex-modules-ai-management.mjs.map +1 -1
  6. package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-BD5oxehv.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-DcPnI9fZ.mjs} +69 -505
  7. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-DcPnI9fZ.mjs.map +1 -0
  8. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-BWj2PB39.mjs → acorex-modules-assessment-management-assessment-case.entity-D880d_qz.mjs} +2 -2
  9. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-BWj2PB39.mjs.map → acorex-modules-assessment-management-assessment-case.entity-D880d_qz.mjs.map} +1 -1
  10. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-BQnYnNOz.mjs → acorex-modules-assessment-management-assessment-session.entity-DvbocIN1.mjs} +2 -2
  11. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-BQnYnNOz.mjs.map → acorex-modules-assessment-management-assessment-session.entity-DvbocIN1.mjs.map} +1 -1
  12. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-BiS7QO_E.mjs → acorex-modules-assessment-management-fill-assessment-session.command-BMJ54EPO.mjs} +59 -85
  13. package/fesm2022/acorex-modules-assessment-management-fill-assessment-session.command-BMJ54EPO.mjs.map +1 -0
  14. package/fesm2022/{acorex-modules-assessment-management-index-BXw0Lf5c.mjs → acorex-modules-assessment-management-index-XdJCIYG3.mjs} +4 -4
  15. package/fesm2022/{acorex-modules-assessment-management-index-BXw0Lf5c.mjs.map → acorex-modules-assessment-management-index-XdJCIYG3.mjs.map} +1 -1
  16. package/fesm2022/{acorex-modules-assessment-management-preview-question.command-Bm1v6ngB.mjs → acorex-modules-assessment-management-preview-question.command-CO8NfjEb.mjs} +2 -2
  17. package/fesm2022/{acorex-modules-assessment-management-preview-question.command-Bm1v6ngB.mjs.map → acorex-modules-assessment-management-preview-question.command-CO8NfjEb.mjs.map} +1 -1
  18. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-Dja4PbGz.mjs → acorex-modules-assessment-management-preview-questionnaire.command-DSzbtU0e.mjs} +8 -8
  19. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-Dja4PbGz.mjs.map → acorex-modules-assessment-management-preview-questionnaire.command-DSzbtU0e.mjs.map} +1 -1
  20. package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-BbkWs23A.mjs → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-DbvxAUgb.mjs} +2 -2
  21. package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-BbkWs23A.mjs.map → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-DbvxAUgb.mjs.map} +1 -1
  22. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-X8s42nZH.mjs → acorex-modules-assessment-management-question-bank-item.entity-DBfQhSKR.mjs} +2 -2
  23. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-X8s42nZH.mjs.map → acorex-modules-assessment-management-question-bank-item.entity-DBfQhSKR.mjs.map} +1 -1
  24. package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-d8HUAvWp.mjs → acorex-modules-assessment-management-questionnaire-calculation.entity-CL9s20qR.mjs} +2 -2
  25. package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-d8HUAvWp.mjs.map → acorex-modules-assessment-management-questionnaire-calculation.entity-CL9s20qR.mjs.map} +1 -1
  26. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-YUDOSypz.mjs → acorex-modules-assessment-management-questionnaire-viewer-popup.component-CH_cJlSf.mjs} +205 -11
  27. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-CH_cJlSf.mjs.map +1 -0
  28. package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-q3Z4VIiA.mjs → acorex-modules-assessment-management-questionnaire.entity-CrryBMC2.mjs} +40 -3
  29. package/fesm2022/acorex-modules-assessment-management-questionnaire.entity-CrryBMC2.mjs.map +1 -0
  30. package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-4OLYEn35.mjs → acorex-modules-assessment-management-save-questionnaire-questions.command-Dq5VComh.mjs} +2 -2
  31. package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-4OLYEn35.mjs.map → acorex-modules-assessment-management-save-questionnaire-questions.command-Dq5VComh.mjs.map} +1 -1
  32. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-DWEd-ZM_.mjs → acorex-modules-assessment-management-view-session-answers.command-DpppXekm.mjs} +2 -2
  33. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-DWEd-ZM_.mjs.map → acorex-modules-assessment-management-view-session-answers.command-DpppXekm.mjs.map} +1 -1
  34. package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
  35. package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-B1mg2dIR.mjs → acorex-modules-asset-management-acorex-modules-asset-management-BtcY1UQy.mjs} +8 -8
  36. package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-B1mg2dIR.mjs.map → acorex-modules-asset-management-acorex-modules-asset-management-BtcY1UQy.mjs.map} +1 -1
  37. package/fesm2022/{acorex-modules-asset-management-asset-system-assignment.entity-lL1FBlzA.mjs → acorex-modules-asset-management-asset-system-assignment.entity-pKZoxsjk.mjs} +2 -2
  38. package/fesm2022/{acorex-modules-asset-management-asset-system-assignment.entity-lL1FBlzA.mjs.map → acorex-modules-asset-management-asset-system-assignment.entity-pKZoxsjk.mjs.map} +1 -1
  39. package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-DFHVqE7a.mjs → acorex-modules-asset-management-asset-system-type.entity-CXz2G5v1.mjs} +2 -2
  40. package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-DFHVqE7a.mjs.map → acorex-modules-asset-management-asset-system-type.entity-CXz2G5v1.mjs.map} +1 -1
  41. package/fesm2022/{acorex-modules-asset-management-asset-system.entity-DlpOp7Xj.mjs → acorex-modules-asset-management-asset-system.entity-C3zf6WVD.mjs} +13 -14
  42. package/fesm2022/acorex-modules-asset-management-asset-system.entity-C3zf6WVD.mjs.map +1 -0
  43. package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-CIkXc51V.mjs → acorex-modules-asset-management-asset-type-section-component.entity-DTaeNNBW.mjs} +2 -2
  44. package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-CIkXc51V.mjs.map → acorex-modules-asset-management-asset-type-section-component.entity-DTaeNNBW.mjs.map} +1 -1
  45. package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-Ctxh5hGa.mjs → acorex-modules-asset-management-asset-type-section.entity-Bes5h7aJ.mjs} +2 -2
  46. package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-Ctxh5hGa.mjs.map → acorex-modules-asset-management-asset-type-section.entity-Bes5h7aJ.mjs.map} +1 -1
  47. package/fesm2022/{acorex-modules-asset-management-asset-type.entity-CN6K0Uw3.mjs → acorex-modules-asset-management-asset-type.entity-Ch8h0sph.mjs} +21 -22
  48. package/fesm2022/acorex-modules-asset-management-asset-type.entity-Ch8h0sph.mjs.map +1 -0
  49. package/fesm2022/{acorex-modules-asset-management-asset.entity-2XZut6JS.mjs → acorex-modules-asset-management-asset.entity-DJ-A6lx1.mjs} +26 -26
  50. package/fesm2022/acorex-modules-asset-management-asset.entity-DJ-A6lx1.mjs.map +1 -0
  51. package/fesm2022/acorex-modules-asset-management.mjs +1 -1
  52. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-CGiDe3e-.mjs → acorex-modules-auth-acorex-modules-auth-NPUjHz-F.mjs} +13 -13
  53. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-CGiDe3e-.mjs.map → acorex-modules-auth-acorex-modules-auth-NPUjHz-F.mjs.map} +1 -1
  54. package/fesm2022/{acorex-modules-auth-app-chooser.component-Dt_2eXel.mjs → acorex-modules-auth-app-chooser.component-h61xNtRT.mjs} +2 -2
  55. package/fesm2022/{acorex-modules-auth-app-chooser.component-Dt_2eXel.mjs.map → acorex-modules-auth-app-chooser.component-h61xNtRT.mjs.map} +1 -1
  56. package/fesm2022/{acorex-modules-auth-login.module-Bl8pAhHc.mjs → acorex-modules-auth-login.module-DF5AHqYe.mjs} +4 -4
  57. package/fesm2022/{acorex-modules-auth-login.module-Bl8pAhHc.mjs.map → acorex-modules-auth-login.module-DF5AHqYe.mjs.map} +1 -1
  58. package/fesm2022/{acorex-modules-auth-master.layout-B8GSev0J.mjs → acorex-modules-auth-master.layout-00ZTMhc3.mjs} +2 -2
  59. package/fesm2022/{acorex-modules-auth-master.layout-B8GSev0J.mjs.map → acorex-modules-auth-master.layout-00ZTMhc3.mjs.map} +1 -1
  60. package/fesm2022/{acorex-modules-auth-oauth-callback.component-DleQ24IP.mjs → acorex-modules-auth-oauth-callback.component-Ce5Fw8Qd.mjs} +2 -2
  61. package/fesm2022/{acorex-modules-auth-oauth-callback.component-DleQ24IP.mjs.map → acorex-modules-auth-oauth-callback.component-Ce5Fw8Qd.mjs.map} +1 -1
  62. package/fesm2022/{acorex-modules-auth-password.component-D6ALMoO4.mjs → acorex-modules-auth-password.component-CU0AY-Ia.mjs} +2 -2
  63. package/fesm2022/{acorex-modules-auth-password.component-D6ALMoO4.mjs.map → acorex-modules-auth-password.component-CU0AY-Ia.mjs.map} +1 -1
  64. package/fesm2022/{acorex-modules-auth-password.component-C1GbARlM.mjs → acorex-modules-auth-password.component-DQYCm8wg.mjs} +2 -2
  65. package/fesm2022/{acorex-modules-auth-password.component-C1GbARlM.mjs.map → acorex-modules-auth-password.component-DQYCm8wg.mjs.map} +1 -1
  66. package/fesm2022/{acorex-modules-auth-routes-FDp1SEZA.mjs → acorex-modules-auth-routes-CM4fRaWb.mjs} +2 -2
  67. package/fesm2022/{acorex-modules-auth-routes-FDp1SEZA.mjs.map → acorex-modules-auth-routes-CM4fRaWb.mjs.map} +1 -1
  68. package/fesm2022/{acorex-modules-auth-settings.provider-CN7Lb38l.mjs → acorex-modules-auth-settings.provider-C_3D-9ia.mjs} +2 -2
  69. package/fesm2022/acorex-modules-auth-settings.provider-C_3D-9ia.mjs.map +1 -0
  70. package/fesm2022/{acorex-modules-auth-tenant-chooser.component-o55sauLG.mjs → acorex-modules-auth-tenant-chooser.component-BBztdcvq.mjs} +2 -2
  71. package/fesm2022/{acorex-modules-auth-tenant-chooser.component-o55sauLG.mjs.map → acorex-modules-auth-tenant-chooser.component-BBztdcvq.mjs.map} +1 -1
  72. package/fesm2022/{acorex-modules-auth-two-factor.module-CVrYPw5D.mjs → acorex-modules-auth-two-factor.module-C9AafF86.mjs} +2 -2
  73. package/fesm2022/{acorex-modules-auth-two-factor.module-CVrYPw5D.mjs.map → acorex-modules-auth-two-factor.module-C9AafF86.mjs.map} +1 -1
  74. package/fesm2022/{acorex-modules-auth-user-sessions.component-BVglZAnc.mjs → acorex-modules-auth-user-sessions.component-Qw2sgsEe.mjs} +2 -2
  75. package/fesm2022/{acorex-modules-auth-user-sessions.component-BVglZAnc.mjs.map → acorex-modules-auth-user-sessions.component-Qw2sgsEe.mjs.map} +1 -1
  76. package/fesm2022/acorex-modules-auth.mjs +1 -1
  77. package/fesm2022/acorex-modules-common.mjs +8 -5
  78. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  79. package/fesm2022/{acorex-modules-conversation-acorex-modules-conversation-ny5TQlkp.mjs → acorex-modules-conversation-acorex-modules-conversation-Bnjyq-wp.mjs} +1010 -164
  80. package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-Bnjyq-wp.mjs.map +1 -0
  81. package/fesm2022/{acorex-modules-conversation-assist-delegated-agent-detail-popup.component-7O6som8z.mjs → acorex-modules-conversation-assist-delegated-agent-detail-popup.component-Df5LmYZI.mjs} +7 -6
  82. package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-Df5LmYZI.mjs.map +1 -0
  83. package/fesm2022/{acorex-modules-conversation-comments-page.component-Dm7U0ndQ.mjs → acorex-modules-conversation-comments-page.component-BXI4smIr.mjs} +2 -2
  84. package/fesm2022/{acorex-modules-conversation-comments-page.component-Dm7U0ndQ.mjs.map → acorex-modules-conversation-comments-page.component-BXI4smIr.mjs.map} +1 -1
  85. package/fesm2022/acorex-modules-conversation-send-assist-chat-message.command-B5qJnpCK.mjs +90 -0
  86. package/fesm2022/acorex-modules-conversation-send-assist-chat-message.command-B5qJnpCK.mjs.map +1 -0
  87. package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-BLYoudtN.mjs → acorex-modules-conversation-start-assist-chat.command-DI3LAaDF.mjs} +2 -2
  88. package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-BLYoudtN.mjs.map → acorex-modules-conversation-start-assist-chat.command-DI3LAaDF.mjs.map} +1 -1
  89. package/fesm2022/acorex-modules-conversation.mjs +1 -1
  90. package/fesm2022/acorex-modules-data-management.mjs +5 -3
  91. package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
  92. package/fesm2022/{acorex-modules-document-management-drive-choose.component-BxQxZBca.mjs → acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs} +4 -4
  93. package/fesm2022/{acorex-modules-document-management-drive-choose.component-BxQxZBca.mjs.map → acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs.map} +1 -1
  94. package/fesm2022/acorex-modules-document-management.mjs +98 -24
  95. package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
  96. package/fesm2022/acorex-modules-form-template-management.mjs +53 -61
  97. package/fesm2022/acorex-modules-form-template-management.mjs.map +1 -1
  98. package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-B37ZqEql.mjs → acorex-modules-human-capital-management-acorex-modules-human-capital-management-XhV2JQXs.mjs} +23 -21
  99. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-XhV2JQXs.mjs.map +1 -0
  100. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-Bf8iPUE-.mjs → acorex-modules-human-capital-management-approve-leave-request.command-Cre30Kp7.mjs} +2 -2
  101. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-Bf8iPUE-.mjs.map → acorex-modules-human-capital-management-approve-leave-request.command-Cre30Kp7.mjs.map} +1 -1
  102. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-DqX9OAq4.mjs → acorex-modules-human-capital-management-assign-position-assignment.command-NYgddiaD.mjs} +2 -2
  103. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-DqX9OAq4.mjs.map → acorex-modules-human-capital-management-assign-position-assignment.command-NYgddiaD.mjs.map} +1 -1
  104. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-DQG0Al0X.mjs → acorex-modules-human-capital-management-cancel-leave-request.command-DPh-KQgN.mjs} +2 -2
  105. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-DQG0Al0X.mjs.map → acorex-modules-human-capital-management-cancel-leave-request.command-DPh-KQgN.mjs.map} +1 -1
  106. package/fesm2022/{acorex-modules-human-capital-management-employee-lifecycle-process.entity-DSsgKG8S.mjs → acorex-modules-human-capital-management-employee-lifecycle-process.entity-LX68KORg.mjs} +2 -2
  107. package/fesm2022/{acorex-modules-human-capital-management-employee-lifecycle-process.entity-DSsgKG8S.mjs.map → acorex-modules-human-capital-management-employee-lifecycle-process.entity-LX68KORg.mjs.map} +1 -1
  108. package/fesm2022/{acorex-modules-human-capital-management-employee.entity-C8PaZEDs.mjs → acorex-modules-human-capital-management-employee.entity-znCbbQUd.mjs} +2 -2
  109. package/fesm2022/{acorex-modules-human-capital-management-employee.entity-C8PaZEDs.mjs.map → acorex-modules-human-capital-management-employee.entity-znCbbQUd.mjs.map} +1 -1
  110. package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-DhqHdESk.mjs → acorex-modules-human-capital-management-employment-type.entity-DUNB3zAB.mjs} +2 -2
  111. package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-DhqHdESk.mjs.map → acorex-modules-human-capital-management-employment-type.entity-DUNB3zAB.mjs.map} +1 -1
  112. package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-CPdV6kiR.mjs → acorex-modules-human-capital-management-leave-request.entity-JyFrrCGE.mjs} +2 -2
  113. package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-CPdV6kiR.mjs.map → acorex-modules-human-capital-management-leave-request.entity-JyFrrCGE.mjs.map} +1 -1
  114. package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-D3iarVMG.mjs → acorex-modules-human-capital-management-leave-type.entity-B61MiEPu.mjs} +2 -2
  115. package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-D3iarVMG.mjs.map → acorex-modules-human-capital-management-leave-type.entity-B61MiEPu.mjs.map} +1 -1
  116. package/fesm2022/{acorex-modules-human-capital-management-lifecycle-process-type.entity-EazvPSR6.mjs → acorex-modules-human-capital-management-lifecycle-process-type.entity-DJqo2kTG.mjs} +9 -11
  117. package/fesm2022/acorex-modules-human-capital-management-lifecycle-process-type.entity-DJqo2kTG.mjs.map +1 -0
  118. package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-mROyAoz-.mjs → acorex-modules-human-capital-management-position-assignment.entity-CKCC6bKg.mjs} +2 -2
  119. package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-mROyAoz-.mjs.map → acorex-modules-human-capital-management-position-assignment.entity-CKCC6bKg.mjs.map} +1 -1
  120. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-Bq7OtST6.mjs → acorex-modules-human-capital-management-reject-leave-request.command-Blv08UQZ.mjs} +2 -2
  121. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-Bq7OtST6.mjs.map → acorex-modules-human-capital-management-reject-leave-request.command-Blv08UQZ.mjs.map} +1 -1
  122. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-BpklMLve.mjs → acorex-modules-human-capital-management-revoke-position-assignment.command-lgEAbxYH.mjs} +2 -2
  123. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-BpklMLve.mjs.map → acorex-modules-human-capital-management-revoke-position-assignment.command-lgEAbxYH.mjs.map} +1 -1
  124. package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
  125. package/fesm2022/acorex-modules-locale-management.mjs +1 -1
  126. package/fesm2022/acorex-modules-locale-management.mjs.map +1 -1
  127. package/fesm2022/{acorex-modules-maintenance-management-acorex-modules-maintenance-management-coPYjl8-.mjs → acorex-modules-maintenance-management-acorex-modules-maintenance-management-DiM2aFgg.mjs} +304 -206
  128. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-DiM2aFgg.mjs.map +1 -0
  129. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-BdnnavfB.mjs → acorex-modules-maintenance-management-failure-effect.entity-BCMeHmxS.mjs} +2 -2
  130. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-BdnnavfB.mjs.map → acorex-modules-maintenance-management-failure-effect.entity-BCMeHmxS.mjs.map} +1 -1
  131. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-tlcqWco6.mjs → acorex-modules-maintenance-management-failure-mode-asset-type.entity-ByBoVQ8D.mjs} +2 -2
  132. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-tlcqWco6.mjs.map → acorex-modules-maintenance-management-failure-mode-asset-type.entity-ByBoVQ8D.mjs.map} +1 -1
  133. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-DivWl32L.mjs → acorex-modules-maintenance-management-failure-mode-mechanism.entity-BJs4KhkU.mjs} +2 -2
  134. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-DivWl32L.mjs.map → acorex-modules-maintenance-management-failure-mode-mechanism.entity-BJs4KhkU.mjs.map} +1 -1
  135. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-9FiLeySZ.mjs → acorex-modules-maintenance-management-failure-mode-solution.entity-rw24sQxb.mjs} +2 -2
  136. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-9FiLeySZ.mjs.map → acorex-modules-maintenance-management-failure-mode-solution.entity-rw24sQxb.mjs.map} +1 -1
  137. package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-3cq1KeYM.mjs → acorex-modules-maintenance-management-failure-register-cause.entity-C_6sjW8z.mjs} +2 -2
  138. package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-3cq1KeYM.mjs.map → acorex-modules-maintenance-management-failure-register-cause.entity-C_6sjW8z.mjs.map} +1 -1
  139. package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-CaVb6rDn.mjs → acorex-modules-maintenance-management-failure-register-effect.entity-DCIAzSYQ.mjs} +2 -2
  140. package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-CaVb6rDn.mjs.map → acorex-modules-maintenance-management-failure-register-effect.entity-DCIAzSYQ.mjs.map} +1 -1
  141. package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-C2UKW63M.mjs → acorex-modules-maintenance-management-failure-register-mechanism.entity-DlXr6A4i.mjs} +2 -2
  142. package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-C2UKW63M.mjs.map → acorex-modules-maintenance-management-failure-register-mechanism.entity-DlXr6A4i.mjs.map} +1 -1
  143. package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-KghFLCIJ.mjs → acorex-modules-maintenance-management-failure-register.entity-C4J3um7j.mjs} +2 -2
  144. package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-KghFLCIJ.mjs.map → acorex-modules-maintenance-management-failure-register.entity-C4J3um7j.mjs.map} +1 -1
  145. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BebswR7S.mjs → acorex-modules-maintenance-management-failure-severity.entity-C-spQtYx.mjs} +2 -2
  146. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BebswR7S.mjs.map → acorex-modules-maintenance-management-failure-severity.entity-C-spQtYx.mjs.map} +1 -1
  147. package/fesm2022/{acorex-modules-maintenance-management-maintenance-template.entity-1V4swUZ4.mjs → acorex-modules-maintenance-management-maintenance-template.entity-Huahnjhd.mjs} +100 -178
  148. package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-Huahnjhd.mjs.map +1 -0
  149. package/fesm2022/{acorex-modules-maintenance-management-work-order-list-command-3hlrAtIr.mjs → acorex-modules-maintenance-management-work-order-list-command-1YsWctqu.mjs} +2 -2
  150. package/fesm2022/{acorex-modules-maintenance-management-work-order-list-command-3hlrAtIr.mjs.map → acorex-modules-maintenance-management-work-order-list-command-1YsWctqu.mjs.map} +1 -1
  151. package/fesm2022/acorex-modules-maintenance-management.mjs +1 -1
  152. package/fesm2022/acorex-modules-notification-management.mjs +1 -1
  153. package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
  154. package/fesm2022/acorex-modules-order-management-settings.provider-BFOghuIS.mjs +58 -0
  155. package/fesm2022/acorex-modules-order-management-settings.provider-BFOghuIS.mjs.map +1 -0
  156. package/fesm2022/acorex-modules-order-management.mjs +2 -2
  157. package/fesm2022/{acorex-modules-organization-management-acorex-modules-organization-management-CGzZcKEy.mjs → acorex-modules-organization-management-acorex-modules-organization-management-BZtWfgmH.mjs} +40 -120
  158. package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-BZtWfgmH.mjs.map +1 -0
  159. package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-BEJyfR3P.mjs → acorex-modules-organization-management-add-business-unit-to-business-unit.command-C-yO5On4.mjs} +2 -2
  160. package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-BEJyfR3P.mjs.map → acorex-modules-organization-management-add-business-unit-to-business-unit.command-C-yO5On4.mjs.map} +1 -1
  161. package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-DKgxg9q5.mjs → acorex-modules-organization-management-add-position-to-business-unit.command-BL5eWJ56.mjs} +2 -2
  162. package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-DKgxg9q5.mjs.map → acorex-modules-organization-management-add-position-to-business-unit.command-BL5eWJ56.mjs.map} +1 -1
  163. package/fesm2022/{acorex-modules-organization-management-add-team-to-business-unit.command-DJJT7BXT.mjs → acorex-modules-organization-management-add-team-to-business-unit.command-l4N6g0Hc.mjs} +2 -2
  164. package/fesm2022/{acorex-modules-organization-management-add-team-to-business-unit.command-DJJT7BXT.mjs.map → acorex-modules-organization-management-add-team-to-business-unit.command-l4N6g0Hc.mjs.map} +1 -1
  165. package/fesm2022/{acorex-modules-organization-management-business-unit.entity-BAp38sib.mjs → acorex-modules-organization-management-business-unit.entity-CONTwX52.mjs} +2 -2
  166. package/fesm2022/{acorex-modules-organization-management-business-unit.entity-BAp38sib.mjs.map → acorex-modules-organization-management-business-unit.entity-CONTwX52.mjs.map} +1 -1
  167. package/fesm2022/{acorex-modules-organization-management-chart.entity-WfmpWj8R.mjs → acorex-modules-organization-management-chart.entity-DeKPBfgx.mjs} +2 -2
  168. package/fesm2022/{acorex-modules-organization-management-chart.entity-WfmpWj8R.mjs.map → acorex-modules-organization-management-chart.entity-DeKPBfgx.mjs.map} +1 -1
  169. package/fesm2022/{acorex-modules-organization-management-company.entity-BUVLrwjq.mjs → acorex-modules-organization-management-company.entity-BAlz8AfD.mjs} +2 -2
  170. package/fesm2022/{acorex-modules-organization-management-company.entity-BUVLrwjq.mjs.map → acorex-modules-organization-management-company.entity-BAlz8AfD.mjs.map} +1 -1
  171. package/fesm2022/{acorex-modules-organization-management-entity.provider-DH3eUGTu.mjs → acorex-modules-organization-management-entity.provider-DjPSiqcX.mjs} +15 -15
  172. package/fesm2022/{acorex-modules-organization-management-entity.provider-DH3eUGTu.mjs.map → acorex-modules-organization-management-entity.provider-DjPSiqcX.mjs.map} +1 -1
  173. package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-DuScrBze.mjs → acorex-modules-organization-management-feature-definition.provider-BLmayeSc.mjs} +2 -2
  174. package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-DuScrBze.mjs.map → acorex-modules-organization-management-feature-definition.provider-BLmayeSc.mjs.map} +1 -1
  175. package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-D-J9JCsU.mjs → acorex-modules-organization-management-job-definition-pages-component.provider-HBi-EMRE.mjs} +3 -3
  176. package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-D-J9JCsU.mjs.map → acorex-modules-organization-management-job-definition-pages-component.provider-HBi-EMRE.mjs.map} +1 -1
  177. package/fesm2022/{acorex-modules-organization-management-job-definition-responsibilities-page.component-Dsy5rFGw.mjs → acorex-modules-organization-management-job-definition-responsibilities-page.component-CtIfsZ6x.mjs} +3 -3
  178. package/fesm2022/{acorex-modules-organization-management-job-definition-responsibilities-page.component-Dsy5rFGw.mjs.map → acorex-modules-organization-management-job-definition-responsibilities-page.component-CtIfsZ6x.mjs.map} +1 -1
  179. package/fesm2022/{acorex-modules-organization-management-job-definition-skills-page.component-B73wLPby.mjs → acorex-modules-organization-management-job-definition-skills-page.component-C1vCQayM.mjs} +2 -2
  180. package/fesm2022/{acorex-modules-organization-management-job-definition-skills-page.component-B73wLPby.mjs.map → acorex-modules-organization-management-job-definition-skills-page.component-C1vCQayM.mjs.map} +1 -1
  181. package/fesm2022/{acorex-modules-organization-management-job-definition.entity-B7mWKYqb.mjs → acorex-modules-organization-management-job-definition.entity-Db5li0zL.mjs} +2 -2
  182. package/fesm2022/{acorex-modules-organization-management-job-definition.entity-B7mWKYqb.mjs.map → acorex-modules-organization-management-job-definition.entity-Db5li0zL.mjs.map} +1 -1
  183. package/fesm2022/{acorex-modules-organization-management-job-level.datasource-DibRoKXR.mjs → acorex-modules-organization-management-job-level.datasource-BTRKW7nq.mjs} +2 -2
  184. package/fesm2022/{acorex-modules-organization-management-job-level.datasource-DibRoKXR.mjs.map → acorex-modules-organization-management-job-level.datasource-BTRKW7nq.mjs.map} +1 -1
  185. package/fesm2022/{acorex-modules-organization-management-job-level.entity-C_MzeTw5.mjs → acorex-modules-organization-management-job-level.entity-Cn-91_r8.mjs} +2 -2
  186. package/fesm2022/{acorex-modules-organization-management-job-level.entity-C_MzeTw5.mjs.map → acorex-modules-organization-management-job-level.entity-Cn-91_r8.mjs.map} +1 -1
  187. package/fesm2022/{acorex-modules-organization-management-menu.provider-CQeJINzl.mjs → acorex-modules-organization-management-menu.provider-CVmV-hY5.mjs} +2 -2
  188. package/fesm2022/{acorex-modules-organization-management-menu.provider-CQeJINzl.mjs.map → acorex-modules-organization-management-menu.provider-CVmV-hY5.mjs.map} +1 -1
  189. package/fesm2022/{acorex-modules-organization-management-org-chart-default-node-contribution.provider-D3hCHSr_.mjs → acorex-modules-organization-management-org-chart-default-node-contribution.provider-bdtNexEf.mjs} +2 -2
  190. package/fesm2022/{acorex-modules-organization-management-org-chart-default-node-contribution.provider-D3hCHSr_.mjs.map → acorex-modules-organization-management-org-chart-default-node-contribution.provider-bdtNexEf.mjs.map} +1 -1
  191. package/fesm2022/{acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-Bv0I-45L.mjs → acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-B0aaFv5p.mjs} +2 -2
  192. package/fesm2022/{acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-Bv0I-45L.mjs.map → acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-B0aaFv5p.mjs.map} +1 -1
  193. package/fesm2022/{acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-DbfYza8q.mjs → acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-Xe4nhY3j.mjs} +2 -2
  194. package/fesm2022/{acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-DbfYza8q.mjs.map → acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-Xe4nhY3j.mjs.map} +1 -1
  195. package/fesm2022/{acorex-modules-organization-management-org-chart-ux-node-contribution.provider-C9APxguL.mjs → acorex-modules-organization-management-org-chart-ux-node-contribution.provider-CTprHwCi.mjs} +2 -2
  196. package/fesm2022/{acorex-modules-organization-management-org-chart-ux-node-contribution.provider-C9APxguL.mjs.map → acorex-modules-organization-management-org-chart-ux-node-contribution.provider-CTprHwCi.mjs.map} +1 -1
  197. package/fesm2022/{acorex-modules-organization-management-org-chart.page-BcHO5kKP.mjs → acorex-modules-organization-management-org-chart.page-ChXY8ncD.mjs} +133 -12
  198. package/fesm2022/acorex-modules-organization-management-org-chart.page-ChXY8ncD.mjs.map +1 -0
  199. package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-BcIRJpBt.mjs → acorex-modules-organization-management-permission-definition.provider-8t2vBgtp.mjs} +2 -2
  200. package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-BcIRJpBt.mjs.map → acorex-modules-organization-management-permission-definition.provider-8t2vBgtp.mjs.map} +1 -1
  201. package/fesm2022/{acorex-modules-organization-management-position.entity-DBOpLtSI.mjs → acorex-modules-organization-management-position.entity-BVWbTeks.mjs} +2 -2
  202. package/fesm2022/{acorex-modules-organization-management-position.entity-DBOpLtSI.mjs.map → acorex-modules-organization-management-position.entity-BVWbTeks.mjs.map} +1 -1
  203. package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-TqYgfnsy.mjs → acorex-modules-organization-management-remove-position-from-business-unit.command-DWzFncr1.mjs} +2 -2
  204. package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-TqYgfnsy.mjs.map → acorex-modules-organization-management-remove-position-from-business-unit.command-DWzFncr1.mjs.map} +1 -1
  205. package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-BJ2gn0-A.mjs → acorex-modules-organization-management-replace-position-assignee.command-CNa-CZOv.mjs} +2 -2
  206. package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-BJ2gn0-A.mjs.map → acorex-modules-organization-management-replace-position-assignee.command-CNa-CZOv.mjs.map} +1 -1
  207. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CZdMLIL-.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CTSCcyFv.mjs} +2 -2
  208. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CZdMLIL-.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CTSCcyFv.mjs.map} +1 -1
  209. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-BBo97rDN.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-C82TQFS-.mjs} +2 -2
  210. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-BBo97rDN.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-C82TQFS-.mjs.map} +1 -1
  211. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-D9oH_Fbb.mjs → acorex-modules-organization-management-responsibilities-matrix.component-DjVuISfE.mjs} +2 -2
  212. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-D9oH_Fbb.mjs.map → acorex-modules-organization-management-responsibilities-matrix.component-DjVuISfE.mjs.map} +1 -1
  213. package/fesm2022/{acorex-modules-organization-management-responsibility-level.entity-D6IG9Zc7.mjs → acorex-modules-organization-management-responsibility-level.entity-BlENDhF6.mjs} +2 -2
  214. package/fesm2022/{acorex-modules-organization-management-responsibility-level.entity-D6IG9Zc7.mjs.map → acorex-modules-organization-management-responsibility-level.entity-BlENDhF6.mjs.map} +1 -1
  215. package/fesm2022/{acorex-modules-organization-management-responsibility.entity-BosNxYjW.mjs → acorex-modules-organization-management-responsibility.entity-DamPTQMp.mjs} +2 -2
  216. package/fesm2022/{acorex-modules-organization-management-responsibility.entity-BosNxYjW.mjs.map → acorex-modules-organization-management-responsibility.entity-DamPTQMp.mjs.map} +1 -1
  217. package/fesm2022/{acorex-modules-organization-management-settings.provider-CL9C9UXA.mjs → acorex-modules-organization-management-settings.provider-CtQo6YHj.mjs} +3 -3
  218. package/fesm2022/acorex-modules-organization-management-settings.provider-CtQo6YHj.mjs.map +1 -0
  219. package/fesm2022/{acorex-modules-organization-management-team-business-unit.entity-CYFGTcHe.mjs → acorex-modules-organization-management-team-business-unit.entity-BfvqQb1K.mjs} +2 -2
  220. package/fesm2022/{acorex-modules-organization-management-team-business-unit.entity-CYFGTcHe.mjs.map → acorex-modules-organization-management-team-business-unit.entity-BfvqQb1K.mjs.map} +1 -1
  221. package/fesm2022/{acorex-modules-organization-management-team-member-role.entity-B5vNDne0.mjs → acorex-modules-organization-management-team-member-role.entity-wWoB56Il.mjs} +2 -2
  222. package/fesm2022/{acorex-modules-organization-management-team-member-role.entity-B5vNDne0.mjs.map → acorex-modules-organization-management-team-member-role.entity-wWoB56Il.mjs.map} +1 -1
  223. package/fesm2022/{acorex-modules-organization-management-team-member.entity-DsKuxCRB.mjs → acorex-modules-organization-management-team-member.entity-COGrDN_G.mjs} +2 -2
  224. package/fesm2022/{acorex-modules-organization-management-team-member.entity-DsKuxCRB.mjs.map → acorex-modules-organization-management-team-member.entity-COGrDN_G.mjs.map} +1 -1
  225. package/fesm2022/{acorex-modules-organization-management-team.entity-Cg30cho_.mjs → acorex-modules-organization-management-team.entity-DC_rqp9e.mjs} +2 -2
  226. package/fesm2022/{acorex-modules-organization-management-team.entity-Cg30cho_.mjs.map → acorex-modules-organization-management-team.entity-DC_rqp9e.mjs.map} +1 -1
  227. package/fesm2022/acorex-modules-organization-management.mjs +1 -1
  228. package/fesm2022/{acorex-modules-platform-dev-tools-settings.provider-DKmgBUYt.mjs → acorex-modules-platform-dev-tools-settings.provider-BIVP27kT.mjs} +2 -2
  229. package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-BIVP27kT.mjs.map +1 -0
  230. package/fesm2022/acorex-modules-platform-dev-tools.mjs +2 -2
  231. package/fesm2022/{acorex-modules-platform-management-acorex-modules-platform-management-DkOzj2Oy.mjs → acorex-modules-platform-management-acorex-modules-platform-management-5DJoQkx2.mjs} +1919 -4
  232. package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-5DJoQkx2.mjs.map +1 -0
  233. package/fesm2022/{acorex-modules-platform-management-menu-list.component-agWZWchQ.mjs → acorex-modules-platform-management-menu-list.component-C3WBYbOt.mjs} +4 -4
  234. package/fesm2022/{acorex-modules-platform-management-menu-list.component-agWZWchQ.mjs.map → acorex-modules-platform-management-menu-list.component-C3WBYbOt.mjs.map} +1 -1
  235. package/fesm2022/acorex-modules-platform-management.mjs +1 -1
  236. package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-oArHHeSx.mjs → acorex-modules-settings-management-acorex-modules-settings-management-Di6Sxtq3.mjs} +5 -5
  237. package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-oArHHeSx.mjs.map → acorex-modules-settings-management-acorex-modules-settings-management-Di6Sxtq3.mjs.map} +1 -1
  238. package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-BsFyZ-gS.mjs → acorex-modules-settings-management-permission-definition.provider-Bml5VZUT.mjs} +2 -2
  239. package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-BsFyZ-gS.mjs.map → acorex-modules-settings-management-permission-definition.provider-Bml5VZUT.mjs.map} +1 -1
  240. package/fesm2022/{acorex-modules-settings-management-setting-page.component-BftWms4f.mjs → acorex-modules-settings-management-setting-page.component-lN-7sTpD.mjs} +4 -4
  241. package/fesm2022/{acorex-modules-settings-management-setting-page.component-BftWms4f.mjs.map → acorex-modules-settings-management-setting-page.component-lN-7sTpD.mjs.map} +1 -1
  242. package/fesm2022/{acorex-modules-settings-management-setting-view.component-paKdiSEr.mjs → acorex-modules-settings-management-setting-view.component-D17G4RNQ.mjs} +15 -28
  243. package/fesm2022/acorex-modules-settings-management-setting-view.component-D17G4RNQ.mjs.map +1 -0
  244. package/fesm2022/acorex-modules-settings-management.mjs +1 -1
  245. package/fesm2022/acorex-modules-system-insight.mjs +1 -1
  246. package/fesm2022/acorex-modules-system-insight.mjs.map +1 -1
  247. package/fesm2022/{acorex-modules-task-management-acorex-modules-task-management-BL2IOcx3.mjs → acorex-modules-task-management-acorex-modules-task-management-LQn5gZ6p.mjs} +680 -10
  248. package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-LQn5gZ6p.mjs.map +1 -0
  249. package/fesm2022/{acorex-modules-task-management-task-board.page-DUIHtqnr.mjs → acorex-modules-task-management-task-board.page-BokG-G6Z.mjs} +204 -591
  250. package/fesm2022/acorex-modules-task-management-task-board.page-BokG-G6Z.mjs.map +1 -0
  251. package/fesm2022/acorex-modules-task-management.mjs +1 -1
  252. package/fesm2022/acorex-modules-tenant-management.mjs +1 -1
  253. package/fesm2022/acorex-modules-tenant-management.mjs.map +1 -1
  254. package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-CYyr1kQk.mjs → acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-OLbCD-7P.mjs} +4 -4
  255. package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-CYyr1kQk.mjs.map → acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-OLbCD-7P.mjs.map} +1 -1
  256. package/fesm2022/{acorex-modules-workflow-management-index-CHySddpP.mjs → acorex-modules-workflow-management-index-34UZrsxw.mjs} +2 -2
  257. package/fesm2022/{acorex-modules-workflow-management-index-CHySddpP.mjs.map → acorex-modules-workflow-management-index-34UZrsxw.mjs.map} +1 -1
  258. package/fesm2022/acorex-modules-workflow-management-index-BxqOP8AA.mjs +1207 -0
  259. package/fesm2022/acorex-modules-workflow-management-index-BxqOP8AA.mjs.map +1 -0
  260. package/fesm2022/{acorex-modules-workflow-management-index-DC_9M9dk.mjs → acorex-modules-workflow-management-index-Eh5DDK-V.mjs} +3 -3
  261. package/fesm2022/{acorex-modules-workflow-management-index-DC_9M9dk.mjs.map → acorex-modules-workflow-management-index-Eh5DDK-V.mjs.map} +1 -1
  262. package/fesm2022/{acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs → acorex-modules-workflow-management-save-workflow-definition-activities.command-CGNwslcn.mjs} +10 -5
  263. package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-CGNwslcn.mjs.map +1 -0
  264. package/fesm2022/{acorex-modules-workflow-management-workflow-definition.entity-CjQQpjdB.mjs → acorex-modules-workflow-management-workflow-definition.entity-DISpkWE4.mjs} +3 -7
  265. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-DISpkWE4.mjs.map +1 -0
  266. package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-BnKT3Wgh.mjs → acorex-modules-workflow-management-workflow-instance.entity-B_V3uMSI.mjs} +2 -2
  267. package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-BnKT3Wgh.mjs.map → acorex-modules-workflow-management-workflow-instance.entity-B_V3uMSI.mjs.map} +1 -1
  268. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-DMszilef.mjs +356 -0
  269. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-DMszilef.mjs.map +1 -0
  270. package/fesm2022/acorex-modules-workflow-management.mjs +257 -130
  271. package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
  272. package/package.json +2 -2
  273. package/types/acorex-modules-ai-management.d.ts +73 -5
  274. package/types/acorex-modules-assessment-management.d.ts +161 -97
  275. package/types/acorex-modules-asset-management.d.ts +3 -0
  276. package/types/acorex-modules-conversation.d.ts +12 -2
  277. package/types/acorex-modules-human-capital-management.d.ts +6 -6
  278. package/types/acorex-modules-maintenance-management.d.ts +28 -11
  279. package/types/acorex-modules-organization-management.d.ts +1 -27
  280. package/types/acorex-modules-platform-management.d.ts +518 -23
  281. package/types/acorex-modules-task-management.d.ts +100 -4
  282. package/types/acorex-modules-workflow-management.d.ts +53 -5
  283. package/fesm2022/acorex-modules-ai-management-assist.entity-513RdKsz.mjs.map +0 -1
  284. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-BD5oxehv.mjs.map +0 -1
  285. package/fesm2022/acorex-modules-assessment-management-fill-assessment-session.command-BiS7QO_E.mjs.map +0 -1
  286. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-YUDOSypz.mjs.map +0 -1
  287. package/fesm2022/acorex-modules-assessment-management-questionnaire.entity-q3Z4VIiA.mjs.map +0 -1
  288. package/fesm2022/acorex-modules-asset-management-asset-system.entity-DlpOp7Xj.mjs.map +0 -1
  289. package/fesm2022/acorex-modules-asset-management-asset-type.entity-CN6K0Uw3.mjs.map +0 -1
  290. package/fesm2022/acorex-modules-asset-management-asset.entity-2XZut6JS.mjs.map +0 -1
  291. package/fesm2022/acorex-modules-auth-settings.provider-CN7Lb38l.mjs.map +0 -1
  292. package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-ny5TQlkp.mjs.map +0 -1
  293. package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-7O6som8z.mjs.map +0 -1
  294. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-B37ZqEql.mjs.map +0 -1
  295. package/fesm2022/acorex-modules-human-capital-management-lifecycle-process-type.entity-EazvPSR6.mjs.map +0 -1
  296. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-coPYjl8-.mjs.map +0 -1
  297. package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-1V4swUZ4.mjs.map +0 -1
  298. package/fesm2022/acorex-modules-order-management-settings.provider-DF8JQ1PZ.mjs +0 -64
  299. package/fesm2022/acorex-modules-order-management-settings.provider-DF8JQ1PZ.mjs.map +0 -1
  300. package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-CGzZcKEy.mjs.map +0 -1
  301. package/fesm2022/acorex-modules-organization-management-org-chart.page-BcHO5kKP.mjs.map +0 -1
  302. package/fesm2022/acorex-modules-organization-management-settings.provider-CL9C9UXA.mjs.map +0 -1
  303. package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-DKmgBUYt.mjs.map +0 -1
  304. package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-DkOzj2Oy.mjs.map +0 -1
  305. package/fesm2022/acorex-modules-settings-management-setting-view.component-paKdiSEr.mjs.map +0 -1
  306. package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-BL2IOcx3.mjs.map +0 -1
  307. package/fesm2022/acorex-modules-task-management-task-board.page-DUIHtqnr.mjs.map +0 -1
  308. package/fesm2022/acorex-modules-workflow-management-index-jin24dmb.mjs +0 -726
  309. package/fesm2022/acorex-modules-workflow-management-index-jin24dmb.mjs.map +0 -1
  310. package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs.map +0 -1
  311. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-CjQQpjdB.mjs.map +0 -1
@@ -4,29 +4,27 @@ import { AXAccordionModule } from '@acorex/components/accordion';
4
4
  import * as i8 from '@acorex/components/badge';
5
5
  import { AXBadgeModule } from '@acorex/components/badge';
6
6
  import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
7
- import * as i3 from '@acorex/components/button';
7
+ import * as i1$4 from '@acorex/components/button';
8
8
  import { AXButtonComponent, AXButtonModule } from '@acorex/components/button';
9
9
  import { AXCalendarComponent } from '@acorex/components/calendar';
10
10
  import { AXCheckBoxModule } from '@acorex/components/check-box';
11
- import * as i5 from '@acorex/components/decorators';
11
+ import * as i2 from '@acorex/components/decorators';
12
12
  import { AXDecoratorIconComponent, AXDecoratorModule } from '@acorex/components/decorators';
13
- import * as i4 from '@acorex/components/dropdown';
14
- import { AXDropdownModule, AXDropdownPanelComponent } from '@acorex/components/dropdown';
13
+ import { AXDropdownPanelComponent } from '@acorex/components/dropdown';
15
14
  import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
16
15
  import { AXFormFieldComponent, AXFormComponent, AXFormModule } from '@acorex/components/form';
17
16
  import { AXLabelComponent, AXLabelModule } from '@acorex/components/label';
18
17
  import * as i7 from '@acorex/components/loading';
19
18
  import { AXLoadingModule } from '@acorex/components/loading';
20
- import * as i3$1 from '@acorex/components/menu';
19
+ import * as i3 from '@acorex/components/menu';
21
20
  import { AXMenuModule } from '@acorex/components/menu';
22
- import * as i2 from '@acorex/components/popover';
23
21
  import { AXPopoverModule } from '@acorex/components/popover';
24
22
  import * as i10 from '@acorex/components/selection-list';
25
23
  import { AXSelectionListModule } from '@acorex/components/selection-list';
26
24
  import { AXCalendarService } from '@acorex/core/date-time';
27
25
  import { AXLocaleService } from '@acorex/core/locale';
28
- import * as i6 from '@acorex/core/translation';
29
- import { AXTranslatorPipe, AXTranslationModule, AXTranslationService } from '@acorex/core/translation';
26
+ import * as i5 from '@acorex/core/translation';
27
+ import { AXTranslatorPipe, AXTranslationModule } from '@acorex/core/translation';
30
28
  import { AXUnsubscriber } from '@acorex/core/utils';
31
29
  import { AXPPlatformScope, AXPDeviceService } from '@acorex/platform/core';
32
30
  import { AXPStateMessageComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutHeaderComponent } from '@acorex/platform/layout/components';
@@ -39,7 +37,7 @@ import * as i1$3 from '@angular/forms';
39
37
  import { FormsModule } from '@angular/forms';
40
38
  import { Router, ActivatedRoute, NavigationEnd, RouterModule } from '@angular/router';
41
39
  import { filter, startWith } from 'rxjs';
42
- import { A as AXM_TASK_BOARD_ALL_VIEW_MODE_IDS, a as AXMTaskBoardSettings, n as normalizeTaskBoardAssigneeIds, b as normalizeVisibleTaskBoardModesByParts, c as canViewAllTaskAssignees, d as AXPTaskBoardService, R as RootConfig } from './acorex-modules-task-management-acorex-modules-task-management-BL2IOcx3.mjs';
40
+ import { A as AXM_TASK_BOARD_ALL_VIEW_MODE_IDS, a as AXMTaskBoardSettings, n as normalizeTaskBoardAssigneeIds, b as normalizeVisibleTaskBoardModesByParts, c as canViewAllTaskAssignees, d as AXPTaskBoardService, R as RootConfig, e as AXMTaskBoardTaskPopoverOverlayService, T as TASK_BOARD_GRID_ROW_ACTION_COLUMN_WIDTH, f as TASK_BOARD_GRID_ROW_ACTION_ITEMS, g as filterTasksOverlappingRange } from './acorex-modules-task-management-acorex-modules-task-management-LQn5gZ6p.mjs';
43
41
  import { AXFormatPipe } from '@acorex/core/format';
44
42
  import * as i1 from '@acorex/platform/layout/widget-core';
45
43
  import { AXPWidgetCoreModule, AXPWidgetsCatalog } from '@acorex/platform/layout/widget-core';
@@ -657,31 +655,13 @@ function filterTaskBoardMenuByAllowedModes(items, allowed) {
657
655
  class AXMTaskBoardCalendarViewComponent {
658
656
  constructor() {
659
657
  this.vm = inject(AXMTaskBoardViewModel);
660
- this.calendarService = inject(AXCalendarService);
661
658
  this.taskBoardService = inject(AXPTaskBoardService);
662
659
  this.settingService = inject(AXPSettingsService);
663
660
  this.commandService = inject(AXPCommandService);
664
661
  this.schedulerService = inject(AXSchedulerService);
662
+ this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
665
663
  this.destroyRef = inject(DestroyRef);
666
664
  this.schedulerComponent = viewChild(AXSchedulerComponent, ...(ngDevMode ? [{ debugName: "schedulerComponent" }] : /* istanbul ignore next */ []));
667
- this.taskPopover = viewChild.required('taskPopover');
668
- this.selectedTask = signal(null, ...(ngDevMode ? [{ debugName: "selectedTask" }] : /* istanbul ignore next */ []));
669
- this.popoverTarget = signal(null, ...(ngDevMode ? [{ debugName: "popoverTarget" }] : /* istanbul ignore next */ []));
670
- this.taskActions = signal([], ...(ngDevMode ? [{ debugName: "taskActions" }] : /* istanbul ignore next */ []));
671
- this.customComponentType = signal(null, ...(ngDevMode ? [{ debugName: "customComponentType" }] : /* istanbul ignore next */ []));
672
- // Separate primary and secondary actions
673
- this.primaryActions = computed(() => {
674
- return this.taskActions().filter((action) => (action.priority ?? 'secondary') === 'primary');
675
- }, ...(ngDevMode ? [{ debugName: "primaryActions" }] : /* istanbul ignore next */ []));
676
- this.secondaryActions = computed(() => {
677
- return this.taskActions().filter((action) => (action.priority ?? 'secondary') === 'secondary');
678
- }, ...(ngDevMode ? [{ debugName: "secondaryActions" }] : /* istanbul ignore next */ []));
679
- this.customComponentInputs = computed(() => {
680
- const task = this.selectedTask();
681
- if (!task)
682
- return null;
683
- return { task };
684
- }, ...(ngDevMode ? [{ debugName: "customComponentInputs" }] : /* istanbul ignore next */ []));
685
665
  this.resources = input([], ...(ngDevMode ? [{ debugName: "resources" }] : /* istanbul ignore next */ []));
686
666
  this.refreshNonce = input(0, ...(ngDevMode ? [{ debugName: "refreshNonce" }] : /* istanbul ignore next */ []));
687
667
  this.startingDate = input(new Date(), ...(ngDevMode ? [{ debugName: "startingDate" }] : /* istanbul ignore next */ []));
@@ -691,7 +671,6 @@ class AXMTaskBoardCalendarViewComponent {
691
671
  this.weekendDays = signal([0, 6], ...(ngDevMode ? [{ debugName: "weekendDays" }] : /* istanbul ignore next */ []));
692
672
  this.holidays = (range) => {
693
673
  const selectedEventTypeIds = this.vm.selectedCalendarEventTypeIds();
694
- // Pass selected calendar IDs (can be empty array to show no events)
695
674
  return this.taskBoardService.getEvents(range, selectedEventTypeIds);
696
675
  };
697
676
  this.currentSchedulerView = computed(() => this.selectedView() === 'kanban' || this.selectedView() === 'grid'
@@ -708,7 +687,6 @@ class AXMTaskBoardCalendarViewComponent {
708
687
  this.refreshNonce();
709
688
  this.schedulerComponent()?.refresh();
710
689
  }, ...(ngDevMode ? [{ debugName: "refreshNonceEffect" }] : /* istanbul ignore next */ []));
711
- /** Re-renders scheduler when parent date, view, or range length changes. */
712
690
  this.schedulerStateSyncEffect = effect(() => {
713
691
  this.startingDate();
714
692
  this.currentSchedulerView();
@@ -723,69 +701,56 @@ class AXMTaskBoardCalendarViewComponent {
723
701
  });
724
702
  }, ...(ngDevMode ? [{ debugName: "schedulerStateSyncEffect" }] : /* istanbul ignore next */ []));
725
703
  }
726
- // async ngOnInit(): Promise<void> {
727
- // const firstDayOfWeek = await this.settingsService.get(AXPRegionalSetting.FirstDayOfWeek) as unknown as number;
728
- // const weekDays = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
729
- // this.firstDayOfWeek.set(weekDays[firstDayOfWeek] as unknown as AXDayOfWeekName);
730
- // this.weekendDays.set((await this.settingsService.get(AXPRegionalSetting.WeekendDays)) as unknown as number[]);
731
- // }
732
704
  async ngAfterViewInit() {
733
705
  this.taskBoardService.refresh$
734
706
  .pipe(takeUntilDestroyed(this.destroyRef))
735
707
  .subscribe(async (data) => {
736
- const selected = this.selectedTask();
737
- if (!selected?.provider)
708
+ const active = this.taskPopoverOverlay.getActiveTask();
709
+ if (!active?.provider) {
738
710
  return;
739
- if (data.provider && data.provider !== selected.provider)
711
+ }
712
+ if (data.provider && data.provider !== active.provider) {
740
713
  return;
714
+ }
741
715
  await this.refreshPopoverData();
742
716
  });
743
717
  this.taskBoardService.close$
744
718
  .pipe(takeUntilDestroyed(this.destroyRef))
745
719
  .subscribe((data) => {
746
- const selected = this.selectedTask();
747
- if (!selected?.provider)
720
+ const active = this.taskPopoverOverlay.getActiveTask();
721
+ if (!active?.provider) {
748
722
  return;
749
- if (data.provider && data.provider !== selected.provider)
723
+ }
724
+ if (data.provider && data.provider !== active.provider) {
750
725
  return;
751
- this.closePopover();
726
+ }
727
+ this.taskPopoverOverlay.close();
752
728
  });
753
729
  if (this.schedulerComponent()) {
754
730
  this.component.emit(this.schedulerComponent());
755
731
  }
756
732
  }
757
733
  onTaskDrop(event) {
758
- // Check if dropped on the same slot (agenda view)
759
734
  if (event.slot.view === 'agenda' && event.isSameSlotDrop) {
760
735
  return;
761
736
  }
762
- // Use the scheduler service utility to calculate the new appointment data
763
737
  const dropResult = this.schedulerService.calculateAppointmentDropResult(event);
764
- // If dropped on the same slot, no action needed
765
738
  if (dropResult.isSameSlotDrop) {
766
739
  return;
767
740
  }
768
- // Get the original task (before modification)
769
741
  const originalTask = event.appointment;
770
- // Apply the drop result to create an updated task object
771
- // This uses the scheduler's internal utility for consistent date handling
772
742
  const updatedTask = this.schedulerService.applyDropResult({ ...originalTask }, dropResult);
773
- // Persist the change to the backend via taskBoardService
774
743
  this.taskBoardService
775
744
  .updateTaskDateRange(originalTask, {
776
745
  from: dropResult.startDate,
777
746
  end: dropResult.endDate,
778
747
  })
779
748
  .then((persistedTask) => {
780
- // Emit the change event so parent can update its state
781
749
  this.onTaskChanged.emit(persistedTask);
782
- // Refresh the scheduler to reflect the persisted data
783
- // This ensures the scheduler's internal state is synchronized with the backend
784
750
  this.schedulerComponent()?.refresh();
785
751
  })
786
752
  .catch((error) => {
787
753
  console.error('[TaskBoardCalendar] Failed to update task date range:', error);
788
- // Revert the visual change if persistence fails by refreshing from backend
789
754
  this.schedulerComponent()?.refresh();
790
755
  });
791
756
  }
@@ -805,274 +770,109 @@ class AXMTaskBoardCalendarViewComponent {
805
770
  }
806
771
  async onTaskClickHandler(event) {
807
772
  const task = event.appointment;
808
- // Find the appointment container element
809
- let targetElement = event.nativeEvent.currentTarget || event.nativeEvent.target;
810
- // Traverse up to find the appointment container
811
- let element = targetElement;
812
- const maxDepth = 10;
813
- let depth = 0;
814
- while (element && element !== document.body && depth < maxDepth) {
815
- depth++;
816
- const isAppointment = element.classList?.contains('dx-scheduler-appointment') ||
817
- element.classList?.contains('ax-scheduler-appointment') ||
818
- element.hasAttribute('data-appointment-id');
819
- if (isAppointment) {
820
- targetElement = element;
821
- break;
822
- }
823
- const parent = element.parentElement;
824
- if (parent) {
825
- const isParentAppointment = parent.classList?.contains('dx-scheduler-appointment') ||
826
- parent.classList?.contains('ax-scheduler-appointment');
827
- if (isParentAppointment) {
828
- targetElement = parent;
829
- break;
830
- }
831
- }
832
- element = element.parentElement;
773
+ const anchor = this.resolveAppointmentAnchor(event);
774
+ if (anchor) {
775
+ await this.taskPopoverOverlay.open({
776
+ task,
777
+ anchor,
778
+ offsetX: 12,
779
+ offsetY: 12,
780
+ adaptivityEnabled: true,
781
+ });
833
782
  }
834
- // Set the selected task and target element
835
- this.selectedTask.set(task);
836
- this.popoverTarget.set(targetElement);
837
- // Check if provider has a custom component
838
- await this.loadCustomComponent(task);
839
- // Load actions for the task
840
- await this.loadTaskActions(task);
841
- if (this.taskPopover() && targetElement) {
842
- this.taskPopover().target = targetElement;
843
- this.taskPopover().open();
844
- }
845
- // Still emit the event for backward compatibility
846
783
  this.onTaskClick.emit(task);
847
784
  }
848
- async loadTaskActions(task) {
849
- try {
850
- const providerName = task.provider;
851
- if (!providerName) {
852
- this.taskActions.set([]);
853
- return;
854
- }
855
- const provider = this.taskBoardService.getProvider(providerName);
856
- if (!provider) {
857
- this.taskActions.set([]);
858
- return;
859
- }
860
- const actions = await provider.getActions(task);
861
- // Ensure all actions have a priority (default to 'secondary' if not specified)
862
- const actionsWithPriority = (actions || []).map((action) => ({
863
- ...action,
864
- priority: action.priority ?? 'secondary',
865
- }));
866
- this.taskActions.set(actionsWithPriority);
867
- }
868
- catch (error) {
869
- console.error('Failed to load task actions:', error);
870
- this.taskActions.set([]);
871
- }
872
- }
873
- getActionColor(action) {
874
- return action.color;
875
- }
876
- async executeAction(action) {
877
- const task = this.selectedTask();
878
- if (!task || !action.command)
785
+ async refreshPopoverData() {
786
+ const active = this.taskPopoverOverlay.getActiveTask();
787
+ if (!active?.provider) {
879
788
  return;
880
- const providerName = task.provider;
881
- if (!providerName)
789
+ }
790
+ const provider = this.taskBoardService.getProvider(active.provider);
791
+ if (!provider) {
882
792
  return;
793
+ }
883
794
  try {
884
- const result = await this.taskBoardService.executeCommand(action.command, providerName);
885
- if (result?.success === false || result === null) {
886
- return;
795
+ const result = await provider.getTasks();
796
+ const updatedTask = result.items.find((t) => t.id === active.id);
797
+ if (updatedTask) {
798
+ await this.taskPopoverOverlay.refreshTask({ ...updatedTask, provider: active.provider });
887
799
  }
888
- this.closePopover();
889
- this.taskBoardService.requestRefresh(providerName);
800
+ this.schedulerComponent()?.refresh();
890
801
  }
891
802
  catch (error) {
892
- console.error('Failed to execute action:', error);
803
+ console.error('[TaskPopover] Failed to refresh popover data:', error);
893
804
  }
894
805
  }
895
- async refreshPopoverData() {
896
- const task = this.selectedTask();
806
+ async openTaskDetails() {
807
+ const task = this.taskPopoverOverlay.getActiveTask();
897
808
  if (!task) {
898
809
  return;
899
810
  }
900
- await this.loadTaskActions(task);
901
- this.schedulerComponent()?.refresh();
902
- }
903
- async openTaskDetails() {
904
- const task = this.selectedTask();
905
- if (!task)
906
- return;
907
811
  try {
908
812
  await this.commandService.execute('Entity:OpenDetails', {
909
813
  entity: `${RootConfig.module.name}.${RootConfig.entities.task.name}`,
910
814
  data: { id: task.id },
911
815
  });
912
- this.closePopover();
816
+ this.taskPopoverOverlay.close();
913
817
  }
914
818
  catch (error) {
915
819
  console.error('Failed to open task details:', error);
916
820
  }
917
821
  }
918
- async loadCustomComponent(task) {
919
- if (!task.provider) {
920
- this.customComponentType.set(null);
921
- return;
922
- }
923
- const provider = this.taskBoardService.getProvider(task.provider);
924
- if (!provider) {
925
- this.customComponentType.set(null);
926
- return;
927
- }
928
- const componentGetter = provider.getComponent?.();
929
- if (!componentGetter) {
930
- this.customComponentType.set(null);
931
- return;
932
- }
933
- try {
934
- let componentType;
935
- if (typeof componentGetter === 'function') {
936
- const testCall = componentGetter;
937
- let result;
938
- try {
939
- result = testCall();
940
- }
941
- catch {
942
- componentType = componentGetter;
943
- this.customComponentType.set(componentType);
944
- return;
945
- }
946
- if (result instanceof Promise) {
947
- componentType = await result;
948
- }
949
- else if (result) {
950
- componentType = result;
951
- }
952
- else {
953
- componentType = componentGetter;
954
- }
822
+ resolveAppointmentAnchor(event) {
823
+ let targetElement = event.nativeEvent.currentTarget || event.nativeEvent.target;
824
+ let element = targetElement;
825
+ const maxDepth = 10;
826
+ let depth = 0;
827
+ while (element && element !== document.body && depth < maxDepth) {
828
+ depth++;
829
+ const isAppointment = element.classList?.contains('dx-scheduler-appointment') ||
830
+ element.classList?.contains('ax-scheduler-appointment') ||
831
+ element.hasAttribute('data-appointment-id');
832
+ if (isAppointment) {
833
+ targetElement = element;
834
+ break;
955
835
  }
956
- else {
957
- this.customComponentType.set(null);
958
- return;
836
+ const parent = element.parentElement;
837
+ if (parent) {
838
+ const isParentAppointment = parent.classList?.contains('dx-scheduler-appointment') ||
839
+ parent.classList?.contains('ax-scheduler-appointment');
840
+ if (isParentAppointment) {
841
+ targetElement = parent;
842
+ break;
843
+ }
959
844
  }
960
- this.customComponentType.set(componentType);
845
+ element = element.parentElement;
961
846
  }
962
- catch (error) {
963
- console.error('[TaskPopover] Failed to load custom task popover component:', error);
964
- this.customComponentType.set(null);
965
- }
966
- }
967
- closePopover() {
968
- this.taskPopover()?.close();
969
- this.customComponentType.set(null);
970
- this.selectedTask.set(null);
971
- this.popoverTarget.set(null);
972
- this.taskActions.set([]);
973
- }
974
- formatTime(date) {
975
- return this.calendarService.create(date).format('HH:mm');
976
- }
977
- formatDate(date) {
978
- return this.calendarService.create(date).format('MMM DD, YYYY');
979
- }
980
- formatDateTime(date) {
981
- return this.calendarService.create(date).format('MMM DD, YYYY HH:mm');
982
- }
983
- isMultiDay(task) {
984
- if (task.allDay) {
985
- const start = this.calendarService.create(task.startDate);
986
- const end = this.calendarService.create(task.endDate);
987
- return start.date.getTime() !== end.date.getTime();
988
- }
989
- // Check if start and end are on different days
990
- const start = this.calendarService.create(task.startDate);
991
- const end = this.calendarService.create(task.endDate);
992
- const startDay = start.date.getDate();
993
- const endDay = end.date.getDate();
994
- const startMonth = start.date.getMonth();
995
- const endMonth = end.date.getMonth();
996
- const startYear = start.date.getFullYear();
997
- const endYear = end.date.getFullYear();
998
- return startDay !== endDay || startMonth !== endMonth || startYear !== endYear;
999
- }
1000
- formatDateRange(task) {
1001
- if (task.allDay) {
1002
- const start = this.calendarService.create(task.startDate);
1003
- const end = this.calendarService.create(task.endDate);
1004
- // Same day
1005
- if (start.date.getTime() === end.date.getTime()) {
1006
- return this.formatDate(task.startDate);
1007
- }
1008
- // Different days - show range
1009
- const startFormatted = this.formatDate(task.startDate);
1010
- const endFormatted = this.formatDate(task.endDate);
1011
- // Same month and year
1012
- if (start.date.getMonth() === end.date.getMonth() && start.date.getFullYear() === end.date.getFullYear()) {
1013
- const startDay = start.date.getDate();
1014
- const endDay = end.date.getDate();
1015
- const monthYear = start.format('MMM YYYY');
1016
- return `${startDay} - ${endDay}, ${monthYear}`;
1017
- }
1018
- // Different months or years
1019
- return `${startFormatted} - ${endFormatted}`;
1020
- }
1021
- // Not all-day
1022
- if (this.isMultiDay(task)) {
1023
- const startFormatted = this.formatDateTime(task.startDate);
1024
- const endFormatted = this.formatDateTime(task.endDate);
1025
- return `${startFormatted} - ${endFormatted}`;
1026
- }
1027
- // Same day, show date with time range
1028
- const dateFormatted = this.formatDate(task.startDate);
1029
- const timeRange = `${this.formatTime(task.startDate)} - ${this.formatTime(task.endDate)}`;
1030
- return `${dateFormatted} ${timeRange}`;
847
+ return targetElement;
1031
848
  }
1032
849
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardCalendarViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1033
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardCalendarViewComponent, isStandalone: true, selector: "axm-task-board-calendar-view", inputs: { resources: { classPropertyName: "resources", publicName: "resources", isSignal: true, isRequired: false, transformFunction: null }, refreshNonce: { classPropertyName: "refreshNonce", publicName: "refreshNonce", isSignal: true, isRequired: false, transformFunction: null }, startingDate: { classPropertyName: "startingDate", publicName: "startingDate", isSignal: true, isRequired: false, transformFunction: null }, selectedView: { classPropertyName: "selectedView", publicName: "selectedView", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onTaskClick: "onTaskClick", onTaskChanged: "onTaskChanged", onMonthSlotDblClicked: "onMonthSlotDblClicked", onActionClick: "onActionClick", component: "component", onTaskRightClick: "onTaskRightClick", onRangeChanged: "onRangeChanged" }, viewQueries: [{ propertyName: "schedulerComponent", first: true, predicate: AXSchedulerComponent, descendants: true, isSignal: true }, { propertyName: "taskPopover", first: true, predicate: ["taskPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "<ax-scheduler\n [hasHeader]=\"false\"\n [holidays]=\"holidays\"\n [resources]=\"resources()\"\n [dataSource]=\"dataSource()\"\n [startingDate]=\"startingDate()\"\n [selectedView]=\"currentSchedulerView()\"\n [multiDayViewDaysCount]=\"vm.daysCount()\"\n (onAppointmentDrop)=\"onTaskDrop($event)\"\n (onActionClick)=\"handleActionClick($event)\"\n (onRangeChanged)=\"handleRangeChanged($event)\"\n (onSlotDblClicked)=\"onSlotDblClicked($event)\"\n (onAppointmentClicked)=\"onTaskClickHandler($event)\"\n [weekend]=\"weekendDays()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n></ax-scheduler>\n\n<!-- Task Detail Popover (Modern Google Calendar Style) -->\n<ax-popover\n #taskPopover\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [offsetY]=\"12\"\n [offsetX]=\"12\"\n [adaptivityEnabled]=\"true\"\n>\n <div>\n @if (selectedTask()) {\n <div class=\"task-popover ax-shadow-md ax-border\">\n <!-- Header Section -->\n <div class=\"task-popover__header\">\n <div class=\"task-popover__title-section\">\n <div class=\"task-popover__title-row\">\n <h3 class=\"task-popover__title\" [title]=\"selectedTask()!.title\">{{ selectedTask()!.title }}</h3>\n <button type=\"button\" class=\"task-popover__close-btn\" (click)=\"closePopover()\" aria-label=\"Close\">\n <ax-icon class=\"ax-icon ax-icon-close\"></ax-icon>\n </button>\n </div>\n @if (selectedTask()!.description && !customComponentType()) {\n <p class=\"task-popover__description\">{{ selectedTask()!.description }}</p>\n }\n </div>\n </div>\n\n <!-- Custom Component or Default Content -->\n @if (customComponentType()) {\n <!-- Custom Component from Provider -->\n <div class=\"task-popover__custom-content\">\n <ng-container *ngComponentOutlet=\"customComponentType()!; inputs: customComponentInputs()!\"></ng-container>\n </div>\n } @else {\n <!-- Default Content Section -->\n <div class=\"task-popover__content\">\n <!-- Time -->\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-clock\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ formatDateRange(selectedTask()!) }}</span>\n </div>\n </div>\n\n <!-- Status -->\n @if (selectedTask()!.status) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-flag\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ selectedTask()!.status.title }}</span>\n </div>\n </div>\n }\n\n <!-- Assignee -->\n @if (selectedTask()!.assignee) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-user\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{\n selectedTask()!.assignee?.fullName || selectedTask()!.assignee?.username || 'Unassigned'\n }}</span>\n </div>\n </div>\n }\n\n <!-- Priority -->\n @if (selectedTask()!.priority) {\n <div class=\"task-popover__info-item\">\n <div\n class=\"task-popover__icon task-popover__icon--priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n <i class=\"fa-light fa-exclamation-circle\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span\n class=\"task-popover__info-text task-popover__priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n {{ selectedTask()!.priority }}\n </span>\n </div>\n </div>\n }\n </div>\n\n <!-- Actions Section -->\n <div class=\"task-popover__actions\">\n <!-- Task Actions from Provider -->\n @if (taskActions().length > 0) {\n <div class=\"task-popover__actions-group\">\n <!-- Primary Actions: Icon-only buttons -->\n @if (primaryActions().length > 0) {\n @for (action of primaryActions(); track action.name || action.title) {\n <ax-button\n [look]=\"'solid'\"\n [color]=\"getActionColor(action)\"\n (onClick)=\"executeAction(action)\"\n [disabled]=\"action.disabled === true\"\n [text]=\"(action.title | translate | async)!\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n }\n\n <!-- Secondary Actions: Dropdown with \"...\" button -->\n @if (secondaryActions().length > 0) {\n <ax-button [look]=\"'blank'\">\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-ellipsis-vertical\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of secondaryActions(); track action.name || action.title) {\n <ax-button-item\n [text]=\"(action.title | translate | async)!\"\n [disabled]=\"action.disabled === true\"\n (onClick)=\"executeAction(action)\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n</ax-popover>\n", styles: ["ax-scheduler{line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}.task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.task-popover__header{padding:20px 20px 16px;border-bottom:1px solid var(--ax-sys-color-border);background:linear-gradient(to bottom,var(--ax-sys-color-lightest-surface),var(--ax-sys-color-lighter-surface))}.task-popover__title-section{display:flex;flex-direction:column;gap:8px}.task-popover__title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.task-popover__title{font-size:18px;font-weight:600;line-height:1.4;color:var(--ax-sys-color-text-primary);margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-popover__close-btn{flex-shrink:0;background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ax-sys-color-text-neutral-600);transition:color .2s ease;border-radius:4px}.task-popover__close-btn:hover{color:var(--ax-sys-color-text-primary);background:var(--ax-sys-color-lighter-surface)}.task-popover__close-btn:active{background:var(--ax-sys-color-light-surface)}.task-popover__close-btn ax-icon{display:block;width:16px;height:16px}.task-popover__description{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-secondary);margin:0;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.task-popover__content{padding:16px 20px;display:flex;flex-direction:column;gap:12px;flex:1}.task-popover__info-item{display:flex;align-items:flex-start;gap:12px;min-height:24px}.task-popover__icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;color:var(--ax-sys-color-text-neutral-600);font-size:14px}.task-popover__icon i{display:block}.task-popover__icon--priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__time{font-weight:500;color:var(--ax-sys-color-text-primary);margin-left:4px}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}.task-popover__actions-group--default{margin-top:4px;padding-top:8px;border-top:1px solid var(--ax-sys-color-border)}.task-popover__action-divider{width:100%;height:1px;background:var(--ax-sys-color-border);margin:4px 0}.task-popover__action-btn{min-width:100px;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXSchedulerComponent, selector: "ax-scheduler", inputs: ["calendar", "startingDate", "endDayHour", "startDayHour", "hasHeader", "readonly", "draggable", "hasActions", "dragStartDelay", "weekend", "allowFullScreen", "multiDayViewDaysCount", "showResourceHeaders", "showCurrentTimeIndicator", "scrollToCurrentTimeIndicator", "showUnassignedAppointments", "resources", "resourceTemplate", "firstDayOfWeek", "tooltipTemplate", "dataSource", "holidays", "views", "selectedView"], outputs: ["selectedViewChange", "onDataLoaded", "onRangeChanged", "onSlotClicked", "onSlotDblClicked", "onSlotRightClick", "onAppointmentDrop", "onActionClick", "onAppointmentClicked", "onAppointmentDblClicked", "onAppointmentRightClick"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3.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: "component", type: i3.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i3.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i4.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i5.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i5.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
850
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.9", type: AXMTaskBoardCalendarViewComponent, isStandalone: true, selector: "axm-task-board-calendar-view", inputs: { resources: { classPropertyName: "resources", publicName: "resources", isSignal: true, isRequired: false, transformFunction: null }, refreshNonce: { classPropertyName: "refreshNonce", publicName: "refreshNonce", isSignal: true, isRequired: false, transformFunction: null }, startingDate: { classPropertyName: "startingDate", publicName: "startingDate", isSignal: true, isRequired: false, transformFunction: null }, selectedView: { classPropertyName: "selectedView", publicName: "selectedView", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onTaskClick: "onTaskClick", onTaskChanged: "onTaskChanged", onMonthSlotDblClicked: "onMonthSlotDblClicked", onActionClick: "onActionClick", component: "component", onTaskRightClick: "onTaskRightClick", onRangeChanged: "onRangeChanged" }, viewQueries: [{ propertyName: "schedulerComponent", first: true, predicate: AXSchedulerComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<ax-scheduler [hasHeader]=\"false\" [holidays]=\"holidays\" [resources]=\"resources()\" [dataSource]=\"dataSource()\"\n [startingDate]=\"startingDate()\" [selectedView]=\"currentSchedulerView()\" [multiDayViewDaysCount]=\"vm.daysCount()\"\n (onAppointmentDrop)=\"onTaskDrop($event)\" (onActionClick)=\"handleActionClick($event)\"\n (onRangeChanged)=\"handleRangeChanged($event)\" (onSlotDblClicked)=\"onSlotDblClicked($event)\"\n (onAppointmentClicked)=\"onTaskClickHandler($event)\" [weekend]=\"weekendDays()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"></ax-scheduler>", styles: [".task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.task-popover__header{padding:20px 20px 16px;border-bottom:1px solid var(--ax-sys-color-border);background:linear-gradient(to bottom,var(--ax-sys-color-lightest-surface),var(--ax-sys-color-lighter-surface))}.task-popover__title-section{display:flex;flex-direction:column;gap:8px}.task-popover__title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.task-popover__title{font-size:18px;font-weight:600;line-height:1.4;color:var(--ax-sys-color-text-primary);margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-popover__close-btn{flex-shrink:0;background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ax-sys-color-text-neutral-600);transition:color .2s ease;border-radius:4px}.task-popover__close-btn:hover{color:var(--ax-sys-color-text-primary);background:var(--ax-sys-color-lighter-surface)}.task-popover__close-btn:active{background:var(--ax-sys-color-light-surface)}.task-popover__close-btn ax-icon{display:block;width:16px;height:16px}.task-popover__body{display:flex;flex-direction:column}.task-popover__description{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-secondary);margin:0;padding:0 20px 12px;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.task-popover__content{padding:16px 20px;display:flex;flex-direction:column;gap:12px;flex:1}.task-popover__info-item{display:flex;align-items:flex-start;gap:12px;min-height:24px}.task-popover__icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;color:var(--ax-sys-color-text-neutral-600);font-size:14px}.task-popover__icon i{display:block}.task-popover__icon--priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}ax-scheduler{line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}\n"], dependencies: [{ kind: "component", type: AXSchedulerComponent, selector: "ax-scheduler", inputs: ["calendar", "startingDate", "endDayHour", "startDayHour", "hasHeader", "readonly", "draggable", "hasActions", "dragStartDelay", "weekend", "allowFullScreen", "multiDayViewDaysCount", "showResourceHeaders", "showCurrentTimeIndicator", "scrollToCurrentTimeIndicator", "showUnassignedAppointments", "resources", "resourceTemplate", "firstDayOfWeek", "tooltipTemplate", "dataSource", "holidays", "views", "selectedView"], outputs: ["selectedViewChange", "onDataLoaded", "onRangeChanged", "onSlotClicked", "onSlotDblClicked", "onSlotRightClick", "onAppointmentDrop", "onActionClick", "onAppointmentClicked", "onAppointmentDblClicked", "onAppointmentRightClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1034
851
  }
1035
852
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardCalendarViewComponent, decorators: [{
1036
853
  type: Component,
1037
- args: [{ selector: 'axm-task-board-calendar-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
1038
- CommonModule,
1039
- AXSchedulerComponent,
1040
- AXPopoverModule,
1041
- AXButtonModule,
1042
- AXDropdownModule,
1043
- AXDecoratorModule,
1044
- AXTranslationModule,
1045
- ], template: "<ax-scheduler\n [hasHeader]=\"false\"\n [holidays]=\"holidays\"\n [resources]=\"resources()\"\n [dataSource]=\"dataSource()\"\n [startingDate]=\"startingDate()\"\n [selectedView]=\"currentSchedulerView()\"\n [multiDayViewDaysCount]=\"vm.daysCount()\"\n (onAppointmentDrop)=\"onTaskDrop($event)\"\n (onActionClick)=\"handleActionClick($event)\"\n (onRangeChanged)=\"handleRangeChanged($event)\"\n (onSlotDblClicked)=\"onSlotDblClicked($event)\"\n (onAppointmentClicked)=\"onTaskClickHandler($event)\"\n [weekend]=\"weekendDays()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n></ax-scheduler>\n\n<!-- Task Detail Popover (Modern Google Calendar Style) -->\n<ax-popover\n #taskPopover\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [offsetY]=\"12\"\n [offsetX]=\"12\"\n [adaptivityEnabled]=\"true\"\n>\n <div>\n @if (selectedTask()) {\n <div class=\"task-popover ax-shadow-md ax-border\">\n <!-- Header Section -->\n <div class=\"task-popover__header\">\n <div class=\"task-popover__title-section\">\n <div class=\"task-popover__title-row\">\n <h3 class=\"task-popover__title\" [title]=\"selectedTask()!.title\">{{ selectedTask()!.title }}</h3>\n <button type=\"button\" class=\"task-popover__close-btn\" (click)=\"closePopover()\" aria-label=\"Close\">\n <ax-icon class=\"ax-icon ax-icon-close\"></ax-icon>\n </button>\n </div>\n @if (selectedTask()!.description && !customComponentType()) {\n <p class=\"task-popover__description\">{{ selectedTask()!.description }}</p>\n }\n </div>\n </div>\n\n <!-- Custom Component or Default Content -->\n @if (customComponentType()) {\n <!-- Custom Component from Provider -->\n <div class=\"task-popover__custom-content\">\n <ng-container *ngComponentOutlet=\"customComponentType()!; inputs: customComponentInputs()!\"></ng-container>\n </div>\n } @else {\n <!-- Default Content Section -->\n <div class=\"task-popover__content\">\n <!-- Time -->\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-clock\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ formatDateRange(selectedTask()!) }}</span>\n </div>\n </div>\n\n <!-- Status -->\n @if (selectedTask()!.status) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-flag\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ selectedTask()!.status.title }}</span>\n </div>\n </div>\n }\n\n <!-- Assignee -->\n @if (selectedTask()!.assignee) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-user\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{\n selectedTask()!.assignee?.fullName || selectedTask()!.assignee?.username || 'Unassigned'\n }}</span>\n </div>\n </div>\n }\n\n <!-- Priority -->\n @if (selectedTask()!.priority) {\n <div class=\"task-popover__info-item\">\n <div\n class=\"task-popover__icon task-popover__icon--priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n <i class=\"fa-light fa-exclamation-circle\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span\n class=\"task-popover__info-text task-popover__priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n {{ selectedTask()!.priority }}\n </span>\n </div>\n </div>\n }\n </div>\n\n <!-- Actions Section -->\n <div class=\"task-popover__actions\">\n <!-- Task Actions from Provider -->\n @if (taskActions().length > 0) {\n <div class=\"task-popover__actions-group\">\n <!-- Primary Actions: Icon-only buttons -->\n @if (primaryActions().length > 0) {\n @for (action of primaryActions(); track action.name || action.title) {\n <ax-button\n [look]=\"'solid'\"\n [color]=\"getActionColor(action)\"\n (onClick)=\"executeAction(action)\"\n [disabled]=\"action.disabled === true\"\n [text]=\"(action.title | translate | async)!\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n }\n\n <!-- Secondary Actions: Dropdown with \"...\" button -->\n @if (secondaryActions().length > 0) {\n <ax-button [look]=\"'blank'\">\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-ellipsis-vertical\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of secondaryActions(); track action.name || action.title) {\n <ax-button-item\n [text]=\"(action.title | translate | async)!\"\n [disabled]=\"action.disabled === true\"\n (onClick)=\"executeAction(action)\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n</ax-popover>\n", styles: ["ax-scheduler{line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}.task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.task-popover__header{padding:20px 20px 16px;border-bottom:1px solid var(--ax-sys-color-border);background:linear-gradient(to bottom,var(--ax-sys-color-lightest-surface),var(--ax-sys-color-lighter-surface))}.task-popover__title-section{display:flex;flex-direction:column;gap:8px}.task-popover__title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.task-popover__title{font-size:18px;font-weight:600;line-height:1.4;color:var(--ax-sys-color-text-primary);margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-popover__close-btn{flex-shrink:0;background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ax-sys-color-text-neutral-600);transition:color .2s ease;border-radius:4px}.task-popover__close-btn:hover{color:var(--ax-sys-color-text-primary);background:var(--ax-sys-color-lighter-surface)}.task-popover__close-btn:active{background:var(--ax-sys-color-light-surface)}.task-popover__close-btn ax-icon{display:block;width:16px;height:16px}.task-popover__description{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-secondary);margin:0;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.task-popover__content{padding:16px 20px;display:flex;flex-direction:column;gap:12px;flex:1}.task-popover__info-item{display:flex;align-items:flex-start;gap:12px;min-height:24px}.task-popover__icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;color:var(--ax-sys-color-text-neutral-600);font-size:14px}.task-popover__icon i{display:block}.task-popover__icon--priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__time{font-weight:500;color:var(--ax-sys-color-text-primary);margin-left:4px}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}.task-popover__actions-group--default{margin-top:4px;padding-top:8px;border-top:1px solid var(--ax-sys-color-border)}.task-popover__action-divider{width:100%;height:1px;background:var(--ax-sys-color-border);margin:4px 0}.task-popover__action-btn{min-width:100px;white-space:nowrap}\n"] }]
1046
- }], propDecorators: { schedulerComponent: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXSchedulerComponent), { isSignal: true }] }], taskPopover: [{ type: i0.ViewChild, args: ['taskPopover', { isSignal: true }] }], resources: [{ type: i0.Input, args: [{ isSignal: true, alias: "resources", required: false }] }], refreshNonce: [{ type: i0.Input, args: [{ isSignal: true, alias: "refreshNonce", required: false }] }], startingDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "startingDate", required: false }] }], selectedView: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedView", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], onTaskClick: [{ type: i0.Output, args: ["onTaskClick"] }], onTaskChanged: [{ type: i0.Output, args: ["onTaskChanged"] }], onMonthSlotDblClicked: [{ type: i0.Output, args: ["onMonthSlotDblClicked"] }], onActionClick: [{ type: i0.Output, args: ["onActionClick"] }], component: [{ type: i0.Output, args: ["component"] }], onTaskRightClick: [{ type: i0.Output, args: ["onTaskRightClick"] }], onRangeChanged: [{ type: i0.Output, args: ["onRangeChanged"] }] } });
854
+ args: [{ selector: 'axm-task-board-calendar-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXSchedulerComponent], template: "<ax-scheduler [hasHeader]=\"false\" [holidays]=\"holidays\" [resources]=\"resources()\" [dataSource]=\"dataSource()\"\n [startingDate]=\"startingDate()\" [selectedView]=\"currentSchedulerView()\" [multiDayViewDaysCount]=\"vm.daysCount()\"\n (onAppointmentDrop)=\"onTaskDrop($event)\" (onActionClick)=\"handleActionClick($event)\"\n (onRangeChanged)=\"handleRangeChanged($event)\" (onSlotDblClicked)=\"onSlotDblClicked($event)\"\n (onAppointmentClicked)=\"onTaskClickHandler($event)\" [weekend]=\"weekendDays()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"></ax-scheduler>", styles: [".task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.task-popover__header{padding:20px 20px 16px;border-bottom:1px solid var(--ax-sys-color-border);background:linear-gradient(to bottom,var(--ax-sys-color-lightest-surface),var(--ax-sys-color-lighter-surface))}.task-popover__title-section{display:flex;flex-direction:column;gap:8px}.task-popover__title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.task-popover__title{font-size:18px;font-weight:600;line-height:1.4;color:var(--ax-sys-color-text-primary);margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-popover__close-btn{flex-shrink:0;background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ax-sys-color-text-neutral-600);transition:color .2s ease;border-radius:4px}.task-popover__close-btn:hover{color:var(--ax-sys-color-text-primary);background:var(--ax-sys-color-lighter-surface)}.task-popover__close-btn:active{background:var(--ax-sys-color-light-surface)}.task-popover__close-btn ax-icon{display:block;width:16px;height:16px}.task-popover__body{display:flex;flex-direction:column}.task-popover__description{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-secondary);margin:0;padding:0 20px 12px;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.task-popover__content{padding:16px 20px;display:flex;flex-direction:column;gap:12px;flex:1}.task-popover__info-item{display:flex;align-items:flex-start;gap:12px;min-height:24px}.task-popover__icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;color:var(--ax-sys-color-text-neutral-600);font-size:14px}.task-popover__icon i{display:block}.task-popover__icon--priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}ax-scheduler{line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}\n"] }]
855
+ }], propDecorators: { schedulerComponent: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXSchedulerComponent), { isSignal: true }] }], resources: [{ type: i0.Input, args: [{ isSignal: true, alias: "resources", required: false }] }], refreshNonce: [{ type: i0.Input, args: [{ isSignal: true, alias: "refreshNonce", required: false }] }], startingDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "startingDate", required: false }] }], selectedView: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedView", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], onTaskClick: [{ type: i0.Output, args: ["onTaskClick"] }], onTaskChanged: [{ type: i0.Output, args: ["onTaskChanged"] }], onMonthSlotDblClicked: [{ type: i0.Output, args: ["onMonthSlotDblClicked"] }], onActionClick: [{ type: i0.Output, args: ["onActionClick"] }], component: [{ type: i0.Output, args: ["component"] }], onTaskRightClick: [{ type: i0.Output, args: ["onTaskRightClick"] }], onRangeChanged: [{ type: i0.Output, args: ["onRangeChanged"] }] } });
1047
856
 
1048
857
  class AXMTaskBoardGridViewComponent {
1049
- #dataSourceChanged;
1050
858
  constructor() {
1051
859
  this.vm = inject(AXMTaskBoardViewModel);
1052
860
  this.localeService = inject(AXLocaleService);
1053
861
  this.calendarService = inject(AXCalendarService);
1054
862
  this.taskBoardService = inject(AXPTaskBoardService);
1055
- this.translationService = inject(AXTranslationService);
863
+ this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
864
+ this.destroyRef = inject(DestroyRef);
1056
865
  this.dataSource = input.required(...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
1057
866
  this.refreshNonce = input(0, ...(ngDevMode ? [{ debugName: "refreshNonce" }] : /* istanbul ignore next */ []));
1058
867
  this.onTaskClick = output();
1059
- this.onActionClick = output();
1060
868
  this.fetchedTasks = signal([], ...(ngDevMode ? [{ debugName: "fetchedTasks" }] : /* istanbul ignore next */ []));
1061
869
  this.columns = signal([], ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
1062
870
  this.grid = viewChild('grid', ...(ngDevMode ? [{ debugName: "grid" }] : /* istanbul ignore next */ []));
1063
- this.commandItems = signal([
1064
- {
1065
- name: 'view',
1066
- text: this.translationService.translateSync('@task-management:task-board.grid-headers.action-view') ?? 'View',
1067
- icon: 'ax-icon ax-icon-more-horizontal',
1068
- look: 'blank',
1069
- },
1070
- ], ...(ngDevMode ? [{ debugName: "commandItems" }] : /* istanbul ignore next */ []));
1071
- /** Remount keys so `ax-data-table` is recreated on board refresh (manual fetch mode can keep stale rows otherwise). */
871
+ this.taskRowCommandWidth = TASK_BOARD_GRID_ROW_ACTION_COLUMN_WIDTH;
872
+ this.taskRowCommandItems = TASK_BOARD_GRID_ROW_ACTION_ITEMS;
1072
873
  this.gridRemountKeys = computed(() => [this.refreshNonce()], ...(ngDevMode ? [{ debugName: "gridRemountKeys" }] : /* istanbul ignore next */ []));
1073
874
  this.tasksDataSource = computed(() => {
1074
875
  const parentDataSource = this.dataSource();
1075
- // Bumps when the task board refreshes so we get a new data source instance (grid refresh alone can keep cached pages).
1076
876
  void this.refreshNonce();
1077
877
  return new AXDataSource({
1078
878
  load: async (e) => {
@@ -1094,7 +894,6 @@ class AXMTaskBoardGridViewComponent {
1094
894
  startDate: this.calendarService.format(task.startDate, 'DD/MM/YYYY HH:mm', {
1095
895
  locale: this.localeService.activeProfile().calendar.system,
1096
896
  }),
1097
- // Store the original task for row click handler
1098
897
  _originalTask: task,
1099
898
  }));
1100
899
  return { items: mappedItems, total: result.total };
@@ -1107,9 +906,6 @@ class AXMTaskBoardGridViewComponent {
1107
906
  });
1108
907
  }, ...(ngDevMode ? [{ debugName: "tasksDataSource" }] : /* istanbul ignore next */ []));
1109
908
  this.#dataSourceChanged = effect(() => {
1110
- // Track filter-related signals that affect the data source
1111
- // When these change, the parent's filter() computed signal changes,
1112
- // which means the data source function will return different results
1113
909
  this.vm.selectedTaskTypeNames();
1114
910
  this.vm.selectedAssigneeIds();
1115
911
  this.vm.selectedReporterIds();
@@ -1118,9 +914,7 @@ class AXMTaskBoardGridViewComponent {
1118
914
  this.vm.daysCount();
1119
915
  this.vm.currentViewMode();
1120
916
  this.refreshNonce();
1121
- // Use untracked to refresh the grid without tracking it
1122
917
  untracked(() => {
1123
- // Schedule refresh in next tick to avoid issues during effect execution
1124
918
  setTimeout(() => {
1125
919
  this.grid()?.refresh({ reset: true });
1126
920
  }, 0);
@@ -1138,17 +932,26 @@ class AXMTaskBoardGridViewComponent {
1138
932
  }
1139
933
  });
1140
934
  }, ...(ngDevMode ? [{ debugName: "#providerChanged" }] : /* istanbul ignore next */ []));
1141
- // Ensure data source is refreshed after initial render
1142
935
  afterNextRender(() => {
1143
936
  untracked(() => {
1144
937
  this.grid()?.refresh({ reset: true });
1145
938
  });
1146
939
  });
940
+ this.taskBoardService.close$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data) => {
941
+ const active = this.taskPopoverOverlay.getActiveTask();
942
+ if (!active?.provider) {
943
+ return;
944
+ }
945
+ if (data.provider && data.provider !== active.provider) {
946
+ return;
947
+ }
948
+ this.taskPopoverOverlay.close();
949
+ });
1147
950
  }
951
+ #dataSourceChanged;
1148
952
  #providerChanged;
1149
953
  handleRowClick(event) {
1150
954
  if (event.data) {
1151
- // Get the original task from the mapped item or find it by ID
1152
955
  const mappedItem = event.data;
1153
956
  const originalTask = mappedItem._originalTask || this.fetchedTasks().find((task) => task.id === mappedItem.id);
1154
957
  if (originalTask) {
@@ -1156,47 +959,47 @@ class AXMTaskBoardGridViewComponent {
1156
959
  }
1157
960
  }
1158
961
  }
1159
- onActionClickHandler(e) {
1160
- const task = this.fetchedTasks().find((task) => task.id === e.data.id);
1161
- if (!task)
962
+ handleTaskCommandClick(event) {
963
+ if (event.name !== 'view') {
964
+ return;
965
+ }
966
+ event.nativeEvent?.stopPropagation();
967
+ const mappedItem = event.data;
968
+ const task = mappedItem._originalTask ?? this.fetchedTasks().find((t) => t.id === mappedItem.id);
969
+ if (!task) {
970
+ return;
971
+ }
972
+ const anchor = this.taskPopoverOverlay.resolveAnchorFromCommandClick(event);
973
+ if (!anchor) {
1162
974
  return;
1163
- this.onActionClick.emit({ nativeEvent: e.nativeEvent, task });
975
+ }
976
+ setTimeout(() => {
977
+ void this.taskPopoverOverlay.open({
978
+ task,
979
+ anchor,
980
+ placement: 'bottom-start',
981
+ adaptivityEnabled: false,
982
+ autoFlip: true,
983
+ });
984
+ }, 0);
1164
985
  }
1165
986
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardGridViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1166
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardGridViewComponent, isStandalone: true, selector: "axm-task-board-grid-view", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, refreshNonce: { classPropertyName: "refreshNonce", publicName: "refreshNonce", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onTaskClick: "onTaskClick", onActionClick: "onActionClick" }, viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true, isSignal: true }], ngImport: i0, template: "@for (remountKey of gridRemountKeys(); track remountKey) {\n <ax-data-table\n #grid\n [fetchDataMode]=\"'manual'\"\n [dataSource]=\"tasksDataSource()\"\n (onRowClick)=\"handleRowClick($event)\"\n [loading]=\"{ enabled: true, animation: true }\"\n >\n <ax-text-column\n dataField=\"title\"\n [caption]=\"('@task-management:task-board.grid-headers.title' | translate | async)!\"\n [width]=\"'350px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"description\"\n [caption]=\"('@task-management:task-board.grid-headers.description' | translate | async)!\"\n [width]=\"'500px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"assignee\"\n [caption]=\"('@task-management:task-board.grid-headers.assignee' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"startDate\"\n [caption]=\"('@task-management:task-board.grid-headers.start-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"endDate\"\n [caption]=\"('@task-management:task-board.grid-headers.due-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"priority\"\n [caption]=\"('@task-management:task-board.grid-headers.priority' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n [allowResizing]=\"true\"\n dataField=\"reporter\"\n [caption]=\"('@task-management:task-board.grid-headers.reporter' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"statusTitle\"\n [caption]=\"('@task-management:task-board.grid-headers.status' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"type\"\n [caption]=\"('@task-management:task-board.grid-headers.type' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n\n @if (columns().length) {\n <ng-container>\n @for (column of columns(); track column) {\n <axp-widget-column-renderer\n [node]=\"column.widget\"\n [caption]=\"(column.title | translate | async)!\"\n ></axp-widget-column-renderer>\n }\n </ng-container>\n }\n\n <ax-command-column\n fixed=\"end\"\n [width]=\"'75px'\"\n (onItemClick)=\"onActionClickHandler($event)\"\n [items]=\"commandItems()\"\n ></ax-command-column>\n </ax-data-table>\n}\n", styles: ["ax-kanban{--ax-comp-kanban-status-min-width: 25rem;height:100%;line-height:1.5}\n"], dependencies: [{ kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i1$2.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "title", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i1$2.AXDataTableTextColumnComponent, selector: "ax-text-column", inputs: ["width", "caption", "allowSorting", "allowResizing", "fixed", "customExpandIcon", "customCollapseIcon", "dataField", "expandHandler", "wrapText", "cellTemplate", "footerTemplate", "headerTemplate", "format", "formatOptions"] }, { kind: "component", type: i1$2.AXRowCommandColumnComponent, selector: "ax-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetColumnRendererComponent, selector: "axp-widget-column-renderer", inputs: ["caption", "customExpandIcon", "customCollapseIcon", "customWidth", "node", "footerTemplate", "expandHandler", "cellTemplate", "headerTemplate"] }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
987
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardGridViewComponent, isStandalone: true, selector: "axm-task-board-grid-view", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, refreshNonce: { classPropertyName: "refreshNonce", publicName: "refreshNonce", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onTaskClick: "onTaskClick" }, viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true, isSignal: true }], ngImport: i0, template: "@for (remountKey of gridRemountKeys(); track remountKey) {\n <ax-data-table\n #grid\n [fetchDataMode]=\"'manual'\"\n [dataSource]=\"tasksDataSource()\"\n (onRowClick)=\"handleRowClick($event)\"\n [loading]=\"{ enabled: true, animation: true }\"\n >\n <ax-text-column\n dataField=\"title\"\n [caption]=\"('@task-management:task-board.grid-headers.title' | translate | async)!\"\n [width]=\"'350px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"description\"\n [caption]=\"('@task-management:task-board.grid-headers.description' | translate | async)!\"\n [width]=\"'500px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"assignee\"\n [caption]=\"('@task-management:task-board.grid-headers.assignee' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"startDate\"\n [caption]=\"('@task-management:task-board.grid-headers.start-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"endDate\"\n [caption]=\"('@task-management:task-board.grid-headers.due-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"priority\"\n [caption]=\"('@task-management:task-board.grid-headers.priority' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n [allowResizing]=\"true\"\n dataField=\"reporter\"\n [caption]=\"('@task-management:task-board.grid-headers.reporter' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"statusTitle\"\n [caption]=\"('@task-management:task-board.grid-headers.status' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"type\"\n [caption]=\"('@task-management:task-board.grid-headers.type' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n\n @if (columns().length) {\n <ng-container>\n @for (column of columns(); track column) {\n <axp-widget-column-renderer\n [node]=\"column.widget\"\n [caption]=\"(column.title | translate | async)!\"\n ></axp-widget-column-renderer>\n }\n </ng-container>\n }\n\n <ax-command-column\n fixed=\"end\"\n [width]=\"taskRowCommandWidth\"\n [items]=\"taskRowCommandItems\"\n (onItemClick)=\"handleTaskCommandClick($event)\"\n ></ax-command-column>\n </ax-data-table>\n}\n", dependencies: [{ kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i1$2.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "title", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i1$2.AXDataTableTextColumnComponent, selector: "ax-text-column", inputs: ["width", "caption", "allowSorting", "allowResizing", "fixed", "customExpandIcon", "customCollapseIcon", "dataField", "expandHandler", "wrapText", "cellTemplate", "footerTemplate", "headerTemplate", "format", "formatOptions"] }, { kind: "component", type: i1$2.AXRowCommandColumnComponent, selector: "ax-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetColumnRendererComponent, selector: "axp-widget-column-renderer", inputs: ["caption", "customExpandIcon", "customCollapseIcon", "customWidth", "node", "footerTemplate", "expandHandler", "cellTemplate", "headerTemplate"] }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1167
988
  }
1168
989
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardGridViewComponent, decorators: [{
1169
990
  type: Component,
1170
- args: [{ selector: 'axm-task-board-grid-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXDataTableModule, AXTranslatorPipe, AsyncPipe, AXPWidgetCoreModule], template: "@for (remountKey of gridRemountKeys(); track remountKey) {\n <ax-data-table\n #grid\n [fetchDataMode]=\"'manual'\"\n [dataSource]=\"tasksDataSource()\"\n (onRowClick)=\"handleRowClick($event)\"\n [loading]=\"{ enabled: true, animation: true }\"\n >\n <ax-text-column\n dataField=\"title\"\n [caption]=\"('@task-management:task-board.grid-headers.title' | translate | async)!\"\n [width]=\"'350px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"description\"\n [caption]=\"('@task-management:task-board.grid-headers.description' | translate | async)!\"\n [width]=\"'500px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"assignee\"\n [caption]=\"('@task-management:task-board.grid-headers.assignee' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"startDate\"\n [caption]=\"('@task-management:task-board.grid-headers.start-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"endDate\"\n [caption]=\"('@task-management:task-board.grid-headers.due-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"priority\"\n [caption]=\"('@task-management:task-board.grid-headers.priority' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n [allowResizing]=\"true\"\n dataField=\"reporter\"\n [caption]=\"('@task-management:task-board.grid-headers.reporter' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"statusTitle\"\n [caption]=\"('@task-management:task-board.grid-headers.status' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"type\"\n [caption]=\"('@task-management:task-board.grid-headers.type' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n\n @if (columns().length) {\n <ng-container>\n @for (column of columns(); track column) {\n <axp-widget-column-renderer\n [node]=\"column.widget\"\n [caption]=\"(column.title | translate | async)!\"\n ></axp-widget-column-renderer>\n }\n </ng-container>\n }\n\n <ax-command-column\n fixed=\"end\"\n [width]=\"'75px'\"\n (onItemClick)=\"onActionClickHandler($event)\"\n [items]=\"commandItems()\"\n ></ax-command-column>\n </ax-data-table>\n}\n", styles: ["ax-kanban{--ax-comp-kanban-status-min-width: 25rem;height:100%;line-height:1.5}\n"] }]
1171
- }], ctorParameters: () => [], propDecorators: { dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], refreshNonce: [{ type: i0.Input, args: [{ isSignal: true, alias: "refreshNonce", required: false }] }], onTaskClick: [{ type: i0.Output, args: ["onTaskClick"] }], onActionClick: [{ type: i0.Output, args: ["onActionClick"] }], grid: [{ type: i0.ViewChild, args: ['grid', { isSignal: true }] }] } });
991
+ args: [{ selector: 'axm-task-board-grid-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXDataTableModule, AXTranslatorPipe, AsyncPipe, AXPWidgetCoreModule], template: "@for (remountKey of gridRemountKeys(); track remountKey) {\n <ax-data-table\n #grid\n [fetchDataMode]=\"'manual'\"\n [dataSource]=\"tasksDataSource()\"\n (onRowClick)=\"handleRowClick($event)\"\n [loading]=\"{ enabled: true, animation: true }\"\n >\n <ax-text-column\n dataField=\"title\"\n [caption]=\"('@task-management:task-board.grid-headers.title' | translate | async)!\"\n [width]=\"'350px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"description\"\n [caption]=\"('@task-management:task-board.grid-headers.description' | translate | async)!\"\n [width]=\"'500px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"assignee\"\n [caption]=\"('@task-management:task-board.grid-headers.assignee' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"startDate\"\n [caption]=\"('@task-management:task-board.grid-headers.start-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"endDate\"\n [caption]=\"('@task-management:task-board.grid-headers.due-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"priority\"\n [caption]=\"('@task-management:task-board.grid-headers.priority' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n [allowResizing]=\"true\"\n dataField=\"reporter\"\n [caption]=\"('@task-management:task-board.grid-headers.reporter' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"statusTitle\"\n [caption]=\"('@task-management:task-board.grid-headers.status' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"type\"\n [caption]=\"('@task-management:task-board.grid-headers.type' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n\n @if (columns().length) {\n <ng-container>\n @for (column of columns(); track column) {\n <axp-widget-column-renderer\n [node]=\"column.widget\"\n [caption]=\"(column.title | translate | async)!\"\n ></axp-widget-column-renderer>\n }\n </ng-container>\n }\n\n <ax-command-column\n fixed=\"end\"\n [width]=\"taskRowCommandWidth\"\n [items]=\"taskRowCommandItems\"\n (onItemClick)=\"handleTaskCommandClick($event)\"\n ></ax-command-column>\n </ax-data-table>\n}\n" }]
992
+ }], ctorParameters: () => [], propDecorators: { dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], refreshNonce: [{ type: i0.Input, args: [{ isSignal: true, alias: "refreshNonce", required: false }] }], onTaskClick: [{ type: i0.Output, args: ["onTaskClick"] }], grid: [{ type: i0.ViewChild, args: ['grid', { isSignal: true }] }] } });
1172
993
 
1173
994
  class AXMTaskBoardKanbanViewComponent {
1174
995
  constructor() {
1175
996
  this.vm = inject(AXMTaskBoardViewModel);
1176
997
  this.taskBoardService = inject(AXPTaskBoardService);
1177
- this.calendarService = inject(AXCalendarService);
1178
998
  this.settingService = inject(AXPSettingsService);
1179
999
  this.commandService = inject(AXPCommandService);
1000
+ this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
1180
1001
  this.destroyRef = inject(DestroyRef);
1181
1002
  this.kanbanComponent = viewChild(AXKanbanComponent, ...(ngDevMode ? [{ debugName: "kanbanComponent" }] : /* istanbul ignore next */ []));
1182
- this.taskPopover = viewChild.required('taskPopover');
1183
- this.selectedTask = signal(null, ...(ngDevMode ? [{ debugName: "selectedTask" }] : /* istanbul ignore next */ []));
1184
- this.popoverTarget = signal(null, ...(ngDevMode ? [{ debugName: "popoverTarget" }] : /* istanbul ignore next */ []));
1185
- this.taskActions = signal([], ...(ngDevMode ? [{ debugName: "taskActions" }] : /* istanbul ignore next */ []));
1186
- this.customComponentType = signal(null, ...(ngDevMode ? [{ debugName: "customComponentType" }] : /* istanbul ignore next */ []));
1187
- // Separate primary and secondary actions
1188
- this.primaryActions = computed(() => {
1189
- return this.taskActions().filter((action) => (action.priority ?? 'secondary') === 'primary');
1190
- }, ...(ngDevMode ? [{ debugName: "primaryActions" }] : /* istanbul ignore next */ []));
1191
- this.secondaryActions = computed(() => {
1192
- return this.taskActions().filter((action) => (action.priority ?? 'secondary') === 'secondary');
1193
- }, ...(ngDevMode ? [{ debugName: "secondaryActions" }] : /* istanbul ignore next */ []));
1194
- this.customComponentInputs = computed(() => {
1195
- const task = this.selectedTask();
1196
- if (!task)
1197
- return null;
1198
- return { task };
1199
- }, ...(ngDevMode ? [{ debugName: "customComponentInputs" }] : /* istanbul ignore next */ []));
1200
1003
  this.tasks = model.required(...(ngDevMode ? [{ debugName: "tasks" }] : /* istanbul ignore next */ []));
1201
1004
  this.onTaskClick = output();
1202
1005
  this.onTaskChanged = output();
@@ -1232,22 +1035,26 @@ class AXMTaskBoardKanbanViewComponent {
1232
1035
  this.taskBoardService.refresh$
1233
1036
  .pipe(takeUntilDestroyed(this.destroyRef))
1234
1037
  .subscribe(async (data) => {
1235
- const selected = this.selectedTask();
1236
- if (!selected?.provider)
1038
+ const active = this.taskPopoverOverlay.getActiveTask();
1039
+ if (!active?.provider) {
1237
1040
  return;
1238
- if (data.provider && data.provider !== selected.provider)
1041
+ }
1042
+ if (data.provider && data.provider !== active.provider) {
1239
1043
  return;
1044
+ }
1240
1045
  await this.refreshPopoverData();
1241
1046
  });
1242
1047
  this.taskBoardService.close$
1243
1048
  .pipe(takeUntilDestroyed(this.destroyRef))
1244
1049
  .subscribe((data) => {
1245
- const selected = this.selectedTask();
1246
- if (!selected?.provider)
1050
+ const active = this.taskPopoverOverlay.getActiveTask();
1051
+ if (!active?.provider) {
1247
1052
  return;
1248
- if (data.provider && data.provider !== selected.provider)
1053
+ }
1054
+ if (data.provider && data.provider !== active.provider) {
1249
1055
  return;
1250
- this.closePopover();
1056
+ }
1057
+ this.taskPopoverOverlay.close();
1251
1058
  });
1252
1059
  if (this.kanbanComponent()) {
1253
1060
  this.component.emit(this.kanbanComponent());
@@ -1424,21 +1231,15 @@ class AXMTaskBoardKanbanViewComponent {
1424
1231
  }
1425
1232
  element = element.parentElement;
1426
1233
  }
1427
- // Set the selected task and target element
1428
- this.selectedTask.set(task);
1429
- this.popoverTarget.set(targetElement);
1430
- // Check if provider has a custom component
1431
- await this.loadCustomComponent(task);
1432
- // Load actions for the task
1433
- await this.loadTaskActions(task);
1434
- // Open the popover
1435
- setTimeout(() => {
1436
- if (this.taskPopover() && targetElement) {
1437
- this.taskPopover().target = targetElement;
1438
- this.taskPopover().open();
1439
- }
1440
- }, 0);
1441
- // Still emit the event for backward compatibility
1234
+ if (targetElement) {
1235
+ await this.taskPopoverOverlay.open({
1236
+ task,
1237
+ anchor: targetElement,
1238
+ offsetX: 12,
1239
+ offsetY: 12,
1240
+ adaptivityEnabled: true,
1241
+ });
1242
+ }
1442
1243
  this.onTaskClick.emit(task);
1443
1244
  }
1444
1245
  handleActionClick(event) {
@@ -1447,262 +1248,41 @@ class AXMTaskBoardKanbanViewComponent {
1447
1248
  this.onActionClick.emit({ nativeEvent: event.nativeEvent, task: task });
1448
1249
  }
1449
1250
  }
1450
- async loadTaskActions(task) {
1451
- try {
1452
- const providerName = task.provider;
1453
- if (!providerName) {
1454
- this.taskActions.set([]);
1455
- return;
1456
- }
1457
- const provider = this.taskBoardService.getProvider(providerName);
1458
- if (!provider) {
1459
- this.taskActions.set([]);
1460
- return;
1461
- }
1462
- const actions = await provider.getActions(task);
1463
- // Ensure all actions have a priority (default to 'secondary' if not specified)
1464
- const actionsWithPriority = (actions || []).map((action) => ({
1465
- ...action,
1466
- priority: action.priority ?? 'secondary',
1467
- }));
1468
- this.taskActions.set(actionsWithPriority);
1469
- }
1470
- catch (error) {
1471
- console.error('Failed to load task actions:', error);
1472
- this.taskActions.set([]);
1473
- }
1474
- }
1475
- getActionColor(action) {
1476
- return action.color;
1477
- }
1478
- //#region ---- Action Execution ----
1479
- /**
1480
- * Executes an action when user clicks on an action button in the popover.
1481
- * If action succeeds, moves the item to the appropriate status using kanban.moveItem().
1482
- */
1483
- async executeAction(action) {
1484
- const task = this.selectedTask();
1485
- if (!task || !action.command)
1486
- return;
1487
- // Store task info before closing popover
1488
- const taskId = task.id;
1489
- const providerName = task.provider;
1490
- const currentStatusKey = task.status.id;
1491
- if (!providerName)
1492
- return;
1493
- try {
1494
- const result = await this.taskBoardService.executeCommand(action.command, providerName);
1495
- // Check if action was successful
1496
- if (result?.success === false || result === null) {
1497
- // Action was cancelled or failed - don't close popover, don't move item
1498
- return;
1499
- }
1500
- // Action succeeded - close popover first
1501
- this.closePopover();
1502
- // Refresh tasks to get updated status and move item if status changed
1503
- await this.refreshAndMoveItem(taskId, providerName, currentStatusKey);
1504
- }
1505
- catch (error) {
1506
- console.error('Failed to execute action:', error);
1507
- }
1508
- }
1509
- /**
1510
- * Refreshes tasks from the provider and moves the item if status changed.
1511
- */
1512
- async refreshAndMoveItem(taskId, providerName, previousStatusKey) {
1513
- try {
1514
- const provider = this.taskBoardService.getProvider(providerName);
1515
- if (!provider) {
1516
- return;
1517
- }
1518
- // Get updated tasks from provider
1519
- const result = await provider.getTasks();
1520
- const updatedTasks = result.items.map((t) => ({ ...t, provider: providerName }));
1521
- // Find the updated task to get its new status
1522
- const updatedTask = updatedTasks.find((t) => t.id === taskId);
1523
- if (!updatedTask) {
1524
- return;
1525
- }
1526
- const newStatusKey = updatedTask.status.id;
1527
- // Check if status actually changed
1528
- if (newStatusKey !== previousStatusKey) {
1529
- // Move the item programmatically to the new status using kanban API
1530
- const kanban = this.kanbanComponent();
1531
- if (kanban) {
1532
- await kanban.moveItem(taskId, newStatusKey);
1533
- }
1534
- }
1535
- // Update the tasks signal with merged data
1536
- const currentTasks = this.tasks();
1537
- const updatedTasksMap = new Map(updatedTasks.map((t) => [t.id, t]));
1538
- const mergedTasks = currentTasks.map((t) => {
1539
- const updated = updatedTasksMap.get(t.id);
1540
- return updated ? { ...updated } : t;
1541
- });
1542
- // Add any new tasks
1543
- const existingIds = new Set(currentTasks.map((t) => t.id));
1544
- const newTasks = updatedTasks.filter((t) => !existingIds.has(t.id)).map((t) => ({ ...t }));
1545
- mergedTasks.push(...newTasks);
1546
- this.tasks.set([...mergedTasks]);
1547
- }
1548
- catch (error) {
1549
- console.error('Failed to refresh tasks:', error);
1550
- }
1551
- }
1552
- //#endregion
1553
- async loadCustomComponent(task) {
1554
- if (!task.provider) {
1555
- this.customComponentType.set(null);
1556
- return;
1557
- }
1558
- const provider = this.taskBoardService.getProvider(task.provider);
1559
- if (!provider) {
1560
- this.customComponentType.set(null);
1561
- return;
1562
- }
1563
- const componentGetter = provider.getComponent?.();
1564
- if (!componentGetter) {
1565
- this.customComponentType.set(null);
1566
- return;
1567
- }
1568
- try {
1569
- let componentType;
1570
- // Check if it's a lazy loading function or direct component type
1571
- if (typeof componentGetter === 'function') {
1572
- const testCall = componentGetter;
1573
- let result;
1574
- try {
1575
- result = testCall();
1576
- }
1577
- catch (e) {
1578
- componentType = componentGetter;
1579
- this.customComponentType.set(componentType);
1580
- return;
1581
- }
1582
- if (result instanceof Promise) {
1583
- componentType = await result;
1584
- }
1585
- else if (result) {
1586
- componentType = result;
1587
- }
1588
- else {
1589
- componentType = componentGetter;
1590
- }
1591
- }
1592
- else {
1593
- this.customComponentType.set(null);
1594
- return;
1595
- }
1596
- this.customComponentType.set(componentType);
1597
- }
1598
- catch (error) {
1599
- console.error('[TaskPopover] Failed to load custom task popover component:', error);
1600
- this.customComponentType.set(null);
1601
- }
1602
- }
1603
- closePopover() {
1604
- this.taskPopover().close();
1605
- this.customComponentType.set(null);
1606
- this.selectedTask.set(null);
1607
- this.popoverTarget.set(null);
1608
- this.taskActions.set([]);
1609
- }
1610
1251
  async refreshPopoverData() {
1611
- const selected = this.selectedTask();
1612
- if (!selected?.provider) {
1252
+ const active = this.taskPopoverOverlay.getActiveTask();
1253
+ if (!active?.provider) {
1613
1254
  return;
1614
1255
  }
1615
- const provider = this.taskBoardService.getProvider(selected.provider);
1256
+ const provider = this.taskBoardService.getProvider(active.provider);
1616
1257
  if (!provider) {
1617
1258
  return;
1618
1259
  }
1619
1260
  try {
1620
1261
  const result = await provider.getTasks();
1621
- const updatedTasks = result.items.map((t) => ({ ...t, provider: selected.provider }));
1262
+ const updatedTasks = result.items.map((t) => ({ ...t, provider: active.provider }));
1622
1263
  const updatedMap = new Map(updatedTasks.map((t) => [t.id, t]));
1623
1264
  const currentTasks = this.tasks();
1624
1265
  const mergedTasks = currentTasks.map((t) => updatedMap.get(t.id) ?? t);
1625
1266
  const existingIds = new Set(currentTasks.map((t) => t.id));
1626
1267
  const newTasks = updatedTasks.filter((t) => !existingIds.has(t.id));
1627
1268
  this.tasks.set([...mergedTasks, ...newTasks]);
1628
- const updatedSelectedTask = updatedMap.get(selected.id);
1269
+ const updatedSelectedTask = updatedMap.get(active.id);
1629
1270
  if (updatedSelectedTask) {
1630
- this.selectedTask.set(updatedSelectedTask);
1631
- await this.loadTaskActions(updatedSelectedTask);
1271
+ await this.taskPopoverOverlay.refreshTask({ ...updatedSelectedTask, provider: active.provider });
1632
1272
  }
1633
1273
  }
1634
1274
  catch (error) {
1635
1275
  console.error('[TaskPopover] Failed to refresh popover data:', error);
1636
1276
  }
1637
1277
  }
1638
- formatTime(date) {
1639
- return this.calendarService.create(date).format('HH:mm');
1640
- }
1641
- formatDate(date) {
1642
- return this.calendarService.create(date).format('MMM DD, YYYY');
1643
- }
1644
- formatDateTime(date) {
1645
- return this.calendarService.create(date).format('MMM DD, YYYY HH:mm');
1646
- }
1647
- isMultiDay(task) {
1648
- if (task.allDay) {
1649
- const start = this.calendarService.create(task.startDate);
1650
- const end = this.calendarService.create(task.endDate);
1651
- return start.date.getTime() !== end.date.getTime();
1652
- }
1653
- const start = this.calendarService.create(task.startDate);
1654
- const end = this.calendarService.create(task.endDate);
1655
- const startDay = start.date.getDate();
1656
- const endDay = end.date.getDate();
1657
- const startMonth = start.date.getMonth();
1658
- const endMonth = end.date.getMonth();
1659
- const startYear = start.date.getFullYear();
1660
- const endYear = end.date.getFullYear();
1661
- return startDay !== endDay || startMonth !== endMonth || startYear !== endYear;
1662
- }
1663
- formatDateRange(task) {
1664
- if (task.allDay) {
1665
- const start = this.calendarService.create(task.startDate);
1666
- const end = this.calendarService.create(task.endDate);
1667
- if (start.date.getTime() === end.date.getTime()) {
1668
- return this.formatDate(task.startDate);
1669
- }
1670
- const startFormatted = this.formatDate(task.startDate);
1671
- const endFormatted = this.formatDate(task.endDate);
1672
- if (start.date.getMonth() === end.date.getMonth() && start.date.getFullYear() === end.date.getFullYear()) {
1673
- const startDay = start.date.getDate();
1674
- const endDay = end.date.getDate();
1675
- const monthYear = start.format('MMM YYYY');
1676
- return `${startDay} - ${endDay}, ${monthYear}`;
1677
- }
1678
- return `${startFormatted} - ${endFormatted}`;
1679
- }
1680
- if (this.isMultiDay(task)) {
1681
- const startFormatted = this.formatDateTime(task.startDate);
1682
- const endFormatted = this.formatDateTime(task.endDate);
1683
- return `${startFormatted} - ${endFormatted}`;
1684
- }
1685
- const dateFormatted = this.formatDate(task.startDate);
1686
- const timeRange = `${this.formatTime(task.startDate)} - ${this.formatTime(task.endDate)}`;
1687
- return `${dateFormatted} ${timeRange}`;
1688
- }
1689
1278
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardKanbanViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1690
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardKanbanViewComponent, isStandalone: true, selector: "axm-task-board-kanban-view", inputs: { tasks: { classPropertyName: "tasks", publicName: "tasks", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { tasks: "tasksChange", onTaskClick: "onTaskClick", onTaskChanged: "onTaskChanged", component: "component", onActionClick: "onActionClick" }, viewQueries: [{ propertyName: "kanbanComponent", first: true, predicate: AXKanbanComponent, descendants: true, isSignal: true }, { propertyName: "taskPopover", first: true, predicate: ["taskPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "<ax-kanban\n [statuses]=\"statuses()\"\n [dataSource]=\"kanbanTasks()\"\n (onItemClick)=\"handleItemClick($event)\"\n (onBeforeDrop)=\"onBeforeDrop($event)\"\n (onSortChanged)=\"onSortChanged($event)\"\n></ax-kanban>\n\n<!-- Task Detail Popover (Modern Google Calendar Style) -->\n<ax-popover\n #taskPopover\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [offsetY]=\"12\"\n [offsetX]=\"12\"\n [adaptivityEnabled]=\"true\"\n>\n <div>\n @if (selectedTask()) {\n <div class=\"task-popover ax-shadow-md ax-border\">\n <!-- Header Section -->\n <div class=\"task-popover__header\">\n <div class=\"task-popover__title-section\">\n <div class=\"task-popover__title-row\">\n <h3 class=\"task-popover__title\" [title]=\"selectedTask()!.title\">{{ selectedTask()!.title }}</h3>\n <button type=\"button\" class=\"task-popover__close-btn\" (click)=\"closePopover()\" aria-label=\"Close\">\n <ax-icon class=\"ax-icon ax-icon-close\"></ax-icon>\n </button>\n </div>\n @if (selectedTask()!.description && !customComponentType()) {\n <p class=\"task-popover__description\">{{ selectedTask()!.description }}</p>\n }\n </div>\n </div>\n\n <!-- Custom Component or Default Content -->\n @if (customComponentType()) {\n <!-- Custom Component from Provider -->\n <div class=\"task-popover__custom-content\">\n <ng-container *ngComponentOutlet=\"customComponentType()!; inputs: customComponentInputs()!\"></ng-container>\n </div>\n } @else {\n <!-- Default Content Section -->\n <div class=\"task-popover__content\">\n <!-- Time -->\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-clock\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ formatDateRange(selectedTask()!) }}</span>\n </div>\n </div>\n\n <!-- Status -->\n @if (selectedTask()!.status) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-flag\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ selectedTask()!.status.title }}</span>\n </div>\n </div>\n }\n\n <!-- Assignee -->\n @if (selectedTask()!.assignee) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-user\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{\n selectedTask()!.assignee?.fullName || selectedTask()!.assignee?.username || 'Unassigned'\n }}</span>\n </div>\n </div>\n }\n\n <!-- Priority -->\n @if (selectedTask()!.priority) {\n <div class=\"task-popover__info-item\">\n <div\n class=\"task-popover__icon task-popover__icon--priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n <i class=\"fa-light fa-exclamation-circle\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span\n class=\"task-popover__info-text task-popover__priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n {{ selectedTask()!.priority }}\n </span>\n </div>\n </div>\n }\n </div>\n\n <!-- Actions Section -->\n <div class=\"task-popover__actions\">\n <!-- Task Actions from Provider -->\n @if (taskActions().length > 0) {\n <div class=\"task-popover__actions-group\">\n <!-- Primary Actions: Icon-only buttons -->\n @if (primaryActions().length > 0) {\n @for (action of primaryActions(); track action.name || action.title) {\n <ax-button\n [look]=\"'solid'\"\n [color]=\"getActionColor(action)\"\n (onClick)=\"executeAction(action)\"\n [disabled]=\"action.disabled === true\"\n [text]=\"(action.title | translate | async)!\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n }\n\n <!-- Secondary Actions: Dropdown with \"...\" button -->\n @if (secondaryActions().length > 0) {\n <ax-button [look]=\"'blank'\">\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-ellipsis-vertical\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of secondaryActions(); track action.name || action.title) {\n <ax-button-item\n [text]=\"(action.title | translate | async)!\"\n [disabled]=\"action.disabled === true\"\n (onClick)=\"executeAction(action)\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n</ax-popover>\n", styles: ["ax-kanban{--ax-comp-kanban-status-min-height: 100%;--ax-comp-kanban-status-min-width: 25rem;height:100%;line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}.task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.task-popover__header{padding:20px 20px 16px;border-bottom:1px solid var(--ax-sys-color-border);background:linear-gradient(to bottom,var(--ax-sys-color-lightest-surface),var(--ax-sys-color-lighter-surface))}.task-popover__title-section{display:flex;flex-direction:column;gap:8px}.task-popover__title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.task-popover__title{font-size:18px;font-weight:600;line-height:1.4;color:var(--ax-sys-color-text-primary);margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-popover__close-btn{flex-shrink:0;background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ax-sys-color-text-neutral-600);transition:color .2s ease;border-radius:4px}.task-popover__close-btn:hover{color:var(--ax-sys-color-text-primary);background:var(--ax-sys-color-lighter-surface)}.task-popover__close-btn:active{background:var(--ax-sys-color-light-surface)}.task-popover__close-btn ax-icon{display:block;width:16px;height:16px}.task-popover__description{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-secondary);margin:0;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.task-popover__content{padding:16px 20px;display:flex;flex-direction:column;gap:12px;flex:1}.task-popover__info-item{display:flex;align-items:flex-start;gap:12px;min-height:24px}.task-popover__icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;color:var(--ax-sys-color-text-neutral-600);font-size:14px}.task-popover__icon i{display:block}.task-popover__icon--priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__time{font-weight:500;color:var(--ax-sys-color-text-primary);margin-left:4px}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}.task-popover__actions-group--default{margin-top:4px;padding-top:8px;border-top:1px solid var(--ax-sys-color-border)}.task-popover__action-divider{width:100%;height:1px;background:var(--ax-sys-color-border);margin:4px 0}.task-popover__action-btn{min-width:100px;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXKanbanComponent, selector: "ax-kanban", inputs: ["hasActions", "dragStartDelay", "statuses", "itemTemplate", "dataSource", "keyField", "indexField", "titleField", "cssClassField", "priorityField", "statusKeyField", "descriptionField", "emptyTemplate", "headerTemplate", "footerTemplate", "contentFooterTemplate", "tooltipTemplate"], outputs: ["onBeforeDrop", "onSortChanged", "onItemClick", "onActionClick", "onItemDblClick", "onItemRightClick"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3.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: "component", type: i3.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i3.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i4.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i5.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i5.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1279
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.9", type: AXMTaskBoardKanbanViewComponent, isStandalone: true, selector: "axm-task-board-kanban-view", inputs: { tasks: { classPropertyName: "tasks", publicName: "tasks", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { tasks: "tasksChange", onTaskClick: "onTaskClick", onTaskChanged: "onTaskChanged", component: "component", onActionClick: "onActionClick" }, viewQueries: [{ propertyName: "kanbanComponent", first: true, predicate: AXKanbanComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<ax-kanban\n [statuses]=\"statuses()\"\n [dataSource]=\"kanbanTasks()\"\n (onItemClick)=\"handleItemClick($event)\"\n (onBeforeDrop)=\"onBeforeDrop($event)\"\n (onSortChanged)=\"onSortChanged($event)\"\n></ax-kanban>\n", styles: [".task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.task-popover__header{padding:20px 20px 16px;border-bottom:1px solid var(--ax-sys-color-border);background:linear-gradient(to bottom,var(--ax-sys-color-lightest-surface),var(--ax-sys-color-lighter-surface))}.task-popover__title-section{display:flex;flex-direction:column;gap:8px}.task-popover__title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.task-popover__title{font-size:18px;font-weight:600;line-height:1.4;color:var(--ax-sys-color-text-primary);margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-popover__close-btn{flex-shrink:0;background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ax-sys-color-text-neutral-600);transition:color .2s ease;border-radius:4px}.task-popover__close-btn:hover{color:var(--ax-sys-color-text-primary);background:var(--ax-sys-color-lighter-surface)}.task-popover__close-btn:active{background:var(--ax-sys-color-light-surface)}.task-popover__close-btn ax-icon{display:block;width:16px;height:16px}.task-popover__body{display:flex;flex-direction:column}.task-popover__description{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-secondary);margin:0;padding:0 20px 12px;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.task-popover__content{padding:16px 20px;display:flex;flex-direction:column;gap:12px;flex:1}.task-popover__info-item{display:flex;align-items:flex-start;gap:12px;min-height:24px}.task-popover__icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;color:var(--ax-sys-color-text-neutral-600);font-size:14px}.task-popover__icon i{display:block}.task-popover__icon--priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}ax-kanban{--ax-comp-kanban-status-min-height: 100%;--ax-comp-kanban-status-min-width: 25rem;height:100%;line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}\n"], dependencies: [{ kind: "component", type: AXKanbanComponent, selector: "ax-kanban", inputs: ["hasActions", "dragStartDelay", "statuses", "itemTemplate", "dataSource", "keyField", "indexField", "titleField", "cssClassField", "priorityField", "statusKeyField", "descriptionField", "emptyTemplate", "headerTemplate", "footerTemplate", "contentFooterTemplate", "tooltipTemplate"], outputs: ["onBeforeDrop", "onSortChanged", "onItemClick", "onActionClick", "onItemDblClick", "onItemRightClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1691
1280
  }
1692
1281
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardKanbanViewComponent, decorators: [{
1693
1282
  type: Component,
1694
- args: [{ selector: 'axm-task-board-kanban-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
1695
- CommonModule,
1696
- AXKanbanComponent,
1697
- AXPopoverModule,
1698
- AXButtonModule,
1699
- AXDropdownModule,
1700
- AXDecoratorModule,
1701
- AXTranslationModule,
1702
- ], template: "<ax-kanban\n [statuses]=\"statuses()\"\n [dataSource]=\"kanbanTasks()\"\n (onItemClick)=\"handleItemClick($event)\"\n (onBeforeDrop)=\"onBeforeDrop($event)\"\n (onSortChanged)=\"onSortChanged($event)\"\n></ax-kanban>\n\n<!-- Task Detail Popover (Modern Google Calendar Style) -->\n<ax-popover\n #taskPopover\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [offsetY]=\"12\"\n [offsetX]=\"12\"\n [adaptivityEnabled]=\"true\"\n>\n <div>\n @if (selectedTask()) {\n <div class=\"task-popover ax-shadow-md ax-border\">\n <!-- Header Section -->\n <div class=\"task-popover__header\">\n <div class=\"task-popover__title-section\">\n <div class=\"task-popover__title-row\">\n <h3 class=\"task-popover__title\" [title]=\"selectedTask()!.title\">{{ selectedTask()!.title }}</h3>\n <button type=\"button\" class=\"task-popover__close-btn\" (click)=\"closePopover()\" aria-label=\"Close\">\n <ax-icon class=\"ax-icon ax-icon-close\"></ax-icon>\n </button>\n </div>\n @if (selectedTask()!.description && !customComponentType()) {\n <p class=\"task-popover__description\">{{ selectedTask()!.description }}</p>\n }\n </div>\n </div>\n\n <!-- Custom Component or Default Content -->\n @if (customComponentType()) {\n <!-- Custom Component from Provider -->\n <div class=\"task-popover__custom-content\">\n <ng-container *ngComponentOutlet=\"customComponentType()!; inputs: customComponentInputs()!\"></ng-container>\n </div>\n } @else {\n <!-- Default Content Section -->\n <div class=\"task-popover__content\">\n <!-- Time -->\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-clock\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ formatDateRange(selectedTask()!) }}</span>\n </div>\n </div>\n\n <!-- Status -->\n @if (selectedTask()!.status) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-flag\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{ selectedTask()!.status.title }}</span>\n </div>\n </div>\n }\n\n <!-- Assignee -->\n @if (selectedTask()!.assignee) {\n <div class=\"task-popover__info-item\">\n <div class=\"task-popover__icon\">\n <i class=\"fa-light fa-user\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span class=\"task-popover__info-text\">{{\n selectedTask()!.assignee?.fullName || selectedTask()!.assignee?.username || 'Unassigned'\n }}</span>\n </div>\n </div>\n }\n\n <!-- Priority -->\n @if (selectedTask()!.priority) {\n <div class=\"task-popover__info-item\">\n <div\n class=\"task-popover__icon task-popover__icon--priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n <i class=\"fa-light fa-exclamation-circle\"></i>\n </div>\n <div class=\"task-popover__info-content\">\n <span\n class=\"task-popover__info-text task-popover__priority\"\n [attr.data-priority]=\"selectedTask()!.priority\"\n >\n {{ selectedTask()!.priority }}\n </span>\n </div>\n </div>\n }\n </div>\n\n <!-- Actions Section -->\n <div class=\"task-popover__actions\">\n <!-- Task Actions from Provider -->\n @if (taskActions().length > 0) {\n <div class=\"task-popover__actions-group\">\n <!-- Primary Actions: Icon-only buttons -->\n @if (primaryActions().length > 0) {\n @for (action of primaryActions(); track action.name || action.title) {\n <ax-button\n [look]=\"'solid'\"\n [color]=\"getActionColor(action)\"\n (onClick)=\"executeAction(action)\"\n [disabled]=\"action.disabled === true\"\n [text]=\"(action.title | translate | async)!\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n }\n\n <!-- Secondary Actions: Dropdown with \"...\" button -->\n @if (secondaryActions().length > 0) {\n <ax-button [look]=\"'blank'\">\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-ellipsis-vertical\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of secondaryActions(); track action.name || action.title) {\n <ax-button-item\n [text]=\"(action.title | translate | async)!\"\n [disabled]=\"action.disabled === true\"\n (onClick)=\"executeAction(action)\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon>\n <i [class]=\"action.icon\"></i>\n </ax-icon>\n </ax-prefix>\n }\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n</ax-popover>\n", styles: ["ax-kanban{--ax-comp-kanban-status-min-height: 100%;--ax-comp-kanban-status-min-width: 25rem;height:100%;line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}.task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.task-popover__header{padding:20px 20px 16px;border-bottom:1px solid var(--ax-sys-color-border);background:linear-gradient(to bottom,var(--ax-sys-color-lightest-surface),var(--ax-sys-color-lighter-surface))}.task-popover__title-section{display:flex;flex-direction:column;gap:8px}.task-popover__title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.task-popover__title{font-size:18px;font-weight:600;line-height:1.4;color:var(--ax-sys-color-text-primary);margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-popover__close-btn{flex-shrink:0;background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ax-sys-color-text-neutral-600);transition:color .2s ease;border-radius:4px}.task-popover__close-btn:hover{color:var(--ax-sys-color-text-primary);background:var(--ax-sys-color-lighter-surface)}.task-popover__close-btn:active{background:var(--ax-sys-color-light-surface)}.task-popover__close-btn ax-icon{display:block;width:16px;height:16px}.task-popover__description{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-secondary);margin:0;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.task-popover__content{padding:16px 20px;display:flex;flex-direction:column;gap:12px;flex:1}.task-popover__info-item{display:flex;align-items:flex-start;gap:12px;min-height:24px}.task-popover__icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;color:var(--ax-sys-color-text-neutral-600);font-size:14px}.task-popover__icon i{display:block}.task-popover__icon--priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__time{font-weight:500;color:var(--ax-sys-color-text-primary);margin-left:4px}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}.task-popover__actions-group--default{margin-top:4px;padding-top:8px;border-top:1px solid var(--ax-sys-color-border)}.task-popover__action-divider{width:100%;height:1px;background:var(--ax-sys-color-border);margin:4px 0}.task-popover__action-btn{min-width:100px;white-space:nowrap}\n"] }]
1703
- }], propDecorators: { kanbanComponent: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXKanbanComponent), { isSignal: true }] }], taskPopover: [{ type: i0.ViewChild, args: ['taskPopover', { isSignal: true }] }], tasks: [{ type: i0.Input, args: [{ isSignal: true, alias: "tasks", required: true }] }, { type: i0.Output, args: ["tasksChange"] }], onTaskClick: [{ type: i0.Output, args: ["onTaskClick"] }], onTaskChanged: [{ type: i0.Output, args: ["onTaskChanged"] }], component: [{ type: i0.Output, args: ["component"] }], onActionClick: [{ type: i0.Output, args: ["onActionClick"] }] } });
1283
+ args: [{ selector: 'axm-task-board-kanban-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXKanbanComponent], template: "<ax-kanban\n [statuses]=\"statuses()\"\n [dataSource]=\"kanbanTasks()\"\n (onItemClick)=\"handleItemClick($event)\"\n (onBeforeDrop)=\"onBeforeDrop($event)\"\n (onSortChanged)=\"onSortChanged($event)\"\n></ax-kanban>\n", styles: [".task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.task-popover__header{padding:20px 20px 16px;border-bottom:1px solid var(--ax-sys-color-border);background:linear-gradient(to bottom,var(--ax-sys-color-lightest-surface),var(--ax-sys-color-lighter-surface))}.task-popover__title-section{display:flex;flex-direction:column;gap:8px}.task-popover__title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.task-popover__title{font-size:18px;font-weight:600;line-height:1.4;color:var(--ax-sys-color-text-primary);margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-popover__close-btn{flex-shrink:0;background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ax-sys-color-text-neutral-600);transition:color .2s ease;border-radius:4px}.task-popover__close-btn:hover{color:var(--ax-sys-color-text-primary);background:var(--ax-sys-color-lighter-surface)}.task-popover__close-btn:active{background:var(--ax-sys-color-light-surface)}.task-popover__close-btn ax-icon{display:block;width:16px;height:16px}.task-popover__body{display:flex;flex-direction:column}.task-popover__description{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-secondary);margin:0;padding:0 20px 12px;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.task-popover__content{padding:16px 20px;display:flex;flex-direction:column;gap:12px;flex:1}.task-popover__info-item{display:flex;align-items:flex-start;gap:12px;min-height:24px}.task-popover__icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;color:var(--ax-sys-color-text-neutral-600);font-size:14px}.task-popover__icon i{display:block}.task-popover__icon--priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}ax-kanban{--ax-comp-kanban-status-min-height: 100%;--ax-comp-kanban-status-min-width: 25rem;height:100%;line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}\n"] }]
1284
+ }], propDecorators: { kanbanComponent: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXKanbanComponent), { isSignal: true }] }], tasks: [{ type: i0.Input, args: [{ isSignal: true, alias: "tasks", required: true }] }, { type: i0.Output, args: ["tasksChange"] }], onTaskClick: [{ type: i0.Output, args: ["onTaskClick"] }], onTaskChanged: [{ type: i0.Output, args: ["onTaskChanged"] }], component: [{ type: i0.Output, args: ["component"] }], onActionClick: [{ type: i0.Output, args: ["onActionClick"] }] } });
1704
1285
 
1705
- /** Stable row identity for @for; includes refresh nonce so tables remount after board refresh. */
1706
1286
  function statusGroupTrackKey(nonce, group) {
1707
1287
  return `${nonce}:${String(group.statusInfo.key)}`;
1708
1288
  }
@@ -1710,28 +1290,27 @@ function taskMatchesStatus(task, status) {
1710
1290
  return String(task.status.id) === String(status.key);
1711
1291
  }
1712
1292
  class AXMTaskBoardStatusGroupedGridViewComponent {
1713
- #dataChanged;
1714
- #providerChanged;
1715
- #gridsChanged;
1716
1293
  constructor() {
1717
1294
  this.vm = inject(AXMTaskBoardViewModel);
1718
1295
  this.localeService = inject(AXLocaleService);
1719
1296
  this.calendarService = inject(AXCalendarService);
1297
+ this.taskBoardService = inject(AXPTaskBoardService);
1298
+ this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
1299
+ this.destroyRef = inject(DestroyRef);
1720
1300
  this.provider = input(...(ngDevMode ? [undefined, { debugName: "provider" }] : /* istanbul ignore next */ []));
1721
1301
  this.dataSource = input.required(...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
1722
1302
  this.refreshNonce = input(0, ...(ngDevMode ? [{ debugName: "refreshNonce" }] : /* istanbul ignore next */ []));
1723
- this.onActionClick = output();
1724
1303
  this.onTaskClick = output();
1725
1304
  this.groupedTasks = signal([], ...(ngDevMode ? [{ debugName: "groupedTasks" }] : /* istanbul ignore next */ []));
1726
1305
  this.allFetchedTasks = signal([], ...(ngDevMode ? [{ debugName: "allFetchedTasks" }] : /* istanbul ignore next */ []));
1727
1306
  this.columns = signal([], ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
1728
1307
  this.statuses = signal([], ...(ngDevMode ? [{ debugName: "statuses" }] : /* istanbul ignore next */ []));
1729
1308
  this.grids = viewChildren('grid', ...(ngDevMode ? [{ debugName: "grids" }] : /* istanbul ignore next */ []));
1730
- /** Used by the template so status tables remount when the board refreshes (same as flat grid). */
1309
+ this.taskRowCommandWidth = TASK_BOARD_GRID_ROW_ACTION_COLUMN_WIDTH;
1310
+ this.taskRowCommandItems = TASK_BOARD_GRID_ROW_ACTION_ITEMS;
1731
1311
  this.trackStatusGroup = (_index, group) => statusGroupTrackKey(this.refreshNonce(), group);
1732
1312
  this.groupedViewRemountKeys = computed(() => [this.refreshNonce()], ...(ngDevMode ? [{ debugName: "groupedViewRemountKeys" }] : /* istanbul ignore next */ []));
1733
1313
  this.#dataChanged = effect(() => {
1734
- // Track filter-related signals that affect the data source
1735
1314
  this.vm.selectedTaskTypeNames();
1736
1315
  this.vm.selectedAssigneeIds();
1737
1316
  this.vm.selectedReporterIds();
@@ -1784,10 +1363,8 @@ class AXMTaskBoardStatusGroupedGridViewComponent {
1784
1363
  });
1785
1364
  }, ...(ngDevMode ? [{ debugName: "#providerChanged" }] : /* istanbul ignore next */ []));
1786
1365
  this.#gridsChanged = effect(() => {
1787
- // Track when groupedTasks changes to refresh grids
1788
1366
  const groups = this.groupedTasks();
1789
1367
  untracked(() => {
1790
- // Wait for grids to be rendered
1791
1368
  setTimeout(() => {
1792
1369
  this.grids().forEach((grid) => {
1793
1370
  grid.refresh({ reset: true });
@@ -1795,23 +1372,32 @@ class AXMTaskBoardStatusGroupedGridViewComponent {
1795
1372
  }, 100);
1796
1373
  });
1797
1374
  }, ...(ngDevMode ? [{ debugName: "#gridsChanged" }] : /* istanbul ignore next */ []));
1798
- // Ensure data sources are refreshed after initial render
1799
1375
  afterNextRender(() => {
1800
1376
  untracked(() => {
1801
- // Use a longer timeout to ensure data tables are fully rendered
1802
1377
  setTimeout(() => {
1803
- // Refresh data sources
1804
1378
  this.groupedTasks()?.forEach((group) => {
1805
1379
  group.tasks.refresh();
1806
1380
  });
1807
- // Refresh data table components
1808
1381
  this.grids().forEach((grid) => {
1809
1382
  grid.refresh({ reset: true });
1810
1383
  });
1811
1384
  }, 200);
1812
1385
  });
1813
1386
  });
1387
+ this.taskBoardService.close$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data) => {
1388
+ const active = this.taskPopoverOverlay.getActiveTask();
1389
+ if (!active?.provider) {
1390
+ return;
1391
+ }
1392
+ if (data.provider && data.provider !== active.provider) {
1393
+ return;
1394
+ }
1395
+ this.taskPopoverOverlay.close();
1396
+ });
1814
1397
  }
1398
+ #dataChanged;
1399
+ #providerChanged;
1400
+ #gridsChanged;
1815
1401
  createTaskDataSourceForGroup(tasks) {
1816
1402
  return new AXDataSource({
1817
1403
  load: async (e) => {
@@ -1843,12 +1429,6 @@ class AXMTaskBoardStatusGroupedGridViewComponent {
1843
1429
  },
1844
1430
  });
1845
1431
  }
1846
- onActionClickHandler(e) {
1847
- const task = this.allFetchedTasks().find((task) => task.id === e.data.id);
1848
- if (!task)
1849
- return;
1850
- this.onActionClick.emit({ nativeEvent: e.nativeEvent, task });
1851
- }
1852
1432
  handleRowClick(event) {
1853
1433
  if (!event.data) {
1854
1434
  return;
@@ -1859,13 +1439,37 @@ class AXMTaskBoardStatusGroupedGridViewComponent {
1859
1439
  this.onTaskClick.emit(originalTask);
1860
1440
  }
1861
1441
  }
1442
+ handleTaskCommandClick(event) {
1443
+ if (event.name !== 'view') {
1444
+ return;
1445
+ }
1446
+ event.nativeEvent?.stopPropagation();
1447
+ const mappedItem = event.data;
1448
+ const task = mappedItem._originalTask ?? this.allFetchedTasks().find((t) => t.id === mappedItem.id);
1449
+ if (!task) {
1450
+ return;
1451
+ }
1452
+ const anchor = this.taskPopoverOverlay.resolveAnchorFromCommandClick(event);
1453
+ if (!anchor) {
1454
+ return;
1455
+ }
1456
+ setTimeout(() => {
1457
+ void this.taskPopoverOverlay.open({
1458
+ task,
1459
+ anchor,
1460
+ placement: 'bottom-start',
1461
+ adaptivityEnabled: false,
1462
+ autoFlip: true,
1463
+ });
1464
+ }, 0);
1465
+ }
1862
1466
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardStatusGroupedGridViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1863
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardStatusGroupedGridViewComponent, isStandalone: true, selector: "axm-task-board-status-grouped-grid-view", inputs: { provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, refreshNonce: { classPropertyName: "refreshNonce", publicName: "refreshNonce", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onActionClick: "onActionClick", onTaskClick: "onTaskClick" }, viewQueries: [{ propertyName: "grids", predicate: ["grid"], descendants: true, isSignal: true }], ngImport: i0, template: "@for (remountKey of groupedViewRemountKeys(); track remountKey) {\n @for (group of groupedTasks(); track trackStatusGroup($index, group)) {\n <h1 class=\"ax-text-xl ax-font-bold\">{{ group.statusInfo.title }}</h1>\n <ax-data-table\n #grid\n class=\"ax-h-[300px]\"\n [fetchDataMode]=\"'manual'\"\n [dataSource]=\"group.tasks\"\n [loading]=\"{ enabled: true, animation: true }\"\n (onRowClick)=\"handleRowClick($event)\"\n >\n <ax-text-column\n dataField=\"title\"\n [caption]=\"('@task-management:task-board.grid-headers.title' | translate | async)!\"\n [width]=\"'350px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"description\"\n [caption]=\"('@task-management:task-board.grid-headers.description' | translate | async)!\"\n [width]=\"'500px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"startDate\"\n [caption]=\"('@task-management:task-board.grid-headers.start-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"endDate\"\n [caption]=\"('@task-management:task-board.grid-headers.due-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"priority\"\n [caption]=\"('@task-management:task-board.grid-headers.priority' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"reporter\"\n [caption]=\"('@task-management:task-board.grid-headers.reporter' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"assignee\"\n [caption]=\"('@task-management:task-board.grid-headers.assignee' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n\n <ax-command-column\n fixed=\"end\"\n [width]=\"'75px'\"\n (onItemClick)=\"onActionClickHandler($event)\"\n [items]=\"[\n {\n name: 'view',\n text: ('@task-management:task-board.grid-headers.action-view' | translate | async) ?? 'View',\n icon: 'ax-icon ax-icon-more-horizontal',\n },\n ]\"\n ></ax-command-column>\n </ax-data-table>\n }\n}\n", styles: ["ax-kanban{--ax-comp-kanban-status-min-width: 25rem;height:100%;line-height:1.5}\n"], dependencies: [{ kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i1$2.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "title", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i1$2.AXDataTableTextColumnComponent, selector: "ax-text-column", inputs: ["width", "caption", "allowSorting", "allowResizing", "fixed", "customExpandIcon", "customCollapseIcon", "dataField", "expandHandler", "wrapText", "cellTemplate", "footerTemplate", "headerTemplate", "format", "formatOptions"] }, { kind: "component", type: i1$2.AXRowCommandColumnComponent, selector: "ax-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1467
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardStatusGroupedGridViewComponent, isStandalone: true, selector: "axm-task-board-status-grouped-grid-view", inputs: { provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, refreshNonce: { classPropertyName: "refreshNonce", publicName: "refreshNonce", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onTaskClick: "onTaskClick" }, viewQueries: [{ propertyName: "grids", predicate: ["grid"], descendants: true, isSignal: true }], ngImport: i0, template: "@for (remountKey of groupedViewRemountKeys(); track remountKey) {\n @for (group of groupedTasks(); track trackStatusGroup($index, group)) {\n <h1 class=\"ax-text-xl ax-font-bold\">{{ group.statusInfo.title }}</h1>\n <ax-data-table\n #grid\n class=\"ax-h-[300px]\"\n [fetchDataMode]=\"'manual'\"\n [dataSource]=\"group.tasks\"\n [loading]=\"{ enabled: true, animation: true }\"\n (onRowClick)=\"handleRowClick($event)\"\n >\n <ax-text-column\n dataField=\"title\"\n [caption]=\"('@task-management:task-board.grid-headers.title' | translate | async)!\"\n [width]=\"'350px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"description\"\n [caption]=\"('@task-management:task-board.grid-headers.description' | translate | async)!\"\n [width]=\"'500px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"startDate\"\n [caption]=\"('@task-management:task-board.grid-headers.start-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"endDate\"\n [caption]=\"('@task-management:task-board.grid-headers.due-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"priority\"\n [caption]=\"('@task-management:task-board.grid-headers.priority' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"reporter\"\n [caption]=\"('@task-management:task-board.grid-headers.reporter' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"assignee\"\n [caption]=\"('@task-management:task-board.grid-headers.assignee' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n\n <ax-command-column\n fixed=\"end\"\n [width]=\"taskRowCommandWidth\"\n [items]=\"taskRowCommandItems\"\n (onItemClick)=\"handleTaskCommandClick($event)\"\n ></ax-command-column>\n </ax-data-table>\n }\n}\n", dependencies: [{ kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i1$2.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "title", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i1$2.AXDataTableTextColumnComponent, selector: "ax-text-column", inputs: ["width", "caption", "allowSorting", "allowResizing", "fixed", "customExpandIcon", "customCollapseIcon", "dataField", "expandHandler", "wrapText", "cellTemplate", "footerTemplate", "headerTemplate", "format", "formatOptions"] }, { kind: "component", type: i1$2.AXRowCommandColumnComponent, selector: "ax-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1864
1468
  }
1865
1469
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardStatusGroupedGridViewComponent, decorators: [{
1866
1470
  type: Component,
1867
- args: [{ selector: 'axm-task-board-status-grouped-grid-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXDataTableModule, AXTranslatorPipe, AsyncPipe, AXPWidgetCoreModule], template: "@for (remountKey of groupedViewRemountKeys(); track remountKey) {\n @for (group of groupedTasks(); track trackStatusGroup($index, group)) {\n <h1 class=\"ax-text-xl ax-font-bold\">{{ group.statusInfo.title }}</h1>\n <ax-data-table\n #grid\n class=\"ax-h-[300px]\"\n [fetchDataMode]=\"'manual'\"\n [dataSource]=\"group.tasks\"\n [loading]=\"{ enabled: true, animation: true }\"\n (onRowClick)=\"handleRowClick($event)\"\n >\n <ax-text-column\n dataField=\"title\"\n [caption]=\"('@task-management:task-board.grid-headers.title' | translate | async)!\"\n [width]=\"'350px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"description\"\n [caption]=\"('@task-management:task-board.grid-headers.description' | translate | async)!\"\n [width]=\"'500px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"startDate\"\n [caption]=\"('@task-management:task-board.grid-headers.start-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"endDate\"\n [caption]=\"('@task-management:task-board.grid-headers.due-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"priority\"\n [caption]=\"('@task-management:task-board.grid-headers.priority' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"reporter\"\n [caption]=\"('@task-management:task-board.grid-headers.reporter' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"assignee\"\n [caption]=\"('@task-management:task-board.grid-headers.assignee' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n\n <ax-command-column\n fixed=\"end\"\n [width]=\"'75px'\"\n (onItemClick)=\"onActionClickHandler($event)\"\n [items]=\"[\n {\n name: 'view',\n text: ('@task-management:task-board.grid-headers.action-view' | translate | async) ?? 'View',\n icon: 'ax-icon ax-icon-more-horizontal',\n },\n ]\"\n ></ax-command-column>\n </ax-data-table>\n }\n}\n", styles: ["ax-kanban{--ax-comp-kanban-status-min-width: 25rem;height:100%;line-height:1.5}\n"] }]
1868
- }], ctorParameters: () => [], propDecorators: { provider: [{ type: i0.Input, args: [{ isSignal: true, alias: "provider", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], refreshNonce: [{ type: i0.Input, args: [{ isSignal: true, alias: "refreshNonce", required: false }] }], onActionClick: [{ type: i0.Output, args: ["onActionClick"] }], onTaskClick: [{ type: i0.Output, args: ["onTaskClick"] }], grids: [{ type: i0.ViewChildren, args: ['grid', { isSignal: true }] }] } });
1471
+ args: [{ selector: 'axm-task-board-status-grouped-grid-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXDataTableModule, AXTranslatorPipe, AsyncPipe, AXPWidgetCoreModule], template: "@for (remountKey of groupedViewRemountKeys(); track remountKey) {\n @for (group of groupedTasks(); track trackStatusGroup($index, group)) {\n <h1 class=\"ax-text-xl ax-font-bold\">{{ group.statusInfo.title }}</h1>\n <ax-data-table\n #grid\n class=\"ax-h-[300px]\"\n [fetchDataMode]=\"'manual'\"\n [dataSource]=\"group.tasks\"\n [loading]=\"{ enabled: true, animation: true }\"\n (onRowClick)=\"handleRowClick($event)\"\n >\n <ax-text-column\n dataField=\"title\"\n [caption]=\"('@task-management:task-board.grid-headers.title' | translate | async)!\"\n [width]=\"'350px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"description\"\n [caption]=\"('@task-management:task-board.grid-headers.description' | translate | async)!\"\n [width]=\"'500px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"startDate\"\n [caption]=\"('@task-management:task-board.grid-headers.start-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"endDate\"\n [caption]=\"('@task-management:task-board.grid-headers.due-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"priority\"\n [caption]=\"('@task-management:task-board.grid-headers.priority' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"reporter\"\n [caption]=\"('@task-management:task-board.grid-headers.reporter' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"assignee\"\n [caption]=\"('@task-management:task-board.grid-headers.assignee' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n\n <ax-command-column\n fixed=\"end\"\n [width]=\"taskRowCommandWidth\"\n [items]=\"taskRowCommandItems\"\n (onItemClick)=\"handleTaskCommandClick($event)\"\n ></ax-command-column>\n </ax-data-table>\n }\n}\n" }]
1472
+ }], ctorParameters: () => [], propDecorators: { provider: [{ type: i0.Input, args: [{ isSignal: true, alias: "provider", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], refreshNonce: [{ type: i0.Input, args: [{ isSignal: true, alias: "refreshNonce", required: false }] }], onTaskClick: [{ type: i0.Output, args: ["onTaskClick"] }], grids: [{ type: i0.ViewChildren, args: ['grid', { isSignal: true }] }] } });
1869
1473
 
1870
1474
  class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
1871
1475
  constructor() {
@@ -2009,11 +1613,18 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
2009
1613
  };
2010
1614
  }, ...(ngDevMode ? [{ debugName: "filter" }] : /* istanbul ignore next */ []));
2011
1615
  this.contextMenu = viewChild('rootContextMenu', ...(ngDevMode ? [{ debugName: "contextMenu" }] : /* istanbul ignore next */ []));
2012
- this.schedulerDataSource = (filter) => {
2013
- const finalFilter = { ...this.filter(), ...filter };
1616
+ this.schedulerDataSource = (schedulerFilter) => {
1617
+ const pageFilter = this.filter();
1618
+ const visibleRange = schedulerFilter?.range ?? pageFilter.range;
1619
+ const finalFilter = {
1620
+ ...pageFilter,
1621
+ ...schedulerFilter,
1622
+ range: visibleRange,
1623
+ };
2014
1624
  return this.taskBoardService.getTasks(finalFilter).then((result) => {
2015
- this.validateSelectedTask(result.items);
2016
- return result.items;
1625
+ const items = filterTasksOverlappingRange(result.items, visibleRange);
1626
+ this.validateSelectedTask(items);
1627
+ return items;
2017
1628
  });
2018
1629
  };
2019
1630
  this.gridDataSource = (filter) => {
@@ -2442,7 +2053,8 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
2442
2053
  this.popover()?.close();
2443
2054
  return;
2444
2055
  }
2445
- let dateToSet = new Date(clickedDate);
2056
+ const calendarSystem = this.localeService.activeProfile().calendar.system;
2057
+ let dateToSet = this.calendarService.create(clickedDate, calendarSystem).startOf('day').date;
2446
2058
  if (currentView === 'week') {
2447
2059
  const day = dateToSet.getDay();
2448
2060
  const weekStart = this.localeService.activeProfile().calendar.week.startsOn;
@@ -2456,6 +2068,7 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
2456
2068
  this.popover()?.close();
2457
2069
  this.calendar()?.render();
2458
2070
  this.sidebarCalendar()?.render();
2071
+ this.schedulerComponent()?.refresh();
2459
2072
  }
2460
2073
  /**
2461
2074
  * Helper function to calculate the difference in whole days between two dates.
@@ -2579,11 +2192,11 @@ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
2579
2192
  provide: AXPPageLayoutBase,
2580
2193
  useExisting: AXMTaskBoardPage,
2581
2194
  },
2582
- ], viewQueries: [{ propertyName: "popover", first: true, predicate: ["popover"], descendants: true, isSignal: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true, isSignal: true }, { propertyName: "sidebarCalendar", first: true, predicate: ["sidebarCalendar"], descendants: true, isSignal: true }, { propertyName: "contextMenu", first: true, predicate: ["rootContextMenu"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <axp-layout-start-side\n class=\"ax-border-e ax-lightest-surface ax-h-full ax-min-w-0\"\n [style.width]=\"sidebarCollapsed() ? 'auto' : null\"\n >\n <axp-layout-header\n class=\"ax-flex !ax-flex-row ax-items-center ax-gap-2\"\n [class.ax-justify-center]=\"sidebarCollapsed()\"\n [class.ax-border-b]=\"!sidebarCollapsed()\"\n >\n @if (!sidebarCollapsed()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'sidebar' }\"></ng-container>\n }\n <ax-button look=\"blank\" color=\"neutral\" (onClick)=\"toggleSidebar()\" [iconOnly]=\"true\">\n <ax-icon [icon]=\"sidebarCollapsed() ? 'fa-light fa-chevrons-right' : 'fa-light fa-chevrons-left'\"></ax-icon>\n </ax-button>\n </axp-layout-header>\n\n @if (!sidebarCollapsed()) {\n <axp-layout-content class=\"ax-flex ax-flex-col ax-min-h-0 ax-overflow-y-auto\">\n <div class=\"ax-p-4 ax-flex ax-flex-col ax-gap-6\">\n <div class=\"ax-flex ax-flex-col ax-gap-3\">\n <ax-calendar\n #sidebarCalendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"currentDateForCalendar()\"\n [dayCellTemplate]=\"dayCellTemplate\"\n [monthCellTemplate]=\"monthCellTemplate\"\n class=\"ax-single-range-calendar ax-border ax-rounded-lg\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n </ax-calendar>\n </div>\n\n <div axAccordionGroup [accordion]=\"false\">\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarFilterTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.title-plural' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarFilterTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n <div axAccordionItemContent>\n <axm-task-board-filters #filtersComponent [isQueryParam]=\"isQueryParam()\"></axm-task-board-filters>\n </div>\n </div>\n @if (!isNonCalendarView()) {\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarEventTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.calendars' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarEventTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n @if (calendarEventTypeItems().length > 0) {\n <div axAccordionItemContent>\n <div class=\"ax-pt-2\">\n <ax-selection-list\n [items]=\"calendarEventTypeItems()\"\n [ngModel]=\"selectedCalendarEventTypeValues()\"\n (onValueChanged)=\"handleCalendarEventTypeSelectionChange($event.value)\"\n direction=\"vertical\"\n [multiple]=\"true\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </axp-layout-content>\n }\n </axp-layout-start-side>\n <axp-page-toolbar>\n <axp-layout-prefix class=\"sm:ax-flex-row ax-flex-col ax-items-start\">\n <div class=\"ax-scheduler-header ax-w-max ax-sm sm:ax-md\">\n <ax-button look=\"blank\" (onClick)=\"changeDate(false)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-left arrow-icon\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"timeText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"changeDate(true)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-right arrow-icon\"></ax-icon>\n </ax-button>\n <!-- <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n #calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"vm.currentDate()\"\n class=\"ax-single-range-calendar\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n <ax-footer>\n <ax-button\n look=\"link\"\n color=\"primary\"\n [text]=\"todayButtonText()\"\n (onClick)=\"handleTodayClick()\"\n ></ax-button>\n </ax-footer>\n </ax-calendar>\n </div>\n </ax-popover> -->\n </div>\n </axp-layout-prefix>\n\n <axp-layout-suffix>\n @if (deviceService.isSmall()) {\n <ax-button id=\"axp-toolbar-btn-filters\" (onClick)=\"toggleStartSide()\" [iconOnly]=\"true\" [color]=\"'default'\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button>\n }\n <!-- @if (!deviceService.isSmall()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'toolbar' }\"></ng-container>\n } -->\n\n <!-- @if(deviceService.isLarge()) {\n <ax-button (onClick)=\"vm.toggleDetailPanel()\">\n <ax-icon icon=\"{{ vm.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-flex ax-flex-row ax-gap-2\">\n @if (isReady()) { @switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\"\n [(tasks)]=\"resolvedTasks\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-kanban-view>\n } @case('grid') {\n <axm-task-board-grid-view\n class=\"ax-h-full ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-grid-view>\n } @case('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-status-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\"\n [startingDate]=\"vm.currentDate()\"\n [dataSource]=\"schedulerDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\"\n (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"\n ></axm-task-board-calendar-view>\n } }\n <ax-context-menu\n #rootContextMenu\n [closeOn]=\"'leave'\"\n [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n } } @else {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-w-full ax-h-full\">\n <ax-loading></ax-loading>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #viewSelectorTemplate let-location=\"location\">\n @if (location === 'sidebar') {\n <ax-button\n class=\"ax-grow\"\n [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\"\n >\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #sidebarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n } @else {\n <ax-button [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #toolbarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n }\n</ng-template>\n\n<ng-template #dayCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? slot.slot.date?.day ?? '' }}</span>\n @if (slot.slot.date && getDayDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n\n<ng-template #monthCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? '' }}</span>\n @if (slot.slot.date && getMonthDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n", styles: ["html[dir=rtl] axp-page-layout axp-page-toolbar axp-layout-prefix .ax-scheduler-header .arrow-icon:before{-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scaleX(-1)}.ax-single-range-calendar .ax-range-start,.ax-single-range-calendar .ax-range-end{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.85)!important}.ax-single-range-calendar .ax-range-start:hover,.ax-single-range-calendar .ax-range-end:hover{background-color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-single-range-calendar .ax-range-start.ax-state-holiday,.ax-single-range-calendar .ax-range-end.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.85)!important}.ax-single-range-calendar .ax-range-between{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.65)}.ax-single-range-calendar .ax-range-between.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.65)}.ax-single-range-calendar ax-footer{display:flex;justify-content:center;border-color:rgba(var(--ax-comp-calendar-view-header-border-color));border-top-width:var(--ax-comp-calendar-view-header-border-width, 1px)}axp-page-content:not(:has(axm-task-board-status-grouped-grid-view,axm-task-board-time-grouped-grid-view)){overflow-y:hidden}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
2195
+ ], viewQueries: [{ propertyName: "popover", first: true, predicate: ["popover"], descendants: true, isSignal: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true, isSignal: true }, { propertyName: "sidebarCalendar", first: true, predicate: ["sidebarCalendar"], descendants: true, isSignal: true }, { propertyName: "contextMenu", first: true, predicate: ["rootContextMenu"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <axp-layout-start-side\n class=\"ax-border-e ax-lightest-surface ax-h-full ax-min-w-0\"\n [style.width]=\"sidebarCollapsed() ? 'auto' : null\"\n >\n <axp-layout-header\n class=\"ax-flex !ax-flex-row ax-items-center ax-gap-2\"\n [class.ax-justify-center]=\"sidebarCollapsed()\"\n [class.ax-border-b]=\"!sidebarCollapsed()\"\n >\n @if (!sidebarCollapsed()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'sidebar' }\"></ng-container>\n }\n <ax-button look=\"blank\" color=\"neutral\" (onClick)=\"toggleSidebar()\" [iconOnly]=\"true\">\n <ax-icon [icon]=\"sidebarCollapsed() ? 'fa-light fa-chevrons-right' : 'fa-light fa-chevrons-left'\"></ax-icon>\n </ax-button>\n </axp-layout-header>\n\n @if (!sidebarCollapsed()) {\n <axp-layout-content class=\"ax-flex ax-flex-col ax-min-h-0 ax-overflow-y-auto\">\n <div class=\"ax-p-4 ax-flex ax-flex-col ax-gap-6\">\n <div class=\"ax-flex ax-flex-col ax-gap-3\">\n <ax-calendar\n #sidebarCalendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"currentDateForCalendar()\"\n [dayCellTemplate]=\"dayCellTemplate\"\n [monthCellTemplate]=\"monthCellTemplate\"\n class=\"ax-single-range-calendar ax-border ax-rounded-lg\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n </ax-calendar>\n </div>\n\n <div axAccordionGroup [accordion]=\"false\">\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarFilterTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.title-plural' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarFilterTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n <div axAccordionItemContent>\n <axm-task-board-filters #filtersComponent [isQueryParam]=\"isQueryParam()\"></axm-task-board-filters>\n </div>\n </div>\n @if (!isNonCalendarView()) {\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarEventTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.calendars' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarEventTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n @if (calendarEventTypeItems().length > 0) {\n <div axAccordionItemContent>\n <div class=\"ax-pt-2\">\n <ax-selection-list\n [items]=\"calendarEventTypeItems()\"\n [ngModel]=\"selectedCalendarEventTypeValues()\"\n (onValueChanged)=\"handleCalendarEventTypeSelectionChange($event.value)\"\n direction=\"vertical\"\n [multiple]=\"true\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </axp-layout-content>\n }\n </axp-layout-start-side>\n <axp-page-toolbar>\n <axp-layout-prefix class=\"sm:ax-flex-row ax-flex-col ax-items-start\">\n <div class=\"ax-scheduler-header ax-w-max ax-sm sm:ax-md\">\n <ax-button look=\"blank\" (onClick)=\"changeDate(false)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-left arrow-icon\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"timeText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"changeDate(true)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-right arrow-icon\"></ax-icon>\n </ax-button>\n <!-- <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n #calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"vm.currentDate()\"\n class=\"ax-single-range-calendar\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n <ax-footer>\n <ax-button\n look=\"link\"\n color=\"primary\"\n [text]=\"todayButtonText()\"\n (onClick)=\"handleTodayClick()\"\n ></ax-button>\n </ax-footer>\n </ax-calendar>\n </div>\n </ax-popover> -->\n </div>\n </axp-layout-prefix>\n\n <axp-layout-suffix>\n @if (deviceService.isSmall()) {\n <ax-button id=\"axp-toolbar-btn-filters\" (onClick)=\"toggleStartSide()\" [iconOnly]=\"true\" [color]=\"'default'\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button>\n }\n <!-- @if (!deviceService.isSmall()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'toolbar' }\"></ng-container>\n } -->\n\n <!-- @if(deviceService.isLarge()) {\n <ax-button (onClick)=\"vm.toggleDetailPanel()\">\n <ax-icon icon=\"{{ vm.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-flex ax-flex-row ax-gap-2\">\n @if (isReady()) { @switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\"\n [(tasks)]=\"resolvedTasks\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-kanban-view>\n } @case('grid') {\n <axm-task-board-grid-view\n class=\"ax-h-full ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n ></axm-task-board-grid-view>\n } @case('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n ></axm-task-board-status-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\"\n [startingDate]=\"vm.currentDate()\"\n [dataSource]=\"schedulerDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\"\n (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"\n ></axm-task-board-calendar-view>\n } }\n <ax-context-menu\n #rootContextMenu\n [closeOn]=\"'leave'\"\n [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n } } @else {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-w-full ax-h-full\">\n <ax-loading></ax-loading>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #viewSelectorTemplate let-location=\"location\">\n @if (location === 'sidebar') {\n <ax-button\n class=\"ax-grow\"\n [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\"\n >\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #sidebarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n } @else {\n <ax-button [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #toolbarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n }\n</ng-template>\n\n<ng-template #dayCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? slot.slot.date?.day ?? '' }}</span>\n @if (slot.slot.date && getDayDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n\n<ng-template #monthCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? '' }}</span>\n @if (slot.slot.date && getMonthDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n", styles: ["html[dir=rtl] axp-page-layout axp-page-toolbar axp-layout-prefix .ax-scheduler-header .arrow-icon:before{-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scaleX(-1)}.ax-single-range-calendar .ax-range-start,.ax-single-range-calendar .ax-range-end{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.85)!important}.ax-single-range-calendar .ax-range-start:hover,.ax-single-range-calendar .ax-range-end:hover{background-color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-single-range-calendar .ax-range-start.ax-state-holiday,.ax-single-range-calendar .ax-range-end.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.85)!important}.ax-single-range-calendar .ax-range-between{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.65)}.ax-single-range-calendar .ax-range-between.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.65)}.ax-single-range-calendar ax-footer{display:flex;justify-content:center;border-color:rgba(var(--ax-comp-calendar-view-header-border-color));border-top-width:var(--ax-comp-calendar-view-header-border-width, 1px)}axp-page-content:not(:has(axm-task-board-status-grouped-grid-view,axm-task-board-time-grouped-grid-view)){overflow-y:hidden}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
2583
2196
  //
2584
- AXMenuModule }, { kind: "component", type: i3$1.AXMenuItemComponent, selector: "ax-menu-item", inputs: ["name", "data", "disabled", "color"], outputs: ["onClick"] }, { kind: "component", type: i3$1.AXMenuComponent, selector: "ax-menu", inputs: ["orientation", "openOn", "closeOn", "items", "hasArrow"], outputs: ["onItemClick"] }, { kind: "component", type: i3$1.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3.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: i6.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i5.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i5.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i7.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i8.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXAccordionModule }, { kind: "ngmodule", type: AXAccordionCdkModule }, { kind: "directive", type: i9.AXAccordionGroupDirective, selector: "[axAccordionGroup]", inputs: ["accordion", "activeIndex", "collapsedOnItemClick"], exportAs: ["axAccordionGroup"] }, { kind: "directive", type: i9.AXAccordionItemContentDirective, selector: "[axAccordionItemContent]", inputs: ["transition"], exportAs: ["axAccordionItemContent"] }, { kind: "directive", type: i9.AXAccordionItemHeaderDirective, selector: "[axAccordionItemHeader]", exportAs: ["axAccordionItemHeader"] }, { kind: "directive", type: i9.AXAccordionItemDirective, selector: "[axAccordionItem]", inputs: ["isCollapsed"], outputs: ["isCollapsedChange", "onClick"], exportAs: ["axAccordionItem"] }, { kind: "component", type:
2197
+ AXMenuModule }, { kind: "component", type: i3.AXMenuItemComponent, selector: "ax-menu-item", inputs: ["name", "data", "disabled", "color"], outputs: ["onClick"] }, { kind: "component", type: i3.AXMenuComponent, selector: "ax-menu", inputs: ["orientation", "openOn", "closeOn", "items", "hasArrow"], outputs: ["onItemClick"] }, { kind: "component", type: i3.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$4.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: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i7.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i8.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXAccordionModule }, { kind: "ngmodule", type: AXAccordionCdkModule }, { kind: "directive", type: i9.AXAccordionGroupDirective, selector: "[axAccordionGroup]", inputs: ["accordion", "activeIndex", "collapsedOnItemClick"], exportAs: ["axAccordionGroup"] }, { kind: "directive", type: i9.AXAccordionItemContentDirective, selector: "[axAccordionItemContent]", inputs: ["transition"], exportAs: ["axAccordionItemContent"] }, { kind: "directive", type: i9.AXAccordionItemHeaderDirective, selector: "[axAccordionItemHeader]", exportAs: ["axAccordionItemHeader"] }, { kind: "directive", type: i9.AXAccordionItemDirective, selector: "[axAccordionItem]", inputs: ["isCollapsed"], outputs: ["isCollapsedChange", "onClick"], exportAs: ["axAccordionItem"] }, { kind: "component", type:
2585
2198
  //
2586
- 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: AXMTaskBoardCalendarViewComponent, selector: "axm-task-board-calendar-view", inputs: ["resources", "refreshNonce", "startingDate", "selectedView", "dataSource"], outputs: ["onTaskClick", "onTaskChanged", "onMonthSlotDblClicked", "onActionClick", "component", "onTaskRightClick", "onRangeChanged"] }, { kind: "component", type: AXMTaskBoardKanbanViewComponent, selector: "axm-task-board-kanban-view", inputs: ["tasks"], outputs: ["tasksChange", "onTaskClick", "onTaskChanged", "component", "onActionClick"] }, { kind: "component", type: AXMTaskBoardGridViewComponent, selector: "axm-task-board-grid-view", inputs: ["dataSource", "refreshNonce"], outputs: ["onTaskClick", "onActionClick"] }, { kind: "component", type: AXMTaskBoardStatusGroupedGridViewComponent, selector: "axm-task-board-status-grouped-grid-view", inputs: ["provider", "dataSource", "refreshNonce"], outputs: ["onActionClick", "onTaskClick"] }, { kind: "component", type: AXMTaskBoardDetailPanel, selector: "axm-task-board-detail-panel" }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: AXCalendarComponent, selector: "ax-calendar", inputs: ["rtl", "readonly", "value", "name", "disabled", "depth", "activeView", "minValue", "maxValue", "disabledDates", "holidayDates", "type", "dayCellTemplate", "monthCellTemplate", "yearCellTemplate", "cellClass", "showNavigation", "count", "id", "weekend", "weekdays"], outputs: ["onOptionChanged", "valueChange", "onValueChanged", "minValueChange", "maxValueChange", "onBlur", "onFocus", "depthChange", "typeChange", "activeViewChange", "disabledDatesChange", "holidayDatesChange", "onNavigate", "onSlotClick", "countChange"] }, { kind: "component", type: AXMTaskBoardFiltersComponent, selector: "axm-task-board-filters", inputs: ["isQueryParam"], outputs: ["applyClicked"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i10.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "size", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }, { kind: "component", type: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "component", type: AXPThemeLayoutHeaderComponent, selector: "axp-layout-header" }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2199
+ 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: AXMTaskBoardCalendarViewComponent, selector: "axm-task-board-calendar-view", inputs: ["resources", "refreshNonce", "startingDate", "selectedView", "dataSource"], outputs: ["onTaskClick", "onTaskChanged", "onMonthSlotDblClicked", "onActionClick", "component", "onTaskRightClick", "onRangeChanged"] }, { kind: "component", type: AXMTaskBoardKanbanViewComponent, selector: "axm-task-board-kanban-view", inputs: ["tasks"], outputs: ["tasksChange", "onTaskClick", "onTaskChanged", "component", "onActionClick"] }, { kind: "component", type: AXMTaskBoardGridViewComponent, selector: "axm-task-board-grid-view", inputs: ["dataSource", "refreshNonce"], outputs: ["onTaskClick"] }, { kind: "component", type: AXMTaskBoardStatusGroupedGridViewComponent, selector: "axm-task-board-status-grouped-grid-view", inputs: ["provider", "dataSource", "refreshNonce"], outputs: ["onTaskClick"] }, { kind: "component", type: AXMTaskBoardDetailPanel, selector: "axm-task-board-detail-panel" }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: AXCalendarComponent, selector: "ax-calendar", inputs: ["rtl", "readonly", "value", "name", "disabled", "depth", "activeView", "minValue", "maxValue", "disabledDates", "holidayDates", "type", "dayCellTemplate", "monthCellTemplate", "yearCellTemplate", "cellClass", "showNavigation", "count", "id", "weekend", "weekdays"], outputs: ["onOptionChanged", "valueChange", "onValueChanged", "minValueChange", "maxValueChange", "onBlur", "onFocus", "depthChange", "typeChange", "activeViewChange", "disabledDatesChange", "holidayDatesChange", "onNavigate", "onSlotClick", "countChange"] }, { kind: "component", type: AXMTaskBoardFiltersComponent, selector: "axm-task-board-filters", inputs: ["isQueryParam"], outputs: ["applyClicked"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i10.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "size", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }, { kind: "component", type: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "component", type: AXPThemeLayoutHeaderComponent, selector: "axp-layout-header" }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2587
2200
  }
2588
2201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardPage, decorators: [{
2589
2202
  type: Component,
@@ -2625,8 +2238,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2625
2238
  provide: AXPPageLayoutBase,
2626
2239
  useExisting: AXMTaskBoardPage,
2627
2240
  },
2628
- ], template: "<axp-page-layout *translate=\"let t\">\n <axp-layout-start-side\n class=\"ax-border-e ax-lightest-surface ax-h-full ax-min-w-0\"\n [style.width]=\"sidebarCollapsed() ? 'auto' : null\"\n >\n <axp-layout-header\n class=\"ax-flex !ax-flex-row ax-items-center ax-gap-2\"\n [class.ax-justify-center]=\"sidebarCollapsed()\"\n [class.ax-border-b]=\"!sidebarCollapsed()\"\n >\n @if (!sidebarCollapsed()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'sidebar' }\"></ng-container>\n }\n <ax-button look=\"blank\" color=\"neutral\" (onClick)=\"toggleSidebar()\" [iconOnly]=\"true\">\n <ax-icon [icon]=\"sidebarCollapsed() ? 'fa-light fa-chevrons-right' : 'fa-light fa-chevrons-left'\"></ax-icon>\n </ax-button>\n </axp-layout-header>\n\n @if (!sidebarCollapsed()) {\n <axp-layout-content class=\"ax-flex ax-flex-col ax-min-h-0 ax-overflow-y-auto\">\n <div class=\"ax-p-4 ax-flex ax-flex-col ax-gap-6\">\n <div class=\"ax-flex ax-flex-col ax-gap-3\">\n <ax-calendar\n #sidebarCalendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"currentDateForCalendar()\"\n [dayCellTemplate]=\"dayCellTemplate\"\n [monthCellTemplate]=\"monthCellTemplate\"\n class=\"ax-single-range-calendar ax-border ax-rounded-lg\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n </ax-calendar>\n </div>\n\n <div axAccordionGroup [accordion]=\"false\">\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarFilterTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.title-plural' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarFilterTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n <div axAccordionItemContent>\n <axm-task-board-filters #filtersComponent [isQueryParam]=\"isQueryParam()\"></axm-task-board-filters>\n </div>\n </div>\n @if (!isNonCalendarView()) {\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarEventTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.calendars' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarEventTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n @if (calendarEventTypeItems().length > 0) {\n <div axAccordionItemContent>\n <div class=\"ax-pt-2\">\n <ax-selection-list\n [items]=\"calendarEventTypeItems()\"\n [ngModel]=\"selectedCalendarEventTypeValues()\"\n (onValueChanged)=\"handleCalendarEventTypeSelectionChange($event.value)\"\n direction=\"vertical\"\n [multiple]=\"true\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </axp-layout-content>\n }\n </axp-layout-start-side>\n <axp-page-toolbar>\n <axp-layout-prefix class=\"sm:ax-flex-row ax-flex-col ax-items-start\">\n <div class=\"ax-scheduler-header ax-w-max ax-sm sm:ax-md\">\n <ax-button look=\"blank\" (onClick)=\"changeDate(false)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-left arrow-icon\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"timeText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"changeDate(true)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-right arrow-icon\"></ax-icon>\n </ax-button>\n <!-- <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n #calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"vm.currentDate()\"\n class=\"ax-single-range-calendar\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n <ax-footer>\n <ax-button\n look=\"link\"\n color=\"primary\"\n [text]=\"todayButtonText()\"\n (onClick)=\"handleTodayClick()\"\n ></ax-button>\n </ax-footer>\n </ax-calendar>\n </div>\n </ax-popover> -->\n </div>\n </axp-layout-prefix>\n\n <axp-layout-suffix>\n @if (deviceService.isSmall()) {\n <ax-button id=\"axp-toolbar-btn-filters\" (onClick)=\"toggleStartSide()\" [iconOnly]=\"true\" [color]=\"'default'\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button>\n }\n <!-- @if (!deviceService.isSmall()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'toolbar' }\"></ng-container>\n } -->\n\n <!-- @if(deviceService.isLarge()) {\n <ax-button (onClick)=\"vm.toggleDetailPanel()\">\n <ax-icon icon=\"{{ vm.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-flex ax-flex-row ax-gap-2\">\n @if (isReady()) { @switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\"\n [(tasks)]=\"resolvedTasks\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-kanban-view>\n } @case('grid') {\n <axm-task-board-grid-view\n class=\"ax-h-full ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-grid-view>\n } @case('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-status-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\"\n [startingDate]=\"vm.currentDate()\"\n [dataSource]=\"schedulerDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\"\n (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"\n ></axm-task-board-calendar-view>\n } }\n <ax-context-menu\n #rootContextMenu\n [closeOn]=\"'leave'\"\n [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n } } @else {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-w-full ax-h-full\">\n <ax-loading></ax-loading>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #viewSelectorTemplate let-location=\"location\">\n @if (location === 'sidebar') {\n <ax-button\n class=\"ax-grow\"\n [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\"\n >\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #sidebarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n } @else {\n <ax-button [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #toolbarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n }\n</ng-template>\n\n<ng-template #dayCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? slot.slot.date?.day ?? '' }}</span>\n @if (slot.slot.date && getDayDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n\n<ng-template #monthCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? '' }}</span>\n @if (slot.slot.date && getMonthDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n", styles: ["html[dir=rtl] axp-page-layout axp-page-toolbar axp-layout-prefix .ax-scheduler-header .arrow-icon:before{-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scaleX(-1)}.ax-single-range-calendar .ax-range-start,.ax-single-range-calendar .ax-range-end{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.85)!important}.ax-single-range-calendar .ax-range-start:hover,.ax-single-range-calendar .ax-range-end:hover{background-color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-single-range-calendar .ax-range-start.ax-state-holiday,.ax-single-range-calendar .ax-range-end.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.85)!important}.ax-single-range-calendar .ax-range-between{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.65)}.ax-single-range-calendar .ax-range-between.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.65)}.ax-single-range-calendar ax-footer{display:flex;justify-content:center;border-color:rgba(var(--ax-comp-calendar-view-header-border-color));border-top-width:var(--ax-comp-calendar-view-header-border-width, 1px)}axp-page-content:not(:has(axm-task-board-status-grouped-grid-view,axm-task-board-time-grouped-grid-view)){overflow-y:hidden}\n"] }]
2241
+ ], template: "<axp-page-layout *translate=\"let t\">\n <axp-layout-start-side\n class=\"ax-border-e ax-lightest-surface ax-h-full ax-min-w-0\"\n [style.width]=\"sidebarCollapsed() ? 'auto' : null\"\n >\n <axp-layout-header\n class=\"ax-flex !ax-flex-row ax-items-center ax-gap-2\"\n [class.ax-justify-center]=\"sidebarCollapsed()\"\n [class.ax-border-b]=\"!sidebarCollapsed()\"\n >\n @if (!sidebarCollapsed()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'sidebar' }\"></ng-container>\n }\n <ax-button look=\"blank\" color=\"neutral\" (onClick)=\"toggleSidebar()\" [iconOnly]=\"true\">\n <ax-icon [icon]=\"sidebarCollapsed() ? 'fa-light fa-chevrons-right' : 'fa-light fa-chevrons-left'\"></ax-icon>\n </ax-button>\n </axp-layout-header>\n\n @if (!sidebarCollapsed()) {\n <axp-layout-content class=\"ax-flex ax-flex-col ax-min-h-0 ax-overflow-y-auto\">\n <div class=\"ax-p-4 ax-flex ax-flex-col ax-gap-6\">\n <div class=\"ax-flex ax-flex-col ax-gap-3\">\n <ax-calendar\n #sidebarCalendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"currentDateForCalendar()\"\n [dayCellTemplate]=\"dayCellTemplate\"\n [monthCellTemplate]=\"monthCellTemplate\"\n class=\"ax-single-range-calendar ax-border ax-rounded-lg\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n </ax-calendar>\n </div>\n\n <div axAccordionGroup [accordion]=\"false\">\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarFilterTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.title-plural' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarFilterTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n <div axAccordionItemContent>\n <axm-task-board-filters #filtersComponent [isQueryParam]=\"isQueryParam()\"></axm-task-board-filters>\n </div>\n </div>\n @if (!isNonCalendarView()) {\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarEventTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.calendars' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarEventTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n @if (calendarEventTypeItems().length > 0) {\n <div axAccordionItemContent>\n <div class=\"ax-pt-2\">\n <ax-selection-list\n [items]=\"calendarEventTypeItems()\"\n [ngModel]=\"selectedCalendarEventTypeValues()\"\n (onValueChanged)=\"handleCalendarEventTypeSelectionChange($event.value)\"\n direction=\"vertical\"\n [multiple]=\"true\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </axp-layout-content>\n }\n </axp-layout-start-side>\n <axp-page-toolbar>\n <axp-layout-prefix class=\"sm:ax-flex-row ax-flex-col ax-items-start\">\n <div class=\"ax-scheduler-header ax-w-max ax-sm sm:ax-md\">\n <ax-button look=\"blank\" (onClick)=\"changeDate(false)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-left arrow-icon\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"timeText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"changeDate(true)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-right arrow-icon\"></ax-icon>\n </ax-button>\n <!-- <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n #calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"vm.currentDate()\"\n class=\"ax-single-range-calendar\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n <ax-footer>\n <ax-button\n look=\"link\"\n color=\"primary\"\n [text]=\"todayButtonText()\"\n (onClick)=\"handleTodayClick()\"\n ></ax-button>\n </ax-footer>\n </ax-calendar>\n </div>\n </ax-popover> -->\n </div>\n </axp-layout-prefix>\n\n <axp-layout-suffix>\n @if (deviceService.isSmall()) {\n <ax-button id=\"axp-toolbar-btn-filters\" (onClick)=\"toggleStartSide()\" [iconOnly]=\"true\" [color]=\"'default'\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button>\n }\n <!-- @if (!deviceService.isSmall()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'toolbar' }\"></ng-container>\n } -->\n\n <!-- @if(deviceService.isLarge()) {\n <ax-button (onClick)=\"vm.toggleDetailPanel()\">\n <ax-icon icon=\"{{ vm.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-flex ax-flex-row ax-gap-2\">\n @if (isReady()) { @switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\"\n [(tasks)]=\"resolvedTasks\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-kanban-view>\n } @case('grid') {\n <axm-task-board-grid-view\n class=\"ax-h-full ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n ></axm-task-board-grid-view>\n } @case('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n ></axm-task-board-status-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\"\n [startingDate]=\"vm.currentDate()\"\n [dataSource]=\"schedulerDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\"\n (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"\n ></axm-task-board-calendar-view>\n } }\n <ax-context-menu\n #rootContextMenu\n [closeOn]=\"'leave'\"\n [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n } } @else {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-w-full ax-h-full\">\n <ax-loading></ax-loading>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #viewSelectorTemplate let-location=\"location\">\n @if (location === 'sidebar') {\n <ax-button\n class=\"ax-grow\"\n [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\"\n >\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #sidebarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n } @else {\n <ax-button [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #toolbarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n }\n</ng-template>\n\n<ng-template #dayCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? slot.slot.date?.day ?? '' }}</span>\n @if (slot.slot.date && getDayDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n\n<ng-template #monthCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? '' }}</span>\n @if (slot.slot.date && getMonthDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n", styles: ["html[dir=rtl] axp-page-layout axp-page-toolbar axp-layout-prefix .ax-scheduler-header .arrow-icon:before{-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scaleX(-1)}.ax-single-range-calendar .ax-range-start,.ax-single-range-calendar .ax-range-end{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.85)!important}.ax-single-range-calendar .ax-range-start:hover,.ax-single-range-calendar .ax-range-end:hover{background-color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-single-range-calendar .ax-range-start.ax-state-holiday,.ax-single-range-calendar .ax-range-end.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.85)!important}.ax-single-range-calendar .ax-range-between{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.65)}.ax-single-range-calendar .ax-range-between.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.65)}.ax-single-range-calendar ax-footer{display:flex;justify-content:center;border-color:rgba(var(--ax-comp-calendar-view-header-border-color));border-top-width:var(--ax-comp-calendar-view-header-border-width, 1px)}axp-page-content:not(:has(axm-task-board-status-grouped-grid-view,axm-task-board-time-grouped-grid-view)){overflow-y:hidden}\n"] }]
2629
2242
  }], propDecorators: { popover: [{ type: i0.ViewChild, args: ['popover', { isSignal: true }] }], calendar: [{ type: i0.ViewChild, args: ['calendar', { isSignal: true }] }], sidebarCalendar: [{ type: i0.ViewChild, args: ['sidebarCalendar', { isSignal: true }] }], contextMenu: [{ type: i0.ViewChild, args: ['rootContextMenu', { isSignal: true }] }] } });
2630
2243
 
2631
2244
  export { AXMTaskBoardPage };
2632
- //# sourceMappingURL=acorex-modules-task-management-task-board.page-DUIHtqnr.mjs.map
2245
+ //# sourceMappingURL=acorex-modules-task-management-task-board.page-BokG-G6Z.mjs.map