@acorex/modules 21.0.0-next.14 → 21.0.0-next.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/assessment-management/README.md +11 -0
  2. package/assessment-management/index.d.ts +122 -24
  3. package/common/index.d.ts +6 -1
  4. package/data-management/index.d.ts +67 -48
  5. package/document-management/index.d.ts +261 -76
  6. package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-ClgGS32i.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-HgaOIA2U.mjs} +950 -468
  7. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-HgaOIA2U.mjs.map +1 -0
  8. package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-column.component-UmXUT6Xn.mjs → acorex-modules-assessment-management-answers-viewer-widget-column.component-DyxE9Xec.mjs} +2 -2
  9. package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-column.component-UmXUT6Xn.mjs.map → acorex-modules-assessment-management-answers-viewer-widget-column.component-DyxE9Xec.mjs.map} +1 -1
  10. package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-edit.component-vVfXtden.mjs → acorex-modules-assessment-management-answers-viewer-widget-edit.component-DC2Ep3r1.mjs} +2 -2
  11. package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-edit.component-vVfXtden.mjs.map → acorex-modules-assessment-management-answers-viewer-widget-edit.component-DC2Ep3r1.mjs.map} +1 -1
  12. package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-view.component-C75zxKgV.mjs → acorex-modules-assessment-management-answers-viewer-widget-view.component-iKqac5PE.mjs} +2 -2
  13. package/fesm2022/{acorex-modules-assessment-management-answers-viewer-widget-view.component-C75zxKgV.mjs.map → acorex-modules-assessment-management-answers-viewer-widget-view.component-iKqac5PE.mjs.map} +1 -1
  14. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-CjhC5YAF.mjs → acorex-modules-assessment-management-assessment-case.entity-CsCMlcvF.mjs} +3 -3
  15. package/fesm2022/acorex-modules-assessment-management-assessment-case.entity-CsCMlcvF.mjs.map +1 -0
  16. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-B_IDiEzp.mjs → acorex-modules-assessment-management-assessment-session.entity-BkNVe3FO.mjs} +2 -2
  17. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-B_IDiEzp.mjs.map → acorex-modules-assessment-management-assessment-session.entity-BkNVe3FO.mjs.map} +1 -1
  18. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-zT5u3h_s.mjs → acorex-modules-assessment-management-fill-assessment-session.command-Dgeh3E5f.mjs} +32 -33
  19. package/fesm2022/acorex-modules-assessment-management-fill-assessment-session.command-Dgeh3E5f.mjs.map +1 -0
  20. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BIXy9eut.mjs → acorex-modules-assessment-management-preview-questionnaire.command-NcZlE6DU.mjs} +24 -8
  21. package/fesm2022/acorex-modules-assessment-management-preview-questionnaire.command-NcZlE6DU.mjs.map +1 -0
  22. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-BWYLXvCp.mjs → acorex-modules-assessment-management-question-bank-item.entity-vNxSmJuv.mjs} +2 -2
  23. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-BWYLXvCp.mjs.map → acorex-modules-assessment-management-question-bank-item.entity-vNxSmJuv.mjs.map} +1 -1
  24. package/fesm2022/{acorex-modules-assessment-management-questionnaire-builder-edit.component-3wVcKQGE.mjs → acorex-modules-assessment-management-questionnaire-builder-edit.component-CbfHOFT1.mjs} +20 -4
  25. package/fesm2022/acorex-modules-assessment-management-questionnaire-builder-edit.component-CbfHOFT1.mjs.map +1 -0
  26. package/fesm2022/{acorex-modules-assessment-management-questionnaire-builder-view.component-meuUo7Vx.mjs → acorex-modules-assessment-management-questionnaire-builder-view.component-DDqDjzwH.mjs} +3 -3
  27. package/fesm2022/acorex-modules-assessment-management-questionnaire-builder-view.component-DDqDjzwH.mjs.map +1 -0
  28. package/fesm2022/{acorex-modules-assessment-management-questionnaire-builder.component-CGgUUkOY.mjs → acorex-modules-assessment-management-questionnaire-builder.component-BOnwdWj7.mjs} +11 -5
  29. package/fesm2022/acorex-modules-assessment-management-questionnaire-builder.component-BOnwdWj7.mjs.map +1 -0
  30. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-BX8Q2Kfn.mjs +392 -0
  31. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-BX8Q2Kfn.mjs.map +1 -0
  32. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer.service-D3k3J93r.mjs → acorex-modules-assessment-management-questionnaire-viewer.service-CSdVNxV2.mjs} +21 -6
  33. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer.service-CSdVNxV2.mjs.map +1 -0
  34. package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-C8sX0d_p.mjs → acorex-modules-assessment-management-questionnaire.entity-DFQIvlza.mjs} +138 -23
  35. package/fesm2022/acorex-modules-assessment-management-questionnaire.entity-DFQIvlza.mjs.map +1 -0
  36. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-Czq7cj9R.mjs → acorex-modules-assessment-management-view-session-answers.command-CMmE72Kt.mjs} +3 -3
  37. package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-Czq7cj9R.mjs.map → acorex-modules-assessment-management-view-session-answers.command-CMmE72Kt.mjs.map} +1 -1
  38. package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
  39. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-DHSmTid9.mjs → acorex-modules-auth-acorex-modules-auth-CZuDhBx5.mjs} +15 -15
  40. package/fesm2022/acorex-modules-auth-acorex-modules-auth-CZuDhBx5.mjs.map +1 -0
  41. package/fesm2022/{acorex-modules-auth-app-chooser.component-BgnYEXEl.mjs → acorex-modules-auth-app-chooser.component-DJE47I8p.mjs} +2 -2
  42. package/fesm2022/{acorex-modules-auth-app-chooser.component-BgnYEXEl.mjs.map → acorex-modules-auth-app-chooser.component-DJE47I8p.mjs.map} +1 -1
  43. package/fesm2022/{acorex-modules-auth-login.module-BvhI4dAz.mjs → acorex-modules-auth-login.module-CI_lkyb7.mjs} +4 -4
  44. package/fesm2022/{acorex-modules-auth-login.module-BvhI4dAz.mjs.map → acorex-modules-auth-login.module-CI_lkyb7.mjs.map} +1 -1
  45. package/fesm2022/{acorex-modules-auth-master.layout-D4zZR1Gr.mjs → acorex-modules-auth-master.layout-CdY380qS.mjs} +2 -2
  46. package/fesm2022/{acorex-modules-auth-master.layout-D4zZR1Gr.mjs.map → acorex-modules-auth-master.layout-CdY380qS.mjs.map} +1 -1
  47. package/fesm2022/{acorex-modules-auth-oauth-callback.component-DniYj9Tx.mjs → acorex-modules-auth-oauth-callback.component-BvPk9b3e.mjs} +2 -2
  48. package/fesm2022/{acorex-modules-auth-oauth-callback.component-DniYj9Tx.mjs.map → acorex-modules-auth-oauth-callback.component-BvPk9b3e.mjs.map} +1 -1
  49. package/fesm2022/{acorex-modules-auth-password.component-mvQ4KY3g.mjs → acorex-modules-auth-password.component-CefISnvd.mjs} +2 -2
  50. package/fesm2022/{acorex-modules-auth-password.component-mvQ4KY3g.mjs.map → acorex-modules-auth-password.component-CefISnvd.mjs.map} +1 -1
  51. package/fesm2022/{acorex-modules-auth-password.component-CZkZAj32.mjs → acorex-modules-auth-password.component-Dw_v_EFQ.mjs} +2 -2
  52. package/fesm2022/{acorex-modules-auth-password.component-CZkZAj32.mjs.map → acorex-modules-auth-password.component-Dw_v_EFQ.mjs.map} +1 -1
  53. package/fesm2022/{acorex-modules-auth-routes-6Ulmk7si.mjs → acorex-modules-auth-routes-CwcJHbAi.mjs} +2 -2
  54. package/fesm2022/{acorex-modules-auth-routes-6Ulmk7si.mjs.map → acorex-modules-auth-routes-CwcJHbAi.mjs.map} +1 -1
  55. package/fesm2022/{acorex-modules-auth-tenant-chooser.component-3OkOSTkm.mjs → acorex-modules-auth-tenant-chooser.component-DFhTYEDt.mjs} +2 -2
  56. package/fesm2022/{acorex-modules-auth-tenant-chooser.component-3OkOSTkm.mjs.map → acorex-modules-auth-tenant-chooser.component-DFhTYEDt.mjs.map} +1 -1
  57. package/fesm2022/{acorex-modules-auth-two-factor.module-DtrVmYAu.mjs → acorex-modules-auth-two-factor.module-BOZB6sLo.mjs} +2 -2
  58. package/fesm2022/{acorex-modules-auth-two-factor.module-DtrVmYAu.mjs.map → acorex-modules-auth-two-factor.module-BOZB6sLo.mjs.map} +1 -1
  59. package/fesm2022/{acorex-modules-auth-user-sessions.component-Co18_D9H.mjs → acorex-modules-auth-user-sessions.component-BnrnXg4G.mjs} +2 -2
  60. package/fesm2022/{acorex-modules-auth-user-sessions.component-Co18_D9H.mjs.map → acorex-modules-auth-user-sessions.component-BnrnXg4G.mjs.map} +1 -1
  61. package/fesm2022/acorex-modules-auth.mjs +1 -1
  62. package/fesm2022/acorex-modules-calendar-management.mjs +4 -3
  63. package/fesm2022/acorex-modules-calendar-management.mjs.map +1 -1
  64. package/fesm2022/acorex-modules-common.mjs +35 -29
  65. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  66. package/fesm2022/acorex-modules-data-management.mjs +333 -342
  67. package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
  68. package/fesm2022/acorex-modules-document-management.mjs +2716 -527
  69. package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
  70. package/fesm2022/acorex-modules-human-capital-management-leave-request-task-popover.component-yGvT9kSL.mjs +381 -0
  71. package/fesm2022/acorex-modules-human-capital-management-leave-request-task-popover.component-yGvT9kSL.mjs.map +1 -0
  72. package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-CviI9xJC.mjs → acorex-modules-human-capital-management-leave-request.entity-BDSyXKSF.mjs} +2 -2
  73. package/fesm2022/acorex-modules-human-capital-management-leave-request.entity-BDSyXKSF.mjs.map +1 -0
  74. package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-CY81Nohl.mjs → acorex-modules-human-capital-management-leave-type.entity-YitcNesR.mjs} +6 -2
  75. package/fesm2022/acorex-modules-human-capital-management-leave-type.entity-YitcNesR.mjs.map +1 -0
  76. package/fesm2022/acorex-modules-human-capital-management.mjs +696 -351
  77. package/fesm2022/acorex-modules-human-capital-management.mjs.map +1 -1
  78. package/fesm2022/acorex-modules-locale-management.mjs +11 -2
  79. package/fesm2022/acorex-modules-locale-management.mjs.map +1 -1
  80. package/fesm2022/acorex-modules-notification-management.mjs +1 -1
  81. package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
  82. package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-BRVfUYiM.mjs → acorex-modules-settings-management-acorex-modules-settings-management-Dpjfgmg9.mjs} +6 -6
  83. package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-BRVfUYiM.mjs.map → acorex-modules-settings-management-acorex-modules-settings-management-Dpjfgmg9.mjs.map} +1 -1
  84. package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-WSxrvAsV.mjs → acorex-modules-settings-management-permission-definition.provider-nYV8iDwJ.mjs} +2 -2
  85. package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-WSxrvAsV.mjs.map → acorex-modules-settings-management-permission-definition.provider-nYV8iDwJ.mjs.map} +1 -1
  86. package/fesm2022/{acorex-modules-settings-management-setting-page.component-MYnJYUxE.mjs → acorex-modules-settings-management-setting-page.component-B1lhCtl_.mjs} +2 -2
  87. package/fesm2022/{acorex-modules-settings-management-setting-page.component-MYnJYUxE.mjs.map → acorex-modules-settings-management-setting-page.component-B1lhCtl_.mjs.map} +1 -1
  88. package/fesm2022/{acorex-modules-settings-management-setting-view.component-Cq80snth.mjs → acorex-modules-settings-management-setting-view.component-CAX1kFy2.mjs} +2 -2
  89. package/fesm2022/{acorex-modules-settings-management-setting-view.component-Cq80snth.mjs.map → acorex-modules-settings-management-setting-view.component-CAX1kFy2.mjs.map} +1 -1
  90. package/fesm2022/acorex-modules-settings-management.mjs +1 -1
  91. package/fesm2022/acorex-modules-system-insight.mjs +4 -3
  92. package/fesm2022/acorex-modules-system-insight.mjs.map +1 -1
  93. package/fesm2022/{acorex-modules-task-management-task-board.page-B_S373L-.mjs → acorex-modules-task-management-task-board.page-CuP9U1h8.mjs} +60 -53
  94. package/fesm2022/acorex-modules-task-management-task-board.page-CuP9U1h8.mjs.map +1 -0
  95. package/fesm2022/acorex-modules-task-management.mjs +11 -39
  96. package/fesm2022/acorex-modules-task-management.mjs.map +1 -1
  97. package/fesm2022/acorex-modules-workflow-management-cartable-page.component-Bso0XRkJ.mjs +296 -0
  98. package/fesm2022/acorex-modules-workflow-management-cartable-page.component-Bso0XRkJ.mjs.map +1 -0
  99. package/fesm2022/acorex-modules-workflow-management-index-xB36g4F1.mjs +469 -0
  100. package/fesm2022/acorex-modules-workflow-management-index-xB36g4F1.mjs.map +1 -0
  101. package/fesm2022/acorex-modules-workflow-management.mjs +2507 -681
  102. package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
  103. package/human-capital-management/index.d.ts +79 -19
  104. package/package.json +16 -16
  105. package/task-management/index.d.ts +1 -12
  106. package/workflow-management/index.d.ts +265 -220
  107. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-ClgGS32i.mjs.map +0 -1
  108. package/fesm2022/acorex-modules-assessment-management-assessment-case.entity-CjhC5YAF.mjs.map +0 -1
  109. package/fesm2022/acorex-modules-assessment-management-fill-assessment-session.command-zT5u3h_s.mjs.map +0 -1
  110. package/fesm2022/acorex-modules-assessment-management-preview-questionnaire.command-BIXy9eut.mjs.map +0 -1
  111. package/fesm2022/acorex-modules-assessment-management-questionnaire-builder-edit.component-3wVcKQGE.mjs.map +0 -1
  112. package/fesm2022/acorex-modules-assessment-management-questionnaire-builder-view.component-meuUo7Vx.mjs.map +0 -1
  113. package/fesm2022/acorex-modules-assessment-management-questionnaire-builder.component-CGgUUkOY.mjs.map +0 -1
  114. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-kVnWtedV.mjs +0 -416
  115. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-kVnWtedV.mjs.map +0 -1
  116. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer.service-D3k3J93r.mjs.map +0 -1
  117. package/fesm2022/acorex-modules-assessment-management-questionnaire.entity-C8sX0d_p.mjs.map +0 -1
  118. package/fesm2022/acorex-modules-auth-acorex-modules-auth-DHSmTid9.mjs.map +0 -1
  119. package/fesm2022/acorex-modules-human-capital-management-leave-request.entity-CviI9xJC.mjs.map +0 -1
  120. package/fesm2022/acorex-modules-human-capital-management-leave-type.entity-CY81Nohl.mjs.map +0 -1
  121. package/fesm2022/acorex-modules-task-management-task-board.page-B_S373L-.mjs.map +0 -1
  122. package/fesm2022/acorex-modules-workflow-management-activity-definition.entity-BbBEPTBa.mjs +0 -258
  123. package/fesm2022/acorex-modules-workflow-management-activity-definition.entity-BbBEPTBa.mjs.map +0 -1
  124. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-nJMBL0qt.mjs +0 -371
  125. package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-nJMBL0qt.mjs.map +0 -1
  126. package/fesm2022/acorex-modules-workflow-management-workflow-instance.entity-Pso0oRN5.mjs +0 -313
  127. package/fesm2022/acorex-modules-workflow-management-workflow-instance.entity-Pso0oRN5.mjs.map +0 -1
