@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
@@ -1,2284 +0,0 @@
1
- import * as i9 from '@acorex/cdk/accordion';
2
- import { AXAccordionCdkModule } from '@acorex/cdk/accordion';
3
- import { AXAccordionModule } from '@acorex/components/accordion';
4
- import * as i8 from '@acorex/components/badge';
5
- import { AXBadgeModule } from '@acorex/components/badge';
6
- import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
7
- import * as i1$4 from '@acorex/components/button';
8
- import { AXButtonComponent, AXButtonModule } from '@acorex/components/button';
9
- import { AXCalendarComponent } from '@acorex/components/calendar';
10
- import { AXCheckBoxModule } from '@acorex/components/check-box';
11
- import * as i2 from '@acorex/components/decorators';
12
- import { AXDecoratorIconComponent, AXDecoratorModule } from '@acorex/components/decorators';
13
- import { AXDropdownPanelComponent } from '@acorex/components/dropdown';
14
- import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
15
- import { AXFormFieldComponent, AXFormComponent, AXFormModule } from '@acorex/components/form';
16
- import { AXLabelComponent, AXLabelModule } from '@acorex/components/label';
17
- import * as i7 from '@acorex/components/loading';
18
- import { AXLoadingModule } from '@acorex/components/loading';
19
- import * as i3 from '@acorex/components/menu';
20
- import { AXMenuModule } from '@acorex/components/menu';
21
- import { AXPopoverModule } from '@acorex/components/popover';
22
- import * as i10 from '@acorex/components/selection-list';
23
- import { AXSelectionListModule } from '@acorex/components/selection-list';
24
- import { AXCalendarService } from '@acorex/core/date-time';
25
- import { AXLocaleService } from '@acorex/core/locale';
26
- import * as i5 from '@acorex/core/translation';
27
- import { AXTranslatorPipe, AXTranslationModule } from '@acorex/core/translation';
28
- import { AXUnsubscriber } from '@acorex/core/utils';
29
- import { AXPPlatformScope, AXPDeviceService, getActionButton } from '@acorex/platform/core';
30
- import { AXPStateMessageComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutHeaderComponent } from '@acorex/platform/layout/components';
31
- import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPageLayoutBase } from '@acorex/platform/layout/views';
32
- import * as i1$1 from '@angular/common';
33
- import { AsyncPipe, CommonModule } from '@angular/common';
34
- import * as i0 from '@angular/core';
35
- import { computed, inject, signal, effect, ViewEncapsulation, ChangeDetectionStrategy, Component, input, output, DestroyRef, viewChild, untracked, afterNextRender, model, viewChildren } from '@angular/core';
36
- import * as i1$3 from '@angular/forms';
37
- import { FormsModule } from '@angular/forms';
38
- import { Router, ActivatedRoute, NavigationEnd, RouterModule } from '@angular/router';
39
- import { filter, startWith } from 'rxjs';
40
- import { A as AXM_TASK_BOARD_ALL_VIEW_MODE_IDS, a as AXMTaskBoardSettings, n as normalizeTaskBoardAssigneeIds, b as normalizeVisibleTaskBoardModesByParts, c as canViewAllTaskAssignees, h as hasTaskBoardSavedAssigneePreference, r as resolveTaskBoardSavedAssigneeIds, d as AXPTaskBoardService, R as RootConfig, e as AXMTaskBoardTaskPopoverOverlayService, T as TASK_BOARD_GRID_ROW_ACTION_COLUMN_WIDTH, f as TASK_BOARD_GRID_ROW_ACTION_ITEMS, g as filterTasksOverlappingRange } from './acorex-modules-task-management-acorex-modules-task-management-BB7eeaYX.mjs';
41
- import { AXFormatPipe } from '@acorex/core/format';
42
- import * as i1 from '@acorex/platform/layout/widget-core';
43
- import { AXPWidgetCoreModule, AXPWidgetsCatalog } from '@acorex/platform/layout/widget-core';
44
- import { AXPSessionService } from '@acorex/platform/auth';
45
- import { AXPSettingsService } from '@acorex/platform/common';
46
- import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
47
- import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
48
- import { isEqual, sortBy } from 'lodash-es';
49
- import { AXSchedulerService, AXSchedulerComponent } from '@acorex/components/scheduler';
50
- import { AXPCommandService } from '@acorex/platform/runtime';
51
- import { AXDataSource } from '@acorex/cdk/common';
52
- import * as i1$2 from '@acorex/components/data-table';
53
- import { AXDataTableModule } from '@acorex/components/data-table';
54
- import { AXKanbanComponent } from '@acorex/components/kanban';
55
-
56
- const AXMTaskBoardViewModel = signalStore({ providedIn: 'root' }, withState(() => ({
57
- daysCount: 7,
58
- taskTypes: [],
59
- isLoading: true,
60
- detailPanel: false,
61
- selectedTask: null,
62
- rangeStartDate: null,
63
- currentDate: new Date(),
64
- currentViewMode: 'month',
65
- visibleViewModes: [...AXM_TASK_BOARD_ALL_VIEW_MODE_IDS],
66
- selectedTaskTypeNames: [],
67
- selectedAssigneeIds: [],
68
- assigneeFilterHasSavedPreference: false,
69
- selectedPriorities: [],
70
- selectedReporterIds: [],
71
- selectedCalendarEventTypeIds: [],
72
- })), withComputed((store) => ({
73
- selectedTaskTypes: computed(() => {
74
- const names = store.selectedTaskTypeNames();
75
- if (!names || names.length === 0) {
76
- return [];
77
- }
78
- return store.taskTypes().filter((tt) => names.includes(tt.name));
79
- }),
80
- isTaskSelected: computed(() => store.selectedTask() !== null),
81
- isDetailPanelOpen: computed(() => store.detailPanel()),
82
- endDate: computed(() => {
83
- const currentDate = store.currentDate();
84
- const daysCount = store.daysCount();
85
- // Calculate end of the last day in the range (23:59:59.999)
86
- const endDate = new Date(currentDate);
87
- endDate.setDate(endDate.getDate() + daysCount - 1);
88
- endDate.setHours(23, 59, 59, 999);
89
- return endDate;
90
- }),
91
- activeFilterCount: computed(() => {
92
- let count = 0;
93
- if (store.currentViewMode() !== 'kanban' &&
94
- store.currentViewMode() !== 'status-grouped-grid' &&
95
- store.selectedTaskTypeNames().length > 0) {
96
- count++;
97
- }
98
- if (store.selectedAssigneeIds().length > 0) {
99
- count++;
100
- }
101
- if (store.selectedReporterIds().length > 0) {
102
- count++;
103
- }
104
- if (store.selectedPriorities().length > 0) {
105
- count++;
106
- }
107
- return count;
108
- }),
109
- })), withMethods((store, settingsService = inject(AXPSettingsService), taskBoardService = inject(AXPTaskBoardService), sessionService = inject(AXPSessionService)) => {
110
- const userScopedSettings = () => settingsService.scope(AXPPlatformScope.User);
111
- return {
112
- async initialize() {
113
- patchState(store, { isLoading: true });
114
- try {
115
- const taskTypes = await taskBoardService.getTaskTypes();
116
- patchState(store, { taskTypes });
117
- const [savedDaysCount, savedDateString, savedDetailPanel, savedViewMode, savedVisibleCalendarModes, savedVisibleTimelineModes, savedVisibleTableModes, savedVisibleKanbanModes, savedTaskTypeNames, savedAssigneeIds, savedReporterIds, savedPriorities, savedCalendarEventTypeIds,] = await Promise.all([
118
- userScopedSettings().get(AXMTaskBoardSettings.DaysCount),
119
- userScopedSettings().get(AXMTaskBoardSettings.CurrentDate),
120
- userScopedSettings().get(AXMTaskBoardSettings.DetailPanel),
121
- userScopedSettings().get(AXMTaskBoardSettings.ViewMode),
122
- userScopedSettings().get(AXMTaskBoardSettings.VisibleCalendarModes),
123
- userScopedSettings().get(AXMTaskBoardSettings.VisibleTimelineModes),
124
- userScopedSettings().get(AXMTaskBoardSettings.VisibleTableModes),
125
- userScopedSettings().get(AXMTaskBoardSettings.VisibleKanbanModes),
126
- userScopedSettings().get(AXMTaskBoardSettings.SelectedTaskTypeNames),
127
- userScopedSettings().get(AXMTaskBoardSettings.SelectedAssigneeIds),
128
- userScopedSettings().get(AXMTaskBoardSettings.SelectedReporterIds),
129
- userScopedSettings().get(AXMTaskBoardSettings.SelectedPriorities),
130
- userScopedSettings().get(AXMTaskBoardSettings.SelectedCalendarEventTypeIds),
131
- ]);
132
- const visibleViewModes = normalizeVisibleTaskBoardModesByParts({
133
- calendar: savedVisibleCalendarModes,
134
- timeline: savedVisibleTimelineModes,
135
- table: savedVisibleTableModes,
136
- kanban: savedVisibleKanbanModes,
137
- });
138
- // Ensure currentDate is always a valid Date
139
- let currentDate;
140
- if (savedDateString) {
141
- const parsedDate = new Date(savedDateString);
142
- currentDate = isNaN(parsedDate.getTime()) ? new Date() : parsedDate;
143
- }
144
- else {
145
- currentDate = new Date();
146
- }
147
- const canViewAll = canViewAllTaskAssignees(sessionService);
148
- const assigneeFilterHasSavedPreference = hasTaskBoardSavedAssigneePreference(savedAssigneeIds);
149
- const resolvedSavedAssigneeIds = resolveTaskBoardSavedAssigneeIds(sessionService, savedAssigneeIds);
150
- const defaultAssigneeIds = canViewAll
151
- ? resolvedSavedAssigneeIds
152
- : normalizeTaskBoardAssigneeIds(sessionService, resolvedSavedAssigneeIds);
153
- let effectiveViewMode = savedViewMode || 'month';
154
- if (!visibleViewModes.includes(effectiveViewMode)) {
155
- effectiveViewMode = visibleViewModes[0] ?? 'month';
156
- }
157
- if (savedViewMode != null && !visibleViewModes.includes(savedViewMode)) {
158
- userScopedSettings()
159
- .set(AXMTaskBoardSettings.ViewMode, effectiveViewMode)
160
- .catch((error) => console.error('Error aligning task board view mode with visible views:', error));
161
- }
162
- patchState(store, {
163
- daysCount: savedDaysCount || 7,
164
- detailPanel: savedDetailPanel || false,
165
- currentViewMode: effectiveViewMode,
166
- visibleViewModes,
167
- currentDate,
168
- selectedTaskTypeNames: savedTaskTypeNames || [],
169
- selectedAssigneeIds: defaultAssigneeIds,
170
- assigneeFilterHasSavedPreference,
171
- selectedReporterIds: savedReporterIds || [],
172
- selectedPriorities: savedPriorities || [],
173
- selectedCalendarEventTypeIds: savedCalendarEventTypeIds || [],
174
- isLoading: false,
175
- });
176
- }
177
- catch (error) {
178
- console.error('Error initializing TaskBoard ViewModel:', error);
179
- patchState(store, {
180
- detailPanel: false,
181
- currentViewMode: 'month',
182
- visibleViewModes: [...AXM_TASK_BOARD_ALL_VIEW_MODE_IDS],
183
- currentDate: new Date(),
184
- selectedTaskTypeNames: [],
185
- selectedAssigneeIds: [],
186
- assigneeFilterHasSavedPreference: false,
187
- selectedPriorities: [],
188
- selectedReporterIds: [],
189
- selectedCalendarEventTypeIds: [],
190
- taskTypes: store.taskTypes(),
191
- isLoading: false,
192
- });
193
- }
194
- },
195
- setViewMode(mode) {
196
- const allowed = store.visibleViewModes();
197
- const effectiveMode = allowed.includes(mode) ? mode : (allowed[0] ?? mode);
198
- if ((effectiveMode === 'kanban' || effectiveMode === 'status-grouped-grid') &&
199
- store.selectedTaskTypeNames().length === 0) {
200
- const firstTaskType = store.taskTypes()[0];
201
- if (firstTaskType) {
202
- this.setSelectedTaskTypeNames([firstTaskType.name]);
203
- }
204
- }
205
- if ((effectiveMode === 'kanban' || effectiveMode === 'status-grouped-grid') &&
206
- store.selectedTaskTypeNames().length > 1) {
207
- this.setSelectedTaskTypeNames([store.selectedTaskTypeNames()[0]]);
208
- }
209
- patchState(store, { currentViewMode: effectiveMode });
210
- userScopedSettings()
211
- .set(AXMTaskBoardSettings.ViewMode, effectiveMode)
212
- .catch((error) => console.error('Error saving calendar view mode:', error));
213
- },
214
- setCurrentDate(date) {
215
- patchState(store, { currentDate: new Date(date) });
216
- userScopedSettings()
217
- .set(AXMTaskBoardSettings.CurrentDate, date.toISOString())
218
- .catch((error) => console.error('Error saving current date:', error));
219
- },
220
- setSelectedTaskTypeNames(taskTypeNames, isQueryParam = false) {
221
- patchState(store, { selectedTaskTypeNames: taskTypeNames });
222
- if (isQueryParam)
223
- return;
224
- userScopedSettings()
225
- .set(AXMTaskBoardSettings.SelectedTaskTypeNames, taskTypeNames)
226
- .catch((error) => console.error('Error saving selected task type filter:', error));
227
- },
228
- setSelectedAssigneeIds(assigneeIds, isQueryParam = false, persistPreference = !isQueryParam) {
229
- const normalizedAssigneeIds = normalizeTaskBoardAssigneeIds(sessionService, assigneeIds);
230
- patchState(store, {
231
- selectedAssigneeIds: normalizedAssigneeIds,
232
- ...(persistPreference ? { assigneeFilterHasSavedPreference: true } : {}),
233
- });
234
- if (isQueryParam || !persistPreference)
235
- return;
236
- userScopedSettings()
237
- .set(AXMTaskBoardSettings.SelectedAssigneeIds, normalizedAssigneeIds)
238
- .catch((error) => console.error('Error saving selected assignee filter:', error));
239
- },
240
- setSelectedReporterIds(reporterIds, isQueryParam = false) {
241
- patchState(store, { selectedReporterIds: reporterIds });
242
- if (isQueryParam)
243
- return;
244
- userScopedSettings()
245
- .set(AXMTaskBoardSettings.SelectedReporterIds, reporterIds)
246
- .catch((error) => console.error('Error saving selected reporter filter:', error));
247
- },
248
- setSelectedPriorities(priorities, isQueryParam = false) {
249
- patchState(store, { selectedPriorities: priorities });
250
- if (isQueryParam)
251
- return;
252
- userScopedSettings()
253
- .set(AXMTaskBoardSettings.SelectedPriorities, priorities)
254
- .catch((error) => console.error('Error saving selected priority filter:', error));
255
- },
256
- setSelectedCalendarEventTypeIds(eventTypeIds, isQueryParam = false) {
257
- patchState(store, { selectedCalendarEventTypeIds: eventTypeIds });
258
- if (isQueryParam)
259
- return;
260
- userScopedSettings()
261
- .set(AXMTaskBoardSettings.SelectedCalendarEventTypeIds, eventTypeIds)
262
- .catch((error) => console.error('Error saving selected calendar event type filter:', error));
263
- },
264
- /**
265
- * Sets the currently selected task. Pass `null` to clear the selection.
266
- * @param task The task to select, or null.
267
- */
268
- selectTask(task) {
269
- patchState(store, { selectedTask: task });
270
- },
271
- /**
272
- * A convenience method to clear the currently selected task.
273
- */
274
- clearSelectedTask() {
275
- patchState(store, { selectedTask: null });
276
- },
277
- openDetailPanel() {
278
- patchState(store, { detailPanel: true });
279
- userScopedSettings()
280
- .set(AXMTaskBoardSettings.DetailPanel, true)
281
- .catch((error) => console.error('Error saving detail panel:', error));
282
- },
283
- closeDetailPanel() {
284
- patchState(store, { detailPanel: false });
285
- userScopedSettings()
286
- .set(AXMTaskBoardSettings.DetailPanel, false)
287
- .catch((error) => console.error('Error saving detail panel:', error));
288
- },
289
- toggleDetailPanel() {
290
- const detailPanel = !store.detailPanel();
291
- patchState(store, { detailPanel: detailPanel });
292
- userScopedSettings()
293
- .set(AXMTaskBoardSettings.DetailPanel, detailPanel)
294
- .catch((error) => console.error('Error saving detail panel:', error));
295
- },
296
- async getStatusName(key, provider) {
297
- return taskBoardService.getStatusName(key, provider);
298
- },
299
- /**
300
- * Sets the start date for a new range selection.
301
- * Pass `null` to clear the selection.
302
- * @param date The start date of the range.
303
- */
304
- setRangeStartDate(date) {
305
- patchState(store, { rangeStartDate: date });
306
- },
307
- setDaysCount(days) {
308
- const count = Math.max(1, days);
309
- patchState(store, { daysCount: count });
310
- userScopedSettings()
311
- .set(AXMTaskBoardSettings.DaysCount, count)
312
- .catch((error) => console.error('Error saving days count:', error));
313
- },
314
- };
315
- }));
316
-
317
- class AXMTaskBoardDetailPanel {
318
- constructor() {
319
- this.rootConfig = RootConfig;
320
- this.vm = inject(AXMTaskBoardViewModel);
321
- this.localeService = inject(AXLocaleService);
322
- this.taskBoardService = inject(AXPTaskBoardService);
323
- this.statusName = signal('', ...(ngDevMode ? [{ debugName: "statusName" }] : /* istanbul ignore next */ []));
324
- this.extraFields = signal([], ...(ngDevMode ? [{ debugName: "extraFields" }] : /* istanbul ignore next */ []));
325
- this.#selectedTaskChanged = effect(async () => {
326
- const selectedTask = this.vm.selectedTask();
327
- const key = selectedTask?.status.id;
328
- const provider = selectedTask?.provider;
329
- if (!provider)
330
- return;
331
- const name = await this.vm.getStatusName(key, provider);
332
- if (name)
333
- this.statusName.set(name);
334
- }, ...(ngDevMode ? [{ debugName: "#selectedTaskChanged" }] : /* istanbul ignore next */ []));
335
- this.#selectedTaskTypeChanged = effect(async () => {
336
- const selectedTask = this.vm.selectedTask();
337
- const selectedTaskType = this.taskBoardService.getProvider(selectedTask?.provider);
338
- const extraFields = await selectedTaskType?.getExtraFields();
339
- if (!extraFields) {
340
- this.extraFields.set([]);
341
- return;
342
- }
343
- this.extraFields.set(extraFields);
344
- }, ...(ngDevMode ? [{ debugName: "#selectedTaskTypeChanged" }] : /* istanbul ignore next */ []));
345
- }
346
- #selectedTaskChanged;
347
- #selectedTaskTypeChanged;
348
- capitalizeFirstLetter(text) {
349
- return String(text).charAt(0).toUpperCase() + String(text).slice(1);
350
- }
351
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardDetailPanel, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
352
- 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 }); }
353
- }
354
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardDetailPanel, decorators: [{
355
- type: Component,
356
- args: [{ selector: 'axm-task-board-detail-panel', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
357
- AsyncPipe,
358
- AXFormatPipe,
359
- AXTranslatorPipe,
360
- AXButtonComponent,
361
- AXPStateMessageComponent,
362
- AXPWidgetCoreModule,
363
- AXDecoratorIconComponent,
364
- ], 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"] }]
365
- }] });
366
-
367
- class AXMTaskBoardFiltersComponent {
368
- constructor() {
369
- this.rootConfig = RootConfig;
370
- this.vm = inject(AXMTaskBoardViewModel);
371
- this.sessionService = inject(AXPSessionService);
372
- /** Tracks session user/permissions so assignee filter options react to login changes. */
373
- this.sessionUser = toSignal(this.sessionService.user$, { initialValue: null });
374
- this.sessionPermissions = toSignal(this.sessionService.permissions$, { initialValue: [] });
375
- this.isQueryParam = input(false, ...(ngDevMode ? [{ debugName: "isQueryParam" }] : /* istanbul ignore next */ []));
376
- this.applyClicked = output();
377
- this.context = signal({}, ...(ngDevMode ? [{ debugName: "context" }] : /* istanbul ignore next */ []));
378
- this.isInitialized = false;
379
- this.#init = effect(() => {
380
- const isLoading = this.vm.isLoading();
381
- if (!isLoading && !this.isInitialized) {
382
- this.resetContextToViewModel();
383
- this.isInitialized = true;
384
- }
385
- }, ...(ngDevMode ? [{ debugName: "#init" }] : /* istanbul ignore next */ []));
386
- /** Re-scope assignee filter when user or permissions change (e.g. after switching accounts). */
387
- this.#assigneeScope = effect(() => {
388
- this.sessionUser();
389
- this.sessionPermissions();
390
- if (this.vm.isLoading()) {
391
- return;
392
- }
393
- const resolvedAssigneeIds = this.vm.assigneeFilterHasSavedPreference()
394
- ? this.vm.selectedAssigneeIds()
395
- : resolveTaskBoardSavedAssigneeIds(this.sessionService, null);
396
- const scopedIds = normalizeTaskBoardAssigneeIds(this.sessionService, resolvedAssigneeIds);
397
- if (!isEqual(sortBy(this.vm.selectedAssigneeIds()), sortBy(scopedIds))) {
398
- this.vm.setSelectedAssigneeIds(scopedIds, this.isQueryParam(), false);
399
- }
400
- if (this.isInitialized) {
401
- this.resetContextToViewModel();
402
- }
403
- }, ...(ngDevMode ? [{ debugName: "#assigneeScope" }] : /* istanbul ignore next */ []));
404
- this.VALID_PRIORITIES = [
405
- { title: 'Highest', name: 'highest' },
406
- { title: 'High', name: 'high' },
407
- { title: 'Medium', name: 'medium' },
408
- { title: 'Low', name: 'low' },
409
- { title: 'Lowest', name: 'lowest' },
410
- { title: 'No Priority', name: 'no_priority' },
411
- ];
412
- this.isMultiSelectEnabled = computed(() => {
413
- const viewMode = this.vm.currentViewMode();
414
- return viewMode !== 'kanban' && viewMode !== 'status-grouped-grid';
415
- }, ...(ngDevMode ? [{ debugName: "isMultiSelectEnabled" }] : /* istanbul ignore next */ []));
416
- this.canFilterByAllAssignees = computed(() => {
417
- this.sessionUser();
418
- this.sessionPermissions();
419
- return canViewAllTaskAssignees(this.sessionService);
420
- }, ...(ngDevMode ? [{ debugName: "canFilterByAllAssignees" }] : /* istanbul ignore next */ []));
421
- this.nodes = computed(() => {
422
- const canFilterByAllAssignees = this.canFilterByAllAssignees();
423
- const assigneeScopeKey = `${this.sessionUser()?.id ?? ''}:${canFilterByAllAssignees}`;
424
- return [
425
- {
426
- name: 'taskType',
427
- path: 'options.taskType',
428
- type: AXPWidgetsCatalog.select,
429
- options: {
430
- valueField: 'name',
431
- textField: 'title',
432
- dataSource: 'task-types',
433
- placeholder: 'Select Task Type',
434
- multiple: this.isMultiSelectEnabled(),
435
- allowClear: this.isMultiSelectEnabled(),
436
- },
437
- meta: {
438
- title: 'task-board.filter.task-type',
439
- },
440
- },
441
- {
442
- name: 'assignee',
443
- path: 'options.assignee',
444
- type: AXPWidgetsCatalog.select,
445
- options: {
446
- multiple: true,
447
- valueField: 'id',
448
- allowSearch: canFilterByAllAssignees,
449
- allowClear: canFilterByAllAssignees,
450
- readonly: !canFilterByAllAssignees,
451
- dataSource: 'task-board-assignees',
452
- assigneeScopeKey,
453
- textField: 'displayName',
454
- placeholder: 'Select Assignee',
455
- },
456
- meta: {
457
- title: 'task-board.filter.assignee',
458
- },
459
- },
460
- {
461
- name: 'reporter',
462
- path: 'options.reporter',
463
- type: AXPWidgetsCatalog.select,
464
- options: {
465
- multiple: true,
466
- valueField: 'id',
467
- allowSearch: true,
468
- dataSource: 'users',
469
- textField: 'displayName',
470
- placeholder: 'Select Reporter',
471
- },
472
- meta: {
473
- title: 'task-board.filter.reporter',
474
- },
475
- },
476
- {
477
- name: 'priority',
478
- path: 'options.priority',
479
- type: AXPWidgetsCatalog.select,
480
- options: {
481
- multiple: true,
482
- valueField: 'name',
483
- textField: 'title',
484
- direction: 'horizontal',
485
- placeholder: 'Select Priority',
486
- dataSource: this.VALID_PRIORITIES,
487
- },
488
- meta: {
489
- title: 'task-board.filter.priority',
490
- },
491
- },
492
- ];
493
- }, ...(ngDevMode ? [{ debugName: "nodes" }] : /* istanbul ignore next */ []));
494
- }
495
- #init;
496
- /** Re-scope assignee filter when user or permissions change (e.g. after switching accounts). */
497
- #assigneeScope;
498
- resetContextToViewModel() {
499
- const vmTaskTypeNames = this.vm.selectedTaskTypeNames();
500
- const vmAssigneeIds = this.vm.selectedAssigneeIds();
501
- const vmReporterIds = this.vm.selectedReporterIds();
502
- const vmPriorities = this.vm.selectedPriorities();
503
- const currentViewIsMulti = this.isMultiSelectEnabled();
504
- const taskTypeContextValue = currentViewIsMulti
505
- ? vmTaskTypeNames
506
- : vmTaskTypeNames.length > 0
507
- ? vmTaskTypeNames[0]
508
- : null;
509
- this.context.set({
510
- options: {
511
- priority: vmPriorities,
512
- assignee: vmAssigneeIds,
513
- reporter: vmReporterIds,
514
- taskType: taskTypeContextValue,
515
- },
516
- });
517
- }
518
- handleContextChanged(e) {
519
- this.context.set(e.data);
520
- this.handleApply();
521
- }
522
- handleApply() {
523
- this.syncTaskTypesToViewModel(this.context()?.options?.taskType);
524
- this.syncAssigneesToViewModel(this.context()?.options?.assignee);
525
- this.syncReportersToViewModel(this.context()?.options?.reporter);
526
- this.syncPrioritiesToViewModel(this.context()?.options?.priority);
527
- this.applyClicked.emit();
528
- }
529
- syncTaskTypesToViewModel(selectedValue) {
530
- let newNames = [];
531
- if (Array.isArray(selectedValue)) {
532
- newNames = selectedValue.filter((v) => v != null).map((t) => (typeof t === 'string' ? t : t.name));
533
- }
534
- else if (selectedValue) {
535
- newNames = [typeof selectedValue === 'string' ? selectedValue : selectedValue.name];
536
- }
537
- const currentNames = this.vm.selectedTaskTypeNames();
538
- if (!isEqual(sortBy(currentNames), sortBy(newNames))) {
539
- this.vm.setSelectedTaskTypeNames(newNames, this.isQueryParam());
540
- }
541
- }
542
- syncAssigneesToViewModel(selectedAssignees) {
543
- let newIds = [];
544
- if (Array.isArray(selectedAssignees)) {
545
- newIds = selectedAssignees
546
- .filter((v) => v != null)
547
- .map((t) => (typeof t === 'string' || typeof t === 'number' ? t : t.id));
548
- }
549
- const currentIds = this.vm.selectedAssigneeIds();
550
- if (!isEqual(sortBy(currentIds), sortBy(newIds))) {
551
- this.vm.setSelectedAssigneeIds(newIds, this.isQueryParam());
552
- }
553
- }
554
- syncReportersToViewModel(selectedReporters) {
555
- let newIds = [];
556
- if (Array.isArray(selectedReporters)) {
557
- newIds = selectedReporters
558
- .filter((v) => v != null)
559
- .map((t) => (typeof t === 'string' || typeof t === 'number' ? t : t.id));
560
- }
561
- const currentIds = this.vm.selectedReporterIds();
562
- if (!isEqual(sortBy(currentIds), sortBy(newIds))) {
563
- this.vm.setSelectedReporterIds(newIds, this.isQueryParam());
564
- }
565
- }
566
- syncPrioritiesToViewModel(selectedPriorities) {
567
- let newNames = [];
568
- if (Array.isArray(selectedPriorities)) {
569
- newNames = selectedPriorities
570
- .filter((v) => v != null)
571
- .map((t) => (typeof t === 'string' ? t : t.name));
572
- }
573
- const currentNames = this.vm.selectedPriorities();
574
- if (!isEqual(sortBy(currentNames), sortBy(newNames))) {
575
- this.vm.setSelectedPriorities(newNames, this.isQueryParam());
576
- }
577
- }
578
- handleReset() {
579
- if (this.vm.currentViewMode() === 'kanban' || this.vm.currentViewMode() === 'status-grouped-grid') {
580
- const currentOptions = this.context();
581
- this.context.set({
582
- options: {
583
- taskType: currentOptions?.options?.taskType,
584
- },
585
- });
586
- return;
587
- }
588
- this.context.set({});
589
- }
590
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
591
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardFiltersComponent, isStandalone: true, selector: "axm-task-board-filters", inputs: { isQueryParam: { classPropertyName: "isQueryParam", publicName: "isQueryParam", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { applyClicked: "applyClicked" }, ngImport: i0, template: "<div class=\"ax-px-4 ax-py-3 ax-flex ax-flex-col ax-gap-2 ax-sm ax-w-[20rem]\">\n <axp-widgets-container [context]=\"context()\" (onContextChanged)=\"handleContextChanged($event)\">\n <ax-form>\n <div class=\"ax-flex ax-flex-col ax-gap-4\">\n <!-- @if (taskTypeItems()) {\n <ax-form-field>\n <ax-label> </ax-label>\n <ax-selection-list\n [items]=\"taskTypeItems()!\"\n [ngModel]=\"selectedTaskTypeValues()!\"\n (onValueChanged)=\"handleTaskTypeSelectionChange.emit($event.value)\"\n direction=\"vertical\"\n [multiple]=\"multiple()\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n <ax-select-box\n [dataSource]=\"taskTypeItems()!\"\n [ngModel]=\"selectedTaskTypeValues()!\"\n (onValueChanged)=\"handleTaskTypeSelectionChange.emit($event.value)\"\n [multiple]=\"multiple()\"\n valueField=\"id\"\n textField=\"text\"\n >\n </ax-select-box>\n </ax-form-field>\n <hr />\n } -->\n @for (node of nodes(); track node.name) {\n <ax-form-field>\n @if (node.meta?.['title']) {\n <ax-label>\n {{ node.meta?.['title'] | translate: { scope: rootConfig.config.i18n } | async }}\n </ax-label>\n }\n <ng-container axp-widget-renderer [node]=\"node\" [mode]=\"'edit'\"></ng-container>\n </ax-form-field>\n }\n </div>\n <!-- <div class=\"ax-flex ax-gap-2 ax-mt-6 ax-mb-1\">\n <ax-button\n (onClick)=\"handleReset()\"\n class=\"ax-w-full\"\n [text]=\"'@general:actions.clear.title' | translate | async\"\n ></ax-button>\n <ax-button\n color=\"primary\"\n [type]=\"'submit'\"\n (onClick)=\"handleApply()\"\n class=\"ax-w-full\"\n [text]=\"'@general:actions.apply.title' | translate | async\"\n ></ax-button>\n </div> -->\n </ax-form>\n </axp-widgets-container>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { 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: AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn", "inUserInteractionActive"], outputs: ["onValidate", "updateOnChange"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
592
- }
593
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardFiltersComponent, decorators: [{
594
- type: Component,
595
- args: [{ selector: 'axm-task-board-filters', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
596
- CommonModule,
597
- AXFormFieldComponent,
598
- AXPWidgetCoreModule,
599
- AXFormComponent,
600
- AXLabelComponent,
601
- AXTranslatorPipe,
602
- ], template: "<div class=\"ax-px-4 ax-py-3 ax-flex ax-flex-col ax-gap-2 ax-sm ax-w-[20rem]\">\n <axp-widgets-container [context]=\"context()\" (onContextChanged)=\"handleContextChanged($event)\">\n <ax-form>\n <div class=\"ax-flex ax-flex-col ax-gap-4\">\n <!-- @if (taskTypeItems()) {\n <ax-form-field>\n <ax-label> </ax-label>\n <ax-selection-list\n [items]=\"taskTypeItems()!\"\n [ngModel]=\"selectedTaskTypeValues()!\"\n (onValueChanged)=\"handleTaskTypeSelectionChange.emit($event.value)\"\n direction=\"vertical\"\n [multiple]=\"multiple()\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n <ax-select-box\n [dataSource]=\"taskTypeItems()!\"\n [ngModel]=\"selectedTaskTypeValues()!\"\n (onValueChanged)=\"handleTaskTypeSelectionChange.emit($event.value)\"\n [multiple]=\"multiple()\"\n valueField=\"id\"\n textField=\"text\"\n >\n </ax-select-box>\n </ax-form-field>\n <hr />\n } -->\n @for (node of nodes(); track node.name) {\n <ax-form-field>\n @if (node.meta?.['title']) {\n <ax-label>\n {{ node.meta?.['title'] | translate: { scope: rootConfig.config.i18n } | async }}\n </ax-label>\n }\n <ng-container axp-widget-renderer [node]=\"node\" [mode]=\"'edit'\"></ng-container>\n </ax-form-field>\n }\n </div>\n <!-- <div class=\"ax-flex ax-gap-2 ax-mt-6 ax-mb-1\">\n <ax-button\n (onClick)=\"handleReset()\"\n class=\"ax-w-full\"\n [text]=\"'@general:actions.clear.title' | translate | async\"\n ></ax-button>\n <ax-button\n color=\"primary\"\n [type]=\"'submit'\"\n (onClick)=\"handleApply()\"\n class=\"ax-w-full\"\n [text]=\"'@general:actions.apply.title' | translate | async\"\n ></ax-button>\n </div> -->\n </ax-form>\n </axp-widgets-container>\n</div>\n" }]
603
- }], propDecorators: { isQueryParam: [{ type: i0.Input, args: [{ isSignal: true, alias: "isQueryParam", required: false }] }], applyClicked: [{ type: i0.Output, args: ["applyClicked"] }] } });
604
-
605
- //#region ---- Imports ----
606
- //#endregion
607
- //#region ---- Menu Definition ----
608
- /** Default task board view selector structure (filtered by user preference for visible modes). */
609
- const AXM_TASK_BOARD_MENU_ITEMS = [
610
- {
611
- key: 'calendar',
612
- text: 'calendar',
613
- icon: 'fa-light fa-calendar-day',
614
- children: [
615
- { key: 'day', text: 'daily', icon: 'fa-light fa-calendar-day' },
616
- { key: 'week', text: 'weekly', icon: 'fa-light fa-calendar-week' },
617
- { key: 'month', text: 'monthly', icon: 'fa-light fa-calendar-alt' },
618
- { key: 'agenda', text: 'agenda', icon: 'fa-light fa-calendar-range' },
619
- ],
620
- },
621
- {
622
- key: 'timeline',
623
- text: 'timeline',
624
- icon: 'fa-light fa-list-timeline',
625
- children: [
626
- { key: 'timeline-day', text: 'daily-timeline', icon: 'fa-light fa-calendar-day' },
627
- { key: 'timeline-weekly', text: 'weekly-timeline', icon: 'fa-light fa-calendar-week' },
628
- { key: 'timeline-month', text: 'monthly-timeline', icon: 'fa-light fa-calendar-alt' },
629
- { key: 'timeline-year', text: 'yearly-timeline', icon: 'fa-light fa-calendar-range' },
630
- ],
631
- },
632
- {
633
- key: 'table',
634
- text: 'table',
635
- icon: 'fa-light fa-table',
636
- children: [
637
- { key: 'grid', text: 'grid', icon: 'fa-light fa-table' },
638
- { key: 'status-grouped-grid', text: 'status-grouped-grid', icon: 'fa-light fa-table' },
639
- ],
640
- },
641
- { key: 'kanban', text: 'kanban', icon: 'fa-light fa-chart-kanban' },
642
- ];
643
- /**
644
- * Returns menu branches that contain at least one allowed leaf mode.
645
- */
646
- function filterTaskBoardMenuByAllowedModes(items, allowed) {
647
- const result = [];
648
- for (const category of items) {
649
- if (!category.children) {
650
- if (allowed.has(category.key)) {
651
- result.push(category);
652
- }
653
- continue;
654
- }
655
- const children = category.children.filter((child) => allowed.has(child.key));
656
- if (children.length > 0) {
657
- result.push({ ...category, children });
658
- }
659
- }
660
- return result;
661
- }
662
- //#endregion
663
-
664
- class AXMTaskBoardCalendarViewComponent {
665
- constructor() {
666
- this.vm = inject(AXMTaskBoardViewModel);
667
- this.taskBoardService = inject(AXPTaskBoardService);
668
- this.settingService = inject(AXPSettingsService);
669
- this.commandService = inject(AXPCommandService);
670
- this.schedulerService = inject(AXSchedulerService);
671
- this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
672
- this.destroyRef = inject(DestroyRef);
673
- this.schedulerComponent = viewChild(AXSchedulerComponent, ...(ngDevMode ? [{ debugName: "schedulerComponent" }] : /* istanbul ignore next */ []));
674
- this.resources = input([], ...(ngDevMode ? [{ debugName: "resources" }] : /* istanbul ignore next */ []));
675
- this.refreshNonce = input(0, ...(ngDevMode ? [{ debugName: "refreshNonce" }] : /* istanbul ignore next */ []));
676
- this.startingDate = input(new Date(), ...(ngDevMode ? [{ debugName: "startingDate" }] : /* istanbul ignore next */ []));
677
- this.selectedView = input('month', ...(ngDevMode ? [{ debugName: "selectedView" }] : /* istanbul ignore next */ []));
678
- this.dataSource = input.required(...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
679
- this.firstDayOfWeek = signal('monday', ...(ngDevMode ? [{ debugName: "firstDayOfWeek" }] : /* istanbul ignore next */ []));
680
- this.weekendDays = signal([0, 6], ...(ngDevMode ? [{ debugName: "weekendDays" }] : /* istanbul ignore next */ []));
681
- this.holidays = (range) => {
682
- const selectedEventTypeIds = this.vm.selectedCalendarEventTypeIds();
683
- return this.taskBoardService.getEvents(range, selectedEventTypeIds);
684
- };
685
- this.currentSchedulerView = computed(() => this.selectedView() === 'kanban' || this.selectedView() === 'grid'
686
- ? 'month'
687
- : this.selectedView(), ...(ngDevMode ? [{ debugName: "currentSchedulerView" }] : /* istanbul ignore next */ []));
688
- this.onTaskClick = output();
689
- this.onTaskChanged = output();
690
- this.onMonthSlotDblClicked = output();
691
- this.onActionClick = output();
692
- this.component = output();
693
- this.onTaskRightClick = output();
694
- this.onRangeChanged = output();
695
- this.refreshNonceEffect = effect(() => {
696
- this.refreshNonce();
697
- this.schedulerComponent()?.refresh();
698
- }, ...(ngDevMode ? [{ debugName: "refreshNonceEffect" }] : /* istanbul ignore next */ []));
699
- this.schedulerStateSyncEffect = effect(() => {
700
- this.startingDate();
701
- this.currentSchedulerView();
702
- this.vm.daysCount();
703
- this.vm.selectedTaskTypeNames();
704
- this.vm.selectedAssigneeIds();
705
- this.vm.selectedReporterIds();
706
- this.vm.selectedPriorities();
707
- this.refreshNonce();
708
- queueMicrotask(() => {
709
- this.schedulerComponent()?.refresh();
710
- });
711
- }, ...(ngDevMode ? [{ debugName: "schedulerStateSyncEffect" }] : /* istanbul ignore next */ []));
712
- }
713
- async ngAfterViewInit() {
714
- this.taskBoardService.refresh$
715
- .pipe(takeUntilDestroyed(this.destroyRef))
716
- .subscribe(async (data) => {
717
- const active = this.taskPopoverOverlay.getActiveTask();
718
- if (!active?.provider) {
719
- return;
720
- }
721
- if (data.provider && data.provider !== active.provider) {
722
- return;
723
- }
724
- await this.refreshPopoverData();
725
- });
726
- this.taskBoardService.close$
727
- .pipe(takeUntilDestroyed(this.destroyRef))
728
- .subscribe((data) => {
729
- const active = this.taskPopoverOverlay.getActiveTask();
730
- if (!active?.provider) {
731
- return;
732
- }
733
- if (data.provider && data.provider !== active.provider) {
734
- return;
735
- }
736
- this.taskPopoverOverlay.close();
737
- });
738
- if (this.schedulerComponent()) {
739
- this.component.emit(this.schedulerComponent());
740
- }
741
- }
742
- onTaskDrop(event) {
743
- if (event.slot.view === 'agenda' && event.isSameSlotDrop) {
744
- return;
745
- }
746
- const dropResult = this.schedulerService.calculateAppointmentDropResult(event);
747
- if (dropResult.isSameSlotDrop) {
748
- return;
749
- }
750
- const originalTask = event.appointment;
751
- const updatedTask = this.schedulerService.applyDropResult({ ...originalTask }, dropResult);
752
- this.taskBoardService
753
- .updateTaskDateRange(originalTask, {
754
- from: dropResult.startDate,
755
- end: dropResult.endDate,
756
- })
757
- .then((persistedTask) => {
758
- this.onTaskChanged.emit(persistedTask);
759
- this.schedulerComponent()?.refresh();
760
- })
761
- .catch((error) => {
762
- console.error('[TaskBoardCalendar] Failed to update task date range:', error);
763
- this.schedulerComponent()?.refresh();
764
- });
765
- }
766
- onTaskRightClickHandler(event) {
767
- this.onTaskRightClick.emit({ nativeEvent: event.nativeEvent, task: event.appointment });
768
- }
769
- onSlotDblClicked(event) {
770
- if (event.sender.selectedView() === 'month') {
771
- this.onMonthSlotDblClicked.emit(event.slot.startDate.date);
772
- }
773
- }
774
- async handleRangeChanged(event) {
775
- this.onRangeChanged.emit(event);
776
- }
777
- handleActionClick(event) {
778
- this.onActionClick.emit({ nativeEvent: event.nativeEvent, task: event.appointment });
779
- }
780
- async onTaskClickHandler(event) {
781
- const task = event.appointment;
782
- const anchor = this.resolveAppointmentAnchor(event);
783
- if (anchor) {
784
- await this.taskPopoverOverlay.open({
785
- task,
786
- anchor,
787
- offsetX: 12,
788
- offsetY: 12,
789
- adaptivityEnabled: true,
790
- });
791
- }
792
- this.onTaskClick.emit(task);
793
- }
794
- async refreshPopoverData() {
795
- const active = this.taskPopoverOverlay.getActiveTask();
796
- if (!active?.provider) {
797
- return;
798
- }
799
- const provider = this.taskBoardService.getProvider(active.provider);
800
- if (!provider) {
801
- return;
802
- }
803
- try {
804
- const result = await provider.getTasks();
805
- const updatedTask = result.items.find((t) => t.id === active.id);
806
- if (updatedTask) {
807
- await this.taskPopoverOverlay.refreshTask({ ...updatedTask, provider: active.provider });
808
- }
809
- this.schedulerComponent()?.refresh();
810
- }
811
- catch (error) {
812
- console.error('[TaskPopover] Failed to refresh popover data:', error);
813
- }
814
- }
815
- async openTaskDetails() {
816
- const task = this.taskPopoverOverlay.getActiveTask();
817
- if (!task) {
818
- return;
819
- }
820
- try {
821
- await this.commandService.execute('Entity:OpenDetails', {
822
- entity: `${RootConfig.module.name}.${RootConfig.entities.task.name}`,
823
- data: { id: task.id },
824
- });
825
- this.taskPopoverOverlay.close();
826
- }
827
- catch (error) {
828
- console.error('Failed to open task details:', error);
829
- }
830
- }
831
- resolveAppointmentAnchor(event) {
832
- let targetElement = event.nativeEvent.currentTarget || event.nativeEvent.target;
833
- let element = targetElement;
834
- const maxDepth = 10;
835
- let depth = 0;
836
- while (element && element !== document.body && depth < maxDepth) {
837
- depth++;
838
- const isAppointment = element.classList?.contains('dx-scheduler-appointment') ||
839
- element.classList?.contains('ax-scheduler-appointment') ||
840
- element.hasAttribute('data-appointment-id');
841
- if (isAppointment) {
842
- targetElement = element;
843
- break;
844
- }
845
- const parent = element.parentElement;
846
- if (parent) {
847
- const isParentAppointment = parent.classList?.contains('dx-scheduler-appointment') ||
848
- parent.classList?.contains('ax-scheduler-appointment');
849
- if (isParentAppointment) {
850
- targetElement = parent;
851
- break;
852
- }
853
- }
854
- element = element.parentElement;
855
- }
856
- return targetElement;
857
- }
858
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardCalendarViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
859
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.9", type: AXMTaskBoardCalendarViewComponent, isStandalone: true, selector: "axm-task-board-calendar-view", inputs: { resources: { classPropertyName: "resources", publicName: "resources", isSignal: true, isRequired: false, transformFunction: null }, refreshNonce: { classPropertyName: "refreshNonce", publicName: "refreshNonce", isSignal: true, isRequired: false, transformFunction: null }, startingDate: { classPropertyName: "startingDate", publicName: "startingDate", isSignal: true, isRequired: false, transformFunction: null }, selectedView: { classPropertyName: "selectedView", publicName: "selectedView", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onTaskClick: "onTaskClick", onTaskChanged: "onTaskChanged", onMonthSlotDblClicked: "onMonthSlotDblClicked", onActionClick: "onActionClick", component: "component", onTaskRightClick: "onTaskRightClick", onRangeChanged: "onRangeChanged" }, viewQueries: [{ propertyName: "schedulerComponent", first: true, predicate: AXSchedulerComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<ax-scheduler [hasHeader]=\"false\" [holidays]=\"holidays\" [resources]=\"resources()\" [dataSource]=\"dataSource()\"\n [startingDate]=\"startingDate()\" [selectedView]=\"currentSchedulerView()\" [multiDayViewDaysCount]=\"vm.daysCount()\"\n (onAppointmentDrop)=\"onTaskDrop($event)\" (onActionClick)=\"handleActionClick($event)\"\n (onRangeChanged)=\"handleRangeChanged($event)\" (onSlotDblClicked)=\"onSlotDblClicked($event)\"\n (onAppointmentClicked)=\"onTaskClickHandler($event)\" [weekend]=\"weekendDays()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"></ax-scheduler>", styles: [".task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;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=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}ax-scheduler{line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}\n"], dependencies: [{ kind: "component", type: AXSchedulerComponent, selector: "ax-scheduler", inputs: ["calendar", "startingDate", "endDayHour", "startDayHour", "hasHeader", "readonly", "draggable", "hasActions", "dragStartDelay", "weekend", "allowFullScreen", "multiDayViewDaysCount", "showResourceHeaders", "showCurrentTimeIndicator", "scrollToCurrentTimeIndicator", "showUnassignedAppointments", "resources", "resourceTemplate", "firstDayOfWeek", "tooltipTemplate", "dataSource", "holidays", "views", "selectedView"], outputs: ["selectedViewChange", "onDataLoaded", "onRangeChanged", "onSlotClicked", "onSlotDblClicked", "onSlotRightClick", "onAppointmentDrop", "onActionClick", "onAppointmentClicked", "onAppointmentDblClicked", "onAppointmentRightClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
860
- }
861
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardCalendarViewComponent, decorators: [{
862
- type: Component,
863
- args: [{ selector: 'axm-task-board-calendar-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXSchedulerComponent], template: "<ax-scheduler [hasHeader]=\"false\" [holidays]=\"holidays\" [resources]=\"resources()\" [dataSource]=\"dataSource()\"\n [startingDate]=\"startingDate()\" [selectedView]=\"currentSchedulerView()\" [multiDayViewDaysCount]=\"vm.daysCount()\"\n (onAppointmentDrop)=\"onTaskDrop($event)\" (onActionClick)=\"handleActionClick($event)\"\n (onRangeChanged)=\"handleRangeChanged($event)\" (onSlotDblClicked)=\"onSlotDblClicked($event)\"\n (onAppointmentClicked)=\"onTaskClickHandler($event)\" [weekend]=\"weekendDays()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"></ax-scheduler>", styles: [".task-popover{background:rgba(var(--ax-sys-color-lightest-surface));border-radius:12px;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=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}ax-scheduler{line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}\n"] }]
864
- }], 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"] }] } });
865
-
866
- class AXMTaskBoardGridViewComponent {
867
- constructor() {
868
- this.vm = inject(AXMTaskBoardViewModel);
869
- this.localeService = inject(AXLocaleService);
870
- this.calendarService = inject(AXCalendarService);
871
- this.taskBoardService = inject(AXPTaskBoardService);
872
- this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
873
- this.destroyRef = inject(DestroyRef);
874
- this.dataSource = input.required(...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
875
- this.refreshNonce = input(0, ...(ngDevMode ? [{ debugName: "refreshNonce" }] : /* istanbul ignore next */ []));
876
- this.onTaskClick = output();
877
- this.fetchedTasks = signal([], ...(ngDevMode ? [{ debugName: "fetchedTasks" }] : /* istanbul ignore next */ []));
878
- this.columns = signal([], ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
879
- this.grid = viewChild('grid', ...(ngDevMode ? [{ debugName: "grid" }] : /* istanbul ignore next */ []));
880
- this.taskRowCommandWidth = TASK_BOARD_GRID_ROW_ACTION_COLUMN_WIDTH;
881
- this.taskRowCommandItems = TASK_BOARD_GRID_ROW_ACTION_ITEMS;
882
- this.gridRemountKeys = computed(() => [this.refreshNonce()], ...(ngDevMode ? [{ debugName: "gridRemountKeys" }] : /* istanbul ignore next */ []));
883
- this.tasksDataSource = computed(() => {
884
- const parentDataSource = this.dataSource();
885
- void this.refreshNonce();
886
- return new AXDataSource({
887
- load: async (e) => {
888
- const result = await parentDataSource({ skip: e.skip, take: e.take });
889
- this.fetchedTasks.set(result.items);
890
- const mappedItems = result.items.map((task) => ({
891
- id: task.id,
892
- data: task.data,
893
- title: task.title,
894
- priority: task.priority,
895
- description: task.description,
896
- statusTitle: task.status.title,
897
- reporter: task.reporter.fullName ?? '-',
898
- assignee: task.assignee?.fullName ?? 'unassigned',
899
- type: this.taskBoardService.getProvider(task.provider)?.title,
900
- endDate: this.calendarService.format(task.endDate, 'DD/MM/YYYY HH:mm', {
901
- locale: this.localeService.activeProfile().calendar.system,
902
- }),
903
- startDate: this.calendarService.format(task.startDate, 'DD/MM/YYYY HH:mm', {
904
- locale: this.localeService.activeProfile().calendar.system,
905
- }),
906
- _originalTask: task,
907
- }));
908
- return { items: mappedItems, total: result.total };
909
- },
910
- pageSize: 10,
911
- key: 'id',
912
- byKey: async (key) => {
913
- return this.fetchedTasks().find((task) => task.id === key);
914
- },
915
- });
916
- }, ...(ngDevMode ? [{ debugName: "tasksDataSource" }] : /* istanbul ignore next */ []));
917
- this.#dataSourceChanged = effect(() => {
918
- this.vm.selectedTaskTypeNames();
919
- this.vm.selectedAssigneeIds();
920
- this.vm.selectedReporterIds();
921
- this.vm.selectedPriorities();
922
- this.vm.currentDate();
923
- this.vm.daysCount();
924
- this.vm.currentViewMode();
925
- this.refreshNonce();
926
- untracked(() => {
927
- setTimeout(() => {
928
- this.grid()?.refresh({ reset: true });
929
- }, 0);
930
- });
931
- }, ...(ngDevMode ? [{ debugName: "#dataSourceChanged" }] : /* istanbul ignore next */ []));
932
- this.#providerChanged = effect(async () => {
933
- const taskType = this.vm.selectedTaskTypes()[0];
934
- if (!taskType) {
935
- this.columns.set([]);
936
- return;
937
- }
938
- taskType.getExtraFields().then((extraFields) => {
939
- if (extraFields) {
940
- this.columns.set(extraFields);
941
- }
942
- });
943
- }, ...(ngDevMode ? [{ debugName: "#providerChanged" }] : /* istanbul ignore next */ []));
944
- afterNextRender(() => {
945
- untracked(() => {
946
- this.grid()?.refresh({ reset: true });
947
- });
948
- });
949
- this.taskBoardService.close$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data) => {
950
- const active = this.taskPopoverOverlay.getActiveTask();
951
- if (!active?.provider) {
952
- return;
953
- }
954
- if (data.provider && data.provider !== active.provider) {
955
- return;
956
- }
957
- this.taskPopoverOverlay.close();
958
- });
959
- }
960
- #dataSourceChanged;
961
- #providerChanged;
962
- handleRowClick(event) {
963
- if (event.data) {
964
- const mappedItem = event.data;
965
- const originalTask = mappedItem._originalTask || this.fetchedTasks().find((task) => task.id === mappedItem.id);
966
- if (originalTask) {
967
- this.onTaskClick.emit(originalTask);
968
- }
969
- }
970
- }
971
- handleTaskCommandClick(event) {
972
- if (event.name !== 'view') {
973
- return;
974
- }
975
- event.nativeEvent?.stopPropagation();
976
- const mappedItem = event.data;
977
- const task = mappedItem._originalTask ?? this.fetchedTasks().find((t) => t.id === mappedItem.id);
978
- if (!task) {
979
- return;
980
- }
981
- const anchor = this.taskPopoverOverlay.resolveAnchorFromCommandClick(event);
982
- if (!anchor) {
983
- return;
984
- }
985
- setTimeout(() => {
986
- void this.taskPopoverOverlay.open({
987
- task,
988
- anchor,
989
- placement: 'bottom-start',
990
- adaptivityEnabled: false,
991
- autoFlip: true,
992
- });
993
- }, 0);
994
- }
995
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardGridViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
996
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardGridViewComponent, isStandalone: true, selector: "axm-task-board-grid-view", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, refreshNonce: { classPropertyName: "refreshNonce", publicName: "refreshNonce", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onTaskClick: "onTaskClick" }, viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true, isSignal: true }], ngImport: i0, template: "@for (remountKey of gridRemountKeys(); track remountKey) {\n <ax-data-table\n #grid\n [fetchDataMode]=\"'manual'\"\n [dataSource]=\"tasksDataSource()\"\n (onRowClick)=\"handleRowClick($event)\"\n [loading]=\"{ enabled: true, animation: true }\"\n >\n <ax-text-column\n dataField=\"title\"\n [caption]=\"('@task-management:task-board.grid-headers.title' | translate | async)!\"\n [width]=\"'350px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"description\"\n [caption]=\"('@task-management:task-board.grid-headers.description' | translate | async)!\"\n [width]=\"'500px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"assignee\"\n [caption]=\"('@task-management:task-board.grid-headers.assignee' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"startDate\"\n [caption]=\"('@task-management:task-board.grid-headers.start-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"endDate\"\n [caption]=\"('@task-management:task-board.grid-headers.due-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"priority\"\n [caption]=\"('@task-management:task-board.grid-headers.priority' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n [allowResizing]=\"true\"\n dataField=\"reporter\"\n [caption]=\"('@task-management:task-board.grid-headers.reporter' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"statusTitle\"\n [caption]=\"('@task-management:task-board.grid-headers.status' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"type\"\n [caption]=\"('@task-management:task-board.grid-headers.type' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n\n @if (columns().length) {\n <ng-container>\n @for (column of columns(); track column) {\n <axp-widget-column-renderer\n [node]=\"column.widget\"\n [caption]=\"(column.title | translate | async)!\"\n ></axp-widget-column-renderer>\n }\n </ng-container>\n }\n\n <ax-command-column\n fixed=\"end\"\n [width]=\"taskRowCommandWidth\"\n [items]=\"taskRowCommandItems\"\n (onItemClick)=\"handleTaskCommandClick($event)\"\n ></ax-command-column>\n </ax-data-table>\n}\n", dependencies: [{ kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i1$2.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i1$2.AXDataTableTextColumnComponent, selector: "ax-text-column", inputs: ["width", "caption", "allowSorting", "allowResizing", "fixed", "hasTitle", "customExpandIcon", "customCollapseIcon", "dataField", "expandHandler", "wrapText", "cellTemplate", "footerTemplate", "headerTemplate", "format", "formatOptions"] }, { kind: "component", type: i1$2.AXRowCommandColumnComponent, selector: "ax-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetColumnRendererComponent, selector: "axp-widget-column-renderer", inputs: ["caption", "customExpandIcon", "customCollapseIcon", "customWidth", "node", "footerTemplate", "expandHandler", "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 }); }
997
- }
998
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardGridViewComponent, decorators: [{
999
- type: Component,
1000
- 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" }]
1001
- }], 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 }] }] } });
1002
-
1003
- class AXMTaskBoardKanbanViewComponent {
1004
- constructor() {
1005
- this.vm = inject(AXMTaskBoardViewModel);
1006
- this.taskBoardService = inject(AXPTaskBoardService);
1007
- this.settingService = inject(AXPSettingsService);
1008
- this.commandService = inject(AXPCommandService);
1009
- this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
1010
- this.destroyRef = inject(DestroyRef);
1011
- this.kanbanComponent = viewChild(AXKanbanComponent, ...(ngDevMode ? [{ debugName: "kanbanComponent" }] : /* istanbul ignore next */ []));
1012
- this.tasks = model.required(...(ngDevMode ? [{ debugName: "tasks" }] : /* istanbul ignore next */ []));
1013
- this.onTaskClick = output();
1014
- this.onTaskChanged = output();
1015
- this.component = output();
1016
- this.onActionClick = output();
1017
- this.statuses = signal([], ...(ngDevMode ? [{ debugName: "statuses" }] : /* istanbul ignore next */ []));
1018
- this.stableTasks = computed(() => this.tasks(), { ...(ngDevMode ? { debugName: "stableTasks" } : /* istanbul ignore next */ {}), equal: isEqual });
1019
- this.kanbanTasks = computed(() => {
1020
- return this.stableTasks().map((task) => ({
1021
- id: task.id,
1022
- title: task.title,
1023
- index: task.index,
1024
- cssClass: task.cssClass,
1025
- priority: task.priority,
1026
- statusKey: task.status.id,
1027
- description: task.description,
1028
- }));
1029
- }, ...(ngDevMode ? [{ debugName: "kanbanTasks" }] : /* istanbul ignore next */ []));
1030
- this.#providerChanged = effect(async () => {
1031
- const taskType = this.vm.selectedTaskTypes()[0];
1032
- if (!taskType) {
1033
- this.statuses.set([]);
1034
- return;
1035
- }
1036
- taskType.getStatuses().then((statuses) => {
1037
- if (statuses) {
1038
- this.statuses.set(statuses);
1039
- }
1040
- });
1041
- }, ...(ngDevMode ? [{ debugName: "#providerChanged" }] : /* istanbul ignore next */ []));
1042
- }
1043
- ngAfterViewInit() {
1044
- this.taskBoardService.refresh$
1045
- .pipe(takeUntilDestroyed(this.destroyRef))
1046
- .subscribe(async (data) => {
1047
- const active = this.taskPopoverOverlay.getActiveTask();
1048
- if (!active?.provider) {
1049
- return;
1050
- }
1051
- if (data.provider && data.provider !== active.provider) {
1052
- return;
1053
- }
1054
- await this.refreshPopoverData();
1055
- });
1056
- this.taskBoardService.close$
1057
- .pipe(takeUntilDestroyed(this.destroyRef))
1058
- .subscribe((data) => {
1059
- const active = this.taskPopoverOverlay.getActiveTask();
1060
- if (!active?.provider) {
1061
- return;
1062
- }
1063
- if (data.provider && data.provider !== active.provider) {
1064
- return;
1065
- }
1066
- this.taskPopoverOverlay.close();
1067
- });
1068
- if (this.kanbanComponent()) {
1069
- this.component.emit(this.kanbanComponent());
1070
- }
1071
- }
1072
- #providerChanged;
1073
- //#region ---- Drag & Drop Handling ----
1074
- /**
1075
- * Handles the onBeforeDrop event from the kanban component.
1076
- * Uses event.wait() to register async operations that the kanban will await.
1077
- * If action is cancelled/failed, we set event.canceled = true to prevent the drop.
1078
- */
1079
- onBeforeDrop(event) {
1080
- // If no status change, allow the drop (just reordering)
1081
- if (event.previousStatusKey === event.currentStatusKey) {
1082
- return;
1083
- }
1084
- // Find the task being moved
1085
- const task = this.stableTasks().find((t) => t.id === event.item?.id);
1086
- if (!task || !task.provider) {
1087
- // Allow drop if task not found or no provider
1088
- return;
1089
- }
1090
- // Get the provider
1091
- const provider = this.taskBoardService.getProvider(task.provider);
1092
- if (!provider) {
1093
- return;
1094
- }
1095
- // Register the async operation using event.wait()
1096
- // The kanban component will await this promise before proceeding
1097
- event.wait(this.executeDropAction(event, task, provider));
1098
- }
1099
- /**
1100
- * Executes the action for a drop operation.
1101
- * Sets event.canceled = true if action fails or is cancelled.
1102
- * IMPORTANT: Do NOT update the task status in dataSource here - let the kanban handle the move.
1103
- * The kanban will update the status in onSortChanged, and we'll sync with backend there.
1104
- */
1105
- async executeDropAction(event, task, provider) {
1106
- if (!provider) {
1107
- return;
1108
- }
1109
- try {
1110
- // Get available actions for the task
1111
- const actions = await provider.getActions(task);
1112
- if (!actions || actions.length === 0) {
1113
- // No actions available, allow the drop
1114
- return;
1115
- }
1116
- // Find action that matches the new status
1117
- const matchingAction = this.findActionForStatus(actions, event.currentStatusKey);
1118
- if (!matchingAction || !matchingAction.command) {
1119
- // No matching action found, allow the drop
1120
- return;
1121
- }
1122
- // Execute the action and check result
1123
- const result = await this.taskBoardService.executeCommand(matchingAction.command, task.provider);
1124
- // Check if action was successful (not cancelled or failed)
1125
- if (result?.success === false || result === null) {
1126
- // Action was cancelled or failed - prevent the drop
1127
- event.canceled = true;
1128
- return;
1129
- }
1130
- // Action succeeded - allow the drop to proceed
1131
- // The kanban will handle the visual move, and onSortChanged will sync with backend
1132
- }
1133
- catch (error) {
1134
- console.error('[KanbanDrop] Failed to execute action during drop:', error);
1135
- // On error, prevent the drop to be safe
1136
- event.canceled = true;
1137
- }
1138
- }
1139
- /**
1140
- * Finds an action that corresponds to the target status.
1141
- * Matches actions by name patterns (e.g., "approve" action for "approved" status).
1142
- */
1143
- findActionForStatus(actions, targetStatus) {
1144
- const targetStatusStr = String(targetStatus).toLowerCase();
1145
- // Common status-to-action mappings
1146
- const statusActionMap = {
1147
- approved: ['approve'],
1148
- rejected: ['reject'],
1149
- cancelled: ['cancel'],
1150
- completed: ['complete', 'finish'],
1151
- done: ['complete', 'finish'],
1152
- inprogress: ['start', 'begin'],
1153
- 'in-progress': ['start', 'begin'],
1154
- blocked: ['block'],
1155
- unblocked: ['unblock'],
1156
- };
1157
- // Check direct mappings first
1158
- const possibleActionNames = statusActionMap[targetStatusStr] || [];
1159
- for (const actionName of possibleActionNames) {
1160
- const action = actions.find((a) => a.name?.toLowerCase().includes(actionName));
1161
- if (action) {
1162
- return action;
1163
- }
1164
- }
1165
- // Try to find action by name containing status keywords
1166
- const statusKeywords = targetStatusStr.split(/[-_\s]+/);
1167
- for (const keyword of statusKeywords) {
1168
- if (keyword.length < 3)
1169
- continue; // Skip very short keywords
1170
- const action = actions.find((a) => {
1171
- const actionName = a.name?.toLowerCase() || '';
1172
- return actionName.includes(keyword) || keyword.includes(actionName);
1173
- });
1174
- if (action) {
1175
- return action;
1176
- }
1177
- }
1178
- // Try exact match with action name
1179
- const exactMatch = actions.find((a) => a.name?.toLowerCase() === targetStatusStr);
1180
- if (exactMatch) {
1181
- return exactMatch;
1182
- }
1183
- // Try partial match (status contains action name or vice versa)
1184
- for (const action of actions) {
1185
- const actionName = action.name?.toLowerCase() || '';
1186
- if (targetStatusStr.includes(actionName) || actionName.includes(targetStatusStr)) {
1187
- return action;
1188
- }
1189
- }
1190
- return null;
1191
- }
1192
- //#endregion
1193
- onSortChanged(event) {
1194
- const tasks = this.tasks().map((item) => {
1195
- const task = event.allItems.find((t) => t.id === item.id);
1196
- if (!task) {
1197
- return item;
1198
- }
1199
- const status = this.statuses().find((s) => String(s.key) === String(task.statusKey));
1200
- if (!status) {
1201
- return { ...item, index: task.index ?? item.index };
1202
- }
1203
- return {
1204
- ...item,
1205
- index: task.index ?? item.index,
1206
- status: { id: status.key, title: status.title },
1207
- };
1208
- });
1209
- this.taskBoardService
1210
- .updateTasks(tasks)
1211
- .then((updatedTasks) => {
1212
- this.tasks.set(updatedTasks);
1213
- })
1214
- .catch((error) => {
1215
- console.error('[KanbanSort] Failed to update tasks:', error);
1216
- const provider = tasks[0]?.provider;
1217
- if (provider) {
1218
- this.taskBoardService.requestRefresh(provider);
1219
- }
1220
- });
1221
- }
1222
- async handleItemClick(event) {
1223
- const task = this.stableTasks().find((task) => task.id === event.item.id);
1224
- if (!task)
1225
- return;
1226
- // Find the kanban item container element
1227
- let targetElement = event.nativeEvent.currentTarget || event.nativeEvent.target;
1228
- // Traverse up to find the kanban item container
1229
- let element = targetElement;
1230
- const maxDepth = 10;
1231
- let depth = 0;
1232
- while (element && element !== document.body && depth < maxDepth) {
1233
- depth++;
1234
- const isKanbanItem = element.classList?.contains('dx-kanban-item') ||
1235
- element.classList?.contains('ax-kanban-item') ||
1236
- element.hasAttribute('data-item-id');
1237
- if (isKanbanItem) {
1238
- targetElement = element;
1239
- break;
1240
- }
1241
- element = element.parentElement;
1242
- }
1243
- if (targetElement) {
1244
- await this.taskPopoverOverlay.open({
1245
- task,
1246
- anchor: targetElement,
1247
- offsetX: 12,
1248
- offsetY: 12,
1249
- adaptivityEnabled: true,
1250
- });
1251
- }
1252
- this.onTaskClick.emit(task);
1253
- }
1254
- handleActionClick(event) {
1255
- const task = this.stableTasks().find((task) => task.id === event.item.id);
1256
- if (task) {
1257
- this.onActionClick.emit({ nativeEvent: event.nativeEvent, task: task });
1258
- }
1259
- }
1260
- async refreshPopoverData() {
1261
- const active = this.taskPopoverOverlay.getActiveTask();
1262
- if (!active?.provider) {
1263
- return;
1264
- }
1265
- const provider = this.taskBoardService.getProvider(active.provider);
1266
- if (!provider) {
1267
- return;
1268
- }
1269
- try {
1270
- const result = await provider.getTasks();
1271
- const updatedTasks = result.items.map((t) => ({ ...t, provider: active.provider }));
1272
- const updatedMap = new Map(updatedTasks.map((t) => [t.id, t]));
1273
- const currentTasks = this.tasks();
1274
- const mergedTasks = currentTasks.map((t) => updatedMap.get(t.id) ?? t);
1275
- const existingIds = new Set(currentTasks.map((t) => t.id));
1276
- const newTasks = updatedTasks.filter((t) => !existingIds.has(t.id));
1277
- this.tasks.set([...mergedTasks, ...newTasks]);
1278
- const updatedSelectedTask = updatedMap.get(active.id);
1279
- if (updatedSelectedTask) {
1280
- await this.taskPopoverOverlay.refreshTask({ ...updatedSelectedTask, provider: active.provider });
1281
- }
1282
- }
1283
- catch (error) {
1284
- console.error('[TaskPopover] Failed to refresh popover data:', error);
1285
- }
1286
- }
1287
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardKanbanViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1288
- 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=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}ax-kanban{--ax-comp-kanban-status-min-height: 100%;--ax-comp-kanban-status-min-width: 25rem;height:100%;line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}\n"], dependencies: [{ kind: "component", type: AXKanbanComponent, selector: "ax-kanban", inputs: ["hasActions", "dragStartDelay", "statuses", "itemTemplate", "dataSource", "keyField", "indexField", "titleField", "cssClassField", "priorityField", "statusKeyField", "descriptionField", "emptyTemplate", "headerTemplate", "footerTemplate", "contentFooterTemplate", "tooltipTemplate"], outputs: ["onBeforeDrop", "onSortChanged", "onItemClick", "onActionClick", "onItemDblClick", "onItemRightClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1289
- }
1290
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardKanbanViewComponent, decorators: [{
1291
- type: Component,
1292
- 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=highest]{color:var(--ax-sys-color-danger)}.task-popover__icon--priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__icon--priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__icon--priority[data-priority=low],.task-popover__icon--priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-500)}.task-popover__info-content{flex:1;min-width:0;display:flex;align-items:center}.task-popover__info-text{font-size:14px;line-height:1.5;color:var(--ax-sys-color-text-primary);word-wrap:break-word}.task-popover__priority{text-transform:capitalize;font-weight:500}.task-popover__priority[data-priority=highest]{color:var(--ax-sys-color-danger)}.task-popover__priority[data-priority=high]{color:var(--ax-sys-color-warning)}.task-popover__priority[data-priority=medium]{color:var(--ax-sys-color-info)}.task-popover__priority[data-priority=low],.task-popover__priority[data-priority=lowest]{color:var(--ax-sys-color-text-neutral-600)}.task-popover__actions{padding:12px 20px 16px;border-top:1px solid var(--ax-sys-color-border);display:flex;flex-direction:column;gap:8px;background:var(--ax-sys-color-lighter-surface)}.task-popover__actions-group{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}ax-kanban{--ax-comp-kanban-status-min-height: 100%;--ax-comp-kanban-status-min-width: 25rem;height:100%;line-height:1.5;background-color:rgba(var(--ax-sys-color-lightest-surface))!important}\n"] }]
1293
- }], 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"] }] } });
1294
-
1295
- function statusGroupTrackKey(nonce, group) {
1296
- return `${nonce}:${String(group.statusInfo.key)}`;
1297
- }
1298
- function taskMatchesStatus(task, status) {
1299
- return String(task.status.id) === String(status.key);
1300
- }
1301
- class AXMTaskBoardStatusGroupedGridViewComponent {
1302
- constructor() {
1303
- this.vm = inject(AXMTaskBoardViewModel);
1304
- this.localeService = inject(AXLocaleService);
1305
- this.calendarService = inject(AXCalendarService);
1306
- this.taskBoardService = inject(AXPTaskBoardService);
1307
- this.taskPopoverOverlay = inject(AXMTaskBoardTaskPopoverOverlayService);
1308
- this.destroyRef = inject(DestroyRef);
1309
- this.provider = input(...(ngDevMode ? [undefined, { debugName: "provider" }] : /* istanbul ignore next */ []));
1310
- this.dataSource = input.required(...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
1311
- this.refreshNonce = input(0, ...(ngDevMode ? [{ debugName: "refreshNonce" }] : /* istanbul ignore next */ []));
1312
- this.onTaskClick = output();
1313
- this.groupedTasks = signal([], ...(ngDevMode ? [{ debugName: "groupedTasks" }] : /* istanbul ignore next */ []));
1314
- this.allFetchedTasks = signal([], ...(ngDevMode ? [{ debugName: "allFetchedTasks" }] : /* istanbul ignore next */ []));
1315
- this.columns = signal([], ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
1316
- this.statuses = signal([], ...(ngDevMode ? [{ debugName: "statuses" }] : /* istanbul ignore next */ []));
1317
- this.grids = viewChildren('grid', ...(ngDevMode ? [{ debugName: "grids" }] : /* istanbul ignore next */ []));
1318
- this.taskRowCommandWidth = TASK_BOARD_GRID_ROW_ACTION_COLUMN_WIDTH;
1319
- this.taskRowCommandItems = TASK_BOARD_GRID_ROW_ACTION_ITEMS;
1320
- this.trackStatusGroup = (_index, group) => statusGroupTrackKey(this.refreshNonce(), group);
1321
- this.groupedViewRemountKeys = computed(() => [this.refreshNonce()], ...(ngDevMode ? [{ debugName: "groupedViewRemountKeys" }] : /* istanbul ignore next */ []));
1322
- this.#dataChanged = effect(() => {
1323
- this.vm.selectedTaskTypeNames();
1324
- this.vm.selectedAssigneeIds();
1325
- this.vm.selectedReporterIds();
1326
- this.vm.selectedPriorities();
1327
- this.vm.currentDate();
1328
- this.vm.daysCount();
1329
- this.vm.currentViewMode();
1330
- this.refreshNonce();
1331
- const allStatuses = this.statuses();
1332
- const parentDataSource = this.dataSource();
1333
- if (!parentDataSource || allStatuses.length === 0) {
1334
- this.groupedTasks.set([]);
1335
- this.allFetchedTasks.set([]);
1336
- return;
1337
- }
1338
- void parentDataSource().then((result) => {
1339
- this.allFetchedTasks.set(result.items);
1340
- const allTasks = result.items;
1341
- const statusGroups = allStatuses.map((status) => {
1342
- const tasksForStatus = allTasks.filter((task) => taskMatchesStatus(task, status));
1343
- return {
1344
- statusInfo: status,
1345
- tasks: this.createTaskDataSourceForGroup(tasksForStatus),
1346
- };
1347
- });
1348
- this.groupedTasks.set(statusGroups);
1349
- untracked(() => {
1350
- setTimeout(() => {
1351
- this.groupedTasks()?.forEach((group) => {
1352
- group.tasks.refresh();
1353
- });
1354
- this.grids().forEach((grid) => {
1355
- grid.refresh({ reset: true });
1356
- });
1357
- }, 0);
1358
- });
1359
- });
1360
- }, ...(ngDevMode ? [{ debugName: "#dataChanged" }] : /* istanbul ignore next */ []));
1361
- this.#providerChanged = effect(async () => {
1362
- const provider = this.vm.selectedTaskTypes()[0];
1363
- provider?.getExtraFields().then((extraFields) => {
1364
- if (extraFields) {
1365
- this.columns.set(extraFields);
1366
- }
1367
- });
1368
- provider?.getStatuses().then((statuses) => {
1369
- if (statuses) {
1370
- this.statuses.set(statuses);
1371
- }
1372
- });
1373
- }, ...(ngDevMode ? [{ debugName: "#providerChanged" }] : /* istanbul ignore next */ []));
1374
- this.#gridsChanged = effect(() => {
1375
- const groups = this.groupedTasks();
1376
- untracked(() => {
1377
- setTimeout(() => {
1378
- this.grids().forEach((grid) => {
1379
- grid.refresh({ reset: true });
1380
- });
1381
- }, 100);
1382
- });
1383
- }, ...(ngDevMode ? [{ debugName: "#gridsChanged" }] : /* istanbul ignore next */ []));
1384
- afterNextRender(() => {
1385
- untracked(() => {
1386
- setTimeout(() => {
1387
- this.groupedTasks()?.forEach((group) => {
1388
- group.tasks.refresh();
1389
- });
1390
- this.grids().forEach((grid) => {
1391
- grid.refresh({ reset: true });
1392
- });
1393
- }, 200);
1394
- });
1395
- });
1396
- this.taskBoardService.close$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data) => {
1397
- const active = this.taskPopoverOverlay.getActiveTask();
1398
- if (!active?.provider) {
1399
- return;
1400
- }
1401
- if (data.provider && data.provider !== active.provider) {
1402
- return;
1403
- }
1404
- this.taskPopoverOverlay.close();
1405
- });
1406
- }
1407
- #dataChanged;
1408
- #providerChanged;
1409
- #gridsChanged;
1410
- createTaskDataSourceForGroup(tasks) {
1411
- return new AXDataSource({
1412
- load: async (e) => {
1413
- const items = tasks.map((task) => ({
1414
- id: task.id,
1415
- data: task.data,
1416
- title: task.title,
1417
- priority: task.priority,
1418
- description: task.description,
1419
- reporter: task.reporter.fullName ?? '-',
1420
- assignee: task.assignee?.fullName ?? 'unassigned',
1421
- endDate: this.calendarService.format(task.endDate, 'DD/MM/YYYY HH:mm', {
1422
- locale: this.localeService.activeProfile().calendar.system,
1423
- }),
1424
- startDate: this.calendarService.format(task.startDate, 'DD/MM/YYYY HH:mm', {
1425
- locale: this.localeService.activeProfile().calendar.system,
1426
- }),
1427
- _originalTask: task,
1428
- }));
1429
- return {
1430
- items: items.slice(e.skip, e.skip + e.take),
1431
- total: items.length,
1432
- };
1433
- },
1434
- pageSize: 5,
1435
- key: 'id',
1436
- byKey: async (key) => {
1437
- return tasks.find((task) => task.id === key);
1438
- },
1439
- });
1440
- }
1441
- handleRowClick(event) {
1442
- if (!event.data) {
1443
- return;
1444
- }
1445
- const mappedItem = event.data;
1446
- const originalTask = mappedItem._originalTask ?? this.allFetchedTasks().find((task) => task.id === mappedItem.id);
1447
- if (originalTask) {
1448
- this.onTaskClick.emit(originalTask);
1449
- }
1450
- }
1451
- handleTaskCommandClick(event) {
1452
- if (event.name !== 'view') {
1453
- return;
1454
- }
1455
- event.nativeEvent?.stopPropagation();
1456
- const mappedItem = event.data;
1457
- const task = mappedItem._originalTask ?? this.allFetchedTasks().find((t) => t.id === mappedItem.id);
1458
- if (!task) {
1459
- return;
1460
- }
1461
- const anchor = this.taskPopoverOverlay.resolveAnchorFromCommandClick(event);
1462
- if (!anchor) {
1463
- return;
1464
- }
1465
- setTimeout(() => {
1466
- void this.taskPopoverOverlay.open({
1467
- task,
1468
- anchor,
1469
- placement: 'bottom-start',
1470
- adaptivityEnabled: false,
1471
- autoFlip: true,
1472
- });
1473
- }, 0);
1474
- }
1475
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardStatusGroupedGridViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1476
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardStatusGroupedGridViewComponent, isStandalone: true, selector: "axm-task-board-status-grouped-grid-view", inputs: { provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, refreshNonce: { classPropertyName: "refreshNonce", publicName: "refreshNonce", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onTaskClick: "onTaskClick" }, viewQueries: [{ propertyName: "grids", predicate: ["grid"], descendants: true, isSignal: true }], ngImport: i0, template: "@for (remountKey of groupedViewRemountKeys(); track remountKey) {\n @for (group of groupedTasks(); track trackStatusGroup($index, group)) {\n <h1 class=\"ax-text-xl ax-font-bold\">{{ group.statusInfo.title }}</h1>\n <ax-data-table\n #grid\n class=\"ax-h-[300px]\"\n [fetchDataMode]=\"'manual'\"\n [dataSource]=\"group.tasks\"\n [loading]=\"{ enabled: true, animation: true }\"\n (onRowClick)=\"handleRowClick($event)\"\n >\n <ax-text-column\n dataField=\"title\"\n [caption]=\"('@task-management:task-board.grid-headers.title' | translate | async)!\"\n [width]=\"'350px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"description\"\n [caption]=\"('@task-management:task-board.grid-headers.description' | translate | async)!\"\n [width]=\"'500px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"startDate\"\n [caption]=\"('@task-management:task-board.grid-headers.start-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"endDate\"\n [caption]=\"('@task-management:task-board.grid-headers.due-date' | translate | async)!\"\n [width]=\"'150px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"priority\"\n [caption]=\"('@task-management:task-board.grid-headers.priority' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"reporter\"\n [caption]=\"('@task-management:task-board.grid-headers.reporter' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n <ax-text-column\n dataField=\"assignee\"\n [caption]=\"('@task-management:task-board.grid-headers.assignee' | translate | async)!\"\n [width]=\"'125px'\"\n ></ax-text-column>\n\n <ax-command-column\n fixed=\"end\"\n [width]=\"taskRowCommandWidth\"\n [items]=\"taskRowCommandItems\"\n (onItemClick)=\"handleTaskCommandClick($event)\"\n ></ax-command-column>\n </ax-data-table>\n }\n}\n", dependencies: [{ kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i1$2.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i1$2.AXDataTableTextColumnComponent, selector: "ax-text-column", inputs: ["width", "caption", "allowSorting", "allowResizing", "fixed", "hasTitle", "customExpandIcon", "customCollapseIcon", "dataField", "expandHandler", "wrapText", "cellTemplate", "footerTemplate", "headerTemplate", "format", "formatOptions"] }, { kind: "component", type: i1$2.AXRowCommandColumnComponent, selector: "ax-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1477
- }
1478
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardStatusGroupedGridViewComponent, decorators: [{
1479
- type: Component,
1480
- 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" }]
1481
- }], 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 }] }] } });
1482
-
1483
- class AXMTaskBoardPage extends AXPPageLayoutBaseComponent {
1484
- constructor() {
1485
- super(...arguments);
1486
- this.router = inject(Router);
1487
- this.rootConfig = RootConfig;
1488
- this.deviceService = inject(AXPDeviceService);
1489
- this.vm = inject(AXMTaskBoardViewModel);
1490
- this.unsubscribe = inject(AXUnsubscriber);
1491
- this.activatedRoute = inject(ActivatedRoute);
1492
- this.localeService = inject(AXLocaleService);
1493
- this.calendarService = inject(AXCalendarService);
1494
- this.taskBoardService = inject(AXPTaskBoardService);
1495
- this.popover = viewChild('popover', ...(ngDevMode ? [{ debugName: "popover" }] : /* istanbul ignore next */ []));
1496
- this.calendar = viewChild('calendar', ...(ngDevMode ? [{ debugName: "calendar" }] : /* istanbul ignore next */ []));
1497
- this.sidebarCalendar = viewChild('sidebarCalendar', ...(ngDevMode ? [{ debugName: "sidebarCalendar" }] : /* istanbul ignore next */ []));
1498
- this.isReady = signal(false, ...(ngDevMode ? [{ debugName: "isReady" }] : /* istanbul ignore next */ []));
1499
- this.taskTypes = signal([], ...(ngDevMode ? [{ debugName: "taskTypes" }] : /* istanbul ignore next */ []));
1500
- this.calendarEventTypes = signal([], ...(ngDevMode ? [{ debugName: "calendarEventTypes" }] : /* istanbul ignore next */ []));
1501
- this.resources = signal([], ...(ngDevMode ? [{ debugName: "resources" }] : /* istanbul ignore next */ []));
1502
- this.isQueryParam = signal(false, ...(ngDevMode ? [{ debugName: "isQueryParam" }] : /* istanbul ignore next */ []));
1503
- this.refreshNonce = signal(0, ...(ngDevMode ? [{ debugName: "refreshNonce" }] : /* istanbul ignore next */ []));
1504
- this.taskTypeAccordionCollapsed = signal(false, ...(ngDevMode ? [{ debugName: "taskTypeAccordionCollapsed" }] : /* istanbul ignore next */ []));
1505
- this.calendarEventTypeAccordionCollapsed = signal(false, ...(ngDevMode ? [{ debugName: "calendarEventTypeAccordionCollapsed" }] : /* istanbul ignore next */ []));
1506
- this.sidebarCollapsed = signal(false, ...(ngDevMode ? [{ debugName: "sidebarCollapsed" }] : /* istanbul ignore next */ []));
1507
- this.currentTask = signal(null, ...(ngDevMode ? [{ debugName: "currentTask" }] : /* istanbul ignore next */ []));
1508
- this.schedulerComponent = signal(null, ...(ngDevMode ? [{ debugName: "schedulerComponent" }] : /* istanbul ignore next */ []));
1509
- this.kanbanLoadVersion = 0;
1510
- this.dayDataCache = signal(new Map(), ...(ngDevMode ? [{ debugName: "dayDataCache" }] : /* istanbul ignore next */ []));
1511
- /** View switcher entries filtered by user visibility settings parts. */
1512
- this.menuItems = computed(() => {
1513
- const allowed = new Set(this.vm.visibleViewModes());
1514
- return filterTaskBoardMenuByAllowedModes(AXM_TASK_BOARD_MENU_ITEMS, allowed);
1515
- }, ...(ngDevMode ? [{ debugName: "menuItems" }] : /* istanbul ignore next */ []));
1516
- this.calendarType = computed(() => this.localeService.activeProfile().calendar.system, ...(ngDevMode ? [{ debugName: "calendarType" }] : /* istanbul ignore next */ []));
1517
- this.todayButtonText = computed(() => {
1518
- switch (this.vm.currentViewMode()) {
1519
- case 'day':
1520
- case 'grid':
1521
- case 'agenda':
1522
- case 'kanban':
1523
- case 'timeline-day':
1524
- case 'timeline-weekly':
1525
- case 'status-grouped-grid':
1526
- return 'Today';
1527
- case 'week':
1528
- return 'Current week';
1529
- case 'month':
1530
- case 'timeline-month':
1531
- return 'Current month';
1532
- case 'timeline-year':
1533
- return 'Current year';
1534
- default:
1535
- return 'Today';
1536
- }
1537
- }, ...(ngDevMode ? [{ debugName: "todayButtonText" }] : /* istanbul ignore next */ []));
1538
- this.timeText = computed(() => {
1539
- if (this.vm.currentViewMode() === 'grid' ||
1540
- this.vm.currentViewMode() === 'kanban' ||
1541
- this.vm.currentViewMode() === 'status-grouped-grid') {
1542
- const currentDate = this.vm.currentDate();
1543
- if (!currentDate) {
1544
- return '';
1545
- }
1546
- const start = this.calendarService.create(currentDate, this.localeService.activeProfile().calendar.system);
1547
- const end = start.add('day', this.vm.daysCount() - 1);
1548
- const startText = start.format('DD MMMM yyyy', { locale: this.localeService.activeProfile().calendar.system });
1549
- const endText = end.format('DD MMMM yyyy', { locale: this.localeService.activeProfile().calendar.system });
1550
- return `${startText} - ${endText}`;
1551
- }
1552
- return this.schedulerComponent()?.currentDateText() || '';
1553
- }, ...(ngDevMode ? [{ debugName: "timeText" }] : /* istanbul ignore next */ []));
1554
- this.calendarDepth = computed(() => {
1555
- if (this.vm.currentViewMode() === 'grid' ||
1556
- this.vm.currentViewMode() === 'kanban' ||
1557
- this.vm.currentViewMode() === 'status-grouped-grid') {
1558
- return 'day';
1559
- }
1560
- return this.schedulerComponent()?.calendarDepth() || 'day';
1561
- }, ...(ngDevMode ? [{ debugName: "calendarDepth" }] : /* istanbul ignore next */ []));
1562
- this.currentDateForCalendar = computed(() => {
1563
- const date = this.vm.currentDate();
1564
- return date || new Date();
1565
- }, ...(ngDevMode ? [{ debugName: "currentDateForCalendar" }] : /* istanbul ignore next */ []));
1566
- this.selectedViewMode = computed(() => {
1567
- const currentMode = this.vm.currentViewMode();
1568
- const items = this.menuItems();
1569
- for (const category of items) {
1570
- if (category.key === currentMode) {
1571
- return { key: category.key, text: category.text, icon: category.icon };
1572
- }
1573
- if (category.children) {
1574
- const foundChild = category.children.find((child) => child.key === currentMode);
1575
- if (foundChild) {
1576
- return foundChild;
1577
- }
1578
- }
1579
- }
1580
- const firstCategory = items[0];
1581
- if (!firstCategory) {
1582
- return {
1583
- key: currentMode,
1584
- text: 'view',
1585
- icon: 'fa-light fa-table',
1586
- };
1587
- }
1588
- return firstCategory.children
1589
- ? firstCategory.children[0]
1590
- : { key: firstCategory.key, text: firstCategory.text, icon: firstCategory.icon };
1591
- }, ...(ngDevMode ? [{ debugName: "selectedViewMode" }] : /* istanbul ignore next */ []));
1592
- this.filter = computed(() => {
1593
- const taskTypeNames = this.vm.selectedTaskTypeNames();
1594
- const assigneeIds = this.vm.selectedAssigneeIds();
1595
- const reporterIds = this.vm.selectedReporterIds();
1596
- const priorities = this.vm.selectedPriorities();
1597
- const currentDate = this.vm.currentDate() || new Date();
1598
- let from = this.calendarService.create(currentDate, this.localeService.activeProfile().calendar.system);
1599
- let end;
1600
- const currentView = this.vm.currentViewMode();
1601
- if (currentView === 'grid' ||
1602
- currentView === 'kanban' ||
1603
- currentView === 'agenda' ||
1604
- currentView === 'timeline-weekly' ||
1605
- currentView === 'status-grouped-grid') {
1606
- end = from.add('day', this.vm.daysCount() - 1);
1607
- }
1608
- else if (currentView === 'month' || currentView === 'timeline-month') {
1609
- from = from.startOf('month');
1610
- end = from.endOf('month');
1611
- }
1612
- else {
1613
- end = from.endOf('day');
1614
- }
1615
- return {
1616
- // Empty filter means "all items" for task type/provider.
1617
- ...(taskTypeNames.length > 0 && { types: taskTypeNames }),
1618
- ...(assigneeIds.length > 0 && { assigneeIds }),
1619
- ...(reporterIds.length > 0 && { reporterIds }),
1620
- ...(priorities.length > 0 && { priorities }),
1621
- range: { from: from.date, end: end.date },
1622
- };
1623
- }, ...(ngDevMode ? [{ debugName: "filter" }] : /* istanbul ignore next */ []));
1624
- this.contextMenu = viewChild('rootContextMenu', ...(ngDevMode ? [{ debugName: "contextMenu" }] : /* istanbul ignore next */ []));
1625
- this.schedulerDataSource = (schedulerFilter) => {
1626
- const pageFilter = this.filter();
1627
- const visibleRange = schedulerFilter?.range ?? pageFilter.range;
1628
- const finalFilter = {
1629
- ...pageFilter,
1630
- ...schedulerFilter,
1631
- range: visibleRange,
1632
- };
1633
- return this.taskBoardService.getTasks(finalFilter).then((result) => {
1634
- const items = filterTasksOverlappingRange(result.items, visibleRange);
1635
- this.validateSelectedTask(items);
1636
- return items;
1637
- });
1638
- };
1639
- this.gridDataSource = (filter) => {
1640
- const finalFilter = { ...this.filter(), ...filter };
1641
- return this.taskBoardService.getTasks(finalFilter).then((result) => {
1642
- this.validateSelectedTask(result.items);
1643
- return result;
1644
- });
1645
- };
1646
- this.resolvedTasks = signal([], ...(ngDevMode ? [{ debugName: "resolvedTasks" }] : /* istanbul ignore next */ []));
1647
- /** Loads kanban tasks when filters or date range change; ignores stale async results. */
1648
- this.kanbanDataEffect = effect(() => {
1649
- if (this.vm.currentViewMode() !== 'kanban') {
1650
- return;
1651
- }
1652
- this.vm.selectedTaskTypeNames();
1653
- this.vm.selectedAssigneeIds();
1654
- this.vm.selectedReporterIds();
1655
- this.vm.selectedPriorities();
1656
- this.vm.currentDate();
1657
- this.vm.daysCount();
1658
- this.refreshNonce();
1659
- const filter = this.filter();
1660
- const version = ++this.kanbanLoadVersion;
1661
- void this.taskBoardService.getTasks(filter).then((result) => {
1662
- if (version !== this.kanbanLoadVersion) {
1663
- return;
1664
- }
1665
- this.validateSelectedTask(result.items);
1666
- this.resolvedTasks.set(result.items);
1667
- });
1668
- }, ...(ngDevMode ? [{ debugName: "kanbanDataEffect" }] : /* istanbul ignore next */ []));
1669
- /** Keeps scheduler in sync when toolbar date/view changes outside the scheduler UI. */
1670
- this.schedulerNavigationEffect = effect(() => {
1671
- const viewMode = this.vm.currentViewMode();
1672
- const calendarViews = [
1673
- 'day',
1674
- 'week',
1675
- 'month',
1676
- 'agenda',
1677
- 'timeline-day',
1678
- 'timeline-weekly',
1679
- 'timeline-month',
1680
- 'timeline-year',
1681
- ];
1682
- if (!calendarViews.includes(viewMode)) {
1683
- return;
1684
- }
1685
- this.vm.currentDate();
1686
- this.vm.currentViewMode();
1687
- this.vm.daysCount();
1688
- this.refreshNonce();
1689
- queueMicrotask(() => {
1690
- this.schedulerComponent()?.refresh();
1691
- });
1692
- }, ...(ngDevMode ? [{ debugName: "schedulerNavigationEffect" }] : /* istanbul ignore next */ []));
1693
- this.refreshEffect = effect(() => {
1694
- this.vm.selectedTaskTypeNames();
1695
- this.vm.selectedAssigneeIds();
1696
- this.vm.selectedReporterIds();
1697
- this.vm.selectedPriorities();
1698
- this.vm.currentDate();
1699
- this.vm.daysCount();
1700
- this.refreshNonce();
1701
- void this.getResources();
1702
- this.schedulerComponent()?.refresh();
1703
- }, ...(ngDevMode ? [{ debugName: "refreshEffect" }] : /* istanbul ignore next */ []));
1704
- this.calendarEventTypeRefreshEffect = effect(() => {
1705
- this.vm.selectedCalendarEventTypeIds();
1706
- // Refresh calendar view to update holidays when event types change
1707
- this.schedulerComponent()?.refresh();
1708
- }, ...(ngDevMode ? [{ debugName: "calendarEventTypeRefreshEffect" }] : /* istanbul ignore next */ []));
1709
- this.dayDataCacheEffect = effect(async () => {
1710
- // Update cache when filters, date, or view mode change
1711
- this.vm.currentDate();
1712
- this.vm.currentViewMode();
1713
- this.vm.selectedTaskTypeNames();
1714
- this.vm.selectedCalendarEventTypeIds();
1715
- await this.updateDayDataCache();
1716
- }, ...(ngDevMode ? [{ debugName: "dayDataCacheEffect" }] : /* istanbul ignore next */ []));
1717
- this.rangeBasedViews = [
1718
- 'grid',
1719
- 'kanban',
1720
- 'agenda',
1721
- 'status-grouped-grid',
1722
- 'timeline-weekly',
1723
- ];
1724
- this.getCellClass = (date) => {
1725
- const currentView = this.vm.currentViewMode();
1726
- const selectionStartDate = this.vm.rangeStartDate();
1727
- if (this.rangeBasedViews.includes(currentView)) {
1728
- if (selectionStartDate) {
1729
- const axSelectionStartDate = this.calendarService.create(selectionStartDate);
1730
- if (date.equal(axSelectionStartDate, 'day')) {
1731
- return 'ax-range-start ax-range-end';
1732
- }
1733
- return null;
1734
- }
1735
- const fromRange = this.calendarService.create(this.vm.currentDate());
1736
- const endRange = fromRange.add('day', this.vm.daysCount() - 1);
1737
- const isStart = date.equal(fromRange, 'day');
1738
- const isEnd = date.equal(endRange, 'day');
1739
- if (isStart && isEnd)
1740
- return 'ax-range-start ax-range-end';
1741
- if (isStart)
1742
- return 'ax-range-start';
1743
- if (isEnd)
1744
- return 'ax-range-end';
1745
- if (date.compare(fromRange, 'day') > 0 && date.compare(endRange, 'day') < 0) {
1746
- return 'ax-range-between';
1747
- }
1748
- return null;
1749
- }
1750
- if (currentView === 'week') {
1751
- const from = this.calendarService.create(this.vm.currentDate());
1752
- const end = from.add('day', 6);
1753
- if (date.equal(from, 'day'))
1754
- return 'ax-range-start';
1755
- if (date.equal(end, 'day'))
1756
- return 'ax-range-end';
1757
- if (date.compare(from, 'day') > 0 && date.compare(end, 'day') < 0) {
1758
- return 'ax-range-between';
1759
- }
1760
- }
1761
- return null;
1762
- };
1763
- this.taskTypeItems = computed(() => {
1764
- return this.taskTypes().map((taskType) => ({
1765
- id: taskType.name,
1766
- text: taskType.title,
1767
- icon: taskType.icon,
1768
- }));
1769
- }, ...(ngDevMode ? [{ debugName: "taskTypeItems" }] : /* istanbul ignore next */ []));
1770
- // Check if current view mode is kanban, grid, or status-grouped-grid
1771
- this.isNonCalendarView = computed(() => {
1772
- const mode = this.vm.currentViewMode();
1773
- return mode === 'kanban' || mode === 'grid' || mode === 'status-grouped-grid';
1774
- }, ...(ngDevMode ? [{ debugName: "isNonCalendarView" }] : /* istanbul ignore next */ []));
1775
- this.selectedTaskTypeValues = computed(() => {
1776
- const values = this.vm.selectedTaskTypeNames();
1777
- // If in radio mode (non-calendar view), return only the first value or empty array
1778
- if (this.isNonCalendarView() && values.length > 0) {
1779
- return [values[0]];
1780
- }
1781
- return values;
1782
- }, ...(ngDevMode ? [{ debugName: "selectedTaskTypeValues" }] : /* istanbul ignore next */ []));
1783
- this.calendarEventTypeItems = computed(() => {
1784
- return this.calendarEventTypes().map((eventType) => ({
1785
- id: eventType.id,
1786
- text: eventType.title,
1787
- icon: eventType.icon,
1788
- color: eventType.color,
1789
- }));
1790
- }, ...(ngDevMode ? [{ debugName: "calendarEventTypeItems" }] : /* istanbul ignore next */ []));
1791
- this.selectedCalendarEventTypeValues = computed(() => {
1792
- return this.vm.selectedCalendarEventTypeIds();
1793
- }, ...(ngDevMode ? [{ debugName: "selectedCalendarEventTypeValues" }] : /* istanbul ignore next */ []));
1794
- }
1795
- async ngOnInit() {
1796
- await super.ngOnInit();
1797
- await this.vm.initialize();
1798
- // Load task types for checkbox filter
1799
- const types = await this.taskBoardService.getTaskTypes();
1800
- this.taskTypes.set(types);
1801
- // Load calendar event types for checkbox filter
1802
- const eventTypes = await this.taskBoardService.getCalendarEventTypes();
1803
- this.calendarEventTypes.set(eventTypes.map((et) => ({
1804
- id: et.id,
1805
- title: et.title,
1806
- })));
1807
- // Initialize day data cache
1808
- await this.updateDayDataCache();
1809
- this.router.events
1810
- .pipe(this.unsubscribe.takeUntilDestroy, filter((event) => event instanceof NavigationEnd), startWith(null))
1811
- .subscribe(async () => {
1812
- await this.loadFromRoute();
1813
- if (!this.isReady()) {
1814
- this.isReady.set(true);
1815
- }
1816
- });
1817
- this.taskBoardService.refresh$.subscribe(async () => {
1818
- await this.taskResolveHandler();
1819
- await this.getResources();
1820
- this.refreshNonce.update((value) => value + 1);
1821
- this.schedulerComponent()?.refresh();
1822
- });
1823
- this.taskBoardService.openTask$.subscribe(async ({ task, provider, instanceId, activityId }) => {
1824
- await this.taskResolveHandler();
1825
- let match = task;
1826
- if (!match && instanceId && activityId) {
1827
- match = this.resolvedTasks().find((t) => {
1828
- const data = t.data;
1829
- return data?.instanceId === instanceId && data?.activityId === activityId;
1830
- });
1831
- }
1832
- if (!match) {
1833
- return;
1834
- }
1835
- this.vm.selectTask({
1836
- ...match,
1837
- provider: match.provider ?? provider,
1838
- });
1839
- });
1840
- }
1841
- async getPageTitle() {
1842
- return await this.translateService.translateAsync('@task-management:task-board.page-title');
1843
- }
1844
- async getPageBreadcrumbs() {
1845
- return [
1846
- {
1847
- title: await this.translateService.translateAsync('@task-management:root-menu'),
1848
- },
1849
- ];
1850
- }
1851
- async getPrimaryMenuItems() {
1852
- return [
1853
- {
1854
- ...getActionButton('refresh'),
1855
- command: { name: 'refresh' },
1856
- },
1857
- ];
1858
- }
1859
- async execute(command) {
1860
- if (command.name === 'refresh') {
1861
- this.taskBoardService.requestRefresh();
1862
- }
1863
- }
1864
- async taskResolveHandler(filter = this.filter()) {
1865
- const result = await this.taskBoardService.getTasks(filter);
1866
- this.validateSelectedTask(result.items);
1867
- this.resolvedTasks.set(result.items);
1868
- }
1869
- schedulerComponentChanged(component) {
1870
- this.schedulerComponent.set(component);
1871
- }
1872
- async handleContextMenuOnOpening(event) {
1873
- const currentTask = this.currentTask();
1874
- if (!currentTask)
1875
- return;
1876
- const providerName = currentTask.provider;
1877
- if (!providerName)
1878
- return;
1879
- const provider = this.taskBoardService.getProvider(providerName);
1880
- if (!provider)
1881
- return;
1882
- const actions = await provider.getActions(currentTask);
1883
- for (const item of actions) {
1884
- const t = item.title;
1885
- const text = typeof t === 'string'
1886
- ? t.startsWith('@')
1887
- ? await this.translateService.translateAsync(t)
1888
- : t
1889
- : this.translateService.resolve(t);
1890
- event.items.push({
1891
- text,
1892
- icon: item.icon,
1893
- color: item.color,
1894
- break: item.break,
1895
- data: {
1896
- command: item.command,
1897
- },
1898
- });
1899
- }
1900
- }
1901
- handleContextMenu(event) {
1902
- this.currentTask.set(event.task);
1903
- const x = event.nativeEvent.clientX;
1904
- const y = event.nativeEvent.clientY;
1905
- const element = event.nativeEvent.target;
1906
- this.contextMenu()?.showAt({ x, y }, element);
1907
- }
1908
- handleMonthSlotDblClicked(date) {
1909
- this.vm.setCurrentDate(date);
1910
- this.vm.setViewMode('day');
1911
- }
1912
- handleViewChange(view, dropdownPanel) {
1913
- this.router.navigate([], { queryParams: { view } });
1914
- this.vm.setViewMode(view);
1915
- this.popover()?.close();
1916
- dropdownPanel.close();
1917
- }
1918
- async updateDayDataCache() {
1919
- const currentDate = this.vm.currentDate();
1920
- const depth = this.calendarDepth();
1921
- // Determine the date range based on the sidebar calendar depth
1922
- let rangeStart;
1923
- let rangeEnd;
1924
- if (depth === 'month') {
1925
- // When depth is 'month', the sidebar shows a full year of months -- fetch data for the entire year
1926
- rangeStart = this.calendarService.create(currentDate).startOf('year').date;
1927
- rangeEnd = this.calendarService.create(currentDate).endOf('year').date;
1928
- }
1929
- else {
1930
- // When depth is 'day', the sidebar shows a single month -- fetch data for that month
1931
- rangeStart = this.calendarService.create(currentDate).startOf('month').date;
1932
- rangeEnd = this.calendarService.create(currentDate).endOf('month').date;
1933
- }
1934
- // Get tasks for the range
1935
- const tasks = await this.taskBoardService.getTasks({
1936
- ...this.filter(),
1937
- range: { from: rangeStart, end: rangeEnd },
1938
- });
1939
- // Get events for the range
1940
- const selectedEventTypeIds = this.vm.selectedCalendarEventTypeIds();
1941
- const events = await this.taskBoardService.getEvents({ from: rangeStart, end: rangeEnd }, selectedEventTypeIds);
1942
- // Create a map of day -> count
1943
- const dayCountMap = new Map();
1944
- // Count tasks per day
1945
- tasks.items.forEach((task) => {
1946
- const taskStart = new Date(task.startDate);
1947
- const taskEnd = new Date(task.endDate);
1948
- const startDay = this.calendarService.create(taskStart).startOf('day');
1949
- const endDay = this.calendarService.create(taskEnd).startOf('day');
1950
- let currentDay = startDay;
1951
- while (currentDay.compare(endDay, 'day') <= 0) {
1952
- const dayKey = currentDay.format('YYYY-MM-DD');
1953
- dayCountMap.set(dayKey, (dayCountMap.get(dayKey) || 0) + 1);
1954
- currentDay = currentDay.add('day', 1);
1955
- }
1956
- });
1957
- // Count events per day
1958
- events.forEach((event) => {
1959
- const eventDate = new Date(event.date);
1960
- const dayKey = this.calendarService.create(eventDate).format('YYYY-MM-DD');
1961
- dayCountMap.set(dayKey, (dayCountMap.get(dayKey) || 0) + 1);
1962
- });
1963
- this.dayDataCache.set(dayCountMap);
1964
- this.sidebarCalendar()?.render();
1965
- }
1966
- getDayDataCount(date) {
1967
- if (!date) {
1968
- return 0;
1969
- }
1970
- try {
1971
- // Get the native Date object from AXDateTime
1972
- const dateObj = date.date || date._date;
1973
- if (!dateObj) {
1974
- return 0;
1975
- }
1976
- // Create a new AXDateTime from the date object for consistent formatting
1977
- const nativeDate = dateObj instanceof Date ? dateObj : new Date(dateObj);
1978
- const axDate = this.calendarService.create(nativeDate);
1979
- const dayKey = axDate.format('YYYY-MM-DD');
1980
- return this.dayDataCache().get(dayKey) || 0;
1981
- }
1982
- catch (error) {
1983
- console.warn('Error getting day data count:', error);
1984
- return 0;
1985
- }
1986
- }
1987
- /**
1988
- * Aggregates the day-level data counts for an entire month.
1989
- * Used by the monthCellTemplate to show badges when the sidebar calendar depth is 'month'.
1990
- */
1991
- getMonthDataCount(date) {
1992
- if (!date) {
1993
- return 0;
1994
- }
1995
- try {
1996
- const dateObj = date.date || date._date;
1997
- if (!dateObj) {
1998
- return 0;
1999
- }
2000
- const nativeDate = dateObj instanceof Date ? dateObj : new Date(dateObj);
2001
- const axDate = this.calendarService.create(nativeDate);
2002
- const monthStart = axDate.startOf('month');
2003
- const monthEnd = axDate.endOf('month');
2004
- let total = 0;
2005
- let current = monthStart;
2006
- while (current.compare(monthEnd, 'day') <= 0) {
2007
- const dayKey = current.format('YYYY-MM-DD');
2008
- total += this.dayDataCache().get(dayKey) || 0;
2009
- current = current.add('day', 1);
2010
- }
2011
- return total;
2012
- }
2013
- catch (error) {
2014
- console.warn('Error getting month data count:', error);
2015
- return 0;
2016
- }
2017
- }
2018
- async handleContextMenuItemClick(event) {
2019
- const command = event.item.data?.command;
2020
- const provider = this.currentTask()?.provider ?? '';
2021
- try {
2022
- if (command) {
2023
- await this.taskBoardService.executeCommand(command, provider);
2024
- }
2025
- }
2026
- catch (error) {
2027
- console.error('[TaskBoard] Context menu command failed:', error);
2028
- }
2029
- finally {
2030
- if (command) {
2031
- this.taskBoardService.requestRefresh(provider || undefined);
2032
- }
2033
- }
2034
- }
2035
- changeDate(forward) {
2036
- const date = this.calendarService.create(this.vm.currentDate(), this.localeService.activeProfile().calendar.system);
2037
- switch (this.vm.currentViewMode()) {
2038
- case 'day':
2039
- case 'timeline-day':
2040
- this.vm.setCurrentDate(date.add('day', forward ? 1 : -1).date);
2041
- break;
2042
- case 'week':
2043
- this.vm.setCurrentDate(date.add('week', forward ? 1 : -1).date);
2044
- break;
2045
- case 'grid':
2046
- case 'agenda':
2047
- case 'kanban':
2048
- case 'timeline-weekly':
2049
- case 'status-grouped-grid':
2050
- this.vm.setCurrentDate(date.add('day', forward ? this.vm.daysCount() : -this.vm.daysCount()).date);
2051
- break;
2052
- case 'month':
2053
- case 'timeline-month':
2054
- this.vm.setCurrentDate(date.add('month', forward ? 1 : -1).date);
2055
- break;
2056
- case 'timeline-year':
2057
- this.vm.setCurrentDate(date.add('year', forward ? 1 : -1).date);
2058
- break;
2059
- }
2060
- this.popover()?.close();
2061
- this.calendar()?.render();
2062
- this.sidebarCalendar()?.render();
2063
- this.schedulerComponent()?.refresh();
2064
- }
2065
- handleCalendarSlotClick(event) {
2066
- if (event.component.activeView !== event.component.depth)
2067
- return;
2068
- const clickedDate = event.item;
2069
- const currentView = this.vm.currentViewMode();
2070
- if (this.rangeBasedViews.includes(currentView)) {
2071
- const selectionStartDate = this.vm.rangeStartDate();
2072
- if (!selectionStartDate) {
2073
- // Clear any previous range selection before starting a new one
2074
- this.vm.setDaysCount(7); // Reset to default
2075
- this.vm.setRangeStartDate(clickedDate);
2076
- this.calendar()?.render();
2077
- this.sidebarCalendar()?.render();
2078
- return;
2079
- }
2080
- const date1 = selectionStartDate.getTime();
2081
- const date2 = clickedDate.getTime();
2082
- const newStartDate = new Date(Math.min(date1, date2));
2083
- const newEndDate = new Date(Math.max(date1, date2));
2084
- const differenceInDays = this.calculateDifferenceInDays(newStartDate, newEndDate);
2085
- // Clear any previous range selection state first to remove any other selection
2086
- this.vm.setRangeStartDate(null);
2087
- // Set the new range selection
2088
- this.vm.setCurrentDate(newStartDate);
2089
- this.vm.setDaysCount(differenceInDays);
2090
- this.calendar()?.render();
2091
- this.sidebarCalendar()?.render();
2092
- this.popover()?.close();
2093
- return;
2094
- }
2095
- const calendarSystem = this.localeService.activeProfile().calendar.system;
2096
- let dateToSet = this.calendarService.create(clickedDate, calendarSystem).startOf('day').date;
2097
- if (currentView === 'week') {
2098
- const day = dateToSet.getDay();
2099
- const weekStart = this.localeService.activeProfile().calendar.week.startsOn;
2100
- let daysToSubtract = day - weekStart;
2101
- if (daysToSubtract < 0) {
2102
- daysToSubtract += 7;
2103
- }
2104
- dateToSet.setDate(dateToSet.getDate() - daysToSubtract);
2105
- }
2106
- this.vm.setCurrentDate(dateToSet);
2107
- this.popover()?.close();
2108
- this.calendar()?.render();
2109
- this.sidebarCalendar()?.render();
2110
- this.schedulerComponent()?.refresh();
2111
- }
2112
- /**
2113
- * Helper function to calculate the difference in whole days between two dates.
2114
- * The result is inclusive (e.g., May 5 to May 6 is a 2-day range).
2115
- */
2116
- calculateDifferenceInDays(start, end) {
2117
- if (!start || !end) {
2118
- return 1;
2119
- }
2120
- const startDate = new Date(start.getFullYear(), start.getMonth(), start.getDate());
2121
- const endDate = new Date(end.getFullYear(), end.getMonth(), end.getDate());
2122
- const timeDifference = endDate.getTime() - startDate.getTime();
2123
- const daysDifference = Math.round(timeDifference / (1000 * 3600 * 24));
2124
- return daysDifference + 1;
2125
- }
2126
- handleTodayClick() {
2127
- this.vm.setRangeStartDate(null);
2128
- let currentDate;
2129
- if (this.vm.currentViewMode() === 'week') {
2130
- currentDate = this.calendarService
2131
- .create(new Date(), this.localeService.activeProfile().calendar.system)
2132
- .startOf('week').date;
2133
- }
2134
- else {
2135
- currentDate = new Date();
2136
- }
2137
- this.vm.setCurrentDate(currentDate);
2138
- this.popover()?.close();
2139
- this.calendar()?.render();
2140
- this.sidebarCalendar()?.render();
2141
- this.schedulerComponent()?.refresh();
2142
- }
2143
- handleTaskTypeSelectionChange(selectedValues) {
2144
- // Convert single value to array if needed (for radio mode)
2145
- const values = Array.isArray(selectedValues) ? selectedValues : selectedValues ? [selectedValues] : [];
2146
- // If nothing is selected, pass empty array to mean "all task types".
2147
- this.vm.setSelectedTaskTypeNames(values, this.isQueryParam());
2148
- }
2149
- handleCalendarEventTypeSelectionChange(selectedValues) {
2150
- // If nothing is selected, pass empty array to show no types
2151
- this.vm.setSelectedCalendarEventTypeIds(selectedValues || [], this.isQueryParam());
2152
- // Refresh calendar view to update holidays
2153
- this.schedulerComponent()?.refresh();
2154
- }
2155
- async loadFromRoute() {
2156
- const snapshot = this.activatedRoute.snapshot.queryParamMap;
2157
- const view = snapshot.get('view') ?? null;
2158
- const allValidViews = this.menuItems().flatMap((c) => (c.children ? c.children.map((child) => child.key) : c.key));
2159
- if (view && allValidViews.includes(view)) {
2160
- this.vm.setViewMode(view);
2161
- }
2162
- else if (!this.vm.currentViewMode()) {
2163
- this.vm.setViewMode('day');
2164
- }
2165
- const type = snapshot.getAll('type');
2166
- const assignee = snapshot.getAll('assignee');
2167
- const reporter = snapshot.getAll('reporter');
2168
- const priority = snapshot.getAll('priority');
2169
- if (type.length || assignee.length || priority.length || reporter.length) {
2170
- this.isQueryParam.set(true);
2171
- this.vm.setSelectedTaskTypeNames(type, true);
2172
- this.vm.setSelectedAssigneeIds(assignee, true);
2173
- this.vm.setSelectedReporterIds(reporter, true);
2174
- this.vm.setSelectedPriorities(priority, true);
2175
- }
2176
- const dateRange = snapshot.get('dateRange');
2177
- if (dateRange) {
2178
- const range = this.taskBoardService.rangeCalculator(dateRange);
2179
- if (range) {
2180
- this.vm.setCurrentDate(range.from);
2181
- this.vm.setDaysCount(this.calculateDifferenceInDays(range.from, range.end));
2182
- switch (dateRange) {
2183
- case 'today':
2184
- this.vm.setViewMode('day');
2185
- break;
2186
- case 'this-week':
2187
- this.vm.setViewMode('week');
2188
- this.vm.setRangeStartDate(range.from);
2189
- break;
2190
- case 'this-month':
2191
- this.vm.setViewMode('month');
2192
- break;
2193
- }
2194
- }
2195
- }
2196
- }
2197
- /**
2198
- * Checks if the currently selected task is still present in the list of visible tasks.
2199
- * If not, it clears the selection to prevent showing details for a hidden task.
2200
- * @param visibleTasks The new array of tasks that will be displayed.
2201
- */
2202
- validateSelectedTask(visibleTasks) {
2203
- const currentSelectedTask = this.vm.selectedTask();
2204
- // Proceed only if a task is actually selected
2205
- if (currentSelectedTask) {
2206
- // Check if any task in the new list has the same ID as the selected one
2207
- const isSelectedTaskVisible = visibleTasks.some((task) => task.id === currentSelectedTask.id);
2208
- // If the selected task is NOT in the new list, clear the selection.
2209
- if (!isSelectedTaskVisible) {
2210
- this.vm.selectTask(null);
2211
- }
2212
- }
2213
- }
2214
- async getResources() {
2215
- if (this.vm.selectedTaskTypeNames().length !== 1) {
2216
- this.resources.set([]);
2217
- return;
2218
- }
2219
- const resources = await this.taskBoardService.getResources(this.vm.selectedTaskTypeNames()[0] ?? '');
2220
- this.resources.set(resources);
2221
- }
2222
- toggleSidebar() {
2223
- this.sidebarCollapsed.update((v) => !v);
2224
- }
2225
- toggleStartSide() {
2226
- this.layout()?.toggleStartSide();
2227
- }
2228
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardPage, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2229
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMTaskBoardPage, isStandalone: true, selector: "ng-component", providers: [
2230
- {
2231
- provide: AXPPageLayoutBase,
2232
- useExisting: AXMTaskBoardPage,
2233
- },
2234
- ], viewQueries: [{ propertyName: "popover", first: true, predicate: ["popover"], descendants: true, isSignal: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true, isSignal: true }, { propertyName: "sidebarCalendar", first: true, predicate: ["sidebarCalendar"], descendants: true, isSignal: true }, { propertyName: "contextMenu", first: true, predicate: ["rootContextMenu"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <axp-layout-start-side\n class=\"ax-border-e ax-lightest-surface ax-h-full ax-min-w-0\"\n [style.width]=\"sidebarCollapsed() ? 'auto' : null\"\n >\n <axp-layout-header\n class=\"ax-flex !ax-flex-row ax-items-center ax-gap-2\"\n [class.ax-justify-center]=\"sidebarCollapsed()\"\n [class.ax-border-b]=\"!sidebarCollapsed()\"\n >\n @if (!sidebarCollapsed()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'sidebar' }\"></ng-container>\n }\n <ax-button look=\"blank\" color=\"neutral\" (onClick)=\"toggleSidebar()\" [iconOnly]=\"true\">\n <ax-icon [icon]=\"sidebarCollapsed() ? 'fa-light fa-chevrons-right' : 'fa-light fa-chevrons-left'\"></ax-icon>\n </ax-button>\n </axp-layout-header>\n\n @if (!sidebarCollapsed()) {\n <axp-layout-content class=\"ax-flex ax-flex-col ax-min-h-0 ax-overflow-y-auto\">\n <div class=\"ax-p-4 ax-flex ax-flex-col ax-gap-6\">\n <div class=\"ax-flex ax-flex-col ax-gap-3\">\n <ax-calendar\n #sidebarCalendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"currentDateForCalendar()\"\n [dayCellTemplate]=\"dayCellTemplate\"\n [monthCellTemplate]=\"monthCellTemplate\"\n class=\"ax-single-range-calendar ax-border ax-rounded-lg\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n </ax-calendar>\n </div>\n\n <div axAccordionGroup [accordion]=\"false\">\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarFilterTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.title-plural' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarFilterTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n <div axAccordionItemContent>\n <axm-task-board-filters #filtersComponent [isQueryParam]=\"isQueryParam()\"></axm-task-board-filters>\n </div>\n </div>\n @if (!isNonCalendarView()) {\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarEventTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.calendars' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarEventTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n @if (calendarEventTypeItems().length > 0) {\n <div axAccordionItemContent>\n <div class=\"ax-pt-2\">\n <ax-selection-list\n [items]=\"calendarEventTypeItems()\"\n [ngModel]=\"selectedCalendarEventTypeValues()\"\n (onValueChanged)=\"handleCalendarEventTypeSelectionChange($event.value)\"\n direction=\"vertical\"\n [multiple]=\"true\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </axp-layout-content>\n }\n </axp-layout-start-side>\n <axp-page-toolbar>\n <axp-layout-prefix class=\"sm:ax-flex-row ax-flex-col ax-items-start\">\n <div class=\"ax-scheduler-header ax-w-max ax-sm sm:ax-md\">\n <ax-button look=\"blank\" (onClick)=\"changeDate(false)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-left arrow-icon\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"timeText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"changeDate(true)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-right arrow-icon\"></ax-icon>\n </ax-button>\n <!-- <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n #calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"vm.currentDate()\"\n class=\"ax-single-range-calendar\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n <ax-footer>\n <ax-button\n look=\"link\"\n color=\"primary\"\n [text]=\"todayButtonText()\"\n (onClick)=\"handleTodayClick()\"\n ></ax-button>\n </ax-footer>\n </ax-calendar>\n </div>\n </ax-popover> -->\n </div>\n </axp-layout-prefix>\n\n <axp-layout-suffix>\n @if (deviceService.isSmall()) {\n <ax-button id=\"axp-toolbar-btn-filters\" (onClick)=\"toggleStartSide()\" [iconOnly]=\"true\" [color]=\"'default'\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button>\n }\n <!-- @if (!deviceService.isSmall()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'toolbar' }\"></ng-container>\n } -->\n\n <!-- @if(deviceService.isLarge()) {\n <ax-button (onClick)=\"vm.toggleDetailPanel()\">\n <ax-icon icon=\"{{ vm.isDetailPanelOpen() ? 'fa-solid fa-square-info' : 'fa-light fa-square-info' }}\"></ax-icon>\n </ax-button>\n } -->\n </axp-layout-suffix>\n </axp-page-toolbar>\n <axp-page-content class=\"ax-flex ax-flex-row ax-gap-2\">\n @if (isReady()) { @switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\"\n [(tasks)]=\"resolvedTasks\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-kanban-view>\n } @case('grid') {\n <axm-task-board-grid-view\n class=\"ax-h-full ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n ></axm-task-board-grid-view>\n } @case('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n ></axm-task-board-status-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\"\n [startingDate]=\"vm.currentDate()\"\n [dataSource]=\"schedulerDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\"\n (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"\n ></axm-task-board-calendar-view>\n } }\n <ax-context-menu\n #rootContextMenu\n [closeOn]=\"'leave'\"\n [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n } } @else {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-w-full ax-h-full\">\n <ax-loading></ax-loading>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #viewSelectorTemplate let-location=\"location\">\n @if (location === 'sidebar') {\n <ax-button\n class=\"ax-grow\"\n [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\"\n >\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #sidebarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n } @else {\n <ax-button [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #toolbarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n }\n</ng-template>\n\n<ng-template #dayCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? slot.slot.date?.day ?? '' }}</span>\n @if (slot.slot.date && getDayDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n\n<ng-template #monthCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? '' }}</span>\n @if (slot.slot.date && getMonthDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n", styles: ["html[dir=rtl] axp-page-layout axp-page-toolbar axp-layout-prefix .ax-scheduler-header .arrow-icon:before{-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scaleX(-1)}.ax-single-range-calendar .ax-range-start,.ax-single-range-calendar .ax-range-end{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.85)!important}.ax-single-range-calendar .ax-range-start:hover,.ax-single-range-calendar .ax-range-end:hover{background-color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-single-range-calendar .ax-range-start.ax-state-holiday,.ax-single-range-calendar .ax-range-end.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.85)!important}.ax-single-range-calendar .ax-range-between{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.65)}.ax-single-range-calendar .ax-range-between.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.65)}.ax-single-range-calendar ax-footer{display:flex;justify-content:center;border-color:rgba(var(--ax-comp-calendar-view-header-border-color));border-top-width:var(--ax-comp-calendar-view-header-border-width, 1px)}axp-page-content:not(:has(axm-task-board-status-grouped-grid-view,axm-task-board-time-grouped-grid-view)){overflow-y:hidden}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
2235
- //
2236
- AXMenuModule }, { kind: "component", type: i3.AXMenuItemComponent, selector: "ax-menu-item", inputs: ["name", "data", "disabled", "color"], outputs: ["onClick"] }, { kind: "component", type: i3.AXMenuComponent, selector: "ax-menu", inputs: ["orientation", "openOn", "closeOn", "items", "hasArrow"], outputs: ["onItemClick"] }, { kind: "component", type: i3.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "closeOnRouteChange", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$4.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i7.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i8.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXAccordionModule }, { kind: "ngmodule", type: AXAccordionCdkModule }, { kind: "directive", type: i9.AXAccordionGroupDirective, selector: "[axAccordionGroup]", inputs: ["accordion", "activeIndex", "collapsedOnItemClick"], exportAs: ["axAccordionGroup"] }, { kind: "directive", type: i9.AXAccordionItemContentDirective, selector: "[axAccordionItemContent]", inputs: ["transition"], exportAs: ["axAccordionItemContent"] }, { kind: "directive", type: i9.AXAccordionItemHeaderDirective, selector: "[axAccordionItemHeader]", exportAs: ["axAccordionItemHeader"] }, { kind: "directive", type: i9.AXAccordionItemDirective, selector: "[axAccordionItem]", inputs: ["isCollapsed"], outputs: ["isCollapsedChange", "onClick"], exportAs: ["axAccordionItem"] }, { kind: "component", type:
2237
- //
2238
- AXPThemeLayoutBlockComponent, selector: " axp-page-content, axp-page-footer-container, axp-page-footer, axp-page-header, axp-page-header-container, axp-page-toolbar, axp-layout-content, axp-layout-page-content, axp-layout-sections, axp-layout-body, axp-layout-page-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title-bar, axp-layout-title, axp-layout-title-actions, axp-layout-nav-button, axp-layout-description, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXMTaskBoardCalendarViewComponent, selector: "axm-task-board-calendar-view", inputs: ["resources", "refreshNonce", "startingDate", "selectedView", "dataSource"], outputs: ["onTaskClick", "onTaskChanged", "onMonthSlotDblClicked", "onActionClick", "component", "onTaskRightClick", "onRangeChanged"] }, { kind: "component", type: AXMTaskBoardKanbanViewComponent, selector: "axm-task-board-kanban-view", inputs: ["tasks"], outputs: ["tasksChange", "onTaskClick", "onTaskChanged", "component", "onActionClick"] }, { kind: "component", type: AXMTaskBoardGridViewComponent, selector: "axm-task-board-grid-view", inputs: ["dataSource", "refreshNonce"], outputs: ["onTaskClick"] }, { kind: "component", type: AXMTaskBoardStatusGroupedGridViewComponent, selector: "axm-task-board-status-grouped-grid-view", inputs: ["provider", "dataSource", "refreshNonce"], outputs: ["onTaskClick"] }, { kind: "component", type: AXMTaskBoardDetailPanel, selector: "axm-task-board-detail-panel" }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: AXCalendarComponent, selector: "ax-calendar", inputs: ["rtl", "readonly", "value", "name", "disabled", "depth", "activeView", "minValue", "maxValue", "disabledDates", "holidayDates", "type", "dayCellTemplate", "monthCellTemplate", "yearCellTemplate", "cellClass", "showNavigation", "count", "id", "weekend", "weekdays"], outputs: ["onOptionChanged", "valueChange", "onValueChanged", "minValueChange", "maxValueChange", "onBlur", "onFocus", "depthChange", "typeChange", "activeViewChange", "disabledDatesChange", "holidayDatesChange", "onNavigate", "onSlotClick", "countChange"] }, { kind: "component", type: AXMTaskBoardFiltersComponent, selector: "axm-task-board-filters", inputs: ["isQueryParam"], outputs: ["applyClicked"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i10.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "size", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }, { kind: "component", type: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "component", type: AXPThemeLayoutHeaderComponent, selector: "axp-layout-header" }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2239
- }
2240
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMTaskBoardPage, decorators: [{
2241
- type: Component,
2242
- args: [{ imports: [
2243
- FormsModule,
2244
- CommonModule,
2245
- RouterModule,
2246
- //
2247
- AXMenuModule,
2248
- AXButtonModule,
2249
- AXDropdownButtonModule,
2250
- AXTranslationModule,
2251
- AXDecoratorModule,
2252
- AXLoadingModule,
2253
- AXBreadcrumbsModule,
2254
- AXBadgeModule,
2255
- AXAccordionModule,
2256
- AXAccordionCdkModule,
2257
- //
2258
- AXPThemeLayoutBlockComponent,
2259
- AXPPageLayoutComponent,
2260
- AXMTaskBoardCalendarViewComponent,
2261
- AXMTaskBoardKanbanViewComponent,
2262
- AXMTaskBoardGridViewComponent,
2263
- AXMTaskBoardStatusGroupedGridViewComponent,
2264
- AXMTaskBoardDetailPanel,
2265
- AXDropdownPanelComponent,
2266
- AXPopoverModule,
2267
- AXCalendarComponent,
2268
- AXMTaskBoardFiltersComponent,
2269
- AXCheckBoxModule,
2270
- AXFormModule,
2271
- AXLabelModule,
2272
- AXSelectionListModule,
2273
- AXPThemeLayoutStartSideComponent,
2274
- AXPThemeLayoutHeaderComponent,
2275
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
2276
- {
2277
- provide: AXPPageLayoutBase,
2278
- useExisting: AXMTaskBoardPage,
2279
- },
2280
- ], template: "<axp-page-layout *translate=\"let t\">\n <axp-layout-start-side\n class=\"ax-border-e ax-lightest-surface ax-h-full ax-min-w-0\"\n [style.width]=\"sidebarCollapsed() ? 'auto' : null\"\n >\n <axp-layout-header\n class=\"ax-flex !ax-flex-row ax-items-center ax-gap-2\"\n [class.ax-justify-center]=\"sidebarCollapsed()\"\n [class.ax-border-b]=\"!sidebarCollapsed()\"\n >\n @if (!sidebarCollapsed()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'sidebar' }\"></ng-container>\n }\n <ax-button look=\"blank\" color=\"neutral\" (onClick)=\"toggleSidebar()\" [iconOnly]=\"true\">\n <ax-icon [icon]=\"sidebarCollapsed() ? 'fa-light fa-chevrons-right' : 'fa-light fa-chevrons-left'\"></ax-icon>\n </ax-button>\n </axp-layout-header>\n\n @if (!sidebarCollapsed()) {\n <axp-layout-content class=\"ax-flex ax-flex-col ax-min-h-0 ax-overflow-y-auto\">\n <div class=\"ax-p-4 ax-flex ax-flex-col ax-gap-6\">\n <div class=\"ax-flex ax-flex-col ax-gap-3\">\n <ax-calendar\n #sidebarCalendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"currentDateForCalendar()\"\n [dayCellTemplate]=\"dayCellTemplate\"\n [monthCellTemplate]=\"monthCellTemplate\"\n class=\"ax-single-range-calendar ax-border ax-rounded-lg\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n </ax-calendar>\n </div>\n\n <div axAccordionGroup [accordion]=\"false\">\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarFilterTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.title-plural' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarFilterTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n <div axAccordionItemContent>\n <axm-task-board-filters #filtersComponent [isQueryParam]=\"isQueryParam()\"></axm-task-board-filters>\n </div>\n </div>\n @if (!isNonCalendarView()) {\n <div\n class=\"ax-mb-2 ax-w-full ax-border ax-p-2 ax-rounded-lg\"\n axAccordionItem\n #calendarEventTypeAccordion=\"axAccordionItem\"\n >\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-select-none ax-cursor-pointer\"\n axAccordionItemHeader\n >\n <h3 class=\"ax-text-sm ax-font-semibold\">\n {{ ('@task-management:task-board.filter.calendars' | translate | async)! }}\n </h3>\n <ax-icon\n [icon]=\"calendarEventTypeAccordion?.isCollapsed() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-up'\"\n class=\"ax-transition-transform\"\n ></ax-icon>\n </div>\n @if (calendarEventTypeItems().length > 0) {\n <div axAccordionItemContent>\n <div class=\"ax-pt-2\">\n <ax-selection-list\n [items]=\"calendarEventTypeItems()\"\n [ngModel]=\"selectedCalendarEventTypeValues()\"\n (onValueChanged)=\"handleCalendarEventTypeSelectionChange($event.value)\"\n direction=\"vertical\"\n [multiple]=\"true\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center\">\n @if (item.icon) {\n <i [class]=\"item.icon\"></i>\n }\n <span [class]=\"item.icon ? 'ax-ml-2' : ''\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </axp-layout-content>\n }\n </axp-layout-start-side>\n <axp-page-toolbar>\n <axp-layout-prefix class=\"sm:ax-flex-row ax-flex-col ax-items-start\">\n <div class=\"ax-scheduler-header ax-w-max ax-sm sm:ax-md\">\n <ax-button look=\"blank\" (onClick)=\"changeDate(false)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-left arrow-icon\"></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"timeText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"changeDate(true)\">\n <ax-icon class=\"ax-icon ax-text-xl ax-icon-chevron-right arrow-icon\"></ax-icon>\n </ax-button>\n <!-- <ax-popover [target]=\"date\" [placement]=\"'bottom'\" #popover [adaptivityEnabled]=\"true\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n #calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [cellClass]=\"getCellClass\"\n [ngModel]=\"vm.currentDate()\"\n class=\"ax-single-range-calendar\"\n (onSlotClick)=\"handleCalendarSlotClick($event)\"\n >\n <ax-footer>\n <ax-button\n look=\"link\"\n color=\"primary\"\n [text]=\"todayButtonText()\"\n (onClick)=\"handleTodayClick()\"\n ></ax-button>\n </ax-footer>\n </ax-calendar>\n </div>\n </ax-popover> -->\n </div>\n </axp-layout-prefix>\n\n <axp-layout-suffix>\n @if (deviceService.isSmall()) {\n <ax-button id=\"axp-toolbar-btn-filters\" (onClick)=\"toggleStartSide()\" [iconOnly]=\"true\" [color]=\"'default'\">\n <i class=\"fa-light fa-bars\"></i>\n </ax-button>\n }\n <!-- @if (!deviceService.isSmall()) {\n <ng-container *ngTemplateOutlet=\"viewSelectorTemplate; context: { location: 'toolbar' }\"></ng-container>\n } -->\n\n <!-- @if(deviceService.isLarge()) {\n <ax-button (onClick)=\"vm.toggleDetailPanel()\">\n <ax-icon icon=\"{{ vm.isDetailPanelOpen() ? 'fa-solid fa-square-info' : 'fa-light fa-square-info' }}\"></ax-icon>\n </ax-button>\n } -->\n </axp-layout-suffix>\n </axp-page-toolbar>\n <axp-page-content class=\"ax-flex ax-flex-row ax-gap-2\">\n @if (isReady()) { @switch(vm.currentViewMode()) { @case('kanban') {\n <axm-task-board-kanban-view\n class=\"axp-kanban-container ax-h-full ax-w-full ax-min-w-0\"\n [(tasks)]=\"resolvedTasks\"\n (onTaskClick)=\"vm.selectTask($event)\"\n (onActionClick)=\"handleContextMenu($event)\"\n ></axm-task-board-kanban-view>\n } @case('grid') {\n <axm-task-board-grid-view\n class=\"ax-h-full ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n ></axm-task-board-grid-view>\n } @case('status-grouped-grid') {\n <axm-task-board-status-grouped-grid-view\n class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full ax-min-w-0\"\n [dataSource]=\"gridDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n ></axm-task-board-status-grouped-grid-view>\n } @default {\n <axm-task-board-calendar-view\n class=\"axp-scheduler-container ax-h-full ax-w-full ax-min-w-0\"\n [resources]=\"resources()\"\n [startingDate]=\"vm.currentDate()\"\n [dataSource]=\"schedulerDataSource\"\n [refreshNonce]=\"refreshNonce()\"\n (onTaskClick)=\"vm.selectTask($event)\"\n [selectedView]=\"vm.currentViewMode()\"\n (onActionClick)=\"handleContextMenu($event)\"\n (onTaskRightClick)=\"handleContextMenu($event)\"\n (component)=\"schedulerComponentChanged($event)\"\n (onMonthSlotDblClicked)=\"handleMonthSlotDblClicked($event)\"\n ></axm-task-board-calendar-view>\n } }\n <ax-context-menu\n #rootContextMenu\n [closeOn]=\"'leave'\"\n [orientation]=\"'vertical'\"\n (onOpening)=\"handleContextMenuOnOpening($event)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n @if (vm.isDetailPanelOpen() && deviceService.isLarge()) {\n <axm-task-board-detail-panel></axm-task-board-detail-panel>\n } } @else {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-w-full ax-h-full\">\n <ax-loading></ax-loading>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #viewSelectorTemplate let-location=\"location\">\n @if (location === 'sidebar') {\n <ax-button\n class=\"ax-grow\"\n [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\"\n >\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #sidebarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, sidebarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n } @else {\n <ax-button [text]=\"('@task-management:task-board.view.' + selectedViewMode().text | translate | async)!\">\n <ax-prefix><ax-icon [icon]=\"selectedViewMode().icon\"></ax-icon></ax-prefix>\n <ax-dropdown-panel #toolbarDropdownPanel>\n <ax-menu [orientation]=\"'vertical'\" class=\"ax-menu-container\">\n @for (category of menuItems(); track category.key) {\n <ng-container>\n @if (category.children && category.children.length > 0) {\n <ax-menu-item>\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n @for (child of category.children; track child.key) {\n <ax-menu-item (onClick)=\"handleViewChange(child.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"child.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.view.' + child.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ax-menu-item>\n } @else {\n <ax-menu-item (onClick)=\"handleViewChange(category.key, toolbarDropdownPanel)\">\n <ax-prefix>\n <ax-icon [icon]=\"category.icon\"></ax-icon>\n </ax-prefix>\n <ax-text>{{ ('@task-management:task-board.' + category.text | translate | async)! }}</ax-text>\n </ax-menu-item>\n }\n </ng-container>\n }\n </ax-menu>\n </ax-dropdown-panel>\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n }\n</ng-template>\n\n<ng-template #dayCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? slot.slot.date?.day ?? '' }}</span>\n @if (slot.slot.date && getDayDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n\n<ng-template #monthCellTemplate let-slot>\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-between ax-w-full ax-gap-1\"\n [style.padding-bottom]=\"'0.25rem'\"\n >\n <span class=\"ax-flex-1 ax-text-center\">{{ slot.slot.text ?? '' }}</span>\n @if (slot.slot.date && getMonthDataCount(slot.slot.date) > 0) {\n <ax-badge color=\"warning\"></ax-badge>\n }\n </div>\n</ng-template>\n", styles: ["html[dir=rtl] axp-page-layout axp-page-toolbar axp-layout-prefix .ax-scheduler-header .arrow-icon:before{-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scaleX(-1)}.ax-single-range-calendar .ax-range-start,.ax-single-range-calendar .ax-range-end{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.85)!important}.ax-single-range-calendar .ax-range-start:hover,.ax-single-range-calendar .ax-range-end:hover{background-color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-single-range-calendar .ax-range-start.ax-state-holiday,.ax-single-range-calendar .ax-range-end.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.85)!important}.ax-single-range-calendar .ax-range-between{color:rgba(var(--ax-sys-color-on-primary-surface))!important;background-color:rgba(var(--ax-sys-color-primary-surface),.65)}.ax-single-range-calendar .ax-range-between.ax-state-holiday{background-color:rgba(var(--ax-sys-color-danger-surface),.65)}.ax-single-range-calendar ax-footer{display:flex;justify-content:center;border-color:rgba(var(--ax-comp-calendar-view-header-border-color));border-top-width:var(--ax-comp-calendar-view-header-border-width, 1px)}axp-page-content:not(:has(axm-task-board-status-grouped-grid-view,axm-task-board-time-grouped-grid-view)){overflow-y:hidden}\n"] }]
2281
- }], propDecorators: { popover: [{ type: i0.ViewChild, args: ['popover', { isSignal: true }] }], calendar: [{ type: i0.ViewChild, args: ['calendar', { isSignal: true }] }], sidebarCalendar: [{ type: i0.ViewChild, args: ['sidebarCalendar', { isSignal: true }] }], contextMenu: [{ type: i0.ViewChild, args: ['rootContextMenu', { isSignal: true }] }] } });
2282
-
2283
- export { AXMTaskBoardPage };
2284
- //# sourceMappingURL=acorex-modules-task-management-task-board.page-BmUIngWk.mjs.map