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

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 (393) hide show
  1. package/fesm2022/{acorex-modules-ai-management-acorex-modules-ai-management-WuqoH4OL.mjs → acorex-modules-ai-management-acorex-modules-ai-management-Bqfx8OTv.mjs} +718 -106
  2. package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-Bqfx8OTv.mjs.map +1 -0
  3. package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-column.component-D0ruV6aJ.mjs +44 -0
  4. package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-column.component-D0ruV6aJ.mjs.map +1 -0
  5. package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-DyczMN-R.mjs +256 -0
  6. package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-DyczMN-R.mjs.map +1 -0
  7. package/fesm2022/{acorex-modules-ai-management-agent.entity-DK9GNMdR.mjs → acorex-modules-ai-management-agent.entity-CpSXisAh.mjs} +83 -94
  8. package/fesm2022/acorex-modules-ai-management-agent.entity-CpSXisAh.mjs.map +1 -0
  9. package/fesm2022/{acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CWXEW9yL.mjs → acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CYk2rB36.mjs} +62 -20
  10. package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CYk2rB36.mjs.map +1 -0
  11. 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-BDcW8BRI.mjs} +3 -5
  12. package/fesm2022/{acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-CNKwIqUE.mjs.map → acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-BDcW8BRI.mjs.map} +1 -1
  13. package/fesm2022/{acorex-modules-ai-management-assist.entity-DX2U9sd5.mjs → acorex-modules-ai-management-assist.entity-7uTePpME.mjs} +2 -2
  14. package/fesm2022/{acorex-modules-ai-management-assist.entity-DX2U9sd5.mjs.map → acorex-modules-ai-management-assist.entity-7uTePpME.mjs.map} +1 -1
  15. package/fesm2022/acorex-modules-ai-management-index-DUojDUau.mjs +2 -0
  16. package/fesm2022/{acorex-modules-ai-management-index-KX3TVRXr.mjs.map → acorex-modules-ai-management-index-DUojDUau.mjs.map} +1 -1
  17. package/fesm2022/{acorex-modules-ai-management-model.entity-BeuDUahR.mjs → acorex-modules-ai-management-model.entity-C9J3trsK.mjs} +2 -2
  18. package/fesm2022/{acorex-modules-ai-management-model.entity-BeuDUahR.mjs.map → acorex-modules-ai-management-model.entity-C9J3trsK.mjs.map} +1 -1
  19. package/fesm2022/{acorex-modules-ai-management-open-ai-endpoint.entity-D-9unl6i.mjs → acorex-modules-ai-management-open-ai-endpoint.entity-kHsxkjEd.mjs} +2 -2
  20. package/fesm2022/{acorex-modules-ai-management-open-ai-endpoint.entity-D-9unl6i.mjs.map → acorex-modules-ai-management-open-ai-endpoint.entity-kHsxkjEd.mjs.map} +1 -1
  21. package/fesm2022/acorex-modules-ai-management.mjs +1 -1
  22. package/fesm2022/acorex-modules-application-management.mjs +1 -1
  23. package/fesm2022/acorex-modules-application-management.mjs.map +1 -1
  24. package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-BNK6C-Ng.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-CMS2WJDu.mjs} +510 -437
  25. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-CMS2WJDu.mjs.map +1 -0
  26. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-Ds8pRzvE.mjs → acorex-modules-assessment-management-assessment-case.entity-C-Q4hu8o.mjs} +2 -2
  27. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-Ds8pRzvE.mjs.map → acorex-modules-assessment-management-assessment-case.entity-C-Q4hu8o.mjs.map} +1 -1
  28. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-tq1Q4wkS.mjs → acorex-modules-assessment-management-assessment-session.entity-CQI_FpUd.mjs} +2 -2
  29. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-tq1Q4wkS.mjs.map → acorex-modules-assessment-management-assessment-session.entity-CQI_FpUd.mjs.map} +1 -1
  30. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-yf0PnWC0.mjs → acorex-modules-assessment-management-fill-assessment-session.command-Bpvco5iD.mjs} +2 -2
  31. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-yf0PnWC0.mjs.map → acorex-modules-assessment-management-fill-assessment-session.command-Bpvco5iD.mjs.map} +1 -1
  32. package/fesm2022/{acorex-modules-assessment-management-index-B2SncZAW.mjs → acorex-modules-assessment-management-index-_fPuBQeK.mjs} +25 -26
  33. package/fesm2022/acorex-modules-assessment-management-index-_fPuBQeK.mjs.map +1 -0
  34. package/fesm2022/{acorex-modules-assessment-management-preview-question.command-DPzL8C44.mjs → acorex-modules-assessment-management-preview-question.command-drR6nq76.mjs} +10 -11
  35. package/fesm2022/acorex-modules-assessment-management-preview-question.command-drR6nq76.mjs.map +1 -0
  36. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BrI5gFtx.mjs → acorex-modules-assessment-management-preview-questionnaire.command-CY8tZWdG.mjs} +2 -2
  37. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BrI5gFtx.mjs.map → acorex-modules-assessment-management-preview-questionnaire.command-CY8tZWdG.mjs.map} +1 -1
  38. 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-DV9irFZ0.mjs} +2 -2
  39. 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-DV9irFZ0.mjs.map} +1 -1
  40. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-CZ32sQ9M.mjs → acorex-modules-assessment-management-question-bank-item.entity-DO4bTKKo.mjs} +2 -2
  41. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-CZ32sQ9M.mjs.map → acorex-modules-assessment-management-question-bank-item.entity-DO4bTKKo.mjs.map} +1 -1
  42. package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-C7gf4s1y.mjs → acorex-modules-assessment-management-questionnaire-calculation.entity-B-N0v4zs.mjs} +2 -2
  43. package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-C7gf4s1y.mjs.map → acorex-modules-assessment-management-questionnaire-calculation.entity-B-N0v4zs.mjs.map} +1 -1
  44. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-BZyIlYWg.mjs → acorex-modules-assessment-management-questionnaire-viewer-popup.component-Cc-o6qmY.mjs} +3 -3
  45. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-BZyIlYWg.mjs.map → acorex-modules-assessment-management-questionnaire-viewer-popup.component-Cc-o6qmY.mjs.map} +1 -1
  46. package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-CmmThk2f.mjs → acorex-modules-assessment-management-questionnaire.entity-CJWNlaJs.mjs} +3 -3
  47. package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-CmmThk2f.mjs.map → acorex-modules-assessment-management-questionnaire.entity-CJWNlaJs.mjs.map} +1 -1
  48. package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-GLqvK8wB.mjs → acorex-modules-assessment-management-save-questionnaire-questions.command-C3gOkZa5.mjs} +2 -2
  49. package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-GLqvK8wB.mjs.map → acorex-modules-assessment-management-save-questionnaire-questions.command-C3gOkZa5.mjs.map} +1 -1
  50. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-CU1TVonZ.mjs → acorex-modules-assessment-management-view-session-answers.command-AvTbWvGE.mjs} +2 -2
  51. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-CU1TVonZ.mjs.map → acorex-modules-assessment-management-view-session-answers.command-AvTbWvGE.mjs.map} +1 -1
  52. package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
  53. package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-BDs0ZgD5.mjs → acorex-modules-asset-management-acorex-modules-asset-management-BRap9yt6.mjs} +761 -133
  54. package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-BRap9yt6.mjs.map +1 -0
  55. package/fesm2022/acorex-modules-asset-management-asset-rental-history.entity-B_QZI3Cy.mjs +302 -0
  56. package/fesm2022/acorex-modules-asset-management-asset-rental-history.entity-B_QZI3Cy.mjs.map +1 -0
  57. package/fesm2022/acorex-modules-asset-management-asset-status.rules-BL0Osjqv.mjs +98 -0
  58. package/fesm2022/acorex-modules-asset-management-asset-status.rules-BL0Osjqv.mjs.map +1 -0
  59. package/fesm2022/{acorex-modules-asset-management-asset-system-history.entity-CSCwWY_F.mjs → acorex-modules-asset-management-asset-system-assignment.entity-BRz8vItS.mjs} +77 -48
  60. package/fesm2022/acorex-modules-asset-management-asset-system-assignment.entity-BRz8vItS.mjs.map +1 -0
  61. package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-CcefMT8J.mjs → acorex-modules-asset-management-asset-system-type.entity-b_o5UnuE.mjs} +72 -40
  62. package/fesm2022/acorex-modules-asset-management-asset-system-type.entity-b_o5UnuE.mjs.map +1 -0
  63. package/fesm2022/{acorex-modules-asset-management-assetSystem.entity-Dq2ASslk.mjs → acorex-modules-asset-management-asset-system.entity-C6ak4u9z.mjs} +41 -29
  64. package/fesm2022/acorex-modules-asset-management-asset-system.entity-C6ak4u9z.mjs.map +1 -0
  65. package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-6Rauu2Z1.mjs → acorex-modules-asset-management-asset-type-section-component.entity-BQjGo1s1.mjs} +2 -2
  66. package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-6Rauu2Z1.mjs.map → acorex-modules-asset-management-asset-type-section-component.entity-BQjGo1s1.mjs.map} +1 -1
  67. package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-r_H1QGwp.mjs → acorex-modules-asset-management-asset-type-section.entity-C1DJZZFy.mjs} +6 -48
  68. package/fesm2022/acorex-modules-asset-management-asset-type-section.entity-C1DJZZFy.mjs.map +1 -0
  69. package/fesm2022/{acorex-modules-asset-management-asset-type.entity-cWVqpbHH.mjs → acorex-modules-asset-management-asset-type.entity-CtOnArR9.mjs} +68 -105
  70. package/fesm2022/acorex-modules-asset-management-asset-type.entity-CtOnArR9.mjs.map +1 -0
  71. package/fesm2022/{acorex-modules-asset-management-asset.entity-CamZGWTM.mjs → acorex-modules-asset-management-asset.entity-BaET-kSd.mjs} +257 -245
  72. package/fesm2022/acorex-modules-asset-management-asset.entity-BaET-kSd.mjs.map +1 -0
  73. package/fesm2022/acorex-modules-asset-management-assetLifecycleState.provider-DZ5r2zx7.mjs +192 -0
  74. package/fesm2022/acorex-modules-asset-management-assetLifecycleState.provider-DZ5r2zx7.mjs.map +1 -0
  75. package/fesm2022/acorex-modules-asset-management-status.provider-C41t4e2U.mjs +363 -0
  76. package/fesm2022/acorex-modules-asset-management-status.provider-C41t4e2U.mjs.map +1 -0
  77. package/fesm2022/acorex-modules-asset-management.mjs +1 -1
  78. package/fesm2022/acorex-modules-business-core.mjs +17 -11
  79. package/fesm2022/acorex-modules-business-core.mjs.map +1 -1
  80. package/fesm2022/acorex-modules-common.mjs +166 -122
  81. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  82. package/fesm2022/acorex-modules-conversation.mjs +4786 -4080
  83. package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
  84. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-yqfev--M.mjs +8486 -0
  85. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-yqfev--M.mjs.map +1 -0
  86. package/fesm2022/acorex-modules-dashboard-management-index-CYnWQ2od.mjs +127 -0
  87. package/fesm2022/acorex-modules-dashboard-management-index-CYnWQ2od.mjs.map +1 -0
  88. package/fesm2022/acorex-modules-dashboard-management.mjs +1 -7708
  89. package/fesm2022/acorex-modules-dashboard-management.mjs.map +1 -1
  90. package/fesm2022/acorex-modules-data-management.mjs +63 -35
  91. package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
  92. package/fesm2022/acorex-modules-document-management.mjs +131 -62
  93. package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
  94. package/fesm2022/acorex-modules-financial-core.mjs.map +1 -1
  95. package/fesm2022/acorex-modules-form-template-management.mjs +1 -1
  96. package/fesm2022/acorex-modules-form-template-management.mjs.map +1 -1
  97. package/fesm2022/{acorex-modules-health-core-allergy-type.entity-CS8a-AUb.mjs → acorex-modules-health-core-allergy-type.entity-BvJmDMcr.mjs} +3 -3
  98. package/fesm2022/acorex-modules-health-core-allergy-type.entity-BvJmDMcr.mjs.map +1 -0
  99. package/fesm2022/{acorex-modules-health-core-blood-type.entity-ZgFOuvG4.mjs → acorex-modules-health-core-blood-type.entity-Vpw9y9J5.mjs} +3 -3
  100. package/fesm2022/acorex-modules-health-core-blood-type.entity-Vpw9y9J5.mjs.map +1 -0
  101. package/fesm2022/{acorex-modules-health-core-body-part.entity-JGLwrFE2.mjs → acorex-modules-health-core-body-part.entity-Cz2NEAqm.mjs} +3 -3
  102. package/fesm2022/acorex-modules-health-core-body-part.entity-Cz2NEAqm.mjs.map +1 -0
  103. package/fesm2022/{acorex-modules-health-core-chronic-condition-type.entity-DrxEPQj1.mjs → acorex-modules-health-core-chronic-condition-type.entity-CKWVW0Rg.mjs} +3 -3
  104. package/fesm2022/acorex-modules-health-core-chronic-condition-type.entity-CKWVW0Rg.mjs.map +1 -0
  105. package/fesm2022/{acorex-modules-health-core-disability-status.entity-UaAQFFMC.mjs → acorex-modules-health-core-disability-status.entity-C7NwwT0i.mjs} +3 -3
  106. package/fesm2022/acorex-modules-health-core-disability-status.entity-C7NwwT0i.mjs.map +1 -0
  107. package/fesm2022/{acorex-modules-health-core-injury-type.entity-DcIn0rxz.mjs → acorex-modules-health-core-injury-type.entity-bfzL6j8C.mjs} +3 -3
  108. package/fesm2022/acorex-modules-health-core-injury-type.entity-bfzL6j8C.mjs.map +1 -0
  109. package/fesm2022/{acorex-modules-health-core-vaccination-type.entity-zYd6KLRC.mjs → acorex-modules-health-core-vaccination-type.entity-CqymQfWK.mjs} +3 -3
  110. package/fesm2022/acorex-modules-health-core-vaccination-type.entity-CqymQfWK.mjs.map +1 -0
  111. package/fesm2022/acorex-modules-health-core.mjs +7 -7
  112. package/fesm2022/acorex-modules-health-core.mjs.map +1 -1
  113. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-Ck9q-IWW.mjs +1922 -0
  114. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-Ck9q-IWW.mjs.map +1 -0
  115. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-BRUrGVh1.mjs → acorex-modules-human-capital-management-approve-leave-request.command-qYSPyG_q.mjs} +2 -2
  116. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-BRUrGVh1.mjs.map → acorex-modules-human-capital-management-approve-leave-request.command-qYSPyG_q.mjs.map} +1 -1
  117. package/fesm2022/acorex-modules-human-capital-management-assign-position-assignment.command-Da3u1fo5.mjs +90 -0
  118. package/fesm2022/acorex-modules-human-capital-management-assign-position-assignment.command-Da3u1fo5.mjs.map +1 -0
  119. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-B16M3F8s.mjs → acorex-modules-human-capital-management-cancel-leave-request.command-DstI60jo.mjs} +2 -2
  120. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-B16M3F8s.mjs.map → acorex-modules-human-capital-management-cancel-leave-request.command-DstI60jo.mjs.map} +1 -1
  121. package/fesm2022/{acorex-modules-human-capital-management-employee.entity-BRpqFRuI.mjs → acorex-modules-human-capital-management-employee.entity-DjMQm3VC.mjs} +71 -25
  122. package/fesm2022/acorex-modules-human-capital-management-employee.entity-DjMQm3VC.mjs.map +1 -0
  123. package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-7ZGZYxGM.mjs → acorex-modules-human-capital-management-employment-type.entity-v8WzEHiE.mjs} +5 -5
  124. package/fesm2022/acorex-modules-human-capital-management-employment-type.entity-v8WzEHiE.mjs.map +1 -0
  125. package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-B3Rk84bJ.mjs → acorex-modules-human-capital-management-leave-request.entity-B9Bf-Nnm.mjs} +71 -21
  126. package/fesm2022/acorex-modules-human-capital-management-leave-request.entity-B9Bf-Nnm.mjs.map +1 -0
  127. package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-OKu8_PP1.mjs → acorex-modules-human-capital-management-leave-type.entity-Bpfd_hNb.mjs} +5 -6
  128. package/fesm2022/acorex-modules-human-capital-management-leave-type.entity-Bpfd_hNb.mjs.map +1 -0
  129. package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-D_C459kx.mjs → acorex-modules-human-capital-management-position-assignment.entity-f0IDrLSn.mjs} +81 -7
  130. package/fesm2022/acorex-modules-human-capital-management-position-assignment.entity-f0IDrLSn.mjs.map +1 -0
  131. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-C0_moDp9.mjs → acorex-modules-human-capital-management-reject-leave-request.command-DxNsroYI.mjs} +2 -2
  132. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-C0_moDp9.mjs.map → acorex-modules-human-capital-management-reject-leave-request.command-DxNsroYI.mjs.map} +1 -1
  133. package/fesm2022/acorex-modules-human-capital-management-revoke-position-assignment.command-C3J9pcfh.mjs +97 -0
  134. package/fesm2022/acorex-modules-human-capital-management-revoke-position-assignment.command-C3J9pcfh.mjs.map +1 -0
  135. package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1629
  136. package/fesm2022/acorex-modules-human-capital-management.mjs.map +1 -1
  137. package/fesm2022/{acorex-modules-learning-management-certificate-definition.entity-27VKYxw1.mjs → acorex-modules-learning-management-certificate-definition.entity-C_r1Djcx.mjs} +4 -4
  138. package/fesm2022/acorex-modules-learning-management-certificate-definition.entity-C_r1Djcx.mjs.map +1 -0
  139. package/fesm2022/{acorex-modules-learning-management-certificate-type.entity-CBM6N-PD.mjs → acorex-modules-learning-management-certificate-type.entity-DAJNtUya.mjs} +42 -20
  140. package/fesm2022/acorex-modules-learning-management-certificate-type.entity-DAJNtUya.mjs.map +1 -0
  141. package/fesm2022/{acorex-modules-learning-management-certificate.entity-BRBJQYji.mjs → acorex-modules-learning-management-certificate.entity-CSD_CX4V.mjs} +5 -5
  142. package/fesm2022/acorex-modules-learning-management-certificate.entity-CSD_CX4V.mjs.map +1 -0
  143. package/fesm2022/{acorex-modules-learning-management-course-type.entity-B1c6PDLq.mjs → acorex-modules-learning-management-course-type.entity-DmjeLMxV.mjs} +39 -17
  144. package/fesm2022/acorex-modules-learning-management-course-type.entity-DmjeLMxV.mjs.map +1 -0
  145. package/fesm2022/{acorex-modules-learning-management-course.entity-BN8XHAPz.mjs → acorex-modules-learning-management-course.entity-DUUgeikJ.mjs} +3 -3
  146. package/fesm2022/acorex-modules-learning-management-course.entity-DUUgeikJ.mjs.map +1 -0
  147. package/fesm2022/{acorex-modules-learning-management-learning-path.entity-8QlM3R4B.mjs → acorex-modules-learning-management-learning-path.entity-Zo--bDto.mjs} +39 -17
  148. package/fesm2022/acorex-modules-learning-management-learning-path.entity-Zo--bDto.mjs.map +1 -0
  149. package/fesm2022/{acorex-modules-learning-management-skill-level.entity-DXOWslpB.mjs → acorex-modules-learning-management-skill-level.entity-XVCTHW3O.mjs} +10 -10
  150. package/fesm2022/acorex-modules-learning-management-skill-level.entity-XVCTHW3O.mjs.map +1 -0
  151. package/fesm2022/{acorex-modules-learning-management-skill.entity-DrLts807.mjs → acorex-modules-learning-management-skill.entity-VXkLbaD4.mjs} +35 -13
  152. package/fesm2022/acorex-modules-learning-management-skill.entity-VXkLbaD4.mjs.map +1 -0
  153. package/fesm2022/{acorex-modules-learning-management-training-definition.entity-NQqJ5avw.mjs → acorex-modules-learning-management-training-definition.entity-BbVZ9_go.mjs} +3 -3
  154. package/fesm2022/acorex-modules-learning-management-training-definition.entity-BbVZ9_go.mjs.map +1 -0
  155. package/fesm2022/{acorex-modules-learning-management-training-type.entity-CoyDCeen.mjs → acorex-modules-learning-management-training-type.entity-C1otrA63.mjs} +36 -14
  156. package/fesm2022/acorex-modules-learning-management-training-type.entity-C1otrA63.mjs.map +1 -0
  157. package/fesm2022/{acorex-modules-learning-management-training.entity-BCGn0T3H.mjs → acorex-modules-learning-management-training.entity-C4KDv1uh.mjs} +3 -3
  158. package/fesm2022/acorex-modules-learning-management-training.entity-C4KDv1uh.mjs.map +1 -0
  159. package/fesm2022/acorex-modules-learning-management.mjs +716 -19
  160. package/fesm2022/acorex-modules-learning-management.mjs.map +1 -1
  161. package/fesm2022/acorex-modules-location-management.mjs +18 -99
  162. package/fesm2022/acorex-modules-location-management.mjs.map +1 -1
  163. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-CfHMiVos.mjs +7102 -0
  164. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-CfHMiVos.mjs.map +1 -0
  165. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-DQJJtCqU.mjs → acorex-modules-maintenance-management-failure-effect.entity-DKbARwJh.mjs} +2 -2
  166. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-DQJJtCqU.mjs.map → acorex-modules-maintenance-management-failure-effect.entity-DKbARwJh.mjs.map} +1 -1
  167. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-gg2fpT2N.mjs → acorex-modules-maintenance-management-failure-mode-asset-type.entity-Br0lvFfu.mjs} +2 -2
  168. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-gg2fpT2N.mjs.map → acorex-modules-maintenance-management-failure-mode-asset-type.entity-Br0lvFfu.mjs.map} +1 -1
  169. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-CHUaAnID.mjs → acorex-modules-maintenance-management-failure-mode-mechanism.entity-Dydg4AJ7.mjs} +2 -2
  170. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-CHUaAnID.mjs.map → acorex-modules-maintenance-management-failure-mode-mechanism.entity-Dydg4AJ7.mjs.map} +1 -1
  171. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-B93x1uP_.mjs → acorex-modules-maintenance-management-failure-mode-solution.entity-DHiVJHFj.mjs} +2 -2
  172. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-B93x1uP_.mjs.map → acorex-modules-maintenance-management-failure-mode-solution.entity-DHiVJHFj.mjs.map} +1 -1
  173. package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-McM3l12Q.mjs → acorex-modules-maintenance-management-failure-register-cause.entity-CZfm0U8u.mjs} +2 -2
  174. package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-McM3l12Q.mjs.map → acorex-modules-maintenance-management-failure-register-cause.entity-CZfm0U8u.mjs.map} +1 -1
  175. package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-_jjy1oeg.mjs → acorex-modules-maintenance-management-failure-register-effect.entity-DbCAFveJ.mjs} +2 -2
  176. package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-_jjy1oeg.mjs.map → acorex-modules-maintenance-management-failure-register-effect.entity-DbCAFveJ.mjs.map} +1 -1
  177. package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-5CmdhowW.mjs → acorex-modules-maintenance-management-failure-register-mechanism.entity-D83Yo6dT.mjs} +2 -2
  178. package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-5CmdhowW.mjs.map → acorex-modules-maintenance-management-failure-register-mechanism.entity-D83Yo6dT.mjs.map} +1 -1
  179. package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-D_lQrda5.mjs → acorex-modules-maintenance-management-failure-register.entity-zKGo9bOs.mjs} +4 -4
  180. package/fesm2022/acorex-modules-maintenance-management-failure-register.entity-zKGo9bOs.mjs.map +1 -0
  181. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BIZxoVIS.mjs → acorex-modules-maintenance-management-failure-severity.entity-Cnvdmt0N.mjs} +2 -2
  182. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BIZxoVIS.mjs.map → acorex-modules-maintenance-management-failure-severity.entity-Cnvdmt0N.mjs.map} +1 -1
  183. package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-CzX0phT-.mjs +391 -0
  184. package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-CzX0phT-.mjs.map +1 -0
  185. package/fesm2022/acorex-modules-maintenance-management.mjs +1 -3579
  186. package/fesm2022/acorex-modules-maintenance-management.mjs.map +1 -1
  187. package/fesm2022/acorex-modules-measurement-core.mjs.map +1 -1
  188. package/fesm2022/{acorex-modules-notification-management-notification-page.component-DDhCqJtg.mjs → acorex-modules-notification-management-notification-page.component-D0we6H1f.mjs} +5 -5
  189. package/fesm2022/{acorex-modules-notification-management-notification-page.component-DDhCqJtg.mjs.map → acorex-modules-notification-management-notification-page.component-D0we6H1f.mjs.map} +1 -1
  190. package/fesm2022/acorex-modules-notification-management.mjs +36 -22
  191. package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
  192. package/fesm2022/acorex-modules-organization-management-JOB_DEFINITION_SKILLS_PAGE_COMPONENT_KEY-BYfbGGOE.mjs +8 -0
  193. package/fesm2022/acorex-modules-organization-management-JOB_DEFINITION_SKILLS_PAGE_COMPONENT_KEY-BYfbGGOE.mjs.map +1 -0
  194. package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-CnAHfj2t.mjs +925 -0
  195. package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-CnAHfj2t.mjs.map +1 -0
  196. package/fesm2022/acorex-modules-organization-management-business-unit.entity-Dpf7-aeM.mjs +372 -0
  197. package/fesm2022/acorex-modules-organization-management-business-unit.entity-Dpf7-aeM.mjs.map +1 -0
  198. package/fesm2022/{acorex-modules-organization-management-chart.entity-bRxA8XHZ.mjs → acorex-modules-organization-management-chart.entity-CQX81AiE.mjs} +37 -33
  199. package/fesm2022/acorex-modules-organization-management-chart.entity-CQX81AiE.mjs.map +1 -0
  200. package/fesm2022/{acorex-modules-organization-management-company.entity-BohMJQNi.mjs → acorex-modules-organization-management-company.entity-D-RWQ_8O.mjs} +8 -10
  201. package/fesm2022/acorex-modules-organization-management-company.entity-D-RWQ_8O.mjs.map +1 -0
  202. package/fesm2022/acorex-modules-organization-management-data-source-evaluator-scope.provider-BrKtojM9.mjs +48 -0
  203. package/fesm2022/acorex-modules-organization-management-data-source-evaluator-scope.provider-BrKtojM9.mjs.map +1 -0
  204. package/fesm2022/acorex-modules-organization-management-entity.provider-BdaKwTZq.mjs +61 -0
  205. package/fesm2022/acorex-modules-organization-management-entity.provider-BdaKwTZq.mjs.map +1 -0
  206. package/fesm2022/acorex-modules-organization-management-feature-definition.provider-EzMuHJ2K.mjs +19 -0
  207. package/fesm2022/acorex-modules-organization-management-feature-definition.provider-EzMuHJ2K.mjs.map +1 -0
  208. package/fesm2022/acorex-modules-organization-management-job-definition-matrix-page.utils-DD3jLujN.mjs +61 -0
  209. package/fesm2022/acorex-modules-organization-management-job-definition-matrix-page.utils-DD3jLujN.mjs.map +1 -0
  210. package/fesm2022/acorex-modules-organization-management-job-definition-pages-component.provider-C8_Ab3Q7.mjs +28 -0
  211. package/fesm2022/acorex-modules-organization-management-job-definition-pages-component.provider-C8_Ab3Q7.mjs.map +1 -0
  212. package/fesm2022/acorex-modules-organization-management-job-definition-responsibilities-page.component-DHUlvoOO.mjs +223 -0
  213. package/fesm2022/acorex-modules-organization-management-job-definition-responsibilities-page.component-DHUlvoOO.mjs.map +1 -0
  214. package/fesm2022/acorex-modules-organization-management-job-definition-skills-page.component-BpVESnnH.mjs +219 -0
  215. package/fesm2022/acorex-modules-organization-management-job-definition-skills-page.component-BpVESnnH.mjs.map +1 -0
  216. package/fesm2022/{acorex-modules-organization-management-job-definition.entity-S9Jlmr-o.mjs → acorex-modules-organization-management-job-definition.entity-H8VAbZ_r.mjs} +21 -154
  217. package/fesm2022/acorex-modules-organization-management-job-definition.entity-H8VAbZ_r.mjs.map +1 -0
  218. package/fesm2022/acorex-modules-organization-management-job-level.datasource-Dxfq0cGw.mjs +95 -0
  219. package/fesm2022/acorex-modules-organization-management-job-level.datasource-Dxfq0cGw.mjs.map +1 -0
  220. package/fesm2022/acorex-modules-organization-management-job-level.entity-Bdja794J.mjs +271 -0
  221. package/fesm2022/acorex-modules-organization-management-job-level.entity-Bdja794J.mjs.map +1 -0
  222. package/fesm2022/acorex-modules-organization-management-menu.provider-DnvNM-pk.mjs +192 -0
  223. package/fesm2022/acorex-modules-organization-management-menu.provider-DnvNM-pk.mjs.map +1 -0
  224. package/fesm2022/acorex-modules-organization-management-org-chart.page-COkMtxFO.mjs +1740 -0
  225. package/fesm2022/acorex-modules-organization-management-org-chart.page-COkMtxFO.mjs.map +1 -0
  226. package/fesm2022/acorex-modules-organization-management-organization-code-identifier-rules.provider-pocBJezL.mjs +37 -0
  227. package/fesm2022/acorex-modules-organization-management-organization-code-identifier-rules.provider-pocBJezL.mjs.map +1 -0
  228. package/fesm2022/acorex-modules-organization-management-permission-definition.provider-BDLIuqxU.mjs +76 -0
  229. package/fesm2022/acorex-modules-organization-management-permission-definition.provider-BDLIuqxU.mjs.map +1 -0
  230. package/fesm2022/{acorex-modules-organization-management-position.entity-DLPufeWz.mjs → acorex-modules-organization-management-position.entity-BpbzqtEY.mjs} +113 -112
  231. package/fesm2022/acorex-modules-organization-management-position.entity-BpbzqtEY.mjs.map +1 -0
  232. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-mMZywr0X.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CGkXAtH2.mjs} +26 -29
  233. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CGkXAtH2.mjs.map +1 -0
  234. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-CfRBMxLk.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-Dw-tX5XI.mjs} +2 -2
  235. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-CfRBMxLk.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-Dw-tX5XI.mjs.map} +1 -1
  236. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-B06t1G1E.mjs → acorex-modules-organization-management-responsibilities-matrix.component-D_ClGAIJ.mjs} +14 -21
  237. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix.component-D_ClGAIJ.mjs.map +1 -0
  238. package/fesm2022/acorex-modules-organization-management-responsibility-level.entity-CzkogsDv.mjs +135 -0
  239. package/fesm2022/acorex-modules-organization-management-responsibility-level.entity-CzkogsDv.mjs.map +1 -0
  240. package/fesm2022/{acorex-modules-organization-management-responsibility.entity-CMmr3wJa.mjs → acorex-modules-organization-management-responsibility.entity-DfKM6HV7.mjs} +5 -7
  241. package/fesm2022/acorex-modules-organization-management-responsibility.entity-DfKM6HV7.mjs.map +1 -0
  242. package/fesm2022/acorex-modules-organization-management-settings.provider-DaeJkP0y.mjs +228 -0
  243. package/fesm2022/acorex-modules-organization-management-settings.provider-DaeJkP0y.mjs.map +1 -0
  244. package/fesm2022/acorex-modules-organization-management-team-business-unit.entity-Cm9qcAG7.mjs +300 -0
  245. package/fesm2022/acorex-modules-organization-management-team-business-unit.entity-Cm9qcAG7.mjs.map +1 -0
  246. package/fesm2022/acorex-modules-organization-management-team-member-role.entity-B3xgLE6N.mjs +150 -0
  247. package/fesm2022/acorex-modules-organization-management-team-member-role.entity-B3xgLE6N.mjs.map +1 -0
  248. package/fesm2022/{acorex-modules-organization-management-team-member.entity-8sTjn5Jn.mjs → acorex-modules-organization-management-team-member.entity-Dk9t9S1r.mjs} +6 -17
  249. package/fesm2022/acorex-modules-organization-management-team-member.entity-Dk9t9S1r.mjs.map +1 -0
  250. package/fesm2022/{acorex-modules-organization-management-team.entity-CGR0UlYl.mjs → acorex-modules-organization-management-team.entity-BbcFYP20.mjs} +113 -42
  251. package/fesm2022/acorex-modules-organization-management-team.entity-BbcFYP20.mjs.map +1 -0
  252. package/fesm2022/acorex-modules-organization-management.mjs +1 -2216
  253. package/fesm2022/acorex-modules-organization-management.mjs.map +1 -1
  254. package/fesm2022/acorex-modules-platform-dev-tools-menu.provider-BFueKnuF.mjs +40 -0
  255. package/fesm2022/acorex-modules-platform-dev-tools-menu.provider-BFueKnuF.mjs.map +1 -0
  256. package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs +33 -0
  257. package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs.map +1 -0
  258. package/fesm2022/acorex-modules-platform-dev-tools.mjs +14 -94
  259. package/fesm2022/acorex-modules-platform-dev-tools.mjs.map +1 -1
  260. 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
  261. package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-BjKrHoBg.mjs.map +1 -0
  262. package/fesm2022/acorex-modules-report-management.mjs +3 -3
  263. package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
  264. package/fesm2022/{acorex-modules-reservation-management-acorex-modules-reservation-management-BMemqW2V.mjs → acorex-modules-reservation-management-acorex-modules-reservation-management-BoUiTlmu.mjs} +65 -76
  265. package/fesm2022/acorex-modules-reservation-management-acorex-modules-reservation-management-BoUiTlmu.mjs.map +1 -0
  266. 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
  267. 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
  268. 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
  269. 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
  270. package/fesm2022/{acorex-modules-reservation-management-reservation-status-transition.entity-2ngXhKAV.mjs → acorex-modules-reservation-management-reservation-status-transition.entity-CQ85ZAGF.mjs} +2 -2
  271. 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
  272. package/fesm2022/acorex-modules-reservation-management.mjs +1 -1
  273. package/fesm2022/acorex-modules-security-management.mjs +507 -179
  274. package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
  275. package/fesm2022/{acorex-modules-task-management-task-board.page-C1H_GTqy.mjs → acorex-modules-task-management-task-board.page-DA2563QE.mjs} +15 -10
  276. package/fesm2022/acorex-modules-task-management-task-board.page-DA2563QE.mjs.map +1 -0
  277. package/fesm2022/acorex-modules-task-management.mjs +280 -226
  278. package/fesm2022/acorex-modules-task-management.mjs.map +1 -1
  279. package/fesm2022/acorex-modules-workflow-management-WORKFLOW_DEFINITION_ACTIVITIES_PAGE_COMPONENT_KEY-D6q__Ewd.mjs +5 -0
  280. package/fesm2022/acorex-modules-workflow-management-WORKFLOW_DEFINITION_ACTIVITIES_PAGE_COMPONENT_KEY-D6q__Ewd.mjs.map +1 -0
  281. 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
  282. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-column.component-CDo0QVFy.mjs.map +1 -0
  283. 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
  284. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BYJpDQRs.mjs.map +1 -0
  285. package/fesm2022/{acorex-modules-workflow-management-activity-definition.entity-Bvs1OfE_.mjs → acorex-modules-workflow-management-activity-definition.entity-B3DkgDQb.mjs} +10 -12
  286. package/fesm2022/acorex-modules-workflow-management-activity-definition.entity-B3DkgDQb.mjs.map +1 -0
  287. package/fesm2022/acorex-modules-workflow-management-index-Bx2uYraH.mjs +295 -0
  288. package/fesm2022/acorex-modules-workflow-management-index-Bx2uYraH.mjs.map +1 -0
  289. package/fesm2022/{acorex-modules-workflow-management-index-DWIDQsWq.mjs → acorex-modules-workflow-management-index-C9Qc07oK.mjs} +125 -3
  290. package/fesm2022/acorex-modules-workflow-management-index-C9Qc07oK.mjs.map +1 -0
  291. package/fesm2022/acorex-modules-workflow-management-index-D8fjNgQJ.mjs +726 -0
  292. package/fesm2022/acorex-modules-workflow-management-index-D8fjNgQJ.mjs.map +1 -0
  293. package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs +56 -0
  294. package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs.map +1 -0
  295. package/fesm2022/{acorex-modules-workflow-management-workflow-definition.entity-aJou58ED.mjs → acorex-modules-workflow-management-workflow-definition.entity-DqPVpcSv.mjs} +101 -140
  296. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-DqPVpcSv.mjs.map +1 -0
  297. package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-Cq7LE7u5.mjs → acorex-modules-workflow-management-workflow-instance.entity-D-KnWlsU.mjs} +10 -1
  298. package/fesm2022/acorex-modules-workflow-management-workflow-instance.entity-D-KnWlsU.mjs.map +1 -0
  299. package/fesm2022/{acorex-modules-workflow-management-workflow-task-popover.component-CIakASVR.mjs → acorex-modules-workflow-management-workflow-task-popover.component-NpUx0sB5.mjs} +11 -7
  300. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-NpUx0sB5.mjs.map +1 -0
  301. package/fesm2022/acorex-modules-workflow-management.mjs +996 -423
  302. package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
  303. package/organization-management/README.md +5 -1
  304. package/package.json +2 -2
  305. package/types/acorex-modules-ai-management.d.ts +91 -16
  306. package/types/acorex-modules-asset-management.d.ts +214 -83
  307. package/types/acorex-modules-business-core.d.ts +8 -11
  308. package/types/acorex-modules-common.d.ts +20 -8
  309. package/types/acorex-modules-conversation.d.ts +1 -0
  310. package/types/acorex-modules-dashboard-management.d.ts +348 -177
  311. package/types/acorex-modules-data-management.d.ts +2 -2
  312. package/types/acorex-modules-document-management.d.ts +7 -4
  313. package/types/acorex-modules-financial-core.d.ts +26 -19
  314. package/types/acorex-modules-form-template-management.d.ts +3 -3
  315. package/types/acorex-modules-health-core.d.ts +23 -29
  316. package/types/acorex-modules-human-capital-management.d.ts +28 -2
  317. package/types/acorex-modules-learning-management.d.ts +242 -105
  318. package/types/acorex-modules-maintenance-management.d.ts +563 -41
  319. package/types/acorex-modules-measurement-core.d.ts +95 -33
  320. package/types/acorex-modules-notification-management.d.ts +7 -3
  321. package/types/acorex-modules-organization-management.d.ts +272 -109
  322. package/types/acorex-modules-security-management.d.ts +40 -1
  323. package/types/acorex-modules-task-management.d.ts +20 -15
  324. package/types/acorex-modules-workflow-management.d.ts +121 -15
  325. package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-WuqoH4OL.mjs.map +0 -1
  326. package/fesm2022/acorex-modules-ai-management-agent.entity-DK9GNMdR.mjs.map +0 -1
  327. package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CWXEW9yL.mjs.map +0 -1
  328. package/fesm2022/acorex-modules-ai-management-index-KX3TVRXr.mjs +0 -2
  329. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-BNK6C-Ng.mjs.map +0 -1
  330. package/fesm2022/acorex-modules-assessment-management-index-B2SncZAW.mjs.map +0 -1
  331. package/fesm2022/acorex-modules-assessment-management-preview-question.command-DPzL8C44.mjs.map +0 -1
  332. package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-BDs0ZgD5.mjs.map +0 -1
  333. package/fesm2022/acorex-modules-asset-management-asset-system-history.entity-CSCwWY_F.mjs.map +0 -1
  334. package/fesm2022/acorex-modules-asset-management-asset-system-type.entity-CcefMT8J.mjs.map +0 -1
  335. package/fesm2022/acorex-modules-asset-management-asset-type-section.entity-r_H1QGwp.mjs.map +0 -1
  336. package/fesm2022/acorex-modules-asset-management-asset-type.entity-cWVqpbHH.mjs.map +0 -1
  337. package/fesm2022/acorex-modules-asset-management-asset.entity-CamZGWTM.mjs.map +0 -1
  338. package/fesm2022/acorex-modules-asset-management-assetSystem.entity-Dq2ASslk.mjs.map +0 -1
  339. package/fesm2022/acorex-modules-health-core-allergy-type.entity-CS8a-AUb.mjs.map +0 -1
  340. package/fesm2022/acorex-modules-health-core-blood-type.entity-ZgFOuvG4.mjs.map +0 -1
  341. package/fesm2022/acorex-modules-health-core-body-part.entity-JGLwrFE2.mjs.map +0 -1
  342. package/fesm2022/acorex-modules-health-core-chronic-condition-type.entity-DrxEPQj1.mjs.map +0 -1
  343. package/fesm2022/acorex-modules-health-core-disability-status.entity-UaAQFFMC.mjs.map +0 -1
  344. package/fesm2022/acorex-modules-health-core-injury-type.entity-DcIn0rxz.mjs.map +0 -1
  345. package/fesm2022/acorex-modules-health-core-vaccination-type.entity-zYd6KLRC.mjs.map +0 -1
  346. package/fesm2022/acorex-modules-human-capital-management-employee.entity-BRpqFRuI.mjs.map +0 -1
  347. package/fesm2022/acorex-modules-human-capital-management-employment-type.entity-7ZGZYxGM.mjs.map +0 -1
  348. package/fesm2022/acorex-modules-human-capital-management-leave-request.entity-B3Rk84bJ.mjs.map +0 -1
  349. package/fesm2022/acorex-modules-human-capital-management-leave-type.entity-OKu8_PP1.mjs.map +0 -1
  350. package/fesm2022/acorex-modules-human-capital-management-position-assignment.entity-D_C459kx.mjs.map +0 -1
  351. package/fesm2022/acorex-modules-learning-management-certificate-definition.entity-27VKYxw1.mjs.map +0 -1
  352. package/fesm2022/acorex-modules-learning-management-certificate-type.entity-CBM6N-PD.mjs.map +0 -1
  353. package/fesm2022/acorex-modules-learning-management-certificate.entity-BRBJQYji.mjs.map +0 -1
  354. package/fesm2022/acorex-modules-learning-management-course-type.entity-B1c6PDLq.mjs.map +0 -1
  355. package/fesm2022/acorex-modules-learning-management-course.entity-BN8XHAPz.mjs.map +0 -1
  356. package/fesm2022/acorex-modules-learning-management-learning-path.entity-8QlM3R4B.mjs.map +0 -1
  357. package/fesm2022/acorex-modules-learning-management-skill-level.entity-DXOWslpB.mjs.map +0 -1
  358. package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-edit.component-CaeZ9P_I.mjs +0 -162
  359. package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-edit.component-CaeZ9P_I.mjs.map +0 -1
  360. package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-view.component-1oWMtdrN.mjs +0 -70
  361. package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-view.component-1oWMtdrN.mjs.map +0 -1
  362. package/fesm2022/acorex-modules-learning-management-skill-matrix.component-_cFwIN-z.mjs +0 -468
  363. package/fesm2022/acorex-modules-learning-management-skill-matrix.component-_cFwIN-z.mjs.map +0 -1
  364. package/fesm2022/acorex-modules-learning-management-skill.entity-DrLts807.mjs.map +0 -1
  365. package/fesm2022/acorex-modules-learning-management-training-definition.entity-NQqJ5avw.mjs.map +0 -1
  366. package/fesm2022/acorex-modules-learning-management-training-type.entity-CoyDCeen.mjs.map +0 -1
  367. package/fesm2022/acorex-modules-learning-management-training.entity-BCGn0T3H.mjs.map +0 -1
  368. package/fesm2022/acorex-modules-maintenance-management-failure-register.entity-D_lQrda5.mjs.map +0 -1
  369. package/fesm2022/acorex-modules-organization-management-business-unit-type.entity-C-EKX6Oy.mjs +0 -91
  370. package/fesm2022/acorex-modules-organization-management-business-unit-type.entity-C-EKX6Oy.mjs.map +0 -1
  371. package/fesm2022/acorex-modules-organization-management-chart.entity-bRxA8XHZ.mjs.map +0 -1
  372. package/fesm2022/acorex-modules-organization-management-company.entity-BohMJQNi.mjs.map +0 -1
  373. package/fesm2022/acorex-modules-organization-management-job-definition.entity-S9Jlmr-o.mjs.map +0 -1
  374. package/fesm2022/acorex-modules-organization-management-org-chart.page-eRTHzLDQ.mjs +0 -784
  375. package/fesm2022/acorex-modules-organization-management-org-chart.page-eRTHzLDQ.mjs.map +0 -1
  376. package/fesm2022/acorex-modules-organization-management-position.entity-DLPufeWz.mjs.map +0 -1
  377. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-mMZywr0X.mjs.map +0 -1
  378. package/fesm2022/acorex-modules-organization-management-responsibilities-matrix.component-B06t1G1E.mjs.map +0 -1
  379. package/fesm2022/acorex-modules-organization-management-responsibility.entity-CMmr3wJa.mjs.map +0 -1
  380. package/fesm2022/acorex-modules-organization-management-team-member-role.entity-CZ4MibH4.mjs +0 -88
  381. package/fesm2022/acorex-modules-organization-management-team-member-role.entity-CZ4MibH4.mjs.map +0 -1
  382. package/fesm2022/acorex-modules-organization-management-team-member.entity-8sTjn5Jn.mjs.map +0 -1
  383. package/fesm2022/acorex-modules-organization-management-team.entity-CGR0UlYl.mjs.map +0 -1
  384. package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-DPSNAAct.mjs.map +0 -1
  385. package/fesm2022/acorex-modules-reservation-management-acorex-modules-reservation-management-BMemqW2V.mjs.map +0 -1
  386. package/fesm2022/acorex-modules-task-management-task-board.page-C1H_GTqy.mjs.map +0 -1
  387. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-column.component-C8lgSjfc.mjs.map +0 -1
  388. package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BGUPxGXP.mjs.map +0 -1
  389. package/fesm2022/acorex-modules-workflow-management-activity-definition.entity-Bvs1OfE_.mjs.map +0 -1
  390. package/fesm2022/acorex-modules-workflow-management-index-DWIDQsWq.mjs.map +0 -1
  391. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-aJou58ED.mjs.map +0 -1
  392. package/fesm2022/acorex-modules-workflow-management-workflow-instance.entity-Cq7LE7u5.mjs.map +0 -1
  393. package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-CIakASVR.mjs.map +0 -1
@@ -5,43 +5,43 @@ import { AXPSessionService, AXPAuthGuard, AXP_PERMISSION_DEFINITION_PROVIDER } f
5
5
  import { AXPEntityService, AXPEntityFormBuilderService, AXPEntityDefinitionRegistryService, entityDetailsCrudActions, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_CONFIG_TOKEN, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
6
6
  import { firstValueFrom } from 'rxjs';
7
7
  import { AXMCalendarManagementModule } from '@acorex/modules/calendar-management';
8
- import { AXPEntityCommandScope, AXPSystemStatuses, AXP_MENU_PROVIDER } from '@acorex/platform/common';
9
- import { createMultiLanguageString, AXPSystemActionType, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_MODULE_MANIFEST_PROVIDER, AXPMultiLanguageStringResolverService } from '@acorex/platform/core';
8
+ import { AXPEntityCommandScope, AXPStatusProvider, AXPSystemStatusType, systemStatusToDefinition, AXPSystemStatuses, AXP_STATUS_PROVIDERS, AXP_MENU_PROVIDER } from '@acorex/platform/common';
9
+ import { AXPSystemActionType, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_MODULE_MANIFEST_PROVIDER, provideLazyProvider } from '@acorex/platform/core';
10
+ import { AXP_PAGE_COMPONENT_PROVIDER, AXPPropertyViewerComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutToolbarComponent, AXPThemeLayoutStartSideComponent } from '@acorex/platform/layout/components';
10
11
  import { AXPDomainModule } from '@acorex/platform/domain';
11
- import { AXPWidgetGroupEnum, AXP_WIDGETS_EDITOR_CATEGORY, AXPWidgetSerializationHelper, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex/platform/layout/widget-core';
12
- import { AXPBarChartWidget, AXPDonutChartWidget, AXPLineChartWidget, AXPGaugeChartWidget } from '@acorex/modules/dashboard-management';
12
+ import { AXPWidgetGroupEnum, AXP_WIDGETS_EDITOR_CATEGORY, AXPWidgetSerializationHelper, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER, mapAXPPropertyToWidgetProperty } from '@acorex/platform/layout/widget-core';
13
+ import { AXPBarChartWidget, AXPHeatmapChartWidget, AXPDonutChartWidget, AXPLineChartWidget, AXPGaugeChartWidget, AXPFunnelChartWidget, AXPKpiDetailsWidget, AXPKpiProgressWidget, AXPKpiSegmentedWidget, AXPKpiStatCardWidget } from '@acorex/modules/dashboard-management';
13
14
  import { AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY } from '@acorex/platform/layout/widgets';
14
15
  import { provideCommandSetups } from '@acorex/platform/runtime';
15
16
  import { AXPWorkflowManager, AXPWorkflowDefinitionService, AXP_WORKFLOW_PROVIDER, AXP_ACTIVITY_CATEGORY_PROVIDER, AXP_ACTIVITY_PROVIDER, AXP_WORKFLOW_CATEGORY_PROVIDER, AXPActivityDefinitionService } from '@acorex/platform/workflow';
16
17
  import { ROUTES, ActivatedRoute, Router } from '@angular/router';
17
18
  import { AXDialogService } from '@acorex/components/dialog';
18
- import * as i8 from '@acorex/core/translation';
19
+ import * as i5$1 from '@acorex/core/translation';
19
20
  import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
20
21
  import { AXPopupService } from '@acorex/components/popup';
21
22
  import { AXPDialogRendererComponent, AXPLayoutBuilderService } from '@acorex/platform/layout/builder';
22
23
  import { cloneDeep } from 'lodash-es';
23
24
  import { AXToastService } from '@acorex/components/toast';
24
25
  import { AXPWorkflowTaskProvider, AXP_WORKFLOW_TASK_PROVIDER } from '@acorex/modules/task-management';
25
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
26
- import * as i7 from '@angular/common';
27
- import { CommonModule } from '@angular/common';
28
- import { FormsModule } from '@angular/forms';
29
26
  import * as i2 from '@acorex/components/button';
30
27
  import { AXButtonModule } from '@acorex/components/button';
31
28
  import * as i2$1 from '@acorex/components/button-group';
32
29
  import { AXButtonGroupModule } from '@acorex/components/button-group';
33
30
  import * as i3 from '@acorex/components/decorators';
34
31
  import { AXDecoratorModule } from '@acorex/components/decorators';
35
- import * as i4 from '@acorex/components/text-box';
36
- import { AXTextBoxModule } from '@acorex/components/text-box';
37
- import { AXSelectBoxModule } from '@acorex/components/select-box';
38
32
  import * as i5 from '@acorex/components/search-box';
39
33
  import { AXSearchBoxModule } from '@acorex/components/search-box';
34
+ import { AXSelectBoxModule } from '@acorex/components/select-box';
40
35
  import * as i6 from '@acorex/components/switch';
41
36
  import { AXSwitchModule } from '@acorex/components/switch';
42
37
  import { AXTabsModule } from '@acorex/components/tabs';
38
+ import * as i4 from '@acorex/components/text-box';
39
+ import { AXTextBoxModule } from '@acorex/components/text-box';
43
40
  import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPageLayoutBase } from '@acorex/platform/layout/views';
44
- import { AXPPropertyViewerComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutToolbarComponent, AXPThemeLayoutStartSideComponent } from '@acorex/platform/layout/components';
41
+ import * as i7 from '@angular/common';
42
+ import { CommonModule } from '@angular/common';
43
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
44
+ import { FormsModule } from '@angular/forms';
45
45
  import * as i1 from '@acorex/components/tree-view-legacy';
46
46
  import { AXTreeViewLegacyModule } from '@acorex/components/tree-view-legacy';
47
47
 
@@ -49,6 +49,8 @@ const config = {
49
49
  i18n: 'workflow-management',
50
50
  module: 'WorkflowManagement',
51
51
  };
52
+ /** Builds extended dashboard widget type ids: `{module}:Widget:Dashboard:{Segment}`. */
53
+ const workflowDashboardWidgetId = (segment) => `${config.module}:Widget:Dashboard:${segment}`;
52
54
  const RootConfig = {
53
55
  config,
54
56
  module: {
@@ -114,12 +116,54 @@ const RootConfig = {
114
116
  tasksNearDeadline: `${config.module}:DataSource:TasksNearDeadline`,
115
117
  bottleneckActivities: `${config.module}:DataSource:BottleneckActivities`,
116
118
  errorsByCategory: `${config.module}:DataSource:ErrorsByCategory`,
119
+ /** Workflow instance funnel: counts per stage (created -> completed). */
120
+ instanceConversionFunnel: `${config.module}:DataSource:InstanceConversionFunnel`,
121
+ /** Heatmap: errors by activity/stage and weekday (or day bucket). */
122
+ errorsByActivityDayHeatmap: `${config.module}:DataSource:ErrorsByActivityDayHeatmap`,
117
123
  workloadPerUserActive: `${config.module}:DataSource:WorkloadPerUserActive`,
118
124
  workloadPerUserOverdue: `${config.module}:DataSource:WorkloadPerUserOverdue`,
119
125
  workloadPerUserAvgAgeHours: `${config.module}:DataSource:WorkloadPerUserAvgAgeHours`,
120
126
  workloadOverloadedUsers: `${config.module}:DataSource:WorkloadOverloadedUsers`,
121
127
  slaRiskPrediction: `${config.module}:DataSource:SlaRiskPrediction`,
122
128
  },
129
+ dashboardKpi: {
130
+ slaComplianceSnapshot: `${config.module}:DataSource:SlaComplianceSnapshot`,
131
+ taskStatusBreakdown: `${config.module}:DataSource:TaskStatusBreakdown`,
132
+ throughputOverview: `${config.module}:DataSource:ThroughputOverview`,
133
+ kpiStatCard: `${config.module}:DataSource:KpiStatCard`,
134
+ },
135
+ },
136
+ /** Extended dashboard widget type ids; used by workflow dashboard widget configs. */
137
+ widgets: {
138
+ barChart: workflowDashboardWidgetId('BarChart'),
139
+ tasksNearDeadlineBar: workflowDashboardWidgetId('TasksNearDeadlineBar'),
140
+ pendingTasksByAgeBar: workflowDashboardWidgetId('PendingTasksByAgeBar'),
141
+ overdueTasksBar: workflowDashboardWidgetId('OverdueTasksBar'),
142
+ bottleneckBar: workflowDashboardWidgetId('BottleneckBar'),
143
+ workloadPerUserOverdueBar: workflowDashboardWidgetId('WorkloadPerUserOverdueBar'),
144
+ stuckProcessesBar: workflowDashboardWidgetId('StuckProcessesBar'),
145
+ slaRiskPredictionBar: workflowDashboardWidgetId('SlaRiskPredictionBar'),
146
+ failedProcessesByTypeDonut: workflowDashboardWidgetId('FailedProcessesByTypeDonut'),
147
+ failedProcessesTrendLine: workflowDashboardWidgetId('FailedProcessesTrendLine'),
148
+ throughputDailyLine: workflowDashboardWidgetId('ThroughputDailyLine'),
149
+ throughputWeeklyLine: workflowDashboardWidgetId('ThroughputWeeklyLine'),
150
+ failedProcessesSummaryBar: workflowDashboardWidgetId('FailedProcessesSummaryBar'),
151
+ workloadPerUserActiveBar: workflowDashboardWidgetId('WorkloadPerUserActiveBar'),
152
+ workloadPerUserAvgAgeBar: workflowDashboardWidgetId('WorkloadPerUserAvgAgeBar'),
153
+ overloadedUsersBar: workflowDashboardWidgetId('OverloadedUsersBar'),
154
+ donutChart: workflowDashboardWidgetId('DonutChart'),
155
+ slaViolationsBar: workflowDashboardWidgetId('SlaViolationsBar'),
156
+ gaugeChart: workflowDashboardWidgetId('GaugeChart'),
157
+ lineChart: workflowDashboardWidgetId('LineChart'),
158
+ slaTrendLine: workflowDashboardWidgetId('SlaTrendLine'),
159
+ errorsBar: workflowDashboardWidgetId('ErrorsBar'),
160
+ instanceConversionFunnel: workflowDashboardWidgetId('InstanceConversionFunnel'),
161
+ errorsHeatmap: workflowDashboardWidgetId('ErrorsHeatmap'),
162
+ systemHealthBar: workflowDashboardWidgetId('SystemHealthBar'),
163
+ kpiDetails: workflowDashboardWidgetId('KpiDetails'),
164
+ kpiProgress: workflowDashboardWidgetId('KpiProgress'),
165
+ kpiSegmented: workflowDashboardWidgetId('KpiSegmented'),
166
+ kpiStatCard: workflowDashboardWidgetId('KpiStatCard'),
123
167
  },
124
168
  };
125
169
 
@@ -135,11 +179,11 @@ class AXMWorkflowManagementModuleEntityProvider {
135
179
  if (moduleName === RootConfig.module.name) {
136
180
  switch (entityName) {
137
181
  case RootConfig.entities.workflowDefinition.name:
138
- return (await import('./acorex-modules-workflow-management-workflow-definition.entity-aJou58ED.mjs')).factory();
182
+ return (await import('./acorex-modules-workflow-management-workflow-definition.entity-DqPVpcSv.mjs')).factory();
139
183
  case RootConfig.entities.workflowInstance.name:
140
- return (await import('./acorex-modules-workflow-management-workflow-instance.entity-Cq7LE7u5.mjs')).factory();
184
+ return (await import('./acorex-modules-workflow-management-workflow-instance.entity-D-KnWlsU.mjs')).factory();
141
185
  case RootConfig.entities.activityDefinition.name:
142
- return (await import('./acorex-modules-workflow-management-activity-definition.entity-Bvs1OfE_.mjs')).factory();
186
+ return (await import('./acorex-modules-workflow-management-activity-definition.entity-B3DkgDQb.mjs')).factory();
143
187
  case RootConfig.entities.automation.name:
144
188
  return (await import('./acorex-modules-workflow-management-automation.entity-BigK8yE2.mjs')).factory();
145
189
  }
@@ -164,7 +208,6 @@ const AXPWorkflowManagementMenuKeys = {
164
208
  WorkflowInstances: 'workflow-management:workflow-instances',
165
209
  WorkflowStudio: 'workflow-management:workflow-studio',
166
210
  Activities: 'workflow-management:activities',
167
- ActivityDefinitions: 'workflow-management:activity-definitions',
168
211
  };
169
212
 
170
213
  class AXMMenuProvider {
@@ -223,16 +266,6 @@ class AXMMenuProvider {
223
266
  features: [module.name],
224
267
  },
225
268
  },
226
- {
227
- name: AXPWorkflowManagementMenuKeys.ActivityDefinitions,
228
- text: '@workflow-management:activities.menus.activity.title',
229
- path: this.entityService.createPath(module.name, RootConfig.entities.activityDefinition.name),
230
- priority: 4,
231
- icon: RootConfig.entities.activityDefinition.icon,
232
- policy: {
233
- features: [module.name],
234
- },
235
- },
236
269
  ]);
237
270
  }
238
271
  }
@@ -244,36 +277,131 @@ class AXMMenuProvider {
244
277
  const AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY = {
245
278
  name: 'workflow',
246
279
  order: 3,
247
- title: createMultiLanguageString('Workflow', 'گردش کار'),
280
+ title: '@workflow-management:dashboard-widgets.widget-picker-category.workflow',
248
281
  };
249
282
 
283
+ const SUB = '@workflow-management:dashboard-widgets.widget-picker-sub-categories';
284
+ //#region ---- Workflow dashboard widget picker sub-categories ----
285
+ const AXP_WORKFLOW_DASHBOARD_SUB_KPI = {
286
+ name: 'workflow-kpi',
287
+ order: 1,
288
+ title: `${SUB}.kpi`,
289
+ };
290
+ const AXP_WORKFLOW_DASHBOARD_SUB_THROUGHPUT = {
291
+ name: 'workflow-throughput',
292
+ order: 2,
293
+ title: `${SUB}.throughput`,
294
+ };
295
+ const AXP_WORKFLOW_DASHBOARD_SUB_FAILURES = {
296
+ name: 'workflow-failures',
297
+ order: 3,
298
+ title: `${SUB}.failures`,
299
+ };
300
+ const AXP_WORKFLOW_DASHBOARD_SUB_ERRORS = {
301
+ name: 'workflow-errors',
302
+ order: 4,
303
+ title: `${SUB}.errors`,
304
+ };
305
+ const AXP_WORKFLOW_DASHBOARD_SUB_SLA = {
306
+ name: 'workflow-sla',
307
+ order: 5,
308
+ title: `${SUB}.sla`,
309
+ };
310
+ const AXP_WORKFLOW_DASHBOARD_SUB_WORKLOAD = {
311
+ name: 'workflow-workload',
312
+ order: 6,
313
+ title: `${SUB}.workload`,
314
+ };
315
+ const AXP_WORKFLOW_DASHBOARD_SUB_TASKS = {
316
+ name: 'workflow-tasks',
317
+ order: 7,
318
+ title: `${SUB}.tasks`,
319
+ };
320
+ const AXP_WORKFLOW_DASHBOARD_SUB_SYSTEM_HEALTH = {
321
+ name: 'workflow-system-health',
322
+ order: 8,
323
+ title: `${SUB}.system-health`,
324
+ };
325
+ const AXP_WORKFLOW_DASHBOARD_SUB_USER = {
326
+ name: 'workflow-user',
327
+ order: 9,
328
+ title: `${SUB}.user`,
329
+ };
330
+ //#endregion
331
+
250
332
  const AXMWorkflowErrorsBarChartAXPExtendedWidget = {
251
333
  parentName: AXPBarChartWidget.name,
252
334
  widget: {
253
335
  ...AXPBarChartWidget,
254
- name: 'workflow-errors-bar',
255
- title: createMultiLanguageString('Workflow Error Categorization', 'دسته‌بندی خطاهای گردش کار'),
336
+ name: RootConfig.widgets.errorsBar,
337
+ title: '@workflow-management:dashboard-widgets.workflow-errors-bar.widget-title',
338
+ description: '@workflow-management:dashboard-widgets.workflow-errors-bar.widget-description',
256
339
  groups: [AXPWidgetGroupEnum.DashboardWidget],
257
340
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
341
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_ERRORS,
258
342
  options: {
259
- title: createMultiLanguageString('Errors by type and code', 'خطاها بر اساس نوع و کد'),
260
- xAxisLabel: createMultiLanguageString('Error category', 'دسته خطا'),
261
- yAxisLabel: createMultiLanguageString('Occurrences', 'تکرار'),
343
+ title: '@workflow-management:dashboard-widgets.workflow-errors-bar.chart-title',
344
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-errors-bar.x-axis-label',
345
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-errors-bar.y-axis-label',
262
346
  dataSource: RootConfig.dataSources.dashboardChart.errorsByCategory,
263
347
  },
264
348
  },
265
349
  };
266
350
 
351
+ /**
352
+ * Real-world use case:
353
+ * Heatmap of workflow errors by activity/stage (Y) and day bucket (X).
354
+ *
355
+ * Typical interpretation:
356
+ * - X: weekday ("Mon".."Sun") or recent days ("D-6".. "Today")
357
+ * - Y: activity name / step name (e.g. "Approval", "Validation", "Notify")
358
+ * - value: error count
359
+ * - label: optional preformatted tooltip value (e.g. "12 errors")
360
+ *
361
+ * DataSource contract (items):
362
+ * - `{ x: string|number, y: string|number, value: number, label?: string }[]`
363
+ */
364
+ const AXMWorkflowErrorsHeatmapAXPExtendedWidget = {
365
+ parentName: AXPHeatmapChartWidget.name,
366
+ widget: {
367
+ ...AXPHeatmapChartWidget,
368
+ name: RootConfig.widgets.errorsHeatmap,
369
+ title: '@workflow-management:dashboard-widgets.workflow-errors-heatmap.widget-title',
370
+ description: '@workflow-management:dashboard-widgets.workflow-errors-heatmap.widget-description',
371
+ groups: [AXPWidgetGroupEnum.DashboardWidget],
372
+ categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
373
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_ERRORS,
374
+ options: {
375
+ showXAxis: true,
376
+ showYAxis: true,
377
+ showTooltip: true,
378
+ // xAxisLabel: '@workflow-management:dashboard-widgets.workflow-errors-heatmap.x-axis-label',
379
+ // yAxisLabel: '@workflow-management:dashboard-widgets.workflow-errors-heatmap.y-axis-label',
380
+ cellPadding: 0.08,
381
+ borderRadius: 3,
382
+ animationEasing: 'cubic-out',
383
+ animationDuration: 800,
384
+ dataSource: RootConfig.dataSources.dashboardChart.errorsByActivityDayHeatmap,
385
+ messages: {
386
+ noData: '@workflow-management:dashboard-widgets.common.no-data',
387
+ noDataHelp: '@workflow-management:dashboard-widgets.workflow-errors-heatmap.no-data-help',
388
+ },
389
+ },
390
+ },
391
+ };
392
+
267
393
  const AXMWorkflowFailedProcessesByTypeDonutChartAXPExtendedWidget = {
268
394
  parentName: AXPDonutChartWidget.name,
269
395
  widget: {
270
396
  ...AXPDonutChartWidget,
271
- name: 'workflow-failed-processes-by-type-donut',
272
- title: createMultiLanguageString('Workflow Failed Processes by Type', 'فرایندهای ناموفق بر اساس نوع'),
397
+ name: RootConfig.widgets.failedProcessesByTypeDonut,
398
+ title: '@workflow-management:dashboard-widgets.workflow-failed-processes-by-type-donut.widget-title',
399
+ description: '@workflow-management:dashboard-widgets.workflow-failed-processes-by-type-donut.widget-description',
273
400
  groups: [AXPWidgetGroupEnum.DashboardWidget],
274
401
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
402
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_FAILURES,
275
403
  options: {
276
- title: createMultiLanguageString('Affected Process Types', 'انواع فرایند تحت تأثیر'),
404
+ title: '@workflow-management:dashboard-widgets.workflow-failed-processes-by-type-donut.chart-title',
277
405
  dataSource: RootConfig.dataSources.dashboardChart.failedProcessesByType,
278
406
  },
279
407
  },
@@ -283,14 +411,16 @@ const AXMWorkflowFailedProcessesSummaryBarChartAXPExtendedWidget = {
283
411
  parentName: AXPBarChartWidget.name,
284
412
  widget: {
285
413
  ...AXPBarChartWidget,
286
- name: 'workflow-failed-processes-summary-bar',
287
- title: createMultiLanguageString('Workflow Failed Processes Summary', 'خلاصه فرایندهای ناموفق گردش کار'),
414
+ name: RootConfig.widgets.failedProcessesSummaryBar,
415
+ title: '@workflow-management:dashboard-widgets.workflow-failed-processes-summary-bar.widget-title',
416
+ description: '@workflow-management:dashboard-widgets.workflow-failed-processes-summary-bar.widget-description',
288
417
  groups: [AXPWidgetGroupEnum.DashboardWidget],
289
418
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
419
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_FAILURES,
290
420
  options: {
291
- title: createMultiLanguageString('Total vs Recent Failures', 'کل در مقابل شکست‌های اخیر'),
292
- xAxisLabel: createMultiLanguageString('Scope', 'محدوده'),
293
- yAxisLabel: createMultiLanguageString('Instances', 'نمونه‌ها'),
421
+ title: '@workflow-management:dashboard-widgets.workflow-failed-processes-summary-bar.chart-title',
422
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-failed-processes-summary-bar.x-axis-label',
423
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-failed-processes-summary-bar.y-axis-label',
294
424
  dataSource: RootConfig.dataSources.dashboardChart.failedProcessesSummary,
295
425
  },
296
426
  },
@@ -300,14 +430,16 @@ const AXMWorkflowFailedProcessesTrendLineChartAXPExtendedWidget = {
300
430
  parentName: AXPLineChartWidget.name,
301
431
  widget: {
302
432
  ...AXPLineChartWidget,
303
- name: 'workflow-failed-processes-trend-line',
304
- title: createMultiLanguageString('Workflow Failed Instances Trend', 'روند نمونه‌های ناموفق گردش کار'),
433
+ name: RootConfig.widgets.failedProcessesTrendLine,
434
+ title: '@workflow-management:dashboard-widgets.workflow-failed-processes-trend-line.widget-title',
435
+ description: '@workflow-management:dashboard-widgets.workflow-failed-processes-trend-line.widget-description',
305
436
  groups: [AXPWidgetGroupEnum.DashboardWidget],
306
437
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
438
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_FAILURES,
307
439
  options: {
308
- title: createMultiLanguageString('Failed Instances by Week', 'نمونه‌های ناموفق بر اساس هفته'),
309
- xAxisLabel: createMultiLanguageString('Week', 'هفته'),
310
- yAxisLabel: createMultiLanguageString('Failures', 'شکست‌ها'),
440
+ title: '@workflow-management:dashboard-widgets.workflow-failed-processes-trend-line.chart-title',
441
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-failed-processes-trend-line.x-axis-label',
442
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-failed-processes-trend-line.y-axis-label',
311
443
  fillArea: false,
312
444
  yAxisStartsAtZero: true,
313
445
  dataSource: RootConfig.dataSources.dashboardChart.failedProcessFailureTrend,
@@ -319,14 +451,16 @@ const AXMWorkflowStuckProcessesBarChartAXPExtendedWidget = {
319
451
  parentName: AXPBarChartWidget.name,
320
452
  widget: {
321
453
  ...AXPBarChartWidget,
322
- name: 'workflow-stuck-processes-bar',
323
- title: createMultiLanguageString('Workflow Stuck Processes', 'فرایندهای گیرکرده گردش کار'),
454
+ name: RootConfig.widgets.stuckProcessesBar,
455
+ title: '@workflow-management:dashboard-widgets.workflow-stuck-processes-bar.widget-title',
456
+ description: '@workflow-management:dashboard-widgets.workflow-stuck-processes-bar.widget-description',
324
457
  groups: [AXPWidgetGroupEnum.DashboardWidget],
325
458
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
459
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_FAILURES,
326
460
  options: {
327
- title: createMultiLanguageString('Idle Time by Instance (hours)', 'زمان بیکاری بر اساس نمونه (ساعت)'),
328
- xAxisLabel: createMultiLanguageString('Instance', 'نمونه'),
329
- yAxisLabel: createMultiLanguageString('Hours without progress', 'ساعت بدون پیشرفت'),
461
+ title: '@workflow-management:dashboard-widgets.workflow-stuck-processes-bar.chart-title',
462
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-stuck-processes-bar.x-axis-label',
463
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-stuck-processes-bar.y-axis-label',
330
464
  dataSource: RootConfig.dataSources.dashboardChart.stuckProcesses,
331
465
  },
332
466
  },
@@ -336,13 +470,15 @@ const AXMWorkflowGaugeChartAXPExtendedWidget = {
336
470
  parentName: AXPGaugeChartWidget.name,
337
471
  widget: {
338
472
  ...AXPGaugeChartWidget,
339
- name: 'workflow-gauge-chart',
340
- title: createMultiLanguageString('Workflow SLA Compliance', 'انطباق SLA گردش کار'),
473
+ name: RootConfig.widgets.gaugeChart,
474
+ title: '@workflow-management:dashboard-widgets.workflow-gauge-chart.widget-title',
475
+ description: '@workflow-management:dashboard-widgets.workflow-gauge-chart.widget-description',
341
476
  groups: [AXPWidgetGroupEnum.DashboardWidget],
342
477
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
478
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_SLA,
343
479
  options: {
344
- title: createMultiLanguageString('SLA Compliance', 'انطباق SLA'),
345
- label: createMultiLanguageString('Resolved In SLA (%)', 'حل‌شده در SLA (٪)'),
480
+ title: '@workflow-management:dashboard-widgets.workflow-gauge-chart.chart-title',
481
+ label: '@workflow-management:dashboard-widgets.workflow-gauge-chart.gauge-label',
346
482
  dataSource: RootConfig.dataSources.dashboardChart.slaCompliance,
347
483
  minValue: 0,
348
484
  maxValue: 100,
@@ -350,10 +486,18 @@ const AXMWorkflowGaugeChartAXPExtendedWidget = {
350
486
  {
351
487
  value: 30,
352
488
  color: 'rgba(var(--ax-sys-color-danger-500))',
353
- label: 'Low',
489
+ label: '@workflow-management:dashboard-widgets.workflow-gauge-chart.threshold-low',
490
+ },
491
+ {
492
+ value: 70,
493
+ color: 'rgba(var(--ax-sys-color-warning-500))',
494
+ label: '@workflow-management:dashboard-widgets.workflow-gauge-chart.threshold-medium',
495
+ },
496
+ {
497
+ value: 100,
498
+ color: 'rgba(var(--ax-sys-color-success-500))',
499
+ label: '@workflow-management:dashboard-widgets.workflow-gauge-chart.threshold-high',
354
500
  },
355
- { value: 70, color: 'rgba(var(--ax-sys-color-warning-500))', label: 'Medium' },
356
- { value: 100, color: 'rgba(var(--ax-sys-color-success-500))', label: 'High' },
357
501
  ],
358
502
  },
359
503
  },
@@ -363,14 +507,16 @@ const AXMWorkflowSlaRiskPredictionBarChartAXPExtendedWidget = {
363
507
  parentName: AXPBarChartWidget.name,
364
508
  widget: {
365
509
  ...AXPBarChartWidget,
366
- name: 'workflow-sla-risk-prediction-bar',
367
- title: createMultiLanguageString('Workflow SLA Risk Prediction', 'پیش‌بینی ریسک SLA گردش کار'),
510
+ name: RootConfig.widgets.slaRiskPredictionBar,
511
+ title: '@workflow-management:dashboard-widgets.workflow-sla-risk-prediction-bar.widget-title',
512
+ description: '@workflow-management:dashboard-widgets.workflow-sla-risk-prediction-bar.widget-description',
368
513
  groups: [AXPWidgetGroupEnum.DashboardWidget],
369
514
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
515
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_SLA,
370
516
  options: {
371
- title: createMultiLanguageString('Likely breach risk score (0–100)', 'امتیاز ریسک نقض محتمل (۰–۱۰۰)'),
372
- xAxisLabel: createMultiLanguageString('Item', 'مورد'),
373
- yAxisLabel: createMultiLanguageString('Risk score', 'امتیاز ریسک'),
517
+ title: '@workflow-management:dashboard-widgets.workflow-sla-risk-prediction-bar.chart-title',
518
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-sla-risk-prediction-bar.x-axis-label',
519
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-sla-risk-prediction-bar.y-axis-label',
374
520
  dataSource: RootConfig.dataSources.dashboardChart.slaRiskPrediction,
375
521
  },
376
522
  },
@@ -380,14 +526,16 @@ const AXMWorkflowSlaTrendLineChartAXPExtendedWidget = {
380
526
  parentName: AXPLineChartWidget.name,
381
527
  widget: {
382
528
  ...AXPLineChartWidget,
383
- name: 'workflow-sla-trend-line',
384
- title: createMultiLanguageString('Workflow SLA Compliance Trend', 'روند انطباق SLA گردش کار'),
529
+ name: RootConfig.widgets.slaTrendLine,
530
+ title: '@workflow-management:dashboard-widgets.workflow-sla-trend-line.widget-title',
531
+ description: '@workflow-management:dashboard-widgets.workflow-sla-trend-line.widget-description',
385
532
  groups: [AXPWidgetGroupEnum.DashboardWidget],
386
533
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
534
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_SLA,
387
535
  options: {
388
- title: createMultiLanguageString('Resolved Within SLA (%)', 'حل‌شده در SLA (٪)'),
389
- xAxisLabel: createMultiLanguageString('Week', 'هفته'),
390
- yAxisLabel: createMultiLanguageString('Percent', 'درصد'),
536
+ title: '@workflow-management:dashboard-widgets.workflow-sla-trend-line.chart-title',
537
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-sla-trend-line.x-axis-label',
538
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-sla-trend-line.y-axis-label',
391
539
  fillArea: true,
392
540
  yAxisStartsAtZero: false,
393
541
  dataSource: RootConfig.dataSources.dashboardChart.slaComplianceTrend,
@@ -399,14 +547,16 @@ const AXMWorkflowSlaViolationsBarChartAXPExtendedWidget = {
399
547
  parentName: AXPBarChartWidget.name,
400
548
  widget: {
401
549
  ...AXPBarChartWidget,
402
- name: 'workflow-sla-violations-bar',
403
- title: createMultiLanguageString('Workflow SLA Violations & Delay', 'تخلفات SLA و تأخیر گردش کار'),
550
+ name: RootConfig.widgets.slaViolationsBar,
551
+ title: '@workflow-management:dashboard-widgets.workflow-sla-violations-bar.widget-title',
552
+ description: '@workflow-management:dashboard-widgets.workflow-sla-violations-bar.widget-description',
404
553
  groups: [AXPWidgetGroupEnum.DashboardWidget],
405
554
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
555
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_SLA,
406
556
  options: {
407
- title: createMultiLanguageString('Violations and Average Delay', 'تخلفات و میانگین تأخیر'),
408
- xAxisLabel: createMultiLanguageString('Measure', 'معیار'),
409
- yAxisLabel: createMultiLanguageString('Count / Hours', 'تعداد / ساعت'),
557
+ title: '@workflow-management:dashboard-widgets.workflow-sla-violations-bar.chart-title',
558
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-sla-violations-bar.x-axis-label',
559
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-sla-violations-bar.y-axis-label',
410
560
  dataSource: RootConfig.dataSources.dashboardChart.slaViolationsAndDelay,
411
561
  },
412
562
  },
@@ -416,14 +566,16 @@ const AXMWorkflowSystemHealthBarChartAXPExtendedWidget = {
416
566
  parentName: AXPBarChartWidget.name,
417
567
  widget: {
418
568
  ...AXPBarChartWidget,
419
- name: 'workflow-system-health-bar',
420
- title: createMultiLanguageString('Workflow System Health Summary', 'خلاصه وضعیت سلامت گردش کار'),
569
+ name: RootConfig.widgets.systemHealthBar,
570
+ title: '@workflow-management:dashboard-widgets.workflow-system-health-bar.widget-title',
571
+ description: '@workflow-management:dashboard-widgets.workflow-system-health-bar.widget-description',
421
572
  groups: [AXPWidgetGroupEnum.DashboardWidget],
422
573
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
574
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_SYSTEM_HEALTH,
423
575
  options: {
424
- title: createMultiLanguageString('Instances, Tasks, and SLA', 'نمونه‌ها، وظایف و SLA'),
425
- xAxisLabel: createMultiLanguageString('Metric', 'شاخص'),
426
- yAxisLabel: createMultiLanguageString('Count / %', 'تعداد / ٪'),
576
+ title: '@workflow-management:dashboard-widgets.workflow-system-health-bar.chart-title',
577
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-system-health-bar.x-axis-label',
578
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-system-health-bar.y-axis-label',
427
579
  dataSource: RootConfig.dataSources.dashboardChart.systemHealthSummary,
428
580
  },
429
581
  },
@@ -433,14 +585,16 @@ const AXMWorkflowOverdueTasksBarChartAXPExtendedWidget = {
433
585
  parentName: AXPBarChartWidget.name,
434
586
  widget: {
435
587
  ...AXPBarChartWidget,
436
- name: 'workflow-overdue-tasks-bar',
437
- title: createMultiLanguageString('Workflow Overdue Tasks by Process', 'وظایف معوقه گردش کار بر اساس فرایند'),
588
+ name: RootConfig.widgets.overdueTasksBar,
589
+ title: '@workflow-management:dashboard-widgets.workflow-overdue-tasks-bar.widget-title',
590
+ description: '@workflow-management:dashboard-widgets.workflow-overdue-tasks-bar.widget-description',
438
591
  groups: [AXPWidgetGroupEnum.DashboardWidget],
439
592
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
593
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_TASKS,
440
594
  options: {
441
- title: createMultiLanguageString('Overdue Tasks (by process type)', 'وظایف معوقه (بر اساس نوع فرایند)'),
442
- xAxisLabel: createMultiLanguageString('Process type', 'نوع فرایند'),
443
- yAxisLabel: createMultiLanguageString('Overdue tasks', 'وظایف معوقه'),
595
+ title: '@workflow-management:dashboard-widgets.workflow-overdue-tasks-bar.chart-title',
596
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-overdue-tasks-bar.x-axis-label',
597
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-overdue-tasks-bar.y-axis-label',
444
598
  dataSource: RootConfig.dataSources.dashboardChart.overdueTasksByProcess,
445
599
  },
446
600
  },
@@ -450,14 +604,16 @@ const AXMWorkflowPendingTasksByAgeBarChartAXPExtendedWidget = {
450
604
  parentName: AXPBarChartWidget.name,
451
605
  widget: {
452
606
  ...AXPBarChartWidget,
453
- name: 'workflow-pending-tasks-by-age-bar',
454
- title: createMultiLanguageString('Workflow Pending Tasks by Age', 'وظایف در انتظار گردش کار بر اساس قدمت'),
607
+ name: RootConfig.widgets.pendingTasksByAgeBar,
608
+ title: '@workflow-management:dashboard-widgets.workflow-pending-tasks-by-age-bar.widget-title',
609
+ description: '@workflow-management:dashboard-widgets.workflow-pending-tasks-by-age-bar.widget-description',
455
610
  groups: [AXPWidgetGroupEnum.DashboardWidget],
456
611
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
612
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_TASKS,
457
613
  options: {
458
- title: createMultiLanguageString('Pending Tasks by Age Bucket', 'وظایف در انتظار بر اساس بازه قدمت'),
459
- xAxisLabel: createMultiLanguageString('Age Bucket', 'بازه قدمت'),
460
- yAxisLabel: createMultiLanguageString('Tasks', 'وظایف'),
614
+ title: '@workflow-management:dashboard-widgets.workflow-pending-tasks-by-age-bar.chart-title',
615
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-pending-tasks-by-age-bar.x-axis-label',
616
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-pending-tasks-by-age-bar.y-axis-label',
461
617
  dataSource: RootConfig.dataSources.dashboardChart.pendingTasksByAge,
462
618
  },
463
619
  },
@@ -467,14 +623,16 @@ const AXMWorkflowLineChartAXPExtendedWidget = {
467
623
  parentName: AXPLineChartWidget.name,
468
624
  widget: {
469
625
  ...AXPLineChartWidget,
470
- name: 'workflow-line-chart',
471
- title: createMultiLanguageString('Workflow Throughput Trend', 'روند توان عملیات گردش کار'),
626
+ name: RootConfig.widgets.lineChart,
627
+ title: '@workflow-management:dashboard-widgets.workflow-line-chart.widget-title',
628
+ description: '@workflow-management:dashboard-widgets.workflow-line-chart.widget-description',
472
629
  groups: [AXPWidgetGroupEnum.DashboardWidget],
473
630
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
631
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_THROUGHPUT,
474
632
  options: {
475
- title: createMultiLanguageString('Created vs Completed (Last 8 Weeks)', 'ایجادشده و تکمیل‌شده (۸ هفته اخیر)'),
476
- xAxisLabel: createMultiLanguageString('Week', 'هفته'),
477
- yAxisLabel: createMultiLanguageString('Items', 'تعداد'),
633
+ title: '@workflow-management:dashboard-widgets.workflow-line-chart.chart-title',
634
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-line-chart.x-axis-label',
635
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-line-chart.y-axis-label',
478
636
  fillArea: false,
479
637
  /** Focus Y domain on the data range so the two series are readable (not squashed to the top band). */
480
638
  yAxisStartsAtZero: false,
@@ -483,18 +641,52 @@ const AXMWorkflowLineChartAXPExtendedWidget = {
483
641
  },
484
642
  };
485
643
 
644
+ /**
645
+ * Real-world use case:
646
+ * A conversion funnel across workflow instance lifecycle stages (Created -> Assigned -> In progress -> Completed).
647
+ *
648
+ * DataSource contract (items):
649
+ * - `{ name: string, value: number, color?: string }[]`
650
+ */
651
+ const AXMWorkflowInstanceConversionFunnelAXPExtendedWidget = {
652
+ parentName: AXPFunnelChartWidget.name,
653
+ widget: {
654
+ ...AXPFunnelChartWidget,
655
+ name: RootConfig.widgets.instanceConversionFunnel,
656
+ title: '@workflow-management:dashboard-widgets.workflow-instance-conversion-funnel.widget-title',
657
+ description: '@workflow-management:dashboard-widgets.workflow-instance-conversion-funnel.widget-description',
658
+ groups: [AXPWidgetGroupEnum.DashboardWidget],
659
+ categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
660
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_THROUGHPUT,
661
+ options: {
662
+ showLabels: true,
663
+ showTooltip: true,
664
+ neckWidth: 0.25,
665
+ animationEasing: 'cubic-out',
666
+ animationDuration: 800,
667
+ margin: { top: 16, right: 16, bottom: 16, left: 16 },
668
+ dataSource: RootConfig.dataSources.dashboardChart.instanceConversionFunnel,
669
+ messages: {
670
+ noData: '@workflow-management:dashboard-widgets.common.no-data',
671
+ },
672
+ },
673
+ },
674
+ };
675
+
486
676
  const AXMWorkflowThroughputDailyLineChartAXPExtendedWidget = {
487
677
  parentName: AXPLineChartWidget.name,
488
678
  widget: {
489
679
  ...AXPLineChartWidget,
490
- name: 'workflow-throughput-daily-line',
491
- title: createMultiLanguageString('Workflow Created vs Completed (Daily)', 'ایجاد و تکمیل روزانه گردش کار'),
680
+ name: RootConfig.widgets.throughputDailyLine,
681
+ title: '@workflow-management:dashboard-widgets.workflow-throughput-daily-line.widget-title',
682
+ description: '@workflow-management:dashboard-widgets.workflow-throughput-daily-line.widget-description',
492
683
  groups: [AXPWidgetGroupEnum.DashboardWidget],
493
684
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
685
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_THROUGHPUT,
494
686
  options: {
495
- title: createMultiLanguageString('Created vs Completed — Daily', 'ایجاد در مقابل تکمیل — روزانه'),
496
- xAxisLabel: createMultiLanguageString('Day', 'روز'),
497
- yAxisLabel: createMultiLanguageString('Items', 'تعداد'),
687
+ title: '@workflow-management:dashboard-widgets.workflow-throughput-daily-line.chart-title',
688
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-throughput-daily-line.x-axis-label',
689
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-throughput-daily-line.y-axis-label',
498
690
  fillArea: false,
499
691
  yAxisStartsAtZero: false,
500
692
  dataSource: RootConfig.dataSources.dashboardChart.throughputDaily,
@@ -506,14 +698,16 @@ const AXMWorkflowThroughputWeeklyLineChartAXPExtendedWidget = {
506
698
  parentName: AXPLineChartWidget.name,
507
699
  widget: {
508
700
  ...AXPLineChartWidget,
509
- name: 'workflow-throughput-weekly-line',
510
- title: createMultiLanguageString('Workflow Created vs Completed (Weekly)', 'ایجاد و تکمیل هفتگی گردش کار'),
701
+ name: RootConfig.widgets.throughputWeeklyLine,
702
+ title: '@workflow-management:dashboard-widgets.workflow-throughput-weekly-line.widget-title',
703
+ description: '@workflow-management:dashboard-widgets.workflow-throughput-weekly-line.widget-description',
511
704
  groups: [AXPWidgetGroupEnum.DashboardWidget],
512
705
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
706
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_THROUGHPUT,
513
707
  options: {
514
- title: createMultiLanguageString('Created vs Completed — Weekly', 'ایجاد در مقابل تکمیل — هفتگی'),
515
- xAxisLabel: createMultiLanguageString('Week', 'هفته'),
516
- yAxisLabel: createMultiLanguageString('Items', 'تعداد'),
708
+ title: '@workflow-management:dashboard-widgets.workflow-throughput-weekly-line.chart-title',
709
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-throughput-weekly-line.x-axis-label',
710
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-throughput-weekly-line.y-axis-label',
517
711
  fillArea: false,
518
712
  yAxisStartsAtZero: false,
519
713
  dataSource: RootConfig.dataSources.dashboardChart.throughputWeekly,
@@ -525,14 +719,16 @@ const AXMWorkflowBottleneckBarChartAXPExtendedWidget = {
525
719
  parentName: AXPBarChartWidget.name,
526
720
  widget: {
527
721
  ...AXPBarChartWidget,
528
- name: 'workflow-bottleneck-bar',
529
- title: createMultiLanguageString('Workflow Bottleneck Detection', 'تشخیص گلوگاه گردش کار'),
722
+ name: RootConfig.widgets.bottleneckBar,
723
+ title: '@workflow-management:dashboard-widgets.workflow-bottleneck-bar.widget-title',
724
+ description: '@workflow-management:dashboard-widgets.workflow-bottleneck-bar.widget-description',
530
725
  groups: [AXPWidgetGroupEnum.DashboardWidget],
531
726
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
727
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_WORKLOAD,
532
728
  options: {
533
- title: createMultiLanguageString('Highest average wait by activity', 'بیشترین میانگین انتظار بر اساس فعالیت'),
534
- xAxisLabel: createMultiLanguageString('Activity / step', 'فعالیت / گام'),
535
- yAxisLabel: createMultiLanguageString('Avg wait (hours)', 'میانگین انتظار (ساعت)'),
729
+ title: '@workflow-management:dashboard-widgets.workflow-bottleneck-bar.chart-title',
730
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-bottleneck-bar.x-axis-label',
731
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-bottleneck-bar.y-axis-label',
536
732
  dataSource: RootConfig.dataSources.dashboardChart.bottleneckActivities,
537
733
  },
538
734
  },
@@ -542,12 +738,14 @@ const AXMWorkflowDonutChartAXPExtendedWidget = {
542
738
  parentName: AXPDonutChartWidget.name,
543
739
  widget: {
544
740
  ...AXPDonutChartWidget,
545
- name: 'workflow-donut-chart',
546
- title: createMultiLanguageString('Workflow Workload by Process', 'بار کاری گردش کار بر اساس فرایند'),
741
+ name: RootConfig.widgets.donutChart,
742
+ title: '@workflow-management:dashboard-widgets.workflow-donut-chart.widget-title',
743
+ description: '@workflow-management:dashboard-widgets.workflow-donut-chart.widget-description',
547
744
  groups: [AXPWidgetGroupEnum.DashboardWidget],
548
745
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
746
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_WORKLOAD,
549
747
  options: {
550
- title: createMultiLanguageString('Workload by Process', 'بار کاری بر اساس فرایند'),
748
+ title: '@workflow-management:dashboard-widgets.workflow-donut-chart.chart-title',
551
749
  dataSource: RootConfig.dataSources.dashboardChart.workloadByProcess,
552
750
  },
553
751
  },
@@ -557,14 +755,16 @@ const AXMWorkflowOverloadedUsersBarChartAXPExtendedWidget = {
557
755
  parentName: AXPBarChartWidget.name,
558
756
  widget: {
559
757
  ...AXPBarChartWidget,
560
- name: 'workflow-overloaded-users-bar',
561
- title: createMultiLanguageString('Workflow Overloaded Users', 'کاربران با بار بیش از حد گردش کار'),
758
+ name: RootConfig.widgets.overloadedUsersBar,
759
+ title: '@workflow-management:dashboard-widgets.workflow-overloaded-users-bar.widget-title',
760
+ description: '@workflow-management:dashboard-widgets.workflow-overloaded-users-bar.widget-description',
562
761
  groups: [AXPWidgetGroupEnum.DashboardWidget],
563
762
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
763
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_WORKLOAD,
564
764
  options: {
565
- title: createMultiLanguageString('Users above capacity threshold (active tasks)', 'کاربران بالاتر از آستانه ظرفیت (وظایف فعال)'),
566
- xAxisLabel: createMultiLanguageString('User', 'کاربر'),
567
- yAxisLabel: createMultiLanguageString('Active tasks', 'وظایف فعال'),
765
+ title: '@workflow-management:dashboard-widgets.workflow-overloaded-users-bar.chart-title',
766
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-overloaded-users-bar.x-axis-label',
767
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-overloaded-users-bar.y-axis-label',
568
768
  dataSource: RootConfig.dataSources.dashboardChart.workloadOverloadedUsers,
569
769
  },
570
770
  },
@@ -574,14 +774,16 @@ const AXMWorkflowWorkloadPerUserActiveBarChartAXPExtendedWidget = {
574
774
  parentName: AXPBarChartWidget.name,
575
775
  widget: {
576
776
  ...AXPBarChartWidget,
577
- name: 'workflow-workload-per-user-active-bar',
578
- title: createMultiLanguageString('Workflow Workload per User (Active)', 'بار کاری گردش کار به ازای کاربر (فعال)'),
777
+ name: RootConfig.widgets.workloadPerUserActiveBar,
778
+ title: '@workflow-management:dashboard-widgets.workflow-workload-per-user-active-bar.widget-title',
779
+ description: '@workflow-management:dashboard-widgets.workflow-workload-per-user-active-bar.widget-description',
579
780
  groups: [AXPWidgetGroupEnum.DashboardWidget],
580
781
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
782
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_WORKLOAD,
581
783
  options: {
582
- title: createMultiLanguageString('Active task count by user', 'تعداد وظایف فعال به ازای کاربر'),
583
- xAxisLabel: createMultiLanguageString('User', 'کاربر'),
584
- yAxisLabel: createMultiLanguageString('Active tasks', 'وظایف فعال'),
784
+ title: '@workflow-management:dashboard-widgets.workflow-workload-per-user-active-bar.chart-title',
785
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-workload-per-user-active-bar.x-axis-label',
786
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-workload-per-user-active-bar.y-axis-label',
585
787
  dataSource: RootConfig.dataSources.dashboardChart.workloadPerUserActive,
586
788
  },
587
789
  },
@@ -591,14 +793,16 @@ const AXMWorkflowWorkloadPerUserAvgAgeBarChartAXPExtendedWidget = {
591
793
  parentName: AXPBarChartWidget.name,
592
794
  widget: {
593
795
  ...AXPBarChartWidget,
594
- name: 'workflow-workload-per-user-avg-age-bar',
595
- title: createMultiLanguageString('Workflow Avg Task Age per User', 'میانگین قدمت وظیفه به ازای کاربر'),
796
+ name: RootConfig.widgets.workloadPerUserAvgAgeBar,
797
+ title: '@workflow-management:dashboard-widgets.workflow-workload-per-user-avg-age-bar.widget-title',
798
+ description: '@workflow-management:dashboard-widgets.workflow-workload-per-user-avg-age-bar.widget-description',
596
799
  groups: [AXPWidgetGroupEnum.DashboardWidget],
597
800
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
801
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_WORKLOAD,
598
802
  options: {
599
- title: createMultiLanguageString('Average age of active tasks (hours)', 'میانگین قدمت وظایف فعال (ساعت)'),
600
- xAxisLabel: createMultiLanguageString('User', 'کاربر'),
601
- yAxisLabel: createMultiLanguageString('Hours', 'ساعت'),
803
+ title: '@workflow-management:dashboard-widgets.workflow-workload-per-user-avg-age-bar.chart-title',
804
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-workload-per-user-avg-age-bar.x-axis-label',
805
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-workload-per-user-avg-age-bar.y-axis-label',
602
806
  dataSource: RootConfig.dataSources.dashboardChart.workloadPerUserAvgAgeHours,
603
807
  },
604
808
  },
@@ -608,31 +812,106 @@ const AXMWorkflowWorkloadPerUserOverdueBarChartAXPExtendedWidget = {
608
812
  parentName: AXPBarChartWidget.name,
609
813
  widget: {
610
814
  ...AXPBarChartWidget,
611
- name: 'workflow-workload-per-user-overdue-bar',
612
- title: createMultiLanguageString('Workflow Workload per User (Overdue)', 'بار کاری گردش کار به ازای کاربر (معوقه)'),
815
+ name: RootConfig.widgets.workloadPerUserOverdueBar,
816
+ title: '@workflow-management:dashboard-widgets.workflow-workload-per-user-overdue-bar.widget-title',
817
+ description: '@workflow-management:dashboard-widgets.workflow-workload-per-user-overdue-bar.widget-description',
613
818
  groups: [AXPWidgetGroupEnum.DashboardWidget],
614
819
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
820
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_WORKLOAD,
615
821
  options: {
616
- title: createMultiLanguageString('Overdue task count by user', 'تعداد وظایف معوقه به ازای کاربر'),
617
- xAxisLabel: createMultiLanguageString('User', 'کاربر'),
618
- yAxisLabel: createMultiLanguageString('Overdue tasks', 'وظایف معوقه'),
822
+ title: '@workflow-management:dashboard-widgets.workflow-workload-per-user-overdue-bar.chart-title',
823
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-workload-per-user-overdue-bar.x-axis-label',
824
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-workload-per-user-overdue-bar.y-axis-label',
619
825
  dataSource: RootConfig.dataSources.dashboardChart.workloadPerUserOverdue,
620
826
  },
621
827
  },
622
828
  };
623
829
 
830
+ const AXMWorkflowKpiDetailsAXPExtendedWidget = {
831
+ parentName: AXPKpiDetailsWidget.name,
832
+ widget: {
833
+ ...AXPKpiDetailsWidget,
834
+ name: RootConfig.widgets.kpiDetails,
835
+ title: '@workflow-management:dashboard-widgets.workflow-kpi-details.widget-title',
836
+ description: '@workflow-management:dashboard-widgets.workflow-kpi-details.widget-description',
837
+ groups: [AXPWidgetGroupEnum.DashboardWidget],
838
+ categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
839
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_KPI,
840
+ options: {
841
+ title: '@workflow-management:dashboard-widgets.workflow-kpi-details.options-title',
842
+ subtitle: '@workflow-management:dashboard-widgets.workflow-kpi-details.options-subtitle',
843
+ valueSuffix: '@workflow-management:dashboard-widgets.workflow-kpi-details.value-suffix',
844
+ dataSource: RootConfig.dataSources.dashboardKpi.throughputOverview,
845
+ },
846
+ },
847
+ };
848
+
849
+ const AXMWorkflowKpiProgressAXPExtendedWidget = {
850
+ parentName: AXPKpiProgressWidget.name,
851
+ widget: {
852
+ ...AXPKpiProgressWidget,
853
+ name: RootConfig.widgets.kpiProgress,
854
+ title: '@workflow-management:dashboard-widgets.workflow-kpi-progress.widget-title',
855
+ description: '@workflow-management:dashboard-widgets.workflow-kpi-progress.widget-description',
856
+ groups: [AXPWidgetGroupEnum.DashboardWidget],
857
+ categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
858
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_KPI,
859
+ options: {
860
+ subtitle: '@workflow-management:dashboard-widgets.workflow-kpi-progress.options-subtitle',
861
+ valueSuffix: '%',
862
+ targetValue: 95,
863
+ dataSource: RootConfig.dataSources.dashboardKpi.slaComplianceSnapshot,
864
+ },
865
+ },
866
+ };
867
+
868
+ const AXMWorkflowKpiSegmentedAXPExtendedWidget = {
869
+ parentName: AXPKpiSegmentedWidget.name,
870
+ widget: {
871
+ ...AXPKpiSegmentedWidget,
872
+ name: RootConfig.widgets.kpiSegmented,
873
+ title: '@workflow-management:dashboard-widgets.workflow-kpi-segmented.widget-title',
874
+ description: '@workflow-management:dashboard-widgets.workflow-kpi-segmented.widget-description',
875
+ groups: [AXPWidgetGroupEnum.DashboardWidget],
876
+ categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
877
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_KPI,
878
+ options: {
879
+ title: '@workflow-management:dashboard-widgets.workflow-kpi-segmented.options-title',
880
+ dataSource: RootConfig.dataSources.dashboardKpi.taskStatusBreakdown,
881
+ },
882
+ },
883
+ };
884
+
885
+ const AXMWorkflowKpiStatCardAXPExtendedWidget = {
886
+ parentName: AXPKpiStatCardWidget.name,
887
+ widget: {
888
+ ...AXPKpiStatCardWidget,
889
+ name: RootConfig.widgets.kpiStatCard,
890
+ title: '@workflow-management:dashboard-widgets.workflow-kpi-stat-card.widget-title',
891
+ description: '@workflow-management:dashboard-widgets.workflow-kpi-stat-card.widget-description',
892
+ groups: [AXPWidgetGroupEnum.DashboardWidget],
893
+ categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
894
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_KPI,
895
+ options: {
896
+ dataSource: RootConfig.dataSources.dashboardKpi.kpiStatCard,
897
+ },
898
+ },
899
+ };
900
+
624
901
  const AXMWorkflowBarChartAXPExtendedWidget = {
625
902
  parentName: AXPBarChartWidget.name,
626
903
  widget: {
627
904
  ...AXPBarChartWidget,
628
- name: 'workflow-bar-chart',
629
- title: createMultiLanguageString('Workflow Pending Approvals by Age', 'تأییدهای در انتظار گردش کار بر اساس قدمت'),
905
+ name: RootConfig.widgets.barChart,
906
+ title: '@workflow-management:dashboard-widgets.workflow-bar-chart.widget-title',
907
+ description: '@workflow-management:dashboard-widgets.workflow-bar-chart.widget-description',
630
908
  groups: [AXPWidgetGroupEnum.DashboardWidget],
631
909
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
910
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_USER,
632
911
  options: {
633
- title: createMultiLanguageString('Pending Approvals by Age', 'تأییدهای در انتظار بر اساس قدمت'),
634
- xAxisLabel: createMultiLanguageString('Age Bucket', 'بازه قدمت'),
635
- yAxisLabel: createMultiLanguageString('Count', 'تعداد'),
912
+ title: '@workflow-management:dashboard-widgets.workflow-bar-chart.chart-title',
913
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-bar-chart.x-axis-label',
914
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-bar-chart.y-axis-label',
636
915
  dataSource: RootConfig.dataSources.dashboardChart.pendingApproval,
637
916
  },
638
917
  },
@@ -642,14 +921,16 @@ const AXMWorkflowTasksNearDeadlineBarChartAXPExtendedWidget = {
642
921
  parentName: AXPBarChartWidget.name,
643
922
  widget: {
644
923
  ...AXPBarChartWidget,
645
- name: 'workflow-tasks-near-deadline-bar',
646
- title: createMultiLanguageString('Workflow Tasks Near Deadline / SLA Risk', 'وظایف نزدیک مهلت / ریسک SLA'),
924
+ name: RootConfig.widgets.tasksNearDeadlineBar,
925
+ title: '@workflow-management:dashboard-widgets.workflow-tasks-near-deadline-bar.widget-title',
926
+ description: '@workflow-management:dashboard-widgets.workflow-tasks-near-deadline-bar.widget-description',
647
927
  groups: [AXPWidgetGroupEnum.DashboardWidget],
648
928
  categories: [AXP_WORKFLOW_DASHBOARD_WIDGET_CATEGORY],
929
+ subCategory: AXP_WORKFLOW_DASHBOARD_SUB_USER,
649
930
  options: {
650
- title: createMultiLanguageString('Remaining time to deadline (minutes)', 'زمان باقی‌مانده تا مهلت (دقیقه)'),
651
- xAxisLabel: createMultiLanguageString('Task', 'وظیفه'),
652
- yAxisLabel: createMultiLanguageString('Minutes left', 'دقیقه باقی‌مانده'),
931
+ title: '@workflow-management:dashboard-widgets.workflow-tasks-near-deadline-bar.chart-title',
932
+ xAxisLabel: '@workflow-management:dashboard-widgets.workflow-tasks-near-deadline-bar.x-axis-label',
933
+ yAxisLabel: '@workflow-management:dashboard-widgets.workflow-tasks-near-deadline-bar.y-axis-label',
653
934
  dataSource: RootConfig.dataSources.dashboardChart.tasksNearDeadline,
654
935
  },
655
936
  },
@@ -681,6 +962,12 @@ const WORKFLOW_DASHBOARD_EXTENDED_WIDGETS = [
681
962
  AXMWorkflowFailedProcessesByTypeDonutChartAXPExtendedWidget,
682
963
  AXMWorkflowStuckProcessesBarChartAXPExtendedWidget,
683
964
  AXMWorkflowErrorsBarChartAXPExtendedWidget,
965
+ AXMWorkflowErrorsHeatmapAXPExtendedWidget,
966
+ AXMWorkflowInstanceConversionFunnelAXPExtendedWidget,
967
+ AXMWorkflowKpiProgressAXPExtendedWidget,
968
+ AXMWorkflowKpiSegmentedAXPExtendedWidget,
969
+ AXMWorkflowKpiDetailsAXPExtendedWidget,
970
+ AXMWorkflowKpiStatCardAXPExtendedWidget,
684
971
  ];
685
972
  //#endregion
686
973
  //#region ---- Provider ----
@@ -735,13 +1022,13 @@ const AXMActivityCommandConfiguratorWidget = {
735
1022
  ],
736
1023
  components: {
737
1024
  edit: {
738
- component: () => import('./acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BGUPxGXP.mjs').then((c) => c.AXMActivityCommandConfiguratorWidgetEditComponent),
1025
+ component: () => import('./acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BYJpDQRs.mjs').then((c) => c.AXMActivityCommandConfiguratorWidgetEditComponent),
739
1026
  },
740
1027
  designer: {
741
- component: () => import('./acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BGUPxGXP.mjs').then((c) => c.AXMActivityCommandConfiguratorWidgetEditComponent),
1028
+ component: () => import('./acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BYJpDQRs.mjs').then((c) => c.AXMActivityCommandConfiguratorWidgetEditComponent),
742
1029
  },
743
1030
  column: {
744
- component: () => import('./acorex-modules-workflow-management-activity-command-configurator-widget-column.component-C8lgSjfc.mjs').then((c) => c.AXMActivityCommandConfiguratorWidgetColumnComponent),
1031
+ component: () => import('./acorex-modules-workflow-management-activity-command-configurator-widget-column.component-CDo0QVFy.mjs').then((c) => c.AXMActivityCommandConfiguratorWidgetColumnComponent),
745
1032
  },
746
1033
  },
747
1034
  };
@@ -1076,6 +1363,77 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1076
1363
  type: Injectable
1077
1364
  }] });
1078
1365
 
1366
+ //#region ---- Imports ----
1367
+ //#endregion
1368
+ /**
1369
+ * Cartable task activity (frontend): suspends workflow with candidate users only.
1370
+ * Assignee is set when a candidate claims the task on the task board (bookmark update).
1371
+ *
1372
+ * Activity Type: workflow-activity:cartable
1373
+ */
1374
+ class CartableTaskActivity {
1375
+ //#region ---- AXPCommand Implementation ----
1376
+ async execute(input) {
1377
+ console.log('[CartableTaskActivity] input', input.context?.['input'] ?? 'no input');
1378
+ try {
1379
+ if (!input.title && !input.description) {
1380
+ console.warn('[CartableTaskActivity] No title or description provided');
1381
+ }
1382
+ const availableOutcomes = [];
1383
+ const rawActions = input.actions;
1384
+ if (rawActions) {
1385
+ try {
1386
+ const actions = typeof rawActions === 'string' ? JSON.parse(rawActions) : rawActions;
1387
+ const prefix = actions?.prefix ?? [];
1388
+ const suffix = actions?.suffix ?? [];
1389
+ for (const item of [...prefix, ...suffix]) {
1390
+ const name = item?.command?.name ?? item?.name;
1391
+ if (name && typeof name === 'string')
1392
+ availableOutcomes.push(name);
1393
+ }
1394
+ }
1395
+ catch {
1396
+ // ignore parse error
1397
+ }
1398
+ }
1399
+ if (availableOutcomes.length === 0) {
1400
+ availableOutcomes.push('cancel', 'submit');
1401
+ }
1402
+ return {
1403
+ success: true,
1404
+ data: {
1405
+ result: input.context || {},
1406
+ action: 'pending',
1407
+ },
1408
+ metadata: {
1409
+ outcome: 'pending',
1410
+ },
1411
+ };
1412
+ }
1413
+ catch (error) {
1414
+ console.error(`[CartableTaskActivity] Failed to execute:`, error);
1415
+ return {
1416
+ success: false,
1417
+ message: {
1418
+ text: error instanceof Error ? error.message : 'Failed to execute cartable task',
1419
+ },
1420
+ data: {
1421
+ result: {},
1422
+ action: 'cancel',
1423
+ },
1424
+ metadata: {
1425
+ outcome: 'cancel',
1426
+ },
1427
+ };
1428
+ }
1429
+ }
1430
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CartableTaskActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1431
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CartableTaskActivity }); }
1432
+ }
1433
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CartableTaskActivity, decorators: [{
1434
+ type: Injectable
1435
+ }] });
1436
+
1079
1437
  //#endregion
1080
1438
  /**
1081
1439
  * ShowToast Activity (Frontend)
@@ -1670,6 +2028,7 @@ var index = /*#__PURE__*/Object.freeze({
1670
2028
  __proto__: null,
1671
2029
  AXMWorkflowActivitiesDefinitionProvider: AXMWorkflowActivitiesDefinitionProvider,
1672
2030
  AXPCreateEntityActivity: AXPCreateEntityActivity,
2031
+ CartableTaskActivity: CartableTaskActivity,
1673
2032
  CollectSignatureActivity: CollectSignatureActivity,
1674
2033
  CreateEntityFormActivity: CreateEntityFormActivity,
1675
2034
  HumanTaskActivity: HumanTaskActivity,
@@ -1953,21 +2312,10 @@ class AXMWorkflowDefinitionProvider {
1953
2312
  }
1954
2313
  //#endregion
1955
2314
  //#region ---- AXPWorkflowProvider Implementation ----
1956
- async getList(categoryId) {
1957
- // Same as report: filter by categoryIds array with 'contains'
2315
+ async getList(_categoryId) {
1958
2316
  const result = await this.workflowDefinitionService.query({
1959
2317
  skip: 0,
1960
2318
  take: 1000,
1961
- filter: {
1962
- logic: 'and',
1963
- filters: [{
1964
- field: 'categoryIds',
1965
- operator: {
1966
- type: 'contains',
1967
- },
1968
- value: categoryId,
1969
- }]
1970
- }
1971
2319
  });
1972
2320
  // Convert entity data to workflow definition format
1973
2321
  return (result.items || []).map((item) => ({
@@ -2053,6 +2401,72 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2053
2401
  type: Injectable
2054
2402
  }] });
2055
2403
 
2404
+ //#region ---- Imports ----
2405
+ //#endregion
2406
+ //#region ---- Workflow definition lifecycle status ----
2407
+ /**
2408
+ * Publication lifecycle for workflow definitions: draft, review, published, archived.
2409
+ */
2410
+ class AXMWorkflowDefinitionStatusProvider extends AXPStatusProvider {
2411
+ constructor() {
2412
+ super(...arguments);
2413
+ this.key = 'workflow-management.status.workflow-definition';
2414
+ this.defaultStatus = AXPSystemStatusType.Draft;
2415
+ this.statuses = [
2416
+ systemStatusToDefinition(AXPSystemStatusType.Draft, {
2417
+ generateView: true,
2418
+ }),
2419
+ systemStatusToDefinition(AXPSystemStatusType.PendingReview, {
2420
+ generateView: true,
2421
+ }),
2422
+ systemStatusToDefinition(AXPSystemStatusType.Published, {
2423
+ generateView: true,
2424
+ }),
2425
+ systemStatusToDefinition(AXPSystemStatusType.Archived, {
2426
+ generateView: false,
2427
+ }),
2428
+ ];
2429
+ this.transitions = [
2430
+ {
2431
+ from: AXPSystemStatusType.Draft,
2432
+ to: AXPSystemStatusType.PendingReview,
2433
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.status.transitions.submit-review',
2434
+ },
2435
+ {
2436
+ from: AXPSystemStatusType.Draft,
2437
+ to: AXPSystemStatusType.Published,
2438
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.status.transitions.publish-direct',
2439
+ },
2440
+ {
2441
+ from: AXPSystemStatusType.PendingReview,
2442
+ to: AXPSystemStatusType.Published,
2443
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.status.transitions.publish',
2444
+ },
2445
+ {
2446
+ from: AXPSystemStatusType.PendingReview,
2447
+ to: AXPSystemStatusType.Draft,
2448
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.status.transitions.revise',
2449
+ },
2450
+ {
2451
+ from: AXPSystemStatusType.Published,
2452
+ to: AXPSystemStatusType.Draft,
2453
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.status.transitions.unpublish',
2454
+ },
2455
+ {
2456
+ from: AXPSystemStatusType.Published,
2457
+ to: AXPSystemStatusType.Archived,
2458
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.status.transitions.archive',
2459
+ },
2460
+ {
2461
+ from: AXPSystemStatusType.Draft,
2462
+ to: AXPSystemStatusType.Archived,
2463
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.status.transitions.archive',
2464
+ },
2465
+ ];
2466
+ }
2467
+ }
2468
+ //#endregion
2469
+
2056
2470
  //#region ---- Imports ----
2057
2471
  //#endregion
2058
2472
  //#region ---- Manifest Definition ----
@@ -2164,6 +2578,31 @@ class AXPGenericWorkflowTaskProvider extends AXPWorkflowTaskProvider {
2164
2578
  }
2165
2579
  //#endregion
2166
2580
  //#region ---- Task Retrieval ----
2581
+ /**
2582
+ * Bookmark types shown on the workflow task board.
2583
+ */
2584
+ isTaskBoardBookmarkPayload(payload) {
2585
+ const t = payload.activityType;
2586
+ return t === 'workflow-activity:human-task' || t === 'workflow-activity:cartable';
2587
+ }
2588
+ /**
2589
+ * Pooled task: must be claimed before submit/cancel (cartable, or human-task with candidates only).
2590
+ */
2591
+ isPooledClaimablePayload(payload) {
2592
+ const assigned = this.normalizeUserIdList(payload.assignedUserIds);
2593
+ const candidates = this.normalizeUserIdList(payload.candidateUserIds);
2594
+ if (payload.activityType === 'workflow-activity:cartable') {
2595
+ return assigned.length === 0 && candidates.length > 0;
2596
+ }
2597
+ return (payload.activityType === 'workflow-activity:human-task' &&
2598
+ assigned.length === 0 &&
2599
+ candidates.length > 0);
2600
+ }
2601
+ normalizeUserIdList(value) {
2602
+ if (!value || value.length === 0)
2603
+ return [];
2604
+ return value.map((id) => String(id)).filter((s) => s.length > 0);
2605
+ }
2167
2606
  /**
2168
2607
  * Get tasks from suspended workflow instances.
2169
2608
  *
@@ -2237,8 +2676,8 @@ class AXPGenericWorkflowTaskProvider extends AXPWorkflowTaskProvider {
2237
2676
  catch {
2238
2677
  continue;
2239
2678
  }
2240
- // Only process bookmarks for workflow-activity:human-task (cartable tasks only; forms/popups excluded)
2241
- if (payload.activityType !== 'workflow-activity:human-task') {
2679
+ // Task board: human-task and cartable (pooled); exclude other suspended UI bookmarks
2680
+ if (!this.isTaskBoardBookmarkPayload(payload)) {
2242
2681
  continue;
2243
2682
  }
2244
2683
  // Check assignment filter if provided
@@ -2247,7 +2686,8 @@ class AXPGenericWorkflowTaskProvider extends AXPWorkflowTaskProvider {
2247
2686
  const candidateIds = payload.candidateUserIds || [];
2248
2687
  const allUserIds = [...assignedIds, ...candidateIds];
2249
2688
  // TODO: Also check candidateRoleIds by resolving role members
2250
- const matchesAssignee = allUserIds.some((id) => options.assigneeIds.includes(id));
2689
+ const filterIds = options.assigneeIds.map((id) => String(id));
2690
+ const matchesAssignee = allUserIds.some((id) => filterIds.includes(String(id)));
2251
2691
  if (!matchesAssignee) {
2252
2692
  continue;
2253
2693
  }
@@ -2381,9 +2821,28 @@ class AXPGenericWorkflowTaskProvider extends AXPWorkflowTaskProvider {
2381
2821
  const instanceId = taskData?.instanceId ?? command.options?.['instanceId'] ?? '';
2382
2822
  const bookmarkId = taskData?.bookmarkId ?? command.options?.['bookmarkId'] ?? '';
2383
2823
  const taskToken = taskData?.taskToken ?? command.options?.['taskToken'] ?? '';
2384
- const activityId = taskData?.activityId ?? command.options?.['activityId'] ?? '';
2824
+ const activityId = taskData?.activityId ?? command.options?.['activityId'] ?? command.options?.['stepId'] ?? '';
2385
2825
  const outcome = command.options?.['outcome'] ?? 'Done';
2386
2826
  const userInput = command.options?.['userInput'] ?? {};
2827
+ if (command.name === 'WorkflowManagement.WorkflowInstance:ClaimTask') {
2828
+ if (!instanceId || !bookmarkId || !activityId) {
2829
+ return {
2830
+ success: false,
2831
+ message: {
2832
+ text: 'Missing required parameters: instanceId, bookmarkId, activityId',
2833
+ },
2834
+ };
2835
+ }
2836
+ const claimResult = await this.workflowManager.claimTask(instanceId, bookmarkId, activityId);
2837
+ return {
2838
+ success: claimResult.success,
2839
+ message: claimResult.error
2840
+ ? {
2841
+ text: claimResult.error,
2842
+ }
2843
+ : undefined,
2844
+ };
2845
+ }
2387
2846
  // Handle workflow resume commands
2388
2847
  if (command.name === 'WorkflowManagement.WorkflowInstance:Resume' || command.name === 'resume-workflow') {
2389
2848
  if (!instanceId || !taskToken || !activityId) {
@@ -2431,6 +2890,24 @@ class AXPGenericWorkflowTaskProvider extends AXPWorkflowTaskProvider {
2431
2890
  const payload = taskData?.payload;
2432
2891
  if (!payload)
2433
2892
  return actions;
2893
+ if (this.isPooledClaimablePayload(payload)) {
2894
+ actions.push({
2895
+ name: 'claim',
2896
+ title: this.translationService.translateSync('@workflow-management:tasks.actions.claim.title'),
2897
+ icon: 'fa-light fa-hand',
2898
+ color: 'primary',
2899
+ priority: 'primary',
2900
+ command: {
2901
+ name: 'WorkflowManagement.WorkflowInstance:ClaimTask',
2902
+ options: {
2903
+ instanceId: taskData.instanceId,
2904
+ bookmarkId: taskData.bookmarkId,
2905
+ activityId: taskData.activityId,
2906
+ },
2907
+ },
2908
+ });
2909
+ return actions;
2910
+ }
2434
2911
  // Extract actions from payload
2435
2912
  if (payload.actions) {
2436
2913
  const allActions = [
@@ -2516,7 +2993,7 @@ class AXPGenericWorkflowTaskProvider extends AXPWorkflowTaskProvider {
2516
2993
  //#endregion
2517
2994
  //#region ---- Component ----
2518
2995
  getComponent() {
2519
- return () => import('./acorex-modules-workflow-management-workflow-task-popover.component-CIakASVR.mjs').then((m) => m.AXMWorkflowTaskPopoverComponent);
2996
+ return () => import('./acorex-modules-workflow-management-workflow-task-popover.component-NpUx0sB5.mjs').then((m) => m.AXMWorkflowTaskPopoverComponent);
2520
2997
  }
2521
2998
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGenericWorkflowTaskProvider, deps: [{ token: AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
2522
2999
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGenericWorkflowTaskProvider }); }
@@ -2536,21 +3013,34 @@ function provideTaskWorkflow() {
2536
3013
  useFactory: (injector) => {
2537
3014
  return (async () => {
2538
3015
  const workflowDefinitionService = injector.get(AXPWorkflowDefinitionService);
3016
+ const multiLanguageResolver = injector.get(AXTranslationService);
2539
3017
  const categories = await workflowDefinitionService.getCategories();
2540
3018
  const providers = [];
3019
+ const seenDefinitionNames = new Set();
2541
3020
  for (const category of categories) {
2542
3021
  const workflows = await workflowDefinitionService.getWorkflowsByCategoryId(category.id);
2543
3022
  for (const workflow of workflows) {
3023
+ const key = workflow.name;
3024
+ if (!key || seenDefinitionNames.has(key)) {
3025
+ continue;
3026
+ }
3027
+ seenDefinitionNames.add(key);
2544
3028
  const provider = runInInjectionContext(injector, () => new AXPGenericWorkflowTaskProvider({
2545
3029
  name: workflow.name,
2546
- title: workflow.title ?? workflow.name,
3030
+ title: multiLanguageResolver.resolve(workflow.title) ?? workflow.name,
2547
3031
  icon: 'fa-light fa-diagram-project',
2548
3032
  definitionId: workflow.name,
2549
3033
  }));
2550
3034
  providers.push(provider);
2551
3035
  }
2552
3036
  }
2553
- console.log('providers', providers);
3037
+ if (providers.length === 0) {
3038
+ providers.push(runInInjectionContext(injector, () => new AXPGenericWorkflowTaskProvider({
3039
+ name: 'workflow-tasks-all',
3040
+ title: 'Workflow tasks',
3041
+ icon: 'fa-light fa-inbox',
3042
+ })));
3043
+ }
2554
3044
  return providers;
2555
3045
  })();
2556
3046
  },
@@ -2594,13 +3084,21 @@ class AXMWorkflowManagementModule {
2594
3084
  useFactory: routesFactory,
2595
3085
  },
2596
3086
  provideCommandSetups([
3087
+ {
3088
+ key: 'WorkflowManagement.WorkflowDefinition:ExecuteWithInput',
3089
+ command: () => import('./acorex-modules-workflow-management-index-C9Qc07oK.mjs').then((c) => c.ExecuteWorkflowWithInputCommand),
3090
+ },
2597
3091
  {
2598
3092
  key: 'WorkflowManagement.WorkflowDefinition:Execute',
2599
- command: () => import('./acorex-modules-workflow-management-index-DWIDQsWq.mjs').then((c) => c.ExecuteWorkflowCommand),
3093
+ command: () => import('./acorex-modules-workflow-management-index-C9Qc07oK.mjs').then((c) => c.ExecuteWorkflowCommand),
2600
3094
  },
2601
3095
  {
2602
3096
  key: 'WorkflowManagement.WorkflowDefinition:EditInStudio',
2603
- command: () => import('./acorex-modules-workflow-management-index-DWIDQsWq.mjs').then((c) => c.EditInStudioCommand),
3097
+ command: () => import('./acorex-modules-workflow-management-index-C9Qc07oK.mjs').then((c) => c.EditInStudioCommand),
3098
+ },
3099
+ {
3100
+ key: 'WorkflowManagement.WorkflowDefinition:Activities:Save',
3101
+ command: () => import('./acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs').then((c) => c.SaveWorkflowDefinitionActivitiesCommand),
2604
3102
  },
2605
3103
  {
2606
3104
  key: 'workflow-activity:show-toast',
@@ -2626,6 +3124,10 @@ class AXMWorkflowManagementModule {
2626
3124
  key: 'workflow-activity:human-task',
2627
3125
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.HumanTaskActivity),
2628
3126
  },
3127
+ {
3128
+ key: 'workflow-activity:cartable',
3129
+ command: () => Promise.resolve().then(function () { return index; }).then((c) => c.CartableTaskActivity),
3130
+ },
2629
3131
  {
2630
3132
  key: 'workflow-activity:collect-signature',
2631
3133
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.CollectSignatureActivity),
@@ -2638,6 +3140,8 @@ class AXMWorkflowManagementModule {
2638
3140
  useClass: AXMWorkflowManagementModuleEntityProvider,
2639
3141
  multi: true,
2640
3142
  },
3143
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-modules-workflow-management-index-Bx2uYraH.mjs').then((m) => m.AXMWorkflowInstanceActivityInstancesPageComponentProvider)),
3144
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-modules-workflow-management-index-D8fjNgQJ.mjs').then((m) => m.AXMWorkflowDefinitionActivitiesPageComponentProvider)),
2641
3145
  // Automation condition builder: default automation.rules(refType, refId); modules override for their refTypes
2642
3146
  {
2643
3147
  provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
@@ -2645,6 +3149,11 @@ class AXMWorkflowManagementModule {
2645
3149
  multi: true,
2646
3150
  },
2647
3151
  // Menu Provider
3152
+ {
3153
+ provide: AXP_STATUS_PROVIDERS,
3154
+ useClass: AXMWorkflowDefinitionStatusProvider,
3155
+ multi: true,
3156
+ },
2648
3157
  {
2649
3158
  provide: AXP_MENU_PROVIDER,
2650
3159
  useClass: AXMMenuProvider,
@@ -2683,17 +3192,12 @@ class AXMWorkflowManagementModule {
2683
3192
  useClass: AXMWorkflowCategoryProvider,
2684
3193
  multi: true,
2685
3194
  },
2686
- // Workflow Definition Metadata Provider
2687
- {
2688
- provide: AXP_WORKFLOW_PROVIDER,
2689
- useClass: AXMWorkflowDefinitionProvider,
2690
- multi: true,
2691
- },
2692
3195
  // Provide activity classes for dependency injection (only frontend activities)
2693
3196
  ShowConfirmPopupActivity,
2694
3197
  ShowLayoutPopupActivity,
2695
3198
  CreateEntityFormActivity,
2696
3199
  HumanTaskActivity,
3200
+ CartableTaskActivity,
2697
3201
  ShowToastActivity,
2698
3202
  CollectSignatureActivity,
2699
3203
  // Generic Workflow Task Provider (all workflows – no definitionId filter).
@@ -2742,13 +3246,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2742
3246
  useFactory: routesFactory,
2743
3247
  },
2744
3248
  provideCommandSetups([
3249
+ {
3250
+ key: 'WorkflowManagement.WorkflowDefinition:ExecuteWithInput',
3251
+ command: () => import('./acorex-modules-workflow-management-index-C9Qc07oK.mjs').then((c) => c.ExecuteWorkflowWithInputCommand),
3252
+ },
2745
3253
  {
2746
3254
  key: 'WorkflowManagement.WorkflowDefinition:Execute',
2747
- command: () => import('./acorex-modules-workflow-management-index-DWIDQsWq.mjs').then((c) => c.ExecuteWorkflowCommand),
3255
+ command: () => import('./acorex-modules-workflow-management-index-C9Qc07oK.mjs').then((c) => c.ExecuteWorkflowCommand),
2748
3256
  },
2749
3257
  {
2750
3258
  key: 'WorkflowManagement.WorkflowDefinition:EditInStudio',
2751
- command: () => import('./acorex-modules-workflow-management-index-DWIDQsWq.mjs').then((c) => c.EditInStudioCommand),
3259
+ command: () => import('./acorex-modules-workflow-management-index-C9Qc07oK.mjs').then((c) => c.EditInStudioCommand),
3260
+ },
3261
+ {
3262
+ key: 'WorkflowManagement.WorkflowDefinition:Activities:Save',
3263
+ command: () => import('./acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs').then((c) => c.SaveWorkflowDefinitionActivitiesCommand),
2752
3264
  },
2753
3265
  {
2754
3266
  key: 'workflow-activity:show-toast',
@@ -2774,6 +3286,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2774
3286
  key: 'workflow-activity:human-task',
2775
3287
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.HumanTaskActivity),
2776
3288
  },
3289
+ {
3290
+ key: 'workflow-activity:cartable',
3291
+ command: () => Promise.resolve().then(function () { return index; }).then((c) => c.CartableTaskActivity),
3292
+ },
2777
3293
  {
2778
3294
  key: 'workflow-activity:collect-signature',
2779
3295
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.CollectSignatureActivity),
@@ -2786,6 +3302,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2786
3302
  useClass: AXMWorkflowManagementModuleEntityProvider,
2787
3303
  multi: true,
2788
3304
  },
3305
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-modules-workflow-management-index-Bx2uYraH.mjs').then((m) => m.AXMWorkflowInstanceActivityInstancesPageComponentProvider)),
3306
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-modules-workflow-management-index-D8fjNgQJ.mjs').then((m) => m.AXMWorkflowDefinitionActivitiesPageComponentProvider)),
2789
3307
  // Automation condition builder: default automation.rules(refType, refId); modules override for their refTypes
2790
3308
  {
2791
3309
  provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
@@ -2793,6 +3311,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2793
3311
  multi: true,
2794
3312
  },
2795
3313
  // Menu Provider
3314
+ {
3315
+ provide: AXP_STATUS_PROVIDERS,
3316
+ useClass: AXMWorkflowDefinitionStatusProvider,
3317
+ multi: true,
3318
+ },
2796
3319
  {
2797
3320
  provide: AXP_MENU_PROVIDER,
2798
3321
  useClass: AXMMenuProvider,
@@ -2831,17 +3354,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2831
3354
  useClass: AXMWorkflowCategoryProvider,
2832
3355
  multi: true,
2833
3356
  },
2834
- // Workflow Definition Metadata Provider
2835
- {
2836
- provide: AXP_WORKFLOW_PROVIDER,
2837
- useClass: AXMWorkflowDefinitionProvider,
2838
- multi: true,
2839
- },
2840
3357
  // Provide activity classes for dependency injection (only frontend activities)
2841
3358
  ShowConfirmPopupActivity,
2842
3359
  ShowLayoutPopupActivity,
2843
3360
  CreateEntityFormActivity,
2844
3361
  HumanTaskActivity,
3362
+ CartableTaskActivity,
2845
3363
  ShowToastActivity,
2846
3364
  CollectSignatureActivity,
2847
3365
  // Generic Workflow Task Provider (all workflows – no definitionId filter).
@@ -2883,7 +3401,7 @@ class AXMActivityCategoriesTreeComponent {
2883
3401
  constructor() {
2884
3402
  //#region ---- Services & Dependencies ----
2885
3403
  this.activityDefinitionService = inject(AXPActivityDefinitionService);
2886
- this.multiLanguageResolver = inject(AXPMultiLanguageStringResolverService);
3404
+ this.multiLanguageResolver = inject(AXTranslationService);
2887
3405
  //#endregion
2888
3406
  //#region ---- Output Events ----
2889
3407
  this.categoryClick = output();
@@ -2910,7 +3428,7 @@ class AXMActivityCategoriesTreeComponent {
2910
3428
  const activities = await this.activityDefinitionService.getActivitiesByCategoryId(parentId);
2911
3429
  const definitionItems = activities.map((item) => ({
2912
3430
  id: `activity_${item.type ?? item.name}`,
2913
- title: item.title ?? item.name ?? item.type ?? '',
3431
+ title: this.multiLanguageResolver.resolve(item.title) || item.name || item.type || '',
2914
3432
  hasChild: false,
2915
3433
  item,
2916
3434
  type: 'definition',
@@ -3014,7 +3532,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3014
3532
  this.cachedPropertyViewerTabs.set([]);
3015
3533
  return;
3016
3534
  }
3017
- const structKey = `${node.id}:${node.type}:${(def?.inputs?.length ?? 0)}`;
3535
+ const structKey = `${node.id}:${node.type}:${def?.inputs?.length ?? 0}`;
3018
3536
  if (this.lastPropertyViewerStructKey === structKey)
3019
3537
  return;
3020
3538
  this.lastPropertyViewerStructKey = structKey;
@@ -3054,7 +3572,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3054
3572
  isLatest: true,
3055
3573
  isPublished: false,
3056
3574
  toolVersion: '1.0.0',
3057
- providerName: 'WorkflowStudio'
3575
+ providerName: 'WorkflowStudio',
3058
3576
  }, ...(ngDevMode ? [{ debugName: "workflowSettings" }] : /* istanbul ignore next */ []));
3059
3577
  /** Data source for variable type select (settings modal). */
3060
3578
  this.variableTypeOptions = [
@@ -3062,7 +3580,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3062
3580
  { value: 'number', label: 'Number' },
3063
3581
  { value: 'boolean', label: 'Boolean' },
3064
3582
  { value: 'object', label: 'Object' },
3065
- { value: 'array', label: 'Array' }
3583
+ { value: 'array', label: 'Array' },
3066
3584
  ];
3067
3585
  // Canvas state
3068
3586
  this.canvasOffset = { x: 0, y: 0 };
@@ -3104,9 +3622,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3104
3622
  }
3105
3623
  await this.loadWorkflowByName(workflowName);
3106
3624
  // Subscribe to query param changes (like drive component)
3107
- this.activatedRoute.queryParams
3108
- .pipe(takeUntilDestroyed(this.destroyRef))
3109
- .subscribe(async (params) => {
3625
+ this.activatedRoute.queryParams.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(async (params) => {
3110
3626
  const newWorkflowName = params['workflow'];
3111
3627
  if (newWorkflowName && newWorkflowName !== workflowName) {
3112
3628
  await this.loadWorkflowByName(newWorkflowName);
@@ -3126,6 +3642,30 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3126
3642
  const value = ev.target.value;
3127
3643
  this.workflowJson.set(value);
3128
3644
  }
3645
+ //#region ---- Workflow definition display (multi-language) ----
3646
+ /**
3647
+ * Resolves workflow definition title for studio UI strings (settings, graph root label).
3648
+ */
3649
+ resolveWorkflowDefinitionTitle(workflowDef) {
3650
+ const raw = workflowDef.title;
3651
+ if (raw == null || raw === '') {
3652
+ return workflowDef.name || 'Root';
3653
+ }
3654
+ return typeof raw === 'string'
3655
+ ? raw
3656
+ : (this.translationService.resolve(raw) ?? workflowDef.name ?? 'Root');
3657
+ }
3658
+ /**
3659
+ * Resolves workflow definition description for studio settings (current locale string).
3660
+ */
3661
+ resolveWorkflowDefinitionDescription(workflowDef) {
3662
+ const raw = workflowDef.description;
3663
+ if (raw == null || raw === '') {
3664
+ return '';
3665
+ }
3666
+ return typeof raw === 'string' ? raw : (this.translationService.resolve(raw) ?? '');
3667
+ }
3668
+ //#endregion
3129
3669
  /**
3130
3670
  * Load workflow by name
3131
3671
  */
@@ -3133,18 +3673,22 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3133
3673
  try {
3134
3674
  this.addLog('info', `Loading workflow: ${workflowName}...`);
3135
3675
  // Try to get workflow from entity service first
3136
- const workflowEntityService = this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.workflowDefinition.name).data();
3676
+ const workflowEntityService = this.entityService
3677
+ .withEntity(RootConfig.module.name, RootConfig.entities.workflowDefinition.name)
3678
+ .data();
3137
3679
  const result = await workflowEntityService.query({
3138
3680
  skip: 0,
3139
3681
  take: 1,
3140
3682
  filter: {
3141
3683
  logic: 'and',
3142
- filters: [{
3684
+ filters: [
3685
+ {
3143
3686
  field: 'name',
3144
3687
  operator: { type: 'equal' },
3145
3688
  value: workflowName,
3146
- }]
3147
- }
3689
+ },
3690
+ ],
3691
+ },
3148
3692
  });
3149
3693
  let workflowDef = null;
3150
3694
  if (result.items && result.items.length > 0) {
@@ -3165,27 +3709,16 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3165
3709
  this.workflowSettings.set({
3166
3710
  definitionId: workflowDef.id || workflowDef.definitionId || workflowDef.name,
3167
3711
  name: workflowDef.name || '',
3168
- description: workflowDef.description || '',
3169
- inputs: (workflowDef.inputs || []).map((input) => ({
3170
- name: input.name,
3171
- title: input.title || input.name,
3172
- description: input.description,
3173
- schema: input.schema || { dataType: 'string' },
3174
- validations: input.validations,
3175
- })),
3176
- outputs: (workflowDef.outputs || []).map((output) => ({
3177
- name: output.name,
3178
- title: output.title || output.name,
3179
- description: output.description,
3180
- schema: output.schema || { dataType: 'string' },
3181
- })),
3712
+ description: this.resolveWorkflowDefinitionDescription(workflowDef),
3713
+ inputs: (workflowDef.inputs || []).map((input) => this.mapDefinitionInputToWorkflowInput(input)),
3714
+ outputs: (workflowDef.outputs || []).map((output) => this.mapDefinitionOutputToWorkflowOutput(output)),
3182
3715
  variables: workflowDef.variables || [],
3183
3716
  outcomes: workflowDef.outcomes || ['Done'],
3184
3717
  usableAsActivity: workflowDef.extensions?.elsa?.options?.usableAsActivity || false,
3185
3718
  autoUpdateConsumingWorkflows: workflowDef.extensions?.elsa?.options?.autoUpdateConsumingWorkflows || false,
3186
3719
  version: workflowDef.version || 1,
3187
3720
  isLatest: workflowDef.isLatest !== undefined ? workflowDef.isLatest : true,
3188
- isPublished: workflowDef.isPublished || false,
3721
+ isPublished: workflowDef.statusId === AXPSystemStatusType.Published,
3189
3722
  toolVersion: workflowDef.toolVersion || '1.0.0',
3190
3723
  providerName: workflowDef.providerName || 'ACoreX',
3191
3724
  });
@@ -3213,7 +3746,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3213
3746
  const rootActivity = {
3214
3747
  id: graph.startActivityId || 'root',
3215
3748
  type: 'workflow-activity:sequence',
3216
- name: workflowDef.title || workflowDef.name || 'Root',
3749
+ name: this.resolveWorkflowDefinitionTitle(workflowDef),
3217
3750
  children: [],
3218
3751
  };
3219
3752
  // Convert activities to children
@@ -3260,7 +3793,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3260
3793
  return {
3261
3794
  id: workflowDef.id || workflowDef.name || 'workflow',
3262
3795
  name: workflowDef.name || '',
3263
- description: workflowDef.description || '',
3796
+ description: this.resolveWorkflowDefinitionDescription(workflowDef),
3264
3797
  version: workflowDef.version || 1,
3265
3798
  root: rootActivity,
3266
3799
  };
@@ -3366,16 +3899,85 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3366
3899
  /**
3367
3900
  * Convert AXPActivityDefinition to ActivityInfo
3368
3901
  */
3902
+ mapDefinitionInputToWorkflowInput(input) {
3903
+ const titleRaw = input.title ?? input.name;
3904
+ const titleStr = typeof titleRaw === 'string' ? titleRaw : (this.translationService.resolve(titleRaw) ?? String(input.name));
3905
+ const descRaw = input.description;
3906
+ const descStr = descRaw == null ? undefined : typeof descRaw === 'string' ? descRaw : this.translationService.resolve(descRaw);
3907
+ if (input.dataType != null && input.interface != null) {
3908
+ return {
3909
+ name: input.name,
3910
+ title: titleStr,
3911
+ description: descStr,
3912
+ schema: {
3913
+ dataType: input.dataType,
3914
+ interface: input.interface,
3915
+ },
3916
+ validations: input.validations,
3917
+ };
3918
+ }
3919
+ if (input.schema) {
3920
+ return {
3921
+ name: input.name,
3922
+ title: titleStr,
3923
+ description: descStr,
3924
+ schema: input.schema,
3925
+ validations: input.validations,
3926
+ };
3927
+ }
3928
+ return {
3929
+ name: input.name,
3930
+ title: input.name,
3931
+ description: descStr,
3932
+ schema: { dataType: input.typeName || 'string', defaultValue: input.defaultValue },
3933
+ validations: input.isRequired ? [{ rule: 'required' }] : undefined,
3934
+ };
3935
+ }
3936
+ mapDefinitionOutputToWorkflowOutput(output) {
3937
+ const titleRaw = output.title ?? output.name;
3938
+ const titleStr = typeof titleRaw === 'string' ? titleRaw : (this.translationService.resolve(titleRaw) ?? String(output.name));
3939
+ const descStr = output.description == null
3940
+ ? undefined
3941
+ : typeof output.description === 'string'
3942
+ ? output.description
3943
+ : this.translationService.resolve(output.description);
3944
+ if (output.dataType != null && output.interface != null) {
3945
+ return {
3946
+ name: output.name,
3947
+ title: titleStr,
3948
+ description: descStr,
3949
+ schema: { dataType: output.dataType, interface: output.interface },
3950
+ path: output.path,
3951
+ metadata: output.metadata,
3952
+ };
3953
+ }
3954
+ if (output.schema) {
3955
+ return {
3956
+ name: output.name,
3957
+ title: titleStr,
3958
+ description: descStr,
3959
+ schema: output.schema,
3960
+ path: output.path,
3961
+ metadata: output.metadata,
3962
+ };
3963
+ }
3964
+ return {
3965
+ name: output.name,
3966
+ title: titleStr,
3967
+ description: descStr,
3968
+ schema: { dataType: output.typeName || 'string' },
3969
+ };
3970
+ }
3369
3971
  convertActivityDefinitionToInfo(activity) {
3370
- const properties = (activity.inputs || []).map(input => ({
3972
+ const properties = (activity.inputs || []).map((input) => ({
3371
3973
  name: input.name,
3372
- type: this.getPropertyTypeFromSchema(input.schema),
3373
- required: !input.schema.nullable,
3374
- description: input.description,
3375
- defaultValue: input.schema.defaultValue
3974
+ type: this.getPropertyTypeFromDataType(input.dataType),
3975
+ required: !!input.validations?.some((v) => v.rule === 'required'),
3976
+ description: this.translationService.resolve(input.description) ?? undefined,
3977
+ defaultValue: undefined,
3376
3978
  }));
3377
3979
  const defaultProperties = {};
3378
- properties.forEach(prop => {
3980
+ properties.forEach((prop) => {
3379
3981
  if (prop.defaultValue !== undefined) {
3380
3982
  defaultProperties[prop.name] = prop.defaultValue;
3381
3983
  }
@@ -3383,10 +3985,10 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3383
3985
  return {
3384
3986
  type: activity.type,
3385
3987
  name: activity.name,
3386
- description: activity.description || '',
3988
+ description: this.translationService.resolve(activity.description) || '',
3387
3989
  icon: this.normalizeActivityIcon(activity.icon),
3388
3990
  properties,
3389
- defaultProperties
3991
+ defaultProperties,
3390
3992
  };
3391
3993
  }
3392
3994
  /**
@@ -3400,10 +4002,9 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3400
4002
  return hasStylePrefix ? trimmed : `fa-light ${trimmed}`;
3401
4003
  }
3402
4004
  /**
3403
- * Get property type from schema
4005
+ * Map {@link AXPProperty.dataType} to visual editor property type.
3404
4006
  */
3405
- getPropertyTypeFromSchema(schema) {
3406
- const dataType = schema?.dataType || 'string';
4007
+ getPropertyTypeFromDataType(dataType) {
3407
4008
  if (dataType === 'array')
3408
4009
  return 'array';
3409
4010
  if (dataType === 'object')
@@ -3412,6 +4013,8 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3412
4013
  return 'boolean';
3413
4014
  if (dataType === 'number' || dataType === 'integer')
3414
4015
  return 'number';
4016
+ if (dataType === 'blob')
4017
+ return 'any';
3415
4018
  return 'string';
3416
4019
  }
3417
4020
  /**
@@ -3422,10 +4025,10 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3422
4025
  'workflow-markers': '#10B981',
3423
4026
  'control-flow': '#3B82F6',
3424
4027
  'user-interaction': '#8B5CF6',
3425
- 'data': '#10B981',
3426
- 'navigation': '#F59E0B',
3427
- 'events': '#EF4444',
3428
- 'http': '#06B6D4'
4028
+ data: '#10B981',
4029
+ navigation: '#F59E0B',
4030
+ events: '#EF4444',
4031
+ http: '#06B6D4',
3429
4032
  };
3430
4033
  return colorMap[categoryId] || '#64748B';
3431
4034
  }
@@ -3442,8 +4045,8 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3442
4045
  id: 'root',
3443
4046
  type: 'workflow-activity:sequence',
3444
4047
  name: 'Root',
3445
- children: []
3446
- }
4048
+ children: [],
4049
+ },
3447
4050
  }, null, 2);
3448
4051
  }
3449
4052
  //#endregion
@@ -3490,7 +4093,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3490
4093
  this.workflowInstanceState.set({
3491
4094
  status: 'running',
3492
4095
  startTime: new Date(),
3493
- currentState: null
4096
+ currentState: null,
3494
4097
  });
3495
4098
  this.addLog('info', 'شروع اجرای Workflow...');
3496
4099
  try {
@@ -3506,12 +4109,21 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3506
4109
  }
3507
4110
  // Save or update workflow definition
3508
4111
  try {
3509
- const existing = await this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.workflowDefinition.name).data().byKey(workflowId);
4112
+ const existing = await this.entityService
4113
+ .withEntity(RootConfig.module.name, RootConfig.entities.workflowDefinition.name)
4114
+ .data()
4115
+ .byKey(workflowId);
3510
4116
  if (existing) {
3511
- await this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.workflowDefinition.name).data().update(workflowId, definitionToSave);
4117
+ await this.entityService
4118
+ .withEntity(RootConfig.module.name, RootConfig.entities.workflowDefinition.name)
4119
+ .data()
4120
+ .update(workflowId, definitionToSave);
3512
4121
  }
3513
4122
  else {
3514
- await this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.workflowDefinition.name).data().create({ ...definitionToSave, id: workflowId });
4123
+ await this.entityService
4124
+ .withEntity(RootConfig.module.name, RootConfig.entities.workflowDefinition.name)
4125
+ .data()
4126
+ .create({ ...definitionToSave, id: workflowId });
3515
4127
  }
3516
4128
  const saveMessage = await this.translationService.translateAsync('@workflow-management:test-pages.messages.success.workflow-saved');
3517
4129
  this.addLog('success', saveMessage);
@@ -3568,7 +4180,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3568
4180
  currentResult = {
3569
4181
  ...currentResult,
3570
4182
  success: false,
3571
- error: error.message || 'Task execution failed'
4183
+ error: error.message || 'Task execution failed',
3572
4184
  };
3573
4185
  break;
3574
4186
  }
@@ -3580,7 +4192,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3580
4192
  startTime: this.workflowInstanceState().startTime || new Date(),
3581
4193
  endTime: new Date(),
3582
4194
  result: currentResult,
3583
- currentState: currentResult.state?.output?.['taskStatus'] || currentResult.state?.output?.['currentState']
4195
+ currentState: currentResult.state?.output?.['taskStatus'] || currentResult.state?.output?.['currentState'],
3584
4196
  });
3585
4197
  if (currentResult.success) {
3586
4198
  this.addLog('success', `✅ Workflow با موفقیت اجرا شد! (${taskCount} task(s) executed)`, currentResult);
@@ -3594,7 +4206,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3594
4206
  this.workflowInstanceState.set({
3595
4207
  status: 'error',
3596
4208
  error: error.message,
3597
- startTime: this.workflowInstanceState().startTime
4209
+ startTime: this.workflowInstanceState().startTime,
3598
4210
  });
3599
4211
  }
3600
4212
  finally {
@@ -3610,7 +4222,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3610
4222
  timestamp: new Date(),
3611
4223
  level,
3612
4224
  message,
3613
- data
4225
+ data,
3614
4226
  });
3615
4227
  this.executionLogs.set([...logs]);
3616
4228
  }
@@ -3622,7 +4234,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3622
4234
  id: `${activity.type.toLowerCase()}-${Date.now()}`,
3623
4235
  type: activity.type,
3624
4236
  name: activity.name,
3625
- properties: {}
4237
+ properties: {},
3626
4238
  };
3627
4239
  // کپی در کلیپ‌بورد
3628
4240
  navigator.clipboard.writeText(JSON.stringify(template, null, 2));
@@ -3661,107 +4273,107 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3661
4273
  usableAsActivity: settings.usableAsActivity,
3662
4274
  autoUpdateConsumingWorkflows: settings.autoUpdateConsumingWorkflows,
3663
4275
  toolVersion: settings.toolVersion ?? '1.0.0',
3664
- providerName: settings.providerName ?? 'WorkflowStudio'
4276
+ providerName: settings.providerName ?? 'WorkflowStudio',
3665
4277
  };
3666
4278
  this.layoutBuilder
3667
4279
  .create()
3668
- .dialog(dialog => {
4280
+ .dialog((dialog) => {
3669
4281
  dialog
3670
4282
  .setTitle('@workflow-management:workflow-studio.settings.title')
3671
4283
  .setSize('lg')
3672
4284
  .setCloseButton(true)
3673
4285
  .setContext(dialogContext)
3674
- .content(flex => {
4286
+ .content((flex) => {
3675
4287
  flex
3676
4288
  .setDirection('column')
3677
4289
  .setGap('12px')
3678
- .fieldset(general => {
4290
+ .fieldset((general) => {
3679
4291
  general
3680
4292
  .setTitle('@workflow-management:workflow-studio.settings.tabs.general')
3681
- .formField('@workflow-management:workflow-studio.settings.sections.general.fields.name.title', field => {
4293
+ .formField('@workflow-management:workflow-studio.settings.sections.general.fields.name.title', (field) => {
3682
4294
  field.path('name');
3683
4295
  field.textBox({
3684
- placeholder: '@workflow-management:workflow-studio.settings.sections.general.fields.name.placeholder'
4296
+ placeholder: '@workflow-management:workflow-studio.settings.sections.general.fields.name.placeholder',
3685
4297
  });
3686
4298
  })
3687
- .formField('@workflow-management:workflow-studio.settings.sections.general.fields.definition-id.title', field => {
4299
+ .formField('@workflow-management:workflow-studio.settings.sections.general.fields.definition-id.title', (field) => {
3688
4300
  field.path('definitionId');
3689
4301
  field.textBox({
3690
- placeholder: '@workflow-management:workflow-studio.settings.sections.general.fields.definition-id.placeholder'
4302
+ placeholder: '@workflow-management:workflow-studio.settings.sections.general.fields.definition-id.placeholder',
3691
4303
  });
3692
4304
  })
3693
- .formField('@workflow-management:workflow-studio.settings.sections.general.fields.description.title', field => {
4305
+ .formField('@workflow-management:workflow-studio.settings.sections.general.fields.description.title', (field) => {
3694
4306
  field.path('description');
3695
4307
  field.largeTextBox({
3696
4308
  placeholder: '@workflow-management:workflow-studio.settings.sections.general.fields.description.placeholder',
3697
- rows: 4
4309
+ rows: 4,
3698
4310
  });
3699
4311
  });
3700
4312
  })
3701
- .fieldset(inputs => {
4313
+ .fieldset((inputs) => {
3702
4314
  inputs
3703
4315
  .setTitle('@workflow-management:workflow-studio.settings.tabs.inputs')
3704
- .formField('@workflow-management:workflow-studio.settings.sections.inputs.fields.inputs-json', field => {
4316
+ .formField('@workflow-management:workflow-studio.settings.sections.inputs.fields.inputs-json', (field) => {
3705
4317
  field.path('inputsJson');
3706
4318
  field.largeTextBox({ rows: 12 });
3707
4319
  });
3708
4320
  })
3709
- .fieldset(outputs => {
4321
+ .fieldset((outputs) => {
3710
4322
  outputs
3711
4323
  .setTitle('@workflow-management:workflow-studio.settings.tabs.outputs')
3712
- .formField('@workflow-management:workflow-studio.settings.sections.outputs.fields.outputs-json', field => {
4324
+ .formField('@workflow-management:workflow-studio.settings.sections.outputs.fields.outputs-json', (field) => {
3713
4325
  field.path('outputsJson');
3714
4326
  field.largeTextBox({ rows: 12 });
3715
4327
  });
3716
4328
  })
3717
- .fieldset(variables => {
4329
+ .fieldset((variables) => {
3718
4330
  variables
3719
4331
  .setTitle('@workflow-management:workflow-studio.settings.tabs.variables')
3720
- .formField('@workflow-management:workflow-studio.settings.sections.variables.fields.variables-json', field => {
4332
+ .formField('@workflow-management:workflow-studio.settings.sections.variables.fields.variables-json', (field) => {
3721
4333
  field.path('variablesJson');
3722
4334
  field.largeTextBox({ rows: 12 });
3723
4335
  });
3724
4336
  })
3725
- .fieldset(advanced => {
4337
+ .fieldset((advanced) => {
3726
4338
  advanced
3727
4339
  .setTitle('@workflow-management:workflow-studio.settings.tabs.advanced')
3728
- .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.version', field => {
4340
+ .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.version', (field) => {
3729
4341
  field.path('version');
3730
4342
  field.numberBox({ min: 1 });
3731
4343
  })
3732
- .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.is-latest', field => {
4344
+ .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.is-latest', (field) => {
3733
4345
  field.path('isLatest');
3734
4346
  field.toggleSwitch();
3735
4347
  })
3736
- .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.is-published', field => {
4348
+ .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.is-published', (field) => {
3737
4349
  field.path('isPublished');
3738
4350
  field.toggleSwitch();
3739
4351
  })
3740
- .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.usable-as-activity', field => {
4352
+ .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.usable-as-activity', (field) => {
3741
4353
  field.path('usableAsActivity');
3742
4354
  field.toggleSwitch();
3743
4355
  })
3744
- .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.auto-update-consuming', field => {
4356
+ .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.auto-update-consuming', (field) => {
3745
4357
  field.path('autoUpdateConsumingWorkflows');
3746
4358
  field.toggleSwitch();
3747
4359
  })
3748
- .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.tool-version', field => {
4360
+ .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.tool-version', (field) => {
3749
4361
  field.path('toolVersion');
3750
4362
  field.textBox({ placeholder: '1.0.0' });
3751
4363
  })
3752
- .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.provider-name', field => {
4364
+ .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.provider-name', (field) => {
3753
4365
  field.path('providerName');
3754
4366
  field.textBox({ placeholder: 'WorkflowStudio' });
3755
4367
  })
3756
- .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.outcomes-label', field => {
4368
+ .formField('@workflow-management:workflow-studio.settings.sections.advanced.fields.outcomes-label', (field) => {
3757
4369
  field.path('outcomesJson');
3758
4370
  field.textBox({
3759
- placeholder: '@workflow-management:workflow-studio.settings.sections.advanced.fields.outcomes-placeholder'
4371
+ placeholder: '@workflow-management:workflow-studio.settings.sections.advanced.fields.outcomes-placeholder',
3760
4372
  });
3761
4373
  });
3762
4374
  });
3763
4375
  })
3764
- .setActions(actions => {
4376
+ .setActions((actions) => {
3765
4377
  actions
3766
4378
  .cancel('@workflow-management:workflow-studio.settings.actions.cancel')
3767
4379
  .submit('@workflow-management:workflow-studio.settings.actions.save');
@@ -3802,7 +4414,10 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3802
4414
  this.addLog('error', 'Invalid variables JSON');
3803
4415
  }
3804
4416
  if (typeof ctx.outcomesJson === 'string' && ctx.outcomesJson.trim()) {
3805
- outcomes = ctx.outcomesJson.split(',').map((s) => s.trim()).filter(Boolean);
4417
+ outcomes = ctx.outcomesJson
4418
+ .split(',')
4419
+ .map((s) => s.trim())
4420
+ .filter(Boolean);
3806
4421
  }
3807
4422
  if (outcomes.length === 0)
3808
4423
  outcomes = ['Done'];
@@ -3820,7 +4435,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3820
4435
  usableAsActivity: Boolean(ctx.usableAsActivity),
3821
4436
  autoUpdateConsumingWorkflows: Boolean(ctx.autoUpdateConsumingWorkflows),
3822
4437
  toolVersion: String(ctx.toolVersion ?? '1.0.0'),
3823
- providerName: String(ctx.providerName ?? 'WorkflowStudio')
4438
+ providerName: String(ctx.providerName ?? 'WorkflowStudio'),
3824
4439
  };
3825
4440
  this.workflowSettings.set(newSettings);
3826
4441
  this.applyWorkflowSettingsToJson();
@@ -3834,49 +4449,12 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3834
4449
  syncWorkflowSettingsFromJson() {
3835
4450
  try {
3836
4451
  const workflow = JSON.parse(this.workflowJson());
3837
- const convertInput = (input) => {
3838
- if (input.schema) {
3839
- return {
3840
- name: input.name,
3841
- title: input.title || input.name,
3842
- description: input.description,
3843
- schema: input.schema,
3844
- validations: input.validations
3845
- };
3846
- }
3847
- return {
3848
- name: input.name,
3849
- title: input.name,
3850
- description: input.description,
3851
- schema: {
3852
- dataType: input.typeName || 'string',
3853
- defaultValue: input.defaultValue
3854
- },
3855
- validations: input.isRequired ? [{ rule: 'required' }] : undefined
3856
- };
3857
- };
3858
- const convertOutput = (output) => {
3859
- if (output.schema) {
3860
- return {
3861
- name: output.name,
3862
- title: output.title || output.name,
3863
- description: output.description,
3864
- schema: output.schema
3865
- };
3866
- }
3867
- return {
3868
- name: output.name,
3869
- title: output.title || output.name,
3870
- description: output.description,
3871
- schema: { dataType: output.typeName || 'string' }
3872
- };
3873
- };
3874
4452
  this.workflowSettings.set({
3875
4453
  definitionId: workflow.definitionId || workflow.id || '',
3876
4454
  name: workflow.name || '',
3877
- description: workflow.description || '',
3878
- inputs: (workflow.inputs || []).map(convertInput),
3879
- outputs: (workflow.outputs || []).map(convertOutput),
4455
+ description: this.resolveWorkflowDefinitionDescription(workflow),
4456
+ inputs: (workflow.inputs || []).map((input) => this.mapDefinitionInputToWorkflowInput(input)),
4457
+ outputs: (workflow.outputs || []).map((output) => this.mapDefinitionOutputToWorkflowOutput(output)),
3880
4458
  variables: workflow.variables || [],
3881
4459
  outcomes: workflow.outcomes || ['Done'],
3882
4460
  usableAsActivity: workflow.options?.usableAsActivity || false,
@@ -3885,7 +4463,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3885
4463
  isLatest: workflow.isLatest !== undefined ? workflow.isLatest : true,
3886
4464
  isPublished: workflow.isPublished || false,
3887
4465
  toolVersion: workflow.toolVersion || '1.0.0',
3888
- providerName: workflow.providerName || 'WorkflowStudio'
4466
+ providerName: workflow.providerName || 'WorkflowStudio',
3889
4467
  });
3890
4468
  }
3891
4469
  catch {
@@ -3903,7 +4481,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3903
4481
  isLatest: true,
3904
4482
  isPublished: false,
3905
4483
  toolVersion: '1.0.0',
3906
- providerName: 'WorkflowStudio'
4484
+ providerName: 'WorkflowStudio',
3907
4485
  });
3908
4486
  }
3909
4487
  }
@@ -3924,33 +4502,31 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3924
4502
  workflow.providerName = settings.providerName;
3925
4503
  workflow.options = {
3926
4504
  usableAsActivity: settings.usableAsActivity,
3927
- autoUpdateConsumingWorkflows: settings.autoUpdateConsumingWorkflows
4505
+ autoUpdateConsumingWorkflows: settings.autoUpdateConsumingWorkflows,
3928
4506
  };
3929
- workflow.variables = settings.variables.map(v => ({
4507
+ workflow.variables = settings.variables.map((v) => ({
3930
4508
  id: v.name,
3931
4509
  name: v.name,
3932
4510
  typeName: v.typeName,
3933
4511
  value: v.value,
3934
- storageDriverType: 'Memory'
4512
+ storageDriverType: 'Memory',
3935
4513
  }));
3936
- workflow.inputs = settings.inputs.map(i => ({
4514
+ workflow.inputs = settings.inputs.map((i) => ({
3937
4515
  name: i.name,
3938
4516
  title: i.title,
3939
4517
  description: i.description,
3940
- schema: {
3941
- dataType: i.schema.dataType,
3942
- nullable: i.schema.nullable,
3943
- readonly: i.schema.readonly,
3944
- hidden: i.schema.hidden,
3945
- defaultValue: i.schema.defaultValue
3946
- },
3947
- validations: i.validations
4518
+ dataType: i.schema.dataType,
4519
+ interface: i.schema.interface ?? { type: 'text-editor', options: {} },
4520
+ validations: i.validations,
3948
4521
  }));
3949
- workflow.outputs = settings.outputs.map(o => ({
4522
+ workflow.outputs = settings.outputs.map((o) => ({
3950
4523
  name: o.name,
3951
4524
  title: o.title,
3952
4525
  description: o.description,
3953
- schema: { dataType: o.schema.dataType }
4526
+ dataType: o.schema.dataType,
4527
+ interface: o.schema.interface ?? { type: 'text-editor', options: {} },
4528
+ path: o.path,
4529
+ metadata: o.metadata,
3954
4530
  }));
3955
4531
  workflow.outcomes = settings.outcomes;
3956
4532
  workflow.customProperties = workflow.customProperties || {};
@@ -3981,50 +4557,46 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
3981
4557
  // Identification fields
3982
4558
  definitionId: settings.definitionId || workflow.id || this.generateId(),
3983
4559
  name: settings.name || workflow.name || 'Untitled Workflow',
3984
- description: settings.description || workflow.description || '',
4560
+ description: settings.description || this.resolveWorkflowDefinitionDescription(workflow),
3985
4561
  toolVersion: settings.toolVersion || '3.0.0',
3986
4562
  // Materialization fields
3987
4563
  providerName: settings.providerName || 'ACoreX',
3988
4564
  materializerContext: {
3989
4565
  materializerName: 'Json',
3990
4566
  // Store the root activity as JSON string
3991
- stringData: JSON.stringify(workflow.root)
4567
+ stringData: JSON.stringify(workflow.root),
3992
4568
  },
3993
4569
  // WorkflowCommon fields
3994
4570
  options: {
3995
4571
  usableAsActivity: settings.usableAsActivity || false,
3996
- autoUpdateConsumingWorkflows: settings.autoUpdateConsumingWorkflows || false
4572
+ autoUpdateConsumingWorkflows: settings.autoUpdateConsumingWorkflows || false,
3997
4573
  },
3998
4574
  // Variables array
3999
- variables: settings.variables.map(v => ({
4575
+ variables: settings.variables.map((v) => ({
4000
4576
  id: v.name,
4001
4577
  name: v.name,
4002
4578
  typeName: v.typeName,
4003
4579
  value: v.value,
4004
- storageDriverType: 'Memory'
4580
+ storageDriverType: 'Memory',
4005
4581
  })),
4006
- // Inputs array
4007
- inputs: settings.inputs.map(i => ({
4582
+ // Inputs array (aligned with {@link AXPProperty})
4583
+ inputs: settings.inputs.map((i) => ({
4008
4584
  name: i.name,
4009
4585
  title: i.title,
4010
4586
  description: i.description,
4011
- schema: {
4012
- dataType: i.schema.dataType,
4013
- nullable: i.schema.nullable,
4014
- readonly: i.schema.readonly,
4015
- hidden: i.schema.hidden,
4016
- defaultValue: i.schema.defaultValue
4017
- },
4018
- validations: i.validations || []
4587
+ dataType: i.schema.dataType,
4588
+ interface: i.schema.interface ?? { type: 'text-editor', options: {} },
4589
+ validations: i.validations || [],
4019
4590
  })),
4020
- // Outputs array
4021
- outputs: settings.outputs.map(o => ({
4591
+ // Outputs array (aligned with {@link AXPWorkflowOutputProperty})
4592
+ outputs: settings.outputs.map((o) => ({
4022
4593
  name: o.name,
4023
4594
  title: o.title,
4024
4595
  description: o.description,
4025
- schema: {
4026
- dataType: o.schema.dataType
4027
- }
4596
+ dataType: o.schema.dataType,
4597
+ interface: o.schema.interface ?? { type: 'text-editor', options: {} },
4598
+ path: o.path,
4599
+ metadata: o.metadata,
4028
4600
  })),
4029
4601
  // Outcomes array
4030
4602
  outcomes: settings.outcomes || ['Done'],
@@ -4034,7 +4606,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4034
4606
  isReadonly: false,
4035
4607
  isSystem: false,
4036
4608
  // Root activity (direct reference for Elsa compatibility)
4037
- root: workflow.root
4609
+ root: workflow.root,
4038
4610
  };
4039
4611
  return definition;
4040
4612
  }
@@ -4071,9 +4643,10 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4071
4643
  description: '',
4072
4644
  schema: {
4073
4645
  dataType: 'string',
4074
- defaultValue: undefined
4646
+ defaultValue: undefined,
4647
+ interface: { type: 'text-editor', options: {} },
4075
4648
  },
4076
- validations: undefined
4649
+ validations: undefined,
4077
4650
  });
4078
4651
  this.workflowSettings.set({ ...settings });
4079
4652
  }
@@ -4093,7 +4666,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4093
4666
  // For nested schema properties like 'schema.dataType'
4094
4667
  const schemaField = field.replace('schema.', '');
4095
4668
  if (!input.schema) {
4096
- input.schema = { dataType: 'string' };
4669
+ input.schema = { dataType: 'string', interface: { type: 'text-editor', options: {} } };
4097
4670
  }
4098
4671
  input.schema[schemaField] = value;
4099
4672
  }
@@ -4106,7 +4679,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4106
4679
  const settings = this.workflowSettings();
4107
4680
  const input = settings.inputs[index];
4108
4681
  if (!input.schema) {
4109
- input.schema = { dataType: 'string' };
4682
+ input.schema = { dataType: 'string', interface: { type: 'text-editor', options: {} } };
4110
4683
  }
4111
4684
  input.schema[schemaField] = value;
4112
4685
  this.workflowSettings.set({ ...settings });
@@ -4118,12 +4691,12 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4118
4691
  if (!input.validations) {
4119
4692
  input.validations = [];
4120
4693
  }
4121
- if (!input.validations.some(v => v.rule === 'required')) {
4694
+ if (!input.validations.some((v) => v.rule === 'required')) {
4122
4695
  input.validations.push({ rule: 'required' });
4123
4696
  }
4124
4697
  }
4125
4698
  else {
4126
- input.validations = input.validations?.filter(v => v.rule !== 'required');
4699
+ input.validations = input.validations?.filter((v) => v.rule !== 'required');
4127
4700
  if (input.validations?.length === 0) {
4128
4701
  input.validations = undefined;
4129
4702
  }
@@ -4131,7 +4704,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4131
4704
  this.workflowSettings.set({ ...settings });
4132
4705
  }
4133
4706
  getInputIsRequired(input) {
4134
- return input.validations?.some(v => v.rule === 'required') ?? false;
4707
+ return input.validations?.some((v) => v.rule === 'required') ?? false;
4135
4708
  }
4136
4709
  // ============ Workflow Outputs Management ============
4137
4710
  addWorkflowOutput() {
@@ -4141,8 +4714,8 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4141
4714
  title: `Output ${settings.outputs.length + 1}`,
4142
4715
  description: '',
4143
4716
  schema: {
4144
- dataType: 'string'
4145
- }
4717
+ dataType: 'string',
4718
+ },
4146
4719
  });
4147
4720
  this.workflowSettings.set({ ...settings });
4148
4721
  }
@@ -4183,7 +4756,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4183
4756
  name: `variable${settings.variables.length + 1}`,
4184
4757
  typeName: 'string',
4185
4758
  value: '',
4186
- description: ''
4759
+ description: '',
4187
4760
  });
4188
4761
  this.workflowSettings.set({ ...settings });
4189
4762
  }
@@ -4204,8 +4777,8 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4204
4777
  const settings = this.workflowSettings();
4205
4778
  settings.outcomes = outcomesString
4206
4779
  .split(',')
4207
- .map(o => o.trim())
4208
- .filter(o => o.length > 0);
4780
+ .map((o) => o.trim())
4781
+ .filter((o) => o.length > 0);
4209
4782
  this.workflowSettings.set({ ...settings });
4210
4783
  }
4211
4784
  /**
@@ -4245,10 +4818,10 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4245
4818
  * حذف Node
4246
4819
  */
4247
4820
  deleteNode(nodeId) {
4248
- const nodes = this.visualNodes().filter(n => n.id !== nodeId);
4821
+ const nodes = this.visualNodes().filter((n) => n.id !== nodeId);
4249
4822
  // حذف اتصالات به این نود
4250
- nodes.forEach(n => {
4251
- n.connections = n.connections.filter(c => c !== nodeId);
4823
+ nodes.forEach((n) => {
4824
+ n.connections = n.connections.filter((c) => c !== nodeId);
4252
4825
  });
4253
4826
  this.visualNodes.set(nodes);
4254
4827
  if (this.selectedNode()?.id === nodeId) {
@@ -4261,15 +4834,15 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4261
4834
  */
4262
4835
  connectNodes(fromId, toId, outcome) {
4263
4836
  const nodes = this.visualNodes();
4264
- const fromNodeIndex = nodes.findIndex(n => n.id === fromId);
4265
- const toNode = nodes.find(n => n.id === toId);
4837
+ const fromNodeIndex = nodes.findIndex((n) => n.id === fromId);
4838
+ const toNode = nodes.find((n) => n.id === toId);
4266
4839
  if (fromNodeIndex !== -1 && toNode) {
4267
4840
  const fromNode = nodes[fromNodeIndex];
4268
4841
  // Use outcome-based connections if available
4269
4842
  if (outcome && fromNode.outcomes && fromNode.outcomes.length > 1) {
4270
4843
  const outcomeConnections = fromNode.outcomeConnections || [];
4271
4844
  // Check if this outcome already has a connection
4272
- const existingConnection = outcomeConnections.find(c => c.outcome === outcome);
4845
+ const existingConnection = outcomeConnections.find((c) => c.outcome === outcome);
4273
4846
  if (existingConnection) {
4274
4847
  this.addLog('warning', `⚠️ Outcome "${outcome}" قبلاً متصل شده است`);
4275
4848
  return;
@@ -4279,7 +4852,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4279
4852
  updatedNodes[fromNodeIndex] = {
4280
4853
  ...fromNode,
4281
4854
  outcomeConnections: [...outcomeConnections, { outcome, targetNodeId: toId }],
4282
- connections: [...fromNode.connections, toId] // Keep for backward compat
4855
+ connections: [...fromNode.connections, toId], // Keep for backward compat
4283
4856
  };
4284
4857
  this.visualNodes.set(updatedNodes);
4285
4858
  this.addLog('success', `🔗 ${fromNode.name} [${outcome}] → ${toNode.name}`);
@@ -4290,7 +4863,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4290
4863
  const updatedNodes = [...nodes];
4291
4864
  updatedNodes[fromNodeIndex] = {
4292
4865
  ...fromNode,
4293
- connections: [...fromNode.connections, toId]
4866
+ connections: [...fromNode.connections, toId],
4294
4867
  };
4295
4868
  this.visualNodes.set(updatedNodes);
4296
4869
  this.addLog('success', `🔗 ${fromNode.name} متصل شد به ${toNode.name}`);
@@ -4309,7 +4882,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4309
4882
  */
4310
4883
  disconnectNodes(fromId, toId, outcome) {
4311
4884
  const nodes = this.visualNodes();
4312
- const fromNodeIndex = nodes.findIndex(n => n.id === fromId);
4885
+ const fromNodeIndex = nodes.findIndex((n) => n.id === fromId);
4313
4886
  if (fromNodeIndex !== -1) {
4314
4887
  const fromNode = nodes[fromNodeIndex];
4315
4888
  const updatedNodes = [...nodes];
@@ -4317,16 +4890,16 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4317
4890
  if (outcome && fromNode.outcomeConnections) {
4318
4891
  updatedNodes[fromNodeIndex] = {
4319
4892
  ...fromNode,
4320
- outcomeConnections: fromNode.outcomeConnections.filter(c => !(c.outcome === outcome && c.targetNodeId === toId)),
4321
- connections: fromNode.connections.filter(c => c !== toId)
4893
+ outcomeConnections: fromNode.outcomeConnections.filter((c) => !(c.outcome === outcome && c.targetNodeId === toId)),
4894
+ connections: fromNode.connections.filter((c) => c !== toId),
4322
4895
  };
4323
4896
  }
4324
4897
  else {
4325
4898
  // Simple disconnect
4326
4899
  updatedNodes[fromNodeIndex] = {
4327
4900
  ...fromNode,
4328
- connections: fromNode.connections.filter(c => c !== toId),
4329
- outcomeConnections: fromNode.outcomeConnections?.filter(c => c.targetNodeId !== toId)
4901
+ connections: fromNode.connections.filter((c) => c !== toId),
4902
+ outcomeConnections: fromNode.outcomeConnections?.filter((c) => c.targetNodeId !== toId),
4330
4903
  };
4331
4904
  }
4332
4905
  this.visualNodes.set(updatedNodes);
@@ -4372,12 +4945,12 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4372
4945
  position: { x, y },
4373
4946
  connections: connections,
4374
4947
  outcomeConnections: outcomeConnections,
4375
- outcomes: outcomes
4948
+ outcomes: outcomes,
4376
4949
  };
4377
4950
  nodes.push(node);
4378
4951
  // اگر parent دارد، اتصال برقرار کن (برای Sequence)
4379
4952
  if (parentId && !outcomeConnections.length) {
4380
- const parentNode = nodes.find(n => n.id === parentId);
4953
+ const parentNode = nodes.find((n) => n.id === parentId);
4381
4954
  if (parentNode && !parentNode.connections.includes(nodeId)) {
4382
4955
  parentNode.connections.push(nodeId);
4383
4956
  }
@@ -4386,7 +4959,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4386
4959
  if (activity.children && Array.isArray(activity.children) && !outcomeConnections.length) {
4387
4960
  let childY = y;
4388
4961
  activity.children.forEach((child, index) => {
4389
- childY = y + (index * 100);
4962
+ childY = y + index * 100;
4390
4963
  this.processActivityToNode(child, nodes, x + 250, childY, nodeId);
4391
4964
  });
4392
4965
  }
@@ -4412,7 +4985,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4412
4985
  id: 'visual-workflow-' + Date.now(),
4413
4986
  name: 'Visual Workflow',
4414
4987
  version: 1,
4415
- root: this.nodeToActivity(rootNode, nodes)
4988
+ root: this.nodeToActivity(rootNode, nodes),
4416
4989
  };
4417
4990
  this.workflowJson.set(JSON.stringify(workflow, null, 2));
4418
4991
  this.addLog('success', '✅ Visual به JSON تبدیل شد');
@@ -4427,8 +5000,8 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4427
5000
  findRootNode(nodes) {
4428
5001
  // Node ای که به آن اشاره نشده
4429
5002
  const connectedIds = new Set();
4430
- nodes.forEach(n => n.connections.forEach(c => connectedIds.add(c)));
4431
- const rootNodes = nodes.filter(n => !connectedIds.has(n.id));
5003
+ nodes.forEach((n) => n.connections.forEach((c) => connectedIds.add(c)));
5004
+ const rootNodes = nodes.filter((n) => !connectedIds.has(n.id));
4432
5005
  return rootNodes[0] || nodes[0];
4433
5006
  }
4434
5007
  /**
@@ -4439,14 +5012,14 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4439
5012
  id: node.id,
4440
5013
  type: node.type,
4441
5014
  name: node.name,
4442
- properties: node.properties
5015
+ properties: node.properties,
4443
5016
  };
4444
5017
  // اگر children دارد (connections)
4445
5018
  if (node.connections.length > 0) {
4446
5019
  const children = node.connections
4447
- .map(connId => allNodes.find(n => n.id === connId))
4448
- .filter(n => n !== undefined)
4449
- .map(childNode => this.nodeToActivity(childNode, allNodes));
5020
+ .map((connId) => allNodes.find((n) => n.id === connId))
5021
+ .filter((n) => n !== undefined)
5022
+ .map((childNode) => this.nodeToActivity(childNode, allNodes));
4450
5023
  if (children.length > 0) {
4451
5024
  activity.children = children;
4452
5025
  }
@@ -4468,7 +5041,9 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4468
5041
  'workflow-activity:entity-create': 'fa-light fa-plus',
4469
5042
  'workflow-activity:entity-read': 'fa-light fa-book-open',
4470
5043
  'workflow-activity:entity-update': 'fa-light fa-pen',
4471
- 'workflow-activity:entity-delete': 'fa-light fa-trash'
5044
+ 'workflow-activity:entity-delete': 'fa-light fa-trash',
5045
+ 'workflow-activity:human-task': 'fa-light fa-user-check',
5046
+ 'workflow-activity:cartable': 'fa-light fa-inbox',
4472
5047
  };
4473
5048
  return iconMap[type] || 'fa-light fa-circle';
4474
5049
  }
@@ -4477,46 +5052,48 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4477
5052
  */
4478
5053
  updateNodeProperty(nodeId, propertyName, value) {
4479
5054
  const nodes = this.visualNodes();
4480
- const nodeIndex = nodes.findIndex(n => n.id === nodeId);
5055
+ const nodeIndex = nodes.findIndex((n) => n.id === nodeId);
4481
5056
  if (nodeIndex !== -1) {
4482
5057
  const node = nodes[nodeIndex];
4483
5058
  const updatedNodes = [...nodes];
4484
5059
  if (propertyName === 'name') {
4485
5060
  updatedNodes[nodeIndex] = {
4486
5061
  ...node,
4487
- name: value
5062
+ name: value,
4488
5063
  };
4489
5064
  }
4490
5065
  else {
4491
5066
  const newProperties = {
4492
5067
  ...node.properties,
4493
- [propertyName]: value
5068
+ [propertyName]: value,
4494
5069
  };
4495
5070
  let newOutcomes = node.outcomes;
4496
5071
  const shouldRecomputeOutcomes = (propertyName === 'expectedStatusCodes' && node.type === 'workflow-activity:http-request') ||
4497
- (propertyName === 'actions' && node.type === 'workflow-activity:human-task');
5072
+ (propertyName === 'actions' &&
5073
+ (node.type === 'workflow-activity:human-task' || node.type === 'workflow-activity:cartable'));
4498
5074
  if (shouldRecomputeOutcomes) {
4499
- this.findActivityInfo(node.type).then(activityInfo => {
5075
+ this.findActivityInfo(node.type)
5076
+ .then((activityInfo) => {
4500
5077
  if (activityInfo) {
4501
5078
  const computedOutcomes = this.computeOutcomes(activityInfo, newProperties);
4502
5079
  const updatedNodes = this.visualNodes();
4503
- const nodeIdx = updatedNodes.findIndex(n => n.id === nodeId);
5080
+ const nodeIdx = updatedNodes.findIndex((n) => n.id === nodeId);
4504
5081
  if (nodeIdx !== -1) {
4505
5082
  updatedNodes[nodeIdx] = {
4506
5083
  ...updatedNodes[nodeIdx],
4507
- outcomes: computedOutcomes
5084
+ outcomes: computedOutcomes,
4508
5085
  };
4509
5086
  this.visualNodes.set([...updatedNodes]);
4510
5087
  this.addLog('info', `🔄 Outcomes updated: [${computedOutcomes.join(', ')}]`);
4511
5088
  }
4512
5089
  }
4513
- }).catch(() => {
4514
- });
5090
+ })
5091
+ .catch(() => { });
4515
5092
  }
4516
5093
  updatedNodes[nodeIndex] = {
4517
5094
  ...node,
4518
5095
  properties: newProperties,
4519
- outcomes: newOutcomes
5096
+ outcomes: newOutcomes,
4520
5097
  };
4521
5098
  }
4522
5099
  this.visualNodes.set(updatedNodes);
@@ -4628,7 +5205,9 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4628
5205
  return;
4629
5206
  visited.add(n.id);
4630
5207
  ordered.push(n);
4631
- const targets = (n.outcomeConnections ?? []).map((c) => this.findNodeById(c.targetNodeId)).filter(Boolean);
5208
+ const targets = (n.outcomeConnections ?? [])
5209
+ .map((c) => this.findNodeById(c.targetNodeId))
5210
+ .filter(Boolean);
4632
5211
  for (const t of targets)
4633
5212
  add(t);
4634
5213
  const fallback = (n.connections ?? []).map((id) => this.findNodeById(id)).filter(Boolean);
@@ -4695,8 +5274,10 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4695
5274
  const statusOutcomes = codes.map((code) => code.toString());
4696
5275
  return [...statusOutcomes, 'Done', 'Failed', 'Timeout'];
4697
5276
  }
4698
- // Human Task: outcomes from actions (prefix/suffix) in workflow definition
4699
- if (activityInfo.type === 'workflow-activity:human-task' && properties['actions']) {
5277
+ // Human task / cartable: outcomes from actions (prefix/suffix) in workflow definition
5278
+ if ((activityInfo.type === 'workflow-activity:human-task' ||
5279
+ activityInfo.type === 'workflow-activity:cartable') &&
5280
+ properties['actions']) {
4700
5281
  const names = [];
4701
5282
  try {
4702
5283
  const actions = properties['actions'];
@@ -4722,6 +5303,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4722
5303
  'workflow-activity:show-alert-dialog': ['Done'],
4723
5304
  'workflow-activity:show-form': ['Submitted', 'Cancelled'],
4724
5305
  'workflow-activity:human-task': ['submit', 'cancel'],
5306
+ 'workflow-activity:cartable': ['submit', 'cancel'],
4725
5307
  'workflow-activity:http-request': ['Done', 'Failed', 'Timeout'],
4726
5308
  'workflow-activity:sequence': ['Done'],
4727
5309
  'workflow-activity:for-each': ['Done'],
@@ -4733,7 +5315,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4733
5315
  'workflow-activity:entity-create': ['Done', 'Failed'],
4734
5316
  'workflow-activity:entity-read': ['Done', 'NotFound', 'Failed'],
4735
5317
  'workflow-activity:entity-update': ['Done', 'Failed'],
4736
- 'workflow-activity:entity-delete': ['Done', 'Failed']
5318
+ 'workflow-activity:entity-delete': ['Done', 'Failed'],
4737
5319
  };
4738
5320
  return outcomeMap[activityInfo.type] || ['Done'];
4739
5321
  }
@@ -4760,7 +5342,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4760
5342
  position: { x: Math.max(0, x), y: Math.max(0, y) },
4761
5343
  connections: [],
4762
5344
  outcomeConnections: [],
4763
- outcomes: this.computeOutcomes(this.draggedActivity, defaultProps)
5345
+ outcomes: this.computeOutcomes(this.draggedActivity, defaultProps),
4764
5346
  };
4765
5347
  this.visualNodes.set([...nodes, newNode]);
4766
5348
  const outcomesInfo = newNode.outcomes && newNode.outcomes.length > 1
@@ -4778,7 +5360,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4778
5360
  const rect = target.getBoundingClientRect();
4779
5361
  this.nodeDragOffset = {
4780
5362
  x: event.clientX - rect.left,
4781
- y: event.clientY - rect.top
5363
+ y: event.clientY - rect.top,
4782
5364
  };
4783
5365
  if (event.dataTransfer) {
4784
5366
  event.dataTransfer.effectAllowed = 'move';
@@ -4802,11 +5384,11 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4802
5384
  const x = event.clientX - rect.left - this.nodeDragOffset.x;
4803
5385
  const y = event.clientY - rect.top - this.nodeDragOffset.y;
4804
5386
  const nodes = this.visualNodes();
4805
- const nodeIndex = nodes.findIndex(n => n.id === node.id);
5387
+ const nodeIndex = nodes.findIndex((n) => n.id === node.id);
4806
5388
  if (nodeIndex !== -1) {
4807
5389
  nodes[nodeIndex].position = {
4808
5390
  x: Math.max(0, x),
4809
- y: Math.max(0, y)
5391
+ y: Math.max(0, y),
4810
5392
  };
4811
5393
  this.visualNodes.set([...nodes]);
4812
5394
  }
@@ -4926,26 +5508,17 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4926
5508
  };
4927
5509
  }
4928
5510
  activityInputToWidgetProperty(input, group, order) {
4929
- const path = `properties.${input.name}`;
4930
- const iface = input.schema?.interface;
4931
- const widgetType = iface?.type ?? 'text-editor';
4932
- return {
4933
- name: input.name,
4934
- title: input.title,
5511
+ return mapAXPPropertyToWidgetProperty(input, {
4935
5512
  group,
4936
5513
  order,
4937
- schema: {
4938
- dataType: input.schema?.dataType ?? 'string',
4939
- defaultValue: input.schema?.defaultValue,
4940
- interface: {
4941
- path,
4942
- name: input.name,
4943
- type: widgetType,
4944
- options: iface?.options ?? {},
4945
- },
4946
- },
4947
- visible: true,
4948
- };
5514
+ valuePathPrefix: 'properties',
5515
+ resolveTitle: (prop) => typeof prop.title === 'string' ? prop.title : (this.translationService.resolve(prop.title) ?? prop.name),
5516
+ resolveDescription: (prop) => prop.description === undefined
5517
+ ? undefined
5518
+ : typeof prop.description === 'string'
5519
+ ? prop.description
5520
+ : this.translationService.resolve(prop.description),
5521
+ });
4949
5522
  }
4950
5523
  /**
4951
5524
  * Apply property viewer context changes back to the selected node.
@@ -4968,7 +5541,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4968
5541
  * پیدا کردن Node با ID
4969
5542
  */
4970
5543
  findNodeById(nodeId) {
4971
- return this.visualNodes().find(n => n.id === nodeId);
5544
+ return this.visualNodes().find((n) => n.id === nodeId);
4972
5545
  }
4973
5546
  /**
4974
5547
  * بررسی اینکه آیا properties خالی است یا نه
@@ -5008,16 +5581,16 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
5008
5581
  getOutcomeColor(outcome) {
5009
5582
  const colorMap = {
5010
5583
  '200': '#10b981', // Green - Success
5011
- 'Done': '#10b981', // Green - Success
5012
- 'Success': '#10b981', // Green - Success
5584
+ Done: '#10b981', // Green - Success
5585
+ Success: '#10b981', // Green - Success
5013
5586
  '404': '#ef4444', // Red - Error
5014
5587
  '500': '#ef4444', // Red - Error
5015
- 'Failed': '#ef4444', // Red - Error
5016
- 'Error': '#ef4444', // Red - Error
5017
- 'Timeout': '#f59e0b', // Orange - Warning
5018
- 'Cancelled': '#f59e0b', // Orange - Warning
5019
- 'Then': '#3b82f6', // Blue - Info
5020
- 'Else': '#64748b', // Gray
5588
+ Failed: '#ef4444', // Red - Error
5589
+ Error: '#ef4444', // Red - Error
5590
+ Timeout: '#f59e0b', // Orange - Warning
5591
+ Cancelled: '#f59e0b', // Orange - Warning
5592
+ Then: '#3b82f6', // Blue - Info
5593
+ Else: '#64748b', // Gray
5021
5594
  };
5022
5595
  return colorMap[outcome] || '#8b5cf6'; // Purple - Default
5023
5596
  }
@@ -5061,7 +5634,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
5061
5634
  provide: AXPPageLayoutBase,
5062
5635
  useExisting: WorkflowStudioComponent,
5063
5636
  },
5064
- ], viewQueries: [{ propertyName: "propertyViewerRef", first: true, predicate: AXPPropertyViewerComponent, descendants: true, isSignal: true }, { propertyName: "canvasAreaRef", first: true, predicate: ["canvasAreaRef"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout>\n <axp-layout-start-side>\n <axp-layout-header>\n <axp-layout-title>{{ '@workflow-management:activities.menus.activity-categories.title' | translate | async }}</axp-layout-title>\n <axp-layout-toolbar>\n <ax-search-box\n [delayTime]=\"300\"\n [placeholder]=\"'@workflow-management:workflow-studio.components.activity-categories-tree.search-placeholder' | translate | async\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </axp-layout-toolbar>\n </axp-layout-header>\n <axp-layout-content>\n <axp-activity-categories-tree\n (categoryClick)=\"onCategoryClick($event)\"\n (activityClick)=\"onActivityClick($event)\"\n (activityDragStart)=\"onActivityDragStartFromTree($event)\"\n ></axp-activity-categories-tree>\n </axp-layout-content>\n </axp-layout-start-side>\n\n <axp-page-toolbar>\n <axp-layout-prefix>\n <!-- JSON / Visual toggle (same pattern as report view mode) -->\n <div class=\"studio-editor-tabs\">\n <ax-button-group class=\"ax-sm\" [selection]=\"'single'\">\n <ax-button-group-item (onClick)=\"switchTab('json')\" text=\"{{ '@workflow-management:workflow-studio.terms.json-editor' | translate | async }}\" [selected]=\"activeTab() === 'json'\">\n <ax-prefix>\n <i class=\"fa-light fa-code\"></i>\n </ax-prefix>\n </ax-button-group-item>\n <ax-button-group-item (onClick)=\"switchTab('visual')\" text=\"{{ '@workflow-management:workflow-studio.terms.visual-designer' | translate | async }}\" [selected]=\"activeTab() === 'visual'\">\n <ax-prefix>\n <i class=\"fa-light fa-diagram-project\"></i>\n </ax-prefix>\n </ax-button-group-item>\n </ax-button-group>\n </div>\n </axp-layout-prefix>\n </axp-page-toolbar>\n\n <axp-page-content>\n <div class=\"workflow-studio\">\n <!-- Main Layout -->\n <div class=\"studio-body\" [class.properties-hidden]=\"!showPropertiesPanel()\">\n\n <!-- Editor -->\n <div class=\"studio-editor\">\n <!-- Tab Content -->\n <div class=\"editor-content\">\n <!-- JSON Tab -->\n @if (activeTab() === 'json') {\n <div class=\"json-tab\">\n <textarea class=\"json-editor\" [value]=\"workflowJson()\"\n (input)=\"onWorkflowJsonInput($event)\"\n [placeholder]=\"'@workflow-management:workflow-studio.components.json-editor.placeholder' | translate | async\"\n spellcheck=\"false\"></textarea>\n </div>\n }\n\n <!-- Visual Tab -->\n @if (activeTab() === 'visual') {\n <div class=\"visual-tab\">\n <!-- Canvas -->\n <div class=\"visual-canvas\">\n <div class=\"canvas-toolbar\">\n <ax-button look=\"blank\" class=\"ax-sm\" [attr.title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.zoom-to-fit.title' | translate | async\" (onClick)=\"canvasZoomToFit()\">\n <ax-prefix><i class=\"fa-light fa-expand\"></i></ax-prefix>\n </ax-button>\n <ax-button look=\"blank\" class=\"ax-sm\" [attr.title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.center.title' | translate | async\" (onClick)=\"canvasCenter()\">\n <ax-prefix><i class=\"fa-light fa-crosshairs\"></i></ax-prefix>\n </ax-button>\n <ax-button look=\"blank\" class=\"ax-sm\" [attr.title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.auto-layout.title' | translate | async\" (onClick)=\"canvasAutoLayout()\">\n <ax-prefix><i class=\"fa-light fa-sitemap\"></i></ax-prefix>\n </ax-button>\n <span class=\"toolbar-sep\"></span>\n <label class=\"toolbar-auto-save\">\n <ax-switch [value]=\"autoSaveEnabled()\" (valueChange)=\"autoSaveEnabled.set($event)\"></ax-switch>\n <span>{{ '@workflow-management:workflow-studio.components.canvas-toolbar.auto-save' | translate | async }}</span>\n </label>\n <span class=\"toolbar-sep\"></span>\n <ax-button look=\"blank\" class=\"ax-sm\" [attr.title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.clear-canvas.title' | translate | async\" (onClick)=\"clearCanvas()\">\n <ax-prefix><i class=\"fa-light fa-trash\"></i></ax-prefix>\n </ax-button>\n <ax-button look=\"blank\" class=\"ax-sm\" [attr.title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.convert-to-json.title' | translate | async\" (onClick)=\"visualToJson()\">\n <ax-prefix><i class=\"fa-light fa-code\"></i></ax-prefix>\n </ax-button>\n <span class=\"tool-info\">\n <i class=\"fa-light fa-lightbulb\"></i>\n <strong>{{ '@workflow-management:workflow-studio.components.canvas-toolbar.hint' | translate | async }}</strong>\n </span>\n </div>\n\n <div #canvasAreaRef class=\"canvas-area\" (drop)=\"onCanvasDrop($event)\" (dragover)=\"onCanvasDragOver($event)\"\n (dragleave)=\"onCanvasDragLeave($event)\">\n <!-- SVG for Connections -->\n <svg class=\"connections-layer\">\n <!-- Outcome-based Connections -->\n @for (node of visualNodes(); track node.id) {\n @if (node.outcomeConnections && node.outcomeConnections.length > 0) {\n @for (conn of node.outcomeConnections; track conn.targetNodeId + conn.outcome) {\n @let targetNode = findNodeById(conn.targetNodeId);\n @if (targetNode) {\n <g class=\"outcome-connection-group\">\n <line [attr.x1]=\"node.position.x + 75\" [attr.y1]=\"node.position.y + 80\"\n [attr.x2]=\"targetNode.position.x + 75\" [attr.y2]=\"targetNode.position.y - 50\"\n class=\"connection-line outcome-line\" [attr.stroke]=\"getOutcomeColor(conn.outcome)\"\n stroke-width=\"2.5\"\n [attr.marker-end]=\"'url(#arrowhead-' + getOutcomeColorName(conn.outcome) + ')'\"\n style=\"cursor: pointer\" (dblclick)=\"disconnectNodes(node.id, conn.targetNodeId, conn.outcome)\"\n [attr.title]=\"'Outcome: ' + conn.outcome + ' (Double-click to remove)'\">\n <title>{{ conn.outcome }} \u00E2\u2020\u2019 {{ targetNode.name }}</title>\n </line>\n <text [attr.x]=\"(node.position.x + targetNode.position.x) / 2 + 75\"\n [attr.y]=\"(node.position.y + targetNode.position.y) / 2 + 15\" class=\"connection-label\"\n text-anchor=\"middle\" dominant-baseline=\"middle\" [attr.fill]=\"getOutcomeColor(conn.outcome)\" font-size=\"11\"\n font-weight=\"600\" pointer-events=\"none\">\n {{ conn.outcome }}\n </text>\n </g>\n }\n }\n } @else {\n <!-- Simple Connections (backward compatibility) -->\n @for (targetId of node.connections; track targetId) {\n @let targetNode = findNodeById(targetId);\n @if (targetNode) {\n @let sx = node.position.x + 75;\n @let sy = node.position.y + 40;\n @let tx = targetNode.position.x + 75;\n @let ty = targetNode.position.y - 50;\n @let pathD = getConnectionPath(sx, sy, tx, ty);\n <g class=\"connection-group\">\n <path [attr.d]=\"pathD\" class=\"connection-line connection-hit\" fill=\"none\" stroke=\"transparent\"\n stroke-width=\"16\" pointer-events=\"stroke\" (dblclick)=\"disconnectNodes(node.id, targetId)\">\n </path>\n <path [attr.d]=\"pathD\" class=\"connection-line\" fill=\"none\" stroke=\"#64748b\" stroke-width=\"2\"\n stroke-linecap=\"round\" marker-end=\"url(#arrowhead-default)\" pointer-events=\"none\">\n </path>\n <title>{{ '@workflow-management:workflow-studio.components.canvas-toolbar.connection-remove-hint' | translate | async }}</title>\n </g>\n }\n }\n }\n }\n\n <defs>\n <!-- Arrow markers: larger, rounded tip on line end (refX so tip touches path end) -->\n <marker id=\"arrowhead-default\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#64748b\" />\n </marker>\n <marker id=\"arrowhead-primary\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#8b5cf6\" />\n </marker>\n <marker id=\"arrowhead-success\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#10b981\" />\n </marker>\n <marker id=\"arrowhead-error\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#ef4444\" />\n </marker>\n <marker id=\"arrowhead-warning\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#f59e0b\" />\n </marker>\n <marker id=\"arrowhead-info\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#3b82f6\" />\n </marker>\n </defs>\n </svg>\n\n <!-- Nodes -->\n @for (node of visualNodes(); track node.id) {\n <div class=\"visual-node\" [class.selected]=\"selectedNode()?.id === node.id\"\n [style.left.px]=\"node.position.x\" [style.top.px]=\"node.position.y\" [attr.data-node-id]=\"node.id\"\n draggable=\"true\" (dragstart)=\"onNodeDragStart($event, node)\" (drag)=\"onNodeDrag($event, node)\"\n (dragend)=\"onNodeDragEnd($event, node)\" (click)=\"selectNodeById(node)\">\n <div class=\"node-header\">\n <i [class]=\"node.icon\"></i>\n <span>{{ node.name }}</span>\n <span class=\"node-delete-wrap\" (click)=\"$event.stopPropagation()\">\n <ax-button look=\"blank\" size=\"sm\" class=\"node-delete\" (onClick)=\"deleteNodeFromCanvas(node.id)\">\n <ax-prefix><i class=\"fa-light fa-times\"></i></ax-prefix>\n </ax-button>\n </span>\n </div>\n\n <div class=\"node-body\">\n <small>{{ node.type }}</small>\n </div>\n\n <div class=\"node-connectors\">\n <!-- Input Connector -->\n <div class=\"connector connector-in\" title=\"Input\" (click)=\"onConnectorClick($event, node, 'in')\">\n </div>\n\n <!-- Output Connectors - Multiple outcomes support -->\n @if (node.outcomes && node.outcomes.length > 1) {\n <!-- Multiple outcomes: show separate port for each -->\n <div class=\"outcomes-container\">\n @for (outcome of node.outcomes; track outcome; let idx = $index) {\n <div class=\"outcome-connector\" [class.active]=\"\n connectionSource?.node?.id === node.id && connectionSource?.outcome === outcome\n \" [attr.data-outcome]=\"outcome\" [title]=\"'Output: ' + outcome\"\n (click)=\"onOutcomeConnectorClick($event, node, outcome)\">\n <span class=\"outcome-label\">{{ outcome }}</span>\n <div class=\"outcome-dot\"></div>\n </div>\n }\n </div>\n } @else {\n <!-- Single outcome: show simple output connector -->\n <div class=\"connector connector-out\" [class.active]=\"connectionSource?.node?.id === node.id\"\n title=\"Output\" (click)=\"onConnectorClick($event, node, 'out')\"></div>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n @if (visualNodes().length === 0) {\n <div class=\"canvas-empty-state\">\n <i class=\"fa-light fa-diagram-project\"></i>\n <p>{{ '@workflow-management:workflow-studio.components.canvas-empty-state.title' | translate | async }}</p>\n <small>{{ '@workflow-management:workflow-studio.components.canvas-empty-state.description' | translate | async }}</small>\n </div>\n }\n </div>\n </div>\n\n <!-- Workflow Panel (when no node selected, Elsa-style) -->\n @if (!selectedNode() && showPropertiesPanel()) {\n <div class=\"properties-panel workflow-panel\">\n <div class=\"properties-header\">\n <i class=\"fa-light fa-diagram-project\"></i>\n <h4>{{ '@workflow-management:workflow-studio.components.workflow-panel.title' | translate | async }}</h4>\n <div class=\"header-actions\">\n <ax-button look=\"blank\" size=\"sm\" [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.close-panel' | translate | async\" (onClick)=\"togglePropertiesPanel()\">\n <ax-prefix><i class=\"fa-light fa-angle-right\"></i></ax-prefix>\n </ax-button>\n </div>\n </div>\n <div class=\"properties-body\">\n <section class=\"workflow-panel-section\">\n <h5>{{ '@workflow-management:workflow-studio.components.workflow-panel.metadata' | translate | async }}</h5>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.workflow-panel.name' | translate | async }}</label>\n <ax-text-box class=\"form-input\" [value]=\"workflowSettings().name\" [disabled]=\"true\" />\n </div>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.workflow-panel.description' | translate | async }}</label>\n <ax-text-box class=\"form-input\" [value]=\"workflowSettings().description\" [disabled]=\"true\" />\n </div>\n </section>\n <div class=\"properties-divider\"></div>\n <section class=\"workflow-panel-section\">\n <h5>{{ '@workflow-management:workflow-studio.components.workflow-panel.information' | translate | async }}</h5>\n <div class=\"workflow-info-table\">\n <div class=\"workflow-info-row\">\n <span class=\"info-label\">{{ '@workflow-management:workflow-studio.components.workflow-panel.definition-id' | translate | async }}</span>\n <span class=\"info-actions\">\n <ax-button look=\"blank\" size=\"sm\" [title]=\"'@workflow-management:workflow-studio.components.workflow-panel.copy' | translate | async\" (onClick)=\"copyDefinitionIdToClipboard()\">\n <ax-prefix><i class=\"fa-light fa-copy\"></i></ax-prefix>\n </ax-button>\n </span>\n <span class=\"info-value\">{{ workflowSettings().definitionId || 'new-workflow' }}</span>\n </div>\n <div class=\"workflow-info-row\">\n <span class=\"info-label\">{{ '@workflow-management:workflow-studio.components.workflow-panel.version' | translate | async }}</span>\n <span class=\"info-value\">{{ workflowSettings().version }}</span>\n </div>\n <div class=\"workflow-info-row\">\n <span class=\"info-label\">{{ '@workflow-management:workflow-studio.components.workflow-panel.status' | translate | async }}</span>\n <span class=\"info-value\">{{ workflowSettings().isPublished ? ('@workflow-management:workflow-studio.components.workflow-panel.published' | translate | async) : ('@workflow-management:workflow-studio.components.workflow-panel.draft' | translate | async) }}</span>\n </div>\n <div class=\"workflow-info-row\">\n <span class=\"info-label\">{{ '@workflow-management:workflow-studio.components.workflow-panel.usable-as-activity' | translate | async }}</span>\n <span class=\"info-value\">{{ workflowSettings().usableAsActivity ? ('@general:terms.common.yes-no.yes' | translate | async) : ('@general:terms.common.yes-no.no' | translate | async) }}</span>\n </div>\n </div>\n </section>\n <p class=\"properties-hint\">{{ '@workflow-management:workflow-studio.components.workflow-panel.settings-hint' | translate | async }}</p>\n </div>\n </div>\n }\n\n <!-- Properties Panel (when a node is selected) -->\n @if (selectedNode() && showPropertiesPanel()) {\n <div class=\"properties-panel\">\n <div class=\"properties-header\">\n <i class=\"fa-light fa-sliders\"></i>\n <h4>{{ '@workflow-management:workflow-studio.components.properties-panel.title' | translate | async }}</h4>\n <div class=\"header-actions\">\n <ax-button look=\"blank\" size=\"sm\" [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.close-panel' | translate | async\" (onClick)=\"togglePropertiesPanel()\">\n <ax-prefix><i class=\"fa-light fa-angle-right\"></i></ax-prefix>\n </ax-button>\n <ax-button look=\"blank\" size=\"sm\" [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.close' | translate | async\" (onClick)=\"selectedNode.set(null)\">\n <ax-prefix><i class=\"fa-light fa-times\"></i></ax-prefix>\n </ax-button>\n </div>\n </div>\n <div class=\"properties-body\">\n @if (propertyViewerTabs().length > 0) {\n <div class=\"properties-widget-section\">\n <axp-property-viewer\n #propertyViewerRef\n [tabsInput]=\"propertyViewerTabs()\"\n [mode]=\"'simple'\"\n (onChanged)=\"onPropertyViewerChanged($event)\">\n </axp-property-viewer>\n </div>\n } @else {\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.id' | translate | async }}:</label>\n <ax-text-box class=\"form-input\" [value]=\"selectedNode()!.id\" [disabled]=\"true\" />\n </div>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.type' | translate | async }}:</label>\n <ax-text-box class=\"form-input\" [value]=\"selectedNode()!.type\" [disabled]=\"true\" />\n </div>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.name' | translate | async }}:</label>\n <ax-text-box class=\"form-input\" [value]=\"selectedNode()!.name\"\n (valueChange)=\"updateNodeProperty(selectedNode()!.id, 'name', $event)\" />\n </div>\n <p class=\"no-properties\">\n {{ '@workflow-management:workflow-studio.components.properties-panel.empty-states.no-properties' | translate | async }}\n </p>\n }\n\n <div class=\"properties-divider\"></div>\n\n\n <h5>\u00F0\u0178\u201D\u2014 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.connections' | translate | async }}</h5>\n <small class=\"properties-hint\">{{ '@workflow-management:workflow-studio.components.properties-panel.sections.connections-hint' | translate | async }}</small>\n\n <!-- Outcome-based Connections -->\n @if (selectedNode()!.outcomeConnections && selectedNode()!.outcomeConnections!.length > 0) {\n <div class=\"connections-list\">\n @for (conn of selectedNode()!.outcomeConnections!; track conn.targetNodeId + conn.outcome) {\n @let targetNode = findNodeById(conn.targetNodeId);\n @if (targetNode) {\n <div class=\"connection-item outcome-connection\">\n <span class=\"outcome-badge\" [style.background]=\"getOutcomeColor(conn.outcome)\">\n {{ conn.outcome }}\n </span>\n <i class=\"fa-light fa-arrow-right\"></i>\n <span>{{ targetNode.name }}</span>\n <ax-button look=\"blank\" size=\"sm\" class=\"remove-btn\"\n [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.remove-connection' | translate | async\"\n (onClick)=\"disconnectNodes(selectedNode()!.id, conn.targetNodeId, conn.outcome)\">\n <ax-prefix><i class=\"fa-light fa-times\"></i></ax-prefix>\n </ax-button>\n </div>\n }\n }\n </div>\n } @else if (selectedNode()!.connections.length > 0) {\n <!-- Simple Connections (fallback) -->\n <div class=\"connections-list\">\n @for (targetId of selectedNode()!.connections; track targetId) {\n @let targetNode = findNodeById(targetId);\n @if (targetNode) {\n <div class=\"connection-item\">\n <i class=\"fa-light fa-arrow-right\"></i>\n <span>{{ targetNode.name }}</span>\n <ax-button look=\"blank\" size=\"sm\" class=\"remove-btn\"\n [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.remove-connection' | translate | async\"\n (onClick)=\"disconnectNodes(selectedNode()!.id, targetId)\">\n <ax-prefix><i class=\"fa-light fa-times\"></i></ax-prefix>\n </ax-button>\n </div>\n }\n }\n </div>\n } @else {\n <p class=\"no-properties\">{{ '@workflow-management:workflow-studio.components.properties-panel.empty-states.no-connections' | translate | async }}</p>\n }\n\n <!-- Available Outcomes Info -->\n @if (selectedNode()!.outcomes && selectedNode()!.outcomes!.length > 1) {\n <div class=\"properties-divider\"></div>\n <h5>\u00F0\u0178\u201C\u00A4 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.available-outcomes' | translate | async }}</h5>\n <small class=\"properties-hint\">{{ '@workflow-management:workflow-studio.components.properties-panel.sections.available-outcomes-hint' | translate | async }}</small>\n <div class=\"outcomes-info\">\n @for (outcome of selectedNode()!.outcomes!; track outcome) {\n <span class=\"outcome-tag\" [style.borderColor]=\"getOutcomeColor(outcome)\">\n <span class=\"outcome-dot\" [style.background]=\"getOutcomeColor(outcome)\"></span>\n {{ outcome }}\n </span>\n }\n </div>\n }\n\n <div class=\"properties-divider\"></div>\n\n <h5>\u00F0\u0178\u201C\u009D {{ '@workflow-management:workflow-studio.components.properties-panel.sections.raw-json' | translate | async }}</h5>\n <pre class=\"properties-json\">{{ selectedNode() | json }}</pre>\n </div>\n </div>\n }\n\n <!-- Toggle Button for Properties (when closed) -->\n @if (!showPropertiesPanel()) {\n <ax-button look=\"blank\" class=\"sidebar-toggle-btn right\" (onClick)=\"togglePropertiesPanel()\"\n [title]=\"selectedNode() ? ('@workflow-management:workflow-studio.components.properties-panel.actions.show-panel' | translate | async) : ('@workflow-management:workflow-studio.components.workflow-panel.show-panel' | translate | async)\">\n <ax-prefix><i class=\"fa-light fa-sliders\"></i></ax-prefix>\n </ax-button>\n }\n </div>\n }\n </div>\n </div>\n\n </div>\n\n <!-- Workflow Settings: opened via Layout Builder dialog in openWorkflowSettings() -->\n\n <!-- Workflow Execution Dialog -->\n @if (showExecutionDialog()) {\n <div class=\"execution-dialog-overlay\" (click)=\"closeExecutionDialog()\">\n <div class=\"execution-dialog\" (click)=\"$event.stopPropagation()\">\n <!-- Dialog Header -->\n <div class=\"execution-dialog-header\">\n <div class=\"header-content\">\n <i class=\"fa-light fa-play-circle\"></i>\n <div class=\"header-info\">\n <h2>{{ '@workflow-management:test-pages.workflow-studio.actions.execute-workflow.title' | translate |\n async }}</h2>\n <p>{{ '@workflow-management:test-pages.workflow-studio.actions.execute-workflow.description' | translate\n | async }}</p>\n </div>\n </div>\n <ax-button look=\"blank\" size=\"sm\" class=\"close-btn\" [disabled]=\"isExecuting()\" (onClick)=\"closeExecutionDialog()\">\n <ax-prefix><i class=\"fa-light fa-times\"></i></ax-prefix>\n </ax-button>\n </div>\n\n <!-- Dialog Body -->\n <div class=\"execution-dialog-body\">\n <!-- Workflow Info Panel (Before Execution) -->\n @if (!workflowInstanceState()) {\n <div class=\"workflow-info-panel\">\n <div class=\"start-section\">\n <div class=\"start-illustration\">\n <i class=\"fa-light fa-rocket\"></i>\n </div>\n <h3>{{ '@workflow-management:test-pages.workflow-studio.messages.info.ready-to-execute' | translate |\n async }}</h3>\n <p>{{ '@workflow-management:test-pages.workflow-studio.messages.info.click-to-start' | translate | async\n }}</p>\n <ax-button\n [text]=\"'@workflow-management:test-pages.workflow-studio.actions.start-execution.title' | translate | async\"\n color=\"success\" size=\"lg\" (onClick)=\"startWorkflowExecution()\">\n </ax-button>\n </div>\n </div>\n }\n\n\n <!-- Custom UI for Registration -->\n @if (false) {\n <div class=\"registration-ui\">\n <div class=\"registration-card\">\n <div class=\"registration-icon\">\n <i class=\"fa-light fa-user-circle\"></i>\n </div>\n <h3>\u00D9\u0081\u00D8\u00B1\u00D8\u00A2\u00DB\u0152\u00D9\u2020\u00D8\u00AF \u00D8\u00AB\u00D8\u00A8\u00D8\u00AA\u00E2\u20AC\u0152\u00D9\u2020\u00D8\u00A7\u00D9\u2026</h3>\n <p class=\"registration-desc\">\n \u00D8\u00A7\u00DB\u0152\u00D9\u2020 \u00D9\u0081\u00D9\u201E\u00D9\u02C6 \u00D8\u00B4\u00D8\u00A7\u00D9\u2026\u00D9\u201E \u00DA\u2020\u00D9\u2020\u00D8\u00AF \u00D9\u2026\u00D8\u00B1\u00D8\u00AD\u00D9\u201E\u00D9\u2021 \u00D8\u00A7\u00D8\u00B3\u00D8\u00AA \u00DA\u00A9\u00D9\u2021 \u00D8\u00AF\u00D8\u00A7\u00D8\u00AF\u00D9\u2021\u00E2\u20AC\u0152\u00D9\u2021\u00D8\u00A7\u00DB\u0152 \u00DA\u00A9\u00D8\u00A7\u00D8\u00B1\u00D8\u00A8\u00D8\u00B1 \u00D8\u00B1\u00D8\u00A7 \u00D8\u00AC\u00D9\u2026\u00D8\u00B9\u00E2\u20AC\u0152\u00D8\u00A2\u00D9\u02C6\u00D8\u00B1\u00DB\u0152 \u00DA\u00A9\u00D8\u00B1\u00D8\u00AF\u00D9\u2021 \u00D9\u02C6 \u00D8\u00AF\u00D8\u00B1 \u00D9\u2020\u00D9\u2021\u00D8\u00A7\u00DB\u0152\u00D8\u00AA \u00D8\u00AD\u00D8\u00B3\u00D8\u00A7\u00D8\u00A8 \u00DA\u00A9\u00D8\u00A7\u00D8\u00B1\u00D8\u00A8\u00D8\u00B1\u00DB\u0152 \u00D8\u00A7\u00DB\u0152\u00D8\u00AC\u00D8\u00A7\u00D8\u00AF \u00D9\u2026\u00DB\u0152\u00E2\u20AC\u0152\u00DA\u00A9\u00D9\u2020\u00D8\u00AF.\n </p>\n\n @if (workflowInstanceState()?.status === 'running') {\n <div class=\"registration-progress\">\n <div class=\"progress-spinner\">\n <i class=\"fa-light fa-spinner-third fa-spin\"></i>\n </div>\n <p>\u00D8\u00AF\u00D8\u00B1 \u00D8\u00AD\u00D8\u00A7\u00D9\u201E \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7\u00DB\u0152 \u00D9\u2026\u00D8\u00B1\u00D8\u00A7\u00D8\u00AD\u00D9\u201E \u00D8\u00AB\u00D8\u00A8\u00D8\u00AA\u00E2\u20AC\u0152\u00D9\u2020\u00D8\u00A7\u00D9\u2026...</p>\n </div>\n }\n\n @if (workflowInstanceState()?.status === 'finished') {\n <div class=\"registration-success\">\n <i class=\"fa-light fa-check-circle\"></i>\n <h4>\u00D8\u00AB\u00D8\u00A8\u00D8\u00AA\u00E2\u20AC\u0152\u00D9\u2020\u00D8\u00A7\u00D9\u2026 \u00D8\u00A8\u00D8\u00A7 \u00D9\u2026\u00D9\u02C6\u00D9\u0081\u00D9\u201A\u00DB\u0152\u00D8\u00AA \u00D8\u00A7\u00D9\u2020\u00D8\u00AC\u00D8\u00A7\u00D9\u2026 \u00D8\u00B4\u00D8\u00AF!</h4>\n <p>\u00D8\u00AD\u00D8\u00B3\u00D8\u00A7\u00D8\u00A8 \u00DA\u00A9\u00D8\u00A7\u00D8\u00B1\u00D8\u00A8\u00D8\u00B1\u00DB\u0152 \u00D8\u00B4\u00D9\u2026\u00D8\u00A7 \u00D8\u00A7\u00DB\u0152\u00D8\u00AC\u00D8\u00A7\u00D8\u00AF \u00D8\u00B4\u00D8\u00AF \u00D9\u02C6 \u00D8\u00A8\u00D9\u2021 \u00D8\u00B2\u00D9\u02C6\u00D8\u00AF\u00DB\u0152 \u00D8\u00A8\u00D9\u2021 \u00D8\u00AF\u00D8\u00A7\u00D8\u00B4\u00D8\u00A8\u00D9\u02C6\u00D8\u00B1\u00D8\u00AF \u00D9\u2026\u00D9\u2020\u00D8\u00AA\u00D9\u201A\u00D9\u201E \u00D8\u00AE\u00D9\u02C6\u00D8\u00A7\u00D9\u2021\u00DB\u0152\u00D8\u00AF \u00D8\u00B4\u00D8\u00AF.</p>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Default Execution View -->\n @if (workflowInstanceState()) {\n <div class=\"default-execution-view\">\n <div class=\"execution-status\">\n @if (workflowInstanceState()?.status === 'running') {\n <div class=\"status-running\">\n <i class=\"fa-light fa-spinner-third fa-spin\"></i>\n <h3>\u00D8\u00AF\u00D8\u00B1 \u00D8\u00AD\u00D8\u00A7\u00D9\u201E \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7...</h3>\n <p>Workflow \u00D8\u00AF\u00D8\u00B1 \u00D8\u00AD\u00D8\u00A7\u00D9\u201E \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7 \u00D8\u00A7\u00D8\u00B3\u00D8\u00AA. \u00D9\u201E\u00D8\u00B7\u00D9\u0081\u00D8\u00A7\u00D9\u2039 \u00D8\u00B5\u00D8\u00A8\u00D8\u00B1 \u00DA\u00A9\u00D9\u2020\u00DB\u0152\u00D8\u00AF.</p>\n </div>\n }\n\n @if (workflowInstanceState()?.status === 'finished') {\n <div class=\"status-finished\">\n <i class=\"fa-light fa-check-circle\"></i>\n <h3>\u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7 \u00D8\u00A8\u00D8\u00A7 \u00D9\u2026\u00D9\u02C6\u00D9\u0081\u00D9\u201A\u00DB\u0152\u00D8\u00AA \u00D8\u00AA\u00DA\u00A9\u00D9\u2026\u00DB\u0152\u00D9\u201E \u00D8\u00B4\u00D8\u00AF</h3>\n <p>Workflow \u00D8\u00A8\u00D8\u00A7 \u00D9\u2026\u00D9\u02C6\u00D9\u0081\u00D9\u201A\u00DB\u0152\u00D8\u00AA \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7 \u00D8\u00B4\u00D8\u00AF \u00D9\u02C6 \u00D8\u00AA\u00D9\u2026\u00D8\u00A7\u00D9\u2026 Activities \u00D8\u00A7\u00D9\u2020\u00D8\u00AC\u00D8\u00A7\u00D9\u2026 \u00D8\u00B4\u00D8\u00AF\u00D9\u2020\u00D8\u00AF.</p>\n </div>\n }\n\n @if (workflowInstanceState()?.status === 'error') {\n <div class=\"status-error\">\n <i class=\"fa-light fa-times-circle\"></i>\n <h3>\u00D8\u00AE\u00D8\u00B7\u00D8\u00A7 \u00D8\u00AF\u00D8\u00B1 \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7</h3>\n <p>{{ workflowInstanceState()?.error }}</p>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Execution Logs Panel -->\n @if (workflowInstanceState() && executionLogs().length > 0) {\n <div class=\"execution-logs-panel\">\n <h3><i class=\"fa-light fa-terminal\"></i> \u00D9\u201E\u00D8\u00A7\u00DA\u00AF\u00E2\u20AC\u0152\u00D9\u2021\u00D8\u00A7\u00DB\u0152 \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7</h3>\n <div class=\"logs-container-compact\">\n @for (log of executionLogs(); track $index) {\n <div class=\"log-item-compact\" [class]=\"'log-' + log.level\">\n <span class=\"log-time\">{{ log.timestamp | date: 'HH:mm:ss' }}</span>\n <span class=\"log-icon\">\n @switch (log.level) {\n @case ('info') {\n <i class=\"fa-light fa-info-circle\"></i>\n }\n @case ('success') {\n <i class=\"fa-light fa-check-circle\"></i>\n }\n @case ('warning') {\n <i class=\"fa-light fa-exclamation-triangle\"></i>\n }\n @case ('error') {\n <i class=\"fa-light fa-times-circle\"></i>\n }\n }\n </span>\n <span class=\"log-message\">{{ log.message }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Dialog Footer -->\n <div class=\"execution-dialog-footer\">\n <div class=\"footer-info\">\n @if (workflowInstanceState()?.startTime) {\n <span class=\"time-info\">\n <i class=\"fa-light fa-clock\"></i>\n \u00D8\u00B4\u00D8\u00B1\u00D9\u02C6\u00D8\u00B9: {{ workflowInstanceState()!.startTime | date: 'HH:mm:ss' }}\n </span>\n }\n @if (workflowInstanceState()?.endTime) {\n <span class=\"time-info\">\n <i class=\"fa-light fa-flag-checkered\"></i>\n \u00D9\u00BE\u00D8\u00A7\u00DB\u0152\u00D8\u00A7\u00D9\u2020: {{ workflowInstanceState()!.endTime | date: 'HH:mm:ss' }}\n </span>\n }\n </div>\n <div class=\"footer-actions\">\n <ax-button\n [text]=\"(workflowInstanceState() ? '@general:actions.close.title' : '@general:actions.cancel.title') | translate | async\"\n color=\"secondary\" size=\"md\" [disabled]=\"isExecuting()\" (onClick)=\"closeExecutionDialog()\">\n </ax-button>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </axp-page-content>\n</axp-page-layout>\n", styles: [".sidebar-header .toggle-btn{padding:.5rem;margin-left:auto;background:transparent;border:1px solid #e2e8f0;border-radius:6px;color:#64748b;cursor:pointer;transition:all .2s}.sidebar-header .toggle-btn:hover{background:#f8fafc;border-color:#8b5cf6;color:#8b5cf6}.sidebar-header .toggle-btn i{font-size:.875rem}.sidebar-toggle-btn{position:absolute;top:50%;transform:translateY(-50%);z-index:100;padding:1rem .5rem;background:#fff;border:1px solid #e2e8f0;border-radius:8px;color:#8b5cf6;cursor:pointer;box-shadow:0 4px 12px #0000001a;transition:all .3s}.sidebar-toggle-btn:hover{background:#8b5cf6;color:#fff;box-shadow:0 8px 24px #8b5cf64d;transform:translateY(-50%) scale(1.1)}.sidebar-toggle-btn.left{left:0;border-left:none;border-radius:0 8px 8px 0}.sidebar-toggle-btn.right{right:0;border-right:none;border-radius:8px 0 0 8px}.sidebar-toggle-btn i{font-size:1.25rem;display:block}.properties-header .header-actions{display:flex;gap:.5rem;margin-left:auto}.properties-header .header-btn{padding:.375rem .5rem;background:transparent;border:1px solid #e2e8f0;border-radius:4px;color:#64748b;cursor:pointer;transition:all .2s}.properties-header .header-btn:hover{background:#f8fafc;border-color:#8b5cf6;color:#8b5cf6}.properties-header .header-btn i{font-size:.75rem}.connections-list{margin-top:.75rem}.connection-item{display:flex;align-items:center;gap:.5rem;padding:.5rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;margin-bottom:.5rem;font-size:.875rem}.connection-item i{color:#8b5cf6}.connection-item span{flex:1;color:#1e293b}.connection-item .remove-btn{padding:.25rem .375rem;background:transparent;border:1px solid #e2e8f0;border-radius:4px;color:#ef4444;cursor:pointer;transition:all .2s}.connection-item .remove-btn:hover{background:#fef2f2;border-color:#ef4444}.connection-item .remove-btn i{font-size:.75rem;color:inherit}.property-editor{margin-top:.75rem}.property-editor .property-row label{display:flex;align-items:center;gap:.5rem;justify-content:space-between}.property-editor .property-row label .property-type-badge{padding:.125rem .375rem;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;font-size:.625rem;font-weight:400;color:#64748b;text-transform:lowercase;font-family:JetBrains Mono,monospace}.property-editor .property-row select{width:100%;padding:.5rem;border:1px solid #e2e8f0;border-radius:6px;font-size:.875rem;color:#1e293b;background:#fff;cursor:pointer;transition:all .2s}.property-editor .property-row select:focus{outline:none;border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf61a}.property-editor .property-row textarea{width:100%;padding:.5rem;border:1px solid #e2e8f0;border-radius:6px;font-size:.75rem;font-family:JetBrains Mono,monospace;color:#1e293b;resize:vertical;transition:all .2s}.property-editor .property-row textarea:focus{outline:none;border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf61a}.workflow-studio{display:flex;flex-direction:column;height:100vh;background:#f8fafc;overflow:hidden}.studio-editor-tabs ax-button-group-item[selected],.studio-editor-tabs ax-button-group-item.ax-selected{font-weight:600;opacity:1}.workflow-popup .popup-header{text-align:center;margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:2px solid #e2e8f0}.workflow-popup .popup-header h3{margin:0 0 .5rem;color:#1e293b;font-size:1.5rem;font-weight:700}.workflow-popup .popup-header p{margin:0;color:#64748b;font-size:.95rem}.workflow-popup .popup-body{max-height:60vh;overflow-y:auto;padding:0 .5rem}.workflow-popup .popup-body h4{margin:1.5rem 0 .75rem;color:#374151;font-size:1.1rem;font-weight:600;display:flex;align-items:center;gap:.5rem}.workflow-popup .popup-body ul{margin:0;padding-left:1.5rem}.workflow-popup .popup-body ul li{margin-bottom:.5rem;color:#4b5563}.workflow-popup .popup-body ul li strong{color:#1f2937}.workflow-popup .workflow-info{background:#f8fafc;padding:1rem;border-radius:8px;border:1px solid #e2e8f0}.workflow-popup .workflow-variables{background:#fef3c7;padding:1rem;border-radius:8px;border:1px solid #f59e0b}.workflow-popup .workflow-flow{background:#ecfdf5;padding:1rem;border-radius:8px;border:1px solid #10b981}.workflow-popup .workflow-flow .flow-steps{display:flex;flex-direction:column;gap:.75rem}.workflow-popup .workflow-flow .flow-steps .flow-step{display:flex;align-items:center;gap:.75rem;padding:.5rem;background:#fff;border-radius:6px;border:1px solid #d1d5db}.workflow-popup .workflow-flow .flow-steps .flow-step .step-number{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:#3b82f6;color:#fff;border-radius:50%;font-size:.8rem;font-weight:600}.workflow-popup .workflow-flow .flow-steps .flow-step .step-text{color:#374151;font-weight:500}.workflow-popup .workflow-json{background:#1f2937;padding:1rem;border-radius:8px;border:1px solid #374151}.workflow-popup .workflow-json .json-preview{background:transparent;color:#e5e7eb;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.8rem;line-height:1.4;margin:0;white-space:pre-wrap;word-break:break-all;max-height:200px;overflow-y:auto}.workflow-popup .popup-footer{text-align:center;margin-top:1.5rem;padding-top:1rem;border-top:1px solid #e2e8f0}.workflow-popup .popup-footer .btn{padding:.75rem 1.5rem;background:#3b82f6;color:#fff;border:none;border-radius:6px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:.5rem;transition:background-color .2s}.workflow-popup .popup-footer .btn:hover{background:#2563eb}.workflow-popup .popup-footer .btn i{font-size:.9rem}.view-workflow-link{color:#3b82f6;text-decoration:none;font-size:.85rem;margin-left:.5rem;transition:color .2s}.view-workflow-link:hover{color:#1d4ed8;text-decoration:underline}.studio-header{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.5rem;background:#fff;border-bottom:1px solid #e2e8f0;box-shadow:0 1px 3px #0000000d}.studio-header .header-title{display:flex;align-items:center;gap:.75rem}.studio-header .header-title i{font-size:1.75rem;color:#8b5cf6}.studio-header .header-title h1{margin:0;font-size:1.5rem;font-weight:700;color:#1e293b}.studio-header .header-title .badge{padding:.25rem .75rem;background:#8b5cf6;color:#fff;border-radius:12px;font-size:.75rem;font-weight:600}.studio-header .header-actions{display:flex;gap:.75rem;align-items:center}.samples-dropdown{position:relative}.samples-dropdown .samples-menu{position:absolute;top:calc(100% + .5rem);left:0;min-width:320px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 10px 25px #0000001a;z-index:1000;max-height:400px;overflow-y:auto}.samples-dropdown .samples-menu .sample-item{padding:.875rem 1rem;display:flex;align-items:flex-start;gap:.75rem;cursor:pointer;border-bottom:1px solid #f1f5f9;transition:all .2s}.samples-dropdown .samples-menu .sample-item:last-child{border-bottom:none}.samples-dropdown .samples-menu .sample-item:hover{background:#f8fafc;transform:translate(4px)}.samples-dropdown .samples-menu .sample-item i{font-size:1.25rem;margin-top:.125rem;color:#8b5cf6}.samples-dropdown .samples-menu .sample-item .sample-info{display:flex;flex-direction:column;gap:.25rem;flex:1}.samples-dropdown .samples-menu .sample-item .sample-info strong{color:#1e293b;font-size:.875rem;font-weight:600}.samples-dropdown .samples-menu .sample-item .sample-info span{color:#64748b;font-size:.75rem;line-height:1.4}.studio-body{display:grid;grid-template-columns:1fr;gap:0;flex:1;overflow:hidden;transition:grid-template-columns .3s ease}.studio-body.sidebar-hidden,.studio-body.properties-hidden,.studio-body.sidebar-hidden.properties-hidden{grid-template-columns:1fr}.studio-sidebar{background:#fff;border-right:1px solid #e2e8f0;display:flex;flex-direction:column;overflow:hidden}.studio-sidebar .sidebar-header{padding:1rem 1.25rem;border-bottom:1px solid #e2e8f0;display:flex;align-items:center;gap:.5rem}.studio-sidebar .sidebar-header i{font-size:1.25rem;color:#8b5cf6}.studio-sidebar .sidebar-header h3{flex:1;margin:0;font-size:1.125rem;font-weight:600;color:#1e293b}.activities-tree{flex:1;overflow-y:auto;padding:.5rem}.category-section{margin-bottom:.5rem}.category-section .category-header{display:flex;align-items:center;gap:.5rem;padding:.75rem;border-radius:8px;cursor:pointer;transition:all .2s;background:#f8fafc}.category-section .category-header:hover{background:#f1f5f9}.category-section .category-header.active{background:#ede9fe}.category-section .category-header.active>i:first-child{color:#8b5cf6}.category-section .category-header>i:first-child{font-size:.875rem;color:#94a3b8;transition:transform .2s,color .2s}.category-section .category-header>i:nth-child(2){font-size:1.125rem}.category-section .category-header span{flex:1;font-weight:600;font-size:.875rem;color:#334155}.category-section .category-header .count{flex:none;padding:.125rem .5rem;background:#fff;border-radius:10px;font-size:.75rem;font-weight:600;color:#64748b;border:1px solid #e2e8f0}.activities-list{padding:.5rem 0 .5rem 1.5rem;display:flex;flex-direction:column;gap:.5rem;animation:slideDown .3s ease}.activities-list .activities-header{padding:.5rem .75rem;margin-bottom:.5rem}.activities-list .activities-header h4{margin:0;font-size:.875rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.5px}.activity-card{background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:.875rem;margin-bottom:.75rem;transition:all .2s}.activity-card:hover{border-color:#8b5cf6;box-shadow:0 4px 12px #8b5cf61a;transform:translateY(-1px)}.activity-card .activity-info{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:.5rem}.activity-card .activity-info>i{font-size:1.5rem;color:#8b5cf6;margin-top:.125rem}.activity-card .activity-info .activity-details{flex:1;display:flex;flex-direction:column;gap:.25rem}.activity-card .activity-info .activity-details strong{font-size:.875rem;color:#1e293b}.activity-card .activity-info .activity-details small{font-size:.75rem;color:#64748b;line-height:1.4}.activity-card .activity-info .activity-details code{font-size:.75rem;color:#8b5cf6;background:#f3f0ff;padding:.125rem .375rem;border-radius:4px;width:fit-content}.activity-card .copy-btn{float:right;padding:.375rem .75rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;cursor:pointer;transition:all .2s;color:#64748b}.activity-card .copy-btn:hover{background:#8b5cf6;border-color:#8b5cf6;color:#fff}.activity-card .copy-btn i{font-size:.875rem}.activity-card .activity-properties{margin-top:.75rem;padding-top:.75rem;border-top:1px solid #f1f5f9}.activity-card .activity-properties .properties-title{display:block;font-size:.75rem;font-weight:600;color:#64748b;margin-bottom:.5rem}.activity-card .activity-properties .property-item{display:flex;align-items:center;gap:.5rem;padding:.25rem 0;font-size:.75rem}.activity-card .activity-properties .property-item code{color:#1e293b;background:#f8fafc;padding:.125rem .375rem;border-radius:3px}.activity-card .activity-properties .property-item .property-type{color:#64748b;font-style:italic}.activity-card .activity-properties .property-item .required{color:#ef4444;font-weight:700}.studio-editor{display:flex;flex-direction:column;background:#1e293b;overflow:hidden}.studio-editor .editor-header{padding:1rem 1.25rem;background:#0f172a;display:flex;align-items:center;gap:.5rem}.studio-editor .editor-header i{font-size:1.125rem;color:#8b5cf6}.studio-editor .editor-header h3{margin:0;font-size:1rem;font-weight:600;color:#e2e8f0}.studio-editor axp-page-toolbar .editor-tabs{display:flex;gap:.5rem;background:transparent}.studio-editor axp-page-toolbar .editor-tabs .tab-btn{padding:.5rem 1rem;background:transparent;border:1px solid #e2e8f0;border-radius:6px;color:#64748b;font-size:.875rem;font-weight:500;cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center;gap:.5rem}.studio-editor axp-page-toolbar .editor-tabs .tab-btn i{font-size:.875rem}.studio-editor axp-page-toolbar .editor-tabs .tab-btn:hover{background:#f8fafc;border-color:#cbd5e1;color:#475569}.studio-editor axp-page-toolbar .editor-tabs .tab-btn.active{background:#8b5cf6;border-color:#8b5cf6;color:#fff}.studio-editor .editor-content{flex:1;display:flex;overflow:hidden}.studio-editor .json-tab{flex:1;display:flex;flex-direction:column}.studio-editor .json-editor{flex:1;padding:1.5rem;background:#1e293b;color:#e2e8f0;border:none;outline:none;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:.875rem;line-height:1.6;resize:none;overflow:auto}.studio-editor .json-editor::placeholder{color:#475569}.studio-editor .json-editor::-webkit-scrollbar{width:10px;height:10px}.studio-editor .json-editor::-webkit-scrollbar-track{background:#0f172a}.studio-editor .json-editor::-webkit-scrollbar-thumb{background:#475569;border-radius:5px}.studio-editor .json-editor::-webkit-scrollbar-thumb:hover{background:#64748b}.studio-editor .visual-tab{flex:1;display:flex;background:#f8fafc;position:relative}.studio-editor .visual-canvas{flex:1;display:flex;flex-direction:column;overflow:hidden}.studio-editor .visual-canvas .canvas-toolbar{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;background:var(--ax-surface, white);border-bottom:1px solid var(--ax-border, #e2e8f0)}.studio-editor .visual-canvas .canvas-toolbar .tool-btn{padding:.5rem .75rem;background:var(--ax-surface-alt, #f8fafc);border:1px solid var(--ax-border, #e2e8f0);border-radius:6px;color:var(--ax-text-muted, #64748b);cursor:pointer;transition:all .2s}.studio-editor .visual-canvas .canvas-toolbar .tool-btn:hover{background:#8b5cf6;border-color:#8b5cf6;color:#fff}.studio-editor .visual-canvas .canvas-toolbar .tool-btn i{font-size:.875rem}.studio-editor .visual-canvas .canvas-toolbar .toolbar-sep{width:1px;height:1.25rem;background:var(--ax-border, #e2e8f0);flex-shrink:0}.studio-editor .visual-canvas .canvas-toolbar .toolbar-auto-save{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;color:var(--ax-text-muted, #64748b);cursor:default}.studio-editor .visual-canvas .canvas-toolbar .toolbar-auto-save ax-switch{flex-shrink:0}.studio-editor .visual-canvas .canvas-toolbar .tool-info{flex:1;display:flex;align-items:center;gap:.5rem;min-height:1.75rem;font-size:.8125rem;color:var(--ax-text-muted, #64748b);line-height:1.4}.studio-editor .visual-canvas .canvas-toolbar .tool-info strong{font-weight:600}.studio-editor .visual-canvas .canvas-toolbar .tool-info i{font-size:1rem;color:#8b5cf6;flex-shrink:0}.studio-editor .visual-canvas .canvas-area{flex:1;position:relative;background:linear-gradient(90deg,#e5e7eb 1px,transparent 1px),linear-gradient(#e5e7eb 1px,transparent 1px);background-size:20px 20px;overflow:auto;min-height:600px}.studio-editor .visual-canvas .connections-layer{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1}.studio-editor .visual-canvas .connection-line{fill:none;transition:stroke .2s}.studio-editor .visual-canvas .connection-line.connection-hit{stroke:transparent;stroke-width:16;cursor:pointer;pointer-events:stroke}.studio-editor .visual-canvas .connection-line.connection-hit:hover~.outcome-line,.studio-editor .visual-canvas .connection-line.connection-hit:hover~.connection-line:not(.connection-hit){filter:brightness(.9)}.studio-editor .visual-canvas .connection-line:not(.connection-hit){stroke-linecap:round;pointer-events:none}.studio-editor .visual-canvas .connection-line.outcome-line{stroke-width:2.5}.studio-editor .visual-canvas .visual-node{position:absolute;width:150px;background:#fff;border:2px solid #e2e8f0;border-radius:8px;box-shadow:0 2px 8px #0000001a;cursor:move;transition:all .2s;z-index:2}.studio-editor .visual-canvas .visual-node:hover{border-color:#8b5cf6;box-shadow:0 4px 16px #8b5cf633;transform:translateY(-2px)}.studio-editor .visual-canvas .visual-node.selected{border-color:#8b5cf6;border-width:3px;box-shadow:0 0 0 3px #8b5cf633}.studio-editor .visual-canvas .visual-node .node-header{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:linear-gradient(135deg,#8b5cf6,#7c3aed);color:#fff;border-radius:6px 6px 0 0;font-size:.875rem;font-weight:600}.studio-editor .visual-canvas .visual-node .node-header i{font-size:1rem}.studio-editor .visual-canvas .visual-node .node-header span{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.studio-editor .visual-canvas .visual-node .node-header .node-delete{padding:.25rem;background:#fff3;border:none;border-radius:4px;color:#fff;cursor:pointer;transition:all .2s}.studio-editor .visual-canvas .visual-node .node-header .node-delete:hover{background:#ef4444cc}.studio-editor .visual-canvas .visual-node .node-header .node-delete i{font-size:.75rem}.studio-editor .visual-canvas .visual-node .node-body{padding:.75rem}.studio-editor .visual-canvas .visual-node .node-body small{display:block;font-size:.75rem;color:#64748b;text-align:center}.studio-editor .visual-canvas .visual-node .node-connectors{position:relative}.studio-editor .visual-canvas .visual-node .node-connectors .connector{position:absolute;width:12px;height:12px;background:#8b5cf6;border:2px solid white;border-radius:50%;cursor:pointer;transition:all .2s;z-index:10}.studio-editor .visual-canvas .visual-node .node-connectors .connector:hover{transform:scale(1.3);box-shadow:0 0 0 3px #8b5cf64d}.studio-editor .visual-canvas .visual-node .node-connectors .connector-in{top:-50px;left:50%;transform:translate(-50%);background:#3b82f6}.studio-editor .visual-canvas .visual-node .node-connectors .connector-out{bottom:-6px;left:50%;transform:translate(-50%);background:#8b5cf6}.studio-editor .visual-canvas .visual-node .node-connectors .connector-out.active{background:#ef4444}.studio-editor .visual-canvas .visual-node .node-connectors .outcomes-container{position:absolute;bottom:-60px;left:50%;transform:translate(-50%);display:flex;flex-direction:column;gap:8px;background:#fff;padding:8px;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 12px #00000026;min-width:120px;z-index:100}.studio-editor .visual-canvas .visual-node .node-connectors .outcomes-container:before{content:\"\";position:absolute;top:-8px;left:50%;transform:translate(-50%);width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid white;filter:drop-shadow(0 -2px 2px rgba(0,0,0,.05))}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;cursor:pointer;transition:all .2s;position:relative}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector:hover{background:#f1f5f9;border-color:#8b5cf6;transform:translate(2px)}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector.active{background:#fef2f2;border-color:#ef4444}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector.active .outcome-dot{background:#ef4444;box-shadow:0 0 0 3px #ef444433}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector .outcome-label{font-size:.75rem;font-weight:600;color:#475569;-webkit-user-select:none;user-select:none;flex:1}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector .outcome-dot{width:10px;height:10px;background:#8b5cf6;border:2px solid white;border-radius:50%;transition:all .2s;flex-shrink:0}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=\"200\"] .outcome-dot,.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Done] .outcome-dot{background:#10b981}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=\"404\"] .outcome-dot,.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Failed] .outcome-dot{background:#ef4444}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Timeout] .outcome-dot,.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Cancelled] .outcome-dot{background:#f59e0b}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Then] .outcome-dot{background:#3b82f6}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Else] .outcome-dot{background:#64748b}.studio-editor .visual-canvas .canvas-empty-state{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;color:#94a3b8;pointer-events:none}.studio-editor .visual-canvas .canvas-empty-state i{font-size:4rem;margin-bottom:1rem;opacity:.5}.studio-editor .visual-canvas .canvas-empty-state p{margin:0 0 .5rem;font-size:1rem;font-weight:500}.studio-editor .visual-canvas .canvas-empty-state small{font-size:.875rem;opacity:.8}.studio-editor .properties-panel{width:280px;background:#fff;border-left:1px solid #e2e8f0;display:flex;flex-direction:column}.studio-editor .properties-panel .properties-header{display:flex;align-items:center;gap:.5rem;padding:1rem;border-bottom:1px solid #e2e8f0}.studio-editor .properties-panel .properties-header i{font-size:1.125rem;color:#8b5cf6}.studio-editor .properties-panel .properties-header h4{flex:1;margin:0;font-size:.875rem;font-weight:600;color:#1e293b}.studio-editor .properties-panel .properties-header button{padding:.25rem .5rem;background:transparent;border:none;color:#64748b;cursor:pointer;transition:color .2s}.studio-editor .properties-panel .properties-header button:hover{color:#ef4444}.studio-editor .properties-panel .properties-body{flex:1;padding:1rem;overflow-y:auto}.studio-editor .properties-panel .properties-body .properties-widget-section{min-height:0}.studio-editor .properties-panel .properties-body .workflow-panel-section{margin-bottom:1.5rem}.studio-editor .properties-panel .properties-body .workflow-panel-section h5{margin:0 0 .75rem;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.5px}.studio-editor .properties-panel .properties-body .workflow-panel-section .form-group{margin-bottom:.75rem}.studio-editor .properties-panel .properties-body .workflow-panel-section .form-group label{font-size:.75rem}.studio-editor .properties-panel .properties-body .workflow-panel-section .form-group input,.studio-editor .properties-panel .properties-body .workflow-panel-section .form-group textarea{font-size:.8125rem}.studio-editor .properties-panel .properties-body .workflow-info-table{display:flex;flex-direction:column;gap:.5rem}.studio-editor .properties-panel .properties-body .workflow-info-row{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.5rem 0;border-bottom:1px solid #f1f5f9}.studio-editor .properties-panel .properties-body .workflow-info-row:last-child{border-bottom:none}.studio-editor .properties-panel .properties-body .info-label{font-size:.8125rem;font-weight:500;color:#64748b;flex-shrink:0}.studio-editor .properties-panel .properties-body .info-value{font-size:.8125rem;color:#1e293b;text-align:right;word-break:break-all}.studio-editor .properties-panel .properties-body .info-actions{display:flex;align-items:center;gap:.5rem}.studio-editor .properties-panel .properties-body .property-row{margin-bottom:1rem}.studio-editor .properties-panel .properties-body .property-row label{display:block;font-size:.75rem;font-weight:600;color:#64748b;margin-bottom:.375rem;text-transform:uppercase;letter-spacing:.5px}.studio-editor .properties-panel .properties-body .property-row input{width:100%;padding:.5rem;border:1px solid #e2e8f0;border-radius:6px;font-size:.875rem;color:#1e293b;transition:all .2s}.studio-editor .properties-panel .properties-body .property-row input:focus{outline:none;border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf61a}.studio-editor .properties-panel .properties-body .property-row input:disabled{background:#f8fafc;color:#94a3b8;cursor:not-allowed}.studio-editor .properties-panel .properties-body .properties-divider{height:1px;background:#e2e8f0;margin:1.5rem 0}.studio-editor .properties-panel .properties-body h5{margin:0 0 .5rem;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.5px}.studio-editor .properties-panel .properties-body .properties-hint{display:block;font-size:.75rem;color:#94a3b8;margin-bottom:.75rem}.studio-editor .properties-panel .properties-body .properties-json{margin:.75rem 0 0;padding:.75rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;font-family:JetBrains Mono,monospace;font-size:.75rem;line-height:1.6;color:#1e293b;overflow-x:auto}.studio-editor .properties-panel .properties-body .no-properties{margin:.75rem 0 0;padding:1rem;background:#f8fafc;border:1px dashed #cbd5e1;border-radius:6px;text-align:center;font-size:.75rem;color:#94a3b8}.studio-editor .properties-panel .properties-body .connections-list{display:flex;flex-direction:column;gap:.5rem;margin-top:.75rem}.studio-editor .properties-panel .properties-body .connections-list .connection-item{display:flex;align-items:center;gap:.5rem;padding:.5rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;font-size:.75rem}.studio-editor .properties-panel .properties-body .connections-list .connection-item.outcome-connection{border-left-width:3px}.studio-editor .properties-panel .properties-body .connections-list .connection-item i{color:#64748b;font-size:.875rem}.studio-editor .properties-panel .properties-body .connections-list .connection-item span{flex:1;color:#1e293b;font-weight:500}.studio-editor .properties-panel .properties-body .connections-list .connection-item .outcome-badge{padding:.25rem .5rem;border-radius:4px;color:#fff;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.5px}.studio-editor .properties-panel .properties-body .connections-list .connection-item .remove-btn{padding:.25rem;background:transparent;border:none;color:#ef4444;cursor:pointer;border-radius:4px;transition:all .2s}.studio-editor .properties-panel .properties-body .connections-list .connection-item .remove-btn:hover{background:#fee2e2}.studio-editor .properties-panel .properties-body .connections-list .connection-item .remove-btn i{font-size:.75rem;color:inherit}.studio-editor .properties-panel .properties-body .outcomes-info{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.75rem}.studio-editor .properties-panel .properties-body .outcomes-info .outcome-tag{display:inline-flex;align-items:center;gap:.375rem;padding:.375rem .625rem;background:#fff;border:2px solid;border-radius:6px;font-size:.75rem;font-weight:600;color:#1e293b;transition:all .2s}.studio-editor .properties-panel .properties-body .outcomes-info .outcome-tag:hover{transform:translateY(-1px);box-shadow:0 2px 8px #0000001a}.studio-editor .properties-panel .properties-body .outcomes-info .outcome-tag .outcome-dot{width:8px;height:8px;border-radius:50%}.studio-result{display:flex;flex-direction:column;background:#fff;border-left:1px solid #e2e8f0;overflow:hidden}.studio-result .result-header{padding:1rem 1.25rem;border-bottom:1px solid #e2e8f0;display:flex;align-items:center;gap:.5rem}.studio-result .result-header i{font-size:1.125rem;color:#10b981}.studio-result .result-header h3{flex:1;margin:0;font-size:1rem;font-weight:600;color:#1e293b}.studio-result .result-header .clear-btn{padding:.375rem .75rem;background:#fee2e2;color:#dc2626;border:none;border-radius:6px;cursor:pointer;font-size:.75rem;font-weight:500;transition:all .2s}.studio-result .result-header .clear-btn:hover{background:#fecaca}.studio-result .result-header .clear-btn i{font-size:.75rem;color:inherit}.studio-result .result-body{flex:1;overflow-y:auto;padding:1rem}.logs-container{display:flex;flex-direction:column;gap:.5rem}.log-item{display:flex;align-items:flex-start;gap:.5rem;padding:.75rem;background:#f8fafc;border-left:3px solid #cbd5e1;border-radius:6px;font-size:.875rem}.log-item.log-info{border-left-color:#3b82f6;background:#eff6ff}.log-item.log-info .log-icon{color:#3b82f6}.log-item.log-success{border-left-color:#10b981;background:#f0fdf4}.log-item.log-success .log-icon{color:#10b981}.log-item.log-warning{border-left-color:#f59e0b;background:#fffbeb}.log-item.log-warning .log-icon{color:#f59e0b}.log-item.log-error{border-left-color:#ef4444;background:#fef2f2}.log-item.log-error .log-icon{color:#ef4444}.log-item .log-time{font-family:JetBrains Mono,monospace;font-size:.75rem;color:#64748b;min-width:80px}.log-item .log-icon{font-size:1rem}.log-item .log-message{flex:1;color:#1e293b}.log-item .log-data-toggle{padding:.25rem .5rem;background:transparent;border:1px solid #cbd5e1;border-radius:4px;cursor:pointer;transition:all .2s}.log-item .log-data-toggle:hover{background:#fff}.log-item .log-data-toggle i{font-size:.75rem;color:#64748b}.log-data{margin:.5rem 0 0;padding:1rem;background:#0f172a;color:#e2e8f0;border-radius:6px;font-family:JetBrains Mono,monospace;font-size:.75rem;line-height:1.6;overflow-x:auto}.settings-modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:9999;padding:2rem;animation:fadeIn .2s ease}.settings-modal{background:#fff;border-radius:12px;box-shadow:0 20px 60px #0000004d;width:100%;max-width:900px;max-height:90vh;display:flex;flex-direction:column;animation:slideUp .3s ease}@keyframes slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}.settings-modal-header{display:flex;align-items:center;justify-content:space-between;padding:1.5rem 2rem;border-bottom:1px solid #e2e8f0}.settings-modal-header .header-title{display:flex;align-items:center;gap:.75rem}.settings-modal-header .header-title i{font-size:1.5rem;color:#8b5cf6}.settings-modal-header .header-title h2{margin:0;font-size:1.25rem;font-weight:700;color:#1e293b}.settings-modal-header .close-btn{padding:.5rem;background:transparent;border:none;color:#64748b;cursor:pointer;border-radius:6px;transition:all .2s}.settings-modal-header .close-btn:hover{background:#f1f5f9;color:#ef4444}.settings-modal-header .close-btn i{font-size:1.25rem}.settings-modal-body{flex:1;display:flex;flex-direction:column;overflow:hidden}.settings-tabs{padding:0 1.5rem}.settings-content{flex:1;overflow-y:auto;padding:2rem}.settings-section h3{margin:0 0 1.5rem;font-size:1rem;font-weight:600;color:#1e293b}.settings-section .section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem}.settings-section .section-header h3{margin:0}.settings-section .section-header .add-btn{display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;background:#8b5cf6;color:#fff;border:none;border-radius:6px;font-size:.875rem;font-weight:500;cursor:pointer;transition:all .2s}.settings-section .section-header .add-btn:hover{background:#7c3aed;transform:translateY(-1px);box-shadow:0 4px 12px #8b5cf64d}.settings-section .section-header .add-btn i{font-size:.875rem}.form-group{margin-bottom:1.25rem}.form-group label{display:block;font-size:.875rem;font-weight:600;color:#475569;margin-bottom:.5rem}.form-group small{display:block;font-size:.75rem;color:#94a3b8;margin-top:.375rem}.form-group.checkbox-group{margin-bottom:0}.form-group.checkbox-group label{display:flex;align-items:center;gap:.5rem;cursor:pointer;margin-bottom:0}.form-group.checkbox-group label input[type=checkbox]{width:18px;height:18px;cursor:pointer}.form-group.checkbox-group label span{font-size:.875rem;font-weight:500}.form-group.flex-1{flex:1}.form-row{display:flex;gap:1rem;align-items:flex-start}.form-input,.form-select,.form-textarea{width:100%;padding:.625rem;border:1px solid #e2e8f0;border-radius:6px;font-size:.875rem;color:#1e293b;transition:all .2s}.form-input:focus,.form-select:focus,.form-textarea:focus{outline:none;border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf61a}.form-input::placeholder,.form-select::placeholder,.form-textarea::placeholder{color:#cbd5e1}.form-textarea{resize:vertical;font-family:inherit}.items-list{display:flex;flex-direction:column;gap:1rem}.item-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;transition:all .2s}.item-card:hover{border-color:#cbd5e1;box-shadow:0 2px 8px #0000000d}.item-card .item-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;background:#f1f5f9;border-bottom:1px solid #e2e8f0}.item-card .item-header .item-number{font-size:.75rem;font-weight:700;color:#8b5cf6;padding:.25rem .5rem;background:#fff;border-radius:4px}.item-card .item-header .remove-btn{padding:.375rem .625rem;background:transparent;border:none;color:#ef4444;cursor:pointer;border-radius:4px;transition:all .2s}.item-card .item-header .remove-btn:hover{background:#fee2e2}.item-card .item-header .remove-btn i{font-size:.875rem}.item-card .item-body{padding:1rem}.advanced-group{margin-bottom:2rem;padding-bottom:2rem;border-bottom:1px solid #e2e8f0}.advanced-group:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}.advanced-group h4{margin:0 0 1rem;font-size:.875rem;font-weight:600;color:#475569;text-transform:uppercase;letter-spacing:.5px}.outcomes-preview{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.75rem}.outcomes-preview .outcome-chip{display:inline-flex;align-items:center;padding:.375rem .75rem;background:#f1f5f9;border:1px solid #cbd5e1;border-radius:6px;font-size:.75rem;font-weight:600;color:#475569}.export-info{margin-top:1rem;padding:1rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px}.export-info .info-row{display:flex;align-items:center;gap:.75rem;padding:.5rem 0;border-bottom:1px solid #e2e8f0}.export-info .info-row:last-child{border-bottom:none;padding-bottom:0}.export-info .info-row .label{font-size:.75rem;font-weight:600;color:#64748b;min-width:120px}.export-info .info-row code{flex:1;padding:.25rem .5rem;background:#fff;border:1px solid #e2e8f0;border-radius:4px;font-size:.75rem;color:#1e293b;font-family:JetBrains Mono,monospace}.settings-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:1rem;padding:1.5rem 2rem;border-top:1px solid #e2e8f0;background:#f8fafc}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 1rem;text-align:center;color:#94a3b8}.empty-state i{font-size:3rem;margin-bottom:1rem}.empty-state p{margin:0;font-size:.875rem}.final-result{margin-top:1.5rem;padding-top:1.5rem;border-top:2px solid #e2e8f0}.final-result .result-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background:#f8fafc;border-radius:8px;margin-bottom:1rem;cursor:pointer;transition:all .2s}.final-result .result-header:hover{background:#f1f5f9;transform:translate(-2px)}.final-result .result-header h4{display:flex;align-items:center;gap:.5rem;margin:0;font-size:.875rem;font-weight:600;color:#475569;text-transform:uppercase}.final-result .result-header h4 i{font-size:.875rem;transition:transform .2s}.final-result .result-header .toggle-hint{font-size:.75rem;color:#94a3b8}.final-result .result-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:1rem}.final-result .result-card .result-row{display:flex;align-items:center;gap:.75rem;padding:.5rem 0}.final-result .result-card .result-row:not(:last-child){border-bottom:1px solid #e2e8f0}.final-result .result-card .result-row strong{font-size:.875rem;color:#475569;min-width:100px}.final-result .result-card .result-row .badge{padding:.25rem .75rem;border-radius:12px;font-size:.75rem;font-weight:600}.final-result .result-card .result-row .badge.badge-running{background:#dbeafe;color:#1e40af}.final-result .result-card .result-row .badge.badge-finished{background:#d1fae5;color:#065f46}.final-result .result-card .result-row .badge.badge-cancelled{background:#fed7aa;color:#92400e}.final-result .result-card .result-row .badge.badge-faulted{background:#fee2e2;color:#991b1b}.final-result .result-card .result-row pre{margin:.5rem 0 0;padding:.75rem;background:#0f172a;color:#e2e8f0;border-radius:6px;font-family:JetBrains Mono,monospace;font-size:.75rem;line-height:1.6;overflow-x:auto;width:100%}.activities-list::-webkit-scrollbar,.result-body::-webkit-scrollbar{width:8px}.activities-list::-webkit-scrollbar-track,.result-body::-webkit-scrollbar-track{background:#f1f5f9}.activities-list::-webkit-scrollbar-thumb,.result-body::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:4px}.activities-list::-webkit-scrollbar-thumb:hover,.result-body::-webkit-scrollbar-thumb:hover{background:#94a3b8}.activity-card{cursor:grab}.activity-card:active{cursor:grabbing}.activity-card[draggable=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.visual-node[draggable=true]{cursor:move;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.visual-node:active{cursor:grabbing}.canvas-area[data-drag-over=true]{background-color:#8b5cf60d}.connector:hover{transform:scale(1.3);box-shadow:0 0 0 3px #8b5cf64d}.connector-out.active{animation:pulse 1s infinite}@keyframes pulse{0%,to{box-shadow:0 0 0 3px #ef44444d}50%{box-shadow:0 0 0 6px #ef44441a}}@keyframes slideDown{0%{opacity:0;max-height:0}to{opacity:1;max-height:2000px}}.execution-dialog-overlay{position:fixed;inset:0;background:#000000b3;backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:10000;animation:fadeIn .2s ease}.execution-dialog{width:90vw;max-width:1200px;height:90vh;background:#fff;border-radius:16px;box-shadow:0 25px 50px #0000004d;display:flex;flex-direction:column;overflow:hidden;animation:slideUp .3s ease}.execution-dialog-header{padding:1.5rem 2rem;background:linear-gradient(135deg,#8b5cf6,#7c3aed);color:#fff;display:flex;justify-content:space-between;align-items:center;flex-shrink:0}.execution-dialog-header .header-content{display:flex;align-items:center;gap:1rem;flex:1}.execution-dialog-header .header-content>i{font-size:2.5rem;opacity:.9}.execution-dialog-header .header-content .header-info h2{margin:0;font-size:1.75rem;font-weight:700}.execution-dialog-header .header-content .header-info p{margin:.25rem 0 0;opacity:.9;font-size:.95rem}.execution-dialog-header .close-btn{background:#fff3;border:none;width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;color:#fff;font-size:1.25rem}.execution-dialog-header .close-btn:hover:not(:disabled){background:#ffffff4d;transform:scale(1.05)}.execution-dialog-header .close-btn:disabled{opacity:.5;cursor:not-allowed}.execution-dialog-body{flex:1;overflow-y:auto;padding:2rem;background:#f8fafc}.execution-dialog-footer{padding:1rem 2rem;background:#fff;border-top:1px solid #e2e8f0;display:flex;justify-content:space-between;align-items:center;flex-shrink:0}.execution-dialog-footer .footer-info{display:flex;gap:1.5rem}.execution-dialog-footer .footer-info .time-info{display:flex;align-items:center;gap:.5rem;color:#64748b;font-size:.875rem}.execution-dialog-footer .footer-info .time-info i{color:#8b5cf6}.execution-dialog-footer .footer-actions{display:flex;gap:.75rem}.workflow-info-panel{background:#fff;border-radius:12px;padding:2rem;box-shadow:0 4px 6px #0000000d}.workflow-info-panel .info-section{margin-bottom:2rem}.workflow-info-panel .info-section h3{display:flex;align-items:center;gap:.5rem;margin:0 0 1rem;color:#1e293b;font-size:1.25rem}.workflow-info-panel .info-section h3 i{color:#8b5cf6}.workflow-info-panel .info-section .description{color:#475569;line-height:1.7;margin:0}.workflow-info-panel .info-section .features-list{list-style:none;padding:0;margin:0;display:grid;gap:.75rem}.workflow-info-panel .info-section .features-list li{display:flex;align-items:center;gap:.75rem;padding:.75rem;background:#f8fafc;border-radius:8px;color:#334155}.workflow-info-panel .info-section .features-list li i{color:#10b981;font-size:1.125rem}.workflow-info-panel .start-section{text-align:center;padding:2rem;background:linear-gradient(135deg,#f0fdf4,#dcfce7);border-radius:12px;border:2px dashed #10b981}.workflow-info-panel .start-section .start-illustration{margin-bottom:1rem}.workflow-info-panel .start-section .start-illustration i{font-size:4rem;color:#10b981;animation:float 3s ease-in-out infinite}.workflow-info-panel .start-section h3{margin:0 0 .5rem;color:#1e293b;font-size:1.5rem}.workflow-info-panel .start-section p{margin:0 0 1.5rem;color:#64748b}.state-machine-ui .issue-tracker{background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 1px 2px #0000000d}.state-machine-ui .issue-tracker .issue-header-main{padding:1.5rem 2rem 1rem;border-bottom:1px solid #e2e8f0}.state-machine-ui .issue-tracker .issue-header-main .issue-breadcrumb{display:flex;align-items:center;gap:.5rem;font-size:.875rem;color:#64748b;margin-bottom:.75rem}.state-machine-ui .issue-tracker .issue-header-main .issue-breadcrumb .project-name{color:#3b82f6;font-weight:600}.state-machine-ui .issue-tracker .issue-header-main .issue-breadcrumb .separator{color:#94a3b8}.state-machine-ui .issue-tracker .issue-header-main .issue-breadcrumb .issue-key{color:#64748b}.state-machine-ui .issue-tracker .issue-header-main .issue-type-title{display:flex;align-items:center;gap:.75rem}.state-machine-ui .issue-tracker .issue-header-main .issue-type-title .type-badge{padding:.375rem .75rem;border-radius:4px;font-size:.8125rem;font-weight:600;display:flex;align-items:center;gap:.375rem;background:#eff6ff;color:#3b82f6}.state-machine-ui .issue-tracker .issue-header-main .issue-type-title .type-badge i{font-size:1rem}.state-machine-ui .issue-tracker .issue-header-main .issue-type-title .issue-main-title{margin:0;font-size:1.5rem;font-weight:600;color:#1e293b}.state-machine-ui .issue-tracker .issue-action-bar{padding:.75rem 2rem;background:#f8fafc;border-bottom:1px solid #e2e8f0;display:flex;justify-content:space-between;align-items:center}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left{display:flex;gap:.5rem}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn{padding:.5rem 1rem;border:1px solid #cbd5e1;border-radius:4px;background:#fff;font-weight:500;font-size:.875rem;cursor:pointer;transition:all .2s;color:#334155}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn:disabled{opacity:.5;cursor:not-allowed}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-primary{background:#3b82f6;color:#fff;border-color:#3b82f6}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-primary:hover:not(:disabled){background:#2563eb}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-success{background:#10b981;color:#fff;border-color:#10b981}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-success:hover:not(:disabled){background:#059669}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-warning{background:#f59e0b;color:#fff;border-color:#f59e0b}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-warning:hover:not(:disabled){background:#d97706}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-right .more-actions-btn{padding:.5rem 1rem;border:1px solid #cbd5e1;border-radius:4px;background:#fff;font-weight:500;font-size:.875rem;cursor:pointer;display:flex;align-items:center;gap:.5rem;color:#334155;transition:all .2s}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-right .more-actions-btn:hover{background:#f1f5f9}.state-machine-ui .issue-tracker .issue-main-content{display:grid;grid-template-columns:320px 1fr;gap:2rem;padding:2rem}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section{margin-bottom:2rem}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section h3{margin:0 0 1rem;font-size:1rem;font-weight:600;color:#1e293b}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row{display:flex;padding:.625rem 0;border-bottom:1px solid #f1f5f9}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row:last-child{border-bottom:none}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row label{min-width:100px;font-size:.8125rem;color:#64748b;font-weight:500}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value{display:flex;align-items:center;gap:.5rem;font-size:.875rem;color:#1e293b}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value i{font-size:1rem}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value .status-badge{padding:.25rem .625rem;border-radius:4px;color:#fff;font-weight:600;font-size:.75rem;text-transform:uppercase}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value .view-workflow-link{color:#3b82f6;font-size:.8125rem;text-decoration:none;margin-left:.5rem}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value .view-workflow-link:hover{text-decoration:underline}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value .user-avatar{width:24px;height:24px;border-radius:50%;background:#8b5cf6;color:#fff;display:flex;align-items:center;justify-content:center;font-size:.75rem}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz{background:#f8fafc;border-radius:8px;padding:1.5rem;border:1px solid #e2e8f0}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz h3{margin:0 0 1rem;font-size:.875rem;font-weight:600;color:#1e293b}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state{display:flex;flex-direction:column;align-items:center;gap:.375rem;opacity:.4;transition:opacity .2s}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state.active,.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state.completed{opacity:1}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state .state-circle{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;font-size:.875rem;box-shadow:0 2px 4px #0000001a}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state .state-name{font-size:.6875rem;color:#64748b;font-weight:500}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state.active .state-name{color:#1e293b;font-weight:600}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-arrow{color:#cbd5e1;font-size:.75rem;margin:0 .25rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .description-section,.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section{margin-bottom:2rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .description-section h3,.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section h3{margin:0 0 1rem;font-size:1rem;font-weight:600;color:#1e293b}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .description-section .description-content,.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .description-content{padding:1rem;background:#f8fafc;border-radius:6px;border:1px solid #e2e8f0}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .description-section .description-content p,.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .description-content p{margin:0;color:#475569;line-height:1.7;font-size:.875rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline{display:flex;flex-direction:column;gap:1rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item{display:flex;gap:.75rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-avatar{width:32px;height:32px;border-radius:50%;background:#8b5cf6;color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:.875rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content{flex:1;padding-bottom:1rem;border-bottom:1px solid #f1f5f9}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content .activity-header{font-size:.875rem;color:#334155;line-height:1.6;margin-bottom:.375rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content .activity-header strong{color:#1e293b;font-weight:600}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content .activity-header .activity-action{color:#64748b}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content .activity-meta{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;color:#94a3b8}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content .activity-meta .activity-label{color:#8b5cf6;font-weight:500}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item:last-child .activity-content{border-bottom:none;padding-bottom:0}.registration-ui{display:flex;justify-content:center;align-items:center;min-height:400px}.registration-ui .registration-card{background:#fff;border-radius:12px;padding:3rem;box-shadow:0 4px 6px #0000000d;text-align:center;max-width:500px}.registration-ui .registration-card .registration-icon{margin-bottom:1.5rem}.registration-ui .registration-card .registration-icon i{font-size:5rem;color:#8b5cf6}.registration-ui .registration-card h3{margin:0 0 .75rem;color:#1e293b;font-size:1.75rem;font-weight:700}.registration-ui .registration-card .registration-desc{margin:0 0 2rem;color:#64748b;line-height:1.7}.registration-ui .registration-card .registration-progress{padding:2rem;background:#fef3c7;border-radius:8px}.registration-ui .registration-card .registration-progress .progress-spinner{margin-bottom:1rem}.registration-ui .registration-card .registration-progress .progress-spinner i{font-size:3rem;color:#f59e0b}.registration-ui .registration-card .registration-progress p{margin:0;color:#92400e;font-weight:500}.registration-ui .registration-card .registration-success{padding:2rem;background:#f0fdf4;border-radius:8px}.registration-ui .registration-card .registration-success i{font-size:4rem;color:#10b981;margin-bottom:1rem}.registration-ui .registration-card .registration-success h4{margin:0 0 .5rem;color:#064e3b;font-size:1.5rem;font-weight:700}.registration-ui .registration-card .registration-success p{margin:0;color:#065f46}.default-execution-view{display:flex;justify-content:center;align-items:center;min-height:400px}.default-execution-view .execution-status{text-align:center;padding:3rem;background:#fff;border-radius:12px;box-shadow:0 4px 6px #0000000d;min-width:400px}.default-execution-view .execution-status i{font-size:5rem;margin-bottom:1.5rem}.default-execution-view .execution-status h3{margin:0 0 .75rem;font-size:1.75rem;font-weight:700}.default-execution-view .execution-status p{margin:0;color:#64748b;line-height:1.7}.default-execution-view .execution-status .status-running i{color:#f59e0b}.default-execution-view .execution-status .status-finished i{color:#10b981}.default-execution-view .execution-status .status-error i{color:#ef4444}.execution-logs-panel{margin-top:2rem;background:#fff;border-radius:12px;padding:1.5rem;box-shadow:0 4px 6px #0000000d}.execution-logs-panel h3{display:flex;align-items:center;gap:.5rem;margin:0 0 1rem;color:#1e293b;font-size:1.125rem}.execution-logs-panel h3 i{color:#8b5cf6}.execution-logs-panel .logs-container-compact{max-height:300px;overflow-y:auto;background:#f8fafc;border-radius:8px;padding:.75rem}.execution-logs-panel .logs-container-compact .log-item-compact{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-radius:6px;margin-bottom:.5rem;font-size:.875rem}.execution-logs-panel .logs-container-compact .log-item-compact:last-child{margin-bottom:0}.execution-logs-panel .logs-container-compact .log-item-compact .log-time{font-family:Courier New,monospace;color:#64748b;font-size:.8125rem;min-width:70px}.execution-logs-panel .logs-container-compact .log-item-compact .log-icon{display:flex;align-items:center;justify-content:center;width:20px}.execution-logs-panel .logs-container-compact .log-item-compact .log-icon i{font-size:1rem}.execution-logs-panel .logs-container-compact .log-item-compact .log-message{flex:1;color:#334155}.execution-logs-panel .logs-container-compact .log-item-compact.log-info{background:#eff6ff}.execution-logs-panel .logs-container-compact .log-item-compact.log-info .log-icon i{color:#3b82f6}.execution-logs-panel .logs-container-compact .log-item-compact.log-success{background:#f0fdf4}.execution-logs-panel .logs-container-compact .log-item-compact.log-success .log-icon i{color:#10b981}.execution-logs-panel .logs-container-compact .log-item-compact.log-warning{background:#fffbeb}.execution-logs-panel .logs-container-compact .log-item-compact.log-warning .log-icon i{color:#f59e0b}.execution-logs-panel .logs-container-compact .log-item-compact.log-error{background:#fef2f2}.execution-logs-panel .logs-container-compact .log-item-compact.log-error .log-icon i{color:#ef4444}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-10px)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: i2$1.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "color", "look", "fitParent", "selection"], outputs: ["onBlur", "onFocus", "lookChange", "colorChange", "disabledChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i2$1.AXButtonGroupItemComponent, selector: "ax-button-group-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i4.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i5.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXSwitchModule }, { kind: "component", type: i6.AXSwitchComponent, selector: "ax-switch", inputs: ["disabled", "readonly", "color", "tabIndex", "value", "name", "isLoading"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged", "readonlyChange", "disabledChange"] }, { kind: "ngmodule", type: AXTabsModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXPPropertyViewerComponent, selector: "axp-property-viewer", inputs: ["tabsInput", "mode", "bindingExpressionEditorMode"], outputs: ["onChanged"] }, { 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: "component", type: AXPThemeLayoutHeaderComponent, selector: "axp-layout-header" }, { kind: "component", type: AXPThemeLayoutToolbarComponent, selector: "axp-layout-toolbar" }, { kind: "component", type: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "component", type: AXMActivityCategoriesTreeComponent, selector: "axp-activity-categories-tree", outputs: ["categoryClick", "activityClick", "activityDragStart"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.JsonPipe, name: "json" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: i8.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5637
+ ], viewQueries: [{ propertyName: "propertyViewerRef", first: true, predicate: AXPPropertyViewerComponent, descendants: true, isSignal: true }, { propertyName: "canvasAreaRef", first: true, predicate: ["canvasAreaRef"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout>\n <axp-layout-start-side>\n <axp-layout-header>\n <axp-layout-title>{{ '@workflow-management:activities.menus.activity-categories.title' | translate | async }}</axp-layout-title>\n <axp-layout-toolbar>\n <ax-search-box\n [delayTime]=\"300\"\n [placeholder]=\"'@workflow-management:workflow-studio.components.activity-categories-tree.search-placeholder' | translate | async\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </axp-layout-toolbar>\n </axp-layout-header>\n <axp-layout-content>\n <axp-activity-categories-tree\n (categoryClick)=\"onCategoryClick($event)\"\n (activityClick)=\"onActivityClick($event)\"\n (activityDragStart)=\"onActivityDragStartFromTree($event)\"\n ></axp-activity-categories-tree>\n </axp-layout-content>\n </axp-layout-start-side>\n\n <axp-page-toolbar>\n <axp-layout-prefix>\n <!-- JSON / Visual toggle (same pattern as report view mode) -->\n <div class=\"studio-editor-tabs\">\n <ax-button-group class=\"ax-sm\" [selection]=\"'single'\">\n <ax-button-group-item (onClick)=\"switchTab('json')\" text=\"{{ '@workflow-management:workflow-studio.terms.json-editor' | translate | async }}\" [selected]=\"activeTab() === 'json'\">\n <ax-prefix>\n <i class=\"fa-light fa-code\"></i>\n </ax-prefix>\n </ax-button-group-item>\n <ax-button-group-item (onClick)=\"switchTab('visual')\" text=\"{{ '@workflow-management:workflow-studio.terms.visual-designer' | translate | async }}\" [selected]=\"activeTab() === 'visual'\">\n <ax-prefix>\n <i class=\"fa-light fa-diagram-project\"></i>\n </ax-prefix>\n </ax-button-group-item>\n </ax-button-group>\n </div>\n </axp-layout-prefix>\n </axp-page-toolbar>\n\n <axp-page-content>\n <div class=\"workflow-studio\">\n <!-- Main Layout -->\n <div class=\"studio-body\" [class.properties-hidden]=\"!showPropertiesPanel()\">\n\n <!-- Editor -->\n <div class=\"studio-editor\">\n <!-- Tab Content -->\n <div class=\"editor-content\">\n <!-- JSON Tab -->\n @if (activeTab() === 'json') {\n <div class=\"json-tab\">\n <textarea class=\"json-editor\" [value]=\"workflowJson()\"\n (input)=\"onWorkflowJsonInput($event)\"\n [placeholder]=\"'@workflow-management:workflow-studio.components.json-editor.placeholder' | translate | async\"\n spellcheck=\"false\"></textarea>\n </div>\n }\n\n <!-- Visual Tab -->\n @if (activeTab() === 'visual') {\n <div class=\"visual-tab\">\n <!-- Canvas -->\n <div class=\"visual-canvas\">\n <div class=\"canvas-toolbar\">\n <ax-button look=\"blank\" class=\"ax-sm\" [attr.title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.zoom-to-fit.title' | translate | async\" (onClick)=\"canvasZoomToFit()\">\n <ax-prefix><i class=\"fa-light fa-expand\"></i></ax-prefix>\n </ax-button>\n <ax-button look=\"blank\" class=\"ax-sm\" [attr.title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.center.title' | translate | async\" (onClick)=\"canvasCenter()\">\n <ax-prefix><i class=\"fa-light fa-crosshairs\"></i></ax-prefix>\n </ax-button>\n <ax-button look=\"blank\" class=\"ax-sm\" [attr.title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.auto-layout.title' | translate | async\" (onClick)=\"canvasAutoLayout()\">\n <ax-prefix><i class=\"fa-light fa-sitemap\"></i></ax-prefix>\n </ax-button>\n <span class=\"toolbar-sep\"></span>\n <label class=\"toolbar-auto-save\">\n <ax-switch [value]=\"autoSaveEnabled()\" (valueChange)=\"autoSaveEnabled.set($event)\"></ax-switch>\n <span>{{ '@workflow-management:workflow-studio.components.canvas-toolbar.auto-save' | translate | async }}</span>\n </label>\n <span class=\"toolbar-sep\"></span>\n <ax-button look=\"blank\" class=\"ax-sm\" [attr.title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.clear-canvas.title' | translate | async\" (onClick)=\"clearCanvas()\">\n <ax-prefix><i class=\"fa-light fa-trash\"></i></ax-prefix>\n </ax-button>\n <ax-button look=\"blank\" class=\"ax-sm\" [attr.title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.convert-to-json.title' | translate | async\" (onClick)=\"visualToJson()\">\n <ax-prefix><i class=\"fa-light fa-code\"></i></ax-prefix>\n </ax-button>\n <span class=\"tool-info\">\n <i class=\"fa-light fa-lightbulb\"></i>\n <strong>{{ '@workflow-management:workflow-studio.components.canvas-toolbar.hint' | translate | async }}</strong>\n </span>\n </div>\n\n <div #canvasAreaRef class=\"canvas-area\" (drop)=\"onCanvasDrop($event)\" (dragover)=\"onCanvasDragOver($event)\"\n (dragleave)=\"onCanvasDragLeave($event)\">\n <!-- SVG for Connections -->\n <svg class=\"connections-layer\">\n <!-- Outcome-based Connections -->\n @for (node of visualNodes(); track node.id) {\n @if (node.outcomeConnections && node.outcomeConnections.length > 0) {\n @for (conn of node.outcomeConnections; track conn.targetNodeId + conn.outcome) {\n @let targetNode = findNodeById(conn.targetNodeId);\n @if (targetNode) {\n <g class=\"outcome-connection-group\">\n <line [attr.x1]=\"node.position.x + 75\" [attr.y1]=\"node.position.y + 80\"\n [attr.x2]=\"targetNode.position.x + 75\" [attr.y2]=\"targetNode.position.y - 50\"\n class=\"connection-line outcome-line\" [attr.stroke]=\"getOutcomeColor(conn.outcome)\"\n stroke-width=\"2.5\"\n [attr.marker-end]=\"'url(#arrowhead-' + getOutcomeColorName(conn.outcome) + ')'\"\n style=\"cursor: pointer\" (dblclick)=\"disconnectNodes(node.id, conn.targetNodeId, conn.outcome)\"\n [attr.title]=\"'Outcome: ' + conn.outcome + ' (Double-click to remove)'\">\n <title>{{ conn.outcome }} \u00E2\u2020\u2019 {{ targetNode.name }}</title>\n </line>\n <text [attr.x]=\"(node.position.x + targetNode.position.x) / 2 + 75\"\n [attr.y]=\"(node.position.y + targetNode.position.y) / 2 + 15\" class=\"connection-label\"\n text-anchor=\"middle\" dominant-baseline=\"middle\" [attr.fill]=\"getOutcomeColor(conn.outcome)\" font-size=\"11\"\n font-weight=\"600\" pointer-events=\"none\">\n {{ conn.outcome }}\n </text>\n </g>\n }\n }\n } @else {\n <!-- Simple Connections (backward compatibility) -->\n @for (targetId of node.connections; track targetId) {\n @let targetNode = findNodeById(targetId);\n @if (targetNode) {\n @let sx = node.position.x + 75;\n @let sy = node.position.y + 40;\n @let tx = targetNode.position.x + 75;\n @let ty = targetNode.position.y - 50;\n @let pathD = getConnectionPath(sx, sy, tx, ty);\n <g class=\"connection-group\">\n <path [attr.d]=\"pathD\" class=\"connection-line connection-hit\" fill=\"none\" stroke=\"transparent\"\n stroke-width=\"16\" pointer-events=\"stroke\" (dblclick)=\"disconnectNodes(node.id, targetId)\">\n </path>\n <path [attr.d]=\"pathD\" class=\"connection-line\" fill=\"none\" stroke=\"#64748b\" stroke-width=\"2\"\n stroke-linecap=\"round\" marker-end=\"url(#arrowhead-default)\" pointer-events=\"none\">\n </path>\n <title>{{ '@workflow-management:workflow-studio.components.canvas-toolbar.connection-remove-hint' | translate | async }}</title>\n </g>\n }\n }\n }\n }\n\n <defs>\n <!-- Arrow markers: larger, rounded tip on line end (refX so tip touches path end) -->\n <marker id=\"arrowhead-default\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#64748b\" />\n </marker>\n <marker id=\"arrowhead-primary\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#8b5cf6\" />\n </marker>\n <marker id=\"arrowhead-success\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#10b981\" />\n </marker>\n <marker id=\"arrowhead-error\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#ef4444\" />\n </marker>\n <marker id=\"arrowhead-warning\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#f59e0b\" />\n </marker>\n <marker id=\"arrowhead-info\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"4\" orient=\"auto\">\n <polygon points=\"0 0, 12 4, 0 8\" fill=\"#3b82f6\" />\n </marker>\n </defs>\n </svg>\n\n <!-- Nodes -->\n @for (node of visualNodes(); track node.id) {\n <div class=\"visual-node\" [class.selected]=\"selectedNode()?.id === node.id\"\n [style.left.px]=\"node.position.x\" [style.top.px]=\"node.position.y\" [attr.data-node-id]=\"node.id\"\n draggable=\"true\" (dragstart)=\"onNodeDragStart($event, node)\" (drag)=\"onNodeDrag($event, node)\"\n (dragend)=\"onNodeDragEnd($event, node)\" (click)=\"selectNodeById(node)\">\n <div class=\"node-header\">\n <i [class]=\"node.icon\"></i>\n <span>{{ node.name }}</span>\n <span class=\"node-delete-wrap\" (click)=\"$event.stopPropagation()\">\n <ax-button look=\"blank\" size=\"sm\" class=\"node-delete\" (onClick)=\"deleteNodeFromCanvas(node.id)\">\n <ax-prefix><i class=\"fa-light fa-times\"></i></ax-prefix>\n </ax-button>\n </span>\n </div>\n\n <div class=\"node-body\">\n <small>{{ node.type }}</small>\n </div>\n\n <div class=\"node-connectors\">\n <!-- Input Connector -->\n <div class=\"connector connector-in\" title=\"Input\" (click)=\"onConnectorClick($event, node, 'in')\">\n </div>\n\n <!-- Output Connectors - Multiple outcomes support -->\n @if (node.outcomes && node.outcomes.length > 1) {\n <!-- Multiple outcomes: show separate port for each -->\n <div class=\"outcomes-container\">\n @for (outcome of node.outcomes; track outcome; let idx = $index) {\n <div class=\"outcome-connector\" [class.active]=\"\n connectionSource?.node?.id === node.id && connectionSource?.outcome === outcome\n \" [attr.data-outcome]=\"outcome\" [title]=\"'Output: ' + outcome\"\n (click)=\"onOutcomeConnectorClick($event, node, outcome)\">\n <span class=\"outcome-label\">{{ outcome }}</span>\n <div class=\"outcome-dot\"></div>\n </div>\n }\n </div>\n } @else {\n <!-- Single outcome: show simple output connector -->\n <div class=\"connector connector-out\" [class.active]=\"connectionSource?.node?.id === node.id\"\n title=\"Output\" (click)=\"onConnectorClick($event, node, 'out')\"></div>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n @if (visualNodes().length === 0) {\n <div class=\"canvas-empty-state\">\n <i class=\"fa-light fa-diagram-project\"></i>\n <p>{{ '@workflow-management:workflow-studio.components.canvas-empty-state.title' | translate | async }}</p>\n <small>{{ '@workflow-management:workflow-studio.components.canvas-empty-state.description' | translate | async }}</small>\n </div>\n }\n </div>\n </div>\n\n <!-- Workflow Panel (when no node selected, Elsa-style) -->\n @if (!selectedNode() && showPropertiesPanel()) {\n <div class=\"properties-panel workflow-panel\">\n <div class=\"properties-header\">\n <i class=\"fa-light fa-diagram-project\"></i>\n <h4>{{ '@workflow-management:workflow-studio.components.workflow-panel.title' | translate | async }}</h4>\n <div class=\"header-actions\">\n <ax-button look=\"blank\" size=\"sm\" [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.close-panel' | translate | async\" (onClick)=\"togglePropertiesPanel()\">\n <ax-prefix><i class=\"fa-light fa-angle-right\"></i></ax-prefix>\n </ax-button>\n </div>\n </div>\n <div class=\"properties-body\">\n <section class=\"workflow-panel-section\">\n <h5>{{ '@workflow-management:workflow-studio.components.workflow-panel.metadata' | translate | async }}</h5>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.workflow-panel.name' | translate | async }}</label>\n <ax-text-box class=\"form-input\" [value]=\"workflowSettings().name\" [disabled]=\"true\" />\n </div>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.workflow-panel.description' | translate | async }}</label>\n <ax-text-box class=\"form-input\" [value]=\"workflowSettings().description\" [disabled]=\"true\" />\n </div>\n </section>\n <div class=\"properties-divider\"></div>\n <section class=\"workflow-panel-section\">\n <h5>{{ '@workflow-management:workflow-studio.components.workflow-panel.information' | translate | async }}</h5>\n <div class=\"workflow-info-table\">\n <div class=\"workflow-info-row\">\n <span class=\"info-label\">{{ '@workflow-management:workflow-studio.components.workflow-panel.definition-id' | translate | async }}</span>\n <span class=\"info-actions\">\n <ax-button look=\"blank\" size=\"sm\" [title]=\"'@workflow-management:workflow-studio.components.workflow-panel.copy' | translate | async\" (onClick)=\"copyDefinitionIdToClipboard()\">\n <ax-prefix><i class=\"fa-light fa-copy\"></i></ax-prefix>\n </ax-button>\n </span>\n <span class=\"info-value\">{{ workflowSettings().definitionId || 'new-workflow' }}</span>\n </div>\n <div class=\"workflow-info-row\">\n <span class=\"info-label\">{{ '@workflow-management:workflow-studio.components.workflow-panel.version' | translate | async }}</span>\n <span class=\"info-value\">{{ workflowSettings().version }}</span>\n </div>\n <div class=\"workflow-info-row\">\n <span class=\"info-label\">{{ '@workflow-management:workflow-studio.components.workflow-panel.status' | translate | async }}</span>\n <span class=\"info-value\">{{ workflowSettings().isPublished ? ('@workflow-management:workflow-studio.components.workflow-panel.published' | translate | async) : ('@workflow-management:workflow-studio.components.workflow-panel.draft' | translate | async) }}</span>\n </div>\n <div class=\"workflow-info-row\">\n <span class=\"info-label\">{{ '@workflow-management:workflow-studio.components.workflow-panel.usable-as-activity' | translate | async }}</span>\n <span class=\"info-value\">{{ workflowSettings().usableAsActivity ? ('@general:terms.common.yes-no.yes' | translate | async) : ('@general:terms.common.yes-no.no' | translate | async) }}</span>\n </div>\n </div>\n </section>\n <p class=\"properties-hint\">{{ '@workflow-management:workflow-studio.components.workflow-panel.settings-hint' | translate | async }}</p>\n </div>\n </div>\n }\n\n <!-- Properties Panel (when a node is selected) -->\n @if (selectedNode() && showPropertiesPanel()) {\n <div class=\"properties-panel\">\n <div class=\"properties-header\">\n <i class=\"fa-light fa-sliders\"></i>\n <h4>{{ '@workflow-management:workflow-studio.components.properties-panel.title' | translate | async }}</h4>\n <div class=\"header-actions\">\n <ax-button look=\"blank\" size=\"sm\" [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.close-panel' | translate | async\" (onClick)=\"togglePropertiesPanel()\">\n <ax-prefix><i class=\"fa-light fa-angle-right\"></i></ax-prefix>\n </ax-button>\n <ax-button look=\"blank\" size=\"sm\" [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.close' | translate | async\" (onClick)=\"selectedNode.set(null)\">\n <ax-prefix><i class=\"fa-light fa-times\"></i></ax-prefix>\n </ax-button>\n </div>\n </div>\n <div class=\"properties-body\">\n @if (propertyViewerTabs().length > 0) {\n <div class=\"properties-widget-section\">\n <axp-property-viewer\n #propertyViewerRef\n [tabsInput]=\"propertyViewerTabs()\"\n [mode]=\"'simple'\"\n (onChanged)=\"onPropertyViewerChanged($event)\">\n </axp-property-viewer>\n </div>\n } @else {\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.id' | translate | async }}:</label>\n <ax-text-box class=\"form-input\" [value]=\"selectedNode()!.id\" [disabled]=\"true\" />\n </div>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.type' | translate | async }}:</label>\n <ax-text-box class=\"form-input\" [value]=\"selectedNode()!.type\" [disabled]=\"true\" />\n </div>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.name' | translate | async }}:</label>\n <ax-text-box class=\"form-input\" [value]=\"selectedNode()!.name\"\n (valueChange)=\"updateNodeProperty(selectedNode()!.id, 'name', $event)\" />\n </div>\n <p class=\"no-properties\">\n {{ '@workflow-management:workflow-studio.components.properties-panel.empty-states.no-properties' | translate | async }}\n </p>\n }\n\n <div class=\"properties-divider\"></div>\n\n\n <h5>\u00F0\u0178\u201D\u2014 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.connections' | translate | async }}</h5>\n <small class=\"properties-hint\">{{ '@workflow-management:workflow-studio.components.properties-panel.sections.connections-hint' | translate | async }}</small>\n\n <!-- Outcome-based Connections -->\n @if (selectedNode()!.outcomeConnections && selectedNode()!.outcomeConnections!.length > 0) {\n <div class=\"connections-list\">\n @for (conn of selectedNode()!.outcomeConnections!; track conn.targetNodeId + conn.outcome) {\n @let targetNode = findNodeById(conn.targetNodeId);\n @if (targetNode) {\n <div class=\"connection-item outcome-connection\">\n <span class=\"outcome-badge\" [style.background]=\"getOutcomeColor(conn.outcome)\">\n {{ conn.outcome }}\n </span>\n <i class=\"fa-light fa-arrow-right\"></i>\n <span>{{ targetNode.name }}</span>\n <ax-button look=\"blank\" size=\"sm\" class=\"remove-btn\"\n [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.remove-connection' | translate | async\"\n (onClick)=\"disconnectNodes(selectedNode()!.id, conn.targetNodeId, conn.outcome)\">\n <ax-prefix><i class=\"fa-light fa-times\"></i></ax-prefix>\n </ax-button>\n </div>\n }\n }\n </div>\n } @else if (selectedNode()!.connections.length > 0) {\n <!-- Simple Connections (fallback) -->\n <div class=\"connections-list\">\n @for (targetId of selectedNode()!.connections; track targetId) {\n @let targetNode = findNodeById(targetId);\n @if (targetNode) {\n <div class=\"connection-item\">\n <i class=\"fa-light fa-arrow-right\"></i>\n <span>{{ targetNode.name }}</span>\n <ax-button look=\"blank\" size=\"sm\" class=\"remove-btn\"\n [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.remove-connection' | translate | async\"\n (onClick)=\"disconnectNodes(selectedNode()!.id, targetId)\">\n <ax-prefix><i class=\"fa-light fa-times\"></i></ax-prefix>\n </ax-button>\n </div>\n }\n }\n </div>\n } @else {\n <p class=\"no-properties\">{{ '@workflow-management:workflow-studio.components.properties-panel.empty-states.no-connections' | translate | async }}</p>\n }\n\n <!-- Available Outcomes Info -->\n @if (selectedNode()!.outcomes && selectedNode()!.outcomes!.length > 1) {\n <div class=\"properties-divider\"></div>\n <h5>\u00F0\u0178\u201C\u00A4 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.available-outcomes' | translate | async }}</h5>\n <small class=\"properties-hint\">{{ '@workflow-management:workflow-studio.components.properties-panel.sections.available-outcomes-hint' | translate | async }}</small>\n <div class=\"outcomes-info\">\n @for (outcome of selectedNode()!.outcomes!; track outcome) {\n <span class=\"outcome-tag\" [style.borderColor]=\"getOutcomeColor(outcome)\">\n <span class=\"outcome-dot\" [style.background]=\"getOutcomeColor(outcome)\"></span>\n {{ outcome }}\n </span>\n }\n </div>\n }\n\n <div class=\"properties-divider\"></div>\n\n <h5>\u00F0\u0178\u201C\u009D {{ '@workflow-management:workflow-studio.components.properties-panel.sections.raw-json' | translate | async }}</h5>\n <pre class=\"properties-json\">{{ selectedNode() | json }}</pre>\n </div>\n </div>\n }\n\n <!-- Toggle Button for Properties (when closed) -->\n @if (!showPropertiesPanel()) {\n <ax-button look=\"blank\" class=\"sidebar-toggle-btn right\" (onClick)=\"togglePropertiesPanel()\"\n [title]=\"selectedNode() ? ('@workflow-management:workflow-studio.components.properties-panel.actions.show-panel' | translate | async) : ('@workflow-management:workflow-studio.components.workflow-panel.show-panel' | translate | async)\">\n <ax-prefix><i class=\"fa-light fa-sliders\"></i></ax-prefix>\n </ax-button>\n }\n </div>\n }\n </div>\n </div>\n\n </div>\n\n <!-- Workflow Settings: opened via Layout Builder dialog in openWorkflowSettings() -->\n\n <!-- Workflow Execution Dialog -->\n @if (showExecutionDialog()) {\n <div class=\"execution-dialog-overlay\" (click)=\"closeExecutionDialog()\">\n <div class=\"execution-dialog\" (click)=\"$event.stopPropagation()\">\n <!-- Dialog Header -->\n <div class=\"execution-dialog-header\">\n <div class=\"header-content\">\n <i class=\"fa-light fa-play-circle\"></i>\n <div class=\"header-info\">\n <h2>{{ '@workflow-management:test-pages.workflow-studio.actions.execute-workflow.title' | translate |\n async }}</h2>\n <p>{{ '@workflow-management:test-pages.workflow-studio.actions.execute-workflow.description' | translate\n | async }}</p>\n </div>\n </div>\n <ax-button look=\"blank\" size=\"sm\" class=\"close-btn\" [disabled]=\"isExecuting()\" (onClick)=\"closeExecutionDialog()\">\n <ax-prefix><i class=\"fa-light fa-times\"></i></ax-prefix>\n </ax-button>\n </div>\n\n <!-- Dialog Body -->\n <div class=\"execution-dialog-body\">\n <!-- Workflow Info Panel (Before Execution) -->\n @if (!workflowInstanceState()) {\n <div class=\"workflow-info-panel\">\n <div class=\"start-section\">\n <div class=\"start-illustration\">\n <i class=\"fa-light fa-rocket\"></i>\n </div>\n <h3>{{ '@workflow-management:test-pages.workflow-studio.messages.info.ready-to-execute' | translate |\n async }}</h3>\n <p>{{ '@workflow-management:test-pages.workflow-studio.messages.info.click-to-start' | translate | async\n }}</p>\n <ax-button\n [text]=\"'@workflow-management:test-pages.workflow-studio.actions.start-execution.title' | translate | async\"\n color=\"success\" size=\"lg\" (onClick)=\"startWorkflowExecution()\">\n </ax-button>\n </div>\n </div>\n }\n\n\n <!-- Custom UI for Registration -->\n @if (false) {\n <div class=\"registration-ui\">\n <div class=\"registration-card\">\n <div class=\"registration-icon\">\n <i class=\"fa-light fa-user-circle\"></i>\n </div>\n <h3>\u00D9\u0081\u00D8\u00B1\u00D8\u00A2\u00DB\u0152\u00D9\u2020\u00D8\u00AF \u00D8\u00AB\u00D8\u00A8\u00D8\u00AA\u00E2\u20AC\u0152\u00D9\u2020\u00D8\u00A7\u00D9\u2026</h3>\n <p class=\"registration-desc\">\n \u00D8\u00A7\u00DB\u0152\u00D9\u2020 \u00D9\u0081\u00D9\u201E\u00D9\u02C6 \u00D8\u00B4\u00D8\u00A7\u00D9\u2026\u00D9\u201E \u00DA\u2020\u00D9\u2020\u00D8\u00AF \u00D9\u2026\u00D8\u00B1\u00D8\u00AD\u00D9\u201E\u00D9\u2021 \u00D8\u00A7\u00D8\u00B3\u00D8\u00AA \u00DA\u00A9\u00D9\u2021 \u00D8\u00AF\u00D8\u00A7\u00D8\u00AF\u00D9\u2021\u00E2\u20AC\u0152\u00D9\u2021\u00D8\u00A7\u00DB\u0152 \u00DA\u00A9\u00D8\u00A7\u00D8\u00B1\u00D8\u00A8\u00D8\u00B1 \u00D8\u00B1\u00D8\u00A7 \u00D8\u00AC\u00D9\u2026\u00D8\u00B9\u00E2\u20AC\u0152\u00D8\u00A2\u00D9\u02C6\u00D8\u00B1\u00DB\u0152 \u00DA\u00A9\u00D8\u00B1\u00D8\u00AF\u00D9\u2021 \u00D9\u02C6 \u00D8\u00AF\u00D8\u00B1 \u00D9\u2020\u00D9\u2021\u00D8\u00A7\u00DB\u0152\u00D8\u00AA \u00D8\u00AD\u00D8\u00B3\u00D8\u00A7\u00D8\u00A8 \u00DA\u00A9\u00D8\u00A7\u00D8\u00B1\u00D8\u00A8\u00D8\u00B1\u00DB\u0152 \u00D8\u00A7\u00DB\u0152\u00D8\u00AC\u00D8\u00A7\u00D8\u00AF \u00D9\u2026\u00DB\u0152\u00E2\u20AC\u0152\u00DA\u00A9\u00D9\u2020\u00D8\u00AF.\n </p>\n\n @if (workflowInstanceState()?.status === 'running') {\n <div class=\"registration-progress\">\n <div class=\"progress-spinner\">\n <i class=\"fa-light fa-spinner-third fa-spin\"></i>\n </div>\n <p>\u00D8\u00AF\u00D8\u00B1 \u00D8\u00AD\u00D8\u00A7\u00D9\u201E \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7\u00DB\u0152 \u00D9\u2026\u00D8\u00B1\u00D8\u00A7\u00D8\u00AD\u00D9\u201E \u00D8\u00AB\u00D8\u00A8\u00D8\u00AA\u00E2\u20AC\u0152\u00D9\u2020\u00D8\u00A7\u00D9\u2026...</p>\n </div>\n }\n\n @if (workflowInstanceState()?.status === 'finished') {\n <div class=\"registration-success\">\n <i class=\"fa-light fa-check-circle\"></i>\n <h4>\u00D8\u00AB\u00D8\u00A8\u00D8\u00AA\u00E2\u20AC\u0152\u00D9\u2020\u00D8\u00A7\u00D9\u2026 \u00D8\u00A8\u00D8\u00A7 \u00D9\u2026\u00D9\u02C6\u00D9\u0081\u00D9\u201A\u00DB\u0152\u00D8\u00AA \u00D8\u00A7\u00D9\u2020\u00D8\u00AC\u00D8\u00A7\u00D9\u2026 \u00D8\u00B4\u00D8\u00AF!</h4>\n <p>\u00D8\u00AD\u00D8\u00B3\u00D8\u00A7\u00D8\u00A8 \u00DA\u00A9\u00D8\u00A7\u00D8\u00B1\u00D8\u00A8\u00D8\u00B1\u00DB\u0152 \u00D8\u00B4\u00D9\u2026\u00D8\u00A7 \u00D8\u00A7\u00DB\u0152\u00D8\u00AC\u00D8\u00A7\u00D8\u00AF \u00D8\u00B4\u00D8\u00AF \u00D9\u02C6 \u00D8\u00A8\u00D9\u2021 \u00D8\u00B2\u00D9\u02C6\u00D8\u00AF\u00DB\u0152 \u00D8\u00A8\u00D9\u2021 \u00D8\u00AF\u00D8\u00A7\u00D8\u00B4\u00D8\u00A8\u00D9\u02C6\u00D8\u00B1\u00D8\u00AF \u00D9\u2026\u00D9\u2020\u00D8\u00AA\u00D9\u201A\u00D9\u201E \u00D8\u00AE\u00D9\u02C6\u00D8\u00A7\u00D9\u2021\u00DB\u0152\u00D8\u00AF \u00D8\u00B4\u00D8\u00AF.</p>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Default Execution View -->\n @if (workflowInstanceState()) {\n <div class=\"default-execution-view\">\n <div class=\"execution-status\">\n @if (workflowInstanceState()?.status === 'running') {\n <div class=\"status-running\">\n <i class=\"fa-light fa-spinner-third fa-spin\"></i>\n <h3>\u00D8\u00AF\u00D8\u00B1 \u00D8\u00AD\u00D8\u00A7\u00D9\u201E \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7...</h3>\n <p>Workflow \u00D8\u00AF\u00D8\u00B1 \u00D8\u00AD\u00D8\u00A7\u00D9\u201E \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7 \u00D8\u00A7\u00D8\u00B3\u00D8\u00AA. \u00D9\u201E\u00D8\u00B7\u00D9\u0081\u00D8\u00A7\u00D9\u2039 \u00D8\u00B5\u00D8\u00A8\u00D8\u00B1 \u00DA\u00A9\u00D9\u2020\u00DB\u0152\u00D8\u00AF.</p>\n </div>\n }\n\n @if (workflowInstanceState()?.status === 'finished') {\n <div class=\"status-finished\">\n <i class=\"fa-light fa-check-circle\"></i>\n <h3>\u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7 \u00D8\u00A8\u00D8\u00A7 \u00D9\u2026\u00D9\u02C6\u00D9\u0081\u00D9\u201A\u00DB\u0152\u00D8\u00AA \u00D8\u00AA\u00DA\u00A9\u00D9\u2026\u00DB\u0152\u00D9\u201E \u00D8\u00B4\u00D8\u00AF</h3>\n <p>Workflow \u00D8\u00A8\u00D8\u00A7 \u00D9\u2026\u00D9\u02C6\u00D9\u0081\u00D9\u201A\u00DB\u0152\u00D8\u00AA \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7 \u00D8\u00B4\u00D8\u00AF \u00D9\u02C6 \u00D8\u00AA\u00D9\u2026\u00D8\u00A7\u00D9\u2026 Activities \u00D8\u00A7\u00D9\u2020\u00D8\u00AC\u00D8\u00A7\u00D9\u2026 \u00D8\u00B4\u00D8\u00AF\u00D9\u2020\u00D8\u00AF.</p>\n </div>\n }\n\n @if (workflowInstanceState()?.status === 'error') {\n <div class=\"status-error\">\n <i class=\"fa-light fa-times-circle\"></i>\n <h3>\u00D8\u00AE\u00D8\u00B7\u00D8\u00A7 \u00D8\u00AF\u00D8\u00B1 \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7</h3>\n <p>{{ workflowInstanceState()?.error }}</p>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Execution Logs Panel -->\n @if (workflowInstanceState() && executionLogs().length > 0) {\n <div class=\"execution-logs-panel\">\n <h3><i class=\"fa-light fa-terminal\"></i> \u00D9\u201E\u00D8\u00A7\u00DA\u00AF\u00E2\u20AC\u0152\u00D9\u2021\u00D8\u00A7\u00DB\u0152 \u00D8\u00A7\u00D8\u00AC\u00D8\u00B1\u00D8\u00A7</h3>\n <div class=\"logs-container-compact\">\n @for (log of executionLogs(); track $index) {\n <div class=\"log-item-compact\" [class]=\"'log-' + log.level\">\n <span class=\"log-time\">{{ log.timestamp | date: 'HH:mm:ss' }}</span>\n <span class=\"log-icon\">\n @switch (log.level) {\n @case ('info') {\n <i class=\"fa-light fa-info-circle\"></i>\n }\n @case ('success') {\n <i class=\"fa-light fa-check-circle\"></i>\n }\n @case ('warning') {\n <i class=\"fa-light fa-exclamation-triangle\"></i>\n }\n @case ('error') {\n <i class=\"fa-light fa-times-circle\"></i>\n }\n }\n </span>\n <span class=\"log-message\">{{ log.message }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Dialog Footer -->\n <div class=\"execution-dialog-footer\">\n <div class=\"footer-info\">\n @if (workflowInstanceState()?.startTime) {\n <span class=\"time-info\">\n <i class=\"fa-light fa-clock\"></i>\n \u00D8\u00B4\u00D8\u00B1\u00D9\u02C6\u00D8\u00B9: {{ workflowInstanceState()!.startTime | date: 'HH:mm:ss' }}\n </span>\n }\n @if (workflowInstanceState()?.endTime) {\n <span class=\"time-info\">\n <i class=\"fa-light fa-flag-checkered\"></i>\n \u00D9\u00BE\u00D8\u00A7\u00DB\u0152\u00D8\u00A7\u00D9\u2020: {{ workflowInstanceState()!.endTime | date: 'HH:mm:ss' }}\n </span>\n }\n </div>\n <div class=\"footer-actions\">\n <ax-button\n [text]=\"(workflowInstanceState() ? '@general:actions.close.title' : '@general:actions.cancel.title') | translate | async\"\n color=\"secondary\" size=\"md\" [disabled]=\"isExecuting()\" (onClick)=\"closeExecutionDialog()\">\n </ax-button>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </axp-page-content>\n</axp-page-layout>\n", styles: [".sidebar-header .toggle-btn{padding:.5rem;margin-left:auto;background:transparent;border:1px solid #e2e8f0;border-radius:6px;color:#64748b;cursor:pointer;transition:all .2s}.sidebar-header .toggle-btn:hover{background:#f8fafc;border-color:#8b5cf6;color:#8b5cf6}.sidebar-header .toggle-btn i{font-size:.875rem}.sidebar-toggle-btn{position:absolute;top:50%;transform:translateY(-50%);z-index:100;padding:1rem .5rem;background:#fff;border:1px solid #e2e8f0;border-radius:8px;color:#8b5cf6;cursor:pointer;box-shadow:0 4px 12px #0000001a;transition:all .3s}.sidebar-toggle-btn:hover{background:#8b5cf6;color:#fff;box-shadow:0 8px 24px #8b5cf64d;transform:translateY(-50%) scale(1.1)}.sidebar-toggle-btn.left{left:0;border-left:none;border-radius:0 8px 8px 0}.sidebar-toggle-btn.right{right:0;border-right:none;border-radius:8px 0 0 8px}.sidebar-toggle-btn i{font-size:1.25rem;display:block}.properties-header .header-actions{display:flex;gap:.5rem;margin-left:auto}.properties-header .header-btn{padding:.375rem .5rem;background:transparent;border:1px solid #e2e8f0;border-radius:4px;color:#64748b;cursor:pointer;transition:all .2s}.properties-header .header-btn:hover{background:#f8fafc;border-color:#8b5cf6;color:#8b5cf6}.properties-header .header-btn i{font-size:.75rem}.connections-list{margin-top:.75rem}.connection-item{display:flex;align-items:center;gap:.5rem;padding:.5rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;margin-bottom:.5rem;font-size:.875rem}.connection-item i{color:#8b5cf6}.connection-item span{flex:1;color:#1e293b}.connection-item .remove-btn{padding:.25rem .375rem;background:transparent;border:1px solid #e2e8f0;border-radius:4px;color:#ef4444;cursor:pointer;transition:all .2s}.connection-item .remove-btn:hover{background:#fef2f2;border-color:#ef4444}.connection-item .remove-btn i{font-size:.75rem;color:inherit}.property-editor{margin-top:.75rem}.property-editor .property-row label{display:flex;align-items:center;gap:.5rem;justify-content:space-between}.property-editor .property-row label .property-type-badge{padding:.125rem .375rem;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;font-size:.625rem;font-weight:400;color:#64748b;text-transform:lowercase;font-family:JetBrains Mono,monospace}.property-editor .property-row select{width:100%;padding:.5rem;border:1px solid #e2e8f0;border-radius:6px;font-size:.875rem;color:#1e293b;background:#fff;cursor:pointer;transition:all .2s}.property-editor .property-row select:focus{outline:none;border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf61a}.property-editor .property-row textarea{width:100%;padding:.5rem;border:1px solid #e2e8f0;border-radius:6px;font-size:.75rem;font-family:JetBrains Mono,monospace;color:#1e293b;resize:vertical;transition:all .2s}.property-editor .property-row textarea:focus{outline:none;border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf61a}.workflow-studio{display:flex;flex-direction:column;height:100vh;background:#f8fafc;overflow:hidden}.studio-editor-tabs ax-button-group-item[selected],.studio-editor-tabs ax-button-group-item.ax-selected{font-weight:600;opacity:1}.workflow-popup .popup-header{text-align:center;margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:2px solid #e2e8f0}.workflow-popup .popup-header h3{margin:0 0 .5rem;color:#1e293b;font-size:1.5rem;font-weight:700}.workflow-popup .popup-header p{margin:0;color:#64748b;font-size:.95rem}.workflow-popup .popup-body{max-height:60vh;overflow-y:auto;padding:0 .5rem}.workflow-popup .popup-body h4{margin:1.5rem 0 .75rem;color:#374151;font-size:1.1rem;font-weight:600;display:flex;align-items:center;gap:.5rem}.workflow-popup .popup-body ul{margin:0;padding-left:1.5rem}.workflow-popup .popup-body ul li{margin-bottom:.5rem;color:#4b5563}.workflow-popup .popup-body ul li strong{color:#1f2937}.workflow-popup .workflow-info{background:#f8fafc;padding:1rem;border-radius:8px;border:1px solid #e2e8f0}.workflow-popup .workflow-variables{background:#fef3c7;padding:1rem;border-radius:8px;border:1px solid #f59e0b}.workflow-popup .workflow-flow{background:#ecfdf5;padding:1rem;border-radius:8px;border:1px solid #10b981}.workflow-popup .workflow-flow .flow-steps{display:flex;flex-direction:column;gap:.75rem}.workflow-popup .workflow-flow .flow-steps .flow-step{display:flex;align-items:center;gap:.75rem;padding:.5rem;background:#fff;border-radius:6px;border:1px solid #d1d5db}.workflow-popup .workflow-flow .flow-steps .flow-step .step-number{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:#3b82f6;color:#fff;border-radius:50%;font-size:.8rem;font-weight:600}.workflow-popup .workflow-flow .flow-steps .flow-step .step-text{color:#374151;font-weight:500}.workflow-popup .workflow-json{background:#1f2937;padding:1rem;border-radius:8px;border:1px solid #374151}.workflow-popup .workflow-json .json-preview{background:transparent;color:#e5e7eb;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.8rem;line-height:1.4;margin:0;white-space:pre-wrap;word-break:break-all;max-height:200px;overflow-y:auto}.workflow-popup .popup-footer{text-align:center;margin-top:1.5rem;padding-top:1rem;border-top:1px solid #e2e8f0}.workflow-popup .popup-footer .btn{padding:.75rem 1.5rem;background:#3b82f6;color:#fff;border:none;border-radius:6px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:.5rem;transition:background-color .2s}.workflow-popup .popup-footer .btn:hover{background:#2563eb}.workflow-popup .popup-footer .btn i{font-size:.9rem}.view-workflow-link{color:#3b82f6;text-decoration:none;font-size:.85rem;margin-left:.5rem;transition:color .2s}.view-workflow-link:hover{color:#1d4ed8;text-decoration:underline}.studio-header{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.5rem;background:#fff;border-bottom:1px solid #e2e8f0;box-shadow:0 1px 3px #0000000d}.studio-header .header-title{display:flex;align-items:center;gap:.75rem}.studio-header .header-title i{font-size:1.75rem;color:#8b5cf6}.studio-header .header-title h1{margin:0;font-size:1.5rem;font-weight:700;color:#1e293b}.studio-header .header-title .badge{padding:.25rem .75rem;background:#8b5cf6;color:#fff;border-radius:12px;font-size:.75rem;font-weight:600}.studio-header .header-actions{display:flex;gap:.75rem;align-items:center}.samples-dropdown{position:relative}.samples-dropdown .samples-menu{position:absolute;top:calc(100% + .5rem);left:0;min-width:320px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 10px 25px #0000001a;z-index:1000;max-height:400px;overflow-y:auto}.samples-dropdown .samples-menu .sample-item{padding:.875rem 1rem;display:flex;align-items:flex-start;gap:.75rem;cursor:pointer;border-bottom:1px solid #f1f5f9;transition:all .2s}.samples-dropdown .samples-menu .sample-item:last-child{border-bottom:none}.samples-dropdown .samples-menu .sample-item:hover{background:#f8fafc;transform:translate(4px)}.samples-dropdown .samples-menu .sample-item i{font-size:1.25rem;margin-top:.125rem;color:#8b5cf6}.samples-dropdown .samples-menu .sample-item .sample-info{display:flex;flex-direction:column;gap:.25rem;flex:1}.samples-dropdown .samples-menu .sample-item .sample-info strong{color:#1e293b;font-size:.875rem;font-weight:600}.samples-dropdown .samples-menu .sample-item .sample-info span{color:#64748b;font-size:.75rem;line-height:1.4}.studio-body{display:grid;grid-template-columns:1fr;gap:0;flex:1;overflow:hidden;transition:grid-template-columns .3s ease}.studio-body.sidebar-hidden,.studio-body.properties-hidden,.studio-body.sidebar-hidden.properties-hidden{grid-template-columns:1fr}.studio-sidebar{background:#fff;border-right:1px solid #e2e8f0;display:flex;flex-direction:column;overflow:hidden}.studio-sidebar .sidebar-header{padding:1rem 1.25rem;border-bottom:1px solid #e2e8f0;display:flex;align-items:center;gap:.5rem}.studio-sidebar .sidebar-header i{font-size:1.25rem;color:#8b5cf6}.studio-sidebar .sidebar-header h3{flex:1;margin:0;font-size:1.125rem;font-weight:600;color:#1e293b}.activities-tree{flex:1;overflow-y:auto;padding:.5rem}.category-section{margin-bottom:.5rem}.category-section .category-header{display:flex;align-items:center;gap:.5rem;padding:.75rem;border-radius:8px;cursor:pointer;transition:all .2s;background:#f8fafc}.category-section .category-header:hover{background:#f1f5f9}.category-section .category-header.active{background:#ede9fe}.category-section .category-header.active>i:first-child{color:#8b5cf6}.category-section .category-header>i:first-child{font-size:.875rem;color:#94a3b8;transition:transform .2s,color .2s}.category-section .category-header>i:nth-child(2){font-size:1.125rem}.category-section .category-header span{flex:1;font-weight:600;font-size:.875rem;color:#334155}.category-section .category-header .count{flex:none;padding:.125rem .5rem;background:#fff;border-radius:10px;font-size:.75rem;font-weight:600;color:#64748b;border:1px solid #e2e8f0}.activities-list{padding:.5rem 0 .5rem 1.5rem;display:flex;flex-direction:column;gap:.5rem;animation:slideDown .3s ease}.activities-list .activities-header{padding:.5rem .75rem;margin-bottom:.5rem}.activities-list .activities-header h4{margin:0;font-size:.875rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.5px}.activity-card{background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:.875rem;margin-bottom:.75rem;transition:all .2s}.activity-card:hover{border-color:#8b5cf6;box-shadow:0 4px 12px #8b5cf61a;transform:translateY(-1px)}.activity-card .activity-info{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:.5rem}.activity-card .activity-info>i{font-size:1.5rem;color:#8b5cf6;margin-top:.125rem}.activity-card .activity-info .activity-details{flex:1;display:flex;flex-direction:column;gap:.25rem}.activity-card .activity-info .activity-details strong{font-size:.875rem;color:#1e293b}.activity-card .activity-info .activity-details small{font-size:.75rem;color:#64748b;line-height:1.4}.activity-card .activity-info .activity-details code{font-size:.75rem;color:#8b5cf6;background:#f3f0ff;padding:.125rem .375rem;border-radius:4px;width:fit-content}.activity-card .copy-btn{float:right;padding:.375rem .75rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;cursor:pointer;transition:all .2s;color:#64748b}.activity-card .copy-btn:hover{background:#8b5cf6;border-color:#8b5cf6;color:#fff}.activity-card .copy-btn i{font-size:.875rem}.activity-card .activity-properties{margin-top:.75rem;padding-top:.75rem;border-top:1px solid #f1f5f9}.activity-card .activity-properties .properties-title{display:block;font-size:.75rem;font-weight:600;color:#64748b;margin-bottom:.5rem}.activity-card .activity-properties .property-item{display:flex;align-items:center;gap:.5rem;padding:.25rem 0;font-size:.75rem}.activity-card .activity-properties .property-item code{color:#1e293b;background:#f8fafc;padding:.125rem .375rem;border-radius:3px}.activity-card .activity-properties .property-item .property-type{color:#64748b;font-style:italic}.activity-card .activity-properties .property-item .required{color:#ef4444;font-weight:700}.studio-editor{display:flex;flex-direction:column;background:#1e293b;overflow:hidden}.studio-editor .editor-header{padding:1rem 1.25rem;background:#0f172a;display:flex;align-items:center;gap:.5rem}.studio-editor .editor-header i{font-size:1.125rem;color:#8b5cf6}.studio-editor .editor-header h3{margin:0;font-size:1rem;font-weight:600;color:#e2e8f0}.studio-editor axp-page-toolbar .editor-tabs{display:flex;gap:.5rem;background:transparent}.studio-editor axp-page-toolbar .editor-tabs .tab-btn{padding:.5rem 1rem;background:transparent;border:1px solid #e2e8f0;border-radius:6px;color:#64748b;font-size:.875rem;font-weight:500;cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center;gap:.5rem}.studio-editor axp-page-toolbar .editor-tabs .tab-btn i{font-size:.875rem}.studio-editor axp-page-toolbar .editor-tabs .tab-btn:hover{background:#f8fafc;border-color:#cbd5e1;color:#475569}.studio-editor axp-page-toolbar .editor-tabs .tab-btn.active{background:#8b5cf6;border-color:#8b5cf6;color:#fff}.studio-editor .editor-content{flex:1;display:flex;overflow:hidden}.studio-editor .json-tab{flex:1;display:flex;flex-direction:column}.studio-editor .json-editor{flex:1;padding:1.5rem;background:#1e293b;color:#e2e8f0;border:none;outline:none;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:.875rem;line-height:1.6;resize:none;overflow:auto}.studio-editor .json-editor::placeholder{color:#475569}.studio-editor .json-editor::-webkit-scrollbar{width:10px;height:10px}.studio-editor .json-editor::-webkit-scrollbar-track{background:#0f172a}.studio-editor .json-editor::-webkit-scrollbar-thumb{background:#475569;border-radius:5px}.studio-editor .json-editor::-webkit-scrollbar-thumb:hover{background:#64748b}.studio-editor .visual-tab{flex:1;display:flex;background:#f8fafc;position:relative}.studio-editor .visual-canvas{flex:1;display:flex;flex-direction:column;overflow:hidden}.studio-editor .visual-canvas .canvas-toolbar{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;background:var(--ax-surface, white);border-bottom:1px solid var(--ax-border, #e2e8f0)}.studio-editor .visual-canvas .canvas-toolbar .tool-btn{padding:.5rem .75rem;background:var(--ax-surface-alt, #f8fafc);border:1px solid var(--ax-border, #e2e8f0);border-radius:6px;color:var(--ax-text-muted, #64748b);cursor:pointer;transition:all .2s}.studio-editor .visual-canvas .canvas-toolbar .tool-btn:hover{background:#8b5cf6;border-color:#8b5cf6;color:#fff}.studio-editor .visual-canvas .canvas-toolbar .tool-btn i{font-size:.875rem}.studio-editor .visual-canvas .canvas-toolbar .toolbar-sep{width:1px;height:1.25rem;background:var(--ax-border, #e2e8f0);flex-shrink:0}.studio-editor .visual-canvas .canvas-toolbar .toolbar-auto-save{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;color:var(--ax-text-muted, #64748b);cursor:default}.studio-editor .visual-canvas .canvas-toolbar .toolbar-auto-save ax-switch{flex-shrink:0}.studio-editor .visual-canvas .canvas-toolbar .tool-info{flex:1;display:flex;align-items:center;gap:.5rem;min-height:1.75rem;font-size:.8125rem;color:var(--ax-text-muted, #64748b);line-height:1.4}.studio-editor .visual-canvas .canvas-toolbar .tool-info strong{font-weight:600}.studio-editor .visual-canvas .canvas-toolbar .tool-info i{font-size:1rem;color:#8b5cf6;flex-shrink:0}.studio-editor .visual-canvas .canvas-area{flex:1;position:relative;background:linear-gradient(90deg,#e5e7eb 1px,transparent 1px),linear-gradient(#e5e7eb 1px,transparent 1px);background-size:20px 20px;overflow:auto;min-height:600px}.studio-editor .visual-canvas .connections-layer{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1}.studio-editor .visual-canvas .connection-line{fill:none;transition:stroke .2s}.studio-editor .visual-canvas .connection-line.connection-hit{stroke:transparent;stroke-width:16;cursor:pointer;pointer-events:stroke}.studio-editor .visual-canvas .connection-line.connection-hit:hover~.outcome-line,.studio-editor .visual-canvas .connection-line.connection-hit:hover~.connection-line:not(.connection-hit){filter:brightness(.9)}.studio-editor .visual-canvas .connection-line:not(.connection-hit){stroke-linecap:round;pointer-events:none}.studio-editor .visual-canvas .connection-line.outcome-line{stroke-width:2.5}.studio-editor .visual-canvas .visual-node{position:absolute;width:150px;background:#fff;border:2px solid #e2e8f0;border-radius:8px;box-shadow:0 2px 8px #0000001a;cursor:move;transition:all .2s;z-index:2}.studio-editor .visual-canvas .visual-node:hover{border-color:#8b5cf6;box-shadow:0 4px 16px #8b5cf633;transform:translateY(-2px)}.studio-editor .visual-canvas .visual-node.selected{border-color:#8b5cf6;border-width:3px;box-shadow:0 0 0 3px #8b5cf633}.studio-editor .visual-canvas .visual-node .node-header{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:linear-gradient(135deg,#8b5cf6,#7c3aed);color:#fff;border-radius:6px 6px 0 0;font-size:.875rem;font-weight:600}.studio-editor .visual-canvas .visual-node .node-header i{font-size:1rem}.studio-editor .visual-canvas .visual-node .node-header span{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.studio-editor .visual-canvas .visual-node .node-header .node-delete{padding:.25rem;background:#fff3;border:none;border-radius:4px;color:#fff;cursor:pointer;transition:all .2s}.studio-editor .visual-canvas .visual-node .node-header .node-delete:hover{background:#ef4444cc}.studio-editor .visual-canvas .visual-node .node-header .node-delete i{font-size:.75rem}.studio-editor .visual-canvas .visual-node .node-body{padding:.75rem}.studio-editor .visual-canvas .visual-node .node-body small{display:block;font-size:.75rem;color:#64748b;text-align:center}.studio-editor .visual-canvas .visual-node .node-connectors{position:relative}.studio-editor .visual-canvas .visual-node .node-connectors .connector{position:absolute;width:12px;height:12px;background:#8b5cf6;border:2px solid white;border-radius:50%;cursor:pointer;transition:all .2s;z-index:10}.studio-editor .visual-canvas .visual-node .node-connectors .connector:hover{transform:scale(1.3);box-shadow:0 0 0 3px #8b5cf64d}.studio-editor .visual-canvas .visual-node .node-connectors .connector-in{top:-50px;left:50%;transform:translate(-50%);background:#3b82f6}.studio-editor .visual-canvas .visual-node .node-connectors .connector-out{bottom:-6px;left:50%;transform:translate(-50%);background:#8b5cf6}.studio-editor .visual-canvas .visual-node .node-connectors .connector-out.active{background:#ef4444}.studio-editor .visual-canvas .visual-node .node-connectors .outcomes-container{position:absolute;bottom:-60px;left:50%;transform:translate(-50%);display:flex;flex-direction:column;gap:8px;background:#fff;padding:8px;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 12px #00000026;min-width:120px;z-index:100}.studio-editor .visual-canvas .visual-node .node-connectors .outcomes-container:before{content:\"\";position:absolute;top:-8px;left:50%;transform:translate(-50%);width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid white;filter:drop-shadow(0 -2px 2px rgba(0,0,0,.05))}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;cursor:pointer;transition:all .2s;position:relative}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector:hover{background:#f1f5f9;border-color:#8b5cf6;transform:translate(2px)}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector.active{background:#fef2f2;border-color:#ef4444}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector.active .outcome-dot{background:#ef4444;box-shadow:0 0 0 3px #ef444433}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector .outcome-label{font-size:.75rem;font-weight:600;color:#475569;-webkit-user-select:none;user-select:none;flex:1}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector .outcome-dot{width:10px;height:10px;background:#8b5cf6;border:2px solid white;border-radius:50%;transition:all .2s;flex-shrink:0}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=\"200\"] .outcome-dot,.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Done] .outcome-dot{background:#10b981}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=\"404\"] .outcome-dot,.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Failed] .outcome-dot{background:#ef4444}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Timeout] .outcome-dot,.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Cancelled] .outcome-dot{background:#f59e0b}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Then] .outcome-dot{background:#3b82f6}.studio-editor .visual-canvas .visual-node .node-connectors .outcome-connector[data-outcome=Else] .outcome-dot{background:#64748b}.studio-editor .visual-canvas .canvas-empty-state{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;color:#94a3b8;pointer-events:none}.studio-editor .visual-canvas .canvas-empty-state i{font-size:4rem;margin-bottom:1rem;opacity:.5}.studio-editor .visual-canvas .canvas-empty-state p{margin:0 0 .5rem;font-size:1rem;font-weight:500}.studio-editor .visual-canvas .canvas-empty-state small{font-size:.875rem;opacity:.8}.studio-editor .properties-panel{width:280px;background:#fff;border-left:1px solid #e2e8f0;display:flex;flex-direction:column}.studio-editor .properties-panel .properties-header{display:flex;align-items:center;gap:.5rem;padding:1rem;border-bottom:1px solid #e2e8f0}.studio-editor .properties-panel .properties-header i{font-size:1.125rem;color:#8b5cf6}.studio-editor .properties-panel .properties-header h4{flex:1;margin:0;font-size:.875rem;font-weight:600;color:#1e293b}.studio-editor .properties-panel .properties-header button{padding:.25rem .5rem;background:transparent;border:none;color:#64748b;cursor:pointer;transition:color .2s}.studio-editor .properties-panel .properties-header button:hover{color:#ef4444}.studio-editor .properties-panel .properties-body{flex:1;padding:1rem;overflow-y:auto}.studio-editor .properties-panel .properties-body .properties-widget-section{min-height:0}.studio-editor .properties-panel .properties-body .workflow-panel-section{margin-bottom:1.5rem}.studio-editor .properties-panel .properties-body .workflow-panel-section h5{margin:0 0 .75rem;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.5px}.studio-editor .properties-panel .properties-body .workflow-panel-section .form-group{margin-bottom:.75rem}.studio-editor .properties-panel .properties-body .workflow-panel-section .form-group label{font-size:.75rem}.studio-editor .properties-panel .properties-body .workflow-panel-section .form-group input,.studio-editor .properties-panel .properties-body .workflow-panel-section .form-group textarea{font-size:.8125rem}.studio-editor .properties-panel .properties-body .workflow-info-table{display:flex;flex-direction:column;gap:.5rem}.studio-editor .properties-panel .properties-body .workflow-info-row{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.5rem 0;border-bottom:1px solid #f1f5f9}.studio-editor .properties-panel .properties-body .workflow-info-row:last-child{border-bottom:none}.studio-editor .properties-panel .properties-body .info-label{font-size:.8125rem;font-weight:500;color:#64748b;flex-shrink:0}.studio-editor .properties-panel .properties-body .info-value{font-size:.8125rem;color:#1e293b;text-align:right;word-break:break-all}.studio-editor .properties-panel .properties-body .info-actions{display:flex;align-items:center;gap:.5rem}.studio-editor .properties-panel .properties-body .property-row{margin-bottom:1rem}.studio-editor .properties-panel .properties-body .property-row label{display:block;font-size:.75rem;font-weight:600;color:#64748b;margin-bottom:.375rem;text-transform:uppercase;letter-spacing:.5px}.studio-editor .properties-panel .properties-body .property-row input{width:100%;padding:.5rem;border:1px solid #e2e8f0;border-radius:6px;font-size:.875rem;color:#1e293b;transition:all .2s}.studio-editor .properties-panel .properties-body .property-row input:focus{outline:none;border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf61a}.studio-editor .properties-panel .properties-body .property-row input:disabled{background:#f8fafc;color:#94a3b8;cursor:not-allowed}.studio-editor .properties-panel .properties-body .properties-divider{height:1px;background:#e2e8f0;margin:1.5rem 0}.studio-editor .properties-panel .properties-body h5{margin:0 0 .5rem;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.5px}.studio-editor .properties-panel .properties-body .properties-hint{display:block;font-size:.75rem;color:#94a3b8;margin-bottom:.75rem}.studio-editor .properties-panel .properties-body .properties-json{margin:.75rem 0 0;padding:.75rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;font-family:JetBrains Mono,monospace;font-size:.75rem;line-height:1.6;color:#1e293b;overflow-x:auto}.studio-editor .properties-panel .properties-body .no-properties{margin:.75rem 0 0;padding:1rem;background:#f8fafc;border:1px dashed #cbd5e1;border-radius:6px;text-align:center;font-size:.75rem;color:#94a3b8}.studio-editor .properties-panel .properties-body .connections-list{display:flex;flex-direction:column;gap:.5rem;margin-top:.75rem}.studio-editor .properties-panel .properties-body .connections-list .connection-item{display:flex;align-items:center;gap:.5rem;padding:.5rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;font-size:.75rem}.studio-editor .properties-panel .properties-body .connections-list .connection-item.outcome-connection{border-left-width:3px}.studio-editor .properties-panel .properties-body .connections-list .connection-item i{color:#64748b;font-size:.875rem}.studio-editor .properties-panel .properties-body .connections-list .connection-item span{flex:1;color:#1e293b;font-weight:500}.studio-editor .properties-panel .properties-body .connections-list .connection-item .outcome-badge{padding:.25rem .5rem;border-radius:4px;color:#fff;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.5px}.studio-editor .properties-panel .properties-body .connections-list .connection-item .remove-btn{padding:.25rem;background:transparent;border:none;color:#ef4444;cursor:pointer;border-radius:4px;transition:all .2s}.studio-editor .properties-panel .properties-body .connections-list .connection-item .remove-btn:hover{background:#fee2e2}.studio-editor .properties-panel .properties-body .connections-list .connection-item .remove-btn i{font-size:.75rem;color:inherit}.studio-editor .properties-panel .properties-body .outcomes-info{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.75rem}.studio-editor .properties-panel .properties-body .outcomes-info .outcome-tag{display:inline-flex;align-items:center;gap:.375rem;padding:.375rem .625rem;background:#fff;border:2px solid;border-radius:6px;font-size:.75rem;font-weight:600;color:#1e293b;transition:all .2s}.studio-editor .properties-panel .properties-body .outcomes-info .outcome-tag:hover{transform:translateY(-1px);box-shadow:0 2px 8px #0000001a}.studio-editor .properties-panel .properties-body .outcomes-info .outcome-tag .outcome-dot{width:8px;height:8px;border-radius:50%}.studio-result{display:flex;flex-direction:column;background:#fff;border-left:1px solid #e2e8f0;overflow:hidden}.studio-result .result-header{padding:1rem 1.25rem;border-bottom:1px solid #e2e8f0;display:flex;align-items:center;gap:.5rem}.studio-result .result-header i{font-size:1.125rem;color:#10b981}.studio-result .result-header h3{flex:1;margin:0;font-size:1rem;font-weight:600;color:#1e293b}.studio-result .result-header .clear-btn{padding:.375rem .75rem;background:#fee2e2;color:#dc2626;border:none;border-radius:6px;cursor:pointer;font-size:.75rem;font-weight:500;transition:all .2s}.studio-result .result-header .clear-btn:hover{background:#fecaca}.studio-result .result-header .clear-btn i{font-size:.75rem;color:inherit}.studio-result .result-body{flex:1;overflow-y:auto;padding:1rem}.logs-container{display:flex;flex-direction:column;gap:.5rem}.log-item{display:flex;align-items:flex-start;gap:.5rem;padding:.75rem;background:#f8fafc;border-left:3px solid #cbd5e1;border-radius:6px;font-size:.875rem}.log-item.log-info{border-left-color:#3b82f6;background:#eff6ff}.log-item.log-info .log-icon{color:#3b82f6}.log-item.log-success{border-left-color:#10b981;background:#f0fdf4}.log-item.log-success .log-icon{color:#10b981}.log-item.log-warning{border-left-color:#f59e0b;background:#fffbeb}.log-item.log-warning .log-icon{color:#f59e0b}.log-item.log-error{border-left-color:#ef4444;background:#fef2f2}.log-item.log-error .log-icon{color:#ef4444}.log-item .log-time{font-family:JetBrains Mono,monospace;font-size:.75rem;color:#64748b;min-width:80px}.log-item .log-icon{font-size:1rem}.log-item .log-message{flex:1;color:#1e293b}.log-item .log-data-toggle{padding:.25rem .5rem;background:transparent;border:1px solid #cbd5e1;border-radius:4px;cursor:pointer;transition:all .2s}.log-item .log-data-toggle:hover{background:#fff}.log-item .log-data-toggle i{font-size:.75rem;color:#64748b}.log-data{margin:.5rem 0 0;padding:1rem;background:#0f172a;color:#e2e8f0;border-radius:6px;font-family:JetBrains Mono,monospace;font-size:.75rem;line-height:1.6;overflow-x:auto}.settings-modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:9999;padding:2rem;animation:fadeIn .2s ease}.settings-modal{background:#fff;border-radius:12px;box-shadow:0 20px 60px #0000004d;width:100%;max-width:900px;max-height:90vh;display:flex;flex-direction:column;animation:slideUp .3s ease}@keyframes slideUp{0%{transform:translateY(20px);opacity:0}to{transform:translateY(0);opacity:1}}.settings-modal-header{display:flex;align-items:center;justify-content:space-between;padding:1.5rem 2rem;border-bottom:1px solid #e2e8f0}.settings-modal-header .header-title{display:flex;align-items:center;gap:.75rem}.settings-modal-header .header-title i{font-size:1.5rem;color:#8b5cf6}.settings-modal-header .header-title h2{margin:0;font-size:1.25rem;font-weight:700;color:#1e293b}.settings-modal-header .close-btn{padding:.5rem;background:transparent;border:none;color:#64748b;cursor:pointer;border-radius:6px;transition:all .2s}.settings-modal-header .close-btn:hover{background:#f1f5f9;color:#ef4444}.settings-modal-header .close-btn i{font-size:1.25rem}.settings-modal-body{flex:1;display:flex;flex-direction:column;overflow:hidden}.settings-tabs{padding:0 1.5rem}.settings-content{flex:1;overflow-y:auto;padding:2rem}.settings-section h3{margin:0 0 1.5rem;font-size:1rem;font-weight:600;color:#1e293b}.settings-section .section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem}.settings-section .section-header h3{margin:0}.settings-section .section-header .add-btn{display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;background:#8b5cf6;color:#fff;border:none;border-radius:6px;font-size:.875rem;font-weight:500;cursor:pointer;transition:all .2s}.settings-section .section-header .add-btn:hover{background:#7c3aed;transform:translateY(-1px);box-shadow:0 4px 12px #8b5cf64d}.settings-section .section-header .add-btn i{font-size:.875rem}.form-group{margin-bottom:1.25rem}.form-group label{display:block;font-size:.875rem;font-weight:600;color:#475569;margin-bottom:.5rem}.form-group small{display:block;font-size:.75rem;color:#94a3b8;margin-top:.375rem}.form-group.checkbox-group{margin-bottom:0}.form-group.checkbox-group label{display:flex;align-items:center;gap:.5rem;cursor:pointer;margin-bottom:0}.form-group.checkbox-group label input[type=checkbox]{width:18px;height:18px;cursor:pointer}.form-group.checkbox-group label span{font-size:.875rem;font-weight:500}.form-group.flex-1{flex:1}.form-row{display:flex;gap:1rem;align-items:flex-start}.form-input,.form-select,.form-textarea{width:100%;padding:.625rem;border:1px solid #e2e8f0;border-radius:6px;font-size:.875rem;color:#1e293b;transition:all .2s}.form-input:focus,.form-select:focus,.form-textarea:focus{outline:none;border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf61a}.form-input::placeholder,.form-select::placeholder,.form-textarea::placeholder{color:#cbd5e1}.form-textarea{resize:vertical;font-family:inherit}.items-list{display:flex;flex-direction:column;gap:1rem}.item-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;transition:all .2s}.item-card:hover{border-color:#cbd5e1;box-shadow:0 2px 8px #0000000d}.item-card .item-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;background:#f1f5f9;border-bottom:1px solid #e2e8f0}.item-card .item-header .item-number{font-size:.75rem;font-weight:700;color:#8b5cf6;padding:.25rem .5rem;background:#fff;border-radius:4px}.item-card .item-header .remove-btn{padding:.375rem .625rem;background:transparent;border:none;color:#ef4444;cursor:pointer;border-radius:4px;transition:all .2s}.item-card .item-header .remove-btn:hover{background:#fee2e2}.item-card .item-header .remove-btn i{font-size:.875rem}.item-card .item-body{padding:1rem}.advanced-group{margin-bottom:2rem;padding-bottom:2rem;border-bottom:1px solid #e2e8f0}.advanced-group:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}.advanced-group h4{margin:0 0 1rem;font-size:.875rem;font-weight:600;color:#475569;text-transform:uppercase;letter-spacing:.5px}.outcomes-preview{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.75rem}.outcomes-preview .outcome-chip{display:inline-flex;align-items:center;padding:.375rem .75rem;background:#f1f5f9;border:1px solid #cbd5e1;border-radius:6px;font-size:.75rem;font-weight:600;color:#475569}.export-info{margin-top:1rem;padding:1rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px}.export-info .info-row{display:flex;align-items:center;gap:.75rem;padding:.5rem 0;border-bottom:1px solid #e2e8f0}.export-info .info-row:last-child{border-bottom:none;padding-bottom:0}.export-info .info-row .label{font-size:.75rem;font-weight:600;color:#64748b;min-width:120px}.export-info .info-row code{flex:1;padding:.25rem .5rem;background:#fff;border:1px solid #e2e8f0;border-radius:4px;font-size:.75rem;color:#1e293b;font-family:JetBrains Mono,monospace}.settings-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:1rem;padding:1.5rem 2rem;border-top:1px solid #e2e8f0;background:#f8fafc}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 1rem;text-align:center;color:#94a3b8}.empty-state i{font-size:3rem;margin-bottom:1rem}.empty-state p{margin:0;font-size:.875rem}.final-result{margin-top:1.5rem;padding-top:1.5rem;border-top:2px solid #e2e8f0}.final-result .result-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background:#f8fafc;border-radius:8px;margin-bottom:1rem;cursor:pointer;transition:all .2s}.final-result .result-header:hover{background:#f1f5f9;transform:translate(-2px)}.final-result .result-header h4{display:flex;align-items:center;gap:.5rem;margin:0;font-size:.875rem;font-weight:600;color:#475569;text-transform:uppercase}.final-result .result-header h4 i{font-size:.875rem;transition:transform .2s}.final-result .result-header .toggle-hint{font-size:.75rem;color:#94a3b8}.final-result .result-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:1rem}.final-result .result-card .result-row{display:flex;align-items:center;gap:.75rem;padding:.5rem 0}.final-result .result-card .result-row:not(:last-child){border-bottom:1px solid #e2e8f0}.final-result .result-card .result-row strong{font-size:.875rem;color:#475569;min-width:100px}.final-result .result-card .result-row .badge{padding:.25rem .75rem;border-radius:12px;font-size:.75rem;font-weight:600}.final-result .result-card .result-row .badge.badge-running{background:#dbeafe;color:#1e40af}.final-result .result-card .result-row .badge.badge-finished{background:#d1fae5;color:#065f46}.final-result .result-card .result-row .badge.badge-cancelled{background:#fed7aa;color:#92400e}.final-result .result-card .result-row .badge.badge-faulted{background:#fee2e2;color:#991b1b}.final-result .result-card .result-row pre{margin:.5rem 0 0;padding:.75rem;background:#0f172a;color:#e2e8f0;border-radius:6px;font-family:JetBrains Mono,monospace;font-size:.75rem;line-height:1.6;overflow-x:auto;width:100%}.activities-list::-webkit-scrollbar,.result-body::-webkit-scrollbar{width:8px}.activities-list::-webkit-scrollbar-track,.result-body::-webkit-scrollbar-track{background:#f1f5f9}.activities-list::-webkit-scrollbar-thumb,.result-body::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:4px}.activities-list::-webkit-scrollbar-thumb:hover,.result-body::-webkit-scrollbar-thumb:hover{background:#94a3b8}.activity-card{cursor:grab}.activity-card:active{cursor:grabbing}.activity-card[draggable=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.visual-node[draggable=true]{cursor:move;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.visual-node:active{cursor:grabbing}.canvas-area[data-drag-over=true]{background-color:#8b5cf60d}.connector:hover{transform:scale(1.3);box-shadow:0 0 0 3px #8b5cf64d}.connector-out.active{animation:pulse 1s infinite}@keyframes pulse{0%,to{box-shadow:0 0 0 3px #ef44444d}50%{box-shadow:0 0 0 6px #ef44441a}}@keyframes slideDown{0%{opacity:0;max-height:0}to{opacity:1;max-height:2000px}}.execution-dialog-overlay{position:fixed;inset:0;background:#000000b3;backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:10000;animation:fadeIn .2s ease}.execution-dialog{width:90vw;max-width:1200px;height:90vh;background:#fff;border-radius:16px;box-shadow:0 25px 50px #0000004d;display:flex;flex-direction:column;overflow:hidden;animation:slideUp .3s ease}.execution-dialog-header{padding:1.5rem 2rem;background:linear-gradient(135deg,#8b5cf6,#7c3aed);color:#fff;display:flex;justify-content:space-between;align-items:center;flex-shrink:0}.execution-dialog-header .header-content{display:flex;align-items:center;gap:1rem;flex:1}.execution-dialog-header .header-content>i{font-size:2.5rem;opacity:.9}.execution-dialog-header .header-content .header-info h2{margin:0;font-size:1.75rem;font-weight:700}.execution-dialog-header .header-content .header-info p{margin:.25rem 0 0;opacity:.9;font-size:.95rem}.execution-dialog-header .close-btn{background:#fff3;border:none;width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;color:#fff;font-size:1.25rem}.execution-dialog-header .close-btn:hover:not(:disabled){background:#ffffff4d;transform:scale(1.05)}.execution-dialog-header .close-btn:disabled{opacity:.5;cursor:not-allowed}.execution-dialog-body{flex:1;overflow-y:auto;padding:2rem;background:#f8fafc}.execution-dialog-footer{padding:1rem 2rem;background:#fff;border-top:1px solid #e2e8f0;display:flex;justify-content:space-between;align-items:center;flex-shrink:0}.execution-dialog-footer .footer-info{display:flex;gap:1.5rem}.execution-dialog-footer .footer-info .time-info{display:flex;align-items:center;gap:.5rem;color:#64748b;font-size:.875rem}.execution-dialog-footer .footer-info .time-info i{color:#8b5cf6}.execution-dialog-footer .footer-actions{display:flex;gap:.75rem}.workflow-info-panel{background:#fff;border-radius:12px;padding:2rem;box-shadow:0 4px 6px #0000000d}.workflow-info-panel .info-section{margin-bottom:2rem}.workflow-info-panel .info-section h3{display:flex;align-items:center;gap:.5rem;margin:0 0 1rem;color:#1e293b;font-size:1.25rem}.workflow-info-panel .info-section h3 i{color:#8b5cf6}.workflow-info-panel .info-section .description{color:#475569;line-height:1.7;margin:0}.workflow-info-panel .info-section .features-list{list-style:none;padding:0;margin:0;display:grid;gap:.75rem}.workflow-info-panel .info-section .features-list li{display:flex;align-items:center;gap:.75rem;padding:.75rem;background:#f8fafc;border-radius:8px;color:#334155}.workflow-info-panel .info-section .features-list li i{color:#10b981;font-size:1.125rem}.workflow-info-panel .start-section{text-align:center;padding:2rem;background:linear-gradient(135deg,#f0fdf4,#dcfce7);border-radius:12px;border:2px dashed #10b981}.workflow-info-panel .start-section .start-illustration{margin-bottom:1rem}.workflow-info-panel .start-section .start-illustration i{font-size:4rem;color:#10b981;animation:float 3s ease-in-out infinite}.workflow-info-panel .start-section h3{margin:0 0 .5rem;color:#1e293b;font-size:1.5rem}.workflow-info-panel .start-section p{margin:0 0 1.5rem;color:#64748b}.state-machine-ui .issue-tracker{background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 1px 2px #0000000d}.state-machine-ui .issue-tracker .issue-header-main{padding:1.5rem 2rem 1rem;border-bottom:1px solid #e2e8f0}.state-machine-ui .issue-tracker .issue-header-main .issue-breadcrumb{display:flex;align-items:center;gap:.5rem;font-size:.875rem;color:#64748b;margin-bottom:.75rem}.state-machine-ui .issue-tracker .issue-header-main .issue-breadcrumb .project-name{color:#3b82f6;font-weight:600}.state-machine-ui .issue-tracker .issue-header-main .issue-breadcrumb .separator{color:#94a3b8}.state-machine-ui .issue-tracker .issue-header-main .issue-breadcrumb .issue-key{color:#64748b}.state-machine-ui .issue-tracker .issue-header-main .issue-type-title{display:flex;align-items:center;gap:.75rem}.state-machine-ui .issue-tracker .issue-header-main .issue-type-title .type-badge{padding:.375rem .75rem;border-radius:4px;font-size:.8125rem;font-weight:600;display:flex;align-items:center;gap:.375rem;background:#eff6ff;color:#3b82f6}.state-machine-ui .issue-tracker .issue-header-main .issue-type-title .type-badge i{font-size:1rem}.state-machine-ui .issue-tracker .issue-header-main .issue-type-title .issue-main-title{margin:0;font-size:1.5rem;font-weight:600;color:#1e293b}.state-machine-ui .issue-tracker .issue-action-bar{padding:.75rem 2rem;background:#f8fafc;border-bottom:1px solid #e2e8f0;display:flex;justify-content:space-between;align-items:center}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left{display:flex;gap:.5rem}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn{padding:.5rem 1rem;border:1px solid #cbd5e1;border-radius:4px;background:#fff;font-weight:500;font-size:.875rem;cursor:pointer;transition:all .2s;color:#334155}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn:disabled{opacity:.5;cursor:not-allowed}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-primary{background:#3b82f6;color:#fff;border-color:#3b82f6}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-primary:hover:not(:disabled){background:#2563eb}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-success{background:#10b981;color:#fff;border-color:#10b981}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-success:hover:not(:disabled){background:#059669}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-warning{background:#f59e0b;color:#fff;border-color:#f59e0b}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-left .status-transition-btn.btn-warning:hover:not(:disabled){background:#d97706}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-right .more-actions-btn{padding:.5rem 1rem;border:1px solid #cbd5e1;border-radius:4px;background:#fff;font-weight:500;font-size:.875rem;cursor:pointer;display:flex;align-items:center;gap:.5rem;color:#334155;transition:all .2s}.state-machine-ui .issue-tracker .issue-action-bar .action-bar-right .more-actions-btn:hover{background:#f1f5f9}.state-machine-ui .issue-tracker .issue-main-content{display:grid;grid-template-columns:320px 1fr;gap:2rem;padding:2rem}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section{margin-bottom:2rem}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section h3{margin:0 0 1rem;font-size:1rem;font-weight:600;color:#1e293b}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row{display:flex;padding:.625rem 0;border-bottom:1px solid #f1f5f9}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row:last-child{border-bottom:none}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row label{min-width:100px;font-size:.8125rem;color:#64748b;font-weight:500}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value{display:flex;align-items:center;gap:.5rem;font-size:.875rem;color:#1e293b}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value i{font-size:1rem}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value .status-badge{padding:.25rem .625rem;border-radius:4px;color:#fff;font-weight:600;font-size:.75rem;text-transform:uppercase}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value .view-workflow-link{color:#3b82f6;font-size:.8125rem;text-decoration:none;margin-left:.5rem}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value .view-workflow-link:hover{text-decoration:underline}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .details-section .detail-row .detail-value .user-avatar{width:24px;height:24px;border-radius:50%;background:#8b5cf6;color:#fff;display:flex;align-items:center;justify-content:center;font-size:.75rem}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz{background:#f8fafc;border-radius:8px;padding:1.5rem;border:1px solid #e2e8f0}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz h3{margin:0 0 1rem;font-size:.875rem;font-weight:600;color:#1e293b}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state{display:flex;flex-direction:column;align-items:center;gap:.375rem;opacity:.4;transition:opacity .2s}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state.active,.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state.completed{opacity:1}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state .state-circle{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;font-size:.875rem;box-shadow:0 2px 4px #0000001a}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state .state-name{font-size:.6875rem;color:#64748b;font-weight:500}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-state.active .state-name{color:#1e293b;font-weight:600}.state-machine-ui .issue-tracker .issue-main-content .issue-details-panel .state-machine-viz .states-flow .flow-arrow{color:#cbd5e1;font-size:.75rem;margin:0 .25rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .description-section,.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section{margin-bottom:2rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .description-section h3,.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section h3{margin:0 0 1rem;font-size:1rem;font-weight:600;color:#1e293b}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .description-section .description-content,.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .description-content{padding:1rem;background:#f8fafc;border-radius:6px;border:1px solid #e2e8f0}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .description-section .description-content p,.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .description-content p{margin:0;color:#475569;line-height:1.7;font-size:.875rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline{display:flex;flex-direction:column;gap:1rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item{display:flex;gap:.75rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-avatar{width:32px;height:32px;border-radius:50%;background:#8b5cf6;color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:.875rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content{flex:1;padding-bottom:1rem;border-bottom:1px solid #f1f5f9}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content .activity-header{font-size:.875rem;color:#334155;line-height:1.6;margin-bottom:.375rem}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content .activity-header strong{color:#1e293b;font-weight:600}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content .activity-header .activity-action{color:#64748b}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content .activity-meta{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;color:#94a3b8}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item .activity-content .activity-meta .activity-label{color:#8b5cf6;font-weight:500}.state-machine-ui .issue-tracker .issue-main-content .issue-description-panel .activity-section .activity-timeline .activity-item:last-child .activity-content{border-bottom:none;padding-bottom:0}.registration-ui{display:flex;justify-content:center;align-items:center;min-height:400px}.registration-ui .registration-card{background:#fff;border-radius:12px;padding:3rem;box-shadow:0 4px 6px #0000000d;text-align:center;max-width:500px}.registration-ui .registration-card .registration-icon{margin-bottom:1.5rem}.registration-ui .registration-card .registration-icon i{font-size:5rem;color:#8b5cf6}.registration-ui .registration-card h3{margin:0 0 .75rem;color:#1e293b;font-size:1.75rem;font-weight:700}.registration-ui .registration-card .registration-desc{margin:0 0 2rem;color:#64748b;line-height:1.7}.registration-ui .registration-card .registration-progress{padding:2rem;background:#fef3c7;border-radius:8px}.registration-ui .registration-card .registration-progress .progress-spinner{margin-bottom:1rem}.registration-ui .registration-card .registration-progress .progress-spinner i{font-size:3rem;color:#f59e0b}.registration-ui .registration-card .registration-progress p{margin:0;color:#92400e;font-weight:500}.registration-ui .registration-card .registration-success{padding:2rem;background:#f0fdf4;border-radius:8px}.registration-ui .registration-card .registration-success i{font-size:4rem;color:#10b981;margin-bottom:1rem}.registration-ui .registration-card .registration-success h4{margin:0 0 .5rem;color:#064e3b;font-size:1.5rem;font-weight:700}.registration-ui .registration-card .registration-success p{margin:0;color:#065f46}.default-execution-view{display:flex;justify-content:center;align-items:center;min-height:400px}.default-execution-view .execution-status{text-align:center;padding:3rem;background:#fff;border-radius:12px;box-shadow:0 4px 6px #0000000d;min-width:400px}.default-execution-view .execution-status i{font-size:5rem;margin-bottom:1.5rem}.default-execution-view .execution-status h3{margin:0 0 .75rem;font-size:1.75rem;font-weight:700}.default-execution-view .execution-status p{margin:0;color:#64748b;line-height:1.7}.default-execution-view .execution-status .status-running i{color:#f59e0b}.default-execution-view .execution-status .status-finished i{color:#10b981}.default-execution-view .execution-status .status-error i{color:#ef4444}.execution-logs-panel{margin-top:2rem;background:#fff;border-radius:12px;padding:1.5rem;box-shadow:0 4px 6px #0000000d}.execution-logs-panel h3{display:flex;align-items:center;gap:.5rem;margin:0 0 1rem;color:#1e293b;font-size:1.125rem}.execution-logs-panel h3 i{color:#8b5cf6}.execution-logs-panel .logs-container-compact{max-height:300px;overflow-y:auto;background:#f8fafc;border-radius:8px;padding:.75rem}.execution-logs-panel .logs-container-compact .log-item-compact{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-radius:6px;margin-bottom:.5rem;font-size:.875rem}.execution-logs-panel .logs-container-compact .log-item-compact:last-child{margin-bottom:0}.execution-logs-panel .logs-container-compact .log-item-compact .log-time{font-family:Courier New,monospace;color:#64748b;font-size:.8125rem;min-width:70px}.execution-logs-panel .logs-container-compact .log-item-compact .log-icon{display:flex;align-items:center;justify-content:center;width:20px}.execution-logs-panel .logs-container-compact .log-item-compact .log-icon i{font-size:1rem}.execution-logs-panel .logs-container-compact .log-item-compact .log-message{flex:1;color:#334155}.execution-logs-panel .logs-container-compact .log-item-compact.log-info{background:#eff6ff}.execution-logs-panel .logs-container-compact .log-item-compact.log-info .log-icon i{color:#3b82f6}.execution-logs-panel .logs-container-compact .log-item-compact.log-success{background:#f0fdf4}.execution-logs-panel .logs-container-compact .log-item-compact.log-success .log-icon i{color:#10b981}.execution-logs-panel .logs-container-compact .log-item-compact.log-warning{background:#fffbeb}.execution-logs-panel .logs-container-compact .log-item-compact.log-warning .log-icon i{color:#f59e0b}.execution-logs-panel .logs-container-compact .log-item-compact.log-error{background:#fef2f2}.execution-logs-panel .logs-container-compact .log-item-compact.log-error .log-icon i{color:#ef4444}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-10px)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: i2$1.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "color", "look", "fitParent", "selection"], outputs: ["onBlur", "onFocus", "lookChange", "colorChange", "disabledChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i2$1.AXButtonGroupItemComponent, selector: "ax-button-group-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i4.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i5.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXSwitchModule }, { kind: "component", type: i6.AXSwitchComponent, selector: "ax-switch", inputs: ["disabled", "readonly", "color", "tabIndex", "value", "name", "isLoading"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged", "readonlyChange", "disabledChange"] }, { kind: "ngmodule", type: AXTabsModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXPPropertyViewerComponent, selector: "axp-property-viewer", inputs: ["tabsInput", "mode", "bindingExpressionEditorMode"], outputs: ["onChanged"] }, { 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: "component", type: AXPThemeLayoutHeaderComponent, selector: "axp-layout-header" }, { kind: "component", type: AXPThemeLayoutToolbarComponent, selector: "axp-layout-toolbar" }, { kind: "component", type: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "component", type: AXMActivityCategoriesTreeComponent, selector: "axp-activity-categories-tree", outputs: ["categoryClick", "activityClick", "activityDragStart"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.JsonPipe, name: "json" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5065
5638
  }
5066
5639
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: WorkflowStudioComponent, decorators: [{
5067
5640
  type: Component,
@@ -5101,5 +5674,5 @@ var workflowStudio_component = /*#__PURE__*/Object.freeze({
5101
5674
  * Generated bundle index. Do not edit.
5102
5675
  */
5103
5676
 
5104
- export { AXCCategoryProvider, AXMActivityCategoriesTreeComponent, AXMMenuProvider, AXMWorkflowActivitiesDefinitionProvider, AXMWorkflowManagementModule, AXMWorkflowManagementModuleEntityProvider, AXPCreateEntityActivity, AXPGenericWorkflowTaskProvider, AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG, CollectSignatureActivity, CreateEntityFormActivity, HumanTaskActivity, RootConfig, ShowConfirmPopupActivity, ShowLayoutPopupActivity, ShowToastActivity, WorkflowStudioComponent };
5677
+ export { AXCCategoryProvider, AXMActivityCategoriesTreeComponent, AXMMenuProvider, AXMWorkflowActivitiesDefinitionProvider, AXMWorkflowManagementModule, AXMWorkflowManagementModuleEntityProvider, AXPCreateEntityActivity, AXPGenericWorkflowTaskProvider, AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG, CartableTaskActivity, CollectSignatureActivity, CreateEntityFormActivity, HumanTaskActivity, RootConfig, ShowConfirmPopupActivity, ShowLayoutPopupActivity, ShowToastActivity, WorkflowStudioComponent };
5105
5678
  //# sourceMappingURL=acorex-modules-workflow-management.mjs.map