ngx-histaff-alpha 5.9.1 → 5.9.3

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 (62) hide show
  1. package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-ClNRMk6B.mjs → ngx-histaff-alpha-ai-hint-for-table.component-BzUUTmoN.mjs} +3 -3
  2. package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-ClNRMk6B.mjs.map → ngx-histaff-alpha-ai-hint-for-table.component-BzUUTmoN.mjs.map} +1 -1
  3. package/fesm2022/ngx-histaff-alpha-core-form-design.component-C_yKnqtf.mjs +3256 -0
  4. package/fesm2022/ngx-histaff-alpha-core-form-design.component-C_yKnqtf.mjs.map +1 -0
  5. package/fesm2022/{ngx-histaff-alpha-core-sticker-collection.component-ZJ29hnW7.mjs → ngx-histaff-alpha-core-sticker-collection.component-Bl-aiwIo.mjs} +3 -3
  6. package/fesm2022/{ngx-histaff-alpha-core-sticker-collection.component-ZJ29hnW7.mjs.map → ngx-histaff-alpha-core-sticker-collection.component-Bl-aiwIo.mjs.map} +1 -1
  7. package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-D4lPsJ_K.mjs → ngx-histaff-alpha-core-toast-loading.component-B74LCLn2.mjs} +2 -2
  8. package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-D4lPsJ_K.mjs.map → ngx-histaff-alpha-core-toast-loading.component-B74LCLn2.mjs.map} +1 -1
  9. package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-Dxy4PssU.mjs → ngx-histaff-alpha-core-workflow-consume.component-BDBQQUAT.mjs} +2 -2
  10. package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-Dxy4PssU.mjs.map → ngx-histaff-alpha-core-workflow-consume.component-BDBQQUAT.mjs.map} +1 -1
  11. package/fesm2022/{ngx-histaff-alpha-db-settings.component-ovw3ShzY.mjs → ngx-histaff-alpha-db-settings.component-BVIb2eWg.mjs} +5 -5
  12. package/fesm2022/{ngx-histaff-alpha-db-settings.component-ovw3ShzY.mjs.map → ngx-histaff-alpha-db-settings.component-BVIb2eWg.mjs.map} +1 -1
  13. package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-Dd5UoJX1.mjs → ngx-histaff-alpha-design-wrapper.component-KuubA0Jn.mjs} +11 -9
  14. package/fesm2022/ngx-histaff-alpha-design-wrapper.component-KuubA0Jn.mjs.map +1 -0
  15. package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-DLdFwwhp.mjs → ngx-histaff-alpha-design-wrapper.route-CSmaOUHg.mjs} +5 -5
  16. package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-DLdFwwhp.mjs.map → ngx-histaff-alpha-design-wrapper.route-CSmaOUHg.mjs.map} +1 -1
  17. package/fesm2022/{ngx-histaff-alpha-form-array-props.component-DkAM9Uk9.mjs → ngx-histaff-alpha-form-array-props.component-DuM5ZMkG.mjs} +5 -8
  18. package/fesm2022/ngx-histaff-alpha-form-array-props.component-DuM5ZMkG.mjs.map +1 -0
  19. package/fesm2022/{ngx-histaff-alpha-live-form.component-BMCAth2_.mjs → ngx-histaff-alpha-live-form.component-D7oAY8-L.mjs} +17 -23
  20. package/fesm2022/ngx-histaff-alpha-live-form.component-D7oAY8-L.mjs.map +1 -0
  21. package/fesm2022/{ngx-histaff-alpha-ngx-histaff-alpha-CkvGEG39.mjs → ngx-histaff-alpha-ngx-histaff-alpha-Dh4tWGKT.mjs} +1180 -391
  22. package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-Dh4tWGKT.mjs.map +1 -0
  23. package/fesm2022/{ngx-histaff-alpha-tracker-studio.component-CeB-VuEP.mjs → ngx-histaff-alpha-tracker-studio.component-D77fag1W.mjs} +2 -2
  24. package/fesm2022/{ngx-histaff-alpha-tracker-studio.component-CeB-VuEP.mjs.map → ngx-histaff-alpha-tracker-studio.component-D77fag1W.mjs.map} +1 -1
  25. package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-CO09ZkTB.mjs → ngx-histaff-alpha-wf-form-assign.component-CixDiq8u.mjs} +2 -2
  26. package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-CO09ZkTB.mjs.map → ngx-histaff-alpha-wf-form-assign.component-CixDiq8u.mjs.map} +1 -1
  27. package/fesm2022/ngx-histaff-alpha-wf-instance-status.component-oBkeUjfP.mjs +177 -0
  28. package/fesm2022/ngx-histaff-alpha-wf-instance-status.component-oBkeUjfP.mjs.map +1 -0
  29. package/fesm2022/{ngx-histaff-alpha-wf-instance-step-react.component-DRUYdQY3.mjs → ngx-histaff-alpha-wf-instance-step-react.component-D53ZEW27.mjs} +3 -3
  30. package/fesm2022/{ngx-histaff-alpha-wf-instance-step-react.component-DRUYdQY3.mjs.map → ngx-histaff-alpha-wf-instance-step-react.component-D53ZEW27.mjs.map} +1 -1
  31. package/fesm2022/ngx-histaff-alpha.mjs +1 -1
  32. package/lib/app/directives/html-tooltip.directive.d.ts +14 -4
  33. package/lib/app/libraries/core-button-group-vns/core-button-group-vns/EnumCoreButtonVNSCode.d.ts +3 -0
  34. package/lib/app/libraries/core-control/core-control/core-control.component.d.ts +1 -0
  35. package/lib/app/libraries/core-form/core-form/core-form.component.d.ts +1 -0
  36. package/lib/app/libraries/core-form/core-form/enum-interfaces.d.ts +1 -1
  37. package/lib/app/libraries/core-form/core-form-array/core-form-array.component.d.ts +8 -9
  38. package/lib/app/libraries/core-form-design/core-form-array-layout-editor/core-form-array-layout-editor.component.d.ts +14 -13
  39. package/lib/app/libraries/core-form-design/core-form-design-monitor/core-form-design-monitor.component.d.ts +35 -0
  40. package/lib/app/libraries/core-form-design/core-form-design.component.d.ts +5 -23
  41. package/lib/app/libraries/core-form-design/core-form-design.service.d.ts +41 -14
  42. package/lib/app/libraries/core-form-design/core-form-group-editor.component.d.ts +104 -0
  43. package/lib/app/libraries/core-form-design/field-setting/base-props/base-props.component.d.ts +10 -4
  44. package/lib/app/libraries/core-form-design/field-setting/calculated-props/calculated-props.component.d.ts +0 -1
  45. package/lib/app/libraries/core-form-design/field-setting/field-setting.component.d.ts +4 -3
  46. package/lib/app/libraries/core-form-design/interfaces.d.ts +3 -1
  47. package/lib/app/libraries/core-form-design/json-safe.pipe.d.ts +11 -0
  48. package/lib/app/libraries/core-form-design/live-form/live-form.component.d.ts +1 -2
  49. package/lib/app/libraries/core-form-design/props-host/props-host.component.d.ts +2 -1
  50. package/lib/app/libraries/core-workflow-builder/core-workflow.service.d.ts +1 -0
  51. package/lib/app/libraries/core-workflow-builder/wf-instance-status/wf-instance-status.component.d.ts +3 -0
  52. package/lib/app/services/json.service.d.ts +5 -1
  53. package/lib/app/services/organization.service.d.ts +3 -1
  54. package/package.json +1 -1
  55. package/fesm2022/ngx-histaff-alpha-core-form-design.component-KQsI4L2g.mjs +0 -2437
  56. package/fesm2022/ngx-histaff-alpha-core-form-design.component-KQsI4L2g.mjs.map +0 -1
  57. package/fesm2022/ngx-histaff-alpha-design-wrapper.component-Dd5UoJX1.mjs.map +0 -1
  58. package/fesm2022/ngx-histaff-alpha-form-array-props.component-DkAM9Uk9.mjs.map +0 -1
  59. package/fesm2022/ngx-histaff-alpha-live-form.component-BMCAth2_.mjs.map +0 -1
  60. package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-CkvGEG39.mjs.map +0 -1
  61. package/fesm2022/ngx-histaff-alpha-wf-instance-status.component-DQfVNySE.mjs +0 -153
  62. package/fesm2022/ngx-histaff-alpha-wf-instance-status.component-DQfVNySE.mjs.map +0 -1
