@acorex/modules 21.0.0-next.70 → 21.0.0-next.72

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 (448) hide show
  1. package/fesm2022/acorex-modules-ai-management.mjs +108 -16
  2. package/fesm2022/acorex-modules-ai-management.mjs.map +1 -1
  3. package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-IHgQ8RVH.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-D7bHX4-0.mjs} +665 -496
  4. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-D7bHX4-0.mjs.map +1 -0
  5. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-B95yBXgi.mjs → acorex-modules-assessment-management-assessment-case.entity-Cpbj5sCP.mjs} +2 -2
  6. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-B95yBXgi.mjs.map → acorex-modules-assessment-management-assessment-case.entity-Cpbj5sCP.mjs.map} +1 -1
  7. package/fesm2022/{acorex-modules-assessment-management-assessment-session-answers-view.util-Jhy94fgV.mjs → acorex-modules-assessment-management-assessment-session-answers-view.util-ALsxM0ww.mjs} +2 -2
  8. package/fesm2022/{acorex-modules-assessment-management-assessment-session-answers-view.util-Jhy94fgV.mjs.map → acorex-modules-assessment-management-assessment-session-answers-view.util-ALsxM0ww.mjs.map} +1 -1
  9. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-DBhBxqh1.mjs → acorex-modules-assessment-management-assessment-session.entity-CMW7wsoN.mjs} +2 -2
  10. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-DBhBxqh1.mjs.map → acorex-modules-assessment-management-assessment-session.entity-CMW7wsoN.mjs.map} +1 -1
  11. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-nkFpnKE2.mjs → acorex-modules-assessment-management-fill-assessment-session.command-C-dGKO7p.mjs} +3 -3
  12. package/fesm2022/acorex-modules-assessment-management-fill-assessment-session.command-C-dGKO7p.mjs.map +1 -0
  13. package/fesm2022/{acorex-modules-assessment-management-preview-question.command-B29oj3WB.mjs → acorex-modules-assessment-management-preview-question.command-CBewUZSF.mjs} +2 -2
  14. package/fesm2022/{acorex-modules-assessment-management-preview-question.command-B29oj3WB.mjs.map → acorex-modules-assessment-management-preview-question.command-CBewUZSF.mjs.map} +1 -1
  15. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-Sd4gRHo5.mjs → acorex-modules-assessment-management-preview-questionnaire.command-DlwBZ7mO.mjs} +18 -9
  16. package/fesm2022/acorex-modules-assessment-management-preview-questionnaire.command-DlwBZ7mO.mjs.map +1 -0
  17. package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-BCtQO_j7.mjs → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-BEhxeR8A.mjs} +2 -2
  18. package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-BCtQO_j7.mjs.map → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-BEhxeR8A.mjs.map} +1 -1
  19. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-RLIfWCzq.mjs → acorex-modules-assessment-management-question-bank-item.entity-CfCWKqN5.mjs} +3 -2
  20. package/fesm2022/acorex-modules-assessment-management-question-bank-item.entity-CfCWKqN5.mjs.map +1 -0
  21. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-B8LMKqVO.mjs → acorex-modules-assessment-management-questionnaire-viewer-popup.component-C03wF6Oy.mjs} +19 -5
  22. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-C03wF6Oy.mjs.map +1 -0
  23. package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-CZBnfCYE.mjs → acorex-modules-assessment-management-questionnaire.entity-CPMGkhGu.mjs} +4 -2
  24. package/fesm2022/acorex-modules-assessment-management-questionnaire.entity-CPMGkhGu.mjs.map +1 -0
  25. package/fesm2022/{acorex-modules-assessment-management-review-assessment-session.command-hB_LFUSE.mjs → acorex-modules-assessment-management-review-assessment-session.command-XK3IK3MH.mjs} +3 -3
  26. package/fesm2022/{acorex-modules-assessment-management-review-assessment-session.command-hB_LFUSE.mjs.map → acorex-modules-assessment-management-review-assessment-session.command-XK3IK3MH.mjs.map} +1 -1
  27. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-BN-nYHha.mjs → acorex-modules-assessment-management-view-session-answers.command-BPoF0v9C.mjs} +3 -3
  28. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-BN-nYHha.mjs.map → acorex-modules-assessment-management-view-session-answers.command-BPoF0v9C.mjs.map} +1 -1
  29. package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
  30. package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-BdiaXlkx.mjs → acorex-modules-asset-management-acorex-modules-asset-management-BCs0QS-r.mjs} +11 -8
  31. package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-BdiaXlkx.mjs.map → acorex-modules-asset-management-acorex-modules-asset-management-BCs0QS-r.mjs.map} +1 -1
  32. package/fesm2022/{acorex-modules-asset-management-asset-system-assignment.entity-Bf9nJTkD.mjs → acorex-modules-asset-management-asset-system-assignment.entity-B0sf4MzL.mjs} +2 -2
  33. package/fesm2022/{acorex-modules-asset-management-asset-system-assignment.entity-Bf9nJTkD.mjs.map → acorex-modules-asset-management-asset-system-assignment.entity-B0sf4MzL.mjs.map} +1 -1
  34. package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-Cbzu3bqC.mjs → acorex-modules-asset-management-asset-system-type.entity-Cpcgr3KS.mjs} +2 -2
  35. package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-Cbzu3bqC.mjs.map → acorex-modules-asset-management-asset-system-type.entity-Cpcgr3KS.mjs.map} +1 -1
  36. package/fesm2022/{acorex-modules-asset-management-asset-system.entity-DA7dO3eE.mjs → acorex-modules-asset-management-asset-system.entity-CEuEjyuQ.mjs} +2 -2
  37. package/fesm2022/{acorex-modules-asset-management-asset-system.entity-DA7dO3eE.mjs.map → acorex-modules-asset-management-asset-system.entity-CEuEjyuQ.mjs.map} +1 -1
  38. package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-C9B-TUQD.mjs → acorex-modules-asset-management-asset-type-section-component.entity-CwaPrUlk.mjs} +2 -2
  39. package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-C9B-TUQD.mjs.map → acorex-modules-asset-management-asset-type-section-component.entity-CwaPrUlk.mjs.map} +1 -1
  40. package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-BNz1Zfox.mjs → acorex-modules-asset-management-asset-type-section.entity-CK0dAIU4.mjs} +2 -2
  41. package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-BNz1Zfox.mjs.map → acorex-modules-asset-management-asset-type-section.entity-CK0dAIU4.mjs.map} +1 -1
  42. package/fesm2022/{acorex-modules-asset-management-asset-type.entity-D_bBxBKI.mjs → acorex-modules-asset-management-asset-type.entity-DexywYoA.mjs} +2 -2
  43. package/fesm2022/{acorex-modules-asset-management-asset-type.entity-D_bBxBKI.mjs.map → acorex-modules-asset-management-asset-type.entity-DexywYoA.mjs.map} +1 -1
  44. package/fesm2022/{acorex-modules-asset-management-asset.entity-Cf_H7edH.mjs → acorex-modules-asset-management-asset.entity-BNj3kuHC.mjs} +2 -2
  45. package/fesm2022/{acorex-modules-asset-management-asset.entity-Cf_H7edH.mjs.map → acorex-modules-asset-management-asset.entity-BNj3kuHC.mjs.map} +1 -1
  46. package/fesm2022/acorex-modules-asset-management.mjs +1 -1
  47. package/fesm2022/acorex-modules-auth-acorex-modules-auth-JEkso4J7.mjs +1580 -0
  48. package/fesm2022/acorex-modules-auth-acorex-modules-auth-JEkso4J7.mjs.map +1 -0
  49. package/fesm2022/{acorex-modules-auth-app-chooser.component-DnmLfX5x.mjs → acorex-modules-auth-app-chooser.component-MjGWaBI0.mjs} +5 -6
  50. package/fesm2022/acorex-modules-auth-app-chooser.component-MjGWaBI0.mjs.map +1 -0
  51. package/fesm2022/acorex-modules-auth-change-password.command-Ctyw3WfE.mjs +32 -0
  52. package/fesm2022/acorex-modules-auth-change-password.command-Ctyw3WfE.mjs.map +1 -0
  53. package/fesm2022/acorex-modules-auth-change-photo.command-_vxTFH0X.mjs +32 -0
  54. package/fesm2022/acorex-modules-auth-change-photo.command-_vxTFH0X.mjs.map +1 -0
  55. package/fesm2022/acorex-modules-auth-edit-signature.command-CcTJJwAX.mjs +32 -0
  56. package/fesm2022/acorex-modules-auth-edit-signature.command-CcTJJwAX.mjs.map +1 -0
  57. package/fesm2022/{acorex-modules-auth-login.module-D1-POhQk.mjs → acorex-modules-auth-login.module-FJxkiTeX.mjs} +4 -4
  58. package/fesm2022/{acorex-modules-auth-login.module-D1-POhQk.mjs.map → acorex-modules-auth-login.module-FJxkiTeX.mjs.map} +1 -1
  59. package/fesm2022/acorex-modules-auth-master.layout-B4Vpqg2F.mjs +25 -0
  60. package/fesm2022/acorex-modules-auth-master.layout-B4Vpqg2F.mjs.map +1 -0
  61. package/fesm2022/{acorex-modules-auth-oauth-callback.component-BhfFPeWT.mjs → acorex-modules-auth-oauth-callback.component-It5tkYuf.mjs} +2 -2
  62. package/fesm2022/{acorex-modules-auth-oauth-callback.component-BhfFPeWT.mjs.map → acorex-modules-auth-oauth-callback.component-It5tkYuf.mjs.map} +1 -1
  63. package/fesm2022/{acorex-modules-auth-user-sessions.component-gJSHI_eh.mjs → acorex-modules-auth-open-sessions.command-Qik0eKUR.mjs} +32 -7
  64. package/fesm2022/acorex-modules-auth-open-sessions.command-Qik0eKUR.mjs.map +1 -0
  65. package/fesm2022/{acorex-modules-auth-password.component-BMVSHYy7.mjs → acorex-modules-auth-password.component-B2BIaXZ_.mjs} +2 -2
  66. package/fesm2022/{acorex-modules-auth-password.component-BMVSHYy7.mjs.map → acorex-modules-auth-password.component-B2BIaXZ_.mjs.map} +1 -1
  67. package/fesm2022/{acorex-modules-auth-password.component-Cm8DsDvu.mjs → acorex-modules-auth-password.component-BRnlp4j1.mjs} +6 -6
  68. package/fesm2022/{acorex-modules-auth-password.component-Cm8DsDvu.mjs.map → acorex-modules-auth-password.component-BRnlp4j1.mjs.map} +1 -1
  69. package/fesm2022/acorex-modules-auth-profile-activity-chart.component-CmtkTEI5.mjs +177 -0
  70. package/fesm2022/acorex-modules-auth-profile-activity-chart.component-CmtkTEI5.mjs.map +1 -0
  71. package/fesm2022/acorex-modules-auth-profile-coming-soon.command-DBbFbzAx.mjs +31 -0
  72. package/fesm2022/acorex-modules-auth-profile-coming-soon.command-DBbFbzAx.mjs.map +1 -0
  73. package/fesm2022/acorex-modules-auth-profile-delete-account-danger-zone.component-62K4A_lM.mjs +78 -0
  74. package/fesm2022/acorex-modules-auth-profile-delete-account-danger-zone.component-62K4A_lM.mjs.map +1 -0
  75. package/fesm2022/acorex-modules-auth-profile-page-component.provider-Dz9yFSnA.mjs +27 -0
  76. package/fesm2022/acorex-modules-auth-profile-page-component.provider-Dz9yFSnA.mjs.map +1 -0
  77. package/fesm2022/acorex-modules-auth-profile-page.component-BGkPr1_o.mjs +370 -0
  78. package/fesm2022/acorex-modules-auth-profile-page.component-BGkPr1_o.mjs.map +1 -0
  79. package/fesm2022/{acorex-modules-auth-routes-B85OzgW1.mjs → acorex-modules-auth-routes-D6PLdcTC.mjs} +2 -2
  80. package/fesm2022/{acorex-modules-auth-routes-B85OzgW1.mjs.map → acorex-modules-auth-routes-D6PLdcTC.mjs.map} +1 -1
  81. package/fesm2022/acorex-modules-auth-signout-command-IUSkq50M.mjs +24 -0
  82. package/fesm2022/acorex-modules-auth-signout-command-IUSkq50M.mjs.map +1 -0
  83. package/fesm2022/{acorex-modules-auth-tenant-chooser.component-D6_rL2WP.mjs → acorex-modules-auth-tenant-chooser.component-qGfNSQ6H.mjs} +2 -2
  84. package/fesm2022/{acorex-modules-auth-tenant-chooser.component-D6_rL2WP.mjs.map → acorex-modules-auth-tenant-chooser.component-qGfNSQ6H.mjs.map} +1 -1
  85. package/fesm2022/{acorex-modules-auth-two-factor.module-DfyDQIw-.mjs → acorex-modules-auth-two-factor.module-DcvqZOIq.mjs} +2 -2
  86. package/fesm2022/{acorex-modules-auth-two-factor.module-DfyDQIw-.mjs.map → acorex-modules-auth-two-factor.module-DcvqZOIq.mjs.map} +1 -1
  87. package/fesm2022/acorex-modules-auth.mjs +1 -1
  88. package/fesm2022/acorex-modules-business-core.mjs +2 -2
  89. package/fesm2022/acorex-modules-business-core.mjs.map +1 -1
  90. package/fesm2022/acorex-modules-calendar-management-datasource.provider-CnxTy81J.mjs +225 -0
  91. package/fesm2022/acorex-modules-calendar-management-datasource.provider-CnxTy81J.mjs.map +1 -0
  92. package/fesm2022/acorex-modules-calendar-management.mjs +481 -392
  93. package/fesm2022/acorex-modules-calendar-management.mjs.map +1 -1
  94. package/fesm2022/acorex-modules-common.mjs +524 -30
  95. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  96. package/fesm2022/{acorex-modules-content-management-acorex-modules-content-management-txpooXrE.mjs → acorex-modules-content-management-acorex-modules-content-management-Bc_tCoHa.mjs} +6 -6
  97. package/fesm2022/acorex-modules-content-management-acorex-modules-content-management-Bc_tCoHa.mjs.map +1 -0
  98. package/fesm2022/{acorex-modules-content-management-permission-definition.provider-D9woYm2m.mjs → acorex-modules-content-management-permission-definition.provider-2-_i1Kxd.mjs} +2 -2
  99. package/fesm2022/{acorex-modules-content-management-permission-definition.provider-D9woYm2m.mjs.map → acorex-modules-content-management-permission-definition.provider-2-_i1Kxd.mjs.map} +1 -1
  100. package/fesm2022/{acorex-modules-content-management-template-content-editor-widget-edit.component-CQa1h31v.mjs → acorex-modules-content-management-template-content-editor-widget-edit.component-BdNwhaJ8.mjs} +2 -2
  101. package/fesm2022/{acorex-modules-content-management-template-content-editor-widget-edit.component-CQa1h31v.mjs.map → acorex-modules-content-management-template-content-editor-widget-edit.component-BdNwhaJ8.mjs.map} +1 -1
  102. package/fesm2022/{acorex-modules-content-management-template-content-editor-widget-view.component-DzM4oMNV.mjs → acorex-modules-content-management-template-content-editor-widget-view.component-Cwnqyt0U.mjs} +2 -2
  103. package/fesm2022/{acorex-modules-content-management-template-content-editor-widget-view.component-DzM4oMNV.mjs.map → acorex-modules-content-management-template-content-editor-widget-view.component-Cwnqyt0U.mjs.map} +1 -1
  104. package/fesm2022/acorex-modules-content-management.mjs +1 -1
  105. package/fesm2022/{acorex-modules-conversation-acorex-modules-conversation-DYW31fEm.mjs → acorex-modules-conversation-acorex-modules-conversation-BX09r8Xj.mjs} +801 -237
  106. package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-BX09r8Xj.mjs.map +1 -0
  107. package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-hMiSfvL2.mjs +329 -0
  108. package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-hMiSfvL2.mjs.map +1 -0
  109. package/fesm2022/{acorex-modules-conversation-comments-page.component-CNqL-HdS.mjs → acorex-modules-conversation-comments-page.component-BJu6CoNR.mjs} +18 -6
  110. package/fesm2022/acorex-modules-conversation-comments-page.component-BJu6CoNR.mjs.map +1 -0
  111. package/fesm2022/{acorex-modules-conversation-send-assist-chat-message.command-CuYYEqhb.mjs → acorex-modules-conversation-send-assist-chat-message.command-B471NQRh.mjs} +2 -2
  112. package/fesm2022/{acorex-modules-conversation-send-assist-chat-message.command-CuYYEqhb.mjs.map → acorex-modules-conversation-send-assist-chat-message.command-B471NQRh.mjs.map} +1 -1
  113. package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-BKwrZJDs.mjs → acorex-modules-conversation-start-assist-chat.command-CasClVbR.mjs} +2 -2
  114. package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-BKwrZJDs.mjs.map → acorex-modules-conversation-start-assist-chat.command-CasClVbR.mjs.map} +1 -1
  115. package/fesm2022/acorex-modules-conversation.mjs +1 -1
  116. package/fesm2022/{acorex-modules-dashboard-management-acorex-modules-dashboard-management-kk0CINL1.mjs → acorex-modules-dashboard-management-acorex-modules-dashboard-management-9MoalNjW.mjs} +53 -21
  117. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-9MoalNjW.mjs.map +1 -0
  118. package/fesm2022/{acorex-modules-dashboard-management-index-Bhm8mAON.mjs → acorex-modules-dashboard-management-index-Dsu3Yw8O.mjs} +2 -2
  119. package/fesm2022/{acorex-modules-dashboard-management-index-Bhm8mAON.mjs.map → acorex-modules-dashboard-management-index-Dsu3Yw8O.mjs.map} +1 -1
  120. package/fesm2022/acorex-modules-dashboard-management.mjs +1 -1
  121. package/fesm2022/{acorex-modules-data-management-index-DEm_BsbE.mjs → acorex-modules-data-management-index-CxVSgxTM.mjs} +4 -1
  122. package/fesm2022/acorex-modules-data-management-index-CxVSgxTM.mjs.map +1 -0
  123. package/fesm2022/acorex-modules-data-management.mjs +2 -2
  124. package/fesm2022/acorex-modules-document-management.mjs +7 -4
  125. package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
  126. package/fesm2022/acorex-modules-financial-core.mjs +7 -7
  127. package/fesm2022/acorex-modules-financial-core.mjs.map +1 -1
  128. package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-DrKulwY-.mjs → acorex-modules-human-capital-management-acorex-modules-human-capital-management-Cb7_mEJt.mjs} +237 -52
  129. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-Cb7_mEJt.mjs.map +1 -0
  130. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-TavX6h7z.mjs → acorex-modules-human-capital-management-approve-leave-request.command-wO2u1IKg.mjs} +2 -2
  131. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-TavX6h7z.mjs.map → acorex-modules-human-capital-management-approve-leave-request.command-wO2u1IKg.mjs.map} +1 -1
  132. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-ZEmi88vf.mjs → acorex-modules-human-capital-management-assign-position-assignment.command-BDesaehJ.mjs} +2 -2
  133. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-ZEmi88vf.mjs.map → acorex-modules-human-capital-management-assign-position-assignment.command-BDesaehJ.mjs.map} +1 -1
  134. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-DzIMYIhe.mjs → acorex-modules-human-capital-management-cancel-leave-request.command-D8u45bHk.mjs} +2 -2
  135. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-DzIMYIhe.mjs.map → acorex-modules-human-capital-management-cancel-leave-request.command-D8u45bHk.mjs.map} +1 -1
  136. package/fesm2022/{acorex-modules-human-capital-management-employee.entity-CrVU_3Jv.mjs → acorex-modules-human-capital-management-employee.entity-sq1G--OE.mjs} +22 -18
  137. package/fesm2022/acorex-modules-human-capital-management-employee.entity-sq1G--OE.mjs.map +1 -0
  138. package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-BeiaEsNZ.mjs → acorex-modules-human-capital-management-employment-type.entity-qgNm-AAZ.mjs} +2 -2
  139. package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-BeiaEsNZ.mjs.map → acorex-modules-human-capital-management-employment-type.entity-qgNm-AAZ.mjs.map} +1 -1
  140. package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-QeY6lcUY.mjs → acorex-modules-human-capital-management-leave-request.entity-DcdYnwyN.mjs} +19 -24
  141. package/fesm2022/acorex-modules-human-capital-management-leave-request.entity-DcdYnwyN.mjs.map +1 -0
  142. package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-D7B3adkZ.mjs → acorex-modules-human-capital-management-leave-type.entity-Dr5YHs8p.mjs} +10 -4
  143. package/fesm2022/acorex-modules-human-capital-management-leave-type.entity-Dr5YHs8p.mjs.map +1 -0
  144. package/fesm2022/{acorex-modules-human-capital-management-lifecycle-event-type.entity-Dim-8hT7.mjs → acorex-modules-human-capital-management-lifecycle-event-type.entity-Bni4vgt5.mjs} +19 -74
  145. package/fesm2022/acorex-modules-human-capital-management-lifecycle-event-type.entity-Bni4vgt5.mjs.map +1 -0
  146. package/fesm2022/{acorex-modules-human-capital-management-lifecycle-event.entity-3HtYOKrY.mjs → acorex-modules-human-capital-management-lifecycle-event.entity-ds4Iq82f.mjs} +6 -6
  147. package/fesm2022/acorex-modules-human-capital-management-lifecycle-event.entity-ds4Iq82f.mjs.map +1 -0
  148. package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-Byxt921P.mjs → acorex-modules-human-capital-management-position-assignment.entity-CalDJQrD.mjs} +2 -2
  149. package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-Byxt921P.mjs.map → acorex-modules-human-capital-management-position-assignment.entity-CalDJQrD.mjs.map} +1 -1
  150. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-CAvjZTG9.mjs → acorex-modules-human-capital-management-reject-leave-request.command-CshyWVLH.mjs} +2 -2
  151. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-CAvjZTG9.mjs.map → acorex-modules-human-capital-management-reject-leave-request.command-CshyWVLH.mjs.map} +1 -1
  152. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-BeWrsQo8.mjs → acorex-modules-human-capital-management-revoke-position-assignment.command-BENxT4Qg.mjs} +2 -2
  153. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-BeWrsQo8.mjs.map → acorex-modules-human-capital-management-revoke-position-assignment.command-BENxT4Qg.mjs.map} +1 -1
  154. package/fesm2022/acorex-modules-human-capital-management-start-leave-request-flow.command-DjkzwxHN.mjs +242 -0
  155. package/fesm2022/acorex-modules-human-capital-management-start-leave-request-flow.command-DjkzwxHN.mjs.map +1 -0
  156. package/fesm2022/{acorex-modules-human-capital-management-start-lifecycle-event-flow.command-Bz2SZcmm.mjs → acorex-modules-human-capital-management-start-lifecycle-event-flow.command-x8J2kneo.mjs} +9 -14
  157. package/fesm2022/acorex-modules-human-capital-management-start-lifecycle-event-flow.command-x8J2kneo.mjs.map +1 -0
  158. package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
  159. package/fesm2022/{acorex-modules-learning-management-course.entity-DUUgeikJ.mjs → acorex-modules-learning-management-course.entity-BG6TaQk4.mjs} +4 -4
  160. package/fesm2022/acorex-modules-learning-management-course.entity-BG6TaQk4.mjs.map +1 -0
  161. package/fesm2022/{acorex-modules-learning-management-enrollment.entity-CdJafrUh.mjs → acorex-modules-learning-management-enrollment.entity-DjpUDcLv.mjs} +5 -5
  162. package/fesm2022/acorex-modules-learning-management-enrollment.entity-DjpUDcLv.mjs.map +1 -0
  163. package/fesm2022/{acorex-modules-learning-management-learning-path.entity-Zo--bDto.mjs → acorex-modules-learning-management-learning-path.entity-C2S0VVeq.mjs} +2 -2
  164. package/fesm2022/acorex-modules-learning-management-learning-path.entity-C2S0VVeq.mjs.map +1 -0
  165. package/fesm2022/{acorex-modules-learning-management-skill.entity-VXkLbaD4.mjs → acorex-modules-learning-management-skill.entity-DAM-_nuT.mjs} +2 -2
  166. package/fesm2022/acorex-modules-learning-management-skill.entity-DAM-_nuT.mjs.map +1 -0
  167. package/fesm2022/{acorex-modules-learning-management-training.entity-C4KDv1uh.mjs → acorex-modules-learning-management-training.entity-THsY3DiM.mjs} +4 -4
  168. package/fesm2022/acorex-modules-learning-management-training.entity-THsY3DiM.mjs.map +1 -0
  169. package/fesm2022/acorex-modules-learning-management.mjs +5 -5
  170. package/fesm2022/{acorex-modules-locale-management-profiles-BOveGIcE.mjs → acorex-modules-locale-management-profiles-BYZa_Ti0.mjs} +23 -8
  171. package/fesm2022/acorex-modules-locale-management-profiles-BYZa_Ti0.mjs.map +1 -0
  172. package/fesm2022/acorex-modules-locale-management.mjs +31 -15
  173. package/fesm2022/acorex-modules-locale-management.mjs.map +1 -1
  174. package/fesm2022/acorex-modules-location-management.mjs +4 -4
  175. package/fesm2022/acorex-modules-location-management.mjs.map +1 -1
  176. package/fesm2022/{acorex-modules-maintenance-management-acorex-modules-maintenance-management-DiM2aFgg.mjs → acorex-modules-maintenance-management-acorex-modules-maintenance-management-Xyu3jpEh.mjs} +14 -14
  177. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-Xyu3jpEh.mjs.map +1 -0
  178. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-BCMeHmxS.mjs → acorex-modules-maintenance-management-failure-effect.entity-CYQ3ExC3.mjs} +2 -2
  179. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-BCMeHmxS.mjs.map → acorex-modules-maintenance-management-failure-effect.entity-CYQ3ExC3.mjs.map} +1 -1
  180. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-ByBoVQ8D.mjs → acorex-modules-maintenance-management-failure-mode-asset-type.entity-Cz0tQkwZ.mjs} +2 -2
  181. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-ByBoVQ8D.mjs.map → acorex-modules-maintenance-management-failure-mode-asset-type.entity-Cz0tQkwZ.mjs.map} +1 -1
  182. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-BJs4KhkU.mjs → acorex-modules-maintenance-management-failure-mode-mechanism.entity-vqX88zIA.mjs} +2 -2
  183. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-BJs4KhkU.mjs.map → acorex-modules-maintenance-management-failure-mode-mechanism.entity-vqX88zIA.mjs.map} +1 -1
  184. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-rw24sQxb.mjs → acorex-modules-maintenance-management-failure-mode-solution.entity-CpefPKAY.mjs} +2 -2
  185. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-rw24sQxb.mjs.map → acorex-modules-maintenance-management-failure-mode-solution.entity-CpefPKAY.mjs.map} +1 -1
  186. package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-C_6sjW8z.mjs → acorex-modules-maintenance-management-failure-register-cause.entity-C1_4BQBR.mjs} +2 -2
  187. package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-C_6sjW8z.mjs.map → acorex-modules-maintenance-management-failure-register-cause.entity-C1_4BQBR.mjs.map} +1 -1
  188. package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-DCIAzSYQ.mjs → acorex-modules-maintenance-management-failure-register-effect.entity-BRssxEl6.mjs} +2 -2
  189. package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-DCIAzSYQ.mjs.map → acorex-modules-maintenance-management-failure-register-effect.entity-BRssxEl6.mjs.map} +1 -1
  190. package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-DlXr6A4i.mjs → acorex-modules-maintenance-management-failure-register-mechanism.entity-YyBWG00N.mjs} +2 -2
  191. package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-DlXr6A4i.mjs.map → acorex-modules-maintenance-management-failure-register-mechanism.entity-YyBWG00N.mjs.map} +1 -1
  192. package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-C4J3um7j.mjs → acorex-modules-maintenance-management-failure-register.entity-CH-C6Q7m.mjs} +2 -2
  193. package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-C4J3um7j.mjs.map → acorex-modules-maintenance-management-failure-register.entity-CH-C6Q7m.mjs.map} +1 -1
  194. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-C-spQtYx.mjs → acorex-modules-maintenance-management-failure-severity.entity-BMoUEcVC.mjs} +2 -2
  195. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-C-spQtYx.mjs.map → acorex-modules-maintenance-management-failure-severity.entity-BMoUEcVC.mjs.map} +1 -1
  196. package/fesm2022/{acorex-modules-maintenance-management-maintenance-template.entity-Huahnjhd.mjs → acorex-modules-maintenance-management-maintenance-template.entity-CBayAtRD.mjs} +2 -2
  197. package/fesm2022/{acorex-modules-maintenance-management-maintenance-template.entity-Huahnjhd.mjs.map → acorex-modules-maintenance-management-maintenance-template.entity-CBayAtRD.mjs.map} +1 -1
  198. package/fesm2022/{acorex-modules-maintenance-management-work-order-list-command-1YsWctqu.mjs → acorex-modules-maintenance-management-work-order-list-command-mMZGiG3q.mjs} +2 -2
  199. package/fesm2022/{acorex-modules-maintenance-management-work-order-list-command-1YsWctqu.mjs.map → acorex-modules-maintenance-management-work-order-list-command-mMZGiG3q.mjs.map} +1 -1
  200. package/fesm2022/acorex-modules-maintenance-management.mjs +1 -1
  201. package/fesm2022/acorex-modules-measurement-core.mjs +4 -4
  202. package/fesm2022/acorex-modules-measurement-core.mjs.map +1 -1
  203. package/fesm2022/acorex-modules-notification-management-acorex-modules-notification-management-BSf1wd6j.mjs +3836 -0
  204. package/fesm2022/acorex-modules-notification-management-acorex-modules-notification-management-BSf1wd6j.mjs.map +1 -0
  205. package/fesm2022/acorex-modules-notification-management-notification-page.component-ATFOFL7C.mjs +548 -0
  206. package/fesm2022/acorex-modules-notification-management-notification-page.component-ATFOFL7C.mjs.map +1 -0
  207. package/fesm2022/acorex-modules-notification-management.mjs +1 -3590
  208. package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
  209. package/fesm2022/{acorex-modules-order-management-bulk-buy-order-item.entity-DGtHoqqj.mjs → acorex-modules-order-management-bulk-buy-order-item.entity-63BpszqL.mjs} +2 -2
  210. package/fesm2022/acorex-modules-order-management-bulk-buy-order-item.entity-63BpszqL.mjs.map +1 -0
  211. package/fesm2022/{acorex-modules-order-management-entity.provider-DVHBXOCD.mjs → acorex-modules-order-management-entity.provider-DGwVhM91.mjs} +3 -3
  212. package/fesm2022/{acorex-modules-order-management-entity.provider-DVHBXOCD.mjs.map → acorex-modules-order-management-entity.provider-DGwVhM91.mjs.map} +1 -1
  213. package/fesm2022/{acorex-modules-order-management-member-order-line.entity-DZJ90WHI.mjs → acorex-modules-order-management-member-order-line.entity-Czu7qE7i.mjs} +2 -2
  214. package/fesm2022/acorex-modules-order-management-member-order-line.entity-Czu7qE7i.mjs.map +1 -0
  215. package/fesm2022/acorex-modules-order-management.mjs +2 -2
  216. package/fesm2022/{acorex-modules-organization-management-acorex-modules-organization-management-Iopv_G-d.mjs → acorex-modules-organization-management-acorex-modules-organization-management-smWojO0l.mjs} +40 -40
  217. package/fesm2022/{acorex-modules-organization-management-acorex-modules-organization-management-Iopv_G-d.mjs.map → acorex-modules-organization-management-acorex-modules-organization-management-smWojO0l.mjs.map} +1 -1
  218. package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-D7NChP_A.mjs → acorex-modules-organization-management-add-business-unit-to-business-unit.command-BLifgeRF.mjs} +2 -2
  219. package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-D7NChP_A.mjs.map → acorex-modules-organization-management-add-business-unit-to-business-unit.command-BLifgeRF.mjs.map} +1 -1
  220. package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-PkeqXFt1.mjs → acorex-modules-organization-management-add-position-to-business-unit.command-CKFqYBLD.mjs} +2 -2
  221. package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-PkeqXFt1.mjs.map → acorex-modules-organization-management-add-position-to-business-unit.command-CKFqYBLD.mjs.map} +1 -1
  222. package/fesm2022/{acorex-modules-organization-management-add-team-to-business-unit.command-jalyX-F4.mjs → acorex-modules-organization-management-add-team-to-business-unit.command-DfaLXvTw.mjs} +2 -2
  223. package/fesm2022/{acorex-modules-organization-management-add-team-to-business-unit.command-jalyX-F4.mjs.map → acorex-modules-organization-management-add-team-to-business-unit.command-DfaLXvTw.mjs.map} +1 -1
  224. package/fesm2022/{acorex-modules-organization-management-business-unit.entity-CBjAC9Ip.mjs → acorex-modules-organization-management-business-unit.entity-BkeFPaIT.mjs} +2 -2
  225. package/fesm2022/{acorex-modules-organization-management-business-unit.entity-CBjAC9Ip.mjs.map → acorex-modules-organization-management-business-unit.entity-BkeFPaIT.mjs.map} +1 -1
  226. package/fesm2022/{acorex-modules-organization-management-chart.entity-CaY_5LGN.mjs → acorex-modules-organization-management-chart.entity-bWx4IFSv.mjs} +2 -2
  227. package/fesm2022/{acorex-modules-organization-management-chart.entity-CaY_5LGN.mjs.map → acorex-modules-organization-management-chart.entity-bWx4IFSv.mjs.map} +1 -1
  228. package/fesm2022/{acorex-modules-organization-management-company.entity-BUBhqyCn.mjs → acorex-modules-organization-management-company.entity-yPUVhIzy.mjs} +2 -2
  229. package/fesm2022/{acorex-modules-organization-management-company.entity-BUBhqyCn.mjs.map → acorex-modules-organization-management-company.entity-yPUVhIzy.mjs.map} +1 -1
  230. package/fesm2022/{acorex-modules-organization-management-entity.provider-BZsy_wi6.mjs → acorex-modules-organization-management-entity.provider-IhJwnzd-.mjs} +15 -15
  231. package/fesm2022/{acorex-modules-organization-management-entity.provider-BZsy_wi6.mjs.map → acorex-modules-organization-management-entity.provider-IhJwnzd-.mjs.map} +1 -1
  232. package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-CEO1nSFP.mjs → acorex-modules-organization-management-feature-definition.provider-B5yqFa4Z.mjs} +2 -2
  233. package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-CEO1nSFP.mjs.map → acorex-modules-organization-management-feature-definition.provider-B5yqFa4Z.mjs.map} +1 -1
  234. package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-ChRGp5ZI.mjs → acorex-modules-organization-management-job-definition-pages-component.provider-C51sgWyG.mjs} +3 -3
  235. package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-ChRGp5ZI.mjs.map → acorex-modules-organization-management-job-definition-pages-component.provider-C51sgWyG.mjs.map} +1 -1
  236. package/fesm2022/{acorex-modules-organization-management-job-definition-responsibilities-page.component-aWZO09Xw.mjs → acorex-modules-organization-management-job-definition-responsibilities-page.component-EEWB5VUq.mjs} +8 -3
  237. package/fesm2022/acorex-modules-organization-management-job-definition-responsibilities-page.component-EEWB5VUq.mjs.map +1 -0
  238. package/fesm2022/{acorex-modules-organization-management-job-definition-skills-page.component-DJcFhQM9.mjs → acorex-modules-organization-management-job-definition-skills-page.component-L2GmFRra.mjs} +7 -2
  239. package/fesm2022/acorex-modules-organization-management-job-definition-skills-page.component-L2GmFRra.mjs.map +1 -0
  240. package/fesm2022/{acorex-modules-organization-management-job-definition.entity-BoM49wYi.mjs → acorex-modules-organization-management-job-definition.entity-CDXsJADe.mjs} +2 -2
  241. package/fesm2022/{acorex-modules-organization-management-job-definition.entity-BoM49wYi.mjs.map → acorex-modules-organization-management-job-definition.entity-CDXsJADe.mjs.map} +1 -1
  242. package/fesm2022/{acorex-modules-organization-management-job-level.datasource-DbQG79uR.mjs → acorex-modules-organization-management-job-level.datasource-C84zFgVo.mjs} +2 -2
  243. package/fesm2022/{acorex-modules-organization-management-job-level.datasource-DbQG79uR.mjs.map → acorex-modules-organization-management-job-level.datasource-C84zFgVo.mjs.map} +1 -1
  244. package/fesm2022/{acorex-modules-organization-management-job-level.entity-XO-NsBG-.mjs → acorex-modules-organization-management-job-level.entity-BqjP04k-.mjs} +2 -2
  245. package/fesm2022/{acorex-modules-organization-management-job-level.entity-XO-NsBG-.mjs.map → acorex-modules-organization-management-job-level.entity-BqjP04k-.mjs.map} +1 -1
  246. package/fesm2022/{acorex-modules-organization-management-menu.provider-DXW6aUIX.mjs → acorex-modules-organization-management-menu.provider-ChR3Rh4W.mjs} +2 -2
  247. package/fesm2022/{acorex-modules-organization-management-menu.provider-DXW6aUIX.mjs.map → acorex-modules-organization-management-menu.provider-ChR3Rh4W.mjs.map} +1 -1
  248. package/fesm2022/{acorex-modules-organization-management-org-chart-default-node-contribution.provider-ClKr6K6Y.mjs → acorex-modules-organization-management-org-chart-default-node-contribution.provider-DFVts4Q2.mjs} +2 -2
  249. package/fesm2022/{acorex-modules-organization-management-org-chart-default-node-contribution.provider-ClKr6K6Y.mjs.map → acorex-modules-organization-management-org-chart-default-node-contribution.provider-DFVts4Q2.mjs.map} +1 -1
  250. package/fesm2022/{acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-BjIDzwXF.mjs → acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-D1r0YQbL.mjs} +2 -2
  251. package/fesm2022/{acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-BjIDzwXF.mjs.map → acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-D1r0YQbL.mjs.map} +1 -1
  252. package/fesm2022/{acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-DRAlUmIa.mjs → acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-Df1x_VF0.mjs} +2 -2
  253. package/fesm2022/{acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-DRAlUmIa.mjs.map → acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-Df1x_VF0.mjs.map} +1 -1
  254. package/fesm2022/{acorex-modules-organization-management-org-chart-ux-node-contribution.provider-DwSjov_Z.mjs → acorex-modules-organization-management-org-chart-ux-node-contribution.provider-BPWFJSx2.mjs} +2 -2
  255. package/fesm2022/{acorex-modules-organization-management-org-chart-ux-node-contribution.provider-DwSjov_Z.mjs.map → acorex-modules-organization-management-org-chart-ux-node-contribution.provider-BPWFJSx2.mjs.map} +1 -1
  256. package/fesm2022/{acorex-modules-organization-management-org-chart.page-CuPEM-_N.mjs → acorex-modules-organization-management-org-chart.page-BzKPjJwY.mjs} +2 -2
  257. package/fesm2022/{acorex-modules-organization-management-org-chart.page-CuPEM-_N.mjs.map → acorex-modules-organization-management-org-chart.page-BzKPjJwY.mjs.map} +1 -1
  258. package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-BNthP0QV.mjs → acorex-modules-organization-management-permission-definition.provider-DShSa-Wp.mjs} +2 -2
  259. package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-BNthP0QV.mjs.map → acorex-modules-organization-management-permission-definition.provider-DShSa-Wp.mjs.map} +1 -1
  260. package/fesm2022/{acorex-modules-organization-management-position.entity-Cja3CYmL.mjs → acorex-modules-organization-management-position.entity-DyF02saN.mjs} +2 -2
  261. package/fesm2022/{acorex-modules-organization-management-position.entity-Cja3CYmL.mjs.map → acorex-modules-organization-management-position.entity-DyF02saN.mjs.map} +1 -1
  262. package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-Dm1a6-uO.mjs → acorex-modules-organization-management-remove-position-from-business-unit.command-CGYBDMLJ.mjs} +2 -2
  263. package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-Dm1a6-uO.mjs.map → acorex-modules-organization-management-remove-position-from-business-unit.command-CGYBDMLJ.mjs.map} +1 -1
  264. package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-BWtzQZyW.mjs → acorex-modules-organization-management-replace-position-assignee.command-DgR5-k3v.mjs} +2 -2
  265. package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-BWtzQZyW.mjs.map → acorex-modules-organization-management-replace-position-assignee.command-DgR5-k3v.mjs.map} +1 -1
  266. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-C4W0VlL5.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-oqrqfc2t.mjs} +2 -2
  267. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-C4W0VlL5.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-oqrqfc2t.mjs.map} +1 -1
  268. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-CaPqjai7.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-BEZm8HRq.mjs} +2 -2
  269. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-CaPqjai7.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-BEZm8HRq.mjs.map} +1 -1
  270. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-nJuP6fA0.mjs → acorex-modules-organization-management-responsibilities-matrix.component-CBfTsRx4.mjs} +2 -2
  271. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-nJuP6fA0.mjs.map → acorex-modules-organization-management-responsibilities-matrix.component-CBfTsRx4.mjs.map} +1 -1
  272. package/fesm2022/{acorex-modules-organization-management-responsibility-level.entity-CvvzIjvE.mjs → acorex-modules-organization-management-responsibility-level.entity-BAm1en5A.mjs} +2 -2
  273. package/fesm2022/{acorex-modules-organization-management-responsibility-level.entity-CvvzIjvE.mjs.map → acorex-modules-organization-management-responsibility-level.entity-BAm1en5A.mjs.map} +1 -1
  274. package/fesm2022/{acorex-modules-organization-management-responsibility.entity-Cc0Ou-hc.mjs → acorex-modules-organization-management-responsibility.entity-DTCMbqNy.mjs} +2 -2
  275. package/fesm2022/{acorex-modules-organization-management-responsibility.entity-Cc0Ou-hc.mjs.map → acorex-modules-organization-management-responsibility.entity-DTCMbqNy.mjs.map} +1 -1
  276. package/fesm2022/{acorex-modules-organization-management-settings.provider-C33ZatCD.mjs → acorex-modules-organization-management-settings.provider-C6op-yff.mjs} +2 -2
  277. package/fesm2022/{acorex-modules-organization-management-settings.provider-C33ZatCD.mjs.map → acorex-modules-organization-management-settings.provider-C6op-yff.mjs.map} +1 -1
  278. package/fesm2022/{acorex-modules-organization-management-team-business-unit.entity-DGuF5ux1.mjs → acorex-modules-organization-management-team-business-unit.entity-B4Wra1YB.mjs} +3 -3
  279. package/fesm2022/acorex-modules-organization-management-team-business-unit.entity-B4Wra1YB.mjs.map +1 -0
  280. package/fesm2022/{acorex-modules-organization-management-team-member-role.entity-BMXkNavp.mjs → acorex-modules-organization-management-team-member-role.entity-CVH2m8uw.mjs} +2 -2
  281. package/fesm2022/{acorex-modules-organization-management-team-member-role.entity-BMXkNavp.mjs.map → acorex-modules-organization-management-team-member-role.entity-CVH2m8uw.mjs.map} +1 -1
  282. package/fesm2022/{acorex-modules-organization-management-team-member.entity-Deem7M3N.mjs → acorex-modules-organization-management-team-member.entity-By97LISn.mjs} +3 -3
  283. package/fesm2022/acorex-modules-organization-management-team-member.entity-By97LISn.mjs.map +1 -0
  284. package/fesm2022/{acorex-modules-organization-management-team.entity-CNmpaJ3F.mjs → acorex-modules-organization-management-team.entity-Cezsw5Vq.mjs} +2 -2
  285. package/fesm2022/{acorex-modules-organization-management-team.entity-CNmpaJ3F.mjs.map → acorex-modules-organization-management-team.entity-Cezsw5Vq.mjs.map} +1 -1
  286. package/fesm2022/acorex-modules-organization-management.mjs +1 -1
  287. package/fesm2022/acorex-modules-person-core.mjs +1 -1
  288. package/fesm2022/acorex-modules-person-core.mjs.map +1 -1
  289. package/fesm2022/acorex-modules-platform-dev-tools.mjs +3 -3
  290. package/fesm2022/acorex-modules-platform-dev-tools.mjs.map +1 -1
  291. package/fesm2022/{acorex-modules-platform-management-acorex-modules-platform-management-Cbf1rlEK.mjs → acorex-modules-platform-management-acorex-modules-platform-management-LJBIjN39.mjs} +5 -5
  292. package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-LJBIjN39.mjs.map +1 -0
  293. package/fesm2022/{acorex-modules-platform-management-menu-list.component-DIf_-oaM.mjs → acorex-modules-platform-management-menu-list.component-SXuHsuj0.mjs} +3 -3
  294. package/fesm2022/{acorex-modules-platform-management-menu-list.component-DIf_-oaM.mjs.map → acorex-modules-platform-management-menu-list.component-SXuHsuj0.mjs.map} +1 -1
  295. package/fesm2022/acorex-modules-platform-management.mjs +1 -1
  296. package/fesm2022/acorex-modules-procurement-management.mjs +2 -2
  297. package/fesm2022/acorex-modules-procurement-management.mjs.map +1 -1
  298. package/fesm2022/{acorex-modules-product-catalog-product-sku.entity-C3ynevYI.mjs → acorex-modules-product-catalog-product-sku.entity-DNgCnDtL.mjs} +2 -2
  299. package/fesm2022/acorex-modules-product-catalog-product-sku.entity-DNgCnDtL.mjs.map +1 -0
  300. package/fesm2022/{acorex-modules-product-catalog-product.entity-BbB7GAg7.mjs → acorex-modules-product-catalog-product.entity-CBwSFTL2.mjs} +2 -2
  301. package/fesm2022/acorex-modules-product-catalog-product.entity-CBwSFTL2.mjs.map +1 -0
  302. package/fesm2022/acorex-modules-product-catalog.mjs +2 -2
  303. package/fesm2022/acorex-modules-report-management.mjs +7 -7
  304. package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
  305. package/fesm2022/{acorex-modules-reservation-management-acorex-modules-reservation-management-BoUiTlmu.mjs → acorex-modules-reservation-management-acorex-modules-reservation-management-D7YtuAbZ.mjs} +7 -7
  306. package/fesm2022/{acorex-modules-reservation-management-acorex-modules-reservation-management-BoUiTlmu.mjs.map → acorex-modules-reservation-management-acorex-modules-reservation-management-D7YtuAbZ.mjs.map} +1 -1
  307. package/fesm2022/{acorex-modules-reservation-management-reservation-class-status.entity-D-ZdqKa8.mjs → acorex-modules-reservation-management-reservation-class-status.entity-D4insz8u.mjs} +2 -2
  308. package/fesm2022/{acorex-modules-reservation-management-reservation-class-status.entity-D-ZdqKa8.mjs.map → acorex-modules-reservation-management-reservation-class-status.entity-D4insz8u.mjs.map} +1 -1
  309. package/fesm2022/{acorex-modules-reservation-management-reservation-resource-type.entity-zPD-Psml.mjs → acorex-modules-reservation-management-reservation-resource-type.entity-Dn2CMqO9.mjs} +2 -2
  310. package/fesm2022/{acorex-modules-reservation-management-reservation-resource-type.entity-zPD-Psml.mjs.map → acorex-modules-reservation-management-reservation-resource-type.entity-Dn2CMqO9.mjs.map} +1 -1
  311. package/fesm2022/{acorex-modules-reservation-management-reservation-status-transition.entity-CQ85ZAGF.mjs → acorex-modules-reservation-management-reservation-status-transition.entity-CrwUrIrC.mjs} +2 -2
  312. package/fesm2022/{acorex-modules-reservation-management-reservation-status-transition.entity-CQ85ZAGF.mjs.map → acorex-modules-reservation-management-reservation-status-transition.entity-CrwUrIrC.mjs.map} +1 -1
  313. package/fesm2022/acorex-modules-reservation-management.mjs +1 -1
  314. package/fesm2022/acorex-modules-security-management.mjs +4 -4
  315. package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
  316. package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-Dj9u0VEL.mjs → acorex-modules-settings-management-acorex-modules-settings-management-O8kBegUF.mjs} +136 -65
  317. package/fesm2022/acorex-modules-settings-management-acorex-modules-settings-management-O8kBegUF.mjs.map +1 -0
  318. package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-DpRn1jAo.mjs → acorex-modules-settings-management-permission-definition.provider-CU7SEx6v.mjs} +2 -2
  319. package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-DpRn1jAo.mjs.map → acorex-modules-settings-management-permission-definition.provider-CU7SEx6v.mjs.map} +1 -1
  320. package/fesm2022/{acorex-modules-settings-management-setting-page.component-C9wPgm_P.mjs → acorex-modules-settings-management-setting-page.component-D8_cjOzW.mjs} +181 -19
  321. package/fesm2022/acorex-modules-settings-management-setting-page.component-D8_cjOzW.mjs.map +1 -0
  322. package/fesm2022/{acorex-modules-settings-management-setting-view.component-BQ69Bx8C.mjs → acorex-modules-settings-management-setting-view.component-DIvERzMC.mjs} +65 -17
  323. package/fesm2022/acorex-modules-settings-management-setting-view.component-DIvERzMC.mjs.map +1 -0
  324. package/fesm2022/acorex-modules-settings-management.mjs +1 -1
  325. package/fesm2022/acorex-modules-subscription-management.mjs +2 -2
  326. package/fesm2022/acorex-modules-subscription-management.mjs.map +1 -1
  327. package/fesm2022/{acorex-modules-task-management-acorex-modules-task-management-BB7eeaYX.mjs → acorex-modules-task-management-acorex-modules-task-management-Bp-9vZdR.mjs} +939 -383
  328. package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-Bp-9vZdR.mjs.map +1 -0
  329. package/fesm2022/acorex-modules-task-management-task-board.page-Brgg9wJa.mjs +3368 -0
  330. package/fesm2022/acorex-modules-task-management-task-board.page-Brgg9wJa.mjs.map +1 -0
  331. package/fesm2022/acorex-modules-task-management.mjs +1 -1
  332. package/fesm2022/acorex-modules-tenant-management.mjs +2 -2
  333. package/fesm2022/acorex-modules-tenant-management.mjs.map +1 -1
  334. package/fesm2022/acorex-modules-workflow-management-acorex-modules-workflow-management-gXP-srRO.mjs +5600 -0
  335. package/fesm2022/acorex-modules-workflow-management-acorex-modules-workflow-management-gXP-srRO.mjs.map +1 -0
  336. package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-B4DLmioy.mjs → acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BW6kK9Av.mjs} +3 -3
  337. package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-B4DLmioy.mjs.map → acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BW6kK9Av.mjs.map} +1 -1
  338. package/fesm2022/{acorex-modules-workflow-management-activity-definition.entity-B3DkgDQb.mjs → acorex-modules-workflow-management-activity-definition.entity-BlK-sL_3.mjs} +2 -2
  339. package/fesm2022/{acorex-modules-workflow-management-activity-definition.entity-B3DkgDQb.mjs.map → acorex-modules-workflow-management-activity-definition.entity-BlK-sL_3.mjs.map} +1 -1
  340. package/fesm2022/{acorex-modules-workflow-management-automation.entity-BigK8yE2.mjs → acorex-modules-workflow-management-automation.entity-C9q24TPu.mjs} +3 -3
  341. package/fesm2022/acorex-modules-workflow-management-automation.entity-C9q24TPu.mjs.map +1 -0
  342. package/fesm2022/{acorex-modules-workflow-management-index-1B7oRAKX.mjs → acorex-modules-workflow-management-index-BFdyFvcu.mjs} +8 -5
  343. package/fesm2022/acorex-modules-workflow-management-index-BFdyFvcu.mjs.map +1 -0
  344. package/fesm2022/{acorex-modules-workflow-management-index-DC_9M9dk.mjs → acorex-modules-workflow-management-index-BbVGViSE.mjs} +7 -163
  345. package/fesm2022/acorex-modules-workflow-management-index-BbVGViSE.mjs.map +1 -0
  346. package/fesm2022/{acorex-modules-workflow-management-index-34UZrsxw.mjs → acorex-modules-workflow-management-index-Bq5tBgif.mjs} +2 -2
  347. package/fesm2022/{acorex-modules-workflow-management-index-34UZrsxw.mjs.map → acorex-modules-workflow-management-index-Bq5tBgif.mjs.map} +1 -1
  348. package/fesm2022/{acorex-modules-workflow-management-index-CxheG2ry.mjs → acorex-modules-workflow-management-index-CIV7Abnc.mjs} +115 -7
  349. package/fesm2022/acorex-modules-workflow-management-index-CIV7Abnc.mjs.map +1 -0
  350. package/fesm2022/{acorex-modules-workflow-management-save-workflow-definition-activities.command-CGNwslcn.mjs → acorex-modules-workflow-management-save-workflow-definition-activities.command-B_tjSneV.mjs} +2 -2
  351. package/fesm2022/{acorex-modules-workflow-management-save-workflow-definition-activities.command-CGNwslcn.mjs.map → acorex-modules-workflow-management-save-workflow-definition-activities.command-B_tjSneV.mjs.map} +1 -1
  352. package/fesm2022/acorex-modules-workflow-management-workflow-activity-instance-rows.utils-L8W4ogSI.mjs +172 -0
  353. package/fesm2022/acorex-modules-workflow-management-workflow-activity-instance-rows.utils-L8W4ogSI.mjs.map +1 -0
  354. package/fesm2022/acorex-modules-workflow-management-workflow-configurator-widget-column.component-CPOQZxsq.mjs +79 -0
  355. package/fesm2022/acorex-modules-workflow-management-workflow-configurator-widget-column.component-CPOQZxsq.mjs.map +1 -0
  356. package/fesm2022/acorex-modules-workflow-management-workflow-configurator-widget-edit.component-CqF3z8Xq.mjs +466 -0
  357. package/fesm2022/acorex-modules-workflow-management-workflow-configurator-widget-edit.component-CqF3z8Xq.mjs.map +1 -0
  358. package/fesm2022/{acorex-modules-workflow-management-workflow-definition.entity-DISpkWE4.mjs → acorex-modules-workflow-management-workflow-definition.entity-BbnGGXZs.mjs} +3 -2
  359. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-BbnGGXZs.mjs.map +1 -0
  360. package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-BnKT3Wgh.mjs → acorex-modules-workflow-management-workflow-instance.entity-Ci6c4VoI.mjs} +3 -3
  361. package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-BnKT3Wgh.mjs.map → acorex-modules-workflow-management-workflow-instance.entity-Ci6c4VoI.mjs.map} +1 -1
  362. package/fesm2022/acorex-modules-workflow-management-workflow-run-history-popup.component-CJ0cRwUE.mjs +579 -0
  363. package/fesm2022/acorex-modules-workflow-management-workflow-run-history-popup.component-CJ0cRwUE.mjs.map +1 -0
  364. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-CHv2_W75.mjs +285 -0
  365. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-CHv2_W75.mjs.map +1 -0
  366. package/fesm2022/acorex-modules-workflow-management.mjs +1 -5212
  367. package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
  368. package/fesm2022/acorex-modules-workplacesafety-management-hazard-ppe-rule-status.provider-D1a0CBhs.mjs +42 -0
  369. package/fesm2022/acorex-modules-workplacesafety-management-hazard-ppe-rule-status.provider-D1a0CBhs.mjs.map +1 -0
  370. package/fesm2022/acorex-modules-workplacesafety-management-ppe-item-status.provider-VH_Bp0l5.mjs +70 -0
  371. package/fesm2022/acorex-modules-workplacesafety-management-ppe-item-status.provider-VH_Bp0l5.mjs.map +1 -0
  372. package/fesm2022/acorex-modules-workplacesafety-management.mjs +1229 -67
  373. package/fesm2022/acorex-modules-workplacesafety-management.mjs.map +1 -1
  374. package/package.json +2 -2
  375. package/types/acorex-modules-ai-management.d.ts +23 -4
  376. package/types/acorex-modules-assessment-management.d.ts +214 -188
  377. package/types/acorex-modules-asset-management.d.ts +1 -0
  378. package/types/acorex-modules-calendar-management.d.ts +61 -33
  379. package/types/acorex-modules-common.d.ts +14 -4
  380. package/types/acorex-modules-conversation.d.ts +59 -14
  381. package/types/acorex-modules-dashboard-management.d.ts +14 -2
  382. package/types/acorex-modules-document-management.d.ts +8 -0
  383. package/types/acorex-modules-human-capital-management.d.ts +28 -14
  384. package/types/acorex-modules-notification-management.d.ts +32 -3
  385. package/types/acorex-modules-report-management.d.ts +3 -0
  386. package/types/acorex-modules-settings-management.d.ts +12 -2
  387. package/types/acorex-modules-task-management.d.ts +196 -47
  388. package/types/acorex-modules-workflow-management.d.ts +41 -39
  389. package/types/acorex-modules-workplacesafety-management.d.ts +124 -4
  390. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-IHgQ8RVH.mjs.map +0 -1
  391. package/fesm2022/acorex-modules-assessment-management-fill-assessment-session.command-nkFpnKE2.mjs.map +0 -1
  392. package/fesm2022/acorex-modules-assessment-management-preview-questionnaire.command-Sd4gRHo5.mjs.map +0 -1
  393. package/fesm2022/acorex-modules-assessment-management-question-bank-item.entity-RLIfWCzq.mjs.map +0 -1
  394. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-B8LMKqVO.mjs.map +0 -1
  395. package/fesm2022/acorex-modules-assessment-management-questionnaire.entity-CZBnfCYE.mjs.map +0 -1
  396. package/fesm2022/acorex-modules-auth-acorex-modules-auth-BUuEzfsI.mjs +0 -803
  397. package/fesm2022/acorex-modules-auth-acorex-modules-auth-BUuEzfsI.mjs.map +0 -1
  398. package/fesm2022/acorex-modules-auth-app-chooser.component-DnmLfX5x.mjs.map +0 -1
  399. package/fesm2022/acorex-modules-auth-master.layout-DMP4RC6L.mjs +0 -25
  400. package/fesm2022/acorex-modules-auth-master.layout-DMP4RC6L.mjs.map +0 -1
  401. package/fesm2022/acorex-modules-auth-user-sessions.component-gJSHI_eh.mjs.map +0 -1
  402. package/fesm2022/acorex-modules-calendar-management-datasource.provider-C_iazC89.mjs +0 -95
  403. package/fesm2022/acorex-modules-calendar-management-datasource.provider-C_iazC89.mjs.map +0 -1
  404. package/fesm2022/acorex-modules-content-management-acorex-modules-content-management-txpooXrE.mjs.map +0 -1
  405. package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-DYW31fEm.mjs.map +0 -1
  406. package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-DQlE8l4c.mjs +0 -329
  407. package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-DQlE8l4c.mjs.map +0 -1
  408. package/fesm2022/acorex-modules-conversation-comments-page.component-CNqL-HdS.mjs.map +0 -1
  409. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-kk0CINL1.mjs.map +0 -1
  410. package/fesm2022/acorex-modules-data-management-index-DEm_BsbE.mjs.map +0 -1
  411. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-DrKulwY-.mjs.map +0 -1
  412. package/fesm2022/acorex-modules-human-capital-management-employee.entity-CrVU_3Jv.mjs.map +0 -1
  413. package/fesm2022/acorex-modules-human-capital-management-leave-request.entity-QeY6lcUY.mjs.map +0 -1
  414. package/fesm2022/acorex-modules-human-capital-management-leave-type.entity-D7B3adkZ.mjs.map +0 -1
  415. package/fesm2022/acorex-modules-human-capital-management-lifecycle-event-type.entity-Dim-8hT7.mjs.map +0 -1
  416. package/fesm2022/acorex-modules-human-capital-management-lifecycle-event.entity-3HtYOKrY.mjs.map +0 -1
  417. package/fesm2022/acorex-modules-human-capital-management-start-lifecycle-event-flow.command-Bz2SZcmm.mjs.map +0 -1
  418. package/fesm2022/acorex-modules-learning-management-course.entity-DUUgeikJ.mjs.map +0 -1
  419. package/fesm2022/acorex-modules-learning-management-enrollment.entity-CdJafrUh.mjs.map +0 -1
  420. package/fesm2022/acorex-modules-learning-management-learning-path.entity-Zo--bDto.mjs.map +0 -1
  421. package/fesm2022/acorex-modules-learning-management-skill.entity-VXkLbaD4.mjs.map +0 -1
  422. package/fesm2022/acorex-modules-learning-management-training.entity-C4KDv1uh.mjs.map +0 -1
  423. package/fesm2022/acorex-modules-locale-management-profiles-BOveGIcE.mjs.map +0 -1
  424. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-DiM2aFgg.mjs.map +0 -1
  425. package/fesm2022/acorex-modules-notification-management-notification-page.component-6YOiGgKm.mjs +0 -858
  426. package/fesm2022/acorex-modules-notification-management-notification-page.component-6YOiGgKm.mjs.map +0 -1
  427. package/fesm2022/acorex-modules-order-management-bulk-buy-order-item.entity-DGtHoqqj.mjs.map +0 -1
  428. package/fesm2022/acorex-modules-order-management-member-order-line.entity-DZJ90WHI.mjs.map +0 -1
  429. package/fesm2022/acorex-modules-organization-management-job-definition-responsibilities-page.component-aWZO09Xw.mjs.map +0 -1
  430. package/fesm2022/acorex-modules-organization-management-job-definition-skills-page.component-DJcFhQM9.mjs.map +0 -1
  431. package/fesm2022/acorex-modules-organization-management-team-business-unit.entity-DGuF5ux1.mjs.map +0 -1
  432. package/fesm2022/acorex-modules-organization-management-team-member.entity-Deem7M3N.mjs.map +0 -1
  433. package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-Cbf1rlEK.mjs.map +0 -1
  434. package/fesm2022/acorex-modules-product-catalog-product-sku.entity-C3ynevYI.mjs.map +0 -1
  435. package/fesm2022/acorex-modules-product-catalog-product.entity-BbB7GAg7.mjs.map +0 -1
  436. package/fesm2022/acorex-modules-settings-management-acorex-modules-settings-management-Dj9u0VEL.mjs.map +0 -1
  437. package/fesm2022/acorex-modules-settings-management-setting-page.component-C9wPgm_P.mjs.map +0 -1
  438. package/fesm2022/acorex-modules-settings-management-setting-view.component-BQ69Bx8C.mjs.map +0 -1
  439. package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-BB7eeaYX.mjs.map +0 -1
  440. package/fesm2022/acorex-modules-task-management-task-board.page-BmUIngWk.mjs +0 -2284
  441. package/fesm2022/acorex-modules-task-management-task-board.page-BmUIngWk.mjs.map +0 -1
  442. package/fesm2022/acorex-modules-workflow-management-automation.entity-BigK8yE2.mjs.map +0 -1
  443. package/fesm2022/acorex-modules-workflow-management-index-1B7oRAKX.mjs.map +0 -1
  444. package/fesm2022/acorex-modules-workflow-management-index-CxheG2ry.mjs.map +0 -1
  445. package/fesm2022/acorex-modules-workflow-management-index-DC_9M9dk.mjs.map +0 -1
  446. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-DISpkWE4.mjs.map +0 -1
  447. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-B4hEv2-a.mjs +0 -255
  448. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-B4hEv2-a.mjs.map +0 -1