@@ -1,25 +1,24 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, inject, NgModule, InjectionToken, Inject, makeEnvironmentProviders, Injector, runInInjectionContext, output, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, signal } from '@angular/core';
2
+ import { inject, Injector, Injectable, NgModule, output, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, signal } from '@angular/core';
3
3
  import { AXPSessionService, AXPAuthGuard, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex/platform/auth';
4
- import { AXPEntityService, AXPEntityStorageService, AXPEntityFormBuilderService, AXPEntityDefinitionRegistryService, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_CONFIG_TOKEN, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
4
+ import { AXPEntityService, AXMEntityCrudServiceImpl, entityMasterCrudActions, entityMasterRecordActions, entityMasterDeleteAction, AXPEntityStorageService, AXPEntityFormBuilderService, AXPEntityDefinitionRegistryService, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_CONFIG_TOKEN, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
5
5
  import { firstValueFrom } from 'rxjs';
6
6
  import { AXMCalendarManagementModule } from '@acorex/modules/calendar-management';
7
- import { AXPSystemStatuses, AXP_MENU_PROVIDER } from '@acorex/platform/common';
7
+ import { createAllQueryView, AXPEntityQueryType, AXPEntityCommandScope, createQueryView, AXP_MENU_PROVIDER } from '@acorex/platform/common';
8
8
  import { AXPDataGenerator, AXP_MODULE_MANIFEST_PROVIDER } from '@acorex/platform/core';
9
9
  import { AXPDomainModule } from '@acorex/platform/domain';
10
10
  import { provideCommandSetups } from '@acorex/platform/runtime';
11
- import { AXPWorkflowManager, AXPWorkflowDefinitionService, AXP_WORKFLOW_PROVIDER, AXP_ACTIVITY_CATEGORY_PROVIDER, AXP_ACTIVITY_PROVIDER, AXP_WORKFLOW_CATEGORY_PROVIDER, AXPActivityDefinitionService } from '@acorex/platform/workflow';
11
+ import { AXP_WORKFLOW_PROVIDER, AXP_ACTIVITY_CATEGORY_PROVIDER, AXP_ACTIVITY_PROVIDER, AXP_WORKFLOW_CATEGORY_PROVIDER, AXPActivityDefinitionService, AXPWorkflowManager, AXPWorkflowDefinitionService } from '@acorex/platform/workflow';
12
12
  import { ROUTES, ActivatedRoute, Router } from '@angular/router';
13
+ import { AXPWidgetsCatalog, AXPWidgetSerializationHelper } from '@acorex/platform/layout/widget-core';
14
+ import { AXPWidgetsList } from '@acorex/modules/common';
13
15
  import { AXDialogService } from '@acorex/components/dialog';
14
- import * as i6 from '@acorex/core/translation';
16
+ import * as i7 from '@acorex/core/translation';
15
17
  import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
16
- import { AXPWidgetSerializationHelper } from '@acorex/platform/layout/widget-core';
17
18
  import { AXPopupService } from '@acorex/components/popup';
18
19
  import { AXPDialogRendererComponent, AXPLayoutBuilderService } from '@acorex/platform/layout/builder';
19
20
  import { cloneDeep } from 'lodash-es';
20
21
  import { AXToastService } from '@acorex/components/toast';
21
- import { AXPWidgetsList } from '@acorex/modules/common';
22
- import { AXPWorkflowTaskProvider, AXP_WORKFLOW_TASK_PROVIDER } from '@acorex/modules/task-management';
23
22
  import * as i5 from '@angular/common';
24
23
  import { CommonModule } from '@angular/common';
25
24
  import * as i1 from '@angular/forms';
@@ -28,7 +27,7 @@ import * as i2 from '@acorex/components/button';
28
27
  import { AXButtonModule } from '@acorex/components/button';
29
28
  import * as i3 from '@acorex/components/button-group';
30
29
  import { AXButtonGroupModule } from '@acorex/components/button-group';
31
- import * as i4 from '@acorex/components/decorators';
30
+ import * as i2$1 from '@acorex/components/decorators';
32
31
  import { AXDecoratorModule } from '@acorex/components/decorators';
33
32
  import { AXTextBoxModule } from '@acorex/components/text-box';
34
33
  import { AXSelectBoxModule } from '@acorex/components/select-box';
@@ -62,6 +61,13 @@ const RootConfig = {
62
61
  titlePlural: '@workflow-management:workflow-instances.entities.workflow-instance.plural',
63
62
  icon: 'fa-light fa-play-circle',
64
63
  },
64
+ activityCategory: {
65
+ name: 'ActivityCategory',
66
+ fullName: `${config.module}.ActivityCategory`,
67
+ title: '@workflow-management:activities.entities.activity-category.title',
68
+ titlePlural: '@workflow-management:activities.entities.activity-category.plural',
69
+ icon: 'fa-light fa-folder',
70
+ },
65
71
  activityDefinition: {
66
72
  name: 'ActivityDefinition',
67
73
  fullName: `${config.module}.ActivityDefinition`,
@@ -69,6 +75,20 @@ const RootConfig = {
69
75
  titlePlural: '@workflow-management:activities.entities.activity-definition.plural',
70
76
  icon: 'fa-light fa-puzzle-piece',
71
77
  },
78
+ workItem: {
79
+ name: 'WorkItem',
80
+ fullName: `${config.module}.WorkItem`,
81
+ title: '@workflow-management:work-items.entities.work-item.title',
82
+ titlePlural: '@workflow-management:work-items.entities.work-item.plural',
83
+ icon: 'fa-light fa-clipboard-list',
84
+ },
85
+ workItemCandidate: {
86
+ name: 'WorkItemCandidate',
87
+ fullName: `${config.module}.WorkItemCandidate`,
88
+ title: '@workflow-management:work-items.entities.work-item-candidate.title',
89
+ titlePlural: '@workflow-management:work-items.entities.work-item-candidate.plural',
90
+ icon: 'fa-light fa-user-check',
91
+ },
72
92
  // workflowCategory: {
73
93
  // name: 'WorkflowCategory',
74
94
  // fullName: `${config.module}.WorkflowCategory`,
@@ -80,6 +100,9 @@ const RootConfig = {
80
100
  };
81
101
 
82
102
  class AXMWorkflowManagementModuleEntityProvider {
103
+ constructor() {
104
+ this.injector = inject(Injector);
105
+ }
83
106
  preload() {
84
107
  const module = RootConfig.module.name;
85
108
  return Array.from(Object.values(RootConfig.entities)).map((entity) => ({
@@ -91,11 +114,17 @@ class AXMWorkflowManagementModuleEntityProvider {
91
114
  if (moduleName === RootConfig.module.name) {
92
115
  switch (entityName) {
93
116
  case RootConfig.entities.workflowDefinition.name:
94
- return (await import('./acorex-modules-workflow-management-workflow-definition.entity-nJMBL0qt.mjs')).factory();
117
+ return (await Promise.resolve().then(function () { return workflowDefinition_entity; })).factory(this.injector);
95
118
  case RootConfig.entities.workflowInstance.name:
96
- return (await import('./acorex-modules-workflow-management-workflow-instance.entity-Pso0oRN5.mjs')).factory();
119
+ return (await Promise.resolve().then(function () { return workflowInstance_entity; })).factory(this.injector);
120
+ case RootConfig.entities.activityCategory.name:
121
+ return (await Promise.resolve().then(function () { return activityCategory_entity; })).factory(this.injector);
97
122
  case RootConfig.entities.activityDefinition.name:
98
- return (await import('./acorex-modules-workflow-management-activity-definition.entity-BbBEPTBa.mjs')).factory();
123
+ return (await Promise.resolve().then(function () { return activityDefinition_entity; })).factory(this.injector);
124
+ case RootConfig.entities.workItem.name:
125
+ return (await Promise.resolve().then(function () { return workItem_entity; })).factory(this.injector);
126
+ case RootConfig.entities.workItemCandidate.name:
127
+ return (await Promise.resolve().then(function () { return workItemCandidate_entity; })).factory(this.injector);
99
128
  }
100
129
  }
101
130
  return null;
@@ -118,7 +147,12 @@ const AXPWorkflowManagementMenuKeys = {
118
147
  WorkflowInstances: 'workflow-management:workflow-instances',
119
148
  WorkflowStudio: 'workflow-management:workflow-studio',
120
149
  Activities: 'workflow-management:activities',
150
+ ActivityCategories: 'workflow-management:activity-categories',
121
151
  ActivityDefinitions: 'workflow-management:activity-definitions',
152
+ Work: 'workflow-management:work',
153
+ Cartable: 'workflow-management:cartable',
154
+ WorkItems: 'workflow-management:work-items',
155
+ WorkItemCandidates: 'workflow-management:work-item-candidates',
122
156
  };
123
157
 
124
158
  class AXMMenuProvider {
@@ -143,38 +177,2347 @@ class AXMMenuProvider {
143
177
  },
144
178
  children: [
145
179
  {
146
- name: AXPWorkflowManagementMenuKeys.WorkflowDefinitions,
147
- text: '@workflow-management:workflow-definitions.menus.workflow-definitions.title',
148
- path: this.entityService.createPath(module.name, RootConfig.entities.workflowDefinition.name),
180
+ name: AXPWorkflowManagementMenuKeys.Workflow,
181
+ text: '@workflow-management:workflow.menus.workflow.title',
149
182
  priority: 10,
150
- icon: RootConfig.entities.workflowDefinition.icon,
183
+ icon: 'fa-light fa-diagram-project',
184
+ children: [
185
+ {
186
+ name: AXPWorkflowManagementMenuKeys.WorkflowDefinitions,
187
+ text: '@workflow-management:workflow-definitions.menus.workflow-definitions.title',
188
+ path: this.entityService.createPath(module.name, RootConfig.entities.workflowDefinition.name),
189
+ priority: 10,
190
+ icon: RootConfig.entities.workflowDefinition.icon,
191
+ },
192
+ {
193
+ name: AXPWorkflowManagementMenuKeys.WorkflowInstances,
194
+ text: '@workflow-management:workflow-instances.menus.workflow-instances.title',
195
+ path: this.entityService.createPath(module.name, RootConfig.entities.workflowInstance.name),
196
+ priority: 20,
197
+ icon: RootConfig.entities.workflowInstance.icon,
198
+ },
199
+ {
200
+ name: AXPWorkflowManagementMenuKeys.WorkflowStudio,
201
+ text: '@workflow-management:workflow-studio.menus.workflow-studio.title',
202
+ path: `${this.sessionService.application?.name}/workflow-management/studio`,
203
+ priority: 30,
204
+ icon: 'fa-light fa-wand-magic-sparkles',
205
+ },
206
+ ],
151
207
  },
152
208
  {
153
- name: AXPWorkflowManagementMenuKeys.WorkflowInstances,
154
- text: '@workflow-management:workflow-instances.menus.workflow-instances.title',
155
- path: this.entityService.createPath(module.name, RootConfig.entities.workflowInstance.name),
209
+ name: AXPWorkflowManagementMenuKeys.Activities,
210
+ text: '@workflow-management:activities.menus.activities.title',
156
211
  priority: 20,
157
- icon: RootConfig.entities.workflowInstance.icon,
212
+ icon: 'fa-light fa-puzzle-piece',
213
+ children: [
214
+ {
215
+ name: AXPWorkflowManagementMenuKeys.ActivityCategories,
216
+ text: '@workflow-management:activities.menus.activity-categories.title',
217
+ path: this.entityService.createPath(module.name, RootConfig.entities.activityCategory.name),
218
+ priority: 10,
219
+ icon: RootConfig.entities.activityCategory.icon,
220
+ },
221
+ {
222
+ name: AXPWorkflowManagementMenuKeys.ActivityDefinitions,
223
+ text: '@workflow-management:activities.menus.activity-definitions.title',
224
+ path: this.entityService.createPath(module.name, RootConfig.entities.activityDefinition.name),
225
+ priority: 20,
226
+ icon: RootConfig.entities.activityDefinition.icon,
227
+ },
228
+ ],
158
229
  },
159
230
  {
160
- name: AXPWorkflowManagementMenuKeys.WorkflowStudio,
161
- text: '@workflow-management:workflow-studio.menus.workflow-studio.title',
162
- path: `/${this.sessionService.application?.name ?? module.name}/workflow-management/studio`,
231
+ name: AXPWorkflowManagementMenuKeys.Work,
232
+ text: '@workflow-management:work.menus.work.title',
163
233
  priority: 30,
164
- icon: 'fa-light fa-wrench',
165
- },
166
- {
167
- name: AXPWorkflowManagementMenuKeys.ActivityDefinitions,
168
- text: '@workflow-management:activities.menus.activity.title',
169
- path: this.entityService.createPath(module.name, RootConfig.entities.activityDefinition.name),
170
- priority: 40,
171
- icon: RootConfig.entities.activityDefinition.icon,
234
+ icon: 'fa-light fa-clipboard-list',
235
+ children: [
236
+ {
237
+ name: AXPWorkflowManagementMenuKeys.Cartable,
238
+ text: '@workflow-management:cartable.menus.cartable.title',
239
+ path: `${this.sessionService.application?.name}/workflow-management/cartable`,
240
+ priority: 10,
241
+ icon: 'fa-light fa-clipboard-list',
242
+ },
243
+ {
244
+ name: AXPWorkflowManagementMenuKeys.WorkItems,
245
+ text: '@workflow-management:work-items.entities.work-item.plural',
246
+ path: this.entityService.createPath(module.name, RootConfig.entities.workItem.name),
247
+ priority: 20,
248
+ icon: RootConfig.entities.workItem.icon,
249
+ },
250
+ {
251
+ name: AXPWorkflowManagementMenuKeys.WorkItemCandidates,
252
+ text: '@workflow-management:work-items.entities.work-item-candidate.plural',
253
+ path: this.entityService.createPath(module.name, RootConfig.entities.workItemCandidate.name),
254
+ priority: 30,
255
+ icon: RootConfig.entities.workItemCandidate.icon,
256
+ },
257
+ ],
172
258
  },
173
259
  ],
174
260
  },
175
- ]);
261
+ ]);
262
+ }
263
+ }
264
+
265
+ class AXMWorkflowManagementActivityCategoryEntityService extends AXMEntityCrudServiceImpl {
266
+ }
267
+ class AXMWorkflowManagementActivityCategoryEntityServiceImpl extends AXMWorkflowManagementActivityCategoryEntityService {
268
+ constructor() {
269
+ super(`${RootConfig.module.name}.${RootConfig.entities.activityCategory.name}`);
270
+ }
271
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityCategoryEntityServiceImpl, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
272
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityCategoryEntityServiceImpl }); }
273
+ }
274
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityCategoryEntityServiceImpl, decorators: [{
275
+ type: Injectable
276
+ }], ctorParameters: () => [] });
277
+
278
+ class AXMWorkflowManagementActivityCategoryEntityModule {
279
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityCategoryEntityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
280
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityCategoryEntityModule }); }
281
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityCategoryEntityModule, providers: [
282
+ {
283
+ provide: AXMWorkflowManagementActivityCategoryEntityService,
284
+ useClass: AXMWorkflowManagementActivityCategoryEntityServiceImpl,
285
+ },
286
+ ] }); }
287
+ }
288
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityCategoryEntityModule, decorators: [{
289
+ type: NgModule,
290
+ args: [{
291
+ imports: [],
292
+ exports: [],
293
+ declarations: [],
294
+ providers: [
295
+ {
296
+ provide: AXMWorkflowManagementActivityCategoryEntityService,
297
+ useClass: AXMWorkflowManagementActivityCategoryEntityServiceImpl,
298
+ },
299
+ ],
300
+ }]
301
+ }] });
302
+
303
+ async function factory$5(injector) {
304
+ const dataService = injector.get(AXMWorkflowManagementActivityCategoryEntityService);
305
+ const entityDef = {
306
+ module: RootConfig.module.name,
307
+ name: RootConfig.entities.activityCategory.name,
308
+ title: RootConfig.entities.activityCategory.title,
309
+ icon: RootConfig.entities.activityCategory.icon,
310
+ parentKey: 'parentId',
311
+ formats: {
312
+ individual: RootConfig.entities.activityCategory.title,
313
+ plural: RootConfig.entities.activityCategory.titlePlural,
314
+ searchResult: {
315
+ title: '{{ title }}',
316
+ description: '{{ description }}',
317
+ },
318
+ },
319
+ plugins: [{ name: 'history' }],
320
+ groups: [
321
+ { id: 'basic-info', title: '@general:terms.interface.basic-info' },
322
+ ],
323
+ properties: [
324
+ {
325
+ name: 'id',
326
+ title: 'ID',
327
+ groupId: 'basic-info',
328
+ schema: { dataType: 'uuid', visible: false, nullable: false, readonly: true, unique: { enabled: true } },
329
+ },
330
+ {
331
+ name: 'title',
332
+ title: '@general:terms.common.title',
333
+ groupId: 'basic-info',
334
+ schema: { dataType: 'string', interface: { type: AXPWidgetsCatalog.text } },
335
+ options: { sort: { enabled: true }, filter: { advance: { enabled: true }, inline: { enabled: true } } },
336
+ validations: [{ rule: 'required' }],
337
+ },
338
+ {
339
+ name: 'parentId',
340
+ title: '@general:terms.classification.parent',
341
+ groupId: 'basic-info',
342
+ schema: {
343
+ dataType: 'string',
344
+ interface: {
345
+ type: AXPWidgetsList.Editors.EntityCategory,
346
+ options: { entity: `${RootConfig.module.name}.${RootConfig.entities.activityCategory.name}` },
347
+ },
348
+ },
349
+ options: { filter: { advance: { enabled: true }, inline: { enabled: true } } },
350
+ },
351
+ {
352
+ name: 'description',
353
+ title: '@general:terms.common.description',
354
+ groupId: 'basic-info',
355
+ schema: { dataType: 'string', interface: { type: AXPWidgetsCatalog.largeText } },
356
+ },
357
+ {
358
+ name: 'childrenCount',
359
+ title: '@general:terms.classification.children',
360
+ groupId: 'basic-info',
361
+ schema: { dataType: 'number', interface: { type: AXPWidgetsCatalog.number }, readonly: true },
362
+ },
363
+ {
364
+ name: 'itemsCount',
365
+ title: '@general:terms.classification.items',
366
+ groupId: 'basic-info',
367
+ schema: { dataType: 'number', interface: { type: AXPWidgetsCatalog.number }, readonly: true },
368
+ },
369
+ ],
370
+ columns: [{ name: 'title' }, { name: 'description' }, { name: 'childrenCount' }, { name: 'itemsCount' }],
371
+ queries: {
372
+ byKey: {
373
+ execute: async (id) => await dataService.getOne(id),
374
+ type: AXPEntityQueryType.Single,
375
+ },
376
+ list: {
377
+ execute: async (e) => {
378
+ const res = await dataService.query(e);
379
+ return {
380
+ items: res.items.map((item) => ({ ...item, hasChild: (item.childrenCount ?? 0) > 0 })),
381
+ total: res.total,
382
+ };
383
+ },
384
+ type: AXPEntityQueryType.List,
385
+ },
386
+ },
387
+ interfaces: {
388
+ master: {
389
+ create: {
390
+ sections: [{ id: 'basic-info' }],
391
+ properties: [
392
+ { name: 'title', layout: { positions: { lg: { colSpan: 12, order: 1 } } } },
393
+ { name: 'parentId', layout: { positions: { lg: { colSpan: 12, order: 2 } } } },
394
+ { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
395
+ ],
396
+ },
397
+ update: {
398
+ sections: [{ id: 'basic-info' }],
399
+ properties: [
400
+ { name: 'title', layout: { positions: { lg: { colSpan: 12, order: 1 } } } },
401
+ { name: 'parentId', layout: { positions: { lg: { colSpan: 12, order: 2 } } } },
402
+ { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
403
+ { name: 'childrenCount', layout: { positions: { lg: { colSpan: 6, order: 4 } } } },
404
+ { name: 'itemsCount', layout: { positions: { lg: { colSpan: 6, order: 5 } } } },
405
+ ],
406
+ },
407
+ single: {
408
+ title: '{{title}}',
409
+ sections: [{ id: 'basic-info' }],
410
+ properties: [
411
+ { name: 'title', layout: { positions: { lg: { colSpan: 12, order: 1 } } } },
412
+ { name: 'parentId', layout: { positions: { lg: { colSpan: 12, order: 2 } } } },
413
+ { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
414
+ { name: 'childrenCount', layout: { positions: { lg: { colSpan: 6, order: 4 } } } },
415
+ { name: 'itemsCount', layout: { positions: { lg: { colSpan: 6, order: 5 } } } },
416
+ ],
417
+ actions: [...entityMasterRecordActions(), entityMasterDeleteAction()],
418
+ },
419
+ list: {
420
+ actions: [...entityMasterCrudActions()],
421
+ views: [createAllQueryView({ sorts: [{ name: 'title', dir: 'asc' }] })],
422
+ },
423
+ },
424
+ },
425
+ };
426
+ return entityDef;
427
+ }
428
+
429
+ var activityCategory_entity = /*#__PURE__*/Object.freeze({
430
+ __proto__: null,
431
+ factory: factory$5
432
+ });
433
+
434
+ class AXMWorkflowManagementActivityDefinitionEntityService extends AXMEntityCrudServiceImpl {
435
+ }
436
+ class AXMWorkflowManagementActivityDefinitionEntityServiceImpl extends AXMWorkflowManagementActivityDefinitionEntityService {
437
+ constructor() {
438
+ super(`${RootConfig.module.name}.${RootConfig.entities.activityDefinition.name}`);
439
+ }
440
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityDefinitionEntityServiceImpl, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
441
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityDefinitionEntityServiceImpl }); }
442
+ }
443
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityDefinitionEntityServiceImpl, decorators: [{
444
+ type: Injectable
445
+ }], ctorParameters: () => [] });
446
+
447
+ class AXMWorkflowManagementActivityDefinitionEntityModule {
448
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityDefinitionEntityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
449
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityDefinitionEntityModule }); }
450
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityDefinitionEntityModule, providers: [
451
+ {
452
+ provide: AXMWorkflowManagementActivityDefinitionEntityService,
453
+ useClass: AXMWorkflowManagementActivityDefinitionEntityServiceImpl,
454
+ },
455
+ ] }); }
456
+ }
457
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementActivityDefinitionEntityModule, decorators: [{
458
+ type: NgModule,
459
+ args: [{
460
+ imports: [],
461
+ exports: [],
462
+ declarations: [],
463
+ providers: [
464
+ {
465
+ provide: AXMWorkflowManagementActivityDefinitionEntityService,
466
+ useClass: AXMWorkflowManagementActivityDefinitionEntityServiceImpl,
467
+ },
468
+ ],
469
+ }]
470
+ }] });
471
+
472
+ async function factory$4(_injector) {
473
+ const entityDef = {
474
+ module: RootConfig.module.name,
475
+ name: RootConfig.entities.activityDefinition.name,
476
+ title: RootConfig.entities.activityDefinition.title,
477
+ icon: RootConfig.entities.activityDefinition.icon,
478
+ formats: {
479
+ individual: RootConfig.entities.activityDefinition.title,
480
+ plural: RootConfig.entities.activityDefinition.titlePlural,
481
+ displayName: '{{ title || name }}',
482
+ searchResult: {
483
+ title: '{{ title || name }}',
484
+ description: '{{ description }}',
485
+ },
486
+ },
487
+ plugins: [{ name: 'history' }],
488
+ category: {
489
+ entity: `${RootConfig.module.name}.${RootConfig.entities.activityCategory.name}`,
490
+ title: '@general:terms.classification.categories',
491
+ textField: 'title',
492
+ valueField: 'id',
493
+ applyConditions: [
494
+ {
495
+ name: 'category',
496
+ operator: { type: 'equal' },
497
+ value: 'id',
498
+ },
499
+ ],
500
+ },
501
+ groups: [
502
+ { id: 'basic-info', title: '@general:terms.interface.basic-info' },
503
+ { id: 'configuration', title: '@general:terms.interface.configuration' },
504
+ ],
505
+ properties: [
506
+ {
507
+ name: 'name',
508
+ title: '@general:terms.common.name',
509
+ groupId: 'basic-info',
510
+ schema: {
511
+ dataType: 'string',
512
+ interface: { type: AXPWidgetsCatalog.text },
513
+ },
514
+ options: { sort: { enabled: true }, filter: { advance: { enabled: true }, inline: { enabled: true } } },
515
+ validations: [{ rule: 'required' }, { rule: 'unique' }],
516
+ },
517
+ {
518
+ name: 'id',
519
+ title: 'ID',
520
+ groupId: 'basic-info',
521
+ schema: { dataType: 'string', visible: false, nullable: false, readonly: true, unique: { enabled: true } },
522
+ },
523
+ {
524
+ name: 'type',
525
+ title: '@general:terms.common.type',
526
+ groupId: 'basic-info',
527
+ schema: {
528
+ dataType: 'string',
529
+ interface: { type: AXPWidgetsCatalog.text },
530
+ },
531
+ options: { sort: { enabled: true }, filter: { advance: { enabled: true }, inline: { enabled: true } } },
532
+ validations: [{ rule: 'required' }],
533
+ },
534
+ {
535
+ name: 'title',
536
+ title: '@general:terms.common.title',
537
+ groupId: 'basic-info',
538
+ schema: { dataType: 'string', interface: { type: AXPWidgetsCatalog.text } },
539
+ options: { sort: { enabled: true }, filter: { advance: { enabled: true }, inline: { enabled: true } } },
540
+ },
541
+ {
542
+ name: 'description',
543
+ title: '@general:terms.common.description',
544
+ groupId: 'basic-info',
545
+ schema: { dataType: 'string', interface: { type: AXPWidgetsCatalog.largeText, options: { rows: 3 } } },
546
+ },
547
+ {
548
+ name: 'category',
549
+ title: '@general:terms.classification.category',
550
+ groupId: 'configuration',
551
+ schema: {
552
+ dataType: 'string',
553
+ interface: {
554
+ type: AXPWidgetsList.Editors.EntityCategory,
555
+ options: {
556
+ entity: `${RootConfig.module.name}.${RootConfig.entities.activityCategory.name}`,
557
+ multiple: false,
558
+ textField: 'title',
559
+ valueField: 'id',
560
+ parentKey: 'parentId',
561
+ },
562
+ },
563
+ },
564
+ options: { filter: { advance: { enabled: true }, inline: { enabled: true } } },
565
+ },
566
+ {
567
+ name: 'executionMode',
568
+ title: '@workflow-management:activities.entities.activity-definition.fields.execution-mode.title',
569
+ groupId: 'configuration',
570
+ schema: {
571
+ dataType: 'string',
572
+ interface: {
573
+ type: AXPWidgetsCatalog.select,
574
+ options: {
575
+ valueField: 'value',
576
+ textField: 'text',
577
+ dataSource: [
578
+ { value: 'frontend', text: 'Frontend' },
579
+ { value: 'backend', text: 'Backend' },
580
+ { value: 'both', text: 'Both' },
581
+ ],
582
+ },
583
+ },
584
+ },
585
+ options: { filter: { inline: { enabled: true } } },
586
+ },
587
+ {
588
+ name: 'taskType',
589
+ title: '@workflow-management:activities.entities.activity-definition.fields.task-type.title',
590
+ groupId: 'configuration',
591
+ schema: {
592
+ dataType: 'string',
593
+ interface: {
594
+ type: AXPWidgetsCatalog.select,
595
+ options: {
596
+ valueField: 'value',
597
+ textField: 'text',
598
+ dataSource: [
599
+ { value: 'human-task', text: 'Human Task' },
600
+ { value: 'ui-activity', text: 'UI Activity' },
601
+ { value: 'system-activity', text: 'System Activity' },
602
+ ],
603
+ },
604
+ },
605
+ },
606
+ options: { filter: { inline: { enabled: true } } },
607
+ },
608
+ {
609
+ name: 'icon',
610
+ title: '@general:terms.common.icon',
611
+ groupId: 'configuration',
612
+ schema: { dataType: 'string', interface: { type: AXPWidgetsCatalog.text } },
613
+ },
614
+ {
615
+ name: 'isBrowsable',
616
+ title: '@workflow-management:activities.entities.activity-definition.fields.is-browsable.title',
617
+ groupId: 'configuration',
618
+ schema: { dataType: 'boolean', interface: { type: AXPWidgetsCatalog.toggle } },
619
+ options: { filter: { inline: { enabled: true } } },
620
+ },
621
+ {
622
+ name: 'isContainer',
623
+ title: '@workflow-management:activities.entities.activity-definition.fields.is-container.title',
624
+ groupId: 'configuration',
625
+ schema: { dataType: 'boolean', interface: { type: AXPWidgetsCatalog.toggle } },
626
+ options: { filter: { inline: { enabled: true } } },
627
+ },
628
+ {
629
+ name: 'outcomes',
630
+ title: '@workflow-management:activities.entities.activity-definition.fields.outcomes.title',
631
+ groupId: 'configuration',
632
+ schema: {
633
+ dataType: 'array',
634
+ interface: { type: AXPWidgetsList.Advanced.CodeEditor, options: { language: 'json' } },
635
+ },
636
+ },
637
+ {
638
+ name: 'inputs',
639
+ title: '@workflow-management:activities.entities.activity-definition.fields.inputs.title',
640
+ groupId: 'configuration',
641
+ schema: {
642
+ dataType: 'array',
643
+ interface: { type: AXPWidgetsList.Advanced.CodeEditor, options: { language: 'json' } },
644
+ },
645
+ },
646
+ {
647
+ name: 'outputs',
648
+ title: '@workflow-management:activities.entities.activity-definition.fields.outputs.title',
649
+ groupId: 'configuration',
650
+ schema: {
651
+ dataType: 'array',
652
+ interface: { type: AXPWidgetsList.Advanced.CodeEditor, options: { language: 'json' } },
653
+ },
654
+ },
655
+ ],
656
+ columns: [
657
+ { name: 'title', title: '@general:terms.common.title', showAs: { type: AXPWidgetsCatalog.text } },
658
+ { name: 'name', title: '@general:terms.common.name', showAs: { type: AXPWidgetsCatalog.text } },
659
+ { name: 'type', title: '@general:terms.common.type', showAs: { type: AXPWidgetsCatalog.text } },
660
+ { name: 'executionMode', title: '@workflow-management:activities.entities.activity-definition.fields.execution-mode.title' },
661
+ { name: 'taskType', title: '@workflow-management:activities.entities.activity-definition.fields.task-type.title' },
662
+ { name: 'category', title: '@general:terms.classification.category' },
663
+ ],
664
+ interfaces: {
665
+ master: {
666
+ create: {
667
+ sections: [{ id: 'basic-info' }, { id: 'configuration' }],
668
+ properties: [
669
+ { name: 'name', layout: { positions: { lg: { colSpan: 6 } } } },
670
+ { name: 'type', layout: { positions: { lg: { colSpan: 6 } } } },
671
+ { name: 'title', layout: { positions: { lg: { colSpan: 6 } } } },
672
+ { name: 'category', layout: { positions: { lg: { colSpan: 6 } } } },
673
+ { name: 'executionMode', layout: { positions: { lg: { colSpan: 6 } } } },
674
+ { name: 'taskType', layout: { positions: { lg: { colSpan: 6 } } } },
675
+ { name: 'isBrowsable', layout: { positions: { lg: { colSpan: 3 } } } },
676
+ { name: 'isContainer', layout: { positions: { lg: { colSpan: 3 } } } },
677
+ { name: 'icon', layout: { positions: { lg: { colSpan: 6 } } } },
678
+ { name: 'description', layout: { positions: { lg: { colSpan: 12 } } } },
679
+ { name: 'inputs', layout: { positions: { lg: { colSpan: 12 } } } },
680
+ { name: 'outputs', layout: { positions: { lg: { colSpan: 12 } } } },
681
+ { name: 'outcomes', layout: { positions: { lg: { colSpan: 12 } } } },
682
+ ],
683
+ },
684
+ update: {
685
+ sections: [{ id: 'basic-info' }, { id: 'configuration' }],
686
+ properties: [
687
+ { name: 'name', layout: { positions: { lg: { colSpan: 6 } } } },
688
+ { name: 'type', layout: { positions: { lg: { colSpan: 6 } } } },
689
+ { name: 'title', layout: { positions: { lg: { colSpan: 6 } } } },
690
+ { name: 'category', layout: { positions: { lg: { colSpan: 6 } } } },
691
+ { name: 'executionMode', layout: { positions: { lg: { colSpan: 6 } } } },
692
+ { name: 'taskType', layout: { positions: { lg: { colSpan: 6 } } } },
693
+ { name: 'isBrowsable', layout: { positions: { lg: { colSpan: 3 } } } },
694
+ { name: 'isContainer', layout: { positions: { lg: { colSpan: 3 } } } },
695
+ { name: 'icon', layout: { positions: { lg: { colSpan: 6 } } } },
696
+ { name: 'description', layout: { positions: { lg: { colSpan: 12 } } } },
697
+ { name: 'inputs', layout: { positions: { lg: { colSpan: 12 } } } },
698
+ { name: 'outputs', layout: { positions: { lg: { colSpan: 12 } } } },
699
+ { name: 'outcomes', layout: { positions: { lg: { colSpan: 12 } } } },
700
+ ],
701
+ },
702
+ single: {
703
+ title: '{{ title || name }}',
704
+ sections: [{ id: 'basic-info' }, { id: 'configuration' }],
705
+ properties: [
706
+ { name: 'name', layout: { positions: { lg: { colSpan: 6 } } } },
707
+ { name: 'type', layout: { positions: { lg: { colSpan: 6 } } } },
708
+ { name: 'title', layout: { positions: { lg: { colSpan: 6 } } } },
709
+ { name: 'category', layout: { positions: { lg: { colSpan: 6 } } } },
710
+ { name: 'executionMode', layout: { positions: { lg: { colSpan: 6 } } } },
711
+ { name: 'taskType', layout: { positions: { lg: { colSpan: 6 } } } },
712
+ { name: 'isBrowsable', layout: { positions: { lg: { colSpan: 3 } } } },
713
+ { name: 'isContainer', layout: { positions: { lg: { colSpan: 3 } } } },
714
+ { name: 'icon', layout: { positions: { lg: { colSpan: 6 } } } },
715
+ { name: 'description', layout: { positions: { lg: { colSpan: 12 } } } },
716
+ { name: 'inputs', layout: { positions: { lg: { colSpan: 12 } } } },
717
+ { name: 'outputs', layout: { positions: { lg: { colSpan: 12 } } } },
718
+ { name: 'outcomes', layout: { positions: { lg: { colSpan: 12 } } } },
719
+ ],
720
+ actions: [...entityMasterRecordActions()],
721
+ },
722
+ list: {
723
+ actions: [...entityMasterCrudActions()],
724
+ views: [createAllQueryView({ sorts: [{ name: 'name', dir: 'asc' }] })],
725
+ },
726
+ },
727
+ },
728
+ };
729
+ return entityDef;
730
+ }
731
+
732
+ var activityDefinition_entity = /*#__PURE__*/Object.freeze({
733
+ __proto__: null,
734
+ factory: factory$4
735
+ });
736
+
737
+ class AXMWorkflowManagementWorkflowDefinitionEntityService extends AXMEntityCrudServiceImpl {
738
+ }
739
+ class AXMWorkflowManagementWorkflowDefinitionEntityServiceImpl extends AXMWorkflowManagementWorkflowDefinitionEntityService {
740
+ constructor() {
741
+ super(`${RootConfig.module.name}.${RootConfig.entities.workflowDefinition.name}`);
742
+ }
743
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowDefinitionEntityServiceImpl, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
744
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowDefinitionEntityServiceImpl }); }
745
+ }
746
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowDefinitionEntityServiceImpl, decorators: [{
747
+ type: Injectable
748
+ }], ctorParameters: () => [] });
749
+
750
+ class AXMWorkflowManagementWorkflowDefinitionEntityModule {
751
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowDefinitionEntityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
752
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowDefinitionEntityModule }); }
753
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowDefinitionEntityModule, providers: [
754
+ {
755
+ provide: AXMWorkflowManagementWorkflowDefinitionEntityService,
756
+ useClass: AXMWorkflowManagementWorkflowDefinitionEntityServiceImpl,
757
+ },
758
+ ] }); }
759
+ }
760
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowDefinitionEntityModule, decorators: [{
761
+ type: NgModule,
762
+ args: [{
763
+ imports: [],
764
+ exports: [],
765
+ declarations: [],
766
+ providers: [
767
+ {
768
+ provide: AXMWorkflowManagementWorkflowDefinitionEntityService,
769
+ useClass: AXMWorkflowManagementWorkflowDefinitionEntityServiceImpl,
770
+ },
771
+ ],
772
+ }]
773
+ }] });
774
+
775
+ async function factory$3(injector) {
776
+ const entityDef = {
777
+ module: RootConfig.module.name,
778
+ name: RootConfig.entities.workflowDefinition.name,
779
+ title: RootConfig.entities.workflowDefinition.title,
780
+ icon: RootConfig.entities.workflowDefinition.icon,
781
+ formats: {
782
+ individual: RootConfig.entities.workflowDefinition.title,
783
+ plural: RootConfig.entities.workflowDefinition.titlePlural,
784
+ displayName: '{{ title || name }}',
785
+ searchResult: {
786
+ title: '{{ title || name }}',
787
+ description: '{{ description }}',
788
+ },
789
+ },
790
+ plugins: [{ name: 'history' }, { name: 'lock' }, { name: 'archive' }],
791
+ groups: [
792
+ {
793
+ id: 'basicInfo',
794
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.groups.basic-info',
795
+ },
796
+ {
797
+ id: 'configuration',
798
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.groups.configuration',
799
+ },
800
+ {
801
+ id: 'metadata',
802
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.groups.metadata',
803
+ },
804
+ ],
805
+ properties: [
806
+ {
807
+ name: 'id',
808
+ title: 'ID',
809
+ groupId: 'metadata',
810
+ schema: {
811
+ dataType: 'uuid',
812
+ visible: false,
813
+ nullable: false,
814
+ readonly: true,
815
+ unique: { enabled: true },
816
+ },
817
+ },
818
+ {
819
+ name: 'name',
820
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.name.title',
821
+ groupId: 'basicInfo',
822
+ schema: {
823
+ dataType: 'string',
824
+ interface: {
825
+ type: AXPWidgetsCatalog.text,
826
+ options: {
827
+ placeholder: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.name.placeholder',
828
+ },
829
+ },
830
+ },
831
+ options: {
832
+ sort: { enabled: true },
833
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
834
+ },
835
+ validations: [{ rule: 'required' }, { rule: 'unique' }],
836
+ },
837
+ {
838
+ name: 'title',
839
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.title.title',
840
+ groupId: 'basicInfo',
841
+ schema: {
842
+ dataType: 'string',
843
+ interface: {
844
+ type: AXPWidgetsCatalog.text,
845
+ options: {
846
+ placeholder: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.title.placeholder',
847
+ },
848
+ },
849
+ },
850
+ options: {
851
+ sort: { enabled: true },
852
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
853
+ },
854
+ },
855
+ {
856
+ name: 'description',
857
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.description.title',
858
+ groupId: 'basicInfo',
859
+ schema: {
860
+ dataType: 'string',
861
+ interface: {
862
+ type: AXPWidgetsList.Editors.LargeTextBox,
863
+ options: {
864
+ rows: 3,
865
+ placeholder: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.description.placeholder',
866
+ },
867
+ },
868
+ },
869
+ },
870
+ {
871
+ name: 'version',
872
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.version.title',
873
+ groupId: 'metadata',
874
+ schema: {
875
+ dataType: 'number',
876
+ interface: {
877
+ type: AXPWidgetsCatalog.number,
878
+ },
879
+ readonly: true,
880
+ },
881
+ options: {
882
+ sort: { enabled: true },
883
+ filter: { advance: { enabled: true } },
884
+ },
885
+ },
886
+ {
887
+ name: 'isLatest',
888
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.is-latest.title',
889
+ groupId: 'metadata',
890
+ schema: {
891
+ dataType: 'boolean',
892
+ interface: {
893
+ type: AXPWidgetsCatalog.toggle,
894
+ },
895
+ readonly: true,
896
+ },
897
+ options: {
898
+ filter: { inline: { enabled: true } },
899
+ },
900
+ },
901
+ {
902
+ name: 'isPublished',
903
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.is-published.title',
904
+ groupId: 'configuration',
905
+ schema: {
906
+ dataType: 'boolean',
907
+ interface: {
908
+ type: AXPWidgetsCatalog.toggle,
909
+ },
910
+ },
911
+ options: {
912
+ filter: { inline: { enabled: true } },
913
+ },
914
+ },
915
+ {
916
+ name: 'isReadonly',
917
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.is-readonly.title',
918
+ groupId: 'configuration',
919
+ schema: {
920
+ dataType: 'boolean',
921
+ interface: {
922
+ type: AXPWidgetsCatalog.toggle,
923
+ },
924
+ },
925
+ },
926
+ {
927
+ name: 'isSystem',
928
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.is-system.title',
929
+ groupId: 'configuration',
930
+ schema: {
931
+ dataType: 'boolean',
932
+ interface: {
933
+ type: AXPWidgetsCatalog.toggle,
934
+ },
935
+ readonly: true,
936
+ },
937
+ },
938
+ {
939
+ name: 'createdAt',
940
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.created-at.title',
941
+ groupId: 'metadata',
942
+ schema: {
943
+ dataType: 'date',
944
+ interface: {
945
+ type: AXPWidgetsCatalog.dateTime,
946
+ },
947
+ readonly: true,
948
+ },
949
+ options: {
950
+ sort: { enabled: true },
951
+ filter: { advance: { enabled: true } },
952
+ },
953
+ },
954
+ {
955
+ name: 'bindings',
956
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.bindings.title',
957
+ groupId: 'configuration',
958
+ schema: {
959
+ dataType: 'array',
960
+ interface: {
961
+ type: AXPWidgetsList.Advanced.CodeEditor,
962
+ options: {
963
+ language: 'json',
964
+ placeholder: '[{ "entityTypes": ["Module.Entity"], "eventTypes": ["OnCreate"], "enabled": true }]',
965
+ },
966
+ },
967
+ },
968
+ options: {
969
+ filter: { advance: { enabled: false } },
970
+ sort: { enabled: false },
971
+ },
972
+ },
973
+ ],
974
+ columns: [
975
+ {
976
+ name: 'title',
977
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.title.title',
978
+ showAs: { type: AXPWidgetsCatalog.text },
979
+ },
980
+ {
981
+ name: 'name',
982
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.name.title',
983
+ showAs: { type: AXPWidgetsCatalog.text },
984
+ },
985
+ {
986
+ name: 'version',
987
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.version.title',
988
+ showAs: { type: AXPWidgetsCatalog.number },
989
+ options: { width: '100px' },
990
+ },
991
+ {
992
+ name: 'isLatest',
993
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.is-latest.title',
994
+ showAs: { type: AXPWidgetsCatalog.toggle, options: { trueText: 'Latest', falseText: '-' } },
995
+ options: { width: '100px' },
996
+ },
997
+ {
998
+ name: 'isPublished',
999
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.is-published.title',
1000
+ showAs: { type: AXPWidgetsCatalog.toggle },
1001
+ options: { width: '120px' },
1002
+ },
1003
+ {
1004
+ name: 'createdAt',
1005
+ title: '@workflow-management:workflow-definitions.entities.workflow-definition.fields.created-at.title',
1006
+ showAs: { type: AXPWidgetsCatalog.dateTime },
1007
+ options: { width: '180px' },
1008
+ },
1009
+ ],
1010
+ interfaces: {
1011
+ master: {
1012
+ create: {
1013
+ sections: [{ id: 'basicInfo' }, { id: 'configuration' }],
1014
+ properties: [
1015
+ { name: 'name', layout: { positions: { lg: { colSpan: 6 } } } },
1016
+ { name: 'title', layout: { positions: { lg: { colSpan: 6 } } } },
1017
+ { name: 'description', layout: { positions: { lg: { colSpan: 12 } } } },
1018
+ { name: 'isPublished', layout: { positions: { lg: { colSpan: 4 } } } },
1019
+ { name: 'isReadonly', layout: { positions: { lg: { colSpan: 4 } } } },
1020
+ ],
1021
+ },
1022
+ update: {
1023
+ sections: [{ id: 'basicInfo' }, { id: 'configuration' }],
1024
+ properties: [
1025
+ { name: 'definitionId', layout: { positions: { lg: { colSpan: 6 } } } },
1026
+ { name: 'name', layout: { positions: { lg: { colSpan: 6 } } } },
1027
+ { name: 'description', layout: { positions: { lg: { colSpan: 12 } } } },
1028
+ { name: 'isPublished', layout: { positions: { lg: { colSpan: 4 } } } },
1029
+ { name: 'isReadonly', layout: { positions: { lg: { colSpan: 4 } } } },
1030
+ ],
1031
+ },
1032
+ single: {
1033
+ title: '{{ name }}',
1034
+ sections: [
1035
+ { id: 'basicInfo', order: 1, layout: { positions: { lg: { colSpan: 12 } } } },
1036
+ { id: 'configuration', order: 2, layout: { positions: { lg: { colSpan: 6 } } } },
1037
+ { id: 'metadata', order: 3, layout: { positions: { lg: { colSpan: 6 } } } },
1038
+ ],
1039
+ properties: [
1040
+ { name: 'name', layout: { positions: { lg: { colSpan: 6 } } } },
1041
+ { name: 'title', layout: { positions: { lg: { colSpan: 6 } } } },
1042
+ { name: 'description', layout: { positions: { lg: { colSpan: 12 } } } },
1043
+ { name: 'version', layout: { positions: { lg: { colSpan: 6 } } } },
1044
+ { name: 'isLatest', layout: { positions: { lg: { colSpan: 6 } } } },
1045
+ { name: 'isPublished', layout: { positions: { lg: { colSpan: 6 } } } },
1046
+ { name: 'isReadonly', layout: { positions: { lg: { colSpan: 6 } } } },
1047
+ { name: 'isSystem', layout: { positions: { lg: { colSpan: 6 } } } },
1048
+ { name: 'createdAt', layout: { positions: { lg: { colSpan: 6 } } } },
1049
+ ],
1050
+ actions: [...entityMasterRecordActions()],
1051
+ },
1052
+ list: {
1053
+ actions: [
1054
+ ...entityMasterCrudActions(),
1055
+ {
1056
+ title: '@workflow-management:workflow-definitions.actions.execute.title',
1057
+ name: 'execute-workflow',
1058
+ command: {
1059
+ name: 'WorkflowManagement.WorkflowDefinition:Execute',
1060
+ options: {
1061
+ workflowId: '{{ context.eval("name") }}',
1062
+ input: {},
1063
+ },
1064
+ },
1065
+ icon: 'fa-light fa-play',
1066
+ color: 'success',
1067
+ priority: 'primary',
1068
+ type: 'execute',
1069
+ scope: AXPEntityCommandScope.Individual,
1070
+ },
1071
+ {
1072
+ title: '@workflow-management:workflow-definitions.actions.edit-in-studio.title',
1073
+ name: 'edit-in-studio',
1074
+ command: {
1075
+ name: 'WorkflowManagement.WorkflowDefinition:EditInStudio',
1076
+ options: {
1077
+ workflowName: '{{ context.eval("name") }}',
1078
+ },
1079
+ },
1080
+ icon: 'fa-light fa-code',
1081
+ color: 'primary',
1082
+ priority: 'secondary',
1083
+ type: 'execute',
1084
+ scope: AXPEntityCommandScope.Individual,
1085
+ },
1086
+ ],
1087
+ views: [createAllQueryView({ sorts: [{ name: 'createdAt', dir: 'desc' }] })],
1088
+ },
1089
+ },
1090
+ },
1091
+ };
1092
+ return entityDef;
1093
+ }
1094
+
1095
+ var workflowDefinition_entity = /*#__PURE__*/Object.freeze({
1096
+ __proto__: null,
1097
+ factory: factory$3
1098
+ });
1099
+
1100
+ class AXMWorkflowManagementWorkflowInstanceEntityService extends AXMEntityCrudServiceImpl {
1101
+ }
1102
+ class AXMWorkflowManagementWorkflowInstanceEntityServiceImpl extends AXMWorkflowManagementWorkflowInstanceEntityService {
1103
+ constructor() {
1104
+ super(`${RootConfig.module.name}.${RootConfig.entities.workflowInstance.name}`);
1105
+ }
1106
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowInstanceEntityServiceImpl, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1107
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowInstanceEntityServiceImpl }); }
1108
+ }
1109
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowInstanceEntityServiceImpl, decorators: [{
1110
+ type: Injectable
1111
+ }], ctorParameters: () => [] });
1112
+
1113
+ class AXMWorkflowManagementWorkflowInstanceEntityModule {
1114
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowInstanceEntityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1115
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowInstanceEntityModule }); }
1116
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowInstanceEntityModule, providers: [
1117
+ {
1118
+ provide: AXMWorkflowManagementWorkflowInstanceEntityService,
1119
+ useClass: AXMWorkflowManagementWorkflowInstanceEntityServiceImpl,
1120
+ },
1121
+ ] }); }
1122
+ }
1123
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkflowInstanceEntityModule, decorators: [{
1124
+ type: NgModule,
1125
+ args: [{
1126
+ imports: [],
1127
+ exports: [],
1128
+ declarations: [],
1129
+ providers: [
1130
+ {
1131
+ provide: AXMWorkflowManagementWorkflowInstanceEntityService,
1132
+ useClass: AXMWorkflowManagementWorkflowInstanceEntityServiceImpl,
1133
+ },
1134
+ ],
1135
+ }]
1136
+ }] });
1137
+
1138
+ async function factory$2(injector) {
1139
+ const dataService = injector.get(AXMWorkflowManagementWorkflowInstanceEntityService);
1140
+ const entityDef = {
1141
+ module: RootConfig.module.name,
1142
+ name: RootConfig.entities.workflowInstance.name,
1143
+ title: RootConfig.entities.workflowInstance.title,
1144
+ icon: RootConfig.entities.workflowInstance.icon,
1145
+ formats: {
1146
+ individual: RootConfig.entities.workflowInstance.title,
1147
+ plural: RootConfig.entities.workflowInstance.titlePlural,
1148
+ displayName: '{{ name || definitionId }}',
1149
+ searchResult: {
1150
+ title: '{{ name || definitionId }}',
1151
+ description: '{{ status }} - {{ subStatus }}',
1152
+ },
1153
+ },
1154
+ plugins: [{ name: 'history' }],
1155
+ groups: [
1156
+ {
1157
+ id: 'basicInfo',
1158
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.groups.basic-info',
1159
+ },
1160
+ {
1161
+ id: 'status',
1162
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.groups.status',
1163
+ },
1164
+ {
1165
+ id: 'metadata',
1166
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.groups.metadata',
1167
+ },
1168
+ ],
1169
+ properties: [
1170
+ {
1171
+ name: 'id',
1172
+ title: 'ID',
1173
+ groupId: 'metadata',
1174
+ schema: {
1175
+ dataType: 'uuid',
1176
+ visible: false,
1177
+ nullable: false,
1178
+ readonly: true,
1179
+ unique: { enabled: true },
1180
+ },
1181
+ },
1182
+ {
1183
+ name: 'definitionId',
1184
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.definition-id.title',
1185
+ groupId: 'basicInfo',
1186
+ schema: {
1187
+ dataType: 'string',
1188
+ interface: {
1189
+ type: AXPWidgetsCatalog.text,
1190
+ options: {
1191
+ placeholder: '@workflow-management:workflow-instances.entities.workflow-instance.fields.definition-id.placeholder',
1192
+ },
1193
+ },
1194
+ },
1195
+ options: {
1196
+ sort: { enabled: true },
1197
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1198
+ },
1199
+ validations: [{ rule: 'required' }],
1200
+ },
1201
+ {
1202
+ name: 'name',
1203
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.name.title',
1204
+ groupId: 'basicInfo',
1205
+ schema: {
1206
+ dataType: 'string',
1207
+ interface: {
1208
+ type: AXPWidgetsCatalog.text,
1209
+ options: {
1210
+ placeholder: '@workflow-management:workflow-instances.entities.workflow-instance.fields.name.placeholder',
1211
+ },
1212
+ },
1213
+ },
1214
+ options: {
1215
+ sort: { enabled: true },
1216
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1217
+ },
1218
+ },
1219
+ {
1220
+ name: 'status',
1221
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.status.title',
1222
+ groupId: 'status',
1223
+ schema: {
1224
+ dataType: 'string',
1225
+ interface: {
1226
+ type: AXPWidgetsCatalog.select,
1227
+ options: {
1228
+ valueField: 'value',
1229
+ textField: 'text',
1230
+ dataSource: [
1231
+ { value: 'Running', text: '@workflow-management:workflow-instances.states.running' },
1232
+ { value: 'Finished', text: '@workflow-management:workflow-instances.states.finished' },
1233
+ ],
1234
+ },
1235
+ },
1236
+ readonly: true,
1237
+ },
1238
+ options: {
1239
+ sort: { enabled: true },
1240
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1241
+ },
1242
+ },
1243
+ {
1244
+ name: 'subStatus',
1245
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.sub-status.title',
1246
+ groupId: 'status',
1247
+ schema: {
1248
+ dataType: 'string',
1249
+ interface: {
1250
+ type: AXPWidgetsCatalog.select,
1251
+ options: {
1252
+ valueField: 'value',
1253
+ textField: 'text',
1254
+ dataSource: [
1255
+ { value: 'Pending', text: '@workflow-management:workflow-instances.states.pending' },
1256
+ { value: 'Executing', text: '@workflow-management:workflow-instances.states.executing' },
1257
+ { value: 'Suspended', text: '@workflow-management:workflow-instances.states.suspended' },
1258
+ { value: 'Finished', text: '@workflow-management:workflow-instances.states.finished' },
1259
+ { value: 'Cancelled', text: '@workflow-management:workflow-instances.states.cancelled' },
1260
+ { value: 'Faulted', text: '@workflow-management:workflow-instances.states.faulted' },
1261
+ ],
1262
+ },
1263
+ },
1264
+ readonly: true,
1265
+ },
1266
+ options: {
1267
+ sort: { enabled: true },
1268
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1269
+ },
1270
+ },
1271
+ {
1272
+ name: 'correlationId',
1273
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.correlation-id.title',
1274
+ groupId: 'basicInfo',
1275
+ schema: {
1276
+ dataType: 'string',
1277
+ interface: {
1278
+ type: AXPWidgetsCatalog.text,
1279
+ options: {
1280
+ placeholder: '@workflow-management:workflow-instances.entities.workflow-instance.fields.correlation-id.placeholder',
1281
+ },
1282
+ },
1283
+ },
1284
+ options: {
1285
+ sort: { enabled: true },
1286
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1287
+ },
1288
+ },
1289
+ {
1290
+ name: 'version',
1291
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.version.title',
1292
+ groupId: 'metadata',
1293
+ schema: {
1294
+ dataType: 'number',
1295
+ interface: {
1296
+ type: AXPWidgetsCatalog.number,
1297
+ },
1298
+ readonly: true,
1299
+ },
1300
+ options: {
1301
+ sort: { enabled: true },
1302
+ filter: { advance: { enabled: true } },
1303
+ },
1304
+ },
1305
+ {
1306
+ name: 'incidentCount',
1307
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.incident-count.title',
1308
+ groupId: 'status',
1309
+ schema: {
1310
+ dataType: 'number',
1311
+ interface: {
1312
+ type: AXPWidgetsCatalog.number,
1313
+ },
1314
+ readonly: true,
1315
+ },
1316
+ options: {
1317
+ sort: { enabled: true },
1318
+ filter: { advance: { enabled: true } },
1319
+ },
1320
+ },
1321
+ {
1322
+ name: 'createdAt',
1323
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.created-at.title',
1324
+ groupId: 'metadata',
1325
+ schema: {
1326
+ dataType: 'date',
1327
+ interface: {
1328
+ type: AXPWidgetsCatalog.dateTime,
1329
+ },
1330
+ readonly: true,
1331
+ },
1332
+ options: {
1333
+ sort: { enabled: true },
1334
+ filter: { advance: { enabled: true } },
1335
+ },
1336
+ },
1337
+ {
1338
+ name: 'updatedAt',
1339
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.updated-at.title',
1340
+ groupId: 'metadata',
1341
+ schema: {
1342
+ dataType: 'date',
1343
+ interface: {
1344
+ type: AXPWidgetsCatalog.dateTime,
1345
+ },
1346
+ readonly: true,
1347
+ },
1348
+ options: {
1349
+ sort: { enabled: true },
1350
+ filter: { advance: { enabled: true } },
1351
+ },
1352
+ },
1353
+ {
1354
+ name: 'finishedAt',
1355
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.finished-at.title',
1356
+ groupId: 'metadata',
1357
+ schema: {
1358
+ dataType: 'date',
1359
+ interface: {
1360
+ type: AXPWidgetsCatalog.dateTime,
1361
+ },
1362
+ readonly: true,
1363
+ },
1364
+ options: {
1365
+ sort: { enabled: true },
1366
+ filter: { advance: { enabled: true } },
1367
+ },
1368
+ },
1369
+ ],
1370
+ columns: [
1371
+ {
1372
+ name: 'definitionId',
1373
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.definition-id.title',
1374
+ showAs: { type: AXPWidgetsCatalog.text },
1375
+ },
1376
+ {
1377
+ name: 'name',
1378
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.name.title',
1379
+ showAs: { type: AXPWidgetsCatalog.text },
1380
+ },
1381
+ {
1382
+ name: 'status',
1383
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.status.title',
1384
+ showAs: { type: AXPWidgetsCatalog.text },
1385
+ options: { width: '120px' },
1386
+ },
1387
+ {
1388
+ name: 'subStatus',
1389
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.sub-status.title',
1390
+ showAs: { type: AXPWidgetsCatalog.text },
1391
+ options: { width: '140px' },
1392
+ },
1393
+ {
1394
+ name: 'incidentCount',
1395
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.incident-count.title',
1396
+ showAs: { type: AXPWidgetsCatalog.number },
1397
+ options: { width: '100px' },
1398
+ },
1399
+ {
1400
+ name: 'createdAt',
1401
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.created-at.title',
1402
+ showAs: { type: AXPWidgetsCatalog.dateTime },
1403
+ options: { width: '180px' },
1404
+ },
1405
+ {
1406
+ name: 'finishedAt',
1407
+ title: '@workflow-management:workflow-instances.entities.workflow-instance.fields.finished-at.title',
1408
+ showAs: { type: AXPWidgetsCatalog.dateTime },
1409
+ options: { width: '180px' },
1410
+ },
1411
+ ],
1412
+ commands: {
1413
+ delete: {
1414
+ execute: async (id) => await dataService.deleteOne(id),
1415
+ },
1416
+ },
1417
+ queries: {
1418
+ byKey: {
1419
+ execute: async (id) => {
1420
+ const item = await dataService.getOne(id);
1421
+ return item;
1422
+ },
1423
+ type: AXPEntityQueryType.Single,
1424
+ },
1425
+ list: {
1426
+ execute: async (e) => {
1427
+ return await dataService.query(e);
1428
+ },
1429
+ type: AXPEntityQueryType.List,
1430
+ },
1431
+ },
1432
+ interfaces: {
1433
+ master: {
1434
+ single: {
1435
+ title: '{{ name || definitionId }}',
1436
+ sections: [
1437
+ { id: 'basicInfo', order: 1, layout: { positions: { lg: { colSpan: 12 } } } },
1438
+ { id: 'status', order: 2, layout: { positions: { lg: { colSpan: 6 } } } },
1439
+ { id: 'metadata', order: 3, layout: { positions: { lg: { colSpan: 6 } } } },
1440
+ ],
1441
+ properties: [
1442
+ { name: 'definitionId', layout: { positions: { lg: { colSpan: 6 } } } },
1443
+ { name: 'name', layout: { positions: { lg: { colSpan: 6 } } } },
1444
+ { name: 'correlationId', layout: { positions: { lg: { colSpan: 6 } } } },
1445
+ { name: 'version', layout: { positions: { lg: { colSpan: 6 } } } },
1446
+ { name: 'status', layout: { positions: { lg: { colSpan: 6 } } } },
1447
+ { name: 'subStatus', layout: { positions: { lg: { colSpan: 6 } } } },
1448
+ { name: 'incidentCount', layout: { positions: { lg: { colSpan: 6 } } } },
1449
+ { name: 'createdAt', layout: { positions: { lg: { colSpan: 6 } } } },
1450
+ { name: 'updatedAt', layout: { positions: { lg: { colSpan: 6 } } } },
1451
+ { name: 'finishedAt', layout: { positions: { lg: { colSpan: 6 } } } },
1452
+ ],
1453
+ actions: [...entityMasterRecordActions()],
1454
+ },
1455
+ list: {
1456
+ actions: [...entityMasterCrudActions()],
1457
+ views: [createAllQueryView({ sorts: [{ name: 'createdAt', dir: 'desc' }] })],
1458
+ },
1459
+ },
1460
+ },
1461
+ };
1462
+ return entityDef;
1463
+ }
1464
+
1465
+ var workflowInstance_entity = /*#__PURE__*/Object.freeze({
1466
+ __proto__: null,
1467
+ factory: factory$2
1468
+ });
1469
+
1470
+ class AXMWorkflowManagementWorkItemEntityService extends AXMEntityCrudServiceImpl {
1471
+ }
1472
+ class AXMWorkflowManagementWorkItemEntityServiceImpl extends AXMWorkflowManagementWorkItemEntityService {
1473
+ constructor() {
1474
+ super(`${RootConfig.module.name}.${RootConfig.entities.workItem.name}`);
1475
+ }
1476
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemEntityServiceImpl, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1477
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemEntityServiceImpl }); }
1478
+ }
1479
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemEntityServiceImpl, decorators: [{
1480
+ type: Injectable
1481
+ }], ctorParameters: () => [] });
1482
+
1483
+ class AXMWorkflowManagementWorkItemEntityModule {
1484
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemEntityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1485
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemEntityModule }); }
1486
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemEntityModule, providers: [
1487
+ {
1488
+ provide: AXMWorkflowManagementWorkItemEntityService,
1489
+ useClass: AXMWorkflowManagementWorkItemEntityServiceImpl,
1490
+ },
1491
+ ] }); }
1492
+ }
1493
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemEntityModule, decorators: [{
1494
+ type: NgModule,
1495
+ args: [{
1496
+ imports: [],
1497
+ exports: [],
1498
+ declarations: [],
1499
+ providers: [
1500
+ {
1501
+ provide: AXMWorkflowManagementWorkItemEntityService,
1502
+ useClass: AXMWorkflowManagementWorkItemEntityServiceImpl,
1503
+ },
1504
+ ],
1505
+ }]
1506
+ }] });
1507
+
1508
+ async function factory$1(injector) {
1509
+ const dataService = injector.get(AXMWorkflowManagementWorkItemEntityService);
1510
+ const entityDef = {
1511
+ module: RootConfig.module.name,
1512
+ name: RootConfig.entities.workItem.name,
1513
+ title: RootConfig.entities.workItem.title,
1514
+ icon: RootConfig.entities.workItem.icon,
1515
+ formats: {
1516
+ individual: RootConfig.entities.workItem.title,
1517
+ plural: RootConfig.entities.workItem.titlePlural,
1518
+ displayName: '{{ title }}',
1519
+ searchResult: {
1520
+ title: '{{ title }}',
1521
+ description: '{{ status }} - {{ priority }}',
1522
+ },
1523
+ },
1524
+ plugins: [{ name: 'history' }],
1525
+ groups: [
1526
+ {
1527
+ id: 'basicInfo',
1528
+ title: '@workflow-management:work-items.entities.work-item.groups.basic-info',
1529
+ },
1530
+ {
1531
+ id: 'assignment',
1532
+ title: '@workflow-management:work-items.entities.work-item.groups.assignment',
1533
+ },
1534
+ {
1535
+ id: 'workflow',
1536
+ title: '@workflow-management:work-items.entities.work-item.groups.workflow',
1537
+ },
1538
+ {
1539
+ id: 'metadata',
1540
+ title: '@workflow-management:work-items.entities.work-item.groups.metadata',
1541
+ },
1542
+ ],
1543
+ properties: [
1544
+ {
1545
+ name: 'id',
1546
+ title: 'ID',
1547
+ groupId: 'metadata',
1548
+ schema: {
1549
+ dataType: 'uuid',
1550
+ visible: false,
1551
+ nullable: false,
1552
+ readonly: true,
1553
+ unique: { enabled: true },
1554
+ },
1555
+ },
1556
+ {
1557
+ name: 'instanceId',
1558
+ title: '@workflow-management:work-items.entities.work-item.fields.instance-id.title',
1559
+ groupId: 'workflow',
1560
+ schema: {
1561
+ dataType: 'string',
1562
+ interface: {
1563
+ type: AXPWidgetsList.Editors.LookupBox,
1564
+ options: {
1565
+ entity: `${RootConfig.module.name}.${RootConfig.entities.workflowInstance.name}`,
1566
+ textField: 'name',
1567
+ valueField: 'id',
1568
+ look: 'select',
1569
+ expose: [
1570
+ { source: 'id', target: 'instance.id' },
1571
+ { source: 'name', target: 'instance.name' },
1572
+ { source: 'definitionId', target: 'instance.definitionId' },
1573
+ ],
1574
+ },
1575
+ },
1576
+ },
1577
+ options: {
1578
+ sort: { enabled: true },
1579
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1580
+ },
1581
+ validations: [{ rule: 'required' }],
1582
+ },
1583
+ {
1584
+ name: 'bookmarkId',
1585
+ title: '@workflow-management:work-items.entities.work-item.fields.bookmark-id.title',
1586
+ groupId: 'workflow',
1587
+ schema: {
1588
+ dataType: 'string',
1589
+ interface: {
1590
+ type: AXPWidgetsList.Editors.TextBox,
1591
+ options: {
1592
+ placeholder: '@workflow-management:work-items.entities.work-item.fields.bookmark-id.placeholder',
1593
+ },
1594
+ },
1595
+ },
1596
+ options: {
1597
+ sort: { enabled: true },
1598
+ filter: { advance: { enabled: true } },
1599
+ },
1600
+ },
1601
+ {
1602
+ name: 'activityNodeId',
1603
+ title: '@workflow-management:work-items.entities.work-item.fields.activity-node-id.title',
1604
+ groupId: 'workflow',
1605
+ schema: {
1606
+ dataType: 'string',
1607
+ interface: {
1608
+ type: AXPWidgetsList.Editors.TextBox,
1609
+ options: {
1610
+ placeholder: '@workflow-management:work-items.entities.work-item.fields.activity-node-id.placeholder',
1611
+ },
1612
+ },
1613
+ },
1614
+ options: {
1615
+ sort: { enabled: true },
1616
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1617
+ },
1618
+ validations: [{ rule: 'required' }],
1619
+ },
1620
+ {
1621
+ name: 'activityName',
1622
+ title: '@workflow-management:work-items.entities.work-item.fields.activity-name.title',
1623
+ groupId: 'workflow',
1624
+ schema: {
1625
+ dataType: 'string',
1626
+ interface: {
1627
+ type: AXPWidgetsList.Editors.TextBox,
1628
+ options: {
1629
+ placeholder: '@workflow-management:work-items.entities.work-item.fields.activity-name.placeholder',
1630
+ },
1631
+ },
1632
+ },
1633
+ options: {
1634
+ sort: { enabled: true },
1635
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1636
+ },
1637
+ },
1638
+ {
1639
+ name: 'title',
1640
+ title: '@workflow-management:work-items.entities.work-item.fields.title.title',
1641
+ groupId: 'basicInfo',
1642
+ schema: {
1643
+ dataType: 'string',
1644
+ interface: {
1645
+ type: AXPWidgetsList.Editors.TextBox,
1646
+ options: {
1647
+ placeholder: '@workflow-management:work-items.entities.work-item.fields.title.placeholder',
1648
+ },
1649
+ },
1650
+ },
1651
+ options: {
1652
+ sort: { enabled: true },
1653
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1654
+ },
1655
+ validations: [{ rule: 'required' }],
1656
+ },
1657
+ {
1658
+ name: 'description',
1659
+ title: '@workflow-management:work-items.entities.work-item.fields.description.title',
1660
+ groupId: 'basicInfo',
1661
+ schema: {
1662
+ dataType: 'string',
1663
+ interface: {
1664
+ type: AXPWidgetsList.Editors.LargeTextBox,
1665
+ options: {
1666
+ rows: 3,
1667
+ placeholder: '@workflow-management:work-items.entities.work-item.fields.description.placeholder',
1668
+ },
1669
+ },
1670
+ },
1671
+ options: {
1672
+ sort: { enabled: false },
1673
+ filter: { advance: { enabled: true } },
1674
+ },
1675
+ },
1676
+ {
1677
+ name: 'kind',
1678
+ title: '@workflow-management:work-items.entities.work-item.fields.kind.title',
1679
+ groupId: 'basicInfo',
1680
+ schema: {
1681
+ dataType: 'string',
1682
+ interface: {
1683
+ type: AXPWidgetsList.Editors.SelectBox,
1684
+ options: {
1685
+ valueField: 'value',
1686
+ textField: 'text',
1687
+ dataSource: [
1688
+ { value: 'HumanTask', text: '@workflow-management:work-items.kinds.human-task' },
1689
+ { value: 'Approval', text: '@workflow-management:work-items.kinds.approval' },
1690
+ { value: 'Review', text: '@workflow-management:work-items.kinds.review' },
1691
+ { value: 'Notification', text: '@workflow-management:work-items.kinds.notification' },
1692
+ { value: 'Other', text: '@workflow-management:work-items.kinds.other' },
1693
+ ],
1694
+ },
1695
+ },
1696
+ },
1697
+ options: {
1698
+ sort: { enabled: true },
1699
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1700
+ },
1701
+ },
1702
+ {
1703
+ name: 'status',
1704
+ title: '@workflow-management:work-items.entities.work-item.fields.status.title',
1705
+ groupId: 'assignment',
1706
+ schema: {
1707
+ dataType: 'string',
1708
+ interface: {
1709
+ type: AXPWidgetsList.Editors.SelectBox,
1710
+ options: {
1711
+ valueField: 'value',
1712
+ textField: 'text',
1713
+ dataSource: [
1714
+ { value: 'Pending', text: '@workflow-management:work-items.states.pending' },
1715
+ { value: 'Claimed', text: '@workflow-management:work-items.states.claimed' },
1716
+ { value: 'InProgress', text: '@workflow-management:work-items.states.in-progress' },
1717
+ { value: 'Completed', text: '@workflow-management:work-items.states.completed' },
1718
+ { value: 'Cancelled', text: '@workflow-management:work-items.states.cancelled' },
1719
+ { value: 'Rejected', text: '@workflow-management:work-items.states.rejected' },
1720
+ ],
1721
+ },
1722
+ },
1723
+ },
1724
+ options: {
1725
+ sort: { enabled: true },
1726
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1727
+ },
1728
+ },
1729
+ {
1730
+ name: 'priority',
1731
+ title: '@workflow-management:work-items.entities.work-item.fields.priority.title',
1732
+ groupId: 'basicInfo',
1733
+ schema: {
1734
+ dataType: 'string',
1735
+ interface: {
1736
+ type: AXPWidgetsList.Editors.SelectBox,
1737
+ options: {
1738
+ valueField: 'value',
1739
+ textField: 'text',
1740
+ dataSource: [
1741
+ { value: 'Low', text: '@workflow-management:work-items.priorities.low' },
1742
+ { value: 'Normal', text: '@workflow-management:work-items.priorities.normal' },
1743
+ { value: 'High', text: '@workflow-management:work-items.priorities.high' },
1744
+ { value: 'Urgent', text: '@workflow-management:work-items.priorities.urgent' },
1745
+ ],
1746
+ },
1747
+ },
1748
+ },
1749
+ options: {
1750
+ sort: { enabled: true },
1751
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1752
+ },
1753
+ },
1754
+ {
1755
+ name: 'assignedUserId',
1756
+ title: '@workflow-management:work-items.entities.work-item.fields.assigned-user-id.title',
1757
+ groupId: 'assignment',
1758
+ schema: {
1759
+ dataType: 'string',
1760
+ interface: {
1761
+ type: AXPWidgetsList.Editors.LookupBox,
1762
+ options: {
1763
+ entity: 'SecurityManagement.User',
1764
+ textField: 'displayName',
1765
+ valueField: 'id',
1766
+ look: 'select',
1767
+ expose: [
1768
+ { source: 'id', target: 'assignedUser.id' },
1769
+ { source: 'displayName', target: 'assignedUser.displayName' },
1770
+ ],
1771
+ },
1772
+ },
1773
+ },
1774
+ options: {
1775
+ sort: { enabled: true },
1776
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1777
+ },
1778
+ },
1779
+ {
1780
+ name: 'claimedByUserId',
1781
+ title: '@workflow-management:work-items.entities.work-item.fields.claimed-by-user-id.title',
1782
+ groupId: 'assignment',
1783
+ schema: {
1784
+ dataType: 'string',
1785
+ interface: {
1786
+ type: AXPWidgetsList.Editors.LookupBox,
1787
+ options: {
1788
+ entity: 'SecurityManagement.User',
1789
+ textField: 'displayName',
1790
+ valueField: 'id',
1791
+ look: 'select',
1792
+ expose: [
1793
+ { source: 'id', target: 'claimedByUser.id' },
1794
+ { source: 'displayName', target: 'claimedByUser.displayName' },
1795
+ ],
1796
+ },
1797
+ },
1798
+ },
1799
+ options: {
1800
+ sort: { enabled: true },
1801
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1802
+ },
1803
+ },
1804
+ {
1805
+ name: 'completedByUserId',
1806
+ title: '@workflow-management:work-items.entities.work-item.fields.completed-by-user-id.title',
1807
+ groupId: 'assignment',
1808
+ schema: {
1809
+ dataType: 'string',
1810
+ interface: {
1811
+ type: AXPWidgetsList.Editors.LookupBox,
1812
+ options: {
1813
+ entity: 'SecurityManagement.User',
1814
+ textField: 'displayName',
1815
+ valueField: 'id',
1816
+ look: 'select',
1817
+ expose: [
1818
+ { source: 'id', target: 'completedByUser.id' },
1819
+ { source: 'displayName', target: 'completedByUser.displayName' },
1820
+ ],
1821
+ },
1822
+ },
1823
+ },
1824
+ options: {
1825
+ sort: { enabled: true },
1826
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1827
+ },
1828
+ },
1829
+ {
1830
+ name: 'createdByUserId',
1831
+ title: '@workflow-management:work-items.entities.work-item.fields.created-by-user-id.title',
1832
+ groupId: 'metadata',
1833
+ schema: {
1834
+ dataType: 'string',
1835
+ interface: {
1836
+ type: AXPWidgetsList.Editors.LookupBox,
1837
+ options: {
1838
+ entity: 'SecurityManagement.User',
1839
+ textField: 'displayName',
1840
+ valueField: 'id',
1841
+ look: 'select',
1842
+ expose: [
1843
+ { source: 'id', target: 'createdByUser.id' },
1844
+ { source: 'displayName', target: 'createdByUser.displayName' },
1845
+ ],
1846
+ },
1847
+ },
1848
+ },
1849
+ options: {
1850
+ sort: { enabled: true },
1851
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1852
+ },
1853
+ },
1854
+ {
1855
+ name: 'assignedAt',
1856
+ title: '@workflow-management:work-items.entities.work-item.fields.assigned-at.title',
1857
+ groupId: 'assignment',
1858
+ schema: {
1859
+ dataType: 'date',
1860
+ interface: {
1861
+ type: AXPWidgetsList.Editors.DateTimeBox,
1862
+ },
1863
+ },
1864
+ options: {
1865
+ sort: { enabled: true },
1866
+ filter: { advance: { enabled: true } },
1867
+ },
1868
+ },
1869
+ {
1870
+ name: 'claimedAt',
1871
+ title: '@workflow-management:work-items.entities.work-item.fields.claimed-at.title',
1872
+ groupId: 'assignment',
1873
+ schema: {
1874
+ dataType: 'date',
1875
+ interface: {
1876
+ type: AXPWidgetsList.Editors.DateTimeBox,
1877
+ },
1878
+ },
1879
+ options: {
1880
+ sort: { enabled: true },
1881
+ filter: { advance: { enabled: true } },
1882
+ },
1883
+ },
1884
+ {
1885
+ name: 'completedAt',
1886
+ title: '@workflow-management:work-items.entities.work-item.fields.completed-at.title',
1887
+ groupId: 'assignment',
1888
+ schema: {
1889
+ dataType: 'date',
1890
+ interface: {
1891
+ type: AXPWidgetsList.Editors.DateTimeBox,
1892
+ },
1893
+ },
1894
+ options: {
1895
+ sort: { enabled: true },
1896
+ filter: { advance: { enabled: true } },
1897
+ },
1898
+ },
1899
+ {
1900
+ name: 'dueDate',
1901
+ title: '@workflow-management:work-items.entities.work-item.fields.due-date.title',
1902
+ groupId: 'basicInfo',
1903
+ schema: {
1904
+ dataType: 'date',
1905
+ interface: {
1906
+ type: AXPWidgetsList.Editors.DateTimeBox,
1907
+ options: {
1908
+ placeholder: '@workflow-management:work-items.entities.work-item.fields.due-date.placeholder',
1909
+ },
1910
+ },
1911
+ },
1912
+ options: {
1913
+ sort: { enabled: true },
1914
+ filter: { advance: { enabled: true } },
1915
+ },
1916
+ },
1917
+ {
1918
+ name: 'createdAt',
1919
+ title: '@workflow-management:work-items.entities.work-item.fields.created-at.title',
1920
+ groupId: 'metadata',
1921
+ schema: {
1922
+ dataType: 'date',
1923
+ interface: {
1924
+ type: AXPWidgetsList.Editors.DateTimeBox,
1925
+ },
1926
+ readonly: true,
1927
+ },
1928
+ options: {
1929
+ sort: { enabled: true },
1930
+ filter: { advance: { enabled: true } },
1931
+ },
1932
+ },
1933
+ {
1934
+ name: 'updatedAt',
1935
+ title: '@workflow-management:work-items.entities.work-item.fields.updated-at.title',
1936
+ groupId: 'metadata',
1937
+ schema: {
1938
+ dataType: 'date',
1939
+ interface: {
1940
+ type: AXPWidgetsList.Editors.DateTimeBox,
1941
+ },
1942
+ readonly: true,
1943
+ },
1944
+ options: {
1945
+ sort: { enabled: true },
1946
+ filter: { advance: { enabled: true } },
1947
+ },
1948
+ },
1949
+ {
1950
+ name: 'entityRefId',
1951
+ title: '@workflow-management:work-items.entities.work-item.fields.entity-ref-id.title',
1952
+ groupId: 'metadata',
1953
+ schema: {
1954
+ dataType: 'string',
1955
+ interface: {
1956
+ type: AXPWidgetsList.Editors.TextBox,
1957
+ },
1958
+ visible: false,
1959
+ },
1960
+ options: {
1961
+ sort: { enabled: true },
1962
+ filter: { advance: { enabled: true } },
1963
+ },
1964
+ },
1965
+ {
1966
+ name: 'entityRefType',
1967
+ title: '@workflow-management:work-items.entities.work-item.fields.entity-ref-type.title',
1968
+ groupId: 'metadata',
1969
+ schema: {
1970
+ dataType: 'string',
1971
+ interface: {
1972
+ type: AXPWidgetsList.Editors.TextBox,
1973
+ },
1974
+ visible: false,
1975
+ },
1976
+ options: {
1977
+ sort: { enabled: true },
1978
+ filter: { advance: { enabled: true } },
1979
+ },
1980
+ },
1981
+ ],
1982
+ columns: [
1983
+ {
1984
+ name: 'title',
1985
+ title: '@workflow-management:work-items.entities.work-item.fields.title.title',
1986
+ showAs: { type: AXPWidgetsCatalog.text },
1987
+ },
1988
+ {
1989
+ name: 'status',
1990
+ title: '@workflow-management:work-items.entities.work-item.fields.status.title',
1991
+ showAs: { type: AXPWidgetsCatalog.text },
1992
+ options: { width: '120px' },
1993
+ },
1994
+ {
1995
+ name: 'priority',
1996
+ title: '@workflow-management:work-items.entities.work-item.fields.priority.title',
1997
+ showAs: { type: AXPWidgetsCatalog.text },
1998
+ options: { width: '100px' },
1999
+ },
2000
+ {
2001
+ name: 'kind',
2002
+ title: '@workflow-management:work-items.entities.work-item.fields.kind.title',
2003
+ showAs: { type: AXPWidgetsCatalog.text },
2004
+ options: { width: '120px' },
2005
+ },
2006
+ {
2007
+ name: 'assignedUserId',
2008
+ title: '@workflow-management:work-items.entities.work-item.fields.assigned-user-id.title',
2009
+ showAs: { type: AXPWidgetsCatalog.text },
2010
+ options: { width: '150px', dataPath: 'assignedUser.displayName' },
2011
+ },
2012
+ {
2013
+ name: 'claimedByUserId',
2014
+ title: '@workflow-management:work-items.entities.work-item.fields.claimed-by-user-id.title',
2015
+ showAs: { type: AXPWidgetsCatalog.text },
2016
+ options: { width: '150px', dataPath: 'claimedByUser.displayName' },
2017
+ },
2018
+ {
2019
+ name: 'dueDate',
2020
+ title: '@workflow-management:work-items.entities.work-item.fields.due-date.title',
2021
+ showAs: { type: AXPWidgetsCatalog.dateTime },
2022
+ options: { width: '180px' },
2023
+ },
2024
+ {
2025
+ name: 'createdAt',
2026
+ title: '@workflow-management:work-items.entities.work-item.fields.created-at.title',
2027
+ showAs: { type: AXPWidgetsCatalog.dateTime },
2028
+ options: { width: '180px' },
2029
+ },
2030
+ ],
2031
+ commands: {
2032
+ delete: {
2033
+ execute: async (id) => await dataService.deleteOne(id),
2034
+ },
2035
+ },
2036
+ queries: {
2037
+ byKey: {
2038
+ execute: async (id) => {
2039
+ const item = await dataService.getOne(id);
2040
+ return item;
2041
+ },
2042
+ type: AXPEntityQueryType.Single,
2043
+ },
2044
+ list: {
2045
+ execute: async (e) => {
2046
+ return await dataService.query(e);
2047
+ },
2048
+ type: AXPEntityQueryType.List,
2049
+ },
2050
+ },
2051
+ relatedEntities: [
2052
+ {
2053
+ entity: `${RootConfig.module.name}.${RootConfig.entities.workItemCandidate.name}`,
2054
+ title: RootConfig.entities.workItemCandidate.titlePlural,
2055
+ columns: ['userId'],
2056
+ conditions: [
2057
+ {
2058
+ name: 'workItemId',
2059
+ operator: { type: 'equal' },
2060
+ value: '{{context.eval("id")}}',
2061
+ },
2062
+ ],
2063
+ actions: [
2064
+ {
2065
+ title: '@general:actions.create.title',
2066
+ command: {
2067
+ name: 'create-entity',
2068
+ options: {
2069
+ process: {
2070
+ redirect: false,
2071
+ canCreateNewOne: true,
2072
+ },
2073
+ },
2074
+ },
2075
+ priority: 'primary',
2076
+ type: 'create',
2077
+ scope: AXPEntityCommandScope.TypeLevel,
2078
+ },
2079
+ ],
2080
+ layout: { type: 'page-list', position: 'after', order: 1 },
2081
+ },
2082
+ ],
2083
+ interfaces: {
2084
+ master: {
2085
+ single: {
2086
+ title: '{{ title }}',
2087
+ sections: [
2088
+ { id: 'basicInfo', order: 1, layout: { positions: { lg: { colSpan: 12 } } } },
2089
+ { id: 'assignment', order: 2, layout: { positions: { lg: { colSpan: 6 } } } },
2090
+ { id: 'workflow', order: 3, layout: { positions: { lg: { colSpan: 6 } } } },
2091
+ { id: 'metadata', order: 4, layout: { positions: { lg: { colSpan: 6 } } } },
2092
+ ],
2093
+ properties: [
2094
+ { name: 'title', layout: { positions: { lg: { colSpan: 12 } } } },
2095
+ { name: 'description', layout: { positions: { lg: { colSpan: 12 } } } },
2096
+ { name: 'kind', layout: { positions: { lg: { colSpan: 6 } } } },
2097
+ { name: 'priority', layout: { positions: { lg: { colSpan: 6 } } } },
2098
+ { name: 'status', layout: { positions: { lg: { colSpan: 6 } } } },
2099
+ { name: 'dueDate', layout: { positions: { lg: { colSpan: 6 } } } },
2100
+ { name: 'assignedUserId', layout: { positions: { lg: { colSpan: 6 } } } },
2101
+ { name: 'claimedByUserId', layout: { positions: { lg: { colSpan: 6 } } } },
2102
+ { name: 'completedByUserId', layout: { positions: { lg: { colSpan: 6 } } } },
2103
+ { name: 'assignedAt', layout: { positions: { lg: { colSpan: 6 } } } },
2104
+ { name: 'claimedAt', layout: { positions: { lg: { colSpan: 6 } } } },
2105
+ { name: 'completedAt', layout: { positions: { lg: { colSpan: 6 } } } },
2106
+ { name: 'instanceId', layout: { positions: { lg: { colSpan: 6 } } } },
2107
+ { name: 'bookmarkId', layout: { positions: { lg: { colSpan: 6 } } } },
2108
+ { name: 'activityNodeId', layout: { positions: { lg: { colSpan: 6 } } } },
2109
+ { name: 'activityName', layout: { positions: { lg: { colSpan: 6 } } } },
2110
+ { name: 'createdByUserId', layout: { positions: { lg: { colSpan: 6 } } } },
2111
+ { name: 'createdAt', layout: { positions: { lg: { colSpan: 6 } } } },
2112
+ { name: 'updatedAt', layout: { positions: { lg: { colSpan: 6 } } } },
2113
+ ],
2114
+ actions: [...entityMasterRecordActions()],
2115
+ },
2116
+ list: {
2117
+ actions: [...entityMasterCrudActions()],
2118
+ views: [
2119
+ createAllQueryView({ sorts: [{ name: 'createdAt', dir: 'desc' }] }),
2120
+ createQueryView('my-work-items', '@workflow-management:work-items.views.my-work-items', false, {
2121
+ conditions: [
2122
+ {
2123
+ name: 'assignedUserId',
2124
+ operator: { type: 'equal' },
2125
+ value: '{{$currentUser.id}}',
2126
+ },
2127
+ {
2128
+ name: 'claimedByUserId',
2129
+ operator: { type: 'equal' },
2130
+ value: '{{$currentUser.id}}',
2131
+ },
2132
+ ],
2133
+ sorts: [{ name: 'createdAt', dir: 'desc' }],
2134
+ }),
2135
+ createQueryView('claimed-by-me', '@workflow-management:work-items.views.claimed-by-me', false, {
2136
+ conditions: [
2137
+ {
2138
+ name: 'claimedByUserId',
2139
+ operator: { type: 'equal' },
2140
+ value: '{{$currentUser.id}}',
2141
+ },
2142
+ ],
2143
+ sorts: [{ name: 'claimedAt', dir: 'desc' }],
2144
+ }),
2145
+ createQueryView('pending', '@workflow-management:work-items.views.pending', false, {
2146
+ conditions: [
2147
+ {
2148
+ name: 'status',
2149
+ operator: { type: 'equal' },
2150
+ value: 'Pending',
2151
+ },
2152
+ ],
2153
+ sorts: [{ name: 'priority', dir: 'desc' }, { name: 'createdAt', dir: 'asc' }],
2154
+ }),
2155
+ createQueryView('in-progress', '@workflow-management:work-items.views.in-progress', false, {
2156
+ conditions: [
2157
+ {
2158
+ name: 'status',
2159
+ operator: { type: 'equal' },
2160
+ value: 'InProgress',
2161
+ },
2162
+ ],
2163
+ sorts: [{ name: 'dueDate', dir: 'asc' }],
2164
+ }),
2165
+ createQueryView('completed', '@workflow-management:work-items.views.completed', false, {
2166
+ conditions: [
2167
+ {
2168
+ name: 'status',
2169
+ operator: { type: 'equal' },
2170
+ value: 'Completed',
2171
+ },
2172
+ ],
2173
+ sorts: [{ name: 'completedAt', dir: 'desc' }],
2174
+ }),
2175
+ ],
2176
+ },
2177
+ },
2178
+ },
2179
+ };
2180
+ return entityDef;
2181
+ }
2182
+
2183
+ var workItem_entity = /*#__PURE__*/Object.freeze({
2184
+ __proto__: null,
2185
+ factory: factory$1
2186
+ });
2187
+
2188
+ class AXMWorkflowManagementWorkItemCandidateEntityService extends AXMEntityCrudServiceImpl {
2189
+ }
2190
+ class AXMWorkflowManagementWorkItemCandidateEntityServiceImpl extends AXMWorkflowManagementWorkItemCandidateEntityService {
2191
+ constructor() {
2192
+ super(`${RootConfig.module.name}.${RootConfig.entities.workItemCandidate.name}`);
2193
+ }
2194
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemCandidateEntityServiceImpl, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2195
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemCandidateEntityServiceImpl }); }
2196
+ }
2197
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemCandidateEntityServiceImpl, decorators: [{
2198
+ type: Injectable
2199
+ }], ctorParameters: () => [] });
2200
+
2201
+ class AXMWorkflowManagementWorkItemCandidateEntityModule {
2202
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemCandidateEntityModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2203
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemCandidateEntityModule }); }
2204
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemCandidateEntityModule, providers: [
2205
+ {
2206
+ provide: AXMWorkflowManagementWorkItemCandidateEntityService,
2207
+ useClass: AXMWorkflowManagementWorkItemCandidateEntityServiceImpl,
2208
+ },
2209
+ ] }); }
2210
+ }
2211
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementWorkItemCandidateEntityModule, decorators: [{
2212
+ type: NgModule,
2213
+ args: [{
2214
+ imports: [],
2215
+ exports: [],
2216
+ declarations: [],
2217
+ providers: [
2218
+ {
2219
+ provide: AXMWorkflowManagementWorkItemCandidateEntityService,
2220
+ useClass: AXMWorkflowManagementWorkItemCandidateEntityServiceImpl,
2221
+ },
2222
+ ],
2223
+ }]
2224
+ }] });
2225
+
2226
+ async function factory(injector) {
2227
+ const dataService = injector.get(AXMWorkflowManagementWorkItemCandidateEntityService);
2228
+ const entityDef = {
2229
+ module: RootConfig.module.name,
2230
+ name: RootConfig.entities.workItemCandidate.name,
2231
+ title: RootConfig.entities.workItemCandidate.title,
2232
+ icon: RootConfig.entities.workItemCandidate.icon,
2233
+ formats: {
2234
+ individual: RootConfig.entities.workItemCandidate.title,
2235
+ plural: RootConfig.entities.workItemCandidate.titlePlural,
2236
+ displayName: '{{ user?.displayName || userId }}',
2237
+ searchResult: {
2238
+ title: '{{ user?.displayName || userId }}',
2239
+ description: '{{ workItem?.title }}',
2240
+ },
2241
+ },
2242
+ groups: [
2243
+ {
2244
+ id: 'basic-info',
2245
+ title: '@workflow-management:work-items.entities.work-item-candidate.groups.basic-info',
2246
+ },
2247
+ {
2248
+ id: 'candidate',
2249
+ title: '@workflow-management:work-items.entities.work-item-candidate.groups.candidate',
2250
+ },
2251
+ ],
2252
+ properties: [
2253
+ {
2254
+ name: 'id',
2255
+ title: 'ID',
2256
+ groupId: 'basic-info',
2257
+ schema: {
2258
+ dataType: 'uuid',
2259
+ visible: false,
2260
+ nullable: false,
2261
+ readonly: true,
2262
+ unique: { enabled: true },
2263
+ },
2264
+ },
2265
+ {
2266
+ name: 'workItemId',
2267
+ title: '@workflow-management:work-items.entities.work-item-candidate.fields.work-item-id.title',
2268
+ groupId: 'basic-info',
2269
+ schema: {
2270
+ dataType: 'string',
2271
+ interface: {
2272
+ type: AXPWidgetsList.Editors.LookupBox,
2273
+ options: {
2274
+ entity: `${RootConfig.module.name}.${RootConfig.entities.workItem.name}`,
2275
+ textField: 'title',
2276
+ valueField: 'id',
2277
+ look: 'select',
2278
+ expose: [
2279
+ { source: 'id', target: 'workItem.id' },
2280
+ { source: 'title', target: 'workItem.title' },
2281
+ { source: 'status', target: 'workItem.status' },
2282
+ ],
2283
+ },
2284
+ },
2285
+ },
2286
+ options: {
2287
+ sort: { enabled: true },
2288
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
2289
+ },
2290
+ validations: [{ rule: 'required' }],
2291
+ },
2292
+ {
2293
+ name: 'userId',
2294
+ title: '@workflow-management:work-items.entities.work-item-candidate.fields.user-id.title',
2295
+ groupId: 'candidate',
2296
+ schema: {
2297
+ dataType: 'string',
2298
+ interface: {
2299
+ type: AXPWidgetsList.Editors.LookupBox,
2300
+ options: {
2301
+ entity: 'SecurityManagement.User',
2302
+ textField: 'displayName',
2303
+ valueField: 'id',
2304
+ look: 'select',
2305
+ expose: [
2306
+ { source: 'id', target: 'user.id' },
2307
+ { source: 'displayName', target: 'user.displayName' },
2308
+ ],
2309
+ },
2310
+ },
2311
+ },
2312
+ options: {
2313
+ sort: { enabled: true },
2314
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
2315
+ },
2316
+ validations: [{ rule: 'required' }],
2317
+ },
2318
+ {
2319
+ name: 'createdAt',
2320
+ title: '@workflow-management:work-items.entities.work-item-candidate.fields.created-at.title',
2321
+ groupId: 'basic-info',
2322
+ schema: {
2323
+ dataType: 'date',
2324
+ interface: {
2325
+ type: AXPWidgetsList.Editors.DateTimeBox,
2326
+ },
2327
+ readonly: true,
2328
+ },
2329
+ options: {
2330
+ sort: { enabled: true },
2331
+ filter: { advance: { enabled: true } },
2332
+ },
2333
+ },
2334
+ {
2335
+ name: 'updatedAt',
2336
+ title: '@workflow-management:work-items.entities.work-item-candidate.fields.updated-at.title',
2337
+ groupId: 'basic-info',
2338
+ schema: {
2339
+ dataType: 'date',
2340
+ interface: {
2341
+ type: AXPWidgetsList.Editors.DateTimeBox,
2342
+ },
2343
+ readonly: true,
2344
+ },
2345
+ options: {
2346
+ sort: { enabled: true },
2347
+ filter: { advance: { enabled: true } },
2348
+ },
2349
+ },
2350
+ ],
2351
+ columns: [
2352
+ {
2353
+ name: 'workItemId',
2354
+ title: '@workflow-management:work-items.entities.work-item-candidate.fields.work-item-id.title',
2355
+ showAs: { type: AXPWidgetsCatalog.text },
2356
+ options: { dataPath: 'workItem.title' },
2357
+ },
2358
+ {
2359
+ name: 'userId',
2360
+ title: '@workflow-management:work-items.entities.work-item-candidate.fields.user-id.title',
2361
+ showAs: { type: AXPWidgetsCatalog.text },
2362
+ options: { dataPath: 'user.displayName' },
2363
+ },
2364
+ {
2365
+ name: 'createdAt',
2366
+ title: '@workflow-management:work-items.entities.work-item-candidate.fields.created-at.title',
2367
+ showAs: { type: AXPWidgetsCatalog.dateTime },
2368
+ options: { width: '180px' },
2369
+ },
2370
+ ],
2371
+ commands: {
2372
+ delete: {
2373
+ execute: async (id) => await dataService.deleteOne(id),
2374
+ },
2375
+ },
2376
+ queries: {
2377
+ byKey: {
2378
+ execute: async (id) => {
2379
+ const item = await dataService.getOne(id);
2380
+ return item;
2381
+ },
2382
+ type: AXPEntityQueryType.Single,
2383
+ },
2384
+ list: {
2385
+ execute: async (e) => {
2386
+ return await dataService.query(e);
2387
+ },
2388
+ type: AXPEntityQueryType.List,
2389
+ },
2390
+ },
2391
+ interfaces: {
2392
+ master: {
2393
+ single: {
2394
+ title: '{{ user?.displayName || userId }}',
2395
+ sections: [
2396
+ { id: 'basic-info', order: 1, layout: { positions: { lg: { colSpan: 12 } } } },
2397
+ { id: 'candidate', order: 2, layout: { positions: { lg: { colSpan: 12 } } } },
2398
+ ],
2399
+ properties: [
2400
+ { name: 'workItemId', layout: { positions: { lg: { colSpan: 12 } } } },
2401
+ { name: 'userId', layout: { positions: { lg: { colSpan: 12 } } } },
2402
+ { name: 'createdAt', layout: { positions: { lg: { colSpan: 6 } } } },
2403
+ { name: 'updatedAt', layout: { positions: { lg: { colSpan: 6 } } } },
2404
+ ],
2405
+ actions: [
2406
+ {
2407
+ title: '@general:actions.edit.title',
2408
+ command: 'quick-modify-entity',
2409
+ priority: 'primary',
2410
+ type: 'update',
2411
+ scope: AXPEntityCommandScope.Individual,
2412
+ },
2413
+ {
2414
+ title: '@general:actions.delete.title',
2415
+ command: 'delete-entity',
2416
+ priority: 'secondary',
2417
+ type: 'delete',
2418
+ scope: AXPEntityCommandScope.Individual,
2419
+ },
2420
+ ],
2421
+ },
2422
+ list: {
2423
+ actions: [
2424
+ {
2425
+ title: '@general:actions.create.title',
2426
+ command: {
2427
+ name: 'create-entity',
2428
+ options: {
2429
+ process: {
2430
+ redirect: false,
2431
+ canCreateNewOne: true,
2432
+ },
2433
+ },
2434
+ },
2435
+ priority: 'primary',
2436
+ type: 'create',
2437
+ scope: AXPEntityCommandScope.TypeLevel,
2438
+ },
2439
+ {
2440
+ title: '@general:actions.delete-items.title',
2441
+ command: 'delete-entity',
2442
+ priority: 'primary',
2443
+ type: 'delete',
2444
+ scope: AXPEntityCommandScope.Selected,
2445
+ },
2446
+ {
2447
+ title: '@general:actions.edit.title',
2448
+ command: 'quick-modify-entity',
2449
+ priority: 'secondary',
2450
+ type: 'update',
2451
+ scope: AXPEntityCommandScope.Individual,
2452
+ },
2453
+ {
2454
+ title: '@general:actions.delete.title',
2455
+ command: 'delete-entity',
2456
+ priority: 'secondary',
2457
+ type: 'delete',
2458
+ scope: AXPEntityCommandScope.Individual,
2459
+ },
2460
+ ],
2461
+ views: [createAllQueryView({ sorts: [{ name: 'createdAt', dir: 'desc' }] })],
2462
+ },
2463
+ },
2464
+ },
2465
+ };
2466
+ return entityDef;
2467
+ }
2468
+
2469
+ var workItemCandidate_entity = /*#__PURE__*/Object.freeze({
2470
+ __proto__: null,
2471
+ factory: factory
2472
+ });
2473
+
2474
+ //#endregion
2475
+ /**
2476
+ * CheckPermission Activity (Backend)
2477
+ *
2478
+ * Checks if a user has specific permission.
2479
+ * This is a mock implementation that always grants permission for demo purposes.
2480
+ *
2481
+ * In production, this would check against real permission system.
2482
+ *
2483
+ * Execution Mode: backend
2484
+ * Activity Type: workflow-activity:check-permission
2485
+ *
2486
+ * Outcomes:
2487
+ * - HasPermission: User has the permission
2488
+ * - NoPermission: User does not have the permission
2489
+ */
2490
+ class CheckPermissionActivity {
2491
+ constructor() {
2492
+ //#region ---- AXPCommand Implementation ----
2493
+ this.sessionService = inject(AXPSessionService);
2494
+ }
2495
+ async execute(input) {
2496
+ const hasPermission = this.sessionService.authorize(input.permission);
2497
+ const output = {
2498
+ hasPermission,
2499
+ userId: input.userId || 'current-user',
2500
+ permission: input.permission,
2501
+ };
2502
+ // Determine outcome based on permission check
2503
+ const outcomes = hasPermission
2504
+ ? { HasPermission: true }
2505
+ : { NoPermission: true };
2506
+ console.log(`[CheckPermissionActivity] Checked permission '${input.permission}' for user '${output.userId}': ${hasPermission ? 'GRANTED' : 'DENIED'}`);
2507
+ return {
2508
+ success: true,
2509
+ data: {
2510
+ output,
2511
+ outcomes,
2512
+ },
2513
+ };
176
2514
  }
2515
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CheckPermissionActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2516
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CheckPermissionActivity }); }
177
2517
  }
