@acorex/modules 21.0.0-next.37 → 21.0.0-next.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/fesm2022/{acorex-modules-ai-management-acorex-modules-ai-management-WuqoH4OL.mjs → acorex-modules-ai-management-acorex-modules-ai-management-CU2FvMTx.mjs} +260 -80
  2. package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-CU2FvMTx.mjs.map +1 -0
  3. package/fesm2022/{acorex-modules-ai-management-agent.entity-DK9GNMdR.mjs → acorex-modules-ai-management-agent.entity-CUO9Jczk.mjs} +14 -19
  4. package/fesm2022/acorex-modules-ai-management-agent.entity-CUO9Jczk.mjs.map +1 -0
  5. package/fesm2022/{acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CWXEW9yL.mjs → acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-daTGJ1Rd.mjs} +52 -8
  6. package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-daTGJ1Rd.mjs.map +1 -0
  7. package/fesm2022/{acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-CNKwIqUE.mjs → acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-Cmprtps-.mjs} +49 -7
  8. package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-Cmprtps-.mjs.map +1 -0
  9. package/fesm2022/{acorex-modules-ai-management-assist.entity-DX2U9sd5.mjs → acorex-modules-ai-management-assist.entity-C1nM_x4Z.mjs} +2 -2
  10. package/fesm2022/{acorex-modules-ai-management-assist.entity-DX2U9sd5.mjs.map → acorex-modules-ai-management-assist.entity-C1nM_x4Z.mjs.map} +1 -1
  11. package/fesm2022/{acorex-modules-ai-management-index-KX3TVRXr.mjs → acorex-modules-ai-management-index-CjTjfydP.mjs} +2 -2
  12. package/fesm2022/{acorex-modules-ai-management-index-KX3TVRXr.mjs.map → acorex-modules-ai-management-index-CjTjfydP.mjs.map} +1 -1
  13. package/fesm2022/{acorex-modules-ai-management-model.entity-BeuDUahR.mjs → acorex-modules-ai-management-model.entity-CPHxj8h7.mjs} +2 -2
  14. package/fesm2022/{acorex-modules-ai-management-model.entity-BeuDUahR.mjs.map → acorex-modules-ai-management-model.entity-CPHxj8h7.mjs.map} +1 -1
  15. package/fesm2022/{acorex-modules-ai-management-open-ai-endpoint.entity-D-9unl6i.mjs → acorex-modules-ai-management-open-ai-endpoint.entity-a6MjMiXF.mjs} +2 -2
  16. package/fesm2022/{acorex-modules-ai-management-open-ai-endpoint.entity-D-9unl6i.mjs.map → acorex-modules-ai-management-open-ai-endpoint.entity-a6MjMiXF.mjs.map} +1 -1
  17. package/fesm2022/acorex-modules-ai-management.mjs +1 -1
  18. package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-BNK6C-Ng.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-DniyhnPK.mjs} +509 -436
  19. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-DniyhnPK.mjs.map +1 -0
  20. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-Ds8pRzvE.mjs → acorex-modules-assessment-management-assessment-case.entity-BggEmLhz.mjs} +2 -2
  21. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-Ds8pRzvE.mjs.map → acorex-modules-assessment-management-assessment-case.entity-BggEmLhz.mjs.map} +1 -1
  22. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-tq1Q4wkS.mjs → acorex-modules-assessment-management-assessment-session.entity-CWR1QZv1.mjs} +2 -2
  23. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-tq1Q4wkS.mjs.map → acorex-modules-assessment-management-assessment-session.entity-CWR1QZv1.mjs.map} +1 -1
  24. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-yf0PnWC0.mjs → acorex-modules-assessment-management-fill-assessment-session.command-qajn_XDh.mjs} +2 -2
  25. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-yf0PnWC0.mjs.map → acorex-modules-assessment-management-fill-assessment-session.command-qajn_XDh.mjs.map} +1 -1
  26. package/fesm2022/{acorex-modules-assessment-management-index-B2SncZAW.mjs → acorex-modules-assessment-management-index-B2l5Se1l.mjs} +25 -26
  27. package/fesm2022/acorex-modules-assessment-management-index-B2l5Se1l.mjs.map +1 -0
  28. package/fesm2022/{acorex-modules-assessment-management-preview-question.command-DPzL8C44.mjs → acorex-modules-assessment-management-preview-question.command-BCS477_k.mjs} +10 -11
  29. package/fesm2022/acorex-modules-assessment-management-preview-question.command-BCS477_k.mjs.map +1 -0
  30. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BrI5gFtx.mjs → acorex-modules-assessment-management-preview-questionnaire.command-C8lyuqE-.mjs} +2 -2
  31. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BrI5gFtx.mjs.map → acorex-modules-assessment-management-preview-questionnaire.command-C8lyuqE-.mjs.map} +1 -1
  32. package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-XD5IJpvW.mjs → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-DtowOBLy.mjs} +2 -2
  33. package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-XD5IJpvW.mjs.map → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-DtowOBLy.mjs.map} +1 -1
  34. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-CZ32sQ9M.mjs → acorex-modules-assessment-management-question-bank-item.entity-Br7XcU_u.mjs} +2 -2
  35. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-CZ32sQ9M.mjs.map → acorex-modules-assessment-management-question-bank-item.entity-Br7XcU_u.mjs.map} +1 -1
  36. package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-C7gf4s1y.mjs → acorex-modules-assessment-management-questionnaire-calculation.entity-DNUf5RD3.mjs} +2 -2
  37. package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-C7gf4s1y.mjs.map → acorex-modules-assessment-management-questionnaire-calculation.entity-DNUf5RD3.mjs.map} +1 -1
  38. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-BZyIlYWg.mjs → acorex-modules-assessment-management-questionnaire-viewer-popup.component-BdBKHvHP.mjs} +3 -3
  39. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-BZyIlYWg.mjs.map → acorex-modules-assessment-management-questionnaire-viewer-popup.component-BdBKHvHP.mjs.map} +1 -1
  40. package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-CmmThk2f.mjs → acorex-modules-assessment-management-questionnaire.entity-B5aP_P4z.mjs} +3 -3
  41. package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-CmmThk2f.mjs.map → acorex-modules-assessment-management-questionnaire.entity-B5aP_P4z.mjs.map} +1 -1
  42. package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-GLqvK8wB.mjs → acorex-modules-assessment-management-save-questionnaire-questions.command-C3Qt5fmY.mjs} +2 -2
  43. package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-GLqvK8wB.mjs.map → acorex-modules-assessment-management-save-questionnaire-questions.command-C3Qt5fmY.mjs.map} +1 -1
  44. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-CU1TVonZ.mjs → acorex-modules-assessment-management-view-session-answers.command-C9VS-Tp3.mjs} +2 -2
  45. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-CU1TVonZ.mjs.map → acorex-modules-assessment-management-view-session-answers.command-C9VS-Tp3.mjs.map} +1 -1
  46. package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
  47. package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-BDs0ZgD5.mjs → acorex-modules-asset-management-acorex-modules-asset-management-F7Ok5dhs.mjs} +519 -81
  48. package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-F7Ok5dhs.mjs.map +1 -0
  49. package/fesm2022/{acorex-modules-asset-management-asset-system-history.entity-CSCwWY_F.mjs → acorex-modules-asset-management-asset-system-history.entity-D1HZG9wO.mjs} +2 -2
  50. package/fesm2022/{acorex-modules-asset-management-asset-system-history.entity-CSCwWY_F.mjs.map → acorex-modules-asset-management-asset-system-history.entity-D1HZG9wO.mjs.map} +1 -1
  51. package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-CcefMT8J.mjs → acorex-modules-asset-management-asset-system-type.entity-DDh5RK5M.mjs} +60 -38
  52. package/fesm2022/acorex-modules-asset-management-asset-system-type.entity-DDh5RK5M.mjs.map +1 -0
  53. package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-6Rauu2Z1.mjs → acorex-modules-asset-management-asset-type-section-component.entity-em7lQ1eu.mjs} +2 -2
  54. package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-6Rauu2Z1.mjs.map → acorex-modules-asset-management-asset-type-section-component.entity-em7lQ1eu.mjs.map} +1 -1
  55. package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-r_H1QGwp.mjs → acorex-modules-asset-management-asset-type-section.entity-BtcNy6Ra.mjs} +6 -48
  56. package/fesm2022/acorex-modules-asset-management-asset-type-section.entity-BtcNy6Ra.mjs.map +1 -0
  57. package/fesm2022/{acorex-modules-asset-management-asset-type.entity-cWVqpbHH.mjs → acorex-modules-asset-management-asset-type.entity-DWhrFVFI.mjs} +53 -100
  58. package/fesm2022/acorex-modules-asset-management-asset-type.entity-DWhrFVFI.mjs.map +1 -0
  59. package/fesm2022/{acorex-modules-asset-management-asset.entity-CamZGWTM.mjs → acorex-modules-asset-management-asset.entity-BEjXfkPD.mjs} +66 -56
  60. package/fesm2022/acorex-modules-asset-management-asset.entity-BEjXfkPD.mjs.map +1 -0
  61. package/fesm2022/{acorex-modules-asset-management-assetSystem.entity-Dq2ASslk.mjs → acorex-modules-asset-management-assetSystem.entity-CJCVALaz.mjs} +2 -2
  62. package/fesm2022/{acorex-modules-asset-management-assetSystem.entity-Dq2ASslk.mjs.map → acorex-modules-asset-management-assetSystem.entity-CJCVALaz.mjs.map} +1 -1
  63. package/fesm2022/acorex-modules-asset-management.mjs +1 -1
  64. package/fesm2022/acorex-modules-common.mjs +38 -41
  65. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  66. package/fesm2022/acorex-modules-conversation.mjs +1046 -249
  67. package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
  68. package/fesm2022/acorex-modules-dashboard-management.mjs +1098 -706
  69. package/fesm2022/acorex-modules-dashboard-management.mjs.map +1 -1
  70. package/fesm2022/acorex-modules-data-management.mjs +63 -35
  71. package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
  72. package/fesm2022/acorex-modules-document-management.mjs +101 -57
  73. package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
  74. package/fesm2022/{acorex-modules-human-capital-management-employee.entity-BRpqFRuI.mjs → acorex-modules-human-capital-management-employee.entity-BmF6_P6d.mjs} +48 -21
  75. package/fesm2022/acorex-modules-human-capital-management-employee.entity-BmF6_P6d.mjs.map +1 -0
  76. package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
  77. package/fesm2022/acorex-modules-location-management.mjs +18 -99
  78. package/fesm2022/acorex-modules-location-management.mjs.map +1 -1
  79. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-DtODwbIN.mjs +7137 -0
  80. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-DtODwbIN.mjs.map +1 -0
  81. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-DQJJtCqU.mjs → acorex-modules-maintenance-management-failure-effect.entity-BtczD4wu.mjs} +2 -2
  82. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-DQJJtCqU.mjs.map → acorex-modules-maintenance-management-failure-effect.entity-BtczD4wu.mjs.map} +1 -1
  83. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-gg2fpT2N.mjs → acorex-modules-maintenance-management-failure-mode-asset-type.entity-CDUdEH-e.mjs} +2 -2
  84. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-gg2fpT2N.mjs.map → acorex-modules-maintenance-management-failure-mode-asset-type.entity-CDUdEH-e.mjs.map} +1 -1
  85. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-CHUaAnID.mjs → acorex-modules-maintenance-management-failure-mode-mechanism.entity-re5UvGp7.mjs} +2 -2
  86. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-CHUaAnID.mjs.map → acorex-modules-maintenance-management-failure-mode-mechanism.entity-re5UvGp7.mjs.map} +1 -1
  87. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-B93x1uP_.mjs → acorex-modules-maintenance-management-failure-mode-solution.entity-nbFz4LAe.mjs} +2 -2
  88. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-B93x1uP_.mjs.map → acorex-modules-maintenance-management-failure-mode-solution.entity-nbFz4LAe.mjs.map} +1 -1
  89. package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-McM3l12Q.mjs → acorex-modules-maintenance-management-failure-register-cause.entity-CW2NlX59.mjs} +2 -2
  90. package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-McM3l12Q.mjs.map → acorex-modules-maintenance-management-failure-register-cause.entity-CW2NlX59.mjs.map} +1 -1
  91. package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-_jjy1oeg.mjs → acorex-modules-maintenance-management-failure-register-effect.entity-Bi5XgfoL.mjs} +2 -2
  92. package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-_jjy1oeg.mjs.map → acorex-modules-maintenance-management-failure-register-effect.entity-Bi5XgfoL.mjs.map} +1 -1
  93. package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-5CmdhowW.mjs → acorex-modules-maintenance-management-failure-register-mechanism.entity-DcW6sK01.mjs} +2 -2
  94. package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-5CmdhowW.mjs.map → acorex-modules-maintenance-management-failure-register-mechanism.entity-DcW6sK01.mjs.map} +1 -1
  95. package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-D_lQrda5.mjs → acorex-modules-maintenance-management-failure-register.entity-CUxVZo0w.mjs} +3 -3
  96. package/fesm2022/acorex-modules-maintenance-management-failure-register.entity-CUxVZo0w.mjs.map +1 -0
  97. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BIZxoVIS.mjs → acorex-modules-maintenance-management-failure-severity.entity-B7LBO-UA.mjs} +2 -2
  98. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BIZxoVIS.mjs.map → acorex-modules-maintenance-management-failure-severity.entity-B7LBO-UA.mjs.map} +1 -1
  99. package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-D6ATa-HR.mjs +443 -0
  100. package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-D6ATa-HR.mjs.map +1 -0
  101. package/fesm2022/acorex-modules-maintenance-management.mjs +1 -3579
  102. package/fesm2022/acorex-modules-maintenance-management.mjs.map +1 -1
  103. package/fesm2022/acorex-modules-notification-management.mjs +11 -5
  104. package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
  105. package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-BrVNMCi_.mjs +356 -0
  106. package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-BrVNMCi_.mjs.map +1 -0
  107. package/fesm2022/acorex-modules-organization-management-business-unit-type.entity-CO8jMwVJ.mjs +181 -0
  108. package/fesm2022/acorex-modules-organization-management-business-unit-type.entity-CO8jMwVJ.mjs.map +1 -0
  109. package/fesm2022/acorex-modules-organization-management-business-unit.entity-WiTemBLu.mjs +359 -0
  110. package/fesm2022/acorex-modules-organization-management-business-unit.entity-WiTemBLu.mjs.map +1 -0
  111. package/fesm2022/{acorex-modules-organization-management-chart.entity-bRxA8XHZ.mjs → acorex-modules-organization-management-chart.entity-D6Y7kZfM.mjs} +33 -29
  112. package/fesm2022/acorex-modules-organization-management-chart.entity-D6Y7kZfM.mjs.map +1 -0
  113. package/fesm2022/{acorex-modules-organization-management-company.entity-BohMJQNi.mjs → acorex-modules-organization-management-company.entity-wpNiu8g3.mjs} +6 -8
  114. package/fesm2022/acorex-modules-organization-management-company.entity-wpNiu8g3.mjs.map +1 -0
  115. package/fesm2022/acorex-modules-organization-management-data-source-evaluator-scope.provider-BrKtojM9.mjs +48 -0
  116. package/fesm2022/acorex-modules-organization-management-data-source-evaluator-scope.provider-BrKtojM9.mjs.map +1 -0
  117. package/fesm2022/acorex-modules-organization-management-entity.provider-B0XbUW1I.mjs +59 -0
  118. package/fesm2022/acorex-modules-organization-management-entity.provider-B0XbUW1I.mjs.map +1 -0
  119. package/fesm2022/acorex-modules-organization-management-feature-definition.provider-D7t_nNNk.mjs +19 -0
  120. package/fesm2022/acorex-modules-organization-management-feature-definition.provider-D7t_nNNk.mjs.map +1 -0
  121. package/fesm2022/{acorex-modules-organization-management-job-definition.entity-S9Jlmr-o.mjs → acorex-modules-organization-management-job-definition.entity-Cb6zEf65.mjs} +2 -2
  122. package/fesm2022/{acorex-modules-organization-management-job-definition.entity-S9Jlmr-o.mjs.map → acorex-modules-organization-management-job-definition.entity-Cb6zEf65.mjs.map} +1 -1
  123. package/fesm2022/acorex-modules-organization-management-job-level.datasource-RDGmLrqD.mjs +95 -0
  124. package/fesm2022/acorex-modules-organization-management-job-level.datasource-RDGmLrqD.mjs.map +1 -0
  125. package/fesm2022/acorex-modules-organization-management-job-level.entity-oedF18Xm.mjs +274 -0
  126. package/fesm2022/acorex-modules-organization-management-job-level.entity-oedF18Xm.mjs.map +1 -0
  127. package/fesm2022/acorex-modules-organization-management-menu.provider-DAKmAxld.mjs +193 -0
  128. package/fesm2022/acorex-modules-organization-management-menu.provider-DAKmAxld.mjs.map +1 -0
  129. package/fesm2022/acorex-modules-organization-management-org-chart.page-mHV0AWGZ.mjs +1081 -0
  130. package/fesm2022/acorex-modules-organization-management-org-chart.page-mHV0AWGZ.mjs.map +1 -0
  131. package/fesm2022/acorex-modules-organization-management-permission-definition.provider-Be8mvS_Z.mjs +77 -0
  132. package/fesm2022/acorex-modules-organization-management-permission-definition.provider-Be8mvS_Z.mjs.map +1 -0
  133. package/fesm2022/acorex-modules-organization-management-permission.keys-DwZNBc12.mjs +56 -0
  134. package/fesm2022/acorex-modules-organization-management-permission.keys-DwZNBc12.mjs.map +1 -0
  135. package/fesm2022/{acorex-modules-organization-management-position.entity-DLPufeWz.mjs → acorex-modules-organization-management-position.entity-BveMCKMd.mjs} +108 -106
  136. package/fesm2022/acorex-modules-organization-management-position.entity-BveMCKMd.mjs.map +1 -0
  137. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-mMZywr0X.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-ivufxxLL.mjs} +25 -29
  138. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-ivufxxLL.mjs.map +1 -0
  139. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-CfRBMxLk.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-DptdG1Nt.mjs} +2 -2
  140. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-CfRBMxLk.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-DptdG1Nt.mjs.map} +1 -1
  141. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-B06t1G1E.mjs → acorex-modules-organization-management-responsibilities-matrix.component-qO33kvo_.mjs} +14 -21
  142. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix.component-qO33kvo_.mjs.map +1 -0
  143. package/fesm2022/acorex-modules-organization-management-responsibility-level.entity-zOjyjm5H.mjs +137 -0
  144. package/fesm2022/acorex-modules-organization-management-responsibility-level.entity-zOjyjm5H.mjs.map +1 -0
  145. package/fesm2022/{acorex-modules-organization-management-responsibility.entity-CMmr3wJa.mjs → acorex-modules-organization-management-responsibility.entity-jWEiPi5-.mjs} +2 -2
  146. package/fesm2022/{acorex-modules-organization-management-responsibility.entity-CMmr3wJa.mjs.map → acorex-modules-organization-management-responsibility.entity-jWEiPi5-.mjs.map} +1 -1
  147. package/fesm2022/acorex-modules-organization-management-settings.provider-D3ged-4h.mjs +228 -0
  148. package/fesm2022/acorex-modules-organization-management-settings.provider-D3ged-4h.mjs.map +1 -0
  149. package/fesm2022/{acorex-modules-organization-management-team-member-role.entity-CZ4MibH4.mjs → acorex-modules-organization-management-team-member-role.entity-D9TZoACE.mjs} +68 -8
  150. package/fesm2022/acorex-modules-organization-management-team-member-role.entity-D9TZoACE.mjs.map +1 -0
  151. package/fesm2022/{acorex-modules-organization-management-team-member.entity-8sTjn5Jn.mjs → acorex-modules-organization-management-team-member.entity-Bz4o7c3d.mjs} +2 -2
  152. package/fesm2022/{acorex-modules-organization-management-team-member.entity-8sTjn5Jn.mjs.map → acorex-modules-organization-management-team-member.entity-Bz4o7c3d.mjs.map} +1 -1
  153. package/fesm2022/{acorex-modules-organization-management-team.entity-CGR0UlYl.mjs → acorex-modules-organization-management-team.entity-uVffZPeg.mjs} +100 -37
  154. package/fesm2022/acorex-modules-organization-management-team.entity-uVffZPeg.mjs.map +1 -0
  155. package/fesm2022/acorex-modules-organization-management-widget-definition.provider-D4yjuqwx.mjs +48 -0
  156. package/fesm2022/acorex-modules-organization-management-widget-definition.provider-D4yjuqwx.mjs.map +1 -0
  157. package/fesm2022/acorex-modules-organization-management.mjs +1 -2216
  158. package/fesm2022/acorex-modules-organization-management.mjs.map +1 -1
  159. package/fesm2022/acorex-modules-platform-dev-tools-menu.provider-BFueKnuF.mjs +40 -0
  160. package/fesm2022/acorex-modules-platform-dev-tools-menu.provider-BFueKnuF.mjs.map +1 -0
  161. package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs +33 -0
  162. package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs.map +1 -0
  163. package/fesm2022/acorex-modules-platform-dev-tools.mjs +14 -94
  164. package/fesm2022/acorex-modules-platform-dev-tools.mjs.map +1 -1
  165. package/fesm2022/{acorex-modules-report-management-report-runner-root-page.component-DPSNAAct.mjs → acorex-modules-report-management-report-runner-root-page.component-BjKrHoBg.mjs} +107 -107
  166. package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-BjKrHoBg.mjs.map +1 -0
  167. package/fesm2022/acorex-modules-report-management.mjs +1 -1
  168. package/fesm2022/{acorex-modules-reservation-management-acorex-modules-reservation-management-BMemqW2V.mjs → acorex-modules-reservation-management-acorex-modules-reservation-management-BoUiTlmu.mjs} +65 -76
  169. package/fesm2022/acorex-modules-reservation-management-acorex-modules-reservation-management-BoUiTlmu.mjs.map +1 -0
  170. package/fesm2022/{acorex-modules-reservation-management-reservation-class-status.entity-Bg7d38wV.mjs → acorex-modules-reservation-management-reservation-class-status.entity-D-ZdqKa8.mjs} +2 -2
  171. package/fesm2022/{acorex-modules-reservation-management-reservation-class-status.entity-Bg7d38wV.mjs.map → acorex-modules-reservation-management-reservation-class-status.entity-D-ZdqKa8.mjs.map} +1 -1
  172. package/fesm2022/{acorex-modules-reservation-management-reservation-resource-type.entity-BK-rLEXi.mjs → acorex-modules-reservation-management-reservation-resource-type.entity-zPD-Psml.mjs} +2 -2
  173. package/fesm2022/{acorex-modules-reservation-management-reservation-resource-type.entity-BK-rLEXi.mjs.map → acorex-modules-reservation-management-reservation-resource-type.entity-zPD-Psml.mjs.map} +1 -1
  174. package/fesm2022/{acorex-modules-reservation-management-reservation-status-transition.entity-2ngXhKAV.mjs → acorex-modules-reservation-management-reservation-status-transition.entity-CQ85ZAGF.mjs} +2 -2
  175. package/fesm2022/{acorex-modules-reservation-management-reservation-status-transition.entity-2ngXhKAV.mjs.map → acorex-modules-reservation-management-reservation-status-transition.entity-CQ85ZAGF.mjs.map} +1 -1
  176. package/fesm2022/acorex-modules-reservation-management.mjs +1 -1
  177. package/fesm2022/acorex-modules-security-management.mjs +269 -190
  178. package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
  179. package/fesm2022/{acorex-modules-task-management-task-board.page-C1H_GTqy.mjs → acorex-modules-task-management-task-board.page-DA2563QE.mjs} +15 -10
  180. package/fesm2022/acorex-modules-task-management-task-board.page-DA2563QE.mjs.map +1 -0
  181. package/fesm2022/acorex-modules-task-management.mjs +27 -13
  182. package/fesm2022/acorex-modules-task-management.mjs.map +1 -1
  183. package/fesm2022/acorex-modules-workflow-management-WORKFLOW_DEFINITION_ACTIVITIES_PAGE_COMPONENT_KEY-D6q__Ewd.mjs +5 -0
  184. package/fesm2022/acorex-modules-workflow-management-WORKFLOW_DEFINITION_ACTIVITIES_PAGE_COMPONENT_KEY-D6q__Ewd.mjs.map +1 -0
  185. package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-column.component-C8lgSjfc.mjs → acorex-modules-workflow-management-activity-command-configurator-widget-column.component-CDo0QVFy.mjs} +14 -6
  186. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-column.component-CDo0QVFy.mjs.map +1 -0
  187. package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BGUPxGXP.mjs → acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BYJpDQRs.mjs} +31 -16
  188. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BYJpDQRs.mjs.map +1 -0
  189. package/fesm2022/{acorex-modules-workflow-management-activity-definition.entity-Bvs1OfE_.mjs → acorex-modules-workflow-management-activity-definition.entity-B3DkgDQb.mjs} +10 -12
  190. package/fesm2022/acorex-modules-workflow-management-activity-definition.entity-B3DkgDQb.mjs.map +1 -0
  191. package/fesm2022/{acorex-modules-workflow-management-index-DWIDQsWq.mjs → acorex-modules-workflow-management-index-C9Qc07oK.mjs} +125 -3
  192. package/fesm2022/acorex-modules-workflow-management-index-C9Qc07oK.mjs.map +1 -0
  193. package/fesm2022/acorex-modules-workflow-management-index-D8fjNgQJ.mjs +726 -0
  194. package/fesm2022/acorex-modules-workflow-management-index-D8fjNgQJ.mjs.map +1 -0
  195. package/fesm2022/acorex-modules-workflow-management-index-DMnJRDbq.mjs +294 -0
  196. package/fesm2022/acorex-modules-workflow-management-index-DMnJRDbq.mjs.map +1 -0
  197. package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs +56 -0
  198. package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs.map +1 -0
  199. package/fesm2022/{acorex-modules-workflow-management-workflow-definition.entity-aJou58ED.mjs → acorex-modules-workflow-management-workflow-definition.entity-DqPVpcSv.mjs} +101 -140
  200. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-DqPVpcSv.mjs.map +1 -0
  201. package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-Cq7LE7u5.mjs → acorex-modules-workflow-management-workflow-instance.entity-sfsoT0is.mjs} +10 -1
  202. package/fesm2022/acorex-modules-workflow-management-workflow-instance.entity-sfsoT0is.mjs.map +1 -0
  203. package/fesm2022/{acorex-modules-workflow-management-workflow-task-popover.component-CIakASVR.mjs → acorex-modules-workflow-management-workflow-task-popover.component-NpUx0sB5.mjs} +11 -7
  204. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-NpUx0sB5.mjs.map +1 -0
  205. package/fesm2022/acorex-modules-workflow-management.mjs +746 -402
  206. package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
  207. package/organization-management/README.md +1 -1
  208. package/package.json +2 -2
  209. package/types/acorex-modules-ai-management.d.ts +64 -16
  210. package/types/acorex-modules-asset-management.d.ts +115 -58
  211. package/types/acorex-modules-common.d.ts +2 -4
  212. package/types/acorex-modules-dashboard-management.d.ts +226 -109
  213. package/types/acorex-modules-data-management.d.ts +2 -2
  214. package/types/acorex-modules-document-management.d.ts +1 -2
  215. package/types/acorex-modules-human-capital-management.d.ts +6 -0
  216. package/types/acorex-modules-maintenance-management.d.ts +561 -41
  217. package/types/acorex-modules-notification-management.d.ts +7 -3
  218. package/types/acorex-modules-organization-management.d.ts +52 -107
  219. package/types/acorex-modules-security-management.d.ts +15 -1
  220. package/types/acorex-modules-task-management.d.ts +8 -13
  221. package/types/acorex-modules-workflow-management.d.ts +67 -13
  222. package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-WuqoH4OL.mjs.map +0 -1
  223. package/fesm2022/acorex-modules-ai-management-agent.entity-DK9GNMdR.mjs.map +0 -1
  224. package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CWXEW9yL.mjs.map +0 -1
  225. package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-CNKwIqUE.mjs.map +0 -1
  226. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-BNK6C-Ng.mjs.map +0 -1
  227. package/fesm2022/acorex-modules-assessment-management-index-B2SncZAW.mjs.map +0 -1
  228. package/fesm2022/acorex-modules-assessment-management-preview-question.command-DPzL8C44.mjs.map +0 -1
  229. package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-BDs0ZgD5.mjs.map +0 -1
  230. package/fesm2022/acorex-modules-asset-management-asset-system-type.entity-CcefMT8J.mjs.map +0 -1
  231. package/fesm2022/acorex-modules-asset-management-asset-type-section.entity-r_H1QGwp.mjs.map +0 -1
  232. package/fesm2022/acorex-modules-asset-management-asset-type.entity-cWVqpbHH.mjs.map +0 -1
  233. package/fesm2022/acorex-modules-asset-management-asset.entity-CamZGWTM.mjs.map +0 -1
  234. package/fesm2022/acorex-modules-human-capital-management-employee.entity-BRpqFRuI.mjs.map +0 -1
  235. package/fesm2022/acorex-modules-maintenance-management-failure-register.entity-D_lQrda5.mjs.map +0 -1
  236. package/fesm2022/acorex-modules-organization-management-business-unit-type.entity-C-EKX6Oy.mjs +0 -91
  237. package/fesm2022/acorex-modules-organization-management-business-unit-type.entity-C-EKX6Oy.mjs.map +0 -1
  238. package/fesm2022/acorex-modules-organization-management-chart.entity-bRxA8XHZ.mjs.map +0 -1
  239. package/fesm2022/acorex-modules-organization-management-company.entity-BohMJQNi.mjs.map +0 -1
  240. package/fesm2022/acorex-modules-organization-management-org-chart.page-eRTHzLDQ.mjs +0 -784
  241. package/fesm2022/acorex-modules-organization-management-org-chart.page-eRTHzLDQ.mjs.map +0 -1
  242. package/fesm2022/acorex-modules-organization-management-position.entity-DLPufeWz.mjs.map +0 -1
  243. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-mMZywr0X.mjs.map +0 -1
  244. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix.component-B06t1G1E.mjs.map +0 -1
  245. package/fesm2022/acorex-modules-organization-management-team-member-role.entity-CZ4MibH4.mjs.map +0 -1
  246. package/fesm2022/acorex-modules-organization-management-team.entity-CGR0UlYl.mjs.map +0 -1
  247. package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-DPSNAAct.mjs.map +0 -1
  248. package/fesm2022/acorex-modules-reservation-management-acorex-modules-reservation-management-BMemqW2V.mjs.map +0 -1
  249. package/fesm2022/acorex-modules-task-management-task-board.page-C1H_GTqy.mjs.map +0 -1
  250. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-column.component-C8lgSjfc.mjs.map +0 -1
  251. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BGUPxGXP.mjs.map +0 -1
  252. package/fesm2022/acorex-modules-workflow-management-activity-definition.entity-Bvs1OfE_.mjs.map +0 -1
  253. package/fesm2022/acorex-modules-workflow-management-index-DWIDQsWq.mjs.map +0 -1
  254. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-aJou58ED.mjs.map +0 -1
  255. package/fesm2022/acorex-modules-workflow-management-workflow-instance.entity-Cq7LE7u5.mjs.map +0 -1
  256. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-CIakASVR.mjs.map +0 -1
