@acorex/modules 21.0.0-next.88 → 21.0.0-next.90

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 (310) hide show
  1. package/fesm2022/{acorex-modules-application-management-features-widget-view.component-uc8eGA-k.mjs → acorex-modules-application-management-features-widget-view.component-BNTT58PB.mjs} +2 -2
  2. package/fesm2022/{acorex-modules-application-management-features-widget-view.component-uc8eGA-k.mjs.map → acorex-modules-application-management-features-widget-view.component-BNTT58PB.mjs.map} +1 -1
  3. package/fesm2022/acorex-modules-application-management.mjs +1 -1
  4. package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-WGRBHMmQ.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-BDU2DZEq.mjs} +108 -53
  5. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-BDU2DZEq.mjs.map +1 -0
  6. package/fesm2022/{acorex-modules-assessment-management-assessment-session-answers-view.util-BWG9hI3t.mjs → acorex-modules-assessment-management-assessment-session-answers-view.util-CzgivU3s.mjs} +2 -2
  7. package/fesm2022/{acorex-modules-assessment-management-assessment-session-answers-view.util-BWG9hI3t.mjs.map → acorex-modules-assessment-management-assessment-session-answers-view.util-CzgivU3s.mjs.map} +1 -1
  8. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-BtZ68Wt5.mjs → acorex-modules-assessment-management-fill-assessment-session.command-D6i0YZ3k.mjs} +2 -2
  9. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-BtZ68Wt5.mjs.map → acorex-modules-assessment-management-fill-assessment-session.command-D6i0YZ3k.mjs.map} +1 -1
  10. package/fesm2022/{acorex-modules-assessment-management-index-_rWx2Vje.mjs → acorex-modules-assessment-management-index-BPQ9AiD6.mjs} +3 -3
  11. package/fesm2022/{acorex-modules-assessment-management-index-_rWx2Vje.mjs.map → acorex-modules-assessment-management-index-BPQ9AiD6.mjs.map} +1 -1
  12. package/fesm2022/{acorex-modules-assessment-management-index-CL6OmKwh.mjs → acorex-modules-assessment-management-index-BaMs2R6k.mjs} +3 -3
  13. package/fesm2022/{acorex-modules-assessment-management-index-CL6OmKwh.mjs.map → acorex-modules-assessment-management-index-BaMs2R6k.mjs.map} +1 -1
  14. package/fesm2022/{acorex-modules-assessment-management-index-BDqMpgdu.mjs → acorex-modules-assessment-management-index-YVENsZN4.mjs} +2 -2
  15. package/fesm2022/{acorex-modules-assessment-management-index-BDqMpgdu.mjs.map → acorex-modules-assessment-management-index-YVENsZN4.mjs.map} +1 -1
  16. package/fesm2022/{acorex-modules-assessment-management-index-BwZPHD1o.mjs → acorex-modules-assessment-management-index-oXkGQDat.mjs} +2 -2
  17. package/fesm2022/{acorex-modules-assessment-management-index-BwZPHD1o.mjs.map → acorex-modules-assessment-management-index-oXkGQDat.mjs.map} +1 -1
  18. package/fesm2022/{acorex-modules-assessment-management-preview-question.command-DMeQF_J0.mjs → acorex-modules-assessment-management-preview-question.command-B6rHNI4x.mjs} +2 -2
  19. package/fesm2022/{acorex-modules-assessment-management-preview-question.command-DMeQF_J0.mjs.map → acorex-modules-assessment-management-preview-question.command-B6rHNI4x.mjs.map} +1 -1
  20. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-CKmY95wj.mjs → acorex-modules-assessment-management-preview-questionnaire.command-DXB1Y7hz.mjs} +2 -2
  21. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-CKmY95wj.mjs.map → acorex-modules-assessment-management-preview-questionnaire.command-DXB1Y7hz.mjs.map} +1 -1
  22. package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-CXf2p-tS.mjs → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-D2CNfj8T.mjs} +2 -2
  23. package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-CXf2p-tS.mjs.map → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-D2CNfj8T.mjs.map} +1 -1
  24. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-CLZuPzUo.mjs → acorex-modules-assessment-management-questionnaire-viewer-popup.component-CF_tV-2p.mjs} +2 -2
  25. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-CLZuPzUo.mjs.map → acorex-modules-assessment-management-questionnaire-viewer-popup.component-CF_tV-2p.mjs.map} +1 -1
  26. package/fesm2022/{acorex-modules-assessment-management-review-assessment-session.command-CcGyOKUI.mjs → acorex-modules-assessment-management-review-assessment-session.command-CtEvoUxA.mjs} +3 -3
  27. package/fesm2022/{acorex-modules-assessment-management-review-assessment-session.command-CcGyOKUI.mjs.map → acorex-modules-assessment-management-review-assessment-session.command-CtEvoUxA.mjs.map} +1 -1
  28. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-CmieuVjM.mjs → acorex-modules-assessment-management-view-session-answers.command-CkyBkiXC.mjs} +3 -3
  29. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-CmieuVjM.mjs.map → acorex-modules-assessment-management-view-session-answers.command-CkyBkiXC.mjs.map} +1 -1
  30. package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
  31. package/fesm2022/acorex-modules-asset-management.mjs +37 -23
  32. package/fesm2022/acorex-modules-asset-management.mjs.map +1 -1
  33. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-CMRT9dQC.mjs → acorex-modules-auth-acorex-modules-auth-Nw701LHa.mjs} +30 -30
  34. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-CMRT9dQC.mjs.map → acorex-modules-auth-acorex-modules-auth-Nw701LHa.mjs.map} +1 -1
  35. package/fesm2022/{acorex-modules-auth-app-chooser.component-mOPBXcQc.mjs → acorex-modules-auth-app-chooser.component-FqCIt_8E.mjs} +2 -2
  36. package/fesm2022/{acorex-modules-auth-app-chooser.component-mOPBXcQc.mjs.map → acorex-modules-auth-app-chooser.component-FqCIt_8E.mjs.map} +1 -1
  37. package/fesm2022/{acorex-modules-auth-change-password.command-CceYk6DE.mjs → acorex-modules-auth-change-password.command-DND9Oka4.mjs} +2 -2
  38. package/fesm2022/{acorex-modules-auth-change-password.command-CceYk6DE.mjs.map → acorex-modules-auth-change-password.command-DND9Oka4.mjs.map} +1 -1
  39. package/fesm2022/{acorex-modules-auth-edit-account-info.command-jF8A_Jsy.mjs → acorex-modules-auth-edit-account-info.command-bmdkZzYt.mjs} +2 -2
  40. package/fesm2022/{acorex-modules-auth-edit-account-info.command-jF8A_Jsy.mjs.map → acorex-modules-auth-edit-account-info.command-bmdkZzYt.mjs.map} +1 -1
  41. package/fesm2022/{acorex-modules-auth-lock-screen.command-BvruxuiF.mjs → acorex-modules-auth-lock-screen.command-DSGXqDVD.mjs} +2 -2
  42. package/fesm2022/{acorex-modules-auth-lock-screen.command-BvruxuiF.mjs.map → acorex-modules-auth-lock-screen.command-DSGXqDVD.mjs.map} +1 -1
  43. package/fesm2022/{acorex-modules-auth-login.module-CmBClJv2.mjs → acorex-modules-auth-login.module-DC3dzDf0.mjs} +4 -4
  44. package/fesm2022/{acorex-modules-auth-login.module-CmBClJv2.mjs.map → acorex-modules-auth-login.module-DC3dzDf0.mjs.map} +1 -1
  45. package/fesm2022/{acorex-modules-auth-master.layout-CLGmgSqo.mjs → acorex-modules-auth-master.layout-iMOvevEv.mjs} +2 -2
  46. package/fesm2022/{acorex-modules-auth-master.layout-CLGmgSqo.mjs.map → acorex-modules-auth-master.layout-iMOvevEv.mjs.map} +1 -1
  47. package/fesm2022/{acorex-modules-auth-oauth-callback.component-yxfNoBS-.mjs → acorex-modules-auth-oauth-callback.component-s9WMG92M.mjs} +3 -3
  48. package/fesm2022/{acorex-modules-auth-oauth-callback.component-yxfNoBS-.mjs.map → acorex-modules-auth-oauth-callback.component-s9WMG92M.mjs.map} +1 -1
  49. package/fesm2022/{acorex-modules-auth-open-sessions.command-DsWueHa3.mjs → acorex-modules-auth-open-sessions.command-CLL8rgjE.mjs} +2 -2
  50. package/fesm2022/{acorex-modules-auth-open-sessions.command-DsWueHa3.mjs.map → acorex-modules-auth-open-sessions.command-CLL8rgjE.mjs.map} +1 -1
  51. package/fesm2022/{acorex-modules-auth-password.component-C3_tAt8j.mjs → acorex-modules-auth-password.component-BOEi91f7.mjs} +2 -2
  52. package/fesm2022/{acorex-modules-auth-password.component-C3_tAt8j.mjs.map → acorex-modules-auth-password.component-BOEi91f7.mjs.map} +1 -1
  53. package/fesm2022/{acorex-modules-auth-password.component-BrTEuc51.mjs → acorex-modules-auth-password.component-eA_3LtcO.mjs} +2 -2
  54. package/fesm2022/{acorex-modules-auth-password.component-BrTEuc51.mjs.map → acorex-modules-auth-password.component-eA_3LtcO.mjs.map} +1 -1
  55. package/fesm2022/{acorex-modules-auth-profile-activity-chart.component-C6_0oeCC.mjs → acorex-modules-auth-profile-activity-chart.component-BK1k4Lrh.mjs} +2 -2
  56. package/fesm2022/{acorex-modules-auth-profile-activity-chart.component-C6_0oeCC.mjs.map → acorex-modules-auth-profile-activity-chart.component-BK1k4Lrh.mjs.map} +1 -1
  57. package/fesm2022/{acorex-modules-auth-profile-delete-account-danger-zone.component-EhmuT88j.mjs → acorex-modules-auth-profile-delete-account-danger-zone.component-CHru1be-.mjs} +2 -2
  58. package/fesm2022/{acorex-modules-auth-profile-delete-account-danger-zone.component-EhmuT88j.mjs.map → acorex-modules-auth-profile-delete-account-danger-zone.component-CHru1be-.mjs.map} +1 -1
  59. package/fesm2022/{acorex-modules-auth-profile-page-component.provider-BHEdqBbF.mjs → acorex-modules-auth-profile-page-component.provider-MCsUPTrt.mjs} +4 -4
  60. package/fesm2022/{acorex-modules-auth-profile-page-component.provider-BHEdqBbF.mjs.map → acorex-modules-auth-profile-page-component.provider-MCsUPTrt.mjs.map} +1 -1
  61. package/fesm2022/{acorex-modules-auth-profile-page.component-Q0ixAWtC.mjs → acorex-modules-auth-profile-page.component-DOj2GhFJ.mjs} +2 -2
  62. package/fesm2022/{acorex-modules-auth-profile-page.component-Q0ixAWtC.mjs.map → acorex-modules-auth-profile-page.component-DOj2GhFJ.mjs.map} +1 -1
  63. package/fesm2022/{acorex-modules-auth-remove-pin-code.command-j5iobHAs.mjs → acorex-modules-auth-remove-pin-code.command-CqRxKR4Y.mjs} +2 -2
  64. package/fesm2022/{acorex-modules-auth-remove-pin-code.command-j5iobHAs.mjs.map → acorex-modules-auth-remove-pin-code.command-CqRxKR4Y.mjs.map} +1 -1
  65. package/fesm2022/{acorex-modules-auth-routes-BFACBfAG.mjs → acorex-modules-auth-routes-FZRnzT9V.mjs} +2 -2
  66. package/fesm2022/{acorex-modules-auth-routes-BFACBfAG.mjs.map → acorex-modules-auth-routes-FZRnzT9V.mjs.map} +1 -1
  67. package/fesm2022/{acorex-modules-auth-session-lock-overlay.component-flpWlR8p.mjs → acorex-modules-auth-session-lock-overlay.component-6o2uU9U5.mjs} +2 -2
  68. package/fesm2022/{acorex-modules-auth-session-lock-overlay.component-flpWlR8p.mjs.map → acorex-modules-auth-session-lock-overlay.component-6o2uU9U5.mjs.map} +1 -1
  69. package/fesm2022/{acorex-modules-auth-set-pin-code.command-B0sXGsok.mjs → acorex-modules-auth-set-pin-code.command-CsXJ30Fs.mjs} +2 -2
  70. package/fesm2022/{acorex-modules-auth-set-pin-code.command-B0sXGsok.mjs.map → acorex-modules-auth-set-pin-code.command-CsXJ30Fs.mjs.map} +1 -1
  71. package/fesm2022/{acorex-modules-auth-set-pin-code.component-D95Hn8R-.mjs → acorex-modules-auth-set-pin-code.component-DJhqru7e.mjs} +2 -2
  72. package/fesm2022/{acorex-modules-auth-set-pin-code.component-D95Hn8R-.mjs.map → acorex-modules-auth-set-pin-code.component-DJhqru7e.mjs.map} +1 -1
  73. package/fesm2022/{acorex-modules-auth-settings.provider-D0-hEHd2.mjs → acorex-modules-auth-settings.provider-BJ7lDjbr.mjs} +2 -2
  74. package/fesm2022/{acorex-modules-auth-settings.provider-D0-hEHd2.mjs.map → acorex-modules-auth-settings.provider-BJ7lDjbr.mjs.map} +1 -1
  75. package/fesm2022/{acorex-modules-auth-tenant-chooser.component-DBIVSBaM.mjs → acorex-modules-auth-tenant-chooser.component-DR7rH0m1.mjs} +2 -2
  76. package/fesm2022/{acorex-modules-auth-tenant-chooser.component-DBIVSBaM.mjs.map → acorex-modules-auth-tenant-chooser.component-DR7rH0m1.mjs.map} +1 -1
  77. package/fesm2022/{acorex-modules-auth-two-factor.module-DwXsAUlJ.mjs → acorex-modules-auth-two-factor.module-BvvDIlqe.mjs} +2 -2
  78. package/fesm2022/{acorex-modules-auth-two-factor.module-DwXsAUlJ.mjs.map → acorex-modules-auth-two-factor.module-BvvDIlqe.mjs.map} +1 -1
  79. package/fesm2022/{acorex-modules-auth-view-login-history.command-BpCog3dx.mjs → acorex-modules-auth-view-login-history.command-BUiXUbjA.mjs} +2 -2
  80. package/fesm2022/{acorex-modules-auth-view-login-history.command-BpCog3dx.mjs.map → acorex-modules-auth-view-login-history.command-BUiXUbjA.mjs.map} +1 -1
  81. package/fesm2022/acorex-modules-auth.mjs +1 -1
  82. package/fesm2022/acorex-modules-business-core.mjs +0 -6
  83. package/fesm2022/acorex-modules-business-core.mjs.map +1 -1
  84. package/fesm2022/{acorex-modules-common-search-popup.component-6_qrYkc2.mjs → acorex-modules-common-search-popup.component-BhItO3Sr.mjs} +2 -2
  85. package/fesm2022/{acorex-modules-common-search-popup.component-6_qrYkc2.mjs.map → acorex-modules-common-search-popup.component-BhItO3Sr.mjs.map} +1 -1
  86. package/fesm2022/acorex-modules-common.mjs +39 -52
  87. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  88. package/fesm2022/{acorex-modules-contact-core-acorex-modules-contact-core-CBMdv1GN.mjs → acorex-modules-contact-core-acorex-modules-contact-core-CELmV51p.mjs} +8 -7
  89. package/fesm2022/acorex-modules-contact-core-acorex-modules-contact-core-CELmV51p.mjs.map +1 -0
  90. package/fesm2022/{acorex-modules-contact-core-entity.provider-B8__CVGP.mjs → acorex-modules-contact-core-entity.provider-AH-gvpLJ.mjs} +3 -3
  91. package/fesm2022/{acorex-modules-contact-core-entity.provider-B8__CVGP.mjs.map → acorex-modules-contact-core-entity.provider-AH-gvpLJ.mjs.map} +1 -1
  92. package/fesm2022/{acorex-modules-contact-core-menu.provider-C-iEIPGe.mjs → acorex-modules-contact-core-menu.provider-T9IuzSBf.mjs} +11 -5
  93. package/fesm2022/acorex-modules-contact-core-menu.provider-T9IuzSBf.mjs.map +1 -0
  94. package/fesm2022/{acorex-modules-contact-core-permission-definition.provider-DXjdp846.mjs → acorex-modules-contact-core-permission-definition.provider-CnxI1ujq.mjs} +2 -2
  95. package/fesm2022/{acorex-modules-contact-core-permission-definition.provider-DXjdp846.mjs.map → acorex-modules-contact-core-permission-definition.provider-CnxI1ujq.mjs.map} +1 -1
  96. package/fesm2022/acorex-modules-contact-core.mjs +1 -1
  97. package/fesm2022/{acorex-modules-conversation-acorex-modules-conversation-CUjTT3M7.mjs → acorex-modules-conversation-acorex-modules-conversation-Dc8te-PO.mjs} +6127 -3272
  98. package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-Dc8te-PO.mjs.map +1 -0
  99. package/fesm2022/acorex-modules-conversation-after-message-sent.command-DxDe6o9N.mjs +34 -0
  100. package/fesm2022/acorex-modules-conversation-after-message-sent.command-DxDe6o9N.mjs.map +1 -0
  101. package/fesm2022/{acorex-modules-conversation-assist-delegated-agent-detail-popup.component-CGcngwdA.mjs → acorex-modules-conversation-assist-delegated-agent-detail-popup.component-Dyx_n0bi.mjs} +6 -6
  102. package/fesm2022/{acorex-modules-conversation-assist-delegated-agent-detail-popup.component-CGcngwdA.mjs.map → acorex-modules-conversation-assist-delegated-agent-detail-popup.component-Dyx_n0bi.mjs.map} +1 -1
  103. package/fesm2022/{acorex-modules-conversation-comments-page.component-hopaF6xW.mjs → acorex-modules-conversation-comments-page.component--g4ugC_L.mjs} +2 -2
  104. package/fesm2022/{acorex-modules-conversation-comments-page.component-hopaF6xW.mjs.map → acorex-modules-conversation-comments-page.component--g4ugC_L.mjs.map} +1 -1
  105. package/fesm2022/acorex-modules-conversation-emit-typing-indicator.command-BOldPLQ0.mjs +30 -0
  106. package/fesm2022/acorex-modules-conversation-emit-typing-indicator.command-BOldPLQ0.mjs.map +1 -0
  107. package/fesm2022/acorex-modules-conversation-mark-conversation-unread.command-O_zPrBQ0.mjs +30 -0
  108. package/fesm2022/acorex-modules-conversation-mark-conversation-unread.command-O_zPrBQ0.mjs.map +1 -0
  109. package/fesm2022/acorex-modules-conversation-retry-assist-response.command-DsB-CP3R.mjs +34 -0
  110. package/fesm2022/acorex-modules-conversation-retry-assist-response.command-DsB-CP3R.mjs.map +1 -0
  111. package/fesm2022/{acorex-modules-conversation-send-assist-chat-message.command-CqDrZKFK.mjs → acorex-modules-conversation-send-assist-chat-message.command-g_NgPuxP.mjs} +19 -9
  112. package/fesm2022/acorex-modules-conversation-send-assist-chat-message.command-g_NgPuxP.mjs.map +1 -0
  113. package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-DiDAz-Is.mjs → acorex-modules-conversation-start-assist-chat.command-DeMmJdd6.mjs} +2 -2
  114. package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-DiDAz-Is.mjs.map → acorex-modules-conversation-start-assist-chat.command-DeMmJdd6.mjs.map} +1 -1
  115. package/fesm2022/acorex-modules-conversation-sync-read-state.command-4YxdwLaE.mjs +62 -0
  116. package/fesm2022/acorex-modules-conversation-sync-read-state.command-4YxdwLaE.mjs.map +1 -0
  117. package/fesm2022/acorex-modules-conversation.mjs +1 -1
  118. package/fesm2022/acorex-modules-customer-management.mjs +2 -2
  119. package/fesm2022/acorex-modules-customer-management.mjs.map +1 -1
  120. package/fesm2022/{acorex-modules-dashboard-management-acorex-modules-dashboard-management-Lx3VuIg6.mjs → acorex-modules-dashboard-management-acorex-modules-dashboard-management-kph3UxDu.mjs} +1087 -395
  121. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-kph3UxDu.mjs.map +1 -0
  122. package/fesm2022/{acorex-modules-dashboard-management-index-DvY9N8FF.mjs → acorex-modules-dashboard-management-index-rp9dgARq.mjs} +2 -2
  123. package/fesm2022/{acorex-modules-dashboard-management-index-DvY9N8FF.mjs.map → acorex-modules-dashboard-management-index-rp9dgARq.mjs.map} +1 -1
  124. package/fesm2022/acorex-modules-dashboard-management.mjs +1 -1
  125. package/fesm2022/{acorex-modules-data-management-index-CxVSgxTM.mjs → acorex-modules-data-management-index-BYQncZ6e.mjs} +28 -6
  126. package/fesm2022/acorex-modules-data-management-index-BYQncZ6e.mjs.map +1 -0
  127. package/fesm2022/acorex-modules-data-management.mjs +6 -6
  128. package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
  129. package/fesm2022/{acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs → acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs} +3 -3
  130. package/fesm2022/{acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs.map → acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs.map} +1 -1
  131. package/fesm2022/acorex-modules-document-management.mjs +272 -355
  132. package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
  133. package/fesm2022/{acorex-modules-form-template-management-template-picker.component-cLToc9fP.mjs → acorex-modules-form-template-management-template-picker.component-BGf98ooQ.mjs} +2 -2
  134. package/fesm2022/{acorex-modules-form-template-management-template-picker.component-cLToc9fP.mjs.map → acorex-modules-form-template-management-template-picker.component-BGf98ooQ.mjs.map} +1 -1
  135. package/fesm2022/acorex-modules-form-template-management.mjs +1 -1
  136. package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-DpVAfk3i.mjs → acorex-modules-human-capital-management-acorex-modules-human-capital-management-BZwLfZkb.mjs} +43 -22
  137. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-BZwLfZkb.mjs.map +1 -0
  138. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-BDv_eotn.mjs → acorex-modules-human-capital-management-approve-leave-request.command-B_EBDijL.mjs} +2 -2
  139. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-BDv_eotn.mjs.map → acorex-modules-human-capital-management-approve-leave-request.command-B_EBDijL.mjs.map} +1 -1
  140. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-CT49oS39.mjs → acorex-modules-human-capital-management-assign-position-assignment.command-ZzWBeTv1.mjs} +2 -2
  141. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-CT49oS39.mjs.map → acorex-modules-human-capital-management-assign-position-assignment.command-ZzWBeTv1.mjs.map} +1 -1
  142. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-zAunbLbf.mjs → acorex-modules-human-capital-management-cancel-leave-request.command-Bd3RvlNm.mjs} +2 -2
  143. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-zAunbLbf.mjs.map → acorex-modules-human-capital-management-cancel-leave-request.command-Bd3RvlNm.mjs.map} +1 -1
  144. package/fesm2022/{acorex-modules-human-capital-management-edit-personal-info.command-8LKMNm4Z.mjs → acorex-modules-human-capital-management-edit-personal-info.command-Drbi1WMd.mjs} +2 -6
  145. package/fesm2022/acorex-modules-human-capital-management-edit-personal-info.command-Drbi1WMd.mjs.map +1 -0
  146. package/fesm2022/{acorex-modules-human-capital-management-edit-signature.command-BQ6Ysh-A.mjs → acorex-modules-human-capital-management-edit-signature.command-CRPqnXIj.mjs} +2 -2
  147. package/fesm2022/{acorex-modules-human-capital-management-edit-signature.command-BQ6Ysh-A.mjs.map → acorex-modules-human-capital-management-edit-signature.command-CRPqnXIj.mjs.map} +1 -1
  148. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-CEAUhv0o.mjs → acorex-modules-human-capital-management-reject-leave-request.command-BC-1Kixd.mjs} +2 -2
  149. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-CEAUhv0o.mjs.map → acorex-modules-human-capital-management-reject-leave-request.command-BC-1Kixd.mjs.map} +1 -1
  150. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-DakWOslg.mjs → acorex-modules-human-capital-management-revoke-position-assignment.command-Caylq9Rv.mjs} +2 -2
  151. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-DakWOslg.mjs.map → acorex-modules-human-capital-management-revoke-position-assignment.command-Caylq9Rv.mjs.map} +1 -1
  152. package/fesm2022/{acorex-modules-human-capital-management-start-leave-request-flow.command-BXMGzUuM.mjs → acorex-modules-human-capital-management-start-leave-request-flow.command-BsEwA1VM.mjs} +2 -2
  153. package/fesm2022/{acorex-modules-human-capital-management-start-leave-request-flow.command-BXMGzUuM.mjs.map → acorex-modules-human-capital-management-start-leave-request-flow.command-BsEwA1VM.mjs.map} +1 -1
  154. package/fesm2022/{acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B1s_i8U3.mjs → acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B8xK2iTn.mjs} +2 -2
  155. package/fesm2022/{acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B1s_i8U3.mjs.map → acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B8xK2iTn.mjs.map} +1 -1
  156. package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
  157. package/fesm2022/acorex-modules-learning-management.mjs +1 -1
  158. package/fesm2022/acorex-modules-learning-management.mjs.map +1 -1
  159. package/fesm2022/acorex-modules-location-management.mjs +2 -2
  160. package/fesm2022/acorex-modules-location-management.mjs.map +1 -1
  161. package/fesm2022/acorex-modules-meeting-management.mjs +1 -1
  162. package/fesm2022/acorex-modules-meeting-management.mjs.map +1 -1
  163. package/fesm2022/{acorex-modules-notification-management-acorex-modules-notification-management-DZSXFNgo.mjs → acorex-modules-notification-management-acorex-modules-notification-management-DZWUyu54.mjs} +4 -4
  164. package/fesm2022/{acorex-modules-notification-management-acorex-modules-notification-management-DZSXFNgo.mjs.map → acorex-modules-notification-management-acorex-modules-notification-management-DZWUyu54.mjs.map} +1 -1
  165. package/fesm2022/{acorex-modules-notification-management-notification-page.component-swzDjJUP.mjs → acorex-modules-notification-management-notification-page.component-BNxTMY-C.mjs} +3 -3
  166. package/fesm2022/{acorex-modules-notification-management-notification-page.component-swzDjJUP.mjs.map → acorex-modules-notification-management-notification-page.component-BNxTMY-C.mjs.map} +1 -1
  167. package/fesm2022/acorex-modules-notification-management.mjs +1 -1
  168. package/fesm2022/{acorex-modules-organization-management-acorex-modules-organization-management-B6zOrUAS.mjs → acorex-modules-organization-management-acorex-modules-organization-management-BjKrMO_L.mjs} +37 -37
  169. package/fesm2022/{acorex-modules-organization-management-acorex-modules-organization-management-B6zOrUAS.mjs.map → acorex-modules-organization-management-acorex-modules-organization-management-BjKrMO_L.mjs.map} +1 -1
  170. package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-BG6AQs-j.mjs → acorex-modules-organization-management-add-business-unit-to-business-unit.command-CgqydSZh.mjs} +2 -2
  171. package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-BG6AQs-j.mjs.map → acorex-modules-organization-management-add-business-unit-to-business-unit.command-CgqydSZh.mjs.map} +1 -1
  172. package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-DzA0h9ED.mjs → acorex-modules-organization-management-add-position-to-business-unit.command-B_BIg-aF.mjs} +2 -2
  173. package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-DzA0h9ED.mjs.map → acorex-modules-organization-management-add-position-to-business-unit.command-B_BIg-aF.mjs.map} +1 -1
  174. package/fesm2022/{acorex-modules-organization-management-add-team-to-business-unit.command-5ZGzmp95.mjs → acorex-modules-organization-management-add-team-to-business-unit.command-zFql0VH1.mjs} +2 -2
  175. package/fesm2022/{acorex-modules-organization-management-add-team-to-business-unit.command-5ZGzmp95.mjs.map → acorex-modules-organization-management-add-team-to-business-unit.command-zFql0VH1.mjs.map} +1 -1
  176. package/fesm2022/{acorex-modules-organization-management-entity.provider-DKhXlL2j.mjs → acorex-modules-organization-management-entity.provider-Buchg68Q.mjs} +15 -15
  177. package/fesm2022/{acorex-modules-organization-management-entity.provider-DKhXlL2j.mjs.map → acorex-modules-organization-management-entity.provider-Buchg68Q.mjs.map} +1 -1
  178. package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-DhCn97pE.mjs → acorex-modules-organization-management-feature-definition.provider-CulEun4H.mjs} +2 -2
  179. package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-DhCn97pE.mjs.map → acorex-modules-organization-management-feature-definition.provider-CulEun4H.mjs.map} +1 -1
  180. package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-C1WFmQ2x.mjs → acorex-modules-organization-management-job-definition-pages-component.provider-D3k2BNKU.mjs} +4 -4
  181. package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-C1WFmQ2x.mjs.map → acorex-modules-organization-management-job-definition-pages-component.provider-D3k2BNKU.mjs.map} +1 -1
  182. package/fesm2022/{acorex-modules-organization-management-job-definition-responsibilities-page.component-Bs28OWW8.mjs → acorex-modules-organization-management-job-definition-responsibilities-page.component-CSwHAkh5.mjs} +3 -3
  183. package/fesm2022/{acorex-modules-organization-management-job-definition-responsibilities-page.component-Bs28OWW8.mjs.map → acorex-modules-organization-management-job-definition-responsibilities-page.component-CSwHAkh5.mjs.map} +1 -1
  184. package/fesm2022/{acorex-modules-organization-management-job-definition-skills-page.component-C66FEcxc.mjs → acorex-modules-organization-management-job-definition-skills-page.component-CVo37Mx0.mjs} +2 -2
  185. package/fesm2022/{acorex-modules-organization-management-job-definition-skills-page.component-C66FEcxc.mjs.map → acorex-modules-organization-management-job-definition-skills-page.component-CVo37Mx0.mjs.map} +1 -1
  186. package/fesm2022/{acorex-modules-organization-management-job-level.datasource-DcOVF99r.mjs → acorex-modules-organization-management-job-level.datasource-CMxMInko.mjs} +2 -2
  187. package/fesm2022/{acorex-modules-organization-management-job-level.datasource-DcOVF99r.mjs.map → acorex-modules-organization-management-job-level.datasource-CMxMInko.mjs.map} +1 -1
  188. package/fesm2022/{acorex-modules-organization-management-menu.provider-B0v8w3eH.mjs → acorex-modules-organization-management-menu.provider-BL99vlod.mjs} +3 -3
  189. package/fesm2022/{acorex-modules-organization-management-menu.provider-B0v8w3eH.mjs.map → acorex-modules-organization-management-menu.provider-BL99vlod.mjs.map} +1 -1
  190. package/fesm2022/{acorex-modules-organization-management-org-chart-default-node-contribution.provider-B07M8tKi.mjs → acorex-modules-organization-management-org-chart-default-node-contribution.provider-CfvmOwYD.mjs} +2 -2
  191. package/fesm2022/{acorex-modules-organization-management-org-chart-default-node-contribution.provider-B07M8tKi.mjs.map → acorex-modules-organization-management-org-chart-default-node-contribution.provider-CfvmOwYD.mjs.map} +1 -1
  192. package/fesm2022/{acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-DSvij02R.mjs → acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-CsvhhcoW.mjs} +2 -2
  193. package/fesm2022/{acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-DSvij02R.mjs.map → acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-CsvhhcoW.mjs.map} +1 -1
  194. package/fesm2022/{acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-BYWq-Aco.mjs → acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-Dvo2XEHn.mjs} +2 -2
  195. package/fesm2022/{acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-BYWq-Aco.mjs.map → acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-Dvo2XEHn.mjs.map} +1 -1
  196. package/fesm2022/{acorex-modules-organization-management-org-chart-ux-node-contribution.provider-DiMvAEbk.mjs → acorex-modules-organization-management-org-chart-ux-node-contribution.provider-BsBsdoII.mjs} +2 -2
  197. package/fesm2022/{acorex-modules-organization-management-org-chart-ux-node-contribution.provider-DiMvAEbk.mjs.map → acorex-modules-organization-management-org-chart-ux-node-contribution.provider-BsBsdoII.mjs.map} +1 -1
  198. package/fesm2022/{acorex-modules-organization-management-org-chart.page-DwHB4ZGl.mjs → acorex-modules-organization-management-org-chart.page-DJNfsp4z.mjs} +2 -2
  199. package/fesm2022/{acorex-modules-organization-management-org-chart.page-DwHB4ZGl.mjs.map → acorex-modules-organization-management-org-chart.page-DJNfsp4z.mjs.map} +1 -1
  200. package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-CynLhaYz.mjs → acorex-modules-organization-management-permission-definition.provider-CuReVYo1.mjs} +2 -2
  201. package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-CynLhaYz.mjs.map → acorex-modules-organization-management-permission-definition.provider-CuReVYo1.mjs.map} +1 -1
  202. package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-DUgDxwtI.mjs → acorex-modules-organization-management-remove-position-from-business-unit.command-mPTX8Vpc.mjs} +2 -2
  203. package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-DUgDxwtI.mjs.map → acorex-modules-organization-management-remove-position-from-business-unit.command-mPTX8Vpc.mjs.map} +1 -1
  204. package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-BTAwsZNP.mjs → acorex-modules-organization-management-replace-position-assignee.command-DibpVA88.mjs} +2 -2
  205. package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-BTAwsZNP.mjs.map → acorex-modules-organization-management-replace-position-assignee.command-DibpVA88.mjs.map} +1 -1
  206. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-D904V181.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-zN1Vz3Om.mjs} +2 -2
  207. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-D904V181.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-zN1Vz3Om.mjs.map} +1 -1
  208. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-BMFws_6Y.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-BYOs9nrw.mjs} +2 -2
  209. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-BMFws_6Y.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-BYOs9nrw.mjs.map} +1 -1
  210. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-DXmsR1qV.mjs → acorex-modules-organization-management-responsibilities-matrix.component-DVlThT1h.mjs} +2 -2
  211. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-DXmsR1qV.mjs.map → acorex-modules-organization-management-responsibilities-matrix.component-DVlThT1h.mjs.map} +1 -1
  212. package/fesm2022/{acorex-modules-organization-management-settings.provider-UFqps4Zg.mjs → acorex-modules-organization-management-settings.provider-BxoCS3w7.mjs} +2 -2
  213. package/fesm2022/{acorex-modules-organization-management-settings.provider-UFqps4Zg.mjs.map → acorex-modules-organization-management-settings.provider-BxoCS3w7.mjs.map} +1 -1
  214. package/fesm2022/acorex-modules-organization-management.mjs +1 -1
  215. package/fesm2022/acorex-modules-person-core.mjs +0 -6
  216. package/fesm2022/acorex-modules-person-core.mjs.map +1 -1
  217. package/fesm2022/acorex-modules-platform-dev-tools.mjs +2 -2
  218. package/fesm2022/acorex-modules-platform-dev-tools.mjs.map +1 -1
  219. package/fesm2022/{acorex-modules-platform-management-acorex-modules-platform-management-DsKPOWpy.mjs → acorex-modules-platform-management-acorex-modules-platform-management-B5hMhQp-.mjs} +2 -2
  220. package/fesm2022/{acorex-modules-platform-management-acorex-modules-platform-management-DsKPOWpy.mjs.map → acorex-modules-platform-management-acorex-modules-platform-management-B5hMhQp-.mjs.map} +1 -1
  221. package/fesm2022/{acorex-modules-platform-management-menu-list.component-Br4nL9zq.mjs → acorex-modules-platform-management-menu-list.component-DcOr1v-f.mjs} +3 -3
  222. package/fesm2022/{acorex-modules-platform-management-menu-list.component-Br4nL9zq.mjs.map → acorex-modules-platform-management-menu-list.component-DcOr1v-f.mjs.map} +1 -1
  223. package/fesm2022/acorex-modules-platform-management.mjs +1 -1
  224. package/fesm2022/acorex-modules-product-catalog.mjs +7 -6
  225. package/fesm2022/acorex-modules-product-catalog.mjs.map +1 -1
  226. package/fesm2022/acorex-modules-project-management.mjs +708 -425
  227. package/fesm2022/acorex-modules-project-management.mjs.map +1 -1
  228. package/fesm2022/{acorex-modules-report-management-report-runner-root-page.component-DaPEmTm9.mjs → acorex-modules-report-management-report-runner-root-page.component-CgrBAgqq.mjs} +2 -2
  229. package/fesm2022/{acorex-modules-report-management-report-runner-root-page.component-DaPEmTm9.mjs.map → acorex-modules-report-management-report-runner-root-page.component-CgrBAgqq.mjs.map} +1 -1
  230. package/fesm2022/acorex-modules-report-management.mjs +7 -7
  231. package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
  232. package/fesm2022/acorex-modules-risk-management-preview-risk-matrix-cell.command-CWG3zUBo.mjs +120 -0
  233. package/fesm2022/acorex-modules-risk-management-preview-risk-matrix-cell.command-CWG3zUBo.mjs.map +1 -0
  234. package/fesm2022/acorex-modules-risk-management.mjs +13 -0
  235. package/fesm2022/acorex-modules-risk-management.mjs.map +1 -1
  236. package/fesm2022/acorex-modules-security-management.mjs +1 -1
  237. package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
  238. package/fesm2022/{acorex-modules-settings-management-setting-view.component-CG-GW2yS.mjs → acorex-modules-settings-management-setting-view.component-BRhZR1br.mjs} +109 -15
  239. package/fesm2022/acorex-modules-settings-management-setting-view.component-BRhZR1br.mjs.map +1 -0
  240. package/fesm2022/acorex-modules-settings-management.mjs +1 -1
  241. package/fesm2022/acorex-modules-supplier-management.mjs +1 -1
  242. package/fesm2022/acorex-modules-supplier-management.mjs.map +1 -1
  243. package/fesm2022/acorex-modules-task-management-start-task-flow.command-HYdQOWDe.mjs +115 -0
  244. package/fesm2022/acorex-modules-task-management-start-task-flow.command-HYdQOWDe.mjs.map +1 -0
  245. package/fesm2022/{acorex-modules-task-management-task-board.page-FFhsAyHF.mjs → acorex-modules-task-management-task-board.page-BMTjJlry.mjs} +41 -32
  246. package/fesm2022/acorex-modules-task-management-task-board.page-BMTjJlry.mjs.map +1 -0
  247. package/fesm2022/acorex-modules-task-management.mjs +490 -485
  248. package/fesm2022/acorex-modules-task-management.mjs.map +1 -1
  249. package/fesm2022/{acorex-modules-timesheet-management-report-hours-by-project.query-z38wZLKJ.mjs → acorex-modules-timesheet-management-report-hours-by-project.query-CGc1Q6aB.mjs} +2 -2
  250. package/fesm2022/acorex-modules-timesheet-management-report-hours-by-project.query-CGc1Q6aB.mjs.map +1 -0
  251. package/fesm2022/{acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-BDfvz6fH.mjs → acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-AIcAUd3s.mjs} +2 -2
  252. package/fesm2022/{acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-BDfvz6fH.mjs.map → acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-AIcAUd3s.mjs.map} +1 -1
  253. package/fesm2022/acorex-modules-timesheet-management.mjs +8 -8
  254. package/fesm2022/acorex-modules-timesheet-management.mjs.map +1 -1
  255. package/fesm2022/{acorex-modules-workflow-management-acorex-modules-workflow-management-DJeUheQT.mjs → acorex-modules-workflow-management-acorex-modules-workflow-management-D04WU8wX.mjs} +32 -25
  256. package/fesm2022/acorex-modules-workflow-management-acorex-modules-workflow-management-D04WU8wX.mjs.map +1 -0
  257. package/fesm2022/{acorex-modules-workflow-management-index--6gz3uRb.mjs → acorex-modules-workflow-management-index-Bfzsu6VL.mjs} +2 -2
  258. package/fesm2022/{acorex-modules-workflow-management-index--6gz3uRb.mjs.map → acorex-modules-workflow-management-index-Bfzsu6VL.mjs.map} +1 -1
  259. package/fesm2022/{acorex-modules-workflow-management-index-DV7Uf5hP.mjs → acorex-modules-workflow-management-index-CG1-u2Va.mjs} +3 -3
  260. package/fesm2022/{acorex-modules-workflow-management-index-DV7Uf5hP.mjs.map → acorex-modules-workflow-management-index-CG1-u2Va.mjs.map} +1 -1
  261. package/fesm2022/{acorex-modules-workflow-management-index-C702Snjg.mjs → acorex-modules-workflow-management-index-DtKZARCI.mjs} +3 -3
  262. package/fesm2022/{acorex-modules-workflow-management-index-C702Snjg.mjs.map → acorex-modules-workflow-management-index-DtKZARCI.mjs.map} +1 -1
  263. package/fesm2022/{acorex-modules-workflow-management-save-workflow-definition-activities.command-C60ABOUE.mjs → acorex-modules-workflow-management-save-workflow-definition-activities.command-80PIS1oE.mjs} +2 -2
  264. package/fesm2022/{acorex-modules-workflow-management-save-workflow-definition-activities.command-C60ABOUE.mjs.map → acorex-modules-workflow-management-save-workflow-definition-activities.command-80PIS1oE.mjs.map} +1 -1
  265. package/fesm2022/{acorex-modules-workflow-management-workflow-configurator-widget-column.component-ChnPuG_J.mjs → acorex-modules-workflow-management-workflow-configurator-widget-column.component-CXhrrqa_.mjs} +2 -2
  266. package/fesm2022/{acorex-modules-workflow-management-workflow-configurator-widget-column.component-ChnPuG_J.mjs.map → acorex-modules-workflow-management-workflow-configurator-widget-column.component-CXhrrqa_.mjs.map} +1 -1
  267. package/fesm2022/{acorex-modules-workflow-management-workflow-configurator-widget-edit.component-BqydSkbP.mjs → acorex-modules-workflow-management-workflow-configurator-widget-edit.component-CzPQUA9m.mjs} +47 -25
  268. package/fesm2022/acorex-modules-workflow-management-workflow-configurator-widget-edit.component-CzPQUA9m.mjs.map +1 -0
  269. package/fesm2022/{acorex-modules-workflow-management-workflow-run-history-popup.component-D_yi-Ccp.mjs → acorex-modules-workflow-management-workflow-run-history-popup.component-CTs6Sdm2.mjs} +2 -2
  270. package/fesm2022/{acorex-modules-workflow-management-workflow-run-history-popup.component-D_yi-Ccp.mjs.map → acorex-modules-workflow-management-workflow-run-history-popup.component-CTs6Sdm2.mjs.map} +1 -1
  271. package/fesm2022/{acorex-modules-workflow-management-workflow-task-popover.component-CdvuOzXH.mjs → acorex-modules-workflow-management-workflow-task-popover.component-CaIIzv1r.mjs} +2 -2
  272. package/fesm2022/{acorex-modules-workflow-management-workflow-task-popover.component-CdvuOzXH.mjs.map → acorex-modules-workflow-management-workflow-task-popover.component-CaIIzv1r.mjs.map} +1 -1
  273. package/fesm2022/acorex-modules-workflow-management.mjs +1 -1
  274. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-edit.component-CFF7X1MO.mjs +70 -0
  275. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-edit.component-CFF7X1MO.mjs.map +1 -0
  276. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-view.component-DwC2aHVt.mjs +70 -0
  277. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-view.component-DwC2aHVt.mjs.map +1 -0
  278. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram.types-DmzV305e.mjs +195 -0
  279. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram.types-DmzV305e.mjs.map +1 -0
  280. package/fesm2022/acorex-modules-workplacesafety-management-hazard-risk-ppe-rule-status.provider-BsRNRZ6z.mjs +42 -0
  281. package/fesm2022/acorex-modules-workplacesafety-management-hazard-risk-ppe-rule-status.provider-BsRNRZ6z.mjs.map +1 -0
  282. package/fesm2022/acorex-modules-workplacesafety-management.mjs +630 -307
  283. package/fesm2022/acorex-modules-workplacesafety-management.mjs.map +1 -1
  284. package/package.json +2 -2
  285. package/types/acorex-modules-asset-management.d.ts +7 -3
  286. package/types/acorex-modules-contact-core.d.ts +1 -0
  287. package/types/acorex-modules-conversation.d.ts +898 -161
  288. package/types/acorex-modules-dashboard-management.d.ts +75 -10
  289. package/types/acorex-modules-document-management.d.ts +25 -5
  290. package/types/acorex-modules-human-capital-management.d.ts +4 -0
  291. package/types/acorex-modules-project-management.d.ts +46 -23
  292. package/types/acorex-modules-report-management.d.ts +2 -0
  293. package/types/acorex-modules-task-management.d.ts +100 -15
  294. package/types/acorex-modules-timesheet-management.d.ts +2 -2
  295. package/types/acorex-modules-workflow-management.d.ts +9 -4
  296. package/types/acorex-modules-workplacesafety-management.d.ts +62 -34
  297. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-WGRBHMmQ.mjs.map +0 -1
  298. package/fesm2022/acorex-modules-contact-core-acorex-modules-contact-core-CBMdv1GN.mjs.map +0 -1
  299. package/fesm2022/acorex-modules-contact-core-menu.provider-C-iEIPGe.mjs.map +0 -1
  300. package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-CUjTT3M7.mjs.map +0 -1
  301. package/fesm2022/acorex-modules-conversation-send-assist-chat-message.command-CqDrZKFK.mjs.map +0 -1
  302. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-Lx3VuIg6.mjs.map +0 -1
  303. package/fesm2022/acorex-modules-data-management-index-CxVSgxTM.mjs.map +0 -1
  304. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-DpVAfk3i.mjs.map +0 -1
  305. package/fesm2022/acorex-modules-human-capital-management-edit-personal-info.command-8LKMNm4Z.mjs.map +0 -1
  306. package/fesm2022/acorex-modules-settings-management-setting-view.component-CG-GW2yS.mjs.map +0 -1
  307. package/fesm2022/acorex-modules-task-management-task-board.page-FFhsAyHF.mjs.map +0 -1
  308. package/fesm2022/acorex-modules-timesheet-management-report-hours-by-project.query-z38wZLKJ.mjs.map +0 -1
  309. package/fesm2022/acorex-modules-workflow-management-acorex-modules-workflow-management-DJeUheQT.mjs.map +0 -1
  310. package/fesm2022/acorex-modules-workflow-management-workflow-configurator-widget-edit.component-BqydSkbP.mjs.map +0 -1