2518
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CheckPermissionActivity, decorators: [{
2519
+ type: Injectable
2520
+ }] });
178
2521
 
179
2522
  //#endregion
180
2523
  /**
@@ -675,100 +3018,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
675
3018
  type: Injectable
676
3019
  }] });
677
3020
 
678
- //#region ---- Imports ----
679
- //#endregion
680
- /**
681
- * Human Task Activity (Frontend)
682
- *
683
- * Generic human task activity that suspends workflow and waits for user interaction.
684
- * Supports assignment and actions (displayed inline). For dialog-style flow, use a follow-up activity.
685
- *
686
- * Execution Mode: frontend
687
- * Task Type: human-task
688
- * Activity Type: workflow-activity:human-task
689
- *
690
- * Outcomes:
691
- * Outcomes are dynamically generated based on the actions provided in the input.
692
- * Each action creates a corresponding outcome with the action name (from command.name or action.name).
693
- * If no actions are provided, default actions (cancel, submit) are used.
694
- *
695
- * Examples:
696
- * - If action has command.name = 'approve', outcome will be { approve: true }
697
- * - If action has name = 'reject', outcome will be { reject: true }
698
- * - Default outcomes: { cancel: true } or { submit: true }
699
- *
700
- * Assignment:
701
- * - assignedUserIds: Direct assignment to specific users
702
- * - candidateUserIds: Users who can claim the task
703
- * - candidateRoleIds: Roles whose members can claim the task
704
- *
705
- * Display Modes:
706
- * - 'dialog': Traditional modal dialog (default)
707
- * - 'inline': Actions displayed directly on page before resume
708
- */
709
- class HumanTaskActivity {
710
- //#region ---- Services & Dependencies ----
711
- // Note: This activity doesn't execute immediately - it suspends the workflow
712
- // The actual UI display is handled by the Generic Task Provider and Display Service
713
- //#endregion
714
- //#region ---- AXPCommand Implementation ----
715
- /**
716
- * Execute human task activity.
717
- *
718
- * This method doesn't actually show UI - it just validates input and returns success.
719
- * The workflow engine will suspend at this activity and create a bookmark.
720
- * The Generic Task Provider will handle displaying the task UI inline.
721
- */
722
- async execute(input) {
723
- console.log('human task input', input.context?.['input'] ?? 'no input');
724
- try {
725
- // Validate required fields
726
- if (!input.title && !input.description) {
727
- console.warn('[HumanTaskActivity] No title or description provided');
728
- }
729
- // Build default outcomes if no actions provided
730
- const outcomes = {};
731
- outcomes['cancel'] = true;
732
- outcomes['submit'] = true;
733
- // This activity suspends the workflow - the actual result will come from resume
734
- // Return a placeholder result - the real result comes when user completes the task
735
- return {
736
- success: true,
737
- data: {
738
- output: {
739
- result: input.context || {},
740
- action: 'pending', // Will be replaced when task is completed
741
- },
742
- outcomes,
743
- },
744
- };
745
- }
746
- catch (error) {
747
- console.error(`[HumanTaskActivity] Failed to execute human task:`, error);
748
- return {
749
- success: false,
750
- message: {
751
- text: error.message || 'Failed to execute human task',
752
- },
753
- data: {
754
- output: {
755
- result: {},
756
- action: 'cancel',
757
- },
758
- outcomes: {
759
- cancel: true,
760
- },
761
- },
762
- };
763
- }
764
- }
765
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HumanTaskActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
766
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HumanTaskActivity }); }
767
- }
768
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HumanTaskActivity, decorators: [{
769
- type: Injectable
770
- }] });
771
-
772
3021
  //#endregion