@@ -1,16 +1,21 @@
1
1
  import { AXPSessionService, AXPAuthGuard, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex/platform/auth';
2
2
  import { createAllQueryView, AXP_HOME_PAGES, AXP_HOME_PAGE_DEFAULT_KEY, AXP_MENU_PROVIDER, AXPSettingsService } from '@acorex/platform/common';
3
3
  import * as i2$3 from '@acorex/platform/layout/widget-core';
4
- import { AXPBaseWidgetComponent, AXPWidgetsCatalog, cloneProperty, AXPWidgetGroupEnum, AXPValueWidgetComponent, AXPLayoutBaseWidgetComponent, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER, AXPWidgetRendererDirective } from '@acorex/platform/layout/widget-core';
4
+ import { AXPBaseWidgetComponent, AXPWidgetsCatalog, cloneProperty, AXPWidgetGroupEnum, AXPValueWidgetComponent, createStringProperty, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER, AXPWidgetRendererDirective } from '@acorex/platform/layout/widget-core';
5
5
  import * as i0 from '@angular/core';
6
- import { inject, signal, effect, computed, ChangeDetectionStrategy, Component, Injectable, InjectionToken, viewChild, input, ElementRef, ChangeDetectorRef, HostBinding, linkedSignal, HostListener, Injector, NgModule, output, contentChild, afterNextRender, ViewEncapsulation, model } from '@angular/core';
6
+ import { inject, DestroyRef, afterNextRender, Injectable, signal, effect, computed, ChangeDetectionStrategy, Component, InjectionToken, viewChild, input, ElementRef, ChangeDetectorRef, HostBinding, linkedSignal, HostListener, Injector, NgModule, output, contentChild, ViewEncapsulation, model } from '@angular/core';
7
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
+ import { Subject, map, Observable, catchError, throwError, of, finalize, interval, switchMap, firstValueFrom, fromEvent } from 'rxjs';
9
+ import { throttleTime, debounceTime } from 'rxjs/operators';
7
10
  import { AXBarChartComponent } from '@acorex/charts/bar-chart';
8
11
  import * as i4 from '@acorex/core/translation';
9
- import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
10
- import { AXPDataSourceDefinitionProviderService, AXPMultiLanguageStringResolverService, createMultiLanguageString, AXPDataGenerator, AXPSystemActionType, AXP_MODULE_MANIFEST_PROVIDER, AXPDeviceService, AXPPlatformScope, AXPResolveMultiLanguageStringPipe } from '@acorex/platform/core';
11
- 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, plainTextDefaultProperty, AXPWidgetsModule } from '@acorex/platform/layout/widgets';
12
+ import { AXTranslationService, createMultiLanguageString, AXTranslationModule } from '@acorex/core/translation';
13
+ import { AXPDataSourceDefinitionProviderService, AXPDataGenerator, AXPSystemActionType, AXP_MODULE_MANIFEST_PROVIDER, AXPDeviceService, AXPPlatformScope } from '@acorex/platform/core';
14
+ 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';
12
15
  import { AXDonutChartComponent } from '@acorex/charts/donut-chart';
16
+ import { AXFunnelChartComponent } from '@acorex/charts/funnel-chart';
13
17
  import { AXGaugeChartComponent } from '@acorex/charts/gauge-chart';
18
+ import { AXHeatmapChartComponent } from '@acorex/charts/heatmap-chart';
14
19
  import { AXLineChartComponent } from '@acorex/charts/line-chart';
15
20
  import * as i1$1 from '@acorex/components/button';
16
21
  import { AXButtonModule } from '@acorex/components/button';
@@ -22,7 +27,6 @@ import * as i1$2 from '@acorex/components/tooltip';
22
27
  import { AXTooltipModule } from '@acorex/components/tooltip';
23
28
  import * as i3 from '@angular/common';
24
29
  import { CommonModule } from '@angular/common';
25
- import { map, Observable, catchError, throwError, of, finalize, interval, switchMap, firstValueFrom, fromEvent } from 'rxjs';
26
30
  import { HttpClient, HttpClientModule } from '@angular/common/http';
27
31
  import { AXDateTimeModule } from '@acorex/core/date-time';
28
32
  import * as i2 from '@acorex/core/format';
@@ -57,7 +61,6 @@ import * as i1$4 from '@acorex/components/loading';
57
61
  import { AXLoadingModule } from '@acorex/components/loading';
58
62
  import { AXMSecurityManagementRolesEntityService, AXMUsersEntityService } from '@acorex/modules/security-management';
59
63
  import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
60
- import { debounceTime } from 'rxjs/operators';
61
64
  import { AXPLayoutBuilderService } from '@acorex/platform/layout/builder';
62
65
  import { AXBasePageComponent } from '@acorex/components/page';
63
66
  import { AXLabelModule } from '@acorex/components/label';
@@ -67,16 +70,19 @@ import * as i6 from '@acorex/components/switch';
67
70
  import { AXSwitchModule } from '@acorex/components/switch';
68
71
  import * as i3$3 from '@acorex/components/text-box';
69
72
  import { AXTextBoxModule } from '@acorex/components/text-box';
70
- import { AXMOrganizationManagementJobDefinitionEntityService } from '@acorex/modules/organization-management';
73
+ import { RootConfig as RootConfig$1 } from '@acorex/modules/organization-management';
71
74
 
72
75
  const config = {
73
76
  i18n: 'dashboard-management',
77
+ module: 'DashboardManagement',
74
78
  };
79
+ /** Builds shared dashboard widget type ids: `{module}:Widget:Dashboard:{Segment}`. */
80
+ const dashboardWidgetId = (segment) => `${config.module}:Widget:Dashboard:${segment}`;
75
81
  const RootConfig = {
76
82
  config,
77
83
  module: {
78
- module: 'DashboardManagement',
79
- name: 'DashboardManagement',
84
+ module: config.module,
85
+ name: config.module,
80
86
  title: `@${config.i18n}:module.title`,
81
87
  icon: 'fa-regular fa-tachometer-alt',
82
88
  },
@@ -88,17 +94,110 @@ const RootConfig = {
88
94
  icon: 'fa-regular fa-tachometer-alt',
89
95
  },
90
96
  },
97
+ /** Dashboard widget type ids owned by dashboard-management. */
98
+ widgets: {
99
+ barChart: dashboardWidgetId('BarChart'),
100
+ donutChart: dashboardWidgetId('DonutChart'),
101
+ lineChart: dashboardWidgetId('LineChart'),
102
+ gaugeChart: dashboardWidgetId('GaugeChart'),
103
+ funnelChart: dashboardWidgetId('FunnelChart'),
104
+ heatmapChart: dashboardWidgetId('HeatmapChart'),
105
+ stickyNote: dashboardWidgetId('StickyNote'),
106
+ clockCalendar: dashboardWidgetId('ClockCalendar'),
107
+ analogClock: dashboardWidgetId('AnalogClock'),
108
+ weather: dashboardWidgetId('Weather'),
109
+ minimalWeather: dashboardWidgetId('MinimalWeather'),
110
+ advancedWeather: dashboardWidgetId('AdvancedWeather'),
111
+ shortcut: dashboardWidgetId('Shortcut'),
112
+ kpiProgress: dashboardWidgetId('KpiProgress'),
113
+ kpiSegmented: dashboardWidgetId('KpiSegmented'),
114
+ kpiDetails: dashboardWidgetId('KpiDetails'),
115
+ kpiStatCard: dashboardWidgetId('KpiStatCard'),
116
+ },
91
117
  };
92
118
 
119
+ //#endregion
120
+ //#region ---- Constants ----
121
+ /** Minimum interval between container resize emissions to subscribers and {@link AXPDashboardWidgetComponent.onContainerSizeChanged}. */
122
+ const AXPDASHBOARD_WIDGET_CONTAINER_RESIZE_THROTTLE_MS = 100;
123
+ //#endregion
124
+ //#region ---- Dashboard widget base ----
125
+ /**
126
+ * Base class for dashboard widgets ({@link AXPBaseWidgetComponent}).
127
+ * Extend this to add shared dashboard logic and helpers.
128
+ */
129
+ class AXPDashboardWidgetComponent extends AXPBaseWidgetComponent {
130
+ constructor() {
131
+ super();
132
+ //#region ---- Container resize ----
133
+ this.containerResizeRawSubject = new Subject();
134
+ this.containerSizeSubject = new Subject();
135
+ /**
136
+ * Emits the widget host content-box size whenever it changes.
137
+ * Notifications are throttled; see `AXPDASHBOARD_WIDGET_CONTAINER_RESIZE_THROTTLE_MS`.
138
+ */
139
+ this.containerSize$ = this.containerSizeSubject.asObservable();
140
+ const destroyRef = inject(DestroyRef);
141
+ if (typeof ResizeObserver === 'undefined') {
142
+ return;
143
+ }
144
+ this.containerResizeRawSubject
145
+ .pipe(throttleTime(AXPDASHBOARD_WIDGET_CONTAINER_RESIZE_THROTTLE_MS, undefined, {
146
+ leading: true,
147
+ trailing: true,
148
+ }), takeUntilDestroyed(destroyRef))
149
+ .subscribe((size) => {
150
+ this.containerSizeSubject.next(size);
151
+ this.onContainerSizeChanged(size);
152
+ });
153
+ const resizeObserver = new ResizeObserver((entries) => {
154
+ const entry = entries[0];
155
+ if (!entry) {
156
+ return;
157
+ }
158
+ const size = {
159
+ width: entry.contentRect.width,
160
+ height: entry.contentRect.height,
161
+ };
162
+ this.containerResizeRawSubject.next(size);
163
+ });
164
+ const bindResizeObservation = () => {
165
+ if (!this.host.isConnected) {
166
+ return;
167
+ }
168
+ resizeObserver.disconnect();
169
+ resizeObserver.observe(this.host);
170
+ };
171
+ afterNextRender(() => {
172
+ bindResizeObservation();
173
+ });
174
+ destroyRef.onDestroy(() => {
175
+ resizeObserver.disconnect();
176
+ this.containerResizeRawSubject.complete();
177
+ this.containerSizeSubject.complete();
178
+ });
179
+ }
180
+ /**
181
+ * Called when the widget host content box is resized.
182
+ * Override for imperative updates; use {@link containerSize$} for reactive pipelines.
183
+ */
184
+ onContainerSizeChanged(_size) { }
185
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDashboardWidgetComponent, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
186
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDashboardWidgetComponent }); }
187
+ }
188
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDashboardWidgetComponent, decorators: [{
189
+ type: Injectable
190
+ }], ctorParameters: () => [] });
191
+
93
192
  /**
94
193
  * Bar Chart Widget Component
95
194
  * Renders data as vertical bars with interactive hover effects and animations
96
195
  */