@@ -1,153 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { input, inject, computed, ChangeDetectionStrategy, Component, signal, effect } from '@angular/core';
3
- import { ActivatedRoute } from '@angular/router';
4
- import { e as BaseComponent, i as AlertService, M as MultiLanguageService, I as ImageErrorResolverDirective, j as TableCellPipe, k as MapAvatarToServerPipe, A as AppService, l as alertOptions, S as SocketService, C as CorePageHeaderComponent, m as CoreTerminalSpinnerComponent } from './ngx-histaff-alpha-ngx-histaff-alpha-CkvGEG39.mjs';
5
- import { tap, catchError, of } from 'rxjs';
6
- import { NgClass, JsonPipe } from '@angular/common';
7
-
8
- class RuntimeRoutingComponent extends BaseComponent {
9
- getStepStatusClass(step) {
10
- if (step.passed === true)
11
- return 'resolved';
12
- if (step.passed === false)
13
- return 'error';
14
- return 'empty';
15
- }
16
- constructor(mls) {
17
- super(mls);
18
- this.mls = mls;
19
- this.$instance = input();
20
- this.as = inject(AlertService);
21
- this.$steps = computed(() => {
22
- const stepProgresses = this.$instance()?.stepProgresses ?? [];
23
- stepProgresses.forEach(s => {
24
- if (!!s.exeConfigJson) {
25
- s.exeConfig = JSON.parse(s.exeConfigJson);
26
- }
27
- else {
28
- s.exeConfig = {};
29
- }
30
- });
31
- stepProgresses.sort((a, b) => a.stepOrder - b.stepOrder);
32
- return [...stepProgresses];
33
- });
34
- }
35
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: RuntimeRoutingComponent, deps: [{ token: MultiLanguageService }], target: i0.ɵɵFactoryTarget.Component }); }
36
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: RuntimeRoutingComponent, isStandalone: true, selector: "runtime-routing", inputs: { $instance: { classPropertyName: "$instance", publicName: "$instance", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div class=\"runtime-routing-container inter-font p-relative\">\r\n @if ($instance() && $steps()?.length) {\r\n <div class=\"workflow-wrapper\">\r\n @for (step of $steps(); track step.id) {\r\n\r\n <div class=\"step-column\" [attr.data-actor-count]=\"step.stepProgressActors?.length\">\r\n\r\n <div class=\"step-column-aux\">\r\n <div [ngClass]=\"step.exeConfig?.routingLogic ?? ''\" class=\"step-header {{ step.stepType.toLowerCase() }} {{ getStepStatusClass(step) }}\">\r\n {{ step.stepName }}\r\n </div>\r\n\r\n @for (actor of step.stepProgressActors; track actor.id) {\r\n <div class=\"actor-card-aux\">\r\n <div class=\"actor-card d-flex d-flex-start {{ step.stepType.toLowerCase() }}\">\r\n <div class=\"avatar-wrapper\">\r\n <img [src]=\"actor.actorAvatar\"\r\n appImageErrorResolver\r\n [type]=\"'AVATAR'\"\r\n [isFemale]=\"!!actor.isFemale!\"\r\n class=\"actor-avatar\" [alt]=\"actor.actorFullname\" />\r\n <div class=\"status-icon\" [ngClass]=\"(actor.status || 'pending').toLowerCase()\">\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"actor-details\">\r\n <div class=\"actor-line\">\r\n <i class=\"feather-user\"></i>\r\n <span class=\"actor-full-name\" [title]=\"actor.actorFullname\">{{ actor.actorFullname\r\n }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-briefcase\"></i>\r\n <span [title]=\"actor.actorJobName\">{{ actor.actorJobName || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-mail\"></i>\r\n <span [title]=\"actor.actorEmail\">{{ actor.actorEmail }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-hash\"></i>\r\n <span [title]=\"actor.actorEmployeeCode\">{{ actor.actorEmployeeCode }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-check-circle\"></i>\r\n <span [title]=\"actor.status\">{{ actor.status || 'Pending' }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-clock\"></i>\r\n <span [title]=\"actor.votedAt\">{{ actor.votedAt | tableCell: 'DATE_TIME' : lang }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (!$steps().length) {\r\n <div class=\"step-column\">\r\n <div class=\"step-header empty\">No steps</div>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"workflow-wrapper\">\r\n <div class=\"step-column\">\r\n <div class=\"step-header empty\">\u26A0 No steps to display</div>\r\n </div>\r\n </div>\r\n }\r\n</div>", styles: [".runtime-routing-container{--card-height: 180px;font-size:13px}.runtime-routing-container .workflow-wrapper{display:flex;flex-direction:row;gap:64px;padding:24px;background:#f5f5f5;overflow-x:auto;min-width:576px;min-height:200px}.runtime-routing-container .workflow-wrapper .step-column{width:240px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;position:relative;min-height:100%}.runtime-routing-container .workflow-wrapper .step-header{position:relative;font-weight:600;font-size:14px;text-align:center;border:1px solid #ccc;border-radius:8px;box-shadow:0 1px 3px #0000001a;padding:6px 10px;margin-bottom:10px;width:100%;color:#fff}.runtime-routing-container .workflow-wrapper .step-header.submit{background-color:#00bcd4}.runtime-routing-container .workflow-wrapper .step-header.approval{background-color:#f80}.runtime-routing-container .workflow-wrapper .step-header.cc{background-color:#3370ff}.runtime-routing-container .workflow-wrapper .step-header.handle{background-color:#935af6}.runtime-routing-container .workflow-wrapper .step-header.end{background-color:#673ab7}.runtime-routing-container .workflow-wrapper .step-header.resolved{box-shadow:0 0 0 3px #4caf50 inset}.runtime-routing-container .workflow-wrapper .step-header.empty{box-shadow:0 0 0 3px #ff9800 inset}.runtime-routing-container .workflow-wrapper .step-header.fallback{box-shadow:0 0 0 3px #03a9f4 inset}.runtime-routing-container .workflow-wrapper .step-header.error{box-shadow:0 0 0 3px #f44336 inset}.runtime-routing-container .workflow-wrapper .actor-card-aux{position:relative}.runtime-routing-container .workflow-wrapper .actor-card.d-flex{display:flex;align-items:center;justify-content:flex-start;width:240px;height:var(--card-height);font-size:13px;border:1px solid #ccc;padding:0 12px;margin:8px auto;box-shadow:0 1px 3px #0000001a;position:relative;background-color:#fff;border-radius:8px}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .actor-details .actor-line>span{font-weight:700;width:140px;overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .actor-details .actor-line>span.actor-full-name{color:#000}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper{flex-shrink:0;margin-right:8px}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon{width:40px;height:40px;border-radius:50%;font-family:feather;font-size:40px}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.pending:after{content:\"\\e939\";color:#848484}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.sent:after{content:\"\\e92c\";color:#4caf50}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.approved:after{content:\"\\e92c\";color:#4caf50}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.skipped:after{content:\"\\e92c\";color:#4caf50}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.completed:after{content:\"\\e92c\";color:#4caf50}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.rejected:after{content:\"\\e9d0\";color:red}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .actor-avatar{width:40px;height:40px;border-radius:50%;object-fit:cover;border:1px solid #ccc}.runtime-routing-container .workflow-wrapper .step-column:not(:first-child) .actor-card:before{content:\"\";position:absolute;top:50%;left:-20px;width:16px;height:2px;background-color:#ccc}.runtime-routing-container .workflow-wrapper .step-column:not(:first-child) .actor-card-aux:not(:last-child) .actor-card:after{content:\"\";position:absolute;top:50%;left:-20px;width:2px;height:calc(100% + 10px);background-color:#ccc}.runtime-routing-container .workflow-wrapper .step-column:not(:last-child) .actor-card-aux:before{content:\"\";position:absolute;top:50%;right:-16px;width:16px;height:2px;background-color:#ccc}.runtime-routing-container .workflow-wrapper .step-column:not(:last-child) .actor-card-aux:not(:last-child):after{content:\"\";position:absolute;top:50%;right:-16px;width:2px;height:calc(100% + 10px);background-color:#ccc}.runtime-routing-container .workflow-wrapper .step-column-aux{position:relative}.runtime-routing-container .workflow-wrapper .step-column:not(:last-child) .step-column-aux:after{content:\"\";position:absolute;top:calc(50% + 18.5px);right:-48px;width:32px;height:2px;background-color:#ccc}.runtime-routing-container .workflow-wrapper .actor-card.submit{background-color:#e0f7fa;border-left:4px solid #00bcd4}.runtime-routing-container .workflow-wrapper .actor-card.approval{background-color:#fff3e0;border-left:4px solid #f80}.runtime-routing-container .workflow-wrapper .actor-card.cc{background-color:#e6ecff;border-left:4px solid #3370ff}.runtime-routing-container .workflow-wrapper .actor-card.handle{background-color:#f3e6ff;border-left:4px solid #935af6}.runtime-routing-container .workflow-wrapper .actor-card.end{background-color:#ede7f6;border-left:4px solid #673ab7}.runtime-routing-container .workflow-wrapper .actor-line{display:flex;align-items:center;gap:6px;margin:2px 0;height:23.5px}.runtime-routing-container .workflow-wrapper .actor-line i{width:16px;height:16px;font-size:16px;color:#848484}.runtime-routing-container .workflow-wrapper .actor-line input.email-debug-input{border:1px dashed #00bcd4;background-color:#e0f7fa;width:140px;padding:0 8px}.runtime-routing-container .workflow-wrapper .actor-card span{display:block;color:#555;margin:2px 0}@media (max-width: 576px){.runtime-routing-container .workflow-wrapper .workflow-wrapper{flex-direction:column;align-items:center;gap:24px}.runtime-routing-container .workflow-wrapper .step-column{width:90vw}.runtime-routing-container .workflow-wrapper .actor-card{width:100%}}.runtime-routing-container .p-relative{position:relative}.runtime-routing-container .routing-preview-header{display:flex;align-items:center;justify-content:space-between;height:35px;margin-bottom:15px}.runtime-routing-container .routing-preview-header .button-group{display:flex;align-items:center;justify-content:flex-start;gap:8px;height:35px}.runtime-routing-container .routing-preview-header .button-group button{border-radius:0;color:#fff;height:35px;font-size:13px}.runtime-routing-container .routing-preview-header .debug-group{display:flex;align-items:center;justify-content:flex-start;height:35px}.runtime-routing-container .routing-preview-header .debug-group label{-webkit-user-select:none;user-select:none;margin-right:8px}.runtime-routing-container h5{padding:15px;color:#848484}.runtime-routing-container .resolved-steps pre{padding:15px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: ImageErrorResolverDirective, selector: "[appImageErrorResolver]", inputs: ["type", "isFemale"] }, { kind: "pipe", type: TableCellPipe, name: "tableCell" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37
- }
38
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: RuntimeRoutingComponent, decorators: [{
39
- type: Component,
40
- args: [{ selector: 'runtime-routing', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
41
- NgClass,
42
- ImageErrorResolverDirective,
43
- MapAvatarToServerPipe,
44
- TableCellPipe,
45
- JsonPipe,
46
- ], template: "<div class=\"runtime-routing-container inter-font p-relative\">\r\n @if ($instance() && $steps()?.length) {\r\n <div class=\"workflow-wrapper\">\r\n @for (step of $steps(); track step.id) {\r\n\r\n <div class=\"step-column\" [attr.data-actor-count]=\"step.stepProgressActors?.length\">\r\n\r\n <div class=\"step-column-aux\">\r\n <div [ngClass]=\"step.exeConfig?.routingLogic ?? ''\" class=\"step-header {{ step.stepType.toLowerCase() }} {{ getStepStatusClass(step) }}\">\r\n {{ step.stepName }}\r\n </div>\r\n\r\n @for (actor of step.stepProgressActors; track actor.id) {\r\n <div class=\"actor-card-aux\">\r\n <div class=\"actor-card d-flex d-flex-start {{ step.stepType.toLowerCase() }}\">\r\n <div class=\"avatar-wrapper\">\r\n <img [src]=\"actor.actorAvatar\"\r\n appImageErrorResolver\r\n [type]=\"'AVATAR'\"\r\n [isFemale]=\"!!actor.isFemale!\"\r\n class=\"actor-avatar\" [alt]=\"actor.actorFullname\" />\r\n <div class=\"status-icon\" [ngClass]=\"(actor.status || 'pending').toLowerCase()\">\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"actor-details\">\r\n <div class=\"actor-line\">\r\n <i class=\"feather-user\"></i>\r\n <span class=\"actor-full-name\" [title]=\"actor.actorFullname\">{{ actor.actorFullname\r\n }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-briefcase\"></i>\r\n <span [title]=\"actor.actorJobName\">{{ actor.actorJobName || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-mail\"></i>\r\n <span [title]=\"actor.actorEmail\">{{ actor.actorEmail }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-hash\"></i>\r\n <span [title]=\"actor.actorEmployeeCode\">{{ actor.actorEmployeeCode }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-check-circle\"></i>\r\n <span [title]=\"actor.status\">{{ actor.status || 'Pending' }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-clock\"></i>\r\n <span [title]=\"actor.votedAt\">{{ actor.votedAt | tableCell: 'DATE_TIME' : lang }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (!$steps().length) {\r\n <div class=\"step-column\">\r\n <div class=\"step-header empty\">No steps</div>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"workflow-wrapper\">\r\n <div class=\"step-column\">\r\n <div class=\"step-header empty\">\u26A0 No steps to display</div>\r\n </div>\r\n </div>\r\n }\r\n</div>", styles: [".runtime-routing-container{--card-height: 180px;font-size:13px}.runtime-routing-container .workflow-wrapper{display:flex;flex-direction:row;gap:64px;padding:24px;background:#f5f5f5;overflow-x:auto;min-width:576px;min-height:200px}.runtime-routing-container .workflow-wrapper .step-column{width:240px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;position:relative;min-height:100%}.runtime-routing-container .workflow-wrapper .step-header{position:relative;font-weight:600;font-size:14px;text-align:center;border:1px solid #ccc;border-radius:8px;box-shadow:0 1px 3px #0000001a;padding:6px 10px;margin-bottom:10px;width:100%;color:#fff}.runtime-routing-container .workflow-wrapper .step-header.submit{background-color:#00bcd4}.runtime-routing-container .workflow-wrapper .step-header.approval{background-color:#f80}.runtime-routing-container .workflow-wrapper .step-header.cc{background-color:#3370ff}.runtime-routing-container .workflow-wrapper .step-header.handle{background-color:#935af6}.runtime-routing-container .workflow-wrapper .step-header.end{background-color:#673ab7}.runtime-routing-container .workflow-wrapper .step-header.resolved{box-shadow:0 0 0 3px #4caf50 inset}.runtime-routing-container .workflow-wrapper .step-header.empty{box-shadow:0 0 0 3px #ff9800 inset}.runtime-routing-container .workflow-wrapper .step-header.fallback{box-shadow:0 0 0 3px #03a9f4 inset}.runtime-routing-container .workflow-wrapper .step-header.error{box-shadow:0 0 0 3px #f44336 inset}.runtime-routing-container .workflow-wrapper .actor-card-aux{position:relative}.runtime-routing-container .workflow-wrapper .actor-card.d-flex{display:flex;align-items:center;justify-content:flex-start;width:240px;height:var(--card-height);font-size:13px;border:1px solid #ccc;padding:0 12px;margin:8px auto;box-shadow:0 1px 3px #0000001a;position:relative;background-color:#fff;border-radius:8px}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .actor-details .actor-line>span{font-weight:700;width:140px;overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .actor-details .actor-line>span.actor-full-name{color:#000}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper{flex-shrink:0;margin-right:8px}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon{width:40px;height:40px;border-radius:50%;font-family:feather;font-size:40px}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.pending:after{content:\"\\e939\";color:#848484}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.sent:after{content:\"\\e92c\";color:#4caf50}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.approved:after{content:\"\\e92c\";color:#4caf50}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.skipped:after{content:\"\\e92c\";color:#4caf50}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.completed:after{content:\"\\e92c\";color:#4caf50}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper .status-icon.rejected:after{content:\"\\e9d0\";color:red}.runtime-routing-container .workflow-wrapper .actor-card.d-flex .actor-avatar{width:40px;height:40px;border-radius:50%;object-fit:cover;border:1px solid #ccc}.runtime-routing-container .workflow-wrapper .step-column:not(:first-child) .actor-card:before{content:\"\";position:absolute;top:50%;left:-20px;width:16px;height:2px;background-color:#ccc}.runtime-routing-container .workflow-wrapper .step-column:not(:first-child) .actor-card-aux:not(:last-child) .actor-card:after{content:\"\";position:absolute;top:50%;left:-20px;width:2px;height:calc(100% + 10px);background-color:#ccc}.runtime-routing-container .workflow-wrapper .step-column:not(:last-child) .actor-card-aux:before{content:\"\";position:absolute;top:50%;right:-16px;width:16px;height:2px;background-color:#ccc}.runtime-routing-container .workflow-wrapper .step-column:not(:last-child) .actor-card-aux:not(:last-child):after{content:\"\";position:absolute;top:50%;right:-16px;width:2px;height:calc(100% + 10px);background-color:#ccc}.runtime-routing-container .workflow-wrapper .step-column-aux{position:relative}.runtime-routing-container .workflow-wrapper .step-column:not(:last-child) .step-column-aux:after{content:\"\";position:absolute;top:calc(50% + 18.5px);right:-48px;width:32px;height:2px;background-color:#ccc}.runtime-routing-container .workflow-wrapper .actor-card.submit{background-color:#e0f7fa;border-left:4px solid #00bcd4}.runtime-routing-container .workflow-wrapper .actor-card.approval{background-color:#fff3e0;border-left:4px solid #f80}.runtime-routing-container .workflow-wrapper .actor-card.cc{background-color:#e6ecff;border-left:4px solid #3370ff}.runtime-routing-container .workflow-wrapper .actor-card.handle{background-color:#f3e6ff;border-left:4px solid #935af6}.runtime-routing-container .workflow-wrapper .actor-card.end{background-color:#ede7f6;border-left:4px solid #673ab7}.runtime-routing-container .workflow-wrapper .actor-line{display:flex;align-items:center;gap:6px;margin:2px 0;height:23.5px}.runtime-routing-container .workflow-wrapper .actor-line i{width:16px;height:16px;font-size:16px;color:#848484}.runtime-routing-container .workflow-wrapper .actor-line input.email-debug-input{border:1px dashed #00bcd4;background-color:#e0f7fa;width:140px;padding:0 8px}.runtime-routing-container .workflow-wrapper .actor-card span{display:block;color:#555;margin:2px 0}@media (max-width: 576px){.runtime-routing-container .workflow-wrapper .workflow-wrapper{flex-direction:column;align-items:center;gap:24px}.runtime-routing-container .workflow-wrapper .step-column{width:90vw}.runtime-routing-container .workflow-wrapper .actor-card{width:100%}}.runtime-routing-container .p-relative{position:relative}.runtime-routing-container .routing-preview-header{display:flex;align-items:center;justify-content:space-between;height:35px;margin-bottom:15px}.runtime-routing-container .routing-preview-header .button-group{display:flex;align-items:center;justify-content:flex-start;gap:8px;height:35px}.runtime-routing-container .routing-preview-header .button-group button{border-radius:0;color:#fff;height:35px;font-size:13px}.runtime-routing-container .routing-preview-header .debug-group{display:flex;align-items:center;justify-content:flex-start;height:35px}.runtime-routing-container .routing-preview-header .debug-group label{-webkit-user-select:none;user-select:none;margin-right:8px}.runtime-routing-container h5{padding:15px;color:#848484}.runtime-routing-container .resolved-steps pre{padding:15px}\n"] }]
47
- }], ctorParameters: () => [{ type: MultiLanguageService }] });
48
-
49
- class RuntimeLogsComponent extends BaseComponent {
50
- constructor() {
51
- super(...arguments);
52
- this.$instance = input(null);
53
- this.$logs = computed(() => this.$instance()?.workflowLogs);
54
- }
55
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: RuntimeLogsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
56
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: RuntimeLogsComponent, isStandalone: true, selector: "runtime-logs", inputs: { $instance: { classPropertyName: "$instance", publicName: "$instance", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div class=\"runtime-logs-wrapper\">\r\n <h4><i class=\"feather-list\"></i> Logs</h4>\r\n\r\n @if (!$logs()?.length) {\r\n <div class=\"empty-log\">\r\n <i class=\"feather-info\"></i> No logs available.\r\n </div>\r\n } @else {\r\n <ul class=\"log-list\">\r\n @for (log of $logs(); track log.id) {\r\n <li class=\"log-item\">\r\n <div class=\"log-icon\"><i class=\"feather-clock\"></i></div>\r\n <div class=\"log-content\">\r\n <div class=\"log-time\">{{ log.occurredAt | tableCell : 'DATE_TIME' : lang }}</div>\r\n <div class=\"log-text\">{{ log.logText }}</div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n</div>", styles: [".runtime-logs-wrapper{font-size:13px;padding:16px;background-color:#f9f9f9}.runtime-logs-wrapper h4{display:flex;align-items:center;gap:8px;color:#333;margin-bottom:12px}.runtime-logs-wrapper h4 i{font-size:16px;color:#666}.runtime-logs-wrapper .empty-log{display:flex;align-items:center;gap:6px;font-size:13px;color:#999;font-style:italic}.runtime-logs-wrapper .empty-log i{color:#ccc}.runtime-logs-wrapper .log-list{list-style:none;margin:0;padding:0}.runtime-logs-wrapper .log-list .log-item{display:flex;align-items:flex-start;padding:8px 0;border-bottom:1px dashed #ddd}.runtime-logs-wrapper .log-list .log-item:last-child{border-bottom:none}.runtime-logs-wrapper .log-list .log-item .log-icon{margin-right:10px;color:#555;padding-top:2px}.runtime-logs-wrapper .log-list .log-item .log-content{flex:1}.runtime-logs-wrapper .log-list .log-item .log-content .log-time{font-size:12px;color:#888;margin-bottom:2px}.runtime-logs-wrapper .log-list .log-item .log-content .log-text{font-family:monospace;white-space:pre-wrap;color:#333}\n"], dependencies: [{ kind: "pipe", type: TableCellPipe // usage: value | tableCell : 'DATE_TIME' : lang
57
- , name: "tableCell" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
58
- }
59
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: RuntimeLogsComponent, decorators: [{
60
- type: Component,
61
- args: [{ selector: 'runtime-logs', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
62
- TableCellPipe // usage: value | tableCell : 'DATE_TIME' : lang
63
- ], template: "<div class=\"runtime-logs-wrapper\">\r\n <h4><i class=\"feather-list\"></i> Logs</h4>\r\n\r\n @if (!$logs()?.length) {\r\n <div class=\"empty-log\">\r\n <i class=\"feather-info\"></i> No logs available.\r\n </div>\r\n } @else {\r\n <ul class=\"log-list\">\r\n @for (log of $logs(); track log.id) {\r\n <li class=\"log-item\">\r\n <div class=\"log-icon\"><i class=\"feather-clock\"></i></div>\r\n <div class=\"log-content\">\r\n <div class=\"log-time\">{{ log.occurredAt | tableCell : 'DATE_TIME' : lang }}</div>\r\n <div class=\"log-text\">{{ log.logText }}</div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n</div>", styles: [".runtime-logs-wrapper{font-size:13px;padding:16px;background-color:#f9f9f9}.runtime-logs-wrapper h4{display:flex;align-items:center;gap:8px;color:#333;margin-bottom:12px}.runtime-logs-wrapper h4 i{font-size:16px;color:#666}.runtime-logs-wrapper .empty-log{display:flex;align-items:center;gap:6px;font-size:13px;color:#999;font-style:italic}.runtime-logs-wrapper .empty-log i{color:#ccc}.runtime-logs-wrapper .log-list{list-style:none;margin:0;padding:0}.runtime-logs-wrapper .log-list .log-item{display:flex;align-items:flex-start;padding:8px 0;border-bottom:1px dashed #ddd}.runtime-logs-wrapper .log-list .log-item:last-child{border-bottom:none}.runtime-logs-wrapper .log-list .log-item .log-icon{margin-right:10px;color:#555;padding-top:2px}.runtime-logs-wrapper .log-list .log-item .log-content{flex:1}.runtime-logs-wrapper .log-list .log-item .log-content .log-time{font-size:12px;color:#888;margin-bottom:2px}.runtime-logs-wrapper .log-list .log-item .log-content .log-text{font-family:monospace;white-space:pre-wrap;color:#333}\n"] }]
64
- }] });
65
-
66
- class WfInstanceStatusComponent extends BaseComponent {
67
- refresh() {
68
- const correlationId = this.$correlationId();
69
- if (!!correlationId) {
70
- this.subscriptions.push(this.appService.get(`/api/WorkflowEngine/GetStatus?correlationId=${correlationId}&usehub=true`).pipe(tap(_ => this.$loading.set(true)), catchError(err => {
71
- this.$loading.set(false);
72
- const msg = err?.error?.message || // API-defined message
73
- err?.message || // Native JS or HttpErrorResponse
74
- err?.statusText || // Fallback
75
- 'An unknown error occurred.';
76
- return of({ ok: false, status: 500, body: { messageCode: msg } });
77
- })).subscribe(x => {
78
- this.$loading.set(false);
79
- if (x.ok && x.status === 200 && x.body?.statusCode === 200) {
80
- const raw = x.body.innerBody;
81
- raw.attributes = JSON.parse(raw.attributesJson);
82
- raw.stepProgresses.forEach(step => {
83
- if (!!step.exeConfigJson) {
84
- step.exeConfig = JSON.parse(step.exeConfigJson);
85
- }
86
- else {
87
- step.exeConfig = {};
88
- }
89
- });
90
- this.$instance.set(raw);
91
- }
92
- }));
93
- }
94
- }
95
- constructor(mls, ss, as) {
96
- super(mls);
97
- this.mls = mls;
98
- this.ss = ss;
99
- this.as = as;
100
- this.route = inject(ActivatedRoute);
101
- this.appService = inject(AppService);
102
- this.$loading = signal(true);
103
- this.$instance = signal(null);
104
- this.$error = signal(null);
105
- this.$correlationId = signal(null);
106
- // $inputSteps = signal<IRoutingStep[]>([]);
107
- this.$attributesBeauty = computed(() => {
108
- return JSON.stringify((this.$instance()?.attributes ?? {}), null, 2);
109
- });
110
- this.$isExpanded = signal(false);
111
- effect(() => {
112
- const status = ss.$workflowTicket();
113
- this.as.info("The status has been changed", alertOptions);
114
- if (status?.correlationId === this.$correlationId()) {
115
- this.refresh();
116
- }
117
- });
118
- this.subscriptions.push(this.route.paramMap.subscribe(p => {
119
- const correlationId = p.get('id');
120
- this.$correlationId.set(correlationId);
121
- }));
122
- effect(() => {
123
- const _ = this.$correlationId();
124
- this.refresh();
125
- });
126
- }
127
- toggleAccordion() {
128
- this.$isExpanded.set(!this.$isExpanded());
129
- }
130
- copy(value) {
131
- if (!value)
132
- return;
133
- navigator.clipboard.writeText(value.toString()).then(() => {
134
- this.as.success('Copied!', alertOptions);
135
- });
136
- }
137
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: WfInstanceStatusComponent, deps: [{ token: MultiLanguageService }, { token: SocketService }, { token: AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
138
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: WfInstanceStatusComponent, isStandalone: true, selector: "wf-instance-status", usesInheritance: true, ngImport: i0, template: "<div class=\"wf-instance-status-container\">\r\n <core-page-header [title]=\"'Workflow Instance Status'\" />\r\n\r\n <div class=\"status-parts\">\r\n <div class=\"saga\">\r\n @if ($loading()) {\r\n <p class=\"wf-status-loading\">\r\n <core-terminal-spinner />\r\n </p>\r\n } @else if ($error()) {\r\n <p class=\"wf-status-error\">\u26A0\uFE0F {{ $error() }}</p>\r\n } @else if (!$instance()) {\r\n <p class=\"wf-status-empty\">No instance data found.</p>\r\n } @else {\r\n <div class=\"wf-status-card\">\r\n\r\n <!-- Workflow Info -->\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Workflow Name:</label>\r\n <span>{{ $instance()!.workflowName }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Current State:</label>\r\n <span class=\"wf-status-badge1 wf-status-{{ $instance()!.currentState.toLowerCase() }}\">\r\n {{ $instance()!.currentState }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Current Step:</label>\r\n <span>{{ $instance()!.currentStepName || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Last Action At:</label>\r\n <span>{{ $instance()!.lastActionAt | tableCell : 'DATE_TIME' : lang }}</span>\r\n </div>\r\n\r\n <!-- First Actor Info -->\r\n <div class=\"wf-status-subtitle\">\uD83D\uDCCC First Actor</div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Full Name:</label>\r\n <span>{{ $instance()!.firstActorFullname }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Email:</label>\r\n <span>{{ $instance()!.firstActorEmail }}</span>\r\n </div>\r\n\r\n <!-- Last Actor Info -->\r\n <div class=\"wf-status-subtitle\">\uD83D\uDD0D Last Actor</div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Full Name:</label>\r\n <span>{{ $instance()!.lastActorFullname || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Email:</label>\r\n <span>{{ $instance()!.lastActorEmail || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Employee Code:</label>\r\n <span>{{ $instance()!.lastActorEmployeeCode || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Position Name:</label>\r\n <span>{{ $instance()!.lastActorPositionName || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Job Name:</label>\r\n <span>{{ $instance()!.lastActorJobName || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>System Messages:</label>\r\n <span>{{ $instance()!.systemMessages || '\u2014' }}</span>\r\n </div>\r\n\r\n <!-- Show More Section -->\r\n\r\n <div class=\"wf-status-accordion\">\r\n <button class=\"accordion-summary\" (click)=\"toggleAccordion()\">\r\n <span><i [ngClass]=\"$isExpanded() ? 'feather-minus' : 'feather-plus'\"></i></span> {{ $isExpanded() ? 'Hide Details' : 'Show More' }}\r\n </button>\r\n\r\n <div class=\"accordion-body\" [style.maxHeight]=\"$isExpanded() ? '1000px' : '0'\"\r\n [style.opacity]=\"$isExpanded() ? '1' : '0'\" [style.pointerEvents]=\"$isExpanded() ? 'auto' : 'none'\">\r\n <div class=\"wf-status-row\">\r\n <label>Workflow ID:</label>\r\n <span>\r\n {{ $instance()!.workflowId }}\r\n </span>\r\n <button type=\"button\" (click)=\"copy($instance()!.workflowId)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Employee ID:</label>\r\n <span>\r\n {{ $instance()!.lastActorEmployeeId }}\r\n </span>\r\n <button type=\"button\" (click)=\"copy($instance()!.lastActorEmployeeId)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Last Triggered Step ID:</label>\r\n <span>\r\n {{ $instance()!.lastTriggeredStepId || '\u2014' }}\r\n </span>\r\n @if ($instance()!.lastTriggeredStepId) {\r\n <button type=\"button\" (click)=\"copy($instance()!.lastTriggeredStepId)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n }\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Attributes JSON:</label>\r\n <span>\r\n <code>{{ $attributesBeauty() }}</code>\r\n </span>\r\n <button type=\"button\" (click)=\"copy($instance()!.attributesJson)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Debug Mode:</label>\r\n <span>{{ $instance()!.isDebug ? '\u2714 Enabled' : '\u274C Disabled' }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"runtime-routing-n-logs\">\r\n <runtime-routing [$instance]=\"$instance()\" />\r\n <div class=\"h15\"></div>\r\n <runtime-logs [$instance]=\"$instance()\" />\r\n </div>\r\n </div>\r\n</div>", styles: [".wf-instance-status-container .status-parts{display:flex;width:100%;overflow:auto}.wf-instance-status-container .status-parts .saga{width:480px;padding:15px;background-color:#fdfdfd;border:1px solid #e5e7eb;font-size:13px;display:inline-block}.wf-instance-status-container .status-parts .saga .wf-status-title{margin-bottom:1.5rem;color:#1f2937}.wf-instance-status-container .status-parts .saga .wf-status-loading,.wf-instance-status-container .status-parts .saga .wf-status-empty{color:#3b82f6}.wf-instance-status-container .status-parts .saga .wf-status-error{color:#dc2626}.wf-instance-status-container .status-parts .saga .wf-status-card{background-color:#fff;padding:15px;border:1px solid #d1d5db;display:flex;flex-direction:column;gap:8px}.wf-instance-status-container .status-parts .saga .wf-status-section-title{background-color:#e0f2fe;color:#0284c7;padding:15px;border-left:4px solid #38bdf8;border-radius:4px;margin-bottom:.25rem}.wf-instance-status-container .status-parts .saga .wf-status-row{display:flex;justify-content:space-between;align-items:flex-start;gap:8px;border-bottom:1px dashed #e5e7eb;padding-bottom:8px}.wf-instance-status-container .status-parts .saga .wf-status-row label{color:#374151;width:120px}.wf-instance-status-container .status-parts .saga .wf-status-row span{font-family:monospace;color:#111827;width:280px}.wf-instance-status-container .status-parts .saga .wf-status-row span:not(:has(code)){overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap}.wf-instance-status-container .status-parts .saga .wf-status-badge{display:inline-block;padding:15px;border-radius:9999px;text-transform:uppercase}.wf-instance-status-container .status-parts .saga .wf-status-approved{background-color:#d1fae5;color:#065f46}.wf-instance-status-container .status-parts .saga .wf-status-rejected{background-color:#fee2e2;color:#991b1b}.wf-instance-status-container .status-parts .saga .wf-status-in_progress{background-color:#fef3c7;color:#92400e}.wf-instance-status-container .status-parts .saga .wf-status-debug-true{background-color:#e0f2fe;color:#0369a1;padding:15px}.wf-instance-status-container .status-parts .saga .wf-status-debug-false{background-color:#f3f4f6;color:#6b7280;padding:15px}.wf-instance-status-container .status-parts .saga .wf-status-actor-card{background-color:#f0fdf4;border:1px dashed #34d399;padding:15px;display:flex;flex-direction:column;gap:.5rem}.wf-instance-status-container .status-parts .saga .wf-status-actor-card .wf-status-row{border:none;padding:0}.wf-instance-status-container .status-parts .saga .wf-status-actor-card label,.wf-instance-status-container .status-parts .saga .wf-status-actor-card span{color:#065f46}.wf-instance-status-container .status-parts .saga .wf-status-accordion{margin-top:1rem;border-top:1px dashed #ccc;padding-top:1rem}.wf-instance-status-container .status-parts .saga .accordion-summary{background:none;border:none;cursor:pointer;padding:.5rem 0;color:#444;transition:color .2s}.wf-instance-status-container .status-parts .saga .accordion-summary:hover{color:#000}.wf-instance-status-container .status-parts .saga .accordion-body{overflow:hidden;transition:max-height .3s ease,opacity .3s ease}.wf-instance-status-container .status-parts .saga .copy-btn{background:none;border:none;cursor:pointer;font-size:1em;margin-left:.5rem;color:#888}.wf-instance-status-container .status-parts .saga .copy-btn:hover{color:#000}.wf-instance-status-container .status-parts .runtime-routing-n-logs{margin-left:15px;display:inline-block}.wf-instance-status-container .status-parts .runtime-routing-n-logs .h15{height:15px}\n"], dependencies: [{ kind: "pipe", type: TableCellPipe, name: "tableCell" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup", "htmlTooltipRef"], outputs: ["buttonClick"] }, { kind: "component", type: CoreTerminalSpinnerComponent, selector: "core-terminal-spinner" }, { kind: "component", type: RuntimeRoutingComponent, selector: "runtime-routing", inputs: ["$instance"] }, { kind: "component", type: RuntimeLogsComponent, selector: "runtime-logs", inputs: ["$instance"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
139
- }
140
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: WfInstanceStatusComponent, decorators: [{
141
- type: Component,
142
- args: [{ selector: 'wf-instance-status', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
143
- TableCellPipe,
144
- NgClass,
145
- CorePageHeaderComponent,
146
- CoreTerminalSpinnerComponent,
147
- RuntimeRoutingComponent,
148
- RuntimeLogsComponent,
149
- ], template: "<div class=\"wf-instance-status-container\">\r\n <core-page-header [title]=\"'Workflow Instance Status'\" />\r\n\r\n <div class=\"status-parts\">\r\n <div class=\"saga\">\r\n @if ($loading()) {\r\n <p class=\"wf-status-loading\">\r\n <core-terminal-spinner />\r\n </p>\r\n } @else if ($error()) {\r\n <p class=\"wf-status-error\">\u26A0\uFE0F {{ $error() }}</p>\r\n } @else if (!$instance()) {\r\n <p class=\"wf-status-empty\">No instance data found.</p>\r\n } @else {\r\n <div class=\"wf-status-card\">\r\n\r\n <!-- Workflow Info -->\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Workflow Name:</label>\r\n <span>{{ $instance()!.workflowName }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Current State:</label>\r\n <span class=\"wf-status-badge1 wf-status-{{ $instance()!.currentState.toLowerCase() }}\">\r\n {{ $instance()!.currentState }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Current Step:</label>\r\n <span>{{ $instance()!.currentStepName || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Last Action At:</label>\r\n <span>{{ $instance()!.lastActionAt | tableCell : 'DATE_TIME' : lang }}</span>\r\n </div>\r\n\r\n <!-- First Actor Info -->\r\n <div class=\"wf-status-subtitle\">\uD83D\uDCCC First Actor</div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Full Name:</label>\r\n <span>{{ $instance()!.firstActorFullname }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Email:</label>\r\n <span>{{ $instance()!.firstActorEmail }}</span>\r\n </div>\r\n\r\n <!-- Last Actor Info -->\r\n <div class=\"wf-status-subtitle\">\uD83D\uDD0D Last Actor</div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Full Name:</label>\r\n <span>{{ $instance()!.lastActorFullname || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Email:</label>\r\n <span>{{ $instance()!.lastActorEmail || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Employee Code:</label>\r\n <span>{{ $instance()!.lastActorEmployeeCode || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Position Name:</label>\r\n <span>{{ $instance()!.lastActorPositionName || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Job Name:</label>\r\n <span>{{ $instance()!.lastActorJobName || '\u2014' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>System Messages:</label>\r\n <span>{{ $instance()!.systemMessages || '\u2014' }}</span>\r\n </div>\r\n\r\n <!-- Show More Section -->\r\n\r\n <div class=\"wf-status-accordion\">\r\n <button class=\"accordion-summary\" (click)=\"toggleAccordion()\">\r\n <span><i [ngClass]=\"$isExpanded() ? 'feather-minus' : 'feather-plus'\"></i></span> {{ $isExpanded() ? 'Hide Details' : 'Show More' }}\r\n </button>\r\n\r\n <div class=\"accordion-body\" [style.maxHeight]=\"$isExpanded() ? '1000px' : '0'\"\r\n [style.opacity]=\"$isExpanded() ? '1' : '0'\" [style.pointerEvents]=\"$isExpanded() ? 'auto' : 'none'\">\r\n <div class=\"wf-status-row\">\r\n <label>Workflow ID:</label>\r\n <span>\r\n {{ $instance()!.workflowId }}\r\n </span>\r\n <button type=\"button\" (click)=\"copy($instance()!.workflowId)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Employee ID:</label>\r\n <span>\r\n {{ $instance()!.lastActorEmployeeId }}\r\n </span>\r\n <button type=\"button\" (click)=\"copy($instance()!.lastActorEmployeeId)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Last Triggered Step ID:</label>\r\n <span>\r\n {{ $instance()!.lastTriggeredStepId || '\u2014' }}\r\n </span>\r\n @if ($instance()!.lastTriggeredStepId) {\r\n <button type=\"button\" (click)=\"copy($instance()!.lastTriggeredStepId)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n }\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Attributes JSON:</label>\r\n <span>\r\n <code>{{ $attributesBeauty() }}</code>\r\n </span>\r\n <button type=\"button\" (click)=\"copy($instance()!.attributesJson)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Debug Mode:</label>\r\n <span>{{ $instance()!.isDebug ? '\u2714 Enabled' : '\u274C Disabled' }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"runtime-routing-n-logs\">\r\n <runtime-routing [$instance]=\"$instance()\" />\r\n <div class=\"h15\"></div>\r\n <runtime-logs [$instance]=\"$instance()\" />\r\n </div>\r\n </div>\r\n</div>", styles: [".wf-instance-status-container .status-parts{display:flex;width:100%;overflow:auto}.wf-instance-status-container .status-parts .saga{width:480px;padding:15px;background-color:#fdfdfd;border:1px solid #e5e7eb;font-size:13px;display:inline-block}.wf-instance-status-container .status-parts .saga .wf-status-title{margin-bottom:1.5rem;color:#1f2937}.wf-instance-status-container .status-parts .saga .wf-status-loading,.wf-instance-status-container .status-parts .saga .wf-status-empty{color:#3b82f6}.wf-instance-status-container .status-parts .saga .wf-status-error{color:#dc2626}.wf-instance-status-container .status-parts .saga .wf-status-card{background-color:#fff;padding:15px;border:1px solid #d1d5db;display:flex;flex-direction:column;gap:8px}.wf-instance-status-container .status-parts .saga .wf-status-section-title{background-color:#e0f2fe;color:#0284c7;padding:15px;border-left:4px solid #38bdf8;border-radius:4px;margin-bottom:.25rem}.wf-instance-status-container .status-parts .saga .wf-status-row{display:flex;justify-content:space-between;align-items:flex-start;gap:8px;border-bottom:1px dashed #e5e7eb;padding-bottom:8px}.wf-instance-status-container .status-parts .saga .wf-status-row label{color:#374151;width:120px}.wf-instance-status-container .status-parts .saga .wf-status-row span{font-family:monospace;color:#111827;width:280px}.wf-instance-status-container .status-parts .saga .wf-status-row span:not(:has(code)){overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap}.wf-instance-status-container .status-parts .saga .wf-status-badge{display:inline-block;padding:15px;border-radius:9999px;text-transform:uppercase}.wf-instance-status-container .status-parts .saga .wf-status-approved{background-color:#d1fae5;color:#065f46}.wf-instance-status-container .status-parts .saga .wf-status-rejected{background-color:#fee2e2;color:#991b1b}.wf-instance-status-container .status-parts .saga .wf-status-in_progress{background-color:#fef3c7;color:#92400e}.wf-instance-status-container .status-parts .saga .wf-status-debug-true{background-color:#e0f2fe;color:#0369a1;padding:15px}.wf-instance-status-container .status-parts .saga .wf-status-debug-false{background-color:#f3f4f6;color:#6b7280;padding:15px}.wf-instance-status-container .status-parts .saga .wf-status-actor-card{background-color:#f0fdf4;border:1px dashed #34d399;padding:15px;display:flex;flex-direction:column;gap:.5rem}.wf-instance-status-container .status-parts .saga .wf-status-actor-card .wf-status-row{border:none;padding:0}.wf-instance-status-container .status-parts .saga .wf-status-actor-card label,.wf-instance-status-container .status-parts .saga .wf-status-actor-card span{color:#065f46}.wf-instance-status-container .status-parts .saga .wf-status-accordion{margin-top:1rem;border-top:1px dashed #ccc;padding-top:1rem}.wf-instance-status-container .status-parts .saga .accordion-summary{background:none;border:none;cursor:pointer;padding:.5rem 0;color:#444;transition:color .2s}.wf-instance-status-container .status-parts .saga .accordion-summary:hover{color:#000}.wf-instance-status-container .status-parts .saga .accordion-body{overflow:hidden;transition:max-height .3s ease,opacity .3s ease}.wf-instance-status-container .status-parts .saga .copy-btn{background:none;border:none;cursor:pointer;font-size:1em;margin-left:.5rem;color:#888}.wf-instance-status-container .status-parts .saga .copy-btn:hover{color:#000}.wf-instance-status-container .status-parts .runtime-routing-n-logs{margin-left:15px;display:inline-block}.wf-instance-status-container .status-parts .runtime-routing-n-logs .h15{height:15px}\n"] }]
150
- }], ctorParameters: () => [{ type: MultiLanguageService }, { type: SocketService }, { type: AlertService }] });
151
-
152
- export { WfInstanceStatusComponent };
153
- //# sourceMappingURL=ngx-histaff-alpha-wf-instance-status.component-DQfVNySE.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngx-histaff-alpha-wf-instance-status.component-DQfVNySE.mjs","sources":["../../../projects/ngx-histaff-alpha/src/lib/app/libraries/core-workflow-builder/runtime-routing/runtime-routing.component.ts","../../../projects/ngx-histaff-alpha/src/lib/app/libraries/core-workflow-builder/runtime-routing/runtime-routing.component.html","../../../projects/ngx-histaff-alpha/src/lib/app/libraries/core-workflow-builder/runtime-logs/runtime-logs.component.ts","../../../projects/ngx-histaff-alpha/src/lib/app/libraries/core-workflow-builder/runtime-logs/runtime-logs.component.html","../../../projects/ngx-histaff-alpha/src/lib/app/libraries/core-workflow-builder/wf-instance-status/wf-instance-status.component.ts","../../../projects/ngx-histaff-alpha/src/lib/app/libraries/core-workflow-builder/wf-instance-status/wf-instance-status.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, inject, input, Input } from '@angular/core';\r\nimport { IWorkflowInstance } from '../interfaces/IWorkflowInstance';\r\nimport { IWorkflowStepProgress } from '../interfaces/IWorkflowStepProgress';\r\nimport { IWorkflowStepProgressActor } from '../interfaces/IWorkflowStepProgressActor';\r\nimport { ImageErrorResolverDirective } from '../../../directives/image-error-resolver.directive';\r\nimport { MapAvatarToServerPipe } from '../../../app-pipes/map-avatar-to-server.pipe';\r\nimport { TableCellPipe } from '../../pipes/table-cell.pipe';\r\nimport { BaseComponent } from '../../base-component/base/base.component';\r\nimport { JsonPipe, NgClass } from '@angular/common';\r\nimport { SocketService } from '../../../services/socket.service';\r\nimport { MultiLanguageService } from '../../../services/multi-language.service';\r\nimport { AlertService } from '../../alert/alert.service';\r\nimport { alertOptions } from '../../../constants/alertOptions';\r\n\r\n@Component({\r\n selector: 'runtime-routing',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n NgClass,\r\n ImageErrorResolverDirective,\r\n MapAvatarToServerPipe,\r\n TableCellPipe,\r\n JsonPipe,\r\n ],\r\n templateUrl: './runtime-routing.component.html',\r\n styleUrl: './runtime-routing.component.scss'\r\n})\r\nexport class RuntimeRoutingComponent extends BaseComponent {\r\n $instance = input<IWorkflowInstance | null>();\r\n\r\n as = inject(AlertService);\r\n\r\n $steps = computed(() => {\r\n const stepProgresses = this.$instance()?.stepProgresses ?? [];\r\n stepProgresses.forEach(s => {\r\n if (!!s.exeConfigJson) {\r\n s.exeConfig = JSON.parse(s.exeConfigJson);\r\n } else {\r\n s.exeConfig = {};\r\n }\r\n \r\n })\r\n stepProgresses.sort((a, b) => a.stepOrder - b.stepOrder);\r\n return [...stepProgresses];\r\n })\r\n\r\n getStepStatusClass(step: IWorkflowStepProgress): string {\r\n if (step.passed === true) return 'resolved';\r\n if (step.passed === false) return 'error';\r\n return 'empty';\r\n }\r\n\r\n constructor(public override mls: MultiLanguageService) {\r\n super(mls);\r\n }\r\n}\r\n","<div class=\"runtime-routing-container inter-font p-relative\">\r\n @if ($instance() && $steps()?.length) {\r\n <div class=\"workflow-wrapper\">\r\n @for (step of $steps(); track step.id) {\r\n\r\n <div class=\"step-column\" [attr.data-actor-count]=\"step.stepProgressActors?.length\">\r\n\r\n <div class=\"step-column-aux\">\r\n <div [ngClass]=\"step.exeConfig?.routingLogic ?? ''\" class=\"step-header {{ step.stepType.toLowerCase() }} {{ getStepStatusClass(step) }}\">\r\n {{ step.stepName }}\r\n </div>\r\n\r\n @for (actor of step.stepProgressActors; track actor.id) {\r\n <div class=\"actor-card-aux\">\r\n <div class=\"actor-card d-flex d-flex-start {{ step.stepType.toLowerCase() }}\">\r\n <div class=\"avatar-wrapper\">\r\n <img [src]=\"actor.actorAvatar\"\r\n appImageErrorResolver\r\n [type]=\"'AVATAR'\"\r\n [isFemale]=\"!!actor.isFemale!\"\r\n class=\"actor-avatar\" [alt]=\"actor.actorFullname\" />\r\n <div class=\"status-icon\" [ngClass]=\"(actor.status || 'pending').toLowerCase()\">\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"actor-details\">\r\n <div class=\"actor-line\">\r\n <i class=\"feather-user\"></i>\r\n <span class=\"actor-full-name\" [title]=\"actor.actorFullname\">{{ actor.actorFullname\r\n }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-briefcase\"></i>\r\n <span [title]=\"actor.actorJobName\">{{ actor.actorJobName || '—' }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-mail\"></i>\r\n <span [title]=\"actor.actorEmail\">{{ actor.actorEmail }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-hash\"></i>\r\n <span [title]=\"actor.actorEmployeeCode\">{{ actor.actorEmployeeCode }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-check-circle\"></i>\r\n <span [title]=\"actor.status\">{{ actor.status || 'Pending' }}</span>\r\n </div>\r\n\r\n <div class=\"actor-line\">\r\n <i class=\"feather-clock\"></i>\r\n <span [title]=\"actor.votedAt\">{{ actor.votedAt | tableCell: 'DATE_TIME' : lang }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (!$steps().length) {\r\n <div class=\"step-column\">\r\n <div class=\"step-header empty\">No steps</div>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"workflow-wrapper\">\r\n <div class=\"step-column\">\r\n <div class=\"step-header empty\">⚠ No steps to display</div>\r\n </div>\r\n </div>\r\n }\r\n</div>","import { ChangeDetectionStrategy, Component, computed, input, Input } from '@angular/core';\r\nimport { IWorkflowInstance } from '../interfaces/IWorkflowInstance';\r\nimport { IWorkflowStepProgress } from '../interfaces/IWorkflowStepProgress';\r\nimport { IWorkflowStepProgressActor } from '../interfaces/IWorkflowStepProgressActor';\r\nimport { ImageErrorResolverDirective } from '../../../directives/image-error-resolver.directive';\r\nimport { MapAvatarToServerPipe } from '../../../app-pipes/map-avatar-to-server.pipe';\r\nimport { TableCellPipe } from '../../pipes/table-cell.pipe';\r\nimport { BaseComponent } from '../../base-component/base/base.component';\r\nimport { JsonPipe } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'runtime-logs',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n TableCellPipe // usage: value | tableCell : 'DATE_TIME' : lang\r\n ],\r\n templateUrl: './runtime-logs.component.html',\r\n styleUrl: './runtime-logs.component.scss'\r\n})\r\nexport class RuntimeLogsComponent extends BaseComponent {\r\n $instance = input<IWorkflowInstance | null>(null);\r\n\r\n $logs = computed(() => this.$instance()?.workflowLogs);\r\n}\r\n","<div class=\"runtime-logs-wrapper\">\r\n <h4><i class=\"feather-list\"></i> Logs</h4>\r\n\r\n @if (!$logs()?.length) {\r\n <div class=\"empty-log\">\r\n <i class=\"feather-info\"></i> No logs available.\r\n </div>\r\n } @else {\r\n <ul class=\"log-list\">\r\n @for (log of $logs(); track log.id) {\r\n <li class=\"log-item\">\r\n <div class=\"log-icon\"><i class=\"feather-clock\"></i></div>\r\n <div class=\"log-content\">\r\n <div class=\"log-time\">{{ log.occurredAt | tableCell : 'DATE_TIME' : lang }}</div>\r\n <div class=\"log-text\">{{ log.logText }}</div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n</div>","import { ChangeDetectionStrategy, Component, computed, effect, inject, signal } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { AppService } from '../../../services/app.service';\r\nimport { BaseComponent } from '../../base-component/base/base.component';\r\nimport { MultiLanguageService } from '../../../services/multi-language.service';\r\nimport { catchError, of, tap } from 'rxjs';\r\nimport { TableCellPipe } from '../../pipes/table-cell.pipe';\r\nimport { SocketService } from '../../../services/socket.service';\r\nimport { CorePageHeaderComponent } from '../../core-page-header/core-page-header/core-page-header.component';\r\nimport { CoreTerminalSpinnerComponent } from '../../core-terminal-spinner/core-terminal-spinner.component';\r\nimport { IWorkflowInstance } from '../interfaces/IWorkflowInstance';\r\nimport { RuntimeRoutingComponent } from '../runtime-routing/runtime-routing.component';\r\nimport { IRoutingStep } from '../interfaces/IRoutingStep';\r\nimport { AlertService } from '../../alert/alert.service';\r\nimport { alertOptions } from '../../../constants/alertOptions';\r\nimport { RuntimeLogsComponent } from '../runtime-logs/runtime-logs.component';\r\nimport { NgClass } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'wf-instance-status',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n TableCellPipe,\r\n NgClass,\r\n CorePageHeaderComponent,\r\n CoreTerminalSpinnerComponent,\r\n RuntimeRoutingComponent,\r\n RuntimeLogsComponent,\r\n ],\r\n templateUrl: './wf-instance-status.component.html',\r\n styleUrl: './wf-instance-status.component.scss'\r\n})\r\n\r\nexport class WfInstanceStatusComponent extends BaseComponent {\r\n route = inject(ActivatedRoute);\r\n appService = inject(AppService);\r\n\r\n $loading = signal(true);\r\n $instance = signal<IWorkflowInstance | null>(null);\r\n $error = signal<string | null>(null);\r\n $correlationId = signal<string | null>(null);\r\n // $inputSteps = signal<IRoutingStep[]>([]);\r\n\r\n $attributesBeauty = computed(() => {\r\n return JSON.stringify((this.$instance()?.attributes ?? {}), null, 2);\r\n })\r\n\r\n $isExpanded = signal(false);\r\n\r\n refresh(): void {\r\n const correlationId = this.$correlationId();\r\n if (!!correlationId) {\r\n this.subscriptions.push(\r\n this.appService.get(`/api/WorkflowEngine/GetStatus?correlationId=${correlationId}&usehub=true`).pipe(\r\n tap(_ => this.$loading.set(true)),\r\n catchError(err => {\r\n this.$loading.set(false);\r\n const msg =\r\n err?.error?.message || // API-defined message\r\n err?.message || // Native JS or HttpErrorResponse\r\n err?.statusText || // Fallback\r\n 'An unknown error occurred.';\r\n return of({ ok: false, status: 500, body: { messageCode: msg } });\r\n })\r\n ).subscribe(x => {\r\n this.$loading.set(false);\r\n if (x.ok && x.status === 200 && x.body?.statusCode === 200) {\r\n\r\n const raw: IWorkflowInstance = x.body.innerBody;\r\n raw.attributes = JSON.parse(raw.attributesJson);\r\n\r\n raw.stepProgresses.forEach(step => {\r\n if (!!step.exeConfigJson) {\r\n step.exeConfig = JSON.parse(step.exeConfigJson);\r\n } else {\r\n step.exeConfig = {};\r\n }\r\n })\r\n\r\n this.$instance.set(raw);\r\n\r\n }\r\n })\r\n )\r\n }\r\n }\r\n\r\n constructor(\r\n public override mls: MultiLanguageService,\r\n private ss: SocketService,\r\n private as: AlertService,\r\n ) {\r\n super(mls);\r\n\r\n effect(() => {\r\n const status = ss.$workflowTicket();\r\n this.as.info(\"The status has been changed\", alertOptions);\r\n if (status?.correlationId === this.$correlationId()) {\r\n this.refresh();\r\n }\r\n })\r\n\r\n this.subscriptions.push(\r\n this.route.paramMap.subscribe(p => {\r\n const correlationId = p.get('id');\r\n this.$correlationId.set(correlationId);\r\n })\r\n )\r\n\r\n effect(() => {\r\n const _ = this.$correlationId();\r\n this.refresh();\r\n })\r\n }\r\n\r\n toggleAccordion(): void {\r\n this.$isExpanded.set(!this.$isExpanded());\r\n }\r\n\r\n copy(value: string | number | undefined | null): void {\r\n if (!value) return;\r\n navigator.clipboard.writeText(value.toString()).then(() => {\r\n this.as.success('Copied!', alertOptions);\r\n });\r\n }\r\n\r\n\r\n}\r\n","<div class=\"wf-instance-status-container\">\r\n <core-page-header [title]=\"'Workflow Instance Status'\" />\r\n\r\n <div class=\"status-parts\">\r\n <div class=\"saga\">\r\n @if ($loading()) {\r\n <p class=\"wf-status-loading\">\r\n <core-terminal-spinner />\r\n </p>\r\n } @else if ($error()) {\r\n <p class=\"wf-status-error\">⚠️ {{ $error() }}</p>\r\n } @else if (!$instance()) {\r\n <p class=\"wf-status-empty\">No instance data found.</p>\r\n } @else {\r\n <div class=\"wf-status-card\">\r\n\r\n <!-- Workflow Info -->\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Workflow Name:</label>\r\n <span>{{ $instance()!.workflowName }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Current State:</label>\r\n <span class=\"wf-status-badge1 wf-status-{{ $instance()!.currentState.toLowerCase() }}\">\r\n {{ $instance()!.currentState }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Current Step:</label>\r\n <span>{{ $instance()!.currentStepName || '—' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Last Action At:</label>\r\n <span>{{ $instance()!.lastActionAt | tableCell : 'DATE_TIME' : lang }}</span>\r\n </div>\r\n\r\n <!-- First Actor Info -->\r\n <div class=\"wf-status-subtitle\">📌 First Actor</div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Full Name:</label>\r\n <span>{{ $instance()!.firstActorFullname }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Email:</label>\r\n <span>{{ $instance()!.firstActorEmail }}</span>\r\n </div>\r\n\r\n <!-- Last Actor Info -->\r\n <div class=\"wf-status-subtitle\">🔍 Last Actor</div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Full Name:</label>\r\n <span>{{ $instance()!.lastActorFullname || '—' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Email:</label>\r\n <span>{{ $instance()!.lastActorEmail || '—' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Employee Code:</label>\r\n <span>{{ $instance()!.lastActorEmployeeCode || '—' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Position Name:</label>\r\n <span>{{ $instance()!.lastActorPositionName || '—' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Job Name:</label>\r\n <span>{{ $instance()!.lastActorJobName || '—' }}</span>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>System Messages:</label>\r\n <span>{{ $instance()!.systemMessages || '—' }}</span>\r\n </div>\r\n\r\n <!-- Show More Section -->\r\n\r\n <div class=\"wf-status-accordion\">\r\n <button class=\"accordion-summary\" (click)=\"toggleAccordion()\">\r\n <span><i [ngClass]=\"$isExpanded() ? 'feather-minus' : 'feather-plus'\"></i></span> {{ $isExpanded() ? 'Hide Details' : 'Show More' }}\r\n </button>\r\n\r\n <div class=\"accordion-body\" [style.maxHeight]=\"$isExpanded() ? '1000px' : '0'\"\r\n [style.opacity]=\"$isExpanded() ? '1' : '0'\" [style.pointerEvents]=\"$isExpanded() ? 'auto' : 'none'\">\r\n <div class=\"wf-status-row\">\r\n <label>Workflow ID:</label>\r\n <span>\r\n {{ $instance()!.workflowId }}\r\n </span>\r\n <button type=\"button\" (click)=\"copy($instance()!.workflowId)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Employee ID:</label>\r\n <span>\r\n {{ $instance()!.lastActorEmployeeId }}\r\n </span>\r\n <button type=\"button\" (click)=\"copy($instance()!.lastActorEmployeeId)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Last Triggered Step ID:</label>\r\n <span>\r\n {{ $instance()!.lastTriggeredStepId || '—' }}\r\n </span>\r\n @if ($instance()!.lastTriggeredStepId) {\r\n <button type=\"button\" (click)=\"copy($instance()!.lastTriggeredStepId)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n }\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Attributes JSON:</label>\r\n <span>\r\n <code>{{ $attributesBeauty() }}</code>\r\n </span>\r\n <button type=\"button\" (click)=\"copy($instance()!.attributesJson)\" class=\"copy-btn\"><i class=\"feather-clipboard\"></i></button>\r\n </div>\r\n\r\n <div class=\"wf-status-row\">\r\n <label>Debug Mode:</label>\r\n <span>{{ $instance()!.isDebug ? '✔ Enabled' : '❌ Disabled' }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"runtime-routing-n-logs\">\r\n <runtime-routing [$instance]=\"$instance()\" />\r\n <div class=\"h15\"></div>\r\n <runtime-logs [$instance]=\"$instance()\" />\r\n </div>\r\n </div>\r\n</div>"],"names":["i1.MultiLanguageService","i2.SocketService","i3.AlertService"],"mappings":"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"}