773
3022
  /**
774
3023
  * ShowToast Activity (Frontend)
@@ -1169,14 +3418,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1169
3418
  }]
1170
3419
  }] });
1171
3420
 
3421
+ class AssignToManggerActivity {
3422
+ async execute(input) {
3423
+ debugger;
3424
+ console.log('input data assign', input);
3425
+ return {
3426
+ success: true,
3427
+ data: {
3428
+ outcomes: ['done'],
3429
+ output: {}
3430
+ },
3431
+ };
3432
+ }
3433
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AssignToManggerActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3434
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AssignToManggerActivity }); }
3435
+ }
3436
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AssignToManggerActivity, decorators: [{
3437
+ type: Injectable
3438
+ }] });
3439
+
1172
3440
  var index = /*#__PURE__*/Object.freeze({
1173
3441
  __proto__: null,
1174
3442
  AXMWorkflowActivitiesDefinitionProvider: AXMWorkflowActivitiesDefinitionProvider,
1175
3443
  AXPCreateEntityActivity: AXPCreateEntityActivity,
3444
+ AssignToManggerActivity: AssignToManggerActivity,
3445
+ CheckPermissionActivity: CheckPermissionActivity,
1176
3446
  CollectSignatureActivity: CollectSignatureActivity,
1177
3447
  ExecuteCommandActivity: ExecuteCommandActivity,
1178
3448
  ExecuteQueryActivity: ExecuteQueryActivity,
1179
- HumanTaskActivity: HumanTaskActivity,
1180
3449
  ShowConfirmPopupActivity: ShowConfirmPopupActivity,
1181
3450
  ShowLayoutPopupActivity: ShowLayoutPopupActivity,
1182
3451
  ShowToastActivity: ShowToastActivity
@@ -1254,8 +3523,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1254
3523
  class AXCCategoryProvider {
1255
3524
  constructor() {
1256
3525
  this.entityService = inject(AXPEntityService);
1257
- /** Category entity is provided by category plugin (ActivityDefinition → ActivityDefinitionCategory). */
1258
- this.categoryService = this.entityService.withEntity(RootConfig.module.name, 'ActivityDefinitionCategory').data();
3526
+ this.categoryService = this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.activityCategory.name).data();
1259
3527
  }
1260
3528
  async getList(parentId) {
1261
3529
  const list = [];
@@ -1305,9 +3573,7 @@ class AXMWorkflowCategoryProvider {
1305
3573
  constructor() {
1306
3574
  //#region ---- Services & Dependencies ----
1307
3575
  this.entityService = inject(AXPEntityService);
1308
- this.categoryService = this.entityService
1309
- .withEntity(RootConfig.module.name, RootConfig.entities.workflowDefinition.name + 'Category')
1310
- .data();
3576
+ this.categoryService = this.entityService.withEntity(RootConfig.module.name, 'WorkflowCategory').data();
1311
3577
  }
1312
3578
  //#endregion
1313
3579
  //#region ---- AXPWorkflowCategoryProvider Implementation ----
@@ -1380,23 +3646,21 @@ class AXMWorkflowDefinitionProvider {
1380
3646
  constructor() {
1381
3647
  //#region ---- Services & Dependencies ----
1382
3648
  this.entityService = inject(AXPEntityService);
1383
- this.workflowDefinitionService = this.entityService
1384
- .withEntity(RootConfig.module.name, RootConfig.entities.workflowDefinition.name)
1385
- .data();
3649
+ this.workflowDefinitionService = this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.workflowDefinition.name).data();
1386
3650
  }
1387
3651
  //#endregion
1388
3652
  //#region ---- AXPWorkflowProvider Implementation ----
1389
3653
  async getList(categoryId) {
1390
- // Same as report: filter by categoryIds array with 'contains'
3654
+ // Use 'equal' operator to filter by category field
1391
3655
  const result = await this.workflowDefinitionService.query({
1392
3656
  skip: 0,
1393
3657
  take: 1000,
1394
3658
  filter: {
1395
3659
  logic: 'and',
1396
3660
  filters: [{
1397
- field: 'categoryIds',
3661
+ field: 'category',
1398
3662
  operator: {
1399
- type: 'contains',
3663
+ type: 'equal',
1400
3664
  },
1401
3665
  value: categoryId,
1402
3666
  }]
@@ -1507,6 +3771,15 @@ const AXMPermissionsKeys = {
1507
3771
  WorkflowManagement: {
1508
3772
  Management: 'WorkflowManagement:Permission:Management',
1509
3773
  },
3774
+ WorkItems: {
3775
+ Management: 'WorkflowManagement:WorkItems:Management',
3776
+ View: 'WorkflowManagement:WorkItems:View',
3777
+ Create: 'WorkflowManagement:WorkItems:Create',
3778
+ Assign: 'WorkflowManagement:WorkItems:Assign',
3779
+ Claim: 'WorkflowManagement:WorkItems:Claim',
3780
+ Complete: 'WorkflowManagement:WorkItems:Complete',
3781
+ Cancel: 'WorkflowManagement:WorkItems:Cancel',
3782
+ },
1510
3783
  };
1511
3784
 
1512
3785
  class AXMPermissionDefinitionProvider {
@@ -1517,7 +3790,18 @@ class AXMPermissionDefinitionProvider {
1517
3790
  const trans = async (key) => await this.translationService.translateAsync(`@workflow-management:${key}`);
1518
3791
  const keys = AXMPermissionsKeys;
1519
3792
  const MODULE_PERMISSIONS = '@workflow-management:module.permissions';
1520
- context.addGroup(RootConfig.module.name, `${MODULE_PERMISSIONS}.title`, `${MODULE_PERMISSIONS}.description`);
3793
+ const WORK_ITEMS_PERMISSIONS = '@workflow-management:work-items.permissions';
3794
+ context
3795
+ .addGroup(RootConfig.module.name, `${MODULE_PERMISSIONS}.title`, `${MODULE_PERMISSIONS}.description`)
3796
+ .addPermission(keys.WorkItems.Management, `${WORK_ITEMS_PERMISSIONS}.manage.title`, `${WORK_ITEMS_PERMISSIONS}.manage.description`)
3797
+ .addChild(keys.WorkItems.View, `${WORK_ITEMS_PERMISSIONS}.view.title`, `${WORK_ITEMS_PERMISSIONS}.view.description`)
3798
+ .addChild(keys.WorkItems.Create, `${WORK_ITEMS_PERMISSIONS}.create.title`, `${WORK_ITEMS_PERMISSIONS}.create.description`)
3799
+ .addChild(keys.WorkItems.Assign, `${WORK_ITEMS_PERMISSIONS}.assign.title`, `${WORK_ITEMS_PERMISSIONS}.assign.description`)
3800
+ .addChild(keys.WorkItems.Claim, `${WORK_ITEMS_PERMISSIONS}.claim.title`, `${WORK_ITEMS_PERMISSIONS}.claim.description`)
3801
+ .addChild(keys.WorkItems.Complete, `${WORK_ITEMS_PERMISSIONS}.complete.title`, `${WORK_ITEMS_PERMISSIONS}.complete.description`)
3802
+ .addChild(keys.WorkItems.Cancel, `${WORK_ITEMS_PERMISSIONS}.cancel.title`, `${WORK_ITEMS_PERMISSIONS}.cancel.description`)
3803
+ .endPermission()
3804
+ .endGroup();
1521
3805
  }
1522
3806
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMPermissionDefinitionProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1523
3807
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMPermissionDefinitionProvider }); }
@@ -1526,487 +3810,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1526
3810
  type: Injectable
1527
3811
  }] });
1528
3812
 
1529
- /**
1530
- * Injection token for provider config. Use when registering via DI (provide token + useFactory with deps).
1531
- * When creating via useFactory: () => new AXPGenericWorkflowTaskProvider({ ... }), config is passed in the closure.
1532
- */
1533
- const AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG = new InjectionToken('AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG');
1534
- //#endregion
1535
- /**
1536
- * Generic Workflow Task Provider
1537
- *
1538
- * Provides tasks from Workflow Instances directly (no Work Items).
1539
- * Queries suspended workflow instances and extracts tasks from bookmarks.
1540
- *
1541
- * Create one provider per workflow definition by passing a config (name, title, definitionId).
1542
- * E.g. leave request: { name: 'leave-request-workflow-tasks', title: 'Leave Request', definitionId: 'LeaveRequestWorkflow' }
1543
- *
1544
- * Architecture:
1545
- * - Queries Workflow Instances with subStatus = 'Suspended'
1546
- * - Filters by config.definitionId when set (one provider = one definition)
1547
- * - Extracts active bookmarks for each instance
1548
- * - Parses bookmark payload for assignment/actions
1549
- * - Maps to task board format
1550
- */
1551
- class AXPGenericWorkflowTaskProvider extends AXPWorkflowTaskProvider {
1552
- //#endregion
1553
- //#region ---- Constructor ----
1554
- constructor(config) {
1555
- super();
1556
- //#endregion
1557
- //#region ---- Services & Dependencies ----
1558
- this.entityService = inject(AXPEntityService);
1559
- this.workflowInstanceData = this.entityService
1560
- .withEntity('WorkflowManagement', 'WorkflowInstance')
1561
- .data();
1562
- this.translationService = inject(AXTranslationService);
1563
- this.workflowManager = inject(AXPWorkflowManager);
1564
- this.config = config;
1565
- }
1566
- //#endregion
1567
- //#region ---- Provider Metadata ----
1568
- get name() {
1569
- return this.config.name;
1570
- }
1571
- get title() {
1572
- return this.config.title;
1573
- }
1574
- get icon() {
1575
- return this.config.icon ?? 'fa-light fa-diagram-project';
1576
- }
1577
- //#endregion
1578
- //#region ---- Task Retrieval ----
1579
- /**
1580
- * Get tasks from suspended workflow instances.
1581
- *
1582
- * Queries workflow instances filtered by:
1583
- * - subStatus = 'Suspended'
1584
- * - entityRefType (if provided in filter)
1585
- * - definitionId (if provided in filter)
1586
- * - assignee/claimant (if filter provided)
1587
- *
1588
- * Then extracts active bookmarks and maps to task board format.
1589
- */
1590
- async getTasks(options) {
1591
- console.log(`[GenericWorkflowTaskProvider] 🔍 getTasks called with options:`, {
1592
- skip: options?.skip,
1593
- take: options?.take,
1594
- assigneeIds: options?.assigneeIds,
1595
- range: options?.range,
1596
- types: options?.types,
1597
- });
1598
- // Build filter for workflow instances
1599
- const baseFilter = { logic: 'and', filters: [] };
1600
- // Filter by subStatus = 'Suspended' (only suspended workflows have pending tasks)
1601
- baseFilter.filters?.push({
1602
- field: 'subStatus',
1603
- operator: { type: 'equal' },
1604
- value: 'Suspended',
1605
- });
1606
- // Scope this provider to one workflow definition
1607
- if (this.config.definitionId) {
1608
- baseFilter.filters?.push({
1609
- field: 'definitionId',
1610
- operator: { type: 'equal' },
1611
- value: this.config.definitionId,
1612
- });
1613
- }
1614
- // Filter by date range if provided (using createdAt or updatedAt)
1615
- if (options?.range?.from || options?.range?.end) {
1616
- if (options.range.from) {
1617
- baseFilter.filters?.push({
1618
- field: 'createdAt',
1619
- operator: { type: 'gte' },
1620
- value: options.range.from.toISOString(),
1621
- });
1622
- }
1623
- if (options.range.end) {
1624
- baseFilter.filters?.push({
1625
- field: 'createdAt',
1626
- operator: { type: 'lte' },
1627
- value: options.range.end.toISOString(),
1628
- });
1629
- }
1630
- }
1631
- console.log(`[GenericWorkflowTaskProvider] 🔎 Query filter:`, JSON.stringify(baseFilter, null, 2));
1632
- // Query workflow instances
1633
- const { items: instances, total } = await this.workflowInstanceData.query({
1634
- skip: options?.skip ?? 0,
1635
- take: options?.take ?? 20,
1636
- filter: baseFilter,
1637
- });
1638
- console.log(`[GenericWorkflowTaskProvider] 📦 Query result:`, {
1639
- total,
1640
- itemsCount: instances.length,
1641
- instances: instances.map((inst) => ({
1642
- id: inst.id,
1643
- definitionId: inst.definitionId,
1644
- entityRefType: inst.entityRefType,
1645
- entityRefId: inst.entityRefId,
1646
- subStatus: inst.subStatus,
1647
- })),
1648
- });
1649
- // Extract tasks from bookmarks for each instance
1650
- const tasks = [];
1651
- console.log(`[GenericWorkflowTaskProvider] 🔄 Processing ${instances.length} workflow instances...`);
1652
- for (const instance of instances) {
1653
- try {
1654
- console.log(`[GenericWorkflowTaskProvider] 📝 Processing instance:`, {
1655
- id: instance.id,
1656
- definitionId: instance.definitionId,
1657
- entityRefType: instance.entityRefType,
1658
- entityRefId: instance.entityRefId,
1659
- });
1660
- // Get active bookmarks from instance entity (workflowInstance.bookmarks)
1661
- const bookmarks = this.getActiveBookmarksFromInstance(instance);
1662
- console.log(`[GenericWorkflowTaskProvider] 📌 Found ${bookmarks.length} active bookmarks for instance ${instance.id}`);
1663
- // Process each bookmark (typically one per suspended activity)
1664
- for (const bookmark of bookmarks) {
1665
- try {
1666
- // Get payload from entity (payload object or parse payloadJson)
1667
- let payload;
1668
- try {
1669
- const raw = bookmark.payload ??
1670
- (bookmark.payloadJson ? JSON.parse(bookmark.payloadJson) : null);
1671
- payload =
1672
- typeof raw === 'object' && raw !== null
1673
- ? raw
1674
- : {};
1675
- }
1676
- catch (error) {
1677
- console.warn(`[GenericWorkflowTaskProvider] ⚠️ Failed to parse bookmark payload:`, error);
1678
- continue;
1679
- }
1680
- // Only process human-task bookmarks
1681
- if (payload.taskType !== 'human-task') {
1682
- console.log(`[GenericWorkflowTaskProvider] ⏭️ Skipping bookmark (taskType: ${payload.taskType}, not human-task)`);
1683
- continue;
1684
- }
1685
- // Check assignment filter if provided
1686
- if (options?.assigneeIds && options.assigneeIds.length > 0) {
1687
- const assignedIds = payload.assignedUserIds || [];
1688
- const candidateIds = payload.candidateUserIds || [];
1689
- const allUserIds = [...assignedIds, ...candidateIds];
1690
- // TODO: Also check candidateRoleIds by resolving role members
1691
- const matchesAssignee = allUserIds.some((id) => options.assigneeIds.includes(id));
1692
- if (!matchesAssignee) {
1693
- console.log(`[GenericWorkflowTaskProvider] ⏭️ Skipping task (assignee filter doesn't match)`);
1694
- continue;
1695
- }
1696
- }
1697
- // Map bookmark to task
1698
- const task = this.mapBookmarkToTask(instance, bookmark, payload);
1699
- console.log(`[GenericWorkflowTaskProvider] ✅ Mapped to task:`, {
1700
- id: task.id,
1701
- title: task.title,
1702
- status: task.status,
1703
- });
1704
- tasks.push(task);
1705
- }
1706
- catch (error) {
1707
- console.error(`[GenericWorkflowTaskProvider] ❌ Failed to process bookmark ${bookmark.id}:`, error);
1708
- // Skip this bookmark and continue
1709
- }
1710
- }
1711
- }
1712
- catch (error) {
1713
- console.error(`[GenericWorkflowTaskProvider] ❌ Failed to process instance ${instance.id}:`, error);
1714
- // Skip this instance and continue
1715
- }
1716
- }
1717
- console.log(`[GenericWorkflowTaskProvider] ✅ Returning ${tasks.length} tasks (total instances: ${total})`);
1718
- return { items: tasks, total };
1719
- }
1720
- /**
1721
- * Get active (non-consumed) bookmarks from workflow instance entity.
1722
- * Reads from instance.workflowInstance?.bookmarks — no direct DB access.
1723
- */
1724
- getActiveBookmarksFromInstance(instance) {
1725
- const wi = instance?.workflowInstance;
1726
- const bookmarks = wi?.bookmarks ?? [];
1727
- const active = bookmarks.filter((b) => !b.isConsumed && !b.consumed);
1728
- return active;
1729
- }
1730
- /**
1731
- * Map bookmark to task board task format.
1732
- */
1733
- mapBookmarkToTask(instance, bookmark, payload) {
1734
- // Extract dates
1735
- const dueDate = payload.dueDate
1736
- ? (typeof payload.dueDate === 'string' ? new Date(payload.dueDate) : payload.dueDate)
1737
- : (instance.createdAt ? new Date(instance.createdAt) : new Date());
1738
- const startDate = instance.createdAt
1739
- ? new Date(instance.createdAt)
1740
- : dueDate;
1741
- // If startDate and endDate are the same, set endDate to one day after startDate
1742
- let endDate = dueDate;
1743
- if (startDate.getTime() === dueDate.getTime()) {
1744
- endDate = new Date(startDate);
1745
- console.log(endDate);
1746
- endDate.setDate(endDate.getDate() + 1);
1747
- }
1748
- // Map priority
1749
- const priority = this.mapPriorityToTaskPriority(payload.priority || 'Normal');
1750
- // Build title
1751
- const title = payload.title || payload.activityName || 'Workflow Task';
1752
- return {
1753
- id: bookmark.id, // Use bookmark ID as task ID
1754
- title,
1755
- description: payload.description || `Action required: ${payload.activityName}`,
1756
- startDate,
1757
- endDate,
1758
- allDay: false,
1759
- assignee: payload.assignedUserIds && payload.assignedUserIds.length > 0
1760
- ? {
1761
- id: payload.assignedUserIds[0], // Use first assigned user
1762
- type: 'user',
1763
- fullName: '', // Will be populated if user data is loaded
1764
- }
1765
- : undefined,
1766
- index: 2,
1767
- status: {
1768
- id: AXPSystemStatuses.Pending.name,
1769
- title: this.translationService.translateSync('@workflow-management:work-items.states.pending'),
1770
- },
1771
- priority,
1772
- reporter: {
1773
- id: instance.auditInfo?.created?.by?.id || '',
1774
- type: 'user',
1775
- fullName: instance.auditInfo?.created?.by?.fullName || '',
1776
- },
1777
- data: {
1778
- // Store workflow instance and bookmark metadata
1779
- instanceId: instance.id,
1780
- bookmarkId: bookmark.id,
1781
- activityId: bookmark.activityId,
1782
- activityType: payload.activityType,
1783
- activityName: payload.activityName,
1784
- taskToken: payload.taskToken,
1785
- entityRefId: instance.entityRefId,
1786
- entityRefType: instance.entityRefType,
1787
- definitionId: instance.definitionId,
1788
- // Store full payload for actions
1789
- payload: payload,
1790
- },
1791
- };
1792
- }
1793
- /**
1794
- * Map priority to task board priority.
1795
- */
1796
- mapPriorityToTaskPriority(priority) {
1797
- switch (priority) {
1798
- case 'Urgent':
1799
- return 'highest';
1800
- case 'High':
1801
- return 'high';
1802
- case 'Normal':
1803
- return 'medium';
1804
- case 'Low':
1805
- return 'low';
1806
- default:
1807
- return 'medium';
1808
- }
1809
- }
1810
- //#endregion
1811
- //#region ---- Task Updates ----
1812
- /**
1813
- * Update tasks (not applicable for workflow instances - they are read-only from task provider perspective).
1814
- */
1815
- async updateTasks(tasksToUpdate) {
1816
- // Workflow instances are managed by workflow engine
1817
- // Task updates should be done through workflow resume, not direct updates
1818
- console.warn(`[GenericWorkflowTaskProvider] ⚠️ updateTasks called - workflow tasks are read-only from provider`);
1819
- return tasksToUpdate;
1820
- }
1821
- //#endregion
1822
- //#region ---- Command Execution ----
1823
- /**
1824
- * Execute commands on tasks.
1825
- *
1826
- * Supports:
1827
- * - Workflow resume commands (Complete, Cancel)
1828
- */
1829
- async executeCommand(command) {
1830
- if (!command?.name)
1831
- return { success: true };
1832
- const taskData = command.options?.['data'];
1833
- const instanceId = taskData?.instanceId ?? command.options?.['instanceId'] ?? '';
1834
- const bookmarkId = taskData?.bookmarkId ?? command.options?.['bookmarkId'] ?? '';
1835
- const taskToken = taskData?.taskToken ?? command.options?.['taskToken'] ?? '';
1836
- const activityId = taskData?.activityId ?? command.options?.['activityId'] ?? '';
1837
- const outcome = command.options?.['outcome'] ?? 'Done';
1838
- const userInput = command.options?.['userInput'] ?? {};
1839
- // Handle workflow resume commands
1840
- if (command.name === 'WorkflowManagement.WorkflowInstance:Resume' || command.name === 'resume-workflow') {
1841
- if (!instanceId || !taskToken || !activityId) {
1842
- return {
1843
- success: false,
1844
- message: {
1845
- text: 'Missing required parameters: instanceId, taskToken, activityId',
1846
- },
1847
- };
1848
- }
1849
- try {
1850
- const result = await this.workflowManager.resume(instanceId, activityId, outcome, userInput, taskToken);
1851
- return {
1852
- success: result.success,
1853
- message: result.error
1854
- ? {
1855
- text: result.error,
1856
- }
1857
- : undefined,
1858
- };
1859
- }
1860
- catch (error) {
1861
- console.error(`[GenericWorkflowTaskProvider] ❌ Error resuming workflow:`, error);
1862
- return {
1863
- success: false,
1864
- message: {
1865
- text: error.message || 'Failed to resume workflow',
1866
- },
1867
- };
1868
- }
1869
- }
1870
- return { success: true };
1871
- }
1872
- //#endregion
1873
- //#region ---- Actions & Statuses ----
1874
- /**
1875
- * Get available actions for a task.
1876
- *
1877
- * Extracts actions from bookmark payload.
1878
- */
1879
- async getActions(task) {
1880
- const actions = [];
1881
- if (!task)
1882
- return actions;
1883
- const taskData = task.data;
1884
- const payload = taskData?.payload;
1885
- if (!payload)
1886
- return actions;
1887
- // Extract actions from payload
1888
- if (payload.actions) {
1889
- const allActions = [
1890
- ...(payload.actions.prefix || []),
1891
- ...(payload.actions.suffix || []),
1892
- ];
1893
- for (const action of allActions) {
1894
- const actionName = action.command?.name || action.name || 'unknown';
1895
- actions.push({
1896
- name: actionName,
1897
- title: action.title || actionName,
1898
- icon: action.icon,
1899
- color: action.color,
1900
- priority: 'primary',
1901
- command: {
1902
- name: 'WorkflowManagement.WorkflowInstance:Resume',
1903
- options: {
1904
- instanceId: taskData.instanceId,
1905
- bookmarkId: taskData.bookmarkId,
1906
- activityId: taskData.activityId,
1907
- taskToken: taskData.taskToken,
1908
- outcome: actionName,
1909
- userInput: {},
1910
- },
1911
- },
1912
- });
1913
- }
1914
- }
1915
- else {
1916
- // Default actions if none provided
1917
- actions.push({
1918
- name: 'submit',
1919
- title: this.translationService.translateSync('@general:actions.submit.title'),
1920
- icon: 'fa-light fa-check',
1921
- color: 'primary',
1922
- priority: 'primary',
1923
- command: {
1924
- name: 'WorkflowManagement.WorkflowInstance:Resume',
1925
- options: {
1926
- instanceId: taskData.instanceId,
1927
- bookmarkId: taskData.bookmarkId,
1928
- activityId: taskData.activityId,
1929
- taskToken: taskData.taskToken,
1930
- outcome: 'submit',
1931
- userInput: {},
1932
- },
1933
- },
1934
- });
1935
- actions.push({
1936
- name: 'cancel',
1937
- title: this.translationService.translateSync('@general:actions.cancel.title'),
1938
- icon: 'fa-light fa-times',
1939
- color: 'default',
1940
- priority: 'secondary',
1941
- command: {
1942
- name: 'WorkflowManagement.WorkflowInstance:Resume',
1943
- options: {
1944
- instanceId: taskData.instanceId,
1945
- bookmarkId: taskData.bookmarkId,
1946
- activityId: taskData.activityId,
1947
- taskToken: taskData.taskToken,
1948
- outcome: 'cancel',
1949
- userInput: {},
1950
- },
1951
- },
1952
- });
1953
- }
1954
- return actions;
1955
- }
1956
- async getExtraFields() {
1957
- return [];
1958
- }
1959
- async getStatuses() {
1960
- return [
1961
- {
1962
- index: 0,
1963
- key: AXPSystemStatuses.Pending.name,
1964
- title: await this.translationService.translateAsync('@workflow-management:work-items.states.pending'),
1965
- color: 'warning',
1966
- },
1967
- ];
1968
- }
1969
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPGenericWorkflowTaskProvider, deps: [{ token: AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
1970
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPGenericWorkflowTaskProvider }); }
1971
- }
1972
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPGenericWorkflowTaskProvider, decorators: [{
1973
- type: Injectable
1974
- }], ctorParameters: () => [{ type: undefined, decorators: [{
1975
- type: Inject,
1976
- args: [AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG]
1977
- }] }] });
1978
-
1979
- function provideTaskWorkflow() {
1980
- return makeEnvironmentProviders([
1981
- {
1982
- provide: AXP_WORKFLOW_TASK_PROVIDER,
1983
- multi: true,
1984
- useFactory: (injector) => {
1985
- return (async () => {
1986
- const workflowDefinitionService = injector.get(AXPWorkflowDefinitionService);
1987
- const categories = await workflowDefinitionService.getCategories();
1988
- const providers = [];
1989
- for (const category of categories) {
1990
- const workflows = await workflowDefinitionService.getWorkflowsByCategoryId(category.id);
1991
- for (const workflow of workflows) {
1992
- const provider = runInInjectionContext(injector, () => new AXPGenericWorkflowTaskProvider({
1993
- name: workflow.name,
1994
- title: workflow.title ?? workflow.name,
1995
- icon: 'fa-light fa-diagram-project',
1996
- definitionId: workflow.name,
1997
- }));
1998
- providers.push(provider);
1999
- }
2000
- }
2001
- console.log('providers', providers);
2002
- return providers;
2003
- })();
2004
- },
2005
- deps: [Injector],
2006
- },
2007
- ]);
2008
- }
2009
-
2010
3813
  function routesFactory() {
2011
3814
  const config = inject(AXP_ENTITY_CONFIG_TOKEN);
2012
3815
  const routes = [
@@ -2024,6 +3827,20 @@ function routesFactory() {
2024
3827
  },
2025
3828
  ],
2026
3829
  },