@@ -1,19 +1,20 @@
1
1
  import { AXPSessionService, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex/platform/auth';
2
- import { AXP_PROTECTED_ROUTE_GUARDS, AXP_HOME_PAGES, AXP_HOME_PAGE_DEFAULT_KEY, AXP_MENU_PROVIDER, AXPSettingsService } from '@acorex/platform/common';
3
- import { AXPDataSourceDefinitionProviderService, AXP_MODULE_MANIFEST_PROVIDER, provideLazyProvider, AXPDeviceService } from '@acorex/platform/core';
4
- import { AXPStateMessageComponent, AXP_PAGE_COMPONENT_PROVIDER, AXPWidgetPropertyViewerComponent, AXPThemeLayoutBlockComponent } from '@acorex/platform/layout/components';
5
- import { AXPEntityService, AXP_ENTITY_CONFIG_TOKEN, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
2
+ import { AXPEntityCommandScope, AXPSettingsService, AXP_PROTECTED_ROUTE_GUARDS, AXP_HOME_PAGES, AXP_HOME_PAGE_DEFAULT_KEY, AXP_MENU_PROVIDER } from '@acorex/platform/common';
3
+ import { AXPDataSourceDefinitionProviderService, AXPDeviceService, AXP_MODULE_MANIFEST_PROVIDER, provideLazyProvider } from '@acorex/platform/core';
4
+ import { AXPStateMessageComponent, AXPWidgetPropertyViewerComponent, AXP_PAGE_COMPONENT_PROVIDER, AXPThemeLayoutBlockComponent } from '@acorex/platform/layout/components';
5
+ import { AXPEntityService, cloneLayoutArrays, ensureLayoutSection, ensureLayoutPropertyView, resolveEntityPluginDetailPageOrder, ensureListActions, actionExists, AXP_ENTITY_CONFIG_TOKEN, AXP_ENTITY_DEFINITION_LOADER, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_STORAGE_MIDDLEWARE } from '@acorex/platform/layout/entity';
6
6
  import * as i3$2 from '@acorex/platform/layout/widget-core';
7
- import { AXPBaseWidgetComponent, cloneProperty, AXPWidgetGroupEnum, AXPValueWidgetComponent, createStringProperty, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER, AXPWidgetRendererDirective } from '@acorex/platform/layout/widget-core';
7
+ import { AXPBaseWidgetComponent, cloneProperty, AXPWidgetGroupEnum, AXPValueWidgetComponent, createStringProperty, AXPWidgetRendererDirective, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex/platform/layout/widget-core';
8
8
  import { AXP_DATA_SOURCE_OPTIONS_PROPERTY, AXP_APPEARANCE_PROPERTY_GROUP, AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DATA_PROPERTY_GROUP, AXP_BEHAVIOR_PROPERTY_GROUP, AXP_COLOR_PROPERTY, AXP_BG_COLOR_PROPERTY, AXPWidgetsModule } from '@acorex/platform/layout/widgets';
9
9
  import * as i0 from '@angular/core';
10
- import { Injectable, inject, DestroyRef, afterNextRender, signal, effect, computed, ChangeDetectionStrategy, Component, InjectionToken, viewChild, input, ElementRef, ChangeDetectorRef, HostBinding, linkedSignal, HostListener, NgModule, output, contentChild, ViewEncapsulation, untracked, model } from '@angular/core';
11
- import { AXPSystemActionType, AXPWidgetsCatalog, AXPDataGenerator, AXPWidgetsList, AXPPlatformScope } from '@acorex/platform/contracts';
10
+ import { Injectable, inject, computed, DestroyRef, afterNextRender, signal, effect, ChangeDetectionStrategy, Component, InjectionToken, viewChild, input, ElementRef, ChangeDetectorRef, HostBinding, linkedSignal, HostListener, output, contentChild, ViewEncapsulation, NgModule, untracked, model } from '@angular/core';
11
+ import { AXPSystemActionType, AXPWidgetsCatalog, AXPDataGenerator, createMultiLanguageString, AXPPlatformScope, AXPWidgetsList } from '@acorex/platform/contracts';
12
12
  import { AXPCommonMenuKeys, AXP_GLOBAL_SEARCH_CONFIG_TOKEN } from '@acorex/modules/common';
13
13
  import { firstValueFrom, Subject, map, Observable, catchError, throwError, of, finalize, interval, switchMap, fromEvent } from 'rxjs';
14
14
  import * as i4 from '@acorex/core/translation';
15
15
  import { AXTranslationService, AXTranslationModule, resolveMultiLanguageString } from '@acorex/core/translation';
16
16
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
17
+ import { get, isObjectLike, isString, isArray, castArray, set } from 'lodash-es';
17
18
  import { throttleTime, debounceTime } from 'rxjs/operators';
18
19
  import { AXBarChartComponent } from '@acorex/charts/bar-chart';
19
20
  import { AXDonutChartComponent } from '@acorex/charts/donut-chart';
@@ -50,21 +51,22 @@ import * as i1$3 from '@acorex/components/wysiwyg';
50
51
  import { AXWysiwygModule } from '@acorex/components/wysiwyg';
51
52
  import * as i2$1 from '@angular/forms';
52
53
  import { FormsModule } from '@angular/forms';
53
- import { createQueryView, entityMasterCrudActions, entityMasterRecordActions } from '@acorex/platform/layout/entity-contracts';
54
+ import { AXP_WIDGET_PICKER_TAB_CONTEXT, AXPWidgetPickerService, AXPDesignerService } from '@acorex/platform/layout/designer';
54
55
  import { RootConfig as RootConfig$1 } from '@acorex/modules/security-management';
55
56
  import { AXDialogService } from '@acorex/components/dialog';
56
- import { AXP_WIDGET_PICKER_TAB_CONTEXT, AXPWidgetPickerService, AXPDesignerService } from '@acorex/platform/layout/designer';
57
57
  import { signalStore, withState, withComputed, withMethods, patchState, withHooks } from '@ngrx/signals';
58
58
  import { AXPLayoutBuilderService } from '@acorex/platform/layout/builder';
59
59
  import { AXBasePageComponent } from '@acorex/components/page';
60
- import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
61
- import { AXButtonGroupModule } from '@acorex/components/button-group';
60
+ import * as i1$4 from '@acorex/components/loading';
61
+ import { AXLoadingModule } from '@acorex/components/loading';
62
62
  import * as i3$1 from '@acorex/components/dropdown';
63
63
  import { AXDropdownModule } from '@acorex/components/dropdown';
64
+ import { ActivatedRoute } from '@angular/router';
65
+ import { createQueryView, entityMasterCrudActions, entityMasterRecordActions } from '@acorex/platform/layout/entity-contracts';
66
+ import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
67
+ import { AXButtonGroupModule } from '@acorex/components/button-group';
64
68
  import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
65
69
  import { AXPLayoutThemeService } from '@acorex/platform/themes/shared';
66
- import * as i1$4 from '@acorex/components/loading';
67
- import { AXLoadingModule } from '@acorex/components/loading';
68
70
  import { AXLabelModule } from '@acorex/components/label';
69
71
  import * as i5 from '@acorex/components/select-box';
70
72
  import { AXSelectBoxModule } from '@acorex/components/select-box';
@@ -269,6 +271,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
269
271
  //#region ---- Constants ----
270
272
  /** Minimum interval between container resize emissions to subscribers and {@link AXPDashboardWidgetComponent.onContainerSizeChanged}. */
271
273
  const AXPDASHBOARD_WIDGET_CONTAINER_RESIZE_THROTTLE_MS = 100;
274
+ /** Reserved widgets-container key for runtime entity detail context (entity dashboard plugin). */
275
+ const AXPDASHBOARD_ENTITY_CONTEXT_KEY = '__dashboardEntityContext';
276
+ //#endregion
277
+ //#region ---- Context helpers ----
278
+ /**
279
+ * Merges a persisted dashboard model with optional runtime entity context for widget rendering.
280
+ */
281
+ function buildDashboardWidgetsContext(dashboardModel, entityContext) {
282
+ if (!entityContext) {
283
+ return { ...dashboardModel };
284
+ }
285
+ return {
286
+ ...dashboardModel,
287
+ [AXPDASHBOARD_ENTITY_CONTEXT_KEY]: entityContext,
288
+ };
289
+ }
290
+ /**
291
+ * Reads {@link AXPDashboardEntityContext} from a widgets-container context object.
292
+ */
293
+ function readDashboardEntityContext(context) {
294
+ const value = get(context, AXPDASHBOARD_ENTITY_CONTEXT_KEY);
295
+ if (!isObjectLike(value)) {
296
+ return undefined;
297
+ }
298
+ const raw = value;
299
+ const entityType = raw['entityType'];
300
+ const entityId = raw['entityId'];
301
+ const data = raw['data'];
302
+ if (!isString(entityType) || !entityType.trim() || !isString(entityId) || !entityId.trim()) {
303
+ return undefined;
304
+ }
305
+ return {
306
+ entityType: entityType.trim(),
307
+ entityId: entityId.trim(),
308
+ data: isObjectLike(data) ? data : {},
309
+ };
310
+ }
272
311
  //#endregion
273
312
  //#region ---- Dashboard widget base ----
274
313
  /**
@@ -276,8 +315,19 @@ const AXPDASHBOARD_WIDGET_CONTAINER_RESIZE_THROTTLE_MS = 100;
276
315
  * Extend this to add shared dashboard logic and helpers.
277
316
  */
278
317
  class AXPDashboardWidgetComponent extends AXPBaseWidgetComponent {
318
+ /** True when {@link entityContext} is available for dynamic, record-scoped widget data. */
319
+ hasEntityContext() {
320
+ return this.entityContext() != null;
321
+ }
279
322
  constructor() {
280
323
  super();
324
+ //#region ---- Entity context ----
325
+ /**
326
+ * Runtime entity detail context when the dashboard is shown on an entity record (dashboard plugin).
327
+ * Undefined on home/tenant dashboards.
328
+ */
329
+ this.entityContext = computed(() => readDashboardEntityContext(this.contextService.data()), ...(ngDevMode ? [{ debugName: "entityContext" }] : /* istanbul ignore next */ []));
330
+ //#endregion
281
331
  //#region ---- Container resize ----
282
332
  this.containerResizeRawSubject = new Subject();
283
333
  this.containerSizeSubject = new Subject();
@@ -5040,7 +5090,7 @@ class AXPWeatherWidgetViewComponent extends AXPDashboardWidgetComponent {
5040
5090
  provide: AXPWeatherApiAbstract,
5041
5091
  useClass: AXPWeatherApiService,
5042
5092
  },
5043
- ], viewQueries: [{ propertyName: "containerEl", first: true, predicate: ["containerElement"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!-- Weather Widget Component Template -->\n<div class=\"axp-weather-container\" #containerElement>\n <!-- Loading indicator -->\n @if (isLoading()) {\n <div class=\"axp-weather-loading-overlay\">\n <div class=\"axp-weather-loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>{{ '@dashboard:weather.loading' | translate | async }}</span>\n </div>\n </div>\n }\n\n <!-- Error message -->\n @if (hasError()) {\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@dashboard:weather.error.title'\"\n [description]=\"errorMessage()\"\n >\n <button slot=\"actions\" class=\"axp-weather-retry-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>{{ '@dashboard:weather.retry' | translate | async }}</span>\n </button>\n </axp-state-message>\n }\n\n <!-- Weather content - only show when we have data -->\n @if (weatherData()) {\n <!-- Background decorations based on weather condition -->\n <div class=\"axp-weather-background-decorations\">\n <div class=\"axp-weather-decoration\" [ngClass]=\"weatherData()?.current?.condition?.toLowerCase()\"></div>\n <div class=\"axp-weather-gradient-overlay\"></div>\n </div>\n\n <div class=\"axp-weather-inner\">\n <!-- Location information section -->\n <div class=\"axp-weather-location-info\">\n <div class=\"axp-weather-location-icon\">\n <i class=\"fa-solid fa-location-dot\"></i>\n </div>\n <div class=\"axp-weather-location-text\">\n <h2 class=\"axp-weather-location-name\">{{ city() }}</h2>\n </div>\n </div>\n\n <!-- Current weather conditions section -->\n <div class=\"axp-weather-current-weather\">\n <!-- Weather icon and condition name -->\n @if (showCurrentCondition()) {\n <div class=\"axp-weather-condition\">\n <div class=\"axp-weather-icon-wrapper\">\n <div class=\"axp-weather-icon\">\n <img [src]=\"getConditionIcon(weatherData()?.current?.condition || '')\" />\n </div>\n <div\n class=\"axp-weather-icon-glow\"\n [style.background-color]=\"getConditionColor(weatherData()?.current?.condition || '')\"\n ></div>\n </div>\n <div class=\"axp-weather-condition-name\">\n {{ getCurrentCondition() | translate | async }}\n </div>\n </div>\n }\n\n <!-- Temperature display -->\n @if (showTemperature()) {\n <div class=\"axp-weather-temperature\">\n <span class=\"axp-weather-temperature-value\">{{ getCurrentTemperature() }}</span>\n <span class=\"axp-weather-temperature-unit\">{{ getTemperatureUnit() | translate | async }}</span>\n </div>\n }\n </div>\n\n <!-- Weather details section (humidity and wind) -->\n @if (showHumidity() || showWind()) {\n <div class=\"axp-weather-details\">\n <!-- Humidity information -->\n @if (showHumidity()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-droplet\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">\n {{ '@dashboard:weather.humidity' | translate | async }}\n </div>\n <div class=\"axp-weather-detail-value\">{{ getHumidity() }}%</div>\n </div>\n </div>\n }\n\n <!-- Wind speed information -->\n @if (showWind()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-wind\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">\n {{ '@dashboard:weather.wind' | translate | async }}\n </div>\n <div class=\"axp-weather-detail-value\">\n {{ getWindSpeed() }} {{ getWindSpeedUnit() | translate | async }}\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Weather forecast section -->\n @if (showForecast() && weatherData()?.forecast) {\n <div class=\"axp-weather-forecast\">\n <div class=\"axp-weather-forecast-header\">\n <h3 class=\"axp-weather-forecast-title\">\n <i class=\"fa-solid fa-calendar-days\"></i>\n <span class=\"ax-px-1\">{{ '@dashboard:weather.forecast' | translate | async }}</span>\n </h3>\n </div>\n <!-- Loading indicator for forecast -->\n <!-- @if (isForecastLoading()) {\n <div class=\"axp-weather-forecast-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>{{ '@dashboard:weather.loading-forecast' | translate | async }}</span>\n </div>\n } -->\n <!-- Scrollable forecast days display -->\n <div class=\"axp-weather-forecast-items\">\n @for (day of displayedForecast(); track day.day) {\n <div class=\"axp-weather-forecast-day\">\n <div class=\"axp-weather-forecast-day-name\">\n {{ getDayName(parseDate(day.date)) | translate | async }}\n </div>\n <div class=\"axp-weather-forecast-icon\" [title]=\"getConditionName(day.condition) | translate | async\">\n <img [src]=\"getConditionIcon(day.condition || '')\" />\n </div>\n <div class=\"axp-weather-forecast-temps\">\n <span class=\"axp-weather-forecast-low\">\n {{ temperatureUnit() === '\u00B0C' ? day.minTempC : day.minTempF\n }}{{ getTemperatureUnit() | translate | async }}\n </span>\n <span class=\"axp-weather-forecast-high\">\n {{ temperatureUnit() === '\u00B0C' ? day.maxTempC : day.maxTempF\n }}{{ getTemperatureUnit() | translate | async }}\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Last updated timestamp -->\n <div class=\"axp-weather-last-updated\">\n <span>{{ '@dashboard:weather.last-updated' | translate | async }}: {{ getLastUpdated() }}</span>\n </div>\n\n <!-- Manual refresh button -->\n <div class=\"axp-weather-refresh-action\">\n <button\n class=\"axp-weather-refresh-button\"\n (click)=\"refreshWeather()\"\n [attr.aria-label]=\"'@dashboard:weather.refresh' | translate | async\"\n [title]=\"'@dashboard:weather.refresh' | translate | async\"\n >\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>{{ '@dashboard:weather.refresh' | translate | async }}</span>\n </button>\n </div>\n </div>\n } @else if (!isLoading() && !hasError()) {\n <!-- No data state (not loading, no error) -->\n <axp-state-message\n icon=\"fa-solid fa-cloud-sun\"\n [title]=\"'@dashboard:weather.no-data.title'\"\n [description]=\"'@dashboard:weather.no-data.description'\"\n >\n <button slot=\"actions\" class=\"axp-weather-refresh-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>{{ '@dashboard:weather.load-data' | translate | async }}</span>\n </button>\n </axp-state-message>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--primary-gradient-start: #2196f3;--primary-gradient-end: #1976d2;--shadow-color: rgba(0, 0, 0, .2);--glass-bg: rgba(255, 255, 255, .15);--glass-border: rgba(255, 255, 255, .2);--text-primary: rgba(255, 255, 255, .95);--text-secondary: rgba(255, 255, 255, .75);--transition-speed: .3s}.axp-weather-container{width:100%;height:100%;overflow:hidden;position:relative;box-shadow:0 4px 8px #0000001a;min-height:300px}.axp-weather-loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#2c3e50d9;display:flex;justify-content:center;align-items:center;z-index:100}.axp-weather-loading-spinner{text-align:center}.axp-weather-loading-spinner i{font-size:2.5rem;color:#fff;margin-bottom:.5rem}.axp-weather-loading-spinner span{display:block;color:#fff;font-size:1rem}.axp-weather-background-decorations{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1}.axp-weather-decoration{position:absolute;top:0;left:0;width:100%;height:100%;background-size:cover;background-position:center}.axp-weather-gradient-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.axp-weather-inner{position:relative;z-index:2;height:100%;padding:1.5rem;display:flex;flex-direction:column;justify-content:space-between}.axp-weather-location-info{display:flex;align-items:center;margin-bottom:1.5rem}.axp-weather-location-icon{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background-color:#fff3;border-radius:50%;margin-right:.75rem}.axp-weather-location-icon i{color:#fff}.axp-weather-location-name{margin:0;font-size:1.5rem;font-weight:500;text-shadow:1px 1px 3px rgba(0,0,0,.2);text-transform:capitalize}.axp-weather-current-weather{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem;flex-wrap:wrap}.axp-weather-condition{display:flex;flex-direction:column;align-items:center}.axp-weather-icon-wrapper{position:relative;margin-bottom:.5rem}.axp-weather-icon{position:relative;z-index:2;scale:2}.axp-weather-icon i{font-size:2.75rem;filter:drop-shadow(0 0 8px rgba(0,0,0,.3))}.axp-weather-icon-glow{position:absolute;z-index:1;top:50%;left:50%;transform:translate(-50%,-50%);width:45px;height:45px;border-radius:50%;filter:blur(15px);opacity:.4}.axp-weather-condition-name{font-size:1.1rem;text-align:center;text-shadow:1px 1px 2px rgba(0,0,0,.2)}.axp-weather-temperature{display:flex;align-items:flex-start;text-shadow:1px 1px 3px rgba(0,0,0,.3)}.axp-weather-temperature-value{font-size:3.5rem;font-weight:500;line-height:1}.axp-weather-temperature-unit{font-size:1.5rem;margin-top:.25rem}.axp-weather-details{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-darker-surface),var(--tw-bg-opacity, 1));display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:1rem;padding:1rem;border-radius:8px}.axp-weather-detail-item{display:flex;align-items:center;flex:1;min-width:120px}.axp-weather-detail-icon{width:40px;height:40px;border-radius:50%;background-color:#fff3;display:flex;align-items:center;justify-content:center;margin-right:.75rem}.axp-weather-detail-icon i{font-size:1.25rem}.axp-weather-detail-info{display:flex;padding-inline:.25rem;flex-direction:column}.axp-weather-detail-label{font-size:.875rem;margin-bottom:.25rem}.axp-weather-detail-value{font-size:1.125rem;font-weight:500}.axp-weather-forecast{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-darker-surface),var(--tw-bg-opacity, 1));margin-bottom:.5rem;border-radius:8px;padding:1rem}.axp-weather-forecast-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.75rem}.axp-weather-forecast-title{margin:0;font-size:1.125rem;font-weight:500;display:flex;align-items:center}.axp-weather-forecast-title i{margin-right:.5rem;opacity:.8}.axp-weather-scroll-indicator{color:#fff9}.axp-weather-forecast-items{display:flex;overflow-x:auto;gap:.75rem;padding-bottom:.5rem}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:#ffffff4d;border-radius:4px}.axp-weather-forecast-items::-webkit-scrollbar-track{background-color:#0000001a;border-radius:4px}.axp-weather-forecast-day{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-surface),var(--tw-bg-opacity, 1));min-width:90px;display:flex;flex-direction:column;align-items:center;padding:.75rem .5rem;border-radius:6px;transition:all .3s ease}.axp-weather-forecast-day:hover{transform:translateY(-2px)}.axp-weather-forecast-day-name{font-size:.875rem;margin-bottom:.5rem;font-weight:500}.axp-weather-forecast-icon{font-size:1.5rem;margin-bottom:.5rem}.axp-weather-forecast-icon i{filter:drop-shadow(0 0 5px rgba(0,0,0,.2))}.axp-weather-forecast-temps{display:flex;flex-direction:row;gap:.75rem;align-items:center;font-size:.775rem}.axp-weather-last-updated{text-align:center;font-size:.75rem;opacity:.7;margin-bottom:.5rem}.axp-weather-refresh-action{text-align:center}.axp-weather-refresh-button{background-color:#fff3;color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;font-size:.875rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-refresh-button:hover{background-color:#ffffff4d;transform:translateY(-1px)}.axp-weather-refresh-button i{font-size:.875rem}@media(max-width:576px){.axp-weather-inner{padding:.8rem;gap:.4rem}.axp-weather-location-name{font-size:1.1rem;padding-inline:.25rem}.axp-weather-temperature{font-size:2.5rem}.axp-weather-temperature-unit{font-size:1.1rem}.axp-weather-weather-details{flex-direction:column;gap:.5rem}.axp-weather-forecast-items{flex-wrap:nowrap;overflow-x:auto;padding-bottom:.5rem;margin:0 -.4rem;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;scrollbar-width:thin;mask-image:linear-gradient(to right,#000 95%,#0000);-webkit-mask-image:linear-gradient(to right,rgb(0,0,0) 95%,rgba(0,0,0,0))}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:#fff3;border-radius:4px}.axp-weather-forecast-day{min-width:60px;flex:0 0 auto;padding:.4rem .6rem}.axp-weather-forecast-day-name{font-size:.7rem}.axp-weather-forecast-icon{padding:.3rem;height:1.6rem}.axp-weather-forecast-temps{font-size:.7rem}.axp-weather-scroll-indicator{display:block}}:host-context(.theme-dark){--glass-bg: rgba(0, 0, 0, .3);--glass-border: rgba(255, 255, 255, .1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: HttpClientModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "look"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5093
+ ], viewQueries: [{ propertyName: "containerEl", first: true, predicate: ["containerElement"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!-- Weather Widget Component Template -->\n<div class=\"axp-weather-container\" #containerElement>\n <!-- Loading indicator -->\n @if (isLoading()) {\n <div class=\"axp-weather-loading-overlay\">\n <div class=\"axp-weather-loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>{{ '@dashboard:weather.loading' | translate | async }}</span>\n </div>\n </div>\n }\n\n <!-- Error message -->\n @if (hasError()) {\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@dashboard:weather.error.title'\"\n [description]=\"errorMessage()\"\n >\n <button slot=\"actions\" class=\"axp-weather-retry-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>{{ '@dashboard:weather.retry' | translate | async }}</span>\n </button>\n </axp-state-message>\n }\n\n <!-- Weather content - only show when we have data -->\n @if (weatherData()) {\n <!-- Background decorations based on weather condition -->\n <div class=\"axp-weather-background-decorations\">\n <div class=\"axp-weather-decoration\" [ngClass]=\"weatherData()?.current?.condition?.toLowerCase()\"></div>\n <div class=\"axp-weather-gradient-overlay\"></div>\n </div>\n\n <div class=\"axp-weather-inner\">\n <!-- Location information section -->\n <div class=\"axp-weather-location-info\">\n <div class=\"axp-weather-location-icon\">\n <i class=\"fa-solid fa-location-dot\"></i>\n </div>\n <div class=\"axp-weather-location-text\">\n <h2 class=\"axp-weather-location-name\">{{ city() }}</h2>\n </div>\n </div>\n\n <!-- Current weather conditions section -->\n <div class=\"axp-weather-current-weather\">\n <!-- Weather icon and condition name -->\n @if (showCurrentCondition()) {\n <div class=\"axp-weather-condition\">\n <div class=\"axp-weather-icon-wrapper\">\n <div class=\"axp-weather-icon\">\n <img [src]=\"getConditionIcon(weatherData()?.current?.condition || '')\" />\n </div>\n <div\n class=\"axp-weather-icon-glow\"\n [style.background-color]=\"getConditionColor(weatherData()?.current?.condition || '')\"\n ></div>\n </div>\n <div class=\"axp-weather-condition-name\">\n {{ getCurrentCondition() | translate | async }}\n </div>\n </div>\n }\n\n <!-- Temperature display -->\n @if (showTemperature()) {\n <div class=\"axp-weather-temperature\">\n <span class=\"axp-weather-temperature-value\">{{ getCurrentTemperature() }}</span>\n <span class=\"axp-weather-temperature-unit\">{{ getTemperatureUnit() | translate | async }}</span>\n </div>\n }\n </div>\n\n <!-- Weather details section (humidity and wind) -->\n @if (showHumidity() || showWind()) {\n <div class=\"axp-weather-details\">\n <!-- Humidity information -->\n @if (showHumidity()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-droplet\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">\n {{ '@dashboard:weather.humidity' | translate | async }}\n </div>\n <div class=\"axp-weather-detail-value\">{{ getHumidity() }}%</div>\n </div>\n </div>\n }\n\n <!-- Wind speed information -->\n @if (showWind()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-wind\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">\n {{ '@dashboard:weather.wind' | translate | async }}\n </div>\n <div class=\"axp-weather-detail-value\">\n {{ getWindSpeed() }} {{ getWindSpeedUnit() | translate | async }}\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Weather forecast section -->\n @if (showForecast() && weatherData()?.forecast) {\n <div class=\"axp-weather-forecast\">\n <div class=\"axp-weather-forecast-header\">\n <h3 class=\"axp-weather-forecast-title\">\n <i class=\"fa-solid fa-calendar-days\"></i>\n <span class=\"ax-px-1\">{{ '@dashboard:weather.forecast' | translate | async }}</span>\n </h3>\n </div>\n <!-- Loading indicator for forecast -->\n <!-- @if (isForecastLoading()) {\n <div class=\"axp-weather-forecast-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>{{ '@dashboard:weather.loading-forecast' | translate | async }}</span>\n </div>\n } -->\n <!-- Scrollable forecast days display -->\n <div class=\"axp-weather-forecast-items\">\n @for (day of displayedForecast(); track day.day) {\n <div class=\"axp-weather-forecast-day\">\n <div class=\"axp-weather-forecast-day-name\">\n {{ getDayName(parseDate(day.date)) | translate | async }}\n </div>\n <div class=\"axp-weather-forecast-icon\" [title]=\"getConditionName(day.condition) | translate | async\">\n <img [src]=\"getConditionIcon(day.condition || '')\" />\n </div>\n <div class=\"axp-weather-forecast-temps\">\n <span class=\"axp-weather-forecast-low\">\n {{ temperatureUnit() === '\u00B0C' ? day.minTempC : day.minTempF\n }}{{ getTemperatureUnit() | translate | async }}\n </span>\n <span class=\"axp-weather-forecast-high\">\n {{ temperatureUnit() === '\u00B0C' ? day.maxTempC : day.maxTempF\n }}{{ getTemperatureUnit() | translate | async }}\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Last updated timestamp -->\n <div class=\"axp-weather-last-updated\">\n <span>{{ '@dashboard:weather.last-updated' | translate | async }}: {{ getLastUpdated() }}</span>\n </div>\n\n <!-- Manual refresh button -->\n <div class=\"axp-weather-refresh-action\">\n <button\n class=\"axp-weather-refresh-button\"\n (click)=\"refreshWeather()\"\n [attr.aria-label]=\"'@dashboard:weather.refresh' | translate | async\"\n [title]=\"'@dashboard:weather.refresh' | translate | async\"\n >\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>{{ '@dashboard:weather.refresh' | translate | async }}</span>\n </button>\n </div>\n </div>\n } @else if (!isLoading() && !hasError()) {\n <!-- No data state (not loading, no error) -->\n <axp-state-message\n icon=\"fa-solid fa-cloud-sun\"\n [title]=\"'@dashboard:weather.no-data.title'\"\n [description]=\"'@dashboard:weather.no-data.description'\"\n >\n <button slot=\"actions\" class=\"axp-weather-refresh-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>{{ '@dashboard:weather.load-data' | translate | async }}</span>\n </button>\n </axp-state-message>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--primary-gradient-start: #2196f3;--primary-gradient-end: #1976d2;--shadow-color: rgba(0, 0, 0, .2);--glass-bg: rgba(255, 255, 255, .15);--glass-border: rgba(255, 255, 255, .2);--text-primary: rgba(255, 255, 255, .95);--text-secondary: rgba(255, 255, 255, .75);--transition-speed: .3s}.axp-weather-container{width:100%;height:100%;overflow:hidden;position:relative;box-shadow:0 4px 8px #0000001a;min-height:300px}.axp-weather-loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#2c3e50d9;display:flex;justify-content:center;align-items:center;z-index:100}.axp-weather-loading-spinner{text-align:center}.axp-weather-loading-spinner i{font-size:2.5rem;color:#fff;margin-bottom:.5rem}.axp-weather-loading-spinner span{display:block;color:#fff;font-size:1rem}.axp-weather-background-decorations{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1}.axp-weather-decoration{position:absolute;top:0;left:0;width:100%;height:100%;background-size:cover;background-position:center}.axp-weather-gradient-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.axp-weather-inner{position:relative;z-index:2;height:100%;padding:1.5rem;display:flex;flex-direction:column;justify-content:space-between}.axp-weather-location-info{display:flex;align-items:center;margin-bottom:1.5rem}.axp-weather-location-icon{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background-color:#fff3;border-radius:50%;margin-right:.75rem}.axp-weather-location-icon i{color:#fff}.axp-weather-location-name{margin:0;font-size:1.5rem;font-weight:500;text-shadow:1px 1px 3px rgba(0,0,0,.2);text-transform:capitalize}.axp-weather-current-weather{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem;flex-wrap:wrap}.axp-weather-condition{display:flex;flex-direction:column;align-items:center}.axp-weather-icon-wrapper{position:relative;margin-bottom:.5rem}.axp-weather-icon{position:relative;z-index:2;scale:2}.axp-weather-icon i{font-size:2.75rem;filter:drop-shadow(0 0 8px rgba(0,0,0,.3))}.axp-weather-icon-glow{position:absolute;z-index:1;top:50%;left:50%;transform:translate(-50%,-50%);width:45px;height:45px;border-radius:50%;filter:blur(15px);opacity:.4}.axp-weather-condition-name{font-size:1.1rem;text-align:center;text-shadow:1px 1px 2px rgba(0,0,0,.2)}.axp-weather-temperature{display:flex;align-items:flex-start;text-shadow:1px 1px 3px rgba(0,0,0,.3)}.axp-weather-temperature-value{font-size:3.5rem;font-weight:500;line-height:1}.axp-weather-temperature-unit{font-size:1.5rem;margin-top:.25rem}.axp-weather-details{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-darker-surface),var(--tw-bg-opacity, 1));display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:1rem;padding:1rem;border-radius:8px}.axp-weather-detail-item{display:flex;align-items:center;flex:1;min-width:120px}.axp-weather-detail-icon{width:40px;height:40px;border-radius:50%;background-color:#fff3;display:flex;align-items:center;justify-content:center;margin-right:.75rem}.axp-weather-detail-icon i{font-size:1.25rem}.axp-weather-detail-info{display:flex;padding-inline:.25rem;flex-direction:column}.axp-weather-detail-label{font-size:.875rem;margin-bottom:.25rem}.axp-weather-detail-value{font-size:1.125rem;font-weight:500}.axp-weather-forecast{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-darker-surface),var(--tw-bg-opacity, 1));margin-bottom:.5rem;border-radius:8px;padding:1rem}.axp-weather-forecast-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.75rem}.axp-weather-forecast-title{margin:0;font-size:1.125rem;font-weight:500;display:flex;align-items:center}.axp-weather-forecast-title i{margin-right:.5rem;opacity:.8}.axp-weather-scroll-indicator{color:#fff9}.axp-weather-forecast-items{display:flex;overflow-x:auto;gap:.75rem;padding-bottom:.5rem}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:#ffffff4d;border-radius:4px}.axp-weather-forecast-items::-webkit-scrollbar-track{background-color:#0000001a;border-radius:4px}.axp-weather-forecast-day{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-surface),var(--tw-bg-opacity, 1));min-width:90px;display:flex;flex-direction:column;align-items:center;padding:.75rem .5rem;border-radius:6px;transition:all .3s ease}.axp-weather-forecast-day:hover{transform:translateY(-2px)}.axp-weather-forecast-day-name{font-size:.875rem;margin-bottom:.5rem;font-weight:500}.axp-weather-forecast-icon{font-size:1.5rem;margin-bottom:.5rem}.axp-weather-forecast-icon i{filter:drop-shadow(0 0 5px rgba(0,0,0,.2))}.axp-weather-forecast-temps{display:flex;flex-direction:row;gap:.75rem;align-items:center;font-size:.775rem}.axp-weather-last-updated{text-align:center;font-size:.75rem;opacity:.7;margin-bottom:.5rem}.axp-weather-refresh-action{text-align:center}.axp-weather-refresh-button{background-color:#fff3;color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;font-size:.875rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-refresh-button:hover{background-color:#ffffff4d;transform:translateY(-1px)}.axp-weather-refresh-button i{font-size:.875rem}@media(max-width:576px){.axp-weather-inner{padding:.8rem;gap:.4rem}.axp-weather-location-name{font-size:1.1rem;padding-inline:.25rem}.axp-weather-temperature{font-size:2.5rem}.axp-weather-temperature-unit{font-size:1.1rem}.axp-weather-weather-details{flex-direction:column;gap:.5rem}.axp-weather-forecast-items{flex-wrap:nowrap;overflow-x:auto;padding-bottom:.5rem;margin:0 -.4rem;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;scrollbar-width:thin;mask-image:linear-gradient(to right,#000 95%,#0000);-webkit-mask-image:linear-gradient(to right,rgb(0,0,0) 95%,rgba(0,0,0,0))}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:#fff3;border-radius:4px}.axp-weather-forecast-day{min-width:60px;flex:0 0 auto;padding:.4rem .6rem}.axp-weather-forecast-day-name{font-size:.7rem}.axp-weather-forecast-icon{padding:.3rem;height:1.6rem}.axp-weather-forecast-temps{font-size:.7rem}.axp-weather-scroll-indicator{display:block}}:host-context(.theme-dark){--glass-bg: rgba(0, 0, 0, .3);--glass-border: rgba(255, 255, 255, .1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: HttpClientModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5044
5094
  }
5045
5095
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWeatherWidgetViewComponent, decorators: [{
5046
5096
  type: Component,
@@ -6253,363 +6303,267 @@ const AXPStickyNoteWidget = {
6253
6303
  },
6254
6304
  };
6255
6305
 
6306
+ //#region ---- Imports ----
6307
+ /** Component key used when display is `page`. Register via {@link AXP_PAGE_COMPONENT_PROVIDER}. */
6308
+ const ENTITY_DASHBOARD_PAGE_COMPONENT_KEY = 'entity-dashboard-page';
6309
+ //#endregion
6310
+ //#region ---- Plugin ----
6311
+ /**
6312
+ * Dashboard plugin.
6313
+ * - Binds one dashboard layout per entity type (`scope: E`, `scopeRef.entityType`).
6314
+ * - When display is `page` (default), adds a page tab with {@link ENTITY_DASHBOARD_PAGE_COMPONENT_KEY}.
6315
+ * - When display is `section`, embeds the dashboard grid in the single layout.
6316
+ * - Adds a list action to open the entity dashboard page.
6317
+ * - Runtime entity record context is passed to dashboard widgets via `__dashboardEntityContext`.
6318
+ */
6319
+ const dashboardPlugin = {
6320
+ name: 'dashboard',
6321
+ order: 45,
6322
+ apply: (ctx, options) => {
6323
+ const opts = options ?? {};
6324
+ const displayMode = opts.display ?? 'page';
6325
+ const displayTitle = opts.title?.trim() || '@dashboard-management:dashboards.terms.dashboard';
6326
+ const entityType = `${ctx.entity.module}.${ctx.entity.name}`;
6327
+ //#region ---- Group & Property ----
6328
+ const groups = ctx.groups.list() ?? [];
6329
+ if (!groups.some((g) => g.id === 'dashboard')) {
6330
+ ctx.groups.add({ id: 'dashboard', title: displayTitle });
6331
+ }
6332
+ const props = ctx.properties.list();
6333
+ if (!props.some((p) => p.name === 'entityDashboard')) {
6334
+ ctx.properties.add({
6335
+ name: 'entityDashboard',
6336
+ title: displayTitle,
6337
+ groupId: 'dashboard',
6338
+ schema: {
6339
+ dataType: 'object',
6340
+ interface: {
6341
+ type: 'entity-dashboard',
6342
+ options: {
6343
+ entityType,
6344
+ entityId: '{{ context.eval("id") }}',
6345
+ subject: '{{ context.eval("title", { pipes: ["translate"] }) }}',
6346
+ },
6347
+ },
6348
+ },
6349
+ });
6350
+ }
6351
+ //#endregion
6352
+ //#region ---- Display Mode ----
6353
+ if (displayMode === 'section') {
6354
+ ctx.interfaces.master.single.update((single) => {
6355
+ const next = cloneLayoutArrays((single ?? { title: ctx.entity.title, sections: [], properties: [] }));
6356
+ ensureLayoutSection(next, { id: 'dashboard', title: displayTitle, order: 90 });
6357
+ ensureLayoutPropertyView(next, {
6358
+ name: 'entityDashboard',
6359
+ layout: {
6360
+ label: { visible: false },
6361
+ positions: { lg: { colSpan: 12, order: 6 } },
6362
+ },
6363
+ });
6364
+ return next;
6365
+ });
6366
+ }
6367
+ else {
6368
+ ctx.entity.pages ??= [];
6369
+ const pageExists = ctx.entity.pages.some((p) => p.componentKey === ENTITY_DASHBOARD_PAGE_COMPONENT_KEY);
6370
+ const pageOrder = resolveEntityPluginDetailPageOrder({ relatedEntities: ctx.entity.relatedEntities, pages: ctx.entity.pages }, 'dashboard', {
6371
+ componentKey: ENTITY_DASHBOARD_PAGE_COMPONENT_KEY,
6372
+ skipPage: pageExists ? { componentKey: ENTITY_DASHBOARD_PAGE_COMPONENT_KEY } : undefined,
6373
+ });
6374
+ const page = {
6375
+ componentKey: ENTITY_DASHBOARD_PAGE_COMPONENT_KEY,
6376
+ title: displayTitle,
6377
+ icon: opts.icon ?? 'fa-light fa-gauge-high',
6378
+ layout: { order: pageOrder },
6379
+ };
6380
+ if (!pageExists) {
6381
+ ctx.entity.pages.push(page);
6382
+ }
6383
+ else {
6384
+ const pages = ctx.entity.pages;
6385
+ const index = pages.findIndex((p) => p.componentKey === ENTITY_DASHBOARD_PAGE_COMPONENT_KEY);
6386
+ if (index >= 0) {
6387
+ pages[index] = { ...pages[index], ...page };
6388
+ }
6389
+ }
6390
+ }
6391
+ //#endregion
6392
+ //#region ---- List Actions ----
6393
+ ensureListActions(ctx);
6394
+ ctx.interfaces.update((i) => {
6395
+ const actions = i.master.list.actions;
6396
+ const cmdName = 'open-entity-dashboard';
6397
+ if (!actionExists(actions, cmdName)) {
6398
+ actions.push({
6399
+ title: '@dashboard-management:dashboards.actions.open-entity-dashboard',
6400
+ command: {
6401
+ name: cmdName,
6402
+ options: {
6403
+ entityId: '{{ context.eval("id") }}',
6404
+ entityType,
6405
+ },
6406
+ },
6407
+ priority: 'secondary',
6408
+ type: 'dashboard',
6409
+ separated: true,
6410
+ scope: AXPEntityCommandScope.Individual,
6411
+ });
6412
+ }
6413
+ return i;
6414
+ });
6415
+ //#endregion
6416
+ ctx.entity.extensions ??= {};
6417
+ ctx.entity.extensions.dashboard = {
6418
+ entityType,
6419
+ display: displayMode,
6420
+ };
6421
+ },
6422
+ };
6256
6423
  //#endregion
6257
- //#region ---- Dashboard Management Widgets Provider ----
6258
- const DASHBOARD_WIDGETS = [
6259
- AXPShortcutWidget,
6260
- AXPDonutChartWidget,
6261
- AXPBarChartWidget,
6262
- AXPLineChartWidget,
6263
- AXPFunnelChartWidget,
6264
- AXPHeatmapChartWidget,
6265
- AXPKpiProgressWidget,
6266
- AXPKpiSegmentedWidget,
6267
- AXPKpiDetailsWidget,
6268
- AXPKpiStatCardWidget,
6269
- AXPGaugeChartWidget,
6270
- AXPStickyNoteWidget,
6271
- AXPMinimalWeatherWidget,
6272
- AXPAdvancedWeatherWidget,
6273
- AXPAnalogClockWidget,
6274
- ];
6275
- class AXMDashboardManagementWidgetsProvider {
6276
- getWidgets() {
6277
- return DASHBOARD_WIDGETS;
6278
- }
6279
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementWidgetsProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6280
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementWidgetsProvider }); }
6281
- }
6282
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementWidgetsProvider, decorators: [{
6283
- type: Injectable
6284
- }] });
6285
6424
 
6286
- // Entity Modules
6287
- function createAppRoute() {
6288
- const config = inject(AXP_ENTITY_CONFIG_TOKEN);
6425
+ //#region ---- Imports ----
6426
+ //#endregion
6427
+ //#region ---- Builders ----
6428
+ function buildUserScopeRef(userId) {
6429
+ return { userId: userId.trim() };
6430
+ }
6431
+ function buildTenantScopeRef(tenantId, roleIds) {
6289
6432
  return {
6290
- path: ':app',
6291
- canActivate: [...AXP_PROTECTED_ROUTE_GUARDS],
6292
- data: { rootLayout: true },
6293
- loadComponent: () => {
6294
- return config.viewers.root();
6295
- },
6296
- children: [
6297
- {
6298
- path: 'dashboard',
6299
- loadComponent: () => Promise.resolve().then(function () { return homeDashboard; }).then((c) => c.AXMDashboardHomeComponent),
6300
- },
6301
- ],
6433
+ tenantId: tenantId.trim(),
6434
+ roleIds: [...new Set(roleIds.map((id) => id.trim()).filter(Boolean))],
6302
6435
  };
6303
6436
  }
6304
- class AXMDashboardManagementModule {
6305
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
6306
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementModule, imports: [AXPWidgetCoreModule] }); }
6307
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementModule, providers: [
6308
- { provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXMDashboardManagementWidgetsProvider, multi: true },
6309
- {
6310
- provide: AXP_HOME_PAGES,
6311
- multi: true,
6312
- useFactory: () => [
6313
- {
6314
- key: 'dashboard',
6315
- title: 'Dashboard',
6316
- route: createAppRoute(),
6317
- },
6437
+ function buildEntityScopeRef(entityType) {
6438
+ return { entityType: entityType.trim() };
6439
+ }
6440
+ //#endregion
6441
+ //#region ---- Readers ----
6442
+ function readScopeUserId(scopeRef) {
6443
+ const userId = get(scopeRef, 'userId');
6444
+ return isString(userId) && userId.trim() ? userId.trim() : undefined;
6445
+ }
6446
+ function readScopeTenantId(scopeRef) {
6447
+ const tenantId = get(scopeRef, 'tenantId');
6448
+ return isString(tenantId) && tenantId.trim() ? tenantId.trim() : undefined;
6449
+ }
6450
+ function readScopeRoleIds(scopeRef) {
6451
+ const roleIds = get(scopeRef, 'roleIds');
6452
+ if (!isArray(roleIds)) {
6453
+ return [];
6454
+ }
6455
+ return roleIds.filter((id) => isString(id) && id.trim().length > 0);
6456
+ }
6457
+ function readScopeEntityType(scopeRef) {
6458
+ const entityType = get(scopeRef, 'entityType');
6459
+ return isString(entityType) && entityType.trim() ? entityType.trim() : undefined;
6460
+ }
6461
+ //#endregion
6462
+ //#region ---- Normalization ----
6463
+ /**
6464
+ * Ensures {@link scopeRef} matches {@link scope} and strips incompatible keys.
6465
+ */
6466
+ function normalizeDashboardScopeRef(scope, scopeRef, fallback) {
6467
+ switch (scope) {
6468
+ case 'U':
6469
+ return buildUserScopeRef(readScopeUserId(scopeRef) ?? fallback?.userId ?? '');
6470
+ case 'T':
6471
+ return buildTenantScopeRef(readScopeTenantId(scopeRef) ?? fallback?.tenantId ?? '', readScopeRoleIds(scopeRef).length > 0
6472
+ ? readScopeRoleIds(scopeRef)
6473
+ : castArray(fallback?.roleIds ?? []));
6474
+ case 'E':
6475
+ return buildEntityScopeRef(readScopeEntityType(scopeRef) ?? fallback?.entityType ?? '');
6476
+ default:
6477
+ return buildUserScopeRef(fallback?.userId ?? '');
6478
+ }
6479
+ }
6480
+ //#endregion
6481
+
6482
+ //#region ---- Imports ----
6483
+ //#endregion
6484
+ //#region ---- Service ----
6485
+ /**
6486
+ * Resolves or creates entity-type dashboards (`scope: E`).
6487
+ * One dashboard layout is shared across all records of the same entity type.
6488
+ */
6489
+ class AXMEntityDashboardService {
6490
+ constructor() {
6491
+ //#region ---- Services & Dependencies ----
6492
+ this.entityService = inject(AXPEntityService);
6493
+ this.dashboardData = this.entityService
6494
+ .withEntity(RootConfig.module.name, RootConfig.entities.dashboard.name)
6495
+ .data();
6496
+ }
6497
+ //#endregion
6498
+ //#region ---- Public Methods ----
6499
+ /**
6500
+ * Finds the dashboard bound to an entity type, if one exists.
6501
+ */
6502
+ async findEntityDashboard(entityType) {
6503
+ const result = await this.dashboardData.query({
6504
+ skip: 0,
6505
+ take: 1,
6506
+ filter: {
6507
+ logic: 'and',
6508
+ filters: [
6509
+ { field: 'scope', operator: { type: 'equal' }, value: 'E' },
6510
+ { field: 'scopeRef.entityType', operator: { type: 'equal' }, value: entityType },
6318
6511
  ],
6319
6512
  },
6320
- // Module-specific providers (not part of manifest system)
6321
- AXPWidgetsModule,
6322
- {
6323
- provide: AXP_HOME_PAGE_DEFAULT_KEY,
6324
- useValue: 'dashboard',
6325
- },
6326
- // Module Manifest Provider
6327
- {
6328
- provide: AXP_MODULE_MANIFEST_PROVIDER,
6329
- useValue: DashboardManagementManifest,
6330
- multi: true,
6331
- },
6332
- // Provider references (now using tokens)
6333
- {
6334
- provide: AXP_PERMISSION_DEFINITION_PROVIDER,
6335
- useClass: AXMPermissionDefinitionProvider,
6336
- multi: true,
6337
- },
6338
- {
6339
- provide: AXP_MENU_PROVIDER,
6340
- useClass: AXMMenuProvider,
6341
- multi: true,
6342
- },
6343
- {
6344
- provide: AXP_ENTITY_DEFINITION_LOADER,
6345
- useClass: AXMEntityProvider,
6346
- multi: true,
6347
- },
6348
- provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-modules-dashboard-management-index-DvY9N8FF.mjs').then((m) => m.AXMDashboardLayoutPageComponentProvider)),
6349
- ], imports: [AXPWidgetCoreModule] }); }
6513
+ });
6514
+ return result.items?.[0] ?? null;
6515
+ }
6516
+ /**
6517
+ * Returns the entity-type dashboard, creating an empty one when missing.
6518
+ */
6519
+ async ensureEntityDashboard(entityType, title) {
6520
+ const existing = await this.findEntityDashboard(entityType);
6521
+ if (existing) {
6522
+ return existing;
6523
+ }
6524
+ const dashboardTitle = title ?? createMultiLanguageString('Dashboard');
6525
+ const createdId = await this.dashboardData.create({
6526
+ title: dashboardTitle,
6527
+ description: '',
6528
+ widgets: [],
6529
+ scope: 'E',
6530
+ scopeRef: buildEntityScopeRef(entityType),
6531
+ locked: false,
6532
+ isArchived: false,
6533
+ });
6534
+ const created = await this.dashboardData.byKey(createdId);
6535
+ if (!created) {
6536
+ throw new Error('Failed to create entity dashboard');
6537
+ }
6538
+ return created;
6539
+ }
6540
+ /**
6541
+ * Resolves entity type/id from a host entity detail context.
6542
+ */
6543
+ resolveEntityRefFromContext(moduleName, entityName, context) {
6544
+ const entityId = get(context, 'id');
6545
+ if (!moduleName || !entityName || typeof entityId !== 'string' || !entityId.trim()) {
6546
+ return null;
6547
+ }
6548
+ return {
6549
+ entityType: `${moduleName}.${entityName}`,
6550
+ entityId: entityId.trim(),
6551
+ };
6552
+ }
6553
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6554
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardService, providedIn: 'root' }); }
6350
6555
  }