@@ -0,0 +1,3368 @@
1
+ import * as i8 from '@acorex/components/badge';
2
+ import { AXBadgeModule } from '@acorex/components/badge';
3
+ import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
4
+ import * as i1$3 from '@acorex/components/button';
5
+ import { AXButtonComponent, AXButtonModule } from '@acorex/components/button';
6
+ import { AXCalendarComponent } from '@acorex/components/calendar';
7
+ import * as i2$1 from '@acorex/components/decorators';
8
+ import { AXDecoratorIconComponent, AXDecoratorModule } from '@acorex/components/decorators';
9
+ import * as i3 from '@acorex/components/dropdown';
10
+ import { AXDropdownModule } from '@acorex/components/dropdown';
11
+ import * as i7 from '@acorex/components/loading';
12
+ import { AXLoadingModule } from '@acorex/components/loading';
13
+ import * as i2 from '@acorex/components/menu';
14
+ import { AXMenuModule } from '@acorex/components/menu';
15
+ import * as i9 from '@acorex/components/popover';
16
+ import { AXPopoverModule } from '@acorex/components/popover';
17
+ import * as i10 from '@acorex/components/selection-list';
18
+ import { AXSelectionListModule } from '@acorex/components/selection-list';
19
+ import { AXCalendarService } from '@acorex/core/date-time';
20
+ import { AXLocaleService } from '@acorex/core/locale';
21
+ import * as i5 from '@acorex/core/translation';
22
+ import { AXTranslatorPipe, AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
23
+ import { AXUnsubscriber } from '@acorex/core/utils';
24
+ import { AXPPlatformScope, AXPDeviceService, AXPKeyboardShortcutRegistry, AXPDataSourceDefinitionProviderService, AXPKeyboardShortcutPriority } from '@acorex/platform/core';
25
+ import { AXPStateMessageComponent, AXPThemeLayoutBlockComponent, AXPQueryFiltersComponent, AXPLayoutSideDetailPanelComponent, AXPLayoutSideDetailPanelSectionDirective } from '@acorex/platform/layout/components';
26
+ import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPageLayoutBase } from '@acorex/platform/layout/views';
27
+ import * as i1$4 from '@angular/common';
28
+ import { AsyncPipe, CommonModule } from '@angular/common';
29
+ import * as i0 from '@angular/core';
30
+ import { computed, inject, signal, effect, ViewEncapsulation, ChangeDetectionStrategy, Component, DestroyRef, Injector, viewChild, input, output, untracked, afterNextRender, model, viewChildren, HostListener } from '@angular/core';
31
+ import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
32
+ import * as i1$2 from '@angular/forms';
33
+ import { FormsModule } from '@angular/forms';
34
+ import { Router, ActivatedRoute, NavigationEnd, RouterModule } from '@angular/router';
35
+ import { isEqual, sortBy } from 'lodash-es';
36
+ import { filter } from 'rxjs';
37
+ import { n as normalizePriorityFilterKeys, A as AXMTaskBoardSettings, a as normalizeTaskBoardAssigneeIds, c as canViewAllTaskAssignees, h as hasTaskBoardSavedAssigneePreference, r as resolveTaskBoardSavedAssigneeIds, b as AXPTaskBoardService, R as RootConfig, d as AXMTaskBoardTaskPopoverOverlayService, T as TASK_BOARD_GRID_ROW_ACTION_COLUMN_WIDTH, e as TASK_BOARD_GRID_ROW_ACTION_ITEMS, f as AXPDueStatusProviderService, g as filterTasksOverlappingRange, i as enrichTaskBoardTasks, j as resolveTaskBoardSchedulerLabels } from './acorex-modules-task-management-acorex-modules-task-management-Bp-9vZdR.mjs';
38
+ import { AXFormatPipe } from '@acorex/core/format';
39
+ import * as i1 from '@acorex/platform/layout/widget-core';
40
+ import { AXPWidgetCoreModule } from '@acorex/platform/layout/widget-core';
41
+ import { AXPSessionService } from '@acorex/platform/auth';
42
+ import { applyDateFilterPreset, AXPRegionalSetting, AXPSettingsService } from '@acorex/platform/common';
43
+ import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
44
+ import { normalizeRegionalCalendarEventIds } from '@acorex/modules/calendar-management';
45
+ import { AXSchedulerService, AXSchedulerComponent } from '@acorex/components/scheduler';
46
+ import { AXPCommandService } from '@acorex/platform/runtime';
47
+ import { AXDataSource } from '@acorex/cdk/common';
48
+ import * as i1$1 from '@acorex/components/data-table';
49
+ import { AXDataTableModule } from '@acorex/components/data-table';
50
+ import { AXKanbanComponent } from '@acorex/components/kanban';
51
+
52
+ //#region ---- Imports ----
53
+ const AXM_TASK_BOARD_VIEW_CATEGORIES = [
54
+ 'calendar',
55
+ 'timeline',
56
+ 'table',
57
+ 'kanban',
58
+ ];
59
+ const AXM_TASK_BOARD_DEFAULT_LAYOUT_BY_CATEGORY = {
60
+ calendar: 'monthly',
61
+ timeline: 'daily',
62
+ table: 'simple',
63
+ kanban: null,
64
+ };
65
+ //#endregion
66
+ //#region ---- Category ↔ Leaf Mode ----
67
+ const CALENDAR_LAYOUT_TO_MODE = {
68
+ daily: 'day',
69
+ weekly: 'week',
70
+ monthly: 'month',
71
+ agenda: 'agenda',
72
+ };
73
+ const TIMELINE_LAYOUT_TO_MODE = {
74
+ daily: 'timeline-day',
75
+ weekly: 'timeline-weekly',
76
+ monthly: 'timeline-month',
77
+ yearly: 'timeline-year',
78
+ };
79
+ const TABLE_LAYOUT_TO_MODE = {
80
+ simple: 'grid',
81
+ grouped: 'status-grouped-grid',
82
+ };
83
+ function resolveTaskBoardViewCategory(viewMode) {
84
+ if (viewMode === 'kanban') {
85
+ return 'kanban';
86
+ }
87
+ if (viewMode === 'grid' || viewMode === 'status-grouped-grid') {
88
+ return 'table';
89
+ }
90
+ if (viewMode.startsWith('timeline-')) {
91
+ return 'timeline';
92
+ }
93
+ return 'calendar';
94
+ }
95
+ function resolveTaskBoardViewLayout(viewMode) {
96
+ if (viewMode === 'kanban') {
97
+ return null;
98
+ }
99
+ const calendarEntry = Object.entries(CALENDAR_LAYOUT_TO_MODE).find(([, mode]) => mode === viewMode);
100
+ if (calendarEntry) {
101
+ return calendarEntry[0];
102
+ }
103
+ const timelineEntry = Object.entries(TIMELINE_LAYOUT_TO_MODE).find(([, mode]) => mode === viewMode);
104
+ if (timelineEntry) {
105
+ return timelineEntry[0];
106
+ }
107
+ const tableEntry = Object.entries(TABLE_LAYOUT_TO_MODE).find(([, mode]) => mode === viewMode);
108
+ if (tableEntry) {
109
+ return tableEntry[0];
110
+ }
111
+ return AXM_TASK_BOARD_DEFAULT_LAYOUT_BY_CATEGORY.calendar;
112
+ }
113
+ function resolveTaskBoardLeafViewMode(category, layout) {
114
+ switch (category) {
115
+ case 'calendar':
116
+ return CALENDAR_LAYOUT_TO_MODE[layout ?? 'monthly'] ?? 'month';
117
+ case 'timeline':
118
+ return TIMELINE_LAYOUT_TO_MODE[layout ?? 'daily'] ?? 'timeline-day';
119
+ case 'table':
120
+ return TABLE_LAYOUT_TO_MODE[layout ?? 'simple'] ?? 'grid';
121
+ case 'kanban':
122
+ return 'kanban';
123
+ default:
124
+ return 'month';
125
+ }
126
+ }
127
+ function isTaskBoardRangeFilterCategory(category) {
128
+ return category === 'table' || category === 'kanban';
129
+ }
130
+ function usesTaskBoardToolbarNavigator(_viewMode) {
131
+ return true;
132
+ }
133
+ function getTaskBoardLayoutOptions(category) {
134
+ switch (category) {
135
+ case 'calendar':
136
+ return [
137
+ { key: 'daily', text: 'daily', icon: 'fa-light fa-calendar-day' },
138
+ { key: 'weekly', text: 'weekly', icon: 'fa-light fa-calendar-week' },
139
+ { key: 'monthly', text: 'monthly', icon: 'fa-light fa-calendar-alt' },
140
+ { key: 'agenda', text: 'agenda', icon: 'fa-light fa-calendar-range' },
141
+ ];
142
+ case 'timeline':
143
+ return [
144
+ { key: 'daily', text: 'daily', icon: 'fa-light fa-calendar-day' },
145
+ { key: 'weekly', text: 'weekly', icon: 'fa-light fa-calendar-week' },
146
+ { key: 'monthly', text: 'monthly', icon: 'fa-light fa-calendar-alt' },
147
+ { key: 'yearly', text: 'yearly', icon: 'fa-light fa-calendar-range' },
148
+ ];
149
+ case 'table':
150
+ return [
151
+ { key: 'simple', text: 'grid', icon: 'fa-light fa-table' },
152
+ { key: 'grouped', text: 'status-grouped-grid', icon: 'fa-light fa-table' },
153
+ ];
154
+ default:
155
+ return [];
156
+ }
157
+ }
158
+ function deriveTaskBoardDateRangeFromNavigator(calendarService, viewMode, currentDate, daysCount) {
159
+ const cal = calendarService.create(currentDate);
160
+ switch (viewMode) {
161
+ case 'month':
162
+ case 'timeline-month':
163
+ return {
164
+ from: cal.startOf('month').date,
165
+ end: cal.endOf('month').date,
166
+ };
167
+ case 'week':
168
+ return {
169
+ from: cal.startOf('week').date,
170
+ end: cal.add('day', 6).date,
171
+ };
172
+ case 'timeline-weekly':
173
+ return {
174
+ from: cal.date,
175
+ end: cal.add('day', Math.max(1, daysCount) - 1).date,
176
+ };
177
+ case 'timeline-year':
178
+ return {
179
+ from: cal.startOf('year').date,
180
+ end: cal.endOf('year').date,
181
+ };
182
+ case 'agenda':
183
+ case 'grid':
184
+ case 'status-grouped-grid':
185
+ case 'kanban':
186
+ return {
187
+ from: cal.date,
188
+ end: cal.add('day', Math.max(1, daysCount) - 1).date,
189
+ };
190
+ case 'day':
191
+ case 'timeline-day':
192
+ default:
193
+ return {
194
+ from: cal.startOf('day').date,
195
+ end: cal.endOf('day').date,
196
+ };
197
+ }
198
+ }
199
+ function createTodayTaskBoardDateFilterValue(calendarService) {
200
+ return applyDateFilterPreset('today', calendarService) ?? {
201
+ operation: { type: 'between' },
202
+ value: {
203
+ from: calendarService.create(new Date()).startOf('day').date.toISOString(),
204
+ to: calendarService.create(new Date()).endOf('day').date.toISOString(),
205
+ },
206
+ };
207
+ }
208
+ function parseTaskBoardDateFilterValue(value) {
209
+ if (value == null) {
210
+ return null;
211
+ }
212
+ const raw = value;
213
+ const payload = raw.value;
214
+ if (payload == null) {
215
+ return null;
216
+ }
217
+ if (typeof payload === 'string') {
218
+ const date = new Date(payload);
219
+ return Number.isNaN(date.getTime()) ? null : { from: date, end: date };
220
+ }
221
+ const from = payload.from ? new Date(payload.from) : null;
222
+ const end = payload.to ? new Date(payload.to) : from;
223
+ if (!from || !end || Number.isNaN(from.getTime()) || Number.isNaN(end.getTime())) {
224
+ return null;
225
+ }
226
+ return { from, end };
227
+ }
228
+ function toTaskBoardDateFilterValue(range) {
229
+ return {
230
+ operation: { type: 'between' },
231
+ value: {
232
+ from: range.from.toISOString(),
233
+ to: range.end.toISOString(),
234
+ },
235
+ };
236
+ }
237
+ async function formatTaskBoardDateRangeDisplayText(range, calendarService, format) {
238
+ const from = calendarService.create(range.from).format(format);
239
+ const end = calendarService.create(range.end).format(format);
240
+ if (from === end) {
241
+ return from;
242
+ }
243
+ return `${from} – ${end}`;
244
+ }
245
+ function applyTaskBoardDateRangeToViewModel(range, setCurrentDate, setDaysCount) {
246
+ setCurrentDate(range.from);
247
+ const start = new Date(range.from.getFullYear(), range.from.getMonth(), range.from.getDate());
248
+ const end = new Date(range.end.getFullYear(), range.end.getMonth(), range.end.getDate());
249
+ const days = Math.round((end.getTime() - start.getTime()) / (1000 * 3600 * 24)) + 1;
250
+ setDaysCount(Math.max(1, days));
251
+ }
252
+ //#endregion
253
+ //#region ---- Settings Visibility ----
254
+ function normalizeVisibleTaskBoardCategories(flags) {
255
+ const categories = [];
256
+ if (flags.calendar !== false) {
257
+ categories.push('calendar');
258
+ }
259
+ if (flags.timeline !== false) {
260
+ categories.push('timeline');
261
+ }
262
+ if (flags.table !== false) {
263
+ categories.push('table');
264
+ }
265
+ if (flags.kanban !== false) {
266
+ categories.push('kanban');
267
+ }
268
+ return categories.length > 0 ? categories : [...AXM_TASK_BOARD_VIEW_CATEGORIES];
269
+ }
270
+ function resolveTaskBoardCategoryLayoutFromQuery(category, layout) {
271
+ if (category === 'kanban') {
272
+ return null;
273
+ }
274
+ const options = getTaskBoardLayoutOptions(category);
275
+ const match = options.find((option) => option.key === layout);
276
+ return (match?.key ?? AXM_TASK_BOARD_DEFAULT_LAYOUT_BY_CATEGORY[category]);
277
+ }
278
+ //#endregion
279
+
280
+ /**
281
+ * Keeps task-type filter values on stable provider {@link AXPTaskBoardTaskTypeOption.name} keys.
282
+ * Display titles are locale-dependent and must never be used for filtering.
283
+ */
284
+ function normalizeTaskTypeFilterNames(values, taskTypes) {
285
+ if (!values?.length) {
286
+ return [];
287
+ }
288
+ if (taskTypes.length === 0) {
289
+ return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
290
+ }
291
+ const names = new Set(taskTypes.map((type) => type.name));
292
+ const normalized = values.flatMap((value) => {
293
+ const trimmed = value.trim();
294
+ if (!trimmed) {
295
+ return [];
296
+ }
297
+ if (names.has(trimmed)) {
298
+ return [trimmed];
299
+ }
300
+ const matchedByTitle = taskTypes.find((type) => type.title.trim() === trimmed);
301
+ if (matchedByTitle) {
302
+ return [matchedByTitle.name];
303
+ }
304
+ return [];
305
+ });
306
+ return [...new Set(normalized)];
307
+ }
308
+ const DUE_STATUS_FILTER_NAMES = new Set([
309
+ 'completed',
310
+ 'no-due-date',
311
+ 'overdue',
312
+ 'due-today',
313
+ 'due-tomorrow',
314
+ 'due-this-week',
315
+ 'upcoming',
316
+ ]);
317
+ /** Maps due-status filter chips back to stable keys (never localized labels). */
318
+ function normalizeDueStatusFilterKeys(values) {
319
+ if (!values?.length) {
320
+ return [];
321
+ }
322
+ const titleToName = {
323
+ completed: 'completed',
324
+ 'no due date': 'no-due-date',
325
+ overdue: 'overdue',
326
+ 'due today': 'due-today',
327
+ 'due tomorrow': 'due-tomorrow',
328
+ 'due this week': 'due-this-week',
329
+ upcoming: 'upcoming',
330
+ };
331
+ const normalized = values.flatMap((value) => {
332
+ const trimmed = String(value ?? '').trim();
333
+ if (!trimmed) {
334
+ return [];
335
+ }
336
+ if (DUE_STATUS_FILTER_NAMES.has(trimmed)) {
337
+ return [trimmed];
338
+ }
339
+ const fromTitle = titleToName[trimmed.toLowerCase()];
340
+ return fromTitle ? [fromTitle] : [];
341
+ });
342
+ return [...new Set(normalized)];
343
+ }
344
+ /** Re-exports priority normalization for filter panels that may receive display labels. */
345
+ function normalizeTaskBoardPriorityFilterKeys(values) {
346
+ return normalizePriorityFilterKeys(values);
347
+ }
348
+
349
+ const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() => ({
350
+ daysCount: 7,
351
+ taskTypes: [],
352
+ isLoading: true,
353
+ detailPanel: false,
354
+ selectedTask: null,
355
+ rangeStartDate: null,
356
+ currentDate: new Date(),
357
+ currentViewMode: 'month',
358
+ visibleViewCategories: ['calendar', 'timeline', 'table', 'kanban'],
359
+ calendarLayout: 'monthly',
360
+ timelineLayout: 'daily',
361
+ tableLayout: 'simple',
362
+ selectedTaskTypeNames: [],
363
+ selectedAssigneeIds: [],
364
+ assigneeFilterHasSavedPreference: false,
365
+ selectedPriorities: [],
366
+ selectedDueStatusKeys: [],
367
+ colorBy: 'dueDate',
368
+ selectedReporterIds: [],
369
+ selectedCalendarEventTypeIds: [],
370
+ })), withComputed((store) => ({
371
+ currentViewCategory: computed(() => resolveTaskBoardViewCategory(store.currentViewMode())),
372
+ selectedTaskTypes: computed(() => {
373
+ const names = store.selectedTaskTypeNames();
374
+ if (!names || names.length === 0) {
375
+ return [];
376
+ }
377
+ return store.taskTypes().filter((tt) => names.includes(tt.name));
378
+ }),
379
+ isTaskSelected: computed(() => store.selectedTask() !== null),
380
+ isDetailPanelOpen: computed(() => store.detailPanel()),
381
+ effectiveColorBy: computed(() => store.colorBy()),
382
+ endDate: computed(() => {
383
+ const currentDate = store.currentDate();
384
+ const daysCount = store.daysCount();
385
+ // Calculate end of the last day in the range (23:59:59.999)
386
+ const endDate = new Date(currentDate);
387
+ endDate.setDate(endDate.getDate() + daysCount - 1);
388
+ endDate.setHours(23, 59, 59, 999);
389
+ return endDate;
390
+ }),
391
+ activeFilterCount: computed(() => {
392
+ let count = 0;
393
+ if (store.currentViewMode() !== 'kanban' &&
394
+ store.currentViewMode() !== 'status-grouped-grid' &&
395
+ store.selectedTaskTypeNames().length > 0) {
396
+ count++;
397
+ }
398
+ if (store.selectedAssigneeIds().length > 0) {
399
+ count++;
400
+ }
401
+ if (store.selectedReporterIds().length > 0) {
402
+ count++;
403
+ }
404
+ if (store.selectedPriorities().length > 0) {
405
+ count++;
406
+ }
407
+ if (store.selectedDueStatusKeys().length > 0) {
408
+ count++;
409
+ }
410
+ return count;
411
+ }),
412
+ })), withMethods((store, settingsService = inject(AXPSettingsService), taskBoardService = inject(AXPTaskBoardService), sessionService = inject(AXPSessionService)) => {
413
+ const userScopedSettings = () => settingsService.scope(AXPPlatformScope.User);
414
+ let settingsSyncInitialized = false;
415
+ const syncSettingsFromChangeEvent = (keys, values) => {
416
+ const patch = {};
417
+ if (keys.includes(AXMTaskBoardSettings.ColorBy)) {
418
+ patch.colorBy = values[AXMTaskBoardSettings.ColorBy] ?? 'dueDate';
419
+ }
420
+ if (keys.includes(AXPRegionalSetting.CalendarEvents)) {
421
+ patch.selectedCalendarEventTypeIds = normalizeRegionalCalendarEventIds(values[AXPRegionalSetting.CalendarEvents]);
422
+ }
423
+ if (Object.keys(patch).length > 0) {
424
+ patchState(store, patch);
425
+ }
426
+ };
427
+ return {
428
+ async reloadTaskTypes() {
429
+ const taskTypes = await taskBoardService.getTaskTypes();
430
+ patchState(store, { taskTypes });
431
+ },
432
+ async initialize() {
433
+ patchState(store, { isLoading: true });
434
+ try {
435
+ const taskTypes = await taskBoardService.getTaskTypes();
436
+ patchState(store, { taskTypes });
437
+ const [savedDaysCount, savedDateString, savedDetailPanel, savedViewMode, savedVisibleCalendar, savedVisibleTimeline, savedVisibleTable, savedVisibleKanban, savedCalendarLayout, savedTimelineLayout, savedTableLayout, savedTaskTypeNames, savedAssigneeIds, savedReporterIds, savedPriorities, savedDueStatusKeys, savedColorBy, savedCalendarEventIds,] = await Promise.all([
438
+ userScopedSettings().get(AXMTaskBoardSettings.DaysCount),
439
+ userScopedSettings().get(AXMTaskBoardSettings.CurrentDate),
440
+ userScopedSettings().get(AXMTaskBoardSettings.DetailPanel),
441
+ userScopedSettings().get(AXMTaskBoardSettings.ViewMode),
442
+ userScopedSettings().get(AXMTaskBoardSettings.VisibleCalendar),
443
+ userScopedSettings().get(AXMTaskBoardSettings.VisibleTimeline),
444
+ userScopedSettings().get(AXMTaskBoardSettings.VisibleTable),
445
+ userScopedSettings().get(AXMTaskBoardSettings.VisibleKanban),
446
+ userScopedSettings().get(AXMTaskBoardSettings.CalendarLayout),
447
+ userScopedSettings().get(AXMTaskBoardSettings.TimelineLayout),
448
+ userScopedSettings().get(AXMTaskBoardSettings.TableLayout),
449
+ userScopedSettings().get(AXMTaskBoardSettings.SelectedTaskTypeNames),
450
+ userScopedSettings().get(AXMTaskBoardSettings.SelectedAssigneeIds),
451
+ userScopedSettings().get(AXMTaskBoardSettings.SelectedReporterIds),
452
+ userScopedSettings().get(AXMTaskBoardSettings.SelectedPriorities),
453
+ userScopedSettings().get(AXMTaskBoardSettings.SelectedDueStatusKeys),
454
+ userScopedSettings().get(AXMTaskBoardSettings.ColorBy),
455
+ settingsService.get(AXPRegionalSetting.CalendarEvents),
456
+ ]);
457
+ const visibleViewCategories = normalizeVisibleTaskBoardCategories({
458
+ calendar: savedVisibleCalendar,
459
+ timeline: savedVisibleTimeline,
460
+ table: savedVisibleTable,
461
+ kanban: savedVisibleKanban,
462
+ });
463
+ // Ensure currentDate is always a valid Date
464
+ let currentDate;
465
+ if (savedDateString) {
466
+ const parsedDate = new Date(savedDateString);
467
+ currentDate = isNaN(parsedDate.getTime()) ? new Date() : parsedDate;
468
+ }
469
+ else {
470
+ currentDate = new Date();
471
+ }
472
+ const canViewAll = canViewAllTaskAssignees(sessionService);
473
+ const assigneeFilterHasSavedPreference = hasTaskBoardSavedAssigneePreference(savedAssigneeIds);
474
+ const resolvedSavedAssigneeIds = resolveTaskBoardSavedAssigneeIds(sessionService, savedAssigneeIds);
475
+ const defaultAssigneeIds = canViewAll
476
+ ? resolvedSavedAssigneeIds
477
+ : normalizeTaskBoardAssigneeIds(sessionService, resolvedSavedAssigneeIds);
478
+ const calendarLayout = savedCalendarLayout ?? 'monthly';
479
+ const timelineLayout = savedTimelineLayout ?? 'daily';
480
+ const tableLayout = savedTableLayout ?? 'simple';
481
+ let effectiveViewMode = savedViewMode || 'month';
482
+ const effectiveCategory = resolveTaskBoardViewCategory(effectiveViewMode);
483
+ if (!visibleViewCategories.includes(effectiveCategory)) {
484
+ const fallbackCategory = visibleViewCategories[0] ?? 'calendar';
485
+ effectiveViewMode = resolveTaskBoardLeafViewMode(fallbackCategory, AXM_TASK_BOARD_DEFAULT_LAYOUT_BY_CATEGORY[fallbackCategory]);
486
+ }
487
+ if (savedViewMode != null && effectiveViewMode !== savedViewMode) {
488
+ userScopedSettings()
489
+ .set(AXMTaskBoardSettings.ViewMode, effectiveViewMode)
490
+ .catch((error) => console.error('Error aligning task board view mode with visible views:', error));
491
+ }
492
+ let selectedTaskTypeNames = normalizeTaskTypeFilterNames(savedTaskTypeNames ?? [], taskTypes);
493
+ if (selectedTaskTypeNames.length === 0 &&
494
+ taskTypes.length > 0 &&
495
+ (effectiveViewMode === 'kanban' || effectiveViewMode === 'status-grouped-grid')) {
496
+ selectedTaskTypeNames = [taskTypes[0].name];
497
+ }
498
+ patchState(store, {
499
+ daysCount: savedDaysCount || 7,
500
+ detailPanel: savedDetailPanel || false,
501
+ currentViewMode: effectiveViewMode,
502
+ visibleViewCategories,
503
+ calendarLayout,
504
+ timelineLayout,
505
+ tableLayout,
506
+ currentDate,
507
+ selectedTaskTypeNames,
508
+ selectedAssigneeIds: defaultAssigneeIds,
509
+ assigneeFilterHasSavedPreference,
510
+ selectedReporterIds: savedReporterIds || [],
511
+ selectedPriorities: normalizeTaskBoardPriorityFilterKeys(savedPriorities),
512
+ selectedDueStatusKeys: normalizeDueStatusFilterKeys(savedDueStatusKeys),
513
+ colorBy: savedColorBy || 'dueDate',
514
+ selectedCalendarEventTypeIds: normalizeRegionalCalendarEventIds(savedCalendarEventIds),
515
+ isLoading: false,
516
+ });
517
+ if (!settingsSyncInitialized) {
518
+ settingsSyncInitialized = true;
519
+ settingsService.onChanged.subscribe((event) => {
520
+ if (event.scope !== AXPPlatformScope.User) {
521
+ return;
522
+ }
523
+ syncSettingsFromChangeEvent(event.keys, event.values);
524
+ });
525
+ }
526
+ }
527
+ catch (error) {
528
+ console.error('Error initializing TaskBoard ViewModel:', error);
529
+ patchState(store, {
530
+ detailPanel: false,
531
+ currentViewMode: 'month',
532
+ visibleViewCategories: ['calendar', 'timeline', 'table', 'kanban'],
533
+ calendarLayout: 'monthly',
534
+ timelineLayout: 'daily',
535
+ tableLayout: 'simple',
536
+ currentDate: new Date(),
537
+ selectedTaskTypeNames: [],
538
+ selectedAssigneeIds: [],
539
+ assigneeFilterHasSavedPreference: false,
540
+ selectedPriorities: [],
541
+ selectedDueStatusKeys: [],
542
+ colorBy: 'dueDate',
543
+ selectedReporterIds: [],
544
+ selectedCalendarEventTypeIds: [],
545
+ taskTypes: store.taskTypes(),
546
+ isLoading: false,
547
+ });
548
+ }
549
+ },
550
+ setViewMode(mode) {
551
+ let category = resolveTaskBoardViewCategory(mode);
552
+ const allowed = store.visibleViewCategories();
553
+ if (!allowed.includes(category)) {
554
+ const fallbackCategory = allowed[0] ?? category;
555
+ mode = resolveTaskBoardLeafViewMode(fallbackCategory, this.getLayoutForCategory(fallbackCategory));
556
+ category = fallbackCategory;
557
+ }
558
+ const layout = resolveTaskBoardViewLayout(mode);
559
+ if (layout) {
560
+ this.patchLayoutForCategory(category, layout);
561
+ }
562
+ this.applyLeafViewMode(mode);
563
+ },
564
+ setViewCategory(category) {
565
+ const allowed = store.visibleViewCategories();
566
+ const effectiveCategory = allowed.includes(category) ? category : (allowed[0] ?? category);
567
+ const layout = this.getLayoutForCategory(effectiveCategory);
568
+ this.applyLeafViewMode(resolveTaskBoardLeafViewMode(effectiveCategory, layout));
569
+ },
570
+ setViewLayout(category, layout) {
571
+ this.patchLayoutForCategory(category, layout);
572
+ if (resolveTaskBoardViewCategory(store.currentViewMode()) === category) {
573
+ this.applyLeafViewMode(resolveTaskBoardLeafViewMode(category, layout));
574
+ }
575
+ else {
576
+ this.persistLayout(category, layout);
577
+ }
578
+ },
579
+ getLayoutForCategory(category) {
580
+ switch (category) {
581
+ case 'calendar':
582
+ return store.calendarLayout();
583
+ case 'timeline':
584
+ return store.timelineLayout();
585
+ case 'table':
586
+ return store.tableLayout();
587
+ default:
588
+ return null;
589
+ }
590
+ },
591
+ patchLayoutForCategory(category, layout) {
592
+ switch (category) {
593
+ case 'calendar':
594
+ patchState(store, { calendarLayout: layout });
595
+ break;
596
+ case 'timeline':
597
+ patchState(store, { timelineLayout: layout });
598
+ break;
599
+ case 'table':
600
+ patchState(store, { tableLayout: layout });
601
+ break;
602
+ }
603
+ this.persistLayout(category, layout);
604
+ },
605
+ persistLayout(category, layout) {
606
+ const key = category === 'calendar'
607
+ ? AXMTaskBoardSettings.CalendarLayout
608
+ : category === 'timeline'
609
+ ? AXMTaskBoardSettings.TimelineLayout
610
+ : AXMTaskBoardSettings.TableLayout;
611
+ userScopedSettings()
612
+ .set(key, layout)
613
+ .catch((error) => console.error('Error saving task board view layout:', error));
614
+ },
615
+ applyLeafViewMode(mode) {
616
+ if ((mode === 'kanban' || mode === 'status-grouped-grid') &&
617
+ store.selectedTaskTypeNames().length === 0) {
618
+ const firstTaskType = store.taskTypes()[0];
619
+ if (firstTaskType) {
620
+ this.setSelectedTaskTypeNames([firstTaskType.name]);
621
+ }
622
+ }
623
+ if ((mode === 'kanban' || mode === 'status-grouped-grid') &&
624
+ store.selectedTaskTypeNames().length > 1) {
625
+ this.setSelectedTaskTypeNames([store.selectedTaskTypeNames()[0]]);
626
+ }
627
+ patchState(store, { currentViewMode: mode });
628
+ userScopedSettings()
629
+ .set(AXMTaskBoardSettings.ViewMode, mode)
630
+ .catch((error) => console.error('Error saving task board view mode:', error));
631
+ },
632
+ setCurrentDate(date) {
633
+ patchState(store, { currentDate: new Date(date) });
634
+ userScopedSettings()
635
+ .set(AXMTaskBoardSettings.CurrentDate, date.toISOString())
636
+ .catch((error) => console.error('Error saving current date:', error));
637
+ },
638
+ setSelectedTaskTypeNames(taskTypeNames, isQueryParam = false) {
639
+ patchState(store, { selectedTaskTypeNames: taskTypeNames });
640
+ if (isQueryParam)
641
+ return;
642
+ userScopedSettings()
643
+ .set(AXMTaskBoardSettings.SelectedTaskTypeNames, taskTypeNames)
644
+ .catch((error) => console.error('Error saving selected task type filter:', error));
645
+ },
646
+ setSelectedAssigneeIds(assigneeIds, isQueryParam = false, persistPreference = !isQueryParam) {
647
+ const normalizedAssigneeIds = normalizeTaskBoardAssigneeIds(sessionService, assigneeIds);
648
+ patchState(store, {
649
+ selectedAssigneeIds: normalizedAssigneeIds,
650
+ ...(persistPreference ? { assigneeFilterHasSavedPreference: true } : {}),
651
+ });
652
+ if (isQueryParam || !persistPreference)
653
+ return;
654
+ userScopedSettings()
655
+ .set(AXMTaskBoardSettings.SelectedAssigneeIds, normalizedAssigneeIds)
656
+ .catch((error) => console.error('Error saving selected assignee filter:', error));
657
+ },
658
+ setSelectedReporterIds(reporterIds, isQueryParam = false) {
659
+ patchState(store, { selectedReporterIds: reporterIds });
660
+ if (isQueryParam)
661
+ return;
662
+ userScopedSettings()
663
+ .set(AXMTaskBoardSettings.SelectedReporterIds, reporterIds)
664
+ .catch((error) => console.error('Error saving selected reporter filter:', error));
665
+ },
666
+ setSelectedPriorities(priorities, isQueryParam = false) {
667
+ patchState(store, { selectedPriorities: priorities });
668
+ if (isQueryParam)
669
+ return;
670
+ userScopedSettings()
671
+ .set(AXMTaskBoardSettings.SelectedPriorities, priorities)
672
+ .catch((error) => console.error('Error saving selected priority filter:', error));
673
+ },
674
+ setSelectedDueStatusKeys(dueStatusKeys, isQueryParam = false) {
675
+ patchState(store, { selectedDueStatusKeys: dueStatusKeys });
676
+ if (isQueryParam)
677
+ return;
678
+ userScopedSettings()
679
+ .set(AXMTaskBoardSettings.SelectedDueStatusKeys, dueStatusKeys)
680
+ .catch((error) => console.error('Error saving selected due status filter:', error));
681
+ },
682
+ setColorBy(colorBy) {
683
+ patchState(store, { colorBy });
684
+ userScopedSettings()
685
+ .set(AXMTaskBoardSettings.ColorBy, colorBy)
686
+ .catch((error) => console.error('Error saving task board color by:', error));
687
+ },
688
+ setSelectedCalendarEventTypeIds(eventTypeIds) {
689
+ patchState(store, { selectedCalendarEventTypeIds: eventTypeIds });
690
+ userScopedSettings()
691
+ .set(AXPRegionalSetting.CalendarEvents, eventTypeIds)
692
+ .catch((error) => console.error('Error saving selected calendar events:', error));
693
+ },
694
+ /**
695
+ * Sets the currently selected task. Pass `null` to clear the selection.
696
+ * @param task The task to select, or null.
697
+ */
698
+ selectTask(task) {
699
+ patchState(store, { selectedTask: task });
700
+ },
701
+ /**
702
+ * A convenience method to clear the currently selected task.
703
+ */
704
+ clearSelectedTask() {
705
+ patchState(store, { selectedTask: null });
706
+ },
707
+ openDetailPanel() {
708
+ patchState(store, { detailPanel: true });
709
+ userScopedSettings()
710
+ .set(AXMTaskBoardSettings.DetailPanel, true)
711
+ .catch((error) => console.error('Error saving detail panel:', error));
712
+ },
713
+ closeDetailPanel() {
714
+ patchState(store, { detailPanel: false });
715
+ userScopedSettings()
716
+ .set(AXMTaskBoardSettings.DetailPanel, false)
717
+ .catch((error) => console.error('Error saving detail panel:', error));
718
+ },
719
+ toggleDetailPanel() {
720
+ const detailPanel = !store.detailPanel();
721
+ patchState(store, { detailPanel: detailPanel });
722
+ userScopedSettings()
723
+ .set(AXMTaskBoardSettings.DetailPanel, detailPanel)
724
+ .catch((error) => console.error('Error saving detail panel:', error));
725
+ },
726
+ async getStatusName(key, provider) {
727
+ return taskBoardService.getStatusName(key, provider);
728
+ },
729
+ /**
730
+ * Sets the start date for a new range selection.
731
+ * Pass `null` to clear the selection.
732
+ * @param date The start date of the range.
733
+ */
734
+ setRangeStartDate(date) {
735
+ patchState(store, { rangeStartDate: date });
736
+ },
737
+ setDaysCount(days) {
738
+ const count = Math.max(1, days);
739
+ patchState(store, { daysCount: count });
740
+ userScopedSettings()
741
+ .set(AXMTaskBoardSettings.DaysCount, count)
742
+ .catch((error) => console.error('Error saving days count:', error));
743
+ },
744
+ };
745
+ }));
746
+
747
+ class AXMTaskBoardDetailPanel {
748
+ constructor() {
749
+ this.rootConfig = RootConfig;
750
+ this.vm = inject(AXMTaskBoardViewModel);
751
+ this.localeService = inject(AXLocaleService);
752
+ this.taskBoardService = inject(AXPTaskBoardService);
753
+ this.statusName = signal('', ...(ngDevMode ? [{ debugName: "statusName" }] : /* istanbul ignore next */ []));
754
+ this.extraFields = signal([], ...(ngDevMode ? [{ debugName: "extraFields" }] : /* istanbul ignore next */ []));
755
+ this.#selectedTaskChanged = effect(async () => {
756
+ const selectedTask = this.vm.selectedTask();
757
+ const key = selectedTask?.status.id;
758
+ const provider = selectedTask?.provider;
759
+ if (!provider)
760
+ return;
761
+ const name = await this.vm.getStatusName(key, provider);
762
+ if (name)
763
+ this.statusName.set(name);
764
+ }, ...(ngDevMode ? [{ debugName: "#selectedTaskChanged" }] : /* istanbul ignore next */ []));
765
+ this.#selectedTaskTypeChanged = effect(async () => {
766
+ const selectedTask = this.vm.selectedTask();
767
+ const selectedTaskType = this.taskBoardService.getProvider(selectedTask?.provider);
768
+ const extraFields = await selectedTaskType?.getExtraFields();
769
+ if (!extraFields) {
770
+ this.extraFields.set([]);
771
+ return;
772
+ }
773
+ this.extraFields.set(extraFields);
774
+ }, ...(ngDevMode ? [{ debugName: "#selectedTaskTypeChanged" }] : /* istanbul ignore next */ []));
775
+ }
776
+ #selectedTaskChanged;
777
+ #selectedTaskTypeChanged;
778
+ capitalizeFirstLetter(text) {
779
+ return String(text).charAt(0).toUpperCase() + String(text).slice(1);
780
+ }
781
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardDetailPanel, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
782
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardDetailPanel, isStandalone: true, selector: "axm-task-board-detail-panel", ngImport: i0, template: "@if (vm.isTaskSelected()) {\n @let nodeInfo = vm.selectedTask();\n <div class=\"__header\">\n <div class=\"__title\">\n <span>{{ nodeInfo?.title }}</span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n\n <div class=\"__content\">\n <div class=\"__section\">\n <div class=\"__title\">\n <span>{{ '@task-management:task-board.detail-panel.title' | translate | async }}</span>\n </div>\n <div class=\"__content\">\n @if (nodeInfo?.description) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ '@task-management:task-board.detail-panel.description' | translate | async }}\n </span>\n </div>\n <div class=\"__content\">{{ nodeInfo?.description }}</div>\n </div>\n }\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ '@task-management:task-board.detail-panel.start-date' | translate | async }}\n </span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.startDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ '@task-management:task-board.detail-panel.end-date' | translate | async }}</span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.endDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ '@task-management:task-board.detail-panel.reporter' | translate | async }}</span>\n </div>\n <div class=\"__content\">\n {{ nodeInfo?.reporter?.fullName }}\n </div>\n </div>\n @if (nodeInfo?.assignee) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ '@task-management:task-board.detail-panel.assignee' | translate | async }}</span>\n </div>\n <div class=\"__content\">{{ nodeInfo?.assignee?.fullName }}</div>\n </div>\n }\n @if (statusName()) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ '@task-management:task-board.detail-panel.status' | translate | async }}</span>\n </div>\n <div class=\"__content\">{{ statusName() }}</div>\n </div>\n }\n @if (nodeInfo?.priority) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ '@task-management:task-board.detail-panel.priority' | translate | async }}\n </span>\n </div>\n <div class=\"__content\">{{ capitalizeFirstLetter(nodeInfo?.priority ?? '') }}</div>\n </div>\n }\n @if (extraFields() && extraFields().length) {\n <div class=\"__row\">\n <axp-widgets-container [context]=\"nodeInfo\">\n @for (extraField of extraFields(); track extraField) {\n <div class=\"__title\">\n <span>\n {{ extraField.title | translate | async }}\n </span>\n </div>\n <div class=\"__content\">\n <ng-container axp-widget-renderer [node]=\"extraField.widget\" [mode]=\"'view'\"> </ng-container>\n </div>\n }\n </axp-widgets-container>\n </div>\n }\n </div>\n </div>\n </div>\n} @else {\n <div class=\"__header\">\n <div class=\"__title\">\n <span>\n {{ '@task-management:task-board.detail-panel.title' | translate | async }}\n </span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n\n <div class=\"__content ax-flex ax-items-center ax-justify-center\">\n <axp-state-message\n icon=\"fa-light fa-clipboard-list-check\"\n [title]=\"'@task-management:task-board.detail-panel.no-task-selected.title'\"\n [description]=\"'@task-management:task-board.detail-panel.no-task-selected.description'\"\n >\n </axp-state-message>\n </div>\n}\n", styles: ["axm-task-board-detail-panel{display:flex;flex-direction:column;border-radius:.5rem;border-width:1px;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}@media(min-width:1024px){axm-task-board-detail-panel{width:24rem}}axm-task-board-detail-panel>.__header{display:flex;flex-direction:row;align-items:center;justify-content:space-between;border-bottom-width:1px;padding:1rem}@media(min-width:1024px){axm-task-board-detail-panel>.__header{width:20rem}}axm-task-board-detail-panel>.__header>.__title{display:flex;width:90%;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__header>.__title span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;font-weight:600;line-height:1.625}axm-task-board-detail-panel>.__content{display:flex;flex-direction:column}axm-task-board-detail-panel>.__content>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}axm-task-board-detail-panel>.__content>.__section{display:flex;flex-direction:column;padding:1rem}axm-task-board-detail-panel>.__content>.__section>.__title{margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;font-weight:700}axm-task-board-detail-panel>.__content>.__section>.__content{display:flex;flex-direction:column;gap:1rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row{display:flex;flex-direction:column;gap:.25rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__title{display:flex;font-size:.875rem;line-height:1.25rem;font-weight:600;opacity:.9}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content{display:flex;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content span{opacity:.7}\n"], dependencies: [{ kind: "component", type: 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: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "look"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: AXFormatPipe, name: "format" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
783
+ }
784
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardDetailPanel, decorators: [{
785
+ type: Component,
786
+ args: [{ selector: 'axm-task-board-detail-panel', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
787
+ AsyncPipe,
788
+ AXFormatPipe,
789
+ AXTranslatorPipe,
790
+ AXButtonComponent,
791
+ AXPStateMessageComponent,
792
+ AXPWidgetCoreModule,
793
+ AXDecoratorIconComponent,
794
+ ], template: "@if (vm.isTaskSelected()) {\n @let nodeInfo = vm.selectedTask();\n <div class=\"__header\">\n <div class=\"__title\">\n <span>{{ nodeInfo?.title }}</span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n\n <div class=\"__content\">\n <div class=\"__section\">\n <div class=\"__title\">\n <span>{{ '@task-management:task-board.detail-panel.title' | translate | async }}</span>\n </div>\n <div class=\"__content\">\n @if (nodeInfo?.description) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ '@task-management:task-board.detail-panel.description' | translate | async }}\n </span>\n </div>\n <div class=\"__content\">{{ nodeInfo?.description }}</div>\n </div>\n }\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ '@task-management:task-board.detail-panel.start-date' | translate | async }}\n </span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.startDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ '@task-management:task-board.detail-panel.end-date' | translate | async }}</span>\n </div>\n <div class=\"__content\">\n {{\n nodeInfo?.endDate\n | format: 'datetime' : { format: 'short', calendar: localeService.activeProfile().calendar.system }\n | async\n }}\n </div>\n </div>\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ '@task-management:task-board.detail-panel.reporter' | translate | async }}</span>\n </div>\n <div class=\"__content\">\n {{ nodeInfo?.reporter?.fullName }}\n </div>\n </div>\n @if (nodeInfo?.assignee) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ '@task-management:task-board.detail-panel.assignee' | translate | async }}</span>\n </div>\n <div class=\"__content\">{{ nodeInfo?.assignee?.fullName }}</div>\n </div>\n }\n @if (statusName()) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>{{ '@task-management:task-board.detail-panel.status' | translate | async }}</span>\n </div>\n <div class=\"__content\">{{ statusName() }}</div>\n </div>\n }\n @if (nodeInfo?.priority) {\n <div class=\"__row\">\n <div class=\"__title\">\n <span>\n {{ '@task-management:task-board.detail-panel.priority' | translate | async }}\n </span>\n </div>\n <div class=\"__content\">{{ capitalizeFirstLetter(nodeInfo?.priority ?? '') }}</div>\n </div>\n }\n @if (extraFields() && extraFields().length) {\n <div class=\"__row\">\n <axp-widgets-container [context]=\"nodeInfo\">\n @for (extraField of extraFields(); track extraField) {\n <div class=\"__title\">\n <span>\n {{ extraField.title | translate | async }}\n </span>\n </div>\n <div class=\"__content\">\n <ng-container axp-widget-renderer [node]=\"extraField.widget\" [mode]=\"'view'\"> </ng-container>\n </div>\n }\n </axp-widgets-container>\n </div>\n }\n </div>\n </div>\n </div>\n} @else {\n <div class=\"__header\">\n <div class=\"__title\">\n <span>\n {{ '@task-management:task-board.detail-panel.title' | translate | async }}\n </span>\n </div>\n <ax-button [look]=\"'blank'\" class=\"ax-sm ax-rounded-full\" (onClick)=\"vm.closeDetailPanel()\">\n <ax-icon icon=\"fa-solid fa-xmark\"></ax-icon>\n </ax-button>\n </div>\n\n <div class=\"__content ax-flex ax-items-center ax-justify-center\">\n <axp-state-message\n icon=\"fa-light fa-clipboard-list-check\"\n [title]=\"'@task-management:task-board.detail-panel.no-task-selected.title'\"\n [description]=\"'@task-management:task-board.detail-panel.no-task-selected.description'\"\n >\n </axp-state-message>\n </div>\n}\n", styles: ["axm-task-board-detail-panel{display:flex;flex-direction:column;border-radius:.5rem;border-width:1px;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}@media(min-width:1024px){axm-task-board-detail-panel{width:24rem}}axm-task-board-detail-panel>.__header{display:flex;flex-direction:row;align-items:center;justify-content:space-between;border-bottom-width:1px;padding:1rem}@media(min-width:1024px){axm-task-board-detail-panel>.__header{width:20rem}}axm-task-board-detail-panel>.__header>.__title{display:flex;width:90%;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__header>.__title span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;font-weight:600;line-height:1.625}axm-task-board-detail-panel>.__content{display:flex;flex-direction:column}axm-task-board-detail-panel>.__content>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}axm-task-board-detail-panel>.__content>.__section{display:flex;flex-direction:column;padding:1rem}axm-task-board-detail-panel>.__content>.__section>.__title{margin-bottom:1rem;font-size:.875rem;line-height:1.25rem;font-weight:700}axm-task-board-detail-panel>.__content>.__section>.__content{display:flex;flex-direction:column;gap:1rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row{display:flex;flex-direction:column;gap:.25rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__title{display:flex;font-size:.875rem;line-height:1.25rem;font-weight:600;opacity:.9}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content{display:flex;flex-direction:row;align-items:center;gap:.5rem}axm-task-board-detail-panel>.__content>.__section>.__content>.__row>.__content span{opacity:.7}\n"] }]
795
+ }] });
796
+
797
+ const TASK_BOARD_REGIONAL_LAYOUT_SETTING_KEYS = [
798
+ AXPRegionalSetting.LocaleProfile,
799
+ AXPRegionalSetting.Calendar,
800
+ AXPRegionalSetting.FirstDayOfWeek,
801
+ AXPRegionalSetting.WeekendDays,
802
+ ];
803
+ function buildTaskBoardRegionalProfileKey(parts) {
804
+ return [parts.profileCode, parts.calendarSystem, parts.weekStartsOn, parts.weekendDays.join('-')].join('|');
805
+ }
806
+
807
+ class AXMTaskBoardCalendarViewComponent {
808
+ constructor() {
809
+ this.vm = inject(AXMTaskBoardViewModel);
810
+ this.taskBoardService = inject(AXPTaskBoardService);
811
+ this.settingService = inject(AXPSettingsService);
812
+ this.commandService = inject(AXPCommandService);
813
+ this.schedulerService = inject(AXSchedulerService);
814
+ this.calendarService = inject(AXCalendarService);
815
+ this.localeService = inject(AXLocaleService);
816
+ this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
817
+ this.destroyRef = inject(DestroyRef);
818
+ this.injector = inject(Injector);
819
+ this.schedulerComponent = viewChild(AXSchedulerComponent, ...(ngDevMode ? [{ debugName: "schedulerComponent" }] : /* istanbul ignore next */ []));
820
+ this.resources = input([], ...(ngDevMode ? [{ debugName: "resources" }] : /* istanbul ignore next */ []));
821
+ this.refreshNonce = input(0, ...(ngDevMode ? [{ debugName: "refreshNonce" }] : /* istanbul ignore next */ []));
822
+ this.startingDate = input(new Date(), ...(ngDevMode ? [{ debugName: "startingDate" }] : /* istanbul ignore next */ []));
823
+ this.selectedView = input('month', ...(ngDevMode ? [{ debugName: "selectedView" }] : /* istanbul ignore next */ []));
824
+ this.dataSource = input.required(...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
825
+ this.activeCalendar = toSignal(this.calendarService.calendarChanges$, {
826
+ initialValue: this.calendarService.getActiveCalendar(),
827
+ });
828
+ /** Gates ax-scheduler in the template so we can destroy and recreate it cleanly on regional changes. */
829
+ this.schedulerMounted = signal(true, ...(ngDevMode ? [{ debugName: "schedulerMounted" }] : /* istanbul ignore next */ []));
830
+ this.regionalSettingsRevision = signal(0, ...(ngDevMode ? [{ debugName: "regionalSettingsRevision" }] : /* istanbul ignore next */ []));
831
+ this.previousRegionalProfileKey = null;
832
+ /** Active calendar system (e.g. solar-hijri for fa-IR). Required for correct week/today rendering. */
833
+ this.schedulerCalendar = computed(() => this.activeCalendar()?.name() ?? this.localeService.activeProfile().calendar.system, ...(ngDevMode ? [{ debugName: "schedulerCalendar" }] : /* istanbul ignore next */ []));
834
+ /** Detects locale profile and week-layout changes that require a fresh ax-scheduler instance. */
835
+ this.regionalProfileKey = computed(() => {
836
+ this.regionalSettingsRevision();
837
+ this.activeCalendar()?.weekdays;
838
+ const profile = this.localeService.activeProfile();
839
+ return buildTaskBoardRegionalProfileKey({
840
+ profileCode: profile.localeInfo?.code ?? '',
841
+ calendarSystem: this.schedulerCalendar(),
842
+ weekStartsOn: profile.calendar.week?.startsOn ?? 0,
843
+ weekendDays: profile.calendar.week?.weekends ?? [],
844
+ });
845
+ }, ...(ngDevMode ? [{ debugName: "regionalProfileKey" }] : /* istanbul ignore next */ []));
846
+ /** Align week/month views to regional week boundaries before passing to ax-scheduler. */
847
+ this.schedulerStartingDate = computed(() => {
848
+ const date = this.startingDate();
849
+ const calendar = this.schedulerCalendar();
850
+ const axDate = this.calendarService.create(date, calendar);
851
+ switch (this.currentSchedulerView()) {
852
+ case 'week':
853
+ return axDate.startOf('week').date;
854
+ case 'month':
855
+ case 'timeline-month':
856
+ return axDate.startOf('month').date;
857
+ default:
858
+ return axDate.startOf('day').date;
859
+ }
860
+ }, ...(ngDevMode ? [{ debugName: "schedulerStartingDate" }] : /* istanbul ignore next */ []));
861
+ this.currentSchedulerView = computed(() => this.selectedView() === 'kanban' || this.selectedView() === 'grid'
862
+ ? 'month'
863
+ : this.selectedView(), ...(ngDevMode ? [{ debugName: "currentSchedulerView" }] : /* istanbul ignore next */ []));
864
+ this.onTaskClick = output();
865
+ this.onTaskChanged = output();
866
+ this.onMonthSlotDblClicked = output();
867
+ this.onActionClick = output();
868
+ this.component = output();
869
+ this.onTaskRightClick = output();
870
+ this.onRangeChanged = output();
871
+ this.regionalRemountEffect = effect(() => {
872
+ const profileKey = this.regionalProfileKey();
873
+ untracked(() => {
874
+ if (this.previousRegionalProfileKey === null) {
875
+ this.previousRegionalProfileKey = profileKey;
876
+ return;
877
+ }
878
+ if (profileKey === this.previousRegionalProfileKey) {
879
+ return;
880
+ }
881
+ this.previousRegionalProfileKey = profileKey;
882
+ this.remountScheduler();
883
+ });
884
+ }, ...(ngDevMode ? [{ debugName: "regionalRemountEffect" }] : /* istanbul ignore next */ []));
885
+ /** Re-binds parent scheduler ref whenever ax-scheduler remounts after a regional layout change. */
886
+ this.schedulerInstanceEffect = effect(() => {
887
+ if (!this.schedulerMounted()) {
888
+ return;
889
+ }
890
+ const scheduler = this.schedulerComponent();
891
+ if (!scheduler) {
892
+ return;
893
+ }
894
+ afterNextRender(() => {
895
+ const currentScheduler = this.schedulerComponent();
896
+ if (!currentScheduler || !this.schedulerMounted()) {
897
+ return;
898
+ }
899
+ this.component.emit(currentScheduler);
900
+ this.syncSchedulerCurrentDateFromToolbar({ force: true });
901
+ void currentScheduler.refresh();
902
+ }, { injector: this.injector });
903
+ }, ...(ngDevMode ? [{ debugName: "schedulerInstanceEffect" }] : /* istanbul ignore next */ []));
904
+ this.refreshNonceEffect = effect(() => {
905
+ this.refreshNonce();
906
+ if (!this.schedulerMounted()) {
907
+ return;
908
+ }
909
+ void this.schedulerComponent()?.refresh();
910
+ }, ...(ngDevMode ? [{ debugName: "refreshNonceEffect" }] : /* istanbul ignore next */ []));
911
+ this.schedulerStateSyncEffect = effect(() => {
912
+ if (!this.schedulerMounted()) {
913
+ return;
914
+ }
915
+ this.startingDate();
916
+ this.schedulerStartingDate();
917
+ this.schedulerCalendar();
918
+ this.localeService.activeProfile().localeInfo?.code;
919
+ this.currentSchedulerView();
920
+ this.vm.daysCount();
921
+ this.vm.selectedTaskTypeNames();
922
+ this.vm.selectedAssigneeIds();
923
+ this.vm.selectedReporterIds();
924
+ this.vm.selectedPriorities();
925
+ this.vm.selectedDueStatusKeys();
926
+ this.refreshNonce();
927
+ queueMicrotask(() => {
928
+ this.syncSchedulerCurrentDateFromToolbar();
929
+ void this.schedulerComponent()?.refresh();
930
+ });
931
+ }, ...(ngDevMode ? [{ debugName: "schedulerStateSyncEffect" }] : /* istanbul ignore next */ []));
932
+ this.holidays = (range) => {
933
+ const selectedEventTypeIds = this.vm.selectedCalendarEventTypeIds();
934
+ return this.taskBoardService.getEvents(range, selectedEventTypeIds);
935
+ };
936
+ this.settingService.onChanged.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {
937
+ if (event.keys.some((key) => TASK_BOARD_REGIONAL_LAYOUT_SETTING_KEYS.includes(key))) {
938
+ this.regionalSettingsRevision.update((value) => value + 1);
939
+ }
940
+ });
941
+ }
942
+ /**
943
+ * ax-scheduler only consumes `[startingDate]` on first mount; afterward its internal
944
+ * `currentDate` must be updated explicitly when the external toolbar navigator changes.
945
+ */
946
+ syncSchedulerCurrentDateFromToolbar(options) {
947
+ const scheduler = this.schedulerComponent();
948
+ if (!scheduler) {
949
+ return;
950
+ }
951
+ const view = this.currentSchedulerView();
952
+ let targetDate = this.calendarService.create(this.schedulerStartingDate(), this.schedulerCalendar());
953
+ if (view === 'week' || view === 'timeline-weekly') {
954
+ targetDate = this.schedulerService.alignToWeekStart(targetDate, {});
955
+ }
956
+ if (!options?.force && targetDate.equal(scheduler.currentDate())) {
957
+ return;
958
+ }
959
+ scheduler.currentDate.set(targetDate);
960
+ }
961
+ remountScheduler() {
962
+ this.schedulerMounted.set(false);
963
+ afterNextRender(() => {
964
+ this.schedulerMounted.set(true);
965
+ }, { injector: this.injector });
966
+ }
967
+ async ngAfterViewInit() {
968
+ this.taskBoardService.refresh$
969
+ .pipe(takeUntilDestroyed(this.destroyRef))
970
+ .subscribe(async (data) => {
971
+ const active = this.taskPopoverOverlay.getActiveTask();
972
+ if (!active?.provider) {
973
+ return;
974
+ }
975
+ if (data.provider && data.provider !== active.provider) {
976
+ return;
977
+ }
978
+ await this.refreshPopoverData();
979
+ });
980
+ this.taskBoardService.close$
981
+ .pipe(takeUntilDestroyed(this.destroyRef))
982
+ .subscribe((data) => {
983
+ const active = this.taskPopoverOverlay.getActiveTask();
984
+ if (!active?.provider) {
985
+ return;
986
+ }
987
+ if (data.provider && data.provider !== active.provider) {
988
+ return;
989
+ }
990
+ this.taskPopoverOverlay.close();
991
+ });
992
+ }
993
+ onTaskDrop(event) {
994
+ if (event.slot.view === 'agenda' && event.isSameSlotDrop) {
995
+ return;
996
+ }
997
+ const dropResult = this.schedulerService.calculateAppointmentDropResult(event);
998
+ if (dropResult.isSameSlotDrop) {
999
+ return;
1000
+ }
1001
+ const originalTask = event.appointment;
1002
+ this.schedulerService.applyDropResult(originalTask, dropResult);
1003
+ this.taskBoardService
1004
+ .updateTaskDateRange(originalTask, {
1005
+ from: dropResult.startDate,
1006
+ end: dropResult.endDate,
1007
+ })
1008
+ .then((persistedTask) => {
1009
+ this.onTaskChanged.emit(persistedTask);
1010
+ void this.schedulerComponent()?.refresh();
1011
+ })
1012
+ .catch((error) => {
1013
+ console.error('[TaskBoardCalendar] Failed to update task date range:', error);
1014
+ void this.schedulerComponent()?.refresh();
1015
+ });
1016
+ }
1017
+ onTaskRightClickHandler(event) {
1018
+ this.onTaskRightClick.emit({ nativeEvent: event.nativeEvent, task: event.appointment });
1019
+ }
1020
+ onSlotDblClicked(event) {
1021
+ if (event.sender.selectedView() === 'month') {
1022
+ this.onMonthSlotDblClicked.emit(event.slot.startDate.date);
1023
+ }
1024
+ }
1025
+ async handleRangeChanged(event) {
1026
+ this.onRangeChanged.emit(event);
1027
+ }
1028
+ handleActionClick(event) {
1029
+ this.onActionClick.emit({ nativeEvent: event.nativeEvent, task: event.appointment });
1030
+ }
1031
+ async onTaskClickHandler(event) {
1032
+ const task = event.appointment;
1033
+ const anchor = this.resolveAppointmentAnchor(event);
1034
+ if (anchor) {
1035
+ await this.taskPopoverOverlay.open({
1036
+ task,
1037
+ anchor,
1038
+ offsetX: 12,
1039
+ offsetY: 12,
1040
+ adaptivityEnabled: true,
1041
+ });
1042
+ }
1043
+ this.onTaskClick.emit(task);
1044
+ }
1045
+ async refreshPopoverData() {
1046
+ const active = this.taskPopoverOverlay.getActiveTask();
1047
+ if (!active?.provider) {
1048
+ return;
1049
+ }
1050
+ const provider = this.taskBoardService.getProvider(active.provider);
1051
+ if (!provider) {
1052
+ return;
1053
+ }
1054
+ try {
1055
+ const result = await provider.getTasks();
1056
+ const updatedTask = result.items.find((t) => t.id === active.id);
1057
+ if (updatedTask) {
1058
+ await this.taskPopoverOverlay.refreshTask({ ...updatedTask, provider: active.provider });
1059
+ }
1060
+ void this.schedulerComponent()?.refresh();
1061
+ }
1062
+ catch (error) {
1063
+ console.error('[TaskPopover] Failed to refresh popover data:', error);
1064
+ }
1065
+ }
1066
+ async openTaskDetails() {
1067
+ const task = this.taskPopoverOverlay.getActiveTask();
1068
+ if (!task) {
1069
+ return;
1070
+ }
1071
+ try {
1072
+ await this.commandService.execute('Entity:OpenDetails', {
1073
+ entity: `${RootConfig.module.name}.${RootConfig.entities.task.name}`,
1074
+ data: { id: task.id },
1075
+ });
1076
+ this.taskPopoverOverlay.close();
1077
+ }
1078
+ catch (error) {
1079
+ console.error('Failed to open task details:', error);
1080
+ }
1081
+ }
1082
+ resolveAppointmentAnchor(event) {
1083
+ let targetElement = event.nativeEvent.currentTarget || event.nativeEvent.target;
1084
+ let element = targetElement;
1085
+ const maxDepth = 10;
1086
+ let depth = 0;
1087
+ while (element && element !== document.body && depth < maxDepth) {
1088
+ depth++;
1089
+ const isAppointment = element.classList?.contains('dx-scheduler-appointment') ||
1090
+ element.classList?.contains('ax-scheduler-appointment') ||
1091
+ element.hasAttribute('data-appointment-id');
1092
+ if (isAppointment) {
1093
+ targetElement = element;
1094
+ break;
1095
+ }
1096
+ const parent = element.parentElement;
1097
+ if (parent) {
1098
+ const isParentAppointment = parent.classList?.contains('dx-scheduler-appointment') ||
1099
+ parent.classList?.contains('ax-scheduler-appointment');
1100
+ if (isParentAppointment) {
1101
+ targetElement = parent;
1102
+ break;
1103
+ }
1104
+ }
1105
+ element = element.parentElement;
1106
+ }
1107
+ return targetElement;
1108
+ }
1109
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardCalendarViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1110
+ 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 }], ngImport: i0, template: "@if (schedulerMounted()) {\n <ax-scheduler\n [hasHeader]=\"false\"\n [holidays]=\"holidays\"\n [resources]=\"resources()\"\n [dataSource]=\"dataSource()\"\n [calendar]=\"schedulerCalendar()\"\n [startingDate]=\"schedulerStartingDate()\"\n [selectedView]=\"currentSchedulerView()\"\n [multiDayViewDaysCount]=\"vm.daysCount()\"\n [showCurrentTimeIndicator]=\"true\"\n (onAppointmentDrop)=\"onTaskDrop($event)\"\n (onActionClick)=\"handleActionClick($event)\"\n (onRangeChanged)=\"handleRangeChanged($event)\"\n (onSlotDblClicked)=\"onSlotDblClicked($event)\"\n (onAppointmentClicked)=\"onTaskClickHandler($event)\"\n ></ax-scheduler>\n}\n", styles: [".task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;min-width:280px;max-width:420px;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=urgent]{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=normal]{color:rgb(var(--ax-sys-color-secondary-500))}.task-popover__icon--priority[data-priority=low]{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=urgent]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=normal]{color:rgb(var(--ax-sys-color-secondary-500))}.task-popover__priority[data-priority=low]{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 .ax-scheduler-month-appointment-chip.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler{background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));line-height:1.5}\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 }); }
1111
+ }
1112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardCalendarViewComponent, decorators: [{
1113
+ type: Component,
1114
+ args: [{ selector: 'axm-task-board-calendar-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXSchedulerComponent], template: "@if (schedulerMounted()) {\n <ax-scheduler\n [hasHeader]=\"false\"\n [holidays]=\"holidays\"\n [resources]=\"resources()\"\n [dataSource]=\"dataSource()\"\n [calendar]=\"schedulerCalendar()\"\n [startingDate]=\"schedulerStartingDate()\"\n [selectedView]=\"currentSchedulerView()\"\n [multiDayViewDaysCount]=\"vm.daysCount()\"\n [showCurrentTimeIndicator]=\"true\"\n (onAppointmentDrop)=\"onTaskDrop($event)\"\n (onActionClick)=\"handleActionClick($event)\"\n (onRangeChanged)=\"handleRangeChanged($event)\"\n (onSlotDblClicked)=\"onSlotDblClicked($event)\"\n (onAppointmentClicked)=\"onTaskClickHandler($event)\"\n ></ax-scheduler>\n}\n", styles: [".task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;min-width:280px;max-width:420px;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=urgent]{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=normal]{color:rgb(var(--ax-sys-color-secondary-500))}.task-popover__icon--priority[data-priority=low]{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=urgent]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=normal]{color:rgb(var(--ax-sys-color-secondary-500))}.task-popover__priority[data-priority=low]{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 .ax-scheduler-month-appointment-chip.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--primary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface));border-color:rgb(var(--ax-sys-color-border-primary-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--secondary{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));border-color:rgb(var(--ax-sys-color-border-secondary-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--success{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface));border-color:rgb(var(--ax-sys-color-border-success-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--warning{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface));border-color:rgb(var(--ax-sys-color-border-warning-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--danger{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface));border-color:rgb(var(--ax-sys-color-border-danger-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--accent1{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent1-surface));color:rgb(var(--ax-sys-color-on-accent1-surface));border-color:rgb(var(--ax-sys-color-border-accent1-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--accent2{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent2-surface));color:rgb(var(--ax-sys-color-on-accent2-surface));border-color:rgb(var(--ax-sys-color-border-accent2-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--accent3{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-accent3-surface));color:rgb(var(--ax-sys-color-on-accent3-surface));border-color:rgb(var(--ax-sys-color-border-accent3-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--neutral{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-month-appointment-chip.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-month-spanning-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-day-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-week-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-week-spanning-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-timeline-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-timeline-spanning-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-header-day-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-header-week-appointment.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler .ax-scheduler-agenda-appointment-time-inner.axm-task-board-surface--ghost{border-radius:.125rem;border-width:1px;border-style:solid;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}ax-scheduler{background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));line-height:1.5}\n"] }]
1115
+ }], ctorParameters: () => [], 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"] }] } });
1116
+
1117
+ class AXMTaskBoardGridViewComponent {
1118
+ constructor() {
1119
+ this.vm = inject(AXMTaskBoardViewModel);
1120
+ this.localeService = inject(AXLocaleService);
1121
+ this.calendarService = inject(AXCalendarService);
1122
+ this.taskBoardService = inject(AXPTaskBoardService);
1123
+ this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
1124
+ this.destroyRef = inject(DestroyRef);
1125
+ this.dataSource = input.required(...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
1126
+ this.refreshNonce = input(0, ...(ngDevMode ? [{ debugName: "refreshNonce" }] : /* istanbul ignore next */ []));
1127
+ this.onTaskClick = output();
1128
+ this.fetchedTasks = signal([], ...(ngDevMode ? [{ debugName: "fetchedTasks" }] : /* istanbul ignore next */ []));
1129
+ this.columns = signal([], ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
1130
+ this.grid = viewChild('grid', ...(ngDevMode ? [{ debugName: "grid" }] : /* istanbul ignore next */ []));
1131
+ this.taskRowCommandWidth = TASK_BOARD_GRID_ROW_ACTION_COLUMN_WIDTH;
1132
+ this.taskRowCommandItems = TASK_BOARD_GRID_ROW_ACTION_ITEMS;
1133
+ this.gridRemountKeys = computed(() => [this.refreshNonce()], ...(ngDevMode ? [{ debugName: "gridRemountKeys" }] : /* istanbul ignore next */ []));
1134
+ this.tasksDataSource = computed(() => {
1135
+ const parentDataSource = this.dataSource();
1136
+ void this.refreshNonce();
1137
+ return new AXDataSource({
1138
+ load: async (e) => {
1139
+ const result = await parentDataSource({ skip: e.skip, take: e.take });
1140
+ this.fetchedTasks.set(result.items);
1141
+ const mappedItems = result.items.map((task) => ({
1142
+ id: task.id,
1143
+ data: task.data,
1144
+ title: task.title,
1145
+ priority: task.priority,
1146
+ description: task.description,
1147
+ statusTitle: task.status.title,
1148
+ reporter: task.reporter.fullName ?? '-',
1149
+ assignee: task.assignee?.fullName ?? 'unassigned',
1150
+ type: this.taskBoardService.getProvider(task.provider)?.title,
1151
+ endDate: this.calendarService.format(task.endDate, 'DD/MM/YYYY HH:mm', {
1152
+ locale: this.localeService.activeProfile().calendar.system,
1153
+ }),
1154
+ startDate: this.calendarService.format(task.startDate, 'DD/MM/YYYY HH:mm', {
1155
+ locale: this.localeService.activeProfile().calendar.system,
1156
+ }),
1157
+ _originalTask: task,
1158
+ }));
1159
+ return { items: mappedItems, total: result.total };
1160
+ },
1161
+ pageSize: 10,
1162
+ key: 'id',
1163
+ byKey: async (key) => {
1164
+ return this.fetchedTasks().find((task) => task.id === key);
1165
+ },
1166
+ });
1167
+ }, ...(ngDevMode ? [{ debugName: "tasksDataSource" }] : /* istanbul ignore next */ []));
1168
+ this.#gridManualFetchEffect = effect(() => {
1169
+ this.vm.selectedTaskTypeNames();
1170
+ this.vm.selectedAssigneeIds();
1171
+ this.vm.selectedReporterIds();
1172
+ this.vm.selectedPriorities();
1173
+ this.vm.currentDate();
1174
+ this.vm.daysCount();
1175
+ this.vm.currentViewMode();
1176
+ this.refreshNonce();
1177
+ const grid = this.grid();
1178
+ if (!grid) {
1179
+ return;
1180
+ }
1181
+ queueMicrotask(() => {
1182
+ untracked(() => {
1183
+ grid.refresh({ reset: true });
1184
+ });
1185
+ });
1186
+ }, ...(ngDevMode ? [{ debugName: "#gridManualFetchEffect" }] : /* istanbul ignore next */ []));
1187
+ this.#providerChanged = effect(async () => {
1188
+ const taskType = this.vm.selectedTaskTypes()[0];
1189
+ if (!taskType) {
1190
+ this.columns.set([]);
1191
+ return;
1192
+ }
1193
+ taskType.getExtraFields().then((extraFields) => {
1194
+ if (extraFields) {
1195
+ this.columns.set(extraFields);
1196
+ }
1197
+ });
1198
+ }, ...(ngDevMode ? [{ debugName: "#providerChanged" }] : /* istanbul ignore next */ []));
1199
+ this.taskBoardService.close$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data) => {
1200
+ const active = this.taskPopoverOverlay.getActiveTask();
1201
+ if (!active?.provider) {
1202
+ return;
1203
+ }
1204
+ if (data.provider && data.provider !== active.provider) {
1205
+ return;
1206
+ }
1207
+ this.taskPopoverOverlay.close();
1208
+ });
1209
+ }
1210
+ #gridManualFetchEffect;
1211
+ #providerChanged;
1212
+ handleRowClick(event) {
1213
+ if (event.data) {
1214
+ const mappedItem = event.data;
1215
+ const originalTask = mappedItem._originalTask || this.fetchedTasks().find((task) => task.id === mappedItem.id);
1216
+ if (originalTask) {
1217
+ this.onTaskClick.emit(originalTask);
1218
+ }
1219
+ }
1220
+ }
1221
+ handleTaskCommandClick(event) {
1222
+ if (event.name !== 'view') {
1223
+ return;
1224
+ }
1225
+ event.nativeEvent?.stopPropagation();
1226
+ const mappedItem = event.data;
1227
+ const task = mappedItem._originalTask ?? this.fetchedTasks().find((t) => t.id === mappedItem.id);
1228
+ if (!task) {
1229
+ return;
1230
+ }
1231
+ const anchor = this.taskPopoverOverlay.resolveAnchorFromCommandClick(event);
1232
+ if (!anchor) {
1233
+ return;
1234
+ }
1235
+ setTimeout(() => {
1236
+ void this.taskPopoverOverlay.open({
1237
+ task,
1238
+ anchor,
1239
+ placement: 'bottom-start',
1240
+ adaptivityEnabled: false,
1241
+ autoFlip: true,
1242
+ });
1243
+ }, 0);
1244
+ }
1245
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardGridViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1246
+ 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$1.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "look", "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$1.AXDataTableTextColumnComponent, selector: "ax-text-column", inputs: ["width", "caption", "allowSorting", "allowResizing", "fixed", "hasTitle", "customExpandIcon", "customCollapseIcon", "dataField", "expandHandler", "wrapText", "cellTemplate", "footerTemplate", "headerTemplate", "format", "formatOptions"] }, { kind: "component", type: i1$1.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", "sortEnabled", "headerSortDirection", "headerSortPriority", "cellTemplate", "headerTemplate"], outputs: ["sortToggle"] }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1247
+ }
1248
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardGridViewComponent, decorators: [{
1249
+ type: Component,
1250
+ 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" }]
1251
+ }], 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 }] }] } });
1252
+
1253
+ class AXMTaskBoardKanbanViewComponent {
1254
+ constructor() {
1255
+ this.vm = inject(AXMTaskBoardViewModel);
1256
+ this.taskBoardService = inject(AXPTaskBoardService);
1257
+ this.settingService = inject(AXPSettingsService);
1258
+ this.commandService = inject(AXPCommandService);
1259
+ this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
1260
+ this.destroyRef = inject(DestroyRef);
1261
+ this.kanbanComponent = viewChild(AXKanbanComponent, ...(ngDevMode ? [{ debugName: "kanbanComponent" }] : /* istanbul ignore next */ []));
1262
+ this.tasks = model.required(...(ngDevMode ? [{ debugName: "tasks" }] : /* istanbul ignore next */ []));
1263
+ this.onTaskClick = output();
1264
+ this.onTaskChanged = output();
1265
+ this.component = output();
1266
+ this.onActionClick = output();
1267
+ this.statuses = signal([], ...(ngDevMode ? [{ debugName: "statuses" }] : /* istanbul ignore next */ []));
1268
+ this.stableTasks = computed(() => this.tasks(), { ...(ngDevMode ? { debugName: "stableTasks" } : /* istanbul ignore next */ {}), equal: isEqual });
1269
+ this.kanbanTasks = computed(() => {
1270
+ return this.stableTasks().map((task) => ({
1271
+ id: task.id,
1272
+ title: task.title,
1273
+ index: task.index,
1274
+ cssClass: task.cssClass,
1275
+ statusKey: task.status.id,
1276
+ description: task.description,
1277
+ }));
1278
+ }, ...(ngDevMode ? [{ debugName: "kanbanTasks" }] : /* istanbul ignore next */ []));
1279
+ this.#providerChanged = effect(async () => {
1280
+ const taskType = this.vm.selectedTaskTypes()[0];
1281
+ if (!taskType) {
1282
+ this.statuses.set([]);
1283
+ return;
1284
+ }
1285
+ taskType.getStatuses().then((statuses) => {
1286
+ if (statuses) {
1287
+ this.statuses.set(statuses);
1288
+ }
1289
+ });
1290
+ }, ...(ngDevMode ? [{ debugName: "#providerChanged" }] : /* istanbul ignore next */ []));
1291
+ }
1292
+ ngAfterViewInit() {
1293
+ this.taskBoardService.refresh$
1294
+ .pipe(takeUntilDestroyed(this.destroyRef))
1295
+ .subscribe(async (data) => {
1296
+ const active = this.taskPopoverOverlay.getActiveTask();
1297
+ if (!active?.provider) {
1298
+ return;
1299
+ }
1300
+ if (data.provider && data.provider !== active.provider) {
1301
+ return;
1302
+ }
1303
+ await this.refreshPopoverData();
1304
+ });
1305
+ this.taskBoardService.close$
1306
+ .pipe(takeUntilDestroyed(this.destroyRef))
1307
+ .subscribe((data) => {
1308
+ const active = this.taskPopoverOverlay.getActiveTask();
1309
+ if (!active?.provider) {
1310
+ return;
1311
+ }
1312
+ if (data.provider && data.provider !== active.provider) {
1313
+ return;
1314
+ }
1315
+ this.taskPopoverOverlay.close();
1316
+ });
1317
+ if (this.kanbanComponent()) {
1318
+ this.component.emit(this.kanbanComponent());
1319
+ }
1320
+ }
1321
+ #providerChanged;
1322
+ //#region ---- Drag & Drop Handling ----
1323
+ /**
1324
+ * Handles the onBeforeDrop event from the kanban component.
1325
+ * Uses event.wait() to register async operations that the kanban will await.
1326
+ * If action is cancelled/failed, we set event.canceled = true to prevent the drop.
1327
+ */
1328
+ onBeforeDrop(event) {
1329
+ // If no status change, allow the drop (just reordering)
1330
+ if (event.previousStatusKey === event.currentStatusKey) {
1331
+ return;
1332
+ }
1333
+ // Find the task being moved
1334
+ const task = this.stableTasks().find((t) => t.id === event.item?.id);
1335
+ if (!task || !task.provider) {
1336
+ // Allow drop if task not found or no provider
1337
+ return;
1338
+ }
1339
+ // Get the provider
1340
+ const provider = this.taskBoardService.getProvider(task.provider);
1341
+ if (!provider) {
1342
+ return;
1343
+ }
1344
+ // Register the async operation using event.wait()
1345
+ // The kanban component will await this promise before proceeding
1346
+ event.wait(this.executeDropAction(event, task, provider));
1347
+ }
1348
+ /**
1349
+ * Executes the action for a drop operation.
1350
+ * Sets event.canceled = true if action fails or is cancelled.
1351
+ * IMPORTANT: Do NOT update the task status in dataSource here - let the kanban handle the move.
1352
+ * The kanban will update the status in onSortChanged, and we'll sync with backend there.
1353
+ */
1354
+ async executeDropAction(event, task, provider) {
1355
+ if (!provider) {
1356
+ return;
1357
+ }
1358
+ try {
1359
+ // Get available actions for the task
1360
+ const actions = await provider.getActions(task);
1361
+ if (!actions || actions.length === 0) {
1362
+ // No actions available, allow the drop
1363
+ return;
1364
+ }
1365
+ // Find action that matches the new status
1366
+ const matchingAction = this.findActionForStatus(actions, event.currentStatusKey);
1367
+ if (!matchingAction || !matchingAction.command) {
1368
+ // No matching action found, allow the drop
1369
+ return;
1370
+ }
1371
+ // Execute the action and check result
1372
+ const result = await this.taskBoardService.executeCommand(matchingAction.command, task.provider);
1373
+ // Check if action was successful (not cancelled or failed)
1374
+ if (result?.success === false || result === null) {
1375
+ // Action was cancelled or failed - prevent the drop
1376
+ event.canceled = true;
1377
+ return;
1378
+ }
1379
+ // Action succeeded - allow the drop to proceed
1380
+ // The kanban will handle the visual move, and onSortChanged will sync with backend
1381
+ }
1382
+ catch (error) {
1383
+ console.error('[KanbanDrop] Failed to execute action during drop:', error);
1384
+ // On error, prevent the drop to be safe
1385
+ event.canceled = true;
1386
+ }
1387
+ }
1388
+ /**
1389
+ * Finds an action that corresponds to the target status.
1390
+ * Matches actions by name patterns (e.g., "approve" action for "approved" status).
1391
+ */
1392
+ findActionForStatus(actions, targetStatus) {
1393
+ const targetStatusStr = String(targetStatus).toLowerCase();
1394
+ // Common status-to-action mappings
1395
+ const statusActionMap = {
1396
+ approved: ['approve'],
1397
+ rejected: ['reject'],
1398
+ cancelled: ['cancel'],
1399
+ completed: ['complete', 'finish'],
1400
+ done: ['complete', 'finish'],
1401
+ inprogress: ['start', 'begin'],
1402
+ 'in-progress': ['start', 'begin'],
1403
+ blocked: ['block'],
1404
+ unblocked: ['unblock'],
1405
+ };
1406
+ // Check direct mappings first
1407
+ const possibleActionNames = statusActionMap[targetStatusStr] || [];
1408
+ for (const actionName of possibleActionNames) {
1409
+ const action = actions.find((a) => a.name?.toLowerCase().includes(actionName));
1410
+ if (action) {
1411
+ return action;
1412
+ }
1413
+ }
1414
+ // Try to find action by name containing status keywords
1415
+ const statusKeywords = targetStatusStr.split(/[-_\s]+/);
1416
+ for (const keyword of statusKeywords) {
1417
+ if (keyword.length < 3)
1418
+ continue; // Skip very short keywords
1419
+ const action = actions.find((a) => {
1420
+ const actionName = a.name?.toLowerCase() || '';
1421
+ return actionName.includes(keyword) || keyword.includes(actionName);
1422
+ });
1423
+ if (action) {
1424
+ return action;
1425
+ }
1426
+ }
1427
+ // Try exact match with action name
1428
+ const exactMatch = actions.find((a) => a.name?.toLowerCase() === targetStatusStr);
1429
+ if (exactMatch) {
1430
+ return exactMatch;
1431
+ }
1432
+ // Try partial match (status contains action name or vice versa)
1433
+ for (const action of actions) {
1434
+ const actionName = action.name?.toLowerCase() || '';
1435
+ if (targetStatusStr.includes(actionName) || actionName.includes(targetStatusStr)) {
1436
+ return action;
1437
+ }
1438
+ }
1439
+ return null;
1440
+ }
1441
+ //#endregion
1442
+ onSortChanged(event) {
1443
+ const tasks = this.tasks().map((item) => {
1444
+ const task = event.allItems.find((t) => t.id === item.id);
1445
+ if (!task) {
1446
+ return item;
1447
+ }
1448
+ const status = this.statuses().find((s) => String(s.key) === String(task.statusKey));
1449
+ if (!status) {
1450
+ return { ...item, index: task.index ?? item.index };
1451
+ }
1452
+ return {
1453
+ ...item,
1454
+ index: task.index ?? item.index,
1455
+ status: { id: status.key, title: status.title },
1456
+ };
1457
+ });
1458
+ this.taskBoardService
1459
+ .updateTasks(tasks)
1460
+ .then((updatedTasks) => {
1461
+ this.tasks.set(updatedTasks);
1462
+ })
1463
+ .catch((error) => {
1464
+ console.error('[KanbanSort] Failed to update tasks:', error);
1465
+ const provider = tasks[0]?.provider;
1466
+ if (provider) {
1467
+ this.taskBoardService.requestRefresh(provider);
1468
+ }
1469
+ });
1470
+ }
1471
+ async handleItemClick(event) {
1472
+ const task = this.stableTasks().find((task) => task.id === event.item.id);
1473
+ if (!task)
1474
+ return;
1475
+ // Find the kanban item container element
1476
+ let targetElement = event.nativeEvent.currentTarget || event.nativeEvent.target;
1477
+ // Traverse up to find the kanban item container
1478
+ let element = targetElement;
1479
+ const maxDepth = 10;
1480
+ let depth = 0;
1481
+ while (element && element !== document.body && depth < maxDepth) {
1482
+ depth++;
1483
+ const isKanbanItem = element.classList?.contains('dx-kanban-item') ||
1484
+ element.classList?.contains('ax-kanban-item') ||
1485
+ element.hasAttribute('data-item-id');
1486
+ if (isKanbanItem) {
1487
+ targetElement = element;
1488
+ break;
1489
+ }
1490
+ element = element.parentElement;
1491
+ }
1492
+ if (targetElement) {
1493
+ await this.taskPopoverOverlay.open({
1494
+ task,
1495
+ anchor: targetElement,
1496
+ offsetX: 12,
1497
+ offsetY: 12,
1498
+ adaptivityEnabled: true,
1499
+ });
1500
+ }
1501
+ this.onTaskClick.emit(task);
1502
+ }
1503
+ handleActionClick(event) {
1504
+ const task = this.stableTasks().find((task) => task.id === event.item.id);
1505
+ if (task) {
1506
+ this.onActionClick.emit({ nativeEvent: event.nativeEvent, task: task });
1507
+ }
1508
+ }
1509
+ async refreshPopoverData() {
1510
+ const active = this.taskPopoverOverlay.getActiveTask();
1511
+ if (!active?.provider) {
1512
+ return;
1513
+ }
1514
+ const provider = this.taskBoardService.getProvider(active.provider);
1515
+ if (!provider) {
1516
+ return;
1517
+ }
1518
+ try {
1519
+ const result = await provider.getTasks();
1520
+ const updatedTasks = result.items.map((t) => ({ ...t, provider: active.provider }));
1521
+ const updatedMap = new Map(updatedTasks.map((t) => [t.id, t]));
1522
+ const currentTasks = this.tasks();
1523
+ const mergedTasks = currentTasks.map((t) => updatedMap.get(t.id) ?? t);
1524
+ const existingIds = new Set(currentTasks.map((t) => t.id));
1525
+ const newTasks = updatedTasks.filter((t) => !existingIds.has(t.id));
1526
+ this.tasks.set([...mergedTasks, ...newTasks]);
1527
+ const updatedSelectedTask = updatedMap.get(active.id);
1528
+ if (updatedSelectedTask) {
1529
+ await this.taskPopoverOverlay.refreshTask({ ...updatedSelectedTask, provider: active.provider });
1530
+ }
1531
+ }
1532
+ catch (error) {
1533
+ console.error('[TaskPopover] Failed to refresh popover data:', error);
1534
+ }
1535
+ }
1536
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardKanbanViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1537
+ 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;min-width:280px;max-width:420px;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=urgent]{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=normal]{color:rgb(var(--ax-sys-color-secondary-500))}.task-popover__icon--priority[data-priority=low]{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=urgent]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=normal]{color:rgb(var(--ax-sys-color-secondary-500))}.task-popover__priority[data-priority=low]{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-kanban-item.axm-task-board-surface--primary{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-primary-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--secondary{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-secondary-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--success{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-success-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--warning{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-warning-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--danger{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-danger-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--accent1{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-accent1-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--accent2{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-accent2-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--accent3{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-accent3-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--neutral{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-lighter-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--ghost{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-lighter-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban{--ax-comp-kanban-status-min-height: 100%;--ax-comp-kanban-status-min-width: 25rem;height:100%;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));line-height:1.5}\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 }); }
1538
+ }
1539
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardKanbanViewComponent, decorators: [{
1540
+ type: Component,
1541
+ 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;min-width:280px;max-width:420px;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=urgent]{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=normal]{color:rgb(var(--ax-sys-color-secondary-500))}.task-popover__icon--priority[data-priority=low]{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=urgent]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=normal]{color:rgb(var(--ax-sys-color-secondary-500))}.task-popover__priority[data-priority=low]{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-kanban-item.axm-task-board-surface--primary{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-primary-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--secondary{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-secondary-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--success{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-success-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--warning{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-warning-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--danger{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-danger-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--accent1{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-accent1-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--accent2{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-accent2-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--accent3{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-accent3-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--neutral{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-lighter-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban .ax-kanban-item.axm-task-board-surface--ghost{border-width:1px;border-inline-start-width:3px;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-inline-start-color:rgba(var(--ax-sys-color-border-lighter-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}ax-kanban{--ax-comp-kanban-status-min-height: 100%;--ax-comp-kanban-status-min-width: 25rem;height:100%;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));line-height:1.5}\n"] }]
1542
+ }], 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"] }] } });
1543
+
1544
+ function statusGroupTrackKey(nonce, group) {
1545
+ return `${nonce}:${String(group.statusInfo.key)}`;
1546
+ }
1547
+ function taskMatchesStatus(task, status) {
1548
+ return String(task.status.id) === String(status.key);
1549
+ }
1550
+ class AXMTaskBoardStatusGroupedGridViewComponent {
1551
+ constructor() {
1552
+ this.vm = inject(AXMTaskBoardViewModel);
1553
+ this.localeService = inject(AXLocaleService);
1554
+ this.calendarService = inject(AXCalendarService);
1555
+ this.taskBoardService = inject(AXPTaskBoardService);
1556
+ this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
1557
+ this.destroyRef = inject(DestroyRef);
1558
+ this.provider = input(...(ngDevMode ? [undefined, { debugName: "provider" }] : /* istanbul ignore next */ []));
1559
+ this.dataSource = input.required(...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
1560
+ this.refreshNonce = input(0, ...(ngDevMode ? [{ debugName: "refreshNonce" }] : /* istanbul ignore next */ []));
1561
+ this.onTaskClick = output();
1562
+ this.groupedTasks = signal([], ...(ngDevMode ? [{ debugName: "groupedTasks" }] : /* istanbul ignore next */ []));
1563
+ this.allFetchedTasks = signal([], ...(ngDevMode ? [{ debugName: "allFetchedTasks" }] : /* istanbul ignore next */ []));
1564
+ this.columns = signal([], ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
1565
+ this.statuses = signal([], ...(ngDevMode ? [{ debugName: "statuses" }] : /* istanbul ignore next */ []));
1566
+ this.grids = viewChildren('grid', ...(ngDevMode ? [{ debugName: "grids" }] : /* istanbul ignore next */ []));
1567
+ this.taskRowCommandWidth = TASK_BOARD_GRID_ROW_ACTION_COLUMN_WIDTH;
1568
+ this.taskRowCommandItems = TASK_BOARD_GRID_ROW_ACTION_ITEMS;
1569
+ this.trackStatusGroup = (_index, group) => statusGroupTrackKey(this.refreshNonce(), group);
1570
+ this.groupedViewRemountKeys = computed(() => [this.refreshNonce()], ...(ngDevMode ? [{ debugName: "groupedViewRemountKeys" }] : /* istanbul ignore next */ []));
1571
+ this.#dataChanged = effect(() => {
1572
+ this.vm.selectedTaskTypeNames();
1573
+ this.vm.selectedAssigneeIds();
1574
+ this.vm.selectedReporterIds();
1575
+ this.vm.selectedPriorities();
1576
+ this.vm.currentDate();
1577
+ this.vm.daysCount();
1578
+ this.vm.currentViewMode();
1579
+ this.refreshNonce();
1580
+ const allStatuses = this.statuses();
1581
+ const parentDataSource = this.dataSource();
1582
+ if (!parentDataSource || allStatuses.length === 0) {
1583
+ this.groupedTasks.set([]);
1584
+ this.allFetchedTasks.set([]);
1585
+ return;
1586
+ }
1587
+ void parentDataSource().then((result) => {
1588
+ this.allFetchedTasks.set(result.items);
1589
+ const allTasks = result.items;
1590
+ const statusGroups = allStatuses.map((status) => {
1591
+ const tasksForStatus = allTasks.filter((task) => taskMatchesStatus(task, status));
1592
+ return {
1593
+ statusInfo: status,
1594
+ tasks: this.createTaskDataSourceForGroup(tasksForStatus),
1595
+ };
1596
+ });
1597
+ this.groupedTasks.set(statusGroups);
1598
+ untracked(() => {
1599
+ setTimeout(() => {
1600
+ this.groupedTasks()?.forEach((group) => {
1601
+ group.tasks.refresh();
1602
+ });
1603
+ this.grids().forEach((grid) => {
1604
+ grid.refresh({ reset: true });
1605
+ });
1606
+ }, 0);
1607
+ });
1608
+ });
1609
+ }, ...(ngDevMode ? [{ debugName: "#dataChanged" }] : /* istanbul ignore next */ []));
1610
+ this.#providerChanged = effect(async () => {
1611
+ const provider = this.vm.selectedTaskTypes()[0];
1612
+ provider?.getExtraFields().then((extraFields) => {
1613
+ if (extraFields) {
1614
+ this.columns.set(extraFields);
1615
+ }
1616
+ });
1617
+ provider?.getStatuses().then((statuses) => {
1618
+ if (statuses) {
1619
+ this.statuses.set(statuses);
1620
+ }
1621
+ });
1622
+ }, ...(ngDevMode ? [{ debugName: "#providerChanged" }] : /* istanbul ignore next */ []));
1623
+ this.#gridsChanged = effect(() => {
1624
+ const groups = this.groupedTasks();
1625
+ untracked(() => {
1626
+ setTimeout(() => {
1627
+ this.grids().forEach((grid) => {
1628
+ grid.refresh({ reset: true });
1629
+ });
1630
+ }, 100);
1631
+ });
1632
+ }, ...(ngDevMode ? [{ debugName: "#gridsChanged" }] : /* istanbul ignore next */ []));
1633
+ afterNextRender(() => {
1634
+ untracked(() => {
1635
+ setTimeout(() => {
1636
+ this.groupedTasks()?.forEach((group) => {
1637
+ group.tasks.refresh();
1638
+ });
1639
+ this.grids().forEach((grid) => {
1640
+ grid.refresh({ reset: true });
1641
+ });
1642
+ }, 200);
1643
+ });
1644
+ });
1645
+ this.taskBoardService.close$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data) => {
1646
+ const active = this.taskPopoverOverlay.getActiveTask();
1647
+ if (!active?.provider) {
1648
+ return;
1649
+ }
1650
+ if (data.provider && data.provider !== active.provider) {
1651
+ return;
1652
+ }
1653
+ this.taskPopoverOverlay.close();
1654
+ });
1655
+ }
1656
+ #dataChanged;
1657
+ #providerChanged;
1658
+ #gridsChanged;
1659
+ createTaskDataSourceForGroup(tasks) {
1660
+ return new AXDataSource({
1661
+ load: async (e) => {
1662
+ const items = tasks.map((task) => ({
1663
+ id: task.id,
1664
+ data: task.data,
1665
+ title: task.title,
1666
+ priority: task.priority,
1667
+ description: task.description,
1668
+ reporter: task.reporter.fullName ?? '-',
1669
+ assignee: task.assignee?.fullName ?? 'unassigned',
1670
+ endDate: this.calendarService.format(task.endDate, 'DD/MM/YYYY HH:mm', {
1671
+ locale: this.localeService.activeProfile().calendar.system,
1672
+ }),
1673
+ startDate: this.calendarService.format(task.startDate, 'DD/MM/YYYY HH:mm', {
1674
+ locale: this.localeService.activeProfile().calendar.system,
1675
+ }),
1676
+ _originalTask: task,
1677
+ }));
1678
+ return {
1679
+ items: items.slice(e.skip, e.skip + e.take),
1680
+ total: items.length,
1681
+ };
1682
+ },
1683
+ pageSize: 5,
1684
+ key: 'id',
1685
+ byKey: async (key) => {
1686
+ return tasks.find((task) => task.id === key);
1687
+ },
1688
+ });
1689
+ }
1690
+ handleRowClick(event) {
1691
+ if (!event.data) {
1692
+ return;
1693
+ }
1694
+ const mappedItem = event.data;
1695
+ const originalTask = mappedItem._originalTask ?? this.allFetchedTasks().find((task) => task.id === mappedItem.id);
1696
+ if (originalTask) {
1697
+ this.onTaskClick.emit(originalTask);
1698
+ }
1699
+ }
1700
+ handleTaskCommandClick(event) {
1701
+ if (event.name !== 'view') {
1702
+ return;
1703
+ }
1704
+ event.nativeEvent?.stopPropagation();
1705
+ const mappedItem = event.data;
1706
+ const task = mappedItem._originalTask ?? this.allFetchedTasks().find((t) => t.id === mappedItem.id);
1707
+ if (!task) {
1708
+ return;
1709
+ }
1710
+ const anchor = this.taskPopoverOverlay.resolveAnchorFromCommandClick(event);
1711
+ if (!anchor) {
1712
+ return;
1713
+ }
1714
+ setTimeout(() => {
1715
+ void this.taskPopoverOverlay.open({
1716
+ task,
1717
+ anchor,
1718
+ placement: 'bottom-start',
1719
+ adaptivityEnabled: false,
1720
+ autoFlip: true,
1721
+ });
1722
+ }, 0);
1723
+ }
1724
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardStatusGroupedGridViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1725
+ 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$1.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "look", "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$1.AXDataTableTextColumnComponent, selector: "ax-text-column", inputs: ["width", "caption", "allowSorting", "allowResizing", "fixed", "hasTitle", "customExpandIcon", "customCollapseIcon", "dataField", "expandHandler", "wrapText", "cellTemplate", "footerTemplate", "headerTemplate", "format", "formatOptions"] }, { kind: "component", type: i1$1.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 }); }
1726
+ }
1727
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardStatusGroupedGridViewComponent, decorators: [{
1728
+ type: Component,
1729
+ 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" }]
1730
+ }], 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 }] }] } });
1731
+
1732
+ class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
1733
+ constructor() {
1734
+ super(...arguments);
1735
+ this.router = inject(Router);
1736
+ this.rootConfig = RootConfig;
1737
+ this.deviceService = inject(AXPDeviceService);
1738
+ this.vm = inject(AXMTaskBoardViewModel);
1739
+ this.unsubscribe = inject(AXUnsubscriber);
1740
+ this.activatedRoute = inject(ActivatedRoute);
1741
+ this.localeService = inject(AXLocaleService);
1742
+ this.calendarService = inject(AXCalendarService);
1743
+ this.taskBoardService = inject(AXPTaskBoardService);
1744
+ this.shortcutRegistry = inject(AXPKeyboardShortcutRegistry);
1745
+ this.destroyRef = inject(DestroyRef);
1746
+ this.dueStatusProviderService = inject(AXPDueStatusProviderService);
1747
+ this.dataSourceDefinitionService = inject(AXPDataSourceDefinitionProviderService);
1748
+ this.translationService = inject(AXTranslationService);
1749
+ this.sessionUser = toSignal(this.sessionService.user$, { initialValue: null });
1750
+ this.sessionPermissions = toSignal(this.sessionService.permissions$, { initialValue: [] });
1751
+ this.activeCalendar = toSignal(this.calendarService.calendarChanges$, {
1752
+ initialValue: this.calendarService.getActiveCalendar(),
1753
+ });
1754
+ this.profileChanged = toSignal(this.localeService.profileChanged$, {
1755
+ initialValue: this.localeService.activeProfile(),
1756
+ });
1757
+ this.navigatorTimeTextVersion = 0;
1758
+ this.colorByItems = [
1759
+ { key: 'dueDate', titleKey: '@task-management:task-board.color-by.due-date' },
1760
+ { key: 'priority', titleKey: '@task-management:task-board.color-by.priority' },
1761
+ { key: 'status', titleKey: '@task-management:task-board.color-by.status' },
1762
+ ];
1763
+ this.popover = viewChild('popover', ...(ngDevMode ? [{ debugName: "popover" }] : /* istanbul ignore next */ []));
1764
+ this.calendar = viewChild('calendar', ...(ngDevMode ? [{ debugName: "calendar" }] : /* istanbul ignore next */ []));
1765
+ this.isReady = signal(false, ...(ngDevMode ? [{ debugName: "isReady" }] : /* istanbul ignore next */ []));
1766
+ this.isSettingsPanelOpen = signal(false, ...(ngDevMode ? [{ debugName: "isSettingsPanelOpen" }] : /* istanbul ignore next */ []));
1767
+ this.settingsPanelCopy = signal({
1768
+ title: '',
1769
+ colorBy: '',
1770
+ calendars: '',
1771
+ }, ...(ngDevMode ? [{ debugName: "settingsPanelCopy" }] : /* istanbul ignore next */ []));
1772
+ this.filtersReady = signal(false, ...(ngDevMode ? [{ debugName: "filtersReady" }] : /* istanbul ignore next */ []));
1773
+ this.calendarEventTypes = signal([], ...(ngDevMode ? [{ debugName: "calendarEventTypes" }] : /* istanbul ignore next */ []));
1774
+ this.resources = signal([], ...(ngDevMode ? [{ debugName: "resources" }] : /* istanbul ignore next */ []));
1775
+ this.isQueryParam = signal(false, ...(ngDevMode ? [{ debugName: "isQueryParam" }] : /* istanbul ignore next */ []));
1776
+ this.refreshNonce = signal(0, ...(ngDevMode ? [{ debugName: "refreshNonce" }] : /* istanbul ignore next */ []));
1777
+ this.navigatorTimeText = signal('', ...(ngDevMode ? [{ debugName: "navigatorTimeText" }] : /* istanbul ignore next */ []));
1778
+ this.panelInitialFilters = signal([], ...(ngDevMode ? [{ debugName: "panelInitialFilters" }] : /* istanbul ignore next */ []));
1779
+ this.currentTask = signal(null, ...(ngDevMode ? [{ debugName: "currentTask" }] : /* istanbul ignore next */ []));
1780
+ this.schedulerComponent = signal(null, ...(ngDevMode ? [{ debugName: "schedulerComponent" }] : /* istanbul ignore next */ []));
1781
+ this.kanbanLoadVersion = 0;
1782
+ this.filtersPanelInitialized = false;
1783
+ this.lastLocaleProfileCode = null;
1784
+ /** Ctrl enables range selection in kanban/table navigator popover calendars. */
1785
+ this.navigatorRangeSelectActive = signal(false, ...(ngDevMode ? [{ debugName: "navigatorRangeSelectActive" }] : /* istanbul ignore next */ []));
1786
+ /** True after a plain (non-Ctrl) single-day click in the navigator calendar. */
1787
+ this.navigatorPlainSingleDaySelected = false;
1788
+ this.modifierRangeBasedViews = ['grid', 'kanban', 'status-grouped-grid'];
1789
+ this.alwaysRangeBasedViews = ['agenda', 'timeline-weekly'];
1790
+ this.dayDataCache = signal(new Map(), ...(ngDevMode ? [{ debugName: "dayDataCache" }] : /* istanbul ignore next */ []));
1791
+ this.showToolbarNavigator = computed(() => usesTaskBoardToolbarNavigator(this.vm.currentViewMode()), ...(ngDevMode ? [{ debugName: "showToolbarNavigator" }] : /* istanbul ignore next */ []));
1792
+ this.showViewLayoutSwitcher = computed(() => getTaskBoardLayoutOptions(this.vm.currentViewCategory()).length > 0, ...(ngDevMode ? [{ debugName: "showViewLayoutSwitcher" }] : /* istanbul ignore next */ []));
1793
+ this.viewLayoutItems = computed(() => getTaskBoardLayoutOptions(this.vm.currentViewCategory()), ...(ngDevMode ? [{ debugName: "viewLayoutItems" }] : /* istanbul ignore next */ []));
1794
+ this.selectedViewLayout = computed(() => this.vm.getLayoutForCategory(this.vm.currentViewCategory()), ...(ngDevMode ? [{ debugName: "selectedViewLayout" }] : /* istanbul ignore next */ []));
1795
+ this.selectedViewLayoutTitleKey = computed(() => {
1796
+ const selectedLayout = this.selectedViewLayout();
1797
+ const item = this.viewLayoutItems().find((option) => option.key === selectedLayout);
1798
+ return item ? this.viewLayoutTranslationKey(item.text) : '';
1799
+ }, ...(ngDevMode ? [{ debugName: "selectedViewLayoutTitleKey" }] : /* istanbul ignore next */ []));
1800
+ this.selectedViewLayoutIcon = computed(() => {
1801
+ const selectedLayout = this.selectedViewLayout();
1802
+ const item = this.viewLayoutItems().find((option) => option.key === selectedLayout);
1803
+ return item?.icon ?? 'fa-light fa-sliders';
1804
+ }, ...(ngDevMode ? [{ debugName: "selectedViewLayoutIcon" }] : /* istanbul ignore next */ []));
1805
+ this.effectiveColorBy = computed(() => this.vm.effectiveColorBy(), ...(ngDevMode ? [{ debugName: "effectiveColorBy" }] : /* istanbul ignore next */ []));
1806
+ this.settingsPanelHeader = computed(() => ({
1807
+ primaryTitle: this.settingsPanelCopy().title,
1808
+ icon: {
1809
+ iconClass: 'fa-fw fa-lg fa-light fa-gear',
1810
+ },
1811
+ }), ...(ngDevMode ? [{ debugName: "settingsPanelHeader" }] : /* istanbul ignore next */ []));
1812
+ this.settingsPanelSections = computed(() => {
1813
+ const copy = this.settingsPanelCopy();
1814
+ const sections = [
1815
+ { title: copy.colorBy, projectionKey: 'colorBy' },
1816
+ ];
1817
+ if (this.showCalendarEventButton()) {
1818
+ sections.push({ title: copy.calendars, projectionKey: 'calendars' });
1819
+ }
1820
+ return sections;
1821
+ }, ...(ngDevMode ? [{ debugName: "settingsPanelSections" }] : /* istanbul ignore next */ []));
1822
+ this.settingsPanelI18nEffect = effect(() => {
1823
+ this.localeService.activeProfile().localeInfo?.code;
1824
+ void this.loadSettingsPanelCopy();
1825
+ }, ...(ngDevMode ? [{ debugName: "settingsPanelI18nEffect" }] : /* istanbul ignore next */ []));
1826
+ /** Resolves navigator date label asynchronously so month names react to locale/profile changes. */
1827
+ this.navigatorTimeTextEffect = effect(() => {
1828
+ this.profileChanged();
1829
+ this.vm.currentDate();
1830
+ this.vm.currentViewMode();
1831
+ this.vm.daysCount();
1832
+ this.localeService.activeProfile().localeInfo?.code;
1833
+ this.calendarType();
1834
+ this.refreshNonce();
1835
+ const version = ++this.navigatorTimeTextVersion;
1836
+ untracked(() => {
1837
+ void this.resolveNavigatorTimeText().then((text) => {
1838
+ if (version === this.navigatorTimeTextVersion) {
1839
+ this.navigatorTimeText.set(text);
1840
+ }
1841
+ });
1842
+ });
1843
+ }, ...(ngDevMode ? [{ debugName: "navigatorTimeTextEffect" }] : /* istanbul ignore next */ []));
1844
+ /** Re-render navigator calendar when regional week layout changes. */
1845
+ this.navigatorCalendarLayoutEffect = effect(() => {
1846
+ this.localeService.activeProfile().localeInfo?.code;
1847
+ this.calendarService.getActiveCalendar()?.weekdays;
1848
+ this.calendarType();
1849
+ untracked(() => {
1850
+ queueMicrotask(() => {
1851
+ this.calendar()?.render();
1852
+ });
1853
+ });
1854
+ }, ...(ngDevMode ? [{ debugName: "navigatorCalendarLayoutEffect" }] : /* istanbul ignore next */ []));
1855
+ this.canFilterByAllAssignees = computed(() => {
1856
+ this.sessionUser();
1857
+ this.sessionPermissions();
1858
+ return canViewAllTaskAssignees(this.sessionService);
1859
+ }, ...(ngDevMode ? [{ debugName: "canFilterByAllAssignees" }] : /* istanbul ignore next */ []));
1860
+ this.calendarEventTypeItems = computed(() => this.calendarEventTypes().map((eventType) => ({
1861
+ id: eventType.id,
1862
+ text: eventType.title,
1863
+ icon: eventType.icon,
1864
+ })), ...(ngDevMode ? [{ debugName: "calendarEventTypeItems" }] : /* istanbul ignore next */ []));
1865
+ this.showCalendarEventButton = computed(() => !this.isNonCalendarView() && this.calendarEventTypeItems().length > 0, ...(ngDevMode ? [{ debugName: "showCalendarEventButton" }] : /* istanbul ignore next */ []));
1866
+ this.selectedCalendarEventTypeCount = computed(() => this.vm.selectedCalendarEventTypeIds().length, ...(ngDevMode ? [{ debugName: "selectedCalendarEventTypeCount" }] : /* istanbul ignore next */ []));
1867
+ this.filterDefinitions = computed(() => {
1868
+ const canFilterByAll = this.canFilterByAllAssignees();
1869
+ const assigneeScopeKey = `${this.sessionUser()?.id ?? ''}:${canFilterByAll}`;
1870
+ const isMultiTaskType = this.isMultiSelectTaskTypeEnabled();
1871
+ return [
1872
+ {
1873
+ field: 'type',
1874
+ operator: { type: 'equal' },
1875
+ title: '@task-management:task-board.filter.task-type',
1876
+ icon: 'fa-light fa-list',
1877
+ widget: {
1878
+ type: 'select-filter',
1879
+ options: {
1880
+ dataSource: 'task-types',
1881
+ valueField: 'name',
1882
+ textField: 'title',
1883
+ multiple: isMultiTaskType,
1884
+ allowClear: isMultiTaskType,
1885
+ },
1886
+ },
1887
+ filterType: { advance: true, inline: false },
1888
+ },
1889
+ {
1890
+ field: 'assignee',
1891
+ operator: { type: 'equal' },
1892
+ title: '@task-management:task-board.filter.assignee',
1893
+ icon: 'fa-light fa-user',
1894
+ widget: {
1895
+ type: 'select-filter',
1896
+ options: {
1897
+ multiple: true,
1898
+ valueField: 'id',
1899
+ textField: 'displayName',
1900
+ allowSearch: canFilterByAll,
1901
+ allowClear: canFilterByAll,
1902
+ readonly: !canFilterByAll,
1903
+ dataSource: 'task-board-assignees',
1904
+ assigneeScopeKey,
1905
+ },
1906
+ },
1907
+ filterType: { advance: true, inline: false },
1908
+ },
1909
+ {
1910
+ field: 'reporter',
1911
+ operator: { type: 'equal' },
1912
+ title: '@task-management:task-board.filter.reporter',
1913
+ icon: 'fa-light fa-user-pen',
1914
+ widget: {
1915
+ type: 'select-filter',
1916
+ options: {
1917
+ multiple: true,
1918
+ valueField: 'id',
1919
+ textField: 'displayName',
1920
+ allowSearch: true,
1921
+ dataSource: 'users',
1922
+ },
1923
+ },
1924
+ filterType: { advance: true, inline: false },
1925
+ },
1926
+ {
1927
+ field: 'priority',
1928
+ operator: { type: 'equal' },
1929
+ title: '@task-management:task-board.filter.priority',
1930
+ icon: 'fa-light fa-flag',
1931
+ widget: {
1932
+ type: 'select-filter',
1933
+ options: {
1934
+ multiple: true,
1935
+ valueField: 'name',
1936
+ textField: 'title',
1937
+ dataSource: AXMTaskBoardPage.PRIORITY_OPTIONS,
1938
+ },
1939
+ },
1940
+ filterType: { advance: true, inline: false },
1941
+ },
1942
+ {
1943
+ field: 'dueStatus',
1944
+ operator: { type: 'equal' },
1945
+ title: '@task-management:task-board.filter.due-status',
1946
+ icon: 'fa-light fa-calendar-clock',
1947
+ widget: {
1948
+ type: 'select-filter',
1949
+ options: {
1950
+ multiple: true,
1951
+ valueField: 'name',
1952
+ textField: 'title',
1953
+ dataSource: AXMTaskBoardPage.DUE_STATUS_OPTIONS,
1954
+ },
1955
+ },
1956
+ filterType: { advance: true, inline: false },
1957
+ },
1958
+ ];
1959
+ }, ...(ngDevMode ? [{ debugName: "filterDefinitions" }] : /* istanbul ignore next */ []));
1960
+ /** Re-scope assignee filter when user or permissions change. */
1961
+ this.assigneeScopeEffect = effect(() => {
1962
+ this.sessionUser();
1963
+ this.sessionPermissions();
1964
+ if (this.vm.isLoading()) {
1965
+ return;
1966
+ }
1967
+ const resolvedAssigneeIds = this.vm.assigneeFilterHasSavedPreference()
1968
+ ? this.vm.selectedAssigneeIds()
1969
+ : resolveTaskBoardSavedAssigneeIds(this.sessionService, null);
1970
+ const scopedIds = normalizeTaskBoardAssigneeIds(this.sessionService, resolvedAssigneeIds);
1971
+ const assigneeIdsChanged = !isEqual(sortBy(this.vm.selectedAssigneeIds()), sortBy(scopedIds));
1972
+ if (assigneeIdsChanged) {
1973
+ this.vm.setSelectedAssigneeIds(scopedIds, this.isQueryParam(), false);
1974
+ }
1975
+ if (this.filtersPanelInitialized && assigneeIdsChanged) {
1976
+ untracked(() => void this.syncPanelInitialFilters());
1977
+ }
1978
+ }, ...(ngDevMode ? [{ debugName: "assigneeScopeEffect" }] : /* istanbul ignore next */ []));
1979
+ this.calendarType = computed(() => this.activeCalendar()?.name() ?? this.localeService.activeProfile().calendar.system, ...(ngDevMode ? [{ debugName: "calendarType" }] : /* istanbul ignore next */ []));
1980
+ this.todayButtonTextKey = computed(() => {
1981
+ switch (this.vm.currentViewMode()) {
1982
+ case 'week':
1983
+ return '@task-management:task-board.navigator.current-week';
1984
+ case 'month':
1985
+ case 'timeline-month':
1986
+ return '@task-management:task-board.navigator.current-month';
1987
+ case 'timeline-year':
1988
+ return '@task-management:task-board.navigator.current-year';
1989
+ default:
1990
+ return '@task-management:task-board.navigator.today';
1991
+ }
1992
+ }, ...(ngDevMode ? [{ debugName: "todayButtonTextKey" }] : /* istanbul ignore next */ []));
1993
+ this.calendarDepth = computed(() => {
1994
+ if (this.vm.currentViewMode() === 'grid' ||
1995
+ this.vm.currentViewMode() === 'kanban' ||
1996
+ this.vm.currentViewMode() === 'status-grouped-grid') {
1997
+ return 'day';
1998
+ }
1999
+ return this.schedulerComponent()?.calendarDepth() || 'day';
2000
+ }, ...(ngDevMode ? [{ debugName: "calendarDepth" }] : /* istanbul ignore next */ []));
2001
+ this.currentDateForCalendar = computed(() => {
2002
+ const pendingRangeStart = this.vm.rangeStartDate();
2003
+ if (pendingRangeStart && this.isModifierRangeNavigatorView()) {
2004
+ return pendingRangeStart;
2005
+ }
2006
+ const date = this.vm.currentDate();
2007
+ return date || new Date();
2008
+ }, ...(ngDevMode ? [{ debugName: "currentDateForCalendar" }] : /* istanbul ignore next */ []));
2009
+ this.filter = computed(() => {
2010
+ const taskTypeNames = this.vm.selectedTaskTypeNames();
2011
+ const assigneeIds = this.vm.selectedAssigneeIds();
2012
+ const reporterIds = this.vm.selectedReporterIds();
2013
+ const priorities = this.vm.selectedPriorities();
2014
+ const dueStatusKeys = this.vm.selectedDueStatusKeys();
2015
+ const currentDate = this.vm.currentDate() || new Date();
2016
+ let from = this.calendarService.create(currentDate, this.localeService.activeProfile().calendar.system);
2017
+ let end;
2018
+ const currentView = this.vm.currentViewMode();
2019
+ if (currentView === 'grid' ||
2020
+ currentView === 'kanban' ||
2021
+ currentView === 'agenda' ||
2022
+ currentView === 'timeline-weekly' ||
2023
+ currentView === 'status-grouped-grid') {
2024
+ end = from.add('day', this.vm.daysCount() - 1);
2025
+ }
2026
+ else if (currentView === 'month' || currentView === 'timeline-month') {
2027
+ from = from.startOf('month');
2028
+ end = from.endOf('month');
2029
+ }
2030
+ else {
2031
+ end = from.endOf('day');
2032
+ }
2033
+ return {
2034
+ // Empty filter means "all items" for task type/provider.
2035
+ ...(taskTypeNames.length > 0 && { types: taskTypeNames }),
2036
+ ...(assigneeIds.length > 0 && { assigneeIds }),
2037
+ ...(reporterIds.length > 0 && { reporterIds }),
2038
+ ...(priorities.length > 0 && { priorities }),
2039
+ ...(dueStatusKeys.length > 0 && { dueStatusKeys }),
2040
+ range: { from: from.date, end: end.date },
2041
+ };
2042
+ }, ...(ngDevMode ? [{ debugName: "filter" }] : /* istanbul ignore next */ []));
2043
+ this.contextMenu = viewChild('rootContextMenu', ...(ngDevMode ? [{ debugName: "contextMenu" }] : /* istanbul ignore next */ []));
2044
+ this.schedulerDataSource = (schedulerFilter) => {
2045
+ const pageFilter = this.filter();
2046
+ const visibleRange = schedulerFilter?.range ?? pageFilter.range;
2047
+ const finalFilter = {
2048
+ ...pageFilter,
2049
+ ...schedulerFilter,
2050
+ range: visibleRange,
2051
+ };
2052
+ return this.taskBoardService.getTasks(finalFilter).then(async (result) => {
2053
+ const items = await this.enrichTasksForViews(filterTasksOverlappingRange(result.items, visibleRange));
2054
+ this.validateSelectedTask(items);
2055
+ return items;
2056
+ });
2057
+ };
2058
+ this.gridDataSource = (filter) => {
2059
+ const finalFilter = { ...this.filter(), ...filter };
2060
+ return this.taskBoardService.getTasks(finalFilter).then(async (result) => {
2061
+ const items = await this.enrichTasksForViews(result.items);
2062
+ this.validateSelectedTask(items);
2063
+ return { items, total: result.total };
2064
+ });
2065
+ };
2066
+ this.resolvedTasks = signal([], ...(ngDevMode ? [{ debugName: "resolvedTasks" }] : /* istanbul ignore next */ []));
2067
+ /** Loads kanban tasks when filters or date range change; ignores stale async results. */
2068
+ this.kanbanDataEffect = effect(() => {
2069
+ if (this.vm.currentViewMode() !== 'kanban') {
2070
+ return;
2071
+ }
2072
+ this.vm.selectedTaskTypeNames();
2073
+ this.vm.selectedAssigneeIds();
2074
+ this.vm.selectedReporterIds();
2075
+ this.vm.selectedPriorities();
2076
+ this.vm.selectedDueStatusKeys();
2077
+ this.vm.effectiveColorBy();
2078
+ this.vm.currentDate();
2079
+ this.vm.daysCount();
2080
+ this.localeService.activeProfile().localeInfo?.code;
2081
+ this.refreshNonce();
2082
+ const filter = this.filter();
2083
+ const version = ++this.kanbanLoadVersion;
2084
+ void this.taskBoardService.getTasks(filter).then(async (result) => {
2085
+ if (version !== this.kanbanLoadVersion) {
2086
+ return;
2087
+ }
2088
+ this.validateSelectedTask(result.items);
2089
+ this.resolvedTasks.set(await this.enrichTasksForViews(result.items));
2090
+ });
2091
+ }, ...(ngDevMode ? [{ debugName: "kanbanDataEffect" }] : /* istanbul ignore next */ []));
2092
+ /** Keeps scheduler in sync when toolbar date/view changes outside the scheduler UI. */
2093
+ this.schedulerNavigationEffect = effect(() => {
2094
+ const viewMode = this.vm.currentViewMode();
2095
+ const calendarViews = [
2096
+ 'day',
2097
+ 'week',
2098
+ 'month',
2099
+ 'agenda',
2100
+ 'timeline-day',
2101
+ 'timeline-weekly',
2102
+ 'timeline-month',
2103
+ 'timeline-year',
2104
+ ];
2105
+ if (!calendarViews.includes(viewMode)) {
2106
+ return;
2107
+ }
2108
+ this.vm.currentDate();
2109
+ this.vm.currentViewMode();
2110
+ this.vm.daysCount();
2111
+ this.refreshNonce();
2112
+ queueMicrotask(() => {
2113
+ this.schedulerComponent()?.refresh();
2114
+ });
2115
+ }, ...(ngDevMode ? [{ debugName: "schedulerNavigationEffect" }] : /* istanbul ignore next */ []));
2116
+ /** Re-normalizes filter keys when locale/profile changes (titles must not drive filtering). */
2117
+ this.localeFilterRefreshEffect = effect(() => {
2118
+ const profileCode = this.localeService.activeProfile().localeInfo?.code ?? '';
2119
+ if (!profileCode || this.vm.isLoading() || !this.filtersPanelInitialized) {
2120
+ return;
2121
+ }
2122
+ const previousCode = this.lastLocaleProfileCode;
2123
+ this.lastLocaleProfileCode = profileCode;
2124
+ if (previousCode == null || previousCode === profileCode) {
2125
+ return;
2126
+ }
2127
+ untracked(() => {
2128
+ const taskTypes = this.vm.taskTypes();
2129
+ const normalizedTypes = normalizeTaskTypeFilterNames(this.vm.selectedTaskTypeNames(), taskTypes);
2130
+ if (!isEqual(sortBy(normalizedTypes), sortBy(this.vm.selectedTaskTypeNames()))) {
2131
+ this.vm.setSelectedTaskTypeNames(normalizedTypes);
2132
+ }
2133
+ void this.vm.reloadTaskTypes().then(() => {
2134
+ this.taskBoardService.clearProviderCache();
2135
+ void this.syncPanelInitialFilters();
2136
+ this.refreshNonce.update((value) => value + 1);
2137
+ this.schedulerComponent()?.refresh();
2138
+ });
2139
+ });
2140
+ }, ...(ngDevMode ? [{ debugName: "localeFilterRefreshEffect" }] : /* istanbul ignore next */ []));
2141
+ this.refreshEffect = effect(() => {
2142
+ this.vm.selectedTaskTypeNames();
2143
+ this.vm.selectedAssigneeIds();
2144
+ this.vm.selectedReporterIds();
2145
+ this.vm.selectedPriorities();
2146
+ this.vm.selectedDueStatusKeys();
2147
+ this.vm.effectiveColorBy();
2148
+ this.vm.currentDate();
2149
+ this.vm.daysCount();
2150
+ this.localeService.activeProfile().localeInfo?.code;
2151
+ this.refreshNonce();
2152
+ void this.getResources();
2153
+ this.schedulerComponent()?.refresh();
2154
+ }, ...(ngDevMode ? [{ debugName: "refreshEffect" }] : /* istanbul ignore next */ []));
2155
+ this.calendarEventTypeRefreshEffect = effect(() => {
2156
+ this.vm.selectedCalendarEventTypeIds();
2157
+ this.localeService.activeProfile().localeInfo?.code;
2158
+ this.schedulerComponent()?.refresh();
2159
+ }, ...(ngDevMode ? [{ debugName: "calendarEventTypeRefreshEffect" }] : /* istanbul ignore next */ []));
2160
+ this.calendarLocalizationEffect = effect(() => {
2161
+ this.localeService.activeProfile().localeInfo?.code;
2162
+ void this.loadCalendarFilterOptions();
2163
+ }, ...(ngDevMode ? [{ debugName: "calendarLocalizationEffect" }] : /* istanbul ignore next */ []));
2164
+ this.dayDataCacheEffect = effect(async () => {
2165
+ this.vm.currentDate();
2166
+ this.vm.currentViewMode();
2167
+ this.vm.selectedTaskTypeNames();
2168
+ this.localeService.activeProfile().localeInfo?.code;
2169
+ await this.updateDayDataCache();
2170
+ }, ...(ngDevMode ? [{ debugName: "dayDataCacheEffect" }] : /* istanbul ignore next */ []));
2171
+ this.getCellClass = (date) => {
2172
+ const currentView = this.vm.currentViewMode();
2173
+ const selectionStartDate = this.vm.rangeStartDate();
2174
+ if (!this.usesNavigatorRangeSelection(currentView)) {
2175
+ const currentDay = this.calendarService.create(this.vm.currentDate());
2176
+ if (date.equal(currentDay, 'day')) {
2177
+ return 'ax-range-start ax-range-end';
2178
+ }
2179
+ return null;
2180
+ }
2181
+ if (this.modifierRangeBasedViews.includes(currentView) || this.alwaysRangeBasedViews.includes(currentView)) {
2182
+ if (selectionStartDate) {
2183
+ const axSelectionStartDate = this.calendarService.create(selectionStartDate);
2184
+ if (date.equal(axSelectionStartDate, 'day')) {
2185
+ return 'ax-range-start ax-range-end';
2186
+ }
2187
+ return null;
2188
+ }
2189
+ const fromRange = this.calendarService.create(this.vm.currentDate());
2190
+ const endRange = fromRange.add('day', this.vm.daysCount() - 1);
2191
+ const isStart = date.equal(fromRange, 'day');
2192
+ const isEnd = date.equal(endRange, 'day');
2193
+ if (isStart && isEnd)
2194
+ return 'ax-range-start ax-range-end';
2195
+ if (isStart)
2196
+ return 'ax-range-start';
2197
+ if (isEnd)
2198
+ return 'ax-range-end';
2199
+ if (date.compare(fromRange, 'day') > 0 && date.compare(endRange, 'day') < 0) {
2200
+ return 'ax-range-between';
2201
+ }
2202
+ return null;
2203
+ }
2204
+ if (currentView === 'week') {
2205
+ const from = this.calendarService.create(this.vm.currentDate());
2206
+ const end = from.add('day', 6);
2207
+ if (date.equal(from, 'day'))
2208
+ return 'ax-range-start';
2209
+ if (date.equal(end, 'day'))
2210
+ return 'ax-range-end';
2211
+ if (date.compare(from, 'day') > 0 && date.compare(end, 'day') < 0) {
2212
+ return 'ax-range-between';
2213
+ }
2214
+ }
2215
+ return null;
2216
+ };
2217
+ this.isNonCalendarView = computed(() => {
2218
+ const mode = this.vm.currentViewMode();
2219
+ return mode === 'kanban' || mode === 'grid' || mode === 'status-grouped-grid';
2220
+ }, ...(ngDevMode ? [{ debugName: "isNonCalendarView" }] : /* istanbul ignore next */ []));
2221
+ }
2222
+ static { this.PRIORITY_OPTIONS = [
2223
+ { title: 'Urgent', name: 'urgent' },
2224
+ { title: 'High', name: 'high' },
2225
+ { title: 'Normal', name: 'normal' },
2226
+ { title: 'Low', name: 'low' },
2227
+ { title: 'No Priority', name: 'no_priority' },
2228
+ ]; }
2229
+ static { this.DUE_STATUS_OPTIONS = [
2230
+ { title: 'Completed', name: 'completed' },
2231
+ { title: 'No due date', name: 'no-due-date' },
2232
+ { title: 'Overdue', name: 'overdue' },
2233
+ { title: 'Due today', name: 'due-today' },
2234
+ { title: 'Due tomorrow', name: 'due-tomorrow' },
2235
+ { title: 'Due this week', name: 'due-this-week' },
2236
+ { title: 'Upcoming', name: 'upcoming' },
2237
+ ]; }
2238
+ enrichTasks(tasks) {
2239
+ return enrichTaskBoardTasks(tasks, this.vm.effectiveColorBy(), this.dueStatusProviderService);
2240
+ }
2241
+ async enrichTasksForViews(tasks) {
2242
+ const labeled = await resolveTaskBoardSchedulerLabels(tasks, this.translateService, this.formatService, this.settingsService);
2243
+ return this.enrichTasks(labeled);
2244
+ }
2245
+ async ngOnInit() {
2246
+ await super.ngOnInit();
2247
+ this.taskBoardService.refresh$.subscribe(async () => {
2248
+ await this.reloadTaskBoardData();
2249
+ });
2250
+ this.taskBoardService.clearProviderCache();
2251
+ await this.vm.initialize();
2252
+ const calendars = await this.loadCalendarFilterOptions();
2253
+ await this.loadFromRoute();
2254
+ if (this.activatedRoute.snapshot.queryParamMap.has('calendarEvent')) {
2255
+ void this.router.navigate([], {
2256
+ queryParams: { calendarEvent: null },
2257
+ queryParamsHandling: 'merge',
2258
+ replaceUrl: true,
2259
+ });
2260
+ }
2261
+ if (this.vm.selectedCalendarEventTypeIds().length === 0 && calendars.length > 0) {
2262
+ this.vm.setSelectedCalendarEventTypeIds(calendars.map((calendar) => calendar.id));
2263
+ }
2264
+ this.filtersReady.set(true);
2265
+ this.isReady.set(true);
2266
+ this.registerKeyboardShortcuts();
2267
+ await this.reloadTaskBoardData();
2268
+ await this.updateDayDataCache();
2269
+ this.router.events
2270
+ .pipe(this.unsubscribe.takeUntilDestroy, filter((event) => event instanceof NavigationEnd))
2271
+ .subscribe(() => {
2272
+ void this.loadFromRoute();
2273
+ });
2274
+ this.taskBoardService.openTask$.subscribe(async ({ task, provider, instanceId, activityId }) => {
2275
+ await this.taskResolveHandler();
2276
+ let match = task;
2277
+ if (!match && instanceId && activityId) {
2278
+ match = this.resolvedTasks().find((t) => {
2279
+ const data = t.data;
2280
+ return data?.instanceId === instanceId && data?.activityId === activityId;
2281
+ });
2282
+ }
2283
+ if (!match) {
2284
+ return;
2285
+ }
2286
+ this.vm.selectTask({
2287
+ ...match,
2288
+ provider: match.provider ?? provider,
2289
+ });
2290
+ });
2291
+ }
2292
+ async getPageTitle() {
2293
+ const category = this.vm.currentViewCategory();
2294
+ const layout = this.vm.getLayoutForCategory(category);
2295
+ return await this.translateService.translateAsync(this.viewPageTitleTranslationKey(category, layout));
2296
+ }
2297
+ getTitleActions() {
2298
+ const currentCategory = this.vm.currentViewCategory();
2299
+ return this.vm.visibleViewCategories().map((category) => ({
2300
+ title: this.viewCategoryTranslationKey(category),
2301
+ icon: currentCategory === category ? 'fa-check' : '',
2302
+ command: {
2303
+ name: 'task-board-category',
2304
+ metadata: { category, isSelected: currentCategory === category, hideSelectionCheckSuffix: true },
2305
+ },
2306
+ }));
2307
+ }
2308
+ async getPageBreadcrumbs() {
2309
+ return [
2310
+ {
2311
+ title: await this.translateService.translateAsync('@task-management:task-board.page-title'),
2312
+ },
2313
+ ];
2314
+ }
2315
+ async getPrimaryMenuItems() {
2316
+ return [
2317
+ // {
2318
+ // ...getActionButton('refresh'),
2319
+ // command: { name: 'refresh' },
2320
+ // },
2321
+ ];
2322
+ }
2323
+ async execute(command) {
2324
+ if (command.name === 'task-board-category') {
2325
+ const category = command.metadata?.['category'];
2326
+ if (category) {
2327
+ this.applyViewCategory(category);
2328
+ }
2329
+ return;
2330
+ }
2331
+ // if (command.name === 'refresh') {
2332
+ // this.taskBoardService.requestRefresh();
2333
+ // }
2334
+ }
2335
+ async taskResolveHandler(filter = this.filter()) {
2336
+ const result = await this.taskBoardService.getTasks(filter);
2337
+ const items = await this.enrichTasksForViews(result.items);
2338
+ this.validateSelectedTask(items);
2339
+ this.resolvedTasks.set(items);
2340
+ }
2341
+ async reloadTaskBoardData() {
2342
+ this.taskBoardService.clearProviderCache();
2343
+ await this.vm.reloadTaskTypes();
2344
+ if (this.filtersPanelInitialized) {
2345
+ await this.syncPanelInitialFilters();
2346
+ }
2347
+ await this.taskResolveHandler();
2348
+ await this.getResources();
2349
+ this.refreshNonce.update((value) => value + 1);
2350
+ this.schedulerComponent()?.refresh();
2351
+ }
2352
+ schedulerComponentChanged(component) {
2353
+ this.schedulerComponent.set(component);
2354
+ queueMicrotask(() => {
2355
+ component.refresh();
2356
+ });
2357
+ }
2358
+ async handleContextMenuOnOpening(event) {
2359
+ const currentTask = this.currentTask();
2360
+ if (!currentTask)
2361
+ return;
2362
+ const providerName = currentTask.provider;
2363
+ if (!providerName)
2364
+ return;
2365
+ const provider = this.taskBoardService.getProvider(providerName);
2366
+ if (!provider)
2367
+ return;
2368
+ const actions = await provider.getActions(currentTask);
2369
+ for (const item of actions) {
2370
+ const t = item.title;
2371
+ const text = typeof t === 'string'
2372
+ ? t.startsWith('@')
2373
+ ? await this.translateService.translateAsync(t)
2374
+ : t
2375
+ : this.translateService.resolve(t);
2376
+ event.items.push({
2377
+ text,
2378
+ icon: item.icon,
2379
+ color: item.color,
2380
+ break: item.break,
2381
+ data: {
2382
+ command: item.command,
2383
+ },
2384
+ });
2385
+ }
2386
+ }
2387
+ handleContextMenu(event) {
2388
+ this.currentTask.set(event.task);
2389
+ const x = event.nativeEvent.clientX;
2390
+ const y = event.nativeEvent.clientY;
2391
+ const element = event.nativeEvent.target;
2392
+ this.contextMenu()?.showAt({ x, y }, element);
2393
+ }
2394
+ handleMonthSlotDblClicked(date) {
2395
+ this.vm.setCurrentDate(date);
2396
+ this.vm.setViewLayout('calendar', 'daily');
2397
+ }
2398
+ viewCategoryTranslationKey(category) {
2399
+ return `@task-management:task-board.${category}`;
2400
+ }
2401
+ viewPageTitleTranslationKey(category, layout) {
2402
+ if (category === 'kanban') {
2403
+ return '@task-management:task-board.view-page-title.kanban';
2404
+ }
2405
+ if (layout) {
2406
+ return `@task-management:task-board.view-page-title.${category}.${layout}`;
2407
+ }
2408
+ return this.viewCategoryTranslationKey(category);
2409
+ }
2410
+ viewLayoutTranslationKey(layoutText) {
2411
+ return `@task-management:task-board.view.${layoutText}`;
2412
+ }
2413
+ isViewLayoutSelected(layout) {
2414
+ return this.selectedViewLayout() === layout;
2415
+ }
2416
+ handleViewLayoutChange(layout) {
2417
+ this.vm.setViewLayout(this.vm.currentViewCategory(), layout);
2418
+ void this.navigateViewState();
2419
+ this.recompute();
2420
+ }
2421
+ applyViewCategory(category) {
2422
+ const previousCategory = this.vm.currentViewCategory();
2423
+ const previousMode = this.vm.currentViewMode();
2424
+ if (isTaskBoardRangeFilterCategory(category) && !isTaskBoardRangeFilterCategory(previousCategory)) {
2425
+ this.applySmartDateRangeFromNavigator(previousMode);
2426
+ }
2427
+ this.vm.setViewCategory(category);
2428
+ void this.navigateViewState();
2429
+ this.popover()?.close();
2430
+ this.recompute();
2431
+ }
2432
+ applySmartDateRangeFromNavigator(sourceViewMode) {
2433
+ const range = deriveTaskBoardDateRangeFromNavigator(this.calendarService, sourceViewMode, this.vm.currentDate(), this.vm.daysCount());
2434
+ applyTaskBoardDateRangeToViewModel(range, (date) => this.vm.setCurrentDate(date), (days) => this.vm.setDaysCount(days));
2435
+ }
2436
+ navigateViewState() {
2437
+ void this.router.navigate([], {
2438
+ queryParams: this.buildFilterQueryParams(),
2439
+ queryParamsHandling: 'merge',
2440
+ });
2441
+ }
2442
+ toggleSettingsPanel() {
2443
+ this.isSettingsPanelOpen.update((open) => !open);
2444
+ }
2445
+ closeSettingsPanel() {
2446
+ this.isSettingsPanelOpen.set(false);
2447
+ }
2448
+ async loadSettingsPanelCopy() {
2449
+ const [title, colorBy, calendars] = await Promise.all([
2450
+ this.translationService.translateAsync('@task-management:task-board.settings.title'),
2451
+ this.translationService.translateAsync('@task-management:task-board.settings.color-by'),
2452
+ this.translationService.translateAsync('@task-management:task-board.filter.calendars'),
2453
+ ]);
2454
+ this.settingsPanelCopy.set({
2455
+ title: title ?? '',
2456
+ colorBy: colorBy ?? '',
2457
+ calendars: calendars ?? '',
2458
+ });
2459
+ }
2460
+ handleCalendarEventTypesSelectionChange(event) {
2461
+ if (!event.isUserInteraction) {
2462
+ return;
2463
+ }
2464
+ const next = Array.isArray(event.value)
2465
+ ? event.value.map(String)
2466
+ : event.value != null
2467
+ ? [String(event.value)]
2468
+ : [];
2469
+ this.vm.setSelectedCalendarEventTypeIds(next);
2470
+ this.schedulerComponent()?.refresh();
2471
+ }
2472
+ handleFiltersChanged(filters) {
2473
+ if (!this.filtersPanelInitialized) {
2474
+ return;
2475
+ }
2476
+ // User-driven filter changes should persist and override URL-seeded state.
2477
+ this.isQueryParam.set(false);
2478
+ const typeFilter = filters.find((f) => f.field === 'type');
2479
+ const assigneeFilter = filters.find((f) => f.field === 'assignee');
2480
+ const reporterFilter = filters.find((f) => f.field === 'reporter');
2481
+ const priorityFilter = filters.find((f) => f.field === 'priority');
2482
+ const dueStatusFilter = filters.find((f) => f.field === 'dueStatus');
2483
+ this.syncTaskTypesToViewModel(typeFilter?.value);
2484
+ this.syncAssigneesToViewModel(assigneeFilter?.value);
2485
+ this.syncReportersToViewModel(reporterFilter?.value);
2486
+ this.syncPrioritiesToViewModel(priorityFilter?.value);
2487
+ this.syncDueStatusesToViewModel(dueStatusFilter?.value);
2488
+ void this.navigateViewState();
2489
+ }
2490
+ async syncPanelInitialFilters() {
2491
+ this.panelInitialFilters.set(await this.buildInitialFiltersFromViewModel());
2492
+ }
2493
+ async buildInitialFiltersFromViewModel() {
2494
+ const filters = [];
2495
+ const types = this.vm.selectedTaskTypeNames();
2496
+ const assignees = this.vm.selectedAssigneeIds();
2497
+ const reporters = this.vm.selectedReporterIds();
2498
+ const priorities = this.vm.selectedPriorities();
2499
+ const dueStatusKeys = this.vm.selectedDueStatusKeys();
2500
+ if (types.length > 0) {
2501
+ const typeValue = this.isMultiSelectTaskTypeEnabled() ? types : types[0];
2502
+ filters.push({
2503
+ field: 'type',
2504
+ operator: { type: 'equal' },
2505
+ value: typeValue,
2506
+ displayText: await this.resolveSelectFilterDisplayText('task-types', 'name', 'title', typeValue),
2507
+ });
2508
+ }
2509
+ if (assignees.length > 0) {
2510
+ filters.push({
2511
+ field: 'assignee',
2512
+ operator: { type: 'equal' },
2513
+ value: assignees,
2514
+ displayText: await this.resolveSelectFilterDisplayText('task-board-assignees', 'id', 'displayName', assignees),
2515
+ });
2516
+ }
2517
+ if (reporters.length > 0) {
2518
+ filters.push({
2519
+ field: 'reporter',
2520
+ operator: { type: 'equal' },
2521
+ value: reporters,
2522
+ displayText: await this.resolveSelectFilterDisplayText('users', 'id', 'displayName', reporters),
2523
+ });
2524
+ }
2525
+ if (priorities.length > 0) {
2526
+ filters.push({
2527
+ field: 'priority',
2528
+ operator: { type: 'equal' },
2529
+ value: priorities,
2530
+ displayText: this.resolvePriorityDisplayText(priorities),
2531
+ });
2532
+ }
2533
+ if (dueStatusKeys.length > 0) {
2534
+ filters.push({
2535
+ field: 'dueStatus',
2536
+ operator: { type: 'equal' },
2537
+ value: dueStatusKeys,
2538
+ displayText: this.resolveDueStatusDisplayText(dueStatusKeys),
2539
+ });
2540
+ }
2541
+ return filters;
2542
+ }
2543
+ resolveDueStatusDisplayText(values) {
2544
+ return values
2545
+ .map((name) => AXMTaskBoardPage.DUE_STATUS_OPTIONS.find((option) => option.name === name)?.title ?? name)
2546
+ .join(', ');
2547
+ }
2548
+ resolvePriorityDisplayText(values) {
2549
+ return values
2550
+ .map((name) => AXMTaskBoardPage.PRIORITY_OPTIONS.find((option) => option.name === name)?.title ?? name)
2551
+ .join(', ');
2552
+ }
2553
+ async resolveSelectFilterDisplayText(dataSourceName, valueField, textField, values) {
2554
+ const ids = Array.isArray(values) ? values : values != null && values !== '' ? [values] : [];
2555
+ if (ids.length === 0) {
2556
+ return '';
2557
+ }
2558
+ const definition = await this.dataSourceDefinitionService.get(dataSourceName);
2559
+ const dsResult = definition?.source();
2560
+ const dataSource = dsResult instanceof Promise ? await dsResult : dsResult;
2561
+ if (!dataSource?.config?.byKey) {
2562
+ return ids.map((id) => String(this.unwrapFilterValue(id))).join(', ');
2563
+ }
2564
+ const labels = await Promise.all(ids.map(async (id) => {
2565
+ const rawId = this.unwrapFilterValue(id);
2566
+ const item = await dataSource.config.byKey(rawId);
2567
+ if (item && typeof item === 'object') {
2568
+ const label = item[textField];
2569
+ if (label != null && label !== '') {
2570
+ return String(label);
2571
+ }
2572
+ }
2573
+ return String(rawId);
2574
+ }));
2575
+ return labels.join(', ');
2576
+ }
2577
+ buildFilterQueryParams() {
2578
+ const types = this.vm.selectedTaskTypeNames();
2579
+ const assignees = this.vm.selectedAssigneeIds();
2580
+ const reporters = this.vm.selectedReporterIds();
2581
+ const priorities = this.vm.selectedPriorities();
2582
+ const dueStatusKeys = this.vm.selectedDueStatusKeys();
2583
+ const category = this.vm.currentViewCategory();
2584
+ const layout = this.vm.getLayoutForCategory(category);
2585
+ return {
2586
+ view: category,
2587
+ layout: layout ?? null,
2588
+ type: types.length > 0 ? types : null,
2589
+ assignee: assignees.length > 0 ? assignees.map(String) : null,
2590
+ reporter: reporters.length > 0 ? reporters.map(String) : null,
2591
+ priority: priorities.length > 0 ? priorities : null,
2592
+ dueStatus: dueStatusKeys.length > 0 ? dueStatusKeys : null,
2593
+ calendarEvent: null,
2594
+ };
2595
+ }
2596
+ unwrapFilterValue(value) {
2597
+ let v = value;
2598
+ while (v != null && typeof v === 'object' && !Array.isArray(v) && 'value' in v) {
2599
+ v = v['value'];
2600
+ }
2601
+ return v;
2602
+ }
2603
+ normalizeStringArrayFilterValue(value) {
2604
+ const v = this.unwrapFilterValue(value);
2605
+ if (v == null || v === '') {
2606
+ return [];
2607
+ }
2608
+ if (Array.isArray(v)) {
2609
+ return v
2610
+ .filter((item) => item != null)
2611
+ .map((item) => {
2612
+ if (typeof item === 'string') {
2613
+ return item;
2614
+ }
2615
+ if (typeof item === 'object' && item != null && 'name' in item) {
2616
+ return String(item.name);
2617
+ }
2618
+ return String(item);
2619
+ });
2620
+ }
2621
+ if (typeof v === 'object' && v != null && 'name' in v) {
2622
+ return [String(v.name)];
2623
+ }
2624
+ return [String(v)];
2625
+ }
2626
+ normalizeIdArrayFilterValue(value) {
2627
+ const v = this.unwrapFilterValue(value);
2628
+ if (v == null || v === '') {
2629
+ return [];
2630
+ }
2631
+ if (Array.isArray(v)) {
2632
+ return v
2633
+ .filter((item) => item != null)
2634
+ .map((item) => {
2635
+ if (typeof item === 'string' || typeof item === 'number') {
2636
+ return item;
2637
+ }
2638
+ if (typeof item === 'object' && item != null && 'id' in item) {
2639
+ return item.id;
2640
+ }
2641
+ return String(item);
2642
+ });
2643
+ }
2644
+ if (typeof v === 'object' && v != null && 'id' in v) {
2645
+ return [v.id];
2646
+ }
2647
+ if (typeof v === 'string' || typeof v === 'number') {
2648
+ return [v];
2649
+ }
2650
+ return [String(v)];
2651
+ }
2652
+ syncTaskTypesToViewModel(value) {
2653
+ const raw = this.normalizeStringArrayFilterValue(value);
2654
+ const newNames = normalizeTaskTypeFilterNames(raw, this.vm.taskTypes());
2655
+ const currentNames = this.vm.selectedTaskTypeNames();
2656
+ if (!isEqual(sortBy(currentNames), sortBy(newNames))) {
2657
+ this.vm.setSelectedTaskTypeNames(newNames, this.isQueryParam());
2658
+ }
2659
+ }
2660
+ syncAssigneesToViewModel(value) {
2661
+ const newIds = this.normalizeIdArrayFilterValue(value);
2662
+ const currentIds = this.vm.selectedAssigneeIds();
2663
+ if (!isEqual(sortBy(currentIds.map(String)), sortBy(newIds.map(String)))) {
2664
+ // Always persist an explicit UI change (including clearing to "all assignees").
2665
+ this.vm.setSelectedAssigneeIds(newIds, false, true);
2666
+ }
2667
+ }
2668
+ syncReportersToViewModel(value) {
2669
+ const newIds = this.normalizeIdArrayFilterValue(value);
2670
+ const currentIds = this.vm.selectedReporterIds();
2671
+ if (!isEqual(sortBy(currentIds.map(String)), sortBy(newIds.map(String)))) {
2672
+ this.vm.setSelectedReporterIds(newIds, this.isQueryParam());
2673
+ }
2674
+ }
2675
+ syncPrioritiesToViewModel(value) {
2676
+ const raw = this.normalizeStringArrayFilterValue(value);
2677
+ const newNames = normalizeTaskBoardPriorityFilterKeys(raw);
2678
+ const currentNames = this.vm.selectedPriorities();
2679
+ if (!isEqual(sortBy(currentNames), sortBy(newNames))) {
2680
+ this.vm.setSelectedPriorities(newNames, this.isQueryParam());
2681
+ }
2682
+ }
2683
+ syncDueStatusesToViewModel(value) {
2684
+ const raw = this.normalizeStringArrayFilterValue(value);
2685
+ const newKeys = normalizeDueStatusFilterKeys(raw);
2686
+ const currentKeys = this.vm.selectedDueStatusKeys();
2687
+ if (!isEqual(sortBy(currentKeys), sortBy(newKeys))) {
2688
+ this.vm.setSelectedDueStatusKeys(newKeys, this.isQueryParam());
2689
+ }
2690
+ }
2691
+ handleColorBySelectionChange(event) {
2692
+ if (!event.isUserInteraction) {
2693
+ return;
2694
+ }
2695
+ this.handleColorByChange(event.value);
2696
+ }
2697
+ handleColorByChange(key) {
2698
+ this.vm.setColorBy(key);
2699
+ void this.taskResolveHandler();
2700
+ this.schedulerComponent()?.refresh();
2701
+ this.refreshNonce.update((value) => value + 1);
2702
+ }
2703
+ isMultiSelectTaskTypeEnabled() {
2704
+ const viewMode = this.vm.currentViewMode();
2705
+ return viewMode !== 'kanban' && viewMode !== 'status-grouped-grid';
2706
+ }
2707
+ async loadCalendarFilterOptions() {
2708
+ const calendars = await this.taskBoardService.getCalendarEventTypes();
2709
+ this.calendarEventTypes.set(calendars.map((calendar) => ({
2710
+ id: calendar.id,
2711
+ title: calendar.title,
2712
+ })));
2713
+ return calendars;
2714
+ }
2715
+ async updateDayDataCache() {
2716
+ const currentDate = this.vm.currentDate();
2717
+ const depth = this.calendarDepth();
2718
+ // Determine the date range based on the popover calendar depth
2719
+ let rangeStart;
2720
+ let rangeEnd;
2721
+ if (depth === 'month') {
2722
+ // When depth is 'month', the sidebar shows a full year of months -- fetch data for the entire year
2723
+ rangeStart = this.calendarService.create(currentDate).startOf('year').date;
2724
+ rangeEnd = this.calendarService.create(currentDate).endOf('year').date;
2725
+ }
2726
+ else {
2727
+ // When depth is 'day', the sidebar shows a single month -- fetch data for that month
2728
+ rangeStart = this.calendarService.create(currentDate).startOf('month').date;
2729
+ rangeEnd = this.calendarService.create(currentDate).endOf('month').date;
2730
+ }
2731
+ const tasks = await this.taskBoardService.getTasks({
2732
+ ...this.filter(),
2733
+ range: { from: rangeStart, end: rangeEnd },
2734
+ });
2735
+ const dayCountMap = new Map();
2736
+ tasks.items.forEach((task) => {
2737
+ const taskStart = new Date(task.startDate);
2738
+ const taskEnd = new Date(task.endDate);
2739
+ const startDay = this.calendarService.create(taskStart).startOf('day');
2740
+ const endDay = this.calendarService.create(taskEnd).startOf('day');
2741
+ let currentDay = startDay;
2742
+ while (currentDay.compare(endDay, 'day') <= 0) {
2743
+ const dayKey = currentDay.format('YYYY-MM-DD');
2744
+ dayCountMap.set(dayKey, (dayCountMap.get(dayKey) || 0) + 1);
2745
+ currentDay = currentDay.add('day', 1);
2746
+ }
2747
+ });
2748
+ this.dayDataCache.set(dayCountMap);
2749
+ this.calendar()?.render();
2750
+ }
2751
+ async resolveNavigatorTimeText() {
2752
+ const formatted = this.formatNavigatorDateText();
2753
+ return this.resolveFormattedDateTimeLabels(formatted);
2754
+ }
2755
+ /** Resolves leftover `dateTime.*` tokens via translateAsync (translateSync may run before acorex scope loads). */
2756
+ async resolveFormattedDateTimeLabels(formatted) {
2757
+ const keyPattern = /(?:@acorex:)?dateTime\.[A-Za-z0-9._-]+/g;
2758
+ const matches = [...new Set(formatted.match(keyPattern) ?? [])];
2759
+ if (matches.length === 0) {
2760
+ return formatted;
2761
+ }
2762
+ let result = formatted;
2763
+ for (const match of matches) {
2764
+ const key = match.startsWith('@') ? match : `@acorex:${match}`;
2765
+ const translated = await this.translateService.translateAsync(key);
2766
+ result = result.replaceAll(match, translated);
2767
+ }
2768
+ return result;
2769
+ }
2770
+ /**
2771
+ * Builds toolbar navigator date text with calendar-aware AXDateTime tokens.
2772
+ * Month/weekday tokens may remain as i18n keys until {@link resolveFormattedDateTimeLabels} runs.
2773
+ */
2774
+ formatNavigatorDateText() {
2775
+ const currentDate = this.vm.currentDate();
2776
+ if (!currentDate) {
2777
+ return '';
2778
+ }
2779
+ const calendarSystem = this.calendarType();
2780
+ const formatOptions = { locale: calendarSystem };
2781
+ const axDate = this.calendarService.create(currentDate, calendarSystem);
2782
+ const viewMode = this.vm.currentViewMode();
2783
+ if (viewMode === 'grid' ||
2784
+ viewMode === 'kanban' ||
2785
+ viewMode === 'status-grouped-grid') {
2786
+ const startText = axDate.format('DD MMMM yyyy', formatOptions);
2787
+ if (this.vm.daysCount() <= 1) {
2788
+ return startText;
2789
+ }
2790
+ const endText = axDate.add('day', this.vm.daysCount() - 1).format('DD MMMM yyyy', formatOptions);
2791
+ return `${startText} - ${endText}`;
2792
+ }
2793
+ switch (viewMode) {
2794
+ case 'day':
2795
+ case 'timeline-day':
2796
+ return axDate.format('DD MMMM yyyy', formatOptions);
2797
+ case 'week': {
2798
+ const startText = axDate.format('DD MMMM yyyy', formatOptions);
2799
+ const endText = axDate.add('week', 1).add('day', -1).format('DD MMMM yyyy', formatOptions);
2800
+ return `${startText} - ${endText}`;
2801
+ }
2802
+ case 'agenda':
2803
+ case 'timeline-weekly': {
2804
+ const startText = axDate.format('DD MMMM yyyy', formatOptions);
2805
+ const endText = axDate.add('day', this.vm.daysCount() - 1).format('DD MMMM yyyy', formatOptions);
2806
+ return `${startText} - ${endText}`;
2807
+ }
2808
+ case 'month':
2809
+ case 'timeline-month':
2810
+ return axDate.format('MMMM yyyy', formatOptions);
2811
+ case 'timeline-year':
2812
+ return axDate.format('yyyy', formatOptions);
2813
+ default:
2814
+ return '';
2815
+ }
2816
+ }
2817
+ /** Normalizes ax-calendar slot labels (e.g. `dateTime.months.*`) for the translate pipe. */
2818
+ toAcorexTranslationKey(text) {
2819
+ if (text == null || text === '') {
2820
+ return '';
2821
+ }
2822
+ const value = String(text);
2823
+ if (value.startsWith('@')) {
2824
+ return value;
2825
+ }
2826
+ if (value.startsWith('dateTime.')) {
2827
+ return `@acorex:${value}`;
2828
+ }
2829
+ return value;
2830
+ }
2831
+ isDateTimeTranslationKey(text) {
2832
+ if (text == null) {
2833
+ return false;
2834
+ }
2835
+ const value = String(text);
2836
+ return value.startsWith('@') || value.startsWith('dateTime.');
2837
+ }
2838
+ getDayDataCount(date) {
2839
+ if (!date) {
2840
+ return 0;
2841
+ }
2842
+ try {
2843
+ // Get the native Date object from AXDateTime
2844
+ const dateObj = date.date || date._date;
2845
+ if (!dateObj) {
2846
+ return 0;
2847
+ }
2848
+ // Create a new AXDateTime from the date object for consistent formatting
2849
+ const nativeDate = dateObj instanceof Date ? dateObj : new Date(dateObj);
2850
+ const axDate = this.calendarService.create(nativeDate);
2851
+ const dayKey = axDate.format('YYYY-MM-DD');
2852
+ return this.dayDataCache().get(dayKey) || 0;
2853
+ }
2854
+ catch (error) {
2855
+ console.warn('Error getting day data count:', error);
2856
+ return 0;
2857
+ }
2858
+ }
2859
+ /**
2860
+ * Aggregates the day-level data counts for an entire month.
2861
+ * Used by the monthCellTemplate to show badges when the sidebar calendar depth is 'month'.
2862
+ */
2863
+ getMonthDataCount(date) {
2864
+ if (!date) {
2865
+ return 0;
2866
+ }
2867
+ try {
2868
+ const dateObj = date.date || date._date;
2869
+ if (!dateObj) {
2870
+ return 0;
2871
+ }
2872
+ const nativeDate = dateObj instanceof Date ? dateObj : new Date(dateObj);
2873
+ const axDate = this.calendarService.create(nativeDate);
2874
+ const monthStart = axDate.startOf('month');
2875
+ const monthEnd = axDate.endOf('month');
2876
+ let total = 0;
2877
+ let current = monthStart;
2878
+ while (current.compare(monthEnd, 'day') <= 0) {
2879
+ const dayKey = current.format('YYYY-MM-DD');
2880
+ total += this.dayDataCache().get(dayKey) || 0;
2881
+ current = current.add('day', 1);
2882
+ }
2883
+ return total;
2884
+ }
2885
+ catch (error) {
2886
+ console.warn('Error getting month data count:', error);
2887
+ return 0;
2888
+ }
2889
+ }
2890
+ async handleContextMenuItemClick(event) {
2891
+ const command = event.item.data?.command;
2892
+ const provider = this.currentTask()?.provider ?? '';
2893
+ try {
2894
+ if (command) {
2895
+ await this.taskBoardService.executeCommand(command, provider);
2896
+ }
2897
+ }
2898
+ catch (error) {
2899
+ console.error('[TaskBoard] Context menu command failed:', error);
2900
+ }
2901
+ finally {
2902
+ if (command) {
2903
+ this.taskBoardService.requestRefresh(provider || undefined);
2904
+ }
2905
+ }
2906
+ }
2907
+ handleNavigatorRangeModifierDown() {
2908
+ this.navigatorRangeSelectActive.set(true);
2909
+ }
2910
+ handleNavigatorRangeModifierUp() {
2911
+ this.navigatorRangeSelectActive.set(false);
2912
+ }
2913
+ /**
2914
+ * Registers page keyboard shortcuts with the platform shortcut registry.
2915
+ */
2916
+ registerKeyboardShortcuts() {
2917
+ this.registerTaskBoardNavigatorShortcuts();
2918
+ this.registerTaskBoardPanelShortcuts();
2919
+ this.registerTaskBoardViewCategoryShortcuts();
2920
+ this.registerTaskBoardViewLayoutShortcuts();
2921
+ }
2922
+ registerTaskBoardNavigatorShortcuts() {
2923
+ this.shortcutRegistry.register({
2924
+ owner: this.destroyRef,
2925
+ id: 'task-board-navigator',
2926
+ priority: AXPKeyboardShortcutPriority.Page,
2927
+ scope: '@task-management:task-board.page-title',
2928
+ group: '@general:keyboard-shortcuts.groups.navigation',
2929
+ when: () => this.isReady() && this.showToolbarNavigator(),
2930
+ shortcuts: [
2931
+ {
2932
+ keys: ['arrowleft'],
2933
+ title: '@task-management:task-board.navigator.previous-period',
2934
+ allowInEditableFields: true,
2935
+ handler: () => this.changeDate(false),
2936
+ },
2937
+ {
2938
+ keys: ['arrowright'],
2939
+ title: '@task-management:task-board.navigator.next-period',
2940
+ allowInEditableFields: true,
2941
+ handler: () => this.changeDate(true),
2942
+ },
2943
+ {
2944
+ keys: ['alt+t'],
2945
+ title: '@task-management:task-board.shortcuts.go-to-today',
2946
+ allowInEditableFields: true,
2947
+ handler: () => this.handleTodayClick(),
2948
+ },
2949
+ ],
2950
+ });
2951
+ }
2952
+ registerTaskBoardPanelShortcuts() {
2953
+ this.shortcutRegistry.register({
2954
+ owner: this.destroyRef,
2955
+ id: 'task-board-panels-settings',
2956
+ priority: AXPKeyboardShortcutPriority.Page,
2957
+ scope: '@task-management:task-board.page-title',
2958
+ group: '@task-management:task-board.shortcuts.groups.panels',
2959
+ when: () => this.isReady(),
2960
+ shortcuts: [
2961
+ {
2962
+ keys: ['ctrl+,'],
2963
+ title: '@task-management:task-board.shortcuts.toggle-settings',
2964
+ allowInEditableFields: true,
2965
+ handler: () => this.toggleSettingsPanel(),
2966
+ },
2967
+ ],
2968
+ });
2969
+ this.shortcutRegistry.register({
2970
+ owner: this.destroyRef,
2971
+ id: 'task-board-panels-dismiss',
2972
+ priority: AXPKeyboardShortcutPriority.Page,
2973
+ scope: '@task-management:task-board.page-title',
2974
+ group: '@task-management:task-board.shortcuts.groups.panels',
2975
+ when: () => this.isReady() && this.hasKeyboardDismissTarget(),
2976
+ shortcuts: [
2977
+ {
2978
+ keys: ['escape'],
2979
+ title: '@task-management:task-board.shortcuts.dismiss-overlays',
2980
+ handler: () => this.handleKeyboardDismiss(),
2981
+ },
2982
+ ],
2983
+ });
2984
+ }
2985
+ registerTaskBoardViewCategoryShortcuts() {
2986
+ const categories = ['calendar', 'timeline', 'table', 'kanban'];
2987
+ const titleKeys = {
2988
+ calendar: '@task-management:task-board.shortcuts.switch-to-calendar',
2989
+ timeline: '@task-management:task-board.shortcuts.switch-to-timeline',
2990
+ table: '@task-management:task-board.shortcuts.switch-to-table',
2991
+ kanban: '@task-management:task-board.shortcuts.switch-to-kanban',
2992
+ };
2993
+ for (let index = 0; index < categories.length; index++) {
2994
+ for (const category of categories) {
2995
+ this.shortcutRegistry.register({
2996
+ owner: this.destroyRef,
2997
+ id: `task-board-view-category-${category}-slot-${index + 1}`,
2998
+ priority: AXPKeyboardShortcutPriority.Page,
2999
+ scope: '@task-management:task-board.page-title',
3000
+ group: '@task-management:task-board.shortcuts.groups.views',
3001
+ when: () => this.isReady() && this.getVisibleViewCategoryByShortcutIndex(index) === category,
3002
+ shortcuts: [
3003
+ {
3004
+ keys: [`alt+${index + 1}`],
3005
+ title: titleKeys[category],
3006
+ handler: () => this.switchToViewCategory(category),
3007
+ },
3008
+ ],
3009
+ });
3010
+ }
3011
+ }
3012
+ }
3013
+ registerTaskBoardViewLayoutShortcuts() {
3014
+ this.shortcutRegistry.register({
3015
+ owner: this.destroyRef,
3016
+ id: 'task-board-view-layout',
3017
+ priority: AXPKeyboardShortcutPriority.Page,
3018
+ scope: '@task-management:task-board.page-title',
3019
+ group: '@task-management:task-board.shortcuts.groups.views',
3020
+ when: () => this.isReady() && this.canCycleViewLayout(),
3021
+ shortcuts: [
3022
+ {
3023
+ keys: ['['],
3024
+ title: '@task-management:task-board.shortcuts.previous-layout',
3025
+ handler: () => this.cycleViewLayout(false),
3026
+ },
3027
+ {
3028
+ keys: [']'],
3029
+ title: '@task-management:task-board.shortcuts.next-layout',
3030
+ handler: () => this.cycleViewLayout(true),
3031
+ },
3032
+ ],
3033
+ });
3034
+ }
3035
+ getVisibleViewCategoryByShortcutIndex(index) {
3036
+ return this.vm.visibleViewCategories()[index] ?? null;
3037
+ }
3038
+ switchToViewCategory(category) {
3039
+ if (!this.vm.visibleViewCategories().includes(category)) {
3040
+ return;
3041
+ }
3042
+ if (this.vm.currentViewCategory() !== category) {
3043
+ this.applyViewCategory(category);
3044
+ }
3045
+ }
3046
+ canCycleViewLayout() {
3047
+ return this.showViewLayoutSwitcher() && this.viewLayoutItems().length > 1;
3048
+ }
3049
+ cycleViewLayout(forward) {
3050
+ const items = this.viewLayoutItems();
3051
+ if (items.length <= 1) {
3052
+ return;
3053
+ }
3054
+ const currentLayout = this.selectedViewLayout();
3055
+ const currentIndex = items.findIndex((item) => item.key === currentLayout);
3056
+ const safeIndex = currentIndex >= 0 ? currentIndex : 0;
3057
+ const offset = forward ? 1 : -1;
3058
+ const nextIndex = (safeIndex + offset + items.length) % items.length;
3059
+ this.handleViewLayoutChange(items[nextIndex].key);
3060
+ }
3061
+ hasKeyboardDismissTarget() {
3062
+ return (this.isSettingsPanelOpen() ||
3063
+ this.popover()?.isOpen === true ||
3064
+ this.vm.isDetailPanelOpen() ||
3065
+ this.vm.isTaskSelected());
3066
+ }
3067
+ handleKeyboardDismiss() {
3068
+ if (this.isSettingsPanelOpen()) {
3069
+ this.closeSettingsPanel();
3070
+ return;
3071
+ }
3072
+ if (this.popover()?.isOpen) {
3073
+ this.popover()?.close();
3074
+ return;
3075
+ }
3076
+ if (this.vm.isDetailPanelOpen()) {
3077
+ this.vm.closeDetailPanel();
3078
+ return;
3079
+ }
3080
+ if (this.vm.isTaskSelected()) {
3081
+ this.vm.clearSelectedTask();
3082
+ }
3083
+ }
3084
+ isModifierRangeNavigatorView() {
3085
+ return this.modifierRangeBasedViews.includes(this.vm.currentViewMode());
3086
+ }
3087
+ usesNavigatorRangeSelection(view) {
3088
+ if (this.alwaysRangeBasedViews.includes(view)) {
3089
+ return true;
3090
+ }
3091
+ if (this.modifierRangeBasedViews.includes(view)) {
3092
+ return this.vm.rangeStartDate() != null || this.vm.daysCount() > 1;
3093
+ }
3094
+ return false;
3095
+ }
3096
+ isNavigatorRangeModifierActive(event) {
3097
+ const nativeEvent = event?.nativeEvent;
3098
+ if (nativeEvent instanceof MouseEvent) {
3099
+ return nativeEvent.ctrlKey || nativeEvent.metaKey;
3100
+ }
3101
+ return this.navigatorRangeSelectActive();
3102
+ }
3103
+ normalizeNavigatorDay(date) {
3104
+ const calendarSystem = this.localeService.activeProfile().calendar.system;
3105
+ return this.calendarService.create(date, calendarSystem).startOf('day').date;
3106
+ }
3107
+ applyNavigatorDateRange(start, end) {
3108
+ const startTime = start.getTime();
3109
+ const endTime = end.getTime();
3110
+ const newStartDate = new Date(Math.min(startTime, endTime));
3111
+ const newEndDate = new Date(Math.max(startTime, endTime));
3112
+ const differenceInDays = this.calculateDifferenceInDays(newStartDate, newEndDate);
3113
+ this.vm.setRangeStartDate(null);
3114
+ this.navigatorPlainSingleDaySelected = false;
3115
+ this.vm.setCurrentDate(newStartDate);
3116
+ this.vm.setDaysCount(differenceInDays);
3117
+ this.calendar()?.render();
3118
+ this.schedulerComponent()?.refresh();
3119
+ }
3120
+ handleNavigatorRangeSlotClick(clickedDate) {
3121
+ const clickedDay = this.normalizeNavigatorDay(clickedDate);
3122
+ const selectionStartDate = this.vm.rangeStartDate();
3123
+ if (selectionStartDate) {
3124
+ this.applyNavigatorDateRange(selectionStartDate, clickedDay);
3125
+ return;
3126
+ }
3127
+ if (this.navigatorPlainSingleDaySelected && this.vm.daysCount() === 1) {
3128
+ const selectedDay = this.normalizeNavigatorDay(this.vm.currentDate());
3129
+ this.applyNavigatorDateRange(selectedDay, clickedDay);
3130
+ return;
3131
+ }
3132
+ this.vm.setRangeStartDate(clickedDay);
3133
+ this.navigatorPlainSingleDaySelected = false;
3134
+ this.calendar()?.render();
3135
+ }
3136
+ handleNavigatorSingleDaySlotClick(clickedDate) {
3137
+ const dateToSet = this.normalizeNavigatorDay(clickedDate);
3138
+ this.vm.setRangeStartDate(null);
3139
+ this.navigatorPlainSingleDaySelected = true;
3140
+ this.vm.setCurrentDate(dateToSet);
3141
+ this.vm.setDaysCount(1);
3142
+ this.popover()?.close();
3143
+ this.calendar()?.render();
3144
+ this.schedulerComponent()?.refresh();
3145
+ }
3146
+ changeDate(forward) {
3147
+ this.navigatorPlainSingleDaySelected = false;
3148
+ const date = this.calendarService.create(this.vm.currentDate(), this.localeService.activeProfile().calendar.system);
3149
+ switch (this.vm.currentViewMode()) {
3150
+ case 'day':
3151
+ case 'timeline-day':
3152
+ this.vm.setCurrentDate(date.add('day', forward ? 1 : -1).date);
3153
+ break;
3154
+ case 'week':
3155
+ this.vm.setCurrentDate(date.add('week', forward ? 1 : -1).date);
3156
+ break;
3157
+ case 'grid':
3158
+ case 'agenda':
3159
+ case 'kanban':
3160
+ case 'timeline-weekly':
3161
+ case 'status-grouped-grid':
3162
+ this.vm.setCurrentDate(date.add('day', forward ? this.vm.daysCount() : -this.vm.daysCount()).date);
3163
+ break;
3164
+ case 'month':
3165
+ case 'timeline-month':
3166
+ this.vm.setCurrentDate(date.add('month', forward ? 1 : -1).date);
3167
+ break;
3168
+ case 'timeline-year':
3169
+ this.vm.setCurrentDate(date.add('year', forward ? 1 : -1).date);
3170
+ break;
3171
+ }
3172
+ this.popover()?.close();
3173
+ this.calendar()?.render();
3174
+ this.schedulerComponent()?.refresh();
3175
+ }
3176
+ handleCalendarSlotClick(event) {
3177
+ if (event.component.activeView !== event.component.depth)
3178
+ return;
3179
+ const clickedDate = event.item;
3180
+ const currentView = this.vm.currentViewMode();
3181
+ if (this.modifierRangeBasedViews.includes(currentView)) {
3182
+ if (this.isNavigatorRangeModifierActive(event)) {
3183
+ this.handleNavigatorRangeSlotClick(clickedDate);
3184
+ }
3185
+ else {
3186
+ this.handleNavigatorSingleDaySlotClick(clickedDate);
3187
+ }
3188
+ return;
3189
+ }
3190
+ if (this.alwaysRangeBasedViews.includes(currentView)) {
3191
+ this.handleNavigatorRangeSlotClick(clickedDate);
3192
+ return;
3193
+ }
3194
+ const calendarSystem = this.localeService.activeProfile().calendar.system;
3195
+ let dateToSet = this.calendarService.create(clickedDate, calendarSystem).startOf('day').date;
3196
+ if (currentView === 'week') {
3197
+ const weekDate = this.calendarService.create(dateToSet, calendarSystem);
3198
+ dateToSet = weekDate.startOf('week').date;
3199
+ }
3200
+ this.vm.setCurrentDate(dateToSet);
3201
+ this.popover()?.close();
3202
+ this.calendar()?.render();
3203
+ this.schedulerComponent()?.refresh();
3204
+ }
3205
+ /**
3206
+ * Helper function to calculate the difference in whole days between two dates.
3207
+ * The result is inclusive (e.g., May 5 to May 6 is a 2-day range).
3208
+ */
3209
+ calculateDifferenceInDays(start, end) {
3210
+ if (!start || !end) {
3211
+ return 1;
3212
+ }
3213
+ const startDate = new Date(start.getFullYear(), start.getMonth(), start.getDate());
3214
+ const endDate = new Date(end.getFullYear(), end.getMonth(), end.getDate());
3215
+ const timeDifference = endDate.getTime() - startDate.getTime();
3216
+ const daysDifference = Math.round(timeDifference / (1000 * 3600 * 24));
3217
+ return daysDifference + 1;
3218
+ }
3219
+ handleTodayClick() {
3220
+ this.vm.setRangeStartDate(null);
3221
+ this.navigatorPlainSingleDaySelected = false;
3222
+ let currentDate;
3223
+ if (this.vm.currentViewMode() === 'week') {
3224
+ currentDate = this.calendarService
3225
+ .create(new Date(), this.localeService.activeProfile().calendar.system)
3226
+ .startOf('week').date;
3227
+ }
3228
+ else {
3229
+ currentDate = new Date();
3230
+ }
3231
+ this.vm.setCurrentDate(currentDate);
3232
+ if (this.isModifierRangeNavigatorView()) {
3233
+ this.vm.setDaysCount(1);
3234
+ }
3235
+ this.popover()?.close();
3236
+ this.calendar()?.render();
3237
+ this.schedulerComponent()?.refresh();
3238
+ }
3239
+ async loadFromRoute() {
3240
+ const snapshot = this.activatedRoute.snapshot.queryParamMap;
3241
+ const viewParam = snapshot.get('view');
3242
+ const layoutParam = snapshot.get('layout');
3243
+ const allowedCategories = new Set(this.vm.visibleViewCategories());
3244
+ const viewBefore = this.vm.currentViewCategory();
3245
+ const layoutBefore = this.vm.getLayoutForCategory(viewBefore);
3246
+ if (viewParam && allowedCategories.has(viewParam)) {
3247
+ const category = viewParam;
3248
+ const layout = resolveTaskBoardCategoryLayoutFromQuery(category, layoutParam);
3249
+ if (layout) {
3250
+ this.vm.setViewLayout(category, layout);
3251
+ }
3252
+ this.vm.setViewCategory(category);
3253
+ }
3254
+ const layoutAfter = this.vm.getLayoutForCategory(this.vm.currentViewCategory());
3255
+ if (viewBefore !== this.vm.currentViewCategory() || layoutBefore !== layoutAfter) {
3256
+ this.recompute();
3257
+ }
3258
+ const type = snapshot.getAll('type');
3259
+ const assignee = snapshot.getAll('assignee');
3260
+ const reporter = snapshot.getAll('reporter');
3261
+ const priority = snapshot.getAll('priority');
3262
+ const dueStatus = snapshot.getAll('dueStatus');
3263
+ if (type.length || assignee.length || priority.length || reporter.length || dueStatus.length) {
3264
+ this.isQueryParam.set(true);
3265
+ this.vm.setSelectedTaskTypeNames(normalizeTaskTypeFilterNames(type, this.vm.taskTypes()), true);
3266
+ this.vm.setSelectedAssigneeIds(assignee, true);
3267
+ this.vm.setSelectedReporterIds(reporter, true);
3268
+ this.vm.setSelectedPriorities(normalizeTaskBoardPriorityFilterKeys(priority), true);
3269
+ this.vm.setSelectedDueStatusKeys(normalizeDueStatusFilterKeys(dueStatus), true);
3270
+ }
3271
+ const dateRange = snapshot.get('dateRange');
3272
+ if (dateRange) {
3273
+ const range = this.taskBoardService.rangeCalculator(dateRange);
3274
+ if (range) {
3275
+ this.vm.setCurrentDate(range.from);
3276
+ this.vm.setDaysCount(this.calculateDifferenceInDays(range.from, range.end));
3277
+ }
3278
+ }
3279
+ else if (!this.filtersPanelInitialized && this.isModifierRangeNavigatorView()) {
3280
+ this.vm.setRangeStartDate(null);
3281
+ this.navigatorPlainSingleDaySelected = false;
3282
+ this.vm.setDaysCount(1);
3283
+ }
3284
+ await this.syncPanelInitialFilters();
3285
+ this.filtersPanelInitialized = true;
3286
+ }
3287
+ /**
3288
+ * Checks if the currently selected task is still present in the list of visible tasks.
3289
+ * If not, it clears the selection to prevent showing details for a hidden task.
3290
+ * @param visibleTasks The new array of tasks that will be displayed.
3291
+ */
3292
+ validateSelectedTask(visibleTasks) {
3293
+ const currentSelectedTask = this.vm.selectedTask();
3294
+ // Proceed only if a task is actually selected
3295
+ if (currentSelectedTask) {
3296
+ // Check if any task in the new list has the same ID as the selected one
3297
+ const isSelectedTaskVisible = visibleTasks.some((task) => task.id === currentSelectedTask.id);
3298
+ // If the selected task is NOT in the new list, clear the selection.
3299
+ if (!isSelectedTaskVisible) {
3300
+ this.vm.selectTask(null);
3301
+ }
3302
+ }
3303
+ }
3304
+ async getResources() {
3305
+ if (this.vm.selectedTaskTypeNames().length !== 1) {
3306
+ this.resources.set([]);
3307
+ return;
3308
+ }
3309
+ const resources = await this.taskBoardService.getResources(this.vm.selectedTaskTypeNames()[0] ?? '');
3310
+ this.resources.set(resources);
3311
+ }
3312
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardPage, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
3313
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardPage, isStandalone: true, selector: "ng-component", host: { listeners: { "document:keydown.control": "handleNavigatorRangeModifierDown()", "document:keyup.control": "handleNavigatorRangeModifierUp()" } }, providers: [
3314
+ {
3315
+ provide: AXPPageLayoutBase,
3316
+ useExisting: AXMTaskBoardPage,
3317
+ },
3318
+ ], viewQueries: [{ propertyName: "popover", first: true, predicate: ["popover"], descendants: true, isSignal: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], 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-page-toolbar class=\"axm-task-board-toolbar\"\n [class.axm-task-board-toolbar--stack-filters]=\"!deviceService.isLarge()\">\n <div class=\"axm-task-board-toolbar__primary-row\">\n <axp-layout-prefix class=\"ax-flex ax-min-w-0 ax-flex-nowrap ax-items-center ax-gap-2\"\n [class.ax-flex-1]=\"deviceService.isLarge()\">\n @if (showToolbarNavigator()) {\n <div class=\"ax-scheduler-header ax-shrink-0 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]=\"navigatorTimeText()\" #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 <!-- TODO(acorex-ui): Do not wrap ax-calendar in @for/@if here \u2014 ax-popover requires a direct projected child.\n Week layout comes from AXCalendarService (AXPRegionalCalendarService); navigatorCalendarLayoutEffect re-renders on profile/calendar changes.\n Remove manual render() when ax-calendar reacts to calendar service week layout changes.\n See README.md in this folder. -->\n <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <ax-calendar #calendar [type]=\"calendarType()\" [depth]=\"calendarDepth()\" [cellClass]=\"getCellClass\"\n [ngModel]=\"currentDateForCalendar()\" [dayCellTemplate]=\"dayCellTemplate\"\n [monthCellTemplate]=\"monthCellTemplate\"\n class=\"ax-single-range-calendar ax-border ax-rounded-lg\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\">\n <ax-footer>\n <ax-button look=\"link\" color=\"primary\" [text]=\"(todayButtonTextKey() | translate | async)!\"\n (onClick)=\"handleTodayClick()\"></ax-button>\n </ax-footer>\n </ax-calendar>\n </ax-popover>\n </div>\n }\n\n @if (deviceService.isLarge() && filtersReady()) {\n <axp-query-filters class=\"axm-task-board-toolbar__filters-inline\" [filtersDefinitions]=\"filterDefinitions()\"\n [initialFilters]=\"panelInitialFilters()\" (onFiltersChanged)=\"handleFiltersChanged($event)\"></axp-query-filters>\n }\n </axp-layout-prefix>\n\n <axp-layout-suffix class=\"ax-flex ax-shrink-0 ax-gap-2\">\n @if (showViewLayoutSwitcher()) {\n <ax-button class=\"axm-task-board-toolbar__view-layout-dropdown\" look=\"outline\"\n [text]=\"(selectedViewLayoutTitleKey() | translate | async)!\">\n <ax-prefix>\n <ax-icon [icon]=\"selectedViewLayoutIcon()\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (item of viewLayoutItems(); track item.key) {\n <ax-button-item [text]=\"(viewLayoutTranslationKey(item.text) | translate | async)!\"\n (onClick)=\"handleViewLayoutChange(item.key)\">\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-check\" class=\"axm-task-board-toolbar__dropdown-menu-check\"\n [class.--placeholder]=\"!isViewLayoutSelected(item.key)\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n <div class=\"axm-task-board-toolbar__settings-slot\">\n <ax-button class=\"axm-task-board-toolbar__settings-button\" look=\"outline\" [iconOnly]=\"true\"\n [title]=\"('@task-management:task-board.settings.title' | translate | async)!\"\n (onClick)=\"toggleSettingsPanel()\">\n <ax-prefix>\n <ax-icon [icon]=\"isSettingsPanelOpen() ? 'fa-solid fa-gear' : 'fa-light fa-gear'\"></ax-icon>\n </ax-prefix>\n </ax-button>\n @if (selectedCalendarEventTypeCount() > 0) {\n <div class=\"axm-task-board-toolbar__settings-badge\" [class.--xs]=\"selectedCalendarEventTypeCount() > 9\">\n <ax-badge color=\"primary\" [text]=\"selectedCalendarEventTypeCount().toString()\"></ax-badge>\n </div>\n }\n </div>\n </axp-layout-suffix>\n </div>\n\n @if (!deviceService.isLarge() && filtersReady()) {\n <div class=\"axm-task-board-toolbar__filters-row\">\n <axp-query-filters [filtersDefinitions]=\"filterDefinitions()\" [initialFilters]=\"panelInitialFilters()\"\n (onFiltersChanged)=\"handleFiltersChanged($event)\"></axp-query-filters>\n </div>\n }\n </axp-page-toolbar>\n\n <axp-page-content class=\"ax-flex ax-flex-row ax-gap-2 ax-min-h-0\">\n <div class=\"axm-task-board-main ax-flex ax-flex-row ax-gap-4 ax-flex-1 ax-min-w-0 ax-min-h-0 ax-relative\">\n <div class=\"axm-task-board-main__content ax-flex ax-flex-row ax-gap-2 ax-flex-1 ax-min-w-0 ax-min-h-0\">\n @if (isReady()) {\n @switch (vm.currentViewMode()) {\n @case ('kanban') {\n <axm-task-board-kanban-view class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\" [(tasks)]=\"resolvedTasks\"\n (onTaskClick)=\"vm.selectTask($event)\" (onActionClick)=\"handleContextMenu($event)\"></axm-task-board-kanban-view>\n }\n @case ('grid') {\n <axm-task-board-grid-view class=\"ax-h-full ax-w-full ax-min-w-0\" [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\" (onTaskClick)=\"vm.selectTask($event)\"></axm-task-board-grid-view>\n }\n @case ('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\" [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"></axm-task-board-status-grouped-grid-view>\n }\n @default {\n <axm-task-board-calendar-view class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\" [startingDate]=\"vm.currentDate()\" [dataSource]=\"schedulerDataSource\"\n [refreshNonce]=\"refreshNonce()\" (onTaskClick)=\"vm.selectTask($event)\" [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\" (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"></axm-task-board-calendar-view>\n }\n }\n <ax-context-menu #rootContextMenu [closeOn]=\"'leave'\" [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\" (onItemClick)=\"handleContextMenuItemClick($event)\">\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n }\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 </div>\n @if (isSettingsPanelOpen()) {\n @if (!deviceService.isLarge()) {\n <button type=\"button\" class=\"axm-task-board-settings-backdrop\" (click)=\"closeSettingsPanel()\"\n [attr.aria-label]=\"('@general:actions.close.title' | translate | async)!\"></button>\n }\n <axp-layout-side-detail-panel class=\"ax-sticky ax-top-0 ax-z-10 ax-max-h-full ax-flex-none\"\n [class.axm-task-board-settings-panel--overlay]=\"!deviceService.isLarge()\" [header]=\"settingsPanelHeader()\"\n [sections]=\"settingsPanelSections()\" (panelClose)=\"closeSettingsPanel()\">\n <ng-template axpLayoutSideDetailPanelSection=\"colorBy\">\n <ax-selection-list class=\"ax-w-full\" valueField=\"key\" textField=\"titleKey\" [direction]=\"'vertical'\"\n [look]=\"'solid'\" [multiple]=\"false\" [items]=\"colorByItems\" [ngModel]=\"effectiveColorBy()\"\n [customTemplate]=\"colorByItemTemplate\" (onValueChanged)=\"handleColorBySelectionChange($event)\">\n <ng-template #colorByItemTemplate let-item>\n {{ (item.data.titleKey | translate | async)! }}\n </ng-template>\n </ax-selection-list>\n </ng-template>\n @if (showCalendarEventButton()) {\n <ng-template axpLayoutSideDetailPanelSection=\"calendars\">\n <ax-selection-list class=\"ax-w-full\" valueField=\"id\" textField=\"text\" [direction]=\"'vertical'\"\n [look]=\"'solid'\" [multiple]=\"true\" [items]=\"calendarEventTypeItems()\"\n [ngModel]=\"vm.selectedCalendarEventTypeIds()\"\n (onValueChanged)=\"handleCalendarEventTypesSelectionChange($event)\"></ax-selection-list>\n </ng-template>\n }\n </axp-layout-side-detail-panel>\n }\n </div>\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #dayCellTemplate let-slot>\n <div 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 <span class=\"ax-flex-1 ax-text-center\">\n @if (isDateTimeTranslationKey(slot.slot.text)) {\n {{ (toAcorexTranslationKey(slot.slot.text) | translate | async)! }}\n } @else {\n {{ slot.slot.text ?? slot.slot.date?.day ?? '' }}\n }\n </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 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 <span class=\"ax-flex-1 ax-text-center\">\n @if (isDateTimeTranslationKey(slot.slot.text)) {\n {{ (toAcorexTranslationKey(slot.slot.text) | translate | async)! }}\n } @else {\n {{ slot.slot.text ?? '' }}\n }\n </span>\n @if (slot.slot.date && getMonthDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>", styles: [".axm-task-board-toolbar{flex-wrap:nowrap}.axm-task-board-toolbar__primary-row{display:flex;flex:1 1 auto;align-items:center;gap:.5rem;min-width:0;width:100%;flex-wrap:nowrap}.axm-task-board-toolbar__primary-row>axp-layout-prefix{flex-wrap:nowrap}.axm-task-board-toolbar__primary-row>axp-layout-suffix{margin-inline-start:auto;flex-shrink:0}.axm-task-board-toolbar:not(.axm-task-board-toolbar--stack-filters) .axm-task-board-toolbar__primary-row{display:contents}.axm-task-board-toolbar__filters-inline,.axm-task-board-toolbar__filters-row axp-query-filters{flex:1 1 0;min-width:0;width:auto}.axm-task-board-toolbar__filters-inline>.ax-flex,.axm-task-board-toolbar__filters-row axp-query-filters>.ax-flex{padding-top:0;padding-bottom:0}.axm-task-board-toolbar--stack-filters{flex-wrap:wrap;row-gap:.5rem}.axm-task-board-toolbar--stack-filters .axm-task-board-toolbar__primary-row{flex:1 1 100%;width:100%}.axm-task-board-toolbar__filters-row{flex:1 1 100%;width:100%;min-width:0}.axm-task-board-toolbar__view-layout-dropdown,.axm-task-board-toolbar__settings-slot{flex-shrink:0}.axm-task-board-toolbar__settings-slot{position:relative}.axm-task-board-toolbar__settings-badge{position:absolute;top:-.25rem;inset-inline-end:-.25rem;pointer-events:none}.axm-task-board-toolbar__settings-badge.--xs ax-badge{font-size:.625rem}.axm-task-board-toolbar__dropdown-menu-check{display:inline-flex;width:1rem;justify-content:center}.axm-task-board-toolbar__dropdown-menu-check.--placeholder{visibility:hidden}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)}.axm-task-board-main,.axm-task-board-main__content{min-height:0}.axm-task-board-settings-backdrop{position:fixed;inset:0;z-index:15;border:none;padding:0;cursor:pointer;background:rgba(var(--ax-sys-color-darkest-surface),.45)}.axm-task-board-settings-panel--overlay{position:fixed;top:0;inset-inline-end:0;bottom:0;z-index:20;width:min(20rem,100vw);max-height:100vh}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$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
3319
+ //
3320
+ AXMenuModule }, { kind: "component", type: i2.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "closeOnRouteChange", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$3.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: i1$3.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1$3.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i3.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.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: "component", type:
3321
+ //
3322
+ 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: AXPQueryFiltersComponent, selector: "axp-query-filters", inputs: ["filtersDefinitions", "initialFilters"], outputs: ["onFiltersChanged"] }, { 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: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i9.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { 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", "look"], outputs: ["onOptionChanged", "valueChange", "onValueChanged", "minValueChange", "maxValueChange", "onBlur", "onFocus", "depthChange", "typeChange", "activeViewChange", "disabledDatesChange", "holidayDatesChange", "onNavigate", "onSlotClick", "countChange"] }, { 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: AXPLayoutSideDetailPanelComponent, selector: "axp-layout-side-detail-panel", inputs: ["multiSelectLabel", "header", "sections", "rows", "rowsSectionTitle", "noRowsMessage", "emptyState"], outputs: ["panelClose"] }, { kind: "directive", type: AXPLayoutSideDetailPanelSectionDirective, selector: "[axpLayoutSideDetailPanelSection]", inputs: ["axpLayoutSideDetailPanelSection"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3323
+ }
3324
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardPage, decorators: [{
3325
+ type: Component,
3326
+ args: [{ imports: [
3327
+ FormsModule,
3328
+ CommonModule,
3329
+ RouterModule,
3330
+ //
3331
+ AXMenuModule,
3332
+ AXButtonModule,
3333
+ AXDropdownModule,
3334
+ AXTranslationModule,
3335
+ AXDecoratorModule,
3336
+ AXLoadingModule,
3337
+ AXBreadcrumbsModule,
3338
+ AXBadgeModule,
3339
+ //
3340
+ AXPThemeLayoutBlockComponent,
3341
+ AXPPageLayoutComponent,
3342
+ AXPQueryFiltersComponent,
3343
+ AXMTaskBoardCalendarViewComponent,
3344
+ AXMTaskBoardKanbanViewComponent,
3345
+ AXMTaskBoardGridViewComponent,
3346
+ AXMTaskBoardStatusGroupedGridViewComponent,
3347
+ AXMTaskBoardDetailPanel,
3348
+ AXPopoverModule,
3349
+ AXCalendarComponent,
3350
+ AXSelectionListModule,
3351
+ AXPLayoutSideDetailPanelComponent,
3352
+ AXPLayoutSideDetailPanelSectionDirective,
3353
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
3354
+ {
3355
+ provide: AXPPageLayoutBase,
3356
+ useExisting: AXMTaskBoardPage,
3357
+ },
3358
+ ], template: "<axp-page-layout *translate=\"let t\">\n <axp-page-toolbar class=\"axm-task-board-toolbar\"\n [class.axm-task-board-toolbar--stack-filters]=\"!deviceService.isLarge()\">\n <div class=\"axm-task-board-toolbar__primary-row\">\n <axp-layout-prefix class=\"ax-flex ax-min-w-0 ax-flex-nowrap ax-items-center ax-gap-2\"\n [class.ax-flex-1]=\"deviceService.isLarge()\">\n @if (showToolbarNavigator()) {\n <div class=\"ax-scheduler-header ax-shrink-0 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]=\"navigatorTimeText()\" #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 <!-- TODO(acorex-ui): Do not wrap ax-calendar in @for/@if here \u2014 ax-popover requires a direct projected child.\n Week layout comes from AXCalendarService (AXPRegionalCalendarService); navigatorCalendarLayoutEffect re-renders on profile/calendar changes.\n Remove manual render() when ax-calendar reacts to calendar service week layout changes.\n See README.md in this folder. -->\n <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <ax-calendar #calendar [type]=\"calendarType()\" [depth]=\"calendarDepth()\" [cellClass]=\"getCellClass\"\n [ngModel]=\"currentDateForCalendar()\" [dayCellTemplate]=\"dayCellTemplate\"\n [monthCellTemplate]=\"monthCellTemplate\"\n class=\"ax-single-range-calendar ax-border ax-rounded-lg\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\">\n <ax-footer>\n <ax-button look=\"link\" color=\"primary\" [text]=\"(todayButtonTextKey() | translate | async)!\"\n (onClick)=\"handleTodayClick()\"></ax-button>\n </ax-footer>\n </ax-calendar>\n </ax-popover>\n </div>\n }\n\n @if (deviceService.isLarge() && filtersReady()) {\n <axp-query-filters class=\"axm-task-board-toolbar__filters-inline\" [filtersDefinitions]=\"filterDefinitions()\"\n [initialFilters]=\"panelInitialFilters()\" (onFiltersChanged)=\"handleFiltersChanged($event)\"></axp-query-filters>\n }\n </axp-layout-prefix>\n\n <axp-layout-suffix class=\"ax-flex ax-shrink-0 ax-gap-2\">\n @if (showViewLayoutSwitcher()) {\n <ax-button class=\"axm-task-board-toolbar__view-layout-dropdown\" look=\"outline\"\n [text]=\"(selectedViewLayoutTitleKey() | translate | async)!\">\n <ax-prefix>\n <ax-icon [icon]=\"selectedViewLayoutIcon()\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (item of viewLayoutItems(); track item.key) {\n <ax-button-item [text]=\"(viewLayoutTranslationKey(item.text) | translate | async)!\"\n (onClick)=\"handleViewLayoutChange(item.key)\">\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-check\" class=\"axm-task-board-toolbar__dropdown-menu-check\"\n [class.--placeholder]=\"!isViewLayoutSelected(item.key)\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n }\n <div class=\"axm-task-board-toolbar__settings-slot\">\n <ax-button class=\"axm-task-board-toolbar__settings-button\" look=\"outline\" [iconOnly]=\"true\"\n [title]=\"('@task-management:task-board.settings.title' | translate | async)!\"\n (onClick)=\"toggleSettingsPanel()\">\n <ax-prefix>\n <ax-icon [icon]=\"isSettingsPanelOpen() ? 'fa-solid fa-gear' : 'fa-light fa-gear'\"></ax-icon>\n </ax-prefix>\n </ax-button>\n @if (selectedCalendarEventTypeCount() > 0) {\n <div class=\"axm-task-board-toolbar__settings-badge\" [class.--xs]=\"selectedCalendarEventTypeCount() > 9\">\n <ax-badge color=\"primary\" [text]=\"selectedCalendarEventTypeCount().toString()\"></ax-badge>\n </div>\n }\n </div>\n </axp-layout-suffix>\n </div>\n\n @if (!deviceService.isLarge() && filtersReady()) {\n <div class=\"axm-task-board-toolbar__filters-row\">\n <axp-query-filters [filtersDefinitions]=\"filterDefinitions()\" [initialFilters]=\"panelInitialFilters()\"\n (onFiltersChanged)=\"handleFiltersChanged($event)\"></axp-query-filters>\n </div>\n }\n </axp-page-toolbar>\n\n <axp-page-content class=\"ax-flex ax-flex-row ax-gap-2 ax-min-h-0\">\n <div class=\"axm-task-board-main ax-flex ax-flex-row ax-gap-4 ax-flex-1 ax-min-w-0 ax-min-h-0 ax-relative\">\n <div class=\"axm-task-board-main__content ax-flex ax-flex-row ax-gap-2 ax-flex-1 ax-min-w-0 ax-min-h-0\">\n @if (isReady()) {\n @switch (vm.currentViewMode()) {\n @case ('kanban') {\n <axm-task-board-kanban-view class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\" [(tasks)]=\"resolvedTasks\"\n (onTaskClick)=\"vm.selectTask($event)\" (onActionClick)=\"handleContextMenu($event)\"></axm-task-board-kanban-view>\n }\n @case ('grid') {\n <axm-task-board-grid-view class=\"ax-h-full ax-w-full ax-min-w-0\" [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\" (onTaskClick)=\"vm.selectTask($event)\"></axm-task-board-grid-view>\n }\n @case ('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\" [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"></axm-task-board-status-grouped-grid-view>\n }\n @default {\n <axm-task-board-calendar-view class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\" [startingDate]=\"vm.currentDate()\" [dataSource]=\"schedulerDataSource\"\n [refreshNonce]=\"refreshNonce()\" (onTaskClick)=\"vm.selectTask($event)\" [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\" (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"></axm-task-board-calendar-view>\n }\n }\n <ax-context-menu #rootContextMenu [closeOn]=\"'leave'\" [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\" (onItemClick)=\"handleContextMenuItemClick($event)\">\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n }\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 </div>\n @if (isSettingsPanelOpen()) {\n @if (!deviceService.isLarge()) {\n <button type=\"button\" class=\"axm-task-board-settings-backdrop\" (click)=\"closeSettingsPanel()\"\n [attr.aria-label]=\"('@general:actions.close.title' | translate | async)!\"></button>\n }\n <axp-layout-side-detail-panel class=\"ax-sticky ax-top-0 ax-z-10 ax-max-h-full ax-flex-none\"\n [class.axm-task-board-settings-panel--overlay]=\"!deviceService.isLarge()\" [header]=\"settingsPanelHeader()\"\n [sections]=\"settingsPanelSections()\" (panelClose)=\"closeSettingsPanel()\">\n <ng-template axpLayoutSideDetailPanelSection=\"colorBy\">\n <ax-selection-list class=\"ax-w-full\" valueField=\"key\" textField=\"titleKey\" [direction]=\"'vertical'\"\n [look]=\"'solid'\" [multiple]=\"false\" [items]=\"colorByItems\" [ngModel]=\"effectiveColorBy()\"\n [customTemplate]=\"colorByItemTemplate\" (onValueChanged)=\"handleColorBySelectionChange($event)\">\n <ng-template #colorByItemTemplate let-item>\n {{ (item.data.titleKey | translate | async)! }}\n </ng-template>\n </ax-selection-list>\n </ng-template>\n @if (showCalendarEventButton()) {\n <ng-template axpLayoutSideDetailPanelSection=\"calendars\">\n <ax-selection-list class=\"ax-w-full\" valueField=\"id\" textField=\"text\" [direction]=\"'vertical'\"\n [look]=\"'solid'\" [multiple]=\"true\" [items]=\"calendarEventTypeItems()\"\n [ngModel]=\"vm.selectedCalendarEventTypeIds()\"\n (onValueChanged)=\"handleCalendarEventTypesSelectionChange($event)\"></ax-selection-list>\n </ng-template>\n }\n </axp-layout-side-detail-panel>\n }\n </div>\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #dayCellTemplate let-slot>\n <div 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 <span class=\"ax-flex-1 ax-text-center\">\n @if (isDateTimeTranslationKey(slot.slot.text)) {\n {{ (toAcorexTranslationKey(slot.slot.text) | translate | async)! }}\n } @else {\n {{ slot.slot.text ?? slot.slot.date?.day ?? '' }}\n }\n </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 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 <span class=\"ax-flex-1 ax-text-center\">\n @if (isDateTimeTranslationKey(slot.slot.text)) {\n {{ (toAcorexTranslationKey(slot.slot.text) | translate | async)! }}\n } @else {\n {{ slot.slot.text ?? '' }}\n }\n </span>\n @if (slot.slot.date && getMonthDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>", styles: [".axm-task-board-toolbar{flex-wrap:nowrap}.axm-task-board-toolbar__primary-row{display:flex;flex:1 1 auto;align-items:center;gap:.5rem;min-width:0;width:100%;flex-wrap:nowrap}.axm-task-board-toolbar__primary-row>axp-layout-prefix{flex-wrap:nowrap}.axm-task-board-toolbar__primary-row>axp-layout-suffix{margin-inline-start:auto;flex-shrink:0}.axm-task-board-toolbar:not(.axm-task-board-toolbar--stack-filters) .axm-task-board-toolbar__primary-row{display:contents}.axm-task-board-toolbar__filters-inline,.axm-task-board-toolbar__filters-row axp-query-filters{flex:1 1 0;min-width:0;width:auto}.axm-task-board-toolbar__filters-inline>.ax-flex,.axm-task-board-toolbar__filters-row axp-query-filters>.ax-flex{padding-top:0;padding-bottom:0}.axm-task-board-toolbar--stack-filters{flex-wrap:wrap;row-gap:.5rem}.axm-task-board-toolbar--stack-filters .axm-task-board-toolbar__primary-row{flex:1 1 100%;width:100%}.axm-task-board-toolbar__filters-row{flex:1 1 100%;width:100%;min-width:0}.axm-task-board-toolbar__view-layout-dropdown,.axm-task-board-toolbar__settings-slot{flex-shrink:0}.axm-task-board-toolbar__settings-slot{position:relative}.axm-task-board-toolbar__settings-badge{position:absolute;top:-.25rem;inset-inline-end:-.25rem;pointer-events:none}.axm-task-board-toolbar__settings-badge.--xs ax-badge{font-size:.625rem}.axm-task-board-toolbar__dropdown-menu-check{display:inline-flex;width:1rem;justify-content:center}.axm-task-board-toolbar__dropdown-menu-check.--placeholder{visibility:hidden}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)}.axm-task-board-main,.axm-task-board-main__content{min-height:0}.axm-task-board-settings-backdrop{position:fixed;inset:0;z-index:15;border:none;padding:0;cursor:pointer;background:rgba(var(--ax-sys-color-darkest-surface),.45)}.axm-task-board-settings-panel--overlay{position:fixed;top:0;inset-inline-end:0;bottom:0;z-index:20;width:min(20rem,100vw);max-height:100vh}axp-page-content:not(:has(axm-task-board-status-grouped-grid-view,axm-task-board-time-grouped-grid-view)){overflow-y:hidden}\n"] }]
3359
+ }], propDecorators: { popover: [{ type: i0.ViewChild, args: ['popover', { isSignal: true }] }], calendar: [{ type: i0.ViewChild, args: ['calendar', { isSignal: true }] }], contextMenu: [{ type: i0.ViewChild, args: ['rootContextMenu', { isSignal: true }] }], handleNavigatorRangeModifierDown: [{
3360
+ type: HostListener,
3361
+ args: ['document:keydown.control']
3362
+ }], handleNavigatorRangeModifierUp: [{
3363
+ type: HostListener,
3364
+ args: ['document:keyup.control']
3365
+ }] } });
3366
+
3367
+ export { AXMTaskBoardPage };
3368
+ //# sourceMappingURL=acorex-modules-task-management-task-board.page-Brgg9wJa.mjs.map