ngx-histaff-alpha 5.7.3 → 5.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-AVoa-v8q.mjs → ngx-histaff-alpha-ai-hint-for-table.component-aANJ9IGi.mjs} +3 -3
- package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-AVoa-v8q.mjs.map → ngx-histaff-alpha-ai-hint-for-table.component-aANJ9IGi.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-core-form-design.component-cbm3hPr2.mjs → ngx-histaff-alpha-core-form-design.component-DbfyYTFh.mjs} +5 -5
- package/fesm2022/{ngx-histaff-alpha-core-form-design.component-cbm3hPr2.mjs.map → ngx-histaff-alpha-core-form-design.component-DbfyYTFh.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-core-sticker-collection.component-BiQ-rvp-.mjs → ngx-histaff-alpha-core-sticker-collection.component-BwqJiCc4.mjs} +3 -3
- package/fesm2022/{ngx-histaff-alpha-core-sticker-collection.component-BiQ-rvp-.mjs.map → ngx-histaff-alpha-core-sticker-collection.component-BwqJiCc4.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-BHo8FIID.mjs → ngx-histaff-alpha-core-toast-loading.component-6hpkcuyU.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-BHo8FIID.mjs.map → ngx-histaff-alpha-core-toast-loading.component-6hpkcuyU.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-CPB9bUac.mjs → ngx-histaff-alpha-core-workflow-consume.component-B0UEkFLW.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-CPB9bUac.mjs.map → ngx-histaff-alpha-core-workflow-consume.component-B0UEkFLW.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-db-settings.component-BLRtDz07.mjs → ngx-histaff-alpha-db-settings.component-DyTgFHJj.mjs} +5 -5
- package/fesm2022/{ngx-histaff-alpha-db-settings.component-BLRtDz07.mjs.map → ngx-histaff-alpha-db-settings.component-DyTgFHJj.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-BiM3aKvD.mjs → ngx-histaff-alpha-design-wrapper.component-CR2DfllM.mjs} +5 -5
- package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-BiM3aKvD.mjs.map → ngx-histaff-alpha-design-wrapper.component-CR2DfllM.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-DnkN49JV.mjs → ngx-histaff-alpha-design-wrapper.route-B2Pv8hQq.mjs} +5 -5
- package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-DnkN49JV.mjs.map → ngx-histaff-alpha-design-wrapper.route-B2Pv8hQq.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-live-form.component-DdKOgA8G.mjs → ngx-histaff-alpha-live-form.component-Djf5udbq.mjs} +102 -32
- package/fesm2022/ngx-histaff-alpha-live-form.component-Djf5udbq.mjs.map +1 -0
- package/fesm2022/{ngx-histaff-alpha-ngx-histaff-alpha-BUV0gHis.mjs → ngx-histaff-alpha-ngx-histaff-alpha-tEKeWJgJ.mjs} +34 -31
- package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-tEKeWJgJ.mjs.map +1 -0
- package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-DGZIdg2Y.mjs → ngx-histaff-alpha-wf-form-assign.component-BSJm0d0_.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-DGZIdg2Y.mjs.map → ngx-histaff-alpha-wf-form-assign.component-BSJm0d0_.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-wf-instance-status.component-DJ_fM1J4.mjs → ngx-histaff-alpha-wf-instance-status.component-tJLOmgm7.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-wf-instance-status.component-DJ_fM1J4.mjs.map → ngx-histaff-alpha-wf-instance-status.component-tJLOmgm7.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-wf-instance-step-react.component-DMgA379y.mjs → ngx-histaff-alpha-wf-instance-step-react.component-DMX-FFdR.mjs} +3 -3
- package/fesm2022/{ngx-histaff-alpha-wf-instance-step-react.component-DMgA379y.mjs.map → ngx-histaff-alpha-wf-instance-step-react.component-DMX-FFdR.mjs.map} +1 -1
- package/fesm2022/ngx-histaff-alpha.mjs +1 -1
- package/lib/app/libraries/core-form-design/core-form-design.service.d.ts +1 -1
- package/lib/app/libraries/core-form-design/enums/EnumSupportedRuntimeValidator.d.ts +0 -1
- package/lib/app/libraries/core-form-design/live-form/live-form.component.d.ts +24 -17
- package/lib/app/libraries/core-workflow-builder/core-workflow.service.d.ts +1 -0
- package/lib/app/libraries/core-workflow-builder/interfaces/ISubmitResult.d.ts +6 -0
- package/lib/app/libraries/core-workflow-builder/routing-preview/routing-preview.component.d.ts +1 -1
- package/package.json +1 -1
- package/fesm2022/ngx-histaff-alpha-live-form.component-DdKOgA8G.mjs.map +0 -1
- package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-BUV0gHis.mjs.map +0 -1
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { g as CanDeactivateGuard } from './ngx-histaff-alpha-ngx-histaff-alpha-
|
|
1
|
+
import { g as CanDeactivateGuard } from './ngx-histaff-alpha-ngx-histaff-alpha-tEKeWJgJ.mjs';
|
|
2
2
|
|
|
3
3
|
const wfDesignWrapperRoutes = [
|
|
4
4
|
{
|
|
5
5
|
path: '',
|
|
6
|
-
loadComponent: () => import('./ngx-histaff-alpha-design-wrapper.component-
|
|
6
|
+
loadComponent: () => import('./ngx-histaff-alpha-design-wrapper.component-CR2DfllM.mjs').then(m => m.DesignWrapperComponent),
|
|
7
7
|
canDeactivate: [CanDeactivateGuard],
|
|
8
8
|
children: [
|
|
9
9
|
{
|
|
10
10
|
path: ':id',
|
|
11
11
|
outlet: 'preview',
|
|
12
|
-
loadComponent: () => import('./ngx-histaff-alpha-live-form.component-
|
|
12
|
+
loadComponent: () => import('./ngx-histaff-alpha-live-form.component-Djf5udbq.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent)
|
|
13
13
|
},
|
|
14
14
|
]
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
path: ':id',
|
|
18
|
-
loadComponent: () => import('./ngx-histaff-alpha-live-form.component-
|
|
18
|
+
loadComponent: () => import('./ngx-histaff-alpha-live-form.component-Djf5udbq.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent)
|
|
19
19
|
}
|
|
20
20
|
];
|
|
21
21
|
|
|
22
22
|
export { wfDesignWrapperRoutes };
|
|
23
|
-
//# sourceMappingURL=ngx-histaff-alpha-design-wrapper.route-
|
|
23
|
+
//# sourceMappingURL=ngx-histaff-alpha-design-wrapper.route-B2Pv8hQq.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-histaff-alpha-design-wrapper.route-
|
|
1
|
+
{"version":3,"file":"ngx-histaff-alpha-design-wrapper.route-B2Pv8hQq.mjs","sources":["../../../projects/ngx-histaff-alpha/src/lib/app/libraries/core-workflow-builder/design-wrapper/design-wrapper.route.ts"],"sourcesContent":["import { Routes } from '@angular/router';\r\nimport { CanDeactivateGuard } from '../../../guards/can-deactivate.guard';\r\n\r\nexport const wfDesignWrapperRoutes: Routes = [\r\n {\r\n path: '',\r\n loadComponent: () => import('./design-wrapper.component').then(m => m.DesignWrapperComponent),\r\n canDeactivate: [CanDeactivateGuard],\r\n children: [\r\n {\r\n path: ':id',\r\n outlet: 'preview',\r\n loadComponent: () => import('../../core-form-design/live-form/live-form.component').then(m => m.LiveFormComponent)\r\n },\r\n ]\r\n },\r\n {\r\n path: ':id',\r\n loadComponent: () => import('../../core-form-design/live-form/live-form.component').then(m => m.LiveFormComponent)\r\n }\r\n]"],"names":[],"mappings":";;AAGa,MAAA,qBAAqB,GAAW;AACzC,IAAA;AACI,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,aAAa,EAAE,MAAM,OAAO,2DAA4B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC;QAC7F,aAAa,EAAE,CAAC,kBAAkB,CAAC;AACnC,QAAA,QAAQ,EAAE;AACN,YAAA;AACI,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,MAAM,EAAE,SAAS;AACjB,gBAAA,aAAa,EAAE,MAAM,OAAO,sDAAsD,oCAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,iBAAiB;AACpH,aAAA;AACJ;AACJ,KAAA;AACD,IAAA;AACI,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,aAAa,EAAE,MAAM,OAAO,sDAAsD,oCAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,iBAAiB;AACpH;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { input, signal, isDevMode, computed, inject, HostListener, ChangeDetectionStrategy, Component, output, ChangeDetectorRef, Injector, effect } from '@angular/core';
|
|
3
|
-
import { c as BaseComponent, $ as EnumImageResolverType, C as CoreWorkflowService, h as AlertService, z as AppConfigService, k as alertOptions, M as MultiLanguageService, T as TranslatePipe, I as ImageErrorResolverDirective, a0 as NormalizeHumanNamePipe, f as TooltipDirective, a1 as CoreIosSwitcherComponent, l as CoreTerminalSpinnerComponent, d as CorePageHeaderComponent, p as DomService, w as CoreParamControlComponent, m as CoreFormDesignService, y as ApplicationHelpService, J as JsonService, A as AppService, a2 as CoreFormService, E as EnumFormBaseContolType, K as EnumCorePageEditMode, L as EnumCoreButtonVNSCode, a as EnumCoreFormControlSeekerSourceType, H as HotKeysDirective, P as CoreFormComponent } from './ngx-histaff-alpha-ngx-histaff-alpha-
|
|
3
|
+
import { c as BaseComponent, $ as EnumImageResolverType, C as CoreWorkflowService, h as AlertService, z as AppConfigService, k as alertOptions, M as MultiLanguageService, T as TranslatePipe, I as ImageErrorResolverDirective, a0 as NormalizeHumanNamePipe, f as TooltipDirective, a1 as CoreIosSwitcherComponent, l as CoreTerminalSpinnerComponent, d as CorePageHeaderComponent, p as DomService, w as CoreParamControlComponent, m as CoreFormDesignService, y as ApplicationHelpService, J as JsonService, A as AppService, a2 as CoreFormService, E as EnumFormBaseContolType, K as EnumCorePageEditMode, L as EnumCoreButtonVNSCode, a as EnumCoreFormControlSeekerSourceType, H as HotKeysDirective, P as CoreFormComponent } from './ngx-histaff-alpha-ngx-histaff-alpha-tEKeWJgJ.mjs';
|
|
4
4
|
import { catchError, of, finalize, BehaviorSubject, filter, distinctUntilChanged, tap } from 'rxjs';
|
|
5
5
|
import { NgClass, JsonPipe, NgStyle } from '@angular/common';
|
|
6
6
|
import { RouterLink, Router, ActivatedRoute } from '@angular/router';
|
|
@@ -19,7 +19,7 @@ class RoutingPreviewComponent extends BaseComponent {
|
|
|
19
19
|
this.$backendMessage = signal('');
|
|
20
20
|
this.$submitResponseItems = signal([]);
|
|
21
21
|
this.$results = signal([]);
|
|
22
|
-
this
|
|
22
|
+
this.$logExpandedStates = signal([]);
|
|
23
23
|
this.$logs = signal([]);
|
|
24
24
|
this.imageResolverType = EnumImageResolverType.AVATAR;
|
|
25
25
|
this.isDevMode = isDevMode();
|
|
@@ -112,7 +112,7 @@ class RoutingPreviewComponent extends BaseComponent {
|
|
|
112
112
|
this.liveForm.patchValue(response.attributes);
|
|
113
113
|
}
|
|
114
114
|
this.$results.set(validResults);
|
|
115
|
-
this
|
|
115
|
+
this.$logExpandedStates.set(new Array(validResults.length).fill(false));
|
|
116
116
|
this.$backendMessage.set(allErrors.join('\n'));
|
|
117
117
|
}
|
|
118
118
|
else {
|
|
@@ -171,14 +171,14 @@ class RoutingPreviewComponent extends BaseComponent {
|
|
|
171
171
|
});
|
|
172
172
|
}
|
|
173
173
|
toggleLog(index) {
|
|
174
|
-
this
|
|
174
|
+
this.$logExpandedStates.update(arr => {
|
|
175
175
|
const newArr = [...arr];
|
|
176
176
|
newArr[index] = !newArr[index];
|
|
177
177
|
return newArr;
|
|
178
178
|
});
|
|
179
179
|
}
|
|
180
180
|
isLogVisible(index) {
|
|
181
|
-
return this
|
|
181
|
+
return this.$logExpandedStates()?.[index] ?? false;
|
|
182
182
|
}
|
|
183
183
|
getLogLinesFor(index) {
|
|
184
184
|
const logs = this.$logs();
|
|
@@ -196,7 +196,7 @@ class RoutingPreviewComponent extends BaseComponent {
|
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
198
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: RoutingPreviewComponent, deps: [{ token: MultiLanguageService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
199
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: RoutingPreviewComponent, isStandalone: true, selector: "routing-preview", inputs: { $previewMode: { classPropertyName: "$previewMode", publicName: "$previewMode", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "document:keydown": "handleKeyDown($event)" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"routing-preview-container inter-font p-relative\">\r\n\r\n <div class=\"correlation-id\">\r\n\r\n <!-- @if ($saga()?.correlationId) {\r\n Workflow live instance: \r\n <a [routerLink]=\"['/root/workflow/status', $saga()?.correlationId]\">\r\n {{ $saga()?.correlationId }}\r\n </a>\r\n } -->\r\n\r\n <!-- @if ($loading()) {\r\n <core-terminal-spinner />\r\n } @else if ($saga()?.correlationId) {\r\n <button @fadeToggle type=\"button\" (click)=\"copy($saga()?.correlationId || '')\" class=\"copy-btn\">\r\n <i class=\"feather-clipboard\"></i>\r\n </button>\r\n\r\n } -->\r\n </div>\r\n\r\n <div class=\"routing-preview-header\">\r\n\r\n <div class=\"button-group\">\r\n <button type=\"button\" class=\"btn btn-primary h35\" (click)=\"backToLiveForm()\">Back to Form (ESC)</button>\r\n <button type=\"button\" class=\"btn btn-secondary h35\" (click)=\"generateRouting()\">Generate</button>\r\n @if (!!appConfigService.WORKFLOW_ENABLE_DEBUG_MODE && $isDebugMode()) {\r\n <button @fadeToggle type=\"button\" class=\"btn btn-secondary h35\" (click)=\"toggleResolvedSteps()\">Show/Hide resolved\r\n steps</button>\r\n }\r\n <button @fadeToggle type=\"button\" class=\"btn btn-primary h35\" (click)=\"initialDebugSubmit()\">Submit</button>\r\n </div>\r\n\r\n @if (!!appConfigService.WORKFLOW_ENABLE_DEBUG_MODE) {\r\n <div class=\"debug-group\">\r\n <label>Debug mode</label>\r\n <core-ios-switcher [width]=\"45\" [showOnOffText]=\"false\" [ngModel]=\"$isDebugMode()\"\r\n (ngModelChange)=\"onIsDebugModeChange($event)\"></core-ios-switcher>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"workflows-wrapper\">\r\n @if ($loading()) {\r\n <core-terminal-spinner /><span>Generating...</span>\r\n } @else {\r\n\r\n\r\n @if (!!$results().length) {\r\n\r\n @for (result of $results(); track $index) {\r\n\r\n <div class=\"result-group mb-8 p-4 rounded bg-white shadow-sm\">\r\n\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <h6 class=\"text-base font-semibold text-sky-700\">Routing for {{ result.targetEmployeeFullName }}</h6>\r\n <div class=\"d-flex d-flex-between\">\r\n <button type=\"button\" class=\"text-xs text-blue-500 underline btn btn-secondary\" (click)=\"toggleLog($index)\">\r\n {{ logExpandedStates()[ $index ] ? 'Hide log' : 'Show log' }}\r\n </button>\r\n @if ($loading()) {\r\n <core-terminal-spinner />\r\n }\r\n <!-- @if (!!$submitResponseItems().length && !!getCorrelationId(result)) {\r\n <div class=\"saga-link d-flex d-flex-start\">\r\n <label>The process activated:</label>\r\n <a class=\"external-link\" [routerLink]=\"['/root/workflow/status', getCorrelationId(result)]\">\r\n Click here to see status\r\n </a>\r\n </div>\r\n } -->\r\n @for (result of $submitResponseItems(); track result.employeeId) {\r\n <div class=\"saga-link d-flex d-flex-start\">\r\n <label>{{ result.employeeFullName }}:</label>\r\n\r\n @if (result.correlationId) {\r\n <a class=\"external-link\" [routerLink]=\"['/root/workflow/status', result.correlationId]\">\r\n \u2705 Click to see status\r\n </a>\r\n } @else {\r\n <span class=\"text-danger d-flex flex-column\">\r\n @for (line of (result.error?.split('\\n') || []); track line) {\r\n <div>\u274C {{ line }}</div>\r\n }\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"workflow-wrapper\">\r\n\r\n @for (step of result.response.steps! ?? []; track step.id) {\r\n <div class=\"step-column\" [attr.data-actor-count]=\"step.resolvedActors?.length || 0\">\r\n\r\n <div class=\"step-column-aux\">\r\n\r\n <div class=\"step-header {{ step.type.toLowerCase() }}\"\r\n [ngClass]=\"(step.actorResolvedStatus ?? 'RESOLVED').toLowerCase()\">\r\n {{ step.name | translate : lang }} {{ step.config?.routingLogic }}\r\n </div>\r\n\r\n @for (actor of step.resolvedActors; track $index) {\r\n <div class=\"actor-card-aux\">\r\n <div class=\"actor-card d-flex d-flex-start {{ step.type.toLowerCase() }}\">\r\n <div class=\"avatar-wrapper\">\r\n <img [src]=\"actor.avatar\" appImageErrorResolver [type]=\"imageResolverType\"\r\n [isFemale]=\"!!actor.isFemale!\" class=\"actor-avatar\" alt=\"{{ actor.fullName }}\" />\r\n </div>\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\" [appTooltip]=\"actor.fullName\">{{ actor.fullName | normalizeHumanName\r\n }}</span>\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-briefcase\"></i>\r\n <span [appTooltip]=\"actor.jobName\">{{ actor.jobName }}</span>\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-mail\"></i>\r\n @if ($isDebugMode()) {\r\n <input @fadeToggle class=\"email-debug-input\" type=\"email\" [(ngModel)]=\"actor.email\"\r\n (ngModelChange)=\"onEmailChange(actor, $event)\" placeholder=\"Enter demo email\" />\r\n } @else {\r\n <span [appTooltip]=\"actor.email\">{{ actor.email }}</span>\r\n }\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-hash\"></i>\r\n <span @fadeToggle [appTooltip]=\"actor.employeeCode\">{{ actor.employeeCode }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (isLogVisible($index)) {\r\n <pre class=\"employee-log mt-4 bg-gray-50 p-3 rounded text-xs font-mono text-gray-800\">\r\n @for (line of getLogLinesFor($index); track $index) {\r\n {{ line }}\r\n }\r\n </pre>\r\n }\r\n\r\n </div>\r\n\r\n }\r\n\r\n } @else if (!!$backendMessage()) {\r\n\r\n <div class=\"backend-message error-list bg-red-50 rounded p-4 text-sm text-red-800 leading-relaxed\">\r\n @for (line of $backendMessage().split('\\n'); track $index) {\r\n <div class=\"error-item flex items-start gap-2\">\r\n <i class=\"feather-alert-circle text-red-600 mt-0.5\"></i>\r\n <span [innerText]=\"line\"></span>\r\n </div>\r\n }\r\n </div>\r\n\r\n } @else {\r\n No routing steps found.\r\n }\r\n\r\n\r\n }\r\n\r\n </div>\r\n\r\n @if ($showResolvedSteps()) {\r\n <h5>Resolved steps</h5>\r\n <div class=\"resolved-steps\">\r\n <!-- <pre>{{ $resolvedStepsJson() }}</pre> -->\r\n </div>\r\n }\r\n\r\n</div>", styles: [".routing-preview-container{font-size:13px}.routing-preview-container .correlation-id{display:flex;align-items:center;height:35px;font-family:monospace}.routing-preview-container .correlation-id button{border:none;margin-left:8px}.routing-preview-container .workflow-wrapper{display:flex;flex-direction:row;gap:64px;padding:24px;background:#f5f5f5;overflow-x:auto;min-width:576px;min-height:200px}.routing-preview-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%}.routing-preview-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}.routing-preview-container .workflow-wrapper .step-header.submit{background-color:#00bcd4}.routing-preview-container .workflow-wrapper .step-header.approval{background-color:#f80}.routing-preview-container .workflow-wrapper .step-header.cc{background-color:#3370ff}.routing-preview-container .workflow-wrapper .step-header.handle{background-color:#935af6}.routing-preview-container .workflow-wrapper .step-header.end{background-color:#673ab7}.routing-preview-container .workflow-wrapper .step-header.resolved{box-shadow:0 0 0 3px #4caf50 inset}.routing-preview-container .workflow-wrapper .step-header.empty{box-shadow:0 0 0 3px #ff9800 inset}.routing-preview-container .workflow-wrapper .step-header.fallback{box-shadow:0 0 0 3px #03a9f4 inset}.routing-preview-container .workflow-wrapper .step-header.error{box-shadow:0 0 0 3px #f44336 inset}.routing-preview-container .workflow-wrapper .actor-card-aux{position:relative}.routing-preview-container .workflow-wrapper .actor-card.d-flex{display:flex;align-items:center;justify-content:flex-start;width:240px;height:110px;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}.routing-preview-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}.routing-preview-container .workflow-wrapper .actor-card.d-flex .actor-details .actor-line>span.actor-full-name{color:#000}.routing-preview-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper{flex-shrink:0;margin-right:8px}.routing-preview-container .workflow-wrapper .actor-card.d-flex .actor-avatar{width:40px;height:40px;border-radius:50%;object-fit:cover;border:1px solid #ccc}.routing-preview-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}.routing-preview-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}.routing-preview-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}.routing-preview-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}.routing-preview-container .workflow-wrapper .step-column-aux{position:relative}.routing-preview-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}.routing-preview-container .workflow-wrapper .actor-card.submit{background-color:#e0f7fa;border-left:4px solid #00bcd4}.routing-preview-container .workflow-wrapper .actor-card.approval{background-color:#fff3e0;border-left:4px solid #f80}.routing-preview-container .workflow-wrapper .actor-card.cc{background-color:#e6ecff;border-left:4px solid #3370ff}.routing-preview-container .workflow-wrapper .actor-card.handle{background-color:#f3e6ff;border-left:4px solid #935af6}.routing-preview-container .workflow-wrapper .actor-card.end{background-color:#ede7f6;border-left:4px solid #673ab7}.routing-preview-container .workflow-wrapper .actor-line{display:flex;align-items:center;gap:6px;margin:2px 0;height:23.5px}.routing-preview-container .workflow-wrapper .actor-line i{width:16px;height:16px;font-size:16px;color:#848484}.routing-preview-container .workflow-wrapper .actor-line input.email-debug-input{border:1px dashed #00bcd4;background-color:#e0f7fa;width:140px;padding:0 8px}.routing-preview-container .workflow-wrapper .actor-card span{display:block;color:#555;margin:2px 0}@media (max-width: 576px){.routing-preview-container .workflow-wrapper .workflow-wrapper{flex-direction:column;align-items:center;gap:24px}.routing-preview-container .workflow-wrapper .step-column{width:90vw}.routing-preview-container .workflow-wrapper .actor-card{width:100%}}.routing-preview-container .p-relative{position:relative}.routing-preview-container .routing-preview-header{display:flex;align-items:center;justify-content:space-between;height:35px;margin-bottom:15px}.routing-preview-container .routing-preview-header .button-group{display:flex;align-items:center;justify-content:flex-start;gap:8px;height:35px}.routing-preview-container .routing-preview-header .button-group button{border-radius:0;color:#fff;height:35px;font-size:13px}.routing-preview-container .routing-preview-header .debug-group{display:flex;align-items:center;justify-content:flex-start;height:35px}.routing-preview-container .routing-preview-header .debug-group label{-webkit-user-select:none;user-select:none;margin-right:8px}.routing-preview-container h5{padding:15px;color:#848484}.routing-preview-container .resolved-steps pre{padding:15px}.routing-preview-container .employee-log{max-width:100%;overflow-x:auto;background:#f9f9f9;border-left:4px solid #3b82f6;padding:12px 16px;margin-top:16px;font-family:monospace;font-size:13px;border-radius:6px;white-space:pre-wrap;box-sizing:border-box}.routing-preview-container .saga-link label{font-size:13px;color:#848484;margin-right:8px}.routing-preview-container a.external-link{color:#358ccb!important}.routing-preview-container a.external-link:after{font-family:feather;content:\"\\e95b\"}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "directive", type: ImageErrorResolverDirective, selector: "[appImageErrorResolver]", inputs: ["type", "isFemale"] }, { kind: "pipe", type: NormalizeHumanNamePipe, name: "normalizeHumanName" }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["color", "backgroundColor", "appTooltip", "showAnyway", "position"] }, { kind: "component", type: CoreIosSwitcherComponent, selector: "core-ios-switcher", inputs: ["bgColor", "showOnOffText", "width", "readonly"] }, { kind: "component", type: CoreTerminalSpinnerComponent, selector: "core-terminal-spinner" }], animations: [
|
|
199
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: RoutingPreviewComponent, isStandalone: true, selector: "routing-preview", inputs: { $previewMode: { classPropertyName: "$previewMode", publicName: "$previewMode", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "document:keydown": "handleKeyDown($event)" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"routing-preview-container inter-font p-relative\">\r\n\r\n <div class=\"correlation-id\">\r\n\r\n <!-- @if ($saga()?.correlationId) {\r\n Workflow live instance: \r\n <a [routerLink]=\"['/root/workflow/status', $saga()?.correlationId]\">\r\n {{ $saga()?.correlationId }}\r\n </a>\r\n } -->\r\n\r\n <!-- @if ($loading()) {\r\n <core-terminal-spinner />\r\n } @else if ($saga()?.correlationId) {\r\n <button @fadeToggle type=\"button\" (click)=\"copy($saga()?.correlationId || '')\" class=\"copy-btn\">\r\n <i class=\"feather-clipboard\"></i>\r\n </button>\r\n\r\n } -->\r\n </div>\r\n\r\n <div class=\"routing-preview-header\">\r\n\r\n <div class=\"button-group\">\r\n <button type=\"button\" class=\"btn btn-primary h35\" (click)=\"backToLiveForm()\">Back to Form (ESC)</button>\r\n <button type=\"button\" class=\"btn btn-secondary h35\" (click)=\"generateRouting()\">Generate</button>\r\n @if (!!appConfigService.WORKFLOW_ENABLE_DEBUG_MODE && $isDebugMode()) {\r\n <button @fadeToggle type=\"button\" class=\"btn btn-secondary h35\" (click)=\"toggleResolvedSteps()\">Show/Hide resolved\r\n steps</button>\r\n }\r\n <button @fadeToggle type=\"button\" class=\"btn btn-primary h35\" (click)=\"initialDebugSubmit()\">Submit</button>\r\n </div>\r\n\r\n @if (!!appConfigService.WORKFLOW_ENABLE_DEBUG_MODE) {\r\n <div class=\"debug-group\">\r\n <label>Debug mode</label>\r\n <core-ios-switcher [width]=\"45\" [showOnOffText]=\"false\" [ngModel]=\"$isDebugMode()\"\r\n (ngModelChange)=\"onIsDebugModeChange($event)\"></core-ios-switcher>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"workflows-wrapper\">\r\n @if ($loading()) {\r\n <core-terminal-spinner /><span>Generating...</span>\r\n } @else {\r\n\r\n\r\n @if (!!$results().length) {\r\n\r\n @for (result of $results(); track $index) {\r\n\r\n <div class=\"result-group mb-8 p-4 rounded bg-white shadow-sm\">\r\n\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <h6 class=\"text-base font-semibold text-sky-700\">Routing for {{ result.targetEmployeeFullName }}</h6>\r\n <div class=\"d-flex d-flex-between\">\r\n <button type=\"button\" class=\"text-xs text-blue-500 underline btn btn-secondary\" (click)=\"toggleLog($index)\">\r\n {{ $logExpandedStates()[ $index ] ? 'Hide log' : 'Show log' }}\r\n </button>\r\n @if ($loading()) {\r\n <core-terminal-spinner />\r\n }\r\n <!-- @if (!!$submitResponseItems().length && !!getCorrelationId(result)) {\r\n <div class=\"saga-link d-flex d-flex-start\">\r\n <label>The process activated:</label>\r\n <a class=\"external-link\" [routerLink]=\"['/root/workflow/status', getCorrelationId(result)]\">\r\n Click here to see status\r\n </a>\r\n </div>\r\n } -->\r\n @for (result of $submitResponseItems(); track result.employeeId) {\r\n <div class=\"saga-link d-flex d-flex-start\">\r\n <label>{{ result.employeeFullName }}:</label>\r\n\r\n @if (result.correlationId) {\r\n <a class=\"external-link\" [routerLink]=\"['/root/workflow/status', result.correlationId]\">\r\n \u2705 Click to see status\r\n </a>\r\n } @else {\r\n <span class=\"text-danger d-flex flex-column\">\r\n @for (line of (result.error?.split('\\n') || []); track line) {\r\n <div>\u274C {{ line }}</div>\r\n }\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"workflow-wrapper\">\r\n\r\n @for (step of result.response.steps! ?? []; track step.id) {\r\n <div class=\"step-column\" [attr.data-actor-count]=\"step.resolvedActors?.length || 0\">\r\n\r\n <div class=\"step-column-aux\">\r\n\r\n <div class=\"step-header {{ step.type.toLowerCase() }}\"\r\n [ngClass]=\"(step.actorResolvedStatus ?? 'RESOLVED').toLowerCase()\">\r\n {{ step.name | translate : lang }} {{ step.config?.routingLogic }}\r\n </div>\r\n\r\n @for (actor of step.resolvedActors; track $index) {\r\n <div class=\"actor-card-aux\">\r\n <div class=\"actor-card d-flex d-flex-start {{ step.type.toLowerCase() }}\">\r\n <div class=\"avatar-wrapper\">\r\n <img [src]=\"actor.avatar\" appImageErrorResolver [type]=\"imageResolverType\"\r\n [isFemale]=\"!!actor.isFemale!\" class=\"actor-avatar\" alt=\"{{ actor.fullName }}\" />\r\n </div>\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\" [appTooltip]=\"actor.fullName\">{{ actor.fullName | normalizeHumanName\r\n }}</span>\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-briefcase\"></i>\r\n <span [appTooltip]=\"actor.jobName\">{{ actor.jobName }}</span>\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-mail\"></i>\r\n @if ($isDebugMode()) {\r\n <input @fadeToggle class=\"email-debug-input\" type=\"email\" [(ngModel)]=\"actor.email\"\r\n (ngModelChange)=\"onEmailChange(actor, $event)\" placeholder=\"Enter demo email\" />\r\n } @else {\r\n <span [appTooltip]=\"actor.email\">{{ actor.email }}</span>\r\n }\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-hash\"></i>\r\n <span @fadeToggle [appTooltip]=\"actor.employeeCode\">{{ actor.employeeCode }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (isLogVisible($index)) {\r\n <pre class=\"employee-log mt-4 bg-gray-50 p-3 rounded text-xs font-mono text-gray-800\">\r\n @for (line of getLogLinesFor($index); track $index) {\r\n {{ line }}\r\n }\r\n </pre>\r\n }\r\n\r\n </div>\r\n\r\n }\r\n\r\n } @else if (!!$backendMessage()) {\r\n\r\n <div class=\"backend-message error-list bg-red-50 rounded p-4 text-sm text-red-800 leading-relaxed\">\r\n @for (line of $backendMessage().split('\\n'); track $index) {\r\n <div class=\"error-item flex items-start gap-2\">\r\n <i class=\"feather-alert-circle text-red-600 mt-0.5\"></i>\r\n <span [innerText]=\"line\"></span>\r\n </div>\r\n }\r\n </div>\r\n\r\n } @else {\r\n No routing steps found.\r\n }\r\n\r\n\r\n }\r\n\r\n </div>\r\n\r\n @if ($showResolvedSteps()) {\r\n <h5>Resolved steps</h5>\r\n <div class=\"resolved-steps\">\r\n <!-- <pre>{{ $resolvedStepsJson() }}</pre> -->\r\n </div>\r\n }\r\n\r\n</div>", styles: [".routing-preview-container{font-size:13px}.routing-preview-container .correlation-id{display:flex;align-items:center;height:35px;font-family:monospace}.routing-preview-container .correlation-id button{border:none;margin-left:8px}.routing-preview-container .workflow-wrapper{display:flex;flex-direction:row;gap:64px;padding:24px;background:#f5f5f5;overflow-x:auto;min-width:576px;min-height:200px}.routing-preview-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%}.routing-preview-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}.routing-preview-container .workflow-wrapper .step-header.submit{background-color:#00bcd4}.routing-preview-container .workflow-wrapper .step-header.approval{background-color:#f80}.routing-preview-container .workflow-wrapper .step-header.cc{background-color:#3370ff}.routing-preview-container .workflow-wrapper .step-header.handle{background-color:#935af6}.routing-preview-container .workflow-wrapper .step-header.end{background-color:#673ab7}.routing-preview-container .workflow-wrapper .step-header.resolved{box-shadow:0 0 0 3px #4caf50 inset}.routing-preview-container .workflow-wrapper .step-header.empty{box-shadow:0 0 0 3px #ff9800 inset}.routing-preview-container .workflow-wrapper .step-header.fallback{box-shadow:0 0 0 3px #03a9f4 inset}.routing-preview-container .workflow-wrapper .step-header.error{box-shadow:0 0 0 3px #f44336 inset}.routing-preview-container .workflow-wrapper .actor-card-aux{position:relative}.routing-preview-container .workflow-wrapper .actor-card.d-flex{display:flex;align-items:center;justify-content:flex-start;width:240px;height:110px;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}.routing-preview-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}.routing-preview-container .workflow-wrapper .actor-card.d-flex .actor-details .actor-line>span.actor-full-name{color:#000}.routing-preview-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper{flex-shrink:0;margin-right:8px}.routing-preview-container .workflow-wrapper .actor-card.d-flex .actor-avatar{width:40px;height:40px;border-radius:50%;object-fit:cover;border:1px solid #ccc}.routing-preview-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}.routing-preview-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}.routing-preview-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}.routing-preview-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}.routing-preview-container .workflow-wrapper .step-column-aux{position:relative}.routing-preview-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}.routing-preview-container .workflow-wrapper .actor-card.submit{background-color:#e0f7fa;border-left:4px solid #00bcd4}.routing-preview-container .workflow-wrapper .actor-card.approval{background-color:#fff3e0;border-left:4px solid #f80}.routing-preview-container .workflow-wrapper .actor-card.cc{background-color:#e6ecff;border-left:4px solid #3370ff}.routing-preview-container .workflow-wrapper .actor-card.handle{background-color:#f3e6ff;border-left:4px solid #935af6}.routing-preview-container .workflow-wrapper .actor-card.end{background-color:#ede7f6;border-left:4px solid #673ab7}.routing-preview-container .workflow-wrapper .actor-line{display:flex;align-items:center;gap:6px;margin:2px 0;height:23.5px}.routing-preview-container .workflow-wrapper .actor-line i{width:16px;height:16px;font-size:16px;color:#848484}.routing-preview-container .workflow-wrapper .actor-line input.email-debug-input{border:1px dashed #00bcd4;background-color:#e0f7fa;width:140px;padding:0 8px}.routing-preview-container .workflow-wrapper .actor-card span{display:block;color:#555;margin:2px 0}@media (max-width: 576px){.routing-preview-container .workflow-wrapper .workflow-wrapper{flex-direction:column;align-items:center;gap:24px}.routing-preview-container .workflow-wrapper .step-column{width:90vw}.routing-preview-container .workflow-wrapper .actor-card{width:100%}}.routing-preview-container .p-relative{position:relative}.routing-preview-container .routing-preview-header{display:flex;align-items:center;justify-content:space-between;height:35px;margin-bottom:15px}.routing-preview-container .routing-preview-header .button-group{display:flex;align-items:center;justify-content:flex-start;gap:8px;height:35px}.routing-preview-container .routing-preview-header .button-group button{border-radius:0;color:#fff;height:35px;font-size:13px}.routing-preview-container .routing-preview-header .debug-group{display:flex;align-items:center;justify-content:flex-start;height:35px}.routing-preview-container .routing-preview-header .debug-group label{-webkit-user-select:none;user-select:none;margin-right:8px}.routing-preview-container h5{padding:15px;color:#848484}.routing-preview-container .resolved-steps pre{padding:15px}.routing-preview-container .employee-log{max-width:100%;overflow-x:auto;background:#f9f9f9;border-left:4px solid #3b82f6;padding:12px 16px;margin-top:16px;font-family:monospace;font-size:13px;border-radius:6px;white-space:pre-wrap;box-sizing:border-box}.routing-preview-container .saga-link label{font-size:13px;color:#848484;margin-right:8px}.routing-preview-container a.external-link{color:#358ccb!important}.routing-preview-container a.external-link:after{font-family:feather;content:\"\\e95b\"}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "directive", type: ImageErrorResolverDirective, selector: "[appImageErrorResolver]", inputs: ["type", "isFemale"] }, { kind: "pipe", type: NormalizeHumanNamePipe, name: "normalizeHumanName" }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["color", "backgroundColor", "appTooltip", "showAnyway", "position"] }, { kind: "component", type: CoreIosSwitcherComponent, selector: "core-ios-switcher", inputs: ["bgColor", "showOnOffText", "width", "readonly"] }, { kind: "component", type: CoreTerminalSpinnerComponent, selector: "core-terminal-spinner" }], animations: [
|
|
200
200
|
trigger('fadeToggle', [
|
|
201
201
|
transition(':enter', [
|
|
202
202
|
style({ opacity: 0 }),
|
|
@@ -232,7 +232,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
|
|
|
232
232
|
animate('150ms ease-in', style({ opacity: 0 }))
|
|
233
233
|
])
|
|
234
234
|
])
|
|
235
|
-
], template: "<div class=\"routing-preview-container inter-font p-relative\">\r\n\r\n <div class=\"correlation-id\">\r\n\r\n <!-- @if ($saga()?.correlationId) {\r\n Workflow live instance: \r\n <a [routerLink]=\"['/root/workflow/status', $saga()?.correlationId]\">\r\n {{ $saga()?.correlationId }}\r\n </a>\r\n } -->\r\n\r\n <!-- @if ($loading()) {\r\n <core-terminal-spinner />\r\n } @else if ($saga()?.correlationId) {\r\n <button @fadeToggle type=\"button\" (click)=\"copy($saga()?.correlationId || '')\" class=\"copy-btn\">\r\n <i class=\"feather-clipboard\"></i>\r\n </button>\r\n\r\n } -->\r\n </div>\r\n\r\n <div class=\"routing-preview-header\">\r\n\r\n <div class=\"button-group\">\r\n <button type=\"button\" class=\"btn btn-primary h35\" (click)=\"backToLiveForm()\">Back to Form (ESC)</button>\r\n <button type=\"button\" class=\"btn btn-secondary h35\" (click)=\"generateRouting()\">Generate</button>\r\n @if (!!appConfigService.WORKFLOW_ENABLE_DEBUG_MODE && $isDebugMode()) {\r\n <button @fadeToggle type=\"button\" class=\"btn btn-secondary h35\" (click)=\"toggleResolvedSteps()\">Show/Hide resolved\r\n steps</button>\r\n }\r\n <button @fadeToggle type=\"button\" class=\"btn btn-primary h35\" (click)=\"initialDebugSubmit()\">Submit</button>\r\n </div>\r\n\r\n @if (!!appConfigService.WORKFLOW_ENABLE_DEBUG_MODE) {\r\n <div class=\"debug-group\">\r\n <label>Debug mode</label>\r\n <core-ios-switcher [width]=\"45\" [showOnOffText]=\"false\" [ngModel]=\"$isDebugMode()\"\r\n (ngModelChange)=\"onIsDebugModeChange($event)\"></core-ios-switcher>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"workflows-wrapper\">\r\n @if ($loading()) {\r\n <core-terminal-spinner /><span>Generating...</span>\r\n } @else {\r\n\r\n\r\n @if (!!$results().length) {\r\n\r\n @for (result of $results(); track $index) {\r\n\r\n <div class=\"result-group mb-8 p-4 rounded bg-white shadow-sm\">\r\n\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <h6 class=\"text-base font-semibold text-sky-700\">Routing for {{ result.targetEmployeeFullName }}</h6>\r\n <div class=\"d-flex d-flex-between\">\r\n <button type=\"button\" class=\"text-xs text-blue-500 underline btn btn-secondary\" (click)=\"toggleLog($index)\">\r\n {{ logExpandedStates()[ $index ] ? 'Hide log' : 'Show log' }}\r\n </button>\r\n @if ($loading()) {\r\n <core-terminal-spinner />\r\n }\r\n <!-- @if (!!$submitResponseItems().length && !!getCorrelationId(result)) {\r\n <div class=\"saga-link d-flex d-flex-start\">\r\n <label>The process activated:</label>\r\n <a class=\"external-link\" [routerLink]=\"['/root/workflow/status', getCorrelationId(result)]\">\r\n Click here to see status\r\n </a>\r\n </div>\r\n } -->\r\n @for (result of $submitResponseItems(); track result.employeeId) {\r\n <div class=\"saga-link d-flex d-flex-start\">\r\n <label>{{ result.employeeFullName }}:</label>\r\n\r\n @if (result.correlationId) {\r\n <a class=\"external-link\" [routerLink]=\"['/root/workflow/status', result.correlationId]\">\r\n \u2705 Click to see status\r\n </a>\r\n } @else {\r\n <span class=\"text-danger d-flex flex-column\">\r\n @for (line of (result.error?.split('\\n') || []); track line) {\r\n <div>\u274C {{ line }}</div>\r\n }\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"workflow-wrapper\">\r\n\r\n @for (step of result.response.steps! ?? []; track step.id) {\r\n <div class=\"step-column\" [attr.data-actor-count]=\"step.resolvedActors?.length || 0\">\r\n\r\n <div class=\"step-column-aux\">\r\n\r\n <div class=\"step-header {{ step.type.toLowerCase() }}\"\r\n [ngClass]=\"(step.actorResolvedStatus ?? 'RESOLVED').toLowerCase()\">\r\n {{ step.name | translate : lang }} {{ step.config?.routingLogic }}\r\n </div>\r\n\r\n @for (actor of step.resolvedActors; track $index) {\r\n <div class=\"actor-card-aux\">\r\n <div class=\"actor-card d-flex d-flex-start {{ step.type.toLowerCase() }}\">\r\n <div class=\"avatar-wrapper\">\r\n <img [src]=\"actor.avatar\" appImageErrorResolver [type]=\"imageResolverType\"\r\n [isFemale]=\"!!actor.isFemale!\" class=\"actor-avatar\" alt=\"{{ actor.fullName }}\" />\r\n </div>\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\" [appTooltip]=\"actor.fullName\">{{ actor.fullName | normalizeHumanName\r\n }}</span>\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-briefcase\"></i>\r\n <span [appTooltip]=\"actor.jobName\">{{ actor.jobName }}</span>\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-mail\"></i>\r\n @if ($isDebugMode()) {\r\n <input @fadeToggle class=\"email-debug-input\" type=\"email\" [(ngModel)]=\"actor.email\"\r\n (ngModelChange)=\"onEmailChange(actor, $event)\" placeholder=\"Enter demo email\" />\r\n } @else {\r\n <span [appTooltip]=\"actor.email\">{{ actor.email }}</span>\r\n }\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-hash\"></i>\r\n <span @fadeToggle [appTooltip]=\"actor.employeeCode\">{{ actor.employeeCode }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (isLogVisible($index)) {\r\n <pre class=\"employee-log mt-4 bg-gray-50 p-3 rounded text-xs font-mono text-gray-800\">\r\n @for (line of getLogLinesFor($index); track $index) {\r\n {{ line }}\r\n }\r\n </pre>\r\n }\r\n\r\n </div>\r\n\r\n }\r\n\r\n } @else if (!!$backendMessage()) {\r\n\r\n <div class=\"backend-message error-list bg-red-50 rounded p-4 text-sm text-red-800 leading-relaxed\">\r\n @for (line of $backendMessage().split('\\n'); track $index) {\r\n <div class=\"error-item flex items-start gap-2\">\r\n <i class=\"feather-alert-circle text-red-600 mt-0.5\"></i>\r\n <span [innerText]=\"line\"></span>\r\n </div>\r\n }\r\n </div>\r\n\r\n } @else {\r\n No routing steps found.\r\n }\r\n\r\n\r\n }\r\n\r\n </div>\r\n\r\n @if ($showResolvedSteps()) {\r\n <h5>Resolved steps</h5>\r\n <div class=\"resolved-steps\">\r\n <!-- <pre>{{ $resolvedStepsJson() }}</pre> -->\r\n </div>\r\n }\r\n\r\n</div>", styles: [".routing-preview-container{font-size:13px}.routing-preview-container .correlation-id{display:flex;align-items:center;height:35px;font-family:monospace}.routing-preview-container .correlation-id button{border:none;margin-left:8px}.routing-preview-container .workflow-wrapper{display:flex;flex-direction:row;gap:64px;padding:24px;background:#f5f5f5;overflow-x:auto;min-width:576px;min-height:200px}.routing-preview-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%}.routing-preview-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}.routing-preview-container .workflow-wrapper .step-header.submit{background-color:#00bcd4}.routing-preview-container .workflow-wrapper .step-header.approval{background-color:#f80}.routing-preview-container .workflow-wrapper .step-header.cc{background-color:#3370ff}.routing-preview-container .workflow-wrapper .step-header.handle{background-color:#935af6}.routing-preview-container .workflow-wrapper .step-header.end{background-color:#673ab7}.routing-preview-container .workflow-wrapper .step-header.resolved{box-shadow:0 0 0 3px #4caf50 inset}.routing-preview-container .workflow-wrapper .step-header.empty{box-shadow:0 0 0 3px #ff9800 inset}.routing-preview-container .workflow-wrapper .step-header.fallback{box-shadow:0 0 0 3px #03a9f4 inset}.routing-preview-container .workflow-wrapper .step-header.error{box-shadow:0 0 0 3px #f44336 inset}.routing-preview-container .workflow-wrapper .actor-card-aux{position:relative}.routing-preview-container .workflow-wrapper .actor-card.d-flex{display:flex;align-items:center;justify-content:flex-start;width:240px;height:110px;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}.routing-preview-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}.routing-preview-container .workflow-wrapper .actor-card.d-flex .actor-details .actor-line>span.actor-full-name{color:#000}.routing-preview-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper{flex-shrink:0;margin-right:8px}.routing-preview-container .workflow-wrapper .actor-card.d-flex .actor-avatar{width:40px;height:40px;border-radius:50%;object-fit:cover;border:1px solid #ccc}.routing-preview-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}.routing-preview-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}.routing-preview-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}.routing-preview-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}.routing-preview-container .workflow-wrapper .step-column-aux{position:relative}.routing-preview-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}.routing-preview-container .workflow-wrapper .actor-card.submit{background-color:#e0f7fa;border-left:4px solid #00bcd4}.routing-preview-container .workflow-wrapper .actor-card.approval{background-color:#fff3e0;border-left:4px solid #f80}.routing-preview-container .workflow-wrapper .actor-card.cc{background-color:#e6ecff;border-left:4px solid #3370ff}.routing-preview-container .workflow-wrapper .actor-card.handle{background-color:#f3e6ff;border-left:4px solid #935af6}.routing-preview-container .workflow-wrapper .actor-card.end{background-color:#ede7f6;border-left:4px solid #673ab7}.routing-preview-container .workflow-wrapper .actor-line{display:flex;align-items:center;gap:6px;margin:2px 0;height:23.5px}.routing-preview-container .workflow-wrapper .actor-line i{width:16px;height:16px;font-size:16px;color:#848484}.routing-preview-container .workflow-wrapper .actor-line input.email-debug-input{border:1px dashed #00bcd4;background-color:#e0f7fa;width:140px;padding:0 8px}.routing-preview-container .workflow-wrapper .actor-card span{display:block;color:#555;margin:2px 0}@media (max-width: 576px){.routing-preview-container .workflow-wrapper .workflow-wrapper{flex-direction:column;align-items:center;gap:24px}.routing-preview-container .workflow-wrapper .step-column{width:90vw}.routing-preview-container .workflow-wrapper .actor-card{width:100%}}.routing-preview-container .p-relative{position:relative}.routing-preview-container .routing-preview-header{display:flex;align-items:center;justify-content:space-between;height:35px;margin-bottom:15px}.routing-preview-container .routing-preview-header .button-group{display:flex;align-items:center;justify-content:flex-start;gap:8px;height:35px}.routing-preview-container .routing-preview-header .button-group button{border-radius:0;color:#fff;height:35px;font-size:13px}.routing-preview-container .routing-preview-header .debug-group{display:flex;align-items:center;justify-content:flex-start;height:35px}.routing-preview-container .routing-preview-header .debug-group label{-webkit-user-select:none;user-select:none;margin-right:8px}.routing-preview-container h5{padding:15px;color:#848484}.routing-preview-container .resolved-steps pre{padding:15px}.routing-preview-container .employee-log{max-width:100%;overflow-x:auto;background:#f9f9f9;border-left:4px solid #3b82f6;padding:12px 16px;margin-top:16px;font-family:monospace;font-size:13px;border-radius:6px;white-space:pre-wrap;box-sizing:border-box}.routing-preview-container .saga-link label{font-size:13px;color:#848484;margin-right:8px}.routing-preview-container a.external-link{color:#358ccb!important}.routing-preview-container a.external-link:after{font-family:feather;content:\"\\e95b\"}\n"] }]
|
|
235
|
+
], template: "<div class=\"routing-preview-container inter-font p-relative\">\r\n\r\n <div class=\"correlation-id\">\r\n\r\n <!-- @if ($saga()?.correlationId) {\r\n Workflow live instance: \r\n <a [routerLink]=\"['/root/workflow/status', $saga()?.correlationId]\">\r\n {{ $saga()?.correlationId }}\r\n </a>\r\n } -->\r\n\r\n <!-- @if ($loading()) {\r\n <core-terminal-spinner />\r\n } @else if ($saga()?.correlationId) {\r\n <button @fadeToggle type=\"button\" (click)=\"copy($saga()?.correlationId || '')\" class=\"copy-btn\">\r\n <i class=\"feather-clipboard\"></i>\r\n </button>\r\n\r\n } -->\r\n </div>\r\n\r\n <div class=\"routing-preview-header\">\r\n\r\n <div class=\"button-group\">\r\n <button type=\"button\" class=\"btn btn-primary h35\" (click)=\"backToLiveForm()\">Back to Form (ESC)</button>\r\n <button type=\"button\" class=\"btn btn-secondary h35\" (click)=\"generateRouting()\">Generate</button>\r\n @if (!!appConfigService.WORKFLOW_ENABLE_DEBUG_MODE && $isDebugMode()) {\r\n <button @fadeToggle type=\"button\" class=\"btn btn-secondary h35\" (click)=\"toggleResolvedSteps()\">Show/Hide resolved\r\n steps</button>\r\n }\r\n <button @fadeToggle type=\"button\" class=\"btn btn-primary h35\" (click)=\"initialDebugSubmit()\">Submit</button>\r\n </div>\r\n\r\n @if (!!appConfigService.WORKFLOW_ENABLE_DEBUG_MODE) {\r\n <div class=\"debug-group\">\r\n <label>Debug mode</label>\r\n <core-ios-switcher [width]=\"45\" [showOnOffText]=\"false\" [ngModel]=\"$isDebugMode()\"\r\n (ngModelChange)=\"onIsDebugModeChange($event)\"></core-ios-switcher>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"workflows-wrapper\">\r\n @if ($loading()) {\r\n <core-terminal-spinner /><span>Generating...</span>\r\n } @else {\r\n\r\n\r\n @if (!!$results().length) {\r\n\r\n @for (result of $results(); track $index) {\r\n\r\n <div class=\"result-group mb-8 p-4 rounded bg-white shadow-sm\">\r\n\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <h6 class=\"text-base font-semibold text-sky-700\">Routing for {{ result.targetEmployeeFullName }}</h6>\r\n <div class=\"d-flex d-flex-between\">\r\n <button type=\"button\" class=\"text-xs text-blue-500 underline btn btn-secondary\" (click)=\"toggleLog($index)\">\r\n {{ $logExpandedStates()[ $index ] ? 'Hide log' : 'Show log' }}\r\n </button>\r\n @if ($loading()) {\r\n <core-terminal-spinner />\r\n }\r\n <!-- @if (!!$submitResponseItems().length && !!getCorrelationId(result)) {\r\n <div class=\"saga-link d-flex d-flex-start\">\r\n <label>The process activated:</label>\r\n <a class=\"external-link\" [routerLink]=\"['/root/workflow/status', getCorrelationId(result)]\">\r\n Click here to see status\r\n </a>\r\n </div>\r\n } -->\r\n @for (result of $submitResponseItems(); track result.employeeId) {\r\n <div class=\"saga-link d-flex d-flex-start\">\r\n <label>{{ result.employeeFullName }}:</label>\r\n\r\n @if (result.correlationId) {\r\n <a class=\"external-link\" [routerLink]=\"['/root/workflow/status', result.correlationId]\">\r\n \u2705 Click to see status\r\n </a>\r\n } @else {\r\n <span class=\"text-danger d-flex flex-column\">\r\n @for (line of (result.error?.split('\\n') || []); track line) {\r\n <div>\u274C {{ line }}</div>\r\n }\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"workflow-wrapper\">\r\n\r\n @for (step of result.response.steps! ?? []; track step.id) {\r\n <div class=\"step-column\" [attr.data-actor-count]=\"step.resolvedActors?.length || 0\">\r\n\r\n <div class=\"step-column-aux\">\r\n\r\n <div class=\"step-header {{ step.type.toLowerCase() }}\"\r\n [ngClass]=\"(step.actorResolvedStatus ?? 'RESOLVED').toLowerCase()\">\r\n {{ step.name | translate : lang }} {{ step.config?.routingLogic }}\r\n </div>\r\n\r\n @for (actor of step.resolvedActors; track $index) {\r\n <div class=\"actor-card-aux\">\r\n <div class=\"actor-card d-flex d-flex-start {{ step.type.toLowerCase() }}\">\r\n <div class=\"avatar-wrapper\">\r\n <img [src]=\"actor.avatar\" appImageErrorResolver [type]=\"imageResolverType\"\r\n [isFemale]=\"!!actor.isFemale!\" class=\"actor-avatar\" alt=\"{{ actor.fullName }}\" />\r\n </div>\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\" [appTooltip]=\"actor.fullName\">{{ actor.fullName | normalizeHumanName\r\n }}</span>\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-briefcase\"></i>\r\n <span [appTooltip]=\"actor.jobName\">{{ actor.jobName }}</span>\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-mail\"></i>\r\n @if ($isDebugMode()) {\r\n <input @fadeToggle class=\"email-debug-input\" type=\"email\" [(ngModel)]=\"actor.email\"\r\n (ngModelChange)=\"onEmailChange(actor, $event)\" placeholder=\"Enter demo email\" />\r\n } @else {\r\n <span [appTooltip]=\"actor.email\">{{ actor.email }}</span>\r\n }\r\n </div>\r\n <div class=\"actor-line\">\r\n <i class=\"feather-hash\"></i>\r\n <span @fadeToggle [appTooltip]=\"actor.employeeCode\">{{ actor.employeeCode }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (isLogVisible($index)) {\r\n <pre class=\"employee-log mt-4 bg-gray-50 p-3 rounded text-xs font-mono text-gray-800\">\r\n @for (line of getLogLinesFor($index); track $index) {\r\n {{ line }}\r\n }\r\n </pre>\r\n }\r\n\r\n </div>\r\n\r\n }\r\n\r\n } @else if (!!$backendMessage()) {\r\n\r\n <div class=\"backend-message error-list bg-red-50 rounded p-4 text-sm text-red-800 leading-relaxed\">\r\n @for (line of $backendMessage().split('\\n'); track $index) {\r\n <div class=\"error-item flex items-start gap-2\">\r\n <i class=\"feather-alert-circle text-red-600 mt-0.5\"></i>\r\n <span [innerText]=\"line\"></span>\r\n </div>\r\n }\r\n </div>\r\n\r\n } @else {\r\n No routing steps found.\r\n }\r\n\r\n\r\n }\r\n\r\n </div>\r\n\r\n @if ($showResolvedSteps()) {\r\n <h5>Resolved steps</h5>\r\n <div class=\"resolved-steps\">\r\n <!-- <pre>{{ $resolvedStepsJson() }}</pre> -->\r\n </div>\r\n }\r\n\r\n</div>", styles: [".routing-preview-container{font-size:13px}.routing-preview-container .correlation-id{display:flex;align-items:center;height:35px;font-family:monospace}.routing-preview-container .correlation-id button{border:none;margin-left:8px}.routing-preview-container .workflow-wrapper{display:flex;flex-direction:row;gap:64px;padding:24px;background:#f5f5f5;overflow-x:auto;min-width:576px;min-height:200px}.routing-preview-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%}.routing-preview-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}.routing-preview-container .workflow-wrapper .step-header.submit{background-color:#00bcd4}.routing-preview-container .workflow-wrapper .step-header.approval{background-color:#f80}.routing-preview-container .workflow-wrapper .step-header.cc{background-color:#3370ff}.routing-preview-container .workflow-wrapper .step-header.handle{background-color:#935af6}.routing-preview-container .workflow-wrapper .step-header.end{background-color:#673ab7}.routing-preview-container .workflow-wrapper .step-header.resolved{box-shadow:0 0 0 3px #4caf50 inset}.routing-preview-container .workflow-wrapper .step-header.empty{box-shadow:0 0 0 3px #ff9800 inset}.routing-preview-container .workflow-wrapper .step-header.fallback{box-shadow:0 0 0 3px #03a9f4 inset}.routing-preview-container .workflow-wrapper .step-header.error{box-shadow:0 0 0 3px #f44336 inset}.routing-preview-container .workflow-wrapper .actor-card-aux{position:relative}.routing-preview-container .workflow-wrapper .actor-card.d-flex{display:flex;align-items:center;justify-content:flex-start;width:240px;height:110px;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}.routing-preview-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}.routing-preview-container .workflow-wrapper .actor-card.d-flex .actor-details .actor-line>span.actor-full-name{color:#000}.routing-preview-container .workflow-wrapper .actor-card.d-flex .avatar-wrapper{flex-shrink:0;margin-right:8px}.routing-preview-container .workflow-wrapper .actor-card.d-flex .actor-avatar{width:40px;height:40px;border-radius:50%;object-fit:cover;border:1px solid #ccc}.routing-preview-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}.routing-preview-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}.routing-preview-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}.routing-preview-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}.routing-preview-container .workflow-wrapper .step-column-aux{position:relative}.routing-preview-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}.routing-preview-container .workflow-wrapper .actor-card.submit{background-color:#e0f7fa;border-left:4px solid #00bcd4}.routing-preview-container .workflow-wrapper .actor-card.approval{background-color:#fff3e0;border-left:4px solid #f80}.routing-preview-container .workflow-wrapper .actor-card.cc{background-color:#e6ecff;border-left:4px solid #3370ff}.routing-preview-container .workflow-wrapper .actor-card.handle{background-color:#f3e6ff;border-left:4px solid #935af6}.routing-preview-container .workflow-wrapper .actor-card.end{background-color:#ede7f6;border-left:4px solid #673ab7}.routing-preview-container .workflow-wrapper .actor-line{display:flex;align-items:center;gap:6px;margin:2px 0;height:23.5px}.routing-preview-container .workflow-wrapper .actor-line i{width:16px;height:16px;font-size:16px;color:#848484}.routing-preview-container .workflow-wrapper .actor-line input.email-debug-input{border:1px dashed #00bcd4;background-color:#e0f7fa;width:140px;padding:0 8px}.routing-preview-container .workflow-wrapper .actor-card span{display:block;color:#555;margin:2px 0}@media (max-width: 576px){.routing-preview-container .workflow-wrapper .workflow-wrapper{flex-direction:column;align-items:center;gap:24px}.routing-preview-container .workflow-wrapper .step-column{width:90vw}.routing-preview-container .workflow-wrapper .actor-card{width:100%}}.routing-preview-container .p-relative{position:relative}.routing-preview-container .routing-preview-header{display:flex;align-items:center;justify-content:space-between;height:35px;margin-bottom:15px}.routing-preview-container .routing-preview-header .button-group{display:flex;align-items:center;justify-content:flex-start;gap:8px;height:35px}.routing-preview-container .routing-preview-header .button-group button{border-radius:0;color:#fff;height:35px;font-size:13px}.routing-preview-container .routing-preview-header .debug-group{display:flex;align-items:center;justify-content:flex-start;height:35px}.routing-preview-container .routing-preview-header .debug-group label{-webkit-user-select:none;user-select:none;margin-right:8px}.routing-preview-container h5{padding:15px;color:#848484}.routing-preview-container .resolved-steps pre{padding:15px}.routing-preview-container .employee-log{max-width:100%;overflow-x:auto;background:#f9f9f9;border-left:4px solid #3b82f6;padding:12px 16px;margin-top:16px;font-family:monospace;font-size:13px;border-radius:6px;white-space:pre-wrap;box-sizing:border-box}.routing-preview-container .saga-link label{font-size:13px;color:#848484;margin-right:8px}.routing-preview-container a.external-link{color:#358ccb!important}.routing-preview-container a.external-link:after{font-family:feather;content:\"\\e95b\"}\n"] }]
|
|
236
236
|
}], ctorParameters: () => [{ type: MultiLanguageService }], propDecorators: { handleKeyDown: [{
|
|
237
237
|
type: HostListener,
|
|
238
238
|
args: ['document:keydown', ['$event']]
|
|
@@ -277,6 +277,11 @@ class LiveFormComponent extends BaseComponent {
|
|
|
277
277
|
this.$loading = signal(false);
|
|
278
278
|
this.$showAfInstanceJson = signal(false);
|
|
279
279
|
this.$showWfWorkflowJson = signal(false);
|
|
280
|
+
this.$logExpandedStates = signal([]);
|
|
281
|
+
this.$backendMessage = signal('');
|
|
282
|
+
this.$loadingMessage = signal('');
|
|
283
|
+
this.$logs = signal([]);
|
|
284
|
+
this.$results = signal([]);
|
|
280
285
|
this.coreFormDesignService = inject(CoreFormDesignService);
|
|
281
286
|
this.applicationHelpService = inject(ApplicationHelpService);
|
|
282
287
|
this.ds = inject(DomService);
|
|
@@ -296,7 +301,6 @@ class LiveFormComponent extends BaseComponent {
|
|
|
296
301
|
this.$employeeSubmiterId = signal(0);
|
|
297
302
|
this.simulatedEmployee$ = new BehaviorSubject(null);
|
|
298
303
|
this.$showLiveRouting = this.wfs.$showLiveRouting;
|
|
299
|
-
// $afInstance = this.fds.$afInstance;
|
|
300
304
|
this.$zIndex = signal(0);
|
|
301
305
|
this.$reactMode = signal(false);
|
|
302
306
|
this.$onBehalfMode = computed(() => this.$workflow()?.allowOnBehalf);
|
|
@@ -446,6 +450,93 @@ class LiveFormComponent extends BaseComponent {
|
|
|
446
450
|
}
|
|
447
451
|
this.$showLiveRouting.set(!this.$showLiveRouting());
|
|
448
452
|
}
|
|
453
|
+
initialSubmit() {
|
|
454
|
+
const steps = this.wfs.$currentSteps();
|
|
455
|
+
const nameMap = new Map();
|
|
456
|
+
for (const step of steps) {
|
|
457
|
+
const name = step.name?.trim();
|
|
458
|
+
if (!name)
|
|
459
|
+
continue;
|
|
460
|
+
nameMap.set(name, (nameMap.get(name) ?? 0) + 1);
|
|
461
|
+
}
|
|
462
|
+
const duplicateNames = [...nameMap.entries()]
|
|
463
|
+
.filter(([_, count]) => count > 1)
|
|
464
|
+
.map(([name]) => name);
|
|
465
|
+
if (duplicateNames.length > 0) {
|
|
466
|
+
this.alertService.warn(`Duplicate step name(s) found: ${duplicateNames.join(", ")}`, alertOptions);
|
|
467
|
+
this.wfs.$designActiveTab.set(3);
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
const form = this.$form();
|
|
471
|
+
if (!form || !form.valid) {
|
|
472
|
+
const controls = form?.controls ?? {};
|
|
473
|
+
const entries = Object.entries(controls);
|
|
474
|
+
const filteredInvalids = entries.filter(([key, ctrl]) => {
|
|
475
|
+
if (key === '___submitterEmployeeId')
|
|
476
|
+
return false; // skip check
|
|
477
|
+
return ctrl.invalid;
|
|
478
|
+
});
|
|
479
|
+
if (filteredInvalids.length > 0) {
|
|
480
|
+
this.wfs.liveFormCheckError$.next(true);
|
|
481
|
+
setTimeout(() => this.wfs.liveFormCheckError$.next(false), 5000);
|
|
482
|
+
this.alertService.info("Please fill required fields", alertOptions);
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
if (!this.wfs.$currentFlow()) {
|
|
487
|
+
this.alertService.info("No flow detected", alertOptions);
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
const request = {
|
|
491
|
+
workflowId: this.wfs.$currentFlow()?.id,
|
|
492
|
+
attributes: this.$form()?.getRawValue(),
|
|
493
|
+
___targetEmployees: this.$form()?.get('___targetEmployees')?.getRawValue()
|
|
494
|
+
};
|
|
495
|
+
this.$backendMessage.set('');
|
|
496
|
+
this.$loading.set(true);
|
|
497
|
+
this.$loadingMessage.set("Generating routes...");
|
|
498
|
+
this.wfs.initialSubmit(request).pipe(catchError(err => {
|
|
499
|
+
const msg = err?.error?.message || // API-defined message
|
|
500
|
+
err?.message || // Native JS or HttpErrorResponse
|
|
501
|
+
err?.statusText || // Fallback
|
|
502
|
+
'An unknown error occurred.';
|
|
503
|
+
this.$backendMessage.set(msg);
|
|
504
|
+
return of({ ok: false, status: 500, body: { messageCode: msg } });
|
|
505
|
+
}), finalize(() => {
|
|
506
|
+
this.$loading.set(false);
|
|
507
|
+
this.$loadingMessage.set('');
|
|
508
|
+
})).subscribe(x => {
|
|
509
|
+
if (x.ok && x.status === 200) {
|
|
510
|
+
const body = x.body;
|
|
511
|
+
if (body?.statusCode === 200) {
|
|
512
|
+
const inner = body.innerBody;
|
|
513
|
+
if (!!inner.errors.length) {
|
|
514
|
+
this.alertService.error(inner.errors[0]);
|
|
515
|
+
}
|
|
516
|
+
this.$logs.set(inner.logs ?? []);
|
|
517
|
+
const backendResults = inner.items;
|
|
518
|
+
const allErrors = [];
|
|
519
|
+
for (const result of backendResults) {
|
|
520
|
+
const { employeeId, employeeFullName, correlationId, error } = result;
|
|
521
|
+
if (error || !correlationId) {
|
|
522
|
+
allErrors.push(`🚫 Employee ${employeeId} (${employeeFullName}): ${error || 'Unknown error'}`);
|
|
523
|
+
continue;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
this.$backendMessage.set(allErrors.join('\n'));
|
|
527
|
+
if (!!allErrors.length) {
|
|
528
|
+
this.alertService.error(allErrors[0]);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
this.$backendMessage.set(body?.messageCode || 'UNEXPECTED_ERROR');
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
else {
|
|
536
|
+
this.$backendMessage.set('API_ERROR');
|
|
537
|
+
}
|
|
538
|
+
});
|
|
539
|
+
}
|
|
449
540
|
ngOnInit() {
|
|
450
541
|
this.subscriptions.push(this.mls.lang$.subscribe(x => this.lang = x));
|
|
451
542
|
// Get query param ?preview=true
|
|
@@ -520,27 +611,6 @@ class LiveFormComponent extends BaseComponent {
|
|
|
520
611
|
}
|
|
521
612
|
}
|
|
522
613
|
}
|
|
523
|
-
/*
|
|
524
|
-
mergeSectionsByField(a: ICoreFormSection[], b: ICoreFormSection[]): ICoreFormSection[] {
|
|
525
|
-
const existingFields = new Set<string>();
|
|
526
|
-
|
|
527
|
-
// Collect all fields from a
|
|
528
|
-
a.forEach(section =>
|
|
529
|
-
section.rows.forEach(row =>
|
|
530
|
-
row.forEach(control => existingFields.add(control.field))
|
|
531
|
-
)
|
|
532
|
-
);
|
|
533
|
-
|
|
534
|
-
// Check if any field in b already exists in a
|
|
535
|
-
const hasOverlap = b.some(section =>
|
|
536
|
-
section.rows.some(row =>
|
|
537
|
-
row.some(control => existingFields.has(control.field))
|
|
538
|
-
)
|
|
539
|
-
);
|
|
540
|
-
|
|
541
|
-
return hasOverlap ? [...a] : [...a, ...b];
|
|
542
|
-
}
|
|
543
|
-
*/
|
|
544
614
|
onLiveFormCreated(e) {
|
|
545
615
|
const form = e.formGroup;
|
|
546
616
|
this.$form.set(form);
|
|
@@ -788,7 +858,7 @@ class LiveFormComponent extends BaseComponent {
|
|
|
788
858
|
this.clearInjectedFields();
|
|
789
859
|
}
|
|
790
860
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: LiveFormComponent, deps: [{ token: MultiLanguageService }, { token: CoreFormService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
791
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: LiveFormComponent, isStandalone: true, selector: "live-form", inputs: { $designMode: { classPropertyName: "$designMode", publicName: "$designMode", isSignal: true, isRequired: false, transformFunction: null }, $forKickOff: { classPropertyName: "$forKickOff", publicName: "$forKickOff", isSignal: true, isRequired: false, transformFunction: null }, $workflowReactContext: { classPropertyName: "$workflowReactContext", publicName: "$workflowReactContext", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { $onClose: "$onClose" }, usesInheritance: true, ngImport: i0, template: "<div class=\"live-form-container\" [hotKeys]=\"['F3', 'F6', 'Escape']\">\r\n\r\n @if ($normalMode()) {\r\n <div class=\"form-wrapper live-form\" [ngStyle]=\"{\r\n width: !!coreFormDesignService.$afInstance().width ? coreFormDesignService.$afInstance().width + 'px' : 'unset'\r\n }\">\r\n <div class=\"live-form-header\">\r\n <core-page-header [title]=\"coreFormDesignService.$afInstance().captionCode | translate : lang\" [hideButtonGroup]=\"true\"></core-page-header>\r\n </div>\r\n\r\n <core-form\r\n [inputSections]=\"$inputSections()\"\r\n [customFormButtonItems]=\"$customButtons()!\"\r\n [forceCreateNewForm]=\"true\"\r\n [mode$]=\"mode$\"\r\n [hideButtons]=\"$previewMode()\"\r\n [hideCalculatedSection]=\"true\"\r\n [hideDevSector]=\"true\"\r\n [bottomTemplateRef]=\"bottomTemplateRef\"\r\n [buttonGroupTemplateRef]=\"buttonGroupTemplateRef\"\r\n [checkError$]=\"checkError$\"\r\n (onSubmit)=\"onLiveSubmit($event)\"\r\n (onFormCreated)=\"onLiveFormCreated($event)\"\r\n (onCancal)=\"onClose()\"\r\n />\r\n\r\n @if ($previewMode()) {\r\n <div class=\"show-routing-wrapper\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"toggleShowRouting()\">\r\n {{ $showLiveRouting() ? 'Hide Routing' : 'Show Routing' }}\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"routing-preview-wrapper\" [class.visible]=\"$showLiveRouting()\">\r\n @if ($showLiveRouting()) {\r\n <routing-preview-panel />\r\n }\r\n </div>\r\n\r\n\r\n } @else {\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root no-padding\">\r\n\r\n <div class=\"form-wrapper live-form\" [class.d-none]=\"$showLiveRouting()\" [ngStyle]=\"{\r\n width: !!coreFormDesignService.$afInstance().width ? coreFormDesignService.$afInstance().width + 'px' : 'unset'\r\n }\">\r\n\r\n <div class=\"live-form-header\">\r\n <core-page-header [title]=\"coreFormDesignService.$afInstance().captionCode | translate : lang\" [hideButtonGroup]=\"true\" />\r\n <div class=\"preview-close-icon\" (click)=\"onClose()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <core-form\r\n [inputSections]=\"$inputSections()\"\r\n [customFormButtonItems]=\"$customButtons()!\"\r\n [forceCreateNewForm]=\"true\"\r\n [hideCalculatedSection]=\"true\"\r\n [mode$]=\"mode$\"\r\n [hideButtons]=\"$previewMode()\"\r\n [bottomTemplateRef]=\"bottomTemplateRef\"\r\n [buttonGroupTemplateRef]=\"buttonGroupTemplateRef\"\r\n [hideDevSector]=\"false\"\r\n [checkError$]=\"checkError$\"\r\n (onSubmit)=\"onLiveSubmit($event)\"\r\n (onFormCreated)=\"onLiveFormCreated($event)\"\r\n (onCancal)=\"onClose()\"\r\n />\r\n\r\n <div class=\"
|
|
861
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: LiveFormComponent, isStandalone: true, selector: "live-form", inputs: { $designMode: { classPropertyName: "$designMode", publicName: "$designMode", isSignal: true, isRequired: false, transformFunction: null }, $forKickOff: { classPropertyName: "$forKickOff", publicName: "$forKickOff", isSignal: true, isRequired: false, transformFunction: null }, $workflowReactContext: { classPropertyName: "$workflowReactContext", publicName: "$workflowReactContext", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { $onClose: "$onClose" }, usesInheritance: true, ngImport: i0, template: "<div class=\"live-form-container\" [hotKeys]=\"['F3', 'F6', 'Escape']\">\r\n\r\n @if ($normalMode()) {\r\n <div class=\"form-wrapper live-form\" [ngStyle]=\"{\r\n width: !!coreFormDesignService.$afInstance().width ? coreFormDesignService.$afInstance().width + 'px' : 'unset'\r\n }\">\r\n <div class=\"live-form-header\">\r\n <core-page-header [title]=\"coreFormDesignService.$afInstance().captionCode | translate : lang\" [hideButtonGroup]=\"true\"></core-page-header>\r\n </div>\r\n\r\n <core-form\r\n [inputSections]=\"$inputSections()\"\r\n [customFormButtonItems]=\"$customButtons()!\"\r\n [forceCreateNewForm]=\"true\"\r\n [mode$]=\"mode$\"\r\n [hideButtons]=\"$previewMode()\"\r\n [hideCalculatedSection]=\"true\"\r\n [hideDevSector]=\"true\"\r\n [bottomTemplateRef]=\"bottomTemplateRef\"\r\n [buttonGroupTemplateRef]=\"buttonGroupTemplateRef\"\r\n [checkError$]=\"checkError$\"\r\n (onSubmit)=\"onLiveSubmit($event)\"\r\n (onFormCreated)=\"onLiveFormCreated($event)\"\r\n (onCancal)=\"onClose()\"\r\n />\r\n\r\n @if ($previewMode()) {\r\n <div class=\"show-routing-wrapper\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"toggleShowRouting()\">\r\n {{ $showLiveRouting() ? 'Hide Routing' : 'Show Routing' }}\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"routing-preview-wrapper\" [class.visible]=\"$showLiveRouting()\">\r\n @if ($showLiveRouting()) {\r\n <routing-preview-panel />\r\n }\r\n </div>\r\n\r\n\r\n } @else {\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root no-padding\">\r\n\r\n <div class=\"form-wrapper live-form\" [class.d-none]=\"$showLiveRouting()\" [ngStyle]=\"{\r\n width: !!coreFormDesignService.$afInstance().width ? coreFormDesignService.$afInstance().width + 'px' : 'unset'\r\n }\">\r\n\r\n <div class=\"live-form-header\">\r\n <core-page-header [title]=\"coreFormDesignService.$afInstance().captionCode | translate : lang\" [hideButtonGroup]=\"true\" />\r\n <div class=\"preview-close-icon\" (click)=\"onClose()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <core-form\r\n [inputSections]=\"$inputSections()\"\r\n [customFormButtonItems]=\"$customButtons()!\"\r\n [forceCreateNewForm]=\"true\"\r\n [hideCalculatedSection]=\"true\"\r\n [mode$]=\"mode$\"\r\n [hideButtons]=\"$previewMode()\"\r\n [bottomTemplateRef]=\"bottomTemplateRef\"\r\n [buttonGroupTemplateRef]=\"buttonGroupTemplateRef\"\r\n [hideDevSector]=\"false\"\r\n [checkError$]=\"checkError$\"\r\n (onSubmit)=\"onLiveSubmit($event)\"\r\n (onFormCreated)=\"onLiveFormCreated($event)\"\r\n (onCancal)=\"onClose()\"\r\n />\r\n\r\n <div class=\"submition-wrapper\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"toggleShowRouting()\">\r\n {{ $showLiveRouting() ? 'Hide Routing' : 'Show Routing' }}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"initialSubmit()\">\r\n Submit \r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"routing-preview-wrapper\" [class.visible]=\"$showLiveRouting()\">\r\n @if ($showLiveRouting()) {\r\n <div class=\"h50\"></div>\r\n <routing-preview-panel [$minWidth]=\"coreFormDesignService.$afInstance().width\"/>\r\n <div class=\"h50\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <ng-template #bottomTemplateRef>\r\n <!-- <pre [ngStyle]=\"{ maxWidth: !!$afInstance()?.width ? $afInstance()?.width! + 'px' : 'unset'}\">{{ $inputSectionsJson() }}</pre> -->\r\n <!-- @if (isDevMode) {\r\n <p class=\"dev-hint\">F3/ESC: Show/Hide afInstance | F6/ESC: Show/Hide Workflow</p>\r\n } -->\r\n @if ($showAfInstanceJson()) {\r\n <pre [ngStyle]=\"{ maxWidth: !!$afInstance()?.width ? $afInstance()?.width! + 'px' : 'unset'}\">{{ $afInstanceJson() }}</pre>\r\n }\r\n @if ($showWfWorkflowJson()) {\r\n <pre [ngStyle]=\"{ maxWidth: !!$afInstance()?.width ? $afInstance()?.width! + 'px' : 'unset'}\">{{ $wfWorkflowJson() }}</pre>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #buttonGroupTemplateRef>\r\n <div class=\"button-group\">\r\n <div class=\"button-group-left\"></div>\r\n <div class=\"button-group-right\">\r\n @if ($reactMode()) {\r\n <button type=\"button\" class=\"btn btn-secondary\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"react('REJECTED')\">Reject</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"react('APPROVED')\">Approve</button>\r\n } @else {\r\n <button type=\"button\" class=\"btn btn-secondary\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\">Send Request</button>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n</div>", styles: [".live-form-container .modal-container{overflow-y:auto!important;box-sizing:border-box}.live-form-container .form-wrapper.live-form{padding-top:0;padding-bottom:15px;background-color:#fff;position:relative}.live-form-container .form-wrapper.live-form .live-form-header{padding:0 15px}.live-form-container .form-wrapper.live-form .live-form-header .preview-close-icon{position:absolute;right:7px;top:6px;z-index:2;color:gray;cursor:pointer}.live-form-container .form-wrapper.live-form .live-form-header .preview-close-icon i{font-size:18px}.live-form-container .form-wrapper.live-form .submition-wrapper{display:flex;align-items:center;justify-content:flex-end;padding:0 24px;font-size:13px}.live-form-container .form-wrapper.live-form .submition-wrapper button{border-radius:0}.live-form-container .form-wrapper.live-form .submition-wrapper button:not(:last-child){margin-right:8px}.live-form-container .form-wrapper.live-form .show-routing-wrapper{padding:15px;display:flex;align-items:center;justify-content:flex-end}.live-form-container .form-wrapper.live-form .show-routing-wrapper input{width:120px}.live-form-container .modal-content-root{padding:0;overflow-y:visible;background-color:transparent!important;display:flex;flex-direction:column;align-items:center;justify-content:space-between}.live-form-container pre{background-color:#fff;color:#333;padding:1rem 1.5rem;border-radius:10px;box-shadow:0 2px 6px #00000014;font-family:Fira Code,monospace;font-size:.85rem;word-break:keep-all;overflow-x:auto;line-height:1.5;max-height:500px;overflow-y:auto;margin:0}.live-form-container .dev-hint{font-size:12px;color:#888;background-color:#f9f9f9;padding:6px 12px;margin:8px 0;border-left:4px solid #ccc}.live-form-container .h50{height:50px}.live-form-container .routing-preview-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-10px);transition:max-height .4s ease-out,opacity .4s ease-out,transform .4s ease-out}.live-form-container .routing-preview-wrapper.visible{max-height:800px;overflow:visible;opacity:1;transform:translateY(0)}.live-form-container .show-routing-wrapper button{height:35px;font-size:13px;border-radius:0;color:#fff}.live-form-container .hidden-requester-selector{position:absolute;width:0;height:0;top:-200px;left:-200px;overflow:visible}.live-form-container .button-group{padding:15px;display:flex;align-items:center;justify-content:flex-end}.live-form-container .button-group button{height:35px;border-radius:0;font-size:13px;margin:0 7.5px;width:120px}.live-form-container .button-group button:last-child{margin-right:0}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: HotKeysDirective, selector: "[hotKeys]", inputs: ["hotKeys"] }, { kind: "component", type: RoutingPreviewPanelComponent, selector: "routing-preview-panel", inputs: ["$minWidth"] }, { kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup", "htmlTooltipRef"], outputs: ["buttonClick"] }, { kind: "component", type: CoreFormComponent, selector: "core-form", inputs: ["formName", "width", "submitText", "leftInputSections", "leftInputSectionsFlexSize", "inputSections", "mode$", "bottomTemplateRef", "customFormButtonItems", "showCaptionButton", "disableSaveButton", "disableCancelButton", "checkError$", "hideButtons", "forceCreateNewForm", "secondBottomTemplateRef", "hideDevSector", "hideCalculatedSection", "buttonGroupTemplateRef"], outputs: ["onFormCreated", "onFormRefCreated", "onSubmit", "onSave", "onCancal", "buttonClick"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
792
862
|
}
|
|
793
863
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: LiveFormComponent, decorators: [{
|
|
794
864
|
type: Component,
|
|
@@ -799,7 +869,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
|
|
|
799
869
|
CorePageHeaderComponent,
|
|
800
870
|
CoreFormComponent,
|
|
801
871
|
TranslatePipe,
|
|
802
|
-
], template: "<div class=\"live-form-container\" [hotKeys]=\"['F3', 'F6', 'Escape']\">\r\n\r\n @if ($normalMode()) {\r\n <div class=\"form-wrapper live-form\" [ngStyle]=\"{\r\n width: !!coreFormDesignService.$afInstance().width ? coreFormDesignService.$afInstance().width + 'px' : 'unset'\r\n }\">\r\n <div class=\"live-form-header\">\r\n <core-page-header [title]=\"coreFormDesignService.$afInstance().captionCode | translate : lang\" [hideButtonGroup]=\"true\"></core-page-header>\r\n </div>\r\n\r\n <core-form\r\n [inputSections]=\"$inputSections()\"\r\n [customFormButtonItems]=\"$customButtons()!\"\r\n [forceCreateNewForm]=\"true\"\r\n [mode$]=\"mode$\"\r\n [hideButtons]=\"$previewMode()\"\r\n [hideCalculatedSection]=\"true\"\r\n [hideDevSector]=\"true\"\r\n [bottomTemplateRef]=\"bottomTemplateRef\"\r\n [buttonGroupTemplateRef]=\"buttonGroupTemplateRef\"\r\n [checkError$]=\"checkError$\"\r\n (onSubmit)=\"onLiveSubmit($event)\"\r\n (onFormCreated)=\"onLiveFormCreated($event)\"\r\n (onCancal)=\"onClose()\"\r\n />\r\n\r\n @if ($previewMode()) {\r\n <div class=\"show-routing-wrapper\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"toggleShowRouting()\">\r\n {{ $showLiveRouting() ? 'Hide Routing' : 'Show Routing' }}\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"routing-preview-wrapper\" [class.visible]=\"$showLiveRouting()\">\r\n @if ($showLiveRouting()) {\r\n <routing-preview-panel />\r\n }\r\n </div>\r\n\r\n\r\n } @else {\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root no-padding\">\r\n\r\n <div class=\"form-wrapper live-form\" [class.d-none]=\"$showLiveRouting()\" [ngStyle]=\"{\r\n width: !!coreFormDesignService.$afInstance().width ? coreFormDesignService.$afInstance().width + 'px' : 'unset'\r\n }\">\r\n\r\n <div class=\"live-form-header\">\r\n <core-page-header [title]=\"coreFormDesignService.$afInstance().captionCode | translate : lang\" [hideButtonGroup]=\"true\" />\r\n <div class=\"preview-close-icon\" (click)=\"onClose()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <core-form\r\n [inputSections]=\"$inputSections()\"\r\n [customFormButtonItems]=\"$customButtons()!\"\r\n [forceCreateNewForm]=\"true\"\r\n [hideCalculatedSection]=\"true\"\r\n [mode$]=\"mode$\"\r\n [hideButtons]=\"$previewMode()\"\r\n [bottomTemplateRef]=\"bottomTemplateRef\"\r\n [buttonGroupTemplateRef]=\"buttonGroupTemplateRef\"\r\n [hideDevSector]=\"false\"\r\n [checkError$]=\"checkError$\"\r\n (onSubmit)=\"onLiveSubmit($event)\"\r\n (onFormCreated)=\"onLiveFormCreated($event)\"\r\n (onCancal)=\"onClose()\"\r\n />\r\n\r\n <div class=\"
|
|
872
|
+
], template: "<div class=\"live-form-container\" [hotKeys]=\"['F3', 'F6', 'Escape']\">\r\n\r\n @if ($normalMode()) {\r\n <div class=\"form-wrapper live-form\" [ngStyle]=\"{\r\n width: !!coreFormDesignService.$afInstance().width ? coreFormDesignService.$afInstance().width + 'px' : 'unset'\r\n }\">\r\n <div class=\"live-form-header\">\r\n <core-page-header [title]=\"coreFormDesignService.$afInstance().captionCode | translate : lang\" [hideButtonGroup]=\"true\"></core-page-header>\r\n </div>\r\n\r\n <core-form\r\n [inputSections]=\"$inputSections()\"\r\n [customFormButtonItems]=\"$customButtons()!\"\r\n [forceCreateNewForm]=\"true\"\r\n [mode$]=\"mode$\"\r\n [hideButtons]=\"$previewMode()\"\r\n [hideCalculatedSection]=\"true\"\r\n [hideDevSector]=\"true\"\r\n [bottomTemplateRef]=\"bottomTemplateRef\"\r\n [buttonGroupTemplateRef]=\"buttonGroupTemplateRef\"\r\n [checkError$]=\"checkError$\"\r\n (onSubmit)=\"onLiveSubmit($event)\"\r\n (onFormCreated)=\"onLiveFormCreated($event)\"\r\n (onCancal)=\"onClose()\"\r\n />\r\n\r\n @if ($previewMode()) {\r\n <div class=\"show-routing-wrapper\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"toggleShowRouting()\">\r\n {{ $showLiveRouting() ? 'Hide Routing' : 'Show Routing' }}\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"routing-preview-wrapper\" [class.visible]=\"$showLiveRouting()\">\r\n @if ($showLiveRouting()) {\r\n <routing-preview-panel />\r\n }\r\n </div>\r\n\r\n\r\n } @else {\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root no-padding\">\r\n\r\n <div class=\"form-wrapper live-form\" [class.d-none]=\"$showLiveRouting()\" [ngStyle]=\"{\r\n width: !!coreFormDesignService.$afInstance().width ? coreFormDesignService.$afInstance().width + 'px' : 'unset'\r\n }\">\r\n\r\n <div class=\"live-form-header\">\r\n <core-page-header [title]=\"coreFormDesignService.$afInstance().captionCode | translate : lang\" [hideButtonGroup]=\"true\" />\r\n <div class=\"preview-close-icon\" (click)=\"onClose()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <core-form\r\n [inputSections]=\"$inputSections()\"\r\n [customFormButtonItems]=\"$customButtons()!\"\r\n [forceCreateNewForm]=\"true\"\r\n [hideCalculatedSection]=\"true\"\r\n [mode$]=\"mode$\"\r\n [hideButtons]=\"$previewMode()\"\r\n [bottomTemplateRef]=\"bottomTemplateRef\"\r\n [buttonGroupTemplateRef]=\"buttonGroupTemplateRef\"\r\n [hideDevSector]=\"false\"\r\n [checkError$]=\"checkError$\"\r\n (onSubmit)=\"onLiveSubmit($event)\"\r\n (onFormCreated)=\"onLiveFormCreated($event)\"\r\n (onCancal)=\"onClose()\"\r\n />\r\n\r\n <div class=\"submition-wrapper\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"toggleShowRouting()\">\r\n {{ $showLiveRouting() ? 'Hide Routing' : 'Show Routing' }}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"initialSubmit()\">\r\n Submit \r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"routing-preview-wrapper\" [class.visible]=\"$showLiveRouting()\">\r\n @if ($showLiveRouting()) {\r\n <div class=\"h50\"></div>\r\n <routing-preview-panel [$minWidth]=\"coreFormDesignService.$afInstance().width\"/>\r\n <div class=\"h50\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <ng-template #bottomTemplateRef>\r\n <!-- <pre [ngStyle]=\"{ maxWidth: !!$afInstance()?.width ? $afInstance()?.width! + 'px' : 'unset'}\">{{ $inputSectionsJson() }}</pre> -->\r\n <!-- @if (isDevMode) {\r\n <p class=\"dev-hint\">F3/ESC: Show/Hide afInstance | F6/ESC: Show/Hide Workflow</p>\r\n } -->\r\n @if ($showAfInstanceJson()) {\r\n <pre [ngStyle]=\"{ maxWidth: !!$afInstance()?.width ? $afInstance()?.width! + 'px' : 'unset'}\">{{ $afInstanceJson() }}</pre>\r\n }\r\n @if ($showWfWorkflowJson()) {\r\n <pre [ngStyle]=\"{ maxWidth: !!$afInstance()?.width ? $afInstance()?.width! + 'px' : 'unset'}\">{{ $wfWorkflowJson() }}</pre>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #buttonGroupTemplateRef>\r\n <div class=\"button-group\">\r\n <div class=\"button-group-left\"></div>\r\n <div class=\"button-group-right\">\r\n @if ($reactMode()) {\r\n <button type=\"button\" class=\"btn btn-secondary\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"react('REJECTED')\">Reject</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"react('APPROVED')\">Approve</button>\r\n } @else {\r\n <button type=\"button\" class=\"btn btn-secondary\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\">Send Request</button>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n</div>", styles: [".live-form-container .modal-container{overflow-y:auto!important;box-sizing:border-box}.live-form-container .form-wrapper.live-form{padding-top:0;padding-bottom:15px;background-color:#fff;position:relative}.live-form-container .form-wrapper.live-form .live-form-header{padding:0 15px}.live-form-container .form-wrapper.live-form .live-form-header .preview-close-icon{position:absolute;right:7px;top:6px;z-index:2;color:gray;cursor:pointer}.live-form-container .form-wrapper.live-form .live-form-header .preview-close-icon i{font-size:18px}.live-form-container .form-wrapper.live-form .submition-wrapper{display:flex;align-items:center;justify-content:flex-end;padding:0 24px;font-size:13px}.live-form-container .form-wrapper.live-form .submition-wrapper button{border-radius:0}.live-form-container .form-wrapper.live-form .submition-wrapper button:not(:last-child){margin-right:8px}.live-form-container .form-wrapper.live-form .show-routing-wrapper{padding:15px;display:flex;align-items:center;justify-content:flex-end}.live-form-container .form-wrapper.live-form .show-routing-wrapper input{width:120px}.live-form-container .modal-content-root{padding:0;overflow-y:visible;background-color:transparent!important;display:flex;flex-direction:column;align-items:center;justify-content:space-between}.live-form-container pre{background-color:#fff;color:#333;padding:1rem 1.5rem;border-radius:10px;box-shadow:0 2px 6px #00000014;font-family:Fira Code,monospace;font-size:.85rem;word-break:keep-all;overflow-x:auto;line-height:1.5;max-height:500px;overflow-y:auto;margin:0}.live-form-container .dev-hint{font-size:12px;color:#888;background-color:#f9f9f9;padding:6px 12px;margin:8px 0;border-left:4px solid #ccc}.live-form-container .h50{height:50px}.live-form-container .routing-preview-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-10px);transition:max-height .4s ease-out,opacity .4s ease-out,transform .4s ease-out}.live-form-container .routing-preview-wrapper.visible{max-height:800px;overflow:visible;opacity:1;transform:translateY(0)}.live-form-container .show-routing-wrapper button{height:35px;font-size:13px;border-radius:0;color:#fff}.live-form-container .hidden-requester-selector{position:absolute;width:0;height:0;top:-200px;left:-200px;overflow:visible}.live-form-container .button-group{padding:15px;display:flex;align-items:center;justify-content:flex-end}.live-form-container .button-group button{height:35px;border-radius:0;font-size:13px;margin:0 7.5px;width:120px}.live-form-container .button-group button:last-child{margin-right:0}\n"] }]
|
|
803
873
|
}], ctorParameters: () => [{ type: MultiLanguageService }, { type: CoreFormService }] });
|
|
804
874
|
|
|
805
875
|
var liveForm_component = /*#__PURE__*/Object.freeze({
|
|
@@ -808,4 +878,4 @@ var liveForm_component = /*#__PURE__*/Object.freeze({
|
|
|
808
878
|
});
|
|
809
879
|
|
|
810
880
|
export { LiveFormComponent as L, RoutingPreviewPanelComponent as R, liveForm_component as l };
|
|
811
|
-
//# sourceMappingURL=ngx-histaff-alpha-live-form.component-
|
|
881
|
+
//# sourceMappingURL=ngx-histaff-alpha-live-form.component-Djf5udbq.mjs.map
|