3830
+ {
3831
+ path: ':app/workflow-management/cartable',
3832
+ loadComponent: () => {
3833
+ return config.viewers.root();
3834
+ },
3835
+ canActivate: [AXPAuthGuard],
3836
+ data: { reuse: true },
3837
+ children: [
3838
+ {
3839
+ path: '',
3840
+ loadComponent: () => import('./acorex-modules-workflow-management-cartable-page.component-Bso0XRkJ.mjs').then((c) => c.AXMCartablePageComponent),
3841
+ },
3842
+ ],
3843
+ },
2027
3844
  ];
2028
3845
  return routes;
2029
3846
  }
@@ -2031,6 +3848,12 @@ class AXMWorkflowManagementModule {
2031
3848
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2032
3849
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementModule, imports: [AXMCalendarManagementModule,
2033
3850
  AXPDomainModule,
3851
+ AXMWorkflowManagementWorkflowDefinitionEntityModule,
3852
+ AXMWorkflowManagementWorkflowInstanceEntityModule,
3853
+ AXMWorkflowManagementActivityCategoryEntityModule,
3854
+ AXMWorkflowManagementActivityDefinitionEntityModule,
3855
+ AXMWorkflowManagementWorkItemEntityModule,
3856
+ AXMWorkflowManagementWorkItemCandidateEntityModule,
2034
3857
  AXMWorkflowPluginModule] }); }
