@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.
- 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
- 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
- package/fesm2022/acorex-modules-application-management.mjs +1 -1
- package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-WGRBHMmQ.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-BDU2DZEq.mjs} +108 -53
- package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-BDU2DZEq.mjs.map +1 -0
- 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
- 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
- package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-BtZ68Wt5.mjs → acorex-modules-assessment-management-fill-assessment-session.command-D6i0YZ3k.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-assessment-management-index-_rWx2Vje.mjs → acorex-modules-assessment-management-index-BPQ9AiD6.mjs} +3 -3
- package/fesm2022/{acorex-modules-assessment-management-index-_rWx2Vje.mjs.map → acorex-modules-assessment-management-index-BPQ9AiD6.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-index-CL6OmKwh.mjs → acorex-modules-assessment-management-index-BaMs2R6k.mjs} +3 -3
- package/fesm2022/{acorex-modules-assessment-management-index-CL6OmKwh.mjs.map → acorex-modules-assessment-management-index-BaMs2R6k.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-index-BDqMpgdu.mjs → acorex-modules-assessment-management-index-YVENsZN4.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-index-BDqMpgdu.mjs.map → acorex-modules-assessment-management-index-YVENsZN4.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-index-BwZPHD1o.mjs → acorex-modules-assessment-management-index-oXkGQDat.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-index-BwZPHD1o.mjs.map → acorex-modules-assessment-management-index-oXkGQDat.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-preview-question.command-DMeQF_J0.mjs → acorex-modules-assessment-management-preview-question.command-B6rHNI4x.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-CKmY95wj.mjs → acorex-modules-assessment-management-preview-questionnaire.command-DXB1Y7hz.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-CKmY95wj.mjs.map → acorex-modules-assessment-management-preview-questionnaire.command-DXB1Y7hz.mjs.map} +1 -1
- 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
- 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
- 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
- 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
- package/fesm2022/{acorex-modules-assessment-management-review-assessment-session.command-CcGyOKUI.mjs → acorex-modules-assessment-management-review-assessment-session.command-CtEvoUxA.mjs} +3 -3
- 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
- package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-CmieuVjM.mjs → acorex-modules-assessment-management-view-session-answers.command-CkyBkiXC.mjs} +3 -3
- 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
- package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
- package/fesm2022/acorex-modules-asset-management.mjs +37 -23
- package/fesm2022/acorex-modules-asset-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-auth-acorex-modules-auth-CMRT9dQC.mjs → acorex-modules-auth-acorex-modules-auth-Nw701LHa.mjs} +30 -30
- package/fesm2022/{acorex-modules-auth-acorex-modules-auth-CMRT9dQC.mjs.map → acorex-modules-auth-acorex-modules-auth-Nw701LHa.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-app-chooser.component-mOPBXcQc.mjs → acorex-modules-auth-app-chooser.component-FqCIt_8E.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-app-chooser.component-mOPBXcQc.mjs.map → acorex-modules-auth-app-chooser.component-FqCIt_8E.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-change-password.command-CceYk6DE.mjs → acorex-modules-auth-change-password.command-DND9Oka4.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-change-password.command-CceYk6DE.mjs.map → acorex-modules-auth-change-password.command-DND9Oka4.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-edit-account-info.command-jF8A_Jsy.mjs → acorex-modules-auth-edit-account-info.command-bmdkZzYt.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-auth-lock-screen.command-BvruxuiF.mjs → acorex-modules-auth-lock-screen.command-DSGXqDVD.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-lock-screen.command-BvruxuiF.mjs.map → acorex-modules-auth-lock-screen.command-DSGXqDVD.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-login.module-CmBClJv2.mjs → acorex-modules-auth-login.module-DC3dzDf0.mjs} +4 -4
- package/fesm2022/{acorex-modules-auth-login.module-CmBClJv2.mjs.map → acorex-modules-auth-login.module-DC3dzDf0.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-master.layout-CLGmgSqo.mjs → acorex-modules-auth-master.layout-iMOvevEv.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-master.layout-CLGmgSqo.mjs.map → acorex-modules-auth-master.layout-iMOvevEv.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-oauth-callback.component-yxfNoBS-.mjs → acorex-modules-auth-oauth-callback.component-s9WMG92M.mjs} +3 -3
- package/fesm2022/{acorex-modules-auth-oauth-callback.component-yxfNoBS-.mjs.map → acorex-modules-auth-oauth-callback.component-s9WMG92M.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-open-sessions.command-DsWueHa3.mjs → acorex-modules-auth-open-sessions.command-CLL8rgjE.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-open-sessions.command-DsWueHa3.mjs.map → acorex-modules-auth-open-sessions.command-CLL8rgjE.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-C3_tAt8j.mjs → acorex-modules-auth-password.component-BOEi91f7.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-password.component-C3_tAt8j.mjs.map → acorex-modules-auth-password.component-BOEi91f7.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-BrTEuc51.mjs → acorex-modules-auth-password.component-eA_3LtcO.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-password.component-BrTEuc51.mjs.map → acorex-modules-auth-password.component-eA_3LtcO.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-profile-activity-chart.component-C6_0oeCC.mjs → acorex-modules-auth-profile-activity-chart.component-BK1k4Lrh.mjs} +2 -2
- 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
- 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
- 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
- package/fesm2022/{acorex-modules-auth-profile-page-component.provider-BHEdqBbF.mjs → acorex-modules-auth-profile-page-component.provider-MCsUPTrt.mjs} +4 -4
- package/fesm2022/{acorex-modules-auth-profile-page-component.provider-BHEdqBbF.mjs.map → acorex-modules-auth-profile-page-component.provider-MCsUPTrt.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-profile-page.component-Q0ixAWtC.mjs → acorex-modules-auth-profile-page.component-DOj2GhFJ.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-profile-page.component-Q0ixAWtC.mjs.map → acorex-modules-auth-profile-page.component-DOj2GhFJ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-remove-pin-code.command-j5iobHAs.mjs → acorex-modules-auth-remove-pin-code.command-CqRxKR4Y.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-remove-pin-code.command-j5iobHAs.mjs.map → acorex-modules-auth-remove-pin-code.command-CqRxKR4Y.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-routes-BFACBfAG.mjs → acorex-modules-auth-routes-FZRnzT9V.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-routes-BFACBfAG.mjs.map → acorex-modules-auth-routes-FZRnzT9V.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-session-lock-overlay.component-flpWlR8p.mjs → acorex-modules-auth-session-lock-overlay.component-6o2uU9U5.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-session-lock-overlay.component-flpWlR8p.mjs.map → acorex-modules-auth-session-lock-overlay.component-6o2uU9U5.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-set-pin-code.command-B0sXGsok.mjs → acorex-modules-auth-set-pin-code.command-CsXJ30Fs.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-set-pin-code.command-B0sXGsok.mjs.map → acorex-modules-auth-set-pin-code.command-CsXJ30Fs.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-set-pin-code.component-D95Hn8R-.mjs → acorex-modules-auth-set-pin-code.component-DJhqru7e.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-set-pin-code.component-D95Hn8R-.mjs.map → acorex-modules-auth-set-pin-code.component-DJhqru7e.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-settings.provider-D0-hEHd2.mjs → acorex-modules-auth-settings.provider-BJ7lDjbr.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-settings.provider-D0-hEHd2.mjs.map → acorex-modules-auth-settings.provider-BJ7lDjbr.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-tenant-chooser.component-DBIVSBaM.mjs → acorex-modules-auth-tenant-chooser.component-DR7rH0m1.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-tenant-chooser.component-DBIVSBaM.mjs.map → acorex-modules-auth-tenant-chooser.component-DR7rH0m1.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-two-factor.module-DwXsAUlJ.mjs → acorex-modules-auth-two-factor.module-BvvDIlqe.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-two-factor.module-DwXsAUlJ.mjs.map → acorex-modules-auth-two-factor.module-BvvDIlqe.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-view-login-history.command-BpCog3dx.mjs → acorex-modules-auth-view-login-history.command-BUiXUbjA.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-view-login-history.command-BpCog3dx.mjs.map → acorex-modules-auth-view-login-history.command-BUiXUbjA.mjs.map} +1 -1
- package/fesm2022/acorex-modules-auth.mjs +1 -1
- package/fesm2022/acorex-modules-business-core.mjs +0 -6
- package/fesm2022/acorex-modules-business-core.mjs.map +1 -1
- package/fesm2022/{acorex-modules-common-search-popup.component-6_qrYkc2.mjs → acorex-modules-common-search-popup.component-BhItO3Sr.mjs} +2 -2
- package/fesm2022/{acorex-modules-common-search-popup.component-6_qrYkc2.mjs.map → acorex-modules-common-search-popup.component-BhItO3Sr.mjs.map} +1 -1
- package/fesm2022/acorex-modules-common.mjs +39 -52
- package/fesm2022/acorex-modules-common.mjs.map +1 -1
- package/fesm2022/{acorex-modules-contact-core-acorex-modules-contact-core-CBMdv1GN.mjs → acorex-modules-contact-core-acorex-modules-contact-core-CELmV51p.mjs} +8 -7
- package/fesm2022/acorex-modules-contact-core-acorex-modules-contact-core-CELmV51p.mjs.map +1 -0
- package/fesm2022/{acorex-modules-contact-core-entity.provider-B8__CVGP.mjs → acorex-modules-contact-core-entity.provider-AH-gvpLJ.mjs} +3 -3
- package/fesm2022/{acorex-modules-contact-core-entity.provider-B8__CVGP.mjs.map → acorex-modules-contact-core-entity.provider-AH-gvpLJ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-contact-core-menu.provider-C-iEIPGe.mjs → acorex-modules-contact-core-menu.provider-T9IuzSBf.mjs} +11 -5
- package/fesm2022/acorex-modules-contact-core-menu.provider-T9IuzSBf.mjs.map +1 -0
- package/fesm2022/{acorex-modules-contact-core-permission-definition.provider-DXjdp846.mjs → acorex-modules-contact-core-permission-definition.provider-CnxI1ujq.mjs} +2 -2
- package/fesm2022/{acorex-modules-contact-core-permission-definition.provider-DXjdp846.mjs.map → acorex-modules-contact-core-permission-definition.provider-CnxI1ujq.mjs.map} +1 -1
- package/fesm2022/acorex-modules-contact-core.mjs +1 -1
- package/fesm2022/{acorex-modules-conversation-acorex-modules-conversation-CUjTT3M7.mjs → acorex-modules-conversation-acorex-modules-conversation-Dc8te-PO.mjs} +6127 -3272
- package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-Dc8te-PO.mjs.map +1 -0
- package/fesm2022/acorex-modules-conversation-after-message-sent.command-DxDe6o9N.mjs +34 -0
- package/fesm2022/acorex-modules-conversation-after-message-sent.command-DxDe6o9N.mjs.map +1 -0
- 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
- 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
- package/fesm2022/{acorex-modules-conversation-comments-page.component-hopaF6xW.mjs → acorex-modules-conversation-comments-page.component--g4ugC_L.mjs} +2 -2
- package/fesm2022/{acorex-modules-conversation-comments-page.component-hopaF6xW.mjs.map → acorex-modules-conversation-comments-page.component--g4ugC_L.mjs.map} +1 -1
- package/fesm2022/acorex-modules-conversation-emit-typing-indicator.command-BOldPLQ0.mjs +30 -0
- package/fesm2022/acorex-modules-conversation-emit-typing-indicator.command-BOldPLQ0.mjs.map +1 -0
- package/fesm2022/acorex-modules-conversation-mark-conversation-unread.command-O_zPrBQ0.mjs +30 -0
- package/fesm2022/acorex-modules-conversation-mark-conversation-unread.command-O_zPrBQ0.mjs.map +1 -0
- package/fesm2022/acorex-modules-conversation-retry-assist-response.command-DsB-CP3R.mjs +34 -0
- package/fesm2022/acorex-modules-conversation-retry-assist-response.command-DsB-CP3R.mjs.map +1 -0
- 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
- package/fesm2022/acorex-modules-conversation-send-assist-chat-message.command-g_NgPuxP.mjs.map +1 -0
- package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-DiDAz-Is.mjs → acorex-modules-conversation-start-assist-chat.command-DeMmJdd6.mjs} +2 -2
- 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
- package/fesm2022/acorex-modules-conversation-sync-read-state.command-4YxdwLaE.mjs +62 -0
- package/fesm2022/acorex-modules-conversation-sync-read-state.command-4YxdwLaE.mjs.map +1 -0
- package/fesm2022/acorex-modules-conversation.mjs +1 -1
- package/fesm2022/acorex-modules-customer-management.mjs +2 -2
- package/fesm2022/acorex-modules-customer-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-dashboard-management-acorex-modules-dashboard-management-Lx3VuIg6.mjs → acorex-modules-dashboard-management-acorex-modules-dashboard-management-kph3UxDu.mjs} +1087 -395
- package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-kph3UxDu.mjs.map +1 -0
- package/fesm2022/{acorex-modules-dashboard-management-index-DvY9N8FF.mjs → acorex-modules-dashboard-management-index-rp9dgARq.mjs} +2 -2
- package/fesm2022/{acorex-modules-dashboard-management-index-DvY9N8FF.mjs.map → acorex-modules-dashboard-management-index-rp9dgARq.mjs.map} +1 -1
- package/fesm2022/acorex-modules-dashboard-management.mjs +1 -1
- package/fesm2022/{acorex-modules-data-management-index-CxVSgxTM.mjs → acorex-modules-data-management-index-BYQncZ6e.mjs} +28 -6
- package/fesm2022/acorex-modules-data-management-index-BYQncZ6e.mjs.map +1 -0
- package/fesm2022/acorex-modules-data-management.mjs +6 -6
- package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs → acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs} +3 -3
- package/fesm2022/{acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs.map → acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs.map} +1 -1
- package/fesm2022/acorex-modules-document-management.mjs +272 -355
- package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-form-template-management-template-picker.component-cLToc9fP.mjs → acorex-modules-form-template-management-template-picker.component-BGf98ooQ.mjs} +2 -2
- 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
- package/fesm2022/acorex-modules-form-template-management.mjs +1 -1
- 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
- package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-BZwLfZkb.mjs.map +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/acorex-modules-human-capital-management-edit-personal-info.command-Drbi1WMd.mjs.map +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
- package/fesm2022/acorex-modules-learning-management.mjs +1 -1
- package/fesm2022/acorex-modules-learning-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-location-management.mjs +2 -2
- package/fesm2022/acorex-modules-location-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-meeting-management.mjs +1 -1
- package/fesm2022/acorex-modules-meeting-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-notification-management-acorex-modules-notification-management-DZSXFNgo.mjs → acorex-modules-notification-management-acorex-modules-notification-management-DZWUyu54.mjs} +4 -4
- 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
- package/fesm2022/{acorex-modules-notification-management-notification-page.component-swzDjJUP.mjs → acorex-modules-notification-management-notification-page.component-BNxTMY-C.mjs} +3 -3
- 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
- package/fesm2022/acorex-modules-notification-management.mjs +1 -1
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/{acorex-modules-organization-management-entity.provider-DKhXlL2j.mjs → acorex-modules-organization-management-entity.provider-Buchg68Q.mjs} +15 -15
- package/fesm2022/{acorex-modules-organization-management-entity.provider-DKhXlL2j.mjs.map → acorex-modules-organization-management-entity.provider-Buchg68Q.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-DhCn97pE.mjs → acorex-modules-organization-management-feature-definition.provider-CulEun4H.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-DhCn97pE.mjs.map → acorex-modules-organization-management-feature-definition.provider-CulEun4H.mjs.map} +1 -1
- 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
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/{acorex-modules-organization-management-job-level.datasource-DcOVF99r.mjs → acorex-modules-organization-management-job-level.datasource-CMxMInko.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-level.datasource-DcOVF99r.mjs.map → acorex-modules-organization-management-job-level.datasource-CMxMInko.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-menu.provider-B0v8w3eH.mjs → acorex-modules-organization-management-menu.provider-BL99vlod.mjs} +3 -3
- package/fesm2022/{acorex-modules-organization-management-menu.provider-B0v8w3eH.mjs.map → acorex-modules-organization-management-menu.provider-BL99vlod.mjs.map} +1 -1
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/{acorex-modules-organization-management-org-chart.page-DwHB4ZGl.mjs → acorex-modules-organization-management-org-chart.page-DJNfsp4z.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-org-chart.page-DwHB4ZGl.mjs.map → acorex-modules-organization-management-org-chart.page-DJNfsp4z.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-CynLhaYz.mjs → acorex-modules-organization-management-permission-definition.provider-CuReVYo1.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-CynLhaYz.mjs.map → acorex-modules-organization-management-permission-definition.provider-CuReVYo1.mjs.map} +1 -1
- 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
- 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
- package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-BTAwsZNP.mjs → acorex-modules-organization-management-replace-position-assignee.command-DibpVA88.mjs} +2 -2
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-DXmsR1qV.mjs → acorex-modules-organization-management-responsibilities-matrix.component-DVlThT1h.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-DXmsR1qV.mjs.map → acorex-modules-organization-management-responsibilities-matrix.component-DVlThT1h.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-settings.provider-UFqps4Zg.mjs → acorex-modules-organization-management-settings.provider-BxoCS3w7.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-settings.provider-UFqps4Zg.mjs.map → acorex-modules-organization-management-settings.provider-BxoCS3w7.mjs.map} +1 -1
- package/fesm2022/acorex-modules-organization-management.mjs +1 -1
- package/fesm2022/acorex-modules-person-core.mjs +0 -6
- package/fesm2022/acorex-modules-person-core.mjs.map +1 -1
- package/fesm2022/acorex-modules-platform-dev-tools.mjs +2 -2
- package/fesm2022/acorex-modules-platform-dev-tools.mjs.map +1 -1
- package/fesm2022/{acorex-modules-platform-management-acorex-modules-platform-management-DsKPOWpy.mjs → acorex-modules-platform-management-acorex-modules-platform-management-B5hMhQp-.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-platform-management-menu-list.component-Br4nL9zq.mjs → acorex-modules-platform-management-menu-list.component-DcOr1v-f.mjs} +3 -3
- 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
- package/fesm2022/acorex-modules-platform-management.mjs +1 -1
- package/fesm2022/acorex-modules-product-catalog.mjs +7 -6
- package/fesm2022/acorex-modules-product-catalog.mjs.map +1 -1
- package/fesm2022/acorex-modules-project-management.mjs +708 -425
- package/fesm2022/acorex-modules-project-management.mjs.map +1 -1
- 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
- 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
- package/fesm2022/acorex-modules-report-management.mjs +7 -7
- package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-risk-management-preview-risk-matrix-cell.command-CWG3zUBo.mjs +120 -0
- package/fesm2022/acorex-modules-risk-management-preview-risk-matrix-cell.command-CWG3zUBo.mjs.map +1 -0
- package/fesm2022/acorex-modules-risk-management.mjs +13 -0
- package/fesm2022/acorex-modules-risk-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-security-management.mjs +1 -1
- package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-settings-management-setting-view.component-CG-GW2yS.mjs → acorex-modules-settings-management-setting-view.component-BRhZR1br.mjs} +109 -15
- package/fesm2022/acorex-modules-settings-management-setting-view.component-BRhZR1br.mjs.map +1 -0
- package/fesm2022/acorex-modules-settings-management.mjs +1 -1
- package/fesm2022/acorex-modules-supplier-management.mjs +1 -1
- package/fesm2022/acorex-modules-supplier-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-task-management-start-task-flow.command-HYdQOWDe.mjs +115 -0
- package/fesm2022/acorex-modules-task-management-start-task-flow.command-HYdQOWDe.mjs.map +1 -0
- package/fesm2022/{acorex-modules-task-management-task-board.page-FFhsAyHF.mjs → acorex-modules-task-management-task-board.page-BMTjJlry.mjs} +41 -32
- package/fesm2022/acorex-modules-task-management-task-board.page-BMTjJlry.mjs.map +1 -0
- package/fesm2022/acorex-modules-task-management.mjs +490 -485
- package/fesm2022/acorex-modules-task-management.mjs.map +1 -1
- 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
- package/fesm2022/acorex-modules-timesheet-management-report-hours-by-project.query-CGc1Q6aB.mjs.map +1 -0
- 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
- 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
- package/fesm2022/acorex-modules-timesheet-management.mjs +8 -8
- package/fesm2022/acorex-modules-timesheet-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-workflow-management-acorex-modules-workflow-management-DJeUheQT.mjs → acorex-modules-workflow-management-acorex-modules-workflow-management-D04WU8wX.mjs} +32 -25
- package/fesm2022/acorex-modules-workflow-management-acorex-modules-workflow-management-D04WU8wX.mjs.map +1 -0
- package/fesm2022/{acorex-modules-workflow-management-index--6gz3uRb.mjs → acorex-modules-workflow-management-index-Bfzsu6VL.mjs} +2 -2
- package/fesm2022/{acorex-modules-workflow-management-index--6gz3uRb.mjs.map → acorex-modules-workflow-management-index-Bfzsu6VL.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-workflow-management-index-DV7Uf5hP.mjs → acorex-modules-workflow-management-index-CG1-u2Va.mjs} +3 -3
- package/fesm2022/{acorex-modules-workflow-management-index-DV7Uf5hP.mjs.map → acorex-modules-workflow-management-index-CG1-u2Va.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-workflow-management-index-C702Snjg.mjs → acorex-modules-workflow-management-index-DtKZARCI.mjs} +3 -3
- package/fesm2022/{acorex-modules-workflow-management-index-C702Snjg.mjs.map → acorex-modules-workflow-management-index-DtKZARCI.mjs.map} +1 -1
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/acorex-modules-workflow-management-workflow-configurator-widget-edit.component-CzPQUA9m.mjs.map +1 -0
- 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
- 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
- package/fesm2022/{acorex-modules-workflow-management-workflow-task-popover.component-CdvuOzXH.mjs → acorex-modules-workflow-management-workflow-task-popover.component-CaIIzv1r.mjs} +2 -2
- 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
- package/fesm2022/acorex-modules-workflow-management.mjs +1 -1
- package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-edit.component-CFF7X1MO.mjs +70 -0
- package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-edit.component-CFF7X1MO.mjs.map +1 -0
- package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-view.component-DwC2aHVt.mjs +70 -0
- package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-view.component-DwC2aHVt.mjs.map +1 -0
- package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram.types-DmzV305e.mjs +195 -0
- package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram.types-DmzV305e.mjs.map +1 -0
- package/fesm2022/acorex-modules-workplacesafety-management-hazard-risk-ppe-rule-status.provider-BsRNRZ6z.mjs +42 -0
- package/fesm2022/acorex-modules-workplacesafety-management-hazard-risk-ppe-rule-status.provider-BsRNRZ6z.mjs.map +1 -0
- package/fesm2022/acorex-modules-workplacesafety-management.mjs +630 -307
- package/fesm2022/acorex-modules-workplacesafety-management.mjs.map +1 -1
- package/package.json +2 -2
- package/types/acorex-modules-asset-management.d.ts +7 -3
- package/types/acorex-modules-contact-core.d.ts +1 -0
- package/types/acorex-modules-conversation.d.ts +898 -161
- package/types/acorex-modules-dashboard-management.d.ts +75 -10
- package/types/acorex-modules-document-management.d.ts +25 -5
- package/types/acorex-modules-human-capital-management.d.ts +4 -0
- package/types/acorex-modules-project-management.d.ts +46 -23
- package/types/acorex-modules-report-management.d.ts +2 -0
- package/types/acorex-modules-task-management.d.ts +100 -15
- package/types/acorex-modules-timesheet-management.d.ts +2 -2
- package/types/acorex-modules-workflow-management.d.ts +9 -4
- package/types/acorex-modules-workplacesafety-management.d.ts +62 -34
- package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-WGRBHMmQ.mjs.map +0 -1
- package/fesm2022/acorex-modules-contact-core-acorex-modules-contact-core-CBMdv1GN.mjs.map +0 -1
- package/fesm2022/acorex-modules-contact-core-menu.provider-C-iEIPGe.mjs.map +0 -1
- package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-CUjTT3M7.mjs.map +0 -1
- package/fesm2022/acorex-modules-conversation-send-assist-chat-message.command-CqDrZKFK.mjs.map +0 -1
- package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-Lx3VuIg6.mjs.map +0 -1
- package/fesm2022/acorex-modules-data-management-index-CxVSgxTM.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-DpVAfk3i.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-edit-personal-info.command-8LKMNm4Z.mjs.map +0 -1
- package/fesm2022/acorex-modules-settings-management-setting-view.component-CG-GW2yS.mjs.map +0 -1
- package/fesm2022/acorex-modules-task-management-task-board.page-FFhsAyHF.mjs.map +0 -1
- package/fesm2022/acorex-modules-timesheet-management-report-hours-by-project.query-z38wZLKJ.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-acorex-modules-workflow-management-DJeUheQT.mjs.map +0 -1
- 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
|
|
3
|
-
import { AXPDataSourceDefinitionProviderService, AXP_MODULE_MANIFEST_PROVIDER, provideLazyProvider
|
|
4
|
-
import { AXPStateMessageComponent,
|
|
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
|
|
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,
|
|
11
|
-
import { AXPSystemActionType, AXPWidgetsCatalog, AXPDataGenerator,
|
|
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 {
|
|
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
|
|
61
|
-
import {
|
|
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
|
-
|
|
6287
|
-
|
|
6288
|
-
|
|
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
|
-
|
|
6291
|
-
|
|
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
|
-
|
|
6305
|
-
|
|
6306
|
-
|
|
6307
|
-
|
|
6308
|
-
|
|
6309
|
-
|
|
6310
|
-
|
|
6311
|
-
|
|
6312
|
-
|
|
6313
|
-
|
|
6314
|
-
|
|
6315
|
-
|
|
6316
|
-
|
|
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
|
-
|
|
6321
|
-
|
|
6322
|
-
|
|
6323
|
-
|
|
6324
|
-
|
|
6325
|
-
|
|
6326
|
-
|
|
6327
|
-
|
|
6328
|
-
|
|
6329
|
-
|
|
6330
|
-
|
|
6331
|
-
|
|
6332
|
-
|
|
6333
|
-
|
|
6334
|
-
|
|
6335
|
-
|
|
6336
|
-
|
|
6337
|
-
|
|
6338
|
-
|
|
6339
|
-
|
|
6340
|
-
|
|
6341
|
-
|
|
6342
|
-
|
|
6343
|
-
|
|
6344
|
-
|
|
6345
|
-
|
|
6346
|
-
|
|
6347
|
-
|
|
6348
|
-
|
|
6349
|
-
|
|
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:
|
|
6352
|
-
type:
|
|
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
|
|
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?.
|
|
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
|
-
|
|
6718
|
+
scopeRef: scope === 'T' ? buildTenantScopeRef(tenantId, roleIds) : buildUserScopeRef(userId),
|
|
6758
6719
|
locked: this.normalizeBooleanInput(formData['locked'], data?.locked ?? false),
|
|
6759
|
-
scope
|
|
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.
|
|
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.
|
|
7020
|
-
return
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
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?.
|
|
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
|
-
|
|
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
|
|
8232
|
-
createdBy:
|
|
8923
|
+
scope,
|
|
8924
|
+
createdBy: userId,
|
|
8233
8925
|
createdAt: new Date(),
|
|
8234
|
-
updatedBy:
|
|
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 {
|
|
8412
|
-
//# sourceMappingURL=acorex-modules-dashboard-management-acorex-modules-dashboard-management-
|
|
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
|