6351
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementModule, decorators: [{
6352
- type: NgModule,
6353
- args: [{
6354
- imports: [
6355
- AXPWidgetCoreModule,
6356
- // Entity Modules
6357
- ],
6358
- providers: [
6359
- { provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXMDashboardManagementWidgetsProvider, multi: true },
6360
- {
6361
- provide: AXP_HOME_PAGES,
6362
- multi: true,
6363
- useFactory: () => [
6364
- {
6365
- key: 'dashboard',
6366
- title: 'Dashboard',
6367
- route: createAppRoute(),
6368
- },
6369
- ],
6370
- },
6371
- // Module-specific providers (not part of manifest system)
6372
- AXPWidgetsModule,
6373
- {
6374
- provide: AXP_HOME_PAGE_DEFAULT_KEY,
6375
- useValue: 'dashboard',
6376
- },
6377
- // Module Manifest Provider
6378
- {
6379
- provide: AXP_MODULE_MANIFEST_PROVIDER,
6380
- useValue: DashboardManagementManifest,
6381
- multi: true,
6382
- },
6383
- // Provider references (now using tokens)
6384
- {
6385
- provide: AXP_PERMISSION_DEFINITION_PROVIDER,
6386
- useClass: AXMPermissionDefinitionProvider,
6387
- multi: true,
6388
- },
6389
- {
6390
- provide: AXP_MENU_PROVIDER,
6391
- useClass: AXMMenuProvider,
6392
- multi: true,
6393
- },
6394
- {
6395
- provide: AXP_ENTITY_DEFINITION_LOADER,
6396
- useClass: AXMEntityProvider,
6397
- multi: true,
6398
- },
6399
- provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-modules-dashboard-management-index-DvY9N8FF.mjs').then((m) => m.AXMDashboardLayoutPageComponentProvider)),
6400
- ],
6401
- }]
6556
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardService, decorators: [{
6557
+ type: Injectable,
6558
+ args: [{ providedIn: 'root' }]
6402
6559
  }] });