2035
3858
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementModule, providers: [
2036
3859
  {
@@ -2051,10 +3874,18 @@ class AXMWorkflowManagementModule {
2051
3874
  key: 'workflow-activity:show-toast',
2052
3875
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.ShowToastActivity),
2053
3876
  },
3877
+ {
3878
+ key: 'workflow-activity:check-permission',
3879
+ command: () => Promise.resolve().then(function () { return index; }).then((c) => c.CheckPermissionActivity),
3880
+ },
2054
3881
  {
2055
3882
  key: 'workflow-activity:create-entity',
2056
3883
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.AXPCreateEntityActivity),
2057
3884
  },
3885
+ {
3886
+ key: 'workflow-activity:assign-to-mannger',
3887
+ command: () => Promise.resolve().then(function () { return index; }).then((c) => c.AssignToManggerActivity),
3888
+ },
2058
3889
  {
2059
3890
  key: 'workflow-activity:execute-query',
2060
3891
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.ExecuteQueryActivity),
@@ -2071,14 +3902,26 @@ class AXMWorkflowManagementModule {
2071
3902
  key: 'workflow-activity:show-layout-popup',
2072
3903
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.ShowLayoutPopupActivity),
2073
3904
  },
2074
- {
2075
- key: 'workflow-activity:human-task',
2076
- command: () => Promise.resolve().then(function () { return index; }).then((c) => c.HumanTaskActivity),
2077
- },
2078
3905
  {
2079
3906
  key: 'workflow-activity:collect-signature',
2080
3907
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.CollectSignatureActivity),
2081
3908
  },
3909
+ {
3910
+ key: 'WorkflowManagement.WorkItem:Claim',
3911
+ command: () => import('./acorex-modules-workflow-management-index-xB36g4F1.mjs').then((c) => c.ClaimWorkItemCommand),
3912
+ },
3913
+ {
3914
+ key: 'WorkflowManagement.WorkItem:Complete',
3915
+ command: () => import('./acorex-modules-workflow-management-index-xB36g4F1.mjs').then((c) => c.CompleteWorkItemCommand),
3916
+ },
3917
+ {
3918
+ key: 'WorkflowManagement.WorkItem:Assign',
3919
+ command: () => import('./acorex-modules-workflow-management-index-xB36g4F1.mjs').then((c) => c.AssignWorkItemCommand),
3920
+ },
3921
+ {
3922
+ key: 'WorkflowManagement.WorkItem:Cancel',
3923
+ command: () => import('./acorex-modules-workflow-management-index-xB36g4F1.mjs').then((c) => c.CancelWorkItemCommand),
3924
+ },
2082
3925
  ]),
2083
3926
  // provideEntity([RootConfig.entities.activityDefinition.fullName]),
2084
3927
  // Entity Definition Loader
@@ -2133,38 +3976,21 @@ class AXMWorkflowManagementModule {
2133
3976
  multi: true,
2134
3977
  },
2135
3978
  // Provide activity classes for dependency injection (only frontend activities)
3979
+ CheckPermissionActivity,
2136
3980
  ExecuteQueryActivity,
2137
3981
  ExecuteCommandActivity,
2138
3982
  ShowConfirmPopupActivity,
2139
3983
  ShowLayoutPopupActivity,
2140
- HumanTaskActivity,
2141
3984
  ShowToastActivity,
2142
3985
  CollectSignatureActivity,
2143
- // Generic Workflow Task Provider (all workflows – no definitionId filter).
2144
- // For one provider per definition, register in your module with definitionId, e.g.:
2145
- // { provide: AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG, useValue: { name: 'leave-request-workflow-tasks', title: 'Leave Request', definitionId: 'LeaveRequestWorkflow' } },
2146
- // { provide: AXP_WORKFLOW_TASK_PROVIDER, multi: true, useFactory: (c) => new AXPGenericWorkflowTaskProvider(c), deps: [AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG] }
2147
- // Leave Request workflow: task board shows suspended human-tasks.
2148
- // definitionId must match instance.definitionId: mock engine uses workflow name ('createLeaveRequest'); real API may use definition entity id.
2149
- // {
2150
- // provide: AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG,
2151
- // useValue: {
2152
- // name: 'leave-request',
2153
- // title: 'Leave Request Tasks',
2154
- // icon: 'fa-light fa-diagram-project',
2155
- // definitionId: 'createLeaveRequest',
2156
- // } as AXPGenericWorkflowTaskProviderConfig,
2157
- // },
2158
- // {
2159
- // provide: AXP_WORKFLOW_TASK_PROVIDER,
2160
- // multi: true,
2161
- // useFactory: (config: AXPGenericWorkflowTaskProviderConfig) =>
2162
- // new AXPGenericWorkflowTaskProvider(config),
2163
- // deps: [AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG],
2164
- // },
2165
- provideTaskWorkflow()
2166
3986
  ], imports: [AXMCalendarManagementModule,
2167
3987
  AXPDomainModule,
3988
+ AXMWorkflowManagementWorkflowDefinitionEntityModule,
3989
+ AXMWorkflowManagementWorkflowInstanceEntityModule,
3990
+ AXMWorkflowManagementActivityCategoryEntityModule,
3991
+ AXMWorkflowManagementActivityDefinitionEntityModule,
3992
+ AXMWorkflowManagementWorkItemEntityModule,
3993
+ AXMWorkflowManagementWorkItemCandidateEntityModule,
2168
3994
  AXMWorkflowPluginModule] }); }
2169
3995
  }
2170
3996
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXMWorkflowManagementModule, decorators: [{
@@ -2173,6 +3999,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2173
3999
  imports: [
2174
4000
  AXMCalendarManagementModule,
2175
4001
  AXPDomainModule,
4002
+ AXMWorkflowManagementWorkflowDefinitionEntityModule,
4003
+ AXMWorkflowManagementWorkflowInstanceEntityModule,
4004
+ AXMWorkflowManagementActivityCategoryEntityModule,
4005
+ AXMWorkflowManagementActivityDefinitionEntityModule,
4006
+ AXMWorkflowManagementWorkItemEntityModule,
4007
+ AXMWorkflowManagementWorkItemCandidateEntityModule,
2176
4008
  AXMWorkflowPluginModule, // Register workflow plugin
2177
4009
  ],
2178
4010
  providers: [
@@ -2194,10 +4026,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2194
4026
  key: 'workflow-activity:show-toast',
2195
4027
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.ShowToastActivity),
2196
4028
  },
4029
+ {
4030
+ key: 'workflow-activity:check-permission',
4031
+ command: () => Promise.resolve().then(function () { return index; }).then((c) => c.CheckPermissionActivity),
4032
+ },
2197
4033
  {
2198
4034
  key: 'workflow-activity:create-entity',
2199
4035
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.AXPCreateEntityActivity),
2200
4036
  },
4037
+ {
4038
+ key: 'workflow-activity:assign-to-mannger',
4039
+ command: () => Promise.resolve().then(function () { return index; }).then((c) => c.AssignToManggerActivity),
4040
+ },
2201
4041
  {
2202
4042
  key: 'workflow-activity:execute-query',
2203
4043
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.ExecuteQueryActivity),
@@ -2214,14 +4054,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2214
4054
  key: 'workflow-activity:show-layout-popup',
2215
4055
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.ShowLayoutPopupActivity),
2216
4056
  },
2217
- {
2218
- key: 'workflow-activity:human-task',
2219
- command: () => Promise.resolve().then(function () { return index; }).then((c) => c.HumanTaskActivity),
2220
- },
2221
4057
  {
2222
4058
  key: 'workflow-activity:collect-signature',
2223
4059
  command: () => Promise.resolve().then(function () { return index; }).then((c) => c.CollectSignatureActivity),
2224
4060
  },
4061
+ {
4062
+ key: 'WorkflowManagement.WorkItem:Claim',
4063
+ command: () => import('./acorex-modules-workflow-management-index-xB36g4F1.mjs').then((c) => c.ClaimWorkItemCommand),
4064
+ },
4065
+ {
4066
+ key: 'WorkflowManagement.WorkItem:Complete',
4067
+ command: () => import('./acorex-modules-workflow-management-index-xB36g4F1.mjs').then((c) => c.CompleteWorkItemCommand),
4068
+ },
4069
+ {
4070
+ key: 'WorkflowManagement.WorkItem:Assign',
4071
+ command: () => import('./acorex-modules-workflow-management-index-xB36g4F1.mjs').then((c) => c.AssignWorkItemCommand),
4072
+ },
4073
+ {
4074
+ key: 'WorkflowManagement.WorkItem:Cancel',
4075
+ command: () => import('./acorex-modules-workflow-management-index-xB36g4F1.mjs').then((c) => c.CancelWorkItemCommand),
4076
+ },
2225
4077
  ]),
2226
4078
  // provideEntity([RootConfig.entities.activityDefinition.fullName]),
2227
4079
  // Entity Definition Loader
@@ -2276,43 +4128,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2276
4128
  multi: true,
2277
4129
  },
2278
4130
  // Provide activity classes for dependency injection (only frontend activities)
4131
+ CheckPermissionActivity,
2279
4132
  ExecuteQueryActivity,
2280
4133
  ExecuteCommandActivity,
2281
4134
  ShowConfirmPopupActivity,
2282
4135
  ShowLayoutPopupActivity,
2283
- HumanTaskActivity,
2284
4136
  ShowToastActivity,
2285
4137
  CollectSignatureActivity,
2286
- // Generic Workflow Task Provider (all workflows – no definitionId filter).
2287
- // For one provider per definition, register in your module with definitionId, e.g.:
2288
- // { provide: AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG, useValue: { name: 'leave-request-workflow-tasks', title: 'Leave Request', definitionId: 'LeaveRequestWorkflow' } },
2289
- // { provide: AXP_WORKFLOW_TASK_PROVIDER, multi: true, useFactory: (c) => new AXPGenericWorkflowTaskProvider(c), deps: [AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG] }
2290
- // Leave Request workflow: task board shows suspended human-tasks.
2291
- // definitionId must match instance.definitionId: mock engine uses workflow name ('createLeaveRequest'); real API may use definition entity id.
2292
- // {
2293
- // provide: AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG,
2294
- // useValue: {
2295
- // name: 'leave-request',
2296
- // title: 'Leave Request Tasks',
2297
- // icon: 'fa-light fa-diagram-project',
2298
- // definitionId: 'createLeaveRequest',
2299
- // } as AXPGenericWorkflowTaskProviderConfig,
2300
- // },
2301
- // {
2302
- // provide: AXP_WORKFLOW_TASK_PROVIDER,
2303
- // multi: true,
2304
- // useFactory: (config: AXPGenericWorkflowTaskProviderConfig) =>
2305
- // new AXPGenericWorkflowTaskProvider(config),
2306
- // deps: [AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG],
2307
- // },
2308
- provideTaskWorkflow()
2309
4138
  ],
2310
4139
  }]
2311
4140
  }] });
2312
4141
 
2313
- // Entity exports - services and modules removed, handled by middleware
2314
- // Exporting entity types for use in feature components
2315
-
2316
4142
  //#region ---- Imports ----
2317
4143
  //#endregion