97
- class AXPBarChartWidgetViewComponent extends AXPBaseWidgetComponent {
196
+ class AXPBarChartWidgetViewComponent extends AXPDashboardWidgetComponent {
98
197
  //#endregion
99
198
  async resolveChartOptionLabel(value) {
100
199
  if (value != null && typeof value === 'object' && !Array.isArray(value)) {
101
- return this.mlResolver.resolve(value);
200
+ return this.translationService.resolve(value);
102
201
  }
103
202
  const s = String(value ?? '');
104
203
  if (s.startsWith('@')) {
@@ -119,8 +218,10 @@ class AXPBarChartWidgetViewComponent extends AXPBaseWidgetComponent {
119
218
  }
120
219
  return value;
121
220
  }
122
- if (typeof value === 'object' && !Array.isArray(value) && this.mlResolver.isValidMultiLanguageObject(value)) {
123
- return this.mlResolver.resolve(value);
221
+ if (typeof value === 'object' &&
222
+ !Array.isArray(value) &&
223
+ this.translationService.isValidMultiLanguageObject(value)) {
224
+ return this.translationService.resolve(value);
124
225
  }
125
226
  return String(value);
126
227
  }
@@ -129,7 +230,6 @@ class AXPBarChartWidgetViewComponent extends AXPBaseWidgetComponent {
129
230
  //#region ---- Services & Dependencies ----
130
231
  this.dataService = inject(AXPDataSourceDefinitionProviderService);
131
232
  this.translationService = inject(AXTranslationService);
132
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
133
233
  //#endregion
134
234
  //#region ---- Chart state ----
135
235
  this.data = signal([], ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
@@ -224,8 +324,9 @@ const AXP_WIDGETS_UTILITY_CATEGORY = {
224
324
  };
225
325
 
226
326
  const AXPBarChartWidget = {
227
- name: 'bar-chart',
228
- title: 'Bar Chart Widget',
327
+ name: RootConfig.widgets.barChart,
328
+ title: '@dashboard:widgets.bar-chart.widget-title',
329
+ description: '@dashboard:widgets.bar-chart.widget-description',
229
330
  categories: [AXP_WIDGETS_CHART_CATEGORY],
230
331
  groups: [AXPWidgetGroupEnum.DashboardWidget],
231
332
  type: 'dashboard',
@@ -534,10 +635,10 @@ const AXPBarChartWidget = {
534
635
  * Donut Chart Widget Component
535
636
  * Displays data in a circular donut chart with interactive segments
536
637
  */
537
- class AXPDonutChartWidgetViewComponent extends AXPValueWidgetComponent {
638
+ class AXPDonutChartWidgetViewComponent extends AXPDashboardWidgetComponent {
538
639
  async resolveChartOptionLabel(value) {
539
640
  if (value != null && typeof value === 'object' && !Array.isArray(value)) {
540
- return this.mlResolver.resolve(value);
641
+ return this.translationService.resolve(value);
541
642
  }
542
643
  const s = String(value ?? '');
543
644
  if (s.startsWith('@')) {
@@ -558,8 +659,10 @@ class AXPDonutChartWidgetViewComponent extends AXPValueWidgetComponent {
558
659
  }
559
660
  return value;
560
661
  }
561
- if (typeof value === 'object' && !Array.isArray(value) && this.mlResolver.isValidMultiLanguageObject(value)) {
562
- return this.mlResolver.resolve(value);
662
+ if (typeof value === 'object' &&
663
+ !Array.isArray(value) &&
664
+ this.translationService.isValidMultiLanguageObject(value)) {
665
+ return this.translationService.resolve(value);
563
666
  }
564
667
  return String(value);
565
668
  }
@@ -568,7 +671,6 @@ class AXPDonutChartWidgetViewComponent extends AXPValueWidgetComponent {
568
671
  //#region ---- Services & Dependencies ----
569
672
  this.dataService = inject(AXPDataSourceDefinitionProviderService);
570
673
  this.translationService = inject(AXTranslationService);
571
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
572
674
  //#endregion
573
675
  //#region ---- Chart state ----
574
676
  this.data = signal([], ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
@@ -581,9 +683,7 @@ class AXPDonutChartWidgetViewComponent extends AXPValueWidgetComponent {
581
683
  const generation = ++this.labelResolveGeneration;
582
684
  void (async () => {
583
685
  const title = await this.resolveChartOptionLabel(raw['title']);
584
- const totalLabel = raw['totalLabel'] !== undefined
585
- ? await this.resolveChartOptionLabel(raw['totalLabel'])
586
- : undefined;
686
+ const totalLabel = raw['totalLabel'] !== undefined ? await this.resolveChartOptionLabel(raw['totalLabel']) : undefined;
587
687
  if (generation !== this.labelResolveGeneration) {
588
688
  return;
589
689
  }
@@ -655,8 +755,9 @@ var donutChartWidget_component = /*#__PURE__*/Object.freeze({
655
755
  });
656
756
 
657
757
  const AXPDonutChartWidget = {
658
- name: 'donut-chart',
659
- title: 'Donut Chart Widget',
758
+ name: RootConfig.widgets.donutChart,
759
+ title: '@dashboard:widgets.donut-chart.widget-title',
760
+ description: '@dashboard:widgets.donut-chart.widget-description',
660
761
  categories: AXP_WIDGETS_CHART_CATEGORY,
661
762
  groups: [AXPWidgetGroupEnum.DashboardWidget],
662
763
  type: 'dashboard',
@@ -914,14 +1015,165 @@ const AXPDonutChartWidget = {
914
1015
  },
915
1016
  };
916
1017
 
1018
+ /**
1019
+ * Funnel Chart Widget Component
1020
+ * Displays step-wise conversion/flow data as a funnel.
1021
+ */
1022
+ class AXPFunnelChartWidgetViewComponent extends AXPDashboardWidgetComponent {
1023
+ //#region ---- Localization ----
1024
+ async resolveChartText(value) {
1025
+ if (value == null) {
1026
+ return '';
1027
+ }
1028
+ if (typeof value === 'string') {
1029
+ return value.startsWith('@') ? this.translationService.translateAsync(value) : value;
1030
+ }
1031
+ if (typeof value === 'object' &&
1032
+ !Array.isArray(value) &&
1033
+ this.translationService.isValidMultiLanguageObject(value)) {
1034
+ return this.translationService.resolve(value);
1035
+ }
1036
+ return String(value);
1037
+ }
1038
+ //#endregion
1039
+ constructor() {
1040
+ super();
1041
+ //#region ---- Services & Dependencies ----
1042
+ this.dataService = inject(AXPDataSourceDefinitionProviderService);
1043
+ this.translationService = inject(AXTranslationService);
1044
+ //#endregion
1045
+ //#region ---- Chart state ----
1046
+ this.data = signal([], ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
1047
+ /** Options passed to the chart with resolved messages/labels (multi-language and @i18n keys). */
1048
+ this.funnelOptions = signal({}, ...(ngDevMode ? [{ debugName: "funnelOptions" }] : /* istanbul ignore next */ []));
1049
+ this.labelResolveGeneration = 0;
1050
+ //#endregion
1051
+ this.dataSource = computed(() => this.options()['dataSource'], ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
1052
+ //#endregion
1053
+ //#region ---- Effects ----
1054
+ this.resolveOptionLabelsEffect = effect(() => {
1055
+ const raw = this.options();
1056
+ const generation = ++this.labelResolveGeneration;
1057
+ void (async () => {
1058
+ const messagesRaw = raw['messages'];
1059
+ const messages = messagesRaw && typeof messagesRaw === 'object' && !Array.isArray(messagesRaw)
1060
+ ? messagesRaw
1061
+ : undefined;
1062
+ const noData = await this.resolveChartText(messages?.['noData']);
1063
+ if (generation !== this.labelResolveGeneration) {
1064
+ return;
1065
+ }
1066
+ const base = raw;
1067
+ this.funnelOptions.set({
1068
+ ...base,
1069
+ ...(messages
1070
+ ? {
1071
+ messages: {
1072
+ ...base.messages,
1073
+ ...(noData ? { noData } : {}),
1074
+ ...(messages['noDataIcon'] ? { noDataIcon: String(messages['noDataIcon']) } : {}),
1075
+ },
1076
+ }
1077
+ : {}),
1078
+ });
1079
+ })();
1080
+ }, ...(ngDevMode ? [{ debugName: "resolveOptionLabelsEffect" }] : /* istanbul ignore next */ []));
1081
+ this.dataLoadEffect = effect(async () => {
1082
+ const ds = this.dataSource();
1083
+ const resolveName = async (name) => {
1084
+ const resolved = await this.resolveChartText(name);
1085
+ return resolved;
1086
+ };
1087
+ if (typeof ds === 'string') {
1088
+ const result = await this.dataService.get(ds);
1089
+ if (!result) {
1090
+ this.data.set([]);
1091
+ return;
1092
+ }
1093
+ const dataSource = result.source();
1094
+ const page = await dataSource.config.load({
1095
+ take: dataSource.pageSize,
1096
+ skip: 0,
1097
+ sort: [],
1098
+ });
1099
+ const items = (page.items ?? []);
1100
+ const resolved = await Promise.all(items.map(async (item) => ({
1101
+ ...item,
1102
+ name: await resolveName(item['name']),
1103
+ })));
1104
+ this.data.set(resolved);
1105
+ return;
1106
+ }
1107
+ if (ds && Array.isArray(ds)) {
1108
+ const resolved = await Promise.all(ds.map(async (item) => ({
1109
+ ...item,
1110
+ name: await resolveName(item['name']),
1111
+ })));
1112
+ this.data.set(resolved);
1113
+ return;
1114
+ }
1115
+ this.data.set([]);
1116
+ }, ...(ngDevMode ? [{ debugName: "dataLoadEffect" }] : /* istanbul ignore next */ []));
1117
+ this.setOptions({
1118
+ showLabels: true,
1119
+ showTooltip: true,
1120
+ neckWidth: 0.3,
1121
+ colors: ['#0ea5e9', '#22c55e', '#f59e0b', '#ef4444', '#8b5cf6'],
1122
+ animationEasing: 'cubic-out',
1123
+ animationDuration: 800,
1124
+ margin: { top: 16, right: 16, bottom: 16, left: 16 },
1125
+ ...this.options(),
1126
+ });
1127
+ this.funnelOptions.set(this.options());
1128
+ }
1129
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFunnelChartWidgetViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1130
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: AXPFunnelChartWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<ax-funnel-chart [data]=\"data()\" [options]=\"funnelOptions()\"></ax-funnel-chart>\n\n", styles: [":host{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "component", type: AXFunnelChartComponent, selector: "ax-funnel-chart", inputs: ["data", "options"], outputs: ["segmentClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1131
+ }
1132
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFunnelChartWidgetViewComponent, decorators: [{
1133
+ type: Component,
1134
+ args: [{ imports: [AXFunnelChartComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ax-funnel-chart [data]=\"data()\" [options]=\"funnelOptions()\"></ax-funnel-chart>\n\n", styles: [":host{display:block;width:100%;height:100%}\n"] }]
1135
+ }], ctorParameters: () => [] });
1136
+
1137
+ var funnelChartWidget_component = /*#__PURE__*/Object.freeze({
1138
+ __proto__: null,
1139
+ AXPFunnelChartWidgetViewComponent: AXPFunnelChartWidgetViewComponent
1140
+ });
1141
+
1142
+ const AXPFunnelChartWidget = {
1143
+ name: RootConfig.widgets.funnelChart,
1144
+ title: '@dashboard:widgets.funnel-chart.widget-title',
1145
+ description: '@dashboard:widgets.funnel-chart.widget-description',
1146
+ categories: [AXP_WIDGETS_CHART_CATEGORY],
1147
+ groups: [AXPWidgetGroupEnum.DashboardWidget],
1148
+ type: 'dashboard',
1149
+ icon: 'fa-light fa-filter',
1150
+ properties: [
1151
+ AXP_DATA_SOURCE_OPTIONS_PROPERTY,
1152
+ cloneProperty(AXP_NAME_PROPERTY, { visible: false }),
1153
+ cloneProperty(AXP_DATA_PATH_PROPERTY, { visible: false }),
1154
+ ],
1155
+ components: {
1156
+ view: {
1157
+ component: () => Promise.resolve().then(function () { return funnelChartWidget_component; }).then((c) => c.AXPFunnelChartWidgetViewComponent),
1158
+ },
1159
+ },
1160
+ meta: {
1161
+ dimensions: {
1162
+ lg: { width: 5, height: 5, minWidth: 2, minHeight: 2, maxWidth: 7, maxHeight: 7 },
1163
+ md: { width: 5, height: 5, minWidth: 2, minHeight: 2, maxWidth: 7, maxHeight: 7 },
1164
+ sm: { height: 5, minHeight: 2, maxHeight: 7 },
1165
+ },
1166
+ },
1167
+ };
1168
+
917
1169
  /**
918
1170
  * Gauge Chart Widget Component
919
1171
  * Renders a semi-circular gauge chart with animated needle and thresholds
920
1172
  */
921
- class AXPGaugeChartWidgetViewComponent extends AXPBaseWidgetComponent {
1173
+ class AXPGaugeChartWidgetViewComponent extends AXPDashboardWidgetComponent {
922
1174
  async resolveChartOptionLabel(value) {
923
1175
  if (value != null && typeof value === 'object' && !Array.isArray(value)) {
924
- return this.mlResolver.resolve(value);
1176
+ return this.translationService.resolve(value);
925
1177
  }
926
1178
  const s = String(value ?? '');
927
1179
  if (s.startsWith('@')) {
@@ -934,7 +1186,6 @@ class AXPGaugeChartWidgetViewComponent extends AXPBaseWidgetComponent {
934
1186
  //#region ---- Services & Dependencies ----
935
1187
  this.dataService = inject(AXPDataSourceDefinitionProviderService);
936
1188
  this.translationService = inject(AXTranslationService);
937
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
938
1189
  //#endregion
939
1190
  //#region ---- Chart state ----
940
1191
  this.value = signal(0, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
@@ -960,9 +1211,7 @@ class AXPGaugeChartWidgetViewComponent extends AXPBaseWidgetComponent {
960
1211
  return {
961
1212
  value: entry['value'],
962
1213
  color: String(entry['color'] ?? ''),
963
- ...(labelRaw != null && labelRaw !== ''
964
- ? { label: await this.resolveChartOptionLabel(labelRaw) }
965
- : {}),
1214
+ ...(labelRaw != null && labelRaw !== '' ? { label: await this.resolveChartOptionLabel(labelRaw) } : {}),
966
1215
  };
967
1216
  }));
968
1217
  }
@@ -1022,8 +1271,9 @@ var gaugeChartWidget_component = /*#__PURE__*/Object.freeze({
1022
1271
  });
1023
1272
 
1024
1273
  const AXPGaugeChartWidget = {
1025
- name: 'gauge-chart',
1026
- title: 'Gauge Chart Widget',
1274
+ name: RootConfig.widgets.gaugeChart,
1275
+ title: '@dashboard:widgets.gauge-chart.widget-title',
1276
+ description: '@dashboard:widgets.gauge-chart.widget-description',
1027
1277
  categories: [AXP_WIDGETS_CHART_CATEGORY],
1028
1278
  type: 'dashboard',
1029
1279
  icon: 'fa-light fa-gauge',
@@ -1279,14 +1529,217 @@ const AXPGaugeChartWidget = {
1279
1529
  },
1280
1530
  };
1281
1531
 
1532
+ /**
1533
+ * Heatmap Chart Widget Component
1534
+ * Displays matrix-like data with color intensity based on value.
1535
+ */
1536
+ class AXPHeatmapChartWidgetViewComponent extends AXPDashboardWidgetComponent {
1537
+ //#region ---- Localization ----
1538
+ async resolveChartText(value) {
1539
+ if (value == null) {
1540
+ return '';
1541
+ }
1542
+ if (typeof value === 'string') {
1543
+ return value.startsWith('@') ? this.translationService.translateAsync(value) : value;
1544
+ }
1545
+ if (typeof value === 'object' &&
1546
+ !Array.isArray(value) &&
1547
+ this.translationService.isValidMultiLanguageObject(value)) {
1548
+ return this.translationService.resolve(value);
1549
+ }
1550
+ return String(value);
1551
+ }
1552
+ //#endregion
1553
+ constructor() {
1554
+ super();
1555
+ //#region ---- Services & Dependencies ----
1556
+ this.dataService = inject(AXPDataSourceDefinitionProviderService);
1557
+ this.translationService = inject(AXTranslationService);
1558
+ //#endregion
1559
+ //#region ---- Chart state ----
1560
+ this.data = signal([], ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
1561
+ /** Options passed to the chart with resolved string labels (multi-language and @i18n keys). */
1562
+ this.heatmapOptions = signal({}, ...(ngDevMode ? [{ debugName: "heatmapOptions" }] : /* istanbul ignore next */ []));
1563
+ this.labelResolveGeneration = 0;
1564
+ //#endregion
1565
+ this.dataSource = computed(() => this.options()['dataSource'], ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
1566
+ //#endregion
1567
+ //#region ---- Effects ----
1568
+ this.resolveOptionLabelsEffect = effect(() => {
1569
+ const raw = this.options();
1570
+ const generation = ++this.labelResolveGeneration;
1571
+ void (async () => {
1572
+ const [xAxisLabel, yAxisLabel] = await Promise.all([
1573
+ this.resolveChartText(raw['xAxisLabel']),
1574
+ this.resolveChartText(raw['yAxisLabel']),
1575
+ ]);
1576
+ const messagesRaw = raw['messages'];
1577
+ const messages = messagesRaw && typeof messagesRaw === 'object' && !Array.isArray(messagesRaw)
1578
+ ? messagesRaw
1579
+ : undefined;
1580
+ const [noData, noDataHelp] = await Promise.all([
1581
+ this.resolveChartText(messages?.['noData']),
1582
+ this.resolveChartText(messages?.['noDataHelp']),
1583
+ ]);
1584
+ if (generation !== this.labelResolveGeneration) {
1585
+ return;
1586
+ }
1587
+ const base = raw;
1588
+ this.heatmapOptions.set({
1589
+ ...base,
1590
+ xAxisLabel,
1591
+ yAxisLabel,
1592
+ ...(messages
1593
+ ? {
1594
+ messages: {
1595
+ ...base.messages,
1596
+ ...(noData ? { noData } : {}),
1597
+ ...(noDataHelp ? { noDataHelp } : {}),
1598
+ ...(messages['noDataIcon'] ? { noDataIcon: String(messages['noDataIcon']) } : {}),
1599
+ },
1600
+ }
1601
+ : {}),
1602
+ });
1603
+ })();
1604
+ }, ...(ngDevMode ? [{ debugName: "resolveOptionLabelsEffect" }] : /* istanbul ignore next */ []));
1605
+ this.dataLoadEffect = effect(async () => {
1606
+ const ds = this.dataSource();
1607
+ if (typeof ds === 'string') {
1608
+ const result = await this.dataService.get(ds);
1609
+ if (!result) {
1610
+ this.data.set([]);
1611
+ return;
1612
+ }
1613
+ const dataSource = result.source();
1614
+ const page = await dataSource.config.load({
1615
+ take: dataSource.pageSize,
1616
+ skip: 0,
1617
+ sort: [],
1618
+ });
1619
+ const items = (page.items ?? []);
1620
+ const resolved = await Promise.all(items.map(async (item) => {
1621
+ const x = item['x'];
1622
+ const y = item['y'];
1623
+ const label = item['label'];
1624
+ return {
1625
+ ...item,
1626
+ x: typeof x === 'number' ? x : await this.resolveChartText(x),
1627
+ y: typeof y === 'number' ? y : await this.resolveChartText(y),
1628
+ ...(label !== undefined ? { label: await this.resolveChartText(label) } : {}),
1629
+ };
1630
+ }));
1631
+ this.data.set(resolved);
1632
+ return;
1633
+ }
1634
+ if (ds && Array.isArray(ds)) {
1635
+ const resolved = await Promise.all(ds.map(async (item) => {
1636
+ const x = item['x'];
1637
+ const y = item['y'];
1638
+ const label = item['label'];
1639
+ return {
1640
+ ...item,
1641
+ x: typeof x === 'number' ? x : await this.resolveChartText(x),
1642
+ y: typeof y === 'number' ? y : await this.resolveChartText(y),
1643
+ ...(label !== undefined ? { label: await this.resolveChartText(label) } : {}),
1644
+ };
1645
+ }));
1646
+ this.data.set(resolved);
1647
+ return;
1648
+ }
1649
+ this.data.set([]);
1650
+ }, ...(ngDevMode ? [{ debugName: "dataLoadEffect" }] : /* istanbul ignore next */ []));
1651
+ this.setOptions({
1652
+ showXAxis: true,
1653
+ showYAxis: true,
1654
+ showTooltip: true,
1655
+ cellPadding: 0.05,
1656
+ borderRadius: 2,
1657
+ colors: ['#f7fbff', '#08306b'],
1658
+ animationEasing: 'cubic-out',
1659
+ animationDuration: 800,
1660
+ ...this.options(),
1661
+ });
1662
+ this.heatmapOptions.set(this.options());
1663
+ }
1664
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPHeatmapChartWidgetViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1665
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: AXPHeatmapChartWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<ax-heatmap-chart [data]=\"data()\" [options]=\"heatmapOptions()\"></ax-heatmap-chart>\n\n", styles: [":host{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "component", type: AXHeatmapChartComponent, selector: "ax-heatmap-chart", inputs: ["data", "options"], outputs: ["cellClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1666
+ }
1667
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPHeatmapChartWidgetViewComponent, decorators: [{
1668
+ type: Component,
1669
+ args: [{ imports: [AXHeatmapChartComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ax-heatmap-chart [data]=\"data()\" [options]=\"heatmapOptions()\"></ax-heatmap-chart>\n\n", styles: [":host{display:block;width:100%;height:100%}\n"] }]
1670
+ }], ctorParameters: () => [] });
1671
+
1672
+ var heatmapChartWidget_component = /*#__PURE__*/Object.freeze({
1673
+ __proto__: null,
1674
+ AXPHeatmapChartWidgetViewComponent: AXPHeatmapChartWidgetViewComponent
1675
+ });
1676
+
1677
+ const AXPHeatmapChartWidget = {
1678
+ name: RootConfig.widgets.heatmapChart,
1679
+ title: '@dashboard:widgets.heatmap-chart.widget-title',
1680
+ description: '@dashboard:widgets.heatmap-chart.widget-description',
1681
+ categories: [AXP_WIDGETS_CHART_CATEGORY],
1682
+ groups: [AXPWidgetGroupEnum.DashboardWidget],
1683
+ type: 'dashboard',
1684
+ icon: 'fa-light fa-grid-2',
1685
+ properties: [
1686
+ AXP_DATA_SOURCE_OPTIONS_PROPERTY,
1687
+ cloneProperty(AXP_NAME_PROPERTY, { visible: false }),
1688
+ cloneProperty(AXP_DATA_PATH_PROPERTY, { visible: false }),
1689
+ // ====== Axis Settings ======
1690
+ {
1691
+ name: 'xAxisLabel',
1692
+ title: '@dashboard:widgets.heatmap-chart.x-axis-label',
1693
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
1694
+ schema: {
1695
+ defaultValue: '',
1696
+ dataType: 'string',
1697
+ interface: {
1698
+ name: 'xAxisLabel',
1699
+ path: 'options.xAxisLabel',
1700
+ type: AXPWidgetsCatalog.text,
1701
+ },
1702
+ },
1703
+ visible: true,
1704
+ },
1705
+ {
1706
+ name: 'yAxisLabel',
1707
+ title: '@dashboard:widgets.heatmap-chart.y-axis-label',
1708
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
1709
+ schema: {
1710
+ defaultValue: '',
1711
+ dataType: 'string',
1712
+ interface: {
1713
+ name: 'yAxisLabel',
1714
+ path: 'options.yAxisLabel',
1715
+ type: AXPWidgetsCatalog.text,
1716
+ },
1717
+ },
1718
+ visible: true,
1719
+ },
1720
+ ],
1721
+ components: {
1722
+ view: {
1723
+ component: () => Promise.resolve().then(function () { return heatmapChartWidget_component; }).then((c) => c.AXPHeatmapChartWidgetViewComponent),
1724
+ },
1725
+ },
1726
+ meta: {
1727
+ dimensions: {
1728
+ lg: { width: 6, height: 5, minWidth: 2, minHeight: 2, maxWidth: 8, maxHeight: 7 },
1729
+ md: { width: 6, height: 5, minWidth: 2, minHeight: 2, maxWidth: 8, maxHeight: 7 },
1730
+ sm: { height: 5, minHeight: 2, maxHeight: 7 },
1731
+ },
1732
+ },
1733
+ };
1734
+
1282
1735
  /**
1283
1736
  * Line Chart Widget Component
1284
1737
  * Renders data as lines with interactive hover effects and animations
1285
1738
  */
1286
- class AXPLineChartWidgetViewComponent extends AXPValueWidgetComponent {
1739
+ class AXPLineChartWidgetViewComponent extends AXPDashboardWidgetComponent {
1287
1740
  async resolveChartOptionLabel(value) {
1288
1741
  if (value != null && typeof value === 'object' && !Array.isArray(value)) {
1289
- return this.mlResolver.resolve(value);
1742
+ return this.translationService.resolve(value);
1290
1743
  }
1291
1744
  const s = String(value ?? '');
1292
1745
  if (s.startsWith('@')) {
@@ -1307,8 +1760,10 @@ class AXPLineChartWidgetViewComponent extends AXPValueWidgetComponent {
1307
1760
  }
1308
1761
  return value;
1309
1762
  }
1310
- if (typeof value === 'object' && !Array.isArray(value) && this.mlResolver.isValidMultiLanguageObject(value)) {
1311
- return this.mlResolver.resolve(value);
1763
+ if (typeof value === 'object' &&
1764
+ !Array.isArray(value) &&
1765
+ this.translationService.isValidMultiLanguageObject(value)) {
1766
+ return this.translationService.resolve(value);
1312
1767
  }
1313
1768
  return String(value);
1314
1769
  }
@@ -1317,7 +1772,6 @@ class AXPLineChartWidgetViewComponent extends AXPValueWidgetComponent {
1317
1772
  //#region ---- Services & Dependencies ----
1318
1773
  this.dataService = inject(AXPDataSourceDefinitionProviderService);
1319
1774
  this.translationService = inject(AXTranslationService);
1320
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
1321
1775
  //#endregion
1322
1776
  //#region ---- Chart state ----
1323
1777
  this.data = signal([], ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
@@ -1412,8 +1866,9 @@ var lineChartWidget_component = /*#__PURE__*/Object.freeze({
1412
1866
  });
1413
1867
 
1414
1868
  const AXPLineChartWidget = {
1415
- name: 'line-chart',
1416
- title: 'Line Chart Widget',
1869
+ name: RootConfig.widgets.lineChart,
1870
+ title: '@dashboard:widgets.line-chart.widget-title',
1871
+ description: '@dashboard:widgets.line-chart.widget-description',
1417
1872
  categories: [AXP_WIDGETS_CHART_CATEGORY],
1418
1873
  groups: [AXPWidgetGroupEnum.DashboardWidget],
1419
1874
  type: 'dashboard',
@@ -1814,13 +2269,12 @@ const AXPLineChartWidget = {
1814
2269
  },
1815
2270
  };
1816
2271
 
1817
- class AXPKpiProgressWidgetViewComponent extends AXPBaseWidgetComponent {
2272
+ class AXPKpiProgressWidgetViewComponent extends AXPDashboardWidgetComponent {
1818
2273
  constructor() {
1819
2274
  super(...arguments);
1820
2275
  //#region ---- Services & Dependencies ----
1821
2276
  this.dataService = inject(AXPDataSourceDefinitionProviderService);
1822
2277
  this.translationService = inject(AXTranslationService);
1823
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
1824
2278
  //#endregion
1825
2279
  //#region ---- State ----
1826
2280
  this.model = signal({
@@ -1908,8 +2362,10 @@ class AXPKpiProgressWidgetViewComponent extends AXPBaseWidgetComponent {
1908
2362
  }
1909
2363
  return value;
1910
2364
  }
1911
- if (typeof value === 'object' && !Array.isArray(value) && this.mlResolver.isValidMultiLanguageObject(value)) {
1912
- return this.mlResolver.resolve(value);
2365
+ if (typeof value === 'object' &&
2366
+ !Array.isArray(value) &&
2367
+ this.translationService.isValidMultiLanguageObject(value)) {
2368
+ return this.translationService.resolve(value);
1913
2369
  }
1914
2370
  return String(value);
1915
2371
  }
@@ -1934,11 +2390,11 @@ class AXPKpiProgressWidgetViewComponent extends AXPBaseWidgetComponent {
1934
2390
  }).format(value);
1935
2391
  }
1936
2392
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKpiProgressWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1937
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPKpiProgressWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"kpi-progress\">\n <div class=\"kpi-progress__header\">\n <div class=\"kpi-progress__title\">{{ localized().title }}</div>\n </div>\n\n <div class=\"kpi-progress__value-row\">\n <div class=\"kpi-progress__value\">\n {{ localized().valuePrefix }}{{ formattedValue() }}{{ localized().valueSuffix }}\n </div>\n @if (localized().targetValue) {\n <div class=\"kpi-progress__target\">{{ localized().targetValue }}</div>\n }\n </div>\n\n @if (localized().subtitle) {\n <div class=\"kpi-progress__subtitle\">{{ localized().subtitle }}</div>\n }\n\n <div class=\"kpi-progress__bar-track\">\n <div class=\"kpi-progress__bar-fill\" [style.width.%]=\"progressPercent()\"></div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.kpi-progress{display:flex;flex-direction:column;gap:.75rem;padding:.5rem}.kpi-progress__title{font-size:1.25rem;color:var(--ax-text-muted)}.kpi-progress__value-row{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem}.kpi-progress__value{font-size:3rem;font-weight:700;line-height:1;color:var(--ax-text-color)}.kpi-progress__target,.kpi-progress__subtitle{font-size:2rem;font-weight:500;color:var(--ax-primary-color, var(--ax-text-color))}.kpi-progress__subtitle{font-size:1.75rem}.kpi-progress__bar-track{width:100%;height:1rem;border-radius:999px;background-color:var(--ax-surface-hover);overflow:hidden}.kpi-progress__bar-fill{height:100%;border-radius:999px;background-color:var(--ax-primary-color, var(--ax-text-color))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2393
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPKpiProgressWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-kpi-progress\">\n <div class=\"__header\">\n <div class=\"__title\">{{ localized().title }}</div>\n <div class=\"__badge\">{{ progressPercent() }}%</div>\n </div>\n\n <div class=\"__value-row\">\n <div class=\"__value\">\n {{ localized().valuePrefix }}{{ formattedValue() }}{{ localized().valueSuffix }}\n </div>\n @if (localized().targetValue) {\n <div class=\"__target-wrap\">\n <div class=\"__target-label\">Target</div>\n <div class=\"__target\">{{ localized().targetValue }}</div>\n </div>\n }\n </div>\n\n @if (localized().subtitle) {\n <div class=\"__subtitle\">{{ localized().subtitle }}</div>\n }\n\n <div class=\"__bar-track\">\n <div class=\"__bar-fill\" [style.width.%]=\"progressPercent()\"></div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.axp-kpi-progress{display:flex;flex-direction:column;gap:.625rem;height:100%;padding:.75rem}.axp-kpi-progress .__header{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.axp-kpi-progress .__title{font-size:.9rem;font-weight:600;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-progress .__badge{padding:.15rem .5rem;border-radius:999px;background:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface));font-size:.75rem;font-weight:700}.axp-kpi-progress .__value-row{display:flex;align-items:flex-end;justify-content:space-between;gap:.75rem}.axp-kpi-progress .__value{font-size:clamp(1.5rem,3.5cqw,2.25rem);font-weight:700;line-height:1.1;color:rgb(var(--ax-sys-color-on-lightest-surface))}.axp-kpi-progress .__target-wrap{display:flex;flex-direction:column;align-items:flex-end}.axp-kpi-progress .__target-label{font-size:.7rem;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-progress .__target{font-size:.95rem;font-weight:600;color:rgb(var(--ax-sys-color-on-lightest-surface))}.axp-kpi-progress .__subtitle{font-size:.82rem;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-progress .__bar-track{width:100%;height:.5rem;border-radius:999px;background:rgb(var(--ax-sys-color-lighter-surface));overflow:hidden}.axp-kpi-progress .__bar-fill{height:100%;border-radius:999px;background:linear-gradient(90deg,rgb(var(--ax-sys-color-primary-300)),rgb(var(--ax-sys-color-primary-500)))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1938
2394
  }
1939
2395
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKpiProgressWidgetViewComponent, decorators: [{
1940
2396
  type: Component,
1941
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"kpi-progress\">\n <div class=\"kpi-progress__header\">\n <div class=\"kpi-progress__title\">{{ localized().title }}</div>\n </div>\n\n <div class=\"kpi-progress__value-row\">\n <div class=\"kpi-progress__value\">\n {{ localized().valuePrefix }}{{ formattedValue() }}{{ localized().valueSuffix }}\n </div>\n @if (localized().targetValue) {\n <div class=\"kpi-progress__target\">{{ localized().targetValue }}</div>\n }\n </div>\n\n @if (localized().subtitle) {\n <div class=\"kpi-progress__subtitle\">{{ localized().subtitle }}</div>\n }\n\n <div class=\"kpi-progress__bar-track\">\n <div class=\"kpi-progress__bar-fill\" [style.width.%]=\"progressPercent()\"></div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.kpi-progress{display:flex;flex-direction:column;gap:.75rem;padding:.5rem}.kpi-progress__title{font-size:1.25rem;color:var(--ax-text-muted)}.kpi-progress__value-row{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem}.kpi-progress__value{font-size:3rem;font-weight:700;line-height:1;color:var(--ax-text-color)}.kpi-progress__target,.kpi-progress__subtitle{font-size:2rem;font-weight:500;color:var(--ax-primary-color, var(--ax-text-color))}.kpi-progress__subtitle{font-size:1.75rem}.kpi-progress__bar-track{width:100%;height:1rem;border-radius:999px;background-color:var(--ax-surface-hover);overflow:hidden}.kpi-progress__bar-fill{height:100%;border-radius:999px;background-color:var(--ax-primary-color, var(--ax-text-color))}\n"] }]
2397
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axp-kpi-progress\">\n <div class=\"__header\">\n <div class=\"__title\">{{ localized().title }}</div>\n <div class=\"__badge\">{{ progressPercent() }}%</div>\n </div>\n\n <div class=\"__value-row\">\n <div class=\"__value\">\n {{ localized().valuePrefix }}{{ formattedValue() }}{{ localized().valueSuffix }}\n </div>\n @if (localized().targetValue) {\n <div class=\"__target-wrap\">\n <div class=\"__target-label\">Target</div>\n <div class=\"__target\">{{ localized().targetValue }}</div>\n </div>\n }\n </div>\n\n @if (localized().subtitle) {\n <div class=\"__subtitle\">{{ localized().subtitle }}</div>\n }\n\n <div class=\"__bar-track\">\n <div class=\"__bar-fill\" [style.width.%]=\"progressPercent()\"></div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.axp-kpi-progress{display:flex;flex-direction:column;gap:.625rem;height:100%;padding:.75rem}.axp-kpi-progress .__header{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.axp-kpi-progress .__title{font-size:.9rem;font-weight:600;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-progress .__badge{padding:.15rem .5rem;border-radius:999px;background:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface));font-size:.75rem;font-weight:700}.axp-kpi-progress .__value-row{display:flex;align-items:flex-end;justify-content:space-between;gap:.75rem}.axp-kpi-progress .__value{font-size:clamp(1.5rem,3.5cqw,2.25rem);font-weight:700;line-height:1.1;color:rgb(var(--ax-sys-color-on-lightest-surface))}.axp-kpi-progress .__target-wrap{display:flex;flex-direction:column;align-items:flex-end}.axp-kpi-progress .__target-label{font-size:.7rem;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-progress .__target{font-size:.95rem;font-weight:600;color:rgb(var(--ax-sys-color-on-lightest-surface))}.axp-kpi-progress .__subtitle{font-size:.82rem;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-progress .__bar-track{width:100%;height:.5rem;border-radius:999px;background:rgb(var(--ax-sys-color-lighter-surface));overflow:hidden}.axp-kpi-progress .__bar-fill{height:100%;border-radius:999px;background:linear-gradient(90deg,rgb(var(--ax-sys-color-primary-300)),rgb(var(--ax-sys-color-primary-500)))}\n"] }]
1942
2398
  }] });
1943
2399
 
1944
2400
  var kpiProgressWidget_component = /*#__PURE__*/Object.freeze({
@@ -1947,8 +2403,9 @@ var kpiProgressWidget_component = /*#__PURE__*/Object.freeze({
1947
2403
  });
1948
2404
 
1949
2405
  const AXPKpiProgressWidget = {
1950
- name: 'kpi-progress',
1951
- title: createMultiLanguageString('KPI + Progress', 'شاخص کلیدی + پیشرفت'),
2406
+ name: RootConfig.widgets.kpiProgress,
2407
+ title: '@dashboard:widgets.kpi-progress.widget-title',
2408
+ description: '@dashboard:widgets.kpi-progress.widget-description',
1952
2409
  categories: [AXP_WIDGETS_CHART_CATEGORY],
1953
2410
  groups: [AXPWidgetGroupEnum.DashboardWidget],
1954
2411
  type: 'dashboard',
@@ -2060,12 +2517,11 @@ const AXPKpiProgressWidget = {
2060
2517
  },
2061
2518
  };
2062
2519
 
2063
- class AXPKpiSegmentedWidgetViewComponent extends AXPBaseWidgetComponent {
2520
+ class AXPKpiSegmentedWidgetViewComponent extends AXPDashboardWidgetComponent {
2064
2521
  constructor() {
2065
2522
  super(...arguments);
2066
2523
  this.dataService = inject(AXPDataSourceDefinitionProviderService);
2067
2524
  this.translationService = inject(AXTranslationService);
2068
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
2069
2525
  this.model = signal({
2070
2526
  title: 'KPI Breakdown',
2071
2527
  segments: [],
@@ -2115,11 +2571,11 @@ class AXPKpiSegmentedWidgetViewComponent extends AXPBaseWidgetComponent {
2115
2571
  }
2116
2572
  getPaletteColor(index) {
2117
2573
  const palette = [
2118
- 'var(--ax-primary-color, var(--ax-text-color))',
2119
- 'var(--ax-warning-color, var(--ax-text-muted))',
2120
- 'var(--ax-success-color, var(--ax-surface-hover))',
2121
- 'var(--ax-info-color, var(--ax-surface-color))',
2122
- 'var(--ax-danger-color, var(--ax-text-muted))',
2574
+ 'rgb(var(--ax-sys-color-primary-500))',
2575
+ 'rgb(var(--ax-sys-color-warning-500))',
2576
+ 'rgb(var(--ax-sys-color-success-500))',
2577
+ 'rgb(var(--ax-sys-color-accent2-500))',
2578
+ 'rgb(var(--ax-sys-color-danger-500))',
2123
2579
  ];
2124
2580
  return palette[index % palette.length];
2125
2581
  }
@@ -2130,17 +2586,19 @@ class AXPKpiSegmentedWidgetViewComponent extends AXPBaseWidgetComponent {
2130
2586
  if (typeof value === 'string') {
2131
2587
  return value.startsWith('@') ? this.translationService.translateAsync(value) : value;
2132
2588
  }
2133
- if (typeof value === 'object' && !Array.isArray(value) && this.mlResolver.isValidMultiLanguageObject(value)) {
2134
- return this.mlResolver.resolve(value);
2589
+ if (typeof value === 'object' &&
2590
+ !Array.isArray(value) &&
2591
+ this.translationService.isValidMultiLanguageObject(value)) {
2592
+ return this.translationService.resolve(value);
2135
2593
  }
2136
2594
  return String(value);
2137
2595
  }
2138
2596
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKpiSegmentedWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2139
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPKpiSegmentedWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"kpi-segmented\">\n <div class=\"kpi-segmented__header\">{{ title() }}</div>\n\n <div class=\"kpi-segmented__bar-track\">\n @for (segment of segments(); track trackByLabel($index, segment)) {\n <div\n class=\"kpi-segmented__bar-part\"\n [style.width.%]=\"segment.percent\"\n [style.background-color]=\"segment.color\"\n ></div>\n }\n </div>\n\n <div class=\"kpi-segmented__legend\">\n @for (segment of segments(); track trackByLabel($index, segment)) {\n <div class=\"kpi-segmented__legend-item\">\n <span class=\"kpi-segmented__legend-dot\" [style.background-color]=\"segment.color\"></span>\n <span class=\"kpi-segmented__legend-text\">{{ segment.value }} - {{ segment.label }}</span>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.kpi-segmented{display:flex;flex-direction:column;gap:1rem;padding:.5rem}.kpi-segmented__header{font-size:2rem;font-weight:600;color:var(--ax-text-color)}.kpi-segmented__bar-track{display:flex;gap:.25rem;height:1.25rem;width:100%;overflow:hidden}.kpi-segmented__bar-part{border-radius:.5rem;min-width:.5rem}.kpi-segmented__legend{display:flex;flex-wrap:wrap;gap:.75rem 1.5rem}.kpi-segmented__legend-item{display:inline-flex;align-items:center;gap:.5rem}.kpi-segmented__legend-dot{width:1rem;height:1rem;border-radius:.35rem}.kpi-segmented__legend-text{font-size:2rem;color:var(--ax-text-color)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2597
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPKpiSegmentedWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-kpi-segmented\">\n <div class=\"__header\">{{ title() }}</div>\n\n <div class=\"__bar-track\">\n @for (segment of segments(); track trackByLabel($index, segment)) {\n <div\n class=\"__bar-part\"\n [style.width.%]=\"segment.percent\"\n [style.background-color]=\"segment.color\"\n ></div>\n }\n </div>\n\n <div class=\"__legend\">\n @for (segment of segments(); track trackByLabel($index, segment)) {\n <div class=\"__legend-item\">\n <span class=\"__legend-dot\" [style.background-color]=\"segment.color\"></span>\n <span class=\"__legend-value\">{{ segment.value }}</span>\n <span class=\"__legend-label\">{{ segment.label }}</span>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.axp-kpi-segmented{display:flex;flex-direction:column;gap:.75rem;height:100%;padding:.75rem}.axp-kpi-segmented .__header{font-size:.95rem;font-weight:600;color:rgb(var(--ax-sys-color-on-lightest-surface))}.axp-kpi-segmented .__bar-track{display:flex;height:.75rem;width:100%;border-radius:999px;background:rgb(var(--ax-sys-color-lighter-surface));overflow:hidden}.axp-kpi-segmented .__bar-part{min-width:.25rem}.axp-kpi-segmented .__legend{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:.4rem .75rem}.axp-kpi-segmented .__legend-item{display:inline-flex;align-items:center;gap:.35rem;min-width:0}.axp-kpi-segmented .__legend-dot{width:.55rem;height:.55rem;border-radius:999px;flex:0 0 auto}.axp-kpi-segmented .__legend-value{font-size:.8rem;font-weight:700;color:rgb(var(--ax-sys-color-on-lightest-surface))}.axp-kpi-segmented .__legend-label{font-size:.78rem;color:rgb(var(--ax-sys-color-on-light-surface));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2140
2598
  }
2141
2599
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKpiSegmentedWidgetViewComponent, decorators: [{
2142
2600
  type: Component,
2143
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"kpi-segmented\">\n <div class=\"kpi-segmented__header\">{{ title() }}</div>\n\n <div class=\"kpi-segmented__bar-track\">\n @for (segment of segments(); track trackByLabel($index, segment)) {\n <div\n class=\"kpi-segmented__bar-part\"\n [style.width.%]=\"segment.percent\"\n [style.background-color]=\"segment.color\"\n ></div>\n }\n </div>\n\n <div class=\"kpi-segmented__legend\">\n @for (segment of segments(); track trackByLabel($index, segment)) {\n <div class=\"kpi-segmented__legend-item\">\n <span class=\"kpi-segmented__legend-dot\" [style.background-color]=\"segment.color\"></span>\n <span class=\"kpi-segmented__legend-text\">{{ segment.value }} - {{ segment.label }}</span>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.kpi-segmented{display:flex;flex-direction:column;gap:1rem;padding:.5rem}.kpi-segmented__header{font-size:2rem;font-weight:600;color:var(--ax-text-color)}.kpi-segmented__bar-track{display:flex;gap:.25rem;height:1.25rem;width:100%;overflow:hidden}.kpi-segmented__bar-part{border-radius:.5rem;min-width:.5rem}.kpi-segmented__legend{display:flex;flex-wrap:wrap;gap:.75rem 1.5rem}.kpi-segmented__legend-item{display:inline-flex;align-items:center;gap:.5rem}.kpi-segmented__legend-dot{width:1rem;height:1rem;border-radius:.35rem}.kpi-segmented__legend-text{font-size:2rem;color:var(--ax-text-color)}\n"] }]
2601
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axp-kpi-segmented\">\n <div class=\"__header\">{{ title() }}</div>\n\n <div class=\"__bar-track\">\n @for (segment of segments(); track trackByLabel($index, segment)) {\n <div\n class=\"__bar-part\"\n [style.width.%]=\"segment.percent\"\n [style.background-color]=\"segment.color\"\n ></div>\n }\n </div>\n\n <div class=\"__legend\">\n @for (segment of segments(); track trackByLabel($index, segment)) {\n <div class=\"__legend-item\">\n <span class=\"__legend-dot\" [style.background-color]=\"segment.color\"></span>\n <span class=\"__legend-value\">{{ segment.value }}</span>\n <span class=\"__legend-label\">{{ segment.label }}</span>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.axp-kpi-segmented{display:flex;flex-direction:column;gap:.75rem;height:100%;padding:.75rem}.axp-kpi-segmented .__header{font-size:.95rem;font-weight:600;color:rgb(var(--ax-sys-color-on-lightest-surface))}.axp-kpi-segmented .__bar-track{display:flex;height:.75rem;width:100%;border-radius:999px;background:rgb(var(--ax-sys-color-lighter-surface));overflow:hidden}.axp-kpi-segmented .__bar-part{min-width:.25rem}.axp-kpi-segmented .__legend{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:.4rem .75rem}.axp-kpi-segmented .__legend-item{display:inline-flex;align-items:center;gap:.35rem;min-width:0}.axp-kpi-segmented .__legend-dot{width:.55rem;height:.55rem;border-radius:999px;flex:0 0 auto}.axp-kpi-segmented .__legend-value{font-size:.8rem;font-weight:700;color:rgb(var(--ax-sys-color-on-lightest-surface))}.axp-kpi-segmented .__legend-label{font-size:.78rem;color:rgb(var(--ax-sys-color-on-light-surface));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
2144
2602
  }] });
2145
2603
 
2146
2604
  var kpiSegmentedWidget_component = /*#__PURE__*/Object.freeze({
@@ -2149,8 +2607,9 @@ var kpiSegmentedWidget_component = /*#__PURE__*/Object.freeze({
2149
2607
  });
2150
2608
 
2151
2609
  const AXPKpiSegmentedWidget = {
2152
- name: 'kpi-segmented',
2153
- title: createMultiLanguageString('KPI + Segmented Breakdown', 'شاخص کلیدی + تفکیک بخش‌بندی'),
2610
+ name: RootConfig.widgets.kpiSegmented,
2611
+ title: '@dashboard:widgets.kpi-segmented.widget-title',
2612
+ description: '@dashboard:widgets.kpi-segmented.widget-description',
2154
2613
  categories: [AXP_WIDGETS_CHART_CATEGORY],
2155
2614
  groups: [AXPWidgetGroupEnum.DashboardWidget],
2156
2615
  type: 'dashboard',
@@ -2181,6 +2640,9 @@ const AXPKpiSegmentedWidget = {
2181
2640
  },
2182
2641
  },
2183
2642
  meta: {
2643
+ title: {
2644
+ visible: false,
2645
+ },
2184
2646
  dimensions: {
2185
2647
  lg: {
2186
2648
  width: 4,
@@ -2202,42 +2664,478 @@ const AXPKpiSegmentedWidget = {
2202
2664
  },
2203
2665
  };
2204
2666
 
2205
- class AXPKpiDetailsWidgetViewComponent extends AXPBaseWidgetComponent {
2667
+ class AXPKpiDetailsWidgetViewComponent extends AXPDashboardWidgetComponent {
2206
2668
  constructor() {
2207
2669
  super(...arguments);
2208
2670
  this.dataService = inject(AXPDataSourceDefinitionProviderService);
2209
2671
  this.translationService = inject(AXTranslationService);
2210
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
2211
2672
  this.model = signal({
2212
2673
  title: 'KPI',
2213
2674
  value: 0,
2214
- subtitle: '',
2215
- details: [],
2675
+ subtitle: '',
2676
+ details: [],
2677
+ }, ...(ngDevMode ? [{ debugName: "model" }] : /* istanbul ignore next */ []));
2678
+ this.localized = signal({
2679
+ title: 'KPI',
2680
+ subtitle: '',
2681
+ valuePrefix: '',
2682
+ valueSuffix: '',
2683
+ }, ...(ngDevMode ? [{ debugName: "localized" }] : /* istanbul ignore next */ []));
2684
+ this.detailItems = signal([], ...(ngDevMode ? [{ debugName: "detailItems" }] : /* istanbul ignore next */ []));
2685
+ this.dataSource = computed(() => this.options()['dataSource'], ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
2686
+ this.formattedValue = computed(() => this.formatValue(this.model().value, this.model().format), ...(ngDevMode ? [{ debugName: "formattedValue" }] : /* istanbul ignore next */ []));
2687
+ this.optionsEffect = effect(() => {
2688
+ const raw = this.options();
2689
+ this.model.update((current) => ({ ...current, ...raw }));
2690
+ }, ...(ngDevMode ? [{ debugName: "optionsEffect" }] : /* istanbul ignore next */ []));
2691
+ this.localizationEffect = effect(() => {
2692
+ const model = this.model();
2693
+ void Promise.all([
2694
+ this.resolveText(model.title),
2695
+ this.resolveText(model.subtitle),
2696
+ this.resolveText(model.valuePrefix),
2697
+ this.resolveText(model.valueSuffix),
2698
+ this.resolveDetails(model.details),
2699
+ ]).then(([title, subtitle, valuePrefix, valueSuffix, details]) => {
2700
+ this.localized.set({ title, subtitle, valuePrefix, valueSuffix });
2701
+ this.detailItems.set(details);
2702
+ });
2703
+ }, ...(ngDevMode ? [{ debugName: "localizationEffect" }] : /* istanbul ignore next */ []));
2704
+ this.dataLoadEffect = effect(async () => {
2705
+ const ds = this.dataSource();
2706
+ if (!ds) {
2707
+ return;
2708
+ }
2709
+ const result = await this.dataService.get(ds);
2710
+ if (!result) {
2711
+ return;
2712
+ }
2713
+ const source = result.source();
2714
+ const page = await source.config.load({ take: 1, skip: 0, sort: [] });
2715
+ const item = (page.items?.[0] ?? {});
2716
+ this.model.update((current) => ({ ...current, ...item }));
2717
+ }, ...(ngDevMode ? [{ debugName: "dataLoadEffect" }] : /* istanbul ignore next */ []));
2718
+ }
2719
+ trackByLabel(_, item) {
2720
+ return item.label;
2721
+ }
2722
+ async resolveDetails(items = []) {
2723
+ return Promise.all(items.map(async (item) => ({
2724
+ label: await this.resolveText(item.label),
2725
+ value: await this.resolveText(item.value),
2726
+ color: item.color,
2727
+ })));
2728
+ }
2729
+ async resolveText(value) {
2730
+ if (value == null) {
2731
+ return '';
2732
+ }
2733
+ if (typeof value === 'string') {
2734
+ return value.startsWith('@') ? this.translationService.translateAsync(value) : value;
2735
+ }
2736
+ if (typeof value === 'object' &&
2737
+ !Array.isArray(value) &&
2738
+ this.translationService.isValidMultiLanguageObject(value)) {
2739
+ return this.translationService.resolve(value);
2740
+ }
2741
+ return String(value);
2742
+ }
2743
+ formatValue(value, format) {
2744
+ if (value == null || value === '') {
2745
+ return '';
2746
+ }
2747
+ if (typeof value !== 'number' || !format?.style) {
2748
+ return String(value);
2749
+ }
2750
+ return new Intl.NumberFormat(undefined, {
2751
+ style: format.style,
2752
+ currency: format.currency,
2753
+ minimumFractionDigits: format.minimumFractionDigits,
2754
+ maximumFractionDigits: format.maximumFractionDigits,
2755
+ }).format(value);
2756
+ }
2757
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKpiDetailsWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2758
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPKpiDetailsWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-kpi-details\">\n <div class=\"__title\">{{ localized().title }}</div>\n <div class=\"__value\">\n {{ localized().valuePrefix }}{{ formattedValue() }}{{ localized().valueSuffix }}\n </div>\n @if (localized().subtitle) {\n <div class=\"__subtitle\">{{ localized().subtitle }}</div>\n }\n\n <div class=\"__items\">\n @for (item of detailItems(); track trackByLabel($index, item)) {\n <div class=\"__item\">\n <span class=\"__item-label\">{{ item.label }}</span>\n <span class=\"__item-value\" [style.color]=\"item.color || 'rgb(var(--ax-sys-color-on-lightest-surface))'\">{{ item.value }}</span>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.axp-kpi-details{display:flex;flex-direction:column;gap:.55rem;height:100%;padding:.75rem}.axp-kpi-details .__title{font-size:.9rem;font-weight:600;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-details .__value{font-size:clamp(1.45rem,3.5cqw,2.2rem);font-weight:700;color:rgb(var(--ax-sys-color-on-lightest-surface));line-height:1.1}.axp-kpi-details .__subtitle{font-size:.8rem;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-details .__items{margin-top:auto;display:flex;flex-direction:column;gap:.3rem;padding-top:.3rem;border-top:1px solid rgb(var(--ax-sys-color-border-lighter-surface))}.axp-kpi-details .__item{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.axp-kpi-details .__item-label{font-size:.78rem;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-details .__item-value{font-size:.8rem;font-weight:700;color:rgb(var(--ax-sys-color-on-lightest-surface))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2759
+ }
2760
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKpiDetailsWidgetViewComponent, decorators: [{
2761
+ type: Component,
2762
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axp-kpi-details\">\n <div class=\"__title\">{{ localized().title }}</div>\n <div class=\"__value\">\n {{ localized().valuePrefix }}{{ formattedValue() }}{{ localized().valueSuffix }}\n </div>\n @if (localized().subtitle) {\n <div class=\"__subtitle\">{{ localized().subtitle }}</div>\n }\n\n <div class=\"__items\">\n @for (item of detailItems(); track trackByLabel($index, item)) {\n <div class=\"__item\">\n <span class=\"__item-label\">{{ item.label }}</span>\n <span class=\"__item-value\" [style.color]=\"item.color || 'rgb(var(--ax-sys-color-on-lightest-surface))'\">{{ item.value }}</span>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.axp-kpi-details{display:flex;flex-direction:column;gap:.55rem;height:100%;padding:.75rem}.axp-kpi-details .__title{font-size:.9rem;font-weight:600;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-details .__value{font-size:clamp(1.45rem,3.5cqw,2.2rem);font-weight:700;color:rgb(var(--ax-sys-color-on-lightest-surface));line-height:1.1}.axp-kpi-details .__subtitle{font-size:.8rem;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-details .__items{margin-top:auto;display:flex;flex-direction:column;gap:.3rem;padding-top:.3rem;border-top:1px solid rgb(var(--ax-sys-color-border-lighter-surface))}.axp-kpi-details .__item{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.axp-kpi-details .__item-label{font-size:.78rem;color:rgb(var(--ax-sys-color-on-light-surface))}.axp-kpi-details .__item-value{font-size:.8rem;font-weight:700;color:rgb(var(--ax-sys-color-on-lightest-surface))}\n"] }]
2763
+ }] });
2764
+
2765
+ var kpiDetailsWidget_component = /*#__PURE__*/Object.freeze({
2766
+ __proto__: null,
2767
+ AXPKpiDetailsWidgetViewComponent: AXPKpiDetailsWidgetViewComponent
2768
+ });
2769
+
2770
+ const AXPKpiDetailsWidget = {
2771
+ name: RootConfig.widgets.kpiDetails,
2772
+ title: '@dashboard:widgets.kpi-details.widget-title',
2773
+ description: '@dashboard:widgets.kpi-details.widget-description',
2774
+ categories: [AXP_WIDGETS_CHART_CATEGORY],
2775
+ groups: [AXPWidgetGroupEnum.DashboardWidget],
2776
+ type: 'dashboard',
2777
+ icon: 'fa-light fa-square-list',
2778
+ properties: [
2779
+ AXP_DATA_SOURCE_OPTIONS_PROPERTY,
2780
+ cloneProperty(AXP_NAME_PROPERTY, { visible: false }),
2781
+ cloneProperty(AXP_DATA_PATH_PROPERTY, { visible: false }),
2782
+ {
2783
+ name: 'title',
2784
+ title: '@dashboard:widgets.kpi-details.title',
2785
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2786
+ schema: {
2787
+ defaultValue: '',
2788
+ dataType: 'string',
2789
+ interface: {
2790
+ name: 'title',
2791
+ path: 'options.title',
2792
+ type: AXPWidgetsCatalog.text,
2793
+ },
2794
+ },
2795
+ visible: true,
2796
+ },
2797
+ {
2798
+ name: 'value',
2799
+ title: '@dashboard:widgets.kpi-details.value',
2800
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2801
+ schema: {
2802
+ defaultValue: 0,
2803
+ dataType: 'number',
2804
+ interface: {
2805
+ name: 'value',
2806
+ path: 'options.value',
2807
+ type: AXPWidgetsCatalog.number,
2808
+ },
2809
+ },
2810
+ visible: true,
2811
+ },
2812
+ {
2813
+ name: 'subtitle',
2814
+ title: '@dashboard:widgets.kpi-details.subtitle',
2815
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2816
+ schema: {
2817
+ defaultValue: '',
2818
+ dataType: 'string',
2819
+ interface: {
2820
+ name: 'subtitle',
2821
+ path: 'options.subtitle',
2822
+ type: AXPWidgetsCatalog.text,
2823
+ },
2824
+ },
2825
+ visible: true,
2826
+ },
2827
+ ],
2828
+ components: {
2829
+ view: {
2830
+ component: () => Promise.resolve().then(function () { return kpiDetailsWidget_component; }).then((c) => c.AXPKpiDetailsWidgetViewComponent),
2831
+ },
2832
+ },
2833
+ meta: {
2834
+ title: {
2835
+ visible: false,
2836
+ },
2837
+ dimensions: {
2838
+ lg: {
2839
+ width: 4,
2840
+ height: 4,
2841
+ minWidth: 3,
2842
+ minHeight: 2,
2843
+ },
2844
+ md: {
2845
+ width: 4,
2846
+ height: 3,
2847
+ minWidth: 3,
2848
+ minHeight: 2,
2849
+ },
2850
+ sm: {
2851
+ height: 3,
2852
+ minHeight: 2,
2853
+ },
2854
+ },
2855
+ },
2856
+ };
2857
+
2858
+ const ICON_TONE_OPTIONS = ['primary', 'secondary', 'success', 'warning', 'info', 'danger'];
2859
+ const TREND_STATUS_OPTIONS = ['success', 'danger', 'neutral'];
2860
+ const TITLE_BADGE_TONE_OPTIONS = ['primary', 'secondary', 'warning', 'info', 'neutral'];
2861
+ const AXPKpiStatCardWidget = {
2862
+ name: RootConfig.widgets.kpiStatCard,
2863
+ title: '@dashboard:widgets.kpi-stat-card.widget-title',
2864
+ description: '@dashboard:widgets.kpi-stat-card.widget-description',
2865
+ categories: [AXP_WIDGETS_CHART_CATEGORY],
2866
+ groups: [AXPWidgetGroupEnum.DashboardWidget],
2867
+ type: 'dashboard',
2868
+ icon: 'fa-light fa-gauge-high',
2869
+ properties: [
2870
+ AXP_DATA_SOURCE_OPTIONS_PROPERTY,
2871
+ cloneProperty(AXP_NAME_PROPERTY, { visible: false }),
2872
+ cloneProperty(AXP_DATA_PATH_PROPERTY, { visible: false }),
2873
+ {
2874
+ name: 'title',
2875
+ title: '@dashboard:widgets.kpi-stat-card.title',
2876
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2877
+ schema: {
2878
+ defaultValue: '',
2879
+ dataType: 'string',
2880
+ interface: {
2881
+ name: 'title',
2882
+ path: 'options.title',
2883
+ type: AXPWidgetsCatalog.text,
2884
+ },
2885
+ },
2886
+ visible: true,
2887
+ },
2888
+ {
2889
+ name: 'titleBadgeText',
2890
+ title: '@dashboard:widgets.kpi-stat-card.title-badge-text',
2891
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2892
+ schema: {
2893
+ defaultValue: '',
2894
+ dataType: 'string',
2895
+ interface: {
2896
+ name: 'titleBadgeText',
2897
+ path: 'options.titleBadgeText',
2898
+ type: AXPWidgetsCatalog.text,
2899
+ },
2900
+ },
2901
+ visible: true,
2902
+ },
2903
+ {
2904
+ name: 'titleBadgeTone',
2905
+ title: '@dashboard:widgets.kpi-stat-card.title-badge-tone',
2906
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2907
+ schema: {
2908
+ defaultValue: 'warning',
2909
+ dataType: 'string',
2910
+ interface: {
2911
+ name: 'titleBadgeTone',
2912
+ path: 'options.titleBadgeTone',
2913
+ type: AXPWidgetsCatalog.select,
2914
+ options: { dataSource: TITLE_BADGE_TONE_OPTIONS },
2915
+ },
2916
+ },
2917
+ visible: true,
2918
+ },
2919
+ {
2920
+ name: 'value',
2921
+ title: '@dashboard:widgets.kpi-stat-card.value',
2922
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2923
+ schema: {
2924
+ defaultValue: 0,
2925
+ dataType: 'number',
2926
+ interface: {
2927
+ name: 'value',
2928
+ path: 'options.value',
2929
+ type: AXPWidgetsCatalog.number,
2930
+ },
2931
+ },
2932
+ visible: true,
2933
+ },
2934
+ {
2935
+ name: 'valuePrefix',
2936
+ title: '@dashboard:widgets.kpi-stat-card.value-prefix',
2937
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2938
+ schema: {
2939
+ defaultValue: '',
2940
+ dataType: 'string',
2941
+ interface: {
2942
+ name: 'valuePrefix',
2943
+ path: 'options.valuePrefix',
2944
+ type: AXPWidgetsCatalog.text,
2945
+ },
2946
+ },
2947
+ visible: true,
2948
+ },
2949
+ {
2950
+ name: 'valueSuffix',
2951
+ title: '@dashboard:widgets.kpi-stat-card.value-suffix',
2952
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2953
+ schema: {
2954
+ defaultValue: '',
2955
+ dataType: 'string',
2956
+ interface: {
2957
+ name: 'valueSuffix',
2958
+ path: 'options.valueSuffix',
2959
+ type: AXPWidgetsCatalog.text,
2960
+ },
2961
+ },
2962
+ visible: true,
2963
+ },
2964
+ {
2965
+ name: 'trendValue',
2966
+ title: '@dashboard:widgets.kpi-stat-card.trend-value',
2967
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2968
+ schema: {
2969
+ defaultValue: '',
2970
+ dataType: 'string',
2971
+ interface: {
2972
+ name: 'trendValue',
2973
+ path: 'options.trendValue',
2974
+ type: AXPWidgetsCatalog.text,
2975
+ },
2976
+ },
2977
+ visible: true,
2978
+ },
2979
+ {
2980
+ name: 'trendLabel',
2981
+ title: '@dashboard:widgets.kpi-stat-card.trend-label',
2982
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2983
+ schema: {
2984
+ defaultValue: '',
2985
+ dataType: 'string',
2986
+ interface: {
2987
+ name: 'trendLabel',
2988
+ path: 'options.trendLabel',
2989
+ type: AXPWidgetsCatalog.text,
2990
+ },
2991
+ },
2992
+ visible: true,
2993
+ },
2994
+ {
2995
+ name: 'trendStatus',
2996
+ title: '@dashboard:widgets.kpi-stat-card.trend-status',
2997
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
2998
+ schema: {
2999
+ defaultValue: 'neutral',
3000
+ dataType: 'string',
3001
+ interface: {
3002
+ name: 'trendStatus',
3003
+ path: 'options.trendStatus',
3004
+ type: AXPWidgetsCatalog.select,
3005
+ options: { dataSource: TREND_STATUS_OPTIONS },
3006
+ },
3007
+ },
3008
+ visible: true,
3009
+ },
3010
+ {
3011
+ name: 'icon',
3012
+ title: '@dashboard:widgets.kpi-stat-card.icon',
3013
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
3014
+ schema: {
3015
+ defaultValue: 'fa-light fa-chart-line',
3016
+ dataType: 'string',
3017
+ interface: {
3018
+ name: 'icon',
3019
+ path: 'options.icon',
3020
+ type: AXPWidgetsCatalog.text,
3021
+ },
3022
+ },
3023
+ visible: true,
3024
+ },
3025
+ {
3026
+ name: 'iconTone',
3027
+ title: '@dashboard:widgets.kpi-stat-card.icon-tone',
3028
+ group: AXP_APPEARANCE_PROPERTY_GROUP,
3029
+ schema: {
3030
+ defaultValue: 'primary',
3031
+ dataType: 'string',
3032
+ interface: {
3033
+ name: 'iconTone',
3034
+ path: 'options.iconTone',
3035
+ type: AXPWidgetsCatalog.select,
3036
+ options: { dataSource: ICON_TONE_OPTIONS },
3037
+ },
3038
+ },
3039
+ visible: true,
3040
+ },
3041
+ ],
3042
+ components: {
3043
+ view: {
3044
+ component: () => Promise.resolve().then(function () { return kpiStatCardWidget_component; }).then((c) => c.AXPKpiStatCardWidgetViewComponent),
3045
+ },
3046
+ },
3047
+ meta: {
3048
+ title: { visible: false },
3049
+ dimensions: {
3050
+ lg: { width: 3, height: 3, minWidth: 2, minHeight: 2 },
3051
+ md: { width: 3, height: 3, minWidth: 2, minHeight: 2 },
3052
+ sm: { height: 3, minHeight: 2 },
3053
+ },
3054
+ },
3055
+ };
3056
+
3057
+ //#endregion
3058
+ class AXPKpiStatCardWidgetViewComponent extends AXPDashboardWidgetComponent {
3059
+ constructor() {
3060
+ super(...arguments);
3061
+ //#region ---- Services & Dependencies ----
3062
+ this.dataService = inject(AXPDataSourceDefinitionProviderService);
3063
+ this.translationService = inject(AXTranslationService);
3064
+ //#endregion
3065
+ //#region ---- State ----
3066
+ this.model = signal({
3067
+ title: 'KPI',
3068
+ value: 0,
3069
+ trendStatus: 'neutral',
3070
+ icon: 'fa-light fa-chart-line',
3071
+ iconTone: 'primary',
2216
3072
  }, ...(ngDevMode ? [{ debugName: "model" }] : /* istanbul ignore next */ []));
2217
3073
  this.localized = signal({
2218
- title: 'KPI',
2219
- subtitle: '',
3074
+ title: '',
2220
3075
  valuePrefix: '',
2221
3076
  valueSuffix: '',
3077
+ titleBadgeText: '',
3078
+ trendValue: '',
3079
+ trendLabel: '',
2222
3080
  }, ...(ngDevMode ? [{ debugName: "localized" }] : /* istanbul ignore next */ []));
2223
- this.detailItems = signal([], ...(ngDevMode ? [{ debugName: "detailItems" }] : /* istanbul ignore next */ []));
2224
3081
  this.dataSource = computed(() => this.options()['dataSource'], ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
3082
+ //#endregion
3083
+ //#region ---- Computed ----
2225
3084
  this.formattedValue = computed(() => this.formatValue(this.model().value, this.model().format), ...(ngDevMode ? [{ debugName: "formattedValue" }] : /* istanbul ignore next */ []));
3085
+ this.iconClass = computed(() => this.model().icon || 'fa-light fa-chart-line', ...(ngDevMode ? [{ debugName: "iconClass" }] : /* istanbul ignore next */ []));
3086
+ this.iconHostClasses = computed(() => {
3087
+ const tone = (this.model().iconTone ?? 'primary');
3088
+ return {
3089
+ 'axp-kpi-stat-card__icon-box': true,
3090
+ 'axp-kpi-stat-card__icon-box--primary': tone === 'primary',
3091
+ 'axp-kpi-stat-card__icon-box--secondary': tone === 'secondary',
3092
+ 'axp-kpi-stat-card__icon-box--success': tone === 'success',
3093
+ 'axp-kpi-stat-card__icon-box--warning': tone === 'warning',
3094
+ 'axp-kpi-stat-card__icon-box--info': tone === 'info',
3095
+ 'axp-kpi-stat-card__icon-box--danger': tone === 'danger',
3096
+ };
3097
+ }, ...(ngDevMode ? [{ debugName: "iconHostClasses" }] : /* istanbul ignore next */ []));
3098
+ this.titleBadgeClasses = computed(() => {
3099
+ const raw = this.model();
3100
+ const tone = (raw.titleBadgeTone ?? raw.titleBadge?.tone ?? 'warning');
3101
+ return {
3102
+ 'axp-kpi-stat-card__title-badge': true,
3103
+ 'axp-kpi-stat-card__title-badge--primary': tone === 'primary',
3104
+ 'axp-kpi-stat-card__title-badge--secondary': tone === 'secondary',
3105
+ 'axp-kpi-stat-card__title-badge--warning': tone === 'warning',
3106
+ 'axp-kpi-stat-card__title-badge--info': tone === 'info',
3107
+ 'axp-kpi-stat-card__title-badge--neutral': tone === 'neutral',
3108
+ };
3109
+ }, ...(ngDevMode ? [{ debugName: "titleBadgeClasses" }] : /* istanbul ignore next */ []));
3110
+ this.trendPillClasses = computed(() => {
3111
+ const s = (this.model().trendStatus ?? 'neutral');
3112
+ return {
3113
+ 'axp-kpi-stat-card__trend-pill': true,
3114
+ 'axp-kpi-stat-card__trend-pill--success': s === 'success',
3115
+ 'axp-kpi-stat-card__trend-pill--danger': s === 'danger',
3116
+ 'axp-kpi-stat-card__trend-pill--neutral': s === 'neutral',
3117
+ };
3118
+ }, ...(ngDevMode ? [{ debugName: "trendPillClasses" }] : /* istanbul ignore next */ []));
3119
+ //#endregion
3120
+ //#region ---- Effects ----
2226
3121
  this.optionsEffect = effect(() => {
2227
3122
  const raw = this.options();
2228
- this.model.update((current) => ({ ...current, ...raw }));
3123
+ this.model.update((current) => this.applyPatch(current, raw));
2229
3124
  }, ...(ngDevMode ? [{ debugName: "optionsEffect" }] : /* istanbul ignore next */ []));
2230
3125
  this.localizationEffect = effect(() => {
2231
- const model = this.model();
3126
+ const m = this.model();
3127
+ const badgeFromNested = m.titleBadge?.text;
3128
+ const badgeFlat = m.titleBadgeText;
3129
+ const badgeText = badgeFromNested ?? badgeFlat;
2232
3130
  void Promise.all([
2233
- this.resolveText(model.title),
2234
- this.resolveText(model.subtitle),
2235
- this.resolveText(model.valuePrefix),
2236
- this.resolveText(model.valueSuffix),
2237
- this.resolveDetails(model.details),
2238
- ]).then(([title, subtitle, valuePrefix, valueSuffix, details]) => {
2239
- this.localized.set({ title, subtitle, valuePrefix, valueSuffix });
2240
- this.detailItems.set(details);
3131
+ this.resolveText(m.title),
3132
+ this.resolveText(m.valuePrefix),
3133
+ this.resolveText(m.valueSuffix),
3134
+ this.resolveText(badgeText),
3135
+ this.resolveText(m.trendValue),
3136
+ this.resolveText(m.trendLabel),
3137
+ ]).then(([title, valuePrefix, valueSuffix, titleBadgeText, trendValue, trendLabel]) => {
3138
+ this.localized.set({ title, valuePrefix, valueSuffix, titleBadgeText, trendValue, trendLabel });
2241
3139
  });
2242
3140
  }, ...(ngDevMode ? [{ debugName: "localizationEffect" }] : /* istanbul ignore next */ []));
2243
3141
  this.dataLoadEffect = effect(async () => {
@@ -2252,18 +3150,29 @@ class AXPKpiDetailsWidgetViewComponent extends AXPBaseWidgetComponent {
2252
3150
  const source = result.source();
2253
3151
  const page = await source.config.load({ take: 1, skip: 0, sort: [] });
2254
3152
  const item = (page.items?.[0] ?? {});
2255
- this.model.update((current) => ({ ...current, ...item }));
3153
+ this.model.update((current) => this.applyPatch(current, item));
2256
3154
  }, ...(ngDevMode ? [{ debugName: "dataLoadEffect" }] : /* istanbul ignore next */ []));
2257
3155
  }
2258
- trackByLabel(_, item) {
2259
- return item.label;
2260
- }
2261
- async resolveDetails(items = []) {
2262
- return Promise.all(items.map(async (item) => ({
2263
- label: await this.resolveText(item.label),
2264
- value: await this.resolveText(item.value),
2265
- color: item.color,
2266
- })));
3156
+ //#endregion
3157
+ //#region ---- Helpers ----
3158
+ applyPatch(current, raw) {
3159
+ const next = { ...current, ...raw };
3160
+ if (raw.titleBadge && typeof raw.titleBadge === 'object') {
3161
+ next.titleBadgeText = raw.titleBadge.text;
3162
+ if (raw.titleBadge.tone != null) {
3163
+ next.titleBadgeTone = raw.titleBadge.tone;
3164
+ }
3165
+ }
3166
+ if (next.trendStatus == null) {
3167
+ next.trendStatus = 'neutral';
3168
+ }
3169
+ if (next.iconTone == null) {
3170
+ next.iconTone = 'primary';
3171
+ }
3172
+ if (!next.icon) {
3173
+ next.icon = 'fa-light fa-chart-line';
3174
+ }
3175
+ return next;
2267
3176
  }
2268
3177
  async resolveText(value) {
2269
3178
  if (value == null) {
@@ -2272,8 +3181,10 @@ class AXPKpiDetailsWidgetViewComponent extends AXPBaseWidgetComponent {
2272
3181
  if (typeof value === 'string') {
2273
3182
  return value.startsWith('@') ? this.translationService.translateAsync(value) : value;
2274
3183
  }
2275
- if (typeof value === 'object' && !Array.isArray(value) && this.mlResolver.isValidMultiLanguageObject(value)) {
2276
- return this.mlResolver.resolve(value);
3184
+ if (typeof value === 'object' &&
3185
+ !Array.isArray(value) &&
3186
+ this.translationService.isValidMultiLanguageObject(value)) {
3187
+ return this.translationService.resolve(value);
2277
3188
  }
2278
3189
  return String(value);
2279
3190
  }
@@ -2281,6 +3192,9 @@ class AXPKpiDetailsWidgetViewComponent extends AXPBaseWidgetComponent {
2281
3192
  if (value == null || value === '') {
2282
3193
  return '';
2283
3194
  }
3195
+ if (typeof value === 'string') {
3196
+ return value;
3197
+ }
2284
3198
  if (typeof value !== 'number' || !format?.style) {
2285
3199
  return String(value);
2286
3200
  }
@@ -2291,103 +3205,19 @@ class AXPKpiDetailsWidgetViewComponent extends AXPBaseWidgetComponent {
2291
3205
  maximumFractionDigits: format.maximumFractionDigits,
2292
3206
  }).format(value);
2293
3207
  }
2294
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKpiDetailsWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2295
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPKpiDetailsWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"kpi-details\">\n <div class=\"kpi-details__title\">{{ localized().title }}</div>\n <div class=\"kpi-details__value\">\n {{ localized().valuePrefix }}{{ formattedValue() }}{{ localized().valueSuffix }}\n </div>\n @if (localized().subtitle) {\n <div class=\"kpi-details__subtitle\">{{ localized().subtitle }}</div>\n }\n\n <div class=\"kpi-details__items\">\n @for (item of detailItems(); track trackByLabel($index, item)) {\n <div class=\"kpi-details__item\">\n <span class=\"kpi-details__item-label\">{{ item.label }}</span>\n <span class=\"kpi-details__item-value\" [style.color]=\"item.color || 'var(--ax-text-color)'\">{{ item.value }}</span>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.kpi-details{display:flex;flex-direction:column;gap:.75rem;padding:.5rem}.kpi-details__title{font-size:1.25rem;color:var(--ax-text-muted)}.kpi-details__value{font-size:2.5rem;font-weight:700;color:var(--ax-text-color);line-height:1.1}.kpi-details__subtitle{font-size:1rem;color:var(--ax-primary-color, var(--ax-text-color))}.kpi-details__items{display:flex;flex-direction:column;gap:.375rem}.kpi-details__item{display:flex;justify-content:space-between;gap:1rem}.kpi-details__item-label{color:var(--ax-text-muted)}.kpi-details__item-value{font-weight:600}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3208
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKpiStatCardWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
3209
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPKpiStatCardWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-kpi-stat-card\">\n <div class=\"axp-kpi-stat-card__content\">\n <div class=\"axp-kpi-stat-card__head\">\n <div class=\"axp-kpi-stat-card__title-row\">\n <span class=\"axp-kpi-stat-card__title\">{{ localized().title }}</span>\n @if (localized().titleBadgeText) {\n <span [class]=\"titleBadgeClasses()\">\n {{ localized().titleBadgeText }}\n </span>\n }\n </div>\n <div [class]=\"iconHostClasses()\" role=\"img\" [attr.aria-label]=\"localized().title\">\n <i [class]=\"iconClass()\" aria-hidden=\"true\"></i>\n </div>\n </div>\n\n <div class=\"axp-kpi-stat-card__value\">\n {{ localized().valuePrefix }}{{ formattedValue() }}{{ localized().valueSuffix }}\n </div>\n\n @if (localized().trendValue || localized().trendLabel) {\n <div class=\"axp-kpi-stat-card__trend\">\n <p class=\"axp-kpi-stat-card__trend-line\">\n @if (localized().trendValue) {\n <span [class]=\"trendPillClasses()\">\n {{ localized().trendValue }}\n </span>\n }\n @if (localized().trendLabel) {\n <span class=\"axp-kpi-stat-card__trend-label\">{{ localized().trendLabel }}</span>\n }\n </p>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;height:100%;min-height:0px;width:100%;-webkit-font-smoothing:antialiased;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1))}.axp-kpi-stat-card{container-type:inline-size;container-name:kpi-stat;display:flex;height:100%;min-height:0px;width:100%;flex-direction:column;align-items:stretch;justify-content:center;box-sizing:border-box;padding:.75rem .875rem;border-width:1px;border-style:solid;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));border-radius:.5rem;--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)}.axp-kpi-stat-card__content{display:flex;width:100%;flex-direction:column;align-items:stretch;gap:.375rem}.axp-kpi-stat-card__head{display:flex;flex:none;align-items:flex-start;justify-content:space-between;column-gap:.875rem;row-gap:.375rem}.axp-kpi-stat-card__title-row{display:flex;min-width:0px;flex:1 1 0%;flex-wrap:wrap;align-items:center;column-gap:.375rem;row-gap:.25rem;padding-top:1px}.axp-kpi-stat-card__title{font-size:.75rem;line-height:1rem;font-weight:600;line-height:1.375;letter-spacing:.025em;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-surface),var(--tw-text-opacity, 1))}.axp-kpi-stat-card__title-badge{box-sizing:border-box;display:inline-flex;align-items:center;min-height:1.25rem;border-radius:.375rem;padding:.25rem .625rem;font-size:.65rem;font-weight:800;text-transform:uppercase;line-height:1;letter-spacing:.1em;border-width:1px;border-style:solid}.axp-kpi-stat-card__title-badge--primary{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-primary-200),var(--tw-border-opacity, 1));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-800),var(--tw-text-opacity, 1));background-color:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface));border-color:rgb(var(--ax-sys-color-border-primary-lightest-surface))}.axp-kpi-stat-card__title-badge--secondary{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-surface),var(--tw-border-opacity, 1));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));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-surface),var(--tw-text-opacity, 1))}.axp-kpi-stat-card__title-badge--warning{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-warning-200),var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-warning-50),var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-warning-800),var(--tw-text-opacity, 1))}.axp-kpi-stat-card__title-badge--info{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-primary-200),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface));border-color:rgb(var(--ax-sys-color-border-primary-lightest-surface));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-800),var(--tw-text-opacity, 1))}.axp-kpi-stat-card__title-badge--neutral{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-surface),var(--tw-border-opacity, 1));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));--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.axp-kpi-stat-card__icon-box{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;border-radius:.5rem;font-size:1rem;line-height:1.5rem;line-height:1}.axp-kpi-stat-card__icon-box--primary{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-700),var(--tw-text-opacity, 1));background-color:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface));border-color:rgb(var(--ax-sys-color-border-primary-lightest-surface));border-width:1px;border-color:rgba(var(--ax-sys-color-primary-200),.5)}.axp-kpi-stat-card__icon-box--secondary{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1));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));border-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-surface),var(--tw-border-opacity, 1))}.axp-kpi-stat-card__icon-box--success{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-success-50),var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-success-700),var(--tw-text-opacity, 1));border-width:1px;border-color:rgba(var(--ax-sys-color-success-200),.8)}.axp-kpi-stat-card__icon-box--warning{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-warning-50),var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-warning-700),var(--tw-text-opacity, 1));border-width:1px;border-color:rgba(var(--ax-sys-color-warning-200),.8)}.axp-kpi-stat-card__icon-box--info{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-700),var(--tw-text-opacity, 1));background-color:rgb(var(--ax-sys-color-primary-light-surface));color:rgb(var(--ax-sys-color-on-primary-light-surface));border-color:rgb(var(--ax-sys-color-border-primary-light-surface));border-width:1px;border-color:rgba(var(--ax-sys-color-primary-200),.7)}.axp-kpi-stat-card__icon-box--danger{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1));border-width:1px;border-color:#fecacacc}.axp-kpi-stat-card__value{margin:0;min-height:0px;flex:none;padding:0;text-align:start;font-weight:700;line-height:1.25;letter-spacing:-.025em;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1));--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-size:clamp(1.5rem,2.2cqw + 1rem,1.875rem)}.axp-kpi-stat-card__trend{margin:0;width:100%;flex:none;padding:0}.axp-kpi-stat-card__trend-line{margin:0;max-width:100%;padding:0;line-height:1.45}.axp-kpi-stat-card__trend-pill{box-sizing:border-box;display:inline-flex;align-items:center;vertical-align:middle;margin-inline-end:.375rem;margin-bottom:1px;min-height:1.4rem;border-radius:.375rem;padding:.25rem .625rem;font-size:.75rem;line-height:1rem;font-weight:700;line-height:1.25;border-width:1px;border-style:solid;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.axp-kpi-stat-card__trend-pill--success{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-success-50),var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-success-800),var(--tw-text-opacity, 1));border-color:rgba(var(--ax-sys-color-success-200),.9)}.axp-kpi-stat-card__trend-pill--danger{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1));border-color:#fecacae6}.axp-kpi-stat-card__trend-pill--neutral{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-surface),var(--tw-text-opacity, 1));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));--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-surface),var(--tw-border-opacity, 1))}.axp-kpi-stat-card__trend-label{display:inline;font-size:.6875rem;font-weight:500;line-height:1.375;letter-spacing:.025em;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2296
3210
  }
2297
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKpiDetailsWidgetViewComponent, decorators: [{
3211
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKpiStatCardWidgetViewComponent, decorators: [{
2298
3212
  type: Component,
2299
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"kpi-details\">\n <div class=\"kpi-details__title\">{{ localized().title }}</div>\n <div class=\"kpi-details__value\">\n {{ localized().valuePrefix }}{{ formattedValue() }}{{ localized().valueSuffix }}\n </div>\n @if (localized().subtitle) {\n <div class=\"kpi-details__subtitle\">{{ localized().subtitle }}</div>\n }\n\n <div class=\"kpi-details__items\">\n @for (item of detailItems(); track trackByLabel($index, item)) {\n <div class=\"kpi-details__item\">\n <span class=\"kpi-details__item-label\">{{ item.label }}</span>\n <span class=\"kpi-details__item-value\" [style.color]=\"item.color || 'var(--ax-text-color)'\">{{ item.value }}</span>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.kpi-details{display:flex;flex-direction:column;gap:.75rem;padding:.5rem}.kpi-details__title{font-size:1.25rem;color:var(--ax-text-muted)}.kpi-details__value{font-size:2.5rem;font-weight:700;color:var(--ax-text-color);line-height:1.1}.kpi-details__subtitle{font-size:1rem;color:var(--ax-primary-color, var(--ax-text-color))}.kpi-details__items{display:flex;flex-direction:column;gap:.375rem}.kpi-details__item{display:flex;justify-content:space-between;gap:1rem}.kpi-details__item-label{color:var(--ax-text-muted)}.kpi-details__item-value{font-weight:600}\n"] }]
3213
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axp-kpi-stat-card\">\n <div class=\"axp-kpi-stat-card__content\">\n <div class=\"axp-kpi-stat-card__head\">\n <div class=\"axp-kpi-stat-card__title-row\">\n <span class=\"axp-kpi-stat-card__title\">{{ localized().title }}</span>\n @if (localized().titleBadgeText) {\n <span [class]=\"titleBadgeClasses()\">\n {{ localized().titleBadgeText }}\n </span>\n }\n </div>\n <div [class]=\"iconHostClasses()\" role=\"img\" [attr.aria-label]=\"localized().title\">\n <i [class]=\"iconClass()\" aria-hidden=\"true\"></i>\n </div>\n </div>\n\n <div class=\"axp-kpi-stat-card__value\">\n {{ localized().valuePrefix }}{{ formattedValue() }}{{ localized().valueSuffix }}\n </div>\n\n @if (localized().trendValue || localized().trendLabel) {\n <div class=\"axp-kpi-stat-card__trend\">\n <p class=\"axp-kpi-stat-card__trend-line\">\n @if (localized().trendValue) {\n <span [class]=\"trendPillClasses()\">\n {{ localized().trendValue }}\n </span>\n }\n @if (localized().trendLabel) {\n <span class=\"axp-kpi-stat-card__trend-label\">{{ localized().trendLabel }}</span>\n }\n </p>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;height:100%;min-height:0px;width:100%;-webkit-font-smoothing:antialiased;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1))}.axp-kpi-stat-card{container-type:inline-size;container-name:kpi-stat;display:flex;height:100%;min-height:0px;width:100%;flex-direction:column;align-items:stretch;justify-content:center;box-sizing:border-box;padding:.75rem .875rem;border-width:1px;border-style:solid;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-surface),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));border-radius:.5rem;--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)}.axp-kpi-stat-card__content{display:flex;width:100%;flex-direction:column;align-items:stretch;gap:.375rem}.axp-kpi-stat-card__head{display:flex;flex:none;align-items:flex-start;justify-content:space-between;column-gap:.875rem;row-gap:.375rem}.axp-kpi-stat-card__title-row{display:flex;min-width:0px;flex:1 1 0%;flex-wrap:wrap;align-items:center;column-gap:.375rem;row-gap:.25rem;padding-top:1px}.axp-kpi-stat-card__title{font-size:.75rem;line-height:1rem;font-weight:600;line-height:1.375;letter-spacing:.025em;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-surface),var(--tw-text-opacity, 1))}.axp-kpi-stat-card__title-badge{box-sizing:border-box;display:inline-flex;align-items:center;min-height:1.25rem;border-radius:.375rem;padding:.25rem .625rem;font-size:.65rem;font-weight:800;text-transform:uppercase;line-height:1;letter-spacing:.1em;border-width:1px;border-style:solid}.axp-kpi-stat-card__title-badge--primary{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-primary-200),var(--tw-border-opacity, 1));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-800),var(--tw-text-opacity, 1));background-color:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface));border-color:rgb(var(--ax-sys-color-border-primary-lightest-surface))}.axp-kpi-stat-card__title-badge--secondary{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-surface),var(--tw-border-opacity, 1));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));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-surface),var(--tw-text-opacity, 1))}.axp-kpi-stat-card__title-badge--warning{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-warning-200),var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-warning-50),var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-warning-800),var(--tw-text-opacity, 1))}.axp-kpi-stat-card__title-badge--info{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-primary-200),var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface));border-color:rgb(var(--ax-sys-color-border-primary-lightest-surface));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-800),var(--tw-text-opacity, 1))}.axp-kpi-stat-card__title-badge--neutral{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-surface),var(--tw-border-opacity, 1));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));--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.axp-kpi-stat-card__icon-box{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;border-radius:.5rem;font-size:1rem;line-height:1.5rem;line-height:1}.axp-kpi-stat-card__icon-box--primary{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-700),var(--tw-text-opacity, 1));background-color:rgb(var(--ax-sys-color-primary-lightest-surface));color:rgb(var(--ax-sys-color-on-primary-lightest-surface));border-color:rgb(var(--ax-sys-color-border-primary-lightest-surface));border-width:1px;border-color:rgba(var(--ax-sys-color-primary-200),.5)}.axp-kpi-stat-card__icon-box--secondary{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1));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));border-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-surface),var(--tw-border-opacity, 1))}.axp-kpi-stat-card__icon-box--success{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-success-50),var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-success-700),var(--tw-text-opacity, 1));border-width:1px;border-color:rgba(var(--ax-sys-color-success-200),.8)}.axp-kpi-stat-card__icon-box--warning{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-warning-50),var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-warning-700),var(--tw-text-opacity, 1));border-width:1px;border-color:rgba(var(--ax-sys-color-warning-200),.8)}.axp-kpi-stat-card__icon-box--info{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-700),var(--tw-text-opacity, 1));background-color:rgb(var(--ax-sys-color-primary-light-surface));color:rgb(var(--ax-sys-color-on-primary-light-surface));border-color:rgb(var(--ax-sys-color-border-primary-light-surface));border-width:1px;border-color:rgba(var(--ax-sys-color-primary-200),.7)}.axp-kpi-stat-card__icon-box--danger{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1));border-width:1px;border-color:#fecacacc}.axp-kpi-stat-card__value{margin:0;min-height:0px;flex:none;padding:0;text-align:start;font-weight:700;line-height:1.25;letter-spacing:-.025em;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1));--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);font-size:clamp(1.5rem,2.2cqw + 1rem,1.875rem)}.axp-kpi-stat-card__trend{margin:0;width:100%;flex:none;padding:0}.axp-kpi-stat-card__trend-line{margin:0;max-width:100%;padding:0;line-height:1.45}.axp-kpi-stat-card__trend-pill{box-sizing:border-box;display:inline-flex;align-items:center;vertical-align:middle;margin-inline-end:.375rem;margin-bottom:1px;min-height:1.4rem;border-radius:.375rem;padding:.25rem .625rem;font-size:.75rem;line-height:1rem;font-weight:700;line-height:1.25;border-width:1px;border-style:solid;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.axp-kpi-stat-card__trend-pill--success{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-success-50),var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-success-800),var(--tw-text-opacity, 1));border-color:rgba(var(--ax-sys-color-success-200),.9)}.axp-kpi-stat-card__trend-pill--danger{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1));border-color:#fecacae6}.axp-kpi-stat-card__trend-pill--neutral{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-surface),var(--tw-text-opacity, 1));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));--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-surface),var(--tw-border-opacity, 1))}.axp-kpi-stat-card__trend-label{display:inline;font-size:.6875rem;font-weight:500;line-height:1.375;letter-spacing:.025em;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}\n"] }]
2300
3214
  }] });
2301
3215
 
2302
- var kpiDetailsWidget_component = /*#__PURE__*/Object.freeze({
3216
+ var kpiStatCardWidget_component = /*#__PURE__*/Object.freeze({
2303
3217
  __proto__: null,
2304
- AXPKpiDetailsWidgetViewComponent: AXPKpiDetailsWidgetViewComponent
3218
+ AXPKpiStatCardWidgetViewComponent: AXPKpiStatCardWidgetViewComponent
2305
3219
  });
2306
3220
 
2307
- const AXPKpiDetailsWidget = {
2308
- name: 'kpi-details',
2309
- title: createMultiLanguageString('KPI + Details', 'شاخص کلیدی + جزئیات'),
2310
- categories: [AXP_WIDGETS_CHART_CATEGORY],
2311
- groups: [AXPWidgetGroupEnum.DashboardWidget],
2312
- type: 'dashboard',
2313
- icon: 'fa-light fa-square-list',
2314
- properties: [
2315
- AXP_DATA_SOURCE_OPTIONS_PROPERTY,
2316
- cloneProperty(AXP_NAME_PROPERTY, { visible: false }),
2317
- cloneProperty(AXP_DATA_PATH_PROPERTY, { visible: false }),
2318
- {
2319
- name: 'title',
2320
- title: '@dashboard:widgets.kpi-details.title',
2321
- group: AXP_APPEARANCE_PROPERTY_GROUP,
2322
- schema: {
2323
- defaultValue: '',
2324
- dataType: 'string',
2325
- interface: {
2326
- name: 'title',
2327
- path: 'options.title',
2328
- type: AXPWidgetsCatalog.text,
2329
- },
2330
- },
2331
- visible: true,
2332
- },
2333
- {
2334
- name: 'value',
2335
- title: '@dashboard:widgets.kpi-details.value',
2336
- group: AXP_APPEARANCE_PROPERTY_GROUP,
2337
- schema: {
2338
- defaultValue: 0,
2339
- dataType: 'number',
2340
- interface: {
2341
- name: 'value',
2342
- path: 'options.value',
2343
- type: AXPWidgetsCatalog.number,
2344
- },
2345
- },
2346
- visible: true,
2347
- },
2348
- {
2349
- name: 'subtitle',
2350
- title: '@dashboard:widgets.kpi-details.subtitle',
2351
- group: AXP_APPEARANCE_PROPERTY_GROUP,
2352
- schema: {
2353
- defaultValue: '',
2354
- dataType: 'string',
2355
- interface: {
2356
- name: 'subtitle',
2357
- path: 'options.subtitle',
2358
- type: AXPWidgetsCatalog.text,
2359
- },
2360
- },
2361
- visible: true,
2362
- },
2363
- ],
2364
- components: {
2365
- view: {
2366
- component: () => Promise.resolve().then(function () { return kpiDetailsWidget_component; }).then((c) => c.AXPKpiDetailsWidgetViewComponent),
2367
- },
2368
- },
2369
- meta: {
2370
- dimensions: {
2371
- lg: {
2372
- width: 4,
2373
- height: 3,
2374
- minWidth: 3,
2375
- minHeight: 2,
2376
- },
2377
- md: {
2378
- width: 4,
2379
- height: 3,
2380
- minWidth: 3,
2381
- minHeight: 2,
2382
- },
2383
- sm: {
2384
- height: 3,
2385
- minHeight: 2,
2386
- },
2387
- },
2388
- },
2389
- };
2390
-
2391
3221
  /**
2392
3222
  * Abstract Weather API Service
2393
3223
  * Base class that defines the interface and common functionality
@@ -3213,11 +4043,11 @@ class AXMAdvancedWeatherViewComponent extends AXPValueWidgetComponent {
3213
4043
  <!-- No data state (not loading, no error) -->
3214
4044
  <div class="axp-weather-no-data-state">
3215
4045
  <i class="fa-solid fa-cloud-sun"></i>
3216
- <p>{{ 'weather.no-data' | translate: { scope: 'dashboard' } | async }}</p>
4046
+ <p>{{ 'weather.no-data.title' | translate: { scope: 'dashboard' } | async }}</p>
3217
4047
  <ax-button
3218
4048
  [look]="'outline'"
3219
4049
  [color]="'secondary'"
3220
- [text]="'weather.refresh-weather' | translate: { scope: 'dashboard' } | async"
4050
+ [text]="'widgets.weather.refresh-weather' | translate: { scope: 'dashboard' } | async"
3221
4051
  (onClick)="loadWeatherData()"
3222
4052
  ></ax-button>
3223
4053
  </div>
@@ -3354,11 +4184,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3354
4184
  <!-- No data state (not loading, no error) -->
3355
4185
  <div class="axp-weather-no-data-state">
3356
4186
  <i class="fa-solid fa-cloud-sun"></i>
3357
- <p>{{ 'weather.no-data' | translate: { scope: 'dashboard' } | async }}</p>
4187
+ <p>{{ 'weather.no-data.title' | translate: { scope: 'dashboard' } | async }}</p>
3358
4188
  <ax-button
3359
4189
  [look]="'outline'"
3360
4190
  [color]="'secondary'"
3361
- [text]="'weather.refresh-weather' | translate: { scope: 'dashboard' } | async"
4191
+ [text]="'widgets.weather.refresh-weather' | translate: { scope: 'dashboard' } | async"
3362
4192
  (onClick)="loadWeatherData()"
3363
4193
  ></ax-button>
3364
4194
  </div>
@@ -3384,8 +4214,9 @@ var advancedWeather_component = /*#__PURE__*/Object.freeze({
3384
4214
  * Provides customization options for displaying weather data and forecast
3385
4215
  */
3386
4216
  const AXPAdvancedWeatherWidget = {
3387
- name: 'advanced-weather',
3388
- title: 'Advanced Weather Widget',
4217
+ name: RootConfig.widgets.advancedWeather,
4218
+ title: '@dashboard:widgets.advanced-weather.widget-title',
4219
+ description: '@dashboard:widgets.advanced-weather.widget-description',
3389
4220
  categories: [AXP_WIDGETS_UTILITY_CATEGORY],
3390
4221
  groups: [AXPWidgetGroupEnum.DashboardWidget],
3391
4222
  type: 'dashboard',
@@ -3497,7 +4328,7 @@ const AXPAdvancedWeatherWidget = {
3497
4328
  },
3498
4329
  };
3499
4330
 
3500
- class AXMMinimalWeatherViewComponent extends AXPValueWidgetComponent {
4331
+ class AXMMinimalWeatherViewComponent extends AXPDashboardWidgetComponent {
3501
4332
  constructor() {
3502
4333
  super();
3503
4334
  this.weatherService = inject(AXPWeatherApiAbstract);
@@ -3579,152 +4410,16 @@ class AXMMinimalWeatherViewComponent extends AXPValueWidgetComponent {
3579
4410
  provide: AXPWeatherApiAbstract,
3580
4411
  useClass: AXPWeatherApiService,
3581
4412
  },
3582
- ], usesInheritance: true, ngImport: i0, template: `
3583
- @if (weatherData() && !isLoading() && !hasError()) {
3584
- <div
3585
- class="ax-flex ax-size-full ax-flex-col ax-items-start ax-p-2 ax-justify-evenly weather-container ax-overflow-hidden"
3586
- [attr.aria-label]="'Current weather for ' + city()"
3587
- >
3588
- <div class="weather-top ax-flex ax-justify-around ax-items-center ax-w-full ax-pt-2 ax-gap-2 ax-flex-wrap">
3589
- <img
3590
- [src]="getConditionIcon()"
3591
- class="ax-size-28 ax-object-cover -ax-m-6"
3592
- [alt]="weatherData()?.current?.condition + ' weather icon'"
3593
- loading="lazy"
3594
- />
3595
- <div class="temperature ax-flex ax-justify-center ax-items-start">
3596
- <span class="ax-text-5xl" style="text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3)">
3597
- {{ getCurrentTemperature() | number: '1.0-0' }}
3598
- </span>
3599
- <span>{{ temperatureUnit() }}</span>
3600
- </div>
3601
- </div>
3602
- <div class="ax-text-start ax-ps-6">
3603
- <div class="ax-mt-1">
3604
- <span class="ax-font-bold ax-capitalize">{{ city() }}</span>
3605
- </div>
3606
- <div class="ax-pt-2 ax-flex ax-gap-4 ax-opacity-75">
3607
- <span aria-label="High temperature">
3608
- H: {{ getMaxTemp() | number: '1.0-0' }}<sup>{{ temperatureUnit() }}</sup>
3609
- </span>
3610
- <span aria-label="Low temperature">
3611
- L: {{ getMinTemp() | number: '1.0-0' }}<sup>{{ temperatureUnit() }}</sup>
3612
- </span>
3613
- </div>
3614
- </div>
3615
- </div>
3616
- } @else {
3617
- <div class="ax-flex ax-size-full ax-flex-col ax-p-2 ax-gap-2 ax-justify-center" [attr.aria-busy]="isLoading()">
3618
- @if (isLoading()) {
3619
- <!-- Weather icon and temperature skeleton -->
3620
- <div class="ax-flex ax-items-center ax-w-full ax-pt-2 ax-gap-8">
3621
- <ax-skeleton class="ax-w-16 ax-h-12 ax-rounded-full"></ax-skeleton>
3622
- <ax-skeleton class="ax-w-24 ax-h-8 ax-rounded -ax-ms-2"></ax-skeleton>
3623
- </div>
3624
-
3625
- <!-- City and temperature range skeleton -->
3626
- <div class="ax-text-start ax-ps-6 ax-w-full">
3627
- <div class="ax-mt-1">
3628
- <ax-skeleton class="ax-w-24 ax-h-6 ax-rounded"></ax-skeleton>
3629
- </div>
3630
- <div class="ax-pt-2 ax-flex ax-gap-4">
3631
- <ax-skeleton class="ax-w-12 ax-h-4 ax-rounded"></ax-skeleton>
3632
- <ax-skeleton class="ax-w-12 ax-h-4 ax-rounded"></ax-skeleton>
3633
- </div>
3634
- </div>
3635
- } @else if (hasError()) {
3636
- <!-- No data state (not loading, no error) -->
3637
- <div class="ax-flex ax-flex-col ax-gap-2 ax-justify-center ax-items-center ax-h-full ax-p-8">
3638
- <i class="ax-text-3xl fa-solid fa-cloud-sun"></i>
3639
- <p class="ax-text-sm">{{ 'weather.no-data' | translate: { scope: 'dashboard' } | async }}</p>
3640
- <ax-button
3641
- [look]="'outline'"
3642
- [color]="'secondary'"
3643
- [text]="'weather.refresh-weather' | translate: { scope: 'dashboard' } | async"
3644
- (onClick)="loadWeatherData()"
3645
- ></ax-button>
3646
- </div>
3647
- }
3648
- </div>
3649
- }
3650
- `, isInline: true, styles: [":host{width:100%;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXTooltipModule }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4413
+ ], usesInheritance: true, ngImport: i0, template: "@if (weatherData() && !isLoading() && !hasError()) {\n <div\n class=\"ax-flex ax-size-full ax-flex-col ax-items-start ax-p-2 ax-justify-evenly weather-container ax-overflow-hidden\"\n [attr.aria-label]=\"'Current weather for ' + city()\"\n >\n <div class=\"weather-top ax-flex ax-justify-around ax-items-center ax-w-full ax-pt-2 ax-gap-2 ax-flex-wrap\">\n <img\n [src]=\"getConditionIcon()\"\n class=\"ax-size-28 ax-object-cover -ax-m-6\"\n [alt]=\"weatherData()?.current?.condition + ' weather icon'\"\n loading=\"lazy\"\n />\n <div class=\"temperature ax-flex ax-justify-center ax-items-start\">\n <span class=\"ax-text-5xl ax-minimal-weather-temp-shadow\">\n {{ getCurrentTemperature() | number: '1.0-0' }}\n </span>\n <span>{{ temperatureUnit() }}</span>\n </div>\n </div>\n <div class=\"ax-text-start ax-ps-6\">\n <div class=\"ax-mt-1\">\n <span class=\"ax-font-bold ax-capitalize\">{{ city() }}</span>\n </div>\n <div class=\"ax-pt-2 ax-flex ax-gap-4 ax-opacity-75\">\n <span aria-label=\"High temperature\">\n H: {{ getMaxTemp() | number: '1.0-0' }}<sup>{{ temperatureUnit() }}</sup>\n </span>\n <span aria-label=\"Low temperature\">\n L: {{ getMinTemp() | number: '1.0-0' }}<sup>{{ temperatureUnit() }}</sup>\n </span>\n </div>\n </div>\n </div>\n} @else {\n <div class=\"ax-flex ax-size-full ax-flex-col ax-p-2 ax-gap-2 ax-justify-center\" [attr.aria-busy]=\"isLoading()\">\n @if (isLoading()) {\n <div class=\"ax-flex ax-items-center ax-w-full ax-pt-2 ax-gap-8\">\n <ax-skeleton class=\"ax-w-16 ax-h-12 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-24 ax-h-8 ax-rounded -ax-ms-2\"></ax-skeleton>\n </div>\n\n <div class=\"ax-text-start ax-ps-6 ax-w-full\">\n <div class=\"ax-mt-1\">\n <ax-skeleton class=\"ax-w-24 ax-h-6 ax-rounded\"></ax-skeleton>\n </div>\n <div class=\"ax-pt-2 ax-flex ax-gap-4\">\n <ax-skeleton class=\"ax-w-12 ax-h-4 ax-rounded\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-12 ax-h-4 ax-rounded\"></ax-skeleton>\n </div>\n </div>\n } @else if (hasError()) {\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-justify-center ax-items-center ax-h-full ax-p-8\">\n <i class=\"ax-text-3xl fa-solid fa-cloud-sun\"></i>\n <p class=\"ax-text-sm\">{{ 'weather.no-data' | translate: { scope: 'dashboard' } | async }}</p>\n <ax-button\n [look]=\"'outline'\"\n [color]=\"'secondary'\"\n [text]=\"'weather.refresh-weather' | translate: { scope: 'dashboard' } | async\"\n (onClick)=\"loadWeatherData()\"\n ></ax-button>\n </div>\n }\n </div>\n}\n", styles: [":host{width:100%;height:100%}.ax-minimal-weather-temp-shadow{text-shadow:1px 1px 3px rgba(0,0,0,.3)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXTooltipModule }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3651
4414
  }
3652
4415
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMMinimalWeatherViewComponent, decorators: [{
3653
4416
  type: Component,
3654
- args: [{ template: `
3655
- @if (weatherData() && !isLoading() && !hasError()) {
3656
- <div
3657
- class="ax-flex ax-size-full ax-flex-col ax-items-start ax-p-2 ax-justify-evenly weather-container ax-overflow-hidden"
3658
- [attr.aria-label]="'Current weather for ' + city()"
3659
- >
3660
- <div class="weather-top ax-flex ax-justify-around ax-items-center ax-w-full ax-pt-2 ax-gap-2 ax-flex-wrap">
3661
- <img
3662
- [src]="getConditionIcon()"
3663
- class="ax-size-28 ax-object-cover -ax-m-6"
3664
- [alt]="weatherData()?.current?.condition + ' weather icon'"
3665
- loading="lazy"
3666
- />
3667
- <div class="temperature ax-flex ax-justify-center ax-items-start">
3668
- <span class="ax-text-5xl" style="text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3)">
3669
- {{ getCurrentTemperature() | number: '1.0-0' }}
3670
- </span>
3671
- <span>{{ temperatureUnit() }}</span>
3672
- </div>
3673
- </div>
3674
- <div class="ax-text-start ax-ps-6">
3675
- <div class="ax-mt-1">
3676
- <span class="ax-font-bold ax-capitalize">{{ city() }}</span>
3677
- </div>
3678
- <div class="ax-pt-2 ax-flex ax-gap-4 ax-opacity-75">
3679
- <span aria-label="High temperature">
3680
- H: {{ getMaxTemp() | number: '1.0-0' }}<sup>{{ temperatureUnit() }}</sup>
3681
- </span>
3682
- <span aria-label="Low temperature">
3683
- L: {{ getMinTemp() | number: '1.0-0' }}<sup>{{ temperatureUnit() }}</sup>
3684
- </span>
3685
- </div>
3686
- </div>
3687
- </div>
3688
- } @else {
3689
- <div class="ax-flex ax-size-full ax-flex-col ax-p-2 ax-gap-2 ax-justify-center" [attr.aria-busy]="isLoading()">
3690
- @if (isLoading()) {
3691
- <!-- Weather icon and temperature skeleton -->
3692
- <div class="ax-flex ax-items-center ax-w-full ax-pt-2 ax-gap-8">
3693
- <ax-skeleton class="ax-w-16 ax-h-12 ax-rounded-full"></ax-skeleton>
3694
- <ax-skeleton class="ax-w-24 ax-h-8 ax-rounded -ax-ms-2"></ax-skeleton>
3695
- </div>
3696
-
3697
- <!-- City and temperature range skeleton -->
3698
- <div class="ax-text-start ax-ps-6 ax-w-full">
3699
- <div class="ax-mt-1">
3700
- <ax-skeleton class="ax-w-24 ax-h-6 ax-rounded"></ax-skeleton>
3701
- </div>
3702
- <div class="ax-pt-2 ax-flex ax-gap-4">
3703
- <ax-skeleton class="ax-w-12 ax-h-4 ax-rounded"></ax-skeleton>
3704
- <ax-skeleton class="ax-w-12 ax-h-4 ax-rounded"></ax-skeleton>
3705
- </div>
3706
- </div>
3707
- } @else if (hasError()) {
3708
- <!-- No data state (not loading, no error) -->
3709
- <div class="ax-flex ax-flex-col ax-gap-2 ax-justify-center ax-items-center ax-h-full ax-p-8">
3710
- <i class="ax-text-3xl fa-solid fa-cloud-sun"></i>
3711
- <p class="ax-text-sm">{{ 'weather.no-data' | translate: { scope: 'dashboard' } | async }}</p>
3712
- <ax-button
3713
- [look]="'outline'"
3714
- [color]="'secondary'"
3715
- [text]="'weather.refresh-weather' | translate: { scope: 'dashboard' } | async"
3716
- (onClick)="loadWeatherData()"
3717
- ></ax-button>
3718
- </div>
3719
- }
3720
- </div>
3721
- }
3722
- `, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, AXDecoratorModule, AXTooltipModule, AXSkeletonModule, AXTranslationModule, AXButtonModule], providers: [
4417
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, AXDecoratorModule, AXTooltipModule, AXSkeletonModule, AXTranslationModule, AXButtonModule], providers: [
3723
4418
  {
3724
4419
  provide: AXPWeatherApiAbstract,
3725
4420
  useClass: AXPWeatherApiService,
3726
4421
  },
3727
- ], styles: [":host{width:100%;height:100%}\n"] }]
4422
+ ], template: "@if (weatherData() && !isLoading() && !hasError()) {\n <div\n class=\"ax-flex ax-size-full ax-flex-col ax-items-start ax-p-2 ax-justify-evenly weather-container ax-overflow-hidden\"\n [attr.aria-label]=\"'Current weather for ' + city()\"\n >\n <div class=\"weather-top ax-flex ax-justify-around ax-items-center ax-w-full ax-pt-2 ax-gap-2 ax-flex-wrap\">\n <img\n [src]=\"getConditionIcon()\"\n class=\"ax-size-28 ax-object-cover -ax-m-6\"\n [alt]=\"weatherData()?.current?.condition + ' weather icon'\"\n loading=\"lazy\"\n />\n <div class=\"temperature ax-flex ax-justify-center ax-items-start\">\n <span class=\"ax-text-5xl ax-minimal-weather-temp-shadow\">\n {{ getCurrentTemperature() | number: '1.0-0' }}\n </span>\n <span>{{ temperatureUnit() }}</span>\n </div>\n </div>\n <div class=\"ax-text-start ax-ps-6\">\n <div class=\"ax-mt-1\">\n <span class=\"ax-font-bold ax-capitalize\">{{ city() }}</span>\n </div>\n <div class=\"ax-pt-2 ax-flex ax-gap-4 ax-opacity-75\">\n <span aria-label=\"High temperature\">\n H: {{ getMaxTemp() | number: '1.0-0' }}<sup>{{ temperatureUnit() }}</sup>\n </span>\n <span aria-label=\"Low temperature\">\n L: {{ getMinTemp() | number: '1.0-0' }}<sup>{{ temperatureUnit() }}</sup>\n </span>\n </div>\n </div>\n </div>\n} @else {\n <div class=\"ax-flex ax-size-full ax-flex-col ax-p-2 ax-gap-2 ax-justify-center\" [attr.aria-busy]=\"isLoading()\">\n @if (isLoading()) {\n <div class=\"ax-flex ax-items-center ax-w-full ax-pt-2 ax-gap-8\">\n <ax-skeleton class=\"ax-w-16 ax-h-12 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-24 ax-h-8 ax-rounded -ax-ms-2\"></ax-skeleton>\n </div>\n\n <div class=\"ax-text-start ax-ps-6 ax-w-full\">\n <div class=\"ax-mt-1\">\n <ax-skeleton class=\"ax-w-24 ax-h-6 ax-rounded\"></ax-skeleton>\n </div>\n <div class=\"ax-pt-2 ax-flex ax-gap-4\">\n <ax-skeleton class=\"ax-w-12 ax-h-4 ax-rounded\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-12 ax-h-4 ax-rounded\"></ax-skeleton>\n </div>\n </div>\n } @else if (hasError()) {\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-justify-center ax-items-center ax-h-full ax-p-8\">\n <i class=\"ax-text-3xl fa-solid fa-cloud-sun\"></i>\n <p class=\"ax-text-sm\">{{ 'weather.no-data' | translate: { scope: 'dashboard' } | async }}</p>\n <ax-button\n [look]=\"'outline'\"\n [color]=\"'secondary'\"\n [text]=\"'weather.refresh-weather' | translate: { scope: 'dashboard' } | async\"\n (onClick)=\"loadWeatherData()\"\n ></ax-button>\n </div>\n }\n </div>\n}\n", styles: [":host{width:100%;height:100%}.ax-minimal-weather-temp-shadow{text-shadow:1px 1px 3px rgba(0,0,0,.3)}\n"] }]
3728
4423
  }], ctorParameters: () => [] });
3729
4424
 
3730
4425
  var minimalWeather_component = /*#__PURE__*/Object.freeze({
@@ -3737,8 +4432,9 @@ var minimalWeather_component = /*#__PURE__*/Object.freeze({
3737
4432
  * Provides customization options for displaying weather data and forecast
3738
4433
  */
3739
4434
  const AXPMinimalWeatherWidget = {
3740
- name: 'minimal-weather',
3741
- title: 'Minimal Weather Widget',
4435
+ name: RootConfig.widgets.minimalWeather,
4436
+ title: '@dashboard:widgets.minimal-weather.widget-title',
4437
+ description: '@dashboard:widgets.minimal-weather.widget-description',
3742
4438
  categories: [AXP_WIDGETS_UTILITY_CATEGORY],
3743
4439
  groups: [AXPWidgetGroupEnum.DashboardWidget],
3744
4440
  type: 'dashboard',
@@ -3815,7 +4511,7 @@ const AXPMinimalWeatherWidget = {
3815
4511
  * Displays current weather conditions and optional forecast data
3816
4512
  * for a specified location with customizable display options.
3817
4513
  */
3818
- class AXPWeatherWidgetViewComponent extends AXPValueWidgetComponent {
4514
+ class AXPWeatherWidgetViewComponent extends AXPDashboardWidgetComponent {
3819
4515
  /**
3820
4516
  * Component constructor
3821
4517
  * @param cdr ChangeDetectorRef for triggering view updates
@@ -3853,14 +4549,10 @@ class AXPWeatherWidgetViewComponent extends AXPValueWidgetComponent {
3853
4549
  this.refreshInterval = computed(() => this.options()['refreshInterval']?.id ?? 15, ...(ngDevMode ? [{ debugName: "refreshInterval" }] : /* istanbul ignore next */ []));
3854
4550
  // Reactivity effects
3855
4551
  this.optionsEffect = effect(() => {
3856
- const opts = this.options();
4552
+ this.options();
3857
4553
  this.loadWeatherData();
3858
4554
  this.setupRefreshTimer();
3859
4555
  }, ...(ngDevMode ? [{ debugName: "optionsEffect" }] : /* istanbul ignore next */ []));
3860
- this.valueEffect = effect(() => {
3861
- this.city();
3862
- this.loadWeatherData();
3863
- }, ...(ngDevMode ? [{ debugName: "valueEffect" }] : /* istanbul ignore next */ []));
3864
4556
  this.displayedForecast = computed(() => {
3865
4557
  const weatherData = this.weatherData();
3866
4558
  if (!weatherData?.forecast)
@@ -4126,8 +4818,9 @@ var weatherWidget_component = /*#__PURE__*/Object.freeze({
4126
4818
  * Provides customization options for displaying weather data and forecast
4127
4819
  */
4128
4820
  const AXPWeatherWidget = {
4129
- name: 'weather',
4130
- title: 'Weather Widget',
4821
+ name: RootConfig.widgets.weather,
4822
+ title: '@dashboard:widgets.weather.widget-title',
4823
+ description: '@dashboard:widgets.weather.widget-description',
4131
4824
  categories: [AXP_WIDGETS_UTILITY_CATEGORY],
4132
4825
  groups: [AXPWidgetGroupEnum.DashboardWidget],
4133
4826
  type: 'dashboard',
@@ -4478,92 +5171,14 @@ class AXMAnalogClockComponent {
4478
5171
  }
4479
5172
  }
4480
5173
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAnalogClockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4481
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMAnalogClockComponent, isStandalone: true, selector: "axm-analog-clock", inputs: { timezone: { classPropertyName: "timezone", publicName: "timezone", isSignal: true, isRequired: false, transformFunction: null }, classes: { classPropertyName: "classes", publicName: "classes", isSignal: true, isRequired: false, transformFunction: null }, showNumbers: { classPropertyName: "showNumbers", publicName: "showNumbers", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
4482
- <div class="axm-analog-clock-container">
4483
- <div class="axm-analog-clock-face" [class]="classes()">
4484
- <div class="axm-analog-clock-marks-container">
4485
- @for (line of hourLines; track $index) {
4486
- <div class="axm-analog-clock-hour-line" [style.transform]="line.transform">
4487
- <div class="axm-analog-clock-hour-line-inner"></div>
4488
- </div>
4489
- }
4490
- @for (dot of dots; track $index) {
4491
- <div class="axm-analog-clock-dot-line" [style.transform]="dot.transform">
4492
- <div class="axm-analog-clock-dot-line-inner"></div>
4493
- </div>
4494
- }
4495
- </div>
4496
-
4497
- @if (showNumbers()) {
4498
- <div class="axm-analog-clock-numbers-container">
4499
- @for (num of hourNumbers; track num.value) {
4500
- <div class="axm-analog-clock-hour-number" [style.top]="num.top" [style.left]="num.left">
4501
- {{ num.value }}
4502
- </div>
4503
- }
4504
- </div>
4505
- }
4506
- <div class="axm-analog-clock-hands">
4507
- <div class="axm-analog-clock-hand axm-analog-clock-hour-hand" [style.transform]="hourHandTransform()"></div>
4508
- <div
4509
- class="axm-analog-clock-hand axm-analog-clock-minute-hand"
4510
- [style.transform]="minuteHandTransform()"
4511
- ></div>
4512
- <div
4513
- class="axm-analog-clock-hand axm-analog-clock-second-hand"
4514
- [style.transform]="secondHandTransform()"
4515
- ></div>
4516
- <div class="axm-analog-clock-center-point"></div>
4517
- </div>
4518
- </div>
4519
- </div>
4520
- `, isInline: true, styles: [":host{display:grid;width:100%;height:100%;place-items:center}.axm-analog-clock-container{position:relative;max-height:100%;width:100%;aspect-ratio:1;container-type:inline-size}.axm-analog-clock-face{position:relative;height:100%;width:100%;border-radius:9999px}.axm-analog-clock-marks-container,.axm-analog-clock-numbers-container,.axm-analog-clock-hands{position:absolute;inset:0}.axm-analog-clock-hour-line,.axm-analog-clock-dot-line{position:absolute;bottom:50%;left:50%;height:50%;transform-origin:bottom}.axm-analog-clock-hour-line,.axm-analog-clock-dot-line{width:1.8cqw}.axm-analog-clock-hour-line-inner{position:absolute;top:6cqw;left:50%;height:5.5cqw;width:100%;--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-on-darker-surface),var(--tw-bg-opacity, 1))}.axm-analog-clock-dot-line-inner{position:absolute;top:6cqw;left:50%;height:2cqw;width:1.2cqw;--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-on-dark-surface),var(--tw-bg-opacity, 1))}.axm-analog-clock-hour-number{position:absolute;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));font-size:10cqw;font-weight:500;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-surface),var(--tw-text-opacity, 1))}.axm-analog-clock-hand{position:absolute;bottom:50%;left:50%;transform-origin:bottom;border-top-left-radius:.5rem;border-top-right-radius:.5rem}.axm-analog-clock-hand:after{content:\"\";position:absolute;left:0;width:100%}.axm-analog-clock-hour-hand{z-index:2;height:25%;width:2.7cqw;--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.axm-analog-clock-hour-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.axm-analog-clock-minute-hand{z-index:3;height:35%;width:2.1cqw;--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.axm-analog-clock-minute-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.axm-analog-clock-second-hand{z-index:4;height:42%;width:1.5cqw;--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.axm-analog-clock-second-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.axm-analog-clock-center-point{position:absolute;top:50%;left:50%;z-index:5;height:9cqw;width:9cqw;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1.8cqw;--tw-border-opacity: 1;border-color:rgb(0 0 0 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5174
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMAnalogClockComponent, isStandalone: true, selector: "axm-analog-clock", inputs: { timezone: { classPropertyName: "timezone", publicName: "timezone", isSignal: true, isRequired: false, transformFunction: null }, classes: { classPropertyName: "classes", publicName: "classes", isSignal: true, isRequired: false, transformFunction: null }, showNumbers: { classPropertyName: "showNumbers", publicName: "showNumbers", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"axm-analog-clock-container\">\n <div class=\"axm-analog-clock-face\" [class]=\"classes()\">\n <div class=\"axm-analog-clock-marks-container\">\n @for (line of hourLines; track $index) {\n <div class=\"axm-analog-clock-hour-line\" [style.transform]=\"line.transform\">\n <div class=\"axm-analog-clock-hour-line-inner\"></div>\n </div>\n }\n @for (dot of dots; track $index) {\n <div class=\"axm-analog-clock-dot-line\" [style.transform]=\"dot.transform\">\n <div class=\"axm-analog-clock-dot-line-inner\"></div>\n </div>\n }\n </div>\n\n @if (showNumbers()) {\n <div class=\"axm-analog-clock-numbers-container\">\n @for (num of hourNumbers; track num.value) {\n <div class=\"axm-analog-clock-hour-number\" [style.top]=\"num.top\" [style.left]=\"num.left\">\n {{ num.value }}\n </div>\n }\n </div>\n }\n <div class=\"axm-analog-clock-hands\">\n <div class=\"axm-analog-clock-hand axm-analog-clock-hour-hand\" [style.transform]=\"hourHandTransform()\"></div>\n <div\n class=\"axm-analog-clock-hand axm-analog-clock-minute-hand\"\n [style.transform]=\"minuteHandTransform()\"\n ></div>\n <div\n class=\"axm-analog-clock-hand axm-analog-clock-second-hand\"\n [style.transform]=\"secondHandTransform()\"\n ></div>\n <div class=\"axm-analog-clock-center-point\"></div>\n </div>\n </div>\n</div>\n", styles: [":host{display:grid;width:100%;height:100%;place-items:center}.axm-analog-clock-container{position:relative;max-height:100%;width:100%;aspect-ratio:1;container-type:inline-size}.axm-analog-clock-face{position:relative;height:100%;width:100%;border-radius:9999px}.axm-analog-clock-marks-container,.axm-analog-clock-numbers-container,.axm-analog-clock-hands{position:absolute;inset:0}.axm-analog-clock-hour-line,.axm-analog-clock-dot-line{position:absolute;bottom:50%;left:50%;height:50%;transform-origin:bottom}.axm-analog-clock-hour-line,.axm-analog-clock-dot-line{width:1.8cqw}.axm-analog-clock-hour-line-inner{position:absolute;top:6cqw;left:50%;height:5.5cqw;width:100%;--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-on-darker-surface),var(--tw-bg-opacity, 1))}.axm-analog-clock-dot-line-inner{position:absolute;top:6cqw;left:50%;height:2cqw;width:1.2cqw;--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-on-dark-surface),var(--tw-bg-opacity, 1))}.axm-analog-clock-hour-number{position:absolute;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));font-size:10cqw;font-weight:500;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-surface),var(--tw-text-opacity, 1))}.axm-analog-clock-hand{position:absolute;bottom:50%;left:50%;transform-origin:bottom;border-top-left-radius:.5rem;border-top-right-radius:.5rem}.axm-analog-clock-hand:after{content:\"\";position:absolute;left:0;width:100%}.axm-analog-clock-hour-hand{z-index:2;height:25%;width:2.7cqw;--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.axm-analog-clock-hour-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.axm-analog-clock-minute-hand{z-index:3;height:35%;width:2.1cqw;--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.axm-analog-clock-minute-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.axm-analog-clock-second-hand{z-index:4;height:42%;width:1.5cqw;--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.axm-analog-clock-second-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.axm-analog-clock-center-point{position:absolute;top:50%;left:50%;z-index:5;height:9cqw;width:9cqw;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1.8cqw;--tw-border-opacity: 1;border-color:rgb(0 0 0 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4521
5175
  }
4522
5176
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAnalogClockComponent, decorators: [{
4523
5177
  type: Component,
4524
- args: [{ selector: 'axm-analog-clock', standalone: true, imports: [], template: `
4525
- <div class="axm-analog-clock-container">
4526
- <div class="axm-analog-clock-face" [class]="classes()">
4527
- <div class="axm-analog-clock-marks-container">
4528
- @for (line of hourLines; track $index) {
4529
- <div class="axm-analog-clock-hour-line" [style.transform]="line.transform">
4530
- <div class="axm-analog-clock-hour-line-inner"></div>
4531
- </div>
4532
- }
4533
- @for (dot of dots; track $index) {
4534
- <div class="axm-analog-clock-dot-line" [style.transform]="dot.transform">
4535
- <div class="axm-analog-clock-dot-line-inner"></div>
4536
- </div>
4537
- }
4538
- </div>
4539
-
4540
- @if (showNumbers()) {
4541
- <div class="axm-analog-clock-numbers-container">
4542
- @for (num of hourNumbers; track num.value) {
4543
- <div class="axm-analog-clock-hour-number" [style.top]="num.top" [style.left]="num.left">
4544
- {{ num.value }}
4545
- </div>
4546
- }
4547
- </div>
4548
- }
4549
- <div class="axm-analog-clock-hands">
4550
- <div class="axm-analog-clock-hand axm-analog-clock-hour-hand" [style.transform]="hourHandTransform()"></div>
4551
- <div
4552
- class="axm-analog-clock-hand axm-analog-clock-minute-hand"
4553
- [style.transform]="minuteHandTransform()"
4554
- ></div>
4555
- <div
4556
- class="axm-analog-clock-hand axm-analog-clock-second-hand"
4557
- [style.transform]="secondHandTransform()"
4558
- ></div>
4559
- <div class="axm-analog-clock-center-point"></div>
4560
- </div>
4561
- </div>
4562
- </div>
4563
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:grid;width:100%;height:100%;place-items:center}.axm-analog-clock-container{position:relative;max-height:100%;width:100%;aspect-ratio:1;container-type:inline-size}.axm-analog-clock-face{position:relative;height:100%;width:100%;border-radius:9999px}.axm-analog-clock-marks-container,.axm-analog-clock-numbers-container,.axm-analog-clock-hands{position:absolute;inset:0}.axm-analog-clock-hour-line,.axm-analog-clock-dot-line{position:absolute;bottom:50%;left:50%;height:50%;transform-origin:bottom}.axm-analog-clock-hour-line,.axm-analog-clock-dot-line{width:1.8cqw}.axm-analog-clock-hour-line-inner{position:absolute;top:6cqw;left:50%;height:5.5cqw;width:100%;--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-on-darker-surface),var(--tw-bg-opacity, 1))}.axm-analog-clock-dot-line-inner{position:absolute;top:6cqw;left:50%;height:2cqw;width:1.2cqw;--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-on-dark-surface),var(--tw-bg-opacity, 1))}.axm-analog-clock-hour-number{position:absolute;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));font-size:10cqw;font-weight:500;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-surface),var(--tw-text-opacity, 1))}.axm-analog-clock-hand{position:absolute;bottom:50%;left:50%;transform-origin:bottom;border-top-left-radius:.5rem;border-top-right-radius:.5rem}.axm-analog-clock-hand:after{content:\"\";position:absolute;left:0;width:100%}.axm-analog-clock-hour-hand{z-index:2;height:25%;width:2.7cqw;--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.axm-analog-clock-hour-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.axm-analog-clock-minute-hand{z-index:3;height:35%;width:2.1cqw;--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.axm-analog-clock-minute-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.axm-analog-clock-second-hand{z-index:4;height:42%;width:1.5cqw;--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.axm-analog-clock-second-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.axm-analog-clock-center-point{position:absolute;top:50%;left:50%;z-index:5;height:9cqw;width:9cqw;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1.8cqw;--tw-border-opacity: 1;border-color:rgb(0 0 0 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}\n"] }]
5178
+ args: [{ selector: 'axm-analog-clock', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axm-analog-clock-container\">\n <div class=\"axm-analog-clock-face\" [class]=\"classes()\">\n <div class=\"axm-analog-clock-marks-container\">\n @for (line of hourLines; track $index) {\n <div class=\"axm-analog-clock-hour-line\" [style.transform]=\"line.transform\">\n <div class=\"axm-analog-clock-hour-line-inner\"></div>\n </div>\n }\n @for (dot of dots; track $index) {\n <div class=\"axm-analog-clock-dot-line\" [style.transform]=\"dot.transform\">\n <div class=\"axm-analog-clock-dot-line-inner\"></div>\n </div>\n }\n </div>\n\n @if (showNumbers()) {\n <div class=\"axm-analog-clock-numbers-container\">\n @for (num of hourNumbers; track num.value) {\n <div class=\"axm-analog-clock-hour-number\" [style.top]=\"num.top\" [style.left]=\"num.left\">\n {{ num.value }}\n </div>\n }\n </div>\n }\n <div class=\"axm-analog-clock-hands\">\n <div class=\"axm-analog-clock-hand axm-analog-clock-hour-hand\" [style.transform]=\"hourHandTransform()\"></div>\n <div\n class=\"axm-analog-clock-hand axm-analog-clock-minute-hand\"\n [style.transform]=\"minuteHandTransform()\"\n ></div>\n <div\n class=\"axm-analog-clock-hand axm-analog-clock-second-hand\"\n [style.transform]=\"secondHandTransform()\"\n ></div>\n <div class=\"axm-analog-clock-center-point\"></div>\n </div>\n </div>\n</div>\n", styles: [":host{display:grid;width:100%;height:100%;place-items:center}.axm-analog-clock-container{position:relative;max-height:100%;width:100%;aspect-ratio:1;container-type:inline-size}.axm-analog-clock-face{position:relative;height:100%;width:100%;border-radius:9999px}.axm-analog-clock-marks-container,.axm-analog-clock-numbers-container,.axm-analog-clock-hands{position:absolute;inset:0}.axm-analog-clock-hour-line,.axm-analog-clock-dot-line{position:absolute;bottom:50%;left:50%;height:50%;transform-origin:bottom}.axm-analog-clock-hour-line,.axm-analog-clock-dot-line{width:1.8cqw}.axm-analog-clock-hour-line-inner{position:absolute;top:6cqw;left:50%;height:5.5cqw;width:100%;--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-on-darker-surface),var(--tw-bg-opacity, 1))}.axm-analog-clock-dot-line-inner{position:absolute;top:6cqw;left:50%;height:2cqw;width:1.2cqw;--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-on-dark-surface),var(--tw-bg-opacity, 1))}.axm-analog-clock-hour-number{position:absolute;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));font-size:10cqw;font-weight:500;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-surface),var(--tw-text-opacity, 1))}.axm-analog-clock-hand{position:absolute;bottom:50%;left:50%;transform-origin:bottom;border-top-left-radius:.5rem;border-top-right-radius:.5rem}.axm-analog-clock-hand:after{content:\"\";position:absolute;left:0;width:100%}.axm-analog-clock-hour-hand{z-index:2;height:25%;width:2.7cqw;--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.axm-analog-clock-hour-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.axm-analog-clock-minute-hand{z-index:3;height:35%;width:2.1cqw;--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.axm-analog-clock-minute-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.axm-analog-clock-second-hand{z-index:4;height:42%;width:1.5cqw;--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.axm-analog-clock-second-hand:after{bottom:-20%;height:20%;--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.axm-analog-clock-center-point{position:absolute;top:50%;left:50%;z-index:5;height:9cqw;width:9cqw;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1.8cqw;--tw-border-opacity: 1;border-color:rgb(0 0 0 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}\n"] }]
4564
5179
  }], ctorParameters: () => [], propDecorators: { timezone: [{ type: i0.Input, args: [{ isSignal: true, alias: "timezone", required: false }] }], classes: [{ type: i0.Input, args: [{ isSignal: true, alias: "classes", required: false }] }], showNumbers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showNumbers", required: false }] }] } });
4565
5180
 
4566
- class AXMClockWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
5181
+ class AXMClockWidgetViewComponent extends AXPDashboardWidgetComponent {
4567
5182
  constructor() {
4568
5183
  super();
4569
5184
  this.regionalService = inject(AXMLocaleManagementService);
@@ -4648,177 +5263,11 @@ class AXMClockWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
4648
5263
  }
4649
5264
  }
4650
5265
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMClockWidgetViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4651
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMClockWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: `
4652
- <div class="ax-p-2 ax-h-full ax-overflow-hidden" [class.ax-bg-light]="others().length > 0">
4653
- <!-- Main Clock Section -->
4654
- <div class="ax-flex ax-flex-col ax-items-center ax-justify-around ax-gap-2 ax-flex-1 ax-h-full">
4655
- <div
4656
- class="ax-flex ax-items-center ax-justify-around ax-gap-2 ax-w-full ax-grow"
4657
- [class.ax-flex-row]="isHorizontal()"
4658
- [class.ax-rounded-full]="isHorizontal() && others().length > 0"
4659
- [class.ax-flex-col]="!isHorizontal()"
4660
- [class.ax-rounded-xl]="!isHorizontal() && others().length > 0"
4661
- [class.ax-border]="others().length > 0"
4662
- [class.ax-border-gray-100]="others().length > 0"
4663
- [class.ax-shadow-lg]="others().length > 0"
4664
- [class.ax-bg-lighter]="others().length > 0"
4665
- [class.ax-p-2]="others().length > 0"
4666
- >
4667
- <div
4668
- class="ax-aspect-square ax-flex ax-items-center ax-justify-center ax-min-w-[100px] ax-min-h-[100px]"
4669
- [style.height]="isHorizontal() ? '65%' : 'auto'"
4670
- [style.width]="isHorizontal() ? 'auto' : '65%'"
4671
- >
4672
- <axm-analog-clock
4673
- [timezone]="timezone()?.iana"
4674
- [classes]="others().length > 0 ? 'ax-bg-lightest' : undefined"
4675
- ></axm-analog-clock>
4676
- </div>
4677
- @if (timezone()?.abbr) {
4678
- <div class="ax-flex ax-flex-col ax-items-center ax-justify-center ax-text-center ax-min-w-[50px] ax-gap-2">
4679
- @if (timezone()?.code) {
4680
- <span
4681
- class="ax-font-medium ax-opacity-75 ax-uppercase ax-block ax-2line"
4682
- [style.fontSize.px]="codeFontSize()"
4683
- >{{ timezone()?.code }}</span
4684
- >
4685
- }
4686
- <span class="ax-font-bold ax-mt-0" [style.fontSize.px]="abbrFontSize()">{{ timezone()?.abbr }}</span>
4687
- </div>
4688
- }
4689
- </div>
4690
-
4691
- <!-- Additional Clocks Section -->
4692
- @if (others().length > 0) {
4693
- <div class="ax-w-full ax-max-w-4xl ax-mx-auto">
4694
- <div
4695
- class="ax-flex ax-justify-around ax-items-center"
4696
- [class.ax-flex-wrap]="hasEnoughSpaceForHorizontal()"
4697
- [class.ax-gap-3]="true"
4698
- [class.ax-overflow-auto]="true"
4699
- >
4700
- @for (clock of others(); track clock.code) {
4701
- <div class="ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-2 ax-flex-wrap ax-gap-2">
4702
- <div
4703
- [axTooltip]="clock.code"
4704
- [axTooltipPlacement]="'top'"
4705
- class="ax-aspect-square ax-flex ax-items-center ax-justify-center ax-rounded-lg ax-size-16"
4706
- >
4707
- <axm-analog-clock
4708
- [timezone]="clock.iana"
4709
- [showNumbers]="false"
4710
- [classes]="'ax-bg-lightest'"
4711
- ></axm-analog-clock>
4712
- </div>
4713
- @if (clock.abbr) {
4714
- <div
4715
- [class.ax-text-center]="hasEnoughSpaceForHorizontal()"
4716
- [class.ax-pt-1]="hasEnoughSpaceForHorizontal()"
4717
- [class.ax-pl-1]="!hasEnoughSpaceForHorizontal()"
4718
- >
4719
- <span class="ax-text-xs ax-font-medium ax-truncate ax-block">{{ clock.abbr }}</span>
4720
- @if (clock.code) {
4721
- <span class="ax-text-xs ax-font-light ax-opacity-75 ax-truncate ax-block">{{
4722
- clock.code
4723
- }}</span>
4724
- }
4725
- </div>
4726
- }
4727
- </div>
4728
- }
4729
- </div>
4730
- </div>
4731
- }
4732
- </div>
4733
- </div>
4734
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.ax-2line{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;white-space:normal;line-height:1.1;max-height:2.2em}.ax-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], dependencies: [{ kind: "component", type: AXMAnalogClockComponent, selector: "axm-analog-clock", inputs: ["timezone", "classes", "showNumbers"] }, { kind: "ngmodule", type: AXTooltipModule }, { kind: "directive", type: i1$2.AXTooltipDirective, selector: "[axTooltip]", inputs: ["axTooltipDisabled", "axTooltip", "axTooltipContext", "axTooltipPlacement", "axTooltipOffsetX", "axTooltipOffsetY", "axTooltipOpenAfter", "axTooltipCloseAfter"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5266
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMClockWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"ax-p-2 ax-h-full ax-overflow-hidden\" [class.ax-bg-light]=\"others().length > 0\">\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-around ax-gap-2 ax-flex-1 ax-h-full\">\n <div\n class=\"ax-flex ax-items-center ax-justify-around ax-gap-2 ax-w-full ax-grow\"\n [class.ax-flex-row]=\"isHorizontal()\"\n [class.ax-rounded-full]=\"isHorizontal() && others().length > 0\"\n [class.ax-flex-col]=\"!isHorizontal()\"\n [class.ax-rounded-xl]=\"!isHorizontal() && others().length > 0\"\n [class.ax-border]=\"others().length > 0\"\n [class.ax-border-gray-100]=\"others().length > 0\"\n [class.ax-shadow-lg]=\"others().length > 0\"\n [class.ax-bg-lighter]=\"others().length > 0\"\n [class.ax-p-2]=\"others().length > 0\"\n >\n <div\n class=\"ax-aspect-square ax-flex ax-items-center ax-justify-center ax-min-w-[100px] ax-min-h-[100px]\"\n [style.height]=\"isHorizontal() ? '65%' : 'auto'\"\n [style.width]=\"isHorizontal() ? 'auto' : '65%'\"\n >\n <axm-analog-clock\n [timezone]=\"timezone()?.iana\"\n [classes]=\"others().length > 0 ? 'ax-bg-lightest' : undefined\"\n ></axm-analog-clock>\n </div>\n @if (timezone()?.abbr) {\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-text-center ax-min-w-[50px] ax-gap-2\">\n @if (timezone()?.code) {\n <span\n class=\"ax-font-medium ax-opacity-75 ax-uppercase ax-block ax-2line\"\n [style.fontSize.px]=\"codeFontSize()\"\n >{{ timezone()?.code }}</span\n >\n }\n <span class=\"ax-font-bold ax-mt-0\" [style.fontSize.px]=\"abbrFontSize()\">{{ timezone()?.abbr }}</span>\n </div>\n }\n </div>\n\n @if (others().length > 0) {\n <div class=\"ax-w-full ax-max-w-4xl ax-mx-auto\">\n <div\n class=\"ax-flex ax-justify-around ax-items-center\"\n [class.ax-flex-wrap]=\"hasEnoughSpaceForHorizontal()\"\n [class.ax-gap-3]=\"true\"\n [class.ax-overflow-auto]=\"true\"\n >\n @for (clock of others(); track clock.code) {\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-2 ax-flex-wrap ax-gap-2\">\n <div\n [axTooltip]=\"clock.code\"\n [axTooltipPlacement]=\"'top'\"\n class=\"ax-aspect-square ax-flex ax-items-center ax-justify-center ax-rounded-lg ax-size-16\"\n >\n <axm-analog-clock\n [timezone]=\"clock.iana\"\n [showNumbers]=\"false\"\n [classes]=\"'ax-bg-lightest'\"\n ></axm-analog-clock>\n </div>\n @if (clock.abbr) {\n <div\n [class.ax-text-center]=\"hasEnoughSpaceForHorizontal()\"\n [class.ax-pt-1]=\"hasEnoughSpaceForHorizontal()\"\n [class.ax-pl-1]=\"!hasEnoughSpaceForHorizontal()\"\n >\n <span class=\"ax-text-xs ax-font-medium ax-truncate ax-block\">{{ clock.abbr }}</span>\n @if (clock.code) {\n <span class=\"ax-text-xs ax-font-light ax-opacity-75 ax-truncate ax-block\">{{ clock.code }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.ax-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ax-2line{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;white-space:normal;line-height:1.1;max-height:2.2em}\n"], dependencies: [{ kind: "component", type: AXMAnalogClockComponent, selector: "axm-analog-clock", inputs: ["timezone", "classes", "showNumbers"] }, { kind: "ngmodule", type: AXTooltipModule }, { kind: "directive", type: i1$2.AXTooltipDirective, selector: "[axTooltip]", inputs: ["axTooltipDisabled", "axTooltip", "axTooltipContext", "axTooltipPlacement", "axTooltipOffsetX", "axTooltipOffsetY", "axTooltipOpenAfter", "axTooltipCloseAfter"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4735
5267
  }
4736
5268
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMClockWidgetViewComponent, decorators: [{
4737
5269
  type: Component,
4738
- args: [{ template: `
4739
- <div class="ax-p-2 ax-h-full ax-overflow-hidden" [class.ax-bg-light]="others().length > 0">
4740
- <!-- Main Clock Section -->
4741
- <div class="ax-flex ax-flex-col ax-items-center ax-justify-around ax-gap-2 ax-flex-1 ax-h-full">
4742
- <div
4743
- class="ax-flex ax-items-center ax-justify-around ax-gap-2 ax-w-full ax-grow"
4744
- [class.ax-flex-row]="isHorizontal()"
4745
- [class.ax-rounded-full]="isHorizontal() && others().length > 0"
4746
- [class.ax-flex-col]="!isHorizontal()"
4747
- [class.ax-rounded-xl]="!isHorizontal() && others().length > 0"
4748
- [class.ax-border]="others().length > 0"
4749
- [class.ax-border-gray-100]="others().length > 0"
4750
- [class.ax-shadow-lg]="others().length > 0"
4751
- [class.ax-bg-lighter]="others().length > 0"
4752
- [class.ax-p-2]="others().length > 0"
4753
- >
4754
- <div
4755
- class="ax-aspect-square ax-flex ax-items-center ax-justify-center ax-min-w-[100px] ax-min-h-[100px]"
4756
- [style.height]="isHorizontal() ? '65%' : 'auto'"
4757
- [style.width]="isHorizontal() ? 'auto' : '65%'"
4758
- >
4759
- <axm-analog-clock
4760
- [timezone]="timezone()?.iana"
4761
- [classes]="others().length > 0 ? 'ax-bg-lightest' : undefined"
4762
- ></axm-analog-clock>
4763
- </div>
4764
- @if (timezone()?.abbr) {
4765
- <div class="ax-flex ax-flex-col ax-items-center ax-justify-center ax-text-center ax-min-w-[50px] ax-gap-2">
4766
- @if (timezone()?.code) {
4767
- <span
4768
- class="ax-font-medium ax-opacity-75 ax-uppercase ax-block ax-2line"
4769
- [style.fontSize.px]="codeFontSize()"
4770
- >{{ timezone()?.code }}</span
4771
- >
4772
- }
4773
- <span class="ax-font-bold ax-mt-0" [style.fontSize.px]="abbrFontSize()">{{ timezone()?.abbr }}</span>
4774
- </div>
4775
- }
4776
- </div>
4777
-
4778
- <!-- Additional Clocks Section -->
4779
- @if (others().length > 0) {
4780
- <div class="ax-w-full ax-max-w-4xl ax-mx-auto">
4781
- <div
4782
- class="ax-flex ax-justify-around ax-items-center"
4783
- [class.ax-flex-wrap]="hasEnoughSpaceForHorizontal()"
4784
- [class.ax-gap-3]="true"
4785
- [class.ax-overflow-auto]="true"
4786
- >
4787
- @for (clock of others(); track clock.code) {
4788
- <div class="ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-2 ax-flex-wrap ax-gap-2">
4789
- <div
4790
- [axTooltip]="clock.code"
4791
- [axTooltipPlacement]="'top'"
4792
- class="ax-aspect-square ax-flex ax-items-center ax-justify-center ax-rounded-lg ax-size-16"
4793
- >
4794
- <axm-analog-clock
4795
- [timezone]="clock.iana"
4796
- [showNumbers]="false"
4797
- [classes]="'ax-bg-lightest'"
4798
- ></axm-analog-clock>
4799
- </div>
4800
- @if (clock.abbr) {
4801
- <div
4802
- [class.ax-text-center]="hasEnoughSpaceForHorizontal()"
4803
- [class.ax-pt-1]="hasEnoughSpaceForHorizontal()"
4804
- [class.ax-pl-1]="!hasEnoughSpaceForHorizontal()"
4805
- >
4806
- <span class="ax-text-xs ax-font-medium ax-truncate ax-block">{{ clock.abbr }}</span>
4807
- @if (clock.code) {
4808
- <span class="ax-text-xs ax-font-light ax-opacity-75 ax-truncate ax-block">{{
4809
- clock.code
4810
- }}</span>
4811
- }
4812
- </div>
4813
- }
4814
- </div>
4815
- }
4816
- </div>
4817
- </div>
4818
- }
4819
- </div>
4820
- </div>
4821
- `, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXMAnalogClockComponent, AXTooltipModule], styles: [":host{display:block;width:100%;height:100%}.ax-2line{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;white-space:normal;line-height:1.1;max-height:2.2em}.ax-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"] }]
5270
+ args: [{ standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXMAnalogClockComponent, AXTooltipModule], template: "<div class=\"ax-p-2 ax-h-full ax-overflow-hidden\" [class.ax-bg-light]=\"others().length > 0\">\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-around ax-gap-2 ax-flex-1 ax-h-full\">\n <div\n class=\"ax-flex ax-items-center ax-justify-around ax-gap-2 ax-w-full ax-grow\"\n [class.ax-flex-row]=\"isHorizontal()\"\n [class.ax-rounded-full]=\"isHorizontal() && others().length > 0\"\n [class.ax-flex-col]=\"!isHorizontal()\"\n [class.ax-rounded-xl]=\"!isHorizontal() && others().length > 0\"\n [class.ax-border]=\"others().length > 0\"\n [class.ax-border-gray-100]=\"others().length > 0\"\n [class.ax-shadow-lg]=\"others().length > 0\"\n [class.ax-bg-lighter]=\"others().length > 0\"\n [class.ax-p-2]=\"others().length > 0\"\n >\n <div\n class=\"ax-aspect-square ax-flex ax-items-center ax-justify-center ax-min-w-[100px] ax-min-h-[100px]\"\n [style.height]=\"isHorizontal() ? '65%' : 'auto'\"\n [style.width]=\"isHorizontal() ? 'auto' : '65%'\"\n >\n <axm-analog-clock\n [timezone]=\"timezone()?.iana\"\n [classes]=\"others().length > 0 ? 'ax-bg-lightest' : undefined\"\n ></axm-analog-clock>\n </div>\n @if (timezone()?.abbr) {\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-text-center ax-min-w-[50px] ax-gap-2\">\n @if (timezone()?.code) {\n <span\n class=\"ax-font-medium ax-opacity-75 ax-uppercase ax-block ax-2line\"\n [style.fontSize.px]=\"codeFontSize()\"\n >{{ timezone()?.code }}</span\n >\n }\n <span class=\"ax-font-bold ax-mt-0\" [style.fontSize.px]=\"abbrFontSize()\">{{ timezone()?.abbr }}</span>\n </div>\n }\n </div>\n\n @if (others().length > 0) {\n <div class=\"ax-w-full ax-max-w-4xl ax-mx-auto\">\n <div\n class=\"ax-flex ax-justify-around ax-items-center\"\n [class.ax-flex-wrap]=\"hasEnoughSpaceForHorizontal()\"\n [class.ax-gap-3]=\"true\"\n [class.ax-overflow-auto]=\"true\"\n >\n @for (clock of others(); track clock.code) {\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-2 ax-flex-wrap ax-gap-2\">\n <div\n [axTooltip]=\"clock.code\"\n [axTooltipPlacement]=\"'top'\"\n class=\"ax-aspect-square ax-flex ax-items-center ax-justify-center ax-rounded-lg ax-size-16\"\n >\n <axm-analog-clock\n [timezone]=\"clock.iana\"\n [showNumbers]=\"false\"\n [classes]=\"'ax-bg-lightest'\"\n ></axm-analog-clock>\n </div>\n @if (clock.abbr) {\n <div\n [class.ax-text-center]=\"hasEnoughSpaceForHorizontal()\"\n [class.ax-pt-1]=\"hasEnoughSpaceForHorizontal()\"\n [class.ax-pl-1]=\"!hasEnoughSpaceForHorizontal()\"\n >\n <span class=\"ax-text-xs ax-font-medium ax-truncate ax-block\">{{ clock.abbr }}</span>\n @if (clock.code) {\n <span class=\"ax-text-xs ax-font-light ax-opacity-75 ax-truncate ax-block\">{{ clock.code }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.ax-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ax-2line{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;white-space:normal;line-height:1.1;max-height:2.2em}\n"] }]
4822
5271
  }], ctorParameters: () => [] });
4823
5272
 
4824
5273
  var analogClockWidgetView_component = /*#__PURE__*/Object.freeze({
@@ -4827,9 +5276,9 @@ var analogClockWidgetView_component = /*#__PURE__*/Object.freeze({
4827
5276
  });
4828
5277
 
4829
5278
  const AXPAnalogClockWidget = {
4830
- name: 'analog-clock',
4831
- title: 'Analog Clock',
4832
- description: '',
5279
+ name: RootConfig.widgets.analogClock,
5280
+ title: '@dashboard:widgets.analog-clock.widget-title',
5281
+ description: '@dashboard:widgets.analog-clock.widget-description',
4833
5282
  type: 'view',
4834
5283
  categories: [],
4835
5284
  groups: [AXPWidgetGroupEnum.DashboardWidget],
@@ -4909,7 +5358,7 @@ const AXPAnalogClockWidget = {
4909
5358
  },
4910
5359
  };
4911
5360
 
4912
- class AXPClockCalendarWidgetViewComponent extends AXPValueWidgetComponent {
5361
+ class AXPClockCalendarWidgetViewComponent extends AXPDashboardWidgetComponent {
4913
5362
  constructor() {
4914
5363
  super(...arguments);
4915
5364
  // Dependencies
@@ -5078,8 +5527,9 @@ const AXP_DATE_FORMAT_OPTIONS = [
5078
5527
  ];
5079
5528
 
5080
5529
  const AXPClockCalendarWidget = {
5081
- name: 'clock-calendar',
5082
- title: 'Clock & Calendar',
5530
+ name: RootConfig.widgets.clockCalendar,
5531
+ title: '@dashboard:widgets.clock-calendar.widget-title',
5532
+ description: '@dashboard:widgets.clock-calendar.widget-description',
5083
5533
  categories: [AXP_WIDGETS_UTILITY_CATEGORY],
5084
5534
  groups: [AXPWidgetGroupEnum.DashboardWidget],
5085
5535
  type: 'dashboard',
@@ -5098,7 +5548,7 @@ const AXPClockCalendarWidget = {
5098
5548
  path: 'options.title',
5099
5549
  type: AXPWidgetsCatalog.text,
5100
5550
  options: {
5101
- placeholder: 'Enter chart title',
5551
+ placeholder: '@dashboard:widgets.clock-calendar.title-placeholder',
5102
5552
  },
5103
5553
  },
5104
5554
  },
@@ -5118,9 +5568,9 @@ const AXPClockCalendarWidget = {
5118
5568
  type: AXPWidgetsCatalog.select,
5119
5569
  options: {
5120
5570
  dataSource: [
5121
- { id: 'both', title: 'Digital & Analog' },
5122
- { id: 'digital', title: 'Digital Only' },
5123
- { id: 'analog', title: 'Analog Only' },
5571
+ { id: 'both', title: '@dashboard:widgets.clock-calendar.layout-both' },
5572
+ { id: 'digital', title: '@dashboard:widgets.clock-calendar.layout-digital' },
5573
+ { id: 'analog', title: '@dashboard:widgets.clock-calendar.layout-analog' },
5124
5574
  ],
5125
5575
  },
5126
5576
  },
@@ -5272,7 +5722,7 @@ const AXPClockCalendarWidget = {
5272
5722
  },
5273
5723
  };
5274
5724
 
5275
- class AXPDashboardShortcutWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
5725
+ class AXPShortcutWidgetViewComponent extends AXPDashboardWidgetComponent {
5276
5726
  constructor() {
5277
5727
  super(...arguments);
5278
5728
  this.popupService = inject(AXPopupService);
@@ -5336,71 +5786,12 @@ class AXPDashboardShortcutWidgetViewComponent extends AXPLayoutBaseWidgetCompone
5336
5786
  cls[`ax-text-white`] = true;
5337
5787
  return cls;
5338
5788
  }
5339
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDashboardShortcutWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5340
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPDashboardShortcutWidgetViewComponent, isStandalone: true, selector: "ng-component", host: { properties: { "style": "this.__style", "class": "this.__class" } }, usesInheritance: true, ngImport: i0, template: `
5341
- @if (item()) {
5342
- <div
5343
- class="ax-group ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-3 ax-w-full ax-h-full ax-relative ax-overflow-hidden "
5344
- (click)="executeCommand()"
5345
- >
5346
- <div class="ax-absolute ax-inset-0 ax-bg-black/0 hover:ax-bg-black/10 ax-transition-opacity"></div>
5347
- <i [class]="item().icon + ' ax-text-3xl'"></i>
5348
- <span class="ax-text-xl ax-font-semibold">{{ item().title | translate | async }}</span>
5349
- @if (item().description) {
5350
- <span class="ax-text-sm ax-opacity-90 ax-text-center ax-px-2">{{
5351
- item().description! | translate | async
5352
- }}</span>
5353
- }
5354
- </div>
5355
- } @else {
5356
- <div
5357
- (click)="setCommand()"
5358
- class="ax-group ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-3 ax-w-full ax-h-full ax-relative ax-overflow-hidden"
5359
- >
5360
- <div class="ax-absolute ax-inset-0 ax-bg-black/0 hover:ax-bg-black/5 ax-transition-opacity"></div>
5361
- <i class="fa-light fa-plus ax-text-3xl"></i>
5362
- <span class="ax-text-xl ax-font-semibold">{{
5363
- '@dashboard:widgets.dashboard-shortcut.add-shortcut' | translate | async
5364
- }}</span>
5365
- </div>
5366
- }
5367
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5789
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPShortcutWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5790
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPShortcutWidgetViewComponent, isStandalone: true, selector: "ng-component", host: { properties: { "style": "this.__style", "class": "this.__class" } }, usesInheritance: true, ngImport: i0, template: "@if (item()) {\n <div\n class=\"ax-group ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-3 ax-w-full ax-h-full ax-relative ax-overflow-hidden \"\n (click)=\"executeCommand()\"\n >\n <div class=\"ax-absolute ax-inset-0 ax-bg-black/0 hover:ax-bg-black/10 ax-transition-opacity\"></div>\n <i [class]=\"item().icon + ' ax-text-3xl'\"></i>\n <span class=\"ax-text-xl ax-font-semibold\">{{ item().title | translate | async }}</span>\n @if (item().description) {\n <span class=\"ax-text-sm ax-opacity-90 ax-text-center ax-px-2\">{{ item().description! | translate | async }}</span>\n }\n </div>\n} @else {\n <div\n (click)=\"setCommand()\"\n class=\"ax-group ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-3 ax-w-full ax-h-full ax-relative ax-overflow-hidden\"\n >\n <div class=\"ax-absolute ax-inset-0 ax-bg-black/0 hover:ax-bg-black/5 ax-transition-opacity\"></div>\n <i class=\"fa-light fa-plus ax-text-3xl\"></i>\n <span class=\"ax-text-xl ax-font-semibold\">{{\n '@dashboard:widgets.shortcut.add-shortcut' | translate | async\n }}</span>\n </div>\n}\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5368
5791
  }
5369
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDashboardShortcutWidgetViewComponent, decorators: [{
5792
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPShortcutWidgetViewComponent, decorators: [{
5370
5793
  type: Component,
5371
- args: [{
5372
- template: `
5373
- @if (item()) {
5374
- <div
5375
- class="ax-group ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-3 ax-w-full ax-h-full ax-relative ax-overflow-hidden "
5376
- (click)="executeCommand()"
5377
- >
5378
- <div class="ax-absolute ax-inset-0 ax-bg-black/0 hover:ax-bg-black/10 ax-transition-opacity"></div>
5379
- <i [class]="item().icon + ' ax-text-3xl'"></i>
5380
- <span class="ax-text-xl ax-font-semibold">{{ item().title | translate | async }}</span>
5381
- @if (item().description) {
5382
- <span class="ax-text-sm ax-opacity-90 ax-text-center ax-px-2">{{
5383
- item().description! | translate | async
5384
- }}</span>
5385
- }
5386
- </div>
5387
- } @else {
5388
- <div
5389
- (click)="setCommand()"
5390
- class="ax-group ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-3 ax-w-full ax-h-full ax-relative ax-overflow-hidden"
5391
- >
5392
- <div class="ax-absolute ax-inset-0 ax-bg-black/0 hover:ax-bg-black/5 ax-transition-opacity"></div>
5393
- <i class="fa-light fa-plus ax-text-3xl"></i>
5394
- <span class="ax-text-xl ax-font-semibold">{{
5395
- '@dashboard:widgets.dashboard-shortcut.add-shortcut' | translate | async
5396
- }}</span>
5397
- </div>
5398
- }
5399
- `,
5400
- standalone: true,
5401
- changeDetection: ChangeDetectionStrategy.OnPush,
5402
- imports: [CommonModule, AXTranslationModule],
5403
- }]
5794
+ args: [{ standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, AXTranslationModule], template: "@if (item()) {\n <div\n class=\"ax-group ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-3 ax-w-full ax-h-full ax-relative ax-overflow-hidden \"\n (click)=\"executeCommand()\"\n >\n <div class=\"ax-absolute ax-inset-0 ax-bg-black/0 hover:ax-bg-black/10 ax-transition-opacity\"></div>\n <i [class]=\"item().icon + ' ax-text-3xl'\"></i>\n <span class=\"ax-text-xl ax-font-semibold\">{{ item().title | translate | async }}</span>\n @if (item().description) {\n <span class=\"ax-text-sm ax-opacity-90 ax-text-center ax-px-2\">{{ item().description! | translate | async }}</span>\n }\n </div>\n} @else {\n <div\n (click)=\"setCommand()\"\n class=\"ax-group ax-flex ax-flex-col ax-items-center ax-justify-center ax-p-3 ax-w-full ax-h-full ax-relative ax-overflow-hidden\"\n >\n <div class=\"ax-absolute ax-inset-0 ax-bg-black/0 hover:ax-bg-black/5 ax-transition-opacity\"></div>\n <i class=\"fa-light fa-plus ax-text-3xl\"></i>\n <span class=\"ax-text-xl ax-font-semibold\">{{\n '@dashboard:widgets.shortcut.add-shortcut' | translate | async\n }}</span>\n </div>\n}\n", styles: [":host{display:block}\n"] }]
5404
5795
  }], propDecorators: { __style: [{
5405
5796
  type: HostBinding,
5406
5797
  args: ['style']
@@ -5409,15 +5800,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
5409
5800
  args: ['class']
5410
5801
  }] } });
5411
5802
 
5412
- var dashboardShortcutWidgetView_component = /*#__PURE__*/Object.freeze({
5803
+ var shortcutWidgetView_component = /*#__PURE__*/Object.freeze({
5413
5804
  __proto__: null,
5414
- AXPDashboardShortcutWidgetViewComponent: AXPDashboardShortcutWidgetViewComponent
5805
+ AXPShortcutWidgetViewComponent: AXPShortcutWidgetViewComponent
5415
5806
  });
5416
5807
 
5417
- const AXPDashboardShortcutWidget = {
5418
- name: 'dashboard-shortcut',
5419
- title: 'Shortcut',
5420
- description: 'Quick access to your key features.',
5808
+ const AXPShortcutWidget = {
5809
+ name: RootConfig.widgets.shortcut,
5810
+ title: '@dashboard:widgets.shortcut.widget-title',
5811
+ description: '@dashboard:widgets.shortcut.widget-description',
5421
5812
  type: 'view',
5422
5813
  categories: [AXP_WIDGETS_UTILITY_CATEGORY],
5423
5814
  groups: [AXPWidgetGroupEnum.DashboardWidget],
@@ -5425,7 +5816,7 @@ const AXPDashboardShortcutWidget = {
5425
5816
  properties: [
5426
5817
  {
5427
5818
  ...AXP_COLOR_PROPERTY,
5428
- title: '@dashboard:widgets.dashboard-shortcut.color',
5819
+ title: '@dashboard:widgets.shortcut.color',
5429
5820
  },
5430
5821
  ],
5431
5822
  meta: {
@@ -5455,53 +5846,47 @@ const AXPDashboardShortcutWidget = {
5455
5846
  },
5456
5847
  components: {
5457
5848
  view: {
5458
- component: () => Promise.resolve().then(function () { return dashboardShortcutWidgetView_component; }).then((c) => c.AXPDashboardShortcutWidgetViewComponent),
5849
+ component: () => Promise.resolve().then(function () { return shortcutWidgetView_component; }).then((c) => c.AXPShortcutWidgetViewComponent),
5459
5850
  },
5460
5851
  },
5461
5852
  };
5462
5853
 
5463
- class AXPStickyNoteWidgetViewComponent extends AXPValueWidgetComponent {
5854
+ class AXPStickyNoteWidgetViewComponent extends AXPDashboardWidgetComponent {
5464
5855
  constructor() {
5465
5856
  super(...arguments);
5466
5857
  this.isEditing = signal(false, ...(ngDevMode ? [{ debugName: "isEditing" }] : /* istanbul ignore next */ []));
5467
5858
  this.wysiwyg = viewChild('wysiwyg', ...(ngDevMode ? [{ debugName: "wysiwyg" }] : /* istanbul ignore next */ []));
5468
- // protected value = computed(() => this.getValue());
5469
- // protected typeValue = signal<string>('');
5470
- this.value = linkedSignal(() => this.getValue(), ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
5859
+ /** Note HTML persisted in `options.noteText`. */
5860
+ this.value = linkedSignal(() => String(this.options()['noteText'] ?? ''), ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
5471
5861
  this.date = computed(() => this.options()?.['date'] ?? new Date(), ...(ngDevMode ? [{ debugName: "date" }] : /* istanbul ignore next */ []));
5472
5862
  this.bgColor = computed(() => this.options()?.['backgroundColor'] ?? '#FFF8B8', ...(ngDevMode ? [{ debugName: "bgColor" }] : /* istanbul ignore next */ []));
5473
5863
  this.color = signal('#333333', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
5474
5864
  this.el = inject(ElementRef);
5475
- // Modern color palette with pastel and vibrant options
5476
5865
  this.colorPresets = [
5477
- '#FFF8B8', // Soft yellow
5478
- '#FFD8E6', // Soft pink
5479
- '#D1F0FF', // Soft blue
5480
- '#E2FFD1', // Soft green
5481
- '#FFE8D1', // Soft orange
5482
- '#F0D1FF', // Soft purple
5483
- '#FFCDD2', // Soft red
5484
- '#D1FFF0', // Soft teal
5485
- '#F5F5F5', // Light gray
5486
- '#FFFFFF', // White
5866
+ '#FFF8B8',
5867
+ '#FFD8E6',
5868
+ '#D1F0FF',
5869
+ '#E2FFD1',
5870
+ '#FFE8D1',
5871
+ '#F0D1FF',
5872
+ '#FFCDD2',
5873
+ '#D1FFF0',
5874
+ '#F5F5F5',
5875
+ '#FFFFFF',
5487
5876
  ];
5488
5877
  }
5489
- // Handle clicks outside the component to cancel editing
5490
5878
  handleClickOutside(event) {
5491
5879
  const clickedInside = this.el.nativeElement.contains(event.target);
5492
5880
  if (!clickedInside && this.isEditing()) {
5493
5881
  this.saveChanges();
5494
5882
  }
5495
5883
  }
5496
- // Handle double-click to activate editing
5497
5884
  activateEdit() {
5498
- //TODO FOCUS WYSIWYG
5499
5885
  this.wysiwyg()?.focus();
5500
5886
  this.isEditing.set(true);
5501
5887
  }
5502
- // Save changes and exit edit mode
5503
5888
  saveChanges() {
5504
- this.setValue(this.value());
5889
+ this.setOptions({ noteText: this.value() });
5505
5890
  this.isEditing.set(false);
5506
5891
  }
5507
5892
  setColor(color) {
@@ -5531,7 +5916,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
5531
5916
  AXFormatModule,
5532
5917
  AXPopoverModule,
5533
5918
  CommonModule,
5534
- FormsModule,
5535
5919
  AXColorBoxModule,
5536
5920
  ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
5537
5921
  {
@@ -5550,22 +5934,25 @@ var stickyNoteWidget_component = /*#__PURE__*/Object.freeze({
5550
5934
  });
5551
5935
 
5552
5936
  const AXPStickyNoteWidget = {
5553
- name: 'sticky-note',
5554
- title: 'Sticky Note Widget',
5937
+ name: RootConfig.widgets.stickyNote,
5938
+ title: '@dashboard:widgets.sticky-note.widget-title',
5939
+ description: '@dashboard:widgets.sticky-note.widget-description',
5555
5940
  categories: AXP_WIDGETS_UTILITY_CATEGORY,
5556
5941
  groups: [AXPWidgetGroupEnum.DashboardWidget],
5557
5942
  type: 'dashboard',
5558
5943
  icon: 'fa-light fa-sticky-note',
5559
5944
  properties: [
5560
- AXP_DATA_PATH_PROPERTY,
5945
+ createStringProperty({
5946
+ name: 'noteText',
5947
+ title: '@dashboard:widgets.sticky-note.note-text',
5948
+ path: 'options.noteText',
5949
+ group: AXP_DATA_PROPERTY_GROUP,
5950
+ defaultValue: '',
5951
+ }),
5561
5952
  {
5562
5953
  ...AXP_BG_COLOR_PROPERTY,
5563
5954
  title: '@dashboard:widgets.sticky-note.background-color',
5564
5955
  },
5565
- {
5566
- ...plainTextDefaultProperty(),
5567
- title: '@dashboard:widgets.sticky-note.note-text',
5568
- },
5569
5956
  ],
5570
5957
  components: {
5571
5958
  view: {
@@ -5602,13 +5989,16 @@ const AXPStickyNoteWidget = {
5602
5989
  //#endregion
5603
5990
  //#region ---- Dashboard Management Widgets Provider ----
5604
5991
  const DASHBOARD_WIDGETS = [
5605
- AXPDashboardShortcutWidget,
5992
+ AXPShortcutWidget,
5606
5993
  AXPDonutChartWidget,
5607
5994
  AXPBarChartWidget,
5608
5995
  AXPLineChartWidget,
5996
+ AXPFunnelChartWidget,
5997
+ AXPHeatmapChartWidget,
5609
5998
  AXPKpiProgressWidget,
5610
5999
  AXPKpiSegmentedWidget,
5611
6000
  AXPKpiDetailsWidget,
6001
+ AXPKpiStatCardWidget,
5612
6002
  AXPGaugeChartWidget,
5613
6003
  AXPStickyNoteWidget,
5614
6004
  AXPMinimalWeatherWidget,
@@ -6956,7 +7346,7 @@ withMethods((store, dashboardPopup = inject(AXMDashboardPopupService), dialogSer
6956
7346
  });
6957
7347
  const filteredWidgets = widgets.map(({ __meta__, ...rest }) => {
6958
7348
  const widget = rest;
6959
- if (widget.type === 'sticky-note' && !widget.options) {
7349
+ if (widget.type === RootConfig.widgets.stickyNote && !widget.options) {
6960
7350
  widget.options = { hasConfiguration: false };
6961
7351
  }
6962
7352
  const randomId = AXPDataGenerator.uuid();
@@ -7435,7 +7825,7 @@ class AXMDashboardHomeComponent extends AXPPageLayoutBaseComponent {
7435
7825
  provide: AXPPageLayoutBase,
7436
7826
  useExisting: AXMDashboardHomeComponent,
7437
7827
  },
7438
- ], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <axp-page-content class=\"ax-relative\">\n <!-- Loading State -->\n @if (store.isLoading()) {\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 }\n <!-- No Dashboards State -->\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 (click)=\"execute({ name: 'new-dashboard' })\" class=\"ax-underline\">\n {{ '@dashboard:add-first-dashboard' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n }\n <!-- No Widgets State -->\n @else if (!store.selectedDashboard()?.widgets?.length) {\n <axp-state-message\n icon=\"fa-light fa-shapes\"\n [title]=\"'@dashboard:no-widgets.title'\"\n [description]=\"'@dashboard:no-widgets.description'\"\n >\n <div slot=\"actions\">\n <button (click)=\"execute({ name: 'new-widget' })\" class=\"ax-underline\">\n {{ '@dashboard:add-widget' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n }\n <!-- Dashboard Grid -->\n @else {\n <axp-widgets-container [context]=\"context()\">\n <ax-grid-layout-container\n class=\"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) | axpResolveMultiLanguageString |\n translate | async;\n <axm-dashboard-widget-wrapper\n [title]=\"title!\"\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 </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:.375rem!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}\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: AXPWidgetCoreModule }, { kind: "component", type: i2$3.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i2$3.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXButtonGroupModule }, { kind: "ngmodule", type: AXGridLayoutBuilderModule }, { kind: "component", type: i3$2.AXGridLayoutContainerComponent, selector: "ax-grid-layout-container", inputs: ["options", "isEmpty"], outputs: ["onAdded", "onRemoved", "onWidgetChange", "onChange", "onRender", "isEmptyChange"] }, { kind: "component", type: i3$2.AXGridLayoutWidgetComponent, selector: "ax-grid-layout-widget", inputs: ["options"] }, { 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: AXMDashboardWidgetWrapperComponent, selector: "axm-dashboard-widget-wrapper", inputs: ["title", "hasConfiguration", "isLocked"], outputs: ["onDelete", "onConfiguration", "onValueChanged", "onOptionsChanged"] }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "variant"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AXPResolveMultiLanguageStringPipe, name: "axpResolveMultiLanguageString" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
7828
+ ], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <axp-page-content class=\"ax-relative\">\n <!-- Loading State -->\n @if (store.isLoading()) {\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 }\n <!-- No Dashboards State -->\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 (click)=\"execute({ name: 'new-dashboard' })\" class=\"ax-underline\">\n {{ '@dashboard:add-first-dashboard' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n }\n <!-- No Widgets State -->\n @else if (!store.selectedDashboard()?.widgets?.length) {\n <axp-state-message\n icon=\"fa-light fa-shapes\"\n [title]=\"'@dashboard:no-widgets.title'\"\n [description]=\"'@dashboard:no-widgets.description'\"\n >\n <div slot=\"actions\">\n <button (click)=\"execute({ name: 'new-widget' })\" class=\"ax-underline\">\n {{ '@dashboard:add-widget' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n }\n <!-- Dashboard Grid -->\n @else {\n <axp-widgets-container [context]=\"context()\">\n <ax-grid-layout-container\n class=\"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; @let\n isHeaderTitleVisible = widget.node?.meta?.['title']?.['visible'] ?? true;\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 </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}\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: AXPWidgetCoreModule }, { kind: "component", type: i2$3.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i2$3.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXButtonGroupModule }, { kind: "ngmodule", type: AXGridLayoutBuilderModule }, { kind: "component", type: i3$2.AXGridLayoutContainerComponent, selector: "ax-grid-layout-container", inputs: ["options", "isEmpty"], outputs: ["onAdded", "onRemoved", "onWidgetChange", "onChange", "onRender", "isEmptyChange"] }, { kind: "component", type: i3$2.AXGridLayoutWidgetComponent, selector: "ax-grid-layout-widget", inputs: ["options"] }, { 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: AXMDashboardWidgetWrapperComponent, selector: "axm-dashboard-widget-wrapper", inputs: ["title", "hasConfiguration", "isLocked"], outputs: ["onDelete", "onConfiguration", "onValueChanged", "onOptionsChanged"] }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "variant"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
7439
7829
  }
7440
7830
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDashboardHomeComponent, decorators: [{
7441
7831
  type: Component,
@@ -7455,7 +7845,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7455
7845
  AXBreadcrumbsModule,
7456
7846
  AXMDashboardWidgetWrapperComponent,
7457
7847
  AXPStateMessageComponent,
7458
- AXPResolveMultiLanguageStringPipe,
7459
7848
  ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
7460
7849
  AXPDesignerService,
7461
7850
  AXMDashboardStore,
@@ -7463,7 +7852,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7463
7852
  provide: AXPPageLayoutBase,
7464
7853
  useExisting: AXMDashboardHomeComponent,
7465
7854
  },
7466
- ], template: "<axp-page-layout *translate=\"let t\">\n <axp-page-content class=\"ax-relative\">\n <!-- Loading State -->\n @if (store.isLoading()) {\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 }\n <!-- No Dashboards State -->\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 (click)=\"execute({ name: 'new-dashboard' })\" class=\"ax-underline\">\n {{ '@dashboard:add-first-dashboard' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n }\n <!-- No Widgets State -->\n @else if (!store.selectedDashboard()?.widgets?.length) {\n <axp-state-message\n icon=\"fa-light fa-shapes\"\n [title]=\"'@dashboard:no-widgets.title'\"\n [description]=\"'@dashboard:no-widgets.description'\"\n >\n <div slot=\"actions\">\n <button (click)=\"execute({ name: 'new-widget' })\" class=\"ax-underline\">\n {{ '@dashboard:add-widget' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n }\n <!-- Dashboard Grid -->\n @else {\n <axp-widgets-container [context]=\"context()\">\n <ax-grid-layout-container\n class=\"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) | axpResolveMultiLanguageString |\n translate | async;\n <axm-dashboard-widget-wrapper\n [title]=\"title!\"\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 </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:.375rem!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}\n"] }]
7855
+ ], template: "<axp-page-layout *translate=\"let t\">\n <axp-page-content class=\"ax-relative\">\n <!-- Loading State -->\n @if (store.isLoading()) {\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 }\n <!-- No Dashboards State -->\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 (click)=\"execute({ name: 'new-dashboard' })\" class=\"ax-underline\">\n {{ '@dashboard:add-first-dashboard' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n }\n <!-- No Widgets State -->\n @else if (!store.selectedDashboard()?.widgets?.length) {\n <axp-state-message\n icon=\"fa-light fa-shapes\"\n [title]=\"'@dashboard:no-widgets.title'\"\n [description]=\"'@dashboard:no-widgets.description'\"\n >\n <div slot=\"actions\">\n <button (click)=\"execute({ name: 'new-widget' })\" class=\"ax-underline\">\n {{ '@dashboard:add-widget' | translate | async }}\n </button>\n </div>\n </axp-state-message>\n }\n <!-- Dashboard Grid -->\n @else {\n <axp-widgets-container [context]=\"context()\">\n <ax-grid-layout-container\n class=\"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; @let\n isHeaderTitleVisible = widget.node?.meta?.['title']?.['visible'] ?? true;\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 </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}\n"] }]
7467
7856
  }] });
7468
7857
 
7469
7858
  var homeDashboard = /*#__PURE__*/Object.freeze({
@@ -7477,9 +7866,12 @@ class AXMAddDashboardPopup extends AXBasePageComponent {
7477
7866
  constructor() {
7478
7867
  super(...arguments);
7479
7868
  this.scope = RootConfig.config.i18n;
7480
- this.jobDefinitionService = inject(AXMOrganizationManagementJobDefinitionEntityService);
7869
+ this.entityService = inject(AXPEntityService);
7870
+ this.jobDefinitionData = this.entityService
7871
+ .withEntity(RootConfig$1.module.name, RootConfig$1.entities.jobDefinition.name)
7872
+ .data();
7481
7873
  this.sessionService = inject(AXPSessionService);
7482
- this.multiLanguageResolver = inject(AXPMultiLanguageStringResolverService);
7874
+ this.multiLanguageResolver = inject(AXTranslationService);
7483
7875
  this.title = model('', ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
7484
7876
  this.description = model('', ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
7485
7877
  this.selectedRoleIds = model([], ...(ngDevMode ? [{ debugName: "selectedRoleIds" }] : /* istanbul ignore next */ []));
@@ -7503,7 +7895,7 @@ class AXMAddDashboardPopup extends AXBasePageComponent {
7503
7895
  // Load roles if admin
7504
7896
  if (this.showAdminFields()) {
7505
7897
  try {
7506
- const result = await this.jobDefinitionService.query({ skip: 0, take: 100 });
7898
+ const result = await this.jobDefinitionData.query({ skip: 0, take: 100 });
7507
7899
  if (result.items && result.items.length > 0) {
7508
7900
  this.roles = result.items.map((i) => ({
7509
7901
  id: i.id,
@@ -7705,5 +8097,5 @@ var AXPHomeDashboardSetting;
7705
8097
  * Generated bundle index. Do not edit.
7706
8098
  */
7707
8099
 
7708
- export { AXMAddDashboardPopup, AXMAdvancedWeatherViewComponent, AXMAnalogClockComponent, AXMClockWidgetViewComponent, AXMConfigurationPopup, AXMDashboardEntityModule, AXMDashboardHomeComponent, AXMDashboardManagementModule, AXMDashboardPopupService, AXMDashboardService, AXMDashboardServiceImpl, AXMDashboardStore, AXMDashboardWidgetWrapperComponent, AXMMinimalWeatherViewComponent, AXPAdvancedWeatherWidget, AXPAnalogClockWidget, AXPBarChartWidget, AXPBarChartWidgetViewComponent, AXPClockCalendarWidget, AXPClockCalendarWidgetViewComponent, AXPDashboardShortcutWidget, AXPDashboardShortcutWidgetViewComponent, AXPDonutChartWidget, AXPDonutChartWidgetViewComponent, AXPGaugeChartWidget, AXPGaugeChartWidgetViewComponent, AXPHomeDashboardSetting, AXPKpiDetailsWidget, AXPKpiDetailsWidgetViewComponent, AXPKpiProgressWidget, AXPKpiProgressWidgetViewComponent, AXPKpiSegmentedWidget, AXPKpiSegmentedWidgetViewComponent, AXPLineChartWidget, AXPLineChartWidgetViewComponent, AXPMinimalWeatherWidget, AXPStickyNoteWidget, AXPStickyNoteWidgetViewComponent, AXPWeatherApiAbstract, AXPWeatherApiMockService, AXPWeatherApiService, AXPWeatherWidget, AXPWeatherWidgetViewComponent, AXP_DATE_FORMAT_OPTIONS, AXP_TIMEZONE_OPTIONS, AXP_WIDGETS_CHART_CATEGORY, AXP_WIDGETS_UTILITY_CATEGORY, RootConfig, dashboardFactory };
8100
+ export { AXMAddDashboardPopup, AXMAdvancedWeatherViewComponent, AXMAnalogClockComponent, AXMClockWidgetViewComponent, AXMConfigurationPopup, AXMDashboardEntityModule, AXMDashboardHomeComponent, AXMDashboardManagementModule, AXMDashboardPopupService, AXMDashboardService, AXMDashboardServiceImpl, AXMDashboardStore, AXMDashboardWidgetWrapperComponent, AXMMinimalWeatherViewComponent, AXPAdvancedWeatherWidget, AXPAnalogClockWidget, AXPBarChartWidget, AXPBarChartWidgetViewComponent, AXPClockCalendarWidget, AXPClockCalendarWidgetViewComponent, AXPDashboardWidgetComponent, AXPDonutChartWidget, AXPDonutChartWidgetViewComponent, AXPFunnelChartWidget, AXPFunnelChartWidgetViewComponent, AXPGaugeChartWidget, AXPGaugeChartWidgetViewComponent, AXPHeatmapChartWidget, AXPHeatmapChartWidgetViewComponent, AXPHomeDashboardSetting, AXPKpiDetailsWidget, AXPKpiDetailsWidgetViewComponent, AXPKpiProgressWidget, AXPKpiProgressWidgetViewComponent, AXPKpiSegmentedWidget, AXPKpiSegmentedWidgetViewComponent, AXPKpiStatCardWidget, AXPKpiStatCardWidgetViewComponent, AXPLineChartWidget, AXPLineChartWidgetViewComponent, AXPMinimalWeatherWidget, AXPShortcutWidget, AXPShortcutWidgetViewComponent, AXPStickyNoteWidget, AXPStickyNoteWidgetViewComponent, AXPWeatherApiAbstract, AXPWeatherApiMockService, AXPWeatherApiService, AXPWeatherWidget, AXPWeatherWidgetViewComponent, AXP_DATE_FORMAT_OPTIONS, AXP_TIMEZONE_OPTIONS, AXP_WIDGETS_CHART_CATEGORY, AXP_WIDGETS_UTILITY_CATEGORY, RootConfig, dashboardFactory };
7709
8101
  //# sourceMappingURL=acorex-modules-dashboard-management.mjs.map