6403
6560
 
6404
- async function dashboardFactory() {
6405
- const entityDef = {
6406
- module: RootConfig.module.name,
6407
- name: RootConfig.entities.dashboard.name,
6408
- title: RootConfig.entities.dashboard.title,
6409
- icon: RootConfig.entities.dashboard.icon,
6410
- plugins: [{ name: 'category' }, { name: 'archive' }],
6411
- pages: [
6412
- {
6413
- componentKey: DASHBOARD_LAYOUT_PAGE_COMPONENT_KEY,
6414
- title: '@dashboard-management:dashboards.entities.dashboard.pages.layout.title',
6415
- description: '@dashboard-management:dashboards.entities.dashboard.pages.layout.description',
6416
- icon: 'fa-light fa-table-layout',
6417
- layout: { order: 1, position: 'after' },
6418
- },
6419
- ],
6420
- formats: {
6421
- individual: RootConfig.entities.dashboard.title,
6422
- plural: RootConfig.entities.dashboard.titlePlural,
6423
- displayName: '@general:terms.interface.configuration',
6424
- searchResult: {
6425
- title: '{{ title }}',
6426
- description: RootConfig.module.title,
6427
- },
6428
- },
6429
- relatedEntities: [],
6430
- groups: [
6431
- {
6432
- id: 'section',
6433
- title: RootConfig.entities.dashboard.title,
6434
- },
6435
- {
6436
- id: 'access',
6437
- title: '@dashboard-management:dashboards.entities.dashboard.groups.access.title',
6438
- },
6439
- ],
6440
- properties: [
6441
- {
6442
- name: 'id',
6443
- title: 'ID',
6444
- groupId: 'section',
6445
- schema: { dataType: 'uuid', visible: false, nullable: false, readonly: true, unique: { enabled: true } },
6446
- },
6447
- {
6448
- name: 'title',
6449
- title: '@general:terms.common.title',
6450
- groupId: 'section',
6451
- options: {
6452
- sort: {
6453
- enabled: true,
6454
- },
6455
- filter: {
6456
- advance: {
6457
- enabled: true,
6458
- },
6459
- inline: {
6460
- enabled: true,
6461
- },
6462
- },
6463
- },
6464
- schema: {
6465
- dataType: 'string',
6466
- interface: {
6467
- type: AXPWidgetsList.Editors.TextBox,
6468
- options: {
6469
- multiLanguage: true,
6470
- placeholder: '@general:terms.common.title',
6471
- },
6472
- },
6473
- },
6474
- validations: [
6475
- {
6476
- rule: 'required',
6477
- },
6478
- ],
6479
- },
6480
- {
6481
- name: 'description',
6482
- title: '@dashboard-management:dashboards.entities.dashboard.fields.description.title',
6483
- groupId: 'section',
6484
- options: {
6485
- sort: {
6486
- enabled: false,
6487
- },
6488
- filter: {
6489
- advance: {
6490
- enabled: false,
6491
- },
6492
- inline: {
6493
- enabled: false,
6494
- },
6495
- },
6496
- },
6497
- schema: {
6498
- dataType: 'string',
6499
- interface: {
6500
- type: AXPWidgetsList.Editors.LargeTextBox,
6501
- options: {
6502
- rows: 3,
6503
- multiLanguage: true,
6504
- placeholder: '@general:terms.common.description',
6505
- },
6506
- },
6507
- },
6508
- },
6509
- {
6510
- name: 'scope',
6511
- title: '@dashboard-management:dashboards.entities.dashboard.fields.scope.title',
6512
- groupId: 'access',
6513
- options: {
6514
- sort: { enabled: true },
6515
- filter: { advance: { enabled: true }, inline: { enabled: true } },
6516
- },
6517
- schema: {
6518
- dataType: 'string',
6519
- visible: false,
6520
- interface: {
6521
- type: AXPWidgetsList.Editors.SelectBox,
6522
- options: {
6523
- valueField: 'id',
6524
- dataSource: [
6525
- {
6526
- id: 'T',
6527
- title: '@dashboard-management:dashboards.entities.dashboard.fields.scope.options.tenant',
6528
- },
6529
- {
6530
- id: 'U',
6531
- title: '@dashboard-management:dashboards.entities.dashboard.fields.scope.options.personal',
6532
- },
6533
- ],
6534
- },
6535
- },
6536
- },
6537
- },
6538
- {
6539
- name: 'roleIds',
6540
- title: '@dashboard:roles',
6541
- groupId: 'access',
6542
- schema: {
6543
- dataType: 'object',
6544
- visible: `{{ !context.eval("scope") || context.eval("scope") === "T" }}`,
6545
- interface: {
6546
- type: AXPWidgetsList.Editors.LookupBox,
6547
- options: {
6548
- entity: 'SecurityManagement.Role',
6549
- multiple: true,
6550
- look: 'select',
6551
- },
6552
- },
6553
- },
6554
- },
6555
- ],
6556
- columns: [{ name: 'title' }, { name: 'description' }],
6557
- interfaces: {
6558
- master: {
6559
- create: {
6560
- sections: [{ id: 'section' }, { id: 'access' }],
6561
- properties: [
6562
- { name: 'title', layout: { positions: { lg: { colSpan: 6, order: 1 } } } },
6563
- { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 2 } } } },
6564
- { name: 'roleIds', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
6565
- ],
6566
- },
6567
- update: {
6568
- sections: [{ id: 'section' }, { id: 'access' }],
6569
- properties: [
6570
- { name: 'title', layout: { positions: { lg: { colSpan: 6, order: 1 } } } },
6571
- { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 2 } } } },
6572
- { name: 'roleIds', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
6573
- ],
6574
- },
6575
- single: {
6576
- title: '{{title}}',
6577
- sections: [{ id: 'section', layout: { positions: { lg: { colSpan: 12 } } } }, { id: 'access' }],
6578
- properties: [
6579
- { name: 'title', layout: { positions: { lg: { colSpan: 6, order: 1 } } } },
6580
- { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 2 } } } },
6581
- { name: 'roleIds', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
6582
- ],
6583
- actions: [...entityMasterRecordActions()],
6584
- },
6585
- list: {
6586
- actions: [...entityMasterCrudActions()],
6587
- views: [
6588
- createQueryView('tenant', '@dashboard-management:dashboards.entities.dashboard.views.tenant', true, {
6589
- sorts: [{ name: 'title', dir: 'asc' }],
6590
- conditions: [{ name: 'scope', operator: { type: 'equal' }, value: 'T' }],
6591
- }),
6592
- ],
6593
- },
6594
- },
6595
- },
6596
- };
6597
- return entityDef;
6598
- }
6599
-
6600
- //#endregion
6601
-
6602
- var index = /*#__PURE__*/Object.freeze({
6603
- __proto__: null,
6604
- dashboardFactory: dashboardFactory
6605
- });
6606
-
6607
- // Entity Services
6608
- // Entity Modules
6609
-
6610
6561
  /** When true (provided on the dashboard layout entity tab), the store skips the default list query effect. */