2318
4144
  class AXMActivityCategoriesTreeComponent {
@@ -4032,7 +5858,7 @@ class WorkflowStudioComponent extends AXPPageLayoutBaseComponent {
4032
5858
  provide: AXPPageLayoutBase,
4033
5859
  useExisting: WorkflowStudioComponent,
4034
5860
  },
4035
- ], usesInheritance: true, ngImport: i0, template: "<axp-page-layout>\n <axp-layout-start-side>\n <axp-activity-categories-tree (categoryClick)=\"onCategoryClick($event)\"\n (activityClick)=\"onActivityClick($event)\"></axp-activity-categories-tree>\n </axp-layout-start-side>\n\n <axp-page-toolbar>\n <axp-layout-prefix>\n <!-- Editor Tabs -->\n <ax-button-group class=\"ax-sm\" [selection]=\"'single'\">\n <ax-button-group-item (onClick)=\"switchTab('json')\" [selected]=\"activeTab() === 'json'\">\n <ax-prefix>\n <i class=\"fa-light fa-code\"></i>\n </ax-prefix>\n {{ '@workflow-management:workflow-studio.terms.json-editor' | translate | async }}\n </ax-button-group-item>\n <ax-button-group-item (onClick)=\"switchTab('visual')\" [selected]=\"activeTab() === 'visual'\">\n <ax-prefix>\n <i class=\"fa-light fa-diagram-project\"></i>\n </ax-prefix>\n {{ '@workflow-management:workflow-studio.terms.visual-designer' | translate | async }}\n </ax-button-group-item>\n </ax-button-group>\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\" [(ngModel)]=\"workflowJson\"\n [placeholder]=\"'@workflow-management:workflow-studio.components.json-editor.placeholder' | translate | async\"\n spellcheck=\"false\">\n </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 <button class=\"tool-btn\" (click)=\"clearCanvas()\"\n [title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.clear-canvas.title' | translate | async\">\n <i class=\"fa-light fa-trash\"></i>\n </button>\n <button class=\"tool-btn\" (click)=\"visualToJson()\"\n [title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.convert-to-json.title' | translate | async\">\n <i class=\"fa-light fa-code\"></i>\n </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 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 }} \u2192 {{ 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\" [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 <line [attr.x1]=\"node.position.x + 75\" [attr.y1]=\"node.position.y + 40\"\n [attr.x2]=\"targetNode.position.x + 75\" [attr.y2]=\"targetNode.position.y - 50\"\n class=\"connection-line\" stroke=\"#64748b\" stroke-width=\"2\" marker-end=\"url(#arrowhead-default)\"\n style=\"cursor: pointer\" (dblclick)=\"disconnectNodes(node.id, targetId)\"\n title=\"Double-click \u0628\u0631\u0627\u06CC \u062D\u0630\u0641 \u0627\u062A\u0635\u0627\u0644\">\n <title>Double-click \u0628\u0631\u0627\u06CC \u062D\u0630\u0641</title>\n </line>\n }\n }\n }\n }\n\n <defs>\n <!-- Default Arrow -->\n <marker id=\"arrowhead-default\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\">\n <polygon points=\"0 0, 10 3, 0 6\" fill=\"#64748b\" />\n </marker>\n <!-- Success Arrow (Green) -->\n <marker id=\"arrowhead-success\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\">\n <polygon points=\"0 0, 10 3, 0 6\" fill=\"#10b981\" />\n </marker>\n <!-- Error Arrow (Red) -->\n <marker id=\"arrowhead-error\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\">\n <polygon points=\"0 0, 10 3, 0 6\" fill=\"#ef4444\" />\n </marker>\n <!-- Warning Arrow (Orange) -->\n <marker id=\"arrowhead-warning\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\">\n <polygon points=\"0 0, 10 3, 0 6\" fill=\"#f59e0b\" />\n </marker>\n <!-- Info Arrow (Blue) -->\n <marker id=\"arrowhead-info\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\">\n <polygon points=\"0 0, 10 3, 0 6\" 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 <button class=\"node-delete\" (click)=\"deleteNode(node.id); $event.stopPropagation()\">\n <i class=\"fa-light fa-times\"></i>\n </button>\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>Activity \u0647\u0627 \u0631\u0627 \u0627\u0632 \u0633\u0627\u06CC\u062F\u0628\u0627\u0631 \u0628\u0647 \u0627\u06CC\u0646\u062C\u0627 \u0628\u06A9\u0634\u06CC\u062F</p>\n <small>\u06CC\u0627 \u0627\u0632 \u062A\u0628 JSON\u060C workflow \u0631\u0627 import \u06A9\u0646\u06CC\u062F</small>\n </div>\n }\n </div>\n </div>\n\n <!-- Properties Panel -->\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 <button class=\"header-btn\" (click)=\"togglePropertiesPanel()\"\n [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.close-panel' | translate | async\">\n <i class=\"fa-light fa-angle-right\"></i>\n </button>\n <button class=\"header-btn\" (click)=\"selectedNode.set(null)\"\n [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.close' | translate | async\">\n <i class=\"fa-light fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"properties-body\">\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.id' | translate | async }}:</label>\n <input type=\"text\" [value]=\"selectedNode()!.id\" disabled />\n </div>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.type' | translate | async }}:</label>\n <input type=\"text\" [value]=\"selectedNode()!.type\" disabled />\n </div>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.name' | translate | async }}:</label>\n <input type=\"text\" [value]=\"selectedNode()!.name\"\n (input)=\"updateNodeProperty(selectedNode()!.id, 'name', $any($event.target).value)\" />\n </div>\n\n <div class=\"properties-divider\"></div>\n\n <h5>\uD83D\uDCE5 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.input-properties' | translate | async }}</h5>\n <small class=\"properties-hint\">{{ '@workflow-management:workflow-studio.components.properties-panel.sections.input-properties' | translate | async }} - \u0645\u0642\u0627\u062F\u06CC\u0631 \u0631\u0627 \u062A\u0646\u0638\u06CC\u0645 \u06A9\u0646\u06CC\u062F</small>\n\n @if (hasProperties(selectedNode()!.properties)) {\n <div class=\"property-editor\">\n @for (key of Object.keys(selectedNode()!.properties); track key) {\n <div class=\"property-row\">\n <label>\n {{ key }}\n <span class=\"property-type-badge\">{{ typeof selectedNode()!.properties[key] }}</span>\n </label>\n\n @if (typeof selectedNode()!.properties[key] === 'boolean') {\n <select [value]=\"selectedNode()!.properties[key]\" (change)=\"\n updateNodeProperty(selectedNode()!.id, key, $any($event.target).value === 'true')\n \">\n <option [value]=\"true\">True</option>\n <option [value]=\"false\">False</option>\n </select>\n } @else if (typeof selectedNode()!.properties[key] === 'number') {\n <input type=\"number\" [value]=\"selectedNode()!.properties[key]\"\n (input)=\"updateNodeProperty(selectedNode()!.id, key, +$any($event.target).value)\" />\n } @else if (typeof selectedNode()!.properties[key] === 'object') {\n <textarea rows=\"3\" [value]=\"JSON.stringify(selectedNode()!.properties[key], null, 2)\"\n (input)=\"updateNodePropertyJSON(selectedNode()!.id, key, $any($event.target).value)\"></textarea>\n } @else {\n <input type=\"text\" [value]=\"selectedNode()!.properties[key]\"\n (input)=\"updateNodeProperty(selectedNode()!.id, key, $any($event.target).value)\" />\n }\n </div>\n }\n </div>\n } @else {\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 <h5>\uD83D\uDCE4 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.output-variables' | translate | async }}</h5>\n <small class=\"properties-hint\">\u062E\u0631\u0648\u062C\u06CC \u0648 \u0645\u062A\u063A\u06CC\u0631\u0647\u0627</small>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.output-variable' | translate | async }}:</label>\n <input type=\"text\" placeholder=\"\u0645\u062B\u0644\u0627\u064B result\"\n [value]=\"selectedNode()!.properties['outputVariable'] || ''\"\n (input)=\"updateNodeProperty(selectedNode()!.id, 'outputVariable', $any($event.target).value)\" />\n </div>\n\n <div class=\"properties-divider\"></div>\n\n <h5>\uD83D\uDD17 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.connections' | translate | async }}</h5>\n <small class=\"properties-hint\">\u0627\u062A\u0635\u0627\u0644\u0627\u062A \u0627\u06CC\u0646 \u0646\u0648\u062F</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 <button class=\"remove-btn\"\n (click)=\"disconnectNodes(selectedNode()!.id, conn.targetNodeId, conn.outcome)\"\n title=\"\u062D\u0630\u0641 \u0627\u062A\u0635\u0627\u0644\">\n <i class=\"fa-light fa-times\"></i>\n </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 <button class=\"remove-btn\" (click)=\"disconnectNodes(selectedNode()!.id, targetId)\"\n title=\"\u062D\u0630\u0641 \u0627\u062A\u0635\u0627\u0644\">\n <i class=\"fa-light fa-times\"></i>\n </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>\uD83D\uDCE4 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.available-outcomes' | translate | async }}</h5>\n <small class=\"properties-hint\">\u062E\u0631\u0648\u062C\u06CC\u200C\u0647\u0627\u06CC \u0645\u0648\u062C\u0648\u062F \u0628\u0631\u0627\u06CC \u0627\u062A\u0635\u0627\u0644</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>\uD83D\uDCDD {{ '@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 (selectedNode() && !showPropertiesPanel()) {\n <button class=\"sidebar-toggle-btn right\" (click)=\"togglePropertiesPanel()\"\n [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.show-panel' | translate | async\">\n <i class=\"fa-light fa-sliders\"></i>\n </button>\n }\n </div>\n }\n </div>\n </div>\n\n </div>\n\n <!-- Workflow Settings Modal -->\n @if (showWorkflowSettings()) {\n <div class=\"settings-modal-overlay\" (click)=\"closeWorkflowSettings()\">\n <div class=\"settings-modal\" (click)=\"$event.stopPropagation()\">\n <!-- Modal Header -->\n <div class=\"settings-modal-header\">\n <div class=\"header-title\">\n <i class=\"fa-light fa-cog\"></i>\n <h2>{{ '@workflow-management:workflow-studio.settings.title' | translate | async }}</h2>\n </div>\n <button class=\"close-btn\" (click)=\"closeWorkflowSettings()\">\n <i class=\"fa-light fa-times\"></i>\n </button>\n </div>\n\n <!-- Modal Body -->\n <div class=\"settings-modal-body\">\n <!-- Tabs Navigation -->\n <div class=\"settings-tabs\">\n <button class=\"tab-btn\" [class.active]=\"activeSettingsTab() === 'general'\"\n (click)=\"switchSettingsTab('general')\">\n <i class=\"fa-light fa-info-circle\"></i>\n {{ '@workflow-management:workflow-studio.settings.tabs.general' | translate | async }}\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeSettingsTab() === 'inputs'\"\n (click)=\"switchSettingsTab('inputs')\">\n <i class=\"fa-light fa-sign-in\"></i>\n {{ '@workflow-management:workflow-studio.settings.tabs.inputs' | translate | async }}\n @if (workflowSettings().inputs.length > 0) {\n <span class=\"badge\">{{ workflowSettings().inputs.length }}</span>\n }\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeSettingsTab() === 'outputs'\"\n (click)=\"switchSettingsTab('outputs')\">\n <i class=\"fa-light fa-sign-out\"></i>\n {{ '@workflow-management:workflow-studio.settings.tabs.outputs' | translate | async }}\n @if (workflowSettings().outputs.length > 0) {\n <span class=\"badge\">{{ workflowSettings().outputs.length }}</span>\n }\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeSettingsTab() === 'variables'\"\n (click)=\"switchSettingsTab('variables')\">\n <i class=\"fa-light fa-box\"></i>\n {{ '@workflow-management:workflow-studio.settings.tabs.variables' | translate | async }}\n @if (workflowSettings().variables.length > 0) {\n <span class=\"badge\">{{ workflowSettings().variables.length }}</span>\n }\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeSettingsTab() === 'advanced'\"\n (click)=\"switchSettingsTab('advanced')\">\n <i class=\"fa-light fa-cog\"></i>\n {{ '@workflow-management:workflow-studio.settings.tabs.advanced' | translate | async }}\n </button>\n </div>\n\n <!-- Tab Content -->\n <div class=\"settings-content\">\n <!-- General Tab -->\n @if (activeSettingsTab() === 'general') {\n <div class=\"settings-section\">\n <h3>{{ '@workflow-management:workflow-studio.settings.sections.general.title' | translate | async }}</h3>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.general.fields.name.title' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.general.fields.name.placeholder' | translate | async\"\n [(ngModel)]=\"workflowSettings().name\" />\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.general.fields.definition-id.title' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.general.fields.definition-id.placeholder' | translate | async\"\n [(ngModel)]=\"workflowSettings().definitionId\" />\n <small>{{ '@workflow-management:workflow-studio.settings.sections.general.fields.definition-id.description' | translate | async }}</small>\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.general.fields.description.title' | translate | async }}</label>\n <textarea class=\"form-textarea\" rows=\"4\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.general.fields.description.placeholder' | translate | async\"\n [(ngModel)]=\"workflowSettings().description\"></textarea>\n </div>\n </div>\n }\n\n <!-- Inputs Tab -->\n @if (activeSettingsTab() === 'inputs') {\n <div class=\"settings-section\">\n <div class=\"section-header\">\n <h3>{{ '@workflow-management:workflow-studio.settings.sections.inputs.title' | translate | async }}</h3>\n <button class=\"add-btn\" (click)=\"addWorkflowInput()\">\n <i class=\"fa-light fa-plus\"></i>\n {{ '@workflow-management:workflow-studio.settings.sections.inputs.add-button' | translate | async }}\n </button>\n </div>\n\n @if (workflowSettings().inputs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-light fa-inbox\"></i>\n <p>{{ '@workflow-management:workflow-studio.settings.sections.inputs.empty-state.title' | translate | async }}</p>\n <small>{{ '@workflow-management:workflow-studio.settings.sections.inputs.empty-state.description' | translate | async }}</small>\n </div>\n } @else {\n <div class=\"items-list\">\n @for (input of workflowSettings().inputs; track $index) {\n <div class=\"item-card\">\n <div class=\"item-header\">\n <span class=\"item-number\">#{{ $index + 1 }}</span>\n <button class=\"remove-btn\" (click)=\"removeWorkflowInput($index)\"\n [title]=\"'@workflow-management:workflow-studio.settings.sections.inputs.actions.remove' | translate | async\">\n <i class=\"fa-light fa-trash\"></i>\n </button>\n </div>\n <div class=\"item-body\">\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.name' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"userName\" [value]=\"input.name\"\n (input)=\"updateWorkflowInput($index, 'name', $any($event.target).value)\" />\n </div>\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.title' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"User Name\" [value]=\"input.title\"\n (input)=\"updateWorkflowInput($index, 'title', $any($event.target).value)\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.description' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.inputs.fields.description-placeholder' | translate | async\"\n [value]=\"input.description || ''\"\n (input)=\"updateWorkflowInput($index, 'description', $any($event.target).value)\" />\n </div>\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.data-type' | translate | async }}</label>\n <select class=\"form-select\" [value]=\"input.schema.dataType || 'string'\"\n (change)=\"updateWorkflowInputSchema($index, 'dataType', $any($event.target).value)\">\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"object\">Object</option>\n <option value=\"array\">Array</option>\n </select>\n </div>\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.default-value' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.inputs.fields.default-value-placeholder' | translate | async\"\n [value]=\"input.schema.defaultValue || ''\"\n (input)=\"updateWorkflowInputSchema($index, 'defaultValue', $any($event.target).value)\" />\n </div>\n </div>\n <div class=\"form-group checkbox-group\">\n <label>\n <input type=\"checkbox\" [checked]=\"getInputIsRequired(input)\"\n (change)=\"updateWorkflowInputValidation($index, $any($event.target).checked)\" />\n <span>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.required' | translate | async }}</span>\n </label>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Outputs Tab -->\n @if (activeSettingsTab() === 'outputs') {\n <div class=\"settings-section\">\n <div class=\"section-header\">\n <h3>{{ '@workflow-management:workflow-studio.settings.sections.outputs.title' | translate | async }}</h3>\n <button class=\"add-btn\" (click)=\"addWorkflowOutput()\">\n <i class=\"fa-light fa-plus\"></i>\n {{ '@workflow-management:workflow-studio.settings.sections.outputs.add-button' | translate | async }}\n </button>\n </div>\n\n @if (workflowSettings().outputs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-light fa-inbox\"></i>\n <p>{{ '@workflow-management:workflow-studio.settings.sections.outputs.empty-state.title' | translate | async }}</p>\n <small>{{ '@workflow-management:workflow-studio.settings.sections.outputs.empty-state.description' | translate | async }}</small>\n </div>\n } @else {\n <div class=\"items-list\">\n @for (output of workflowSettings().outputs; track $index) {\n <div class=\"item-card\">\n <div class=\"item-header\">\n <span class=\"item-number\">#{{ $index + 1 }}</span>\n <button class=\"remove-btn\" (click)=\"removeWorkflowOutput($index)\"\n [title]=\"'@workflow-management:workflow-studio.settings.sections.outputs.actions.remove' | translate | async\">\n <i class=\"fa-light fa-trash\"></i>\n </button>\n </div>\n <div class=\"item-body\">\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.outputs.fields.name' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"result\" [value]=\"output.name\"\n (input)=\"updateWorkflowOutput($index, 'name', $any($event.target).value)\" />\n </div>\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.outputs.fields.title' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"Result\" [value]=\"output.title\"\n (input)=\"updateWorkflowOutput($index, 'title', $any($event.target).value)\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.outputs.fields.description' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.outputs.fields.description-placeholder' | translate | async\"\n [value]=\"output.description || ''\"\n (input)=\"updateWorkflowOutput($index, 'description', $any($event.target).value)\" />\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.outputs.fields.data-type' | translate | async }}</label>\n <select class=\"form-select\" [value]=\"output.schema.dataType || 'string'\"\n (change)=\"updateWorkflowOutputSchema($index, 'dataType', $any($event.target).value)\">\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"object\">Object</option>\n <option value=\"array\">Array</option>\n </select>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Variables Tab -->\n @if (activeSettingsTab() === 'variables') {\n <div class=\"settings-section\">\n <div class=\"section-header\">\n <h3>{{ '@workflow-management:workflow-studio.settings.sections.variables.title' | translate | async }}</h3>\n <button class=\"add-btn\" (click)=\"addWorkflowVariable()\">\n <i class=\"fa-light fa-plus\"></i>\n {{ '@workflow-management:workflow-studio.settings.sections.variables.add-button' | translate | async }}\n </button>\n </div>\n\n @if (workflowSettings().variables.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-light fa-inbox\"></i>\n <p>{{ '@workflow-management:workflow-studio.settings.sections.variables.empty-state.title' | translate | async }}</p>\n <small>{{ '@workflow-management:workflow-studio.settings.sections.variables.empty-state.description' | translate | async }}</small>\n </div>\n } @else {\n <div class=\"items-list\">\n @for (variable of workflowSettings().variables; track $index) {\n <div class=\"item-card\">\n <div class=\"item-header\">\n <span class=\"item-number\">#{{ $index + 1 }}</span>\n <button class=\"remove-btn\" (click)=\"removeWorkflowVariable($index)\"\n [title]=\"'@workflow-management:workflow-studio.settings.sections.variables.actions.remove' | translate | async\">\n <i class=\"fa-light fa-trash\"></i>\n </button>\n </div>\n <div class=\"item-body\">\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.variables.fields.name' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"tempData\" [value]=\"variable.name\"\n (input)=\"updateWorkflowVariable($index, 'name', $any($event.target).value)\" />\n </div>\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.variables.fields.type' | translate | async }}</label>\n <select class=\"form-select\" [value]=\"variable.typeName\"\n (change)=\"updateWorkflowVariable($index, 'typeName', $any($event.target).value)\">\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"object\">Object</option>\n <option value=\"array\">Array</option>\n </select>\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.variables.fields.description' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.variables.fields.description-placeholder' | translate | async\"\n [value]=\"variable.description || ''\"\n (input)=\"updateWorkflowVariable($index, 'description', $any($event.target).value)\" />\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.variables.fields.initial-value' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.variables.fields.initial-value-placeholder' | translate | async\"\n [value]=\"variable.value || ''\"\n (input)=\"updateWorkflowVariable($index, 'value', $any($event.target).value)\" />\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Advanced Tab -->\n @if (activeSettingsTab() === 'advanced') {\n <div class=\"settings-section\">\n <h3>{{ '@workflow-management:workflow-studio.settings.sections.advanced.title' | translate | async }}</h3>\n\n <!-- Versioning -->\n <div class=\"advanced-group\">\n <h4>\u0646\u0633\u062E\u0647\u200C\u0628\u0646\u062F\u06CC (Versioning)</h4>\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>Version</label>\n <input type=\"number\" class=\"form-input\" min=\"1\" [(ngModel)]=\"workflowSettings().version\" />\n <small>\u0634\u0645\u0627\u0631\u0647 \u0646\u0633\u062E\u0647 workflow (1, 2, 3, ...)</small>\n </div>\n <div class=\"form-group checkbox-group\" style=\"margin-top: 1.8rem\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"workflowSettings().isLatest\" />\n <span>\u0622\u062E\u0631\u06CC\u0646 \u0646\u0633\u062E\u0647 (Is Latest)</span>\n </label>\n </div>\n <div class=\"form-group checkbox-group\" style=\"margin-top: 1.8rem\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"workflowSettings().isPublished\" />\n <span>\u0645\u0646\u062A\u0634\u0631 \u0634\u062F\u0647 (Published)</span>\n </label>\n </div>\n </div>\n </div>\n\n <!-- Options -->\n <div class=\"advanced-group\">\n <h4>\u062A\u0646\u0638\u06CC\u0645\u0627\u062A (Options)</h4>\n <div class=\"form-group checkbox-group\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"workflowSettings().usableAsActivity\" />\n <span>\u0642\u0627\u0628\u0644 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 Activity</span>\n </label>\n <small>\u0627\u06CC\u0646 workflow \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u062F \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06CC\u06A9 activity \u062F\u0631 workflow \u0647\u0627\u06CC \u062F\u06CC\u06AF\u0631 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0634\u0648\u062F</small>\n </div>\n <div class=\"form-group checkbox-group\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"workflowSettings().autoUpdateConsumingWorkflows\" />\n <span>\u0628\u0647\u200C\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u062E\u0648\u062F\u06A9\u0627\u0631 workflows \u0645\u0635\u0631\u0641\u200C\u06A9\u0646\u0646\u062F\u0647</span>\n </label>\n <small>workflow \u0647\u0627\u06CC\u06CC \u06A9\u0647 \u0627\u0632 \u0627\u06CC\u0646 workflow \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0645\u06CC\u200C\u06A9\u0646\u0646\u062F \u0628\u0647 \u0635\u0648\u0631\u062A \u062E\u0648\u062F\u06A9\u0627\u0631 \u0628\u0647\u200C\u0631\u0648\u0632 \u0645\u06CC\u200C\u0634\u0648\u0646\u062F</small>\n </div>\n </div>\n\n <!-- Metadata -->\n <div class=\"advanced-group\">\n <h4>Metadata</h4>\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>Tool Version</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"1.0.0\"\n [(ngModel)]=\"workflowSettings().toolVersion\" />\n <small>\u0646\u0633\u062E\u0647 \u0627\u0628\u0632\u0627\u0631 \u0633\u0627\u0632\u0646\u062F\u0647</small>\n </div>\n <div class=\"form-group flex-1\">\n <label>Provider Name</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"WorkflowStudio\"\n [(ngModel)]=\"workflowSettings().providerName\" />\n <small>\u0646\u0627\u0645 \u0627\u0628\u0632\u0627\u0631 \u0633\u0627\u0632\u0646\u062F\u0647</small>\n </div>\n </div>\n </div>\n\n <!-- Outcomes -->\n <div class=\"advanced-group\">\n <h4>Workflow Outcomes</h4>\n <div class=\"form-group\">\n <label>Possible Outcomes</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"Done, Success, Failed (\u062C\u062F\u0627 \u0634\u062F\u0647 \u0628\u0627 \u06A9\u0627\u0645\u0627)\"\n [value]=\"workflowSettings().outcomes.join(', ')\"\n (input)=\"updateOutcomes($any($event.target).value)\" />\n <small>\u0646\u062A\u0627\u06CC\u062C \u0645\u0645\u06A9\u0646 \u06A9\u0647 \u0627\u06CC\u0646 workflow \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u062F \u0628\u0631\u06AF\u0631\u062F\u0627\u0646\u062F (\u0645\u062B\u0644\u0627\u064B: Done, Success, Failed)</small>\n </div>\n <div class=\"outcomes-preview\">\n @for (outcome of workflowSettings().outcomes; track outcome) {\n <span class=\"outcome-chip\">{{ outcome }}</span>\n }\n </div>\n </div>\n\n <!-- Export Preview -->\n <div class=\"advanced-group\">\n <h4>\u062E\u0631\u0648\u062C\u06CC \u0646\u0647\u0627\u06CC\u06CC (WorkflowDefinition)</h4>\n <small>\u0627\u06CC\u0646 \u0633\u0627\u062E\u062A\u0627\u0631 \u062F\u0642\u06CC\u0642\u0627\u064B \u0645\u0637\u0627\u0628\u0642 \u0628\u0627 WorkflowDefinition \u0627\u0633\u062A \u0648 \u062F\u0631 \u062F\u06CC\u062A\u0627\u0628\u06CC\u0633 \u0630\u062E\u06CC\u0631\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F</small>\n <div class=\"export-info\">\n <div class=\"info-row\">\n <span class=\"label\">Definition ID:</span>\n <code>{{ workflowSettings().definitionId || '(\u062E\u0627\u0644\u06CC)' }}</code>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">Name:</span>\n <code>{{ workflowSettings().name || '(\u062E\u0627\u0644\u06CC)' }}</code>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">Version:</span>\n <code>v{{ workflowSettings().version }}</code>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">Inputs:</span>\n <code>{{ workflowSettings().inputs.length }} items</code>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">Outputs:</span>\n <code>{{ workflowSettings().outputs.length }} items</code>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">Variables:</span>\n <code>{{ workflowSettings().variables.length }} items</code>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Modal Footer -->\n <div class=\"settings-modal-footer\">\n <ax-button [text]=\"'@workflow-management:workflow-studio.settings.actions.cancel' | translate | async\" color=\"secondary\" size=\"md\" (onClick)=\"closeWorkflowSettings()\"> </ax-button>\n <ax-button [text]=\"'@workflow-management:workflow-studio.settings.actions.save' | translate | async\" color=\"primary\" size=\"md\" (onClick)=\"saveWorkflowSettings()\"> </ax-button>\n </div>\n </div>\n </div>\n }\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 <button class=\"close-btn\" (click)=\"closeExecutionDialog()\" [disabled]=\"isExecuting()\">\n <i class=\"fa-light fa-times\"></i>\n </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>\u0641\u0631\u0622\u06CC\u0646\u062F \u062B\u0628\u062A\u200C\u0646\u0627\u0645</h3>\n <p class=\"registration-desc\">\n \u0627\u06CC\u0646 \u0641\u0644\u0648 \u0634\u0627\u0645\u0644 \u0686\u0646\u062F \u0645\u0631\u062D\u0644\u0647 \u0627\u0633\u062A \u06A9\u0647 \u062F\u0627\u062F\u0647\u200C\u0647\u0627\u06CC \u06A9\u0627\u0631\u0628\u0631 \u0631\u0627 \u062C\u0645\u0639\u200C\u0622\u0648\u0631\u06CC \u06A9\u0631\u062F\u0647 \u0648 \u062F\u0631 \u0646\u0647\u0627\u06CC\u062A \u062D\u0633\u0627\u0628 \u06A9\u0627\u0631\u0628\u0631\u06CC \u0627\u06CC\u062C\u0627\u062F \u0645\u06CC\u200C\u06A9\u0646\u062F.\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>\u062F\u0631 \u062D\u0627\u0644 \u0627\u062C\u0631\u0627\u06CC \u0645\u0631\u0627\u062D\u0644 \u062B\u0628\u062A\u200C\u0646\u0627\u0645...</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>\u062B\u0628\u062A\u200C\u0646\u0627\u0645 \u0628\u0627 \u0645\u0648\u0641\u0642\u06CC\u062A \u0627\u0646\u062C\u0627\u0645 \u0634\u062F!</h4>\n <p>\u062D\u0633\u0627\u0628 \u06A9\u0627\u0631\u0628\u0631\u06CC \u0634\u0645\u0627 \u0627\u06CC\u062C\u0627\u062F \u0634\u062F \u0648 \u0628\u0647 \u0632\u0648\u062F\u06CC \u0628\u0647 \u062F\u0627\u0634\u0628\u0648\u0631\u062F \u0645\u0646\u062A\u0642\u0644 \u062E\u0648\u0627\u0647\u06CC\u062F \u0634\u062F.</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>\u062F\u0631 \u062D\u0627\u0644 \u0627\u062C\u0631\u0627...</h3>\n <p>Workflow \u062F\u0631 \u062D\u0627\u0644 \u0627\u062C\u0631\u0627 \u0627\u0633\u062A. \u0644\u0637\u0641\u0627\u064B \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F.</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>\u0627\u062C\u0631\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06CC\u062A \u062A\u06A9\u0645\u06CC\u0644 \u0634\u062F</h3>\n <p>Workflow \u0628\u0627 \u0645\u0648\u0641\u0642\u06CC\u062A \u0627\u062C\u0631\u0627 \u0634\u062F \u0648 \u062A\u0645\u0627\u0645 Activities \u0627\u0646\u062C\u0627\u0645 \u0634\u062F\u0646\u062F.</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>\u062E\u0637\u0627 \u062F\u0631 \u0627\u062C\u0631\u0627</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> \u0644\u0627\u06AF\u200C\u0647\u0627\u06CC \u0627\u062C\u0631\u0627</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 \u0634\u0631\u0648\u0639: {{ 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 \u067E\u0627\u06CC\u0627\u0646: {{ 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>", 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}.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:#fff;border-bottom:1px solid #e2e8f0}.studio-editor .visual-canvas .canvas-toolbar .tool-btn{padding:.5rem .75rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;color:#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 .tool-info{flex:1;display:flex;align-items:center;gap:.5rem;font-size:.75rem;color:#64748b}.studio-editor .visual-canvas .canvas-toolbar .tool-info i{font-size:1rem;color:#8b5cf6}.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{stroke:#64748b;stroke-width:2;fill:none;opacity:.6;cursor:pointer;pointer-events:stroke;transition:all .2s}.studio-editor .visual-canvas .connection-line:hover{stroke:#ef4444;stroke-width:3;opacity:1}.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 .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{display:flex;gap:.5rem;padding:1rem 2rem 0;border-bottom:1px solid #e2e8f0}.settings-tabs .tab-btn{display:flex;align-items:center;gap:.5rem;padding:.75rem 1.25rem;background:transparent;border:none;border-bottom:2px solid transparent;color:#64748b;font-size:.875rem;font-weight:500;cursor:pointer;transition:all .2s;position:relative}.settings-tabs .tab-btn:hover{color:#8b5cf6;background:#f8fafc}.settings-tabs .tab-btn.active{color:#8b5cf6;border-bottom-color:#8b5cf6}.settings-tabs .tab-btn i{font-size:1rem}.settings-tabs .tab-btn .badge{padding:.125rem .5rem;background:#8b5cf6;color:#fff;border-radius:10px;font-size:.7rem;font-weight:600}.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: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: i3.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "color", "look", "fitParent", "selection"], outputs: ["onBlur", "onFocus", "lookChange", "colorChange", "disabledChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i3.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: i4.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: "ngmodule", type: AXSelectBoxModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXPThemeLayoutBlockComponent, selector: " axp-page-content, axp-page-footer-container, axp-page-footer, axp-page-header, axp-page-header-container, axp-page-toolbar, axp-layout-content, axp-layout-page-content, axp-layout-sections, axp-layout-body, axp-layout-page-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title-bar, axp-layout-title, axp-layout-title-actions, axp-layout-nav-button, axp-layout-description, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "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"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.JsonPipe, name: "json" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }] }); }
5861
+ ], usesInheritance: true, ngImport: i0, template: "<axp-page-layout>\n <axp-layout-start-side>\n <axp-activity-categories-tree (categoryClick)=\"onCategoryClick($event)\"\n (activityClick)=\"onActivityClick($event)\"></axp-activity-categories-tree>\n </axp-layout-start-side>\n\n <axp-page-toolbar>\n <axp-layout-prefix>\n <!-- Editor Tabs -->\n <ax-button-group class=\"ax-sm\" [selection]=\"'single'\">\n <ax-button-group-item (onClick)=\"switchTab('json')\" [selected]=\"activeTab() === 'json'\">\n <ax-prefix>\n <i class=\"fa-light fa-code\"></i>\n </ax-prefix>\n {{ '@workflow-management:workflow-studio.terms.json-editor' | translate | async }}\n </ax-button-group-item>\n <ax-button-group-item (onClick)=\"switchTab('visual')\" [selected]=\"activeTab() === 'visual'\">\n <ax-prefix>\n <i class=\"fa-light fa-diagram-project\"></i>\n </ax-prefix>\n {{ '@workflow-management:workflow-studio.terms.visual-designer' | translate | async }}\n </ax-button-group-item>\n </ax-button-group>\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\" [(ngModel)]=\"workflowJson\"\n [placeholder]=\"'@workflow-management:workflow-studio.components.json-editor.placeholder' | translate | async\"\n spellcheck=\"false\">\n </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 <button class=\"tool-btn\" (click)=\"clearCanvas()\"\n [title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.clear-canvas.title' | translate | async\">\n <i class=\"fa-light fa-trash\"></i>\n </button>\n <button class=\"tool-btn\" (click)=\"visualToJson()\"\n [title]=\"'@workflow-management:workflow-studio.components.canvas-toolbar.convert-to-json.title' | translate | async\">\n <i class=\"fa-light fa-code\"></i>\n </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 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 }} \u2192 {{ 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\" [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 <line [attr.x1]=\"node.position.x + 75\" [attr.y1]=\"node.position.y + 40\"\n [attr.x2]=\"targetNode.position.x + 75\" [attr.y2]=\"targetNode.position.y - 50\"\n class=\"connection-line\" stroke=\"#64748b\" stroke-width=\"2\" marker-end=\"url(#arrowhead-default)\"\n style=\"cursor: pointer\" (dblclick)=\"disconnectNodes(node.id, targetId)\"\n title=\"Double-click \u0628\u0631\u0627\u06CC \u062D\u0630\u0641 \u0627\u062A\u0635\u0627\u0644\">\n <title>Double-click \u0628\u0631\u0627\u06CC \u062D\u0630\u0641</title>\n </line>\n }\n }\n }\n }\n\n <defs>\n <!-- Default Arrow -->\n <marker id=\"arrowhead-default\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\">\n <polygon points=\"0 0, 10 3, 0 6\" fill=\"#64748b\" />\n </marker>\n <!-- Success Arrow (Green) -->\n <marker id=\"arrowhead-success\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\">\n <polygon points=\"0 0, 10 3, 0 6\" fill=\"#10b981\" />\n </marker>\n <!-- Error Arrow (Red) -->\n <marker id=\"arrowhead-error\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\">\n <polygon points=\"0 0, 10 3, 0 6\" fill=\"#ef4444\" />\n </marker>\n <!-- Warning Arrow (Orange) -->\n <marker id=\"arrowhead-warning\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\">\n <polygon points=\"0 0, 10 3, 0 6\" fill=\"#f59e0b\" />\n </marker>\n <!-- Info Arrow (Blue) -->\n <marker id=\"arrowhead-info\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\">\n <polygon points=\"0 0, 10 3, 0 6\" 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 <button class=\"node-delete\" (click)=\"deleteNode(node.id); $event.stopPropagation()\">\n <i class=\"fa-light fa-times\"></i>\n </button>\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>Activity \u0647\u0627 \u0631\u0627 \u0627\u0632 \u0633\u0627\u06CC\u062F\u0628\u0627\u0631 \u0628\u0647 \u0627\u06CC\u0646\u062C\u0627 \u0628\u06A9\u0634\u06CC\u062F</p>\n <small>\u06CC\u0627 \u0627\u0632 \u062A\u0628 JSON\u060C workflow \u0631\u0627 import \u06A9\u0646\u06CC\u062F</small>\n </div>\n }\n </div>\n </div>\n\n <!-- Properties Panel -->\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 <button class=\"header-btn\" (click)=\"togglePropertiesPanel()\"\n [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.close-panel' | translate | async\">\n <i class=\"fa-light fa-angle-right\"></i>\n </button>\n <button class=\"header-btn\" (click)=\"selectedNode.set(null)\"\n [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.close' | translate | async\">\n <i class=\"fa-light fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"properties-body\">\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.id' | translate | async }}:</label>\n <input type=\"text\" [value]=\"selectedNode()!.id\" disabled />\n </div>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.type' | translate | async }}:</label>\n <input type=\"text\" [value]=\"selectedNode()!.type\" disabled />\n </div>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.name' | translate | async }}:</label>\n <input type=\"text\" [value]=\"selectedNode()!.name\"\n (input)=\"updateNodeProperty(selectedNode()!.id, 'name', $any($event.target).value)\" />\n </div>\n\n <div class=\"properties-divider\"></div>\n\n <h5>\uD83D\uDCE5 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.input-properties' | translate | async }}</h5>\n <small class=\"properties-hint\">{{ '@workflow-management:workflow-studio.components.properties-panel.sections.input-properties' | translate | async }} - \u0645\u0642\u0627\u062F\u06CC\u0631 \u0631\u0627 \u062A\u0646\u0638\u06CC\u0645 \u06A9\u0646\u06CC\u062F</small>\n\n @if (hasProperties(selectedNode()!.properties)) {\n <div class=\"property-editor\">\n @for (key of Object.keys(selectedNode()!.properties); track key) {\n <div class=\"property-row\">\n <label>\n {{ key }}\n <span class=\"property-type-badge\">{{ typeof selectedNode()!.properties[key] }}</span>\n </label>\n\n @if (typeof selectedNode()!.properties[key] === 'boolean') {\n <select [value]=\"selectedNode()!.properties[key]\" (change)=\"\n updateNodeProperty(selectedNode()!.id, key, $any($event.target).value === 'true')\n \">\n <option [value]=\"true\">True</option>\n <option [value]=\"false\">False</option>\n </select>\n } @else if (typeof selectedNode()!.properties[key] === 'number') {\n <input type=\"number\" [value]=\"selectedNode()!.properties[key]\"\n (input)=\"updateNodeProperty(selectedNode()!.id, key, +$any($event.target).value)\" />\n } @else if (typeof selectedNode()!.properties[key] === 'object') {\n <textarea rows=\"3\" [value]=\"JSON.stringify(selectedNode()!.properties[key], null, 2)\"\n (input)=\"updateNodePropertyJSON(selectedNode()!.id, key, $any($event.target).value)\"></textarea>\n } @else {\n <input type=\"text\" [value]=\"selectedNode()!.properties[key]\"\n (input)=\"updateNodeProperty(selectedNode()!.id, key, $any($event.target).value)\" />\n }\n </div>\n }\n </div>\n } @else {\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 <h5>\uD83D\uDCE4 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.output-variables' | translate | async }}</h5>\n <small class=\"properties-hint\">\u062E\u0631\u0648\u062C\u06CC \u0648 \u0645\u062A\u063A\u06CC\u0631\u0647\u0627</small>\n <div class=\"property-row\">\n <label>{{ '@workflow-management:workflow-studio.components.properties-panel.fields.output-variable' | translate | async }}:</label>\n <input type=\"text\" placeholder=\"\u0645\u062B\u0644\u0627\u064B result\"\n [value]=\"selectedNode()!.properties['outputVariable'] || ''\"\n (input)=\"updateNodeProperty(selectedNode()!.id, 'outputVariable', $any($event.target).value)\" />\n </div>\n\n <div class=\"properties-divider\"></div>\n\n <h5>\uD83D\uDD17 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.connections' | translate | async }}</h5>\n <small class=\"properties-hint\">\u0627\u062A\u0635\u0627\u0644\u0627\u062A \u0627\u06CC\u0646 \u0646\u0648\u062F</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 <button class=\"remove-btn\"\n (click)=\"disconnectNodes(selectedNode()!.id, conn.targetNodeId, conn.outcome)\"\n title=\"\u062D\u0630\u0641 \u0627\u062A\u0635\u0627\u0644\">\n <i class=\"fa-light fa-times\"></i>\n </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 <button class=\"remove-btn\" (click)=\"disconnectNodes(selectedNode()!.id, targetId)\"\n title=\"\u062D\u0630\u0641 \u0627\u062A\u0635\u0627\u0644\">\n <i class=\"fa-light fa-times\"></i>\n </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>\uD83D\uDCE4 {{ '@workflow-management:workflow-studio.components.properties-panel.sections.available-outcomes' | translate | async }}</h5>\n <small class=\"properties-hint\">\u062E\u0631\u0648\u062C\u06CC\u200C\u0647\u0627\u06CC \u0645\u0648\u062C\u0648\u062F \u0628\u0631\u0627\u06CC \u0627\u062A\u0635\u0627\u0644</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>\uD83D\uDCDD {{ '@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 (selectedNode() && !showPropertiesPanel()) {\n <button class=\"sidebar-toggle-btn right\" (click)=\"togglePropertiesPanel()\"\n [title]=\"'@workflow-management:workflow-studio.components.properties-panel.actions.show-panel' | translate | async\">\n <i class=\"fa-light fa-sliders\"></i>\n </button>\n }\n </div>\n }\n </div>\n </div>\n\n </div>\n\n <!-- Workflow Settings Modal -->\n @if (showWorkflowSettings()) {\n <div class=\"settings-modal-overlay\" (click)=\"closeWorkflowSettings()\">\n <div class=\"settings-modal\" (click)=\"$event.stopPropagation()\">\n <!-- Modal Header -->\n <div class=\"settings-modal-header\">\n <div class=\"header-title\">\n <i class=\"fa-light fa-cog\"></i>\n <h2>{{ '@workflow-management:workflow-studio.settings.title' | translate | async }}</h2>\n </div>\n <button class=\"close-btn\" (click)=\"closeWorkflowSettings()\">\n <i class=\"fa-light fa-times\"></i>\n </button>\n </div>\n\n <!-- Modal Body -->\n <div class=\"settings-modal-body\">\n <!-- Tabs Navigation -->\n <div class=\"settings-tabs\">\n <button class=\"tab-btn\" [class.active]=\"activeSettingsTab() === 'general'\"\n (click)=\"switchSettingsTab('general')\">\n <i class=\"fa-light fa-info-circle\"></i>\n {{ '@workflow-management:workflow-studio.settings.tabs.general' | translate | async }}\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeSettingsTab() === 'inputs'\"\n (click)=\"switchSettingsTab('inputs')\">\n <i class=\"fa-light fa-sign-in\"></i>\n {{ '@workflow-management:workflow-studio.settings.tabs.inputs' | translate | async }}\n @if (workflowSettings().inputs.length > 0) {\n <span class=\"badge\">{{ workflowSettings().inputs.length }}</span>\n }\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeSettingsTab() === 'outputs'\"\n (click)=\"switchSettingsTab('outputs')\">\n <i class=\"fa-light fa-sign-out\"></i>\n {{ '@workflow-management:workflow-studio.settings.tabs.outputs' | translate | async }}\n @if (workflowSettings().outputs.length > 0) {\n <span class=\"badge\">{{ workflowSettings().outputs.length }}</span>\n }\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeSettingsTab() === 'variables'\"\n (click)=\"switchSettingsTab('variables')\">\n <i class=\"fa-light fa-box\"></i>\n {{ '@workflow-management:workflow-studio.settings.tabs.variables' | translate | async }}\n @if (workflowSettings().variables.length > 0) {\n <span class=\"badge\">{{ workflowSettings().variables.length }}</span>\n }\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeSettingsTab() === 'advanced'\"\n (click)=\"switchSettingsTab('advanced')\">\n <i class=\"fa-light fa-cog\"></i>\n {{ '@workflow-management:workflow-studio.settings.tabs.advanced' | translate | async }}\n </button>\n </div>\n\n <!-- Tab Content -->\n <div class=\"settings-content\">\n <!-- General Tab -->\n @if (activeSettingsTab() === 'general') {\n <div class=\"settings-section\">\n <h3>{{ '@workflow-management:workflow-studio.settings.sections.general.title' | translate | async }}</h3>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.general.fields.name.title' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.general.fields.name.placeholder' | translate | async\"\n [(ngModel)]=\"workflowSettings().name\" />\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.general.fields.definition-id.title' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.general.fields.definition-id.placeholder' | translate | async\"\n [(ngModel)]=\"workflowSettings().definitionId\" />\n <small>{{ '@workflow-management:workflow-studio.settings.sections.general.fields.definition-id.description' | translate | async }}</small>\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.general.fields.description.title' | translate | async }}</label>\n <textarea class=\"form-textarea\" rows=\"4\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.general.fields.description.placeholder' | translate | async\"\n [(ngModel)]=\"workflowSettings().description\"></textarea>\n </div>\n </div>\n }\n\n <!-- Inputs Tab -->\n @if (activeSettingsTab() === 'inputs') {\n <div class=\"settings-section\">\n <div class=\"section-header\">\n <h3>{{ '@workflow-management:workflow-studio.settings.sections.inputs.title' | translate | async }}</h3>\n <button class=\"add-btn\" (click)=\"addWorkflowInput()\">\n <i class=\"fa-light fa-plus\"></i>\n {{ '@workflow-management:workflow-studio.settings.sections.inputs.add-button' | translate | async }}\n </button>\n </div>\n\n @if (workflowSettings().inputs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-light fa-inbox\"></i>\n <p>{{ '@workflow-management:workflow-studio.settings.sections.inputs.empty-state.title' | translate | async }}</p>\n <small>{{ '@workflow-management:workflow-studio.settings.sections.inputs.empty-state.description' | translate | async }}</small>\n </div>\n } @else {\n <div class=\"items-list\">\n @for (input of workflowSettings().inputs; track $index) {\n <div class=\"item-card\">\n <div class=\"item-header\">\n <span class=\"item-number\">#{{ $index + 1 }}</span>\n <button class=\"remove-btn\" (click)=\"removeWorkflowInput($index)\"\n [title]=\"'@workflow-management:workflow-studio.settings.sections.inputs.actions.remove' | translate | async\">\n <i class=\"fa-light fa-trash\"></i>\n </button>\n </div>\n <div class=\"item-body\">\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.name' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"userName\" [value]=\"input.name\"\n (input)=\"updateWorkflowInput($index, 'name', $any($event.target).value)\" />\n </div>\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.title' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"User Name\" [value]=\"input.title\"\n (input)=\"updateWorkflowInput($index, 'title', $any($event.target).value)\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.description' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.inputs.fields.description-placeholder' | translate | async\"\n [value]=\"input.description || ''\"\n (input)=\"updateWorkflowInput($index, 'description', $any($event.target).value)\" />\n </div>\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.data-type' | translate | async }}</label>\n <select class=\"form-select\" [value]=\"input.schema.dataType || 'string'\"\n (change)=\"updateWorkflowInputSchema($index, 'dataType', $any($event.target).value)\">\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"object\">Object</option>\n <option value=\"array\">Array</option>\n </select>\n </div>\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.default-value' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.inputs.fields.default-value-placeholder' | translate | async\"\n [value]=\"input.schema.defaultValue || ''\"\n (input)=\"updateWorkflowInputSchema($index, 'defaultValue', $any($event.target).value)\" />\n </div>\n </div>\n <div class=\"form-group checkbox-group\">\n <label>\n <input type=\"checkbox\" [checked]=\"getInputIsRequired(input)\"\n (change)=\"updateWorkflowInputValidation($index, $any($event.target).checked)\" />\n <span>{{ '@workflow-management:workflow-studio.settings.sections.inputs.fields.required' | translate | async }}</span>\n </label>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Outputs Tab -->\n @if (activeSettingsTab() === 'outputs') {\n <div class=\"settings-section\">\n <div class=\"section-header\">\n <h3>{{ '@workflow-management:workflow-studio.settings.sections.outputs.title' | translate | async }}</h3>\n <button class=\"add-btn\" (click)=\"addWorkflowOutput()\">\n <i class=\"fa-light fa-plus\"></i>\n {{ '@workflow-management:workflow-studio.settings.sections.outputs.add-button' | translate | async }}\n </button>\n </div>\n\n @if (workflowSettings().outputs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-light fa-inbox\"></i>\n <p>{{ '@workflow-management:workflow-studio.settings.sections.outputs.empty-state.title' | translate | async }}</p>\n <small>{{ '@workflow-management:workflow-studio.settings.sections.outputs.empty-state.description' | translate | async }}</small>\n </div>\n } @else {\n <div class=\"items-list\">\n @for (output of workflowSettings().outputs; track $index) {\n <div class=\"item-card\">\n <div class=\"item-header\">\n <span class=\"item-number\">#{{ $index + 1 }}</span>\n <button class=\"remove-btn\" (click)=\"removeWorkflowOutput($index)\"\n [title]=\"'@workflow-management:workflow-studio.settings.sections.outputs.actions.remove' | translate | async\">\n <i class=\"fa-light fa-trash\"></i>\n </button>\n </div>\n <div class=\"item-body\">\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.outputs.fields.name' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"result\" [value]=\"output.name\"\n (input)=\"updateWorkflowOutput($index, 'name', $any($event.target).value)\" />\n </div>\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.outputs.fields.title' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"Result\" [value]=\"output.title\"\n (input)=\"updateWorkflowOutput($index, 'title', $any($event.target).value)\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.outputs.fields.description' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.outputs.fields.description-placeholder' | translate | async\"\n [value]=\"output.description || ''\"\n (input)=\"updateWorkflowOutput($index, 'description', $any($event.target).value)\" />\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.outputs.fields.data-type' | translate | async }}</label>\n <select class=\"form-select\" [value]=\"output.schema.dataType || 'string'\"\n (change)=\"updateWorkflowOutputSchema($index, 'dataType', $any($event.target).value)\">\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"object\">Object</option>\n <option value=\"array\">Array</option>\n </select>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Variables Tab -->\n @if (activeSettingsTab() === 'variables') {\n <div class=\"settings-section\">\n <div class=\"section-header\">\n <h3>{{ '@workflow-management:workflow-studio.settings.sections.variables.title' | translate | async }}</h3>\n <button class=\"add-btn\" (click)=\"addWorkflowVariable()\">\n <i class=\"fa-light fa-plus\"></i>\n {{ '@workflow-management:workflow-studio.settings.sections.variables.add-button' | translate | async }}\n </button>\n </div>\n\n @if (workflowSettings().variables.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-light fa-inbox\"></i>\n <p>{{ '@workflow-management:workflow-studio.settings.sections.variables.empty-state.title' | translate | async }}</p>\n <small>{{ '@workflow-management:workflow-studio.settings.sections.variables.empty-state.description' | translate | async }}</small>\n </div>\n } @else {\n <div class=\"items-list\">\n @for (variable of workflowSettings().variables; track $index) {\n <div class=\"item-card\">\n <div class=\"item-header\">\n <span class=\"item-number\">#{{ $index + 1 }}</span>\n <button class=\"remove-btn\" (click)=\"removeWorkflowVariable($index)\"\n [title]=\"'@workflow-management:workflow-studio.settings.sections.variables.actions.remove' | translate | async\">\n <i class=\"fa-light fa-trash\"></i>\n </button>\n </div>\n <div class=\"item-body\">\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.variables.fields.name' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"tempData\" [value]=\"variable.name\"\n (input)=\"updateWorkflowVariable($index, 'name', $any($event.target).value)\" />\n </div>\n <div class=\"form-group flex-1\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.variables.fields.type' | translate | async }}</label>\n <select class=\"form-select\" [value]=\"variable.typeName\"\n (change)=\"updateWorkflowVariable($index, 'typeName', $any($event.target).value)\">\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"object\">Object</option>\n <option value=\"array\">Array</option>\n </select>\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.variables.fields.description' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.variables.fields.description-placeholder' | translate | async\"\n [value]=\"variable.description || ''\"\n (input)=\"updateWorkflowVariable($index, 'description', $any($event.target).value)\" />\n </div>\n <div class=\"form-group\">\n <label>{{ '@workflow-management:workflow-studio.settings.sections.variables.fields.initial-value' | translate | async }}</label>\n <input type=\"text\" class=\"form-input\"\n [placeholder]=\"'@workflow-management:workflow-studio.settings.sections.variables.fields.initial-value-placeholder' | translate | async\"\n [value]=\"variable.value || ''\"\n (input)=\"updateWorkflowVariable($index, 'value', $any($event.target).value)\" />\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Advanced Tab -->\n @if (activeSettingsTab() === 'advanced') {\n <div class=\"settings-section\">\n <h3>{{ '@workflow-management:workflow-studio.settings.sections.advanced.title' | translate | async }}</h3>\n\n <!-- Versioning -->\n <div class=\"advanced-group\">\n <h4>\u0646\u0633\u062E\u0647\u200C\u0628\u0646\u062F\u06CC (Versioning)</h4>\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>Version</label>\n <input type=\"number\" class=\"form-input\" min=\"1\" [(ngModel)]=\"workflowSettings().version\" />\n <small>\u0634\u0645\u0627\u0631\u0647 \u0646\u0633\u062E\u0647 workflow (1, 2, 3, ...)</small>\n </div>\n <div class=\"form-group checkbox-group\" style=\"margin-top: 1.8rem\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"workflowSettings().isLatest\" />\n <span>\u0622\u062E\u0631\u06CC\u0646 \u0646\u0633\u062E\u0647 (Is Latest)</span>\n </label>\n </div>\n <div class=\"form-group checkbox-group\" style=\"margin-top: 1.8rem\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"workflowSettings().isPublished\" />\n <span>\u0645\u0646\u062A\u0634\u0631 \u0634\u062F\u0647 (Published)</span>\n </label>\n </div>\n </div>\n </div>\n\n <!-- Options -->\n <div class=\"advanced-group\">\n <h4>\u062A\u0646\u0638\u06CC\u0645\u0627\u062A (Options)</h4>\n <div class=\"form-group checkbox-group\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"workflowSettings().usableAsActivity\" />\n <span>\u0642\u0627\u0628\u0644 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 Activity</span>\n </label>\n <small>\u0627\u06CC\u0646 workflow \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u062F \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06CC\u06A9 activity \u062F\u0631 workflow \u0647\u0627\u06CC \u062F\u06CC\u06AF\u0631 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0634\u0648\u062F</small>\n </div>\n <div class=\"form-group checkbox-group\">\n <label>\n <input type=\"checkbox\" [(ngModel)]=\"workflowSettings().autoUpdateConsumingWorkflows\" />\n <span>\u0628\u0647\u200C\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u062E\u0648\u062F\u06A9\u0627\u0631 workflows \u0645\u0635\u0631\u0641\u200C\u06A9\u0646\u0646\u062F\u0647</span>\n </label>\n <small>workflow \u0647\u0627\u06CC\u06CC \u06A9\u0647 \u0627\u0632 \u0627\u06CC\u0646 workflow \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0645\u06CC\u200C\u06A9\u0646\u0646\u062F \u0628\u0647 \u0635\u0648\u0631\u062A \u062E\u0648\u062F\u06A9\u0627\u0631 \u0628\u0647\u200C\u0631\u0648\u0632 \u0645\u06CC\u200C\u0634\u0648\u0646\u062F</small>\n </div>\n </div>\n\n <!-- Metadata -->\n <div class=\"advanced-group\">\n <h4>Metadata</h4>\n <div class=\"form-row\">\n <div class=\"form-group flex-1\">\n <label>Tool Version</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"1.0.0\"\n [(ngModel)]=\"workflowSettings().toolVersion\" />\n <small>\u0646\u0633\u062E\u0647 \u0627\u0628\u0632\u0627\u0631 \u0633\u0627\u0632\u0646\u062F\u0647</small>\n </div>\n <div class=\"form-group flex-1\">\n <label>Provider Name</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"WorkflowStudio\"\n [(ngModel)]=\"workflowSettings().providerName\" />\n <small>\u0646\u0627\u0645 \u0627\u0628\u0632\u0627\u0631 \u0633\u0627\u0632\u0646\u062F\u0647</small>\n </div>\n </div>\n </div>\n\n <!-- Outcomes -->\n <div class=\"advanced-group\">\n <h4>Workflow Outcomes</h4>\n <div class=\"form-group\">\n <label>Possible Outcomes</label>\n <input type=\"text\" class=\"form-input\" placeholder=\"Done, Success, Failed (\u062C\u062F\u0627 \u0634\u062F\u0647 \u0628\u0627 \u06A9\u0627\u0645\u0627)\"\n [value]=\"workflowSettings().outcomes.join(', ')\"\n (input)=\"updateOutcomes($any($event.target).value)\" />\n <small>\u0646\u062A\u0627\u06CC\u062C \u0645\u0645\u06A9\u0646 \u06A9\u0647 \u0627\u06CC\u0646 workflow \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u062F \u0628\u0631\u06AF\u0631\u062F\u0627\u0646\u062F (\u0645\u062B\u0644\u0627\u064B: Done, Success, Failed)</small>\n </div>\n <div class=\"outcomes-preview\">\n @for (outcome of workflowSettings().outcomes; track outcome) {\n <span class=\"outcome-chip\">{{ outcome }}</span>\n }\n </div>\n </div>\n\n <!-- Export Preview -->\n <div class=\"advanced-group\">\n <h4>\u062E\u0631\u0648\u062C\u06CC \u0646\u0647\u0627\u06CC\u06CC (WorkflowDefinition)</h4>\n <small>\u0627\u06CC\u0646 \u0633\u0627\u062E\u062A\u0627\u0631 \u062F\u0642\u06CC\u0642\u0627\u064B \u0645\u0637\u0627\u0628\u0642 \u0628\u0627 WorkflowDefinition \u0627\u0633\u062A \u0648 \u062F\u0631 \u062F\u06CC\u062A\u0627\u0628\u06CC\u0633 \u0630\u062E\u06CC\u0631\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F</small>\n <div class=\"export-info\">\n <div class=\"info-row\">\n <span class=\"label\">Definition ID:</span>\n <code>{{ workflowSettings().definitionId || '(\u062E\u0627\u0644\u06CC)' }}</code>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">Name:</span>\n <code>{{ workflowSettings().name || '(\u062E\u0627\u0644\u06CC)' }}</code>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">Version:</span>\n <code>v{{ workflowSettings().version }}</code>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">Inputs:</span>\n <code>{{ workflowSettings().inputs.length }} items</code>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">Outputs:</span>\n <code>{{ workflowSettings().outputs.length }} items</code>\n </div>\n <div class=\"info-row\">\n <span class=\"label\">Variables:</span>\n <code>{{ workflowSettings().variables.length }} items</code>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Modal Footer -->\n <div class=\"settings-modal-footer\">\n <ax-button [text]=\"'@workflow-management:workflow-studio.settings.actions.cancel' | translate | async\" color=\"secondary\" size=\"md\" (onClick)=\"closeWorkflowSettings()\"> </ax-button>\n <ax-button [text]=\"'@workflow-management:workflow-studio.settings.actions.save' | translate | async\" color=\"primary\" size=\"md\" (onClick)=\"saveWorkflowSettings()\"> </ax-button>\n </div>\n </div>\n </div>\n }\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 <button class=\"close-btn\" (click)=\"closeExecutionDialog()\" [disabled]=\"isExecuting()\">\n <i class=\"fa-light fa-times\"></i>\n </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>\u0641\u0631\u0622\u06CC\u0646\u062F \u062B\u0628\u062A\u200C\u0646\u0627\u0645</h3>\n <p class=\"registration-desc\">\n \u0627\u06CC\u0646 \u0641\u0644\u0648 \u0634\u0627\u0645\u0644 \u0686\u0646\u062F \u0645\u0631\u062D\u0644\u0647 \u0627\u0633\u062A \u06A9\u0647 \u062F\u0627\u062F\u0647\u200C\u0647\u0627\u06CC \u06A9\u0627\u0631\u0628\u0631 \u0631\u0627 \u062C\u0645\u0639\u200C\u0622\u0648\u0631\u06CC \u06A9\u0631\u062F\u0647 \u0648 \u062F\u0631 \u0646\u0647\u0627\u06CC\u062A \u062D\u0633\u0627\u0628 \u06A9\u0627\u0631\u0628\u0631\u06CC \u0627\u06CC\u062C\u0627\u062F \u0645\u06CC\u200C\u06A9\u0646\u062F.\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>\u062F\u0631 \u062D\u0627\u0644 \u0627\u062C\u0631\u0627\u06CC \u0645\u0631\u0627\u062D\u0644 \u062B\u0628\u062A\u200C\u0646\u0627\u0645...</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>\u062B\u0628\u062A\u200C\u0646\u0627\u0645 \u0628\u0627 \u0645\u0648\u0641\u0642\u06CC\u062A \u0627\u0646\u062C\u0627\u0645 \u0634\u062F!</h4>\n <p>\u062D\u0633\u0627\u0628 \u06A9\u0627\u0631\u0628\u0631\u06CC \u0634\u0645\u0627 \u0627\u06CC\u062C\u0627\u062F \u0634\u062F \u0648 \u0628\u0647 \u0632\u0648\u062F\u06CC \u0628\u0647 \u062F\u0627\u0634\u0628\u0648\u0631\u062F \u0645\u0646\u062A\u0642\u0644 \u062E\u0648\u0627\u0647\u06CC\u062F \u0634\u062F.</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>\u062F\u0631 \u062D\u0627\u0644 \u0627\u062C\u0631\u0627...</h3>\n <p>Workflow \u062F\u0631 \u062D\u0627\u0644 \u0627\u062C\u0631\u0627 \u0627\u0633\u062A. \u0644\u0637\u0641\u0627\u064B \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F.</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>\u0627\u062C\u0631\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06CC\u062A \u062A\u06A9\u0645\u06CC\u0644 \u0634\u062F</h3>\n <p>Workflow \u0628\u0627 \u0645\u0648\u0641\u0642\u06CC\u062A \u0627\u062C\u0631\u0627 \u0634\u062F \u0648 \u062A\u0645\u0627\u0645 Activities \u0627\u0646\u062C\u0627\u0645 \u0634\u062F\u0646\u062F.</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>\u062E\u0637\u0627 \u062F\u0631 \u0627\u062C\u0631\u0627</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> \u0644\u0627\u06AF\u200C\u0647\u0627\u06CC \u0627\u062C\u0631\u0627</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 \u0634\u0631\u0648\u0639: {{ 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 \u067E\u0627\u06CC\u0627\u0646: {{ 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>", 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}.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:#fff;border-bottom:1px solid #e2e8f0}.studio-editor .visual-canvas .canvas-toolbar .tool-btn{padding:.5rem .75rem;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;color:#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 .tool-info{flex:1;display:flex;align-items:center;gap:.5rem;font-size:.75rem;color:#64748b}.studio-editor .visual-canvas .canvas-toolbar .tool-info i{font-size:1rem;color:#8b5cf6}.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{stroke:#64748b;stroke-width:2;fill:none;opacity:.6;cursor:pointer;pointer-events:stroke;transition:all .2s}.studio-editor .visual-canvas .connection-line:hover{stroke:#ef4444;stroke-width:3;opacity:1}.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 .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{display:flex;gap:.5rem;padding:1rem 2rem 0;border-bottom:1px solid #e2e8f0}.settings-tabs .tab-btn{display:flex;align-items:center;gap:.5rem;padding:.75rem 1.25rem;background:transparent;border:none;border-bottom:2px solid transparent;color:#64748b;font-size:.875rem;font-weight:500;cursor:pointer;transition:all .2s;position:relative}.settings-tabs .tab-btn:hover{color:#8b5cf6;background:#f8fafc}.settings-tabs .tab-btn.active{color:#8b5cf6;border-bottom-color:#8b5cf6}.settings-tabs .tab-btn i{font-size:1rem}.settings-tabs .tab-btn .badge{padding:.125rem .5rem;background:#8b5cf6;color:#fff;border-radius:10px;font-size:.7rem;font-weight:600}.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: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: i3.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "color", "look", "fitParent", "selection"], outputs: ["onBlur", "onFocus", "lookChange", "colorChange", "disabledChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i3.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: i2$1.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: "ngmodule", type: AXSelectBoxModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXPThemeLayoutBlockComponent, selector: " axp-page-content, axp-page-footer-container, axp-page-footer, axp-page-header, axp-page-header-container, axp-page-toolbar, axp-layout-content, axp-layout-page-content, axp-layout-sections, axp-layout-body, axp-layout-page-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title-bar, axp-layout-title, axp-layout-title-actions, axp-layout-nav-button, axp-layout-description, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "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"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.JsonPipe, name: "json" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i7.AXTranslatorPipe, name: "translate" }] }); }
4036
5862
  }
