@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.
- package/fesm2022/{acorex-modules-ai-management-acorex-modules-ai-management-WuqoH4OL.mjs → acorex-modules-ai-management-acorex-modules-ai-management-Bqfx8OTv.mjs} +718 -106
- package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-Bqfx8OTv.mjs.map +1 -0
- package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-column.component-D0ruV6aJ.mjs +44 -0
- package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-column.component-D0ruV6aJ.mjs.map +1 -0
- package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-DyczMN-R.mjs +256 -0
- package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-DyczMN-R.mjs.map +1 -0
- package/fesm2022/{acorex-modules-ai-management-agent.entity-DK9GNMdR.mjs → acorex-modules-ai-management-agent.entity-CpSXisAh.mjs} +83 -94
- package/fesm2022/acorex-modules-ai-management-agent.entity-CpSXisAh.mjs.map +1 -0
- 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
- package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CYk2rB36.mjs.map +1 -0
- 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
- 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
- package/fesm2022/{acorex-modules-ai-management-assist.entity-DX2U9sd5.mjs → acorex-modules-ai-management-assist.entity-7uTePpME.mjs} +2 -2
- package/fesm2022/{acorex-modules-ai-management-assist.entity-DX2U9sd5.mjs.map → acorex-modules-ai-management-assist.entity-7uTePpME.mjs.map} +1 -1
- package/fesm2022/acorex-modules-ai-management-index-DUojDUau.mjs +2 -0
- package/fesm2022/{acorex-modules-ai-management-index-KX3TVRXr.mjs.map → acorex-modules-ai-management-index-DUojDUau.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-ai-management-model.entity-BeuDUahR.mjs → acorex-modules-ai-management-model.entity-C9J3trsK.mjs} +2 -2
- package/fesm2022/{acorex-modules-ai-management-model.entity-BeuDUahR.mjs.map → acorex-modules-ai-management-model.entity-C9J3trsK.mjs.map} +1 -1
- 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
- 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
- package/fesm2022/acorex-modules-ai-management.mjs +1 -1
- package/fesm2022/acorex-modules-application-management.mjs +1 -1
- package/fesm2022/acorex-modules-application-management.mjs.map +1 -1
- 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
- package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-CMS2WJDu.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-Ds8pRzvE.mjs → acorex-modules-assessment-management-assessment-case.entity-C-Q4hu8o.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-tq1Q4wkS.mjs → acorex-modules-assessment-management-assessment-session.entity-CQI_FpUd.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-yf0PnWC0.mjs → acorex-modules-assessment-management-fill-assessment-session.command-Bpvco5iD.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-assessment-management-index-B2SncZAW.mjs → acorex-modules-assessment-management-index-_fPuBQeK.mjs} +25 -26
- package/fesm2022/acorex-modules-assessment-management-index-_fPuBQeK.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-preview-question.command-DPzL8C44.mjs → acorex-modules-assessment-management-preview-question.command-drR6nq76.mjs} +10 -11
- package/fesm2022/acorex-modules-assessment-management-preview-question.command-drR6nq76.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BrI5gFtx.mjs → acorex-modules-assessment-management-preview-questionnaire.command-CY8tZWdG.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BrI5gFtx.mjs.map → acorex-modules-assessment-management-preview-questionnaire.command-CY8tZWdG.mjs.map} +1 -1
- 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
- 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
- package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-CZ32sQ9M.mjs → acorex-modules-assessment-management-question-bank-item.entity-DO4bTKKo.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-C7gf4s1y.mjs → acorex-modules-assessment-management-questionnaire-calculation.entity-B-N0v4zs.mjs} +2 -2
- 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
- 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
- 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
- package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-CmmThk2f.mjs → acorex-modules-assessment-management-questionnaire.entity-CJWNlaJs.mjs} +3 -3
- package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-CmmThk2f.mjs.map → acorex-modules-assessment-management-questionnaire.entity-CJWNlaJs.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-GLqvK8wB.mjs → acorex-modules-assessment-management-save-questionnaire-questions.command-C3gOkZa5.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-CU1TVonZ.mjs → acorex-modules-assessment-management-view-session-answers.command-AvTbWvGE.mjs} +2 -2
- 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
- package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
- package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-BDs0ZgD5.mjs → acorex-modules-asset-management-acorex-modules-asset-management-BRap9yt6.mjs} +761 -133
- package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-BRap9yt6.mjs.map +1 -0
- package/fesm2022/acorex-modules-asset-management-asset-rental-history.entity-B_QZI3Cy.mjs +302 -0
- package/fesm2022/acorex-modules-asset-management-asset-rental-history.entity-B_QZI3Cy.mjs.map +1 -0
- package/fesm2022/acorex-modules-asset-management-asset-status.rules-BL0Osjqv.mjs +98 -0
- package/fesm2022/acorex-modules-asset-management-asset-status.rules-BL0Osjqv.mjs.map +1 -0
- 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
- package/fesm2022/acorex-modules-asset-management-asset-system-assignment.entity-BRz8vItS.mjs.map +1 -0
- 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
- package/fesm2022/acorex-modules-asset-management-asset-system-type.entity-b_o5UnuE.mjs.map +1 -0
- package/fesm2022/{acorex-modules-asset-management-assetSystem.entity-Dq2ASslk.mjs → acorex-modules-asset-management-asset-system.entity-C6ak4u9z.mjs} +41 -29
- package/fesm2022/acorex-modules-asset-management-asset-system.entity-C6ak4u9z.mjs.map +1 -0
- 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
- 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
- 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
- package/fesm2022/acorex-modules-asset-management-asset-type-section.entity-C1DJZZFy.mjs.map +1 -0
- package/fesm2022/{acorex-modules-asset-management-asset-type.entity-cWVqpbHH.mjs → acorex-modules-asset-management-asset-type.entity-CtOnArR9.mjs} +68 -105
- package/fesm2022/acorex-modules-asset-management-asset-type.entity-CtOnArR9.mjs.map +1 -0
- package/fesm2022/{acorex-modules-asset-management-asset.entity-CamZGWTM.mjs → acorex-modules-asset-management-asset.entity-BaET-kSd.mjs} +257 -245
- package/fesm2022/acorex-modules-asset-management-asset.entity-BaET-kSd.mjs.map +1 -0
- package/fesm2022/acorex-modules-asset-management-assetLifecycleState.provider-DZ5r2zx7.mjs +192 -0
- package/fesm2022/acorex-modules-asset-management-assetLifecycleState.provider-DZ5r2zx7.mjs.map +1 -0
- package/fesm2022/acorex-modules-asset-management-status.provider-C41t4e2U.mjs +363 -0
- package/fesm2022/acorex-modules-asset-management-status.provider-C41t4e2U.mjs.map +1 -0
- package/fesm2022/acorex-modules-asset-management.mjs +1 -1
- package/fesm2022/acorex-modules-business-core.mjs +17 -11
- package/fesm2022/acorex-modules-business-core.mjs.map +1 -1
- package/fesm2022/acorex-modules-common.mjs +166 -122
- package/fesm2022/acorex-modules-common.mjs.map +1 -1
- package/fesm2022/acorex-modules-conversation.mjs +4786 -4080
- package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
- package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-yqfev--M.mjs +8486 -0
- package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-yqfev--M.mjs.map +1 -0
- package/fesm2022/acorex-modules-dashboard-management-index-CYnWQ2od.mjs +127 -0
- package/fesm2022/acorex-modules-dashboard-management-index-CYnWQ2od.mjs.map +1 -0
- package/fesm2022/acorex-modules-dashboard-management.mjs +1 -7708
- package/fesm2022/acorex-modules-dashboard-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-data-management.mjs +63 -35
- package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-document-management.mjs +131 -62
- package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-financial-core.mjs.map +1 -1
- package/fesm2022/acorex-modules-form-template-management.mjs +1 -1
- package/fesm2022/acorex-modules-form-template-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-health-core-allergy-type.entity-CS8a-AUb.mjs → acorex-modules-health-core-allergy-type.entity-BvJmDMcr.mjs} +3 -3
- package/fesm2022/acorex-modules-health-core-allergy-type.entity-BvJmDMcr.mjs.map +1 -0
- package/fesm2022/{acorex-modules-health-core-blood-type.entity-ZgFOuvG4.mjs → acorex-modules-health-core-blood-type.entity-Vpw9y9J5.mjs} +3 -3
- package/fesm2022/acorex-modules-health-core-blood-type.entity-Vpw9y9J5.mjs.map +1 -0
- package/fesm2022/{acorex-modules-health-core-body-part.entity-JGLwrFE2.mjs → acorex-modules-health-core-body-part.entity-Cz2NEAqm.mjs} +3 -3
- package/fesm2022/acorex-modules-health-core-body-part.entity-Cz2NEAqm.mjs.map +1 -0
- package/fesm2022/{acorex-modules-health-core-chronic-condition-type.entity-DrxEPQj1.mjs → acorex-modules-health-core-chronic-condition-type.entity-CKWVW0Rg.mjs} +3 -3
- package/fesm2022/acorex-modules-health-core-chronic-condition-type.entity-CKWVW0Rg.mjs.map +1 -0
- package/fesm2022/{acorex-modules-health-core-disability-status.entity-UaAQFFMC.mjs → acorex-modules-health-core-disability-status.entity-C7NwwT0i.mjs} +3 -3
- package/fesm2022/acorex-modules-health-core-disability-status.entity-C7NwwT0i.mjs.map +1 -0
- package/fesm2022/{acorex-modules-health-core-injury-type.entity-DcIn0rxz.mjs → acorex-modules-health-core-injury-type.entity-bfzL6j8C.mjs} +3 -3
- package/fesm2022/acorex-modules-health-core-injury-type.entity-bfzL6j8C.mjs.map +1 -0
- package/fesm2022/{acorex-modules-health-core-vaccination-type.entity-zYd6KLRC.mjs → acorex-modules-health-core-vaccination-type.entity-CqymQfWK.mjs} +3 -3
- package/fesm2022/acorex-modules-health-core-vaccination-type.entity-CqymQfWK.mjs.map +1 -0
- package/fesm2022/acorex-modules-health-core.mjs +7 -7
- package/fesm2022/acorex-modules-health-core.mjs.map +1 -1
- package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-Ck9q-IWW.mjs +1922 -0
- package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-Ck9q-IWW.mjs.map +1 -0
- 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
- 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
- package/fesm2022/acorex-modules-human-capital-management-assign-position-assignment.command-Da3u1fo5.mjs +90 -0
- package/fesm2022/acorex-modules-human-capital-management-assign-position-assignment.command-Da3u1fo5.mjs.map +1 -0
- 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
- 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
- package/fesm2022/{acorex-modules-human-capital-management-employee.entity-BRpqFRuI.mjs → acorex-modules-human-capital-management-employee.entity-DjMQm3VC.mjs} +71 -25
- package/fesm2022/acorex-modules-human-capital-management-employee.entity-DjMQm3VC.mjs.map +1 -0
- package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-7ZGZYxGM.mjs → acorex-modules-human-capital-management-employment-type.entity-v8WzEHiE.mjs} +5 -5
- package/fesm2022/acorex-modules-human-capital-management-employment-type.entity-v8WzEHiE.mjs.map +1 -0
- 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
- package/fesm2022/acorex-modules-human-capital-management-leave-request.entity-B9Bf-Nnm.mjs.map +1 -0
- 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
- package/fesm2022/acorex-modules-human-capital-management-leave-type.entity-Bpfd_hNb.mjs.map +1 -0
- 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
- package/fesm2022/acorex-modules-human-capital-management-position-assignment.entity-f0IDrLSn.mjs.map +1 -0
- 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
- 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
- package/fesm2022/acorex-modules-human-capital-management-revoke-position-assignment.command-C3J9pcfh.mjs +97 -0
- package/fesm2022/acorex-modules-human-capital-management-revoke-position-assignment.command-C3J9pcfh.mjs.map +1 -0
- package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1629
- package/fesm2022/acorex-modules-human-capital-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-learning-management-certificate-definition.entity-27VKYxw1.mjs → acorex-modules-learning-management-certificate-definition.entity-C_r1Djcx.mjs} +4 -4
- package/fesm2022/acorex-modules-learning-management-certificate-definition.entity-C_r1Djcx.mjs.map +1 -0
- package/fesm2022/{acorex-modules-learning-management-certificate-type.entity-CBM6N-PD.mjs → acorex-modules-learning-management-certificate-type.entity-DAJNtUya.mjs} +42 -20
- package/fesm2022/acorex-modules-learning-management-certificate-type.entity-DAJNtUya.mjs.map +1 -0
- package/fesm2022/{acorex-modules-learning-management-certificate.entity-BRBJQYji.mjs → acorex-modules-learning-management-certificate.entity-CSD_CX4V.mjs} +5 -5
- package/fesm2022/acorex-modules-learning-management-certificate.entity-CSD_CX4V.mjs.map +1 -0
- package/fesm2022/{acorex-modules-learning-management-course-type.entity-B1c6PDLq.mjs → acorex-modules-learning-management-course-type.entity-DmjeLMxV.mjs} +39 -17
- package/fesm2022/acorex-modules-learning-management-course-type.entity-DmjeLMxV.mjs.map +1 -0
- package/fesm2022/{acorex-modules-learning-management-course.entity-BN8XHAPz.mjs → acorex-modules-learning-management-course.entity-DUUgeikJ.mjs} +3 -3
- package/fesm2022/acorex-modules-learning-management-course.entity-DUUgeikJ.mjs.map +1 -0
- package/fesm2022/{acorex-modules-learning-management-learning-path.entity-8QlM3R4B.mjs → acorex-modules-learning-management-learning-path.entity-Zo--bDto.mjs} +39 -17
- package/fesm2022/acorex-modules-learning-management-learning-path.entity-Zo--bDto.mjs.map +1 -0
- package/fesm2022/{acorex-modules-learning-management-skill-level.entity-DXOWslpB.mjs → acorex-modules-learning-management-skill-level.entity-XVCTHW3O.mjs} +10 -10
- package/fesm2022/acorex-modules-learning-management-skill-level.entity-XVCTHW3O.mjs.map +1 -0
- package/fesm2022/{acorex-modules-learning-management-skill.entity-DrLts807.mjs → acorex-modules-learning-management-skill.entity-VXkLbaD4.mjs} +35 -13
- package/fesm2022/acorex-modules-learning-management-skill.entity-VXkLbaD4.mjs.map +1 -0
- package/fesm2022/{acorex-modules-learning-management-training-definition.entity-NQqJ5avw.mjs → acorex-modules-learning-management-training-definition.entity-BbVZ9_go.mjs} +3 -3
- package/fesm2022/acorex-modules-learning-management-training-definition.entity-BbVZ9_go.mjs.map +1 -0
- package/fesm2022/{acorex-modules-learning-management-training-type.entity-CoyDCeen.mjs → acorex-modules-learning-management-training-type.entity-C1otrA63.mjs} +36 -14
- package/fesm2022/acorex-modules-learning-management-training-type.entity-C1otrA63.mjs.map +1 -0
- package/fesm2022/{acorex-modules-learning-management-training.entity-BCGn0T3H.mjs → acorex-modules-learning-management-training.entity-C4KDv1uh.mjs} +3 -3
- package/fesm2022/acorex-modules-learning-management-training.entity-C4KDv1uh.mjs.map +1 -0
- package/fesm2022/acorex-modules-learning-management.mjs +716 -19
- package/fesm2022/acorex-modules-learning-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-location-management.mjs +18 -99
- package/fesm2022/acorex-modules-location-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-CfHMiVos.mjs +7102 -0
- package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-CfHMiVos.mjs.map +1 -0
- package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-DQJJtCqU.mjs → acorex-modules-maintenance-management-failure-effect.entity-DKbARwJh.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-DQJJtCqU.mjs.map → acorex-modules-maintenance-management-failure-effect.entity-DKbARwJh.mjs.map} +1 -1
- 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
- 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
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-CHUaAnID.mjs → acorex-modules-maintenance-management-failure-mode-mechanism.entity-Dydg4AJ7.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-B93x1uP_.mjs → acorex-modules-maintenance-management-failure-mode-solution.entity-DHiVJHFj.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-McM3l12Q.mjs → acorex-modules-maintenance-management-failure-register-cause.entity-CZfm0U8u.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-_jjy1oeg.mjs → acorex-modules-maintenance-management-failure-register-effect.entity-DbCAFveJ.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-5CmdhowW.mjs → acorex-modules-maintenance-management-failure-register-mechanism.entity-D83Yo6dT.mjs} +2 -2
- 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
- package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-D_lQrda5.mjs → acorex-modules-maintenance-management-failure-register.entity-zKGo9bOs.mjs} +4 -4
- package/fesm2022/acorex-modules-maintenance-management-failure-register.entity-zKGo9bOs.mjs.map +1 -0
- package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BIZxoVIS.mjs → acorex-modules-maintenance-management-failure-severity.entity-Cnvdmt0N.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BIZxoVIS.mjs.map → acorex-modules-maintenance-management-failure-severity.entity-Cnvdmt0N.mjs.map} +1 -1
- package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-CzX0phT-.mjs +391 -0
- package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-CzX0phT-.mjs.map +1 -0
- package/fesm2022/acorex-modules-maintenance-management.mjs +1 -3579
- package/fesm2022/acorex-modules-maintenance-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-measurement-core.mjs.map +1 -1
- package/fesm2022/{acorex-modules-notification-management-notification-page.component-DDhCqJtg.mjs → acorex-modules-notification-management-notification-page.component-D0we6H1f.mjs} +5 -5
- package/fesm2022/{acorex-modules-notification-management-notification-page.component-DDhCqJtg.mjs.map → acorex-modules-notification-management-notification-page.component-D0we6H1f.mjs.map} +1 -1
- package/fesm2022/acorex-modules-notification-management.mjs +36 -22
- package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-organization-management-JOB_DEFINITION_SKILLS_PAGE_COMPONENT_KEY-BYfbGGOE.mjs +8 -0
- package/fesm2022/acorex-modules-organization-management-JOB_DEFINITION_SKILLS_PAGE_COMPONENT_KEY-BYfbGGOE.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-CnAHfj2t.mjs +925 -0
- package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-CnAHfj2t.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-business-unit.entity-Dpf7-aeM.mjs +372 -0
- package/fesm2022/acorex-modules-organization-management-business-unit.entity-Dpf7-aeM.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-chart.entity-bRxA8XHZ.mjs → acorex-modules-organization-management-chart.entity-CQX81AiE.mjs} +37 -33
- package/fesm2022/acorex-modules-organization-management-chart.entity-CQX81AiE.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-company.entity-BohMJQNi.mjs → acorex-modules-organization-management-company.entity-D-RWQ_8O.mjs} +8 -10
- package/fesm2022/acorex-modules-organization-management-company.entity-D-RWQ_8O.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-data-source-evaluator-scope.provider-BrKtojM9.mjs +48 -0
- package/fesm2022/acorex-modules-organization-management-data-source-evaluator-scope.provider-BrKtojM9.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-entity.provider-BdaKwTZq.mjs +61 -0
- package/fesm2022/acorex-modules-organization-management-entity.provider-BdaKwTZq.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-feature-definition.provider-EzMuHJ2K.mjs +19 -0
- package/fesm2022/acorex-modules-organization-management-feature-definition.provider-EzMuHJ2K.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-job-definition-matrix-page.utils-DD3jLujN.mjs +61 -0
- package/fesm2022/acorex-modules-organization-management-job-definition-matrix-page.utils-DD3jLujN.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-job-definition-pages-component.provider-C8_Ab3Q7.mjs +28 -0
- package/fesm2022/acorex-modules-organization-management-job-definition-pages-component.provider-C8_Ab3Q7.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-job-definition-responsibilities-page.component-DHUlvoOO.mjs +223 -0
- package/fesm2022/acorex-modules-organization-management-job-definition-responsibilities-page.component-DHUlvoOO.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-job-definition-skills-page.component-BpVESnnH.mjs +219 -0
- package/fesm2022/acorex-modules-organization-management-job-definition-skills-page.component-BpVESnnH.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-job-definition.entity-S9Jlmr-o.mjs → acorex-modules-organization-management-job-definition.entity-H8VAbZ_r.mjs} +21 -154
- package/fesm2022/acorex-modules-organization-management-job-definition.entity-H8VAbZ_r.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-job-level.datasource-Dxfq0cGw.mjs +95 -0
- package/fesm2022/acorex-modules-organization-management-job-level.datasource-Dxfq0cGw.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-job-level.entity-Bdja794J.mjs +271 -0
- package/fesm2022/acorex-modules-organization-management-job-level.entity-Bdja794J.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-menu.provider-DnvNM-pk.mjs +192 -0
- package/fesm2022/acorex-modules-organization-management-menu.provider-DnvNM-pk.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-org-chart.page-COkMtxFO.mjs +1740 -0
- package/fesm2022/acorex-modules-organization-management-org-chart.page-COkMtxFO.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-organization-code-identifier-rules.provider-pocBJezL.mjs +37 -0
- package/fesm2022/acorex-modules-organization-management-organization-code-identifier-rules.provider-pocBJezL.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-permission-definition.provider-BDLIuqxU.mjs +76 -0
- package/fesm2022/acorex-modules-organization-management-permission-definition.provider-BDLIuqxU.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-position.entity-DLPufeWz.mjs → acorex-modules-organization-management-position.entity-BpbzqtEY.mjs} +113 -112
- package/fesm2022/acorex-modules-organization-management-position.entity-BpbzqtEY.mjs.map +1 -0
- 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
- package/fesm2022/acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CGkXAtH2.mjs.map +1 -0
- 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
- 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
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-B06t1G1E.mjs → acorex-modules-organization-management-responsibilities-matrix.component-D_ClGAIJ.mjs} +14 -21
- package/fesm2022/acorex-modules-organization-management-responsibilities-matrix.component-D_ClGAIJ.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-responsibility-level.entity-CzkogsDv.mjs +135 -0
- package/fesm2022/acorex-modules-organization-management-responsibility-level.entity-CzkogsDv.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-responsibility.entity-CMmr3wJa.mjs → acorex-modules-organization-management-responsibility.entity-DfKM6HV7.mjs} +5 -7
- package/fesm2022/acorex-modules-organization-management-responsibility.entity-DfKM6HV7.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-settings.provider-DaeJkP0y.mjs +228 -0
- package/fesm2022/acorex-modules-organization-management-settings.provider-DaeJkP0y.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-team-business-unit.entity-Cm9qcAG7.mjs +300 -0
- package/fesm2022/acorex-modules-organization-management-team-business-unit.entity-Cm9qcAG7.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management-team-member-role.entity-B3xgLE6N.mjs +150 -0
- package/fesm2022/acorex-modules-organization-management-team-member-role.entity-B3xgLE6N.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-team-member.entity-8sTjn5Jn.mjs → acorex-modules-organization-management-team-member.entity-Dk9t9S1r.mjs} +6 -17
- package/fesm2022/acorex-modules-organization-management-team-member.entity-Dk9t9S1r.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-team.entity-CGR0UlYl.mjs → acorex-modules-organization-management-team.entity-BbcFYP20.mjs} +113 -42
- package/fesm2022/acorex-modules-organization-management-team.entity-BbcFYP20.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management.mjs +1 -2216
- package/fesm2022/acorex-modules-organization-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-platform-dev-tools-menu.provider-BFueKnuF.mjs +40 -0
- package/fesm2022/acorex-modules-platform-dev-tools-menu.provider-BFueKnuF.mjs.map +1 -0
- package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs +33 -0
- package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs.map +1 -0
- package/fesm2022/acorex-modules-platform-dev-tools.mjs +14 -94
- package/fesm2022/acorex-modules-platform-dev-tools.mjs.map +1 -1
- 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
- package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-BjKrHoBg.mjs.map +1 -0
- package/fesm2022/acorex-modules-report-management.mjs +3 -3
- package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-reservation-management-acorex-modules-reservation-management-BMemqW2V.mjs → acorex-modules-reservation-management-acorex-modules-reservation-management-BoUiTlmu.mjs} +65 -76
- package/fesm2022/acorex-modules-reservation-management-acorex-modules-reservation-management-BoUiTlmu.mjs.map +1 -0
- 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
- 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
- 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
- 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
- package/fesm2022/{acorex-modules-reservation-management-reservation-status-transition.entity-2ngXhKAV.mjs → acorex-modules-reservation-management-reservation-status-transition.entity-CQ85ZAGF.mjs} +2 -2
- 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
- package/fesm2022/acorex-modules-reservation-management.mjs +1 -1
- package/fesm2022/acorex-modules-security-management.mjs +507 -179
- package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-task-management-task-board.page-C1H_GTqy.mjs → acorex-modules-task-management-task-board.page-DA2563QE.mjs} +15 -10
- package/fesm2022/acorex-modules-task-management-task-board.page-DA2563QE.mjs.map +1 -0
- package/fesm2022/acorex-modules-task-management.mjs +280 -226
- package/fesm2022/acorex-modules-task-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-workflow-management-WORKFLOW_DEFINITION_ACTIVITIES_PAGE_COMPONENT_KEY-D6q__Ewd.mjs +5 -0
- package/fesm2022/acorex-modules-workflow-management-WORKFLOW_DEFINITION_ACTIVITIES_PAGE_COMPONENT_KEY-D6q__Ewd.mjs.map +1 -0
- 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
- package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-column.component-CDo0QVFy.mjs.map +1 -0
- 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
- package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BYJpDQRs.mjs.map +1 -0
- package/fesm2022/{acorex-modules-workflow-management-activity-definition.entity-Bvs1OfE_.mjs → acorex-modules-workflow-management-activity-definition.entity-B3DkgDQb.mjs} +10 -12
- package/fesm2022/acorex-modules-workflow-management-activity-definition.entity-B3DkgDQb.mjs.map +1 -0
- package/fesm2022/acorex-modules-workflow-management-index-Bx2uYraH.mjs +295 -0
- package/fesm2022/acorex-modules-workflow-management-index-Bx2uYraH.mjs.map +1 -0
- package/fesm2022/{acorex-modules-workflow-management-index-DWIDQsWq.mjs → acorex-modules-workflow-management-index-C9Qc07oK.mjs} +125 -3
- package/fesm2022/acorex-modules-workflow-management-index-C9Qc07oK.mjs.map +1 -0
- package/fesm2022/acorex-modules-workflow-management-index-D8fjNgQJ.mjs +726 -0
- package/fesm2022/acorex-modules-workflow-management-index-D8fjNgQJ.mjs.map +1 -0
- package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs +56 -0
- package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs.map +1 -0
- package/fesm2022/{acorex-modules-workflow-management-workflow-definition.entity-aJou58ED.mjs → acorex-modules-workflow-management-workflow-definition.entity-DqPVpcSv.mjs} +101 -140
- package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-DqPVpcSv.mjs.map +1 -0
- package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-Cq7LE7u5.mjs → acorex-modules-workflow-management-workflow-instance.entity-D-KnWlsU.mjs} +10 -1
- package/fesm2022/acorex-modules-workflow-management-workflow-instance.entity-D-KnWlsU.mjs.map +1 -0
- package/fesm2022/{acorex-modules-workflow-management-workflow-task-popover.component-CIakASVR.mjs → acorex-modules-workflow-management-workflow-task-popover.component-NpUx0sB5.mjs} +11 -7
- package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-NpUx0sB5.mjs.map +1 -0
- package/fesm2022/acorex-modules-workflow-management.mjs +996 -423
- package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
- package/organization-management/README.md +5 -1
- package/package.json +2 -2
- package/types/acorex-modules-ai-management.d.ts +91 -16
- package/types/acorex-modules-asset-management.d.ts +214 -83
- package/types/acorex-modules-business-core.d.ts +8 -11
- package/types/acorex-modules-common.d.ts +20 -8
- package/types/acorex-modules-conversation.d.ts +1 -0
- package/types/acorex-modules-dashboard-management.d.ts +348 -177
- package/types/acorex-modules-data-management.d.ts +2 -2
- package/types/acorex-modules-document-management.d.ts +7 -4
- package/types/acorex-modules-financial-core.d.ts +26 -19
- package/types/acorex-modules-form-template-management.d.ts +3 -3
- package/types/acorex-modules-health-core.d.ts +23 -29
- package/types/acorex-modules-human-capital-management.d.ts +28 -2
- package/types/acorex-modules-learning-management.d.ts +242 -105
- package/types/acorex-modules-maintenance-management.d.ts +563 -41
- package/types/acorex-modules-measurement-core.d.ts +95 -33
- package/types/acorex-modules-notification-management.d.ts +7 -3
- package/types/acorex-modules-organization-management.d.ts +272 -109
- package/types/acorex-modules-security-management.d.ts +40 -1
- package/types/acorex-modules-task-management.d.ts +20 -15
- package/types/acorex-modules-workflow-management.d.ts +121 -15
- package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-WuqoH4OL.mjs.map +0 -1
- package/fesm2022/acorex-modules-ai-management-agent.entity-DK9GNMdR.mjs.map +0 -1
- package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CWXEW9yL.mjs.map +0 -1
- package/fesm2022/acorex-modules-ai-management-index-KX3TVRXr.mjs +0 -2
- package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-BNK6C-Ng.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-index-B2SncZAW.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-preview-question.command-DPzL8C44.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-BDs0ZgD5.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset-system-history.entity-CSCwWY_F.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset-system-type.entity-CcefMT8J.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset-type-section.entity-r_H1QGwp.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset-type.entity-cWVqpbHH.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset.entity-CamZGWTM.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-assetSystem.entity-Dq2ASslk.mjs.map +0 -1
- package/fesm2022/acorex-modules-health-core-allergy-type.entity-CS8a-AUb.mjs.map +0 -1
- package/fesm2022/acorex-modules-health-core-blood-type.entity-ZgFOuvG4.mjs.map +0 -1
- package/fesm2022/acorex-modules-health-core-body-part.entity-JGLwrFE2.mjs.map +0 -1
- package/fesm2022/acorex-modules-health-core-chronic-condition-type.entity-DrxEPQj1.mjs.map +0 -1
- package/fesm2022/acorex-modules-health-core-disability-status.entity-UaAQFFMC.mjs.map +0 -1
- package/fesm2022/acorex-modules-health-core-injury-type.entity-DcIn0rxz.mjs.map +0 -1
- package/fesm2022/acorex-modules-health-core-vaccination-type.entity-zYd6KLRC.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-employee.entity-BRpqFRuI.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-employment-type.entity-7ZGZYxGM.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-leave-request.entity-B3Rk84bJ.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-leave-type.entity-OKu8_PP1.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-position-assignment.entity-D_C459kx.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-certificate-definition.entity-27VKYxw1.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-certificate-type.entity-CBM6N-PD.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-certificate.entity-BRBJQYji.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-course-type.entity-B1c6PDLq.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-course.entity-BN8XHAPz.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-learning-path.entity-8QlM3R4B.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-skill-level.entity-DXOWslpB.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-edit.component-CaeZ9P_I.mjs +0 -162
- package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-edit.component-CaeZ9P_I.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-view.component-1oWMtdrN.mjs +0 -70
- package/fesm2022/acorex-modules-learning-management-skill-matrix-widget-view.component-1oWMtdrN.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-skill-matrix.component-_cFwIN-z.mjs +0 -468
- package/fesm2022/acorex-modules-learning-management-skill-matrix.component-_cFwIN-z.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-skill.entity-DrLts807.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-training-definition.entity-NQqJ5avw.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-training-type.entity-CoyDCeen.mjs.map +0 -1
- package/fesm2022/acorex-modules-learning-management-training.entity-BCGn0T3H.mjs.map +0 -1
- package/fesm2022/acorex-modules-maintenance-management-failure-register.entity-D_lQrda5.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-business-unit-type.entity-C-EKX6Oy.mjs +0 -91
- package/fesm2022/acorex-modules-organization-management-business-unit-type.entity-C-EKX6Oy.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-chart.entity-bRxA8XHZ.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-company.entity-BohMJQNi.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-job-definition.entity-S9Jlmr-o.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-org-chart.page-eRTHzLDQ.mjs +0 -784
- package/fesm2022/acorex-modules-organization-management-org-chart.page-eRTHzLDQ.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-position.entity-DLPufeWz.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-mMZywr0X.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-responsibilities-matrix.component-B06t1G1E.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-responsibility.entity-CMmr3wJa.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-team-member-role.entity-CZ4MibH4.mjs +0 -88
- package/fesm2022/acorex-modules-organization-management-team-member-role.entity-CZ4MibH4.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-team-member.entity-8sTjn5Jn.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-team.entity-CGR0UlYl.mjs.map +0 -1
- package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-DPSNAAct.mjs.map +0 -1
- package/fesm2022/acorex-modules-reservation-management-acorex-modules-reservation-management-BMemqW2V.mjs.map +0 -1
- package/fesm2022/acorex-modules-task-management-task-board.page-C1H_GTqy.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-column.component-C8lgSjfc.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-BGUPxGXP.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-activity-definition.entity-Bvs1OfE_.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-index-DWIDQsWq.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-aJou58ED.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-workflow-instance.entity-Cq7LE7u5.mjs.map +0 -1
- 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 {
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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:
|
|
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:
|
|
255
|
-
title:
|
|
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:
|
|
260
|
-
xAxisLabel:
|
|
261
|
-
yAxisLabel:
|
|
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:
|
|
272
|
-
title:
|
|
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:
|
|
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:
|
|
287
|
-
title:
|
|
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:
|
|
292
|
-
xAxisLabel:
|
|
293
|
-
yAxisLabel:
|
|
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:
|
|
304
|
-
title:
|
|
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:
|
|
309
|
-
xAxisLabel:
|
|
310
|
-
yAxisLabel:
|
|
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:
|
|
323
|
-
title:
|
|
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:
|
|
328
|
-
xAxisLabel:
|
|
329
|
-
yAxisLabel:
|
|
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:
|
|
340
|
-
title:
|
|
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:
|
|
345
|
-
label:
|
|
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: '
|
|
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:
|
|
367
|
-
title:
|
|
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:
|
|
372
|
-
xAxisLabel:
|
|
373
|
-
yAxisLabel:
|
|
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:
|
|
384
|
-
title:
|
|
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:
|
|
389
|
-
xAxisLabel:
|
|
390
|
-
yAxisLabel:
|
|
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:
|
|
403
|
-
title:
|
|
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:
|
|
408
|
-
xAxisLabel:
|
|
409
|
-
yAxisLabel:
|
|
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:
|
|
420
|
-
title:
|
|
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:
|
|
425
|
-
xAxisLabel:
|
|
426
|
-
yAxisLabel:
|
|
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:
|
|
437
|
-
title:
|
|
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:
|
|
442
|
-
xAxisLabel:
|
|
443
|
-
yAxisLabel:
|
|
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:
|
|
454
|
-
title:
|
|
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:
|
|
459
|
-
xAxisLabel:
|
|
460
|
-
yAxisLabel:
|
|
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:
|
|
471
|
-
title:
|
|
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:
|
|
476
|
-
xAxisLabel:
|
|
477
|
-
yAxisLabel:
|
|
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:
|
|
491
|
-
title:
|
|
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:
|
|
496
|
-
xAxisLabel:
|
|
497
|
-
yAxisLabel:
|
|
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:
|
|
510
|
-
title:
|
|
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:
|
|
515
|
-
xAxisLabel:
|
|
516
|
-
yAxisLabel:
|
|
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:
|
|
529
|
-
title:
|
|
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:
|
|
534
|
-
xAxisLabel:
|
|
535
|
-
yAxisLabel:
|
|
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:
|
|
546
|
-
title:
|
|
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:
|
|
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:
|
|
561
|
-
title:
|
|
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:
|
|
566
|
-
xAxisLabel:
|
|
567
|
-
yAxisLabel:
|
|
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:
|
|
578
|
-
title:
|
|
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:
|
|
583
|
-
xAxisLabel:
|
|
584
|
-
yAxisLabel:
|
|
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:
|
|
595
|
-
title:
|
|
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:
|
|
600
|
-
xAxisLabel:
|
|
601
|
-
yAxisLabel:
|
|
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:
|
|
612
|
-
title:
|
|
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:
|
|
617
|
-
xAxisLabel:
|
|
618
|
-
yAxisLabel:
|
|
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:
|
|
629
|
-
title:
|
|
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:
|
|
634
|
-
xAxisLabel:
|
|
635
|
-
yAxisLabel:
|
|
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:
|
|
646
|
-
title:
|
|
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:
|
|
651
|
-
xAxisLabel:
|
|
652
|
-
yAxisLabel:
|
|
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-
|
|
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-
|
|
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-
|
|
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(
|
|
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
|
-
//
|
|
2241
|
-
if (payload
|
|
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
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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(
|
|
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
|
|
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}:${
|
|
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
|
|
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
|
|
3169
|
-
inputs: (workflowDef.inputs || []).map((input) => (
|
|
3170
|
-
|
|
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.
|
|
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:
|
|
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
|
|
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.
|
|
3373
|
-
required:
|
|
3374
|
-
description: input.description,
|
|
3375
|
-
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
|
-
*
|
|
4005
|
+
* Map {@link AXPProperty.dataType} to visual editor property type.
|
|
3404
4006
|
*/
|
|
3405
|
-
|
|
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
|
-
|
|
3426
|
-
|
|
3427
|
-
|
|
3428
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
3878
|
-
inputs: (workflow.inputs || []).map(
|
|
3879
|
-
outputs: (workflow.outputs || []).map(
|
|
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
|
-
|
|
3941
|
-
|
|
3942
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
4012
|
-
|
|
4013
|
-
|
|
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
|
-
|
|
4026
|
-
|
|
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 +
|
|
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' &&
|
|
5072
|
+
(propertyName === 'actions' &&
|
|
5073
|
+
(node.type === 'workflow-activity:human-task' || node.type === 'workflow-activity:cartable'));
|
|
4498
5074
|
if (shouldRecomputeOutcomes) {
|
|
4499
|
-
this.findActivityInfo(node.type)
|
|
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
|
-
})
|
|
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 ?? [])
|
|
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
|
|
4699
|
-
if (activityInfo.type === 'workflow-activity:human-task'
|
|
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
|
-
|
|
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
|
-
|
|
4938
|
-
|
|
4939
|
-
|
|
4940
|
-
|
|
4941
|
-
|
|
4942
|
-
|
|
4943
|
-
|
|
4944
|
-
|
|
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
|
-
|
|
5012
|
-
|
|
5584
|
+
Done: '#10b981', // Green - Success
|
|
5585
|
+
Success: '#10b981', // Green - Success
|
|
5013
5586
|
'404': '#ef4444', // Red - Error
|
|
5014
5587
|
'500': '#ef4444', // Red - Error
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5020
|
-
|
|
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
|