6611
6562
  const DASHBOARD_LAYOUT_ENTITY_MODE = new InjectionToken('DASHBOARD_LAYOUT_ENTITY_MODE');
6612
6563
 
6564
+ /** When true (entity dashboard plugin), layout and widgets are view-only. */
6565
+ const DASHBOARD_READONLY_MODE = new InjectionToken('DASHBOARD_READONLY_MODE');
6566
+
6613
6567
  class AXMConfigurationPopup extends AXBasePageComponent {
6614
6568
  constructor() {
6615
6569
  super(...arguments);
@@ -6676,7 +6630,9 @@ class AXMDashboardPopupService {
6676
6630
  this.translateService = inject(AXTranslationService);
6677
6631
  this.layoutBuilder = inject(AXPLayoutBuilderService);
6678
6632
  this.entityService = inject(AXPEntityService);
6679
- this.roleService = this.entityService.withEntity(RootConfig$1.module.name, RootConfig$1.entities.roles.name).data();
6633
+ this.roleService = this.entityService
6634
+ .withEntity(RootConfig$1.module.name, RootConfig$1.entities.roles.name)
6635
+ .data();
6680
6636
  this.sessionService = inject(AXPSessionService);
6681
6637
  }
6682
6638
  async generateDashboardLayout(data, isAdmin, dialogOptions) {
@@ -6696,7 +6652,7 @@ class AXMDashboardPopupService {
6696
6652
  .setContext({
6697
6653
  title: this.normalizeTitleForFormContext(data?.title),
6698
6654
  description: this.normalizeDescriptionForFormContext(data?.description),
6699
- selectedRoleIds: data?.roleIds ?? [],
6655
+ selectedRoleIds: readScopeRoleIds(data?.scopeRef),
6700
6656
  locked: data?.locked ?? false,
6701
6657
  isAdmin,
6702
6658
  })
@@ -6749,14 +6705,19 @@ class AXMDashboardPopupService {
6749
6705
  }
6750
6706
  const formData = context;
6751
6707
  const now = new Date();
6752
- const userId = this.sessionService.user?.id;
6708
+ const userId = this.sessionService.user?.id ?? '';
6709
+ const tenantId = this.sessionService.tenant?.id ?? '';
6710
+ const scope = (data?.scope ?? (isAdmin ? 'T' : 'U'));
6711
+ const roleIds = showRoleField
6712
+ ? (formData['selectedRoleIds'] ?? [])
6713
+ : readScopeRoleIds(data?.scopeRef);
6753
6714
  return {
6754
6715
  ...data,
6755
6716
  title: this.normalizeTitleFromFormSubmit(formData['title']),
6756
6717
  description: this.normalizeDescriptionFromFormSubmit(formData['description']),
6757
- roleIds: showRoleField ? (formData['selectedRoleIds'] ?? []) : data?.roleIds,
6718
+ scopeRef: scope === 'T' ? buildTenantScopeRef(tenantId, roleIds) : buildUserScopeRef(userId),
6758
6719
  locked: this.normalizeBooleanInput(formData['locked'], data?.locked ?? false),
6759
- scope: (data?.scope ?? (isAdmin ? 'T' : 'U')),
6720
+ scope,
6760
6721
  createdBy: userId,
6761
6722
  createdAt: now,
6762
6723
  updatedBy: userId,
@@ -6852,6 +6813,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
6852
6813
  }] });
6853
6814
 
6854
6815
  //#region ---- Imports ----
6816
+ const readTenantId = (sessionService) => {
6817
+ const tenantId = sessionService.tenant?.id;
6818
+ return typeof tenantId === 'string' && tenantId.trim() ? tenantId.trim() : undefined;
6819
+ };
6855
6820
  //#endregion
6856
6821
  //#region ---- Utility Functions ----
6857
6822
  /** Width threshold for switching between lg (12 col) and md (6 col) breakpoints */
@@ -6912,6 +6877,7 @@ const createInitialState = () => ({
6912
6877
  currentBreakpoint: getBreakpointFromWidth(),
6913
6878
  isBreakpointTransitioning: false,
6914
6879
  entityDetailLayoutLock: false,
6880
+ readonly: false,
6915
6881
  });
6916
6882
  /**
6917
6883
  * Migrates a widget config from the old flat format to the new per-breakpoint format.
@@ -6946,8 +6912,7 @@ const modelToDashboardLayout = (model) => ({
6946
6912
  title: model.title,
6947
6913
  description: model.description,
6948
6914
  widgets: (model.widgets || []).map((widget) => migrateWidgetConfig(widget)),
6949
- createdBy: model.userId ?? model.auditInfo?.created?.by?.id,
6950
- roleIds: model.roleIds,
6915
+ createdBy: readScopeUserId(model.scopeRef) ?? model.auditInfo?.created?.by?.id,
6951
6916
  isArchived: model.isArchived,
6952
6917
  archivedAt: model.archivedAt,
6953
6918
  locked: model.locked,
@@ -6955,6 +6920,10 @@ const modelToDashboardLayout = (model) => ({
6955
6920
  updatedAt: model.auditInfo?.updated?.at,
6956
6921
  updatedBy: model.auditInfo?.updated?.by?.id,
6957
6922
  scope: model.scope,
6923
+ scopeRef: normalizeDashboardScopeRef(model.scope, model.scopeRef, {
6924
+ userId: readScopeUserId(model.scopeRef) ?? model.auditInfo?.created?.by?.id,
6925
+ roleIds: readScopeRoleIds(model.scopeRef),
6926
+ }),
6958
6927
  categoryIds: model.categoryIds,
6959
6928
  });
6960
6929
  /**
@@ -6965,12 +6934,15 @@ const dashboardLayoutToModel = (layout) => ({
6965
6934
  title: layout.title,
6966
6935
  description: layout.description ?? '',
6967
6936
  widgets: layout.widgets,
6968
- userId: layout.createdBy,
6969
- roleIds: layout.roleIds,
6970
6937
  isArchived: layout.isArchived,
6971
6938
  archivedAt: layout.archivedAt,
6972
6939
  locked: layout.locked,
6973
6940
  categoryIds: layout.categoryIds,
6941
+ scope: layout.scope,
6942
+ scopeRef: normalizeDashboardScopeRef(layout.scope, layout.scopeRef, {
6943
+ userId: layout.createdBy,
6944
+ roleIds: readScopeRoleIds(layout.scopeRef),
6945
+ }),
6974
6946
  auditInfo: {
6975
6947
  created: layout.createdAt
6976
6948
  ? { at: layout.createdAt, by: layout.createdBy ? { id: layout.createdBy, type: 'user' } : undefined }
@@ -6979,7 +6951,6 @@ const dashboardLayoutToModel = (layout) => ({
6979
6951
  ? { at: layout.updatedAt, by: layout.updatedBy ? { id: layout.updatedBy, type: 'user' } : undefined }
6980
6952
  : undefined,
6981
6953
  },
6982
- scope: layout.scope,
6983
6954
  });
6984
6955
  /**
6985
6956
  * Safely reads the current user id from the session service.
@@ -7016,8 +6987,8 @@ const extractUserRoleIds = (user) => {
7016
6987
  const hasMatchingRole = (dashboard, userRoleIds) => {
7017
6988
  if (userRoleIds.length === 0)
7018
6989
  return false;
7019
- const roleIds = dashboard.roleIds;
7020
- return Array.isArray(roleIds) && roleIds.length > 0 && userRoleIds.some((id) => roleIds.includes(id));
6990
+ const roleIds = readScopeRoleIds(dashboard.scopeRef);
6991
+ return roleIds.length > 0 && userRoleIds.some((id) => roleIds.includes(id));
7021
6992
  };
7022
6993
  /**
7023
6994
  * Determines whether a personal dashboard belongs to the signed-in user.
@@ -7038,10 +7009,12 @@ const isTenantDashboardVisibleForUser = (dashboard, userRoleIds) => {
7038
7009
  * Computes effective layout options based on device, lock, admin and role restrictions.
7039
7010
  * Always derives drag/resize state from the dashboard model — never from base options.
7040
7011
  */
7041
- const deriveLayoutOptions = (baseOptions, dashboard, isAdmin, isDesktop) => {
7012
+ const deriveLayoutOptions = (baseOptions, dashboard, isAdmin, isDesktop, readonly) => {
7042
7013
  const { disableDrag: _dd, disableResize: _dr, ...cleanBase } = baseOptions;
7043
7014
  if (!dashboard)
7044
7015
  return cleanBase;
7016
+ if (readonly)
7017
+ return { ...cleanBase, disableDrag: true, disableResize: true };
7045
7018
  if (isAdmin)
7046
7019
  return cleanBase;
7047
7020
  if (dashboard.locked === true || dashboard.scope === 'T') {
@@ -7052,9 +7025,11 @@ const deriveLayoutOptions = (baseOptions, dashboard, isAdmin, isDesktop) => {
7052
7025
  /**
7053
7026
  * Checks if a widget is locked for the current user based on dashboard and role context.
7054
7027
  */
7055
- const isWidgetLockedForUser = (dashboard, isAdmin, userRoleIds) => {
7028
+ const isWidgetLockedForUser = (dashboard, isAdmin, userRoleIds, readonly) => {
7056
7029
  if (!dashboard)
7057
7030
  return false;
7031
+ if (readonly)
7032
+ return true;
7058
7033
  if (isAdmin)
7059
7034
  return false;
7060
7035
  if (dashboard.locked === true)
@@ -7064,9 +7039,11 @@ const isWidgetLockedForUser = (dashboard, isAdmin, userRoleIds) => {
7064
7039
  /**
7065
7040
  * Determines if a widget can be configured by the current user.
7066
7041
  */
7067
- const canConfigureWidgetForUser = (dashboard, isAdmin, userRoleIds, widgetHasConfiguration) => {
7042
+ const canConfigureWidgetForUser = (dashboard, isAdmin, userRoleIds, widgetHasConfiguration, readonly) => {
7068
7043
  if (!dashboard)
7069
7044
  return true;
7045
+ if (readonly)
7046
+ return false;
7070
7047
  if (isAdmin)
7071
7048
  return widgetHasConfiguration;
7072
7049
  if (dashboard.locked === true)
@@ -7086,6 +7063,9 @@ const filterDashboardsForUser = (dashboards, isAdmin, userId, userRoleIds) => {
7086
7063
  return [];
7087
7064
  }
7088
7065
  return dashboards.filter((d) => {
7066
+ if (d.scope === 'E') {
7067
+ return false;
7068
+ }
7089
7069
  const isOwnedPersonalDashboard = isPersonalDashboardOwnedByUser(d, userId);
7090
7070
  const isRoleMatchedTenantDashboard = isTenantDashboardVisibleForUser(d, userRoleIds);
7091
7071
  return isOwnedPersonalDashboard || isRoleMatchedTenantDashboard;
@@ -7112,7 +7092,7 @@ withComputed((state, deviceService = inject(AXPDeviceService)) => ({
7112
7092
  // Dynamically set column count based on the current breakpoint
7113
7093
  const bp = state.currentBreakpoint();
7114
7094
  const optionsWithColumn = { ...baseOptions, column: getColumnsForBreakpoint(bp) };
7115
- return deriveLayoutOptions(optionsWithColumn, currentDashboard || undefined, state.isAdmin(), isDesktop);
7095
+ return deriveLayoutOptions(optionsWithColumn, currentDashboard || undefined, state.isAdmin(), isDesktop, state.readonly());
7116
7096
  }),
7117
7097
  /**
7118
7098
  * Returns the current dashboard's widgets with their resolved breakpoint options.
@@ -7132,11 +7112,11 @@ withComputed((state, deviceService = inject(AXPDeviceService)) => ({
7132
7112
  canConfigureWidget: computed(() => (widget) => {
7133
7113
  const currentDashboard = state.dashboards().find((dashboard) => dashboard.id === state.currentDashboardId());
7134
7114
  const widgetHasConfiguration = widget.node?.options?.['hasConfiguration'] ?? true;
7135
- return canConfigureWidgetForUser(currentDashboard || undefined, state.isAdmin(), state.userRoleIds(), widgetHasConfiguration);
7115
+ return canConfigureWidgetForUser(currentDashboard || undefined, state.isAdmin(), state.userRoleIds(), widgetHasConfiguration, state.readonly());
7136
7116
  }),
7137
7117
  isWidgetLocked: computed(() => (widget) => {
7138
7118
  const currentDashboard = state.dashboards().find((dashboard) => dashboard.id === state.currentDashboardId());
7139
- return isWidgetLockedForUser(currentDashboard || undefined, state.isAdmin(), state.userRoleIds());
7119
+ return isWidgetLockedForUser(currentDashboard || undefined, state.isAdmin(), state.userRoleIds(), state.readonly());
7140
7120
  }),
7141
7121
  })),
7142
7122
  //#endregion
@@ -7238,13 +7218,13 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7238
7218
  operator: null,
7239
7219
  filters: [
7240
7220
  { field: 'scope', operator: { type: 'equal' }, value: 'U' },
7241
- { field: 'userId', operator: { type: 'equal' }, value: userId },
7221
+ { field: 'scopeRef.userId', operator: { type: 'equal' }, value: userId },
7242
7222
  ],
7243
7223
  });
7244
7224
  }
7245
7225
  if (userRoleIds.length > 0) {
7246
7226
  const roleMatchFilters = userRoleIds.map((roleId) => ({
7247
- field: 'roleIds',
7227
+ field: 'scopeRef.roleIds',
7248
7228
  operator: { type: 'contains' },
7249
7229
  value: roleId,
7250
7230
  }));
@@ -7321,14 +7301,19 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7321
7301
  if (!newDashboard)
7322
7302
  return;
7323
7303
  const userId = readUserId(sessionService);
7304
+ const tenantId = readTenantId(sessionService);
7324
7305
  const now = new Date();
7306
+ const scope = store.isUserAdmin() ? 'T' : 'U';
7325
7307
  const dashboardWithMetadata = {
7326
7308
  ...newDashboard,
7327
7309
  createdBy: userId,
7328
7310
  createdAt: now,
7329
7311
  updatedBy: userId,
7330
7312
  updatedAt: now,
7331
- scope: store.isUserAdmin() ? 'T' : 'U',
7313
+ scope,
7314
+ scopeRef: scope === 'T'
7315
+ ? buildTenantScopeRef(tenantId ?? '', readScopeRoleIds(newDashboard.scopeRef))
7316
+ : buildUserScopeRef(userId ?? ''),
7332
7317
  widgets: [],
7333
7318
  };
7334
7319
  const dashboardModel = dashboardLayoutToModel(dashboardWithMetadata);
@@ -7364,7 +7349,7 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7364
7349
  const editedDashboard = await dashboardPopup.generateDashboardLayout({
7365
7350
  title: currentDashboard.title,
7366
7351
  description: currentDashboard.description,
7367
- roleIds: currentDashboard.roleIds,
7352
+ scopeRef: currentDashboard.scopeRef,
7368
7353
  scope: currentDashboard.scope,
7369
7354
  isArchived: currentDashboard.isArchived,
7370
7355
  locked: currentDashboard.locked,
@@ -7405,6 +7390,7 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7405
7390
  return false;
7406
7391
  try {
7407
7392
  const userId = readUserId(sessionService);
7393
+ const tenantId = readTenantId(sessionService);
7408
7394
  const now = new Date();
7409
7395
  const updatedDashboard = {
7410
7396
  ...currentDashboard,
@@ -7418,7 +7404,9 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7418
7404
  : typeof form.description === 'object'
7419
7405
  ? form.description
7420
7406
  : form.description.toString().trim(),
7421
- roleIds: form.roleIds ?? [],
7407
+ scopeRef: currentDashboard.scope === 'T'
7408
+ ? buildTenantScopeRef(tenantId ?? readScopeTenantId(currentDashboard.scopeRef) ?? '', form.roleIds ?? [])
7409
+ : currentDashboard.scopeRef,
7422
7410
  isArchived: Boolean(form.isArchived),
7423
7411
  locked: Boolean(form.locked),
7424
7412
  scope: currentDashboard.scope,
@@ -7447,6 +7435,8 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7447
7435
  * Adds selected widgets to the current dashboard and saves layout.
7448
7436
  */
7449
7437
  async addWidget() {
7438
+ if (store.readonly())
7439
+ return;
7450
7440
  if (!store.selectedDashboard()) {
7451
7441
  console.warn('No current dashboard selected');
7452
7442
  return;
@@ -7567,6 +7557,8 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7567
7557
  * Removes a widget from the specified dashboard and persists the change.
7568
7558
  */
7569
7559
  async removeWidget(dashboardId, widgetId) {
7560
+ if (store.readonly())
7561
+ return;
7570
7562
  const currentDashboard = store.dashboards().find((d) => d.id === dashboardId);
7571
7563
  if (!currentDashboard)
7572
7564
  return;
@@ -7601,6 +7593,8 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7601
7593
  * Persists immediately with queued writes to prevent concurrent save conflicts.
7602
7594
  */
7603
7595
  onGridChange(event) {
7596
+ if (store.readonly())
7597
+ return;
7604
7598
  if (!store.selectedDashboard())
7605
7599
  return;
7606
7600
  // Skip saves during breakpoint transitions to avoid persisting auto-reflowed layouts
@@ -7656,6 +7650,8 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7656
7650
  * Applies widget configuration changes returned from popup.
7657
7651
  */
7658
7652
  async handlePopupConfiguration(widgetNode) {
7653
+ if (store.readonly())
7654
+ return;
7659
7655
  if (!store.selectedDashboard())
7660
7656
  return;
7661
7657
  try {
@@ -7687,6 +7683,8 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7687
7683
  * Updates widget value (defaultValue) and persists changes.
7688
7684
  */
7689
7685
  async handleValueChanged(widgetNode, data) {
7686
+ if (store.readonly())
7687
+ return;
7690
7688
  if (!store.selectedDashboard())
7691
7689
  return;
7692
7690
  if (!deviceService.isDesktopDevice()) {
@@ -7718,6 +7716,8 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7718
7716
  * Merges widget options with provided data and persists changes.
7719
7717
  */
7720
7718
  async handleOptionsChanged(widgetNode, data) {
7719
+ if (store.readonly())
7720
+ return;
7721
7721
  if (!store.selectedDashboard())
7722
7722
  return;
7723
7723
  try {
@@ -7775,7 +7775,7 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7775
7775
  }
7776
7776
  : layout;
7777
7777
  patchState(store, {
7778
- isAdmin: true,
7778
+ isAdmin: !store.readonly(),
7779
7779
  isLoading: false,
7780
7780
  allDashboards: [hydratedLayout],
7781
7781
  dashboards: [hydratedLayout],
@@ -7827,17 +7827,18 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
7827
7827
  }),
7828
7828
  //#endregion
7829
7829
  //#region ---- Hooks ----
7830
- withHooks((store, entityLayoutTab = inject(DASHBOARD_LAYOUT_ENTITY_MODE, { optional: true })) => ({
7830
+ withHooks((store, entityLayoutTab = inject(DASHBOARD_LAYOUT_ENTITY_MODE, { optional: true }), readonlyMode = inject(DASHBOARD_READONLY_MODE, { optional: true })) => ({
7831
7831
  onInit() {
7832
7832
  if (entityLayoutTab === true) {
7833
7833
  patchState(store, { entityDetailLayoutLock: true });
7834
7834
  }
7835
+ if (readonlyMode === true) {
7836
+ patchState(store, { readonly: true });
7837
+ }
7835
7838
  },
7836
7839
  })));
7837
7840
  //#endregion
7838
7841
 
7839
- //#endregion
7840
-
7841
7842
  class AXMDashboardWidgetWrapperComponent {
7842
7843
  constructor() {
7843
7844
  this.title = input(null, ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
@@ -7919,7 +7920,7 @@ class AXMDashboardGridLayoutSectionComponent {
7919
7920
  }
7920
7921
  }
7921
7922
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardGridLayoutSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7922
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMDashboardGridLayoutSectionComponent, isStandalone: true, selector: "axm-dashboard-grid-layout-section", inputs: { widgetsContext: { classPropertyName: "widgetsContext", publicName: "widgetsContext", isSignal: true, isRequired: false, transformFunction: null }, loadingVariant: { classPropertyName: "loadingVariant", publicName: "loadingVariant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { addWidget: "addWidget" }, ngImport: i0, template: "<div class=\"axm-dashboard-grid-layout-section ax-flex ax-flex-col ax-h-full ax-min-h-0 ax-w-full\">\n @if (store.isLoading()) {\n @if (loadingVariant() === 'overlay') {\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-h-full ax-w-full ax-absolute ax-z-10 ax-bg-white/80\"\n >\n <ax-loading></ax-loading>\n <p class=\"ax-mt-3 ax-text-gray-600\">{{ '@dashboard:loading' | translate | async }}</p>\n </div>\n } @else {\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-h-full ax-w-full ax-flex-1\">\n <ax-loading></ax-loading>\n <p class=\"ax-mt-3 ax-text-gray-600\">{{ '@dashboard:loading' | translate | async }}</p>\n </div>\n }\n } @else if (!store.selectedDashboard()?.widgets?.length) {\n <axp-state-message\n icon=\"fa-light fa-shapes\"\n [title]=\"'@dashboard:no-widgets.title'\"\n [description]=\"'@dashboard:no-widgets.description'\"\n >\n <div slot=\"actions\">\n <button type=\"button\" (click)=\"addWidget.emit()\" class=\"ax-underline\">\n {{ '@dashboard:add-widget' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n } @else {\n <axp-widgets-container [context]=\"widgetsContext()\">\n <ax-grid-layout-container\n class=\"ax-w-full dark:[--ax-comp-grid-layout-stack-item-content-bg-color:var(--ax-sys-color-lighter-surface)] [--ax-comp-grid-layout-stack-item-content-bg-color:var(--ax-sys-color-lightest-surface)]\"\n [options]=\"store.currentLayoutOptions()\"\n (onChange)=\"store.onGridChange($event)\"\n >\n @for (widget of store.currentWidgets(); track widget.config.id) {\n <ax-grid-layout-widget [options]=\"widget.resolvedOptions\">\n @let title = (widget.node?.options?.['title'] ?? widget.config.title) | translate | async;\n @let isHeaderTitleVisible = widget.node?.meta?.['title']?.['visible'] ?? true;\n\n <axm-dashboard-widget-wrapper\n [title]=\"isHeaderTitleVisible ? title! : null\"\n [hasConfiguration]=\"store.canConfigureWidget()(widget)\"\n [isLocked]=\"store.isWidgetLocked()(widget)\"\n (onDelete)=\"confirmWidgetDelete(store.selectedDashboard()!.id, widget.config.id!)\"\n (onConfiguration)=\"store.handlePopupConfiguration(widget.node!)\"\n (onValueChanged)=\"store.handleValueChanged(widget?.node!, $event)\"\n (onOptionsChanged)=\"store.handleOptionsChanged(widget?.node!, $event)\"\n >\n @if (widget.node) {\n <ng-container axp-widget-renderer [node]=\"widget.node\" [mode]=\"'view'\"></ng-container>\n }\n </axm-dashboard-widget-wrapper>\n </ax-grid-layout-widget>\n }\n </ax-grid-layout-container>\n </axp-widgets-container>\n }\n</div>\n", styles: ["axm-dashboard-grid-layout-section ax-grid-layout-widget .grid-stack-item-content{border-radius:.5rem!important;border-width:1px!important;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05) !important;--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color) !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important;background-color:rgb(var(--ax-sys-color-lightest-surface))!important;color:rgb(var(--ax-sys-color-on-lightest-surface))!important;border-color:rgb(var(--ax-sys-color-border-lightest-surface))!important}axm-dashboard-grid-layout-section ax-grid-layout-widget .grid-stack-item-content:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-lighter-surface))!important;color:rgb(var(--ax-sys-color-on-lighter-surface))!important;border-color:rgb(var(--ax-sys-color-border-lighter-surface))!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i1$4.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXGridLayoutBuilderModule }, { kind: "component", type: i2$3.AXGridLayoutContainerComponent, selector: "ax-grid-layout-container", inputs: ["options", "isEmpty"], outputs: ["onAdded", "onRemoved", "onWidgetChange", "onChange", "onRender", "isEmptyChange"] }, { kind: "component", type: i2$3.AXGridLayoutWidgetComponent, selector: "ax-grid-layout-widget", inputs: ["options"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i3$2.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i3$2.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "look"] }, { kind: "component", type: AXMDashboardWidgetWrapperComponent, selector: "axm-dashboard-widget-wrapper", inputs: ["title", "hasConfiguration", "isLocked"], outputs: ["onDelete", "onConfiguration", "onValueChanged", "onOptionsChanged"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
7923
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMDashboardGridLayoutSectionComponent, isStandalone: true, selector: "axm-dashboard-grid-layout-section", inputs: { widgetsContext: { classPropertyName: "widgetsContext", publicName: "widgetsContext", isSignal: true, isRequired: false, transformFunction: null }, loadingVariant: { classPropertyName: "loadingVariant", publicName: "loadingVariant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { addWidget: "addWidget" }, ngImport: i0, template: "<div class=\"axm-dashboard-grid-layout-section ax-flex ax-flex-col ax-h-full ax-min-h-0 ax-w-full\">\n @if (store.isLoading()) {\n @if (loadingVariant() === 'overlay') {\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-h-full ax-w-full ax-absolute ax-z-10 ax-bg-white/80\"\n >\n <ax-loading></ax-loading>\n <p class=\"ax-mt-3 ax-text-gray-600\">{{ '@dashboard:loading' | translate | async }}</p>\n </div>\n } @else {\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-h-full ax-w-full ax-flex-1\">\n <ax-loading></ax-loading>\n <p class=\"ax-mt-3 ax-text-gray-600\">{{ '@dashboard:loading' | translate | async }}</p>\n </div>\n }\n } @else if (!store.selectedDashboard()?.widgets?.length) {\n <axp-state-message\n icon=\"fa-light fa-shapes\"\n [title]=\"'@dashboard:no-widgets.title'\"\n [description]=\"'@dashboard:no-widgets.description'\"\n >\n @if (!store.readonly()) {\n <div slot=\"actions\">\n <button type=\"button\" (click)=\"addWidget.emit()\" class=\"ax-underline\">\n {{ '@dashboard:add-widget' | translate | async }}\n </button>\n </div>\n }\n </axp-state-message>\n } @else {\n <axp-widgets-container [context]=\"widgetsContext()\">\n <ax-grid-layout-container\n class=\"ax-w-full dark:[--ax-comp-grid-layout-stack-item-content-bg-color:var(--ax-sys-color-lighter-surface)] [--ax-comp-grid-layout-stack-item-content-bg-color:var(--ax-sys-color-lightest-surface)]\"\n [options]=\"store.currentLayoutOptions()\"\n (onChange)=\"store.onGridChange($event)\"\n >\n @for (widget of store.currentWidgets(); track widget.config.id) {\n <ax-grid-layout-widget [options]=\"widget.resolvedOptions\">\n @let title = (widget.node?.options?.['title'] ?? widget.config.title) | translate | async;\n @let isHeaderTitleVisible = widget.node?.meta?.['title']?.['visible'] ?? true;\n\n <axm-dashboard-widget-wrapper\n [title]=\"isHeaderTitleVisible ? title! : null\"\n [hasConfiguration]=\"store.canConfigureWidget()(widget)\"\n [isLocked]=\"store.isWidgetLocked()(widget)\"\n (onDelete)=\"confirmWidgetDelete(store.selectedDashboard()!.id, widget.config.id!)\"\n (onConfiguration)=\"store.handlePopupConfiguration(widget.node!)\"\n (onValueChanged)=\"store.handleValueChanged(widget?.node!, $event)\"\n (onOptionsChanged)=\"store.handleOptionsChanged(widget?.node!, $event)\"\n >\n @if (widget.node) {\n <ng-container axp-widget-renderer [node]=\"widget.node\" [mode]=\"'view'\"></ng-container>\n }\n </axm-dashboard-widget-wrapper>\n </ax-grid-layout-widget>\n }\n </ax-grid-layout-container>\n </axp-widgets-container>\n }\n</div>\n", styles: ["axm-dashboard-grid-layout-section ax-grid-layout-widget .grid-stack-item-content{border-radius:.5rem!important;border-width:1px!important;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05) !important;--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color) !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important;background-color:rgb(var(--ax-sys-color-lightest-surface))!important;color:rgb(var(--ax-sys-color-on-lightest-surface))!important;border-color:rgb(var(--ax-sys-color-border-lightest-surface))!important}axm-dashboard-grid-layout-section ax-grid-layout-widget .grid-stack-item-content:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-lighter-surface))!important;color:rgb(var(--ax-sys-color-on-lighter-surface))!important;border-color:rgb(var(--ax-sys-color-border-lighter-surface))!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i1$4.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXGridLayoutBuilderModule }, { kind: "component", type: i2$3.AXGridLayoutContainerComponent, selector: "ax-grid-layout-container", inputs: ["options", "isEmpty"], outputs: ["onAdded", "onRemoved", "onWidgetChange", "onChange", "onRender", "isEmptyChange"] }, { kind: "component", type: i2$3.AXGridLayoutWidgetComponent, selector: "ax-grid-layout-widget", inputs: ["options"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i3$2.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i3$2.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "component", type: AXMDashboardWidgetWrapperComponent, selector: "axm-dashboard-widget-wrapper", inputs: ["title", "hasConfiguration", "isLocked"], outputs: ["onDelete", "onConfiguration", "onValueChanged", "onOptionsChanged"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
7923
7924
  }
7924
7925
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardGridLayoutSectionComponent, decorators: [{
7925
7926
  type: Component,
@@ -7932,9 +7933,697 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7932
7933
  AXPWidgetCoreModule,
7933
7934
  AXPStateMessageComponent,
7934
7935
  AXMDashboardWidgetWrapperComponent,
7935
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"axm-dashboard-grid-layout-section ax-flex ax-flex-col ax-h-full ax-min-h-0 ax-w-full\">\n @if (store.isLoading()) {\n @if (loadingVariant() === 'overlay') {\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-h-full ax-w-full ax-absolute ax-z-10 ax-bg-white/80\"\n >\n <ax-loading></ax-loading>\n <p class=\"ax-mt-3 ax-text-gray-600\">{{ '@dashboard:loading' | translate | async }}</p>\n </div>\n } @else {\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-h-full ax-w-full ax-flex-1\">\n <ax-loading></ax-loading>\n <p class=\"ax-mt-3 ax-text-gray-600\">{{ '@dashboard:loading' | translate | async }}</p>\n </div>\n }\n } @else if (!store.selectedDashboard()?.widgets?.length) {\n <axp-state-message\n icon=\"fa-light fa-shapes\"\n [title]=\"'@dashboard:no-widgets.title'\"\n [description]=\"'@dashboard:no-widgets.description'\"\n >\n <div slot=\"actions\">\n <button type=\"button\" (click)=\"addWidget.emit()\" class=\"ax-underline\">\n {{ '@dashboard:add-widget' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n } @else {\n <axp-widgets-container [context]=\"widgetsContext()\">\n <ax-grid-layout-container\n class=\"ax-w-full dark:[--ax-comp-grid-layout-stack-item-content-bg-color:var(--ax-sys-color-lighter-surface)] [--ax-comp-grid-layout-stack-item-content-bg-color:var(--ax-sys-color-lightest-surface)]\"\n [options]=\"store.currentLayoutOptions()\"\n (onChange)=\"store.onGridChange($event)\"\n >\n @for (widget of store.currentWidgets(); track widget.config.id) {\n <ax-grid-layout-widget [options]=\"widget.resolvedOptions\">\n @let title = (widget.node?.options?.['title'] ?? widget.config.title) | translate | async;\n @let isHeaderTitleVisible = widget.node?.meta?.['title']?.['visible'] ?? true;\n\n <axm-dashboard-widget-wrapper\n [title]=\"isHeaderTitleVisible ? title! : null\"\n [hasConfiguration]=\"store.canConfigureWidget()(widget)\"\n [isLocked]=\"store.isWidgetLocked()(widget)\"\n (onDelete)=\"confirmWidgetDelete(store.selectedDashboard()!.id, widget.config.id!)\"\n (onConfiguration)=\"store.handlePopupConfiguration(widget.node!)\"\n (onValueChanged)=\"store.handleValueChanged(widget?.node!, $event)\"\n (onOptionsChanged)=\"store.handleOptionsChanged(widget?.node!, $event)\"\n >\n @if (widget.node) {\n <ng-container axp-widget-renderer [node]=\"widget.node\" [mode]=\"'view'\"></ng-container>\n }\n </axm-dashboard-widget-wrapper>\n </ax-grid-layout-widget>\n }\n </ax-grid-layout-container>\n </axp-widgets-container>\n }\n</div>\n", styles: ["axm-dashboard-grid-layout-section ax-grid-layout-widget .grid-stack-item-content{border-radius:.5rem!important;border-width:1px!important;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05) !important;--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color) !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important;background-color:rgb(var(--ax-sys-color-lightest-surface))!important;color:rgb(var(--ax-sys-color-on-lightest-surface))!important;border-color:rgb(var(--ax-sys-color-border-lightest-surface))!important}axm-dashboard-grid-layout-section ax-grid-layout-widget .grid-stack-item-content:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-lighter-surface))!important;color:rgb(var(--ax-sys-color-on-lighter-surface))!important;border-color:rgb(var(--ax-sys-color-border-lighter-surface))!important}\n"] }]
7936
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"axm-dashboard-grid-layout-section ax-flex ax-flex-col ax-h-full ax-min-h-0 ax-w-full\">\n @if (store.isLoading()) {\n @if (loadingVariant() === 'overlay') {\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-h-full ax-w-full ax-absolute ax-z-10 ax-bg-white/80\"\n >\n <ax-loading></ax-loading>\n <p class=\"ax-mt-3 ax-text-gray-600\">{{ '@dashboard:loading' | translate | async }}</p>\n </div>\n } @else {\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-h-full ax-w-full ax-flex-1\">\n <ax-loading></ax-loading>\n <p class=\"ax-mt-3 ax-text-gray-600\">{{ '@dashboard:loading' | translate | async }}</p>\n </div>\n }\n } @else if (!store.selectedDashboard()?.widgets?.length) {\n <axp-state-message\n icon=\"fa-light fa-shapes\"\n [title]=\"'@dashboard:no-widgets.title'\"\n [description]=\"'@dashboard:no-widgets.description'\"\n >\n @if (!store.readonly()) {\n <div slot=\"actions\">\n <button type=\"button\" (click)=\"addWidget.emit()\" class=\"ax-underline\">\n {{ '@dashboard:add-widget' | translate | async }}\n </button>\n </div>\n }\n </axp-state-message>\n } @else {\n <axp-widgets-container [context]=\"widgetsContext()\">\n <ax-grid-layout-container\n class=\"ax-w-full dark:[--ax-comp-grid-layout-stack-item-content-bg-color:var(--ax-sys-color-lighter-surface)] [--ax-comp-grid-layout-stack-item-content-bg-color:var(--ax-sys-color-lightest-surface)]\"\n [options]=\"store.currentLayoutOptions()\"\n (onChange)=\"store.onGridChange($event)\"\n >\n @for (widget of store.currentWidgets(); track widget.config.id) {\n <ax-grid-layout-widget [options]=\"widget.resolvedOptions\">\n @let title = (widget.node?.options?.['title'] ?? widget.config.title) | translate | async;\n @let isHeaderTitleVisible = widget.node?.meta?.['title']?.['visible'] ?? true;\n\n <axm-dashboard-widget-wrapper\n [title]=\"isHeaderTitleVisible ? title! : null\"\n [hasConfiguration]=\"store.canConfigureWidget()(widget)\"\n [isLocked]=\"store.isWidgetLocked()(widget)\"\n (onDelete)=\"confirmWidgetDelete(store.selectedDashboard()!.id, widget.config.id!)\"\n (onConfiguration)=\"store.handlePopupConfiguration(widget.node!)\"\n (onValueChanged)=\"store.handleValueChanged(widget?.node!, $event)\"\n (onOptionsChanged)=\"store.handleOptionsChanged(widget?.node!, $event)\"\n >\n @if (widget.node) {\n <ng-container axp-widget-renderer [node]=\"widget.node\" [mode]=\"'view'\"></ng-container>\n }\n </axm-dashboard-widget-wrapper>\n </ax-grid-layout-widget>\n }\n </ax-grid-layout-container>\n </axp-widgets-container>\n }\n</div>\n", styles: ["axm-dashboard-grid-layout-section ax-grid-layout-widget .grid-stack-item-content{border-radius:.5rem!important;border-width:1px!important;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05) !important;--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color) !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important;background-color:rgb(var(--ax-sys-color-lightest-surface))!important;color:rgb(var(--ax-sys-color-on-lightest-surface))!important;border-color:rgb(var(--ax-sys-color-border-lightest-surface))!important}axm-dashboard-grid-layout-section ax-grid-layout-widget .grid-stack-item-content:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-lighter-surface))!important;color:rgb(var(--ax-sys-color-on-lighter-surface))!important;border-color:rgb(var(--ax-sys-color-border-lighter-surface))!important}\n"] }]
7936
7937
  }], propDecorators: { widgetsContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "widgetsContext", required: false }] }], loadingVariant: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingVariant", required: false }] }], addWidget: [{ type: i0.Output, args: ["addWidget"] }] } });
7937
7938
 
7939
+ //#region ---- Imports ----
7940
+ //#endregion
7941
+ //#region ---- Component ----
7942
+ /**
7943
+ * Shared host that loads an entity-type dashboard and renders the grid layout section.
7944
+ * Passes runtime entity context to widgets for record-scoped dynamic data.
7945
+ */
7946
+ class AXMEntityDashboardHostComponent {
7947
+ constructor() {
7948
+ //#region ---- Services & Dependencies ----
7949
+ this.store = inject(AXMDashboardStore);
7950
+ this.entityDashboardService = inject(AXMEntityDashboardService);
7951
+ //#endregion
7952
+ //#region ---- Inputs ----
7953
+ this.entityType = input.required(...(ngDevMode ? [{ debugName: "entityType" }] : /* istanbul ignore next */ []));
7954
+ this.entityId = input.required(...(ngDevMode ? [{ debugName: "entityId" }] : /* istanbul ignore next */ []));
7955
+ this.entityTitle = input(...(ngDevMode ? [undefined, { debugName: "entityTitle" }] : /* istanbul ignore next */ []));
7956
+ /** Full entity record from detail view (rootContext). */
7957
+ this.entityData = input({}, ...(ngDevMode ? [{ debugName: "entityData" }] : /* istanbul ignore next */ []));
7958
+ //#endregion
7959
+ //#region ---- Local State ----
7960
+ this.context = signal({}, ...(ngDevMode ? [{ debugName: "context" }] : /* istanbul ignore next */ []));
7961
+ this.isReady = signal(false, ...(ngDevMode ? [{ debugName: "isReady" }] : /* istanbul ignore next */ []));
7962
+ //#endregion
7963
+ //#region ---- Effects ----
7964
+ this.#loadEntityDashboard = effect(() => {
7965
+ const entityType = this.entityType();
7966
+ const entityId = this.entityId();
7967
+ const entityTitle = this.entityTitle();
7968
+ const entityData = this.entityData();
7969
+ if (!entityType || !entityId) {
7970
+ return;
7971
+ }
7972
+ void this.entityDashboardService.ensureEntityDashboard(entityType, entityTitle).then((model) => {
7973
+ this.store.hydrateFromEntityDetailModel(model);
7974
+ this.context.set(buildDashboardWidgetsContext({ ...model }, {
7975
+ entityType,
7976
+ entityId,
7977
+ data: isObjectLike(entityData) ? { ...entityData } : {},
7978
+ }));
7979
+ this.isReady.set(true);
7980
+ });
7981
+ }, ...(ngDevMode ? [{ debugName: "#loadEntityDashboard" }] : /* istanbul ignore next */ []));
7982
+ }
7983
+ //#endregion
7984
+ //#region ---- Effects ----
7985
+ #loadEntityDashboard;
7986
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7987
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMEntityDashboardHostComponent, isStandalone: true, selector: "axm-entity-dashboard-host", inputs: { entityType: { classPropertyName: "entityType", publicName: "entityType", isSignal: true, isRequired: true, transformFunction: null }, entityId: { classPropertyName: "entityId", publicName: "entityId", isSignal: true, isRequired: true, transformFunction: null }, entityTitle: { classPropertyName: "entityTitle", publicName: "entityTitle", isSignal: true, isRequired: false, transformFunction: null }, entityData: { classPropertyName: "entityData", publicName: "entityData", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
7988
+ AXPDesignerService,
7989
+ { provide: DASHBOARD_LAYOUT_ENTITY_MODE, useValue: true },
7990
+ { provide: DASHBOARD_READONLY_MODE, useValue: true },
7991
+ AXMDashboardStore,
7992
+ ], ngImport: i0, template: `
7993
+ @if (isReady()) {
7994
+ <axm-dashboard-grid-layout-section [widgetsContext]="context()"></axm-dashboard-grid-layout-section>
7995
+ }
7996
+ `, isInline: true, dependencies: [{ kind: "component", type: AXMDashboardGridLayoutSectionComponent, selector: "axm-dashboard-grid-layout-section", inputs: ["widgetsContext", "loadingVariant"], outputs: ["addWidget"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
7997
+ }
7998
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardHostComponent, decorators: [{
7999
+ type: Component,
8000
+ args: [{
8001
+ selector: 'axm-entity-dashboard-host',
8002
+ imports: [AXMDashboardGridLayoutSectionComponent],
8003
+ template: `
8004
+ @if (isReady()) {
8005
+ <axm-dashboard-grid-layout-section [widgetsContext]="context()"></axm-dashboard-grid-layout-section>
8006
+ }
8007
+ `,
8008
+ changeDetection: ChangeDetectionStrategy.OnPush,
8009
+ encapsulation: ViewEncapsulation.None,
8010
+ providers: [
8011
+ AXPDesignerService,
8012
+ { provide: DASHBOARD_LAYOUT_ENTITY_MODE, useValue: true },
8013
+ { provide: DASHBOARD_READONLY_MODE, useValue: true },
8014
+ AXMDashboardStore,
8015
+ ],
8016
+ }]
8017
+ }], propDecorators: { entityType: [{ type: i0.Input, args: [{ isSignal: true, alias: "entityType", required: true }] }], entityId: [{ type: i0.Input, args: [{ isSignal: true, alias: "entityId", required: true }] }], entityTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "entityTitle", required: false }] }], entityData: [{ type: i0.Input, args: [{ isSignal: true, alias: "entityData", required: false }] }] } });
8018
+
8019
+ //#region ---- Imports ----
8020
+ //#endregion
8021
+ //#region ---- Widget View ----
8022
+ class AXMEntityDashboardWidgetViewComponent extends AXPValueWidgetComponent {
8023
+ constructor() {
8024
+ super(...arguments);
8025
+ this.entityType = computed(() => {
8026
+ const fromOptions = this.options()?.['entityType'];
8027
+ return typeof fromOptions === 'string' && fromOptions.trim() ? fromOptions.trim() : undefined;
8028
+ }, ...(ngDevMode ? [{ debugName: "entityType" }] : /* istanbul ignore next */ []));
8029
+ this.entityId = computed(() => {
8030
+ const fromOptions = this.options()?.['entityId'];
8031
+ return typeof fromOptions === 'string' && fromOptions.trim() ? fromOptions.trim() : undefined;
8032
+ }, ...(ngDevMode ? [{ debugName: "entityId" }] : /* istanbul ignore next */ []));
8033
+ this.entityTitle = computed(() => {
8034
+ const subject = this.options()?.['subject'];
8035
+ return typeof subject === 'string' ? subject : undefined;
8036
+ }, ...(ngDevMode ? [{ debugName: "entityTitle" }] : /* istanbul ignore next */ []));
8037
+ this.entityData = computed(() => {
8038
+ const data = this.contextService.data();
8039
+ return isObjectLike(data) ? data : {};
8040
+ }, ...(ngDevMode ? [{ debugName: "entityData" }] : /* istanbul ignore next */ []));
8041
+ }
8042
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
8043
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMEntityDashboardWidgetViewComponent, isStandalone: true, selector: "axm-entity-dashboard-widget-view", usesInheritance: true, ngImport: i0, template: `
8044
+ @if (entityType() && entityId()) {
8045
+ <axm-entity-dashboard-host
8046
+ [entityType]="entityType()!"
8047
+ [entityId]="entityId()!"
8048
+ [entityTitle]="entityTitle()"
8049
+ [entityData]="entityData()"
8050
+ ></axm-entity-dashboard-host>
8051
+ }
8052
+ `, isInline: true, dependencies: [{ kind: "component", type: AXMEntityDashboardHostComponent, selector: "axm-entity-dashboard-host", inputs: ["entityType", "entityId", "entityTitle", "entityData"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8053
+ }
8054
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardWidgetViewComponent, decorators: [{
8055
+ type: Component,
8056
+ args: [{
8057
+ selector: 'axm-entity-dashboard-widget-view',
8058
+ imports: [AXMEntityDashboardHostComponent],
8059
+ template: `
8060
+ @if (entityType() && entityId()) {
8061
+ <axm-entity-dashboard-host
8062
+ [entityType]="entityType()!"
8063
+ [entityId]="entityId()!"
8064
+ [entityTitle]="entityTitle()"
8065
+ [entityData]="entityData()"
8066
+ ></axm-entity-dashboard-host>
8067
+ }
8068
+ `,
8069
+ changeDetection: ChangeDetectionStrategy.OnPush,
8070
+ }]
8071
+ }] });
8072
+ //#endregion
8073
+ //#region ---- Page Component ----
8074
+ class AXMEntityDashboardPageComponent extends AXPPageLayoutBaseComponent {
8075
+ constructor() {
8076
+ super(...arguments);
8077
+ //#region ---- Inputs ----
8078
+ this.rootContext = input.required(...(ngDevMode ? [{ debugName: "rootContext" }] : /* istanbul ignore next */ []));
8079
+ this.pageConfig = input(...(ngDevMode ? [undefined, { debugName: "pageConfig" }] : /* istanbul ignore next */ []));
8080
+ //#endregion
8081
+ //#region ---- Services & Dependencies ----
8082
+ this.route = inject(ActivatedRoute);
8083
+ this.entityDashboardService = inject(AXMEntityDashboardService);
8084
+ //#endregion
8085
+ //#region ---- Computed Properties ----
8086
+ this.entityRef = computed(() => {
8087
+ const moduleName = this.route.snapshot.parent?.paramMap.get('module');
8088
+ const entityName = this.route.snapshot.paramMap.get('entity');
8089
+ return this.entityDashboardService.resolveEntityRefFromContext(moduleName, entityName, this.rootContext());
8090
+ }, ...(ngDevMode ? [{ debugName: "entityRef" }] : /* istanbul ignore next */ []));
8091
+ this.entityTitle = computed(() => {
8092
+ const title = get(this.rootContext(), 'title');
8093
+ return typeof title === 'string' ? title : undefined;
8094
+ }, ...(ngDevMode ? [{ debugName: "entityTitle" }] : /* istanbul ignore next */ []));
8095
+ }
8096
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardPageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
8097
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMEntityDashboardPageComponent, isStandalone: true, selector: "axm-entity-dashboard-page", inputs: { rootContext: { classPropertyName: "rootContext", publicName: "rootContext", isSignal: true, isRequired: true, transformFunction: null }, pageConfig: { classPropertyName: "pageConfig", publicName: "pageConfig", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
8098
+ {
8099
+ provide: AXPPageLayoutBase,
8100
+ useExisting: AXMEntityDashboardPageComponent,
8101
+ },
8102
+ ], usesInheritance: true, ngImport: i0, template: `
8103
+ @if (entityRef(); as ref) {
8104
+ <axm-entity-dashboard-host
8105
+ [entityType]="ref.entityType"
8106
+ [entityId]="ref.entityId"
8107
+ [entityTitle]="entityTitle()"
8108
+ [entityData]="rootContext()"
8109
+ ></axm-entity-dashboard-host>
8110
+ }
8111
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "component", type: AXMEntityDashboardHostComponent, selector: "axm-entity-dashboard-host", inputs: ["entityType", "entityId", "entityTitle", "entityData"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8112
+ }
8113
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardPageComponent, decorators: [{
8114
+ type: Component,
8115
+ args: [{ selector: 'axm-entity-dashboard-page', imports: [AXMEntityDashboardHostComponent], template: `
8116
+ @if (entityRef(); as ref) {
8117
+ <axm-entity-dashboard-host
8118
+ [entityType]="ref.entityType"
8119
+ [entityId]="ref.entityId"
8120
+ [entityTitle]="entityTitle()"
8121
+ [entityData]="rootContext()"
8122
+ ></axm-entity-dashboard-host>
8123
+ }
8124
+ `, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
8125
+ {
8126
+ provide: AXPPageLayoutBase,
8127
+ useExisting: AXMEntityDashboardPageComponent,
8128
+ },
8129
+ ], styles: [":host{display:block;width:100%;height:100%}\n"] }]
8130
+ }], propDecorators: { rootContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootContext", required: true }] }], pageConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageConfig", required: false }] }] } });
8131
+
8132
+ var entityDashboardPage_component = /*#__PURE__*/Object.freeze({
8133
+ __proto__: null,
8134
+ AXMEntityDashboardPageComponent: AXMEntityDashboardPageComponent,
8135
+ AXMEntityDashboardWidgetViewComponent: AXMEntityDashboardWidgetViewComponent
8136
+ });
8137
+
8138
+ //#region ---- Entity Dashboard Page Provider ----
8139
+ class AXMEntityDashboardPageComponentProvider {
8140
+ async components() {
8141
+ return [
8142
+ {
8143
+ key: ENTITY_DASHBOARD_PAGE_COMPONENT_KEY,
8144
+ loader: () => Promise.resolve().then(function () { return entityDashboardPage_component; }).then((c) => c.AXMEntityDashboardPageComponent),
8145
+ },
8146
+ ];
8147
+ }
8148
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardPageComponentProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8149
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardPageComponentProvider }); }
8150
+ }
8151
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMEntityDashboardPageComponentProvider, decorators: [{
8152
+ type: Injectable
8153
+ }] });
8154
+
8155
+ var entityDashboardPageComponent_provider = /*#__PURE__*/Object.freeze({
8156
+ __proto__: null,
8157
+ AXMEntityDashboardPageComponentProvider: AXMEntityDashboardPageComponentProvider
8158
+ });
8159
+
8160
+ const AXPEntityDashboardWidget = {
8161
+ name: 'entity-dashboard',
8162
+ title: '@dashboard-management:dashboards.widget.entity-dashboard.title',
8163
+ description: '@dashboard-management:dashboards.widget.entity-dashboard.description',
8164
+ type: 'view',
8165
+ categories: [],
8166
+ groups: [AXPWidgetGroupEnum.EntityWidget],
8167
+ icon: 'fa-light fa-gauge-high',
8168
+ properties: [],
8169
+ components: {
8170
+ view: {
8171
+ component: () => Promise.resolve().then(function () { return entityDashboardPage_component; }).then((c) => c.AXMEntityDashboardWidgetViewComponent),
8172
+ },
8173
+ edit: {
8174
+ component: () => Promise.resolve().then(function () { return entityDashboardPage_component; }).then((c) => c.AXMEntityDashboardWidgetViewComponent),
8175
+ },
8176
+ },
8177
+ };
8178
+
8179
+ //#endregion
8180
+ //#region ---- Dashboard Management Widgets Provider ----
8181
+ const DASHBOARD_WIDGETS = [
8182
+ AXPEntityDashboardWidget,
8183
+ AXPShortcutWidget,
8184
+ AXPDonutChartWidget,
8185
+ AXPBarChartWidget,
8186
+ AXPLineChartWidget,
8187
+ AXPFunnelChartWidget,
8188
+ AXPHeatmapChartWidget,
8189
+ AXPKpiProgressWidget,
8190
+ AXPKpiSegmentedWidget,
8191
+ AXPKpiDetailsWidget,
8192
+ AXPKpiStatCardWidget,
8193
+ AXPGaugeChartWidget,
8194
+ AXPStickyNoteWidget,
8195
+ AXPMinimalWeatherWidget,
8196
+ AXPAdvancedWeatherWidget,
8197
+ AXPAnalogClockWidget,
8198
+ ];
8199
+ class AXMDashboardManagementWidgetsProvider {
8200
+ getWidgets() {
8201
+ return DASHBOARD_WIDGETS;
8202
+ }
8203
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementWidgetsProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8204
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementWidgetsProvider }); }
8205
+ }
8206
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementWidgetsProvider, decorators: [{
8207
+ type: Injectable
8208
+ }] });
8209
+
8210
+ //#region ---- Imports ----
8211
+ //#endregion
8212
+ //#region ---- Constants ----
8213
+ const DASHBOARD_ENTITY_KEY = `${RootConfig.module.name}.${RootConfig.entities.dashboard.name}`;
8214
+ //#endregion
8215
+ //#region ---- Middleware ----
8216
+ /**
8217
+ * Normalizes dashboard scope/scopeRef on create/update and applies tenant lock defaults.
8218
+ */
8219
+ const dashboardScopeMiddleware = {
8220
+ target: { ops: ['create', 'update'], order: 4 },
8221
+ execute: async (ctx, next) => {
8222
+ if (ctx.entityName !== DASHBOARD_ENTITY_KEY || ctx.data == null || typeof ctx.data !== 'object') {
8223
+ await next();
8224
+ return;
8225
+ }
8226
+ const payload = ctx.data;
8227
+ let scope = payload['scope'];
8228
+ if (!scope) {
8229
+ scope = 'T';
8230
+ payload['scope'] = scope;
8231
+ }
8232
+ const legacyUserId = get(payload, 'userId');
8233
+ const legacyRoleIds = get(payload, 'roleIds');
8234
+ const legacyEntityType = get(payload, 'entityType');
8235
+ const legacyTenantId = get(payload, 'tenantId');
8236
+ const scopeRef = normalizeDashboardScopeRef(scope, payload['scopeRef'], {
8237
+ userId: isString(legacyUserId) ? legacyUserId : undefined,
8238
+ tenantId: isString(legacyTenantId) ? legacyTenantId : undefined,
8239
+ roleIds: Array.isArray(legacyRoleIds) ? legacyRoleIds : readScopeRoleIds(payload['scopeRef']),
8240
+ entityType: isString(legacyEntityType) ? legacyEntityType : undefined,
8241
+ });
8242
+ set(payload, 'scopeRef', scopeRef);
8243
+ delete payload['userId'];
8244
+ delete payload['roleIds'];
8245
+ delete payload['entityType'];
8246
+ delete payload['tenantId'];
8247
+ if (scope === 'T') {
8248
+ payload['locked'] = true;
8249
+ }
8250
+ if (scope === 'E') {
8251
+ set(payload, 'scopeRef', buildEntityScopeRef(get(scopeRef, 'entityType')));
8252
+ }
8253
+ if (scope === 'U') {
8254
+ set(payload, 'scopeRef', buildUserScopeRef(get(scopeRef, 'userId')));
8255
+ }
8256
+ if (scope === 'T') {
8257
+ set(payload, 'scopeRef', buildTenantScopeRef(get(scopeRef, 'tenantId'), readScopeRoleIds(scopeRef)));
8258
+ }
8259
+ await next();
8260
+ },
8261
+ };
8262
+ //#endregion
8263
+
8264
+ // Entity Modules
8265
+ function createAppRoute() {
8266
+ const config = inject(AXP_ENTITY_CONFIG_TOKEN);
8267
+ return {
8268
+ path: ':app',
8269
+ canActivate: [...AXP_PROTECTED_ROUTE_GUARDS],
8270
+ data: { rootLayout: true },
8271
+ loadComponent: () => {
8272
+ return config.viewers.root();
8273
+ },
8274
+ children: [
8275
+ {
8276
+ path: 'dashboard',
8277
+ loadComponent: () => Promise.resolve().then(function () { return homeDashboard; }).then((c) => c.AXMDashboardHomeComponent),
8278
+ },
8279
+ ],
8280
+ };
8281
+ }
8282
+ class AXMDashboardManagementModule {
8283
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
8284
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementModule, imports: [AXPWidgetCoreModule] }); }
8285
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementModule, providers: [
8286
+ { provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXMDashboardManagementWidgetsProvider, multi: true },
8287
+ {
8288
+ provide: AXP_HOME_PAGES,
8289
+ multi: true,
8290
+ useFactory: () => [
8291
+ {
8292
+ key: 'dashboard',
8293
+ title: 'Dashboard',
8294
+ route: createAppRoute(),
8295
+ },
8296
+ ],
8297
+ },
8298
+ // Module-specific providers (not part of manifest system)
8299
+ AXPWidgetsModule,
8300
+ {
8301
+ provide: AXP_HOME_PAGE_DEFAULT_KEY,
8302
+ useValue: 'dashboard',
8303
+ },
8304
+ // Module Manifest Provider
8305
+ {
8306
+ provide: AXP_MODULE_MANIFEST_PROVIDER,
8307
+ useValue: DashboardManagementManifest,
8308
+ multi: true,
8309
+ },
8310
+ // Provider references (now using tokens)
8311
+ {
8312
+ provide: AXP_PERMISSION_DEFINITION_PROVIDER,
8313
+ useClass: AXMPermissionDefinitionProvider,
8314
+ multi: true,
8315
+ },
8316
+ {
8317
+ provide: AXP_MENU_PROVIDER,
8318
+ useClass: AXMMenuProvider,
8319
+ multi: true,
8320
+ },
8321
+ {
8322
+ provide: AXP_ENTITY_DEFINITION_LOADER,
8323
+ useClass: AXMEntityProvider,
8324
+ multi: true,
8325
+ },
8326
+ {
8327
+ provide: AXP_ENTITY_ACTION_PLUGIN,
8328
+ useValue: dashboardPlugin,
8329
+ multi: true,
8330
+ },
8331
+ {
8332
+ provide: AXP_ENTITY_STORAGE_MIDDLEWARE,
8333
+ useValue: dashboardScopeMiddleware,
8334
+ multi: true,
8335
+ },
8336
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-modules-dashboard-management-index-rp9dgARq.mjs').then((m) => m.AXMDashboardLayoutPageComponentProvider)),
8337
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => Promise.resolve().then(function () { return entityDashboardPageComponent_provider; }).then((m) => m.AXMEntityDashboardPageComponentProvider)),
8338
+ ], imports: [AXPWidgetCoreModule] }); }
8339
+ }
8340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardManagementModule, decorators: [{
8341
+ type: NgModule,
8342
+ args: [{
8343
+ imports: [
8344
+ AXPWidgetCoreModule,
8345
+ // Entity Modules
8346
+ ],
8347
+ providers: [
8348
+ { provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXMDashboardManagementWidgetsProvider, multi: true },
8349
+ {
8350
+ provide: AXP_HOME_PAGES,
8351
+ multi: true,
8352
+ useFactory: () => [
8353
+ {
8354
+ key: 'dashboard',
8355
+ title: 'Dashboard',
8356
+ route: createAppRoute(),
8357
+ },
8358
+ ],
8359
+ },
8360
+ // Module-specific providers (not part of manifest system)
8361
+ AXPWidgetsModule,
8362
+ {
8363
+ provide: AXP_HOME_PAGE_DEFAULT_KEY,
8364
+ useValue: 'dashboard',
8365
+ },
8366
+ // Module Manifest Provider
8367
+ {
8368
+ provide: AXP_MODULE_MANIFEST_PROVIDER,
8369
+ useValue: DashboardManagementManifest,
8370
+ multi: true,
8371
+ },
8372
+ // Provider references (now using tokens)
8373
+ {
8374
+ provide: AXP_PERMISSION_DEFINITION_PROVIDER,
8375
+ useClass: AXMPermissionDefinitionProvider,
8376
+ multi: true,
8377
+ },
8378
+ {
8379
+ provide: AXP_MENU_PROVIDER,
8380
+ useClass: AXMMenuProvider,
8381
+ multi: true,
8382
+ },
8383
+ {
8384
+ provide: AXP_ENTITY_DEFINITION_LOADER,
8385
+ useClass: AXMEntityProvider,
8386
+ multi: true,
8387
+ },
8388
+ {
8389
+ provide: AXP_ENTITY_ACTION_PLUGIN,
8390
+ useValue: dashboardPlugin,
8391
+ multi: true,
8392
+ },
8393
+ {
8394
+ provide: AXP_ENTITY_STORAGE_MIDDLEWARE,
8395
+ useValue: dashboardScopeMiddleware,
8396
+ multi: true,
8397
+ },
8398
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-modules-dashboard-management-index-rp9dgARq.mjs').then((m) => m.AXMDashboardLayoutPageComponentProvider)),
8399
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => Promise.resolve().then(function () { return entityDashboardPageComponent_provider; }).then((m) => m.AXMEntityDashboardPageComponentProvider)),
8400
+ ],
8401
+ }]
8402
+ }] });
8403
+
8404
+ async function dashboardFactory() {
8405
+ const entityDef = {
8406
+ module: RootConfig.module.name,
8407
+ name: RootConfig.entities.dashboard.name,
8408
+ title: RootConfig.entities.dashboard.title,
8409
+ icon: RootConfig.entities.dashboard.icon,
8410
+ plugins: [{ name: 'category' }, { name: 'archive' }],
8411
+ pages: [
8412
+ {
8413
+ componentKey: DASHBOARD_LAYOUT_PAGE_COMPONENT_KEY,
8414
+ title: '@dashboard-management:dashboards.entities.dashboard.pages.layout.title',
8415
+ description: '@dashboard-management:dashboards.entities.dashboard.pages.layout.description',
8416
+ icon: 'fa-light fa-table-layout',
8417
+ layout: { order: 1, position: 'after' },
8418
+ },
8419
+ ],
8420
+ formats: {
8421
+ individual: RootConfig.entities.dashboard.title,
8422
+ plural: RootConfig.entities.dashboard.titlePlural,
8423
+ displayName: '@general:terms.interface.configuration',
8424
+ searchResult: {
8425
+ title: '{{ title }}',
8426
+ description: RootConfig.module.title,
8427
+ },
8428
+ },
8429
+ relatedEntities: [],
8430
+ groups: [
8431
+ {
8432
+ id: 'section',
8433
+ title: RootConfig.entities.dashboard.title,
8434
+ },
8435
+ {
8436
+ id: 'access',
8437
+ title: '@dashboard-management:dashboards.entities.dashboard.groups.access.title',
8438
+ },
8439
+ ],
8440
+ properties: [
8441
+ {
8442
+ name: 'id',
8443
+ title: 'ID',
8444
+ groupId: 'section',
8445
+ schema: { dataType: 'uuid', visible: false, nullable: false, readonly: true, unique: { enabled: true } },
8446
+ },
8447
+ {
8448
+ name: 'title',
8449
+ title: '@general:terms.common.title',
8450
+ groupId: 'section',
8451
+ options: {
8452
+ sort: {
8453
+ enabled: true,
8454
+ },
8455
+ filter: {
8456
+ advance: {
8457
+ enabled: true,
8458
+ },
8459
+ inline: {
8460
+ enabled: true,
8461
+ },
8462
+ },
8463
+ },
8464
+ schema: {
8465
+ dataType: 'string',
8466
+ interface: {
8467
+ type: AXPWidgetsList.Editors.TextBox,
8468
+ options: {
8469
+ multiLanguage: true,
8470
+ placeholder: '@general:terms.common.title',
8471
+ },
8472
+ },
8473
+ },
8474
+ validations: [
8475
+ {
8476
+ rule: 'required',
8477
+ },
8478
+ ],
8479
+ },
8480
+ {
8481
+ name: 'description',
8482
+ title: '@dashboard-management:dashboards.entities.dashboard.fields.description.title',
8483
+ groupId: 'section',
8484
+ options: {
8485
+ sort: {
8486
+ enabled: false,
8487
+ },
8488
+ filter: {
8489
+ advance: {
8490
+ enabled: false,
8491
+ },
8492
+ inline: {
8493
+ enabled: false,
8494
+ },
8495
+ },
8496
+ },
8497
+ schema: {
8498
+ dataType: 'string',
8499
+ interface: {
8500
+ type: AXPWidgetsList.Editors.LargeTextBox,
8501
+ options: {
8502
+ rows: 3,
8503
+ multiLanguage: true,
8504
+ placeholder: '@general:terms.common.description',
8505
+ },
8506
+ },
8507
+ },
8508
+ },
8509
+ {
8510
+ name: 'scope',
8511
+ title: '@dashboard-management:dashboards.entities.dashboard.fields.scope.title',
8512
+ groupId: 'access',
8513
+ options: {
8514
+ sort: { enabled: true },
8515
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
8516
+ },
8517
+ schema: {
8518
+ dataType: 'string',
8519
+ visible: false,
8520
+ interface: {
8521
+ type: AXPWidgetsList.Editors.SelectBox,
8522
+ options: {
8523
+ valueField: 'id',
8524
+ dataSource: [
8525
+ {
8526
+ id: 'T',
8527
+ title: '@dashboard-management:dashboards.entities.dashboard.fields.scope.options.tenant',
8528
+ },
8529
+ {
8530
+ id: 'U',
8531
+ title: '@dashboard-management:dashboards.entities.dashboard.fields.scope.options.personal',
8532
+ },
8533
+ {
8534
+ id: 'E',
8535
+ title: '@dashboard-management:dashboards.entities.dashboard.fields.scope.options.entity',
8536
+ },
8537
+ ],
8538
+ },
8539
+ },
8540
+ },
8541
+ },
8542
+ {
8543
+ name: 'scopeRef.roleIds',
8544
+ title: '@dashboard:roles',
8545
+ groupId: 'access',
8546
+ schema: {
8547
+ dataType: 'object',
8548
+ visible: `{{ !context.eval("scope") || context.eval("scope") === "T" }}`,
8549
+ interface: {
8550
+ type: AXPWidgetsList.Editors.LookupBox,
8551
+ options: {
8552
+ entity: 'SecurityManagement.Role',
8553
+ multiple: true,
8554
+ look: 'select',
8555
+ },
8556
+ },
8557
+ },
8558
+ },
8559
+ ],
8560
+ columns: [{ name: 'title' }, { name: 'description' }],
8561
+ interfaces: {
8562
+ master: {
8563
+ create: {
8564
+ sections: [{ id: 'section' }, { id: 'access' }],
8565
+ properties: [
8566
+ { name: 'title', layout: { positions: { lg: { colSpan: 6, order: 1 } } } },
8567
+ { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 2 } } } },
8568
+ { name: 'scopeRef.roleIds', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
8569
+ ],
8570
+ },
8571
+ update: {
8572
+ sections: [{ id: 'section' }, { id: 'access' }],
8573
+ properties: [
8574
+ { name: 'title', layout: { positions: { lg: { colSpan: 6, order: 1 } } } },
8575
+ { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 2 } } } },
8576
+ { name: 'scopeRef.roleIds', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
8577
+ ],
8578
+ },
8579
+ single: {
8580
+ title: '{{title}}',
8581
+ sections: [{ id: 'section', layout: { positions: { lg: { colSpan: 12 } } } }, { id: 'access' }],
8582
+ properties: [
8583
+ { name: 'title', layout: { positions: { lg: { colSpan: 6, order: 1 } } } },
8584
+ { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 2 } } } },
8585
+ { name: 'scopeRef.roleIds', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
8586
+ ],
8587
+ actions: [...entityMasterRecordActions()],
8588
+ },
8589
+ list: {
8590
+ actions: [...entityMasterCrudActions()],
8591
+ views: [
8592
+ createQueryView('tenant', '@dashboard-management:dashboards.entities.dashboard.views.tenant', true, {
8593
+ sorts: [{ name: 'title', dir: 'asc' }],
8594
+ conditions: [{ name: 'scope', operator: { type: 'equal' }, value: 'T' }],
8595
+ }),
8596
+ ],
8597
+ },
8598
+ },
8599
+ },
8600
+ };
8601
+ return entityDef;
8602
+ }
8603
+
8604
+ //#endregion
8605
+
8606
+ //#region ---- Dashboard Scope Types ----
8607
+ //#endregion
8608
+
8609
+ var index = /*#__PURE__*/Object.freeze({
8610
+ __proto__: null,
8611
+ buildEntityScopeRef: buildEntityScopeRef,
8612
+ buildTenantScopeRef: buildTenantScopeRef,
8613
+ buildUserScopeRef: buildUserScopeRef,
8614
+ dashboardFactory: dashboardFactory,
8615
+ normalizeDashboardScopeRef: normalizeDashboardScopeRef,
8616
+ readScopeEntityType: readScopeEntityType,
8617
+ readScopeRoleIds: readScopeRoleIds,
8618
+ readScopeTenantId: readScopeTenantId,
8619
+ readScopeUserId: readScopeUserId
8620
+ });
8621
+
8622
+ // Entity Services
8623
+ // Entity Modules
8624
+
8625
+ //#endregion
8626
+
7938
8627
  class AXMDashboardHomeComponent extends AXPPageLayoutBaseComponent {
7939
8628
  constructor() {
7940
8629
  super(...arguments);
@@ -8112,7 +8801,7 @@ class AXMDashboardHomeComponent extends AXPPageLayoutBaseComponent {
8112
8801
  provide: AXPPageLayoutBase,
8113
8802
  useExisting: AXMDashboardHomeComponent,
8114
8803
  },
8115
- ], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <axp-page-content class=\"ax-relative\">\n @if (store.isLoading()) {\n <div class=\"axm-dashboard-home__skeleton ax-w-full ax-min-h-full\" aria-busy=\"true\" aria-live=\"polite\">\n <div class=\"axm-dashboard-home__skeleton-grid\">\n @for (widget of skeletonWidgets; track widget.id) {\n <article\n class=\"axm-dashboard-home__skeleton-widget\"\n [style.grid-area]=\"widget.area\"\n >\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-title\"></ax-skeleton>\n\n <div class=\"axm-dashboard-home__skeleton-body\">\n @switch (widget.variant) {\n @case ('list') {\n @for (row of skeletonListRows; track row) {\n <div class=\"axm-dashboard-home__skeleton-list-row\">\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-avatar\"></ax-skeleton>\n <div class=\"axm-dashboard-home__skeleton-list-text\">\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-line axm-dashboard-home__skeleton-line--wide\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-line axm-dashboard-home__skeleton-line--narrow\"></ax-skeleton>\n </div>\n </div>\n }\n }\n @case ('compact') {\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-circle\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-line axm-dashboard-home__skeleton-line--medium\"></ax-skeleton>\n }\n @case ('action') {\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-action\"></ax-skeleton>\n }\n }\n </div>\n </article>\n }\n </div>\n </div>\n } @else if (!store.dashboards().length) {\n <axp-state-message\n icon=\"fa-light fa-shapes\"\n [title]=\"'@dashboard:empty-state.title'\"\n [description]=\"'@dashboard:empty-state.description'\"\n >\n <div slot=\"actions\">\n <button type=\"button\" (click)=\"execute({ name: 'new-dashboard' })\" class=\"ax-underline\">\n {{ '@dashboard:add-first-dashboard' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n } @else {\n <axm-dashboard-grid-layout-section\n [widgetsContext]=\"context()\"\n [loadingVariant]=\"'overlay'\"\n (addWidget)=\"execute({ name: 'new-widget' })\"\n ></axm-dashboard-grid-layout-section>\n }\n </axp-page-content>\n</axp-page-layout>\n", styles: ["axm-dashboard-home{background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}axm-dashboard-home .placeholder-content{border-radius:.5rem!important;border-width:1px!important;border-style:dashed!important;--tw-border-opacity: 1 !important;border-color:rgba(var(--ax-sys-color-primary-500),var(--tw-border-opacity, 1))!important;background-color:rgba(var(--ax-sys-color-primary-lightest-surface),.5)!important}axm-dashboard-home ax-grid-layout-widget .grid-stack-item-content{border-radius:.5rem!important;border-width:1px!important;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05) !important;--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color) !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important;background-color:rgb(var(--ax-sys-color-lightest-surface))!important;color:rgb(var(--ax-sys-color-on-lightest-surface))!important;border-color:rgb(var(--ax-sys-color-border-lightest-surface))!important}axm-dashboard-home ax-grid-layout-widget .grid-stack-item-content:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-lighter-surface))!important;color:rgb(var(--ax-sys-color-on-lighter-surface))!important;border-color:rgb(var(--ax-sys-color-border-lighter-surface))!important}axm-dashboard-home .axm-dashboard-home__skeleton-grid{display:grid;gap:1rem;padding:1rem;grid-template-columns:repeat(12,minmax(0,1fr));grid-template-rows:repeat(5,minmax(72px,auto));grid-template-areas:\"clock clock clock tasks tasks tasks tasks tasks notifications notifications notifications notifications\" \"clock clock clock tasks tasks tasks tasks tasks notifications notifications notifications notifications\" \"action action action tasks tasks tasks tasks tasks notifications notifications notifications notifications\" \"notes notes notes tasks tasks tasks tasks tasks notifications notifications notifications notifications\" \"notes notes notes tasks tasks tasks tasks tasks notifications notifications notifications notifications\"}axm-dashboard-home .axm-dashboard-home__skeleton-widget{display:flex;min-height:0px;flex-direction:column;gap:.75rem;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lightest-surface),var(--tw-bg-opacity, 1));padding:1rem;--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)}axm-dashboard-home .axm-dashboard-home__skeleton-title{height:1rem;width:8rem;max-width:100%;border-radius:.25rem}axm-dashboard-home .axm-dashboard-home__skeleton-body{display:flex;min-height:0px;flex:1 1 0%;flex-direction:column;gap:.75rem}axm-dashboard-home .axm-dashboard-home__skeleton-list-row{display:flex;align-items:center;gap:.75rem}axm-dashboard-home .axm-dashboard-home__skeleton-avatar{height:2.5rem;width:2.5rem;flex-shrink:0;border-radius:9999px}axm-dashboard-home .axm-dashboard-home__skeleton-list-text{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column;gap:.5rem}axm-dashboard-home .axm-dashboard-home__skeleton-line{height:.75rem;border-radius:.25rem}axm-dashboard-home .axm-dashboard-home__skeleton-line--wide{width:100%}axm-dashboard-home .axm-dashboard-home__skeleton-line--medium{width:66.666667%}axm-dashboard-home .axm-dashboard-home__skeleton-line--narrow{width:60%}axm-dashboard-home .axm-dashboard-home__skeleton-circle{height:4rem;width:4rem;border-radius:9999px}axm-dashboard-home .axm-dashboard-home__skeleton-action{height:2.5rem;width:100%;border-radius:.5rem}@media(max-width:768px){axm-dashboard-home .axm-dashboard-home__skeleton-grid{grid-template-columns:repeat(6,minmax(0,1fr));grid-template-rows:auto;grid-template-areas:\"clock clock clock notes notes notes\" \"action action action notes notes notes\" \"tasks tasks tasks tasks tasks tasks\" \"notifications notifications notifications notifications notifications notifications\"}}@media(max-width:480px){axm-dashboard-home .axm-dashboard-home__skeleton-grid{grid-template-columns:minmax(0,1fr);grid-template-areas:\"clock\" \"action\" \"tasks\" \"notifications\" \"notes\"}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: 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: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i4.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "component", type: AXMDashboardGridLayoutSectionComponent, selector: "axm-dashboard-grid-layout-section", inputs: ["widgetsContext", "loadingVariant"], outputs: ["addWidget"] }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "look"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
8804
+ ], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <axp-page-content class=\"ax-relative\">\n @if (store.isLoading()) {\n <div class=\"axm-dashboard-home__skeleton ax-w-full ax-min-h-full\" aria-busy=\"true\" aria-live=\"polite\">\n <div class=\"axm-dashboard-home__skeleton-grid\">\n @for (widget of skeletonWidgets; track widget.id) {\n <article\n class=\"axm-dashboard-home__skeleton-widget\"\n [style.grid-area]=\"widget.area\"\n >\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-title\"></ax-skeleton>\n\n <div class=\"axm-dashboard-home__skeleton-body\">\n @switch (widget.variant) {\n @case ('list') {\n @for (row of skeletonListRows; track row) {\n <div class=\"axm-dashboard-home__skeleton-list-row\">\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-avatar\"></ax-skeleton>\n <div class=\"axm-dashboard-home__skeleton-list-text\">\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-line axm-dashboard-home__skeleton-line--wide\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-line axm-dashboard-home__skeleton-line--narrow\"></ax-skeleton>\n </div>\n </div>\n }\n }\n @case ('compact') {\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-circle\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-line axm-dashboard-home__skeleton-line--medium\"></ax-skeleton>\n }\n @case ('action') {\n <ax-skeleton [animated]=\"true\" class=\"axm-dashboard-home__skeleton-action\"></ax-skeleton>\n }\n }\n </div>\n </article>\n }\n </div>\n </div>\n } @else if (!store.dashboards().length) {\n <axp-state-message\n icon=\"fa-light fa-shapes\"\n [title]=\"'@dashboard:empty-state.title'\"\n [description]=\"'@dashboard:empty-state.description'\"\n >\n <div slot=\"actions\">\n <button type=\"button\" (click)=\"execute({ name: 'new-dashboard' })\" class=\"ax-underline\">\n {{ '@dashboard:add-first-dashboard' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n } @else {\n <axm-dashboard-grid-layout-section\n [widgetsContext]=\"context()\"\n [loadingVariant]=\"'overlay'\"\n (addWidget)=\"execute({ name: 'new-widget' })\"\n ></axm-dashboard-grid-layout-section>\n }\n </axp-page-content>\n</axp-page-layout>\n", styles: ["axm-dashboard-home{background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}axm-dashboard-home .placeholder-content{border-radius:.5rem!important;border-width:1px!important;border-style:dashed!important;--tw-border-opacity: 1 !important;border-color:rgba(var(--ax-sys-color-primary-500),var(--tw-border-opacity, 1))!important;background-color:rgba(var(--ax-sys-color-primary-lightest-surface),.5)!important}axm-dashboard-home ax-grid-layout-widget .grid-stack-item-content{border-radius:.5rem!important;border-width:1px!important;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05) !important;--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color) !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important;background-color:rgb(var(--ax-sys-color-lightest-surface))!important;color:rgb(var(--ax-sys-color-on-lightest-surface))!important;border-color:rgb(var(--ax-sys-color-border-lightest-surface))!important}axm-dashboard-home ax-grid-layout-widget .grid-stack-item-content:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-lighter-surface))!important;color:rgb(var(--ax-sys-color-on-lighter-surface))!important;border-color:rgb(var(--ax-sys-color-border-lighter-surface))!important}axm-dashboard-home .axm-dashboard-home__skeleton-grid{display:grid;gap:1rem;padding:1rem;grid-template-columns:repeat(12,minmax(0,1fr));grid-template-rows:repeat(5,minmax(72px,auto));grid-template-areas:\"clock clock clock tasks tasks tasks tasks tasks notifications notifications notifications notifications\" \"clock clock clock tasks tasks tasks tasks tasks notifications notifications notifications notifications\" \"action action action tasks tasks tasks tasks tasks notifications notifications notifications notifications\" \"notes notes notes tasks tasks tasks tasks tasks notifications notifications notifications notifications\" \"notes notes notes tasks tasks tasks tasks tasks notifications notifications notifications notifications\"}axm-dashboard-home .axm-dashboard-home__skeleton-widget{display:flex;min-height:0px;flex-direction:column;gap:.75rem;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lightest-surface),var(--tw-bg-opacity, 1));padding:1rem;--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)}axm-dashboard-home .axm-dashboard-home__skeleton-title{height:1rem;width:8rem;max-width:100%;border-radius:.25rem}axm-dashboard-home .axm-dashboard-home__skeleton-body{display:flex;min-height:0px;flex:1 1 0%;flex-direction:column;gap:.75rem}axm-dashboard-home .axm-dashboard-home__skeleton-list-row{display:flex;align-items:center;gap:.75rem}axm-dashboard-home .axm-dashboard-home__skeleton-avatar{height:2.5rem;width:2.5rem;flex-shrink:0;border-radius:9999px}axm-dashboard-home .axm-dashboard-home__skeleton-list-text{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column;gap:.5rem}axm-dashboard-home .axm-dashboard-home__skeleton-line{height:.75rem;border-radius:.25rem}axm-dashboard-home .axm-dashboard-home__skeleton-line--wide{width:100%}axm-dashboard-home .axm-dashboard-home__skeleton-line--medium{width:66.666667%}axm-dashboard-home .axm-dashboard-home__skeleton-line--narrow{width:60%}axm-dashboard-home .axm-dashboard-home__skeleton-circle{height:4rem;width:4rem;border-radius:9999px}axm-dashboard-home .axm-dashboard-home__skeleton-action{height:2.5rem;width:100%;border-radius:.5rem}@media(max-width:768px){axm-dashboard-home .axm-dashboard-home__skeleton-grid{grid-template-columns:repeat(6,minmax(0,1fr));grid-template-rows:auto;grid-template-areas:\"clock clock clock notes notes notes\" \"action action action notes notes notes\" \"tasks tasks tasks tasks tasks tasks\" \"notifications notifications notifications notifications notifications notifications\"}}@media(max-width:480px){axm-dashboard-home .axm-dashboard-home__skeleton-grid{grid-template-columns:minmax(0,1fr);grid-template-areas:\"clock\" \"action\" \"tasks\" \"notifications\" \"notes\"}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: 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: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i4.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "component", type: AXMDashboardGridLayoutSectionComponent, selector: "axm-dashboard-grid-layout-section", inputs: ["widgetsContext", "loadingVariant"], outputs: ["addWidget"] }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
8116
8805
  }
8117
8806
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardHomeComponent, decorators: [{
8118
8807
  type: Component,
@@ -8213,7 +8902,7 @@ class AXMAddDashboardPopup extends AXBasePageComponent {
8213
8902
  title: this.multiLanguageResolver.resolve(i.title),
8214
8903
  }));
8215
8904
  }
8216
- this.selectedRoleIds.set(this.roles.filter((i) => this.data?.roleIds?.includes(i.id)).map((i) => i.id));
8905
+ this.selectedRoleIds.set(this.roles.filter((i) => readScopeRoleIds(this.data?.scopeRef).includes(i.id)).map((i) => i.id));
8217
8906
  }
8218
8907
  catch (error) {
8219
8908
  console.error('Error loading roles:', error);
@@ -8222,16 +8911,19 @@ class AXMAddDashboardPopup extends AXBasePageComponent {
8222
8911
  }
8223
8912
  }
8224
8913
  async handleClose(isCanceled = false) {
8914
+ const userId = this.sessionService.user?.id ?? '';
8915
+ const tenantId = this.sessionService.tenant?.id ?? '';
8916
+ const scope = this.showAdminFields() ? 'T' : 'U';
8225
8917
  this.close({
8226
8918
  title: this.title()?.trim(),
8227
8919
  description: this.description()?.trim(),
8228
- roleIds: this.showAdminFields() ? this.selectedRoleIds() : undefined,
8920
+ scopeRef: scope === 'T' ? buildTenantScopeRef(tenantId, this.selectedRoleIds()) : buildUserScopeRef(userId),
8229
8921
  isArchived: this.showAdminFields() ? this.isArchived() : undefined,
8230
8922
  locked: this.showAdminFields() ? this.isLocked() : undefined,
8231
- scope: this.showAdminFields() ? 'T' : 'U',
8232
- createdBy: this.sessionService.user?.id,
8923
+ scope,
8924
+ createdBy: userId,
8233
8925
  createdAt: new Date(),
8234
- updatedBy: this.sessionService.user?.id,
8926
+ updatedBy: userId,
8235
8927
  updatedAt: new Date(),
8236
8928
  isCanceled,
8237
8929
  });
@@ -8408,5 +9100,5 @@ var AXPHomeDashboardSetting;
8408
9100
  * Generated bundle index. Do not edit.
8409
9101
  */
8410
9102
 
8411
- export { AXP_DASHBOARD_SHARED_SUB_CHART_SPECIALIZED as $, AXMDashboardStore as A, AXPHeatmapChartWidgetViewComponent as B, AXPHomeDashboardSetting as C, DASHBOARD_LAYOUT_PAGE_COMPONENT_KEY as D, AXPKpiDetailsWidget as E, AXPKpiDetailsWidgetViewComponent as F, AXPKpiProgressWidget as G, AXPKpiProgressWidgetViewComponent as H, AXPKpiSegmentedWidget as I, AXPKpiSegmentedWidgetViewComponent as J, AXPKpiStatCardWidget as K, AXPKpiStatCardWidgetViewComponent as L, AXPLineChartWidget as M, AXPLineChartWidgetViewComponent as N, AXPMinimalWeatherWidget as O, AXPShortcutWidget as P, AXPShortcutWidgetViewComponent as Q, AXPStickyNoteWidget as R, AXPStickyNoteWidgetViewComponent as S, AXPWeatherApiAbstract as T, AXPWeatherApiMockService as U, AXPWeatherApiService as V, AXPWeatherWidget as W, AXPWeatherWidgetViewComponent as X, AXP_DASHBOARD_SHARED_SUB_CHART_CARTESIAN as Y, AXP_DASHBOARD_SHARED_SUB_CHART_KPI as Z, AXP_DASHBOARD_SHARED_SUB_CHART_RADIAL as _, AXMDashboardGridLayoutSectionComponent as a, AXP_DASHBOARD_SHARED_SUB_UTILITY_NOTES as a0, AXP_DASHBOARD_SHARED_SUB_UTILITY_SHORTCUT as a1, AXP_DASHBOARD_SHARED_SUB_UTILITY_TIME as a2, AXP_DASHBOARD_SHARED_SUB_UTILITY_WEATHER as a3, AXP_DATE_FORMAT_OPTIONS as a4, AXP_TIMEZONE_OPTIONS as a5, AXP_WIDGETS_CHART_CATEGORY as a6, AXP_WIDGETS_UTILITY_CATEGORY as a7, RootConfig as a8, dashboardFactory as a9, DASHBOARD_LAYOUT_ENTITY_MODE as b, AXMAddDashboardPopup as c, AXMAdvancedWeatherViewComponent as d, AXMAnalogClockComponent as e, AXMClockWidgetViewComponent as f, AXMConfigurationPopup as g, AXMDashboardHomeComponent as h, AXMDashboardManagementModule as i, AXMDashboardPopupService as j, AXMDashboardWidgetWrapperComponent as k, AXMMinimalWeatherViewComponent as l, AXPAdvancedWeatherWidget as m, AXPAnalogClockWidget as n, AXPBarChartWidget as o, AXPBarChartWidgetViewComponent as p, AXPClockCalendarWidget as q, AXPClockCalendarWidgetViewComponent as r, AXPDashboardWidgetComponent as s, AXPDonutChartWidget as t, AXPDonutChartWidgetViewComponent as u, AXPFunnelChartWidget as v, AXPFunnelChartWidgetViewComponent as w, AXPGaugeChartWidget as x, AXPGaugeChartWidgetViewComponent as y, AXPHeatmapChartWidget as z };
8412
- //# sourceMappingURL=acorex-modules-dashboard-management-acorex-modules-dashboard-management-Lx3VuIg6.mjs.map
9103
+ export { AXP_DASHBOARD_SHARED_SUB_CHART_RADIAL as $, AXMDashboardStore as A, AXPHeatmapChartWidget as B, AXPHeatmapChartWidgetViewComponent as C, DASHBOARD_LAYOUT_PAGE_COMPONENT_KEY as D, AXPHomeDashboardSetting as E, AXPKpiDetailsWidget as F, AXPKpiDetailsWidgetViewComponent as G, AXPKpiProgressWidget as H, AXPKpiProgressWidgetViewComponent as I, AXPKpiSegmentedWidget as J, AXPKpiSegmentedWidgetViewComponent as K, AXPKpiStatCardWidget as L, AXPKpiStatCardWidgetViewComponent as M, AXPLineChartWidget as N, AXPLineChartWidgetViewComponent as O, AXPMinimalWeatherWidget as P, AXPShortcutWidget as Q, AXPShortcutWidgetViewComponent as R, AXPStickyNoteWidget as S, AXPStickyNoteWidgetViewComponent as T, AXPWeatherApiAbstract as U, AXPWeatherApiMockService as V, AXPWeatherApiService as W, AXPWeatherWidget as X, AXPWeatherWidgetViewComponent as Y, AXP_DASHBOARD_SHARED_SUB_CHART_CARTESIAN as Z, AXP_DASHBOARD_SHARED_SUB_CHART_KPI as _, AXMDashboardGridLayoutSectionComponent as a, AXP_DASHBOARD_SHARED_SUB_CHART_SPECIALIZED as a0, AXP_DASHBOARD_SHARED_SUB_UTILITY_NOTES as a1, AXP_DASHBOARD_SHARED_SUB_UTILITY_SHORTCUT as a2, AXP_DASHBOARD_SHARED_SUB_UTILITY_TIME as a3, AXP_DASHBOARD_SHARED_SUB_UTILITY_WEATHER as a4, AXP_DATE_FORMAT_OPTIONS as a5, AXP_TIMEZONE_OPTIONS as a6, AXP_WIDGETS_CHART_CATEGORY as a7, AXP_WIDGETS_UTILITY_CATEGORY as a8, RootConfig as a9, buildDashboardWidgetsContext as aa, buildEntityScopeRef as ab, buildTenantScopeRef as ac, buildUserScopeRef as ad, dashboardFactory as ae, normalizeDashboardScopeRef as af, readDashboardEntityContext as ag, readScopeEntityType as ah, readScopeRoleIds as ai, readScopeTenantId as aj, readScopeUserId as ak, DASHBOARD_LAYOUT_ENTITY_MODE as b, AXMAddDashboardPopup as c, AXMAdvancedWeatherViewComponent as d, AXMAnalogClockComponent as e, AXMClockWidgetViewComponent as f, AXMConfigurationPopup as g, AXMDashboardHomeComponent as h, AXMDashboardManagementModule as i, AXMDashboardPopupService as j, AXMDashboardWidgetWrapperComponent as k, AXMMinimalWeatherViewComponent as l, AXPAdvancedWeatherWidget as m, AXPAnalogClockWidget as n, AXPBarChartWidget as o, AXPBarChartWidgetViewComponent as p, AXPClockCalendarWidget as q, AXPClockCalendarWidgetViewComponent as r, AXPDASHBOARD_ENTITY_CONTEXT_KEY as s, AXPDashboardWidgetComponent as t, AXPDonutChartWidget as u, AXPDonutChartWidgetViewComponent as v, AXPFunnelChartWidget as w, AXPFunnelChartWidgetViewComponent as x, AXPGaugeChartWidget as y, AXPGaugeChartWidgetViewComponent as z };
9104
+ //# sourceMappingURL=acorex-modules-dashboard-management-acorex-modules-dashboard-management-kph3UxDu.mjs.map