4037
5863
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WorkflowStudioComponent, decorators: [{
4038
5864
  type: Component,
@@ -4066,5 +5892,5 @@ var workflowStudio_component = /*#__PURE__*/Object.freeze({
4066
5892
  * Generated bundle index. Do not edit.
4067
5893
  */
4068
5894
 
4069
- export { AXCCategoryProvider, AXMActivityCategoriesTreeComponent, AXMMenuProvider, AXMWorkflowActivitiesDefinitionProvider, AXMWorkflowManagementModule, AXMWorkflowManagementModuleEntityProvider, AXPCreateEntityActivity, AXPGenericWorkflowTaskProvider, AXP_GENERIC_WORKFLOW_TASK_PROVIDER_CONFIG, CollectSignatureActivity, ExecuteCommandActivity, ExecuteQueryActivity, HumanTaskActivity, RootConfig, ShowConfirmPopupActivity, ShowLayoutPopupActivity, ShowToastActivity, WorkflowStudioComponent };
5895
+ export { AXCCategoryProvider, AXMActivityCategoriesTreeComponent, AXMMenuProvider, AXMWorkflowActivitiesDefinitionProvider, AXMWorkflowManagementActivityCategoryEntityModule, AXMWorkflowManagementActivityCategoryEntityService, AXMWorkflowManagementActivityCategoryEntityServiceImpl, AXMWorkflowManagementActivityDefinitionEntityModule, AXMWorkflowManagementActivityDefinitionEntityService, AXMWorkflowManagementActivityDefinitionEntityServiceImpl, AXMWorkflowManagementModule, AXMWorkflowManagementModuleEntityProvider, AXMWorkflowManagementWorkItemCandidateEntityModule, AXMWorkflowManagementWorkItemCandidateEntityService, AXMWorkflowManagementWorkItemCandidateEntityServiceImpl, AXMWorkflowManagementWorkItemEntityModule, AXMWorkflowManagementWorkItemEntityService, AXMWorkflowManagementWorkItemEntityServiceImpl, AXMWorkflowManagementWorkflowDefinitionEntityModule, AXMWorkflowManagementWorkflowDefinitionEntityService, AXMWorkflowManagementWorkflowDefinitionEntityServiceImpl, AXMWorkflowManagementWorkflowInstanceEntityModule, AXMWorkflowManagementWorkflowInstanceEntityService, AXMWorkflowManagementWorkflowInstanceEntityServiceImpl, AXPCreateEntityActivity, AssignToManggerActivity, CheckPermissionActivity, CollectSignatureActivity, ExecuteCommandActivity, ExecuteQueryActivity, RootConfig, ShowConfirmPopupActivity, ShowLayoutPopupActivity, ShowToastActivity, WorkflowStudioComponent, factory$5 as activityCategoryEntityFactory, factory$4 as activityDefinitionEntityFactory, factory as workItemCandidateEntityFactory, factory$1 as workItemEntityFactory, factory$3 as workflowDefinitionEntityFactory, factory$2 as workflowInstanceEntityFactory };
4070
5896
  //# sourceMappingURL=acorex-modules-workflow-management.mjs.map